diff --git a/vendor/manifest b/vendor/manifest
deleted file mode 100644
index 03ce1fe90..000000000
--- a/vendor/manifest
+++ /dev/null
@@ -1,499 +0,0 @@
-{
- "version": 0,
- "dependencies": [
- {
- "importpath": "github.com/Shopify/sarama",
- "repository": "https://github.com/Shopify/sarama",
- "revision": "574d3147eee384229bf96a5d12c207fe7b5234f3",
- "branch": "master"
- },
- {
- "importpath": "github.com/alecthomas/gometalinter",
- "repository": "https://github.com/alecthomas/gometalinter",
- "revision": "b8b1f84ae8cb72e7870785840eab2d6c6355aa9f",
- "branch": "master"
- },
- {
- "importpath": "github.com/alecthomas/units",
- "repository": "https://github.com/alecthomas/units",
- "revision": "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a",
- "branch": "master"
- },
- {
- "importpath": "github.com/apache/thrift",
- "repository": "https://github.com/apache/thrift",
- "revision": "b2a4d4ae21c789b689dd162deb819665567f481c",
- "branch": "HEAD"
- },
- {
- "importpath": "github.com/apache/thrift/lib/go/thrift",
- "repository": "https://github.com/apache/thrift",
- "revision": "b2a4d4ae21c789b689dd162deb819665567f481c",
- "branch": "HEAD",
- "path": "/lib/go/thrift"
- },
- {
- "importpath": "github.com/beorn7/perks/quantile",
- "repository": "https://github.com/beorn7/perks",
- "revision": "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9",
- "branch": "master",
- "path": "/quantile"
- },
- {
- "importpath": "github.com/codahale/hdrhistogram",
- "repository": "https://github.com/codahale/hdrhistogram",
- "revision": "3a0bb77429bd3a61596f5e8a3172445844342120",
- "branch": "master"
- },
- {
- "importpath": "github.com/crossdock/crossdock-go",
- "repository": "https://github.com/crossdock/crossdock-go",
- "revision": "049aabb0122b03bc9bd30cab8f3f91fb60166361",
- "branch": "master"
- },
- {
- "importpath": "github.com/davecgh/go-spew/spew",
- "repository": "https://github.com/davecgh/go-spew",
- "revision": "346938d642f2ec3594ed81d874461961cd0faa76",
- "branch": "master",
- "path": "/spew"
- },
- {
- "importpath": "github.com/eapache/go-resiliency/breaker",
- "repository": "https://github.com/eapache/go-resiliency",
- "revision": "b86b1ec0dd4209a588dc1285cdd471e73525c0b3",
- "branch": "master",
- "path": "/breaker"
- },
- {
- "importpath": "github.com/eapache/go-xerial-snappy",
- "repository": "https://github.com/eapache/go-xerial-snappy",
- "revision": "bb955e01b9346ac19dc29eb16586c90ded99a98c",
- "branch": "master"
- },
- {
- "importpath": "github.com/eapache/queue",
- "repository": "https://github.com/eapache/queue",
- "revision": "44cc805cf13205b55f69e14bcb69867d1ae92f98",
- "branch": "master"
- },
- {
- "importpath": "github.com/golang/protobuf/proto",
- "repository": "https://github.com/golang/protobuf",
- "revision": "8ee79997227bf9b34611aee7946ae64735e6fd93",
- "branch": "master",
- "path": "/proto"
- },
- {
- "importpath": "github.com/golang/snappy",
- "repository": "https://github.com/golang/snappy",
- "revision": "7db9049039a047d955fe8c19b83c8ff5abd765c7",
- "branch": "master"
- },
- {
- "importpath": "github.com/google/shlex",
- "repository": "https://github.com/google/shlex",
- "revision": "6f45313302b9c56850fc17f99e40caebce98c716",
- "branch": "master"
- },
- {
- "importpath": "github.com/gorilla/context",
- "repository": "https://github.com/gorilla/context",
- "revision": "08b5f424b9271eedf6f9f0ce86cb9396ed337a42",
- "branch": "master"
- },
- {
- "importpath": "github.com/gorilla/mux",
- "repository": "https://github.com/gorilla/mux",
- "revision": "392c28fe23e1c45ddba891b0320b3b5df220beea",
- "branch": "master"
- },
- {
- "importpath": "github.com/jaegertracing/jaeger-client-go",
- "repository": "https://github.com/jaegertracing/jaeger-client-go",
- "revision": "3ad49a1d839b517923a6fdac36d81cbf7b744f37",
- "branch": "master"
- },
- {
- "importpath": "github.com/jaegertracing/jaeger-lib/metrics",
- "repository": "https://github.com/jaegertracing/jaeger-lib",
- "revision": "21a3da6d66fe0e278072676fdc84cd4c9ccb9b67",
- "branch": "master",
- "path": "/metrics"
- },
- {
- "importpath": "github.com/klauspost/crc32",
- "repository": "https://github.com/klauspost/crc32",
- "revision": "cb6bfca970f6908083f26f39a79009d608efd5cd",
- "branch": "master"
- },
- {
- "importpath": "github.com/lib/pq",
- "repository": "https://github.com/lib/pq",
- "revision": "23da1db4f16d9658a86ae9b717c245fc078f10f1",
- "branch": "master"
- },
- {
- "importpath": "github.com/matrix-org/dugong",
- "repository": "https://github.com/matrix-org/dugong",
- "revision": "ea0a4690a0d5b414a18dbb06cf6153309a2d0528",
- "branch": "master"
- },
- {
- "importpath": "github.com/matrix-org/gomatrix",
- "repository": "https://github.com/matrix-org/gomatrix",
- "revision": "a7fc80c8060c2544fe5d4dae465b584f8e9b4e27",
- "branch": "master"
- },
- {
- "importpath": "github.com/matrix-org/gomatrixserverlib",
- "repository": "https://github.com/matrix-org/gomatrixserverlib",
- "revision": "1c2cbc0872f0b2f19929dd70d22f77486078641e",
- "branch": "HEAD"
- },
- {
- "importpath": "github.com/matrix-org/naffka",
- "repository": "https://github.com/matrix-org/naffka",
- "revision": "662bfd0841d0194bfe0a700d54226bb96eac574d",
- "branch": "master"
- },
- {
- "importpath": "github.com/matrix-org/util",
- "repository": "https://github.com/matrix-org/util",
- "revision": "8b1c8ab81986c1ce7f06a52fce48f4a1156b66ee",
- "branch": "master"
- },
- {
- "importpath": "github.com/matttproud/golang_protobuf_extensions/pbutil",
- "repository": "https://github.com/matttproud/golang_protobuf_extensions",
- "revision": "c12348ce28de40eed0136aa2b644d0ee0650e56c",
- "branch": "master",
- "path": "/pbutil"
- },
- {
- "importpath": "github.com/nfnt/resize",
- "repository": "https://github.com/nfnt/resize",
- "revision": "891127d8d1b52734debe1b3c3d7e747502b6c366",
- "branch": "master"
- },
- {
- "importpath": "github.com/nicksnyder/go-i18n/i18n",
- "repository": "https://github.com/nicksnyder/go-i18n",
- "revision": "3e70a1a463008cea6726380c908b1a6a8bdf7b24",
- "branch": "master",
- "path": "/i18n"
- },
- {
- "importpath": "github.com/opentracing/opentracing-go",
- "repository": "https://github.com/opentracing/opentracing-go",
- "revision": "8ebe5d4e236eed9fd88e593c288bfb804d630b8c",
- "branch": "master"
- },
- {
- "importpath": "github.com/pelletier/go-toml",
- "repository": "https://github.com/pelletier/go-toml",
- "revision": "1d6b12b7cb290426e27e6b4e38b89fcda3aeef03",
- "branch": "master"
- },
- {
- "importpath": "github.com/pierrec/lz4",
- "repository": "https://github.com/pierrec/lz4",
- "revision": "5c9560bfa9ace2bf86080bf40d46b34ae44604df",
- "branch": "master"
- },
- {
- "importpath": "github.com/pierrec/xxHash/xxHash32",
- "repository": "https://github.com/pierrec/xxHash",
- "revision": "5a004441f897722c627870a981d02b29924215fa",
- "branch": "master",
- "path": "/xxHash32"
- },
- {
- "importpath": "github.com/pkg/errors",
- "repository": "https://github.com/pkg/errors",
- "revision": "c605e284fe17294bda444b34710735b29d1a9d90",
- "branch": "master"
- },
- {
- "importpath": "github.com/pmezard/go-difflib/difflib",
- "repository": "https://github.com/pmezard/go-difflib",
- "revision": "792786c7400a136282c1664665ae0a8db921c6c2",
- "branch": "master",
- "path": "/difflib"
- },
- {
- "importpath": "github.com/prometheus/client_golang/prometheus",
- "repository": "https://github.com/prometheus/client_golang",
- "revision": "c51dc758d4bb30acacbef9eaa2b774969a135086",
- "branch": "master"
- },
- {
- "importpath": "github.com/prometheus/client_golang/prometheus/promhttp",
- "repository": "https://github.com/prometheus/client_golang",
- "revision": "c51dc758d4bb30acacbef9eaa2b774969a135086",
- "branch": "master"
- },
- {
- "importpath": "github.com/prometheus/client_model/go",
- "repository": "https://github.com/prometheus/client_model",
- "revision": "fa8ad6fec33561be4280a8f0514318c79d7f6cb6",
- "branch": "master",
- "path": "/go"
- },
- {
- "importpath": "github.com/prometheus/common/expfmt",
- "repository": "https://github.com/prometheus/common",
- "revision": "dd2f054febf4a6c00f2343686efb775948a8bff4",
- "branch": "master",
- "path": "/expfmt"
- },
- {
- "importpath": "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg",
- "repository": "https://github.com/prometheus/common",
- "revision": "dd2f054febf4a6c00f2343686efb775948a8bff4",
- "branch": "master",
- "path": "/internal/bitbucket.org/ww/goautoneg"
- },
- {
- "importpath": "github.com/prometheus/common/model",
- "repository": "https://github.com/prometheus/common",
- "revision": "dd2f054febf4a6c00f2343686efb775948a8bff4",
- "branch": "master",
- "path": "/model"
- },
- {
- "importpath": "github.com/prometheus/procfs",
- "repository": "https://github.com/prometheus/procfs",
- "revision": "1878d9fbb537119d24b21ca07effd591627cd160",
- "branch": "master"
- },
- {
- "importpath": "github.com/rcrowley/go-metrics",
- "repository": "https://github.com/rcrowley/go-metrics",
- "revision": "1f30fe9094a513ce4c700b9a54458bbb0c96996c",
- "branch": "master"
- },
- {
- "importpath": "github.com/sirupsen/logrus",
- "repository": "https://github.com/sirupsen/logrus",
- "revision": "89742aefa4b206dcf400792f3bd35b542998eb3b",
- "branch": "master"
- },
- {
- "importpath": "github.com/stretchr/testify/assert",
- "repository": "https://github.com/stretchr/testify",
- "revision": "890a5c3458b43e6104ff5da8dfa139d013d77544",
- "branch": "master",
- "path": "/assert"
- },
- {
- "importpath": "github.com/stretchr/testify/require",
- "repository": "https://github.com/stretchr/testify",
- "revision": "890a5c3458b43e6104ff5da8dfa139d013d77544",
- "branch": "master",
- "path": "/require"
- },
- {
- "importpath": "github.com/tidwall/gjson",
- "repository": "https://github.com/tidwall/gjson",
- "revision": "67e2a63ac70d273b6bc7589f12f07180bc9fc189",
- "branch": "master"
- },
- {
- "importpath": "github.com/tidwall/match",
- "repository": "https://github.com/tidwall/match",
- "revision": "1731857f09b1f38450e2c12409748407822dc6be",
- "branch": "master"
- },
- {
- "importpath": "github.com/tidwall/sjson",
- "repository": "https://github.com/tidwall/sjson",
- "revision": "6a22caf2fd45d5e2119bfc3717e984f15a7eb7ee",
- "branch": "master"
- },
- {
- "importpath": "github.com/uber-go/atomic",
- "repository": "https://github.com/uber-go/atomic",
- "revision": "54f72d32435d760d5604f17a82e2435b28dc4ba5",
- "branch": "master"
- },
- {
- "importpath": "github.com/uber/tchannel-go",
- "repository": "https://github.com/uber/tchannel-go",
- "revision": "b3e26487e291972fda9c7301864a2ee7a319fd35",
- "branch": "dev"
- },
- {
- "importpath": "go.uber.org/atomic",
- "repository": "https://github.com/uber-go/atomic",
- "revision": "54f72d32435d760d5604f17a82e2435b28dc4ba5",
- "branch": "master"
- },
- {
- "importpath": "go.uber.org/multierr",
- "repository": "https://github.com/uber-go/multierr",
- "revision": "fb7d312c2c04c34f0ad621048bbb953b168f9ff6",
- "branch": "master"
- },
- {
- "importpath": "go.uber.org/zap",
- "repository": "https://github.com/uber-go/zap",
- "revision": "35aad584952c3e7020db7b839f6b102de6271f89",
- "branch": "master"
- },
- {
- "importpath": "golang.org/x/crypto/bcrypt",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
- "branch": "master",
- "path": "/bcrypt"
- },
- {
- "importpath": "golang.org/x/crypto/blowfish",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
- "branch": "master",
- "path": "/blowfish"
- },
- {
- "importpath": "golang.org/x/crypto/curve25519",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
- "branch": "master",
- "path": "/curve25519"
- },
- {
- "importpath": "golang.org/x/crypto/ed25519",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
- "branch": "master",
- "path": "/ed25519"
- },
- {
- "importpath": "golang.org/x/crypto/internal/subtle",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "e4dc69e5b2fd71dcaf8bd5d054eb936deb78d1fa",
- "branch": "master",
- "path": "/internal/subtle"
- },
- {
- "importpath": "golang.org/x/crypto/nacl/secretbox",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "e4dc69e5b2fd71dcaf8bd5d054eb936deb78d1fa",
- "branch": "master",
- "path": "/nacl/secretbox"
- },
- {
- "importpath": "golang.org/x/crypto/poly1305",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "e4dc69e5b2fd71dcaf8bd5d054eb936deb78d1fa",
- "branch": "master",
- "path": "/poly1305"
- },
- {
- "importpath": "golang.org/x/crypto/salsa20/salsa",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "e4dc69e5b2fd71dcaf8bd5d054eb936deb78d1fa",
- "branch": "master",
- "path": "/salsa20/salsa"
- },
- {
- "importpath": "golang.org/x/crypto/ssh",
- "repository": "https://go.googlesource.com/crypto",
- "revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
- "branch": "master",
- "path": "/ssh"
- },
- {
- "importpath": "golang.org/x/net/bpf",
- "repository": "https://go.googlesource.com/net",
- "revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
- "branch": "master",
- "path": "/bpf"
- },
- {
- "importpath": "golang.org/x/net/context",
- "repository": "https://go.googlesource.com/net",
- "revision": "007e530097ad7f954752df63046b4036f98ba6a6",
- "branch": "master",
- "path": "/context"
- },
- {
- "importpath": "golang.org/x/net/internal/iana",
- "repository": "https://go.googlesource.com/net",
- "revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
- "branch": "master",
- "path": "/internal/iana"
- },
- {
- "importpath": "golang.org/x/net/internal/socket",
- "repository": "https://go.googlesource.com/net",
- "revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
- "branch": "master",
- "path": "/internal/socket"
- },
- {
- "importpath": "golang.org/x/net/ipv4",
- "repository": "https://go.googlesource.com/net",
- "revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
- "branch": "master",
- "path": "/ipv4"
- },
- {
- "importpath": "golang.org/x/net/ipv6",
- "repository": "https://go.googlesource.com/net",
- "revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
- "branch": "master",
- "path": "/ipv6"
- },
- {
- "importpath": "golang.org/x/sys/unix",
- "repository": "https://go.googlesource.com/sys",
- "revision": "43eea11bc92608addb41b8a406b0407495c106f6",
- "branch": "master",
- "path": "/unix"
- },
- {
- "importpath": "gopkg.in/Shopify/sarama.v1",
- "repository": "https://gopkg.in/Shopify/sarama.v1",
- "revision": "0fb560e5f7fbcaee2f75e3c34174320709f69944",
- "branch": "master"
- },
- {
- "importpath": "gopkg.in/airbrake/gobrake.v2",
- "repository": "https://gopkg.in/airbrake/gobrake.v2",
- "revision": "668876711219e8b0206e2994bf0a59d889c775aa",
- "branch": "master"
- },
- {
- "importpath": "gopkg.in/alecthomas/kingpin.v3-unstable",
- "repository": "https://gopkg.in/alecthomas/kingpin.v3-unstable",
- "revision": "23bcc3c4eae3c47e1384a1aef1d611e5603b8dfc",
- "branch": "v3-unstable"
- },
- {
- "importpath": "gopkg.in/gemnasium/logrus-airbrake-hook.v2",
- "repository": "https://gopkg.in/gemnasium/logrus-airbrake-hook.v2",
- "revision": "e928b033a891c0175fb643d5aa0779e86325eb12",
- "branch": "master"
- },
- {
- "importpath": "gopkg.in/h2non/bimg.v1",
- "repository": "https://gopkg.in/h2non/bimg.v1",
- "revision": "02e621739c77c791d8c153f240b7a1f75b07816f",
- "branch": "master"
- },
- {
- "importpath": "gopkg.in/macaroon.v2",
- "repository": "https://gopkg.in/macaroon.v2",
- "revision": "bed2a428da6e56d950bed5b41fcbae3141e5b0d0",
- "branch": "master"
- },
- {
- "importpath": "gopkg.in/yaml.v2",
- "repository": "https://gopkg.in/yaml.v2",
- "revision": "287cf08546ab5e7e37d55a84f7ed3fd1db036de5",
- "branch": "v2"
- }
- ]
-}
diff --git a/vendor/src/github.com/Shopify/sarama/CHANGELOG.md b/vendor/src/github.com/Shopify/sarama/CHANGELOG.md
deleted file mode 100644
index 5fb512038..000000000
--- a/vendor/src/github.com/Shopify/sarama/CHANGELOG.md
+++ /dev/null
@@ -1,355 +0,0 @@
-# Changelog
-
-#### Version 1.11.0 (2016-12-20)
-
-_Important:_ As of Sarama 1.11 it is necessary to set the config value of
-`Producer.Return.Successes` to true in order to use the SyncProducer. Previous
-versions would silently override this value when instantiating a SyncProducer
-which led to unexpected values and data races.
-
-New Features:
- - Metrics! Thanks to Sébastien Launay for all his work on this feature
- ([#701](https://github.com/Shopify/sarama/pull/701),
- [#746](https://github.com/Shopify/sarama/pull/746),
- [#766](https://github.com/Shopify/sarama/pull/766)).
- - Add support for LZ4 compression
- ([#786](https://github.com/Shopify/sarama/pull/786)).
- - Add support for ListOffsetRequest v1 and Kafka 0.10.1
- ([#775](https://github.com/Shopify/sarama/pull/775)).
- - Added a `HighWaterMarks` method to the Consumer which aggregates the
- `HighWaterMarkOffset` values of its child topic/partitions
- ([#769](https://github.com/Shopify/sarama/pull/769)).
-
-Bug Fixes:
- - Fixed producing when using timestamps, compression and Kafka 0.10
- ([#759](https://github.com/Shopify/sarama/pull/759)).
- - Added missing decoder methods to DescribeGroups response
- ([#756](https://github.com/Shopify/sarama/pull/756)).
- - Fix producer shutdown when `Return.Errors` is disabled
- ([#787](https://github.com/Shopify/sarama/pull/787)).
- - Don't mutate configuration in SyncProducer
- ([#790](https://github.com/Shopify/sarama/pull/790)).
- - Fix crash on SASL initialization failure
- ([#795](https://github.com/Shopify/sarama/pull/795)).
-
-#### Version 1.10.1 (2016-08-30)
-
-Bug Fixes:
- - Fix the documentation for `HashPartitioner` which was incorrect
- ([#717](https://github.com/Shopify/sarama/pull/717)).
- - Permit client creation even when it is limited by ACLs
- ([#722](https://github.com/Shopify/sarama/pull/722)).
- - Several fixes to the consumer timer optimization code, regressions introduced
- in v1.10.0. Go's timers are finicky
- ([#730](https://github.com/Shopify/sarama/pull/730),
- [#733](https://github.com/Shopify/sarama/pull/733),
- [#734](https://github.com/Shopify/sarama/pull/734)).
- - Handle consuming compressed relative offsets with Kafka 0.10
- ([#735](https://github.com/Shopify/sarama/pull/735)).
-
-#### Version 1.10.0 (2016-08-02)
-
-_Important:_ As of Sarama 1.10 it is necessary to tell Sarama the version of
-Kafka you are running against (via the `config.Version` value) in order to use
-features that may not be compatible with old Kafka versions. If you don't
-specify this value it will default to 0.8.2 (the minimum supported), and trying
-to use more recent features (like the offset manager) will fail with an error.
-
-_Also:_ The offset-manager's behaviour has been changed to match the upstream
-java consumer (see [#705](https://github.com/Shopify/sarama/pull/705) and
-[#713](https://github.com/Shopify/sarama/pull/713)). If you use the
-offset-manager, please ensure that you are committing one *greater* than the
-last consumed message offset or else you may end up consuming duplicate
-messages.
-
-New Features:
- - Support for Kafka 0.10
- ([#672](https://github.com/Shopify/sarama/pull/672),
- [#678](https://github.com/Shopify/sarama/pull/678),
- [#681](https://github.com/Shopify/sarama/pull/681), and others).
- - Support for configuring the target Kafka version
- ([#676](https://github.com/Shopify/sarama/pull/676)).
- - Batch producing support in the SyncProducer
- ([#677](https://github.com/Shopify/sarama/pull/677)).
- - Extend producer mock to allow setting expectations on message contents
- ([#667](https://github.com/Shopify/sarama/pull/667)).
-
-Improvements:
- - Support `nil` compressed messages for deleting in compacted topics
- ([#634](https://github.com/Shopify/sarama/pull/634)).
- - Pre-allocate decoding errors, greatly reducing heap usage and GC time against
- misbehaving brokers ([#690](https://github.com/Shopify/sarama/pull/690)).
- - Re-use consumer expiry timers, removing one allocation per consumed message
- ([#707](https://github.com/Shopify/sarama/pull/707)).
-
-Bug Fixes:
- - Actually default the client ID to "sarama" like we say we do
- ([#664](https://github.com/Shopify/sarama/pull/664)).
- - Fix a rare issue where `Client.Leader` could return the wrong error
- ([#685](https://github.com/Shopify/sarama/pull/685)).
- - Fix a possible tight loop in the consumer
- ([#693](https://github.com/Shopify/sarama/pull/693)).
- - Match upstream's offset-tracking behaviour
- ([#705](https://github.com/Shopify/sarama/pull/705)).
- - Report UnknownTopicOrPartition errors from the offset manager
- ([#706](https://github.com/Shopify/sarama/pull/706)).
- - Fix possible negative partition value from the HashPartitioner
- ([#709](https://github.com/Shopify/sarama/pull/709)).
-
-#### Version 1.9.0 (2016-05-16)
-
-New Features:
- - Add support for custom offset manager retention durations
- ([#602](https://github.com/Shopify/sarama/pull/602)).
- - Publish low-level mocks to enable testing of third-party producer/consumer
- implementations ([#570](https://github.com/Shopify/sarama/pull/570)).
- - Declare support for Golang 1.6
- ([#611](https://github.com/Shopify/sarama/pull/611)).
- - Support for SASL plain-text auth
- ([#648](https://github.com/Shopify/sarama/pull/648)).
-
-Improvements:
- - Simplified broker locking scheme slightly
- ([#604](https://github.com/Shopify/sarama/pull/604)).
- - Documentation cleanup
- ([#605](https://github.com/Shopify/sarama/pull/605),
- [#621](https://github.com/Shopify/sarama/pull/621),
- [#654](https://github.com/Shopify/sarama/pull/654)).
-
-Bug Fixes:
- - Fix race condition shutting down the OffsetManager
- ([#658](https://github.com/Shopify/sarama/pull/658)).
-
-#### Version 1.8.0 (2016-02-01)
-
-New Features:
- - Full support for Kafka 0.9:
- - All protocol messages and fields
- ([#586](https://github.com/Shopify/sarama/pull/586),
- [#588](https://github.com/Shopify/sarama/pull/588),
- [#590](https://github.com/Shopify/sarama/pull/590)).
- - Verified that TLS support works
- ([#581](https://github.com/Shopify/sarama/pull/581)).
- - Fixed the OffsetManager compatibility
- ([#585](https://github.com/Shopify/sarama/pull/585)).
-
-Improvements:
- - Optimize for fewer system calls when reading from the network
- ([#584](https://github.com/Shopify/sarama/pull/584)).
- - Automatically retry `InvalidMessage` errors to match upstream behaviour
- ([#589](https://github.com/Shopify/sarama/pull/589)).
-
-#### Version 1.7.0 (2015-12-11)
-
-New Features:
- - Preliminary support for Kafka 0.9
- ([#572](https://github.com/Shopify/sarama/pull/572)). This comes with several
- caveats:
- - Protocol-layer support is mostly in place
- ([#577](https://github.com/Shopify/sarama/pull/577)), however Kafka 0.9
- renamed some messages and fields, which we did not in order to preserve API
- compatibility.
- - The producer and consumer work against 0.9, but the offset manager does
- not ([#573](https://github.com/Shopify/sarama/pull/573)).
- - TLS support may or may not work
- ([#581](https://github.com/Shopify/sarama/pull/581)).
-
-Improvements:
- - Don't wait for request timeouts on dead brokers, greatly speeding recovery
- when the TCP connection is left hanging
- ([#548](https://github.com/Shopify/sarama/pull/548)).
- - Refactored part of the producer. The new version provides a much more elegant
- solution to [#449](https://github.com/Shopify/sarama/pull/449). It is also
- slightly more efficient, and much more precise in calculating batch sizes
- when compression is used
- ([#549](https://github.com/Shopify/sarama/pull/549),
- [#550](https://github.com/Shopify/sarama/pull/550),
- [#551](https://github.com/Shopify/sarama/pull/551)).
-
-Bug Fixes:
- - Fix race condition in consumer test mock
- ([#553](https://github.com/Shopify/sarama/pull/553)).
-
-#### Version 1.6.1 (2015-09-25)
-
-Bug Fixes:
- - Fix panic that could occur if a user-supplied message value failed to encode
- ([#449](https://github.com/Shopify/sarama/pull/449)).
-
-#### Version 1.6.0 (2015-09-04)
-
-New Features:
- - Implementation of a consumer offset manager using the APIs introduced in
- Kafka 0.8.2. The API is designed mainly for integration into a future
- high-level consumer, not for direct use, although it is *possible* to use it
- directly.
- ([#461](https://github.com/Shopify/sarama/pull/461)).
-
-Improvements:
- - CRC32 calculation is much faster on machines with SSE4.2 instructions,
- removing a major hotspot from most profiles
- ([#255](https://github.com/Shopify/sarama/pull/255)).
-
-Bug Fixes:
- - Make protocol decoding more robust against some malformed packets generated
- by go-fuzz ([#523](https://github.com/Shopify/sarama/pull/523),
- [#525](https://github.com/Shopify/sarama/pull/525)) or found in other ways
- ([#528](https://github.com/Shopify/sarama/pull/528)).
- - Fix a potential race condition panic in the consumer on shutdown
- ([#529](https://github.com/Shopify/sarama/pull/529)).
-
-#### Version 1.5.0 (2015-08-17)
-
-New Features:
- - TLS-encrypted network connections are now supported. This feature is subject
- to change when Kafka releases built-in TLS support, but for now this is
- enough to work with TLS-terminating proxies
- ([#154](https://github.com/Shopify/sarama/pull/154)).
-
-Improvements:
- - The consumer will not block if a single partition is not drained by the user;
- all other partitions will continue to consume normally
- ([#485](https://github.com/Shopify/sarama/pull/485)).
- - Formatting of error strings has been much improved
- ([#495](https://github.com/Shopify/sarama/pull/495)).
- - Internal refactoring of the producer for code cleanliness and to enable
- future work ([#300](https://github.com/Shopify/sarama/pull/300)).
-
-Bug Fixes:
- - Fix a potential deadlock in the consumer on shutdown
- ([#475](https://github.com/Shopify/sarama/pull/475)).
-
-#### Version 1.4.3 (2015-07-21)
-
-Bug Fixes:
- - Don't include the partitioner in the producer's "fetch partitions"
- circuit-breaker ([#466](https://github.com/Shopify/sarama/pull/466)).
- - Don't retry messages until the broker is closed when abandoning a broker in
- the producer ([#468](https://github.com/Shopify/sarama/pull/468)).
- - Update the import path for snappy-go, it has moved again and the API has
- changed slightly ([#486](https://github.com/Shopify/sarama/pull/486)).
-
-#### Version 1.4.2 (2015-05-27)
-
-Bug Fixes:
- - Update the import path for snappy-go, it has moved from google code to github
- ([#456](https://github.com/Shopify/sarama/pull/456)).
-
-#### Version 1.4.1 (2015-05-25)
-
-Improvements:
- - Optimizations when decoding snappy messages, thanks to John Potocny
- ([#446](https://github.com/Shopify/sarama/pull/446)).
-
-Bug Fixes:
- - Fix hypothetical race conditions on producer shutdown
- ([#450](https://github.com/Shopify/sarama/pull/450),
- [#451](https://github.com/Shopify/sarama/pull/451)).
-
-#### Version 1.4.0 (2015-05-01)
-
-New Features:
- - The consumer now implements `Topics()` and `Partitions()` methods to enable
- users to dynamically choose what topics/partitions to consume without
- instantiating a full client
- ([#431](https://github.com/Shopify/sarama/pull/431)).
- - The partition-consumer now exposes the high water mark offset value returned
- by the broker via the `HighWaterMarkOffset()` method ([#339](https://github.com/Shopify/sarama/pull/339)).
- - Added a `kafka-console-consumer` tool capable of handling multiple
- partitions, and deprecated the now-obsolete `kafka-console-partitionConsumer`
- ([#439](https://github.com/Shopify/sarama/pull/439),
- [#442](https://github.com/Shopify/sarama/pull/442)).
-
-Improvements:
- - The producer's logging during retry scenarios is more consistent, more
- useful, and slightly less verbose
- ([#429](https://github.com/Shopify/sarama/pull/429)).
- - The client now shuffles its initial list of seed brokers in order to prevent
- thundering herd on the first broker in the list
- ([#441](https://github.com/Shopify/sarama/pull/441)).
-
-Bug Fixes:
- - The producer now correctly manages its state if retries occur when it is
- shutting down, fixing several instances of confusing behaviour and at least
- one potential deadlock ([#419](https://github.com/Shopify/sarama/pull/419)).
- - The consumer now handles messages for different partitions asynchronously,
- making it much more resilient to specific user code ordering
- ([#325](https://github.com/Shopify/sarama/pull/325)).
-
-#### Version 1.3.0 (2015-04-16)
-
-New Features:
- - The client now tracks consumer group coordinators using
- ConsumerMetadataRequests similar to how it tracks partition leadership using
- regular MetadataRequests ([#411](https://github.com/Shopify/sarama/pull/411)).
- This adds two methods to the client API:
- - `Coordinator(consumerGroup string) (*Broker, error)`
- - `RefreshCoordinator(consumerGroup string) error`
-
-Improvements:
- - ConsumerMetadataResponses now automatically create a Broker object out of the
- ID/address/port combination for the Coordinator; accessing the fields
- individually has been deprecated
- ([#413](https://github.com/Shopify/sarama/pull/413)).
- - Much improved handling of `OffsetOutOfRange` errors in the consumer.
- Consumers will fail to start if the provided offset is out of range
- ([#418](https://github.com/Shopify/sarama/pull/418))
- and they will automatically shut down if the offset falls out of range
- ([#424](https://github.com/Shopify/sarama/pull/424)).
- - Small performance improvement in encoding and decoding protocol messages
- ([#427](https://github.com/Shopify/sarama/pull/427)).
-
-Bug Fixes:
- - Fix a rare race condition in the client's background metadata refresher if
- it happens to be activated while the client is being closed
- ([#422](https://github.com/Shopify/sarama/pull/422)).
-
-#### Version 1.2.0 (2015-04-07)
-
-Improvements:
- - The producer's behaviour when `Flush.Frequency` is set is now more intuitive
- ([#389](https://github.com/Shopify/sarama/pull/389)).
- - The producer is now somewhat more memory-efficient during and after retrying
- messages due to an improved queue implementation
- ([#396](https://github.com/Shopify/sarama/pull/396)).
- - The consumer produces much more useful logging output when leadership
- changes ([#385](https://github.com/Shopify/sarama/pull/385)).
- - The client's `GetOffset` method will now automatically refresh metadata and
- retry once in the event of stale information or similar
- ([#394](https://github.com/Shopify/sarama/pull/394)).
- - Broker connections now have support for using TCP keepalives
- ([#407](https://github.com/Shopify/sarama/issues/407)).
-
-Bug Fixes:
- - The OffsetCommitRequest message now correctly implements all three possible
- API versions ([#390](https://github.com/Shopify/sarama/pull/390),
- [#400](https://github.com/Shopify/sarama/pull/400)).
-
-#### Version 1.1.0 (2015-03-20)
-
-Improvements:
- - Wrap the producer's partitioner call in a circuit-breaker so that repeatedly
- broken topics don't choke throughput
- ([#373](https://github.com/Shopify/sarama/pull/373)).
-
-Bug Fixes:
- - Fix the producer's internal reference counting in certain unusual scenarios
- ([#367](https://github.com/Shopify/sarama/pull/367)).
- - Fix the consumer's internal reference counting in certain unusual scenarios
- ([#369](https://github.com/Shopify/sarama/pull/369)).
- - Fix a condition where the producer's internal control messages could have
- gotten stuck ([#368](https://github.com/Shopify/sarama/pull/368)).
- - Fix an issue where invalid partition lists would be cached when asking for
- metadata for a non-existant topic ([#372](https://github.com/Shopify/sarama/pull/372)).
-
-
-#### Version 1.0.0 (2015-03-17)
-
-Version 1.0.0 is the first tagged version, and is almost a complete rewrite. The primary differences with previous untagged versions are:
-
-- The producer has been rewritten; there is now a `SyncProducer` with a blocking API, and an `AsyncProducer` that is non-blocking.
-- The consumer has been rewritten to only open one connection per broker instead of one connection per partition.
-- The main types of Sarama are now interfaces to make depedency injection easy; mock implementations for `Consumer`, `SyncProducer` and `AsyncProducer` are provided in the `github.com/Shopify/sarama/mocks` package.
-- For most uses cases, it is no longer necessary to open a `Client`; this will be done for you.
-- All the configuration values have been unified in the `Config` struct.
-- Much improved test suite.
diff --git a/vendor/src/github.com/Shopify/sarama/MIT-LICENSE b/vendor/src/github.com/Shopify/sarama/MIT-LICENSE
deleted file mode 100644
index 8121b63b1..000000000
--- a/vendor/src/github.com/Shopify/sarama/MIT-LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2013 Evan Huus
-
-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/src/github.com/Shopify/sarama/Makefile b/vendor/src/github.com/Shopify/sarama/Makefile
deleted file mode 100644
index 626b09a54..000000000
--- a/vendor/src/github.com/Shopify/sarama/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-default: fmt vet errcheck test
-
-test:
- go test -v -timeout 60s -race ./...
-
-vet:
- go vet ./...
-
-errcheck:
- errcheck github.com/Shopify/sarama/...
-
-fmt:
- @if [ -n "$$(go fmt ./...)" ]; then echo 'Please run go fmt on your code.' && exit 1; fi
-
-install_dependencies: install_errcheck get
-
-install_errcheck:
- go get github.com/kisielk/errcheck
-
-get:
- go get -t
diff --git a/vendor/src/github.com/Shopify/sarama/README.md b/vendor/src/github.com/Shopify/sarama/README.md
deleted file mode 100644
index c2968b92c..000000000
--- a/vendor/src/github.com/Shopify/sarama/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-sarama
-======
-
-[](https://godoc.org/github.com/Shopify/sarama)
-[](https://travis-ci.org/Shopify/sarama)
-
-Sarama is an MIT-licensed Go client library for [Apache Kafka](https://kafka.apache.org/) version 0.8 (and later).
-
-### Getting started
-
-- API documentation and examples are available via [godoc](https://godoc.org/github.com/Shopify/sarama).
-- Mocks for testing are available in the [mocks](./mocks) subpackage.
-- The [examples](./examples) directory contains more elaborate example applications.
-- The [tools](./tools) directory contains command line tools that can be useful for testing, diagnostics, and instrumentation.
-
-### Compatibility and API stability
-
-Sarama provides a "2 releases + 2 months" compatibility guarantee: we support
-the two latest stable releases of Kafka and Go, and we provide a two month
-grace period for older releases. This means we currently officially support
-Go 1.7 and 1.6, and Kafka 0.10.0 and 0.9.0, although older releases are
-still likely to work.
-
-Sarama follows semantic versioning and provides API stability via the gopkg.in service.
-You can import a version with a guaranteed stable API via http://gopkg.in/Shopify/sarama.v1.
-A changelog is available [here](CHANGELOG.md).
-
-### Contributing
-
-* Get started by checking our [contribution guidelines](https://github.com/Shopify/sarama/blob/master/CONTRIBUTING.md).
-* Read the [Sarama wiki](https://github.com/Shopify/sarama/wiki) for more
- technical and design details.
-* The [Kafka Protocol Specification](https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol)
- contains a wealth of useful information.
-* For more general issues, there is [a google group](https://groups.google.com/forum/#!forum/kafka-clients) for Kafka client developers.
-* If you have any questions, just ask!
diff --git a/vendor/src/github.com/Shopify/sarama/Vagrantfile b/vendor/src/github.com/Shopify/sarama/Vagrantfile
deleted file mode 100644
index f4b848a30..000000000
--- a/vendor/src/github.com/Shopify/sarama/Vagrantfile
+++ /dev/null
@@ -1,20 +0,0 @@
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-
-# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
-VAGRANTFILE_API_VERSION = "2"
-
-# We have 5 * 192MB ZK processes and 5 * 320MB Kafka processes => 2560MB
-MEMORY = 3072
-
-Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
- config.vm.box = "ubuntu/trusty64"
-
- config.vm.provision :shell, path: "vagrant/provision.sh"
-
- config.vm.network "private_network", ip: "192.168.100.67"
-
- config.vm.provider "virtualbox" do |v|
- v.memory = MEMORY
- end
-end
diff --git a/vendor/src/github.com/Shopify/sarama/api_versions_request.go b/vendor/src/github.com/Shopify/sarama/api_versions_request.go
deleted file mode 100644
index ab65f01cc..000000000
--- a/vendor/src/github.com/Shopify/sarama/api_versions_request.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package sarama
-
-type ApiVersionsRequest struct {
-}
-
-func (r *ApiVersionsRequest) encode(pe packetEncoder) error {
- return nil
-}
-
-func (r *ApiVersionsRequest) decode(pd packetDecoder, version int16) (err error) {
- return nil
-}
-
-func (r *ApiVersionsRequest) key() int16 {
- return 18
-}
-
-func (r *ApiVersionsRequest) version() int16 {
- return 0
-}
-
-func (r *ApiVersionsRequest) requiredVersion() KafkaVersion {
- return V0_10_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/api_versions_request_test.go b/vendor/src/github.com/Shopify/sarama/api_versions_request_test.go
deleted file mode 100644
index 5ab4fa71c..000000000
--- a/vendor/src/github.com/Shopify/sarama/api_versions_request_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- apiVersionRequest = []byte{}
-)
-
-func TestApiVersionsRequest(t *testing.T) {
- var request *ApiVersionsRequest
-
- request = new(ApiVersionsRequest)
- testRequest(t, "basic", request, apiVersionRequest)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/api_versions_response.go b/vendor/src/github.com/Shopify/sarama/api_versions_response.go
deleted file mode 100644
index 16d62db2d..000000000
--- a/vendor/src/github.com/Shopify/sarama/api_versions_response.go
+++ /dev/null
@@ -1,86 +0,0 @@
-package sarama
-
-type ApiVersionsResponseBlock struct {
- ApiKey int16
- MinVersion int16
- MaxVersion int16
-}
-
-func (b *ApiVersionsResponseBlock) encode(pe packetEncoder) error {
- pe.putInt16(b.ApiKey)
- pe.putInt16(b.MinVersion)
- pe.putInt16(b.MaxVersion)
- return nil
-}
-
-func (b *ApiVersionsResponseBlock) decode(pd packetDecoder) error {
- var err error
-
- if b.ApiKey, err = pd.getInt16(); err != nil {
- return err
- }
-
- if b.MinVersion, err = pd.getInt16(); err != nil {
- return err
- }
-
- if b.MaxVersion, err = pd.getInt16(); err != nil {
- return err
- }
-
- return nil
-}
-
-type ApiVersionsResponse struct {
- Err KError
- ApiVersions []*ApiVersionsResponseBlock
-}
-
-func (r *ApiVersionsResponse) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.Err))
- if err := pe.putArrayLength(len(r.ApiVersions)); err != nil {
- return err
- }
- for _, apiVersion := range r.ApiVersions {
- if err := apiVersion.encode(pe); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (r *ApiVersionsResponse) decode(pd packetDecoder, version int16) error {
- if kerr, err := pd.getInt16(); err != nil {
- return err
- } else {
- r.Err = KError(kerr)
- }
-
- numBlocks, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.ApiVersions = make([]*ApiVersionsResponseBlock, numBlocks)
- for i := 0; i < numBlocks; i++ {
- block := new(ApiVersionsResponseBlock)
- if err := block.decode(pd); err != nil {
- return err
- }
- r.ApiVersions[i] = block
- }
-
- return nil
-}
-
-func (r *ApiVersionsResponse) key() int16 {
- return 18
-}
-
-func (r *ApiVersionsResponse) version() int16 {
- return 0
-}
-
-func (r *ApiVersionsResponse) requiredVersion() KafkaVersion {
- return V0_10_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/api_versions_response_test.go b/vendor/src/github.com/Shopify/sarama/api_versions_response_test.go
deleted file mode 100644
index 675a65a7d..000000000
--- a/vendor/src/github.com/Shopify/sarama/api_versions_response_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- apiVersionResponse = []byte{
- 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x03,
- 0x00, 0x02,
- 0x00, 0x01,
- }
-)
-
-func TestApiVersionsResponse(t *testing.T) {
- var response *ApiVersionsResponse
-
- response = new(ApiVersionsResponse)
- testVersionDecodable(t, "no error", response, apiVersionResponse, 0)
- if response.Err != ErrNoError {
- t.Error("Decoding error failed: no error expected but found", response.Err)
- }
- if response.ApiVersions[0].ApiKey != 0x03 {
- t.Error("Decoding error: expected 0x03 but got", response.ApiVersions[0].ApiKey)
- }
- if response.ApiVersions[0].MinVersion != 0x02 {
- t.Error("Decoding error: expected 0x02 but got", response.ApiVersions[0].MinVersion)
- }
- if response.ApiVersions[0].MaxVersion != 0x01 {
- t.Error("Decoding error: expected 0x01 but got", response.ApiVersions[0].MaxVersion)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/async_producer.go b/vendor/src/github.com/Shopify/sarama/async_producer.go
deleted file mode 100644
index 3af47fddd..000000000
--- a/vendor/src/github.com/Shopify/sarama/async_producer.go
+++ /dev/null
@@ -1,905 +0,0 @@
-package sarama
-
-import (
- "fmt"
- "sync"
- "time"
-
- "github.com/eapache/go-resiliency/breaker"
- "github.com/eapache/queue"
-)
-
-// AsyncProducer publishes Kafka messages using a non-blocking API. It routes messages
-// to the correct broker for the provided topic-partition, refreshing metadata as appropriate,
-// and parses responses for errors. You must read from the Errors() channel or the
-// producer will deadlock. You must call Close() or AsyncClose() on a producer to avoid
-// leaks: it will not be garbage-collected automatically when it passes out of
-// scope.
-type AsyncProducer interface {
-
- // AsyncClose triggers a shutdown of the producer, flushing any messages it may
- // have buffered. The shutdown has completed when both the Errors and Successes
- // channels have been closed. When calling AsyncClose, you *must* continue to
- // read from those channels in order to drain the results of any messages in
- // flight.
- AsyncClose()
-
- // Close shuts down the producer and flushes any messages it may have buffered.
- // You must call this function before a producer object passes out of scope, as
- // it may otherwise leak memory. You must call this before calling Close on the
- // underlying client.
- Close() error
-
- // Input is the input channel for the user to write messages to that they
- // wish to send.
- Input() chan<- *ProducerMessage
-
- // Successes is the success output channel back to the user when AckSuccesses is
- // enabled. If Return.Successes is true, you MUST read from this channel or the
- // Producer will deadlock. It is suggested that you send and read messages
- // together in a single select statement.
- Successes() <-chan *ProducerMessage
-
- // Errors is the error output channel back to the user. You MUST read from this
- // channel or the Producer will deadlock when the channel is full. Alternatively,
- // you can set Producer.Return.Errors in your config to false, which prevents
- // errors to be returned.
- Errors() <-chan *ProducerError
-}
-
-type asyncProducer struct {
- client Client
- conf *Config
- ownClient bool
-
- errors chan *ProducerError
- input, successes, retries chan *ProducerMessage
- inFlight sync.WaitGroup
-
- brokers map[*Broker]chan<- *ProducerMessage
- brokerRefs map[chan<- *ProducerMessage]int
- brokerLock sync.Mutex
-}
-
-// NewAsyncProducer creates a new AsyncProducer using the given broker addresses and configuration.
-func NewAsyncProducer(addrs []string, conf *Config) (AsyncProducer, error) {
- client, err := NewClient(addrs, conf)
- if err != nil {
- return nil, err
- }
-
- p, err := NewAsyncProducerFromClient(client)
- if err != nil {
- return nil, err
- }
- p.(*asyncProducer).ownClient = true
- return p, nil
-}
-
-// NewAsyncProducerFromClient creates a new Producer using the given client. It is still
-// necessary to call Close() on the underlying client when shutting down this producer.
-func NewAsyncProducerFromClient(client Client) (AsyncProducer, error) {
- // Check that we are not dealing with a closed Client before processing any other arguments
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- p := &asyncProducer{
- client: client,
- conf: client.Config(),
- errors: make(chan *ProducerError),
- input: make(chan *ProducerMessage),
- successes: make(chan *ProducerMessage),
- retries: make(chan *ProducerMessage),
- brokers: make(map[*Broker]chan<- *ProducerMessage),
- brokerRefs: make(map[chan<- *ProducerMessage]int),
- }
-
- // launch our singleton dispatchers
- go withRecover(p.dispatcher)
- go withRecover(p.retryHandler)
-
- return p, nil
-}
-
-type flagSet int8
-
-const (
- syn flagSet = 1 << iota // first message from partitionProducer to brokerProducer
- fin // final message from partitionProducer to brokerProducer and back
- shutdown // start the shutdown process
-)
-
-// ProducerMessage is the collection of elements passed to the Producer in order to send a message.
-type ProducerMessage struct {
- Topic string // The Kafka topic for this message.
- // The partitioning key for this message. Pre-existing Encoders include
- // StringEncoder and ByteEncoder.
- Key Encoder
- // The actual message to store in Kafka. Pre-existing Encoders include
- // StringEncoder and ByteEncoder.
- Value Encoder
-
- // This field is used to hold arbitrary data you wish to include so it
- // will be available when receiving on the Successes and Errors channels.
- // Sarama completely ignores this field and is only to be used for
- // pass-through data.
- Metadata interface{}
-
- // Below this point are filled in by the producer as the message is processed
-
- // Offset is the offset of the message stored on the broker. This is only
- // guaranteed to be defined if the message was successfully delivered and
- // RequiredAcks is not NoResponse.
- Offset int64
- // Partition is the partition that the message was sent to. This is only
- // guaranteed to be defined if the message was successfully delivered.
- Partition int32
- // Timestamp is the timestamp assigned to the message by the broker. This
- // is only guaranteed to be defined if the message was successfully
- // delivered, RequiredAcks is not NoResponse, and the Kafka broker is at
- // least version 0.10.0.
- Timestamp time.Time
-
- retries int
- flags flagSet
-}
-
-const producerMessageOverhead = 26 // the metadata overhead of CRC, flags, etc.
-
-func (m *ProducerMessage) byteSize() int {
- size := producerMessageOverhead
- if m.Key != nil {
- size += m.Key.Length()
- }
- if m.Value != nil {
- size += m.Value.Length()
- }
- return size
-}
-
-func (m *ProducerMessage) clear() {
- m.flags = 0
- m.retries = 0
-}
-
-// ProducerError is the type of error generated when the producer fails to deliver a message.
-// It contains the original ProducerMessage as well as the actual error value.
-type ProducerError struct {
- Msg *ProducerMessage
- Err error
-}
-
-func (pe ProducerError) Error() string {
- return fmt.Sprintf("kafka: Failed to produce message to topic %s: %s", pe.Msg.Topic, pe.Err)
-}
-
-// ProducerErrors is a type that wraps a batch of "ProducerError"s and implements the Error interface.
-// It can be returned from the Producer's Close method to avoid the need to manually drain the Errors channel
-// when closing a producer.
-type ProducerErrors []*ProducerError
-
-func (pe ProducerErrors) Error() string {
- return fmt.Sprintf("kafka: Failed to deliver %d messages.", len(pe))
-}
-
-func (p *asyncProducer) Errors() <-chan *ProducerError {
- return p.errors
-}
-
-func (p *asyncProducer) Successes() <-chan *ProducerMessage {
- return p.successes
-}
-
-func (p *asyncProducer) Input() chan<- *ProducerMessage {
- return p.input
-}
-
-func (p *asyncProducer) Close() error {
- p.AsyncClose()
-
- if p.conf.Producer.Return.Successes {
- go withRecover(func() {
- for _ = range p.successes {
- }
- })
- }
-
- var errors ProducerErrors
- if p.conf.Producer.Return.Errors {
- for event := range p.errors {
- errors = append(errors, event)
- }
- } else {
- <-p.errors
- }
-
- if len(errors) > 0 {
- return errors
- }
- return nil
-}
-
-func (p *asyncProducer) AsyncClose() {
- go withRecover(p.shutdown)
-}
-
-// singleton
-// dispatches messages by topic
-func (p *asyncProducer) dispatcher() {
- handlers := make(map[string]chan<- *ProducerMessage)
- shuttingDown := false
-
- for msg := range p.input {
- if msg == nil {
- Logger.Println("Something tried to send a nil message, it was ignored.")
- continue
- }
-
- if msg.flags&shutdown != 0 {
- shuttingDown = true
- p.inFlight.Done()
- continue
- } else if msg.retries == 0 {
- if shuttingDown {
- // we can't just call returnError here because that decrements the wait group,
- // which hasn't been incremented yet for this message, and shouldn't be
- pErr := &ProducerError{Msg: msg, Err: ErrShuttingDown}
- if p.conf.Producer.Return.Errors {
- p.errors <- pErr
- } else {
- Logger.Println(pErr)
- }
- continue
- }
- p.inFlight.Add(1)
- }
-
- if msg.byteSize() > p.conf.Producer.MaxMessageBytes {
- p.returnError(msg, ErrMessageSizeTooLarge)
- continue
- }
-
- handler := handlers[msg.Topic]
- if handler == nil {
- handler = p.newTopicProducer(msg.Topic)
- handlers[msg.Topic] = handler
- }
-
- handler <- msg
- }
-
- for _, handler := range handlers {
- close(handler)
- }
-}
-
-// one per topic
-// partitions messages, then dispatches them by partition
-type topicProducer struct {
- parent *asyncProducer
- topic string
- input <-chan *ProducerMessage
-
- breaker *breaker.Breaker
- handlers map[int32]chan<- *ProducerMessage
- partitioner Partitioner
-}
-
-func (p *asyncProducer) newTopicProducer(topic string) chan<- *ProducerMessage {
- input := make(chan *ProducerMessage, p.conf.ChannelBufferSize)
- tp := &topicProducer{
- parent: p,
- topic: topic,
- input: input,
- breaker: breaker.New(3, 1, 10*time.Second),
- handlers: make(map[int32]chan<- *ProducerMessage),
- partitioner: p.conf.Producer.Partitioner(topic),
- }
- go withRecover(tp.dispatch)
- return input
-}
-
-func (tp *topicProducer) dispatch() {
- for msg := range tp.input {
- if msg.retries == 0 {
- if err := tp.partitionMessage(msg); err != nil {
- tp.parent.returnError(msg, err)
- continue
- }
- }
-
- handler := tp.handlers[msg.Partition]
- if handler == nil {
- handler = tp.parent.newPartitionProducer(msg.Topic, msg.Partition)
- tp.handlers[msg.Partition] = handler
- }
-
- handler <- msg
- }
-
- for _, handler := range tp.handlers {
- close(handler)
- }
-}
-
-func (tp *topicProducer) partitionMessage(msg *ProducerMessage) error {
- var partitions []int32
-
- err := tp.breaker.Run(func() (err error) {
- if tp.partitioner.RequiresConsistency() {
- partitions, err = tp.parent.client.Partitions(msg.Topic)
- } else {
- partitions, err = tp.parent.client.WritablePartitions(msg.Topic)
- }
- return
- })
-
- if err != nil {
- return err
- }
-
- numPartitions := int32(len(partitions))
-
- if numPartitions == 0 {
- return ErrLeaderNotAvailable
- }
-
- choice, err := tp.partitioner.Partition(msg, numPartitions)
-
- if err != nil {
- return err
- } else if choice < 0 || choice >= numPartitions {
- return ErrInvalidPartition
- }
-
- msg.Partition = partitions[choice]
-
- return nil
-}
-
-// one per partition per topic
-// dispatches messages to the appropriate broker
-// also responsible for maintaining message order during retries
-type partitionProducer struct {
- parent *asyncProducer
- topic string
- partition int32
- input <-chan *ProducerMessage
-
- leader *Broker
- breaker *breaker.Breaker
- output chan<- *ProducerMessage
-
- // highWatermark tracks the "current" retry level, which is the only one where we actually let messages through,
- // all other messages get buffered in retryState[msg.retries].buf to preserve ordering
- // retryState[msg.retries].expectChaser simply tracks whether we've seen a fin message for a given level (and
- // therefore whether our buffer is complete and safe to flush)
- highWatermark int
- retryState []partitionRetryState
-}
-
-type partitionRetryState struct {
- buf []*ProducerMessage
- expectChaser bool
-}
-
-func (p *asyncProducer) newPartitionProducer(topic string, partition int32) chan<- *ProducerMessage {
- input := make(chan *ProducerMessage, p.conf.ChannelBufferSize)
- pp := &partitionProducer{
- parent: p,
- topic: topic,
- partition: partition,
- input: input,
-
- breaker: breaker.New(3, 1, 10*time.Second),
- retryState: make([]partitionRetryState, p.conf.Producer.Retry.Max+1),
- }
- go withRecover(pp.dispatch)
- return input
-}
-
-func (pp *partitionProducer) dispatch() {
- // try to prefetch the leader; if this doesn't work, we'll do a proper call to `updateLeader`
- // on the first message
- pp.leader, _ = pp.parent.client.Leader(pp.topic, pp.partition)
- if pp.leader != nil {
- pp.output = pp.parent.getBrokerProducer(pp.leader)
- pp.parent.inFlight.Add(1) // we're generating a syn message; track it so we don't shut down while it's still inflight
- pp.output <- &ProducerMessage{Topic: pp.topic, Partition: pp.partition, flags: syn}
- }
-
- for msg := range pp.input {
- if msg.retries > pp.highWatermark {
- // a new, higher, retry level; handle it and then back off
- pp.newHighWatermark(msg.retries)
- time.Sleep(pp.parent.conf.Producer.Retry.Backoff)
- } else if pp.highWatermark > 0 {
- // we are retrying something (else highWatermark would be 0) but this message is not a *new* retry level
- if msg.retries < pp.highWatermark {
- // in fact this message is not even the current retry level, so buffer it for now (unless it's a just a fin)
- if msg.flags&fin == fin {
- pp.retryState[msg.retries].expectChaser = false
- pp.parent.inFlight.Done() // this fin is now handled and will be garbage collected
- } else {
- pp.retryState[msg.retries].buf = append(pp.retryState[msg.retries].buf, msg)
- }
- continue
- } else if msg.flags&fin == fin {
- // this message is of the current retry level (msg.retries == highWatermark) and the fin flag is set,
- // meaning this retry level is done and we can go down (at least) one level and flush that
- pp.retryState[pp.highWatermark].expectChaser = false
- pp.flushRetryBuffers()
- pp.parent.inFlight.Done() // this fin is now handled and will be garbage collected
- continue
- }
- }
-
- // if we made it this far then the current msg contains real data, and can be sent to the next goroutine
- // without breaking any of our ordering guarantees
-
- if pp.output == nil {
- if err := pp.updateLeader(); err != nil {
- pp.parent.returnError(msg, err)
- time.Sleep(pp.parent.conf.Producer.Retry.Backoff)
- continue
- }
- Logger.Printf("producer/leader/%s/%d selected broker %d\n", pp.topic, pp.partition, pp.leader.ID())
- }
-
- pp.output <- msg
- }
-
- if pp.output != nil {
- pp.parent.unrefBrokerProducer(pp.leader, pp.output)
- }
-}
-
-func (pp *partitionProducer) newHighWatermark(hwm int) {
- Logger.Printf("producer/leader/%s/%d state change to [retrying-%d]\n", pp.topic, pp.partition, hwm)
- pp.highWatermark = hwm
-
- // send off a fin so that we know when everything "in between" has made it
- // back to us and we can safely flush the backlog (otherwise we risk re-ordering messages)
- pp.retryState[pp.highWatermark].expectChaser = true
- pp.parent.inFlight.Add(1) // we're generating a fin message; track it so we don't shut down while it's still inflight
- pp.output <- &ProducerMessage{Topic: pp.topic, Partition: pp.partition, flags: fin, retries: pp.highWatermark - 1}
-
- // a new HWM means that our current broker selection is out of date
- Logger.Printf("producer/leader/%s/%d abandoning broker %d\n", pp.topic, pp.partition, pp.leader.ID())
- pp.parent.unrefBrokerProducer(pp.leader, pp.output)
- pp.output = nil
-}
-
-func (pp *partitionProducer) flushRetryBuffers() {
- Logger.Printf("producer/leader/%s/%d state change to [flushing-%d]\n", pp.topic, pp.partition, pp.highWatermark)
- for {
- pp.highWatermark--
-
- if pp.output == nil {
- if err := pp.updateLeader(); err != nil {
- pp.parent.returnErrors(pp.retryState[pp.highWatermark].buf, err)
- goto flushDone
- }
- Logger.Printf("producer/leader/%s/%d selected broker %d\n", pp.topic, pp.partition, pp.leader.ID())
- }
-
- for _, msg := range pp.retryState[pp.highWatermark].buf {
- pp.output <- msg
- }
-
- flushDone:
- pp.retryState[pp.highWatermark].buf = nil
- if pp.retryState[pp.highWatermark].expectChaser {
- Logger.Printf("producer/leader/%s/%d state change to [retrying-%d]\n", pp.topic, pp.partition, pp.highWatermark)
- break
- } else if pp.highWatermark == 0 {
- Logger.Printf("producer/leader/%s/%d state change to [normal]\n", pp.topic, pp.partition)
- break
- }
- }
-}
-
-func (pp *partitionProducer) updateLeader() error {
- return pp.breaker.Run(func() (err error) {
- if err = pp.parent.client.RefreshMetadata(pp.topic); err != nil {
- return err
- }
-
- if pp.leader, err = pp.parent.client.Leader(pp.topic, pp.partition); err != nil {
- return err
- }
-
- pp.output = pp.parent.getBrokerProducer(pp.leader)
- pp.parent.inFlight.Add(1) // we're generating a syn message; track it so we don't shut down while it's still inflight
- pp.output <- &ProducerMessage{Topic: pp.topic, Partition: pp.partition, flags: syn}
-
- return nil
- })
-}
-
-// one per broker; also constructs an associated flusher
-func (p *asyncProducer) newBrokerProducer(broker *Broker) chan<- *ProducerMessage {
- var (
- input = make(chan *ProducerMessage)
- bridge = make(chan *produceSet)
- responses = make(chan *brokerProducerResponse)
- )
-
- bp := &brokerProducer{
- parent: p,
- broker: broker,
- input: input,
- output: bridge,
- responses: responses,
- buffer: newProduceSet(p),
- currentRetries: make(map[string]map[int32]error),
- }
- go withRecover(bp.run)
-
- // minimal bridge to make the network response `select`able
- go withRecover(func() {
- for set := range bridge {
- request := set.buildRequest()
-
- response, err := broker.Produce(request)
-
- responses <- &brokerProducerResponse{
- set: set,
- err: err,
- res: response,
- }
- }
- close(responses)
- })
-
- return input
-}
-
-type brokerProducerResponse struct {
- set *produceSet
- err error
- res *ProduceResponse
-}
-
-// groups messages together into appropriately-sized batches for sending to the broker
-// handles state related to retries etc
-type brokerProducer struct {
- parent *asyncProducer
- broker *Broker
-
- input <-chan *ProducerMessage
- output chan<- *produceSet
- responses <-chan *brokerProducerResponse
-
- buffer *produceSet
- timer <-chan time.Time
- timerFired bool
-
- closing error
- currentRetries map[string]map[int32]error
-}
-
-func (bp *brokerProducer) run() {
- var output chan<- *produceSet
- Logger.Printf("producer/broker/%d starting up\n", bp.broker.ID())
-
- for {
- select {
- case msg := <-bp.input:
- if msg == nil {
- bp.shutdown()
- return
- }
-
- if msg.flags&syn == syn {
- Logger.Printf("producer/broker/%d state change to [open] on %s/%d\n",
- bp.broker.ID(), msg.Topic, msg.Partition)
- if bp.currentRetries[msg.Topic] == nil {
- bp.currentRetries[msg.Topic] = make(map[int32]error)
- }
- bp.currentRetries[msg.Topic][msg.Partition] = nil
- bp.parent.inFlight.Done()
- continue
- }
-
- if reason := bp.needsRetry(msg); reason != nil {
- bp.parent.retryMessage(msg, reason)
-
- if bp.closing == nil && msg.flags&fin == fin {
- // we were retrying this partition but we can start processing again
- delete(bp.currentRetries[msg.Topic], msg.Partition)
- Logger.Printf("producer/broker/%d state change to [closed] on %s/%d\n",
- bp.broker.ID(), msg.Topic, msg.Partition)
- }
-
- continue
- }
-
- if bp.buffer.wouldOverflow(msg) {
- if err := bp.waitForSpace(msg); err != nil {
- bp.parent.retryMessage(msg, err)
- continue
- }
- }
-
- if err := bp.buffer.add(msg); err != nil {
- bp.parent.returnError(msg, err)
- continue
- }
-
- if bp.parent.conf.Producer.Flush.Frequency > 0 && bp.timer == nil {
- bp.timer = time.After(bp.parent.conf.Producer.Flush.Frequency)
- }
- case <-bp.timer:
- bp.timerFired = true
- case output <- bp.buffer:
- bp.rollOver()
- case response := <-bp.responses:
- bp.handleResponse(response)
- }
-
- if bp.timerFired || bp.buffer.readyToFlush() {
- output = bp.output
- } else {
- output = nil
- }
- }
-}
-
-func (bp *brokerProducer) shutdown() {
- for !bp.buffer.empty() {
- select {
- case response := <-bp.responses:
- bp.handleResponse(response)
- case bp.output <- bp.buffer:
- bp.rollOver()
- }
- }
- close(bp.output)
- for response := range bp.responses {
- bp.handleResponse(response)
- }
-
- Logger.Printf("producer/broker/%d shut down\n", bp.broker.ID())
-}
-
-func (bp *brokerProducer) needsRetry(msg *ProducerMessage) error {
- if bp.closing != nil {
- return bp.closing
- }
-
- return bp.currentRetries[msg.Topic][msg.Partition]
-}
-
-func (bp *brokerProducer) waitForSpace(msg *ProducerMessage) error {
- Logger.Printf("producer/broker/%d maximum request accumulated, waiting for space\n", bp.broker.ID())
-
- for {
- select {
- case response := <-bp.responses:
- bp.handleResponse(response)
- // handling a response can change our state, so re-check some things
- if reason := bp.needsRetry(msg); reason != nil {
- return reason
- } else if !bp.buffer.wouldOverflow(msg) {
- return nil
- }
- case bp.output <- bp.buffer:
- bp.rollOver()
- return nil
- }
- }
-}
-
-func (bp *brokerProducer) rollOver() {
- bp.timer = nil
- bp.timerFired = false
- bp.buffer = newProduceSet(bp.parent)
-}
-
-func (bp *brokerProducer) handleResponse(response *brokerProducerResponse) {
- if response.err != nil {
- bp.handleError(response.set, response.err)
- } else {
- bp.handleSuccess(response.set, response.res)
- }
-
- if bp.buffer.empty() {
- bp.rollOver() // this can happen if the response invalidated our buffer
- }
-}
-
-func (bp *brokerProducer) handleSuccess(sent *produceSet, response *ProduceResponse) {
- // we iterate through the blocks in the request set, not the response, so that we notice
- // if the response is missing a block completely
- sent.eachPartition(func(topic string, partition int32, msgs []*ProducerMessage) {
- if response == nil {
- // this only happens when RequiredAcks is NoResponse, so we have to assume success
- bp.parent.returnSuccesses(msgs)
- return
- }
-
- block := response.GetBlock(topic, partition)
- if block == nil {
- bp.parent.returnErrors(msgs, ErrIncompleteResponse)
- return
- }
-
- switch block.Err {
- // Success
- case ErrNoError:
- if bp.parent.conf.Version.IsAtLeast(V0_10_0_0) && !block.Timestamp.IsZero() {
- for _, msg := range msgs {
- msg.Timestamp = block.Timestamp
- }
- }
- for i, msg := range msgs {
- msg.Offset = block.Offset + int64(i)
- }
- bp.parent.returnSuccesses(msgs)
- // Retriable errors
- case ErrInvalidMessage, ErrUnknownTopicOrPartition, ErrLeaderNotAvailable, ErrNotLeaderForPartition,
- ErrRequestTimedOut, ErrNotEnoughReplicas, ErrNotEnoughReplicasAfterAppend:
- Logger.Printf("producer/broker/%d state change to [retrying] on %s/%d because %v\n",
- bp.broker.ID(), topic, partition, block.Err)
- bp.currentRetries[topic][partition] = block.Err
- bp.parent.retryMessages(msgs, block.Err)
- bp.parent.retryMessages(bp.buffer.dropPartition(topic, partition), block.Err)
- // Other non-retriable errors
- default:
- bp.parent.returnErrors(msgs, block.Err)
- }
- })
-}
-
-func (bp *brokerProducer) handleError(sent *produceSet, err error) {
- switch err.(type) {
- case PacketEncodingError:
- sent.eachPartition(func(topic string, partition int32, msgs []*ProducerMessage) {
- bp.parent.returnErrors(msgs, err)
- })
- default:
- Logger.Printf("producer/broker/%d state change to [closing] because %s\n", bp.broker.ID(), err)
- bp.parent.abandonBrokerConnection(bp.broker)
- _ = bp.broker.Close()
- bp.closing = err
- sent.eachPartition(func(topic string, partition int32, msgs []*ProducerMessage) {
- bp.parent.retryMessages(msgs, err)
- })
- bp.buffer.eachPartition(func(topic string, partition int32, msgs []*ProducerMessage) {
- bp.parent.retryMessages(msgs, err)
- })
- bp.rollOver()
- }
-}
-
-// singleton
-// effectively a "bridge" between the flushers and the dispatcher in order to avoid deadlock
-// based on https://godoc.org/github.com/eapache/channels#InfiniteChannel
-func (p *asyncProducer) retryHandler() {
- var msg *ProducerMessage
- buf := queue.New()
-
- for {
- if buf.Length() == 0 {
- msg = <-p.retries
- } else {
- select {
- case msg = <-p.retries:
- case p.input <- buf.Peek().(*ProducerMessage):
- buf.Remove()
- continue
- }
- }
-
- if msg == nil {
- return
- }
-
- buf.Add(msg)
- }
-}
-
-// utility functions
-
-func (p *asyncProducer) shutdown() {
- Logger.Println("Producer shutting down.")
- p.inFlight.Add(1)
- p.input <- &ProducerMessage{flags: shutdown}
-
- p.inFlight.Wait()
-
- if p.ownClient {
- err := p.client.Close()
- if err != nil {
- Logger.Println("producer/shutdown failed to close the embedded client:", err)
- }
- }
-
- close(p.input)
- close(p.retries)
- close(p.errors)
- close(p.successes)
-}
-
-func (p *asyncProducer) returnError(msg *ProducerMessage, err error) {
- msg.clear()
- pErr := &ProducerError{Msg: msg, Err: err}
- if p.conf.Producer.Return.Errors {
- p.errors <- pErr
- } else {
- Logger.Println(pErr)
- }
- p.inFlight.Done()
-}
-
-func (p *asyncProducer) returnErrors(batch []*ProducerMessage, err error) {
- for _, msg := range batch {
- p.returnError(msg, err)
- }
-}
-
-func (p *asyncProducer) returnSuccesses(batch []*ProducerMessage) {
- for _, msg := range batch {
- if p.conf.Producer.Return.Successes {
- msg.clear()
- p.successes <- msg
- }
- p.inFlight.Done()
- }
-}
-
-func (p *asyncProducer) retryMessage(msg *ProducerMessage, err error) {
- if msg.retries >= p.conf.Producer.Retry.Max {
- p.returnError(msg, err)
- } else {
- msg.retries++
- p.retries <- msg
- }
-}
-
-func (p *asyncProducer) retryMessages(batch []*ProducerMessage, err error) {
- for _, msg := range batch {
- p.retryMessage(msg, err)
- }
-}
-
-func (p *asyncProducer) getBrokerProducer(broker *Broker) chan<- *ProducerMessage {
- p.brokerLock.Lock()
- defer p.brokerLock.Unlock()
-
- bp := p.brokers[broker]
-
- if bp == nil {
- bp = p.newBrokerProducer(broker)
- p.brokers[broker] = bp
- p.brokerRefs[bp] = 0
- }
-
- p.brokerRefs[bp]++
-
- return bp
-}
-
-func (p *asyncProducer) unrefBrokerProducer(broker *Broker, bp chan<- *ProducerMessage) {
- p.brokerLock.Lock()
- defer p.brokerLock.Unlock()
-
- p.brokerRefs[bp]--
- if p.brokerRefs[bp] == 0 {
- close(bp)
- delete(p.brokerRefs, bp)
-
- if p.brokers[broker] == bp {
- delete(p.brokers, broker)
- }
- }
-}
-
-func (p *asyncProducer) abandonBrokerConnection(broker *Broker) {
- p.brokerLock.Lock()
- defer p.brokerLock.Unlock()
-
- delete(p.brokers, broker)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/async_producer_test.go b/vendor/src/github.com/Shopify/sarama/async_producer_test.go
deleted file mode 100644
index 13af1202c..000000000
--- a/vendor/src/github.com/Shopify/sarama/async_producer_test.go
+++ /dev/null
@@ -1,841 +0,0 @@
-package sarama
-
-import (
- "errors"
- "log"
- "os"
- "os/signal"
- "sync"
- "testing"
- "time"
-)
-
-const TestMessage = "ABC THE MESSAGE"
-
-func closeProducer(t *testing.T, p AsyncProducer) {
- var wg sync.WaitGroup
- p.AsyncClose()
-
- wg.Add(2)
- go func() {
- for _ = range p.Successes() {
- t.Error("Unexpected message on Successes()")
- }
- wg.Done()
- }()
- go func() {
- for msg := range p.Errors() {
- t.Error(msg.Err)
- }
- wg.Done()
- }()
- wg.Wait()
-}
-
-func expectResults(t *testing.T, p AsyncProducer, successes, errors int) {
- expect := successes + errors
- for expect > 0 {
- select {
- case msg := <-p.Errors():
- if msg.Msg.flags != 0 {
- t.Error("Message had flags set")
- }
- errors--
- expect--
- if errors < 0 {
- t.Error(msg.Err)
- }
- case msg := <-p.Successes():
- if msg.flags != 0 {
- t.Error("Message had flags set")
- }
- successes--
- expect--
- if successes < 0 {
- t.Error("Too many successes")
- }
- }
- }
- if successes != 0 || errors != 0 {
- t.Error("Unexpected successes", successes, "or errors", errors)
- }
-}
-
-type testPartitioner chan *int32
-
-func (p testPartitioner) Partition(msg *ProducerMessage, numPartitions int32) (int32, error) {
- part := <-p
- if part == nil {
- return 0, errors.New("BOOM")
- }
-
- return *part, nil
-}
-
-func (p testPartitioner) RequiresConsistency() bool {
- return true
-}
-
-func (p testPartitioner) feed(partition int32) {
- p <- &partition
-}
-
-type flakyEncoder bool
-
-func (f flakyEncoder) Length() int {
- return len(TestMessage)
-}
-
-func (f flakyEncoder) Encode() ([]byte, error) {
- if !bool(f) {
- return nil, errors.New("flaky encoding error")
- }
- return []byte(TestMessage), nil
-}
-
-func TestAsyncProducer(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 10
- config.Producer.Return.Successes = true
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage), Metadata: i}
- }
- for i := 0; i < 10; i++ {
- select {
- case msg := <-producer.Errors():
- t.Error(msg.Err)
- if msg.Msg.flags != 0 {
- t.Error("Message had flags set")
- }
- case msg := <-producer.Successes():
- if msg.flags != 0 {
- t.Error("Message had flags set")
- }
- if msg.Metadata.(int) != i {
- t.Error("Message metadata did not match")
- }
- }
- }
-
- closeProducer(t, producer)
- leader.Close()
- seedBroker.Close()
-}
-
-func TestAsyncProducerMultipleFlushes(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
- leader.Returns(prodSuccess)
- leader.Returns(prodSuccess)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 5
- config.Producer.Return.Successes = true
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for flush := 0; flush < 3; flush++ {
- for i := 0; i < 5; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- expectResults(t, producer, 5, 0)
- }
-
- closeProducer(t, producer)
- leader.Close()
- seedBroker.Close()
-}
-
-func TestAsyncProducerMultipleBrokers(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader0 := NewMockBroker(t, 2)
- leader1 := NewMockBroker(t, 3)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader0.Addr(), leader0.BrokerID())
- metadataResponse.AddBroker(leader1.Addr(), leader1.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader0.BrokerID(), nil, nil, ErrNoError)
- metadataResponse.AddTopicPartition("my_topic", 1, leader1.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodResponse0 := new(ProduceResponse)
- prodResponse0.AddTopicPartition("my_topic", 0, ErrNoError)
- leader0.Returns(prodResponse0)
-
- prodResponse1 := new(ProduceResponse)
- prodResponse1.AddTopicPartition("my_topic", 1, ErrNoError)
- leader1.Returns(prodResponse1)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 5
- config.Producer.Return.Successes = true
- config.Producer.Partitioner = NewRoundRobinPartitioner
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- expectResults(t, producer, 10, 0)
-
- closeProducer(t, producer)
- leader1.Close()
- leader0.Close()
- seedBroker.Close()
-}
-
-func TestAsyncProducerCustomPartitioner(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodResponse := new(ProduceResponse)
- prodResponse.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodResponse)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 2
- config.Producer.Return.Successes = true
- config.Producer.Partitioner = func(topic string) Partitioner {
- p := make(testPartitioner)
- go func() {
- p.feed(0)
- p <- nil
- p <- nil
- p <- nil
- p.feed(0)
- }()
- return p
- }
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 5; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- expectResults(t, producer, 2, 3)
-
- closeProducer(t, producer)
- leader.Close()
- seedBroker.Close()
-}
-
-func TestAsyncProducerFailureRetry(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader1 := NewMockBroker(t, 2)
- leader2 := NewMockBroker(t, 3)
-
- metadataLeader1 := new(MetadataResponse)
- metadataLeader1.AddBroker(leader1.Addr(), leader1.BrokerID())
- metadataLeader1.AddTopicPartition("my_topic", 0, leader1.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataLeader1)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 10
- config.Producer.Return.Successes = true
- config.Producer.Retry.Backoff = 0
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
- seedBroker.Close()
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- prodNotLeader := new(ProduceResponse)
- prodNotLeader.AddTopicPartition("my_topic", 0, ErrNotLeaderForPartition)
- leader1.Returns(prodNotLeader)
-
- metadataLeader2 := new(MetadataResponse)
- metadataLeader2.AddBroker(leader2.Addr(), leader2.BrokerID())
- metadataLeader2.AddTopicPartition("my_topic", 0, leader2.BrokerID(), nil, nil, ErrNoError)
- leader1.Returns(metadataLeader2)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader2.Returns(prodSuccess)
- expectResults(t, producer, 10, 0)
- leader1.Close()
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- leader2.Returns(prodSuccess)
- expectResults(t, producer, 10, 0)
-
- leader2.Close()
- closeProducer(t, producer)
-}
-
-func TestAsyncProducerEncoderFailures(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
- leader.Returns(prodSuccess)
- leader.Returns(prodSuccess)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 1
- config.Producer.Return.Successes = true
- config.Producer.Partitioner = NewManualPartitioner
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for flush := 0; flush < 3; flush++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: flakyEncoder(true), Value: flakyEncoder(false)}
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: flakyEncoder(false), Value: flakyEncoder(true)}
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: flakyEncoder(true), Value: flakyEncoder(true)}
- expectResults(t, producer, 1, 2)
- }
-
- closeProducer(t, producer)
- leader.Close()
- seedBroker.Close()
-}
-
-// If a Kafka broker becomes unavailable and then returns back in service, then
-// producer reconnects to it and continues sending messages.
-func TestAsyncProducerBrokerBounce(t *testing.T) {
- // Given
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
- leaderAddr := leader.Addr()
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leaderAddr, leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 1
- config.Producer.Return.Successes = true
- config.Producer.Retry.Backoff = 0
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- leader.Returns(prodSuccess)
- expectResults(t, producer, 1, 0)
-
- // When: a broker connection gets reset by a broker (network glitch, restart, you name it).
- leader.Close() // producer should get EOF
- leader = NewMockBrokerAddr(t, 2, leaderAddr) // start it up again right away for giggles
- seedBroker.Returns(metadataResponse) // tell it to go to broker 2 again
-
- // Then: a produced message goes through the new broker connection.
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- leader.Returns(prodSuccess)
- expectResults(t, producer, 1, 0)
-
- closeProducer(t, producer)
- seedBroker.Close()
- leader.Close()
-}
-
-func TestAsyncProducerBrokerBounceWithStaleMetadata(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader1 := NewMockBroker(t, 2)
- leader2 := NewMockBroker(t, 3)
-
- metadataLeader1 := new(MetadataResponse)
- metadataLeader1.AddBroker(leader1.Addr(), leader1.BrokerID())
- metadataLeader1.AddTopicPartition("my_topic", 0, leader1.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataLeader1)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 10
- config.Producer.Return.Successes = true
- config.Producer.Retry.Max = 3
- config.Producer.Retry.Backoff = 0
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- leader1.Close() // producer should get EOF
- seedBroker.Returns(metadataLeader1) // tell it to go to leader1 again even though it's still down
- seedBroker.Returns(metadataLeader1) // tell it to go to leader1 again even though it's still down
-
- // ok fine, tell it to go to leader2 finally
- metadataLeader2 := new(MetadataResponse)
- metadataLeader2.AddBroker(leader2.Addr(), leader2.BrokerID())
- metadataLeader2.AddTopicPartition("my_topic", 0, leader2.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataLeader2)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader2.Returns(prodSuccess)
- expectResults(t, producer, 10, 0)
- seedBroker.Close()
- leader2.Close()
-
- closeProducer(t, producer)
-}
-
-func TestAsyncProducerMultipleRetries(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader1 := NewMockBroker(t, 2)
- leader2 := NewMockBroker(t, 3)
-
- metadataLeader1 := new(MetadataResponse)
- metadataLeader1.AddBroker(leader1.Addr(), leader1.BrokerID())
- metadataLeader1.AddTopicPartition("my_topic", 0, leader1.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataLeader1)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 10
- config.Producer.Return.Successes = true
- config.Producer.Retry.Max = 4
- config.Producer.Retry.Backoff = 0
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- prodNotLeader := new(ProduceResponse)
- prodNotLeader.AddTopicPartition("my_topic", 0, ErrNotLeaderForPartition)
- leader1.Returns(prodNotLeader)
-
- metadataLeader2 := new(MetadataResponse)
- metadataLeader2.AddBroker(leader2.Addr(), leader2.BrokerID())
- metadataLeader2.AddTopicPartition("my_topic", 0, leader2.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataLeader2)
- leader2.Returns(prodNotLeader)
- seedBroker.Returns(metadataLeader1)
- leader1.Returns(prodNotLeader)
- seedBroker.Returns(metadataLeader1)
- leader1.Returns(prodNotLeader)
- seedBroker.Returns(metadataLeader2)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader2.Returns(prodSuccess)
- expectResults(t, producer, 10, 0)
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- leader2.Returns(prodSuccess)
- expectResults(t, producer, 10, 0)
-
- seedBroker.Close()
- leader1.Close()
- leader2.Close()
- closeProducer(t, producer)
-}
-
-func TestAsyncProducerOutOfRetries(t *testing.T) {
- t.Skip("Enable once bug #294 is fixed.")
-
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 10
- config.Producer.Return.Successes = true
- config.Producer.Retry.Backoff = 0
- config.Producer.Retry.Max = 0
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
-
- prodNotLeader := new(ProduceResponse)
- prodNotLeader.AddTopicPartition("my_topic", 0, ErrNotLeaderForPartition)
- leader.Returns(prodNotLeader)
-
- for i := 0; i < 10; i++ {
- select {
- case msg := <-producer.Errors():
- if msg.Err != ErrNotLeaderForPartition {
- t.Error(msg.Err)
- }
- case <-producer.Successes():
- t.Error("Unexpected success")
- }
- }
-
- seedBroker.Returns(metadataResponse)
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
-
- expectResults(t, producer, 10, 0)
-
- leader.Close()
- seedBroker.Close()
- safeClose(t, producer)
-}
-
-func TestAsyncProducerRetryWithReferenceOpen(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
- leaderAddr := leader.Addr()
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leaderAddr, leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- metadataResponse.AddTopicPartition("my_topic", 1, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- config := NewConfig()
- config.Producer.Return.Successes = true
- config.Producer.Retry.Backoff = 0
- config.Producer.Retry.Max = 1
- config.Producer.Partitioner = NewRoundRobinPartitioner
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- // prime partition 0
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
- expectResults(t, producer, 1, 0)
-
- // prime partition 1
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- prodSuccess = new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 1, ErrNoError)
- leader.Returns(prodSuccess)
- expectResults(t, producer, 1, 0)
-
- // reboot the broker (the producer will get EOF on its existing connection)
- leader.Close()
- leader = NewMockBrokerAddr(t, 2, leaderAddr)
-
- // send another message on partition 0 to trigger the EOF and retry
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
-
- // tell partition 0 to go to that broker again
- seedBroker.Returns(metadataResponse)
-
- // succeed this time
- prodSuccess = new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
- expectResults(t, producer, 1, 0)
-
- // shutdown
- closeProducer(t, producer)
- seedBroker.Close()
- leader.Close()
-}
-
-func TestAsyncProducerFlusherRetryCondition(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- metadataResponse.AddTopicPartition("my_topic", 1, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 5
- config.Producer.Return.Successes = true
- config.Producer.Retry.Backoff = 0
- config.Producer.Retry.Max = 1
- config.Producer.Partitioner = NewManualPartitioner
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- // prime partitions
- for p := int32(0); p < 2; p++ {
- for i := 0; i < 5; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage), Partition: p}
- }
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", p, ErrNoError)
- leader.Returns(prodSuccess)
- expectResults(t, producer, 5, 0)
- }
-
- // send more messages on partition 0
- for i := 0; i < 5; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage), Partition: 0}
- }
- prodNotLeader := new(ProduceResponse)
- prodNotLeader.AddTopicPartition("my_topic", 0, ErrNotLeaderForPartition)
- leader.Returns(prodNotLeader)
-
- time.Sleep(50 * time.Millisecond)
-
- leader.SetHandlerByMap(map[string]MockResponse{
- "ProduceRequest": NewMockProduceResponse(t).
- SetError("my_topic", 0, ErrNoError),
- })
-
- // tell partition 0 to go to that broker again
- seedBroker.Returns(metadataResponse)
-
- // succeed this time
- expectResults(t, producer, 5, 0)
-
- // put five more through
- for i := 0; i < 5; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage), Partition: 0}
- }
- expectResults(t, producer, 5, 0)
-
- // shutdown
- closeProducer(t, producer)
- seedBroker.Close()
- leader.Close()
-}
-
-func TestAsyncProducerRetryShutdown(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataLeader := new(MetadataResponse)
- metadataLeader.AddBroker(leader.Addr(), leader.BrokerID())
- metadataLeader.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataLeader)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 10
- config.Producer.Return.Successes = true
- config.Producer.Retry.Backoff = 0
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
- producer.AsyncClose()
- time.Sleep(5 * time.Millisecond) // let the shutdown goroutine kick in
-
- producer.Input() <- &ProducerMessage{Topic: "FOO"}
- if err := <-producer.Errors(); err.Err != ErrShuttingDown {
- t.Error(err)
- }
-
- prodNotLeader := new(ProduceResponse)
- prodNotLeader.AddTopicPartition("my_topic", 0, ErrNotLeaderForPartition)
- leader.Returns(prodNotLeader)
-
- seedBroker.Returns(metadataLeader)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
- expectResults(t, producer, 10, 0)
-
- seedBroker.Close()
- leader.Close()
-
- // wait for the async-closed producer to shut down fully
- for err := range producer.Errors() {
- t.Error(err)
- }
-}
-
-func TestAsyncProducerNoReturns(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataLeader := new(MetadataResponse)
- metadataLeader.AddBroker(leader.Addr(), leader.BrokerID())
- metadataLeader.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataLeader)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 10
- config.Producer.Return.Successes = false
- config.Producer.Return.Errors = false
- config.Producer.Retry.Backoff = 0
- producer, err := NewAsyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder(TestMessage)}
- }
-
- wait := make(chan bool)
- go func() {
- if err := producer.Close(); err != nil {
- t.Error(err)
- }
- close(wait)
- }()
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
-
- <-wait
- seedBroker.Close()
- leader.Close()
-}
-
-// This example shows how to use the producer while simultaneously
-// reading the Errors channel to know about any failures.
-func ExampleAsyncProducer_select() {
- producer, err := NewAsyncProducer([]string{"localhost:9092"}, nil)
- if err != nil {
- panic(err)
- }
-
- defer func() {
- if err := producer.Close(); err != nil {
- log.Fatalln(err)
- }
- }()
-
- // Trap SIGINT to trigger a shutdown.
- signals := make(chan os.Signal, 1)
- signal.Notify(signals, os.Interrupt)
-
- var enqueued, errors int
-ProducerLoop:
- for {
- select {
- case producer.Input() <- &ProducerMessage{Topic: "my_topic", Key: nil, Value: StringEncoder("testing 123")}:
- enqueued++
- case err := <-producer.Errors():
- log.Println("Failed to produce message", err)
- errors++
- case <-signals:
- break ProducerLoop
- }
- }
-
- log.Printf("Enqueued: %d; errors: %d\n", enqueued, errors)
-}
-
-// This example shows how to use the producer with separate goroutines
-// reading from the Successes and Errors channels. Note that in order
-// for the Successes channel to be populated, you have to set
-// config.Producer.Return.Successes to true.
-func ExampleAsyncProducer_goroutines() {
- config := NewConfig()
- config.Producer.Return.Successes = true
- producer, err := NewAsyncProducer([]string{"localhost:9092"}, config)
- if err != nil {
- panic(err)
- }
-
- // Trap SIGINT to trigger a graceful shutdown.
- signals := make(chan os.Signal, 1)
- signal.Notify(signals, os.Interrupt)
-
- var (
- wg sync.WaitGroup
- enqueued, successes, errors int
- )
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- for _ = range producer.Successes() {
- successes++
- }
- }()
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- for err := range producer.Errors() {
- log.Println(err)
- errors++
- }
- }()
-
-ProducerLoop:
- for {
- message := &ProducerMessage{Topic: "my_topic", Value: StringEncoder("testing 123")}
- select {
- case producer.Input() <- message:
- enqueued++
-
- case <-signals:
- producer.AsyncClose() // Trigger a shutdown of the producer.
- break ProducerLoop
- }
- }
-
- wg.Wait()
-
- log.Printf("Successfully produced: %d; errors: %d\n", successes, errors)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/broker.go b/vendor/src/github.com/Shopify/sarama/broker.go
deleted file mode 100644
index 89beecc86..000000000
--- a/vendor/src/github.com/Shopify/sarama/broker.go
+++ /dev/null
@@ -1,674 +0,0 @@
-package sarama
-
-import (
- "crypto/tls"
- "encoding/binary"
- "fmt"
- "io"
- "net"
- "strconv"
- "sync"
- "sync/atomic"
- "time"
-
- "github.com/rcrowley/go-metrics"
-)
-
-// Broker represents a single Kafka broker connection. All operations on this object are entirely concurrency-safe.
-type Broker struct {
- id int32
- addr string
-
- conf *Config
- correlationID int32
- conn net.Conn
- connErr error
- lock sync.Mutex
- opened int32
-
- responses chan responsePromise
- done chan bool
-
- incomingByteRate metrics.Meter
- requestRate metrics.Meter
- requestSize metrics.Histogram
- requestLatency metrics.Histogram
- outgoingByteRate metrics.Meter
- responseRate metrics.Meter
- responseSize metrics.Histogram
- brokerIncomingByteRate metrics.Meter
- brokerRequestRate metrics.Meter
- brokerRequestSize metrics.Histogram
- brokerRequestLatency metrics.Histogram
- brokerOutgoingByteRate metrics.Meter
- brokerResponseRate metrics.Meter
- brokerResponseSize metrics.Histogram
-}
-
-type responsePromise struct {
- requestTime time.Time
- correlationID int32
- packets chan []byte
- errors chan error
-}
-
-// NewBroker creates and returns a Broker targetting the given host:port address.
-// This does not attempt to actually connect, you have to call Open() for that.
-func NewBroker(addr string) *Broker {
- return &Broker{id: -1, addr: addr}
-}
-
-// Open tries to connect to the Broker if it is not already connected or connecting, but does not block
-// waiting for the connection to complete. This means that any subsequent operations on the broker will
-// block waiting for the connection to succeed or fail. To get the effect of a fully synchronous Open call,
-// follow it by a call to Connected(). The only errors Open will return directly are ConfigurationError or
-// AlreadyConnected. If conf is nil, the result of NewConfig() is used.
-func (b *Broker) Open(conf *Config) error {
- if !atomic.CompareAndSwapInt32(&b.opened, 0, 1) {
- return ErrAlreadyConnected
- }
-
- if conf == nil {
- conf = NewConfig()
- }
-
- err := conf.Validate()
- if err != nil {
- return err
- }
-
- b.lock.Lock()
-
- go withRecover(func() {
- defer b.lock.Unlock()
-
- dialer := net.Dialer{
- Timeout: conf.Net.DialTimeout,
- KeepAlive: conf.Net.KeepAlive,
- }
-
- if conf.Net.TLS.Enable {
- b.conn, b.connErr = tls.DialWithDialer(&dialer, "tcp", b.addr, conf.Net.TLS.Config)
- } else {
- b.conn, b.connErr = dialer.Dial("tcp", b.addr)
- }
- if b.connErr != nil {
- Logger.Printf("Failed to connect to broker %s: %s\n", b.addr, b.connErr)
- b.conn = nil
- atomic.StoreInt32(&b.opened, 0)
- return
- }
- b.conn = newBufConn(b.conn)
-
- b.conf = conf
-
- // Create or reuse the global metrics shared between brokers
- b.incomingByteRate = metrics.GetOrRegisterMeter("incoming-byte-rate", conf.MetricRegistry)
- b.requestRate = metrics.GetOrRegisterMeter("request-rate", conf.MetricRegistry)
- b.requestSize = getOrRegisterHistogram("request-size", conf.MetricRegistry)
- b.requestLatency = getOrRegisterHistogram("request-latency-in-ms", conf.MetricRegistry)
- b.outgoingByteRate = metrics.GetOrRegisterMeter("outgoing-byte-rate", conf.MetricRegistry)
- b.responseRate = metrics.GetOrRegisterMeter("response-rate", conf.MetricRegistry)
- b.responseSize = getOrRegisterHistogram("response-size", conf.MetricRegistry)
- // Do not gather metrics for seeded broker (only used during bootstrap) because they share
- // the same id (-1) and are already exposed through the global metrics above
- if b.id >= 0 {
- b.brokerIncomingByteRate = getOrRegisterBrokerMeter("incoming-byte-rate", b, conf.MetricRegistry)
- b.brokerRequestRate = getOrRegisterBrokerMeter("request-rate", b, conf.MetricRegistry)
- b.brokerRequestSize = getOrRegisterBrokerHistogram("request-size", b, conf.MetricRegistry)
- b.brokerRequestLatency = getOrRegisterBrokerHistogram("request-latency-in-ms", b, conf.MetricRegistry)
- b.brokerOutgoingByteRate = getOrRegisterBrokerMeter("outgoing-byte-rate", b, conf.MetricRegistry)
- b.brokerResponseRate = getOrRegisterBrokerMeter("response-rate", b, conf.MetricRegistry)
- b.brokerResponseSize = getOrRegisterBrokerHistogram("response-size", b, conf.MetricRegistry)
- }
-
- if conf.Net.SASL.Enable {
- b.connErr = b.sendAndReceiveSASLPlainAuth()
- if b.connErr != nil {
- err = b.conn.Close()
- if err == nil {
- Logger.Printf("Closed connection to broker %s\n", b.addr)
- } else {
- Logger.Printf("Error while closing connection to broker %s: %s\n", b.addr, err)
- }
- b.conn = nil
- atomic.StoreInt32(&b.opened, 0)
- return
- }
- }
-
- b.done = make(chan bool)
- b.responses = make(chan responsePromise, b.conf.Net.MaxOpenRequests-1)
-
- if b.id >= 0 {
- Logger.Printf("Connected to broker at %s (registered as #%d)\n", b.addr, b.id)
- } else {
- Logger.Printf("Connected to broker at %s (unregistered)\n", b.addr)
- }
- go withRecover(b.responseReceiver)
- })
-
- return nil
-}
-
-// Connected returns true if the broker is connected and false otherwise. If the broker is not
-// connected but it had tried to connect, the error from that connection attempt is also returned.
-func (b *Broker) Connected() (bool, error) {
- b.lock.Lock()
- defer b.lock.Unlock()
-
- return b.conn != nil, b.connErr
-}
-
-func (b *Broker) Close() error {
- b.lock.Lock()
- defer b.lock.Unlock()
-
- if b.conn == nil {
- return ErrNotConnected
- }
-
- close(b.responses)
- <-b.done
-
- err := b.conn.Close()
-
- b.conn = nil
- b.connErr = nil
- b.done = nil
- b.responses = nil
-
- if err == nil {
- Logger.Printf("Closed connection to broker %s\n", b.addr)
- } else {
- Logger.Printf("Error while closing connection to broker %s: %s\n", b.addr, err)
- }
-
- atomic.StoreInt32(&b.opened, 0)
-
- return err
-}
-
-// ID returns the broker ID retrieved from Kafka's metadata, or -1 if that is not known.
-func (b *Broker) ID() int32 {
- return b.id
-}
-
-// Addr returns the broker address as either retrieved from Kafka's metadata or passed to NewBroker.
-func (b *Broker) Addr() string {
- return b.addr
-}
-
-func (b *Broker) GetMetadata(request *MetadataRequest) (*MetadataResponse, error) {
- response := new(MetadataResponse)
-
- err := b.sendAndReceive(request, response)
-
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) GetConsumerMetadata(request *ConsumerMetadataRequest) (*ConsumerMetadataResponse, error) {
- response := new(ConsumerMetadataResponse)
-
- err := b.sendAndReceive(request, response)
-
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) GetAvailableOffsets(request *OffsetRequest) (*OffsetResponse, error) {
- response := new(OffsetResponse)
-
- err := b.sendAndReceive(request, response)
-
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) Produce(request *ProduceRequest) (*ProduceResponse, error) {
- var response *ProduceResponse
- var err error
-
- if request.RequiredAcks == NoResponse {
- err = b.sendAndReceive(request, nil)
- } else {
- response = new(ProduceResponse)
- err = b.sendAndReceive(request, response)
- }
-
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) Fetch(request *FetchRequest) (*FetchResponse, error) {
- response := new(FetchResponse)
-
- err := b.sendAndReceive(request, response)
-
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) CommitOffset(request *OffsetCommitRequest) (*OffsetCommitResponse, error) {
- response := new(OffsetCommitResponse)
-
- err := b.sendAndReceive(request, response)
-
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) FetchOffset(request *OffsetFetchRequest) (*OffsetFetchResponse, error) {
- response := new(OffsetFetchResponse)
-
- err := b.sendAndReceive(request, response)
-
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) JoinGroup(request *JoinGroupRequest) (*JoinGroupResponse, error) {
- response := new(JoinGroupResponse)
-
- err := b.sendAndReceive(request, response)
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) SyncGroup(request *SyncGroupRequest) (*SyncGroupResponse, error) {
- response := new(SyncGroupResponse)
-
- err := b.sendAndReceive(request, response)
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) LeaveGroup(request *LeaveGroupRequest) (*LeaveGroupResponse, error) {
- response := new(LeaveGroupResponse)
-
- err := b.sendAndReceive(request, response)
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) Heartbeat(request *HeartbeatRequest) (*HeartbeatResponse, error) {
- response := new(HeartbeatResponse)
-
- err := b.sendAndReceive(request, response)
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) ListGroups(request *ListGroupsRequest) (*ListGroupsResponse, error) {
- response := new(ListGroupsResponse)
-
- err := b.sendAndReceive(request, response)
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) DescribeGroups(request *DescribeGroupsRequest) (*DescribeGroupsResponse, error) {
- response := new(DescribeGroupsResponse)
-
- err := b.sendAndReceive(request, response)
- if err != nil {
- return nil, err
- }
-
- return response, nil
-}
-
-func (b *Broker) send(rb protocolBody, promiseResponse bool) (*responsePromise, error) {
- b.lock.Lock()
- defer b.lock.Unlock()
-
- if b.conn == nil {
- if b.connErr != nil {
- return nil, b.connErr
- }
- return nil, ErrNotConnected
- }
-
- if !b.conf.Version.IsAtLeast(rb.requiredVersion()) {
- return nil, ErrUnsupportedVersion
- }
-
- req := &request{correlationID: b.correlationID, clientID: b.conf.ClientID, body: rb}
- buf, err := encode(req, b.conf.MetricRegistry)
- if err != nil {
- return nil, err
- }
-
- err = b.conn.SetWriteDeadline(time.Now().Add(b.conf.Net.WriteTimeout))
- if err != nil {
- return nil, err
- }
-
- requestTime := time.Now()
- bytes, err := b.conn.Write(buf)
- b.updateOutgoingCommunicationMetrics(bytes)
- if err != nil {
- return nil, err
- }
- b.correlationID++
-
- if !promiseResponse {
- // Record request latency without the response
- b.updateRequestLatencyMetrics(time.Since(requestTime))
- return nil, nil
- }
-
- promise := responsePromise{requestTime, req.correlationID, make(chan []byte), make(chan error)}
- b.responses <- promise
-
- return &promise, nil
-}
-
-func (b *Broker) sendAndReceive(req protocolBody, res versionedDecoder) error {
- promise, err := b.send(req, res != nil)
-
- if err != nil {
- return err
- }
-
- if promise == nil {
- return nil
- }
-
- select {
- case buf := <-promise.packets:
- return versionedDecode(buf, res, req.version())
- case err = <-promise.errors:
- return err
- }
-}
-
-func (b *Broker) decode(pd packetDecoder) (err error) {
- b.id, err = pd.getInt32()
- if err != nil {
- return err
- }
-
- host, err := pd.getString()
- if err != nil {
- return err
- }
-
- port, err := pd.getInt32()
- if err != nil {
- return err
- }
-
- b.addr = net.JoinHostPort(host, fmt.Sprint(port))
- if _, _, err := net.SplitHostPort(b.addr); err != nil {
- return err
- }
-
- return nil
-}
-
-func (b *Broker) encode(pe packetEncoder) (err error) {
-
- host, portstr, err := net.SplitHostPort(b.addr)
- if err != nil {
- return err
- }
- port, err := strconv.Atoi(portstr)
- if err != nil {
- return err
- }
-
- pe.putInt32(b.id)
-
- err = pe.putString(host)
- if err != nil {
- return err
- }
-
- pe.putInt32(int32(port))
-
- return nil
-}
-
-func (b *Broker) responseReceiver() {
- var dead error
- header := make([]byte, 8)
- for response := range b.responses {
- if dead != nil {
- response.errors <- dead
- continue
- }
-
- err := b.conn.SetReadDeadline(time.Now().Add(b.conf.Net.ReadTimeout))
- if err != nil {
- dead = err
- response.errors <- err
- continue
- }
-
- bytesReadHeader, err := io.ReadFull(b.conn, header)
- requestLatency := time.Since(response.requestTime)
- if err != nil {
- b.updateIncomingCommunicationMetrics(bytesReadHeader, requestLatency)
- dead = err
- response.errors <- err
- continue
- }
-
- decodedHeader := responseHeader{}
- err = decode(header, &decodedHeader)
- if err != nil {
- b.updateIncomingCommunicationMetrics(bytesReadHeader, requestLatency)
- dead = err
- response.errors <- err
- continue
- }
- if decodedHeader.correlationID != response.correlationID {
- b.updateIncomingCommunicationMetrics(bytesReadHeader, requestLatency)
- // TODO if decoded ID < cur ID, discard until we catch up
- // TODO if decoded ID > cur ID, save it so when cur ID catches up we have a response
- dead = PacketDecodingError{fmt.Sprintf("correlation ID didn't match, wanted %d, got %d", response.correlationID, decodedHeader.correlationID)}
- response.errors <- dead
- continue
- }
-
- buf := make([]byte, decodedHeader.length-4)
- bytesReadBody, err := io.ReadFull(b.conn, buf)
- b.updateIncomingCommunicationMetrics(bytesReadHeader+bytesReadBody, requestLatency)
- if err != nil {
- dead = err
- response.errors <- err
- continue
- }
-
- response.packets <- buf
- }
- close(b.done)
-}
-
-func (b *Broker) sendAndReceiveSASLPlainHandshake() error {
- rb := &SaslHandshakeRequest{"PLAIN"}
- req := &request{correlationID: b.correlationID, clientID: b.conf.ClientID, body: rb}
- buf, err := encode(req, b.conf.MetricRegistry)
- if err != nil {
- return err
- }
-
- err = b.conn.SetWriteDeadline(time.Now().Add(b.conf.Net.WriteTimeout))
- if err != nil {
- return err
- }
-
- requestTime := time.Now()
- bytes, err := b.conn.Write(buf)
- b.updateOutgoingCommunicationMetrics(bytes)
- if err != nil {
- Logger.Printf("Failed to send SASL handshake %s: %s\n", b.addr, err.Error())
- return err
- }
- b.correlationID++
- //wait for the response
- header := make([]byte, 8) // response header
- _, err = io.ReadFull(b.conn, header)
- if err != nil {
- Logger.Printf("Failed to read SASL handshake header : %s\n", err.Error())
- return err
- }
- length := binary.BigEndian.Uint32(header[:4])
- payload := make([]byte, length-4)
- n, err := io.ReadFull(b.conn, payload)
- if err != nil {
- Logger.Printf("Failed to read SASL handshake payload : %s\n", err.Error())
- return err
- }
- b.updateIncomingCommunicationMetrics(n+8, time.Since(requestTime))
- res := &SaslHandshakeResponse{}
- err = versionedDecode(payload, res, 0)
- if err != nil {
- Logger.Printf("Failed to parse SASL handshake : %s\n", err.Error())
- return err
- }
- if res.Err != ErrNoError {
- Logger.Printf("Invalid SASL Mechanism : %s\n", res.Err.Error())
- return res.Err
- }
- Logger.Print("Successful SASL handshake")
- return nil
-}
-
-// Kafka 0.10.0 plans to support SASL Plain and Kerberos as per PR #812 (KIP-43)/(JIRA KAFKA-3149)
-// Some hosted kafka services such as IBM Message Hub already offer SASL/PLAIN auth with Kafka 0.9
-//
-// In SASL Plain, Kafka expects the auth header to be in the following format
-// Message format (from https://tools.ietf.org/html/rfc4616):
-//
-// message = [authzid] UTF8NUL authcid UTF8NUL passwd
-// authcid = 1*SAFE ; MUST accept up to 255 octets
-// authzid = 1*SAFE ; MUST accept up to 255 octets
-// passwd = 1*SAFE ; MUST accept up to 255 octets
-// UTF8NUL = %x00 ; UTF-8 encoded NUL character
-//
-// SAFE = UTF1 / UTF2 / UTF3 / UTF4
-// ;; any UTF-8 encoded Unicode character except NUL
-//
-// When credentials are valid, Kafka returns a 4 byte array of null characters.
-// When credentials are invalid, Kafka closes the connection. This does not seem to be the ideal way
-// of responding to bad credentials but thats how its being done today.
-func (b *Broker) sendAndReceiveSASLPlainAuth() error {
- if b.conf.Net.SASL.Handshake {
- handshakeErr := b.sendAndReceiveSASLPlainHandshake()
- if handshakeErr != nil {
- Logger.Printf("Error while performing SASL handshake %s\n", b.addr)
- return handshakeErr
- }
- }
- length := 1 + len(b.conf.Net.SASL.User) + 1 + len(b.conf.Net.SASL.Password)
- authBytes := make([]byte, length+4) //4 byte length header + auth data
- binary.BigEndian.PutUint32(authBytes, uint32(length))
- copy(authBytes[4:], []byte("\x00"+b.conf.Net.SASL.User+"\x00"+b.conf.Net.SASL.Password))
-
- err := b.conn.SetWriteDeadline(time.Now().Add(b.conf.Net.WriteTimeout))
- if err != nil {
- Logger.Printf("Failed to set write deadline when doing SASL auth with broker %s: %s\n", b.addr, err.Error())
- return err
- }
-
- requestTime := time.Now()
- bytesWritten, err := b.conn.Write(authBytes)
- b.updateOutgoingCommunicationMetrics(bytesWritten)
- if err != nil {
- Logger.Printf("Failed to write SASL auth header to broker %s: %s\n", b.addr, err.Error())
- return err
- }
-
- header := make([]byte, 4)
- n, err := io.ReadFull(b.conn, header)
- b.updateIncomingCommunicationMetrics(n, time.Since(requestTime))
- // If the credentials are valid, we would get a 4 byte response filled with null characters.
- // Otherwise, the broker closes the connection and we get an EOF
- if err != nil {
- Logger.Printf("Failed to read response while authenticating with SASL to broker %s: %s\n", b.addr, err.Error())
- return err
- }
-
- Logger.Printf("SASL authentication successful with broker %s:%v - %v\n", b.addr, n, header)
- return nil
-}
-
-func (b *Broker) updateIncomingCommunicationMetrics(bytes int, requestLatency time.Duration) {
- b.updateRequestLatencyMetrics(requestLatency)
- b.responseRate.Mark(1)
- if b.brokerResponseRate != nil {
- b.brokerResponseRate.Mark(1)
- }
- responseSize := int64(bytes)
- b.incomingByteRate.Mark(responseSize)
- if b.brokerIncomingByteRate != nil {
- b.brokerIncomingByteRate.Mark(responseSize)
- }
- b.responseSize.Update(responseSize)
- if b.brokerResponseSize != nil {
- b.brokerResponseSize.Update(responseSize)
- }
-}
-
-func (b *Broker) updateRequestLatencyMetrics(requestLatency time.Duration) {
- requestLatencyInMs := int64(requestLatency / time.Millisecond)
- b.requestLatency.Update(requestLatencyInMs)
- if b.brokerRequestLatency != nil {
- b.brokerRequestLatency.Update(requestLatencyInMs)
- }
-}
-
-func (b *Broker) updateOutgoingCommunicationMetrics(bytes int) {
- b.requestRate.Mark(1)
- if b.brokerRequestRate != nil {
- b.brokerRequestRate.Mark(1)
- }
- requestSize := int64(bytes)
- b.outgoingByteRate.Mark(requestSize)
- if b.brokerOutgoingByteRate != nil {
- b.brokerOutgoingByteRate.Mark(requestSize)
- }
- b.requestSize.Update(requestSize)
- if b.brokerRequestSize != nil {
- b.brokerRequestSize.Update(requestSize)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/broker_test.go b/vendor/src/github.com/Shopify/sarama/broker_test.go
deleted file mode 100644
index 5adb46f10..000000000
--- a/vendor/src/github.com/Shopify/sarama/broker_test.go
+++ /dev/null
@@ -1,315 +0,0 @@
-package sarama
-
-import (
- "fmt"
- "testing"
- "time"
-)
-
-func ExampleBroker() {
- broker := NewBroker("localhost:9092")
- err := broker.Open(nil)
- if err != nil {
- panic(err)
- }
-
- request := MetadataRequest{Topics: []string{"myTopic"}}
- response, err := broker.GetMetadata(&request)
- if err != nil {
- _ = broker.Close()
- panic(err)
- }
-
- fmt.Println("There are", len(response.Topics), "topics active in the cluster.")
-
- if err = broker.Close(); err != nil {
- panic(err)
- }
-}
-
-type mockEncoder struct {
- bytes []byte
-}
-
-func (m mockEncoder) encode(pe packetEncoder) error {
- return pe.putRawBytes(m.bytes)
-}
-
-type brokerMetrics struct {
- bytesRead int
- bytesWritten int
-}
-
-func TestBrokerAccessors(t *testing.T) {
- broker := NewBroker("abc:123")
-
- if broker.ID() != -1 {
- t.Error("New broker didn't have an ID of -1.")
- }
-
- if broker.Addr() != "abc:123" {
- t.Error("New broker didn't have the correct address")
- }
-
- broker.id = 34
- if broker.ID() != 34 {
- t.Error("Manually setting broker ID did not take effect.")
- }
-}
-
-func TestSimpleBrokerCommunication(t *testing.T) {
- for _, tt := range brokerTestTable {
- Logger.Printf("Testing broker communication for %s", tt.name)
- mb := NewMockBroker(t, 0)
- mb.Returns(&mockEncoder{tt.response})
- pendingNotify := make(chan brokerMetrics)
- // Register a callback to be notified about successful requests
- mb.SetNotifier(func(bytesRead, bytesWritten int) {
- pendingNotify <- brokerMetrics{bytesRead, bytesWritten}
- })
- broker := NewBroker(mb.Addr())
- // Set the broker id in order to validate local broker metrics
- broker.id = 0
- conf := NewConfig()
- conf.Version = V0_10_0_0
- err := broker.Open(conf)
- if err != nil {
- t.Fatal(err)
- }
- tt.runner(t, broker)
- err = broker.Close()
- if err != nil {
- t.Error(err)
- }
- // Wait up to 500 ms for the remote broker to process the request and
- // notify us about the metrics
- timeout := 500 * time.Millisecond
- select {
- case mockBrokerMetrics := <-pendingNotify:
- validateBrokerMetrics(t, broker, mockBrokerMetrics)
- case <-time.After(timeout):
- t.Errorf("No request received for: %s after waiting for %v", tt.name, timeout)
- }
- mb.Close()
- }
-
-}
-
-// We're not testing encoding/decoding here, so most of the requests/responses will be empty for simplicity's sake
-var brokerTestTable = []struct {
- name string
- response []byte
- runner func(*testing.T, *Broker)
-}{
- {"MetadataRequest",
- []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := MetadataRequest{}
- response, err := broker.GetMetadata(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("Metadata request got no response!")
- }
- }},
-
- {"ConsumerMetadataRequest",
- []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 't', 0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := ConsumerMetadataRequest{}
- response, err := broker.GetConsumerMetadata(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("Consumer Metadata request got no response!")
- }
- }},
-
- {"ProduceRequest (NoResponse)",
- []byte{},
- func(t *testing.T, broker *Broker) {
- request := ProduceRequest{}
- request.RequiredAcks = NoResponse
- response, err := broker.Produce(&request)
- if err != nil {
- t.Error(err)
- }
- if response != nil {
- t.Error("Produce request with NoResponse got a response!")
- }
- }},
-
- {"ProduceRequest (WaitForLocal)",
- []byte{0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := ProduceRequest{}
- request.RequiredAcks = WaitForLocal
- response, err := broker.Produce(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("Produce request without NoResponse got no response!")
- }
- }},
-
- {"FetchRequest",
- []byte{0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := FetchRequest{}
- response, err := broker.Fetch(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("Fetch request got no response!")
- }
- }},
-
- {"OffsetFetchRequest",
- []byte{0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := OffsetFetchRequest{}
- response, err := broker.FetchOffset(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("OffsetFetch request got no response!")
- }
- }},
-
- {"OffsetCommitRequest",
- []byte{0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := OffsetCommitRequest{}
- response, err := broker.CommitOffset(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("OffsetCommit request got no response!")
- }
- }},
-
- {"OffsetRequest",
- []byte{0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := OffsetRequest{}
- response, err := broker.GetAvailableOffsets(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("Offset request got no response!")
- }
- }},
-
- {"JoinGroupRequest",
- []byte{0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := JoinGroupRequest{}
- response, err := broker.JoinGroup(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("JoinGroup request got no response!")
- }
- }},
-
- {"SyncGroupRequest",
- []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := SyncGroupRequest{}
- response, err := broker.SyncGroup(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("SyncGroup request got no response!")
- }
- }},
-
- {"LeaveGroupRequest",
- []byte{0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := LeaveGroupRequest{}
- response, err := broker.LeaveGroup(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("LeaveGroup request got no response!")
- }
- }},
-
- {"HeartbeatRequest",
- []byte{0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := HeartbeatRequest{}
- response, err := broker.Heartbeat(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("Heartbeat request got no response!")
- }
- }},
-
- {"ListGroupsRequest",
- []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := ListGroupsRequest{}
- response, err := broker.ListGroups(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("ListGroups request got no response!")
- }
- }},
-
- {"DescribeGroupsRequest",
- []byte{0x00, 0x00, 0x00, 0x00},
- func(t *testing.T, broker *Broker) {
- request := DescribeGroupsRequest{}
- response, err := broker.DescribeGroups(&request)
- if err != nil {
- t.Error(err)
- }
- if response == nil {
- t.Error("DescribeGroups request got no response!")
- }
- }},
-}
-
-func validateBrokerMetrics(t *testing.T, broker *Broker, mockBrokerMetrics brokerMetrics) {
- metricValidators := newMetricValidators()
- mockBrokerBytesRead := mockBrokerMetrics.bytesRead
- mockBrokerBytesWritten := mockBrokerMetrics.bytesWritten
-
- // Check that the number of bytes sent corresponds to what the mock broker received
- metricValidators.registerForAllBrokers(broker, countMeterValidator("incoming-byte-rate", mockBrokerBytesWritten))
- if mockBrokerBytesWritten == 0 {
- // This a ProduceRequest with NoResponse
- metricValidators.registerForAllBrokers(broker, countMeterValidator("response-rate", 0))
- metricValidators.registerForAllBrokers(broker, countHistogramValidator("response-size", 0))
- metricValidators.registerForAllBrokers(broker, minMaxHistogramValidator("response-size", 0, 0))
- } else {
- metricValidators.registerForAllBrokers(broker, countMeterValidator("response-rate", 1))
- metricValidators.registerForAllBrokers(broker, countHistogramValidator("response-size", 1))
- metricValidators.registerForAllBrokers(broker, minMaxHistogramValidator("response-size", mockBrokerBytesWritten, mockBrokerBytesWritten))
- }
-
- // Check that the number of bytes received corresponds to what the mock broker sent
- metricValidators.registerForAllBrokers(broker, countMeterValidator("outgoing-byte-rate", mockBrokerBytesRead))
- metricValidators.registerForAllBrokers(broker, countMeterValidator("request-rate", 1))
- metricValidators.registerForAllBrokers(broker, countHistogramValidator("request-size", 1))
- metricValidators.registerForAllBrokers(broker, minMaxHistogramValidator("request-size", mockBrokerBytesRead, mockBrokerBytesRead))
-
- // Run the validators
- metricValidators.run(t, broker.conf.MetricRegistry)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/client.go b/vendor/src/github.com/Shopify/sarama/client.go
deleted file mode 100644
index 28592c750..000000000
--- a/vendor/src/github.com/Shopify/sarama/client.go
+++ /dev/null
@@ -1,749 +0,0 @@
-package sarama
-
-import (
- "math/rand"
- "sort"
- "sync"
- "time"
-)
-
-// Client is a generic Kafka client. It manages connections to one or more Kafka brokers.
-// You MUST call Close() on a client to avoid leaks, it will not be garbage-collected
-// automatically when it passes out of scope. It is safe to share a client amongst many
-// users, however Kafka will process requests from a single client strictly in serial,
-// so it is generally more efficient to use the default one client per producer/consumer.
-type Client interface {
- // Config returns the Config struct of the client. This struct should not be
- // altered after it has been created.
- Config() *Config
-
- // Brokers returns the current set of active brokers as retrieved from cluster metadata.
- Brokers() []*Broker
-
- // Topics returns the set of available topics as retrieved from cluster metadata.
- Topics() ([]string, error)
-
- // Partitions returns the sorted list of all partition IDs for the given topic.
- Partitions(topic string) ([]int32, error)
-
- // WritablePartitions returns the sorted list of all writable partition IDs for
- // the given topic, where "writable" means "having a valid leader accepting
- // writes".
- WritablePartitions(topic string) ([]int32, error)
-
- // Leader returns the broker object that is the leader of the current
- // topic/partition, as determined by querying the cluster metadata.
- Leader(topic string, partitionID int32) (*Broker, error)
-
- // Replicas returns the set of all replica IDs for the given partition.
- Replicas(topic string, partitionID int32) ([]int32, error)
-
- // RefreshMetadata takes a list of topics and queries the cluster to refresh the
- // available metadata for those topics. If no topics are provided, it will refresh
- // metadata for all topics.
- RefreshMetadata(topics ...string) error
-
- // GetOffset queries the cluster to get the most recent available offset at the
- // given time on the topic/partition combination. Time should be OffsetOldest for
- // the earliest available offset, OffsetNewest for the offset of the message that
- // will be produced next, or a time.
- GetOffset(topic string, partitionID int32, time int64) (int64, error)
-
- // Coordinator returns the coordinating broker for a consumer group. It will
- // return a locally cached value if it's available. You can call
- // RefreshCoordinator to update the cached value. This function only works on
- // Kafka 0.8.2 and higher.
- Coordinator(consumerGroup string) (*Broker, error)
-
- // RefreshCoordinator retrieves the coordinator for a consumer group and stores it
- // in local cache. This function only works on Kafka 0.8.2 and higher.
- RefreshCoordinator(consumerGroup string) error
-
- // Close shuts down all broker connections managed by this client. It is required
- // to call this function before a client object passes out of scope, as it will
- // otherwise leak memory. You must close any Producers or Consumers using a client
- // before you close the client.
- Close() error
-
- // Closed returns true if the client has already had Close called on it
- Closed() bool
-}
-
-const (
- // OffsetNewest stands for the log head offset, i.e. the offset that will be
- // assigned to the next message that will be produced to the partition. You
- // can send this to a client's GetOffset method to get this offset, or when
- // calling ConsumePartition to start consuming new messages.
- OffsetNewest int64 = -1
- // OffsetOldest stands for the oldest offset available on the broker for a
- // partition. You can send this to a client's GetOffset method to get this
- // offset, or when calling ConsumePartition to start consuming from the
- // oldest offset that is still available on the broker.
- OffsetOldest int64 = -2
-)
-
-type client struct {
- conf *Config
- closer, closed chan none // for shutting down background metadata updater
-
- // the broker addresses given to us through the constructor are not guaranteed to be returned in
- // the cluster metadata (I *think* it only returns brokers who are currently leading partitions?)
- // so we store them separately
- seedBrokers []*Broker
- deadSeeds []*Broker
-
- brokers map[int32]*Broker // maps broker ids to brokers
- metadata map[string]map[int32]*PartitionMetadata // maps topics to partition ids to metadata
- coordinators map[string]int32 // Maps consumer group names to coordinating broker IDs
-
- // If the number of partitions is large, we can get some churn calling cachedPartitions,
- // so the result is cached. It is important to update this value whenever metadata is changed
- cachedPartitionsResults map[string][maxPartitionIndex][]int32
-
- lock sync.RWMutex // protects access to the maps that hold cluster state.
-}
-
-// NewClient creates a new Client. It connects to one of the given broker addresses
-// and uses that broker to automatically fetch metadata on the rest of the kafka cluster. If metadata cannot
-// be retrieved from any of the given broker addresses, the client is not created.
-func NewClient(addrs []string, conf *Config) (Client, error) {
- Logger.Println("Initializing new client")
-
- if conf == nil {
- conf = NewConfig()
- }
-
- if err := conf.Validate(); err != nil {
- return nil, err
- }
-
- if len(addrs) < 1 {
- return nil, ConfigurationError("You must provide at least one broker address")
- }
-
- client := &client{
- conf: conf,
- closer: make(chan none),
- closed: make(chan none),
- brokers: make(map[int32]*Broker),
- metadata: make(map[string]map[int32]*PartitionMetadata),
- cachedPartitionsResults: make(map[string][maxPartitionIndex][]int32),
- coordinators: make(map[string]int32),
- }
-
- random := rand.New(rand.NewSource(time.Now().UnixNano()))
- for _, index := range random.Perm(len(addrs)) {
- client.seedBrokers = append(client.seedBrokers, NewBroker(addrs[index]))
- }
-
- // do an initial fetch of all cluster metadata by specifing an empty list of topics
- err := client.RefreshMetadata()
- switch err {
- case nil:
- break
- case ErrLeaderNotAvailable, ErrReplicaNotAvailable, ErrTopicAuthorizationFailed, ErrClusterAuthorizationFailed:
- // indicates that maybe part of the cluster is down, but is not fatal to creating the client
- Logger.Println(err)
- default:
- close(client.closed) // we haven't started the background updater yet, so we have to do this manually
- _ = client.Close()
- return nil, err
- }
- go withRecover(client.backgroundMetadataUpdater)
-
- Logger.Println("Successfully initialized new client")
-
- return client, nil
-}
-
-func (client *client) Config() *Config {
- return client.conf
-}
-
-func (client *client) Brokers() []*Broker {
- client.lock.RLock()
- defer client.lock.RUnlock()
- brokers := make([]*Broker, 0)
- for _, broker := range client.brokers {
- brokers = append(brokers, broker)
- }
- return brokers
-}
-
-func (client *client) Close() error {
- if client.Closed() {
- // Chances are this is being called from a defer() and the error will go unobserved
- // so we go ahead and log the event in this case.
- Logger.Printf("Close() called on already closed client")
- return ErrClosedClient
- }
-
- // shutdown and wait for the background thread before we take the lock, to avoid races
- close(client.closer)
- <-client.closed
-
- client.lock.Lock()
- defer client.lock.Unlock()
- Logger.Println("Closing Client")
-
- for _, broker := range client.brokers {
- safeAsyncClose(broker)
- }
-
- for _, broker := range client.seedBrokers {
- safeAsyncClose(broker)
- }
-
- client.brokers = nil
- client.metadata = nil
-
- return nil
-}
-
-func (client *client) Closed() bool {
- return client.brokers == nil
-}
-
-func (client *client) Topics() ([]string, error) {
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- client.lock.RLock()
- defer client.lock.RUnlock()
-
- ret := make([]string, 0, len(client.metadata))
- for topic := range client.metadata {
- ret = append(ret, topic)
- }
-
- return ret, nil
-}
-
-func (client *client) Partitions(topic string) ([]int32, error) {
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- partitions := client.cachedPartitions(topic, allPartitions)
-
- if len(partitions) == 0 {
- err := client.RefreshMetadata(topic)
- if err != nil {
- return nil, err
- }
- partitions = client.cachedPartitions(topic, allPartitions)
- }
-
- if partitions == nil {
- return nil, ErrUnknownTopicOrPartition
- }
-
- return partitions, nil
-}
-
-func (client *client) WritablePartitions(topic string) ([]int32, error) {
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- partitions := client.cachedPartitions(topic, writablePartitions)
-
- // len==0 catches when it's nil (no such topic) and the odd case when every single
- // partition is undergoing leader election simultaneously. Callers have to be able to handle
- // this function returning an empty slice (which is a valid return value) but catching it
- // here the first time (note we *don't* catch it below where we return ErrUnknownTopicOrPartition) triggers
- // a metadata refresh as a nicety so callers can just try again and don't have to manually
- // trigger a refresh (otherwise they'd just keep getting a stale cached copy).
- if len(partitions) == 0 {
- err := client.RefreshMetadata(topic)
- if err != nil {
- return nil, err
- }
- partitions = client.cachedPartitions(topic, writablePartitions)
- }
-
- if partitions == nil {
- return nil, ErrUnknownTopicOrPartition
- }
-
- return partitions, nil
-}
-
-func (client *client) Replicas(topic string, partitionID int32) ([]int32, error) {
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- metadata := client.cachedMetadata(topic, partitionID)
-
- if metadata == nil {
- err := client.RefreshMetadata(topic)
- if err != nil {
- return nil, err
- }
- metadata = client.cachedMetadata(topic, partitionID)
- }
-
- if metadata == nil {
- return nil, ErrUnknownTopicOrPartition
- }
-
- if metadata.Err == ErrReplicaNotAvailable {
- return nil, metadata.Err
- }
- return dupeAndSort(metadata.Replicas), nil
-}
-
-func (client *client) Leader(topic string, partitionID int32) (*Broker, error) {
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- leader, err := client.cachedLeader(topic, partitionID)
-
- if leader == nil {
- err = client.RefreshMetadata(topic)
- if err != nil {
- return nil, err
- }
- leader, err = client.cachedLeader(topic, partitionID)
- }
-
- return leader, err
-}
-
-func (client *client) RefreshMetadata(topics ...string) error {
- if client.Closed() {
- return ErrClosedClient
- }
-
- // Prior to 0.8.2, Kafka will throw exceptions on an empty topic and not return a proper
- // error. This handles the case by returning an error instead of sending it
- // off to Kafka. See: https://github.com/Shopify/sarama/pull/38#issuecomment-26362310
- for _, topic := range topics {
- if len(topic) == 0 {
- return ErrInvalidTopic // this is the error that 0.8.2 and later correctly return
- }
- }
-
- return client.tryRefreshMetadata(topics, client.conf.Metadata.Retry.Max)
-}
-
-func (client *client) GetOffset(topic string, partitionID int32, time int64) (int64, error) {
- if client.Closed() {
- return -1, ErrClosedClient
- }
-
- offset, err := client.getOffset(topic, partitionID, time)
-
- if err != nil {
- if err := client.RefreshMetadata(topic); err != nil {
- return -1, err
- }
- return client.getOffset(topic, partitionID, time)
- }
-
- return offset, err
-}
-
-func (client *client) Coordinator(consumerGroup string) (*Broker, error) {
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- coordinator := client.cachedCoordinator(consumerGroup)
-
- if coordinator == nil {
- if err := client.RefreshCoordinator(consumerGroup); err != nil {
- return nil, err
- }
- coordinator = client.cachedCoordinator(consumerGroup)
- }
-
- if coordinator == nil {
- return nil, ErrConsumerCoordinatorNotAvailable
- }
-
- _ = coordinator.Open(client.conf)
- return coordinator, nil
-}
-
-func (client *client) RefreshCoordinator(consumerGroup string) error {
- if client.Closed() {
- return ErrClosedClient
- }
-
- response, err := client.getConsumerMetadata(consumerGroup, client.conf.Metadata.Retry.Max)
- if err != nil {
- return err
- }
-
- client.lock.Lock()
- defer client.lock.Unlock()
- client.registerBroker(response.Coordinator)
- client.coordinators[consumerGroup] = response.Coordinator.ID()
- return nil
-}
-
-// private broker management helpers
-
-// registerBroker makes sure a broker received by a Metadata or Coordinator request is registered
-// in the brokers map. It returns the broker that is registered, which may be the provided broker,
-// or a previously registered Broker instance. You must hold the write lock before calling this function.
-func (client *client) registerBroker(broker *Broker) {
- if client.brokers[broker.ID()] == nil {
- client.brokers[broker.ID()] = broker
- Logger.Printf("client/brokers registered new broker #%d at %s", broker.ID(), broker.Addr())
- } else if broker.Addr() != client.brokers[broker.ID()].Addr() {
- safeAsyncClose(client.brokers[broker.ID()])
- client.brokers[broker.ID()] = broker
- Logger.Printf("client/brokers replaced registered broker #%d with %s", broker.ID(), broker.Addr())
- }
-}
-
-// deregisterBroker removes a broker from the seedsBroker list, and if it's
-// not the seedbroker, removes it from brokers map completely.
-func (client *client) deregisterBroker(broker *Broker) {
- client.lock.Lock()
- defer client.lock.Unlock()
-
- if len(client.seedBrokers) > 0 && broker == client.seedBrokers[0] {
- client.deadSeeds = append(client.deadSeeds, broker)
- client.seedBrokers = client.seedBrokers[1:]
- } else {
- // we do this so that our loop in `tryRefreshMetadata` doesn't go on forever,
- // but we really shouldn't have to; once that loop is made better this case can be
- // removed, and the function generally can be renamed from `deregisterBroker` to
- // `nextSeedBroker` or something
- Logger.Printf("client/brokers deregistered broker #%d at %s", broker.ID(), broker.Addr())
- delete(client.brokers, broker.ID())
- }
-}
-
-func (client *client) resurrectDeadBrokers() {
- client.lock.Lock()
- defer client.lock.Unlock()
-
- Logger.Printf("client/brokers resurrecting %d dead seed brokers", len(client.deadSeeds))
- client.seedBrokers = append(client.seedBrokers, client.deadSeeds...)
- client.deadSeeds = nil
-}
-
-func (client *client) any() *Broker {
- client.lock.RLock()
- defer client.lock.RUnlock()
-
- if len(client.seedBrokers) > 0 {
- _ = client.seedBrokers[0].Open(client.conf)
- return client.seedBrokers[0]
- }
-
- // not guaranteed to be random *or* deterministic
- for _, broker := range client.brokers {
- _ = broker.Open(client.conf)
- return broker
- }
-
- return nil
-}
-
-// private caching/lazy metadata helpers
-
-type partitionType int
-
-const (
- allPartitions partitionType = iota
- writablePartitions
- // If you add any more types, update the partition cache in update()
-
- // Ensure this is the last partition type value
- maxPartitionIndex
-)
-
-func (client *client) cachedMetadata(topic string, partitionID int32) *PartitionMetadata {
- client.lock.RLock()
- defer client.lock.RUnlock()
-
- partitions := client.metadata[topic]
- if partitions != nil {
- return partitions[partitionID]
- }
-
- return nil
-}
-
-func (client *client) cachedPartitions(topic string, partitionSet partitionType) []int32 {
- client.lock.RLock()
- defer client.lock.RUnlock()
-
- partitions, exists := client.cachedPartitionsResults[topic]
-
- if !exists {
- return nil
- }
- return partitions[partitionSet]
-}
-
-func (client *client) setPartitionCache(topic string, partitionSet partitionType) []int32 {
- partitions := client.metadata[topic]
-
- if partitions == nil {
- return nil
- }
-
- ret := make([]int32, 0, len(partitions))
- for _, partition := range partitions {
- if partitionSet == writablePartitions && partition.Err == ErrLeaderNotAvailable {
- continue
- }
- ret = append(ret, partition.ID)
- }
-
- sort.Sort(int32Slice(ret))
- return ret
-}
-
-func (client *client) cachedLeader(topic string, partitionID int32) (*Broker, error) {
- client.lock.RLock()
- defer client.lock.RUnlock()
-
- partitions := client.metadata[topic]
- if partitions != nil {
- metadata, ok := partitions[partitionID]
- if ok {
- if metadata.Err == ErrLeaderNotAvailable {
- return nil, ErrLeaderNotAvailable
- }
- b := client.brokers[metadata.Leader]
- if b == nil {
- return nil, ErrLeaderNotAvailable
- }
- _ = b.Open(client.conf)
- return b, nil
- }
- }
-
- return nil, ErrUnknownTopicOrPartition
-}
-
-func (client *client) getOffset(topic string, partitionID int32, time int64) (int64, error) {
- broker, err := client.Leader(topic, partitionID)
- if err != nil {
- return -1, err
- }
-
- request := &OffsetRequest{}
- if client.conf.Version.IsAtLeast(V0_10_1_0) {
- request.Version = 1
- }
- request.AddBlock(topic, partitionID, time, 1)
-
- response, err := broker.GetAvailableOffsets(request)
- if err != nil {
- _ = broker.Close()
- return -1, err
- }
-
- block := response.GetBlock(topic, partitionID)
- if block == nil {
- _ = broker.Close()
- return -1, ErrIncompleteResponse
- }
- if block.Err != ErrNoError {
- return -1, block.Err
- }
- if len(block.Offsets) != 1 {
- return -1, ErrOffsetOutOfRange
- }
-
- return block.Offsets[0], nil
-}
-
-// core metadata update logic
-
-func (client *client) backgroundMetadataUpdater() {
- defer close(client.closed)
-
- if client.conf.Metadata.RefreshFrequency == time.Duration(0) {
- return
- }
-
- ticker := time.NewTicker(client.conf.Metadata.RefreshFrequency)
- defer ticker.Stop()
-
- for {
- select {
- case <-ticker.C:
- if err := client.RefreshMetadata(); err != nil {
- Logger.Println("Client background metadata update:", err)
- }
- case <-client.closer:
- return
- }
- }
-}
-
-func (client *client) tryRefreshMetadata(topics []string, attemptsRemaining int) error {
- retry := func(err error) error {
- if attemptsRemaining > 0 {
- Logger.Printf("client/metadata retrying after %dms... (%d attempts remaining)\n", client.conf.Metadata.Retry.Backoff/time.Millisecond, attemptsRemaining)
- time.Sleep(client.conf.Metadata.Retry.Backoff)
- return client.tryRefreshMetadata(topics, attemptsRemaining-1)
- }
- return err
- }
-
- for broker := client.any(); broker != nil; broker = client.any() {
- if len(topics) > 0 {
- Logger.Printf("client/metadata fetching metadata for %v from broker %s\n", topics, broker.addr)
- } else {
- Logger.Printf("client/metadata fetching metadata for all topics from broker %s\n", broker.addr)
- }
- response, err := broker.GetMetadata(&MetadataRequest{Topics: topics})
-
- switch err.(type) {
- case nil:
- // valid response, use it
- if shouldRetry, err := client.updateMetadata(response); shouldRetry {
- Logger.Println("client/metadata found some partitions to be leaderless")
- return retry(err) // note: err can be nil
- } else {
- return err
- }
-
- case PacketEncodingError:
- // didn't even send, return the error
- return err
- default:
- // some other error, remove that broker and try again
- Logger.Println("client/metadata got error from broker while fetching metadata:", err)
- _ = broker.Close()
- client.deregisterBroker(broker)
- }
- }
-
- Logger.Println("client/metadata no available broker to send metadata request to")
- client.resurrectDeadBrokers()
- return retry(ErrOutOfBrokers)
-}
-
-// if no fatal error, returns a list of topics that need retrying due to ErrLeaderNotAvailable
-func (client *client) updateMetadata(data *MetadataResponse) (retry bool, err error) {
- client.lock.Lock()
- defer client.lock.Unlock()
-
- // For all the brokers we received:
- // - if it is a new ID, save it
- // - if it is an existing ID, but the address we have is stale, discard the old one and save it
- // - otherwise ignore it, replacing our existing one would just bounce the connection
- for _, broker := range data.Brokers {
- client.registerBroker(broker)
- }
-
- for _, topic := range data.Topics {
- delete(client.metadata, topic.Name)
- delete(client.cachedPartitionsResults, topic.Name)
-
- switch topic.Err {
- case ErrNoError:
- break
- case ErrInvalidTopic, ErrTopicAuthorizationFailed: // don't retry, don't store partial results
- err = topic.Err
- continue
- case ErrUnknownTopicOrPartition: // retry, do not store partial partition results
- err = topic.Err
- retry = true
- continue
- case ErrLeaderNotAvailable: // retry, but store partial partition results
- retry = true
- break
- default: // don't retry, don't store partial results
- Logger.Printf("Unexpected topic-level metadata error: %s", topic.Err)
- err = topic.Err
- continue
- }
-
- client.metadata[topic.Name] = make(map[int32]*PartitionMetadata, len(topic.Partitions))
- for _, partition := range topic.Partitions {
- client.metadata[topic.Name][partition.ID] = partition
- if partition.Err == ErrLeaderNotAvailable {
- retry = true
- }
- }
-
- var partitionCache [maxPartitionIndex][]int32
- partitionCache[allPartitions] = client.setPartitionCache(topic.Name, allPartitions)
- partitionCache[writablePartitions] = client.setPartitionCache(topic.Name, writablePartitions)
- client.cachedPartitionsResults[topic.Name] = partitionCache
- }
-
- return
-}
-
-func (client *client) cachedCoordinator(consumerGroup string) *Broker {
- client.lock.RLock()
- defer client.lock.RUnlock()
- if coordinatorID, ok := client.coordinators[consumerGroup]; ok {
- return client.brokers[coordinatorID]
- }
- return nil
-}
-
-func (client *client) getConsumerMetadata(consumerGroup string, attemptsRemaining int) (*ConsumerMetadataResponse, error) {
- retry := func(err error) (*ConsumerMetadataResponse, error) {
- if attemptsRemaining > 0 {
- Logger.Printf("client/coordinator retrying after %dms... (%d attempts remaining)\n", client.conf.Metadata.Retry.Backoff/time.Millisecond, attemptsRemaining)
- time.Sleep(client.conf.Metadata.Retry.Backoff)
- return client.getConsumerMetadata(consumerGroup, attemptsRemaining-1)
- }
- return nil, err
- }
-
- for broker := client.any(); broker != nil; broker = client.any() {
- Logger.Printf("client/coordinator requesting coordinator for consumergroup %s from %s\n", consumerGroup, broker.Addr())
-
- request := new(ConsumerMetadataRequest)
- request.ConsumerGroup = consumerGroup
-
- response, err := broker.GetConsumerMetadata(request)
-
- if err != nil {
- Logger.Printf("client/coordinator request to broker %s failed: %s\n", broker.Addr(), err)
-
- switch err.(type) {
- case PacketEncodingError:
- return nil, err
- default:
- _ = broker.Close()
- client.deregisterBroker(broker)
- continue
- }
- }
-
- switch response.Err {
- case ErrNoError:
- Logger.Printf("client/coordinator coordinator for consumergroup %s is #%d (%s)\n", consumerGroup, response.Coordinator.ID(), response.Coordinator.Addr())
- return response, nil
-
- case ErrConsumerCoordinatorNotAvailable:
- Logger.Printf("client/coordinator coordinator for consumer group %s is not available\n", consumerGroup)
-
- // This is very ugly, but this scenario will only happen once per cluster.
- // The __consumer_offsets topic only has to be created one time.
- // The number of partitions not configurable, but partition 0 should always exist.
- if _, err := client.Leader("__consumer_offsets", 0); err != nil {
- Logger.Printf("client/coordinator the __consumer_offsets topic is not initialized completely yet. Waiting 2 seconds...\n")
- time.Sleep(2 * time.Second)
- }
-
- return retry(ErrConsumerCoordinatorNotAvailable)
- default:
- return nil, response.Err
- }
- }
-
- Logger.Println("client/coordinator no available broker to send consumer metadata request to")
- client.resurrectDeadBrokers()
- return retry(ErrOutOfBrokers)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/client_test.go b/vendor/src/github.com/Shopify/sarama/client_test.go
deleted file mode 100644
index b0559466f..000000000
--- a/vendor/src/github.com/Shopify/sarama/client_test.go
+++ /dev/null
@@ -1,608 +0,0 @@
-package sarama
-
-import (
- "io"
- "sync"
- "testing"
- "time"
-)
-
-func safeClose(t testing.TB, c io.Closer) {
- err := c.Close()
- if err != nil {
- t.Error(err)
- }
-}
-
-func TestSimpleClient(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
-
- seedBroker.Returns(new(MetadataResponse))
-
- client, err := NewClient([]string{seedBroker.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- seedBroker.Close()
- safeClose(t, client)
-}
-
-func TestCachedPartitions(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
-
- replicas := []int32{3, 1, 5}
- isr := []int32{5, 1}
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker("localhost:12345", 2)
- metadataResponse.AddTopicPartition("my_topic", 0, 2, replicas, isr, ErrNoError)
- metadataResponse.AddTopicPartition("my_topic", 1, 2, replicas, isr, ErrLeaderNotAvailable)
- seedBroker.Returns(metadataResponse)
-
- config := NewConfig()
- config.Metadata.Retry.Max = 0
- c, err := NewClient([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
- client := c.(*client)
-
- // Verify they aren't cached the same
- allP := client.cachedPartitionsResults["my_topic"][allPartitions]
- writeP := client.cachedPartitionsResults["my_topic"][writablePartitions]
- if len(allP) == len(writeP) {
- t.Fatal("Invalid lengths!")
- }
-
- tmp := client.cachedPartitionsResults["my_topic"]
- // Verify we actually use the cache at all!
- tmp[allPartitions] = []int32{1, 2, 3, 4}
- client.cachedPartitionsResults["my_topic"] = tmp
- if 4 != len(client.cachedPartitions("my_topic", allPartitions)) {
- t.Fatal("Not using the cache!")
- }
-
- seedBroker.Close()
- safeClose(t, client)
-}
-
-func TestClientDoesntCachePartitionsForTopicsWithErrors(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
-
- replicas := []int32{seedBroker.BrokerID()}
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(seedBroker.Addr(), seedBroker.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 1, replicas[0], replicas, replicas, ErrNoError)
- metadataResponse.AddTopicPartition("my_topic", 2, replicas[0], replicas, replicas, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- config := NewConfig()
- config.Metadata.Retry.Max = 0
- client, err := NewClient([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- metadataResponse = new(MetadataResponse)
- metadataResponse.AddTopic("unknown", ErrUnknownTopicOrPartition)
- seedBroker.Returns(metadataResponse)
-
- partitions, err := client.Partitions("unknown")
-
- if err != ErrUnknownTopicOrPartition {
- t.Error("Expected ErrUnknownTopicOrPartition, found", err)
- }
- if partitions != nil {
- t.Errorf("Should return nil as partition list, found %v", partitions)
- }
-
- // Should still use the cache of a known topic
- partitions, err = client.Partitions("my_topic")
- if err != nil {
- t.Errorf("Expected no error, found %v", err)
- }
-
- metadataResponse = new(MetadataResponse)
- metadataResponse.AddTopic("unknown", ErrUnknownTopicOrPartition)
- seedBroker.Returns(metadataResponse)
-
- // Should not use cache for unknown topic
- partitions, err = client.Partitions("unknown")
- if err != ErrUnknownTopicOrPartition {
- t.Error("Expected ErrUnknownTopicOrPartition, found", err)
- }
- if partitions != nil {
- t.Errorf("Should return nil as partition list, found %v", partitions)
- }
-
- seedBroker.Close()
- safeClose(t, client)
-}
-
-func TestClientSeedBrokers(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker("localhost:12345", 2)
- seedBroker.Returns(metadataResponse)
-
- client, err := NewClient([]string{seedBroker.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- seedBroker.Close()
- safeClose(t, client)
-}
-
-func TestClientMetadata(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 5)
-
- replicas := []int32{3, 1, 5}
- isr := []int32{5, 1}
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), replicas, isr, ErrNoError)
- metadataResponse.AddTopicPartition("my_topic", 1, leader.BrokerID(), replicas, isr, ErrLeaderNotAvailable)
- seedBroker.Returns(metadataResponse)
-
- config := NewConfig()
- config.Metadata.Retry.Max = 0
- client, err := NewClient([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- topics, err := client.Topics()
- if err != nil {
- t.Error(err)
- } else if len(topics) != 1 || topics[0] != "my_topic" {
- t.Error("Client returned incorrect topics:", topics)
- }
-
- parts, err := client.Partitions("my_topic")
- if err != nil {
- t.Error(err)
- } else if len(parts) != 2 || parts[0] != 0 || parts[1] != 1 {
- t.Error("Client returned incorrect partitions for my_topic:", parts)
- }
-
- parts, err = client.WritablePartitions("my_topic")
- if err != nil {
- t.Error(err)
- } else if len(parts) != 1 || parts[0] != 0 {
- t.Error("Client returned incorrect writable partitions for my_topic:", parts)
- }
-
- tst, err := client.Leader("my_topic", 0)
- if err != nil {
- t.Error(err)
- } else if tst.ID() != 5 {
- t.Error("Leader for my_topic had incorrect ID.")
- }
-
- replicas, err = client.Replicas("my_topic", 0)
- if err != nil {
- t.Error(err)
- } else if replicas[0] != 1 {
- t.Error("Incorrect (or unsorted) replica")
- } else if replicas[1] != 3 {
- t.Error("Incorrect (or unsorted) replica")
- } else if replicas[2] != 5 {
- t.Error("Incorrect (or unsorted) replica")
- }
-
- leader.Close()
- seedBroker.Close()
- safeClose(t, client)
-}
-
-func TestClientGetOffset(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
- leaderAddr := leader.Addr()
-
- metadata := new(MetadataResponse)
- metadata.AddTopicPartition("foo", 0, leader.BrokerID(), nil, nil, ErrNoError)
- metadata.AddBroker(leaderAddr, leader.BrokerID())
- seedBroker.Returns(metadata)
-
- client, err := NewClient([]string{seedBroker.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- offsetResponse := new(OffsetResponse)
- offsetResponse.AddTopicPartition("foo", 0, 123)
- leader.Returns(offsetResponse)
-
- offset, err := client.GetOffset("foo", 0, OffsetNewest)
- if err != nil {
- t.Error(err)
- }
- if offset != 123 {
- t.Error("Unexpected offset, got ", offset)
- }
-
- leader.Close()
- seedBroker.Returns(metadata)
-
- leader = NewMockBrokerAddr(t, 2, leaderAddr)
- offsetResponse = new(OffsetResponse)
- offsetResponse.AddTopicPartition("foo", 0, 456)
- leader.Returns(offsetResponse)
-
- offset, err = client.GetOffset("foo", 0, OffsetNewest)
- if err != nil {
- t.Error(err)
- }
- if offset != 456 {
- t.Error("Unexpected offset, got ", offset)
- }
-
- seedBroker.Close()
- leader.Close()
- safeClose(t, client)
-}
-
-func TestClientReceivingUnknownTopic(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
-
- metadataResponse1 := new(MetadataResponse)
- seedBroker.Returns(metadataResponse1)
-
- config := NewConfig()
- config.Metadata.Retry.Max = 1
- config.Metadata.Retry.Backoff = 0
- client, err := NewClient([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- metadataUnknownTopic := new(MetadataResponse)
- metadataUnknownTopic.AddTopic("new_topic", ErrUnknownTopicOrPartition)
- seedBroker.Returns(metadataUnknownTopic)
- seedBroker.Returns(metadataUnknownTopic)
-
- if err := client.RefreshMetadata("new_topic"); err != ErrUnknownTopicOrPartition {
- t.Error("ErrUnknownTopicOrPartition expected, got", err)
- }
-
- // If we are asking for the leader of a partition of the non-existing topic.
- // we will request metadata again.
- seedBroker.Returns(metadataUnknownTopic)
- seedBroker.Returns(metadataUnknownTopic)
-
- if _, err = client.Leader("new_topic", 1); err != ErrUnknownTopicOrPartition {
- t.Error("Expected ErrUnknownTopicOrPartition, got", err)
- }
-
- safeClose(t, client)
- seedBroker.Close()
-}
-
-func TestClientReceivingPartialMetadata(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 5)
-
- metadataResponse1 := new(MetadataResponse)
- metadataResponse1.AddBroker(leader.Addr(), leader.BrokerID())
- seedBroker.Returns(metadataResponse1)
-
- config := NewConfig()
- config.Metadata.Retry.Max = 0
- client, err := NewClient([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- replicas := []int32{leader.BrokerID(), seedBroker.BrokerID()}
-
- metadataPartial := new(MetadataResponse)
- metadataPartial.AddTopic("new_topic", ErrLeaderNotAvailable)
- metadataPartial.AddTopicPartition("new_topic", 0, leader.BrokerID(), replicas, replicas, ErrNoError)
- metadataPartial.AddTopicPartition("new_topic", 1, -1, replicas, []int32{}, ErrLeaderNotAvailable)
- seedBroker.Returns(metadataPartial)
-
- if err := client.RefreshMetadata("new_topic"); err != nil {
- t.Error("ErrLeaderNotAvailable should not make RefreshMetadata respond with an error")
- }
-
- // Even though the metadata was incomplete, we should be able to get the leader of a partition
- // for which we did get a useful response, without doing additional requests.
-
- partition0Leader, err := client.Leader("new_topic", 0)
- if err != nil {
- t.Error(err)
- } else if partition0Leader.Addr() != leader.Addr() {
- t.Error("Unexpected leader returned", partition0Leader.Addr())
- }
-
- // If we are asking for the leader of a partition that didn't have a leader before,
- // we will do another metadata request.
-
- seedBroker.Returns(metadataPartial)
-
- // Still no leader for the partition, so asking for it should return an error.
- _, err = client.Leader("new_topic", 1)
- if err != ErrLeaderNotAvailable {
- t.Error("Expected ErrLeaderNotAvailable, got", err)
- }
-
- safeClose(t, client)
- seedBroker.Close()
- leader.Close()
-}
-
-func TestClientRefreshBehaviour(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 5)
-
- metadataResponse1 := new(MetadataResponse)
- metadataResponse1.AddBroker(leader.Addr(), leader.BrokerID())
- seedBroker.Returns(metadataResponse1)
-
- metadataResponse2 := new(MetadataResponse)
- metadataResponse2.AddTopicPartition("my_topic", 0xb, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse2)
-
- client, err := NewClient([]string{seedBroker.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- parts, err := client.Partitions("my_topic")
- if err != nil {
- t.Error(err)
- } else if len(parts) != 1 || parts[0] != 0xb {
- t.Error("Client returned incorrect partitions for my_topic:", parts)
- }
-
- tst, err := client.Leader("my_topic", 0xb)
- if err != nil {
- t.Error(err)
- } else if tst.ID() != 5 {
- t.Error("Leader for my_topic had incorrect ID.")
- }
-
- leader.Close()
- seedBroker.Close()
- safeClose(t, client)
-}
-
-func TestClientResurrectDeadSeeds(t *testing.T) {
- initialSeed := NewMockBroker(t, 0)
- emptyMetadata := new(MetadataResponse)
- initialSeed.Returns(emptyMetadata)
-
- conf := NewConfig()
- conf.Metadata.Retry.Backoff = 0
- conf.Metadata.RefreshFrequency = 0
- c, err := NewClient([]string{initialSeed.Addr()}, conf)
- if err != nil {
- t.Fatal(err)
- }
- initialSeed.Close()
-
- client := c.(*client)
-
- seed1 := NewMockBroker(t, 1)
- seed2 := NewMockBroker(t, 2)
- seed3 := NewMockBroker(t, 3)
- addr1 := seed1.Addr()
- addr2 := seed2.Addr()
- addr3 := seed3.Addr()
-
- // Overwrite the seed brokers with a fixed ordering to make this test deterministic.
- safeClose(t, client.seedBrokers[0])
- client.seedBrokers = []*Broker{NewBroker(addr1), NewBroker(addr2), NewBroker(addr3)}
- client.deadSeeds = []*Broker{}
-
- wg := sync.WaitGroup{}
- wg.Add(1)
- go func() {
- if err := client.RefreshMetadata(); err != nil {
- t.Error(err)
- }
- wg.Done()
- }()
- seed1.Close()
- seed2.Close()
-
- seed1 = NewMockBrokerAddr(t, 1, addr1)
- seed2 = NewMockBrokerAddr(t, 2, addr2)
-
- seed3.Close()
-
- seed1.Close()
- seed2.Returns(emptyMetadata)
-
- wg.Wait()
-
- if len(client.seedBrokers) != 2 {
- t.Error("incorrect number of live seeds")
- }
- if len(client.deadSeeds) != 1 {
- t.Error("incorrect number of dead seeds")
- }
-
- safeClose(t, c)
-}
-
-func TestClientCoordinatorWithConsumerOffsetsTopic(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- staleCoordinator := NewMockBroker(t, 2)
- freshCoordinator := NewMockBroker(t, 3)
-
- replicas := []int32{staleCoordinator.BrokerID(), freshCoordinator.BrokerID()}
- metadataResponse1 := new(MetadataResponse)
- metadataResponse1.AddBroker(staleCoordinator.Addr(), staleCoordinator.BrokerID())
- metadataResponse1.AddBroker(freshCoordinator.Addr(), freshCoordinator.BrokerID())
- metadataResponse1.AddTopicPartition("__consumer_offsets", 0, replicas[0], replicas, replicas, ErrNoError)
- seedBroker.Returns(metadataResponse1)
-
- client, err := NewClient([]string{seedBroker.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- coordinatorResponse1 := new(ConsumerMetadataResponse)
- coordinatorResponse1.Err = ErrConsumerCoordinatorNotAvailable
- seedBroker.Returns(coordinatorResponse1)
-
- coordinatorResponse2 := new(ConsumerMetadataResponse)
- coordinatorResponse2.CoordinatorID = staleCoordinator.BrokerID()
- coordinatorResponse2.CoordinatorHost = "127.0.0.1"
- coordinatorResponse2.CoordinatorPort = staleCoordinator.Port()
-
- seedBroker.Returns(coordinatorResponse2)
-
- broker, err := client.Coordinator("my_group")
- if err != nil {
- t.Error(err)
- }
-
- if staleCoordinator.Addr() != broker.Addr() {
- t.Errorf("Expected coordinator to have address %s, found %s", staleCoordinator.Addr(), broker.Addr())
- }
-
- if staleCoordinator.BrokerID() != broker.ID() {
- t.Errorf("Expected coordinator to have ID %d, found %d", staleCoordinator.BrokerID(), broker.ID())
- }
-
- // Grab the cached value
- broker2, err := client.Coordinator("my_group")
- if err != nil {
- t.Error(err)
- }
-
- if broker2.Addr() != broker.Addr() {
- t.Errorf("Expected the coordinator to be the same, but found %s vs. %s", broker2.Addr(), broker.Addr())
- }
-
- coordinatorResponse3 := new(ConsumerMetadataResponse)
- coordinatorResponse3.CoordinatorID = freshCoordinator.BrokerID()
- coordinatorResponse3.CoordinatorHost = "127.0.0.1"
- coordinatorResponse3.CoordinatorPort = freshCoordinator.Port()
-
- seedBroker.Returns(coordinatorResponse3)
-
- // Refresh the locally cahced value because it's stale
- if err := client.RefreshCoordinator("my_group"); err != nil {
- t.Error(err)
- }
-
- // Grab the fresh value
- broker3, err := client.Coordinator("my_group")
- if err != nil {
- t.Error(err)
- }
-
- if broker3.Addr() != freshCoordinator.Addr() {
- t.Errorf("Expected the freshCoordinator to be returned, but found %s.", broker3.Addr())
- }
-
- freshCoordinator.Close()
- staleCoordinator.Close()
- seedBroker.Close()
- safeClose(t, client)
-}
-
-func TestClientCoordinatorWithoutConsumerOffsetsTopic(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- coordinator := NewMockBroker(t, 2)
-
- metadataResponse1 := new(MetadataResponse)
- seedBroker.Returns(metadataResponse1)
-
- config := NewConfig()
- config.Metadata.Retry.Max = 1
- config.Metadata.Retry.Backoff = 0
- client, err := NewClient([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- coordinatorResponse1 := new(ConsumerMetadataResponse)
- coordinatorResponse1.Err = ErrConsumerCoordinatorNotAvailable
- seedBroker.Returns(coordinatorResponse1)
-
- metadataResponse2 := new(MetadataResponse)
- metadataResponse2.AddTopic("__consumer_offsets", ErrUnknownTopicOrPartition)
- seedBroker.Returns(metadataResponse2)
-
- replicas := []int32{coordinator.BrokerID()}
- metadataResponse3 := new(MetadataResponse)
- metadataResponse3.AddTopicPartition("__consumer_offsets", 0, replicas[0], replicas, replicas, ErrNoError)
- seedBroker.Returns(metadataResponse3)
-
- coordinatorResponse2 := new(ConsumerMetadataResponse)
- coordinatorResponse2.CoordinatorID = coordinator.BrokerID()
- coordinatorResponse2.CoordinatorHost = "127.0.0.1"
- coordinatorResponse2.CoordinatorPort = coordinator.Port()
-
- seedBroker.Returns(coordinatorResponse2)
-
- broker, err := client.Coordinator("my_group")
- if err != nil {
- t.Error(err)
- }
-
- if coordinator.Addr() != broker.Addr() {
- t.Errorf("Expected coordinator to have address %s, found %s", coordinator.Addr(), broker.Addr())
- }
-
- if coordinator.BrokerID() != broker.ID() {
- t.Errorf("Expected coordinator to have ID %d, found %d", coordinator.BrokerID(), broker.ID())
- }
-
- coordinator.Close()
- seedBroker.Close()
- safeClose(t, client)
-}
-
-func TestClientAutorefreshShutdownRace(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
-
- metadataResponse := new(MetadataResponse)
- seedBroker.Returns(metadataResponse)
-
- conf := NewConfig()
- conf.Metadata.RefreshFrequency = 100 * time.Millisecond
- client, err := NewClient([]string{seedBroker.Addr()}, conf)
- if err != nil {
- t.Fatal(err)
- }
-
- // Wait for the background refresh to kick in
- time.Sleep(110 * time.Millisecond)
-
- done := make(chan none)
- go func() {
- // Close the client
- if err := client.Close(); err != nil {
- t.Fatal(err)
- }
- close(done)
- }()
-
- // Wait for the Close to kick in
- time.Sleep(10 * time.Millisecond)
-
- // Then return some metadata to the still-running background thread
- leader := NewMockBroker(t, 2)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("foo", 0, leader.BrokerID(), []int32{2}, []int32{2}, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- <-done
-
- seedBroker.Close()
-
- // give the update time to happen so we get a panic if it's still running (which it shouldn't)
- time.Sleep(10 * time.Millisecond)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/config.go b/vendor/src/github.com/Shopify/sarama/config.go
deleted file mode 100644
index a417a38b2..000000000
--- a/vendor/src/github.com/Shopify/sarama/config.go
+++ /dev/null
@@ -1,417 +0,0 @@
-package sarama
-
-import (
- "crypto/tls"
- "regexp"
- "time"
-
- "github.com/rcrowley/go-metrics"
-)
-
-const defaultClientID = "sarama"
-
-var validID = regexp.MustCompile(`\A[A-Za-z0-9._-]+\z`)
-
-// Config is used to pass multiple configuration options to Sarama's constructors.
-type Config struct {
- // Net is the namespace for network-level properties used by the Broker, and
- // shared by the Client/Producer/Consumer.
- Net struct {
- // How many outstanding requests a connection is allowed to have before
- // sending on it blocks (default 5).
- MaxOpenRequests int
-
- // All three of the below configurations are similar to the
- // `socket.timeout.ms` setting in JVM kafka. All of them default
- // to 30 seconds.
- DialTimeout time.Duration // How long to wait for the initial connection.
- ReadTimeout time.Duration // How long to wait for a response.
- WriteTimeout time.Duration // How long to wait for a transmit.
-
- TLS struct {
- // Whether or not to use TLS when connecting to the broker
- // (defaults to false).
- Enable bool
- // The TLS configuration to use for secure connections if
- // enabled (defaults to nil).
- Config *tls.Config
- }
-
- // SASL based authentication with broker. While there are multiple SASL authentication methods
- // the current implementation is limited to plaintext (SASL/PLAIN) authentication
- SASL struct {
- // Whether or not to use SASL authentication when connecting to the broker
- // (defaults to false).
- Enable bool
- // Whether or not to send the Kafka SASL handshake first if enabled
- // (defaults to true). You should only set this to false if you're using
- // a non-Kafka SASL proxy.
- Handshake bool
- //username and password for SASL/PLAIN authentication
- User string
- Password string
- }
-
- // KeepAlive specifies the keep-alive period for an active network connection.
- // If zero, keep-alives are disabled. (default is 0: disabled).
- KeepAlive time.Duration
- }
-
- // Metadata is the namespace for metadata management properties used by the
- // Client, and shared by the Producer/Consumer.
- Metadata struct {
- Retry struct {
- // The total number of times to retry a metadata request when the
- // cluster is in the middle of a leader election (default 3).
- Max int
- // How long to wait for leader election to occur before retrying
- // (default 250ms). Similar to the JVM's `retry.backoff.ms`.
- Backoff time.Duration
- }
- // How frequently to refresh the cluster metadata in the background.
- // Defaults to 10 minutes. Set to 0 to disable. Similar to
- // `topic.metadata.refresh.interval.ms` in the JVM version.
- RefreshFrequency time.Duration
- }
-
- // Producer is the namespace for configuration related to producing messages,
- // used by the Producer.
- Producer struct {
- // The maximum permitted size of a message (defaults to 1000000). Should be
- // set equal to or smaller than the broker's `message.max.bytes`.
- MaxMessageBytes int
- // The level of acknowledgement reliability needed from the broker (defaults
- // to WaitForLocal). Equivalent to the `request.required.acks` setting of the
- // JVM producer.
- RequiredAcks RequiredAcks
- // The maximum duration the broker will wait the receipt of the number of
- // RequiredAcks (defaults to 10 seconds). This is only relevant when
- // RequiredAcks is set to WaitForAll or a number > 1. Only supports
- // millisecond resolution, nanoseconds will be truncated. Equivalent to
- // the JVM producer's `request.timeout.ms` setting.
- Timeout time.Duration
- // The type of compression to use on messages (defaults to no compression).
- // Similar to `compression.codec` setting of the JVM producer.
- Compression CompressionCodec
- // Generates partitioners for choosing the partition to send messages to
- // (defaults to hashing the message key). Similar to the `partitioner.class`
- // setting for the JVM producer.
- Partitioner PartitionerConstructor
-
- // Return specifies what channels will be populated. If they are set to true,
- // you must read from the respective channels to prevent deadlock.
- Return struct {
- // If enabled, successfully delivered messages will be returned on the
- // Successes channel (default disabled).
- Successes bool
-
- // If enabled, messages that failed to deliver will be returned on the
- // Errors channel, including error (default enabled).
- Errors bool
- }
-
- // The following config options control how often messages are batched up and
- // sent to the broker. By default, messages are sent as fast as possible, and
- // all messages received while the current batch is in-flight are placed
- // into the subsequent batch.
- Flush struct {
- // The best-effort number of bytes needed to trigger a flush. Use the
- // global sarama.MaxRequestSize to set a hard upper limit.
- Bytes int
- // The best-effort number of messages needed to trigger a flush. Use
- // `MaxMessages` to set a hard upper limit.
- Messages int
- // The best-effort frequency of flushes. Equivalent to
- // `queue.buffering.max.ms` setting of JVM producer.
- Frequency time.Duration
- // The maximum number of messages the producer will send in a single
- // broker request. Defaults to 0 for unlimited. Similar to
- // `queue.buffering.max.messages` in the JVM producer.
- MaxMessages int
- }
-
- Retry struct {
- // The total number of times to retry sending a message (default 3).
- // Similar to the `message.send.max.retries` setting of the JVM producer.
- Max int
- // How long to wait for the cluster to settle between retries
- // (default 100ms). Similar to the `retry.backoff.ms` setting of the
- // JVM producer.
- Backoff time.Duration
- }
- }
-
- // Consumer is the namespace for configuration related to consuming messages,
- // used by the Consumer.
- //
- // Note that Sarama's Consumer type does not currently support automatic
- // consumer-group rebalancing and offset tracking. For Zookeeper-based
- // tracking (Kafka 0.8.2 and earlier), the https://github.com/wvanbergen/kafka
- // library builds on Sarama to add this support. For Kafka-based tracking
- // (Kafka 0.9 and later), the https://github.com/bsm/sarama-cluster library
- // builds on Sarama to add this support.
- Consumer struct {
- Retry struct {
- // How long to wait after a failing to read from a partition before
- // trying again (default 2s).
- Backoff time.Duration
- }
-
- // Fetch is the namespace for controlling how many bytes are retrieved by any
- // given request.
- Fetch struct {
- // The minimum number of message bytes to fetch in a request - the broker
- // will wait until at least this many are available. The default is 1,
- // as 0 causes the consumer to spin when no messages are available.
- // Equivalent to the JVM's `fetch.min.bytes`.
- Min int32
- // The default number of message bytes to fetch from the broker in each
- // request (default 32768). This should be larger than the majority of
- // your messages, or else the consumer will spend a lot of time
- // negotiating sizes and not actually consuming. Similar to the JVM's
- // `fetch.message.max.bytes`.
- Default int32
- // The maximum number of message bytes to fetch from the broker in a
- // single request. Messages larger than this will return
- // ErrMessageTooLarge and will not be consumable, so you must be sure
- // this is at least as large as your largest message. Defaults to 0
- // (no limit). Similar to the JVM's `fetch.message.max.bytes`. The
- // global `sarama.MaxResponseSize` still applies.
- Max int32
- }
- // The maximum amount of time the broker will wait for Consumer.Fetch.Min
- // bytes to become available before it returns fewer than that anyways. The
- // default is 250ms, since 0 causes the consumer to spin when no events are
- // available. 100-500ms is a reasonable range for most cases. Kafka only
- // supports precision up to milliseconds; nanoseconds will be truncated.
- // Equivalent to the JVM's `fetch.wait.max.ms`.
- MaxWaitTime time.Duration
-
- // The maximum amount of time the consumer expects a message takes to process
- // for the user. If writing to the Messages channel takes longer than this,
- // that partition will stop fetching more messages until it can proceed again.
- // Note that, since the Messages channel is buffered, the actual grace time is
- // (MaxProcessingTime * ChanneBufferSize). Defaults to 100ms.
- MaxProcessingTime time.Duration
-
- // Return specifies what channels will be populated. If they are set to true,
- // you must read from them to prevent deadlock.
- Return struct {
- // If enabled, any errors that occurred while consuming are returned on
- // the Errors channel (default disabled).
- Errors bool
- }
-
- // Offsets specifies configuration for how and when to commit consumed
- // offsets. This currently requires the manual use of an OffsetManager
- // but will eventually be automated.
- Offsets struct {
- // How frequently to commit updated offsets. Defaults to 1s.
- CommitInterval time.Duration
-
- // The initial offset to use if no offset was previously committed.
- // Should be OffsetNewest or OffsetOldest. Defaults to OffsetNewest.
- Initial int64
-
- // The retention duration for committed offsets. If zero, disabled
- // (in which case the `offsets.retention.minutes` option on the
- // broker will be used). Kafka only supports precision up to
- // milliseconds; nanoseconds will be truncated. Requires Kafka
- // broker version 0.9.0 or later.
- // (default is 0: disabled).
- Retention time.Duration
- }
- }
-
- // A user-provided string sent with every request to the brokers for logging,
- // debugging, and auditing purposes. Defaults to "sarama", but you should
- // probably set it to something specific to your application.
- ClientID string
- // The number of events to buffer in internal and external channels. This
- // permits the producer and consumer to continue processing some messages
- // in the background while user code is working, greatly improving throughput.
- // Defaults to 256.
- ChannelBufferSize int
- // The version of Kafka that Sarama will assume it is running against.
- // Defaults to the oldest supported stable version. Since Kafka provides
- // backwards-compatibility, setting it to a version older than you have
- // will not break anything, although it may prevent you from using the
- // latest features. Setting it to a version greater than you are actually
- // running may lead to random breakage.
- Version KafkaVersion
- // The registry to define metrics into.
- // Defaults to a local registry.
- // If you want to disable metrics gathering, set "metrics.UseNilMetrics" to "true"
- // prior to starting Sarama.
- // See Examples on how to use the metrics registry
- MetricRegistry metrics.Registry
-}
-
-// NewConfig returns a new configuration instance with sane defaults.
-func NewConfig() *Config {
- c := &Config{}
-
- c.Net.MaxOpenRequests = 5
- c.Net.DialTimeout = 30 * time.Second
- c.Net.ReadTimeout = 30 * time.Second
- c.Net.WriteTimeout = 30 * time.Second
- c.Net.SASL.Handshake = true
-
- c.Metadata.Retry.Max = 3
- c.Metadata.Retry.Backoff = 250 * time.Millisecond
- c.Metadata.RefreshFrequency = 10 * time.Minute
-
- c.Producer.MaxMessageBytes = 1000000
- c.Producer.RequiredAcks = WaitForLocal
- c.Producer.Timeout = 10 * time.Second
- c.Producer.Partitioner = NewHashPartitioner
- c.Producer.Retry.Max = 3
- c.Producer.Retry.Backoff = 100 * time.Millisecond
- c.Producer.Return.Errors = true
-
- c.Consumer.Fetch.Min = 1
- c.Consumer.Fetch.Default = 32768
- c.Consumer.Retry.Backoff = 2 * time.Second
- c.Consumer.MaxWaitTime = 250 * time.Millisecond
- c.Consumer.MaxProcessingTime = 100 * time.Millisecond
- c.Consumer.Return.Errors = false
- c.Consumer.Offsets.CommitInterval = 1 * time.Second
- c.Consumer.Offsets.Initial = OffsetNewest
-
- c.ClientID = defaultClientID
- c.ChannelBufferSize = 256
- c.Version = minVersion
- c.MetricRegistry = metrics.NewRegistry()
-
- return c
-}
-
-// Validate checks a Config instance. It will return a
-// ConfigurationError if the specified values don't make sense.
-func (c *Config) Validate() error {
- // some configuration values should be warned on but not fail completely, do those first
- if c.Net.TLS.Enable == false && c.Net.TLS.Config != nil {
- Logger.Println("Net.TLS is disabled but a non-nil configuration was provided.")
- }
- if c.Net.SASL.Enable == false {
- if c.Net.SASL.User != "" {
- Logger.Println("Net.SASL is disabled but a non-empty username was provided.")
- }
- if c.Net.SASL.Password != "" {
- Logger.Println("Net.SASL is disabled but a non-empty password was provided.")
- }
- }
- if c.Producer.RequiredAcks > 1 {
- Logger.Println("Producer.RequiredAcks > 1 is deprecated and will raise an exception with kafka >= 0.8.2.0.")
- }
- if c.Producer.MaxMessageBytes >= int(MaxRequestSize) {
- Logger.Println("Producer.MaxMessageBytes is larger than MaxRequestSize; it will be ignored.")
- }
- if c.Producer.Flush.Bytes >= int(MaxRequestSize) {
- Logger.Println("Producer.Flush.Bytes is larger than MaxRequestSize; it will be ignored.")
- }
- if c.Producer.Timeout%time.Millisecond != 0 {
- Logger.Println("Producer.Timeout only supports millisecond resolution; nanoseconds will be truncated.")
- }
- if c.Consumer.MaxWaitTime < 100*time.Millisecond {
- Logger.Println("Consumer.MaxWaitTime is very low, which can cause high CPU and network usage. See documentation for details.")
- }
- if c.Consumer.MaxWaitTime%time.Millisecond != 0 {
- Logger.Println("Consumer.MaxWaitTime only supports millisecond precision; nanoseconds will be truncated.")
- }
- if c.Consumer.Offsets.Retention%time.Millisecond != 0 {
- Logger.Println("Consumer.Offsets.Retention only supports millisecond precision; nanoseconds will be truncated.")
- }
- if c.ClientID == defaultClientID {
- Logger.Println("ClientID is the default of 'sarama', you should consider setting it to something application-specific.")
- }
-
- // validate Net values
- switch {
- case c.Net.MaxOpenRequests <= 0:
- return ConfigurationError("Net.MaxOpenRequests must be > 0")
- case c.Net.DialTimeout <= 0:
- return ConfigurationError("Net.DialTimeout must be > 0")
- case c.Net.ReadTimeout <= 0:
- return ConfigurationError("Net.ReadTimeout must be > 0")
- case c.Net.WriteTimeout <= 0:
- return ConfigurationError("Net.WriteTimeout must be > 0")
- case c.Net.KeepAlive < 0:
- return ConfigurationError("Net.KeepAlive must be >= 0")
- case c.Net.SASL.Enable == true && c.Net.SASL.User == "":
- return ConfigurationError("Net.SASL.User must not be empty when SASL is enabled")
- case c.Net.SASL.Enable == true && c.Net.SASL.Password == "":
- return ConfigurationError("Net.SASL.Password must not be empty when SASL is enabled")
- }
-
- // validate the Metadata values
- switch {
- case c.Metadata.Retry.Max < 0:
- return ConfigurationError("Metadata.Retry.Max must be >= 0")
- case c.Metadata.Retry.Backoff < 0:
- return ConfigurationError("Metadata.Retry.Backoff must be >= 0")
- case c.Metadata.RefreshFrequency < 0:
- return ConfigurationError("Metadata.RefreshFrequency must be >= 0")
- }
-
- // validate the Producer values
- switch {
- case c.Producer.MaxMessageBytes <= 0:
- return ConfigurationError("Producer.MaxMessageBytes must be > 0")
- case c.Producer.RequiredAcks < -1:
- return ConfigurationError("Producer.RequiredAcks must be >= -1")
- case c.Producer.Timeout <= 0:
- return ConfigurationError("Producer.Timeout must be > 0")
- case c.Producer.Partitioner == nil:
- return ConfigurationError("Producer.Partitioner must not be nil")
- case c.Producer.Flush.Bytes < 0:
- return ConfigurationError("Producer.Flush.Bytes must be >= 0")
- case c.Producer.Flush.Messages < 0:
- return ConfigurationError("Producer.Flush.Messages must be >= 0")
- case c.Producer.Flush.Frequency < 0:
- return ConfigurationError("Producer.Flush.Frequency must be >= 0")
- case c.Producer.Flush.MaxMessages < 0:
- return ConfigurationError("Producer.Flush.MaxMessages must be >= 0")
- case c.Producer.Flush.MaxMessages > 0 && c.Producer.Flush.MaxMessages < c.Producer.Flush.Messages:
- return ConfigurationError("Producer.Flush.MaxMessages must be >= Producer.Flush.Messages when set")
- case c.Producer.Retry.Max < 0:
- return ConfigurationError("Producer.Retry.Max must be >= 0")
- case c.Producer.Retry.Backoff < 0:
- return ConfigurationError("Producer.Retry.Backoff must be >= 0")
- }
-
- if c.Producer.Compression == CompressionLZ4 && !c.Version.IsAtLeast(V0_10_0_0) {
- return ConfigurationError("lz4 compression requires Version >= V0_10_0_0")
- }
-
- // validate the Consumer values
- switch {
- case c.Consumer.Fetch.Min <= 0:
- return ConfigurationError("Consumer.Fetch.Min must be > 0")
- case c.Consumer.Fetch.Default <= 0:
- return ConfigurationError("Consumer.Fetch.Default must be > 0")
- case c.Consumer.Fetch.Max < 0:
- return ConfigurationError("Consumer.Fetch.Max must be >= 0")
- case c.Consumer.MaxWaitTime < 1*time.Millisecond:
- return ConfigurationError("Consumer.MaxWaitTime must be >= 1ms")
- case c.Consumer.MaxProcessingTime <= 0:
- return ConfigurationError("Consumer.MaxProcessingTime must be > 0")
- case c.Consumer.Retry.Backoff < 0:
- return ConfigurationError("Consumer.Retry.Backoff must be >= 0")
- case c.Consumer.Offsets.CommitInterval <= 0:
- return ConfigurationError("Consumer.Offsets.CommitInterval must be > 0")
- case c.Consumer.Offsets.Initial != OffsetOldest && c.Consumer.Offsets.Initial != OffsetNewest:
- return ConfigurationError("Consumer.Offsets.Initial must be OffsetOldest or OffsetNewest")
-
- }
-
- // validate misc shared values
- switch {
- case c.ChannelBufferSize < 0:
- return ConfigurationError("ChannelBufferSize must be >= 0")
- case !validID.MatchString(c.ClientID):
- return ConfigurationError("ClientID is invalid")
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/config_test.go b/vendor/src/github.com/Shopify/sarama/config_test.go
deleted file mode 100644
index 5fef6b361..000000000
--- a/vendor/src/github.com/Shopify/sarama/config_test.go
+++ /dev/null
@@ -1,70 +0,0 @@
-package sarama
-
-import (
- "os"
- "testing"
-
- "github.com/rcrowley/go-metrics"
-)
-
-func TestDefaultConfigValidates(t *testing.T) {
- config := NewConfig()
- if err := config.Validate(); err != nil {
- t.Error(err)
- }
- if config.MetricRegistry == nil {
- t.Error("Expected non nil metrics.MetricRegistry, got nil")
- }
-}
-
-func TestInvalidClientIDConfigValidates(t *testing.T) {
- config := NewConfig()
- config.ClientID = "foo:bar"
- if err := config.Validate(); string(err.(ConfigurationError)) != "ClientID is invalid" {
- t.Error("Expected invalid ClientID, got ", err)
- }
-}
-
-func TestEmptyClientIDConfigValidates(t *testing.T) {
- config := NewConfig()
- config.ClientID = ""
- if err := config.Validate(); string(err.(ConfigurationError)) != "ClientID is invalid" {
- t.Error("Expected invalid ClientID, got ", err)
- }
-}
-
-func TestLZ4ConfigValidation(t *testing.T) {
- config := NewConfig()
- config.Producer.Compression = CompressionLZ4
- if err := config.Validate(); string(err.(ConfigurationError)) != "lz4 compression requires Version >= V0_10_0_0" {
- t.Error("Expected invalid lz4/kakfa version error, got ", err)
- }
- config.Version = V0_10_0_0
- if err := config.Validate(); err != nil {
- t.Error("Expected lz4 to work, got ", err)
- }
-}
-
-// This example shows how to integrate with an existing registry as well as publishing metrics
-// on the standard output
-func ExampleConfig_metrics() {
- // Our application registry
- appMetricRegistry := metrics.NewRegistry()
- appGauge := metrics.GetOrRegisterGauge("m1", appMetricRegistry)
- appGauge.Update(1)
-
- config := NewConfig()
- // Use a prefix registry instead of the default local one
- config.MetricRegistry = metrics.NewPrefixedChildRegistry(appMetricRegistry, "sarama.")
-
- // Simulate a metric created by sarama without starting a broker
- saramaGauge := metrics.GetOrRegisterGauge("m2", config.MetricRegistry)
- saramaGauge.Update(2)
-
- metrics.WriteOnce(appMetricRegistry, os.Stdout)
- // Output:
- // gauge m1
- // value: 1
- // gauge sarama.m2
- // value: 2
-}
diff --git a/vendor/src/github.com/Shopify/sarama/consumer.go b/vendor/src/github.com/Shopify/sarama/consumer.go
deleted file mode 100644
index ddac564ff..000000000
--- a/vendor/src/github.com/Shopify/sarama/consumer.go
+++ /dev/null
@@ -1,735 +0,0 @@
-package sarama
-
-import (
- "errors"
- "fmt"
- "sync"
- "sync/atomic"
- "time"
-)
-
-// ConsumerMessage encapsulates a Kafka message returned by the consumer.
-type ConsumerMessage struct {
- Key, Value []byte
- Topic string
- Partition int32
- Offset int64
- Timestamp time.Time // only set if kafka is version 0.10+
-}
-
-// ConsumerError is what is provided to the user when an error occurs.
-// It wraps an error and includes the topic and partition.
-type ConsumerError struct {
- Topic string
- Partition int32
- Err error
-}
-
-func (ce ConsumerError) Error() string {
- return fmt.Sprintf("kafka: error while consuming %s/%d: %s", ce.Topic, ce.Partition, ce.Err)
-}
-
-// ConsumerErrors is a type that wraps a batch of errors and implements the Error interface.
-// It can be returned from the PartitionConsumer's Close methods to avoid the need to manually drain errors
-// when stopping.
-type ConsumerErrors []*ConsumerError
-
-func (ce ConsumerErrors) Error() string {
- return fmt.Sprintf("kafka: %d errors while consuming", len(ce))
-}
-
-// Consumer manages PartitionConsumers which process Kafka messages from brokers. You MUST call Close()
-// on a consumer to avoid leaks, it will not be garbage-collected automatically when it passes out of
-// scope.
-//
-// Sarama's Consumer type does not currently support automatic consumer-group rebalancing and offset tracking.
-// For Zookeeper-based tracking (Kafka 0.8.2 and earlier), the https://github.com/wvanbergen/kafka library
-// builds on Sarama to add this support. For Kafka-based tracking (Kafka 0.9 and later), the
-// https://github.com/bsm/sarama-cluster library builds on Sarama to add this support.
-type Consumer interface {
-
- // Topics returns the set of available topics as retrieved from the cluster
- // metadata. This method is the same as Client.Topics(), and is provided for
- // convenience.
- Topics() ([]string, error)
-
- // Partitions returns the sorted list of all partition IDs for the given topic.
- // This method is the same as Client.Partitions(), and is provided for convenience.
- Partitions(topic string) ([]int32, error)
-
- // ConsumePartition creates a PartitionConsumer on the given topic/partition with
- // the given offset. It will return an error if this Consumer is already consuming
- // on the given topic/partition. Offset can be a literal offset, or OffsetNewest
- // or OffsetOldest
- ConsumePartition(topic string, partition int32, offset int64) (PartitionConsumer, error)
-
- // HighWaterMarks returns the current high water marks for each topic and partition.
- // Consistency between partitions is not guaranteed since high water marks are updated separately.
- HighWaterMarks() map[string]map[int32]int64
-
- // Close shuts down the consumer. It must be called after all child
- // PartitionConsumers have already been closed.
- Close() error
-}
-
-type consumer struct {
- client Client
- conf *Config
- ownClient bool
-
- lock sync.Mutex
- children map[string]map[int32]*partitionConsumer
- brokerConsumers map[*Broker]*brokerConsumer
-}
-
-// NewConsumer creates a new consumer using the given broker addresses and configuration.
-func NewConsumer(addrs []string, config *Config) (Consumer, error) {
- client, err := NewClient(addrs, config)
- if err != nil {
- return nil, err
- }
-
- c, err := NewConsumerFromClient(client)
- if err != nil {
- return nil, err
- }
- c.(*consumer).ownClient = true
- return c, nil
-}
-
-// NewConsumerFromClient creates a new consumer using the given client. It is still
-// necessary to call Close() on the underlying client when shutting down this consumer.
-func NewConsumerFromClient(client Client) (Consumer, error) {
- // Check that we are not dealing with a closed Client before processing any other arguments
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- c := &consumer{
- client: client,
- conf: client.Config(),
- children: make(map[string]map[int32]*partitionConsumer),
- brokerConsumers: make(map[*Broker]*brokerConsumer),
- }
-
- return c, nil
-}
-
-func (c *consumer) Close() error {
- if c.ownClient {
- return c.client.Close()
- }
- return nil
-}
-
-func (c *consumer) Topics() ([]string, error) {
- return c.client.Topics()
-}
-
-func (c *consumer) Partitions(topic string) ([]int32, error) {
- return c.client.Partitions(topic)
-}
-
-func (c *consumer) ConsumePartition(topic string, partition int32, offset int64) (PartitionConsumer, error) {
- child := &partitionConsumer{
- consumer: c,
- conf: c.conf,
- topic: topic,
- partition: partition,
- messages: make(chan *ConsumerMessage, c.conf.ChannelBufferSize),
- errors: make(chan *ConsumerError, c.conf.ChannelBufferSize),
- feeder: make(chan *FetchResponse, 1),
- trigger: make(chan none, 1),
- dying: make(chan none),
- fetchSize: c.conf.Consumer.Fetch.Default,
- }
-
- if err := child.chooseStartingOffset(offset); err != nil {
- return nil, err
- }
-
- var leader *Broker
- var err error
- if leader, err = c.client.Leader(child.topic, child.partition); err != nil {
- return nil, err
- }
-
- if err := c.addChild(child); err != nil {
- return nil, err
- }
-
- go withRecover(child.dispatcher)
- go withRecover(child.responseFeeder)
-
- child.broker = c.refBrokerConsumer(leader)
- child.broker.input <- child
-
- return child, nil
-}
-
-func (c *consumer) HighWaterMarks() map[string]map[int32]int64 {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- hwms := make(map[string]map[int32]int64)
- for topic, p := range c.children {
- hwm := make(map[int32]int64, len(p))
- for partition, pc := range p {
- hwm[partition] = pc.HighWaterMarkOffset()
- }
- hwms[topic] = hwm
- }
-
- return hwms
-}
-
-func (c *consumer) addChild(child *partitionConsumer) error {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- topicChildren := c.children[child.topic]
- if topicChildren == nil {
- topicChildren = make(map[int32]*partitionConsumer)
- c.children[child.topic] = topicChildren
- }
-
- if topicChildren[child.partition] != nil {
- return ConfigurationError("That topic/partition is already being consumed")
- }
-
- topicChildren[child.partition] = child
- return nil
-}
-
-func (c *consumer) removeChild(child *partitionConsumer) {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- delete(c.children[child.topic], child.partition)
-}
-
-func (c *consumer) refBrokerConsumer(broker *Broker) *brokerConsumer {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- bc := c.brokerConsumers[broker]
- if bc == nil {
- bc = c.newBrokerConsumer(broker)
- c.brokerConsumers[broker] = bc
- }
-
- bc.refs++
-
- return bc
-}
-
-func (c *consumer) unrefBrokerConsumer(brokerWorker *brokerConsumer) {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- brokerWorker.refs--
-
- if brokerWorker.refs == 0 {
- close(brokerWorker.input)
- if c.brokerConsumers[brokerWorker.broker] == brokerWorker {
- delete(c.brokerConsumers, brokerWorker.broker)
- }
- }
-}
-
-func (c *consumer) abandonBrokerConsumer(brokerWorker *brokerConsumer) {
- c.lock.Lock()
- defer c.lock.Unlock()
-
- delete(c.brokerConsumers, brokerWorker.broker)
-}
-
-// PartitionConsumer
-
-// PartitionConsumer processes Kafka messages from a given topic and partition. You MUST call Close()
-// or AsyncClose() on a PartitionConsumer to avoid leaks, it will not be garbage-collected automatically
-// when it passes out of scope.
-//
-// The simplest way of using a PartitionConsumer is to loop over its Messages channel using a for/range
-// loop. The PartitionConsumer will only stop itself in one case: when the offset being consumed is reported
-// as out of range by the brokers. In this case you should decide what you want to do (try a different offset,
-// notify a human, etc) and handle it appropriately. For all other error cases, it will just keep retrying.
-// By default, it logs these errors to sarama.Logger; if you want to be notified directly of all errors, set
-// your config's Consumer.Return.Errors to true and read from the Errors channel, using a select statement
-// or a separate goroutine. Check out the Consumer examples to see implementations of these different approaches.
-type PartitionConsumer interface {
-
- // AsyncClose initiates a shutdown of the PartitionConsumer. This method will
- // return immediately, after which you should wait until the 'messages' and
- // 'errors' channel are drained. It is required to call this function, or
- // Close before a consumer object passes out of scope, as it will otherwise
- // leak memory. You must call this before calling Close on the underlying client.
- AsyncClose()
-
- // Close stops the PartitionConsumer from fetching messages. It is required to
- // call this function (or AsyncClose) before a consumer object passes out of
- // scope, as it will otherwise leak memory. You must call this before calling
- // Close on the underlying client.
- Close() error
-
- // Messages returns the read channel for the messages that are returned by
- // the broker.
- Messages() <-chan *ConsumerMessage
-
- // Errors returns a read channel of errors that occurred during consuming, if
- // enabled. By default, errors are logged and not returned over this channel.
- // If you want to implement any custom error handling, set your config's
- // Consumer.Return.Errors setting to true, and read from this channel.
- Errors() <-chan *ConsumerError
-
- // HighWaterMarkOffset returns the high water mark offset of the partition,
- // i.e. the offset that will be used for the next message that will be produced.
- // You can use this to determine how far behind the processing is.
- HighWaterMarkOffset() int64
-}
-
-type partitionConsumer struct {
- consumer *consumer
- conf *Config
- topic string
- partition int32
-
- broker *brokerConsumer
- messages chan *ConsumerMessage
- errors chan *ConsumerError
- feeder chan *FetchResponse
-
- trigger, dying chan none
- responseResult error
-
- fetchSize int32
- offset int64
- highWaterMarkOffset int64
-}
-
-var errTimedOut = errors.New("timed out feeding messages to the user") // not user-facing
-
-func (child *partitionConsumer) sendError(err error) {
- cErr := &ConsumerError{
- Topic: child.topic,
- Partition: child.partition,
- Err: err,
- }
-
- if child.conf.Consumer.Return.Errors {
- child.errors <- cErr
- } else {
- Logger.Println(cErr)
- }
-}
-
-func (child *partitionConsumer) dispatcher() {
- for _ = range child.trigger {
- select {
- case <-child.dying:
- close(child.trigger)
- case <-time.After(child.conf.Consumer.Retry.Backoff):
- if child.broker != nil {
- child.consumer.unrefBrokerConsumer(child.broker)
- child.broker = nil
- }
-
- Logger.Printf("consumer/%s/%d finding new broker\n", child.topic, child.partition)
- if err := child.dispatch(); err != nil {
- child.sendError(err)
- child.trigger <- none{}
- }
- }
- }
-
- if child.broker != nil {
- child.consumer.unrefBrokerConsumer(child.broker)
- }
- child.consumer.removeChild(child)
- close(child.feeder)
-}
-
-func (child *partitionConsumer) dispatch() error {
- if err := child.consumer.client.RefreshMetadata(child.topic); err != nil {
- return err
- }
-
- var leader *Broker
- var err error
- if leader, err = child.consumer.client.Leader(child.topic, child.partition); err != nil {
- return err
- }
-
- child.broker = child.consumer.refBrokerConsumer(leader)
-
- child.broker.input <- child
-
- return nil
-}
-
-func (child *partitionConsumer) chooseStartingOffset(offset int64) error {
- newestOffset, err := child.consumer.client.GetOffset(child.topic, child.partition, OffsetNewest)
- if err != nil {
- return err
- }
- oldestOffset, err := child.consumer.client.GetOffset(child.topic, child.partition, OffsetOldest)
- if err != nil {
- return err
- }
-
- switch {
- case offset == OffsetNewest:
- child.offset = newestOffset
- case offset == OffsetOldest:
- child.offset = oldestOffset
- case offset >= oldestOffset && offset <= newestOffset:
- child.offset = offset
- default:
- return ErrOffsetOutOfRange
- }
-
- return nil
-}
-
-func (child *partitionConsumer) Messages() <-chan *ConsumerMessage {
- return child.messages
-}
-
-func (child *partitionConsumer) Errors() <-chan *ConsumerError {
- return child.errors
-}
-
-func (child *partitionConsumer) AsyncClose() {
- // this triggers whatever broker owns this child to abandon it and close its trigger channel, which causes
- // the dispatcher to exit its loop, which removes it from the consumer then closes its 'messages' and
- // 'errors' channel (alternatively, if the child is already at the dispatcher for some reason, that will
- // also just close itself)
- close(child.dying)
-}
-
-func (child *partitionConsumer) Close() error {
- child.AsyncClose()
-
- go withRecover(func() {
- for _ = range child.messages {
- // drain
- }
- })
-
- var errors ConsumerErrors
- for err := range child.errors {
- errors = append(errors, err)
- }
-
- if len(errors) > 0 {
- return errors
- }
- return nil
-}
-
-func (child *partitionConsumer) HighWaterMarkOffset() int64 {
- return atomic.LoadInt64(&child.highWaterMarkOffset)
-}
-
-func (child *partitionConsumer) responseFeeder() {
- var msgs []*ConsumerMessage
- expiryTimer := time.NewTimer(child.conf.Consumer.MaxProcessingTime)
- expireTimedOut := false
-
-feederLoop:
- for response := range child.feeder {
- msgs, child.responseResult = child.parseResponse(response)
-
- for i, msg := range msgs {
- if !expiryTimer.Stop() && !expireTimedOut {
- // expiryTimer was expired; clear out the waiting msg
- <-expiryTimer.C
- }
- expiryTimer.Reset(child.conf.Consumer.MaxProcessingTime)
- expireTimedOut = false
-
- select {
- case child.messages <- msg:
- case <-expiryTimer.C:
- expireTimedOut = true
- child.responseResult = errTimedOut
- child.broker.acks.Done()
- for _, msg = range msgs[i:] {
- child.messages <- msg
- }
- child.broker.input <- child
- continue feederLoop
- }
- }
-
- child.broker.acks.Done()
- }
-
- close(child.messages)
- close(child.errors)
-}
-
-func (child *partitionConsumer) parseResponse(response *FetchResponse) ([]*ConsumerMessage, error) {
- block := response.GetBlock(child.topic, child.partition)
- if block == nil {
- return nil, ErrIncompleteResponse
- }
-
- if block.Err != ErrNoError {
- return nil, block.Err
- }
-
- if len(block.MsgSet.Messages) == 0 {
- // We got no messages. If we got a trailing one then we need to ask for more data.
- // Otherwise we just poll again and wait for one to be produced...
- if block.MsgSet.PartialTrailingMessage {
- if child.conf.Consumer.Fetch.Max > 0 && child.fetchSize == child.conf.Consumer.Fetch.Max {
- // we can't ask for more data, we've hit the configured limit
- child.sendError(ErrMessageTooLarge)
- child.offset++ // skip this one so we can keep processing future messages
- } else {
- child.fetchSize *= 2
- if child.conf.Consumer.Fetch.Max > 0 && child.fetchSize > child.conf.Consumer.Fetch.Max {
- child.fetchSize = child.conf.Consumer.Fetch.Max
- }
- }
- }
-
- return nil, nil
- }
-
- // we got messages, reset our fetch size in case it was increased for a previous request
- child.fetchSize = child.conf.Consumer.Fetch.Default
- atomic.StoreInt64(&child.highWaterMarkOffset, block.HighWaterMarkOffset)
-
- incomplete := false
- prelude := true
- var messages []*ConsumerMessage
- for _, msgBlock := range block.MsgSet.Messages {
-
- for _, msg := range msgBlock.Messages() {
- offset := msg.Offset
- if msg.Msg.Version >= 1 {
- baseOffset := msgBlock.Offset - msgBlock.Messages()[len(msgBlock.Messages())-1].Offset
- offset += baseOffset
- }
- if prelude && offset < child.offset {
- continue
- }
- prelude = false
-
- if offset >= child.offset {
- messages = append(messages, &ConsumerMessage{
- Topic: child.topic,
- Partition: child.partition,
- Key: msg.Msg.Key,
- Value: msg.Msg.Value,
- Offset: offset,
- Timestamp: msg.Msg.Timestamp,
- })
- child.offset = offset + 1
- } else {
- incomplete = true
- }
- }
-
- }
-
- if incomplete || len(messages) == 0 {
- return nil, ErrIncompleteResponse
- }
- return messages, nil
-}
-
-// brokerConsumer
-
-type brokerConsumer struct {
- consumer *consumer
- broker *Broker
- input chan *partitionConsumer
- newSubscriptions chan []*partitionConsumer
- wait chan none
- subscriptions map[*partitionConsumer]none
- acks sync.WaitGroup
- refs int
-}
-
-func (c *consumer) newBrokerConsumer(broker *Broker) *brokerConsumer {
- bc := &brokerConsumer{
- consumer: c,
- broker: broker,
- input: make(chan *partitionConsumer),
- newSubscriptions: make(chan []*partitionConsumer),
- wait: make(chan none),
- subscriptions: make(map[*partitionConsumer]none),
- refs: 0,
- }
-
- go withRecover(bc.subscriptionManager)
- go withRecover(bc.subscriptionConsumer)
-
- return bc
-}
-
-func (bc *brokerConsumer) subscriptionManager() {
- var buffer []*partitionConsumer
-
- // The subscriptionManager constantly accepts new subscriptions on `input` (even when the main subscriptionConsumer
- // goroutine is in the middle of a network request) and batches it up. The main worker goroutine picks
- // up a batch of new subscriptions between every network request by reading from `newSubscriptions`, so we give
- // it nil if no new subscriptions are available. We also write to `wait` only when new subscriptions is available,
- // so the main goroutine can block waiting for work if it has none.
- for {
- if len(buffer) > 0 {
- select {
- case event, ok := <-bc.input:
- if !ok {
- goto done
- }
- buffer = append(buffer, event)
- case bc.newSubscriptions <- buffer:
- buffer = nil
- case bc.wait <- none{}:
- }
- } else {
- select {
- case event, ok := <-bc.input:
- if !ok {
- goto done
- }
- buffer = append(buffer, event)
- case bc.newSubscriptions <- nil:
- }
- }
- }
-
-done:
- close(bc.wait)
- if len(buffer) > 0 {
- bc.newSubscriptions <- buffer
- }
- close(bc.newSubscriptions)
-}
-
-func (bc *brokerConsumer) subscriptionConsumer() {
- <-bc.wait // wait for our first piece of work
-
- // the subscriptionConsumer ensures we will get nil right away if no new subscriptions is available
- for newSubscriptions := range bc.newSubscriptions {
- bc.updateSubscriptions(newSubscriptions)
-
- if len(bc.subscriptions) == 0 {
- // We're about to be shut down or we're about to receive more subscriptions.
- // Either way, the signal just hasn't propagated to our goroutine yet.
- <-bc.wait
- continue
- }
-
- response, err := bc.fetchNewMessages()
-
- if err != nil {
- Logger.Printf("consumer/broker/%d disconnecting due to error processing FetchRequest: %s\n", bc.broker.ID(), err)
- bc.abort(err)
- return
- }
-
- bc.acks.Add(len(bc.subscriptions))
- for child := range bc.subscriptions {
- child.feeder <- response
- }
- bc.acks.Wait()
- bc.handleResponses()
- }
-}
-
-func (bc *brokerConsumer) updateSubscriptions(newSubscriptions []*partitionConsumer) {
- for _, child := range newSubscriptions {
- bc.subscriptions[child] = none{}
- Logger.Printf("consumer/broker/%d added subscription to %s/%d\n", bc.broker.ID(), child.topic, child.partition)
- }
-
- for child := range bc.subscriptions {
- select {
- case <-child.dying:
- Logger.Printf("consumer/broker/%d closed dead subscription to %s/%d\n", bc.broker.ID(), child.topic, child.partition)
- close(child.trigger)
- delete(bc.subscriptions, child)
- default:
- break
- }
- }
-}
-
-func (bc *brokerConsumer) handleResponses() {
- // handles the response codes left for us by our subscriptions, and abandons ones that have been closed
- for child := range bc.subscriptions {
- result := child.responseResult
- child.responseResult = nil
-
- switch result {
- case nil:
- break
- case errTimedOut:
- Logger.Printf("consumer/broker/%d abandoned subscription to %s/%d because consuming was taking too long\n",
- bc.broker.ID(), child.topic, child.partition)
- delete(bc.subscriptions, child)
- case ErrOffsetOutOfRange:
- // there's no point in retrying this it will just fail the same way again
- // shut it down and force the user to choose what to do
- child.sendError(result)
- Logger.Printf("consumer/%s/%d shutting down because %s\n", child.topic, child.partition, result)
- close(child.trigger)
- delete(bc.subscriptions, child)
- case ErrUnknownTopicOrPartition, ErrNotLeaderForPartition, ErrLeaderNotAvailable, ErrReplicaNotAvailable:
- // not an error, but does need redispatching
- Logger.Printf("consumer/broker/%d abandoned subscription to %s/%d because %s\n",
- bc.broker.ID(), child.topic, child.partition, result)
- child.trigger <- none{}
- delete(bc.subscriptions, child)
- default:
- // dunno, tell the user and try redispatching
- child.sendError(result)
- Logger.Printf("consumer/broker/%d abandoned subscription to %s/%d because %s\n",
- bc.broker.ID(), child.topic, child.partition, result)
- child.trigger <- none{}
- delete(bc.subscriptions, child)
- }
- }
-}
-
-func (bc *brokerConsumer) abort(err error) {
- bc.consumer.abandonBrokerConsumer(bc)
- _ = bc.broker.Close() // we don't care about the error this might return, we already have one
-
- for child := range bc.subscriptions {
- child.sendError(err)
- child.trigger <- none{}
- }
-
- for newSubscriptions := range bc.newSubscriptions {
- if len(newSubscriptions) == 0 {
- <-bc.wait
- continue
- }
- for _, child := range newSubscriptions {
- child.sendError(err)
- child.trigger <- none{}
- }
- }
-}
-
-func (bc *brokerConsumer) fetchNewMessages() (*FetchResponse, error) {
- request := &FetchRequest{
- MinBytes: bc.consumer.conf.Consumer.Fetch.Min,
- MaxWaitTime: int32(bc.consumer.conf.Consumer.MaxWaitTime / time.Millisecond),
- }
- if bc.consumer.conf.Version.IsAtLeast(V0_10_0_0) {
- request.Version = 2
- }
-
- for child := range bc.subscriptions {
- request.AddBlock(child.topic, child.partition, child.offset, child.fetchSize)
- }
-
- return bc.broker.Fetch(request)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/consumer_group_members.go b/vendor/src/github.com/Shopify/sarama/consumer_group_members.go
deleted file mode 100644
index 9d92d350a..000000000
--- a/vendor/src/github.com/Shopify/sarama/consumer_group_members.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package sarama
-
-type ConsumerGroupMemberMetadata struct {
- Version int16
- Topics []string
- UserData []byte
-}
-
-func (m *ConsumerGroupMemberMetadata) encode(pe packetEncoder) error {
- pe.putInt16(m.Version)
-
- if err := pe.putStringArray(m.Topics); err != nil {
- return err
- }
-
- if err := pe.putBytes(m.UserData); err != nil {
- return err
- }
-
- return nil
-}
-
-func (m *ConsumerGroupMemberMetadata) decode(pd packetDecoder) (err error) {
- if m.Version, err = pd.getInt16(); err != nil {
- return
- }
-
- if m.Topics, err = pd.getStringArray(); err != nil {
- return
- }
-
- if m.UserData, err = pd.getBytes(); err != nil {
- return
- }
-
- return nil
-}
-
-type ConsumerGroupMemberAssignment struct {
- Version int16
- Topics map[string][]int32
- UserData []byte
-}
-
-func (m *ConsumerGroupMemberAssignment) encode(pe packetEncoder) error {
- pe.putInt16(m.Version)
-
- if err := pe.putArrayLength(len(m.Topics)); err != nil {
- return err
- }
-
- for topic, partitions := range m.Topics {
- if err := pe.putString(topic); err != nil {
- return err
- }
- if err := pe.putInt32Array(partitions); err != nil {
- return err
- }
- }
-
- if err := pe.putBytes(m.UserData); err != nil {
- return err
- }
-
- return nil
-}
-
-func (m *ConsumerGroupMemberAssignment) decode(pd packetDecoder) (err error) {
- if m.Version, err = pd.getInt16(); err != nil {
- return
- }
-
- var topicLen int
- if topicLen, err = pd.getArrayLength(); err != nil {
- return
- }
-
- m.Topics = make(map[string][]int32, topicLen)
- for i := 0; i < topicLen; i++ {
- var topic string
- if topic, err = pd.getString(); err != nil {
- return
- }
- if m.Topics[topic], err = pd.getInt32Array(); err != nil {
- return
- }
- }
-
- if m.UserData, err = pd.getBytes(); err != nil {
- return
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/consumer_group_members_test.go b/vendor/src/github.com/Shopify/sarama/consumer_group_members_test.go
deleted file mode 100644
index 164e07ef1..000000000
--- a/vendor/src/github.com/Shopify/sarama/consumer_group_members_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package sarama
-
-import (
- "bytes"
- "reflect"
- "testing"
-)
-
-var (
- groupMemberMetadata = []byte{
- 0, 1, // Version
- 0, 0, 0, 2, // Topic array length
- 0, 3, 'o', 'n', 'e', // Topic one
- 0, 3, 't', 'w', 'o', // Topic two
- 0, 0, 0, 3, 0x01, 0x02, 0x03, // Userdata
- }
- groupMemberAssignment = []byte{
- 0, 1, // Version
- 0, 0, 0, 1, // Topic array length
- 0, 3, 'o', 'n', 'e', // Topic one
- 0, 0, 0, 3, // Topic one, partition array length
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, // 0, 2, 4
- 0, 0, 0, 3, 0x01, 0x02, 0x03, // Userdata
- }
-)
-
-func TestConsumerGroupMemberMetadata(t *testing.T) {
- meta := &ConsumerGroupMemberMetadata{
- Version: 1,
- Topics: []string{"one", "two"},
- UserData: []byte{0x01, 0x02, 0x03},
- }
-
- buf, err := encode(meta, nil)
- if err != nil {
- t.Error("Failed to encode data", err)
- } else if !bytes.Equal(groupMemberMetadata, buf) {
- t.Errorf("Encoded data does not match expectation\nexpected: %v\nactual: %v", groupMemberMetadata, buf)
- }
-
- meta2 := new(ConsumerGroupMemberMetadata)
- err = decode(buf, meta2)
- if err != nil {
- t.Error("Failed to decode data", err)
- } else if !reflect.DeepEqual(meta, meta2) {
- t.Errorf("Encoded data does not match expectation\nexpected: %v\nactual: %v", meta, meta2)
- }
-}
-
-func TestConsumerGroupMemberAssignment(t *testing.T) {
- amt := &ConsumerGroupMemberAssignment{
- Version: 1,
- Topics: map[string][]int32{
- "one": []int32{0, 2, 4},
- },
- UserData: []byte{0x01, 0x02, 0x03},
- }
-
- buf, err := encode(amt, nil)
- if err != nil {
- t.Error("Failed to encode data", err)
- } else if !bytes.Equal(groupMemberAssignment, buf) {
- t.Errorf("Encoded data does not match expectation\nexpected: %v\nactual: %v", groupMemberAssignment, buf)
- }
-
- amt2 := new(ConsumerGroupMemberAssignment)
- err = decode(buf, amt2)
- if err != nil {
- t.Error("Failed to decode data", err)
- } else if !reflect.DeepEqual(amt, amt2) {
- t.Errorf("Encoded data does not match expectation\nexpected: %v\nactual: %v", amt, amt2)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/consumer_metadata_request.go b/vendor/src/github.com/Shopify/sarama/consumer_metadata_request.go
deleted file mode 100644
index 483be3354..000000000
--- a/vendor/src/github.com/Shopify/sarama/consumer_metadata_request.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package sarama
-
-type ConsumerMetadataRequest struct {
- ConsumerGroup string
-}
-
-func (r *ConsumerMetadataRequest) encode(pe packetEncoder) error {
- return pe.putString(r.ConsumerGroup)
-}
-
-func (r *ConsumerMetadataRequest) decode(pd packetDecoder, version int16) (err error) {
- r.ConsumerGroup, err = pd.getString()
- return err
-}
-
-func (r *ConsumerMetadataRequest) key() int16 {
- return 10
-}
-
-func (r *ConsumerMetadataRequest) version() int16 {
- return 0
-}
-
-func (r *ConsumerMetadataRequest) requiredVersion() KafkaVersion {
- return V0_8_2_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/consumer_metadata_request_test.go b/vendor/src/github.com/Shopify/sarama/consumer_metadata_request_test.go
deleted file mode 100644
index 4509631a0..000000000
--- a/vendor/src/github.com/Shopify/sarama/consumer_metadata_request_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- consumerMetadataRequestEmpty = []byte{
- 0x00, 0x00}
-
- consumerMetadataRequestString = []byte{
- 0x00, 0x06, 'f', 'o', 'o', 'b', 'a', 'r'}
-)
-
-func TestConsumerMetadataRequest(t *testing.T) {
- request := new(ConsumerMetadataRequest)
- testRequest(t, "empty string", request, consumerMetadataRequestEmpty)
-
- request.ConsumerGroup = "foobar"
- testRequest(t, "with string", request, consumerMetadataRequestString)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/consumer_metadata_response.go b/vendor/src/github.com/Shopify/sarama/consumer_metadata_response.go
deleted file mode 100644
index 6b9632bba..000000000
--- a/vendor/src/github.com/Shopify/sarama/consumer_metadata_response.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package sarama
-
-import (
- "net"
- "strconv"
-)
-
-type ConsumerMetadataResponse struct {
- Err KError
- Coordinator *Broker
- CoordinatorID int32 // deprecated: use Coordinator.ID()
- CoordinatorHost string // deprecated: use Coordinator.Addr()
- CoordinatorPort int32 // deprecated: use Coordinator.Addr()
-}
-
-func (r *ConsumerMetadataResponse) decode(pd packetDecoder, version int16) (err error) {
- tmp, err := pd.getInt16()
- if err != nil {
- return err
- }
- r.Err = KError(tmp)
-
- coordinator := new(Broker)
- if err := coordinator.decode(pd); err != nil {
- return err
- }
- if coordinator.addr == ":0" {
- return nil
- }
- r.Coordinator = coordinator
-
- // this can all go away in 2.0, but we have to fill in deprecated fields to maintain
- // backwards compatibility
- host, portstr, err := net.SplitHostPort(r.Coordinator.Addr())
- if err != nil {
- return err
- }
- port, err := strconv.ParseInt(portstr, 10, 32)
- if err != nil {
- return err
- }
- r.CoordinatorID = r.Coordinator.ID()
- r.CoordinatorHost = host
- r.CoordinatorPort = int32(port)
-
- return nil
-}
-
-func (r *ConsumerMetadataResponse) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.Err))
- if r.Coordinator != nil {
- host, portstr, err := net.SplitHostPort(r.Coordinator.Addr())
- if err != nil {
- return err
- }
- port, err := strconv.ParseInt(portstr, 10, 32)
- if err != nil {
- return err
- }
- pe.putInt32(r.Coordinator.ID())
- if err := pe.putString(host); err != nil {
- return err
- }
- pe.putInt32(int32(port))
- return nil
- }
- pe.putInt32(r.CoordinatorID)
- if err := pe.putString(r.CoordinatorHost); err != nil {
- return err
- }
- pe.putInt32(r.CoordinatorPort)
- return nil
-}
-
-func (r *ConsumerMetadataResponse) key() int16 {
- return 10
-}
-
-func (r *ConsumerMetadataResponse) version() int16 {
- return 0
-}
-
-func (r *ConsumerMetadataResponse) requiredVersion() KafkaVersion {
- return V0_8_2_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/consumer_metadata_response_test.go b/vendor/src/github.com/Shopify/sarama/consumer_metadata_response_test.go
deleted file mode 100644
index b748784d7..000000000
--- a/vendor/src/github.com/Shopify/sarama/consumer_metadata_response_test.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- consumerMetadataResponseError = []byte{
- 0x00, 0x0E,
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00}
-
- consumerMetadataResponseSuccess = []byte{
- 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xAB,
- 0x00, 0x03, 'f', 'o', 'o',
- 0x00, 0x00, 0xCC, 0xDD}
-)
-
-func TestConsumerMetadataResponseError(t *testing.T) {
- response := ConsumerMetadataResponse{Err: ErrOffsetsLoadInProgress}
- testResponse(t, "error", &response, consumerMetadataResponseError)
-}
-
-func TestConsumerMetadataResponseSuccess(t *testing.T) {
- broker := NewBroker("foo:52445")
- broker.id = 0xAB
- response := ConsumerMetadataResponse{
- Coordinator: broker,
- CoordinatorID: 0xAB,
- CoordinatorHost: "foo",
- CoordinatorPort: 0xCCDD,
- Err: ErrNoError,
- }
- testResponse(t, "success", &response, consumerMetadataResponseSuccess)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/consumer_test.go b/vendor/src/github.com/Shopify/sarama/consumer_test.go
deleted file mode 100644
index 387ede314..000000000
--- a/vendor/src/github.com/Shopify/sarama/consumer_test.go
+++ /dev/null
@@ -1,854 +0,0 @@
-package sarama
-
-import (
- "log"
- "os"
- "os/signal"
- "sync"
- "testing"
- "time"
-)
-
-var testMsg = StringEncoder("Foo")
-
-// If a particular offset is provided then messages are consumed starting from
-// that offset.
-func TestConsumerOffsetManual(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 0)
-
- mockFetchResponse := NewMockFetchResponse(t, 1)
- for i := 0; i < 10; i++ {
- mockFetchResponse.SetMessage("my_topic", 0, int64(i+1234), testMsg)
- }
-
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetOldest, 0).
- SetOffset("my_topic", 0, OffsetNewest, 2345),
- "FetchRequest": mockFetchResponse,
- })
-
- // When
- master, err := NewConsumer([]string{broker0.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- consumer, err := master.ConsumePartition("my_topic", 0, 1234)
- if err != nil {
- t.Fatal(err)
- }
-
- // Then: messages starting from offset 1234 are consumed.
- for i := 0; i < 10; i++ {
- select {
- case message := <-consumer.Messages():
- assertMessageOffset(t, message, int64(i+1234))
- case err := <-consumer.Errors():
- t.Error(err)
- }
- }
-
- safeClose(t, consumer)
- safeClose(t, master)
- broker0.Close()
-}
-
-// If `OffsetNewest` is passed as the initial offset then the first consumed
-// message is indeed corresponds to the offset that broker claims to be the
-// newest in its metadata response.
-func TestConsumerOffsetNewest(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 0)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetNewest, 10).
- SetOffset("my_topic", 0, OffsetOldest, 7),
- "FetchRequest": NewMockFetchResponse(t, 1).
- SetMessage("my_topic", 0, 9, testMsg).
- SetMessage("my_topic", 0, 10, testMsg).
- SetMessage("my_topic", 0, 11, testMsg).
- SetHighWaterMark("my_topic", 0, 14),
- })
-
- master, err := NewConsumer([]string{broker0.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- // When
- consumer, err := master.ConsumePartition("my_topic", 0, OffsetNewest)
- if err != nil {
- t.Fatal(err)
- }
-
- // Then
- assertMessageOffset(t, <-consumer.Messages(), 10)
- if hwmo := consumer.HighWaterMarkOffset(); hwmo != 14 {
- t.Errorf("Expected high water mark offset 14, found %d", hwmo)
- }
-
- safeClose(t, consumer)
- safeClose(t, master)
- broker0.Close()
-}
-
-// It is possible to close a partition consumer and create the same anew.
-func TestConsumerRecreate(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 0)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetOldest, 0).
- SetOffset("my_topic", 0, OffsetNewest, 1000),
- "FetchRequest": NewMockFetchResponse(t, 1).
- SetMessage("my_topic", 0, 10, testMsg),
- })
-
- c, err := NewConsumer([]string{broker0.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- pc, err := c.ConsumePartition("my_topic", 0, 10)
- if err != nil {
- t.Fatal(err)
- }
- assertMessageOffset(t, <-pc.Messages(), 10)
-
- // When
- safeClose(t, pc)
- pc, err = c.ConsumePartition("my_topic", 0, 10)
- if err != nil {
- t.Fatal(err)
- }
-
- // Then
- assertMessageOffset(t, <-pc.Messages(), 10)
-
- safeClose(t, pc)
- safeClose(t, c)
- broker0.Close()
-}
-
-// An attempt to consume the same partition twice should fail.
-func TestConsumerDuplicate(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 0)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetOldest, 0).
- SetOffset("my_topic", 0, OffsetNewest, 1000),
- "FetchRequest": NewMockFetchResponse(t, 1),
- })
-
- config := NewConfig()
- config.ChannelBufferSize = 0
- c, err := NewConsumer([]string{broker0.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- pc1, err := c.ConsumePartition("my_topic", 0, 0)
- if err != nil {
- t.Fatal(err)
- }
-
- // When
- pc2, err := c.ConsumePartition("my_topic", 0, 0)
-
- // Then
- if pc2 != nil || err != ConfigurationError("That topic/partition is already being consumed") {
- t.Fatal("A partition cannot be consumed twice at the same time")
- }
-
- safeClose(t, pc1)
- safeClose(t, c)
- broker0.Close()
-}
-
-// If consumer fails to refresh metadata it keeps retrying with frequency
-// specified by `Config.Consumer.Retry.Backoff`.
-func TestConsumerLeaderRefreshError(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 100)
-
- // Stage 1: my_topic/0 served by broker0
- Logger.Printf(" STAGE 1")
-
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetOldest, 123).
- SetOffset("my_topic", 0, OffsetNewest, 1000),
- "FetchRequest": NewMockFetchResponse(t, 1).
- SetMessage("my_topic", 0, 123, testMsg),
- })
-
- config := NewConfig()
- config.Net.ReadTimeout = 100 * time.Millisecond
- config.Consumer.Retry.Backoff = 200 * time.Millisecond
- config.Consumer.Return.Errors = true
- config.Metadata.Retry.Max = 0
- c, err := NewConsumer([]string{broker0.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- pc, err := c.ConsumePartition("my_topic", 0, OffsetOldest)
- if err != nil {
- t.Fatal(err)
- }
-
- assertMessageOffset(t, <-pc.Messages(), 123)
-
- // Stage 2: broker0 says that it is no longer the leader for my_topic/0,
- // but the requests to retrieve metadata fail with network timeout.
- Logger.Printf(" STAGE 2")
-
- fetchResponse2 := &FetchResponse{}
- fetchResponse2.AddError("my_topic", 0, ErrNotLeaderForPartition)
-
- broker0.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": NewMockWrapper(fetchResponse2),
- })
-
- if consErr := <-pc.Errors(); consErr.Err != ErrOutOfBrokers {
- t.Errorf("Unexpected error: %v", consErr.Err)
- }
-
- // Stage 3: finally the metadata returned by broker0 tells that broker1 is
- // a new leader for my_topic/0. Consumption resumes.
-
- Logger.Printf(" STAGE 3")
-
- broker1 := NewMockBroker(t, 101)
-
- broker1.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": NewMockFetchResponse(t, 1).
- SetMessage("my_topic", 0, 124, testMsg),
- })
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetBroker(broker1.Addr(), broker1.BrokerID()).
- SetLeader("my_topic", 0, broker1.BrokerID()),
- })
-
- assertMessageOffset(t, <-pc.Messages(), 124)
-
- safeClose(t, pc)
- safeClose(t, c)
- broker1.Close()
- broker0.Close()
-}
-
-func TestConsumerInvalidTopic(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 100)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()),
- })
-
- c, err := NewConsumer([]string{broker0.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- // When
- pc, err := c.ConsumePartition("my_topic", 0, OffsetOldest)
-
- // Then
- if pc != nil || err != ErrUnknownTopicOrPartition {
- t.Errorf("Should fail with, err=%v", err)
- }
-
- safeClose(t, c)
- broker0.Close()
-}
-
-// Nothing bad happens if a partition consumer that has no leader assigned at
-// the moment is closed.
-func TestConsumerClosePartitionWithoutLeader(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 100)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetOldest, 123).
- SetOffset("my_topic", 0, OffsetNewest, 1000),
- "FetchRequest": NewMockFetchResponse(t, 1).
- SetMessage("my_topic", 0, 123, testMsg),
- })
-
- config := NewConfig()
- config.Net.ReadTimeout = 100 * time.Millisecond
- config.Consumer.Retry.Backoff = 100 * time.Millisecond
- config.Consumer.Return.Errors = true
- config.Metadata.Retry.Max = 0
- c, err := NewConsumer([]string{broker0.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- pc, err := c.ConsumePartition("my_topic", 0, OffsetOldest)
- if err != nil {
- t.Fatal(err)
- }
-
- assertMessageOffset(t, <-pc.Messages(), 123)
-
- // broker0 says that it is no longer the leader for my_topic/0, but the
- // requests to retrieve metadata fail with network timeout.
- fetchResponse2 := &FetchResponse{}
- fetchResponse2.AddError("my_topic", 0, ErrNotLeaderForPartition)
-
- broker0.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": NewMockWrapper(fetchResponse2),
- })
-
- // When
- if consErr := <-pc.Errors(); consErr.Err != ErrOutOfBrokers {
- t.Errorf("Unexpected error: %v", consErr.Err)
- }
-
- // Then: the partition consumer can be closed without any problem.
- safeClose(t, pc)
- safeClose(t, c)
- broker0.Close()
-}
-
-// If the initial offset passed on partition consumer creation is out of the
-// actual offset range for the partition, then the partition consumer stops
-// immediately closing its output channels.
-func TestConsumerShutsDownOutOfRange(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 0)
- fetchResponse := new(FetchResponse)
- fetchResponse.AddError("my_topic", 0, ErrOffsetOutOfRange)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetNewest, 1234).
- SetOffset("my_topic", 0, OffsetOldest, 7),
- "FetchRequest": NewMockWrapper(fetchResponse),
- })
-
- master, err := NewConsumer([]string{broker0.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- // When
- consumer, err := master.ConsumePartition("my_topic", 0, 101)
- if err != nil {
- t.Fatal(err)
- }
-
- // Then: consumer should shut down closing its messages and errors channels.
- if _, ok := <-consumer.Messages(); ok {
- t.Error("Expected the consumer to shut down")
- }
- safeClose(t, consumer)
-
- safeClose(t, master)
- broker0.Close()
-}
-
-// If a fetch response contains messages with offsets that are smaller then
-// requested, then such messages are ignored.
-func TestConsumerExtraOffsets(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 0)
- fetchResponse1 := &FetchResponse{}
- fetchResponse1.AddMessage("my_topic", 0, nil, testMsg, 1)
- fetchResponse1.AddMessage("my_topic", 0, nil, testMsg, 2)
- fetchResponse1.AddMessage("my_topic", 0, nil, testMsg, 3)
- fetchResponse1.AddMessage("my_topic", 0, nil, testMsg, 4)
- fetchResponse2 := &FetchResponse{}
- fetchResponse2.AddError("my_topic", 0, ErrNoError)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetNewest, 1234).
- SetOffset("my_topic", 0, OffsetOldest, 0),
- "FetchRequest": NewMockSequence(fetchResponse1, fetchResponse2),
- })
-
- master, err := NewConsumer([]string{broker0.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- // When
- consumer, err := master.ConsumePartition("my_topic", 0, 3)
- if err != nil {
- t.Fatal(err)
- }
-
- // Then: messages with offsets 1 and 2 are not returned even though they
- // are present in the response.
- assertMessageOffset(t, <-consumer.Messages(), 3)
- assertMessageOffset(t, <-consumer.Messages(), 4)
-
- safeClose(t, consumer)
- safeClose(t, master)
- broker0.Close()
-}
-
-// It is fine if offsets of fetched messages are not sequential (although
-// strictly increasing!).
-func TestConsumerNonSequentialOffsets(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 0)
- fetchResponse1 := &FetchResponse{}
- fetchResponse1.AddMessage("my_topic", 0, nil, testMsg, 5)
- fetchResponse1.AddMessage("my_topic", 0, nil, testMsg, 7)
- fetchResponse1.AddMessage("my_topic", 0, nil, testMsg, 11)
- fetchResponse2 := &FetchResponse{}
- fetchResponse2.AddError("my_topic", 0, ErrNoError)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetNewest, 1234).
- SetOffset("my_topic", 0, OffsetOldest, 0),
- "FetchRequest": NewMockSequence(fetchResponse1, fetchResponse2),
- })
-
- master, err := NewConsumer([]string{broker0.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- // When
- consumer, err := master.ConsumePartition("my_topic", 0, 3)
- if err != nil {
- t.Fatal(err)
- }
-
- // Then: messages with offsets 1 and 2 are not returned even though they
- // are present in the response.
- assertMessageOffset(t, <-consumer.Messages(), 5)
- assertMessageOffset(t, <-consumer.Messages(), 7)
- assertMessageOffset(t, <-consumer.Messages(), 11)
-
- safeClose(t, consumer)
- safeClose(t, master)
- broker0.Close()
-}
-
-// If leadership for a partition is changing then consumer resolves the new
-// leader and switches to it.
-func TestConsumerRebalancingMultiplePartitions(t *testing.T) {
- // initial setup
- seedBroker := NewMockBroker(t, 10)
- leader0 := NewMockBroker(t, 0)
- leader1 := NewMockBroker(t, 1)
-
- seedBroker.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(leader0.Addr(), leader0.BrokerID()).
- SetBroker(leader1.Addr(), leader1.BrokerID()).
- SetLeader("my_topic", 0, leader0.BrokerID()).
- SetLeader("my_topic", 1, leader1.BrokerID()),
- })
-
- mockOffsetResponse1 := NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetOldest, 0).
- SetOffset("my_topic", 0, OffsetNewest, 1000).
- SetOffset("my_topic", 1, OffsetOldest, 0).
- SetOffset("my_topic", 1, OffsetNewest, 1000)
- leader0.SetHandlerByMap(map[string]MockResponse{
- "OffsetRequest": mockOffsetResponse1,
- "FetchRequest": NewMockFetchResponse(t, 1),
- })
- leader1.SetHandlerByMap(map[string]MockResponse{
- "OffsetRequest": mockOffsetResponse1,
- "FetchRequest": NewMockFetchResponse(t, 1),
- })
-
- // launch test goroutines
- config := NewConfig()
- config.Consumer.Retry.Backoff = 50
- master, err := NewConsumer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- // we expect to end up (eventually) consuming exactly ten messages on each partition
- var wg sync.WaitGroup
- for i := int32(0); i < 2; i++ {
- consumer, err := master.ConsumePartition("my_topic", i, 0)
- if err != nil {
- t.Error(err)
- }
-
- go func(c PartitionConsumer) {
- for err := range c.Errors() {
- t.Error(err)
- }
- }(consumer)
-
- wg.Add(1)
- go func(partition int32, c PartitionConsumer) {
- for i := 0; i < 10; i++ {
- message := <-consumer.Messages()
- if message.Offset != int64(i) {
- t.Error("Incorrect message offset!", i, partition, message.Offset)
- }
- if message.Partition != partition {
- t.Error("Incorrect message partition!")
- }
- }
- safeClose(t, consumer)
- wg.Done()
- }(i, consumer)
- }
-
- time.Sleep(50 * time.Millisecond)
- Logger.Printf(" STAGE 1")
- // Stage 1:
- // * my_topic/0 -> leader0 serves 4 messages
- // * my_topic/1 -> leader1 serves 0 messages
-
- mockFetchResponse := NewMockFetchResponse(t, 1)
- for i := 0; i < 4; i++ {
- mockFetchResponse.SetMessage("my_topic", 0, int64(i), testMsg)
- }
- leader0.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": mockFetchResponse,
- })
-
- time.Sleep(50 * time.Millisecond)
- Logger.Printf(" STAGE 2")
- // Stage 2:
- // * leader0 says that it is no longer serving my_topic/0
- // * seedBroker tells that leader1 is serving my_topic/0 now
-
- // seed broker tells that the new partition 0 leader is leader1
- seedBroker.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetLeader("my_topic", 0, leader1.BrokerID()).
- SetLeader("my_topic", 1, leader1.BrokerID()),
- })
-
- // leader0 says no longer leader of partition 0
- fetchResponse := new(FetchResponse)
- fetchResponse.AddError("my_topic", 0, ErrNotLeaderForPartition)
- leader0.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": NewMockWrapper(fetchResponse),
- })
-
- time.Sleep(50 * time.Millisecond)
- Logger.Printf(" STAGE 3")
- // Stage 3:
- // * my_topic/0 -> leader1 serves 3 messages
- // * my_topic/1 -> leader1 server 8 messages
-
- // leader1 provides 3 message on partition 0, and 8 messages on partition 1
- mockFetchResponse2 := NewMockFetchResponse(t, 2)
- for i := 4; i < 7; i++ {
- mockFetchResponse2.SetMessage("my_topic", 0, int64(i), testMsg)
- }
- for i := 0; i < 8; i++ {
- mockFetchResponse2.SetMessage("my_topic", 1, int64(i), testMsg)
- }
- leader1.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": mockFetchResponse2,
- })
-
- time.Sleep(50 * time.Millisecond)
- Logger.Printf(" STAGE 4")
- // Stage 4:
- // * my_topic/0 -> leader1 serves 3 messages
- // * my_topic/1 -> leader1 tells that it is no longer the leader
- // * seedBroker tells that leader0 is a new leader for my_topic/1
-
- // metadata assigns 0 to leader1 and 1 to leader0
- seedBroker.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetLeader("my_topic", 0, leader1.BrokerID()).
- SetLeader("my_topic", 1, leader0.BrokerID()),
- })
-
- // leader1 provides three more messages on partition0, says no longer leader of partition1
- mockFetchResponse3 := NewMockFetchResponse(t, 3).
- SetMessage("my_topic", 0, int64(7), testMsg).
- SetMessage("my_topic", 0, int64(8), testMsg).
- SetMessage("my_topic", 0, int64(9), testMsg)
- fetchResponse4 := new(FetchResponse)
- fetchResponse4.AddError("my_topic", 1, ErrNotLeaderForPartition)
- leader1.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": NewMockSequence(mockFetchResponse3, fetchResponse4),
- })
-
- // leader0 provides two messages on partition 1
- mockFetchResponse4 := NewMockFetchResponse(t, 2)
- for i := 8; i < 10; i++ {
- mockFetchResponse4.SetMessage("my_topic", 1, int64(i), testMsg)
- }
- leader0.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": mockFetchResponse4,
- })
-
- wg.Wait()
- safeClose(t, master)
- leader1.Close()
- leader0.Close()
- seedBroker.Close()
-}
-
-// When two partitions have the same broker as the leader, if one partition
-// consumer channel buffer is full then that does not affect the ability to
-// read messages by the other consumer.
-func TestConsumerInterleavedClose(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 0)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()).
- SetLeader("my_topic", 1, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetOldest, 1000).
- SetOffset("my_topic", 0, OffsetNewest, 1100).
- SetOffset("my_topic", 1, OffsetOldest, 2000).
- SetOffset("my_topic", 1, OffsetNewest, 2100),
- "FetchRequest": NewMockFetchResponse(t, 1).
- SetMessage("my_topic", 0, 1000, testMsg).
- SetMessage("my_topic", 0, 1001, testMsg).
- SetMessage("my_topic", 0, 1002, testMsg).
- SetMessage("my_topic", 1, 2000, testMsg),
- })
-
- config := NewConfig()
- config.ChannelBufferSize = 0
- master, err := NewConsumer([]string{broker0.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- c0, err := master.ConsumePartition("my_topic", 0, 1000)
- if err != nil {
- t.Fatal(err)
- }
-
- c1, err := master.ConsumePartition("my_topic", 1, 2000)
- if err != nil {
- t.Fatal(err)
- }
-
- // When/Then: we can read from partition 0 even if nobody reads from partition 1
- assertMessageOffset(t, <-c0.Messages(), 1000)
- assertMessageOffset(t, <-c0.Messages(), 1001)
- assertMessageOffset(t, <-c0.Messages(), 1002)
-
- safeClose(t, c1)
- safeClose(t, c0)
- safeClose(t, master)
- broker0.Close()
-}
-
-func TestConsumerBounceWithReferenceOpen(t *testing.T) {
- broker0 := NewMockBroker(t, 0)
- broker0Addr := broker0.Addr()
- broker1 := NewMockBroker(t, 1)
-
- mockMetadataResponse := NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetBroker(broker1.Addr(), broker1.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()).
- SetLeader("my_topic", 1, broker1.BrokerID())
-
- mockOffsetResponse := NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetOldest, 1000).
- SetOffset("my_topic", 0, OffsetNewest, 1100).
- SetOffset("my_topic", 1, OffsetOldest, 2000).
- SetOffset("my_topic", 1, OffsetNewest, 2100)
-
- mockFetchResponse := NewMockFetchResponse(t, 1)
- for i := 0; i < 10; i++ {
- mockFetchResponse.SetMessage("my_topic", 0, int64(1000+i), testMsg)
- mockFetchResponse.SetMessage("my_topic", 1, int64(2000+i), testMsg)
- }
-
- broker0.SetHandlerByMap(map[string]MockResponse{
- "OffsetRequest": mockOffsetResponse,
- "FetchRequest": mockFetchResponse,
- })
- broker1.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": mockMetadataResponse,
- "OffsetRequest": mockOffsetResponse,
- "FetchRequest": mockFetchResponse,
- })
-
- config := NewConfig()
- config.Consumer.Return.Errors = true
- config.Consumer.Retry.Backoff = 100 * time.Millisecond
- config.ChannelBufferSize = 1
- master, err := NewConsumer([]string{broker1.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- c0, err := master.ConsumePartition("my_topic", 0, 1000)
- if err != nil {
- t.Fatal(err)
- }
-
- c1, err := master.ConsumePartition("my_topic", 1, 2000)
- if err != nil {
- t.Fatal(err)
- }
-
- // read messages from both partition to make sure that both brokers operate
- // normally.
- assertMessageOffset(t, <-c0.Messages(), 1000)
- assertMessageOffset(t, <-c1.Messages(), 2000)
-
- // Simulate broker shutdown. Note that metadata response does not change,
- // that is the leadership does not move to another broker. So partition
- // consumer will keep retrying to restore the connection with the broker.
- broker0.Close()
-
- // Make sure that while the partition/0 leader is down, consumer/partition/1
- // is capable of pulling messages from broker1.
- for i := 1; i < 7; i++ {
- offset := (<-c1.Messages()).Offset
- if offset != int64(2000+i) {
- t.Errorf("Expected offset %d from consumer/partition/1", int64(2000+i))
- }
- }
-
- // Bring broker0 back to service.
- broker0 = NewMockBrokerAddr(t, 0, broker0Addr)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "FetchRequest": mockFetchResponse,
- })
-
- // Read the rest of messages from both partitions.
- for i := 7; i < 10; i++ {
- assertMessageOffset(t, <-c1.Messages(), int64(2000+i))
- }
- for i := 1; i < 10; i++ {
- assertMessageOffset(t, <-c0.Messages(), int64(1000+i))
- }
-
- select {
- case <-c0.Errors():
- default:
- t.Errorf("Partition consumer should have detected broker restart")
- }
-
- safeClose(t, c1)
- safeClose(t, c0)
- safeClose(t, master)
- broker0.Close()
- broker1.Close()
-}
-
-func TestConsumerOffsetOutOfRange(t *testing.T) {
- // Given
- broker0 := NewMockBroker(t, 2)
- broker0.SetHandlerByMap(map[string]MockResponse{
- "MetadataRequest": NewMockMetadataResponse(t).
- SetBroker(broker0.Addr(), broker0.BrokerID()).
- SetLeader("my_topic", 0, broker0.BrokerID()),
- "OffsetRequest": NewMockOffsetResponse(t).
- SetOffset("my_topic", 0, OffsetNewest, 1234).
- SetOffset("my_topic", 0, OffsetOldest, 2345),
- })
-
- master, err := NewConsumer([]string{broker0.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- // When/Then
- if _, err := master.ConsumePartition("my_topic", 0, 0); err != ErrOffsetOutOfRange {
- t.Fatal("Should return ErrOffsetOutOfRange, got:", err)
- }
- if _, err := master.ConsumePartition("my_topic", 0, 3456); err != ErrOffsetOutOfRange {
- t.Fatal("Should return ErrOffsetOutOfRange, got:", err)
- }
- if _, err := master.ConsumePartition("my_topic", 0, -3); err != ErrOffsetOutOfRange {
- t.Fatal("Should return ErrOffsetOutOfRange, got:", err)
- }
-
- safeClose(t, master)
- broker0.Close()
-}
-
-func assertMessageOffset(t *testing.T, msg *ConsumerMessage, expectedOffset int64) {
- if msg.Offset != expectedOffset {
- t.Errorf("Incorrect message offset: expected=%d, actual=%d", expectedOffset, msg.Offset)
- }
-}
-
-// This example shows how to use the consumer to read messages
-// from a single partition.
-func ExampleConsumer() {
- consumer, err := NewConsumer([]string{"localhost:9092"}, nil)
- if err != nil {
- panic(err)
- }
-
- defer func() {
- if err := consumer.Close(); err != nil {
- log.Fatalln(err)
- }
- }()
-
- partitionConsumer, err := consumer.ConsumePartition("my_topic", 0, OffsetNewest)
- if err != nil {
- panic(err)
- }
-
- defer func() {
- if err := partitionConsumer.Close(); err != nil {
- log.Fatalln(err)
- }
- }()
-
- // Trap SIGINT to trigger a shutdown.
- signals := make(chan os.Signal, 1)
- signal.Notify(signals, os.Interrupt)
-
- consumed := 0
-ConsumerLoop:
- for {
- select {
- case msg := <-partitionConsumer.Messages():
- log.Printf("Consumed message offset %d\n", msg.Offset)
- consumed++
- case <-signals:
- break ConsumerLoop
- }
- }
-
- log.Printf("Consumed: %d\n", consumed)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/crc32_field.go b/vendor/src/github.com/Shopify/sarama/crc32_field.go
deleted file mode 100644
index 5c2860790..000000000
--- a/vendor/src/github.com/Shopify/sarama/crc32_field.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package sarama
-
-import (
- "encoding/binary"
-
- "github.com/klauspost/crc32"
-)
-
-// crc32Field implements the pushEncoder and pushDecoder interfaces for calculating CRC32s.
-type crc32Field struct {
- startOffset int
-}
-
-func (c *crc32Field) saveOffset(in int) {
- c.startOffset = in
-}
-
-func (c *crc32Field) reserveLength() int {
- return 4
-}
-
-func (c *crc32Field) run(curOffset int, buf []byte) error {
- crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
- binary.BigEndian.PutUint32(buf[c.startOffset:], crc)
- return nil
-}
-
-func (c *crc32Field) check(curOffset int, buf []byte) error {
- crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
-
- if crc != binary.BigEndian.Uint32(buf[c.startOffset:]) {
- return PacketDecodingError{"CRC didn't match"}
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/describe_groups_request.go b/vendor/src/github.com/Shopify/sarama/describe_groups_request.go
deleted file mode 100644
index 1fb356777..000000000
--- a/vendor/src/github.com/Shopify/sarama/describe_groups_request.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package sarama
-
-type DescribeGroupsRequest struct {
- Groups []string
-}
-
-func (r *DescribeGroupsRequest) encode(pe packetEncoder) error {
- return pe.putStringArray(r.Groups)
-}
-
-func (r *DescribeGroupsRequest) decode(pd packetDecoder, version int16) (err error) {
- r.Groups, err = pd.getStringArray()
- return
-}
-
-func (r *DescribeGroupsRequest) key() int16 {
- return 15
-}
-
-func (r *DescribeGroupsRequest) version() int16 {
- return 0
-}
-
-func (r *DescribeGroupsRequest) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
-
-func (r *DescribeGroupsRequest) AddGroup(group string) {
- r.Groups = append(r.Groups, group)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/describe_groups_request_test.go b/vendor/src/github.com/Shopify/sarama/describe_groups_request_test.go
deleted file mode 100644
index 7d45f3fee..000000000
--- a/vendor/src/github.com/Shopify/sarama/describe_groups_request_test.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- emptyDescribeGroupsRequest = []byte{0, 0, 0, 0}
-
- singleDescribeGroupsRequest = []byte{
- 0, 0, 0, 1, // 1 group
- 0, 3, 'f', 'o', 'o', // group name: foo
- }
-
- doubleDescribeGroupsRequest = []byte{
- 0, 0, 0, 2, // 2 groups
- 0, 3, 'f', 'o', 'o', // group name: foo
- 0, 3, 'b', 'a', 'r', // group name: foo
- }
-)
-
-func TestDescribeGroupsRequest(t *testing.T) {
- var request *DescribeGroupsRequest
-
- request = new(DescribeGroupsRequest)
- testRequest(t, "no groups", request, emptyDescribeGroupsRequest)
-
- request = new(DescribeGroupsRequest)
- request.AddGroup("foo")
- testRequest(t, "one group", request, singleDescribeGroupsRequest)
-
- request = new(DescribeGroupsRequest)
- request.AddGroup("foo")
- request.AddGroup("bar")
- testRequest(t, "two groups", request, doubleDescribeGroupsRequest)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/describe_groups_response.go b/vendor/src/github.com/Shopify/sarama/describe_groups_response.go
deleted file mode 100644
index d2c2071e1..000000000
--- a/vendor/src/github.com/Shopify/sarama/describe_groups_response.go
+++ /dev/null
@@ -1,186 +0,0 @@
-package sarama
-
-type DescribeGroupsResponse struct {
- Groups []*GroupDescription
-}
-
-func (r *DescribeGroupsResponse) encode(pe packetEncoder) error {
- if err := pe.putArrayLength(len(r.Groups)); err != nil {
- return err
- }
-
- for _, groupDescription := range r.Groups {
- if err := groupDescription.encode(pe); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *DescribeGroupsResponse) decode(pd packetDecoder, version int16) (err error) {
- n, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Groups = make([]*GroupDescription, n)
- for i := 0; i < n; i++ {
- r.Groups[i] = new(GroupDescription)
- if err := r.Groups[i].decode(pd); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *DescribeGroupsResponse) key() int16 {
- return 15
-}
-
-func (r *DescribeGroupsResponse) version() int16 {
- return 0
-}
-
-func (r *DescribeGroupsResponse) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
-
-type GroupDescription struct {
- Err KError
- GroupId string
- State string
- ProtocolType string
- Protocol string
- Members map[string]*GroupMemberDescription
-}
-
-func (gd *GroupDescription) encode(pe packetEncoder) error {
- pe.putInt16(int16(gd.Err))
-
- if err := pe.putString(gd.GroupId); err != nil {
- return err
- }
- if err := pe.putString(gd.State); err != nil {
- return err
- }
- if err := pe.putString(gd.ProtocolType); err != nil {
- return err
- }
- if err := pe.putString(gd.Protocol); err != nil {
- return err
- }
-
- if err := pe.putArrayLength(len(gd.Members)); err != nil {
- return err
- }
-
- for memberId, groupMemberDescription := range gd.Members {
- if err := pe.putString(memberId); err != nil {
- return err
- }
- if err := groupMemberDescription.encode(pe); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (gd *GroupDescription) decode(pd packetDecoder) (err error) {
- if kerr, err := pd.getInt16(); err != nil {
- return err
- } else {
- gd.Err = KError(kerr)
- }
-
- if gd.GroupId, err = pd.getString(); err != nil {
- return
- }
- if gd.State, err = pd.getString(); err != nil {
- return
- }
- if gd.ProtocolType, err = pd.getString(); err != nil {
- return
- }
- if gd.Protocol, err = pd.getString(); err != nil {
- return
- }
-
- n, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if n == 0 {
- return nil
- }
-
- gd.Members = make(map[string]*GroupMemberDescription)
- for i := 0; i < n; i++ {
- memberId, err := pd.getString()
- if err != nil {
- return err
- }
-
- gd.Members[memberId] = new(GroupMemberDescription)
- if err := gd.Members[memberId].decode(pd); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-type GroupMemberDescription struct {
- ClientId string
- ClientHost string
- MemberMetadata []byte
- MemberAssignment []byte
-}
-
-func (gmd *GroupMemberDescription) encode(pe packetEncoder) error {
- if err := pe.putString(gmd.ClientId); err != nil {
- return err
- }
- if err := pe.putString(gmd.ClientHost); err != nil {
- return err
- }
- if err := pe.putBytes(gmd.MemberMetadata); err != nil {
- return err
- }
- if err := pe.putBytes(gmd.MemberAssignment); err != nil {
- return err
- }
-
- return nil
-}
-
-func (gmd *GroupMemberDescription) decode(pd packetDecoder) (err error) {
- if gmd.ClientId, err = pd.getString(); err != nil {
- return
- }
- if gmd.ClientHost, err = pd.getString(); err != nil {
- return
- }
- if gmd.MemberMetadata, err = pd.getBytes(); err != nil {
- return
- }
- if gmd.MemberAssignment, err = pd.getBytes(); err != nil {
- return
- }
-
- return nil
-}
-
-func (gmd *GroupMemberDescription) GetMemberAssignment() (*ConsumerGroupMemberAssignment, error) {
- assignment := new(ConsumerGroupMemberAssignment)
- err := decode(gmd.MemberAssignment, assignment)
- return assignment, err
-}
-
-func (gmd *GroupMemberDescription) GetMemberMetadata() (*ConsumerGroupMemberMetadata, error) {
- metadata := new(ConsumerGroupMemberMetadata)
- err := decode(gmd.MemberMetadata, metadata)
- return metadata, err
-}
diff --git a/vendor/src/github.com/Shopify/sarama/describe_groups_response_test.go b/vendor/src/github.com/Shopify/sarama/describe_groups_response_test.go
deleted file mode 100644
index dd3973191..000000000
--- a/vendor/src/github.com/Shopify/sarama/describe_groups_response_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package sarama
-
-import (
- "reflect"
- "testing"
-)
-
-var (
- describeGroupsResponseEmpty = []byte{
- 0, 0, 0, 0, // no groups
- }
-
- describeGroupsResponsePopulated = []byte{
- 0, 0, 0, 2, // 2 groups
-
- 0, 0, // no error
- 0, 3, 'f', 'o', 'o', // Group ID
- 0, 3, 'b', 'a', 'r', // State
- 0, 8, 'c', 'o', 'n', 's', 'u', 'm', 'e', 'r', // ConsumerProtocol type
- 0, 3, 'b', 'a', 'z', // Protocol name
- 0, 0, 0, 1, // 1 member
- 0, 2, 'i', 'd', // Member ID
- 0, 6, 's', 'a', 'r', 'a', 'm', 'a', // Client ID
- 0, 9, 'l', 'o', 'c', 'a', 'l', 'h', 'o', 's', 't', // Client Host
- 0, 0, 0, 3, 0x01, 0x02, 0x03, // MemberMetadata
- 0, 0, 0, 3, 0x04, 0x05, 0x06, // MemberAssignment
-
- 0, 30, // ErrGroupAuthorizationFailed
- 0, 0,
- 0, 0,
- 0, 0,
- 0, 0,
- 0, 0, 0, 0,
- }
-)
-
-func TestDescribeGroupsResponse(t *testing.T) {
- var response *DescribeGroupsResponse
-
- response = new(DescribeGroupsResponse)
- testVersionDecodable(t, "empty", response, describeGroupsResponseEmpty, 0)
- if len(response.Groups) != 0 {
- t.Error("Expected no groups")
- }
-
- response = new(DescribeGroupsResponse)
- testVersionDecodable(t, "populated", response, describeGroupsResponsePopulated, 0)
- if len(response.Groups) != 2 {
- t.Error("Expected two groups")
- }
-
- group0 := response.Groups[0]
- if group0.Err != ErrNoError {
- t.Error("Unxpected groups[0].Err, found", group0.Err)
- }
- if group0.GroupId != "foo" {
- t.Error("Unxpected groups[0].GroupId, found", group0.GroupId)
- }
- if group0.State != "bar" {
- t.Error("Unxpected groups[0].State, found", group0.State)
- }
- if group0.ProtocolType != "consumer" {
- t.Error("Unxpected groups[0].ProtocolType, found", group0.ProtocolType)
- }
- if group0.Protocol != "baz" {
- t.Error("Unxpected groups[0].Protocol, found", group0.Protocol)
- }
- if len(group0.Members) != 1 {
- t.Error("Unxpected groups[0].Members, found", group0.Members)
- }
- if group0.Members["id"].ClientId != "sarama" {
- t.Error("Unxpected groups[0].Members[id].ClientId, found", group0.Members["id"].ClientId)
- }
- if group0.Members["id"].ClientHost != "localhost" {
- t.Error("Unxpected groups[0].Members[id].ClientHost, found", group0.Members["id"].ClientHost)
- }
- if !reflect.DeepEqual(group0.Members["id"].MemberMetadata, []byte{0x01, 0x02, 0x03}) {
- t.Error("Unxpected groups[0].Members[id].MemberMetadata, found", group0.Members["id"].MemberMetadata)
- }
- if !reflect.DeepEqual(group0.Members["id"].MemberAssignment, []byte{0x04, 0x05, 0x06}) {
- t.Error("Unxpected groups[0].Members[id].MemberAssignment, found", group0.Members["id"].MemberAssignment)
- }
-
- group1 := response.Groups[1]
- if group1.Err != ErrGroupAuthorizationFailed {
- t.Error("Unxpected groups[1].Err, found", group0.Err)
- }
- if len(group1.Members) != 0 {
- t.Error("Unxpected groups[1].Members, found", group0.Members)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/dev.yml b/vendor/src/github.com/Shopify/sarama/dev.yml
deleted file mode 100644
index e014316fe..000000000
--- a/vendor/src/github.com/Shopify/sarama/dev.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-name: sarama
-
-up:
- - go: 1.7.3
-
-commands:
- test:
- run: make test
- desc: 'run unit tests'
-
-packages:
- - git@github.com:Shopify/dev-shopify.git
-
diff --git a/vendor/src/github.com/Shopify/sarama/encoder_decoder.go b/vendor/src/github.com/Shopify/sarama/encoder_decoder.go
deleted file mode 100644
index 7ce3bc0f6..000000000
--- a/vendor/src/github.com/Shopify/sarama/encoder_decoder.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package sarama
-
-import (
- "fmt"
-
- "github.com/rcrowley/go-metrics"
-)
-
-// Encoder is the interface that wraps the basic Encode method.
-// Anything implementing Encoder can be turned into bytes using Kafka's encoding rules.
-type encoder interface {
- encode(pe packetEncoder) error
-}
-
-// Encode takes an Encoder and turns it into bytes while potentially recording metrics.
-func encode(e encoder, metricRegistry metrics.Registry) ([]byte, error) {
- if e == nil {
- return nil, nil
- }
-
- var prepEnc prepEncoder
- var realEnc realEncoder
-
- err := e.encode(&prepEnc)
- if err != nil {
- return nil, err
- }
-
- if prepEnc.length < 0 || prepEnc.length > int(MaxRequestSize) {
- return nil, PacketEncodingError{fmt.Sprintf("invalid request size (%d)", prepEnc.length)}
- }
-
- realEnc.raw = make([]byte, prepEnc.length)
- realEnc.registry = metricRegistry
- err = e.encode(&realEnc)
- if err != nil {
- return nil, err
- }
-
- return realEnc.raw, nil
-}
-
-// Decoder is the interface that wraps the basic Decode method.
-// Anything implementing Decoder can be extracted from bytes using Kafka's encoding rules.
-type decoder interface {
- decode(pd packetDecoder) error
-}
-
-type versionedDecoder interface {
- decode(pd packetDecoder, version int16) error
-}
-
-// Decode takes bytes and a Decoder and fills the fields of the decoder from the bytes,
-// interpreted using Kafka's encoding rules.
-func decode(buf []byte, in decoder) error {
- if buf == nil {
- return nil
- }
-
- helper := realDecoder{raw: buf}
- err := in.decode(&helper)
- if err != nil {
- return err
- }
-
- if helper.off != len(buf) {
- return PacketDecodingError{"invalid length"}
- }
-
- return nil
-}
-
-func versionedDecode(buf []byte, in versionedDecoder, version int16) error {
- if buf == nil {
- return nil
- }
-
- helper := realDecoder{raw: buf}
- err := in.decode(&helper, version)
- if err != nil {
- return err
- }
-
- if helper.off != len(buf) {
- return PacketDecodingError{"invalid length"}
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/errors.go b/vendor/src/github.com/Shopify/sarama/errors.go
deleted file mode 100644
index cc3f623d0..000000000
--- a/vendor/src/github.com/Shopify/sarama/errors.go
+++ /dev/null
@@ -1,197 +0,0 @@
-package sarama
-
-import (
- "errors"
- "fmt"
-)
-
-// ErrOutOfBrokers is the error returned when the client has run out of brokers to talk to because all of them errored
-// or otherwise failed to respond.
-var ErrOutOfBrokers = errors.New("kafka: client has run out of available brokers to talk to (Is your cluster reachable?)")
-
-// ErrClosedClient is the error returned when a method is called on a client that has been closed.
-var ErrClosedClient = errors.New("kafka: tried to use a client that was closed")
-
-// ErrIncompleteResponse is the error returned when the server returns a syntactically valid response, but it does
-// not contain the expected information.
-var ErrIncompleteResponse = errors.New("kafka: response did not contain all the expected topic/partition blocks")
-
-// ErrInvalidPartition is the error returned when a partitioner returns an invalid partition index
-// (meaning one outside of the range [0...numPartitions-1]).
-var ErrInvalidPartition = errors.New("kafka: partitioner returned an invalid partition index")
-
-// ErrAlreadyConnected is the error returned when calling Open() on a Broker that is already connected or connecting.
-var ErrAlreadyConnected = errors.New("kafka: broker connection already initiated")
-
-// ErrNotConnected is the error returned when trying to send or call Close() on a Broker that is not connected.
-var ErrNotConnected = errors.New("kafka: broker not connected")
-
-// ErrInsufficientData is returned when decoding and the packet is truncated. This can be expected
-// when requesting messages, since as an optimization the server is allowed to return a partial message at the end
-// of the message set.
-var ErrInsufficientData = errors.New("kafka: insufficient data to decode packet, more bytes expected")
-
-// ErrShuttingDown is returned when a producer receives a message during shutdown.
-var ErrShuttingDown = errors.New("kafka: message received by producer in process of shutting down")
-
-// ErrMessageTooLarge is returned when the next message to consume is larger than the configured Consumer.Fetch.Max
-var ErrMessageTooLarge = errors.New("kafka: message is larger than Consumer.Fetch.Max")
-
-// PacketEncodingError is returned from a failure while encoding a Kafka packet. This can happen, for example,
-// if you try to encode a string over 2^15 characters in length, since Kafka's encoding rules do not permit that.
-type PacketEncodingError struct {
- Info string
-}
-
-func (err PacketEncodingError) Error() string {
- return fmt.Sprintf("kafka: error encoding packet: %s", err.Info)
-}
-
-// PacketDecodingError is returned when there was an error (other than truncated data) decoding the Kafka broker's response.
-// This can be a bad CRC or length field, or any other invalid value.
-type PacketDecodingError struct {
- Info string
-}
-
-func (err PacketDecodingError) Error() string {
- return fmt.Sprintf("kafka: error decoding packet: %s", err.Info)
-}
-
-// ConfigurationError is the type of error returned from a constructor (e.g. NewClient, or NewConsumer)
-// when the specified configuration is invalid.
-type ConfigurationError string
-
-func (err ConfigurationError) Error() string {
- return "kafka: invalid configuration (" + string(err) + ")"
-}
-
-// KError is the type of error that can be returned directly by the Kafka broker.
-// See https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ErrorCodes
-type KError int16
-
-// Numeric error codes returned by the Kafka server.
-const (
- ErrNoError KError = 0
- ErrUnknown KError = -1
- ErrOffsetOutOfRange KError = 1
- ErrInvalidMessage KError = 2
- ErrUnknownTopicOrPartition KError = 3
- ErrInvalidMessageSize KError = 4
- ErrLeaderNotAvailable KError = 5
- ErrNotLeaderForPartition KError = 6
- ErrRequestTimedOut KError = 7
- ErrBrokerNotAvailable KError = 8
- ErrReplicaNotAvailable KError = 9
- ErrMessageSizeTooLarge KError = 10
- ErrStaleControllerEpochCode KError = 11
- ErrOffsetMetadataTooLarge KError = 12
- ErrNetworkException KError = 13
- ErrOffsetsLoadInProgress KError = 14
- ErrConsumerCoordinatorNotAvailable KError = 15
- ErrNotCoordinatorForConsumer KError = 16
- ErrInvalidTopic KError = 17
- ErrMessageSetSizeTooLarge KError = 18
- ErrNotEnoughReplicas KError = 19
- ErrNotEnoughReplicasAfterAppend KError = 20
- ErrInvalidRequiredAcks KError = 21
- ErrIllegalGeneration KError = 22
- ErrInconsistentGroupProtocol KError = 23
- ErrInvalidGroupId KError = 24
- ErrUnknownMemberId KError = 25
- ErrInvalidSessionTimeout KError = 26
- ErrRebalanceInProgress KError = 27
- ErrInvalidCommitOffsetSize KError = 28
- ErrTopicAuthorizationFailed KError = 29
- ErrGroupAuthorizationFailed KError = 30
- ErrClusterAuthorizationFailed KError = 31
- ErrInvalidTimestamp KError = 32
- ErrUnsupportedSASLMechanism KError = 33
- ErrIllegalSASLState KError = 34
- ErrUnsupportedVersion KError = 35
- ErrUnsupportedForMessageFormat KError = 43
-)
-
-func (err KError) Error() string {
- // Error messages stolen/adapted from
- // https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol
- switch err {
- case ErrNoError:
- return "kafka server: Not an error, why are you printing me?"
- case ErrUnknown:
- return "kafka server: Unexpected (unknown?) server error."
- case ErrOffsetOutOfRange:
- return "kafka server: The requested offset is outside the range of offsets maintained by the server for the given topic/partition."
- case ErrInvalidMessage:
- return "kafka server: Message contents does not match its CRC."
- case ErrUnknownTopicOrPartition:
- return "kafka server: Request was for a topic or partition that does not exist on this broker."
- case ErrInvalidMessageSize:
- return "kafka server: The message has a negative size."
- case ErrLeaderNotAvailable:
- return "kafka server: In the middle of a leadership election, there is currently no leader for this partition and hence it is unavailable for writes."
- case ErrNotLeaderForPartition:
- return "kafka server: Tried to send a message to a replica that is not the leader for some partition. Your metadata is out of date."
- case ErrRequestTimedOut:
- return "kafka server: Request exceeded the user-specified time limit in the request."
- case ErrBrokerNotAvailable:
- return "kafka server: Broker not available. Not a client facing error, we should never receive this!!!"
- case ErrReplicaNotAvailable:
- return "kafka server: Replica information not available, one or more brokers are down."
- case ErrMessageSizeTooLarge:
- return "kafka server: Message was too large, server rejected it to avoid allocation error."
- case ErrStaleControllerEpochCode:
- return "kafka server: StaleControllerEpochCode (internal error code for broker-to-broker communication)."
- case ErrOffsetMetadataTooLarge:
- return "kafka server: Specified a string larger than the configured maximum for offset metadata."
- case ErrNetworkException:
- return "kafka server: The server disconnected before a response was received."
- case ErrOffsetsLoadInProgress:
- return "kafka server: The broker is still loading offsets after a leader change for that offset's topic partition."
- case ErrConsumerCoordinatorNotAvailable:
- return "kafka server: Offset's topic has not yet been created."
- case ErrNotCoordinatorForConsumer:
- return "kafka server: Request was for a consumer group that is not coordinated by this broker."
- case ErrInvalidTopic:
- return "kafka server: The request attempted to perform an operation on an invalid topic."
- case ErrMessageSetSizeTooLarge:
- return "kafka server: The request included message batch larger than the configured segment size on the server."
- case ErrNotEnoughReplicas:
- return "kafka server: Messages are rejected since there are fewer in-sync replicas than required."
- case ErrNotEnoughReplicasAfterAppend:
- return "kafka server: Messages are written to the log, but to fewer in-sync replicas than required."
- case ErrInvalidRequiredAcks:
- return "kafka server: The number of required acks is invalid (should be either -1, 0, or 1)."
- case ErrIllegalGeneration:
- return "kafka server: The provided generation id is not the current generation."
- case ErrInconsistentGroupProtocol:
- return "kafka server: The provider group protocol type is incompatible with the other members."
- case ErrInvalidGroupId:
- return "kafka server: The provided group id was empty."
- case ErrUnknownMemberId:
- return "kafka server: The provided member is not known in the current generation."
- case ErrInvalidSessionTimeout:
- return "kafka server: The provided session timeout is outside the allowed range."
- case ErrRebalanceInProgress:
- return "kafka server: A rebalance for the group is in progress. Please re-join the group."
- case ErrInvalidCommitOffsetSize:
- return "kafka server: The provided commit metadata was too large."
- case ErrTopicAuthorizationFailed:
- return "kafka server: The client is not authorized to access this topic."
- case ErrGroupAuthorizationFailed:
- return "kafka server: The client is not authorized to access this group."
- case ErrClusterAuthorizationFailed:
- return "kafka server: The client is not authorized to send this request type."
- case ErrInvalidTimestamp:
- return "kafka server: The timestamp of the message is out of acceptable range."
- case ErrUnsupportedSASLMechanism:
- return "kafka server: The broker does not support the requested SASL mechanism."
- case ErrIllegalSASLState:
- return "kafka server: Request is not valid given the current SASL state."
- case ErrUnsupportedVersion:
- return "kafka server: The version of API is not supported."
- case ErrUnsupportedForMessageFormat:
- return "kafka server: The requested operation is not supported by the message format version."
- }
-
- return fmt.Sprintf("Unknown error, how did this happen? Error code = %d", err)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/examples/README.md b/vendor/src/github.com/Shopify/sarama/examples/README.md
deleted file mode 100644
index b6588051e..000000000
--- a/vendor/src/github.com/Shopify/sarama/examples/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Sarama examples
-
-This folder contains example applications to demonstrate the use of Sarama. For code snippet examples on how to use the different types in Sarama, see [Sarams's API documentation on godoc.org](https://godoc.org/github.com/Shopify/sarama)
-
-In these examples, we use `github.com/Shopify/sarama` as import path. We do this to ensure all the examples are up to date with the latest changes in Sarama. For your own applications, you may want to use `gopkg.in/Shopify/sarama.v1` to lock into a stable API version.
-
-#### HTTP server
-
-[http_server](./http_server) is a simple HTTP server uses both the sync producer to produce data as part of the request handling cycle, as well as the async producer to maintain an access log. It also uses the [mocks subpackage](https://godoc.org/github.com/Shopify/sarama/mocks) to test both.
diff --git a/vendor/src/github.com/Shopify/sarama/examples/http_server/README.md b/vendor/src/github.com/Shopify/sarama/examples/http_server/README.md
deleted file mode 100644
index 5ff2bc253..000000000
--- a/vendor/src/github.com/Shopify/sarama/examples/http_server/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# HTTP server example
-
-This HTTP server example shows you how to use the AsyncProducer and SyncProducer, and how to test them using mocks. The server simply sends the data of the HTTP request's query string to Kafka, and send a 200 result if that succeeds. For every request, it will send an access log entry to Kafka as well in the background.
-
-If you need to know whether a message was successfully sent to the Kafka cluster before you can send your HTTP response, using the `SyncProducer` is probably the simplest way to achieve this. If you don't care, e.g. for the access log, using the `AsyncProducer` will let you fire and forget. You can send the HTTP response, while the message is being produced in the background.
-
-One important thing to note is that both the `SyncProducer` and `AsyncProducer` are **thread-safe**. Go's `http.Server` handles requests concurrently in different goroutines, but you can use a single producer safely. This will actually achieve efficiency gains as the producer will be able to batch messages from concurrent requests together.
diff --git a/vendor/src/github.com/Shopify/sarama/examples/http_server/http_server.go b/vendor/src/github.com/Shopify/sarama/examples/http_server/http_server.go
deleted file mode 100644
index b6d83c5dc..000000000
--- a/vendor/src/github.com/Shopify/sarama/examples/http_server/http_server.go
+++ /dev/null
@@ -1,247 +0,0 @@
-package main
-
-import (
- "github.com/Shopify/sarama"
-
- "crypto/tls"
- "crypto/x509"
- "encoding/json"
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "net/http"
- "os"
- "strings"
- "time"
-)
-
-var (
- addr = flag.String("addr", ":8080", "The address to bind to")
- brokers = flag.String("brokers", os.Getenv("KAFKA_PEERS"), "The Kafka brokers to connect to, as a comma separated list")
- verbose = flag.Bool("verbose", false, "Turn on Sarama logging")
- certFile = flag.String("certificate", "", "The optional certificate file for client authentication")
- keyFile = flag.String("key", "", "The optional key file for client authentication")
- caFile = flag.String("ca", "", "The optional certificate authority file for TLS client authentication")
- verifySsl = flag.Bool("verify", false, "Optional verify ssl certificates chain")
-)
-
-func main() {
- flag.Parse()
-
- if *verbose {
- sarama.Logger = log.New(os.Stdout, "[sarama] ", log.LstdFlags)
- }
-
- if *brokers == "" {
- flag.PrintDefaults()
- os.Exit(1)
- }
-
- brokerList := strings.Split(*brokers, ",")
- log.Printf("Kafka brokers: %s", strings.Join(brokerList, ", "))
-
- server := &Server{
- DataCollector: newDataCollector(brokerList),
- AccessLogProducer: newAccessLogProducer(brokerList),
- }
- defer func() {
- if err := server.Close(); err != nil {
- log.Println("Failed to close server", err)
- }
- }()
-
- log.Fatal(server.Run(*addr))
-}
-
-func createTlsConfiguration() (t *tls.Config) {
- if *certFile != "" && *keyFile != "" && *caFile != "" {
- cert, err := tls.LoadX509KeyPair(*certFile, *keyFile)
- if err != nil {
- log.Fatal(err)
- }
-
- caCert, err := ioutil.ReadFile(*caFile)
- if err != nil {
- log.Fatal(err)
- }
-
- caCertPool := x509.NewCertPool()
- caCertPool.AppendCertsFromPEM(caCert)
-
- t = &tls.Config{
- Certificates: []tls.Certificate{cert},
- RootCAs: caCertPool,
- InsecureSkipVerify: *verifySsl,
- }
- }
- // will be nil by default if nothing is provided
- return t
-}
-
-type Server struct {
- DataCollector sarama.SyncProducer
- AccessLogProducer sarama.AsyncProducer
-}
-
-func (s *Server) Close() error {
- if err := s.DataCollector.Close(); err != nil {
- log.Println("Failed to shut down data collector cleanly", err)
- }
-
- if err := s.AccessLogProducer.Close(); err != nil {
- log.Println("Failed to shut down access log producer cleanly", err)
- }
-
- return nil
-}
-
-func (s *Server) Handler() http.Handler {
- return s.withAccessLog(s.collectQueryStringData())
-}
-
-func (s *Server) Run(addr string) error {
- httpServer := &http.Server{
- Addr: addr,
- Handler: s.Handler(),
- }
-
- log.Printf("Listening for requests on %s...\n", addr)
- return httpServer.ListenAndServe()
-}
-
-func (s *Server) collectQueryStringData() http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if r.URL.Path != "/" {
- http.NotFound(w, r)
- return
- }
-
- // We are not setting a message key, which means that all messages will
- // be distributed randomly over the different partitions.
- partition, offset, err := s.DataCollector.SendMessage(&sarama.ProducerMessage{
- Topic: "important",
- Value: sarama.StringEncoder(r.URL.RawQuery),
- })
-
- if err != nil {
- w.WriteHeader(http.StatusInternalServerError)
- fmt.Fprintf(w, "Failed to store your data:, %s", err)
- } else {
- // The tuple (topic, partition, offset) can be used as a unique identifier
- // for a message in a Kafka cluster.
- fmt.Fprintf(w, "Your data is stored with unique identifier important/%d/%d", partition, offset)
- }
- })
-}
-
-type accessLogEntry struct {
- Method string `json:"method"`
- Host string `json:"host"`
- Path string `json:"path"`
- IP string `json:"ip"`
- ResponseTime float64 `json:"response_time"`
-
- encoded []byte
- err error
-}
-
-func (ale *accessLogEntry) ensureEncoded() {
- if ale.encoded == nil && ale.err == nil {
- ale.encoded, ale.err = json.Marshal(ale)
- }
-}
-
-func (ale *accessLogEntry) Length() int {
- ale.ensureEncoded()
- return len(ale.encoded)
-}
-
-func (ale *accessLogEntry) Encode() ([]byte, error) {
- ale.ensureEncoded()
- return ale.encoded, ale.err
-}
-
-func (s *Server) withAccessLog(next http.Handler) http.Handler {
-
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- started := time.Now()
-
- next.ServeHTTP(w, r)
-
- entry := &accessLogEntry{
- Method: r.Method,
- Host: r.Host,
- Path: r.RequestURI,
- IP: r.RemoteAddr,
- ResponseTime: float64(time.Since(started)) / float64(time.Second),
- }
-
- // We will use the client's IP address as key. This will cause
- // all the access log entries of the same IP address to end up
- // on the same partition.
- s.AccessLogProducer.Input() <- &sarama.ProducerMessage{
- Topic: "access_log",
- Key: sarama.StringEncoder(r.RemoteAddr),
- Value: entry,
- }
- })
-}
-
-func newDataCollector(brokerList []string) sarama.SyncProducer {
-
- // For the data collector, we are looking for strong consistency semantics.
- // Because we don't change the flush settings, sarama will try to produce messages
- // as fast as possible to keep latency low.
- config := sarama.NewConfig()
- config.Producer.RequiredAcks = sarama.WaitForAll // Wait for all in-sync replicas to ack the message
- config.Producer.Retry.Max = 10 // Retry up to 10 times to produce the message
- config.Producer.Return.Successes = true
- tlsConfig := createTlsConfiguration()
- if tlsConfig != nil {
- config.Net.TLS.Config = tlsConfig
- config.Net.TLS.Enable = true
- }
-
- // On the broker side, you may want to change the following settings to get
- // stronger consistency guarantees:
- // - For your broker, set `unclean.leader.election.enable` to false
- // - For the topic, you could increase `min.insync.replicas`.
-
- producer, err := sarama.NewSyncProducer(brokerList, config)
- if err != nil {
- log.Fatalln("Failed to start Sarama producer:", err)
- }
-
- return producer
-}
-
-func newAccessLogProducer(brokerList []string) sarama.AsyncProducer {
-
- // For the access log, we are looking for AP semantics, with high throughput.
- // By creating batches of compressed messages, we reduce network I/O at a cost of more latency.
- config := sarama.NewConfig()
- tlsConfig := createTlsConfiguration()
- if tlsConfig != nil {
- config.Net.TLS.Enable = true
- config.Net.TLS.Config = tlsConfig
- }
- config.Producer.RequiredAcks = sarama.WaitForLocal // Only wait for the leader to ack
- config.Producer.Compression = sarama.CompressionSnappy // Compress messages
- config.Producer.Flush.Frequency = 500 * time.Millisecond // Flush batches every 500ms
-
- producer, err := sarama.NewAsyncProducer(brokerList, config)
- if err != nil {
- log.Fatalln("Failed to start Sarama producer:", err)
- }
-
- // We will just log to STDOUT if we're not able to produce messages.
- // Note: messages will only be returned here after all retry attempts are exhausted.
- go func() {
- for err := range producer.Errors() {
- log.Println("Failed to write access log entry:", err)
- }
- }()
-
- return producer
-}
diff --git a/vendor/src/github.com/Shopify/sarama/examples/http_server/http_server_test.go b/vendor/src/github.com/Shopify/sarama/examples/http_server/http_server_test.go
deleted file mode 100644
index 7b2451e28..000000000
--- a/vendor/src/github.com/Shopify/sarama/examples/http_server/http_server_test.go
+++ /dev/null
@@ -1,109 +0,0 @@
-package main
-
-import (
- "io"
- "net/http"
- "net/http/httptest"
- "testing"
-
- "github.com/Shopify/sarama"
- "github.com/Shopify/sarama/mocks"
-)
-
-// In normal operation, we expect one access log entry,
-// and one data collector entry. Let's assume both will succeed.
-// We should return a HTTP 200 status.
-func TestCollectSuccessfully(t *testing.T) {
- dataCollectorMock := mocks.NewSyncProducer(t, nil)
- dataCollectorMock.ExpectSendMessageAndSucceed()
-
- accessLogProducerMock := mocks.NewAsyncProducer(t, nil)
- accessLogProducerMock.ExpectInputAndSucceed()
-
- // Now, use dependency injection to use the mocks.
- s := &Server{
- DataCollector: dataCollectorMock,
- AccessLogProducer: accessLogProducerMock,
- }
-
- // The Server's Close call is important; it will call Close on
- // the two mock producers, which will then validate whether all
- // expectations are resolved.
- defer safeClose(t, s)
-
- req, err := http.NewRequest("GET", "http://example.com/?data", nil)
- if err != nil {
- t.Fatal(err)
- }
- res := httptest.NewRecorder()
- s.Handler().ServeHTTP(res, req)
-
- if res.Code != 200 {
- t.Errorf("Expected HTTP status 200, found %d", res.Code)
- }
-
- if string(res.Body.Bytes()) != "Your data is stored with unique identifier important/0/1" {
- t.Error("Unexpected response body", res.Body)
- }
-}
-
-// Now, let's see if we handle the case of not being able to produce
-// to the data collector properly. In this case we should return a 500 status.
-func TestCollectionFailure(t *testing.T) {
- dataCollectorMock := mocks.NewSyncProducer(t, nil)
- dataCollectorMock.ExpectSendMessageAndFail(sarama.ErrRequestTimedOut)
-
- accessLogProducerMock := mocks.NewAsyncProducer(t, nil)
- accessLogProducerMock.ExpectInputAndSucceed()
-
- s := &Server{
- DataCollector: dataCollectorMock,
- AccessLogProducer: accessLogProducerMock,
- }
- defer safeClose(t, s)
-
- req, err := http.NewRequest("GET", "http://example.com/?data", nil)
- if err != nil {
- t.Fatal(err)
- }
- res := httptest.NewRecorder()
- s.Handler().ServeHTTP(res, req)
-
- if res.Code != 500 {
- t.Errorf("Expected HTTP status 500, found %d", res.Code)
- }
-}
-
-// We don't expect any data collector calls because the path is wrong,
-// so we are not setting any expectations on the dataCollectorMock. It
-// will still generate an access log entry though.
-func TestWrongPath(t *testing.T) {
- dataCollectorMock := mocks.NewSyncProducer(t, nil)
-
- accessLogProducerMock := mocks.NewAsyncProducer(t, nil)
- accessLogProducerMock.ExpectInputAndSucceed()
-
- s := &Server{
- DataCollector: dataCollectorMock,
- AccessLogProducer: accessLogProducerMock,
- }
- defer safeClose(t, s)
-
- req, err := http.NewRequest("GET", "http://example.com/wrong?data", nil)
- if err != nil {
- t.Fatal(err)
- }
- res := httptest.NewRecorder()
-
- s.Handler().ServeHTTP(res, req)
-
- if res.Code != 404 {
- t.Errorf("Expected HTTP status 404, found %d", res.Code)
- }
-}
-
-func safeClose(t *testing.T, o io.Closer) {
- if err := o.Close(); err != nil {
- t.Error(err)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/fetch_request.go b/vendor/src/github.com/Shopify/sarama/fetch_request.go
deleted file mode 100644
index ae701a3f2..000000000
--- a/vendor/src/github.com/Shopify/sarama/fetch_request.go
+++ /dev/null
@@ -1,136 +0,0 @@
-package sarama
-
-type fetchRequestBlock struct {
- fetchOffset int64
- maxBytes int32
-}
-
-func (b *fetchRequestBlock) encode(pe packetEncoder) error {
- pe.putInt64(b.fetchOffset)
- pe.putInt32(b.maxBytes)
- return nil
-}
-
-func (b *fetchRequestBlock) decode(pd packetDecoder) (err error) {
- if b.fetchOffset, err = pd.getInt64(); err != nil {
- return err
- }
- if b.maxBytes, err = pd.getInt32(); err != nil {
- return err
- }
- return nil
-}
-
-type FetchRequest struct {
- MaxWaitTime int32
- MinBytes int32
- Version int16
- blocks map[string]map[int32]*fetchRequestBlock
-}
-
-func (r *FetchRequest) encode(pe packetEncoder) (err error) {
- pe.putInt32(-1) // replica ID is always -1 for clients
- pe.putInt32(r.MaxWaitTime)
- pe.putInt32(r.MinBytes)
- err = pe.putArrayLength(len(r.blocks))
- if err != nil {
- return err
- }
- for topic, blocks := range r.blocks {
- err = pe.putString(topic)
- if err != nil {
- return err
- }
- err = pe.putArrayLength(len(blocks))
- if err != nil {
- return err
- }
- for partition, block := range blocks {
- pe.putInt32(partition)
- err = block.encode(pe)
- if err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-func (r *FetchRequest) decode(pd packetDecoder, version int16) (err error) {
- r.Version = version
- if _, err = pd.getInt32(); err != nil {
- return err
- }
- if r.MaxWaitTime, err = pd.getInt32(); err != nil {
- return err
- }
- if r.MinBytes, err = pd.getInt32(); err != nil {
- return err
- }
- topicCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if topicCount == 0 {
- return nil
- }
- r.blocks = make(map[string]map[int32]*fetchRequestBlock)
- for i := 0; i < topicCount; i++ {
- topic, err := pd.getString()
- if err != nil {
- return err
- }
- partitionCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- r.blocks[topic] = make(map[int32]*fetchRequestBlock)
- for j := 0; j < partitionCount; j++ {
- partition, err := pd.getInt32()
- if err != nil {
- return err
- }
- fetchBlock := &fetchRequestBlock{}
- if err = fetchBlock.decode(pd); err != nil {
- return nil
- }
- r.blocks[topic][partition] = fetchBlock
- }
- }
- return nil
-}
-
-func (r *FetchRequest) key() int16 {
- return 1
-}
-
-func (r *FetchRequest) version() int16 {
- return r.Version
-}
-
-func (r *FetchRequest) requiredVersion() KafkaVersion {
- switch r.Version {
- case 1:
- return V0_9_0_0
- case 2:
- return V0_10_0_0
- default:
- return minVersion
- }
-}
-
-func (r *FetchRequest) AddBlock(topic string, partitionID int32, fetchOffset int64, maxBytes int32) {
- if r.blocks == nil {
- r.blocks = make(map[string]map[int32]*fetchRequestBlock)
- }
-
- if r.blocks[topic] == nil {
- r.blocks[topic] = make(map[int32]*fetchRequestBlock)
- }
-
- tmp := new(fetchRequestBlock)
- tmp.maxBytes = maxBytes
- tmp.fetchOffset = fetchOffset
-
- r.blocks[topic][partitionID] = tmp
-}
diff --git a/vendor/src/github.com/Shopify/sarama/fetch_request_test.go b/vendor/src/github.com/Shopify/sarama/fetch_request_test.go
deleted file mode 100644
index 32c083c7d..000000000
--- a/vendor/src/github.com/Shopify/sarama/fetch_request_test.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- fetchRequestNoBlocks = []byte{
- 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00}
-
- fetchRequestWithProperties = []byte{
- 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xEF,
- 0x00, 0x00, 0x00, 0x00}
-
- fetchRequestOneBlock = []byte{
- 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x05, 't', 'o', 'p', 'i', 'c',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x56}
-)
-
-func TestFetchRequest(t *testing.T) {
- request := new(FetchRequest)
- testRequest(t, "no blocks", request, fetchRequestNoBlocks)
-
- request.MaxWaitTime = 0x20
- request.MinBytes = 0xEF
- testRequest(t, "with properties", request, fetchRequestWithProperties)
-
- request.MaxWaitTime = 0
- request.MinBytes = 0
- request.AddBlock("topic", 0x12, 0x34, 0x56)
- testRequest(t, "one block", request, fetchRequestOneBlock)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/fetch_response.go b/vendor/src/github.com/Shopify/sarama/fetch_response.go
deleted file mode 100644
index b56b166c2..000000000
--- a/vendor/src/github.com/Shopify/sarama/fetch_response.go
+++ /dev/null
@@ -1,210 +0,0 @@
-package sarama
-
-import "time"
-
-type FetchResponseBlock struct {
- Err KError
- HighWaterMarkOffset int64
- MsgSet MessageSet
-}
-
-func (b *FetchResponseBlock) decode(pd packetDecoder) (err error) {
- tmp, err := pd.getInt16()
- if err != nil {
- return err
- }
- b.Err = KError(tmp)
-
- b.HighWaterMarkOffset, err = pd.getInt64()
- if err != nil {
- return err
- }
-
- msgSetSize, err := pd.getInt32()
- if err != nil {
- return err
- }
-
- msgSetDecoder, err := pd.getSubset(int(msgSetSize))
- if err != nil {
- return err
- }
- err = (&b.MsgSet).decode(msgSetDecoder)
-
- return err
-}
-
-func (b *FetchResponseBlock) encode(pe packetEncoder) (err error) {
- pe.putInt16(int16(b.Err))
-
- pe.putInt64(b.HighWaterMarkOffset)
-
- pe.push(&lengthField{})
- err = b.MsgSet.encode(pe)
- if err != nil {
- return err
- }
- return pe.pop()
-}
-
-type FetchResponse struct {
- Blocks map[string]map[int32]*FetchResponseBlock
- ThrottleTime time.Duration
- Version int16 // v1 requires 0.9+, v2 requires 0.10+
-}
-
-func (r *FetchResponse) decode(pd packetDecoder, version int16) (err error) {
- r.Version = version
-
- if r.Version >= 1 {
- throttle, err := pd.getInt32()
- if err != nil {
- return err
- }
- r.ThrottleTime = time.Duration(throttle) * time.Millisecond
- }
-
- numTopics, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Blocks = make(map[string]map[int32]*FetchResponseBlock, numTopics)
- for i := 0; i < numTopics; i++ {
- name, err := pd.getString()
- if err != nil {
- return err
- }
-
- numBlocks, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Blocks[name] = make(map[int32]*FetchResponseBlock, numBlocks)
-
- for j := 0; j < numBlocks; j++ {
- id, err := pd.getInt32()
- if err != nil {
- return err
- }
-
- block := new(FetchResponseBlock)
- err = block.decode(pd)
- if err != nil {
- return err
- }
- r.Blocks[name][id] = block
- }
- }
-
- return nil
-}
-
-func (r *FetchResponse) encode(pe packetEncoder) (err error) {
- if r.Version >= 1 {
- pe.putInt32(int32(r.ThrottleTime / time.Millisecond))
- }
-
- err = pe.putArrayLength(len(r.Blocks))
- if err != nil {
- return err
- }
-
- for topic, partitions := range r.Blocks {
- err = pe.putString(topic)
- if err != nil {
- return err
- }
-
- err = pe.putArrayLength(len(partitions))
- if err != nil {
- return err
- }
-
- for id, block := range partitions {
- pe.putInt32(id)
- err = block.encode(pe)
- if err != nil {
- return err
- }
- }
-
- }
- return nil
-}
-
-func (r *FetchResponse) key() int16 {
- return 1
-}
-
-func (r *FetchResponse) version() int16 {
- return r.Version
-}
-
-func (r *FetchResponse) requiredVersion() KafkaVersion {
- switch r.Version {
- case 1:
- return V0_9_0_0
- case 2:
- return V0_10_0_0
- default:
- return minVersion
- }
-}
-
-func (r *FetchResponse) GetBlock(topic string, partition int32) *FetchResponseBlock {
- if r.Blocks == nil {
- return nil
- }
-
- if r.Blocks[topic] == nil {
- return nil
- }
-
- return r.Blocks[topic][partition]
-}
-
-func (r *FetchResponse) AddError(topic string, partition int32, err KError) {
- if r.Blocks == nil {
- r.Blocks = make(map[string]map[int32]*FetchResponseBlock)
- }
- partitions, ok := r.Blocks[topic]
- if !ok {
- partitions = make(map[int32]*FetchResponseBlock)
- r.Blocks[topic] = partitions
- }
- frb, ok := partitions[partition]
- if !ok {
- frb = new(FetchResponseBlock)
- partitions[partition] = frb
- }
- frb.Err = err
-}
-
-func (r *FetchResponse) AddMessage(topic string, partition int32, key, value Encoder, offset int64) {
- if r.Blocks == nil {
- r.Blocks = make(map[string]map[int32]*FetchResponseBlock)
- }
- partitions, ok := r.Blocks[topic]
- if !ok {
- partitions = make(map[int32]*FetchResponseBlock)
- r.Blocks[topic] = partitions
- }
- frb, ok := partitions[partition]
- if !ok {
- frb = new(FetchResponseBlock)
- partitions[partition] = frb
- }
- var kb []byte
- var vb []byte
- if key != nil {
- kb, _ = key.Encode()
- }
- if value != nil {
- vb, _ = value.Encode()
- }
- msg := &Message{Key: kb, Value: vb}
- msgBlock := &MessageBlock{Msg: msg, Offset: offset}
- frb.MsgSet.Messages = append(frb.MsgSet.Messages, msgBlock)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/fetch_response_test.go b/vendor/src/github.com/Shopify/sarama/fetch_response_test.go
deleted file mode 100644
index 52fb5a74c..000000000
--- a/vendor/src/github.com/Shopify/sarama/fetch_response_test.go
+++ /dev/null
@@ -1,84 +0,0 @@
-package sarama
-
-import (
- "bytes"
- "testing"
-)
-
-var (
- emptyFetchResponse = []byte{
- 0x00, 0x00, 0x00, 0x00}
-
- oneMessageFetchResponse = []byte{
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x05, 't', 'o', 'p', 'i', 'c',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x05,
- 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10,
- 0x00, 0x00, 0x00, 0x1C,
- // messageSet
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x10,
- // message
- 0x23, 0x96, 0x4a, 0xf7, // CRC
- 0x00,
- 0x00,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0x00, 0x00, 0x00, 0x02, 0x00, 0xEE}
-)
-
-func TestEmptyFetchResponse(t *testing.T) {
- response := FetchResponse{}
- testVersionDecodable(t, "empty", &response, emptyFetchResponse, 0)
-
- if len(response.Blocks) != 0 {
- t.Error("Decoding produced topic blocks where there were none.")
- }
-
-}
-
-func TestOneMessageFetchResponse(t *testing.T) {
- response := FetchResponse{}
- testVersionDecodable(t, "one message", &response, oneMessageFetchResponse, 0)
-
- if len(response.Blocks) != 1 {
- t.Fatal("Decoding produced incorrect number of topic blocks.")
- }
-
- if len(response.Blocks["topic"]) != 1 {
- t.Fatal("Decoding produced incorrect number of partition blocks for topic.")
- }
-
- block := response.GetBlock("topic", 5)
- if block == nil {
- t.Fatal("GetBlock didn't return block.")
- }
- if block.Err != ErrOffsetOutOfRange {
- t.Error("Decoding didn't produce correct error code.")
- }
- if block.HighWaterMarkOffset != 0x10101010 {
- t.Error("Decoding didn't produce correct high water mark offset.")
- }
- if block.MsgSet.PartialTrailingMessage {
- t.Error("Decoding detected a partial trailing message where there wasn't one.")
- }
-
- if len(block.MsgSet.Messages) != 1 {
- t.Fatal("Decoding produced incorrect number of messages.")
- }
- msgBlock := block.MsgSet.Messages[0]
- if msgBlock.Offset != 0x550000 {
- t.Error("Decoding produced incorrect message offset.")
- }
- msg := msgBlock.Msg
- if msg.Codec != CompressionNone {
- t.Error("Decoding produced incorrect message compression.")
- }
- if msg.Key != nil {
- t.Error("Decoding produced message key where there was none.")
- }
- if !bytes.Equal(msg.Value, []byte{0x00, 0xEE}) {
- t.Error("Decoding produced incorrect message value.")
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/functional_client_test.go b/vendor/src/github.com/Shopify/sarama/functional_client_test.go
deleted file mode 100644
index 2bf99d252..000000000
--- a/vendor/src/github.com/Shopify/sarama/functional_client_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package sarama
-
-import (
- "fmt"
- "testing"
- "time"
-)
-
-func TestFuncConnectionFailure(t *testing.T) {
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- Proxies["kafka1"].Enabled = false
- SaveProxy(t, "kafka1")
-
- config := NewConfig()
- config.Metadata.Retry.Max = 1
-
- _, err := NewClient([]string{kafkaBrokers[0]}, config)
- if err != ErrOutOfBrokers {
- t.Fatal("Expected returned error to be ErrOutOfBrokers, but was: ", err)
- }
-}
-
-func TestFuncClientMetadata(t *testing.T) {
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- config := NewConfig()
- config.Metadata.Retry.Max = 1
- config.Metadata.Retry.Backoff = 10 * time.Millisecond
- client, err := NewClient(kafkaBrokers, config)
- if err != nil {
- t.Fatal(err)
- }
-
- if err := client.RefreshMetadata("unknown_topic"); err != ErrUnknownTopicOrPartition {
- t.Error("Expected ErrUnknownTopicOrPartition, got", err)
- }
-
- if _, err := client.Leader("unknown_topic", 0); err != ErrUnknownTopicOrPartition {
- t.Error("Expected ErrUnknownTopicOrPartition, got", err)
- }
-
- if _, err := client.Replicas("invalid/topic", 0); err != ErrUnknownTopicOrPartition {
- t.Error("Expected ErrUnknownTopicOrPartition, got", err)
- }
-
- partitions, err := client.Partitions("test.4")
- if err != nil {
- t.Error(err)
- }
- if len(partitions) != 4 {
- t.Errorf("Expected test.4 topic to have 4 partitions, found %v", partitions)
- }
-
- partitions, err = client.Partitions("test.1")
- if err != nil {
- t.Error(err)
- }
- if len(partitions) != 1 {
- t.Errorf("Expected test.1 topic to have 1 partitions, found %v", partitions)
- }
-
- safeClose(t, client)
-}
-
-func TestFuncClientCoordinator(t *testing.T) {
- checkKafkaVersion(t, "0.8.2")
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- client, err := NewClient(kafkaBrokers, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- broker, err := client.Coordinator(fmt.Sprintf("another_new_consumer_group_%d", i))
- if err != nil {
- t.Fatal(err)
- }
-
- if connected, err := broker.Connected(); !connected || err != nil {
- t.Errorf("Expected to coordinator %s broker to be properly connected.", broker.Addr())
- }
- }
-
- safeClose(t, client)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/functional_consumer_test.go b/vendor/src/github.com/Shopify/sarama/functional_consumer_test.go
deleted file mode 100644
index ab8433109..000000000
--- a/vendor/src/github.com/Shopify/sarama/functional_consumer_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package sarama
-
-import (
- "math"
- "testing"
-)
-
-func TestFuncConsumerOffsetOutOfRange(t *testing.T) {
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- consumer, err := NewConsumer(kafkaBrokers, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- if _, err := consumer.ConsumePartition("test.1", 0, -10); err != ErrOffsetOutOfRange {
- t.Error("Expected ErrOffsetOutOfRange, got:", err)
- }
-
- if _, err := consumer.ConsumePartition("test.1", 0, math.MaxInt64); err != ErrOffsetOutOfRange {
- t.Error("Expected ErrOffsetOutOfRange, got:", err)
- }
-
- safeClose(t, consumer)
-}
-
-func TestConsumerHighWaterMarkOffset(t *testing.T) {
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- p, err := NewSyncProducer(kafkaBrokers, nil)
- if err != nil {
- t.Fatal(err)
- }
- defer safeClose(t, p)
-
- _, offset, err := p.SendMessage(&ProducerMessage{Topic: "test.1", Value: StringEncoder("Test")})
- if err != nil {
- t.Fatal(err)
- }
-
- c, err := NewConsumer(kafkaBrokers, nil)
- if err != nil {
- t.Fatal(err)
- }
- defer safeClose(t, c)
-
- pc, err := c.ConsumePartition("test.1", 0, OffsetOldest)
- if err != nil {
- t.Fatal(err)
- }
-
- <-pc.Messages()
-
- if hwmo := pc.HighWaterMarkOffset(); hwmo != offset+1 {
- t.Logf("Last produced offset %d; high water mark should be one higher but found %d.", offset, hwmo)
- }
-
- safeClose(t, pc)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/functional_offset_manager_test.go b/vendor/src/github.com/Shopify/sarama/functional_offset_manager_test.go
deleted file mode 100644
index 436f35ef4..000000000
--- a/vendor/src/github.com/Shopify/sarama/functional_offset_manager_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package sarama
-
-import (
- "testing"
-)
-
-func TestFuncOffsetManager(t *testing.T) {
- checkKafkaVersion(t, "0.8.2")
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- client, err := NewClient(kafkaBrokers, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- offsetManager, err := NewOffsetManagerFromClient("sarama.TestFuncOffsetManager", client)
- if err != nil {
- t.Fatal(err)
- }
-
- pom1, err := offsetManager.ManagePartition("test.1", 0)
- if err != nil {
- t.Fatal(err)
- }
-
- pom1.MarkOffset(10, "test metadata")
- safeClose(t, pom1)
-
- pom2, err := offsetManager.ManagePartition("test.1", 0)
- if err != nil {
- t.Fatal(err)
- }
-
- offset, metadata := pom2.NextOffset()
-
- if offset != 10 {
- t.Errorf("Expected the next offset to be 10, found %d.", offset)
- }
- if metadata != "test metadata" {
- t.Errorf("Expected metadata to be 'test metadata', found %s.", metadata)
- }
-
- safeClose(t, pom2)
- safeClose(t, offsetManager)
- safeClose(t, client)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/functional_producer_test.go b/vendor/src/github.com/Shopify/sarama/functional_producer_test.go
deleted file mode 100644
index 91bf3b5ee..000000000
--- a/vendor/src/github.com/Shopify/sarama/functional_producer_test.go
+++ /dev/null
@@ -1,323 +0,0 @@
-package sarama
-
-import (
- "fmt"
- "os"
- "sync"
- "testing"
- "time"
-
- toxiproxy "github.com/Shopify/toxiproxy/client"
- "github.com/rcrowley/go-metrics"
-)
-
-const TestBatchSize = 1000
-
-func TestFuncProducing(t *testing.T) {
- config := NewConfig()
- testProducingMessages(t, config)
-}
-
-func TestFuncProducingGzip(t *testing.T) {
- config := NewConfig()
- config.Producer.Compression = CompressionGZIP
- testProducingMessages(t, config)
-}
-
-func TestFuncProducingSnappy(t *testing.T) {
- config := NewConfig()
- config.Producer.Compression = CompressionSnappy
- testProducingMessages(t, config)
-}
-
-func TestFuncProducingNoResponse(t *testing.T) {
- config := NewConfig()
- config.Producer.RequiredAcks = NoResponse
- testProducingMessages(t, config)
-}
-
-func TestFuncProducingFlushing(t *testing.T) {
- config := NewConfig()
- config.Producer.Flush.Messages = TestBatchSize / 8
- config.Producer.Flush.Frequency = 250 * time.Millisecond
- testProducingMessages(t, config)
-}
-
-func TestFuncMultiPartitionProduce(t *testing.T) {
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- config := NewConfig()
- config.ChannelBufferSize = 20
- config.Producer.Flush.Frequency = 50 * time.Millisecond
- config.Producer.Flush.Messages = 200
- config.Producer.Return.Successes = true
- producer, err := NewSyncProducer(kafkaBrokers, config)
- if err != nil {
- t.Fatal(err)
- }
-
- var wg sync.WaitGroup
- wg.Add(TestBatchSize)
-
- for i := 1; i <= TestBatchSize; i++ {
- go func(i int) {
- defer wg.Done()
- msg := &ProducerMessage{Topic: "test.64", Key: nil, Value: StringEncoder(fmt.Sprintf("hur %d", i))}
- if _, _, err := producer.SendMessage(msg); err != nil {
- t.Error(i, err)
- }
- }(i)
- }
-
- wg.Wait()
- if err := producer.Close(); err != nil {
- t.Error(err)
- }
-}
-
-func TestFuncProducingToInvalidTopic(t *testing.T) {
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- producer, err := NewSyncProducer(kafkaBrokers, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- if _, _, err := producer.SendMessage(&ProducerMessage{Topic: "in/valid"}); err != ErrUnknownTopicOrPartition {
- t.Error("Expected ErrUnknownTopicOrPartition, found", err)
- }
-
- if _, _, err := producer.SendMessage(&ProducerMessage{Topic: "in/valid"}); err != ErrUnknownTopicOrPartition {
- t.Error("Expected ErrUnknownTopicOrPartition, found", err)
- }
-
- safeClose(t, producer)
-}
-
-func testProducingMessages(t *testing.T, config *Config) {
- setupFunctionalTest(t)
- defer teardownFunctionalTest(t)
-
- // Configure some latency in order to properly validate the request latency metric
- for _, proxy := range Proxies {
- if _, err := proxy.AddToxic("", "latency", "", 1, toxiproxy.Attributes{"latency": 10}); err != nil {
- t.Fatal("Unable to configure latency toxicity", err)
- }
- }
-
- config.Producer.Return.Successes = true
- config.Consumer.Return.Errors = true
-
- client, err := NewClient(kafkaBrokers, config)
- if err != nil {
- t.Fatal(err)
- }
-
- // Keep in mind the current offset
- initialOffset, err := client.GetOffset("test.1", 0, OffsetNewest)
- if err != nil {
- t.Fatal(err)
- }
-
- producer, err := NewAsyncProducerFromClient(client)
- if err != nil {
- t.Fatal(err)
- }
-
- expectedResponses := TestBatchSize
- for i := 1; i <= TestBatchSize; {
- msg := &ProducerMessage{Topic: "test.1", Key: nil, Value: StringEncoder(fmt.Sprintf("testing %d", i))}
- select {
- case producer.Input() <- msg:
- i++
- case ret := <-producer.Errors():
- t.Fatal(ret.Err)
- case <-producer.Successes():
- expectedResponses--
- }
- }
- for expectedResponses > 0 {
- select {
- case ret := <-producer.Errors():
- t.Fatal(ret.Err)
- case <-producer.Successes():
- expectedResponses--
- }
- }
- safeClose(t, producer)
-
- // Validate producer metrics before using the consumer minus the offset request
- validateMetrics(t, client)
-
- master, err := NewConsumerFromClient(client)
- if err != nil {
- t.Fatal(err)
- }
- consumer, err := master.ConsumePartition("test.1", 0, initialOffset)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 1; i <= TestBatchSize; i++ {
- select {
- case <-time.After(10 * time.Second):
- t.Fatal("Not received any more events in the last 10 seconds.")
-
- case err := <-consumer.Errors():
- t.Error(err)
-
- case message := <-consumer.Messages():
- if string(message.Value) != fmt.Sprintf("testing %d", i) {
- t.Fatalf("Unexpected message with index %d: %s", i, message.Value)
- }
- }
-
- }
- safeClose(t, consumer)
- safeClose(t, client)
-}
-
-func validateMetrics(t *testing.T, client Client) {
- // Get the broker used by test1 topic
- var broker *Broker
- if partitions, err := client.Partitions("test.1"); err != nil {
- t.Error(err)
- } else {
- for _, partition := range partitions {
- if b, err := client.Leader("test.1", partition); err != nil {
- t.Error(err)
- } else {
- if broker != nil && b != broker {
- t.Fatal("Expected only one broker, got at least 2")
- }
- broker = b
- }
- }
- }
-
- metricValidators := newMetricValidators()
- noResponse := client.Config().Producer.RequiredAcks == NoResponse
- compressionEnabled := client.Config().Producer.Compression != CompressionNone
-
- // We are adding 10ms of latency to all requests with toxiproxy
- minRequestLatencyInMs := 10
- if noResponse {
- // but when we do not wait for a response it can be less than 1ms
- minRequestLatencyInMs = 0
- }
-
- // We read at least 1 byte from the broker
- metricValidators.registerForAllBrokers(broker, minCountMeterValidator("incoming-byte-rate", 1))
- // in at least 3 global requests (1 for metadata request, 1 for offset request and N for produce request)
- metricValidators.register(minCountMeterValidator("request-rate", 3))
- metricValidators.register(minCountHistogramValidator("request-size", 3))
- metricValidators.register(minValHistogramValidator("request-size", 1))
- metricValidators.register(minValHistogramValidator("request-latency-in-ms", minRequestLatencyInMs))
- // and at least 2 requests to the registered broker (offset + produces)
- metricValidators.registerForBroker(broker, minCountMeterValidator("request-rate", 2))
- metricValidators.registerForBroker(broker, minCountHistogramValidator("request-size", 2))
- metricValidators.registerForBroker(broker, minValHistogramValidator("request-size", 1))
- metricValidators.registerForBroker(broker, minValHistogramValidator("request-latency-in-ms", minRequestLatencyInMs))
-
- // We send at least 1 batch
- metricValidators.registerForGlobalAndTopic("test_1", minCountHistogramValidator("batch-size", 1))
- metricValidators.registerForGlobalAndTopic("test_1", minValHistogramValidator("batch-size", 1))
- if compressionEnabled {
- // We record compression ratios between [0.50,-10.00] (50-1000 with a histogram) for at least one "fake" record
- metricValidators.registerForGlobalAndTopic("test_1", minCountHistogramValidator("compression-ratio", 1))
- metricValidators.registerForGlobalAndTopic("test_1", minValHistogramValidator("compression-ratio", 50))
- metricValidators.registerForGlobalAndTopic("test_1", maxValHistogramValidator("compression-ratio", 1000))
- } else {
- // We record compression ratios of 1.00 (100 with a histogram) for every TestBatchSize record
- metricValidators.registerForGlobalAndTopic("test_1", countHistogramValidator("compression-ratio", TestBatchSize))
- metricValidators.registerForGlobalAndTopic("test_1", minValHistogramValidator("compression-ratio", 100))
- metricValidators.registerForGlobalAndTopic("test_1", maxValHistogramValidator("compression-ratio", 100))
- }
-
- // We send exactly TestBatchSize messages
- metricValidators.registerForGlobalAndTopic("test_1", countMeterValidator("record-send-rate", TestBatchSize))
- // We send at least one record per request
- metricValidators.registerForGlobalAndTopic("test_1", minCountHistogramValidator("records-per-request", 1))
- metricValidators.registerForGlobalAndTopic("test_1", minValHistogramValidator("records-per-request", 1))
-
- // We receive at least 1 byte from the broker
- metricValidators.registerForAllBrokers(broker, minCountMeterValidator("outgoing-byte-rate", 1))
- if noResponse {
- // in exactly 2 global responses (metadata + offset)
- metricValidators.register(countMeterValidator("response-rate", 2))
- metricValidators.register(minCountHistogramValidator("response-size", 2))
- metricValidators.register(minValHistogramValidator("response-size", 1))
- // and exactly 1 offset response for the registered broker
- metricValidators.registerForBroker(broker, countMeterValidator("response-rate", 1))
- metricValidators.registerForBroker(broker, minCountHistogramValidator("response-size", 1))
- metricValidators.registerForBroker(broker, minValHistogramValidator("response-size", 1))
- } else {
- // in at least 3 global responses (metadata + offset + produces)
- metricValidators.register(minCountMeterValidator("response-rate", 3))
- metricValidators.register(minCountHistogramValidator("response-size", 3))
- metricValidators.register(minValHistogramValidator("response-size", 1))
- // and at least 2 for the registered broker
- metricValidators.registerForBroker(broker, minCountMeterValidator("response-rate", 2))
- metricValidators.registerForBroker(broker, minCountHistogramValidator("response-size", 2))
- metricValidators.registerForBroker(broker, minValHistogramValidator("response-size", 1))
- }
-
- // Run the validators
- metricValidators.run(t, client.Config().MetricRegistry)
-}
-
-// Benchmarks
-
-func BenchmarkProducerSmall(b *testing.B) {
- benchmarkProducer(b, nil, "test.64", ByteEncoder(make([]byte, 128)))
-}
-func BenchmarkProducerMedium(b *testing.B) {
- benchmarkProducer(b, nil, "test.64", ByteEncoder(make([]byte, 1024)))
-}
-func BenchmarkProducerLarge(b *testing.B) {
- benchmarkProducer(b, nil, "test.64", ByteEncoder(make([]byte, 8192)))
-}
-func BenchmarkProducerSmallSinglePartition(b *testing.B) {
- benchmarkProducer(b, nil, "test.1", ByteEncoder(make([]byte, 128)))
-}
-func BenchmarkProducerMediumSnappy(b *testing.B) {
- conf := NewConfig()
- conf.Producer.Compression = CompressionSnappy
- benchmarkProducer(b, conf, "test.1", ByteEncoder(make([]byte, 1024)))
-}
-
-func benchmarkProducer(b *testing.B, conf *Config, topic string, value Encoder) {
- setupFunctionalTest(b)
- defer teardownFunctionalTest(b)
-
- metricsDisable := os.Getenv("METRICS_DISABLE")
- if metricsDisable != "" {
- previousUseNilMetrics := metrics.UseNilMetrics
- Logger.Println("Disabling metrics using no-op implementation")
- metrics.UseNilMetrics = true
- // Restore previous setting
- defer func() {
- metrics.UseNilMetrics = previousUseNilMetrics
- }()
- }
-
- producer, err := NewAsyncProducer(kafkaBrokers, conf)
- if err != nil {
- b.Fatal(err)
- }
-
- b.ResetTimer()
-
- for i := 1; i <= b.N; {
- msg := &ProducerMessage{Topic: topic, Key: StringEncoder(fmt.Sprintf("%d", i)), Value: value}
- select {
- case producer.Input() <- msg:
- i++
- case ret := <-producer.Errors():
- b.Fatal(ret.Err)
- }
- }
- safeClose(b, producer)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/functional_test.go b/vendor/src/github.com/Shopify/sarama/functional_test.go
deleted file mode 100644
index 846eb29f9..000000000
--- a/vendor/src/github.com/Shopify/sarama/functional_test.go
+++ /dev/null
@@ -1,148 +0,0 @@
-package sarama
-
-import (
- "log"
- "math/rand"
- "net"
- "os"
- "strconv"
- "strings"
- "testing"
- "time"
-
- toxiproxy "github.com/Shopify/toxiproxy/client"
-)
-
-const (
- VagrantToxiproxy = "http://192.168.100.67:8474"
- VagrantKafkaPeers = "192.168.100.67:9091,192.168.100.67:9092,192.168.100.67:9093,192.168.100.67:9094,192.168.100.67:9095"
- VagrantZookeeperPeers = "192.168.100.67:2181,192.168.100.67:2182,192.168.100.67:2183,192.168.100.67:2184,192.168.100.67:2185"
-)
-
-var (
- kafkaAvailable, kafkaRequired bool
- kafkaBrokers []string
-
- proxyClient *toxiproxy.Client
- Proxies map[string]*toxiproxy.Proxy
- ZKProxies = []string{"zk1", "zk2", "zk3", "zk4", "zk5"}
- KafkaProxies = []string{"kafka1", "kafka2", "kafka3", "kafka4", "kafka5"}
-)
-
-func init() {
- if os.Getenv("DEBUG") == "true" {
- Logger = log.New(os.Stdout, "[sarama] ", log.LstdFlags)
- }
-
- seed := time.Now().UTC().UnixNano()
- if tmp := os.Getenv("TEST_SEED"); tmp != "" {
- seed, _ = strconv.ParseInt(tmp, 0, 64)
- }
- Logger.Println("Using random seed:", seed)
- rand.Seed(seed)
-
- proxyAddr := os.Getenv("TOXIPROXY_ADDR")
- if proxyAddr == "" {
- proxyAddr = VagrantToxiproxy
- }
- proxyClient = toxiproxy.NewClient(proxyAddr)
-
- kafkaPeers := os.Getenv("KAFKA_PEERS")
- if kafkaPeers == "" {
- kafkaPeers = VagrantKafkaPeers
- }
- kafkaBrokers = strings.Split(kafkaPeers, ",")
-
- if c, err := net.DialTimeout("tcp", kafkaBrokers[0], 5*time.Second); err == nil {
- if err = c.Close(); err == nil {
- kafkaAvailable = true
- }
- }
-
- kafkaRequired = os.Getenv("CI") != ""
-}
-
-func checkKafkaAvailability(t testing.TB) {
- if !kafkaAvailable {
- if kafkaRequired {
- t.Fatalf("Kafka broker is not available on %s. Set KAFKA_PEERS to connect to Kafka on a different location.", kafkaBrokers[0])
- } else {
- t.Skipf("Kafka broker is not available on %s. Set KAFKA_PEERS to connect to Kafka on a different location.", kafkaBrokers[0])
- }
- }
-}
-
-func checkKafkaVersion(t testing.TB, requiredVersion string) {
- kafkaVersion := os.Getenv("KAFKA_VERSION")
- if kafkaVersion == "" {
- t.Logf("No KAFKA_VERSION set. This test requires Kafka version %s or higher. Continuing...", requiredVersion)
- } else {
- available := parseKafkaVersion(kafkaVersion)
- required := parseKafkaVersion(requiredVersion)
- if !available.satisfies(required) {
- t.Skipf("Kafka version %s is required for this test; you have %s. Skipping...", requiredVersion, kafkaVersion)
- }
- }
-}
-
-func resetProxies(t testing.TB) {
- if err := proxyClient.ResetState(); err != nil {
- t.Error(err)
- }
- Proxies = nil
-}
-
-func fetchProxies(t testing.TB) {
- var err error
- Proxies, err = proxyClient.Proxies()
- if err != nil {
- t.Fatal(err)
- }
-}
-
-func SaveProxy(t *testing.T, px string) {
- if err := Proxies[px].Save(); err != nil {
- t.Fatal(err)
- }
-}
-
-func setupFunctionalTest(t testing.TB) {
- checkKafkaAvailability(t)
- resetProxies(t)
- fetchProxies(t)
-}
-
-func teardownFunctionalTest(t testing.TB) {
- resetProxies(t)
-}
-
-type kafkaVersion []int
-
-func (kv kafkaVersion) satisfies(other kafkaVersion) bool {
- var ov int
- for index, v := range kv {
- if len(other) <= index {
- ov = 0
- } else {
- ov = other[index]
- }
-
- if v < ov {
- return false
- } else if v > ov {
- return true
- }
- }
- return true
-}
-
-func parseKafkaVersion(version string) kafkaVersion {
- numbers := strings.Split(version, ".")
- result := make(kafkaVersion, 0, len(numbers))
- for _, number := range numbers {
- nr, _ := strconv.Atoi(number)
- result = append(result, nr)
- }
-
- return result
-}
diff --git a/vendor/src/github.com/Shopify/sarama/heartbeat_request.go b/vendor/src/github.com/Shopify/sarama/heartbeat_request.go
deleted file mode 100644
index ce49c4739..000000000
--- a/vendor/src/github.com/Shopify/sarama/heartbeat_request.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package sarama
-
-type HeartbeatRequest struct {
- GroupId string
- GenerationId int32
- MemberId string
-}
-
-func (r *HeartbeatRequest) encode(pe packetEncoder) error {
- if err := pe.putString(r.GroupId); err != nil {
- return err
- }
-
- pe.putInt32(r.GenerationId)
-
- if err := pe.putString(r.MemberId); err != nil {
- return err
- }
-
- return nil
-}
-
-func (r *HeartbeatRequest) decode(pd packetDecoder, version int16) (err error) {
- if r.GroupId, err = pd.getString(); err != nil {
- return
- }
- if r.GenerationId, err = pd.getInt32(); err != nil {
- return
- }
- if r.MemberId, err = pd.getString(); err != nil {
- return
- }
-
- return nil
-}
-
-func (r *HeartbeatRequest) key() int16 {
- return 12
-}
-
-func (r *HeartbeatRequest) version() int16 {
- return 0
-}
-
-func (r *HeartbeatRequest) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/heartbeat_request_test.go b/vendor/src/github.com/Shopify/sarama/heartbeat_request_test.go
deleted file mode 100644
index da6cd18f5..000000000
--- a/vendor/src/github.com/Shopify/sarama/heartbeat_request_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- basicHeartbeatRequest = []byte{
- 0, 3, 'f', 'o', 'o', // Group ID
- 0x00, 0x01, 0x02, 0x03, // Generatiuon ID
- 0, 3, 'b', 'a', 'z', // Member ID
- }
-)
-
-func TestHeartbeatRequest(t *testing.T) {
- var request *HeartbeatRequest
-
- request = new(HeartbeatRequest)
- request.GroupId = "foo"
- request.GenerationId = 66051
- request.MemberId = "baz"
- testRequest(t, "basic", request, basicHeartbeatRequest)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/heartbeat_response.go b/vendor/src/github.com/Shopify/sarama/heartbeat_response.go
deleted file mode 100644
index 3c51163ad..000000000
--- a/vendor/src/github.com/Shopify/sarama/heartbeat_response.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package sarama
-
-type HeartbeatResponse struct {
- Err KError
-}
-
-func (r *HeartbeatResponse) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.Err))
- return nil
-}
-
-func (r *HeartbeatResponse) decode(pd packetDecoder, version int16) error {
- if kerr, err := pd.getInt16(); err != nil {
- return err
- } else {
- r.Err = KError(kerr)
- }
-
- return nil
-}
-
-func (r *HeartbeatResponse) key() int16 {
- return 12
-}
-
-func (r *HeartbeatResponse) version() int16 {
- return 0
-}
-
-func (r *HeartbeatResponse) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/heartbeat_response_test.go b/vendor/src/github.com/Shopify/sarama/heartbeat_response_test.go
deleted file mode 100644
index 5bcbec985..000000000
--- a/vendor/src/github.com/Shopify/sarama/heartbeat_response_test.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- heartbeatResponseNoError = []byte{
- 0x00, 0x00}
-)
-
-func TestHeartbeatResponse(t *testing.T) {
- var response *HeartbeatResponse
-
- response = new(HeartbeatResponse)
- testVersionDecodable(t, "no error", response, heartbeatResponseNoError, 0)
- if response.Err != ErrNoError {
- t.Error("Decoding error failed: no error expected but found", response.Err)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/join_group_request.go b/vendor/src/github.com/Shopify/sarama/join_group_request.go
deleted file mode 100644
index 656db4562..000000000
--- a/vendor/src/github.com/Shopify/sarama/join_group_request.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package sarama
-
-type JoinGroupRequest struct {
- GroupId string
- SessionTimeout int32
- MemberId string
- ProtocolType string
- GroupProtocols map[string][]byte
-}
-
-func (r *JoinGroupRequest) encode(pe packetEncoder) error {
- if err := pe.putString(r.GroupId); err != nil {
- return err
- }
- pe.putInt32(r.SessionTimeout)
- if err := pe.putString(r.MemberId); err != nil {
- return err
- }
- if err := pe.putString(r.ProtocolType); err != nil {
- return err
- }
-
- if err := pe.putArrayLength(len(r.GroupProtocols)); err != nil {
- return err
- }
- for name, metadata := range r.GroupProtocols {
- if err := pe.putString(name); err != nil {
- return err
- }
- if err := pe.putBytes(metadata); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *JoinGroupRequest) decode(pd packetDecoder, version int16) (err error) {
- if r.GroupId, err = pd.getString(); err != nil {
- return
- }
-
- if r.SessionTimeout, err = pd.getInt32(); err != nil {
- return
- }
-
- if r.MemberId, err = pd.getString(); err != nil {
- return
- }
-
- if r.ProtocolType, err = pd.getString(); err != nil {
- return
- }
-
- n, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if n == 0 {
- return nil
- }
-
- r.GroupProtocols = make(map[string][]byte)
- for i := 0; i < n; i++ {
- name, err := pd.getString()
- if err != nil {
- return err
- }
- metadata, err := pd.getBytes()
- if err != nil {
- return err
- }
-
- r.GroupProtocols[name] = metadata
- }
-
- return nil
-}
-
-func (r *JoinGroupRequest) key() int16 {
- return 11
-}
-
-func (r *JoinGroupRequest) version() int16 {
- return 0
-}
-
-func (r *JoinGroupRequest) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
-
-func (r *JoinGroupRequest) AddGroupProtocol(name string, metadata []byte) {
- if r.GroupProtocols == nil {
- r.GroupProtocols = make(map[string][]byte)
- }
-
- r.GroupProtocols[name] = metadata
-}
-
-func (r *JoinGroupRequest) AddGroupProtocolMetadata(name string, metadata *ConsumerGroupMemberMetadata) error {
- bin, err := encode(metadata, nil)
- if err != nil {
- return err
- }
-
- r.AddGroupProtocol(name, bin)
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/join_group_request_test.go b/vendor/src/github.com/Shopify/sarama/join_group_request_test.go
deleted file mode 100644
index 8a6448c0e..000000000
--- a/vendor/src/github.com/Shopify/sarama/join_group_request_test.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- joinGroupRequestNoProtocols = []byte{
- 0, 9, 'T', 'e', 's', 't', 'G', 'r', 'o', 'u', 'p', // Group ID
- 0, 0, 0, 100, // Session timeout
- 0, 0, // Member ID
- 0, 8, 'c', 'o', 'n', 's', 'u', 'm', 'e', 'r', // Protocol Type
- 0, 0, 0, 0, // 0 protocol groups
- }
-
- joinGroupRequestOneProtocol = []byte{
- 0, 9, 'T', 'e', 's', 't', 'G', 'r', 'o', 'u', 'p', // Group ID
- 0, 0, 0, 100, // Session timeout
- 0, 11, 'O', 'n', 'e', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', // Member ID
- 0, 8, 'c', 'o', 'n', 's', 'u', 'm', 'e', 'r', // Protocol Type
- 0, 0, 0, 1, // 1 group protocol
- 0, 3, 'o', 'n', 'e', // Protocol name
- 0, 0, 0, 3, 0x01, 0x02, 0x03, // protocol metadata
- }
-)
-
-func TestJoinGroupRequest(t *testing.T) {
- var request *JoinGroupRequest
-
- request = new(JoinGroupRequest)
- request.GroupId = "TestGroup"
- request.SessionTimeout = 100
- request.ProtocolType = "consumer"
- testRequest(t, "no protocols", request, joinGroupRequestNoProtocols)
-
- request = new(JoinGroupRequest)
- request.GroupId = "TestGroup"
- request.SessionTimeout = 100
- request.MemberId = "OneProtocol"
- request.ProtocolType = "consumer"
- request.AddGroupProtocol("one", []byte{0x01, 0x02, 0x03})
- testRequest(t, "one protocol", request, joinGroupRequestOneProtocol)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/join_group_response.go b/vendor/src/github.com/Shopify/sarama/join_group_response.go
deleted file mode 100644
index 94c7a7fde..000000000
--- a/vendor/src/github.com/Shopify/sarama/join_group_response.go
+++ /dev/null
@@ -1,114 +0,0 @@
-package sarama
-
-type JoinGroupResponse struct {
- Err KError
- GenerationId int32
- GroupProtocol string
- LeaderId string
- MemberId string
- Members map[string][]byte
-}
-
-func (r *JoinGroupResponse) GetMembers() (map[string]ConsumerGroupMemberMetadata, error) {
- members := make(map[string]ConsumerGroupMemberMetadata, len(r.Members))
- for id, bin := range r.Members {
- meta := new(ConsumerGroupMemberMetadata)
- if err := decode(bin, meta); err != nil {
- return nil, err
- }
- members[id] = *meta
- }
- return members, nil
-}
-
-func (r *JoinGroupResponse) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.Err))
- pe.putInt32(r.GenerationId)
-
- if err := pe.putString(r.GroupProtocol); err != nil {
- return err
- }
- if err := pe.putString(r.LeaderId); err != nil {
- return err
- }
- if err := pe.putString(r.MemberId); err != nil {
- return err
- }
-
- if err := pe.putArrayLength(len(r.Members)); err != nil {
- return err
- }
-
- for memberId, memberMetadata := range r.Members {
- if err := pe.putString(memberId); err != nil {
- return err
- }
-
- if err := pe.putBytes(memberMetadata); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *JoinGroupResponse) decode(pd packetDecoder, version int16) (err error) {
- if kerr, err := pd.getInt16(); err != nil {
- return err
- } else {
- r.Err = KError(kerr)
- }
-
- if r.GenerationId, err = pd.getInt32(); err != nil {
- return
- }
-
- if r.GroupProtocol, err = pd.getString(); err != nil {
- return
- }
-
- if r.LeaderId, err = pd.getString(); err != nil {
- return
- }
-
- if r.MemberId, err = pd.getString(); err != nil {
- return
- }
-
- n, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if n == 0 {
- return nil
- }
-
- r.Members = make(map[string][]byte)
- for i := 0; i < n; i++ {
- memberId, err := pd.getString()
- if err != nil {
- return err
- }
-
- memberMetadata, err := pd.getBytes()
- if err != nil {
- return err
- }
-
- r.Members[memberId] = memberMetadata
- }
-
- return nil
-}
-
-func (r *JoinGroupResponse) key() int16 {
- return 11
-}
-
-func (r *JoinGroupResponse) version() int16 {
- return 0
-}
-
-func (r *JoinGroupResponse) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/join_group_response_test.go b/vendor/src/github.com/Shopify/sarama/join_group_response_test.go
deleted file mode 100644
index ba7f71f20..000000000
--- a/vendor/src/github.com/Shopify/sarama/join_group_response_test.go
+++ /dev/null
@@ -1,98 +0,0 @@
-package sarama
-
-import (
- "reflect"
- "testing"
-)
-
-var (
- joinGroupResponseNoError = []byte{
- 0x00, 0x00, // No error
- 0x00, 0x01, 0x02, 0x03, // Generation ID
- 0, 8, 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', // Protocol name chosen
- 0, 3, 'f', 'o', 'o', // Leader ID
- 0, 3, 'b', 'a', 'r', // Member ID
- 0, 0, 0, 0, // No member info
- }
-
- joinGroupResponseWithError = []byte{
- 0, 23, // Error: inconsistent group protocol
- 0x00, 0x00, 0x00, 0x00, // Generation ID
- 0, 0, // Protocol name chosen
- 0, 0, // Leader ID
- 0, 0, // Member ID
- 0, 0, 0, 0, // No member info
- }
-
- joinGroupResponseLeader = []byte{
- 0x00, 0x00, // No error
- 0x00, 0x01, 0x02, 0x03, // Generation ID
- 0, 8, 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', // Protocol name chosen
- 0, 3, 'f', 'o', 'o', // Leader ID
- 0, 3, 'f', 'o', 'o', // Member ID == Leader ID
- 0, 0, 0, 1, // 1 member
- 0, 3, 'f', 'o', 'o', // Member ID
- 0, 0, 0, 3, 0x01, 0x02, 0x03, // Member metadata
- }
-)
-
-func TestJoinGroupResponse(t *testing.T) {
- var response *JoinGroupResponse
-
- response = new(JoinGroupResponse)
- testVersionDecodable(t, "no error", response, joinGroupResponseNoError, 0)
- if response.Err != ErrNoError {
- t.Error("Decoding Err failed: no error expected but found", response.Err)
- }
- if response.GenerationId != 66051 {
- t.Error("Decoding GenerationId failed, found:", response.GenerationId)
- }
- if response.LeaderId != "foo" {
- t.Error("Decoding LeaderId failed, found:", response.LeaderId)
- }
- if response.MemberId != "bar" {
- t.Error("Decoding MemberId failed, found:", response.MemberId)
- }
- if len(response.Members) != 0 {
- t.Error("Decoding Members failed, found:", response.Members)
- }
-
- response = new(JoinGroupResponse)
- testVersionDecodable(t, "with error", response, joinGroupResponseWithError, 0)
- if response.Err != ErrInconsistentGroupProtocol {
- t.Error("Decoding Err failed: ErrInconsistentGroupProtocol expected but found", response.Err)
- }
- if response.GenerationId != 0 {
- t.Error("Decoding GenerationId failed, found:", response.GenerationId)
- }
- if response.LeaderId != "" {
- t.Error("Decoding LeaderId failed, found:", response.LeaderId)
- }
- if response.MemberId != "" {
- t.Error("Decoding MemberId failed, found:", response.MemberId)
- }
- if len(response.Members) != 0 {
- t.Error("Decoding Members failed, found:", response.Members)
- }
-
- response = new(JoinGroupResponse)
- testVersionDecodable(t, "with error", response, joinGroupResponseLeader, 0)
- if response.Err != ErrNoError {
- t.Error("Decoding Err failed: ErrNoError expected but found", response.Err)
- }
- if response.GenerationId != 66051 {
- t.Error("Decoding GenerationId failed, found:", response.GenerationId)
- }
- if response.LeaderId != "foo" {
- t.Error("Decoding LeaderId failed, found:", response.LeaderId)
- }
- if response.MemberId != "foo" {
- t.Error("Decoding MemberId failed, found:", response.MemberId)
- }
- if len(response.Members) != 1 {
- t.Error("Decoding Members failed, found:", response.Members)
- }
- if !reflect.DeepEqual(response.Members["foo"], []byte{0x01, 0x02, 0x03}) {
- t.Error("Decoding foo member failed, found:", response.Members["foo"])
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/leave_group_request.go b/vendor/src/github.com/Shopify/sarama/leave_group_request.go
deleted file mode 100644
index e17742748..000000000
--- a/vendor/src/github.com/Shopify/sarama/leave_group_request.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package sarama
-
-type LeaveGroupRequest struct {
- GroupId string
- MemberId string
-}
-
-func (r *LeaveGroupRequest) encode(pe packetEncoder) error {
- if err := pe.putString(r.GroupId); err != nil {
- return err
- }
- if err := pe.putString(r.MemberId); err != nil {
- return err
- }
-
- return nil
-}
-
-func (r *LeaveGroupRequest) decode(pd packetDecoder, version int16) (err error) {
- if r.GroupId, err = pd.getString(); err != nil {
- return
- }
- if r.MemberId, err = pd.getString(); err != nil {
- return
- }
-
- return nil
-}
-
-func (r *LeaveGroupRequest) key() int16 {
- return 13
-}
-
-func (r *LeaveGroupRequest) version() int16 {
- return 0
-}
-
-func (r *LeaveGroupRequest) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/leave_group_request_test.go b/vendor/src/github.com/Shopify/sarama/leave_group_request_test.go
deleted file mode 100644
index c1fed6d25..000000000
--- a/vendor/src/github.com/Shopify/sarama/leave_group_request_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- basicLeaveGroupRequest = []byte{
- 0, 3, 'f', 'o', 'o',
- 0, 3, 'b', 'a', 'r',
- }
-)
-
-func TestLeaveGroupRequest(t *testing.T) {
- var request *LeaveGroupRequest
-
- request = new(LeaveGroupRequest)
- request.GroupId = "foo"
- request.MemberId = "bar"
- testRequest(t, "basic", request, basicLeaveGroupRequest)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/leave_group_response.go b/vendor/src/github.com/Shopify/sarama/leave_group_response.go
deleted file mode 100644
index bd4a34f46..000000000
--- a/vendor/src/github.com/Shopify/sarama/leave_group_response.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package sarama
-
-type LeaveGroupResponse struct {
- Err KError
-}
-
-func (r *LeaveGroupResponse) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.Err))
- return nil
-}
-
-func (r *LeaveGroupResponse) decode(pd packetDecoder, version int16) (err error) {
- if kerr, err := pd.getInt16(); err != nil {
- return err
- } else {
- r.Err = KError(kerr)
- }
-
- return nil
-}
-
-func (r *LeaveGroupResponse) key() int16 {
- return 13
-}
-
-func (r *LeaveGroupResponse) version() int16 {
- return 0
-}
-
-func (r *LeaveGroupResponse) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/leave_group_response_test.go b/vendor/src/github.com/Shopify/sarama/leave_group_response_test.go
deleted file mode 100644
index 9207c6668..000000000
--- a/vendor/src/github.com/Shopify/sarama/leave_group_response_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- leaveGroupResponseNoError = []byte{0x00, 0x00}
- leaveGroupResponseWithError = []byte{0, 25}
-)
-
-func TestLeaveGroupResponse(t *testing.T) {
- var response *LeaveGroupResponse
-
- response = new(LeaveGroupResponse)
- testVersionDecodable(t, "no error", response, leaveGroupResponseNoError, 0)
- if response.Err != ErrNoError {
- t.Error("Decoding error failed: no error expected but found", response.Err)
- }
-
- response = new(LeaveGroupResponse)
- testVersionDecodable(t, "with error", response, leaveGroupResponseWithError, 0)
- if response.Err != ErrUnknownMemberId {
- t.Error("Decoding error failed: ErrUnknownMemberId expected but found", response.Err)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/length_field.go b/vendor/src/github.com/Shopify/sarama/length_field.go
deleted file mode 100644
index 70078be5d..000000000
--- a/vendor/src/github.com/Shopify/sarama/length_field.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package sarama
-
-import "encoding/binary"
-
-// LengthField implements the PushEncoder and PushDecoder interfaces for calculating 4-byte lengths.
-type lengthField struct {
- startOffset int
-}
-
-func (l *lengthField) saveOffset(in int) {
- l.startOffset = in
-}
-
-func (l *lengthField) reserveLength() int {
- return 4
-}
-
-func (l *lengthField) run(curOffset int, buf []byte) error {
- binary.BigEndian.PutUint32(buf[l.startOffset:], uint32(curOffset-l.startOffset-4))
- return nil
-}
-
-func (l *lengthField) check(curOffset int, buf []byte) error {
- if uint32(curOffset-l.startOffset-4) != binary.BigEndian.Uint32(buf[l.startOffset:]) {
- return PacketDecodingError{"length field invalid"}
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/list_groups_request.go b/vendor/src/github.com/Shopify/sarama/list_groups_request.go
deleted file mode 100644
index 3b16abf7f..000000000
--- a/vendor/src/github.com/Shopify/sarama/list_groups_request.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package sarama
-
-type ListGroupsRequest struct {
-}
-
-func (r *ListGroupsRequest) encode(pe packetEncoder) error {
- return nil
-}
-
-func (r *ListGroupsRequest) decode(pd packetDecoder, version int16) (err error) {
- return nil
-}
-
-func (r *ListGroupsRequest) key() int16 {
- return 16
-}
-
-func (r *ListGroupsRequest) version() int16 {
- return 0
-}
-
-func (r *ListGroupsRequest) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/list_groups_request_test.go b/vendor/src/github.com/Shopify/sarama/list_groups_request_test.go
deleted file mode 100644
index 2e977d9a5..000000000
--- a/vendor/src/github.com/Shopify/sarama/list_groups_request_test.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package sarama
-
-import "testing"
-
-func TestListGroupsRequest(t *testing.T) {
- testRequest(t, "ListGroupsRequest", &ListGroupsRequest{}, []byte{})
-}
diff --git a/vendor/src/github.com/Shopify/sarama/list_groups_response.go b/vendor/src/github.com/Shopify/sarama/list_groups_response.go
deleted file mode 100644
index 3a84f9b6c..000000000
--- a/vendor/src/github.com/Shopify/sarama/list_groups_response.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package sarama
-
-type ListGroupsResponse struct {
- Err KError
- Groups map[string]string
-}
-
-func (r *ListGroupsResponse) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.Err))
-
- if err := pe.putArrayLength(len(r.Groups)); err != nil {
- return err
- }
- for groupId, protocolType := range r.Groups {
- if err := pe.putString(groupId); err != nil {
- return err
- }
- if err := pe.putString(protocolType); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *ListGroupsResponse) decode(pd packetDecoder, version int16) error {
- if kerr, err := pd.getInt16(); err != nil {
- return err
- } else {
- r.Err = KError(kerr)
- }
-
- n, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if n == 0 {
- return nil
- }
-
- r.Groups = make(map[string]string)
- for i := 0; i < n; i++ {
- groupId, err := pd.getString()
- if err != nil {
- return err
- }
- protocolType, err := pd.getString()
- if err != nil {
- return err
- }
-
- r.Groups[groupId] = protocolType
- }
-
- return nil
-}
-
-func (r *ListGroupsResponse) key() int16 {
- return 16
-}
-
-func (r *ListGroupsResponse) version() int16 {
- return 0
-}
-
-func (r *ListGroupsResponse) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/list_groups_response_test.go b/vendor/src/github.com/Shopify/sarama/list_groups_response_test.go
deleted file mode 100644
index 41ab822f9..000000000
--- a/vendor/src/github.com/Shopify/sarama/list_groups_response_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package sarama
-
-import (
- "testing"
-)
-
-var (
- listGroupsResponseEmpty = []byte{
- 0, 0, // no error
- 0, 0, 0, 0, // no groups
- }
-
- listGroupsResponseError = []byte{
- 0, 31, // no error
- 0, 0, 0, 0, // ErrClusterAuthorizationFailed
- }
-
- listGroupsResponseWithConsumer = []byte{
- 0, 0, // no error
- 0, 0, 0, 1, // 1 group
- 0, 3, 'f', 'o', 'o', // group name
- 0, 8, 'c', 'o', 'n', 's', 'u', 'm', 'e', 'r', // protocol type
- }
-)
-
-func TestListGroupsResponse(t *testing.T) {
- var response *ListGroupsResponse
-
- response = new(ListGroupsResponse)
- testVersionDecodable(t, "no error", response, listGroupsResponseEmpty, 0)
- if response.Err != ErrNoError {
- t.Error("Expected no gerror, found:", response.Err)
- }
- if len(response.Groups) != 0 {
- t.Error("Expected no groups")
- }
-
- response = new(ListGroupsResponse)
- testVersionDecodable(t, "no error", response, listGroupsResponseError, 0)
- if response.Err != ErrClusterAuthorizationFailed {
- t.Error("Expected no gerror, found:", response.Err)
- }
- if len(response.Groups) != 0 {
- t.Error("Expected no groups")
- }
-
- response = new(ListGroupsResponse)
- testVersionDecodable(t, "no error", response, listGroupsResponseWithConsumer, 0)
- if response.Err != ErrNoError {
- t.Error("Expected no gerror, found:", response.Err)
- }
- if len(response.Groups) != 1 {
- t.Error("Expected one group")
- }
- if response.Groups["foo"] != "consumer" {
- t.Error("Expected foo group to use consumer protocol")
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/message.go b/vendor/src/github.com/Shopify/sarama/message.go
deleted file mode 100644
index 327c5fa2a..000000000
--- a/vendor/src/github.com/Shopify/sarama/message.go
+++ /dev/null
@@ -1,196 +0,0 @@
-package sarama
-
-import (
- "bytes"
- "compress/gzip"
- "fmt"
- "io/ioutil"
- "time"
-
- "github.com/eapache/go-xerial-snappy"
- "github.com/pierrec/lz4"
-)
-
-// CompressionCodec represents the various compression codecs recognized by Kafka in messages.
-type CompressionCodec int8
-
-// only the last two bits are really used
-const compressionCodecMask int8 = 0x03
-
-const (
- CompressionNone CompressionCodec = 0
- CompressionGZIP CompressionCodec = 1
- CompressionSnappy CompressionCodec = 2
- CompressionLZ4 CompressionCodec = 3
-)
-
-type Message struct {
- Codec CompressionCodec // codec used to compress the message contents
- Key []byte // the message key, may be nil
- Value []byte // the message contents
- Set *MessageSet // the message set a message might wrap
- Version int8 // v1 requires Kafka 0.10
- Timestamp time.Time // the timestamp of the message (version 1+ only)
-
- compressedCache []byte
- compressedSize int // used for computing the compression ratio metrics
-}
-
-func (m *Message) encode(pe packetEncoder) error {
- pe.push(&crc32Field{})
-
- pe.putInt8(m.Version)
-
- attributes := int8(m.Codec) & compressionCodecMask
- pe.putInt8(attributes)
-
- if m.Version >= 1 {
- pe.putInt64(m.Timestamp.UnixNano() / int64(time.Millisecond))
- }
-
- err := pe.putBytes(m.Key)
- if err != nil {
- return err
- }
-
- var payload []byte
-
- if m.compressedCache != nil {
- payload = m.compressedCache
- m.compressedCache = nil
- } else if m.Value != nil {
- switch m.Codec {
- case CompressionNone:
- payload = m.Value
- case CompressionGZIP:
- var buf bytes.Buffer
- writer := gzip.NewWriter(&buf)
- if _, err = writer.Write(m.Value); err != nil {
- return err
- }
- if err = writer.Close(); err != nil {
- return err
- }
- m.compressedCache = buf.Bytes()
- payload = m.compressedCache
- case CompressionSnappy:
- tmp := snappy.Encode(m.Value)
- m.compressedCache = tmp
- payload = m.compressedCache
- case CompressionLZ4:
- var buf bytes.Buffer
- writer := lz4.NewWriter(&buf)
- if _, err = writer.Write(m.Value); err != nil {
- return err
- }
- if err = writer.Close(); err != nil {
- return err
- }
- m.compressedCache = buf.Bytes()
- payload = m.compressedCache
-
- default:
- return PacketEncodingError{fmt.Sprintf("unsupported compression codec (%d)", m.Codec)}
- }
- // Keep in mind the compressed payload size for metric gathering
- m.compressedSize = len(payload)
- }
-
- if err = pe.putBytes(payload); err != nil {
- return err
- }
-
- return pe.pop()
-}
-
-func (m *Message) decode(pd packetDecoder) (err error) {
- err = pd.push(&crc32Field{})
- if err != nil {
- return err
- }
-
- m.Version, err = pd.getInt8()
- if err != nil {
- return err
- }
-
- attribute, err := pd.getInt8()
- if err != nil {
- return err
- }
- m.Codec = CompressionCodec(attribute & compressionCodecMask)
-
- if m.Version >= 1 {
- millis, err := pd.getInt64()
- if err != nil {
- return err
- }
- m.Timestamp = time.Unix(millis/1000, (millis%1000)*int64(time.Millisecond))
- }
-
- m.Key, err = pd.getBytes()
- if err != nil {
- return err
- }
-
- m.Value, err = pd.getBytes()
- if err != nil {
- return err
- }
-
- // Required for deep equal assertion during tests but might be useful
- // for future metrics about the compression ratio in fetch requests
- m.compressedSize = len(m.Value)
-
- switch m.Codec {
- case CompressionNone:
- // nothing to do
- case CompressionGZIP:
- if m.Value == nil {
- break
- }
- reader, err := gzip.NewReader(bytes.NewReader(m.Value))
- if err != nil {
- return err
- }
- if m.Value, err = ioutil.ReadAll(reader); err != nil {
- return err
- }
- if err := m.decodeSet(); err != nil {
- return err
- }
- case CompressionSnappy:
- if m.Value == nil {
- break
- }
- if m.Value, err = snappy.Decode(m.Value); err != nil {
- return err
- }
- if err := m.decodeSet(); err != nil {
- return err
- }
- case CompressionLZ4:
- if m.Value == nil {
- break
- }
- reader := lz4.NewReader(bytes.NewReader(m.Value))
- if m.Value, err = ioutil.ReadAll(reader); err != nil {
- return err
- }
- if err := m.decodeSet(); err != nil {
- return err
- }
-
- default:
- return PacketDecodingError{fmt.Sprintf("invalid compression specified (%d)", m.Codec)}
- }
-
- return pd.pop()
-}
-
-// decodes a message set from a previousy encoded bulk-message
-func (m *Message) decodeSet() (err error) {
- pd := realDecoder{raw: m.Value}
- m.Set = &MessageSet{}
- return m.Set.decode(&pd)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/message_set.go b/vendor/src/github.com/Shopify/sarama/message_set.go
deleted file mode 100644
index f028784e5..000000000
--- a/vendor/src/github.com/Shopify/sarama/message_set.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package sarama
-
-type MessageBlock struct {
- Offset int64
- Msg *Message
-}
-
-// Messages convenience helper which returns either all the
-// messages that are wrapped in this block
-func (msb *MessageBlock) Messages() []*MessageBlock {
- if msb.Msg.Set != nil {
- return msb.Msg.Set.Messages
- }
- return []*MessageBlock{msb}
-}
-
-func (msb *MessageBlock) encode(pe packetEncoder) error {
- pe.putInt64(msb.Offset)
- pe.push(&lengthField{})
- err := msb.Msg.encode(pe)
- if err != nil {
- return err
- }
- return pe.pop()
-}
-
-func (msb *MessageBlock) decode(pd packetDecoder) (err error) {
- if msb.Offset, err = pd.getInt64(); err != nil {
- return err
- }
-
- if err = pd.push(&lengthField{}); err != nil {
- return err
- }
-
- msb.Msg = new(Message)
- if err = msb.Msg.decode(pd); err != nil {
- return err
- }
-
- if err = pd.pop(); err != nil {
- return err
- }
-
- return nil
-}
-
-type MessageSet struct {
- PartialTrailingMessage bool // whether the set on the wire contained an incomplete trailing MessageBlock
- Messages []*MessageBlock
-}
-
-func (ms *MessageSet) encode(pe packetEncoder) error {
- for i := range ms.Messages {
- err := ms.Messages[i].encode(pe)
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-func (ms *MessageSet) decode(pd packetDecoder) (err error) {
- ms.Messages = nil
-
- for pd.remaining() > 0 {
- msb := new(MessageBlock)
- err = msb.decode(pd)
- switch err {
- case nil:
- ms.Messages = append(ms.Messages, msb)
- case ErrInsufficientData:
- // As an optimization the server is allowed to return a partial message at the
- // end of the message set. Clients should handle this case. So we just ignore such things.
- ms.PartialTrailingMessage = true
- return nil
- default:
- return err
- }
- }
-
- return nil
-}
-
-func (ms *MessageSet) addMessage(msg *Message) {
- block := new(MessageBlock)
- block.Msg = msg
- ms.Messages = append(ms.Messages, block)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/message_test.go b/vendor/src/github.com/Shopify/sarama/message_test.go
deleted file mode 100644
index af70b7b18..000000000
--- a/vendor/src/github.com/Shopify/sarama/message_test.go
+++ /dev/null
@@ -1,165 +0,0 @@
-package sarama
-
-import (
- "testing"
- "time"
-)
-
-var (
- emptyMessage = []byte{
- 167, 236, 104, 3, // CRC
- 0x00, // magic version byte
- 0x00, // attribute flags
- 0xFF, 0xFF, 0xFF, 0xFF, // key
- 0xFF, 0xFF, 0xFF, 0xFF} // value
-
- emptyGzipMessage = []byte{
- 97, 79, 149, 90, //CRC
- 0x00, // magic version byte
- 0x01, // attribute flags
- 0xFF, 0xFF, 0xFF, 0xFF, // key
- // value
- 0x00, 0x00, 0x00, 0x17,
- 0x1f, 0x8b,
- 0x08,
- 0, 0, 9, 110, 136, 0, 255, 1, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}
-
- emptyLZ4Message = []byte{
- 132, 219, 238, 101, // CRC
- 0x01, // version byte
- 0x03, // attribute flags: lz4
- 0, 0, 1, 88, 141, 205, 89, 56, // timestamp
- 0xFF, 0xFF, 0xFF, 0xFF, // key
- 0x00, 0x00, 0x00, 0x0f, // len
- 0x04, 0x22, 0x4D, 0x18, // LZ4 magic number
- 100, // LZ4 flags: version 01, block indepedant, content checksum
- 112, 185, 0, 0, 0, 0, // LZ4 data
- 5, 93, 204, 2, // LZ4 checksum
- }
-
- emptyBulkSnappyMessage = []byte{
- 180, 47, 53, 209, //CRC
- 0x00, // magic version byte
- 0x02, // attribute flags
- 0xFF, 0xFF, 0xFF, 0xFF, // key
- 0, 0, 0, 42,
- 130, 83, 78, 65, 80, 80, 89, 0, // SNAPPY magic
- 0, 0, 0, 1, // min version
- 0, 0, 0, 1, // default version
- 0, 0, 0, 22, 52, 0, 0, 25, 1, 16, 14, 227, 138, 104, 118, 25, 15, 13, 1, 8, 1, 0, 0, 62, 26, 0}
-
- emptyBulkGzipMessage = []byte{
- 139, 160, 63, 141, //CRC
- 0x00, // magic version byte
- 0x01, // attribute flags
- 0xFF, 0xFF, 0xFF, 0xFF, // key
- 0x00, 0x00, 0x00, 0x27, // len
- 0x1f, 0x8b, // Gzip Magic
- 0x08, // deflate compressed
- 0, 0, 0, 0, 0, 0, 0, 99, 96, 128, 3, 190, 202, 112, 143, 7, 12, 12, 255, 129, 0, 33, 200, 192, 136, 41, 3, 0, 199, 226, 155, 70, 52, 0, 0, 0}
-
- emptyBulkLZ4Message = []byte{
- 246, 12, 188, 129, // CRC
- 0x01, // Version
- 0x03, // attribute flags (LZ4)
- 255, 255, 249, 209, 212, 181, 73, 201, // timestamp
- 0xFF, 0xFF, 0xFF, 0xFF, // key
- 0x00, 0x00, 0x00, 0x47, // len
- 0x04, 0x22, 0x4D, 0x18, // magic number lz4
- 100, // lz4 flags 01100100
- // version: 01, block indep: 1, block checksum: 0, content size: 0, content checksum: 1, reserved: 00
- 112, 185, 52, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 121, 87, 72, 224, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 14, 121, 87, 72, 224, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0,
- 71, 129, 23, 111, // LZ4 checksum
- }
-)
-
-func TestMessageEncoding(t *testing.T) {
- message := Message{}
- testEncodable(t, "empty", &message, emptyMessage)
-
- message.Value = []byte{}
- message.Codec = CompressionGZIP
- testEncodable(t, "empty gzip", &message, emptyGzipMessage)
-
- message.Value = []byte{}
- message.Codec = CompressionLZ4
- message.Timestamp = time.Unix(1479847795, 0)
- message.Version = 1
- testEncodable(t, "empty lz4", &message, emptyLZ4Message)
-}
-
-func TestMessageDecoding(t *testing.T) {
- message := Message{}
- testDecodable(t, "empty", &message, emptyMessage)
- if message.Codec != CompressionNone {
- t.Error("Decoding produced compression codec where there was none.")
- }
- if message.Key != nil {
- t.Error("Decoding produced key where there was none.")
- }
- if message.Value != nil {
- t.Error("Decoding produced value where there was none.")
- }
- if message.Set != nil {
- t.Error("Decoding produced set where there was none.")
- }
-
- testDecodable(t, "empty gzip", &message, emptyGzipMessage)
- if message.Codec != CompressionGZIP {
- t.Error("Decoding produced incorrect compression codec (was gzip).")
- }
- if message.Key != nil {
- t.Error("Decoding produced key where there was none.")
- }
- if message.Value == nil || len(message.Value) != 0 {
- t.Error("Decoding produced nil or content-ful value where there was an empty array.")
- }
-}
-
-func TestMessageDecodingBulkSnappy(t *testing.T) {
- message := Message{}
- testDecodable(t, "bulk snappy", &message, emptyBulkSnappyMessage)
- if message.Codec != CompressionSnappy {
- t.Errorf("Decoding produced codec %d, but expected %d.", message.Codec, CompressionSnappy)
- }
- if message.Key != nil {
- t.Errorf("Decoding produced key %+v, but none was expected.", message.Key)
- }
- if message.Set == nil {
- t.Error("Decoding produced no set, but one was expected.")
- } else if len(message.Set.Messages) != 2 {
- t.Errorf("Decoding produced a set with %d messages, but 2 were expected.", len(message.Set.Messages))
- }
-}
-
-func TestMessageDecodingBulkGzip(t *testing.T) {
- message := Message{}
- testDecodable(t, "bulk gzip", &message, emptyBulkGzipMessage)
- if message.Codec != CompressionGZIP {
- t.Errorf("Decoding produced codec %d, but expected %d.", message.Codec, CompressionGZIP)
- }
- if message.Key != nil {
- t.Errorf("Decoding produced key %+v, but none was expected.", message.Key)
- }
- if message.Set == nil {
- t.Error("Decoding produced no set, but one was expected.")
- } else if len(message.Set.Messages) != 2 {
- t.Errorf("Decoding produced a set with %d messages, but 2 were expected.", len(message.Set.Messages))
- }
-}
-
-func TestMessageDecodingBulkLZ4(t *testing.T) {
- message := Message{}
- testDecodable(t, "bulk lz4", &message, emptyBulkLZ4Message)
- if message.Codec != CompressionLZ4 {
- t.Errorf("Decoding produced codec %d, but expected %d.", message.Codec, CompressionLZ4)
- }
- if message.Key != nil {
- t.Errorf("Decoding produced key %+v, but none was expected.", message.Key)
- }
- if message.Set == nil {
- t.Error("Decoding produced no set, but one was expected.")
- } else if len(message.Set.Messages) != 2 {
- t.Errorf("Decoding produced a set with %d messages, but 2 were expected.", len(message.Set.Messages))
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/metadata_request.go b/vendor/src/github.com/Shopify/sarama/metadata_request.go
deleted file mode 100644
index 9a26b55fd..000000000
--- a/vendor/src/github.com/Shopify/sarama/metadata_request.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package sarama
-
-type MetadataRequest struct {
- Topics []string
-}
-
-func (r *MetadataRequest) encode(pe packetEncoder) error {
- err := pe.putArrayLength(len(r.Topics))
- if err != nil {
- return err
- }
-
- for i := range r.Topics {
- err = pe.putString(r.Topics[i])
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-func (r *MetadataRequest) decode(pd packetDecoder, version int16) error {
- topicCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if topicCount == 0 {
- return nil
- }
-
- r.Topics = make([]string, topicCount)
- for i := range r.Topics {
- topic, err := pd.getString()
- if err != nil {
- return err
- }
- r.Topics[i] = topic
- }
- return nil
-}
-
-func (r *MetadataRequest) key() int16 {
- return 3
-}
-
-func (r *MetadataRequest) version() int16 {
- return 0
-}
-
-func (r *MetadataRequest) requiredVersion() KafkaVersion {
- return minVersion
-}
diff --git a/vendor/src/github.com/Shopify/sarama/metadata_request_test.go b/vendor/src/github.com/Shopify/sarama/metadata_request_test.go
deleted file mode 100644
index 44f3146e4..000000000
--- a/vendor/src/github.com/Shopify/sarama/metadata_request_test.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- metadataRequestNoTopics = []byte{
- 0x00, 0x00, 0x00, 0x00}
-
- metadataRequestOneTopic = []byte{
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x06, 't', 'o', 'p', 'i', 'c', '1'}
-
- metadataRequestThreeTopics = []byte{
- 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 'f', 'o', 'o',
- 0x00, 0x03, 'b', 'a', 'r',
- 0x00, 0x03, 'b', 'a', 'z'}
-)
-
-func TestMetadataRequest(t *testing.T) {
- request := new(MetadataRequest)
- testRequest(t, "no topics", request, metadataRequestNoTopics)
-
- request.Topics = []string{"topic1"}
- testRequest(t, "one topic", request, metadataRequestOneTopic)
-
- request.Topics = []string{"foo", "bar", "baz"}
- testRequest(t, "three topics", request, metadataRequestThreeTopics)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/metadata_response.go b/vendor/src/github.com/Shopify/sarama/metadata_response.go
deleted file mode 100644
index f9d6a4271..000000000
--- a/vendor/src/github.com/Shopify/sarama/metadata_response.go
+++ /dev/null
@@ -1,239 +0,0 @@
-package sarama
-
-type PartitionMetadata struct {
- Err KError
- ID int32
- Leader int32
- Replicas []int32
- Isr []int32
-}
-
-func (pm *PartitionMetadata) decode(pd packetDecoder) (err error) {
- tmp, err := pd.getInt16()
- if err != nil {
- return err
- }
- pm.Err = KError(tmp)
-
- pm.ID, err = pd.getInt32()
- if err != nil {
- return err
- }
-
- pm.Leader, err = pd.getInt32()
- if err != nil {
- return err
- }
-
- pm.Replicas, err = pd.getInt32Array()
- if err != nil {
- return err
- }
-
- pm.Isr, err = pd.getInt32Array()
- if err != nil {
- return err
- }
-
- return nil
-}
-
-func (pm *PartitionMetadata) encode(pe packetEncoder) (err error) {
- pe.putInt16(int16(pm.Err))
- pe.putInt32(pm.ID)
- pe.putInt32(pm.Leader)
-
- err = pe.putInt32Array(pm.Replicas)
- if err != nil {
- return err
- }
-
- err = pe.putInt32Array(pm.Isr)
- if err != nil {
- return err
- }
-
- return nil
-}
-
-type TopicMetadata struct {
- Err KError
- Name string
- Partitions []*PartitionMetadata
-}
-
-func (tm *TopicMetadata) decode(pd packetDecoder) (err error) {
- tmp, err := pd.getInt16()
- if err != nil {
- return err
- }
- tm.Err = KError(tmp)
-
- tm.Name, err = pd.getString()
- if err != nil {
- return err
- }
-
- n, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- tm.Partitions = make([]*PartitionMetadata, n)
- for i := 0; i < n; i++ {
- tm.Partitions[i] = new(PartitionMetadata)
- err = tm.Partitions[i].decode(pd)
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (tm *TopicMetadata) encode(pe packetEncoder) (err error) {
- pe.putInt16(int16(tm.Err))
-
- err = pe.putString(tm.Name)
- if err != nil {
- return err
- }
-
- err = pe.putArrayLength(len(tm.Partitions))
- if err != nil {
- return err
- }
-
- for _, pm := range tm.Partitions {
- err = pm.encode(pe)
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
-type MetadataResponse struct {
- Brokers []*Broker
- Topics []*TopicMetadata
-}
-
-func (r *MetadataResponse) decode(pd packetDecoder, version int16) (err error) {
- n, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Brokers = make([]*Broker, n)
- for i := 0; i < n; i++ {
- r.Brokers[i] = new(Broker)
- err = r.Brokers[i].decode(pd)
- if err != nil {
- return err
- }
- }
-
- n, err = pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Topics = make([]*TopicMetadata, n)
- for i := 0; i < n; i++ {
- r.Topics[i] = new(TopicMetadata)
- err = r.Topics[i].decode(pd)
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *MetadataResponse) encode(pe packetEncoder) error {
- err := pe.putArrayLength(len(r.Brokers))
- if err != nil {
- return err
- }
- for _, broker := range r.Brokers {
- err = broker.encode(pe)
- if err != nil {
- return err
- }
- }
-
- err = pe.putArrayLength(len(r.Topics))
- if err != nil {
- return err
- }
- for _, tm := range r.Topics {
- err = tm.encode(pe)
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *MetadataResponse) key() int16 {
- return 3
-}
-
-func (r *MetadataResponse) version() int16 {
- return 0
-}
-
-func (r *MetadataResponse) requiredVersion() KafkaVersion {
- return minVersion
-}
-
-// testing API
-
-func (r *MetadataResponse) AddBroker(addr string, id int32) {
- r.Brokers = append(r.Brokers, &Broker{id: id, addr: addr})
-}
-
-func (r *MetadataResponse) AddTopic(topic string, err KError) *TopicMetadata {
- var tmatch *TopicMetadata
-
- for _, tm := range r.Topics {
- if tm.Name == topic {
- tmatch = tm
- goto foundTopic
- }
- }
-
- tmatch = new(TopicMetadata)
- tmatch.Name = topic
- r.Topics = append(r.Topics, tmatch)
-
-foundTopic:
-
- tmatch.Err = err
- return tmatch
-}
-
-func (r *MetadataResponse) AddTopicPartition(topic string, partition, brokerID int32, replicas, isr []int32, err KError) {
- tmatch := r.AddTopic(topic, ErrNoError)
- var pmatch *PartitionMetadata
-
- for _, pm := range tmatch.Partitions {
- if pm.ID == partition {
- pmatch = pm
- goto foundPartition
- }
- }
-
- pmatch = new(PartitionMetadata)
- pmatch.ID = partition
- tmatch.Partitions = append(tmatch.Partitions, pmatch)
-
-foundPartition:
-
- pmatch.Leader = brokerID
- pmatch.Replicas = replicas
- pmatch.Isr = isr
- pmatch.Err = err
-
-}
diff --git a/vendor/src/github.com/Shopify/sarama/metadata_response_test.go b/vendor/src/github.com/Shopify/sarama/metadata_response_test.go
deleted file mode 100644
index ea62a4f1b..000000000
--- a/vendor/src/github.com/Shopify/sarama/metadata_response_test.go
+++ /dev/null
@@ -1,139 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- emptyMetadataResponse = []byte{
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00}
-
- brokersNoTopicsMetadataResponse = []byte{
- 0x00, 0x00, 0x00, 0x02,
-
- 0x00, 0x00, 0xab, 0xff,
- 0x00, 0x09, 'l', 'o', 'c', 'a', 'l', 'h', 'o', 's', 't',
- 0x00, 0x00, 0x00, 0x33,
-
- 0x00, 0x01, 0x02, 0x03,
- 0x00, 0x0a, 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm',
- 0x00, 0x00, 0x01, 0x11,
-
- 0x00, 0x00, 0x00, 0x00}
-
- topicsNoBrokersMetadataResponse = []byte{
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x02,
-
- 0x00, 0x00,
- 0x00, 0x03, 'f', 'o', 'o',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x04,
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x07,
- 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x00, 0x00, 0x00,
-
- 0x00, 0x00,
- 0x00, 0x03, 'b', 'a', 'r',
- 0x00, 0x00, 0x00, 0x00}
-)
-
-func TestEmptyMetadataResponse(t *testing.T) {
- response := MetadataResponse{}
-
- testVersionDecodable(t, "empty", &response, emptyMetadataResponse, 0)
- if len(response.Brokers) != 0 {
- t.Error("Decoding produced", len(response.Brokers), "brokers where there were none!")
- }
- if len(response.Topics) != 0 {
- t.Error("Decoding produced", len(response.Topics), "topics where there were none!")
- }
-}
-
-func TestMetadataResponseWithBrokers(t *testing.T) {
- response := MetadataResponse{}
-
- testVersionDecodable(t, "brokers, no topics", &response, brokersNoTopicsMetadataResponse, 0)
- if len(response.Brokers) != 2 {
- t.Fatal("Decoding produced", len(response.Brokers), "brokers where there were two!")
- }
-
- if response.Brokers[0].id != 0xabff {
- t.Error("Decoding produced invalid broker 0 id.")
- }
- if response.Brokers[0].addr != "localhost:51" {
- t.Error("Decoding produced invalid broker 0 address.")
- }
- if response.Brokers[1].id != 0x010203 {
- t.Error("Decoding produced invalid broker 1 id.")
- }
- if response.Brokers[1].addr != "google.com:273" {
- t.Error("Decoding produced invalid broker 1 address.")
- }
-
- if len(response.Topics) != 0 {
- t.Error("Decoding produced", len(response.Topics), "topics where there were none!")
- }
-}
-
-func TestMetadataResponseWithTopics(t *testing.T) {
- response := MetadataResponse{}
-
- testVersionDecodable(t, "topics, no brokers", &response, topicsNoBrokersMetadataResponse, 0)
- if len(response.Brokers) != 0 {
- t.Error("Decoding produced", len(response.Brokers), "brokers where there were none!")
- }
-
- if len(response.Topics) != 2 {
- t.Fatal("Decoding produced", len(response.Topics), "topics where there were two!")
- }
-
- if response.Topics[0].Err != ErrNoError {
- t.Error("Decoding produced invalid topic 0 error.")
- }
-
- if response.Topics[0].Name != "foo" {
- t.Error("Decoding produced invalid topic 0 name.")
- }
-
- if len(response.Topics[0].Partitions) != 1 {
- t.Fatal("Decoding produced invalid partition count for topic 0.")
- }
-
- if response.Topics[0].Partitions[0].Err != ErrInvalidMessageSize {
- t.Error("Decoding produced invalid topic 0 partition 0 error.")
- }
-
- if response.Topics[0].Partitions[0].ID != 0x01 {
- t.Error("Decoding produced invalid topic 0 partition 0 id.")
- }
-
- if response.Topics[0].Partitions[0].Leader != 0x07 {
- t.Error("Decoding produced invalid topic 0 partition 0 leader.")
- }
-
- if len(response.Topics[0].Partitions[0].Replicas) != 3 {
- t.Fatal("Decoding produced invalid topic 0 partition 0 replicas.")
- }
- for i := 0; i < 3; i++ {
- if response.Topics[0].Partitions[0].Replicas[i] != int32(i+1) {
- t.Error("Decoding produced invalid topic 0 partition 0 replica", i)
- }
- }
-
- if len(response.Topics[0].Partitions[0].Isr) != 0 {
- t.Error("Decoding produced invalid topic 0 partition 0 isr length.")
- }
-
- if response.Topics[1].Err != ErrNoError {
- t.Error("Decoding produced invalid topic 1 error.")
- }
-
- if response.Topics[1].Name != "bar" {
- t.Error("Decoding produced invalid topic 0 name.")
- }
-
- if len(response.Topics[1].Partitions) != 0 {
- t.Error("Decoding produced invalid partition count for topic 1.")
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/metrics.go b/vendor/src/github.com/Shopify/sarama/metrics.go
deleted file mode 100644
index 4869708e9..000000000
--- a/vendor/src/github.com/Shopify/sarama/metrics.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package sarama
-
-import (
- "fmt"
- "strings"
-
- "github.com/rcrowley/go-metrics"
-)
-
-// Use exponentially decaying reservoir for sampling histograms with the same defaults as the Java library:
-// 1028 elements, which offers a 99.9% confidence level with a 5% margin of error assuming a normal distribution,
-// and an alpha factor of 0.015, which heavily biases the reservoir to the past 5 minutes of measurements.
-// See https://github.com/dropwizard/metrics/blob/v3.1.0/metrics-core/src/main/java/com/codahale/metrics/ExponentiallyDecayingReservoir.java#L38
-const (
- metricsReservoirSize = 1028
- metricsAlphaFactor = 0.015
-)
-
-func getOrRegisterHistogram(name string, r metrics.Registry) metrics.Histogram {
- return r.GetOrRegister(name, func() metrics.Histogram {
- return metrics.NewHistogram(metrics.NewExpDecaySample(metricsReservoirSize, metricsAlphaFactor))
- }).(metrics.Histogram)
-}
-
-func getMetricNameForBroker(name string, broker *Broker) string {
- // Use broker id like the Java client as it does not contain '.' or ':' characters that
- // can be interpreted as special character by monitoring tool (e.g. Graphite)
- return fmt.Sprintf(name+"-for-broker-%d", broker.ID())
-}
-
-func getOrRegisterBrokerMeter(name string, broker *Broker, r metrics.Registry) metrics.Meter {
- return metrics.GetOrRegisterMeter(getMetricNameForBroker(name, broker), r)
-}
-
-func getOrRegisterBrokerHistogram(name string, broker *Broker, r metrics.Registry) metrics.Histogram {
- return getOrRegisterHistogram(getMetricNameForBroker(name, broker), r)
-}
-
-func getMetricNameForTopic(name string, topic string) string {
- // Convert dot to _ since reporters like Graphite typically use dot to represent hierarchy
- // cf. KAFKA-1902 and KAFKA-2337
- return fmt.Sprintf(name+"-for-topic-%s", strings.Replace(topic, ".", "_", -1))
-}
-
-func getOrRegisterTopicMeter(name string, topic string, r metrics.Registry) metrics.Meter {
- return metrics.GetOrRegisterMeter(getMetricNameForTopic(name, topic), r)
-}
-
-func getOrRegisterTopicHistogram(name string, topic string, r metrics.Registry) metrics.Histogram {
- return getOrRegisterHistogram(getMetricNameForTopic(name, topic), r)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/metrics_test.go b/vendor/src/github.com/Shopify/sarama/metrics_test.go
deleted file mode 100644
index 789c0ff33..000000000
--- a/vendor/src/github.com/Shopify/sarama/metrics_test.go
+++ /dev/null
@@ -1,172 +0,0 @@
-package sarama
-
-import (
- "testing"
-
- "github.com/rcrowley/go-metrics"
-)
-
-func TestGetOrRegisterHistogram(t *testing.T) {
- metricRegistry := metrics.NewRegistry()
- histogram := getOrRegisterHistogram("name", metricRegistry)
-
- if histogram == nil {
- t.Error("Unexpected nil histogram")
- }
-
- // Fetch the metric
- foundHistogram := metricRegistry.Get("name")
-
- if foundHistogram != histogram {
- t.Error("Unexpected different histogram", foundHistogram, histogram)
- }
-
- // Try to register the metric again
- sameHistogram := getOrRegisterHistogram("name", metricRegistry)
-
- if sameHistogram != histogram {
- t.Error("Unexpected different histogram", sameHistogram, histogram)
- }
-}
-
-func TestGetMetricNameForBroker(t *testing.T) {
- metricName := getMetricNameForBroker("name", &Broker{id: 1})
-
- if metricName != "name-for-broker-1" {
- t.Error("Unexpected metric name", metricName)
- }
-}
-
-// Common type and functions for metric validation
-type metricValidator struct {
- name string
- validator func(*testing.T, interface{})
-}
-
-type metricValidators []*metricValidator
-
-func newMetricValidators() metricValidators {
- return make([]*metricValidator, 0, 32)
-}
-
-func (m *metricValidators) register(validator *metricValidator) {
- *m = append(*m, validator)
-}
-
-func (m *metricValidators) registerForBroker(broker *Broker, validator *metricValidator) {
- m.register(&metricValidator{getMetricNameForBroker(validator.name, broker), validator.validator})
-}
-
-func (m *metricValidators) registerForGlobalAndTopic(topic string, validator *metricValidator) {
- m.register(&metricValidator{validator.name, validator.validator})
- m.register(&metricValidator{getMetricNameForTopic(validator.name, topic), validator.validator})
-}
-
-func (m *metricValidators) registerForAllBrokers(broker *Broker, validator *metricValidator) {
- m.register(validator)
- m.registerForBroker(broker, validator)
-}
-
-func (m metricValidators) run(t *testing.T, r metrics.Registry) {
- for _, metricValidator := range m {
- metric := r.Get(metricValidator.name)
- if metric == nil {
- t.Error("No metric named", metricValidator.name)
- } else {
- metricValidator.validator(t, metric)
- }
- }
-}
-
-func meterValidator(name string, extraValidator func(*testing.T, metrics.Meter)) *metricValidator {
- return &metricValidator{
- name: name,
- validator: func(t *testing.T, metric interface{}) {
- if meter, ok := metric.(metrics.Meter); !ok {
- t.Errorf("Expected meter metric for '%s', got %T", name, metric)
- } else {
- extraValidator(t, meter)
- }
- },
- }
-}
-
-func countMeterValidator(name string, expectedCount int) *metricValidator {
- return meterValidator(name, func(t *testing.T, meter metrics.Meter) {
- count := meter.Count()
- if count != int64(expectedCount) {
- t.Errorf("Expected meter metric '%s' count = %d, got %d", name, expectedCount, count)
- }
- })
-}
-
-func minCountMeterValidator(name string, minCount int) *metricValidator {
- return meterValidator(name, func(t *testing.T, meter metrics.Meter) {
- count := meter.Count()
- if count < int64(minCount) {
- t.Errorf("Expected meter metric '%s' count >= %d, got %d", name, minCount, count)
- }
- })
-}
-
-func histogramValidator(name string, extraValidator func(*testing.T, metrics.Histogram)) *metricValidator {
- return &metricValidator{
- name: name,
- validator: func(t *testing.T, metric interface{}) {
- if histogram, ok := metric.(metrics.Histogram); !ok {
- t.Errorf("Expected histogram metric for '%s', got %T", name, metric)
- } else {
- extraValidator(t, histogram)
- }
- },
- }
-}
-
-func countHistogramValidator(name string, expectedCount int) *metricValidator {
- return histogramValidator(name, func(t *testing.T, histogram metrics.Histogram) {
- count := histogram.Count()
- if count != int64(expectedCount) {
- t.Errorf("Expected histogram metric '%s' count = %d, got %d", name, expectedCount, count)
- }
- })
-}
-
-func minCountHistogramValidator(name string, minCount int) *metricValidator {
- return histogramValidator(name, func(t *testing.T, histogram metrics.Histogram) {
- count := histogram.Count()
- if count < int64(minCount) {
- t.Errorf("Expected histogram metric '%s' count >= %d, got %d", name, minCount, count)
- }
- })
-}
-
-func minMaxHistogramValidator(name string, expectedMin int, expectedMax int) *metricValidator {
- return histogramValidator(name, func(t *testing.T, histogram metrics.Histogram) {
- min := int(histogram.Min())
- if min != expectedMin {
- t.Errorf("Expected histogram metric '%s' min = %d, got %d", name, expectedMin, min)
- }
- max := int(histogram.Max())
- if max != expectedMax {
- t.Errorf("Expected histogram metric '%s' max = %d, got %d", name, expectedMax, max)
- }
- })
-}
-
-func minValHistogramValidator(name string, minMin int) *metricValidator {
- return histogramValidator(name, func(t *testing.T, histogram metrics.Histogram) {
- min := int(histogram.Min())
- if min < minMin {
- t.Errorf("Expected histogram metric '%s' min >= %d, got %d", name, minMin, min)
- }
- })
-}
-
-func maxValHistogramValidator(name string, maxMax int) *metricValidator {
- return histogramValidator(name, func(t *testing.T, histogram metrics.Histogram) {
- max := int(histogram.Max())
- if max > maxMax {
- t.Errorf("Expected histogram metric '%s' max <= %d, got %d", name, maxMax, max)
- }
- })
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mockbroker.go b/vendor/src/github.com/Shopify/sarama/mockbroker.go
deleted file mode 100644
index 0734d34f6..000000000
--- a/vendor/src/github.com/Shopify/sarama/mockbroker.go
+++ /dev/null
@@ -1,324 +0,0 @@
-package sarama
-
-import (
- "bytes"
- "encoding/binary"
- "fmt"
- "io"
- "net"
- "reflect"
- "strconv"
- "sync"
- "time"
-
- "github.com/davecgh/go-spew/spew"
-)
-
-const (
- expectationTimeout = 500 * time.Millisecond
-)
-
-type requestHandlerFunc func(req *request) (res encoder)
-
-// RequestNotifierFunc is invoked when a mock broker processes a request successfully
-// and will provides the number of bytes read and written.
-type RequestNotifierFunc func(bytesRead, bytesWritten int)
-
-// MockBroker is a mock Kafka broker that is used in unit tests. It is exposed
-// to facilitate testing of higher level or specialized consumers and producers
-// built on top of Sarama. Note that it does not 'mimic' the Kafka API protocol,
-// but rather provides a facility to do that. It takes care of the TCP
-// transport, request unmarshaling, response marshaling, and makes it the test
-// writer responsibility to program correct according to the Kafka API protocol
-// MockBroker behaviour.
-//
-// MockBroker is implemented as a TCP server listening on a kernel-selected
-// localhost port that can accept many connections. It reads Kafka requests
-// from that connection and returns responses programmed by the SetHandlerByMap
-// function. If a MockBroker receives a request that it has no programmed
-// response for, then it returns nothing and the request times out.
-//
-// A set of MockRequest builders to define mappings used by MockBroker is
-// provided by Sarama. But users can develop MockRequests of their own and use
-// them along with or instead of the standard ones.
-//
-// When running tests with MockBroker it is strongly recommended to specify
-// a timeout to `go test` so that if the broker hangs waiting for a response,
-// the test panics.
-//
-// It is not necessary to prefix message length or correlation ID to your
-// response bytes, the server does that automatically as a convenience.
-type MockBroker struct {
- brokerID int32
- port int32
- closing chan none
- stopper chan none
- expectations chan encoder
- listener net.Listener
- t TestReporter
- latency time.Duration
- handler requestHandlerFunc
- notifier RequestNotifierFunc
- history []RequestResponse
- lock sync.Mutex
-}
-
-// RequestResponse represents a Request/Response pair processed by MockBroker.
-type RequestResponse struct {
- Request protocolBody
- Response encoder
-}
-
-// SetLatency makes broker pause for the specified period every time before
-// replying.
-func (b *MockBroker) SetLatency(latency time.Duration) {
- b.latency = latency
-}
-
-// SetHandlerByMap defines mapping of Request types to MockResponses. When a
-// request is received by the broker, it looks up the request type in the map
-// and uses the found MockResponse instance to generate an appropriate reply.
-// If the request type is not found in the map then nothing is sent.
-func (b *MockBroker) SetHandlerByMap(handlerMap map[string]MockResponse) {
- b.setHandler(func(req *request) (res encoder) {
- reqTypeName := reflect.TypeOf(req.body).Elem().Name()
- mockResponse := handlerMap[reqTypeName]
- if mockResponse == nil {
- return nil
- }
- return mockResponse.For(req.body)
- })
-}
-
-// SetNotifier set a function that will get invoked whenever a request has been
-// processed successfully and will provide the number of bytes read and written
-func (b *MockBroker) SetNotifier(notifier RequestNotifierFunc) {
- b.lock.Lock()
- b.notifier = notifier
- b.lock.Unlock()
-}
-
-// BrokerID returns broker ID assigned to the broker.
-func (b *MockBroker) BrokerID() int32 {
- return b.brokerID
-}
-
-// History returns a slice of RequestResponse pairs in the order they were
-// processed by the broker. Note that in case of multiple connections to the
-// broker the order expected by a test can be different from the order recorded
-// in the history, unless some synchronization is implemented in the test.
-func (b *MockBroker) History() []RequestResponse {
- b.lock.Lock()
- history := make([]RequestResponse, len(b.history))
- copy(history, b.history)
- b.lock.Unlock()
- return history
-}
-
-// Port returns the TCP port number the broker is listening for requests on.
-func (b *MockBroker) Port() int32 {
- return b.port
-}
-
-// Addr returns the broker connection string in the form "
:".
-func (b *MockBroker) Addr() string {
- return b.listener.Addr().String()
-}
-
-// Close terminates the broker blocking until it stops internal goroutines and
-// releases all resources.
-func (b *MockBroker) Close() {
- close(b.expectations)
- if len(b.expectations) > 0 {
- buf := bytes.NewBufferString(fmt.Sprintf("mockbroker/%d: not all expectations were satisfied! Still waiting on:\n", b.BrokerID()))
- for e := range b.expectations {
- _, _ = buf.WriteString(spew.Sdump(e))
- }
- b.t.Error(buf.String())
- }
- close(b.closing)
- <-b.stopper
-}
-
-// setHandler sets the specified function as the request handler. Whenever
-// a mock broker reads a request from the wire it passes the request to the
-// function and sends back whatever the handler function returns.
-func (b *MockBroker) setHandler(handler requestHandlerFunc) {
- b.lock.Lock()
- b.handler = handler
- b.lock.Unlock()
-}
-
-func (b *MockBroker) serverLoop() {
- defer close(b.stopper)
- var err error
- var conn net.Conn
-
- go func() {
- <-b.closing
- err := b.listener.Close()
- if err != nil {
- b.t.Error(err)
- }
- }()
-
- wg := &sync.WaitGroup{}
- i := 0
- for conn, err = b.listener.Accept(); err == nil; conn, err = b.listener.Accept() {
- wg.Add(1)
- go b.handleRequests(conn, i, wg)
- i++
- }
- wg.Wait()
- Logger.Printf("*** mockbroker/%d: listener closed, err=%v", b.BrokerID(), err)
-}
-
-func (b *MockBroker) handleRequests(conn net.Conn, idx int, wg *sync.WaitGroup) {
- defer wg.Done()
- defer func() {
- _ = conn.Close()
- }()
- Logger.Printf("*** mockbroker/%d/%d: connection opened", b.BrokerID(), idx)
- var err error
-
- abort := make(chan none)
- defer close(abort)
- go func() {
- select {
- case <-b.closing:
- _ = conn.Close()
- case <-abort:
- }
- }()
-
- resHeader := make([]byte, 8)
- for {
- req, bytesRead, err := decodeRequest(conn)
- if err != nil {
- Logger.Printf("*** mockbroker/%d/%d: invalid request: err=%+v, %+v", b.brokerID, idx, err, spew.Sdump(req))
- b.serverError(err)
- break
- }
-
- if b.latency > 0 {
- time.Sleep(b.latency)
- }
-
- b.lock.Lock()
- res := b.handler(req)
- b.history = append(b.history, RequestResponse{req.body, res})
- b.lock.Unlock()
-
- if res == nil {
- Logger.Printf("*** mockbroker/%d/%d: ignored %v", b.brokerID, idx, spew.Sdump(req))
- continue
- }
- Logger.Printf("*** mockbroker/%d/%d: served %v -> %v", b.brokerID, idx, req, res)
-
- encodedRes, err := encode(res, nil)
- if err != nil {
- b.serverError(err)
- break
- }
- if len(encodedRes) == 0 {
- b.lock.Lock()
- if b.notifier != nil {
- b.notifier(bytesRead, 0)
- }
- b.lock.Unlock()
- continue
- }
-
- binary.BigEndian.PutUint32(resHeader, uint32(len(encodedRes)+4))
- binary.BigEndian.PutUint32(resHeader[4:], uint32(req.correlationID))
- if _, err = conn.Write(resHeader); err != nil {
- b.serverError(err)
- break
- }
- if _, err = conn.Write(encodedRes); err != nil {
- b.serverError(err)
- break
- }
-
- b.lock.Lock()
- if b.notifier != nil {
- b.notifier(bytesRead, len(resHeader)+len(encodedRes))
- }
- b.lock.Unlock()
- }
- Logger.Printf("*** mockbroker/%d/%d: connection closed, err=%v", b.BrokerID(), idx, err)
-}
-
-func (b *MockBroker) defaultRequestHandler(req *request) (res encoder) {
- select {
- case res, ok := <-b.expectations:
- if !ok {
- return nil
- }
- return res
- case <-time.After(expectationTimeout):
- return nil
- }
-}
-
-func (b *MockBroker) serverError(err error) {
- isConnectionClosedError := false
- if _, ok := err.(*net.OpError); ok {
- isConnectionClosedError = true
- } else if err == io.EOF {
- isConnectionClosedError = true
- } else if err.Error() == "use of closed network connection" {
- isConnectionClosedError = true
- }
-
- if isConnectionClosedError {
- return
- }
-
- b.t.Errorf(err.Error())
-}
-
-// NewMockBroker launches a fake Kafka broker. It takes a TestReporter as provided by the
-// test framework and a channel of responses to use. If an error occurs it is
-// simply logged to the TestReporter and the broker exits.
-func NewMockBroker(t TestReporter, brokerID int32) *MockBroker {
- return NewMockBrokerAddr(t, brokerID, "localhost:0")
-}
-
-// NewMockBrokerAddr behaves like newMockBroker but listens on the address you give
-// it rather than just some ephemeral port.
-func NewMockBrokerAddr(t TestReporter, brokerID int32, addr string) *MockBroker {
- var err error
-
- broker := &MockBroker{
- closing: make(chan none),
- stopper: make(chan none),
- t: t,
- brokerID: brokerID,
- expectations: make(chan encoder, 512),
- }
- broker.handler = broker.defaultRequestHandler
-
- broker.listener, err = net.Listen("tcp", addr)
- if err != nil {
- t.Fatal(err)
- }
- Logger.Printf("*** mockbroker/%d listening on %s\n", brokerID, broker.listener.Addr().String())
- _, portStr, err := net.SplitHostPort(broker.listener.Addr().String())
- if err != nil {
- t.Fatal(err)
- }
- tmp, err := strconv.ParseInt(portStr, 10, 32)
- if err != nil {
- t.Fatal(err)
- }
- broker.port = int32(tmp)
-
- go broker.serverLoop()
-
- return broker
-}
-
-func (b *MockBroker) Returns(e encoder) {
- b.expectations <- e
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mockresponses.go b/vendor/src/github.com/Shopify/sarama/mockresponses.go
deleted file mode 100644
index a20314209..000000000
--- a/vendor/src/github.com/Shopify/sarama/mockresponses.go
+++ /dev/null
@@ -1,455 +0,0 @@
-package sarama
-
-import (
- "fmt"
-)
-
-// TestReporter has methods matching go's testing.T to avoid importing
-// `testing` in the main part of the library.
-type TestReporter interface {
- Error(...interface{})
- Errorf(string, ...interface{})
- Fatal(...interface{})
- Fatalf(string, ...interface{})
-}
-
-// MockResponse is a response builder interface it defines one method that
-// allows generating a response based on a request body. MockResponses are used
-// to program behavior of MockBroker in tests.
-type MockResponse interface {
- For(reqBody versionedDecoder) (res encoder)
-}
-
-// MockWrapper is a mock response builder that returns a particular concrete
-// response regardless of the actual request passed to the `For` method.
-type MockWrapper struct {
- res encoder
-}
-
-func (mw *MockWrapper) For(reqBody versionedDecoder) (res encoder) {
- return mw.res
-}
-
-func NewMockWrapper(res encoder) *MockWrapper {
- return &MockWrapper{res: res}
-}
-
-// MockSequence is a mock response builder that is created from a sequence of
-// concrete responses. Every time when a `MockBroker` calls its `For` method
-// the next response from the sequence is returned. When the end of the
-// sequence is reached the last element from the sequence is returned.
-type MockSequence struct {
- responses []MockResponse
-}
-
-func NewMockSequence(responses ...interface{}) *MockSequence {
- ms := &MockSequence{}
- ms.responses = make([]MockResponse, len(responses))
- for i, res := range responses {
- switch res := res.(type) {
- case MockResponse:
- ms.responses[i] = res
- case encoder:
- ms.responses[i] = NewMockWrapper(res)
- default:
- panic(fmt.Sprintf("Unexpected response type: %T", res))
- }
- }
- return ms
-}
-
-func (mc *MockSequence) For(reqBody versionedDecoder) (res encoder) {
- res = mc.responses[0].For(reqBody)
- if len(mc.responses) > 1 {
- mc.responses = mc.responses[1:]
- }
- return res
-}
-
-// MockMetadataResponse is a `MetadataResponse` builder.
-type MockMetadataResponse struct {
- leaders map[string]map[int32]int32
- brokers map[string]int32
- t TestReporter
-}
-
-func NewMockMetadataResponse(t TestReporter) *MockMetadataResponse {
- return &MockMetadataResponse{
- leaders: make(map[string]map[int32]int32),
- brokers: make(map[string]int32),
- t: t,
- }
-}
-
-func (mmr *MockMetadataResponse) SetLeader(topic string, partition, brokerID int32) *MockMetadataResponse {
- partitions := mmr.leaders[topic]
- if partitions == nil {
- partitions = make(map[int32]int32)
- mmr.leaders[topic] = partitions
- }
- partitions[partition] = brokerID
- return mmr
-}
-
-func (mmr *MockMetadataResponse) SetBroker(addr string, brokerID int32) *MockMetadataResponse {
- mmr.brokers[addr] = brokerID
- return mmr
-}
-
-func (mmr *MockMetadataResponse) For(reqBody versionedDecoder) encoder {
- metadataRequest := reqBody.(*MetadataRequest)
- metadataResponse := &MetadataResponse{}
- for addr, brokerID := range mmr.brokers {
- metadataResponse.AddBroker(addr, brokerID)
- }
- if len(metadataRequest.Topics) == 0 {
- for topic, partitions := range mmr.leaders {
- for partition, brokerID := range partitions {
- metadataResponse.AddTopicPartition(topic, partition, brokerID, nil, nil, ErrNoError)
- }
- }
- return metadataResponse
- }
- for _, topic := range metadataRequest.Topics {
- for partition, brokerID := range mmr.leaders[topic] {
- metadataResponse.AddTopicPartition(topic, partition, brokerID, nil, nil, ErrNoError)
- }
- }
- return metadataResponse
-}
-
-// MockOffsetResponse is an `OffsetResponse` builder.
-type MockOffsetResponse struct {
- offsets map[string]map[int32]map[int64]int64
- t TestReporter
-}
-
-func NewMockOffsetResponse(t TestReporter) *MockOffsetResponse {
- return &MockOffsetResponse{
- offsets: make(map[string]map[int32]map[int64]int64),
- t: t,
- }
-}
-
-func (mor *MockOffsetResponse) SetOffset(topic string, partition int32, time, offset int64) *MockOffsetResponse {
- partitions := mor.offsets[topic]
- if partitions == nil {
- partitions = make(map[int32]map[int64]int64)
- mor.offsets[topic] = partitions
- }
- times := partitions[partition]
- if times == nil {
- times = make(map[int64]int64)
- partitions[partition] = times
- }
- times[time] = offset
- return mor
-}
-
-func (mor *MockOffsetResponse) For(reqBody versionedDecoder) encoder {
- offsetRequest := reqBody.(*OffsetRequest)
- offsetResponse := &OffsetResponse{}
- for topic, partitions := range offsetRequest.blocks {
- for partition, block := range partitions {
- offset := mor.getOffset(topic, partition, block.time)
- offsetResponse.AddTopicPartition(topic, partition, offset)
- }
- }
- return offsetResponse
-}
-
-func (mor *MockOffsetResponse) getOffset(topic string, partition int32, time int64) int64 {
- partitions := mor.offsets[topic]
- if partitions == nil {
- mor.t.Errorf("missing topic: %s", topic)
- }
- times := partitions[partition]
- if times == nil {
- mor.t.Errorf("missing partition: %d", partition)
- }
- offset, ok := times[time]
- if !ok {
- mor.t.Errorf("missing time: %d", time)
- }
- return offset
-}
-
-// MockFetchResponse is a `FetchResponse` builder.
-type MockFetchResponse struct {
- messages map[string]map[int32]map[int64]Encoder
- highWaterMarks map[string]map[int32]int64
- t TestReporter
- batchSize int
-}
-
-func NewMockFetchResponse(t TestReporter, batchSize int) *MockFetchResponse {
- return &MockFetchResponse{
- messages: make(map[string]map[int32]map[int64]Encoder),
- highWaterMarks: make(map[string]map[int32]int64),
- t: t,
- batchSize: batchSize,
- }
-}
-
-func (mfr *MockFetchResponse) SetMessage(topic string, partition int32, offset int64, msg Encoder) *MockFetchResponse {
- partitions := mfr.messages[topic]
- if partitions == nil {
- partitions = make(map[int32]map[int64]Encoder)
- mfr.messages[topic] = partitions
- }
- messages := partitions[partition]
- if messages == nil {
- messages = make(map[int64]Encoder)
- partitions[partition] = messages
- }
- messages[offset] = msg
- return mfr
-}
-
-func (mfr *MockFetchResponse) SetHighWaterMark(topic string, partition int32, offset int64) *MockFetchResponse {
- partitions := mfr.highWaterMarks[topic]
- if partitions == nil {
- partitions = make(map[int32]int64)
- mfr.highWaterMarks[topic] = partitions
- }
- partitions[partition] = offset
- return mfr
-}
-
-func (mfr *MockFetchResponse) For(reqBody versionedDecoder) encoder {
- fetchRequest := reqBody.(*FetchRequest)
- res := &FetchResponse{}
- for topic, partitions := range fetchRequest.blocks {
- for partition, block := range partitions {
- initialOffset := block.fetchOffset
- offset := initialOffset
- maxOffset := initialOffset + int64(mfr.getMessageCount(topic, partition))
- for i := 0; i < mfr.batchSize && offset < maxOffset; {
- msg := mfr.getMessage(topic, partition, offset)
- if msg != nil {
- res.AddMessage(topic, partition, nil, msg, offset)
- i++
- }
- offset++
- }
- fb := res.GetBlock(topic, partition)
- if fb == nil {
- res.AddError(topic, partition, ErrNoError)
- fb = res.GetBlock(topic, partition)
- }
- fb.HighWaterMarkOffset = mfr.getHighWaterMark(topic, partition)
- }
- }
- return res
-}
-
-func (mfr *MockFetchResponse) getMessage(topic string, partition int32, offset int64) Encoder {
- partitions := mfr.messages[topic]
- if partitions == nil {
- return nil
- }
- messages := partitions[partition]
- if messages == nil {
- return nil
- }
- return messages[offset]
-}
-
-func (mfr *MockFetchResponse) getMessageCount(topic string, partition int32) int {
- partitions := mfr.messages[topic]
- if partitions == nil {
- return 0
- }
- messages := partitions[partition]
- if messages == nil {
- return 0
- }
- return len(messages)
-}
-
-func (mfr *MockFetchResponse) getHighWaterMark(topic string, partition int32) int64 {
- partitions := mfr.highWaterMarks[topic]
- if partitions == nil {
- return 0
- }
- return partitions[partition]
-}
-
-// MockConsumerMetadataResponse is a `ConsumerMetadataResponse` builder.
-type MockConsumerMetadataResponse struct {
- coordinators map[string]interface{}
- t TestReporter
-}
-
-func NewMockConsumerMetadataResponse(t TestReporter) *MockConsumerMetadataResponse {
- return &MockConsumerMetadataResponse{
- coordinators: make(map[string]interface{}),
- t: t,
- }
-}
-
-func (mr *MockConsumerMetadataResponse) SetCoordinator(group string, broker *MockBroker) *MockConsumerMetadataResponse {
- mr.coordinators[group] = broker
- return mr
-}
-
-func (mr *MockConsumerMetadataResponse) SetError(group string, kerror KError) *MockConsumerMetadataResponse {
- mr.coordinators[group] = kerror
- return mr
-}
-
-func (mr *MockConsumerMetadataResponse) For(reqBody versionedDecoder) encoder {
- req := reqBody.(*ConsumerMetadataRequest)
- group := req.ConsumerGroup
- res := &ConsumerMetadataResponse{}
- v := mr.coordinators[group]
- switch v := v.(type) {
- case *MockBroker:
- res.Coordinator = &Broker{id: v.BrokerID(), addr: v.Addr()}
- case KError:
- res.Err = v
- }
- return res
-}
-
-// MockOffsetCommitResponse is a `OffsetCommitResponse` builder.
-type MockOffsetCommitResponse struct {
- errors map[string]map[string]map[int32]KError
- t TestReporter
-}
-
-func NewMockOffsetCommitResponse(t TestReporter) *MockOffsetCommitResponse {
- return &MockOffsetCommitResponse{t: t}
-}
-
-func (mr *MockOffsetCommitResponse) SetError(group, topic string, partition int32, kerror KError) *MockOffsetCommitResponse {
- if mr.errors == nil {
- mr.errors = make(map[string]map[string]map[int32]KError)
- }
- topics := mr.errors[group]
- if topics == nil {
- topics = make(map[string]map[int32]KError)
- mr.errors[group] = topics
- }
- partitions := topics[topic]
- if partitions == nil {
- partitions = make(map[int32]KError)
- topics[topic] = partitions
- }
- partitions[partition] = kerror
- return mr
-}
-
-func (mr *MockOffsetCommitResponse) For(reqBody versionedDecoder) encoder {
- req := reqBody.(*OffsetCommitRequest)
- group := req.ConsumerGroup
- res := &OffsetCommitResponse{}
- for topic, partitions := range req.blocks {
- for partition := range partitions {
- res.AddError(topic, partition, mr.getError(group, topic, partition))
- }
- }
- return res
-}
-
-func (mr *MockOffsetCommitResponse) getError(group, topic string, partition int32) KError {
- topics := mr.errors[group]
- if topics == nil {
- return ErrNoError
- }
- partitions := topics[topic]
- if partitions == nil {
- return ErrNoError
- }
- kerror, ok := partitions[partition]
- if !ok {
- return ErrNoError
- }
- return kerror
-}
-
-// MockProduceResponse is a `ProduceResponse` builder.
-type MockProduceResponse struct {
- errors map[string]map[int32]KError
- t TestReporter
-}
-
-func NewMockProduceResponse(t TestReporter) *MockProduceResponse {
- return &MockProduceResponse{t: t}
-}
-
-func (mr *MockProduceResponse) SetError(topic string, partition int32, kerror KError) *MockProduceResponse {
- if mr.errors == nil {
- mr.errors = make(map[string]map[int32]KError)
- }
- partitions := mr.errors[topic]
- if partitions == nil {
- partitions = make(map[int32]KError)
- mr.errors[topic] = partitions
- }
- partitions[partition] = kerror
- return mr
-}
-
-func (mr *MockProduceResponse) For(reqBody versionedDecoder) encoder {
- req := reqBody.(*ProduceRequest)
- res := &ProduceResponse{}
- for topic, partitions := range req.msgSets {
- for partition := range partitions {
- res.AddTopicPartition(topic, partition, mr.getError(topic, partition))
- }
- }
- return res
-}
-
-func (mr *MockProduceResponse) getError(topic string, partition int32) KError {
- partitions := mr.errors[topic]
- if partitions == nil {
- return ErrNoError
- }
- kerror, ok := partitions[partition]
- if !ok {
- return ErrNoError
- }
- return kerror
-}
-
-// MockOffsetFetchResponse is a `OffsetFetchResponse` builder.
-type MockOffsetFetchResponse struct {
- offsets map[string]map[string]map[int32]*OffsetFetchResponseBlock
- t TestReporter
-}
-
-func NewMockOffsetFetchResponse(t TestReporter) *MockOffsetFetchResponse {
- return &MockOffsetFetchResponse{t: t}
-}
-
-func (mr *MockOffsetFetchResponse) SetOffset(group, topic string, partition int32, offset int64, metadata string, kerror KError) *MockOffsetFetchResponse {
- if mr.offsets == nil {
- mr.offsets = make(map[string]map[string]map[int32]*OffsetFetchResponseBlock)
- }
- topics := mr.offsets[group]
- if topics == nil {
- topics = make(map[string]map[int32]*OffsetFetchResponseBlock)
- mr.offsets[group] = topics
- }
- partitions := topics[topic]
- if partitions == nil {
- partitions = make(map[int32]*OffsetFetchResponseBlock)
- topics[topic] = partitions
- }
- partitions[partition] = &OffsetFetchResponseBlock{offset, metadata, kerror}
- return mr
-}
-
-func (mr *MockOffsetFetchResponse) For(reqBody versionedDecoder) encoder {
- req := reqBody.(*OffsetFetchRequest)
- group := req.ConsumerGroup
- res := &OffsetFetchResponse{}
- for topic, partitions := range mr.offsets[group] {
- for partition, block := range partitions {
- res.AddBlock(topic, partition, block)
- }
- }
- return res
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mocks/README.md b/vendor/src/github.com/Shopify/sarama/mocks/README.md
deleted file mode 100644
index 55a6c2e61..000000000
--- a/vendor/src/github.com/Shopify/sarama/mocks/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# sarama/mocks
-
-The `mocks` subpackage includes mock implementations that implement the interfaces of the major sarama types.
-You can use them to test your sarama applications using dependency injection.
-
-The following mock objects are available:
-
-- [Consumer](https://godoc.org/github.com/Shopify/sarama/mocks#Consumer), which will create [PartitionConsumer](https://godoc.org/github.com/Shopify/sarama/mocks#PartitionConsumer) mocks.
-- [AsyncProducer](https://godoc.org/github.com/Shopify/sarama/mocks#AsyncProducer)
-- [SyncProducer](https://godoc.org/github.com/Shopify/sarama/mocks#SyncProducer)
-
-The mocks allow you to set expectations on them. When you close the mocks, the expectations will be verified,
-and the results will be reported to the `*testing.T` object you provided when creating the mock.
diff --git a/vendor/src/github.com/Shopify/sarama/mocks/async_producer.go b/vendor/src/github.com/Shopify/sarama/mocks/async_producer.go
deleted file mode 100644
index d1d9ba416..000000000
--- a/vendor/src/github.com/Shopify/sarama/mocks/async_producer.go
+++ /dev/null
@@ -1,174 +0,0 @@
-package mocks
-
-import (
- "sync"
-
- "github.com/Shopify/sarama"
-)
-
-// AsyncProducer implements sarama's Producer interface for testing purposes.
-// Before you can send messages to it's Input channel, you have to set expectations
-// so it knows how to handle the input; it returns an error if the number of messages
-// received is bigger then the number of expectations set. You can also set a
-// function in each expectation so that the message value is checked by this function
-// and an error is returned if the match fails.
-type AsyncProducer struct {
- l sync.Mutex
- t ErrorReporter
- expectations []*producerExpectation
- closed chan struct{}
- input chan *sarama.ProducerMessage
- successes chan *sarama.ProducerMessage
- errors chan *sarama.ProducerError
- lastOffset int64
-}
-
-// NewAsyncProducer instantiates a new Producer mock. The t argument should
-// be the *testing.T instance of your test method. An error will be written to it if
-// an expectation is violated. The config argument is used to determine whether it
-// should ack successes on the Successes channel.
-func NewAsyncProducer(t ErrorReporter, config *sarama.Config) *AsyncProducer {
- if config == nil {
- config = sarama.NewConfig()
- }
- mp := &AsyncProducer{
- t: t,
- closed: make(chan struct{}, 0),
- expectations: make([]*producerExpectation, 0),
- input: make(chan *sarama.ProducerMessage, config.ChannelBufferSize),
- successes: make(chan *sarama.ProducerMessage, config.ChannelBufferSize),
- errors: make(chan *sarama.ProducerError, config.ChannelBufferSize),
- }
-
- go func() {
- defer func() {
- close(mp.successes)
- close(mp.errors)
- }()
-
- for msg := range mp.input {
- mp.l.Lock()
- if mp.expectations == nil || len(mp.expectations) == 0 {
- mp.expectations = nil
- mp.t.Errorf("No more expectation set on this mock producer to handle the input message.")
- } else {
- expectation := mp.expectations[0]
- mp.expectations = mp.expectations[1:]
- if expectation.CheckFunction != nil {
- if val, err := msg.Value.Encode(); err != nil {
- mp.t.Errorf("Input message encoding failed: %s", err.Error())
- mp.errors <- &sarama.ProducerError{Err: err, Msg: msg}
- } else {
- err = expectation.CheckFunction(val)
- if err != nil {
- mp.t.Errorf("Check function returned an error: %s", err.Error())
- mp.errors <- &sarama.ProducerError{Err: err, Msg: msg}
- }
- }
- }
- if expectation.Result == errProduceSuccess {
- mp.lastOffset++
- if config.Producer.Return.Successes {
- msg.Offset = mp.lastOffset
- mp.successes <- msg
- }
- } else {
- if config.Producer.Return.Errors {
- mp.errors <- &sarama.ProducerError{Err: expectation.Result, Msg: msg}
- }
- }
- }
- mp.l.Unlock()
- }
-
- mp.l.Lock()
- if len(mp.expectations) > 0 {
- mp.t.Errorf("Expected to exhaust all expectations, but %d are left.", len(mp.expectations))
- }
- mp.l.Unlock()
-
- close(mp.closed)
- }()
-
- return mp
-}
-
-////////////////////////////////////////////////
-// Implement Producer interface
-////////////////////////////////////////////////
-
-// AsyncClose corresponds with the AsyncClose method of sarama's Producer implementation.
-// By closing a mock producer, you also tell it that no more input will be provided, so it will
-// write an error to the test state if there's any remaining expectations.
-func (mp *AsyncProducer) AsyncClose() {
- close(mp.input)
-}
-
-// Close corresponds with the Close method of sarama's Producer implementation.
-// By closing a mock producer, you also tell it that no more input will be provided, so it will
-// write an error to the test state if there's any remaining expectations.
-func (mp *AsyncProducer) Close() error {
- mp.AsyncClose()
- <-mp.closed
- return nil
-}
-
-// Input corresponds with the Input method of sarama's Producer implementation.
-// You have to set expectations on the mock producer before writing messages to the Input
-// channel, so it knows how to handle them. If there is no more remaining expectations and
-// a messages is written to the Input channel, the mock producer will write an error to the test
-// state object.
-func (mp *AsyncProducer) Input() chan<- *sarama.ProducerMessage {
- return mp.input
-}
-
-// Successes corresponds with the Successes method of sarama's Producer implementation.
-func (mp *AsyncProducer) Successes() <-chan *sarama.ProducerMessage {
- return mp.successes
-}
-
-// Errors corresponds with the Errors method of sarama's Producer implementation.
-func (mp *AsyncProducer) Errors() <-chan *sarama.ProducerError {
- return mp.errors
-}
-
-////////////////////////////////////////////////
-// Setting expectations
-////////////////////////////////////////////////
-
-// ExpectInputWithCheckerFunctionAndSucceed sets an expectation on the mock producer that a message
-// will be provided on the input channel. The mock producer will call the given function to check
-// the message value. If an error is returned it will be made available on the Errors channel
-// otherwise the mock will handle the message as if it produced successfully, i.e. it will make
-// it available on the Successes channel if the Producer.Return.Successes setting is set to true.
-func (mp *AsyncProducer) ExpectInputWithCheckerFunctionAndSucceed(cf ValueChecker) {
- mp.l.Lock()
- defer mp.l.Unlock()
- mp.expectations = append(mp.expectations, &producerExpectation{Result: errProduceSuccess, CheckFunction: cf})
-}
-
-// ExpectInputWithCheckerFunctionAndSucceed sets an expectation on the mock producer that a message
-// will be provided on the input channel. The mock producer will first call the given function to
-// check the message value. If an error is returned it will be made available on the Errors channel
-// otherwise the mock will handle the message as if it failed to produce successfully. This means
-// it will make a ProducerError available on the Errors channel.
-func (mp *AsyncProducer) ExpectInputWithCheckerFunctionAndFail(cf ValueChecker, err error) {
- mp.l.Lock()
- defer mp.l.Unlock()
- mp.expectations = append(mp.expectations, &producerExpectation{Result: err, CheckFunction: cf})
-}
-
-// ExpectInputAndSucceed sets an expectation on the mock producer that a message will be provided
-// on the input channel. The mock producer will handle the message as if it is produced successfully,
-// i.e. it will make it available on the Successes channel if the Producer.Return.Successes setting
-// is set to true.
-func (mp *AsyncProducer) ExpectInputAndSucceed() {
- mp.ExpectInputWithCheckerFunctionAndSucceed(nil)
-}
-
-// ExpectInputAndFail sets an expectation on the mock producer that a message will be provided
-// on the input channel. The mock producer will handle the message as if it failed to produce
-// successfully. This means it will make a ProducerError available on the Errors channel.
-func (mp *AsyncProducer) ExpectInputAndFail(err error) {
- mp.ExpectInputWithCheckerFunctionAndFail(nil, err)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mocks/async_producer_test.go b/vendor/src/github.com/Shopify/sarama/mocks/async_producer_test.go
deleted file mode 100644
index b5d92aad8..000000000
--- a/vendor/src/github.com/Shopify/sarama/mocks/async_producer_test.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package mocks
-
-import (
- "errors"
- "fmt"
- "regexp"
- "strings"
- "testing"
-
- "github.com/Shopify/sarama"
-)
-
-func generateRegexpChecker(re string) func([]byte) error {
- return func(val []byte) error {
- matched, err := regexp.MatchString(re, string(val))
- if err != nil {
- return errors.New("Error while trying to match the input message with the expected pattern: " + err.Error())
- }
- if !matched {
- return fmt.Errorf("No match between input value \"%s\" and expected pattern \"%s\"", val, re)
- }
- return nil
- }
-}
-
-type testReporterMock struct {
- errors []string
-}
-
-func newTestReporterMock() *testReporterMock {
- return &testReporterMock{errors: make([]string, 0)}
-}
-
-func (trm *testReporterMock) Errorf(format string, args ...interface{}) {
- trm.errors = append(trm.errors, fmt.Sprintf(format, args...))
-}
-
-func TestMockAsyncProducerImplementsAsyncProducerInterface(t *testing.T) {
- var mp interface{} = &AsyncProducer{}
- if _, ok := mp.(sarama.AsyncProducer); !ok {
- t.Error("The mock producer should implement the sarama.Producer interface.")
- }
-}
-
-func TestProducerReturnsExpectationsToChannels(t *testing.T) {
- config := sarama.NewConfig()
- config.Producer.Return.Successes = true
- mp := NewAsyncProducer(t, config)
-
- mp.ExpectInputAndSucceed()
- mp.ExpectInputAndSucceed()
- mp.ExpectInputAndFail(sarama.ErrOutOfBrokers)
-
- mp.Input() <- &sarama.ProducerMessage{Topic: "test 1"}
- mp.Input() <- &sarama.ProducerMessage{Topic: "test 2"}
- mp.Input() <- &sarama.ProducerMessage{Topic: "test 3"}
-
- msg1 := <-mp.Successes()
- msg2 := <-mp.Successes()
- err1 := <-mp.Errors()
-
- if msg1.Topic != "test 1" {
- t.Error("Expected message 1 to be returned first")
- }
-
- if msg2.Topic != "test 2" {
- t.Error("Expected message 2 to be returned second")
- }
-
- if err1.Msg.Topic != "test 3" || err1.Err != sarama.ErrOutOfBrokers {
- t.Error("Expected message 3 to be returned as error")
- }
-
- if err := mp.Close(); err != nil {
- t.Error(err)
- }
-}
-
-func TestProducerWithTooFewExpectations(t *testing.T) {
- trm := newTestReporterMock()
- mp := NewAsyncProducer(trm, nil)
- mp.ExpectInputAndSucceed()
-
- mp.Input() <- &sarama.ProducerMessage{Topic: "test"}
- mp.Input() <- &sarama.ProducerMessage{Topic: "test"}
-
- if err := mp.Close(); err != nil {
- t.Error(err)
- }
-
- if len(trm.errors) != 1 {
- t.Error("Expected to report an error")
- }
-}
-
-func TestProducerWithTooManyExpectations(t *testing.T) {
- trm := newTestReporterMock()
- mp := NewAsyncProducer(trm, nil)
- mp.ExpectInputAndSucceed()
- mp.ExpectInputAndFail(sarama.ErrOutOfBrokers)
-
- mp.Input() <- &sarama.ProducerMessage{Topic: "test"}
- if err := mp.Close(); err != nil {
- t.Error(err)
- }
-
- if len(trm.errors) != 1 {
- t.Error("Expected to report an error")
- }
-}
-
-func TestProducerWithCheckerFunction(t *testing.T) {
- trm := newTestReporterMock()
- mp := NewAsyncProducer(trm, nil)
- mp.ExpectInputWithCheckerFunctionAndSucceed(generateRegexpChecker("^tes"))
- mp.ExpectInputWithCheckerFunctionAndSucceed(generateRegexpChecker("^tes$"))
-
- mp.Input() <- &sarama.ProducerMessage{Topic: "test", Value: sarama.StringEncoder("test")}
- mp.Input() <- &sarama.ProducerMessage{Topic: "test", Value: sarama.StringEncoder("test")}
- if err := mp.Close(); err != nil {
- t.Error(err)
- }
-
- if len(mp.Errors()) != 1 {
- t.Error("Expected to report an error")
- }
-
- err1 := <-mp.Errors()
- if !strings.HasPrefix(err1.Err.Error(), "No match") {
- t.Error("Expected to report a value check error, found: ", err1.Err)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mocks/consumer.go b/vendor/src/github.com/Shopify/sarama/mocks/consumer.go
deleted file mode 100644
index a524190a0..000000000
--- a/vendor/src/github.com/Shopify/sarama/mocks/consumer.go
+++ /dev/null
@@ -1,315 +0,0 @@
-package mocks
-
-import (
- "sync"
- "sync/atomic"
-
- "github.com/Shopify/sarama"
-)
-
-// Consumer implements sarama's Consumer interface for testing purposes.
-// Before you can start consuming from this consumer, you have to register
-// topic/partitions using ExpectConsumePartition, and set expectations on them.
-type Consumer struct {
- l sync.Mutex
- t ErrorReporter
- config *sarama.Config
- partitionConsumers map[string]map[int32]*PartitionConsumer
- metadata map[string][]int32
-}
-
-// NewConsumer returns a new mock Consumer instance. The t argument should
-// be the *testing.T instance of your test method. An error will be written to it if
-// an expectation is violated. The config argument is currently unused and can be set to nil.
-func NewConsumer(t ErrorReporter, config *sarama.Config) *Consumer {
- if config == nil {
- config = sarama.NewConfig()
- }
-
- c := &Consumer{
- t: t,
- config: config,
- partitionConsumers: make(map[string]map[int32]*PartitionConsumer),
- }
- return c
-}
-
-///////////////////////////////////////////////////
-// Consumer interface implementation
-///////////////////////////////////////////////////
-
-// ConsumePartition implements the ConsumePartition method from the sarama.Consumer interface.
-// Before you can start consuming a partition, you have to set expectations on it using
-// ExpectConsumePartition. You can only consume a partition once per consumer.
-func (c *Consumer) ConsumePartition(topic string, partition int32, offset int64) (sarama.PartitionConsumer, error) {
- c.l.Lock()
- defer c.l.Unlock()
-
- if c.partitionConsumers[topic] == nil || c.partitionConsumers[topic][partition] == nil {
- c.t.Errorf("No expectations set for %s/%d", topic, partition)
- return nil, errOutOfExpectations
- }
-
- pc := c.partitionConsumers[topic][partition]
- if pc.consumed {
- return nil, sarama.ConfigurationError("The topic/partition is already being consumed")
- }
-
- if pc.offset != AnyOffset && pc.offset != offset {
- c.t.Errorf("Unexpected offset when calling ConsumePartition for %s/%d. Expected %d, got %d.", topic, partition, pc.offset, offset)
- }
-
- pc.consumed = true
- return pc, nil
-}
-
-// Topics returns a list of topics, as registered with SetMetadata
-func (c *Consumer) Topics() ([]string, error) {
- c.l.Lock()
- defer c.l.Unlock()
-
- if c.metadata == nil {
- c.t.Errorf("Unexpected call to Topics. Initialize the mock's topic metadata with SetMetadata.")
- return nil, sarama.ErrOutOfBrokers
- }
-
- var result []string
- for topic := range c.metadata {
- result = append(result, topic)
- }
- return result, nil
-}
-
-// Partitions returns the list of parititons for the given topic, as registered with SetMetadata
-func (c *Consumer) Partitions(topic string) ([]int32, error) {
- c.l.Lock()
- defer c.l.Unlock()
-
- if c.metadata == nil {
- c.t.Errorf("Unexpected call to Partitions. Initialize the mock's topic metadata with SetMetadata.")
- return nil, sarama.ErrOutOfBrokers
- }
- if c.metadata[topic] == nil {
- return nil, sarama.ErrUnknownTopicOrPartition
- }
-
- return c.metadata[topic], nil
-}
-
-func (c *Consumer) HighWaterMarks() map[string]map[int32]int64 {
- c.l.Lock()
- defer c.l.Unlock()
-
- hwms := make(map[string]map[int32]int64, len(c.partitionConsumers))
- for topic, partitionConsumers := range c.partitionConsumers {
- hwm := make(map[int32]int64, len(partitionConsumers))
- for partition, pc := range partitionConsumers {
- hwm[partition] = pc.HighWaterMarkOffset()
- }
- hwms[topic] = hwm
- }
-
- return hwms
-}
-
-// Close implements the Close method from the sarama.Consumer interface. It will close
-// all registered PartitionConsumer instances.
-func (c *Consumer) Close() error {
- c.l.Lock()
- defer c.l.Unlock()
-
- for _, partitions := range c.partitionConsumers {
- for _, partitionConsumer := range partitions {
- _ = partitionConsumer.Close()
- }
- }
-
- return nil
-}
-
-///////////////////////////////////////////////////
-// Expectation API
-///////////////////////////////////////////////////
-
-// SetTopicMetadata sets the clusters topic/partition metadata,
-// which will be returned by Topics() and Partitions().
-func (c *Consumer) SetTopicMetadata(metadata map[string][]int32) {
- c.l.Lock()
- defer c.l.Unlock()
-
- c.metadata = metadata
-}
-
-// ExpectConsumePartition will register a topic/partition, so you can set expectations on it.
-// The registered PartitionConsumer will be returned, so you can set expectations
-// on it using method chaining. Once a topic/partition is registered, you are
-// expected to start consuming it using ConsumePartition. If that doesn't happen,
-// an error will be written to the error reporter once the mock consumer is closed. It will
-// also expect that the
-func (c *Consumer) ExpectConsumePartition(topic string, partition int32, offset int64) *PartitionConsumer {
- c.l.Lock()
- defer c.l.Unlock()
-
- if c.partitionConsumers[topic] == nil {
- c.partitionConsumers[topic] = make(map[int32]*PartitionConsumer)
- }
-
- if c.partitionConsumers[topic][partition] == nil {
- c.partitionConsumers[topic][partition] = &PartitionConsumer{
- t: c.t,
- topic: topic,
- partition: partition,
- offset: offset,
- messages: make(chan *sarama.ConsumerMessage, c.config.ChannelBufferSize),
- errors: make(chan *sarama.ConsumerError, c.config.ChannelBufferSize),
- }
- }
-
- return c.partitionConsumers[topic][partition]
-}
-
-///////////////////////////////////////////////////
-// PartitionConsumer mock type
-///////////////////////////////////////////////////
-
-// PartitionConsumer implements sarama's PartitionConsumer interface for testing purposes.
-// It is returned by the mock Consumers ConsumePartitionMethod, but only if it is
-// registered first using the Consumer's ExpectConsumePartition method. Before consuming the
-// Errors and Messages channel, you should specify what values will be provided on these
-// channels using YieldMessage and YieldError.
-type PartitionConsumer struct {
- l sync.Mutex
- t ErrorReporter
- topic string
- partition int32
- offset int64
- messages chan *sarama.ConsumerMessage
- errors chan *sarama.ConsumerError
- singleClose sync.Once
- consumed bool
- errorsShouldBeDrained bool
- messagesShouldBeDrained bool
- highWaterMarkOffset int64
-}
-
-///////////////////////////////////////////////////
-// PartitionConsumer interface implementation
-///////////////////////////////////////////////////
-
-// AsyncClose implements the AsyncClose method from the sarama.PartitionConsumer interface.
-func (pc *PartitionConsumer) AsyncClose() {
- pc.singleClose.Do(func() {
- close(pc.messages)
- close(pc.errors)
- })
-}
-
-// Close implements the Close method from the sarama.PartitionConsumer interface. It will
-// verify whether the partition consumer was actually started.
-func (pc *PartitionConsumer) Close() error {
- if !pc.consumed {
- pc.t.Errorf("Expectations set on %s/%d, but no partition consumer was started.", pc.topic, pc.partition)
- return errPartitionConsumerNotStarted
- }
-
- if pc.errorsShouldBeDrained && len(pc.errors) > 0 {
- pc.t.Errorf("Expected the errors channel for %s/%d to be drained on close, but found %d errors.", pc.topic, pc.partition, len(pc.errors))
- }
-
- if pc.messagesShouldBeDrained && len(pc.messages) > 0 {
- pc.t.Errorf("Expected the messages channel for %s/%d to be drained on close, but found %d messages.", pc.topic, pc.partition, len(pc.messages))
- }
-
- pc.AsyncClose()
-
- var (
- closeErr error
- wg sync.WaitGroup
- )
-
- wg.Add(1)
- go func() {
- defer wg.Done()
-
- var errs = make(sarama.ConsumerErrors, 0)
- for err := range pc.errors {
- errs = append(errs, err)
- }
-
- if len(errs) > 0 {
- closeErr = errs
- }
- }()
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- for _ = range pc.messages {
- // drain
- }
- }()
-
- wg.Wait()
- return closeErr
-}
-
-// Errors implements the Errors method from the sarama.PartitionConsumer interface.
-func (pc *PartitionConsumer) Errors() <-chan *sarama.ConsumerError {
- return pc.errors
-}
-
-// Messages implements the Messages method from the sarama.PartitionConsumer interface.
-func (pc *PartitionConsumer) Messages() <-chan *sarama.ConsumerMessage {
- return pc.messages
-}
-
-func (pc *PartitionConsumer) HighWaterMarkOffset() int64 {
- return atomic.LoadInt64(&pc.highWaterMarkOffset) + 1
-}
-
-///////////////////////////////////////////////////
-// Expectation API
-///////////////////////////////////////////////////
-
-// YieldMessage will yield a messages Messages channel of this partition consumer
-// when it is consumed. By default, the mock consumer will not verify whether this
-// message was consumed from the Messages channel, because there are legitimate
-// reasons forthis not to happen. ou can call ExpectMessagesDrainedOnClose so it will
-// verify that the channel is empty on close.
-func (pc *PartitionConsumer) YieldMessage(msg *sarama.ConsumerMessage) {
- pc.l.Lock()
- defer pc.l.Unlock()
-
- msg.Topic = pc.topic
- msg.Partition = pc.partition
- msg.Offset = atomic.AddInt64(&pc.highWaterMarkOffset, 1)
-
- pc.messages <- msg
-}
-
-// YieldError will yield an error on the Errors channel of this partition consumer
-// when it is consumed. By default, the mock consumer will not verify whether this error was
-// consumed from the Errors channel, because there are legitimate reasons for this
-// not to happen. You can call ExpectErrorsDrainedOnClose so it will verify that
-// the channel is empty on close.
-func (pc *PartitionConsumer) YieldError(err error) {
- pc.errors <- &sarama.ConsumerError{
- Topic: pc.topic,
- Partition: pc.partition,
- Err: err,
- }
-}
-
-// ExpectMessagesDrainedOnClose sets an expectation on the partition consumer
-// that the messages channel will be fully drained when Close is called. If this
-// expectation is not met, an error is reported to the error reporter.
-func (pc *PartitionConsumer) ExpectMessagesDrainedOnClose() {
- pc.messagesShouldBeDrained = true
-}
-
-// ExpectErrorsDrainedOnClose sets an expectation on the partition consumer
-// that the errors channel will be fully drained when Close is called. If this
-// expectation is not met, an error is reported to the error reporter.
-func (pc *PartitionConsumer) ExpectErrorsDrainedOnClose() {
- pc.errorsShouldBeDrained = true
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mocks/consumer_test.go b/vendor/src/github.com/Shopify/sarama/mocks/consumer_test.go
deleted file mode 100644
index 50dad3a69..000000000
--- a/vendor/src/github.com/Shopify/sarama/mocks/consumer_test.go
+++ /dev/null
@@ -1,249 +0,0 @@
-package mocks
-
-import (
- "sort"
- "testing"
-
- "github.com/Shopify/sarama"
-)
-
-func TestMockConsumerImplementsConsumerInterface(t *testing.T) {
- var c interface{} = &Consumer{}
- if _, ok := c.(sarama.Consumer); !ok {
- t.Error("The mock consumer should implement the sarama.Consumer interface.")
- }
-
- var pc interface{} = &PartitionConsumer{}
- if _, ok := pc.(sarama.PartitionConsumer); !ok {
- t.Error("The mock partitionconsumer should implement the sarama.PartitionConsumer interface.")
- }
-}
-
-func TestConsumerHandlesExpectations(t *testing.T) {
- consumer := NewConsumer(t, nil)
- defer func() {
- if err := consumer.Close(); err != nil {
- t.Error(err)
- }
- }()
-
- consumer.ExpectConsumePartition("test", 0, sarama.OffsetOldest).YieldMessage(&sarama.ConsumerMessage{Value: []byte("hello world")})
- consumer.ExpectConsumePartition("test", 0, sarama.OffsetOldest).YieldError(sarama.ErrOutOfBrokers)
- consumer.ExpectConsumePartition("test", 1, sarama.OffsetOldest).YieldMessage(&sarama.ConsumerMessage{Value: []byte("hello world again")})
- consumer.ExpectConsumePartition("other", 0, AnyOffset).YieldMessage(&sarama.ConsumerMessage{Value: []byte("hello other")})
-
- pc_test0, err := consumer.ConsumePartition("test", 0, sarama.OffsetOldest)
- if err != nil {
- t.Fatal(err)
- }
- test0_msg := <-pc_test0.Messages()
- if test0_msg.Topic != "test" || test0_msg.Partition != 0 || string(test0_msg.Value) != "hello world" {
- t.Error("Message was not as expected:", test0_msg)
- }
- test0_err := <-pc_test0.Errors()
- if test0_err.Err != sarama.ErrOutOfBrokers {
- t.Error("Expected sarama.ErrOutOfBrokers, found:", test0_err.Err)
- }
-
- pc_test1, err := consumer.ConsumePartition("test", 1, sarama.OffsetOldest)
- if err != nil {
- t.Fatal(err)
- }
- test1_msg := <-pc_test1.Messages()
- if test1_msg.Topic != "test" || test1_msg.Partition != 1 || string(test1_msg.Value) != "hello world again" {
- t.Error("Message was not as expected:", test1_msg)
- }
-
- pc_other0, err := consumer.ConsumePartition("other", 0, sarama.OffsetNewest)
- if err != nil {
- t.Fatal(err)
- }
- other0_msg := <-pc_other0.Messages()
- if other0_msg.Topic != "other" || other0_msg.Partition != 0 || string(other0_msg.Value) != "hello other" {
- t.Error("Message was not as expected:", other0_msg)
- }
-}
-
-func TestConsumerReturnsNonconsumedErrorsOnClose(t *testing.T) {
- consumer := NewConsumer(t, nil)
- consumer.ExpectConsumePartition("test", 0, sarama.OffsetOldest).YieldError(sarama.ErrOutOfBrokers)
- consumer.ExpectConsumePartition("test", 0, sarama.OffsetOldest).YieldError(sarama.ErrOutOfBrokers)
-
- pc, err := consumer.ConsumePartition("test", 0, sarama.OffsetOldest)
- if err != nil {
- t.Fatal(err)
- }
-
- select {
- case <-pc.Messages():
- t.Error("Did not epxect a message on the messages channel.")
- case err := <-pc.Errors():
- if err.Err != sarama.ErrOutOfBrokers {
- t.Error("Expected sarama.ErrOutOfBrokers, found", err)
- }
- }
-
- errs := pc.Close().(sarama.ConsumerErrors)
- if len(errs) != 1 && errs[0].Err != sarama.ErrOutOfBrokers {
- t.Error("Expected Close to return the remaining sarama.ErrOutOfBrokers")
- }
-}
-
-func TestConsumerWithoutExpectationsOnPartition(t *testing.T) {
- trm := newTestReporterMock()
- consumer := NewConsumer(trm, nil)
-
- _, err := consumer.ConsumePartition("test", 1, sarama.OffsetOldest)
- if err != errOutOfExpectations {
- t.Error("Expected ConsumePartition to return errOutOfExpectations")
- }
-
- if err := consumer.Close(); err != nil {
- t.Error("No error expected on close, but found:", err)
- }
-
- if len(trm.errors) != 1 {
- t.Errorf("Expected an expectation failure to be set on the error reporter.")
- }
-}
-
-func TestConsumerWithExpectationsOnUnconsumedPartition(t *testing.T) {
- trm := newTestReporterMock()
- consumer := NewConsumer(trm, nil)
- consumer.ExpectConsumePartition("test", 0, sarama.OffsetOldest).YieldMessage(&sarama.ConsumerMessage{Value: []byte("hello world")})
-
- if err := consumer.Close(); err != nil {
- t.Error("No error expected on close, but found:", err)
- }
-
- if len(trm.errors) != 1 {
- t.Errorf("Expected an expectation failure to be set on the error reporter.")
- }
-}
-
-func TestConsumerWithWrongOffsetExpectation(t *testing.T) {
- trm := newTestReporterMock()
- consumer := NewConsumer(trm, nil)
- consumer.ExpectConsumePartition("test", 0, sarama.OffsetOldest)
-
- _, err := consumer.ConsumePartition("test", 0, sarama.OffsetNewest)
- if err != nil {
- t.Error("Did not expect error, found:", err)
- }
-
- if len(trm.errors) != 1 {
- t.Errorf("Expected an expectation failure to be set on the error reporter.")
- }
-
- if err := consumer.Close(); err != nil {
- t.Error(err)
- }
-}
-
-func TestConsumerViolatesMessagesDrainedExpectation(t *testing.T) {
- trm := newTestReporterMock()
- consumer := NewConsumer(trm, nil)
- pcmock := consumer.ExpectConsumePartition("test", 0, sarama.OffsetOldest)
- pcmock.YieldMessage(&sarama.ConsumerMessage{Value: []byte("hello")})
- pcmock.YieldMessage(&sarama.ConsumerMessage{Value: []byte("hello")})
- pcmock.ExpectMessagesDrainedOnClose()
-
- pc, err := consumer.ConsumePartition("test", 0, sarama.OffsetOldest)
- if err != nil {
- t.Error(err)
- }
-
- // consume first message, not second one
- <-pc.Messages()
-
- if err := consumer.Close(); err != nil {
- t.Error(err)
- }
-
- if len(trm.errors) != 1 {
- t.Errorf("Expected an expectation failure to be set on the error reporter.")
- }
-}
-
-func TestConsumerMeetsErrorsDrainedExpectation(t *testing.T) {
- trm := newTestReporterMock()
- consumer := NewConsumer(trm, nil)
-
- pcmock := consumer.ExpectConsumePartition("test", 0, sarama.OffsetOldest)
- pcmock.YieldError(sarama.ErrInvalidMessage)
- pcmock.YieldError(sarama.ErrInvalidMessage)
- pcmock.ExpectErrorsDrainedOnClose()
-
- pc, err := consumer.ConsumePartition("test", 0, sarama.OffsetOldest)
- if err != nil {
- t.Error(err)
- }
-
- // consume first and second error,
- <-pc.Errors()
- <-pc.Errors()
-
- if err := consumer.Close(); err != nil {
- t.Error(err)
- }
-
- if len(trm.errors) != 0 {
- t.Errorf("Expected no expectation failures to be set on the error reporter.")
- }
-}
-
-func TestConsumerTopicMetadata(t *testing.T) {
- trm := newTestReporterMock()
- consumer := NewConsumer(trm, nil)
-
- consumer.SetTopicMetadata(map[string][]int32{
- "test1": []int32{0, 1, 2, 3},
- "test2": []int32{0, 1, 2, 3, 4, 5, 6, 7},
- })
-
- topics, err := consumer.Topics()
- if err != nil {
- t.Error(t)
- }
-
- sortedTopics := sort.StringSlice(topics)
- sortedTopics.Sort()
- if len(sortedTopics) != 2 || sortedTopics[0] != "test1" || sortedTopics[1] != "test2" {
- t.Error("Unexpected topics returned:", sortedTopics)
- }
-
- partitions1, err := consumer.Partitions("test1")
- if err != nil {
- t.Error(t)
- }
-
- if len(partitions1) != 4 {
- t.Error("Unexpected partitions returned:", len(partitions1))
- }
-
- partitions2, err := consumer.Partitions("test2")
- if err != nil {
- t.Error(t)
- }
-
- if len(partitions2) != 8 {
- t.Error("Unexpected partitions returned:", len(partitions2))
- }
-
- if len(trm.errors) != 0 {
- t.Errorf("Expected no expectation failures to be set on the error reporter.")
- }
-}
-
-func TestConsumerUnexpectedTopicMetadata(t *testing.T) {
- trm := newTestReporterMock()
- consumer := NewConsumer(trm, nil)
-
- if _, err := consumer.Topics(); err != sarama.ErrOutOfBrokers {
- t.Error("Expected sarama.ErrOutOfBrokers, found", err)
- }
-
- if len(trm.errors) != 1 {
- t.Errorf("Expected an expectation failure to be set on the error reporter.")
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mocks/mocks.go b/vendor/src/github.com/Shopify/sarama/mocks/mocks.go
deleted file mode 100644
index 4adb838d9..000000000
--- a/vendor/src/github.com/Shopify/sarama/mocks/mocks.go
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-Package mocks provides mocks that can be used for testing applications
-that use Sarama. The mock types provided by this package implement the
-interfaces Sarama exports, so you can use them for dependency injection
-in your tests.
-
-All mock instances require you to set expectations on them before you
-can use them. It will determine how the mock will behave. If an
-expectation is not met, it will make your test fail.
-
-NOTE: this package currently does not fall under the API stability
-guarantee of Sarama as it is still considered experimental.
-*/
-package mocks
-
-import (
- "errors"
-
- "github.com/Shopify/sarama"
-)
-
-// ErrorReporter is a simple interface that includes the testing.T methods we use to report
-// expectation violations when using the mock objects.
-type ErrorReporter interface {
- Errorf(string, ...interface{})
-}
-
-// ValueChecker is a function type to be set in each expectation of the producer mocks
-// to check the value passed.
-type ValueChecker func(val []byte) error
-
-var (
- errProduceSuccess error = nil
- errOutOfExpectations = errors.New("No more expectations set on mock")
- errPartitionConsumerNotStarted = errors.New("The partition consumer was never started")
-)
-
-const AnyOffset int64 = -1000
-
-type producerExpectation struct {
- Result error
- CheckFunction ValueChecker
-}
-
-type consumerExpectation struct {
- Err error
- Msg *sarama.ConsumerMessage
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mocks/sync_producer.go b/vendor/src/github.com/Shopify/sarama/mocks/sync_producer.go
deleted file mode 100644
index 2ac7b5c32..000000000
--- a/vendor/src/github.com/Shopify/sarama/mocks/sync_producer.go
+++ /dev/null
@@ -1,148 +0,0 @@
-package mocks
-
-import (
- "sync"
-
- "github.com/Shopify/sarama"
-)
-
-// SyncProducer implements sarama's SyncProducer interface for testing purposes.
-// Before you can use it, you have to set expectations on the mock SyncProducer
-// to tell it how to handle calls to SendMessage, so you can easily test success
-// and failure scenarios.
-type SyncProducer struct {
- l sync.Mutex
- t ErrorReporter
- expectations []*producerExpectation
- lastOffset int64
-}
-
-// NewSyncProducer instantiates a new SyncProducer mock. The t argument should
-// be the *testing.T instance of your test method. An error will be written to it if
-// an expectation is violated. The config argument is currently unused, but is
-// maintained to be compatible with the async Producer.
-func NewSyncProducer(t ErrorReporter, config *sarama.Config) *SyncProducer {
- return &SyncProducer{
- t: t,
- expectations: make([]*producerExpectation, 0),
- }
-}
-
-////////////////////////////////////////////////
-// Implement SyncProducer interface
-////////////////////////////////////////////////
-
-// SendMessage corresponds with the SendMessage method of sarama's SyncProducer implementation.
-// You have to set expectations on the mock producer before calling SendMessage, so it knows
-// how to handle them. You can set a function in each expectation so that the message value
-// checked by this function and an error is returned if the match fails.
-// If there is no more remaining expectation when SendMessage is called,
-// the mock producer will write an error to the test state object.
-func (sp *SyncProducer) SendMessage(msg *sarama.ProducerMessage) (partition int32, offset int64, err error) {
- sp.l.Lock()
- defer sp.l.Unlock()
-
- if len(sp.expectations) > 0 {
- expectation := sp.expectations[0]
- sp.expectations = sp.expectations[1:]
- if expectation.CheckFunction != nil {
- if val, err := msg.Value.Encode(); err != nil {
- sp.t.Errorf("Input message encoding failed: %s", err.Error())
- return -1, -1, err
- } else {
- err := expectation.CheckFunction(val)
- if err != nil {
- sp.t.Errorf("Check function returned an error: %s", err.Error())
- return -1, -1, err
- }
- }
- }
- if expectation.Result == errProduceSuccess {
- sp.lastOffset++
- msg.Offset = sp.lastOffset
- return 0, msg.Offset, nil
- } else {
- return -1, -1, expectation.Result
- }
- } else {
- sp.t.Errorf("No more expectation set on this mock producer to handle the input message.")
- return -1, -1, errOutOfExpectations
- }
-}
-
-// SendMessages corresponds with the SendMessages method of sarama's SyncProducer implementation.
-// You have to set expectations on the mock producer before calling SendMessages, so it knows
-// how to handle them. If there is no more remaining expectations when SendMessages is called,
-// the mock producer will write an error to the test state object.
-func (sp *SyncProducer) SendMessages(msgs []*sarama.ProducerMessage) error {
- sp.l.Lock()
- defer sp.l.Unlock()
-
- if len(sp.expectations) >= len(msgs) {
- expectations := sp.expectations[0 : len(msgs)-1]
- sp.expectations = sp.expectations[len(msgs):]
-
- for _, expectation := range expectations {
- if expectation.Result != errProduceSuccess {
- return expectation.Result
- }
-
- }
- return nil
- } else {
- sp.t.Errorf("Insufficient expectations set on this mock producer to handle the input messages.")
- return errOutOfExpectations
- }
-}
-
-// Close corresponds with the Close method of sarama's SyncProducer implementation.
-// By closing a mock syncproducer, you also tell it that no more SendMessage calls will follow,
-// so it will write an error to the test state if there's any remaining expectations.
-func (sp *SyncProducer) Close() error {
- sp.l.Lock()
- defer sp.l.Unlock()
-
- if len(sp.expectations) > 0 {
- sp.t.Errorf("Expected to exhaust all expectations, but %d are left.", len(sp.expectations))
- }
-
- return nil
-}
-
-////////////////////////////////////////////////
-// Setting expectations
-////////////////////////////////////////////////
-
-// ExpectSendMessageWithCheckerFunctionAndSucceed sets an expectation on the mock producer that SendMessage
-// will be called. The mock producer will first call the given function to check the message value.
-// It will cascade the error of the function, if any, or handle the message as if it produced
-// successfully, i.e. by returning a valid partition, and offset, and a nil error.
-func (sp *SyncProducer) ExpectSendMessageWithCheckerFunctionAndSucceed(cf ValueChecker) {
- sp.l.Lock()
- defer sp.l.Unlock()
- sp.expectations = append(sp.expectations, &producerExpectation{Result: errProduceSuccess, CheckFunction: cf})
-}
-
-// ExpectSendMessageAndFail sets an expectation on the mock producer that SendMessage will be
-// called. The mock producer will first call the given function to check the message value.
-// It will cascade the error of the function, if any, or handle the message as if it failed
-// to produce successfully, i.e. by returning the provided error.
-func (sp *SyncProducer) ExpectSendMessageWithCheckerFunctionAndFail(cf ValueChecker, err error) {
- sp.l.Lock()
- defer sp.l.Unlock()
- sp.expectations = append(sp.expectations, &producerExpectation{Result: err, CheckFunction: cf})
-}
-
-// ExpectSendMessageAndSucceed sets an expectation on the mock producer that SendMessage will be
-// called. The mock producer will handle the message as if it produced successfully, i.e. by
-// returning a valid partition, and offset, and a nil error.
-func (sp *SyncProducer) ExpectSendMessageAndSucceed() {
- sp.ExpectSendMessageWithCheckerFunctionAndSucceed(nil)
-}
-
-// ExpectSendMessageAndFail sets an expectation on the mock producer that SendMessage will be
-// called. The mock producer will handle the message as if it failed to produce
-// successfully, i.e. by returning the provided error.
-func (sp *SyncProducer) ExpectSendMessageAndFail(err error) {
- sp.ExpectSendMessageWithCheckerFunctionAndFail(nil, err)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/mocks/sync_producer_test.go b/vendor/src/github.com/Shopify/sarama/mocks/sync_producer_test.go
deleted file mode 100644
index 0fdc99877..000000000
--- a/vendor/src/github.com/Shopify/sarama/mocks/sync_producer_test.go
+++ /dev/null
@@ -1,124 +0,0 @@
-package mocks
-
-import (
- "strings"
- "testing"
-
- "github.com/Shopify/sarama"
-)
-
-func TestMockSyncProducerImplementsSyncProducerInterface(t *testing.T) {
- var mp interface{} = &SyncProducer{}
- if _, ok := mp.(sarama.SyncProducer); !ok {
- t.Error("The mock async producer should implement the sarama.SyncProducer interface.")
- }
-}
-
-func TestSyncProducerReturnsExpectationsToSendMessage(t *testing.T) {
- sp := NewSyncProducer(t, nil)
- defer func() {
- if err := sp.Close(); err != nil {
- t.Error(err)
- }
- }()
-
- sp.ExpectSendMessageAndSucceed()
- sp.ExpectSendMessageAndSucceed()
- sp.ExpectSendMessageAndFail(sarama.ErrOutOfBrokers)
-
- msg := &sarama.ProducerMessage{Topic: "test", Value: sarama.StringEncoder("test")}
-
- _, offset, err := sp.SendMessage(msg)
- if err != nil {
- t.Errorf("The first message should have been produced successfully, but got %s", err)
- }
- if offset != 1 || offset != msg.Offset {
- t.Errorf("The first message should have been assigned offset 1, but got %d", msg.Offset)
- }
-
- _, offset, err = sp.SendMessage(msg)
- if err != nil {
- t.Errorf("The second message should have been produced successfully, but got %s", err)
- }
- if offset != 2 || offset != msg.Offset {
- t.Errorf("The second message should have been assigned offset 2, but got %d", offset)
- }
-
- _, _, err = sp.SendMessage(msg)
- if err != sarama.ErrOutOfBrokers {
- t.Errorf("The third message should not have been produced successfully")
- }
-
- if err := sp.Close(); err != nil {
- t.Error(err)
- }
-}
-
-func TestSyncProducerWithTooManyExpectations(t *testing.T) {
- trm := newTestReporterMock()
-
- sp := NewSyncProducer(trm, nil)
- sp.ExpectSendMessageAndSucceed()
- sp.ExpectSendMessageAndFail(sarama.ErrOutOfBrokers)
-
- msg := &sarama.ProducerMessage{Topic: "test", Value: sarama.StringEncoder("test")}
- if _, _, err := sp.SendMessage(msg); err != nil {
- t.Error("No error expected on first SendMessage call", err)
- }
-
- if err := sp.Close(); err != nil {
- t.Error(err)
- }
-
- if len(trm.errors) != 1 {
- t.Error("Expected to report an error")
- }
-}
-
-func TestSyncProducerWithTooFewExpectations(t *testing.T) {
- trm := newTestReporterMock()
-
- sp := NewSyncProducer(trm, nil)
- sp.ExpectSendMessageAndSucceed()
-
- msg := &sarama.ProducerMessage{Topic: "test", Value: sarama.StringEncoder("test")}
- if _, _, err := sp.SendMessage(msg); err != nil {
- t.Error("No error expected on first SendMessage call", err)
- }
- if _, _, err := sp.SendMessage(msg); err != errOutOfExpectations {
- t.Error("errOutOfExpectations expected on second SendMessage call, found:", err)
- }
-
- if err := sp.Close(); err != nil {
- t.Error(err)
- }
-
- if len(trm.errors) != 1 {
- t.Error("Expected to report an error")
- }
-}
-
-func TestSyncProducerWithCheckerFunction(t *testing.T) {
- trm := newTestReporterMock()
-
- sp := NewSyncProducer(trm, nil)
- sp.ExpectSendMessageWithCheckerFunctionAndSucceed(generateRegexpChecker("^tes"))
- sp.ExpectSendMessageWithCheckerFunctionAndSucceed(generateRegexpChecker("^tes$"))
-
- msg := &sarama.ProducerMessage{Topic: "test", Value: sarama.StringEncoder("test")}
- if _, _, err := sp.SendMessage(msg); err != nil {
- t.Error("No error expected on first SendMessage call, found: ", err)
- }
- msg = &sarama.ProducerMessage{Topic: "test", Value: sarama.StringEncoder("test")}
- if _, _, err := sp.SendMessage(msg); err == nil || !strings.HasPrefix(err.Error(), "No match") {
- t.Error("Error during value check expected on second SendMessage call, found:", err)
- }
-
- if err := sp.Close(); err != nil {
- t.Error(err)
- }
-
- if len(trm.errors) != 1 {
- t.Error("Expected to report an error")
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_commit_request.go b/vendor/src/github.com/Shopify/sarama/offset_commit_request.go
deleted file mode 100644
index b21ea634b..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_commit_request.go
+++ /dev/null
@@ -1,190 +0,0 @@
-package sarama
-
-// ReceiveTime is a special value for the timestamp field of Offset Commit Requests which
-// tells the broker to set the timestamp to the time at which the request was received.
-// The timestamp is only used if message version 1 is used, which requires kafka 0.8.2.
-const ReceiveTime int64 = -1
-
-// GroupGenerationUndefined is a special value for the group generation field of
-// Offset Commit Requests that should be used when a consumer group does not rely
-// on Kafka for partition management.
-const GroupGenerationUndefined = -1
-
-type offsetCommitRequestBlock struct {
- offset int64
- timestamp int64
- metadata string
-}
-
-func (b *offsetCommitRequestBlock) encode(pe packetEncoder, version int16) error {
- pe.putInt64(b.offset)
- if version == 1 {
- pe.putInt64(b.timestamp)
- } else if b.timestamp != 0 {
- Logger.Println("Non-zero timestamp specified for OffsetCommitRequest not v1, it will be ignored")
- }
-
- return pe.putString(b.metadata)
-}
-
-func (b *offsetCommitRequestBlock) decode(pd packetDecoder, version int16) (err error) {
- if b.offset, err = pd.getInt64(); err != nil {
- return err
- }
- if version == 1 {
- if b.timestamp, err = pd.getInt64(); err != nil {
- return err
- }
- }
- b.metadata, err = pd.getString()
- return err
-}
-
-type OffsetCommitRequest struct {
- ConsumerGroup string
- ConsumerGroupGeneration int32 // v1 or later
- ConsumerID string // v1 or later
- RetentionTime int64 // v2 or later
-
- // Version can be:
- // - 0 (kafka 0.8.1 and later)
- // - 1 (kafka 0.8.2 and later)
- // - 2 (kafka 0.9.0 and later)
- Version int16
- blocks map[string]map[int32]*offsetCommitRequestBlock
-}
-
-func (r *OffsetCommitRequest) encode(pe packetEncoder) error {
- if r.Version < 0 || r.Version > 2 {
- return PacketEncodingError{"invalid or unsupported OffsetCommitRequest version field"}
- }
-
- if err := pe.putString(r.ConsumerGroup); err != nil {
- return err
- }
-
- if r.Version >= 1 {
- pe.putInt32(r.ConsumerGroupGeneration)
- if err := pe.putString(r.ConsumerID); err != nil {
- return err
- }
- } else {
- if r.ConsumerGroupGeneration != 0 {
- Logger.Println("Non-zero ConsumerGroupGeneration specified for OffsetCommitRequest v0, it will be ignored")
- }
- if r.ConsumerID != "" {
- Logger.Println("Non-empty ConsumerID specified for OffsetCommitRequest v0, it will be ignored")
- }
- }
-
- if r.Version >= 2 {
- pe.putInt64(r.RetentionTime)
- } else if r.RetentionTime != 0 {
- Logger.Println("Non-zero RetentionTime specified for OffsetCommitRequest version <2, it will be ignored")
- }
-
- if err := pe.putArrayLength(len(r.blocks)); err != nil {
- return err
- }
- for topic, partitions := range r.blocks {
- if err := pe.putString(topic); err != nil {
- return err
- }
- if err := pe.putArrayLength(len(partitions)); err != nil {
- return err
- }
- for partition, block := range partitions {
- pe.putInt32(partition)
- if err := block.encode(pe, r.Version); err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-func (r *OffsetCommitRequest) decode(pd packetDecoder, version int16) (err error) {
- r.Version = version
-
- if r.ConsumerGroup, err = pd.getString(); err != nil {
- return err
- }
-
- if r.Version >= 1 {
- if r.ConsumerGroupGeneration, err = pd.getInt32(); err != nil {
- return err
- }
- if r.ConsumerID, err = pd.getString(); err != nil {
- return err
- }
- }
-
- if r.Version >= 2 {
- if r.RetentionTime, err = pd.getInt64(); err != nil {
- return err
- }
- }
-
- topicCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if topicCount == 0 {
- return nil
- }
- r.blocks = make(map[string]map[int32]*offsetCommitRequestBlock)
- for i := 0; i < topicCount; i++ {
- topic, err := pd.getString()
- if err != nil {
- return err
- }
- partitionCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- r.blocks[topic] = make(map[int32]*offsetCommitRequestBlock)
- for j := 0; j < partitionCount; j++ {
- partition, err := pd.getInt32()
- if err != nil {
- return err
- }
- block := &offsetCommitRequestBlock{}
- if err := block.decode(pd, r.Version); err != nil {
- return err
- }
- r.blocks[topic][partition] = block
- }
- }
- return nil
-}
-
-func (r *OffsetCommitRequest) key() int16 {
- return 8
-}
-
-func (r *OffsetCommitRequest) version() int16 {
- return r.Version
-}
-
-func (r *OffsetCommitRequest) requiredVersion() KafkaVersion {
- switch r.Version {
- case 1:
- return V0_8_2_0
- case 2:
- return V0_9_0_0
- default:
- return minVersion
- }
-}
-
-func (r *OffsetCommitRequest) AddBlock(topic string, partitionID int32, offset int64, timestamp int64, metadata string) {
- if r.blocks == nil {
- r.blocks = make(map[string]map[int32]*offsetCommitRequestBlock)
- }
-
- if r.blocks[topic] == nil {
- r.blocks[topic] = make(map[int32]*offsetCommitRequestBlock)
- }
-
- r.blocks[topic][partitionID] = &offsetCommitRequestBlock{offset, timestamp, metadata}
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_commit_request_test.go b/vendor/src/github.com/Shopify/sarama/offset_commit_request_test.go
deleted file mode 100644
index afc25b7b3..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_commit_request_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- offsetCommitRequestNoBlocksV0 = []byte{
- 0x00, 0x06, 'f', 'o', 'o', 'b', 'a', 'r',
- 0x00, 0x00, 0x00, 0x00}
-
- offsetCommitRequestNoBlocksV1 = []byte{
- 0x00, 0x06, 'f', 'o', 'o', 'b', 'a', 'r',
- 0x00, 0x00, 0x11, 0x22,
- 0x00, 0x04, 'c', 'o', 'n', 's',
- 0x00, 0x00, 0x00, 0x00}
-
- offsetCommitRequestNoBlocksV2 = []byte{
- 0x00, 0x06, 'f', 'o', 'o', 'b', 'a', 'r',
- 0x00, 0x00, 0x11, 0x22,
- 0x00, 0x04, 'c', 'o', 'n', 's',
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x33,
- 0x00, 0x00, 0x00, 0x00}
-
- offsetCommitRequestOneBlockV0 = []byte{
- 0x00, 0x06, 'f', 'o', 'o', 'b', 'a', 'r',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x05, 't', 'o', 'p', 'i', 'c',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x52, 0x21,
- 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF,
- 0x00, 0x08, 'm', 'e', 't', 'a', 'd', 'a', 't', 'a'}
-
- offsetCommitRequestOneBlockV1 = []byte{
- 0x00, 0x06, 'f', 'o', 'o', 'b', 'a', 'r',
- 0x00, 0x00, 0x11, 0x22,
- 0x00, 0x04, 'c', 'o', 'n', 's',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x05, 't', 'o', 'p', 'i', 'c',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x52, 0x21,
- 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x00, 0x08, 'm', 'e', 't', 'a', 'd', 'a', 't', 'a'}
-
- offsetCommitRequestOneBlockV2 = []byte{
- 0x00, 0x06, 'f', 'o', 'o', 'b', 'a', 'r',
- 0x00, 0x00, 0x11, 0x22,
- 0x00, 0x04, 'c', 'o', 'n', 's',
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x33,
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x05, 't', 'o', 'p', 'i', 'c',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x52, 0x21,
- 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF,
- 0x00, 0x08, 'm', 'e', 't', 'a', 'd', 'a', 't', 'a'}
-)
-
-func TestOffsetCommitRequestV0(t *testing.T) {
- request := new(OffsetCommitRequest)
- request.Version = 0
- request.ConsumerGroup = "foobar"
- testRequest(t, "no blocks v0", request, offsetCommitRequestNoBlocksV0)
-
- request.AddBlock("topic", 0x5221, 0xDEADBEEF, 0, "metadata")
- testRequest(t, "one block v0", request, offsetCommitRequestOneBlockV0)
-}
-
-func TestOffsetCommitRequestV1(t *testing.T) {
- request := new(OffsetCommitRequest)
- request.ConsumerGroup = "foobar"
- request.ConsumerID = "cons"
- request.ConsumerGroupGeneration = 0x1122
- request.Version = 1
- testRequest(t, "no blocks v1", request, offsetCommitRequestNoBlocksV1)
-
- request.AddBlock("topic", 0x5221, 0xDEADBEEF, ReceiveTime, "metadata")
- testRequest(t, "one block v1", request, offsetCommitRequestOneBlockV1)
-}
-
-func TestOffsetCommitRequestV2(t *testing.T) {
- request := new(OffsetCommitRequest)
- request.ConsumerGroup = "foobar"
- request.ConsumerID = "cons"
- request.ConsumerGroupGeneration = 0x1122
- request.RetentionTime = 0x4433
- request.Version = 2
- testRequest(t, "no blocks v2", request, offsetCommitRequestNoBlocksV2)
-
- request.AddBlock("topic", 0x5221, 0xDEADBEEF, 0, "metadata")
- testRequest(t, "one block v2", request, offsetCommitRequestOneBlockV2)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_commit_response.go b/vendor/src/github.com/Shopify/sarama/offset_commit_response.go
deleted file mode 100644
index 7f277e775..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_commit_response.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package sarama
-
-type OffsetCommitResponse struct {
- Errors map[string]map[int32]KError
-}
-
-func (r *OffsetCommitResponse) AddError(topic string, partition int32, kerror KError) {
- if r.Errors == nil {
- r.Errors = make(map[string]map[int32]KError)
- }
- partitions := r.Errors[topic]
- if partitions == nil {
- partitions = make(map[int32]KError)
- r.Errors[topic] = partitions
- }
- partitions[partition] = kerror
-}
-
-func (r *OffsetCommitResponse) encode(pe packetEncoder) error {
- if err := pe.putArrayLength(len(r.Errors)); err != nil {
- return err
- }
- for topic, partitions := range r.Errors {
- if err := pe.putString(topic); err != nil {
- return err
- }
- if err := pe.putArrayLength(len(partitions)); err != nil {
- return err
- }
- for partition, kerror := range partitions {
- pe.putInt32(partition)
- pe.putInt16(int16(kerror))
- }
- }
- return nil
-}
-
-func (r *OffsetCommitResponse) decode(pd packetDecoder, version int16) (err error) {
- numTopics, err := pd.getArrayLength()
- if err != nil || numTopics == 0 {
- return err
- }
-
- r.Errors = make(map[string]map[int32]KError, numTopics)
- for i := 0; i < numTopics; i++ {
- name, err := pd.getString()
- if err != nil {
- return err
- }
-
- numErrors, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Errors[name] = make(map[int32]KError, numErrors)
-
- for j := 0; j < numErrors; j++ {
- id, err := pd.getInt32()
- if err != nil {
- return err
- }
-
- tmp, err := pd.getInt16()
- if err != nil {
- return err
- }
- r.Errors[name][id] = KError(tmp)
- }
- }
-
- return nil
-}
-
-func (r *OffsetCommitResponse) key() int16 {
- return 8
-}
-
-func (r *OffsetCommitResponse) version() int16 {
- return 0
-}
-
-func (r *OffsetCommitResponse) requiredVersion() KafkaVersion {
- return minVersion
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_commit_response_test.go b/vendor/src/github.com/Shopify/sarama/offset_commit_response_test.go
deleted file mode 100644
index 074ec9232..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_commit_response_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package sarama
-
-import (
- "testing"
-)
-
-var (
- emptyOffsetCommitResponse = []byte{
- 0x00, 0x00, 0x00, 0x00}
-)
-
-func TestEmptyOffsetCommitResponse(t *testing.T) {
- response := OffsetCommitResponse{}
- testResponse(t, "empty", &response, emptyOffsetCommitResponse)
-}
-
-func TestNormalOffsetCommitResponse(t *testing.T) {
- response := OffsetCommitResponse{}
- response.AddError("t", 0, ErrNotLeaderForPartition)
- response.Errors["m"] = make(map[int32]KError)
- // The response encoded form cannot be checked for it varies due to
- // unpredictable map traversal order.
- testResponse(t, "normal", &response, nil)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_fetch_request.go b/vendor/src/github.com/Shopify/sarama/offset_fetch_request.go
deleted file mode 100644
index b19fe79ba..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_fetch_request.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package sarama
-
-type OffsetFetchRequest struct {
- ConsumerGroup string
- Version int16
- partitions map[string][]int32
-}
-
-func (r *OffsetFetchRequest) encode(pe packetEncoder) (err error) {
- if r.Version < 0 || r.Version > 1 {
- return PacketEncodingError{"invalid or unsupported OffsetFetchRequest version field"}
- }
-
- if err = pe.putString(r.ConsumerGroup); err != nil {
- return err
- }
- if err = pe.putArrayLength(len(r.partitions)); err != nil {
- return err
- }
- for topic, partitions := range r.partitions {
- if err = pe.putString(topic); err != nil {
- return err
- }
- if err = pe.putInt32Array(partitions); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (r *OffsetFetchRequest) decode(pd packetDecoder, version int16) (err error) {
- r.Version = version
- if r.ConsumerGroup, err = pd.getString(); err != nil {
- return err
- }
- partitionCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if partitionCount == 0 {
- return nil
- }
- r.partitions = make(map[string][]int32)
- for i := 0; i < partitionCount; i++ {
- topic, err := pd.getString()
- if err != nil {
- return err
- }
- partitions, err := pd.getInt32Array()
- if err != nil {
- return err
- }
- r.partitions[topic] = partitions
- }
- return nil
-}
-
-func (r *OffsetFetchRequest) key() int16 {
- return 9
-}
-
-func (r *OffsetFetchRequest) version() int16 {
- return r.Version
-}
-
-func (r *OffsetFetchRequest) requiredVersion() KafkaVersion {
- switch r.Version {
- case 1:
- return V0_8_2_0
- default:
- return minVersion
- }
-}
-
-func (r *OffsetFetchRequest) AddPartition(topic string, partitionID int32) {
- if r.partitions == nil {
- r.partitions = make(map[string][]int32)
- }
-
- r.partitions[topic] = append(r.partitions[topic], partitionID)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_fetch_request_test.go b/vendor/src/github.com/Shopify/sarama/offset_fetch_request_test.go
deleted file mode 100644
index 025d725c9..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_fetch_request_test.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- offsetFetchRequestNoGroupNoPartitions = []byte{
- 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00}
-
- offsetFetchRequestNoPartitions = []byte{
- 0x00, 0x04, 'b', 'l', 'a', 'h',
- 0x00, 0x00, 0x00, 0x00}
-
- offsetFetchRequestOnePartition = []byte{
- 0x00, 0x04, 'b', 'l', 'a', 'h',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x0D, 't', 'o', 'p', 'i', 'c', 'T', 'h', 'e', 'F', 'i', 'r', 's', 't',
- 0x00, 0x00, 0x00, 0x01,
- 0x4F, 0x4F, 0x4F, 0x4F}
-)
-
-func TestOffsetFetchRequest(t *testing.T) {
- request := new(OffsetFetchRequest)
- testRequest(t, "no group, no partitions", request, offsetFetchRequestNoGroupNoPartitions)
-
- request.ConsumerGroup = "blah"
- testRequest(t, "no partitions", request, offsetFetchRequestNoPartitions)
-
- request.AddPartition("topicTheFirst", 0x4F4F4F4F)
- testRequest(t, "one partition", request, offsetFetchRequestOnePartition)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_fetch_response.go b/vendor/src/github.com/Shopify/sarama/offset_fetch_response.go
deleted file mode 100644
index 323220eac..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_fetch_response.go
+++ /dev/null
@@ -1,143 +0,0 @@
-package sarama
-
-type OffsetFetchResponseBlock struct {
- Offset int64
- Metadata string
- Err KError
-}
-
-func (b *OffsetFetchResponseBlock) decode(pd packetDecoder) (err error) {
- b.Offset, err = pd.getInt64()
- if err != nil {
- return err
- }
-
- b.Metadata, err = pd.getString()
- if err != nil {
- return err
- }
-
- tmp, err := pd.getInt16()
- if err != nil {
- return err
- }
- b.Err = KError(tmp)
-
- return nil
-}
-
-func (b *OffsetFetchResponseBlock) encode(pe packetEncoder) (err error) {
- pe.putInt64(b.Offset)
-
- err = pe.putString(b.Metadata)
- if err != nil {
- return err
- }
-
- pe.putInt16(int16(b.Err))
-
- return nil
-}
-
-type OffsetFetchResponse struct {
- Blocks map[string]map[int32]*OffsetFetchResponseBlock
-}
-
-func (r *OffsetFetchResponse) encode(pe packetEncoder) error {
- if err := pe.putArrayLength(len(r.Blocks)); err != nil {
- return err
- }
- for topic, partitions := range r.Blocks {
- if err := pe.putString(topic); err != nil {
- return err
- }
- if err := pe.putArrayLength(len(partitions)); err != nil {
- return err
- }
- for partition, block := range partitions {
- pe.putInt32(partition)
- if err := block.encode(pe); err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-func (r *OffsetFetchResponse) decode(pd packetDecoder, version int16) (err error) {
- numTopics, err := pd.getArrayLength()
- if err != nil || numTopics == 0 {
- return err
- }
-
- r.Blocks = make(map[string]map[int32]*OffsetFetchResponseBlock, numTopics)
- for i := 0; i < numTopics; i++ {
- name, err := pd.getString()
- if err != nil {
- return err
- }
-
- numBlocks, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- if numBlocks == 0 {
- r.Blocks[name] = nil
- continue
- }
- r.Blocks[name] = make(map[int32]*OffsetFetchResponseBlock, numBlocks)
-
- for j := 0; j < numBlocks; j++ {
- id, err := pd.getInt32()
- if err != nil {
- return err
- }
-
- block := new(OffsetFetchResponseBlock)
- err = block.decode(pd)
- if err != nil {
- return err
- }
- r.Blocks[name][id] = block
- }
- }
-
- return nil
-}
-
-func (r *OffsetFetchResponse) key() int16 {
- return 9
-}
-
-func (r *OffsetFetchResponse) version() int16 {
- return 0
-}
-
-func (r *OffsetFetchResponse) requiredVersion() KafkaVersion {
- return minVersion
-}
-
-func (r *OffsetFetchResponse) GetBlock(topic string, partition int32) *OffsetFetchResponseBlock {
- if r.Blocks == nil {
- return nil
- }
-
- if r.Blocks[topic] == nil {
- return nil
- }
-
- return r.Blocks[topic][partition]
-}
-
-func (r *OffsetFetchResponse) AddBlock(topic string, partition int32, block *OffsetFetchResponseBlock) {
- if r.Blocks == nil {
- r.Blocks = make(map[string]map[int32]*OffsetFetchResponseBlock)
- }
- partitions := r.Blocks[topic]
- if partitions == nil {
- partitions = make(map[int32]*OffsetFetchResponseBlock)
- r.Blocks[topic] = partitions
- }
- partitions[partition] = block
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_fetch_response_test.go b/vendor/src/github.com/Shopify/sarama/offset_fetch_response_test.go
deleted file mode 100644
index 7614ae424..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_fetch_response_test.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- emptyOffsetFetchResponse = []byte{
- 0x00, 0x00, 0x00, 0x00}
-)
-
-func TestEmptyOffsetFetchResponse(t *testing.T) {
- response := OffsetFetchResponse{}
- testResponse(t, "empty", &response, emptyOffsetFetchResponse)
-}
-
-func TestNormalOffsetFetchResponse(t *testing.T) {
- response := OffsetFetchResponse{}
- response.AddBlock("t", 0, &OffsetFetchResponseBlock{0, "md", ErrRequestTimedOut})
- response.Blocks["m"] = nil
- // The response encoded form cannot be checked for it varies due to
- // unpredictable map traversal order.
- testResponse(t, "normal", &response, nil)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_manager.go b/vendor/src/github.com/Shopify/sarama/offset_manager.go
deleted file mode 100644
index 5e15cdafe..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_manager.go
+++ /dev/null
@@ -1,542 +0,0 @@
-package sarama
-
-import (
- "sync"
- "time"
-)
-
-// Offset Manager
-
-// OffsetManager uses Kafka to store and fetch consumed partition offsets.
-type OffsetManager interface {
- // ManagePartition creates a PartitionOffsetManager on the given topic/partition.
- // It will return an error if this OffsetManager is already managing the given
- // topic/partition.
- ManagePartition(topic string, partition int32) (PartitionOffsetManager, error)
-
- // Close stops the OffsetManager from managing offsets. It is required to call
- // this function before an OffsetManager object passes out of scope, as it
- // will otherwise leak memory. You must call this after all the
- // PartitionOffsetManagers are closed.
- Close() error
-}
-
-type offsetManager struct {
- client Client
- conf *Config
- group string
-
- lock sync.Mutex
- poms map[string]map[int32]*partitionOffsetManager
- boms map[*Broker]*brokerOffsetManager
-}
-
-// NewOffsetManagerFromClient creates a new OffsetManager from the given client.
-// It is still necessary to call Close() on the underlying client when finished with the partition manager.
-func NewOffsetManagerFromClient(group string, client Client) (OffsetManager, error) {
- // Check that we are not dealing with a closed Client before processing any other arguments
- if client.Closed() {
- return nil, ErrClosedClient
- }
-
- om := &offsetManager{
- client: client,
- conf: client.Config(),
- group: group,
- poms: make(map[string]map[int32]*partitionOffsetManager),
- boms: make(map[*Broker]*brokerOffsetManager),
- }
-
- return om, nil
-}
-
-func (om *offsetManager) ManagePartition(topic string, partition int32) (PartitionOffsetManager, error) {
- pom, err := om.newPartitionOffsetManager(topic, partition)
- if err != nil {
- return nil, err
- }
-
- om.lock.Lock()
- defer om.lock.Unlock()
-
- topicManagers := om.poms[topic]
- if topicManagers == nil {
- topicManagers = make(map[int32]*partitionOffsetManager)
- om.poms[topic] = topicManagers
- }
-
- if topicManagers[partition] != nil {
- return nil, ConfigurationError("That topic/partition is already being managed")
- }
-
- topicManagers[partition] = pom
- return pom, nil
-}
-
-func (om *offsetManager) Close() error {
- return nil
-}
-
-func (om *offsetManager) refBrokerOffsetManager(broker *Broker) *brokerOffsetManager {
- om.lock.Lock()
- defer om.lock.Unlock()
-
- bom := om.boms[broker]
- if bom == nil {
- bom = om.newBrokerOffsetManager(broker)
- om.boms[broker] = bom
- }
-
- bom.refs++
-
- return bom
-}
-
-func (om *offsetManager) unrefBrokerOffsetManager(bom *brokerOffsetManager) {
- om.lock.Lock()
- defer om.lock.Unlock()
-
- bom.refs--
-
- if bom.refs == 0 {
- close(bom.updateSubscriptions)
- if om.boms[bom.broker] == bom {
- delete(om.boms, bom.broker)
- }
- }
-}
-
-func (om *offsetManager) abandonBroker(bom *brokerOffsetManager) {
- om.lock.Lock()
- defer om.lock.Unlock()
-
- delete(om.boms, bom.broker)
-}
-
-func (om *offsetManager) abandonPartitionOffsetManager(pom *partitionOffsetManager) {
- om.lock.Lock()
- defer om.lock.Unlock()
-
- delete(om.poms[pom.topic], pom.partition)
- if len(om.poms[pom.topic]) == 0 {
- delete(om.poms, pom.topic)
- }
-}
-
-// Partition Offset Manager
-
-// PartitionOffsetManager uses Kafka to store and fetch consumed partition offsets. You MUST call Close()
-// on a partition offset manager to avoid leaks, it will not be garbage-collected automatically when it passes
-// out of scope.
-type PartitionOffsetManager interface {
- // NextOffset returns the next offset that should be consumed for the managed
- // partition, accompanied by metadata which can be used to reconstruct the state
- // of the partition consumer when it resumes. NextOffset() will return
- // `config.Consumer.Offsets.Initial` and an empty metadata string if no offset
- // was committed for this partition yet.
- NextOffset() (int64, string)
-
- // MarkOffset marks the provided offset, alongside a metadata string
- // that represents the state of the partition consumer at that point in time. The
- // metadata string can be used by another consumer to restore that state, so it
- // can resume consumption.
- //
- // To follow upstream conventions, you are expected to mark the offset of the
- // next message to read, not the last message read. Thus, when calling `MarkOffset`
- // you should typically add one to the offset of the last consumed message.
- //
- // Note: calling MarkOffset does not necessarily commit the offset to the backend
- // store immediately for efficiency reasons, and it may never be committed if
- // your application crashes. This means that you may end up processing the same
- // message twice, and your processing should ideally be idempotent.
- MarkOffset(offset int64, metadata string)
-
- // Errors returns a read channel of errors that occur during offset management, if
- // enabled. By default, errors are logged and not returned over this channel. If
- // you want to implement any custom error handling, set your config's
- // Consumer.Return.Errors setting to true, and read from this channel.
- Errors() <-chan *ConsumerError
-
- // AsyncClose initiates a shutdown of the PartitionOffsetManager. This method will
- // return immediately, after which you should wait until the 'errors' channel has
- // been drained and closed. It is required to call this function, or Close before
- // a consumer object passes out of scope, as it will otherwise leak memory. You
- // must call this before calling Close on the underlying client.
- AsyncClose()
-
- // Close stops the PartitionOffsetManager from managing offsets. It is required to
- // call this function (or AsyncClose) before a PartitionOffsetManager object
- // passes out of scope, as it will otherwise leak memory. You must call this
- // before calling Close on the underlying client.
- Close() error
-}
-
-type partitionOffsetManager struct {
- parent *offsetManager
- topic string
- partition int32
-
- lock sync.Mutex
- offset int64
- metadata string
- dirty bool
- clean sync.Cond
- broker *brokerOffsetManager
-
- errors chan *ConsumerError
- rebalance chan none
- dying chan none
-}
-
-func (om *offsetManager) newPartitionOffsetManager(topic string, partition int32) (*partitionOffsetManager, error) {
- pom := &partitionOffsetManager{
- parent: om,
- topic: topic,
- partition: partition,
- errors: make(chan *ConsumerError, om.conf.ChannelBufferSize),
- rebalance: make(chan none, 1),
- dying: make(chan none),
- }
- pom.clean.L = &pom.lock
-
- if err := pom.selectBroker(); err != nil {
- return nil, err
- }
-
- if err := pom.fetchInitialOffset(om.conf.Metadata.Retry.Max); err != nil {
- return nil, err
- }
-
- pom.broker.updateSubscriptions <- pom
-
- go withRecover(pom.mainLoop)
-
- return pom, nil
-}
-
-func (pom *partitionOffsetManager) mainLoop() {
- for {
- select {
- case <-pom.rebalance:
- if err := pom.selectBroker(); err != nil {
- pom.handleError(err)
- pom.rebalance <- none{}
- } else {
- pom.broker.updateSubscriptions <- pom
- }
- case <-pom.dying:
- if pom.broker != nil {
- select {
- case <-pom.rebalance:
- case pom.broker.updateSubscriptions <- pom:
- }
- pom.parent.unrefBrokerOffsetManager(pom.broker)
- }
- pom.parent.abandonPartitionOffsetManager(pom)
- close(pom.errors)
- return
- }
- }
-}
-
-func (pom *partitionOffsetManager) selectBroker() error {
- if pom.broker != nil {
- pom.parent.unrefBrokerOffsetManager(pom.broker)
- pom.broker = nil
- }
-
- var broker *Broker
- var err error
-
- if err = pom.parent.client.RefreshCoordinator(pom.parent.group); err != nil {
- return err
- }
-
- if broker, err = pom.parent.client.Coordinator(pom.parent.group); err != nil {
- return err
- }
-
- pom.broker = pom.parent.refBrokerOffsetManager(broker)
- return nil
-}
-
-func (pom *partitionOffsetManager) fetchInitialOffset(retries int) error {
- request := new(OffsetFetchRequest)
- request.Version = 1
- request.ConsumerGroup = pom.parent.group
- request.AddPartition(pom.topic, pom.partition)
-
- response, err := pom.broker.broker.FetchOffset(request)
- if err != nil {
- return err
- }
-
- block := response.GetBlock(pom.topic, pom.partition)
- if block == nil {
- return ErrIncompleteResponse
- }
-
- switch block.Err {
- case ErrNoError:
- pom.offset = block.Offset
- pom.metadata = block.Metadata
- return nil
- case ErrNotCoordinatorForConsumer:
- if retries <= 0 {
- return block.Err
- }
- if err := pom.selectBroker(); err != nil {
- return err
- }
- return pom.fetchInitialOffset(retries - 1)
- case ErrOffsetsLoadInProgress:
- if retries <= 0 {
- return block.Err
- }
- time.Sleep(pom.parent.conf.Metadata.Retry.Backoff)
- return pom.fetchInitialOffset(retries - 1)
- default:
- return block.Err
- }
-}
-
-func (pom *partitionOffsetManager) handleError(err error) {
- cErr := &ConsumerError{
- Topic: pom.topic,
- Partition: pom.partition,
- Err: err,
- }
-
- if pom.parent.conf.Consumer.Return.Errors {
- pom.errors <- cErr
- } else {
- Logger.Println(cErr)
- }
-}
-
-func (pom *partitionOffsetManager) Errors() <-chan *ConsumerError {
- return pom.errors
-}
-
-func (pom *partitionOffsetManager) MarkOffset(offset int64, metadata string) {
- pom.lock.Lock()
- defer pom.lock.Unlock()
-
- if offset > pom.offset {
- pom.offset = offset
- pom.metadata = metadata
- pom.dirty = true
- }
-}
-
-func (pom *partitionOffsetManager) updateCommitted(offset int64, metadata string) {
- pom.lock.Lock()
- defer pom.lock.Unlock()
-
- if pom.offset == offset && pom.metadata == metadata {
- pom.dirty = false
- pom.clean.Signal()
- }
-}
-
-func (pom *partitionOffsetManager) NextOffset() (int64, string) {
- pom.lock.Lock()
- defer pom.lock.Unlock()
-
- if pom.offset >= 0 {
- return pom.offset, pom.metadata
- }
-
- return pom.parent.conf.Consumer.Offsets.Initial, ""
-}
-
-func (pom *partitionOffsetManager) AsyncClose() {
- go func() {
- pom.lock.Lock()
- defer pom.lock.Unlock()
-
- for pom.dirty {
- pom.clean.Wait()
- }
-
- close(pom.dying)
- }()
-}
-
-func (pom *partitionOffsetManager) Close() error {
- pom.AsyncClose()
-
- var errors ConsumerErrors
- for err := range pom.errors {
- errors = append(errors, err)
- }
-
- if len(errors) > 0 {
- return errors
- }
- return nil
-}
-
-// Broker Offset Manager
-
-type brokerOffsetManager struct {
- parent *offsetManager
- broker *Broker
- timer *time.Ticker
- updateSubscriptions chan *partitionOffsetManager
- subscriptions map[*partitionOffsetManager]none
- refs int
-}
-
-func (om *offsetManager) newBrokerOffsetManager(broker *Broker) *brokerOffsetManager {
- bom := &brokerOffsetManager{
- parent: om,
- broker: broker,
- timer: time.NewTicker(om.conf.Consumer.Offsets.CommitInterval),
- updateSubscriptions: make(chan *partitionOffsetManager),
- subscriptions: make(map[*partitionOffsetManager]none),
- }
-
- go withRecover(bom.mainLoop)
-
- return bom
-}
-
-func (bom *brokerOffsetManager) mainLoop() {
- for {
- select {
- case <-bom.timer.C:
- if len(bom.subscriptions) > 0 {
- bom.flushToBroker()
- }
- case s, ok := <-bom.updateSubscriptions:
- if !ok {
- bom.timer.Stop()
- return
- }
- if _, ok := bom.subscriptions[s]; ok {
- delete(bom.subscriptions, s)
- } else {
- bom.subscriptions[s] = none{}
- }
- }
- }
-}
-
-func (bom *brokerOffsetManager) flushToBroker() {
- request := bom.constructRequest()
- if request == nil {
- return
- }
-
- response, err := bom.broker.CommitOffset(request)
-
- if err != nil {
- bom.abort(err)
- return
- }
-
- for s := range bom.subscriptions {
- if request.blocks[s.topic] == nil || request.blocks[s.topic][s.partition] == nil {
- continue
- }
-
- var err KError
- var ok bool
-
- if response.Errors[s.topic] == nil {
- s.handleError(ErrIncompleteResponse)
- delete(bom.subscriptions, s)
- s.rebalance <- none{}
- continue
- }
- if err, ok = response.Errors[s.topic][s.partition]; !ok {
- s.handleError(ErrIncompleteResponse)
- delete(bom.subscriptions, s)
- s.rebalance <- none{}
- continue
- }
-
- switch err {
- case ErrNoError:
- block := request.blocks[s.topic][s.partition]
- s.updateCommitted(block.offset, block.metadata)
- case ErrNotLeaderForPartition, ErrLeaderNotAvailable,
- ErrConsumerCoordinatorNotAvailable, ErrNotCoordinatorForConsumer:
- // not a critical error, we just need to redispatch
- delete(bom.subscriptions, s)
- s.rebalance <- none{}
- case ErrOffsetMetadataTooLarge, ErrInvalidCommitOffsetSize:
- // nothing we can do about this, just tell the user and carry on
- s.handleError(err)
- case ErrOffsetsLoadInProgress:
- // nothing wrong but we didn't commit, we'll get it next time round
- break
- case ErrUnknownTopicOrPartition:
- // let the user know *and* try redispatching - if topic-auto-create is
- // enabled, redispatching should trigger a metadata request and create the
- // topic; if not then re-dispatching won't help, but we've let the user
- // know and it shouldn't hurt either (see https://github.com/Shopify/sarama/issues/706)
- fallthrough
- default:
- // dunno, tell the user and try redispatching
- s.handleError(err)
- delete(bom.subscriptions, s)
- s.rebalance <- none{}
- }
- }
-}
-
-func (bom *brokerOffsetManager) constructRequest() *OffsetCommitRequest {
- var r *OffsetCommitRequest
- var perPartitionTimestamp int64
- if bom.parent.conf.Consumer.Offsets.Retention == 0 {
- perPartitionTimestamp = ReceiveTime
- r = &OffsetCommitRequest{
- Version: 1,
- ConsumerGroup: bom.parent.group,
- ConsumerGroupGeneration: GroupGenerationUndefined,
- }
- } else {
- r = &OffsetCommitRequest{
- Version: 2,
- RetentionTime: int64(bom.parent.conf.Consumer.Offsets.Retention / time.Millisecond),
- ConsumerGroup: bom.parent.group,
- ConsumerGroupGeneration: GroupGenerationUndefined,
- }
-
- }
-
- for s := range bom.subscriptions {
- s.lock.Lock()
- if s.dirty {
- r.AddBlock(s.topic, s.partition, s.offset, perPartitionTimestamp, s.metadata)
- }
- s.lock.Unlock()
- }
-
- if len(r.blocks) > 0 {
- return r
- }
-
- return nil
-}
-
-func (bom *brokerOffsetManager) abort(err error) {
- _ = bom.broker.Close() // we don't care about the error this might return, we already have one
- bom.parent.abandonBroker(bom)
-
- for pom := range bom.subscriptions {
- pom.handleError(err)
- pom.rebalance <- none{}
- }
-
- for s := range bom.updateSubscriptions {
- if _, ok := bom.subscriptions[s]; !ok {
- s.handleError(err)
- s.rebalance <- none{}
- }
- }
-
- bom.subscriptions = make(map[*partitionOffsetManager]none)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_manager_test.go b/vendor/src/github.com/Shopify/sarama/offset_manager_test.go
deleted file mode 100644
index c111a5a63..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_manager_test.go
+++ /dev/null
@@ -1,369 +0,0 @@
-package sarama
-
-import (
- "testing"
- "time"
-)
-
-func initOffsetManager(t *testing.T) (om OffsetManager,
- testClient Client, broker, coordinator *MockBroker) {
-
- config := NewConfig()
- config.Metadata.Retry.Max = 1
- config.Consumer.Offsets.CommitInterval = 1 * time.Millisecond
- config.Version = V0_9_0_0
-
- broker = NewMockBroker(t, 1)
- coordinator = NewMockBroker(t, 2)
-
- seedMeta := new(MetadataResponse)
- seedMeta.AddBroker(coordinator.Addr(), coordinator.BrokerID())
- seedMeta.AddTopicPartition("my_topic", 0, 1, []int32{}, []int32{}, ErrNoError)
- seedMeta.AddTopicPartition("my_topic", 1, 1, []int32{}, []int32{}, ErrNoError)
- broker.Returns(seedMeta)
-
- var err error
- testClient, err = NewClient([]string{broker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- broker.Returns(&ConsumerMetadataResponse{
- CoordinatorID: coordinator.BrokerID(),
- CoordinatorHost: "127.0.0.1",
- CoordinatorPort: coordinator.Port(),
- })
-
- om, err = NewOffsetManagerFromClient("group", testClient)
- if err != nil {
- t.Fatal(err)
- }
-
- return om, testClient, broker, coordinator
-}
-
-func initPartitionOffsetManager(t *testing.T, om OffsetManager,
- coordinator *MockBroker, initialOffset int64, metadata string) PartitionOffsetManager {
-
- fetchResponse := new(OffsetFetchResponse)
- fetchResponse.AddBlock("my_topic", 0, &OffsetFetchResponseBlock{
- Err: ErrNoError,
- Offset: initialOffset,
- Metadata: metadata,
- })
- coordinator.Returns(fetchResponse)
-
- pom, err := om.ManagePartition("my_topic", 0)
- if err != nil {
- t.Fatal(err)
- }
-
- return pom
-}
-
-func TestNewOffsetManager(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- seedBroker.Returns(new(MetadataResponse))
-
- testClient, err := NewClient([]string{seedBroker.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- _, err = NewOffsetManagerFromClient("group", testClient)
- if err != nil {
- t.Error(err)
- }
-
- safeClose(t, testClient)
-
- _, err = NewOffsetManagerFromClient("group", testClient)
- if err != ErrClosedClient {
- t.Errorf("Error expected for closed client; actual value: %v", err)
- }
-
- seedBroker.Close()
-}
-
-// Test recovery from ErrNotCoordinatorForConsumer
-// on first fetchInitialOffset call
-func TestOffsetManagerFetchInitialFail(t *testing.T) {
- om, testClient, broker, coordinator := initOffsetManager(t)
-
- // Error on first fetchInitialOffset call
- responseBlock := OffsetFetchResponseBlock{
- Err: ErrNotCoordinatorForConsumer,
- Offset: 5,
- Metadata: "test_meta",
- }
-
- fetchResponse := new(OffsetFetchResponse)
- fetchResponse.AddBlock("my_topic", 0, &responseBlock)
- coordinator.Returns(fetchResponse)
-
- // Refresh coordinator
- newCoordinator := NewMockBroker(t, 3)
- broker.Returns(&ConsumerMetadataResponse{
- CoordinatorID: newCoordinator.BrokerID(),
- CoordinatorHost: "127.0.0.1",
- CoordinatorPort: newCoordinator.Port(),
- })
-
- // Second fetchInitialOffset call is fine
- fetchResponse2 := new(OffsetFetchResponse)
- responseBlock2 := responseBlock
- responseBlock2.Err = ErrNoError
- fetchResponse2.AddBlock("my_topic", 0, &responseBlock2)
- newCoordinator.Returns(fetchResponse2)
-
- pom, err := om.ManagePartition("my_topic", 0)
- if err != nil {
- t.Error(err)
- }
-
- broker.Close()
- coordinator.Close()
- newCoordinator.Close()
- safeClose(t, pom)
- safeClose(t, om)
- safeClose(t, testClient)
-}
-
-// Test fetchInitialOffset retry on ErrOffsetsLoadInProgress
-func TestOffsetManagerFetchInitialLoadInProgress(t *testing.T) {
- om, testClient, broker, coordinator := initOffsetManager(t)
-
- // Error on first fetchInitialOffset call
- responseBlock := OffsetFetchResponseBlock{
- Err: ErrOffsetsLoadInProgress,
- Offset: 5,
- Metadata: "test_meta",
- }
-
- fetchResponse := new(OffsetFetchResponse)
- fetchResponse.AddBlock("my_topic", 0, &responseBlock)
- coordinator.Returns(fetchResponse)
-
- // Second fetchInitialOffset call is fine
- fetchResponse2 := new(OffsetFetchResponse)
- responseBlock2 := responseBlock
- responseBlock2.Err = ErrNoError
- fetchResponse2.AddBlock("my_topic", 0, &responseBlock2)
- coordinator.Returns(fetchResponse2)
-
- pom, err := om.ManagePartition("my_topic", 0)
- if err != nil {
- t.Error(err)
- }
-
- broker.Close()
- coordinator.Close()
- safeClose(t, pom)
- safeClose(t, om)
- safeClose(t, testClient)
-}
-
-func TestPartitionOffsetManagerInitialOffset(t *testing.T) {
- om, testClient, broker, coordinator := initOffsetManager(t)
- testClient.Config().Consumer.Offsets.Initial = OffsetOldest
-
- // Kafka returns -1 if no offset has been stored for this partition yet.
- pom := initPartitionOffsetManager(t, om, coordinator, -1, "")
-
- offset, meta := pom.NextOffset()
- if offset != OffsetOldest {
- t.Errorf("Expected offset 5. Actual: %v", offset)
- }
- if meta != "" {
- t.Errorf("Expected metadata to be empty. Actual: %q", meta)
- }
-
- safeClose(t, pom)
- safeClose(t, om)
- broker.Close()
- coordinator.Close()
- safeClose(t, testClient)
-}
-
-func TestPartitionOffsetManagerNextOffset(t *testing.T) {
- om, testClient, broker, coordinator := initOffsetManager(t)
- pom := initPartitionOffsetManager(t, om, coordinator, 5, "test_meta")
-
- offset, meta := pom.NextOffset()
- if offset != 5 {
- t.Errorf("Expected offset 5. Actual: %v", offset)
- }
- if meta != "test_meta" {
- t.Errorf("Expected metadata \"test_meta\". Actual: %q", meta)
- }
-
- safeClose(t, pom)
- safeClose(t, om)
- broker.Close()
- coordinator.Close()
- safeClose(t, testClient)
-}
-
-func TestPartitionOffsetManagerMarkOffset(t *testing.T) {
- om, testClient, broker, coordinator := initOffsetManager(t)
- pom := initPartitionOffsetManager(t, om, coordinator, 5, "original_meta")
-
- ocResponse := new(OffsetCommitResponse)
- ocResponse.AddError("my_topic", 0, ErrNoError)
- coordinator.Returns(ocResponse)
-
- pom.MarkOffset(100, "modified_meta")
- offset, meta := pom.NextOffset()
-
- if offset != 100 {
- t.Errorf("Expected offset 100. Actual: %v", offset)
- }
- if meta != "modified_meta" {
- t.Errorf("Expected metadata \"modified_meta\". Actual: %q", meta)
- }
-
- safeClose(t, pom)
- safeClose(t, om)
- safeClose(t, testClient)
- broker.Close()
- coordinator.Close()
-}
-
-func TestPartitionOffsetManagerMarkOffsetWithRetention(t *testing.T) {
- om, testClient, broker, coordinator := initOffsetManager(t)
- testClient.Config().Consumer.Offsets.Retention = time.Hour
-
- pom := initPartitionOffsetManager(t, om, coordinator, 5, "original_meta")
-
- ocResponse := new(OffsetCommitResponse)
- ocResponse.AddError("my_topic", 0, ErrNoError)
- handler := func(req *request) (res encoder) {
- if req.body.version() != 2 {
- t.Errorf("Expected to be using version 2. Actual: %v", req.body.version())
- }
- offsetCommitRequest := req.body.(*OffsetCommitRequest)
- if offsetCommitRequest.RetentionTime != (60 * 60 * 1000) {
- t.Errorf("Expected an hour retention time. Actual: %v", offsetCommitRequest.RetentionTime)
- }
- return ocResponse
- }
- coordinator.setHandler(handler)
-
- pom.MarkOffset(100, "modified_meta")
- offset, meta := pom.NextOffset()
-
- if offset != 100 {
- t.Errorf("Expected offset 100. Actual: %v", offset)
- }
- if meta != "modified_meta" {
- t.Errorf("Expected metadata \"modified_meta\". Actual: %q", meta)
- }
-
- safeClose(t, pom)
- safeClose(t, om)
- safeClose(t, testClient)
- broker.Close()
- coordinator.Close()
-}
-
-func TestPartitionOffsetManagerCommitErr(t *testing.T) {
- om, testClient, broker, coordinator := initOffsetManager(t)
- pom := initPartitionOffsetManager(t, om, coordinator, 5, "meta")
-
- // Error on one partition
- ocResponse := new(OffsetCommitResponse)
- ocResponse.AddError("my_topic", 0, ErrOffsetOutOfRange)
- ocResponse.AddError("my_topic", 1, ErrNoError)
- coordinator.Returns(ocResponse)
-
- newCoordinator := NewMockBroker(t, 3)
-
- // For RefreshCoordinator()
- broker.Returns(&ConsumerMetadataResponse{
- CoordinatorID: newCoordinator.BrokerID(),
- CoordinatorHost: "127.0.0.1",
- CoordinatorPort: newCoordinator.Port(),
- })
-
- // Nothing in response.Errors at all
- ocResponse2 := new(OffsetCommitResponse)
- newCoordinator.Returns(ocResponse2)
-
- // For RefreshCoordinator()
- broker.Returns(&ConsumerMetadataResponse{
- CoordinatorID: newCoordinator.BrokerID(),
- CoordinatorHost: "127.0.0.1",
- CoordinatorPort: newCoordinator.Port(),
- })
-
- // Error on the wrong partition for this pom
- ocResponse3 := new(OffsetCommitResponse)
- ocResponse3.AddError("my_topic", 1, ErrNoError)
- newCoordinator.Returns(ocResponse3)
-
- // For RefreshCoordinator()
- broker.Returns(&ConsumerMetadataResponse{
- CoordinatorID: newCoordinator.BrokerID(),
- CoordinatorHost: "127.0.0.1",
- CoordinatorPort: newCoordinator.Port(),
- })
-
- // ErrUnknownTopicOrPartition/ErrNotLeaderForPartition/ErrLeaderNotAvailable block
- ocResponse4 := new(OffsetCommitResponse)
- ocResponse4.AddError("my_topic", 0, ErrUnknownTopicOrPartition)
- newCoordinator.Returns(ocResponse4)
-
- // For RefreshCoordinator()
- broker.Returns(&ConsumerMetadataResponse{
- CoordinatorID: newCoordinator.BrokerID(),
- CoordinatorHost: "127.0.0.1",
- CoordinatorPort: newCoordinator.Port(),
- })
-
- // Normal error response
- ocResponse5 := new(OffsetCommitResponse)
- ocResponse5.AddError("my_topic", 0, ErrNoError)
- newCoordinator.Returns(ocResponse5)
-
- pom.MarkOffset(100, "modified_meta")
-
- err := pom.Close()
- if err != nil {
- t.Error(err)
- }
-
- broker.Close()
- coordinator.Close()
- newCoordinator.Close()
- safeClose(t, om)
- safeClose(t, testClient)
-}
-
-// Test of recovery from abort
-func TestAbortPartitionOffsetManager(t *testing.T) {
- om, testClient, broker, coordinator := initOffsetManager(t)
- pom := initPartitionOffsetManager(t, om, coordinator, 5, "meta")
-
- // this triggers an error in the CommitOffset request,
- // which leads to the abort call
- coordinator.Close()
-
- // Response to refresh coordinator request
- newCoordinator := NewMockBroker(t, 3)
- broker.Returns(&ConsumerMetadataResponse{
- CoordinatorID: newCoordinator.BrokerID(),
- CoordinatorHost: "127.0.0.1",
- CoordinatorPort: newCoordinator.Port(),
- })
-
- ocResponse := new(OffsetCommitResponse)
- ocResponse.AddError("my_topic", 0, ErrNoError)
- newCoordinator.Returns(ocResponse)
-
- pom.MarkOffset(100, "modified_meta")
-
- safeClose(t, pom)
- safeClose(t, om)
- broker.Close()
- safeClose(t, testClient)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_request.go b/vendor/src/github.com/Shopify/sarama/offset_request.go
deleted file mode 100644
index 6c2696016..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_request.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package sarama
-
-type offsetRequestBlock struct {
- time int64
- maxOffsets int32 // Only used in version 0
-}
-
-func (b *offsetRequestBlock) encode(pe packetEncoder, version int16) error {
- pe.putInt64(int64(b.time))
- if version == 0 {
- pe.putInt32(b.maxOffsets)
- }
-
- return nil
-}
-
-func (b *offsetRequestBlock) decode(pd packetDecoder, version int16) (err error) {
- if b.time, err = pd.getInt64(); err != nil {
- return err
- }
- if version == 0 {
- if b.maxOffsets, err = pd.getInt32(); err != nil {
- return err
- }
- }
- return nil
-}
-
-type OffsetRequest struct {
- Version int16
- blocks map[string]map[int32]*offsetRequestBlock
-}
-
-func (r *OffsetRequest) encode(pe packetEncoder) error {
- pe.putInt32(-1) // replica ID is always -1 for clients
- err := pe.putArrayLength(len(r.blocks))
- if err != nil {
- return err
- }
- for topic, partitions := range r.blocks {
- err = pe.putString(topic)
- if err != nil {
- return err
- }
- err = pe.putArrayLength(len(partitions))
- if err != nil {
- return err
- }
- for partition, block := range partitions {
- pe.putInt32(partition)
- if err = block.encode(pe, r.Version); err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-func (r *OffsetRequest) decode(pd packetDecoder, version int16) error {
- r.Version = version
-
- // Ignore replica ID
- if _, err := pd.getInt32(); err != nil {
- return err
- }
- blockCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if blockCount == 0 {
- return nil
- }
- r.blocks = make(map[string]map[int32]*offsetRequestBlock)
- for i := 0; i < blockCount; i++ {
- topic, err := pd.getString()
- if err != nil {
- return err
- }
- partitionCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- r.blocks[topic] = make(map[int32]*offsetRequestBlock)
- for j := 0; j < partitionCount; j++ {
- partition, err := pd.getInt32()
- if err != nil {
- return err
- }
- block := &offsetRequestBlock{}
- if err := block.decode(pd, version); err != nil {
- return err
- }
- r.blocks[topic][partition] = block
- }
- }
- return nil
-}
-
-func (r *OffsetRequest) key() int16 {
- return 2
-}
-
-func (r *OffsetRequest) version() int16 {
- return r.Version
-}
-
-func (r *OffsetRequest) requiredVersion() KafkaVersion {
- switch r.Version {
- case 1:
- return V0_10_1_0
- default:
- return minVersion
- }
-}
-
-func (r *OffsetRequest) AddBlock(topic string, partitionID int32, time int64, maxOffsets int32) {
- if r.blocks == nil {
- r.blocks = make(map[string]map[int32]*offsetRequestBlock)
- }
-
- if r.blocks[topic] == nil {
- r.blocks[topic] = make(map[int32]*offsetRequestBlock)
- }
-
- tmp := new(offsetRequestBlock)
- tmp.time = time
- if r.Version == 0 {
- tmp.maxOffsets = maxOffsets
- }
-
- r.blocks[topic][partitionID] = tmp
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_request_test.go b/vendor/src/github.com/Shopify/sarama/offset_request_test.go
deleted file mode 100644
index 9ce562c99..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_request_test.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- offsetRequestNoBlocks = []byte{
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0x00, 0x00, 0x00, 0x00}
-
- offsetRequestOneBlock = []byte{
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x03, 'f', 'o', 'o',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x04,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x02}
-
- offsetRequestOneBlockV1 = []byte{
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x03, 'b', 'a', 'r',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x04,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
-)
-
-func TestOffsetRequest(t *testing.T) {
- request := new(OffsetRequest)
- testRequest(t, "no blocks", request, offsetRequestNoBlocks)
-
- request.AddBlock("foo", 4, 1, 2)
- testRequest(t, "one block", request, offsetRequestOneBlock)
-}
-
-func TestOffsetRequestV1(t *testing.T) {
- request := new(OffsetRequest)
- request.Version = 1
- testRequest(t, "no blocks", request, offsetRequestNoBlocks)
-
- request.AddBlock("bar", 4, 1, 2) // Last argument is ignored for V1
- testRequest(t, "one block", request, offsetRequestOneBlockV1)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_response.go b/vendor/src/github.com/Shopify/sarama/offset_response.go
deleted file mode 100644
index 9a9cfe96f..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_response.go
+++ /dev/null
@@ -1,174 +0,0 @@
-package sarama
-
-type OffsetResponseBlock struct {
- Err KError
- Offsets []int64 // Version 0
- Offset int64 // Version 1
- Timestamp int64 // Version 1
-}
-
-func (b *OffsetResponseBlock) decode(pd packetDecoder, version int16) (err error) {
- tmp, err := pd.getInt16()
- if err != nil {
- return err
- }
- b.Err = KError(tmp)
-
- if version == 0 {
- b.Offsets, err = pd.getInt64Array()
-
- return err
- }
-
- b.Timestamp, err = pd.getInt64()
- if err != nil {
- return err
- }
-
- b.Offset, err = pd.getInt64()
- if err != nil {
- return err
- }
-
- // For backwards compatibility put the offset in the offsets array too
- b.Offsets = []int64{b.Offset}
-
- return nil
-}
-
-func (b *OffsetResponseBlock) encode(pe packetEncoder, version int16) (err error) {
- pe.putInt16(int16(b.Err))
-
- if version == 0 {
- return pe.putInt64Array(b.Offsets)
- }
-
- pe.putInt64(b.Timestamp)
- pe.putInt64(b.Offset)
-
- return nil
-}
-
-type OffsetResponse struct {
- Version int16
- Blocks map[string]map[int32]*OffsetResponseBlock
-}
-
-func (r *OffsetResponse) decode(pd packetDecoder, version int16) (err error) {
- numTopics, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Blocks = make(map[string]map[int32]*OffsetResponseBlock, numTopics)
- for i := 0; i < numTopics; i++ {
- name, err := pd.getString()
- if err != nil {
- return err
- }
-
- numBlocks, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Blocks[name] = make(map[int32]*OffsetResponseBlock, numBlocks)
-
- for j := 0; j < numBlocks; j++ {
- id, err := pd.getInt32()
- if err != nil {
- return err
- }
-
- block := new(OffsetResponseBlock)
- err = block.decode(pd, version)
- if err != nil {
- return err
- }
- r.Blocks[name][id] = block
- }
- }
-
- return nil
-}
-
-func (r *OffsetResponse) GetBlock(topic string, partition int32) *OffsetResponseBlock {
- if r.Blocks == nil {
- return nil
- }
-
- if r.Blocks[topic] == nil {
- return nil
- }
-
- return r.Blocks[topic][partition]
-}
-
-/*
-// [0 0 0 1 ntopics
-0 8 109 121 95 116 111 112 105 99 topic
-0 0 0 1 npartitions
-0 0 0 0 id
-0 0
-
-0 0 0 1 0 0 0 0
-0 1 1 1 0 0 0 1
-0 8 109 121 95 116 111 112
-105 99 0 0 0 1 0 0
-0 0 0 0 0 0 0 1
-0 0 0 0 0 1 1 1]
-
-*/
-func (r *OffsetResponse) encode(pe packetEncoder) (err error) {
- if err = pe.putArrayLength(len(r.Blocks)); err != nil {
- return err
- }
-
- for topic, partitions := range r.Blocks {
- if err = pe.putString(topic); err != nil {
- return err
- }
- if err = pe.putArrayLength(len(partitions)); err != nil {
- return err
- }
- for partition, block := range partitions {
- pe.putInt32(partition)
- if err = block.encode(pe, r.version()); err != nil {
- return err
- }
- }
- }
-
- return nil
-}
-
-func (r *OffsetResponse) key() int16 {
- return 2
-}
-
-func (r *OffsetResponse) version() int16 {
- return r.Version
-}
-
-func (r *OffsetResponse) requiredVersion() KafkaVersion {
- switch r.Version {
- case 1:
- return V0_10_1_0
- default:
- return minVersion
- }
-}
-
-// testing API
-
-func (r *OffsetResponse) AddTopicPartition(topic string, partition int32, offset int64) {
- if r.Blocks == nil {
- r.Blocks = make(map[string]map[int32]*OffsetResponseBlock)
- }
- byTopic, ok := r.Blocks[topic]
- if !ok {
- byTopic = make(map[int32]*OffsetResponseBlock)
- r.Blocks[topic] = byTopic
- }
- byTopic[partition] = &OffsetResponseBlock{Offsets: []int64{offset}, Offset: offset}
-}
diff --git a/vendor/src/github.com/Shopify/sarama/offset_response_test.go b/vendor/src/github.com/Shopify/sarama/offset_response_test.go
deleted file mode 100644
index 0df6c9f3e..000000000
--- a/vendor/src/github.com/Shopify/sarama/offset_response_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- emptyOffsetResponse = []byte{
- 0x00, 0x00, 0x00, 0x00}
-
- normalOffsetResponse = []byte{
- 0x00, 0x00, 0x00, 0x02,
-
- 0x00, 0x01, 'a',
- 0x00, 0x00, 0x00, 0x00,
-
- 0x00, 0x01, 'z',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x02,
- 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x02,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06}
-
- normalOffsetResponseV1 = []byte{
- 0x00, 0x00, 0x00, 0x02,
-
- 0x00, 0x01, 'a',
- 0x00, 0x00, 0x00, 0x00,
-
- 0x00, 0x01, 'z',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x02,
- 0x00, 0x00,
- 0x00, 0x00, 0x01, 0x58, 0x1A, 0xE6, 0x48, 0x86,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06}
-)
-
-func TestEmptyOffsetResponse(t *testing.T) {
- response := OffsetResponse{}
-
- testVersionDecodable(t, "empty", &response, emptyOffsetResponse, 0)
- if len(response.Blocks) != 0 {
- t.Error("Decoding produced", len(response.Blocks), "topics where there were none.")
- }
-
- response = OffsetResponse{}
-
- testVersionDecodable(t, "empty", &response, emptyOffsetResponse, 1)
- if len(response.Blocks) != 0 {
- t.Error("Decoding produced", len(response.Blocks), "topics where there were none.")
- }
-}
-
-func TestNormalOffsetResponse(t *testing.T) {
- response := OffsetResponse{}
-
- testVersionDecodable(t, "normal", &response, normalOffsetResponse, 0)
-
- if len(response.Blocks) != 2 {
- t.Fatal("Decoding produced", len(response.Blocks), "topics where there were two.")
- }
-
- if len(response.Blocks["a"]) != 0 {
- t.Fatal("Decoding produced", len(response.Blocks["a"]), "partitions for topic 'a' where there were none.")
- }
-
- if len(response.Blocks["z"]) != 1 {
- t.Fatal("Decoding produced", len(response.Blocks["z"]), "partitions for topic 'z' where there was one.")
- }
-
- if response.Blocks["z"][2].Err != ErrNoError {
- t.Fatal("Decoding produced invalid error for topic z partition 2.")
- }
-
- if len(response.Blocks["z"][2].Offsets) != 2 {
- t.Fatal("Decoding produced invalid number of offsets for topic z partition 2.")
- }
-
- if response.Blocks["z"][2].Offsets[0] != 5 || response.Blocks["z"][2].Offsets[1] != 6 {
- t.Fatal("Decoding produced invalid offsets for topic z partition 2.")
- }
-}
-
-func TestNormalOffsetResponseV1(t *testing.T) {
- response := OffsetResponse{}
-
- testVersionDecodable(t, "normal", &response, normalOffsetResponseV1, 1)
-
- if len(response.Blocks) != 2 {
- t.Fatal("Decoding produced", len(response.Blocks), "topics where there were two.")
- }
-
- if len(response.Blocks["a"]) != 0 {
- t.Fatal("Decoding produced", len(response.Blocks["a"]), "partitions for topic 'a' where there were none.")
- }
-
- if len(response.Blocks["z"]) != 1 {
- t.Fatal("Decoding produced", len(response.Blocks["z"]), "partitions for topic 'z' where there was one.")
- }
-
- if response.Blocks["z"][2].Err != ErrNoError {
- t.Fatal("Decoding produced invalid error for topic z partition 2.")
- }
-
- if response.Blocks["z"][2].Timestamp != 1477920049286 {
- t.Fatal("Decoding produced invalid timestamp for topic z partition 2.", response.Blocks["z"][2].Timestamp)
- }
-
- if response.Blocks["z"][2].Offset != 6 {
- t.Fatal("Decoding produced invalid offsets for topic z partition 2.")
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/packet_decoder.go b/vendor/src/github.com/Shopify/sarama/packet_decoder.go
deleted file mode 100644
index 28670c0e6..000000000
--- a/vendor/src/github.com/Shopify/sarama/packet_decoder.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package sarama
-
-// PacketDecoder is the interface providing helpers for reading with Kafka's encoding rules.
-// Types implementing Decoder only need to worry about calling methods like GetString,
-// not about how a string is represented in Kafka.
-type packetDecoder interface {
- // Primitives
- getInt8() (int8, error)
- getInt16() (int16, error)
- getInt32() (int32, error)
- getInt64() (int64, error)
- getArrayLength() (int, error)
-
- // Collections
- getBytes() ([]byte, error)
- getString() (string, error)
- getInt32Array() ([]int32, error)
- getInt64Array() ([]int64, error)
- getStringArray() ([]string, error)
-
- // Subsets
- remaining() int
- getSubset(length int) (packetDecoder, error)
-
- // Stacks, see PushDecoder
- push(in pushDecoder) error
- pop() error
-}
-
-// PushDecoder is the interface for decoding fields like CRCs and lengths where the validity
-// of the field depends on what is after it in the packet. Start them with PacketDecoder.Push() where
-// the actual value is located in the packet, then PacketDecoder.Pop() them when all the bytes they
-// depend upon have been decoded.
-type pushDecoder interface {
- // Saves the offset into the input buffer as the location to actually read the calculated value when able.
- saveOffset(in int)
-
- // Returns the length of data to reserve for the input of this encoder (eg 4 bytes for a CRC32).
- reserveLength() int
-
- // Indicates that all required data is now available to calculate and check the field.
- // SaveOffset is guaranteed to have been called first. The implementation should read ReserveLength() bytes
- // of data from the saved offset, and verify it based on the data between the saved offset and curOffset.
- check(curOffset int, buf []byte) error
-}
diff --git a/vendor/src/github.com/Shopify/sarama/packet_encoder.go b/vendor/src/github.com/Shopify/sarama/packet_encoder.go
deleted file mode 100644
index 27a10f6d4..000000000
--- a/vendor/src/github.com/Shopify/sarama/packet_encoder.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package sarama
-
-import "github.com/rcrowley/go-metrics"
-
-// PacketEncoder is the interface providing helpers for writing with Kafka's encoding rules.
-// Types implementing Encoder only need to worry about calling methods like PutString,
-// not about how a string is represented in Kafka.
-type packetEncoder interface {
- // Primitives
- putInt8(in int8)
- putInt16(in int16)
- putInt32(in int32)
- putInt64(in int64)
- putArrayLength(in int) error
-
- // Collections
- putBytes(in []byte) error
- putRawBytes(in []byte) error
- putString(in string) error
- putStringArray(in []string) error
- putInt32Array(in []int32) error
- putInt64Array(in []int64) error
-
- // Provide the current offset to record the batch size metric
- offset() int
-
- // Stacks, see PushEncoder
- push(in pushEncoder)
- pop() error
-
- // To record metrics when provided
- metricRegistry() metrics.Registry
-}
-
-// PushEncoder is the interface for encoding fields like CRCs and lengths where the value
-// of the field depends on what is encoded after it in the packet. Start them with PacketEncoder.Push() where
-// the actual value is located in the packet, then PacketEncoder.Pop() them when all the bytes they
-// depend upon have been written.
-type pushEncoder interface {
- // Saves the offset into the input buffer as the location to actually write the calculated value when able.
- saveOffset(in int)
-
- // Returns the length of data to reserve for the output of this encoder (eg 4 bytes for a CRC32).
- reserveLength() int
-
- // Indicates that all required data is now available to calculate and write the field.
- // SaveOffset is guaranteed to have been called first. The implementation should write ReserveLength() bytes
- // of data to the saved offset, based on the data between the saved offset and curOffset.
- run(curOffset int, buf []byte) error
-}
diff --git a/vendor/src/github.com/Shopify/sarama/partitioner.go b/vendor/src/github.com/Shopify/sarama/partitioner.go
deleted file mode 100644
index d24199da9..000000000
--- a/vendor/src/github.com/Shopify/sarama/partitioner.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package sarama
-
-import (
- "hash"
- "hash/fnv"
- "math/rand"
- "time"
-)
-
-// Partitioner is anything that, given a Kafka message and a number of partitions indexed [0...numPartitions-1],
-// decides to which partition to send the message. RandomPartitioner, RoundRobinPartitioner and HashPartitioner are provided
-// as simple default implementations.
-type Partitioner interface {
- // Partition takes a message and partition count and chooses a partition
- Partition(message *ProducerMessage, numPartitions int32) (int32, error)
-
- // RequiresConsistency indicates to the user of the partitioner whether the
- // mapping of key->partition is consistent or not. Specifically, if a
- // partitioner requires consistency then it must be allowed to choose from all
- // partitions (even ones known to be unavailable), and its choice must be
- // respected by the caller. The obvious example is the HashPartitioner.
- RequiresConsistency() bool
-}
-
-// PartitionerConstructor is the type for a function capable of constructing new Partitioners.
-type PartitionerConstructor func(topic string) Partitioner
-
-type manualPartitioner struct{}
-
-// NewManualPartitioner returns a Partitioner which uses the partition manually set in the provided
-// ProducerMessage's Partition field as the partition to produce to.
-func NewManualPartitioner(topic string) Partitioner {
- return new(manualPartitioner)
-}
-
-func (p *manualPartitioner) Partition(message *ProducerMessage, numPartitions int32) (int32, error) {
- return message.Partition, nil
-}
-
-func (p *manualPartitioner) RequiresConsistency() bool {
- return true
-}
-
-type randomPartitioner struct {
- generator *rand.Rand
-}
-
-// NewRandomPartitioner returns a Partitioner which chooses a random partition each time.
-func NewRandomPartitioner(topic string) Partitioner {
- p := new(randomPartitioner)
- p.generator = rand.New(rand.NewSource(time.Now().UTC().UnixNano()))
- return p
-}
-
-func (p *randomPartitioner) Partition(message *ProducerMessage, numPartitions int32) (int32, error) {
- return int32(p.generator.Intn(int(numPartitions))), nil
-}
-
-func (p *randomPartitioner) RequiresConsistency() bool {
- return false
-}
-
-type roundRobinPartitioner struct {
- partition int32
-}
-
-// NewRoundRobinPartitioner returns a Partitioner which walks through the available partitions one at a time.
-func NewRoundRobinPartitioner(topic string) Partitioner {
- return &roundRobinPartitioner{}
-}
-
-func (p *roundRobinPartitioner) Partition(message *ProducerMessage, numPartitions int32) (int32, error) {
- if p.partition >= numPartitions {
- p.partition = 0
- }
- ret := p.partition
- p.partition++
- return ret, nil
-}
-
-func (p *roundRobinPartitioner) RequiresConsistency() bool {
- return false
-}
-
-type hashPartitioner struct {
- random Partitioner
- hasher hash.Hash32
-}
-
-// NewHashPartitioner returns a Partitioner which behaves as follows. If the message's key is nil then a
-// random partition is chosen. Otherwise the FNV-1a hash of the encoded bytes of the message key is used,
-// modulus the number of partitions. This ensures that messages with the same key always end up on the
-// same partition.
-func NewHashPartitioner(topic string) Partitioner {
- p := new(hashPartitioner)
- p.random = NewRandomPartitioner(topic)
- p.hasher = fnv.New32a()
- return p
-}
-
-func (p *hashPartitioner) Partition(message *ProducerMessage, numPartitions int32) (int32, error) {
- if message.Key == nil {
- return p.random.Partition(message, numPartitions)
- }
- bytes, err := message.Key.Encode()
- if err != nil {
- return -1, err
- }
- p.hasher.Reset()
- _, err = p.hasher.Write(bytes)
- if err != nil {
- return -1, err
- }
- partition := int32(p.hasher.Sum32()) % numPartitions
- if partition < 0 {
- partition = -partition
- }
- return partition, nil
-}
-
-func (p *hashPartitioner) RequiresConsistency() bool {
- return true
-}
diff --git a/vendor/src/github.com/Shopify/sarama/partitioner_test.go b/vendor/src/github.com/Shopify/sarama/partitioner_test.go
deleted file mode 100644
index 3d391c59c..000000000
--- a/vendor/src/github.com/Shopify/sarama/partitioner_test.go
+++ /dev/null
@@ -1,215 +0,0 @@
-package sarama
-
-import (
- "crypto/rand"
- "log"
- "testing"
-)
-
-func assertPartitioningConsistent(t *testing.T, partitioner Partitioner, message *ProducerMessage, numPartitions int32) {
- choice, err := partitioner.Partition(message, numPartitions)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice < 0 || choice >= numPartitions {
- t.Error(partitioner, "returned partition", choice, "outside of range for", message)
- }
- for i := 1; i < 50; i++ {
- newChoice, err := partitioner.Partition(message, numPartitions)
- if err != nil {
- t.Error(partitioner, err)
- }
- if newChoice != choice {
- t.Error(partitioner, "returned partition", newChoice, "inconsistent with", choice, ".")
- }
- }
-}
-
-func TestRandomPartitioner(t *testing.T) {
- partitioner := NewRandomPartitioner("mytopic")
-
- choice, err := partitioner.Partition(nil, 1)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice != 0 {
- t.Error("Returned non-zero partition when only one available.")
- }
-
- for i := 1; i < 50; i++ {
- choice, err := partitioner.Partition(nil, 50)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice < 0 || choice >= 50 {
- t.Error("Returned partition", choice, "outside of range.")
- }
- }
-}
-
-func TestRoundRobinPartitioner(t *testing.T) {
- partitioner := NewRoundRobinPartitioner("mytopic")
-
- choice, err := partitioner.Partition(nil, 1)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice != 0 {
- t.Error("Returned non-zero partition when only one available.")
- }
-
- var i int32
- for i = 1; i < 50; i++ {
- choice, err := partitioner.Partition(nil, 7)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice != i%7 {
- t.Error("Returned partition", choice, "expecting", i%7)
- }
- }
-}
-
-func TestHashPartitioner(t *testing.T) {
- partitioner := NewHashPartitioner("mytopic")
-
- choice, err := partitioner.Partition(&ProducerMessage{}, 1)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice != 0 {
- t.Error("Returned non-zero partition when only one available.")
- }
-
- for i := 1; i < 50; i++ {
- choice, err := partitioner.Partition(&ProducerMessage{}, 50)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice < 0 || choice >= 50 {
- t.Error("Returned partition", choice, "outside of range for nil key.")
- }
- }
-
- buf := make([]byte, 256)
- for i := 1; i < 50; i++ {
- if _, err := rand.Read(buf); err != nil {
- t.Error(err)
- }
- assertPartitioningConsistent(t, partitioner, &ProducerMessage{Key: ByteEncoder(buf)}, 50)
- }
-}
-
-func TestHashPartitionerMinInt32(t *testing.T) {
- partitioner := NewHashPartitioner("mytopic")
-
- msg := ProducerMessage{}
- // "1468509572224" generates 2147483648 (uint32) result from Sum32 function
- // which is -2147483648 or int32's min value
- msg.Key = StringEncoder("1468509572224")
-
- choice, err := partitioner.Partition(&msg, 50)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice < 0 || choice >= 50 {
- t.Error("Returned partition", choice, "outside of range for nil key.")
- }
-}
-
-func TestManualPartitioner(t *testing.T) {
- partitioner := NewManualPartitioner("mytopic")
-
- choice, err := partitioner.Partition(&ProducerMessage{}, 1)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice != 0 {
- t.Error("Returned non-zero partition when only one available.")
- }
-
- for i := int32(1); i < 50; i++ {
- choice, err := partitioner.Partition(&ProducerMessage{Partition: i}, 50)
- if err != nil {
- t.Error(partitioner, err)
- }
- if choice != i {
- t.Error("Returned partition not the same as the input partition")
- }
- }
-}
-
-// By default, Sarama uses the message's key to consistently assign a partition to
-// a message using hashing. If no key is set, a random partition will be chosen.
-// This example shows how you can partition messages randomly, even when a key is set,
-// by overriding Config.Producer.Partitioner.
-func ExamplePartitioner_random() {
- config := NewConfig()
- config.Producer.Partitioner = NewRandomPartitioner
-
- producer, err := NewSyncProducer([]string{"localhost:9092"}, config)
- if err != nil {
- log.Fatal(err)
- }
- defer func() {
- if err := producer.Close(); err != nil {
- log.Println("Failed to close producer:", err)
- }
- }()
-
- msg := &ProducerMessage{Topic: "test", Key: StringEncoder("key is set"), Value: StringEncoder("test")}
- partition, offset, err := producer.SendMessage(msg)
- if err != nil {
- log.Fatalln("Failed to produce message to kafka cluster.")
- }
-
- log.Printf("Produced message to partition %d with offset %d", partition, offset)
-}
-
-// This example shows how to assign partitions to your messages manually.
-func ExamplePartitioner_manual() {
- config := NewConfig()
-
- // First, we tell the producer that we are going to partition ourselves.
- config.Producer.Partitioner = NewManualPartitioner
-
- producer, err := NewSyncProducer([]string{"localhost:9092"}, config)
- if err != nil {
- log.Fatal(err)
- }
- defer func() {
- if err := producer.Close(); err != nil {
- log.Println("Failed to close producer:", err)
- }
- }()
-
- // Now, we set the Partition field of the ProducerMessage struct.
- msg := &ProducerMessage{Topic: "test", Partition: 6, Value: StringEncoder("test")}
-
- partition, offset, err := producer.SendMessage(msg)
- if err != nil {
- log.Fatalln("Failed to produce message to kafka cluster.")
- }
-
- if partition != 6 {
- log.Fatal("Message should have been produced to partition 6!")
- }
-
- log.Printf("Produced message to partition %d with offset %d", partition, offset)
-}
-
-// This example shows how to set a different partitioner depending on the topic.
-func ExamplePartitioner_per_topic() {
- config := NewConfig()
- config.Producer.Partitioner = func(topic string) Partitioner {
- switch topic {
- case "access_log", "error_log":
- return NewRandomPartitioner(topic)
-
- default:
- return NewHashPartitioner(topic)
- }
- }
-
- // ...
-}
diff --git a/vendor/src/github.com/Shopify/sarama/prep_encoder.go b/vendor/src/github.com/Shopify/sarama/prep_encoder.go
deleted file mode 100644
index fd5ea0f91..000000000
--- a/vendor/src/github.com/Shopify/sarama/prep_encoder.go
+++ /dev/null
@@ -1,121 +0,0 @@
-package sarama
-
-import (
- "fmt"
- "math"
-
- "github.com/rcrowley/go-metrics"
-)
-
-type prepEncoder struct {
- length int
-}
-
-// primitives
-
-func (pe *prepEncoder) putInt8(in int8) {
- pe.length++
-}
-
-func (pe *prepEncoder) putInt16(in int16) {
- pe.length += 2
-}
-
-func (pe *prepEncoder) putInt32(in int32) {
- pe.length += 4
-}
-
-func (pe *prepEncoder) putInt64(in int64) {
- pe.length += 8
-}
-
-func (pe *prepEncoder) putArrayLength(in int) error {
- if in > math.MaxInt32 {
- return PacketEncodingError{fmt.Sprintf("array too long (%d)", in)}
- }
- pe.length += 4
- return nil
-}
-
-// arrays
-
-func (pe *prepEncoder) putBytes(in []byte) error {
- pe.length += 4
- if in == nil {
- return nil
- }
- if len(in) > math.MaxInt32 {
- return PacketEncodingError{fmt.Sprintf("byteslice too long (%d)", len(in))}
- }
- pe.length += len(in)
- return nil
-}
-
-func (pe *prepEncoder) putRawBytes(in []byte) error {
- if len(in) > math.MaxInt32 {
- return PacketEncodingError{fmt.Sprintf("byteslice too long (%d)", len(in))}
- }
- pe.length += len(in)
- return nil
-}
-
-func (pe *prepEncoder) putString(in string) error {
- pe.length += 2
- if len(in) > math.MaxInt16 {
- return PacketEncodingError{fmt.Sprintf("string too long (%d)", len(in))}
- }
- pe.length += len(in)
- return nil
-}
-
-func (pe *prepEncoder) putStringArray(in []string) error {
- err := pe.putArrayLength(len(in))
- if err != nil {
- return err
- }
-
- for _, str := range in {
- if err := pe.putString(str); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (pe *prepEncoder) putInt32Array(in []int32) error {
- err := pe.putArrayLength(len(in))
- if err != nil {
- return err
- }
- pe.length += 4 * len(in)
- return nil
-}
-
-func (pe *prepEncoder) putInt64Array(in []int64) error {
- err := pe.putArrayLength(len(in))
- if err != nil {
- return err
- }
- pe.length += 8 * len(in)
- return nil
-}
-
-func (pe *prepEncoder) offset() int {
- return pe.length
-}
-
-// stackable
-
-func (pe *prepEncoder) push(in pushEncoder) {
- pe.length += in.reserveLength()
-}
-
-func (pe *prepEncoder) pop() error {
- return nil
-}
-
-// we do not record metrics during the prep encoder pass
-func (pe *prepEncoder) metricRegistry() metrics.Registry {
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/produce_request.go b/vendor/src/github.com/Shopify/sarama/produce_request.go
deleted file mode 100644
index 40dc80151..000000000
--- a/vendor/src/github.com/Shopify/sarama/produce_request.go
+++ /dev/null
@@ -1,209 +0,0 @@
-package sarama
-
-import "github.com/rcrowley/go-metrics"
-
-// RequiredAcks is used in Produce Requests to tell the broker how many replica acknowledgements
-// it must see before responding. Any of the constants defined here are valid. On broker versions
-// prior to 0.8.2.0 any other positive int16 is also valid (the broker will wait for that many
-// acknowledgements) but in 0.8.2.0 and later this will raise an exception (it has been replaced
-// by setting the `min.isr` value in the brokers configuration).
-type RequiredAcks int16
-
-const (
- // NoResponse doesn't send any response, the TCP ACK is all you get.
- NoResponse RequiredAcks = 0
- // WaitForLocal waits for only the local commit to succeed before responding.
- WaitForLocal RequiredAcks = 1
- // WaitForAll waits for all in-sync replicas to commit before responding.
- // The minimum number of in-sync replicas is configured on the broker via
- // the `min.insync.replicas` configuration key.
- WaitForAll RequiredAcks = -1
-)
-
-type ProduceRequest struct {
- RequiredAcks RequiredAcks
- Timeout int32
- Version int16 // v1 requires Kafka 0.9, v2 requires Kafka 0.10
- msgSets map[string]map[int32]*MessageSet
-}
-
-func (r *ProduceRequest) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.RequiredAcks))
- pe.putInt32(r.Timeout)
- err := pe.putArrayLength(len(r.msgSets))
- if err != nil {
- return err
- }
- metricRegistry := pe.metricRegistry()
- var batchSizeMetric metrics.Histogram
- var compressionRatioMetric metrics.Histogram
- if metricRegistry != nil {
- batchSizeMetric = getOrRegisterHistogram("batch-size", metricRegistry)
- compressionRatioMetric = getOrRegisterHistogram("compression-ratio", metricRegistry)
- }
-
- totalRecordCount := int64(0)
- for topic, partitions := range r.msgSets {
- err = pe.putString(topic)
- if err != nil {
- return err
- }
- err = pe.putArrayLength(len(partitions))
- if err != nil {
- return err
- }
- topicRecordCount := int64(0)
- var topicCompressionRatioMetric metrics.Histogram
- if metricRegistry != nil {
- topicCompressionRatioMetric = getOrRegisterTopicHistogram("compression-ratio", topic, metricRegistry)
- }
- for id, msgSet := range partitions {
- startOffset := pe.offset()
- pe.putInt32(id)
- pe.push(&lengthField{})
- err = msgSet.encode(pe)
- if err != nil {
- return err
- }
- err = pe.pop()
- if err != nil {
- return err
- }
- if metricRegistry != nil {
- for _, messageBlock := range msgSet.Messages {
- // Is this a fake "message" wrapping real messages?
- if messageBlock.Msg.Set != nil {
- topicRecordCount += int64(len(messageBlock.Msg.Set.Messages))
- } else {
- // A single uncompressed message
- topicRecordCount++
- }
- // Better be safe than sorry when computing the compression ratio
- if messageBlock.Msg.compressedSize != 0 {
- compressionRatio := float64(len(messageBlock.Msg.Value)) /
- float64(messageBlock.Msg.compressedSize)
- // Histogram do not support decimal values, let's multiple it by 100 for better precision
- intCompressionRatio := int64(100 * compressionRatio)
- compressionRatioMetric.Update(intCompressionRatio)
- topicCompressionRatioMetric.Update(intCompressionRatio)
- }
- }
- batchSize := int64(pe.offset() - startOffset)
- batchSizeMetric.Update(batchSize)
- getOrRegisterTopicHistogram("batch-size", topic, metricRegistry).Update(batchSize)
- }
- }
- if topicRecordCount > 0 {
- getOrRegisterTopicMeter("record-send-rate", topic, metricRegistry).Mark(topicRecordCount)
- getOrRegisterTopicHistogram("records-per-request", topic, metricRegistry).Update(topicRecordCount)
- totalRecordCount += topicRecordCount
- }
- }
- if totalRecordCount > 0 {
- metrics.GetOrRegisterMeter("record-send-rate", metricRegistry).Mark(totalRecordCount)
- getOrRegisterHistogram("records-per-request", metricRegistry).Update(totalRecordCount)
- }
-
- return nil
-}
-
-func (r *ProduceRequest) decode(pd packetDecoder, version int16) error {
- requiredAcks, err := pd.getInt16()
- if err != nil {
- return err
- }
- r.RequiredAcks = RequiredAcks(requiredAcks)
- if r.Timeout, err = pd.getInt32(); err != nil {
- return err
- }
- topicCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if topicCount == 0 {
- return nil
- }
- r.msgSets = make(map[string]map[int32]*MessageSet)
- for i := 0; i < topicCount; i++ {
- topic, err := pd.getString()
- if err != nil {
- return err
- }
- partitionCount, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- r.msgSets[topic] = make(map[int32]*MessageSet)
- for j := 0; j < partitionCount; j++ {
- partition, err := pd.getInt32()
- if err != nil {
- return err
- }
- messageSetSize, err := pd.getInt32()
- if err != nil {
- return err
- }
- msgSetDecoder, err := pd.getSubset(int(messageSetSize))
- if err != nil {
- return err
- }
- msgSet := &MessageSet{}
- err = msgSet.decode(msgSetDecoder)
- if err != nil {
- return err
- }
- r.msgSets[topic][partition] = msgSet
- }
- }
- return nil
-}
-
-func (r *ProduceRequest) key() int16 {
- return 0
-}
-
-func (r *ProduceRequest) version() int16 {
- return r.Version
-}
-
-func (r *ProduceRequest) requiredVersion() KafkaVersion {
- switch r.Version {
- case 1:
- return V0_9_0_0
- case 2:
- return V0_10_0_0
- default:
- return minVersion
- }
-}
-
-func (r *ProduceRequest) AddMessage(topic string, partition int32, msg *Message) {
- if r.msgSets == nil {
- r.msgSets = make(map[string]map[int32]*MessageSet)
- }
-
- if r.msgSets[topic] == nil {
- r.msgSets[topic] = make(map[int32]*MessageSet)
- }
-
- set := r.msgSets[topic][partition]
-
- if set == nil {
- set = new(MessageSet)
- r.msgSets[topic][partition] = set
- }
-
- set.addMessage(msg)
-}
-
-func (r *ProduceRequest) AddSet(topic string, partition int32, set *MessageSet) {
- if r.msgSets == nil {
- r.msgSets = make(map[string]map[int32]*MessageSet)
- }
-
- if r.msgSets[topic] == nil {
- r.msgSets[topic] = make(map[int32]*MessageSet)
- }
-
- r.msgSets[topic][partition] = set
-}
diff --git a/vendor/src/github.com/Shopify/sarama/produce_request_test.go b/vendor/src/github.com/Shopify/sarama/produce_request_test.go
deleted file mode 100644
index 21f4ba5b1..000000000
--- a/vendor/src/github.com/Shopify/sarama/produce_request_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package sarama
-
-import (
- "testing"
-)
-
-var (
- produceRequestEmpty = []byte{
- 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00}
-
- produceRequestHeader = []byte{
- 0x01, 0x23,
- 0x00, 0x00, 0x04, 0x44,
- 0x00, 0x00, 0x00, 0x00}
-
- produceRequestOneMessage = []byte{
- 0x01, 0x23,
- 0x00, 0x00, 0x04, 0x44,
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x05, 't', 'o', 'p', 'i', 'c',
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0xAD,
- 0x00, 0x00, 0x00, 0x1C,
- // messageSet
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x10,
- // message
- 0x23, 0x96, 0x4a, 0xf7, // CRC
- 0x00,
- 0x00,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0x00, 0x00, 0x00, 0x02, 0x00, 0xEE}
-)
-
-func TestProduceRequest(t *testing.T) {
- request := new(ProduceRequest)
- testRequest(t, "empty", request, produceRequestEmpty)
-
- request.RequiredAcks = 0x123
- request.Timeout = 0x444
- testRequest(t, "header", request, produceRequestHeader)
-
- request.AddMessage("topic", 0xAD, &Message{Codec: CompressionNone, Key: nil, Value: []byte{0x00, 0xEE}})
- testRequest(t, "one message", request, produceRequestOneMessage)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/produce_response.go b/vendor/src/github.com/Shopify/sarama/produce_response.go
deleted file mode 100644
index 195abcb81..000000000
--- a/vendor/src/github.com/Shopify/sarama/produce_response.go
+++ /dev/null
@@ -1,158 +0,0 @@
-package sarama
-
-import "time"
-
-type ProduceResponseBlock struct {
- Err KError
- Offset int64
- // only provided if Version >= 2 and the broker is configured with `LogAppendTime`
- Timestamp time.Time
-}
-
-func (b *ProduceResponseBlock) decode(pd packetDecoder, version int16) (err error) {
- tmp, err := pd.getInt16()
- if err != nil {
- return err
- }
- b.Err = KError(tmp)
-
- b.Offset, err = pd.getInt64()
- if err != nil {
- return err
- }
-
- if version >= 2 {
- if millis, err := pd.getInt64(); err != nil {
- return err
- } else if millis != -1 {
- b.Timestamp = time.Unix(millis/1000, (millis%1000)*int64(time.Millisecond))
- }
- }
-
- return nil
-}
-
-type ProduceResponse struct {
- Blocks map[string]map[int32]*ProduceResponseBlock
- Version int16
- ThrottleTime time.Duration // only provided if Version >= 1
-}
-
-func (r *ProduceResponse) decode(pd packetDecoder, version int16) (err error) {
- r.Version = version
-
- numTopics, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Blocks = make(map[string]map[int32]*ProduceResponseBlock, numTopics)
- for i := 0; i < numTopics; i++ {
- name, err := pd.getString()
- if err != nil {
- return err
- }
-
- numBlocks, err := pd.getArrayLength()
- if err != nil {
- return err
- }
-
- r.Blocks[name] = make(map[int32]*ProduceResponseBlock, numBlocks)
-
- for j := 0; j < numBlocks; j++ {
- id, err := pd.getInt32()
- if err != nil {
- return err
- }
-
- block := new(ProduceResponseBlock)
- err = block.decode(pd, version)
- if err != nil {
- return err
- }
- r.Blocks[name][id] = block
- }
- }
-
- if r.Version >= 1 {
- if millis, err := pd.getInt32(); err != nil {
- return err
- } else {
- r.ThrottleTime = time.Duration(millis) * time.Millisecond
- }
- }
-
- return nil
-}
-
-func (r *ProduceResponse) encode(pe packetEncoder) error {
- err := pe.putArrayLength(len(r.Blocks))
- if err != nil {
- return err
- }
- for topic, partitions := range r.Blocks {
- err = pe.putString(topic)
- if err != nil {
- return err
- }
- err = pe.putArrayLength(len(partitions))
- if err != nil {
- return err
- }
- for id, prb := range partitions {
- pe.putInt32(id)
- pe.putInt16(int16(prb.Err))
- pe.putInt64(prb.Offset)
- }
- }
- if r.Version >= 1 {
- pe.putInt32(int32(r.ThrottleTime / time.Millisecond))
- }
- return nil
-}
-
-func (r *ProduceResponse) key() int16 {
- return 0
-}
-
-func (r *ProduceResponse) version() int16 {
- return r.Version
-}
-
-func (r *ProduceResponse) requiredVersion() KafkaVersion {
- switch r.Version {
- case 1:
- return V0_9_0_0
- case 2:
- return V0_10_0_0
- default:
- return minVersion
- }
-}
-
-func (r *ProduceResponse) GetBlock(topic string, partition int32) *ProduceResponseBlock {
- if r.Blocks == nil {
- return nil
- }
-
- if r.Blocks[topic] == nil {
- return nil
- }
-
- return r.Blocks[topic][partition]
-}
-
-// Testing API
-
-func (r *ProduceResponse) AddTopicPartition(topic string, partition int32, err KError) {
- if r.Blocks == nil {
- r.Blocks = make(map[string]map[int32]*ProduceResponseBlock)
- }
- byTopic, ok := r.Blocks[topic]
- if !ok {
- byTopic = make(map[int32]*ProduceResponseBlock)
- r.Blocks[topic] = byTopic
- }
- byTopic[partition] = &ProduceResponseBlock{Err: err}
-}
diff --git a/vendor/src/github.com/Shopify/sarama/produce_response_test.go b/vendor/src/github.com/Shopify/sarama/produce_response_test.go
deleted file mode 100644
index f71709fe8..000000000
--- a/vendor/src/github.com/Shopify/sarama/produce_response_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- produceResponseNoBlocks = []byte{
- 0x00, 0x00, 0x00, 0x00}
-
- produceResponseManyBlocks = []byte{
- 0x00, 0x00, 0x00, 0x02,
-
- 0x00, 0x03, 'f', 'o', 'o',
- 0x00, 0x00, 0x00, 0x00,
-
- 0x00, 0x03, 'b', 'a', 'r',
- 0x00, 0x00, 0x00, 0x02,
-
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
-
- 0x00, 0x00, 0x00, 0x02,
- 0x00, 0x02,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
-)
-
-func TestProduceResponse(t *testing.T) {
- response := ProduceResponse{}
-
- testVersionDecodable(t, "no blocks", &response, produceResponseNoBlocks, 0)
- if len(response.Blocks) != 0 {
- t.Error("Decoding produced", len(response.Blocks), "topics where there were none")
- }
-
- testVersionDecodable(t, "many blocks", &response, produceResponseManyBlocks, 0)
- if len(response.Blocks) != 2 {
- t.Error("Decoding produced", len(response.Blocks), "topics where there were 2")
- }
- if len(response.Blocks["foo"]) != 0 {
- t.Error("Decoding produced", len(response.Blocks["foo"]), "partitions for 'foo' where there were none")
- }
- if len(response.Blocks["bar"]) != 2 {
- t.Error("Decoding produced", len(response.Blocks["bar"]), "partitions for 'bar' where there were two")
- }
- block := response.GetBlock("bar", 1)
- if block == nil {
- t.Error("Decoding did not produce a block for bar/1")
- } else {
- if block.Err != ErrNoError {
- t.Error("Decoding failed for bar/1/Err, got:", int16(block.Err))
- }
- if block.Offset != 0xFF {
- t.Error("Decoding failed for bar/1/Offset, got:", block.Offset)
- }
- }
- block = response.GetBlock("bar", 2)
- if block == nil {
- t.Error("Decoding did not produce a block for bar/2")
- } else {
- if block.Err != ErrInvalidMessage {
- t.Error("Decoding failed for bar/2/Err, got:", int16(block.Err))
- }
- if block.Offset != 0 {
- t.Error("Decoding failed for bar/2/Offset, got:", block.Offset)
- }
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/produce_set.go b/vendor/src/github.com/Shopify/sarama/produce_set.go
deleted file mode 100644
index 158d9c475..000000000
--- a/vendor/src/github.com/Shopify/sarama/produce_set.go
+++ /dev/null
@@ -1,176 +0,0 @@
-package sarama
-
-import "time"
-
-type partitionSet struct {
- msgs []*ProducerMessage
- setToSend *MessageSet
- bufferBytes int
-}
-
-type produceSet struct {
- parent *asyncProducer
- msgs map[string]map[int32]*partitionSet
-
- bufferBytes int
- bufferCount int
-}
-
-func newProduceSet(parent *asyncProducer) *produceSet {
- return &produceSet{
- msgs: make(map[string]map[int32]*partitionSet),
- parent: parent,
- }
-}
-
-func (ps *produceSet) add(msg *ProducerMessage) error {
- var err error
- var key, val []byte
-
- if msg.Key != nil {
- if key, err = msg.Key.Encode(); err != nil {
- return err
- }
- }
-
- if msg.Value != nil {
- if val, err = msg.Value.Encode(); err != nil {
- return err
- }
- }
-
- partitions := ps.msgs[msg.Topic]
- if partitions == nil {
- partitions = make(map[int32]*partitionSet)
- ps.msgs[msg.Topic] = partitions
- }
-
- set := partitions[msg.Partition]
- if set == nil {
- set = &partitionSet{setToSend: new(MessageSet)}
- partitions[msg.Partition] = set
- }
-
- set.msgs = append(set.msgs, msg)
- msgToSend := &Message{Codec: CompressionNone, Key: key, Value: val}
- if ps.parent.conf.Version.IsAtLeast(V0_10_0_0) {
- if msg.Timestamp.IsZero() {
- msgToSend.Timestamp = time.Now()
- } else {
- msgToSend.Timestamp = msg.Timestamp
- }
- msgToSend.Version = 1
- }
- set.setToSend.addMessage(msgToSend)
-
- size := producerMessageOverhead + len(key) + len(val)
- set.bufferBytes += size
- ps.bufferBytes += size
- ps.bufferCount++
-
- return nil
-}
-
-func (ps *produceSet) buildRequest() *ProduceRequest {
- req := &ProduceRequest{
- RequiredAcks: ps.parent.conf.Producer.RequiredAcks,
- Timeout: int32(ps.parent.conf.Producer.Timeout / time.Millisecond),
- }
- if ps.parent.conf.Version.IsAtLeast(V0_10_0_0) {
- req.Version = 2
- }
-
- for topic, partitionSet := range ps.msgs {
- for partition, set := range partitionSet {
- if ps.parent.conf.Producer.Compression == CompressionNone {
- req.AddSet(topic, partition, set.setToSend)
- } else {
- // When compression is enabled, the entire set for each partition is compressed
- // and sent as the payload of a single fake "message" with the appropriate codec
- // set and no key. When the server sees a message with a compression codec, it
- // decompresses the payload and treats the result as its message set.
- payload, err := encode(set.setToSend, ps.parent.conf.MetricRegistry)
- if err != nil {
- Logger.Println(err) // if this happens, it's basically our fault.
- panic(err)
- }
- compMsg := &Message{
- Codec: ps.parent.conf.Producer.Compression,
- Key: nil,
- Value: payload,
- Set: set.setToSend, // Provide the underlying message set for accurate metrics
- }
- if ps.parent.conf.Version.IsAtLeast(V0_10_0_0) {
- compMsg.Version = 1
- compMsg.Timestamp = set.setToSend.Messages[0].Msg.Timestamp
- }
- req.AddMessage(topic, partition, compMsg)
- }
- }
- }
-
- return req
-}
-
-func (ps *produceSet) eachPartition(cb func(topic string, partition int32, msgs []*ProducerMessage)) {
- for topic, partitionSet := range ps.msgs {
- for partition, set := range partitionSet {
- cb(topic, partition, set.msgs)
- }
- }
-}
-
-func (ps *produceSet) dropPartition(topic string, partition int32) []*ProducerMessage {
- if ps.msgs[topic] == nil {
- return nil
- }
- set := ps.msgs[topic][partition]
- if set == nil {
- return nil
- }
- ps.bufferBytes -= set.bufferBytes
- ps.bufferCount -= len(set.msgs)
- delete(ps.msgs[topic], partition)
- return set.msgs
-}
-
-func (ps *produceSet) wouldOverflow(msg *ProducerMessage) bool {
- switch {
- // Would we overflow our maximum possible size-on-the-wire? 10KiB is arbitrary overhead for safety.
- case ps.bufferBytes+msg.byteSize() >= int(MaxRequestSize-(10*1024)):
- return true
- // Would we overflow the size-limit of a compressed message-batch for this partition?
- case ps.parent.conf.Producer.Compression != CompressionNone &&
- ps.msgs[msg.Topic] != nil && ps.msgs[msg.Topic][msg.Partition] != nil &&
- ps.msgs[msg.Topic][msg.Partition].bufferBytes+msg.byteSize() >= ps.parent.conf.Producer.MaxMessageBytes:
- return true
- // Would we overflow simply in number of messages?
- case ps.parent.conf.Producer.Flush.MaxMessages > 0 && ps.bufferCount >= ps.parent.conf.Producer.Flush.MaxMessages:
- return true
- default:
- return false
- }
-}
-
-func (ps *produceSet) readyToFlush() bool {
- switch {
- // If we don't have any messages, nothing else matters
- case ps.empty():
- return false
- // If all three config values are 0, we always flush as-fast-as-possible
- case ps.parent.conf.Producer.Flush.Frequency == 0 && ps.parent.conf.Producer.Flush.Bytes == 0 && ps.parent.conf.Producer.Flush.Messages == 0:
- return true
- // If we've passed the message trigger-point
- case ps.parent.conf.Producer.Flush.Messages > 0 && ps.bufferCount >= ps.parent.conf.Producer.Flush.Messages:
- return true
- // If we've passed the byte trigger-point
- case ps.parent.conf.Producer.Flush.Bytes > 0 && ps.bufferBytes >= ps.parent.conf.Producer.Flush.Bytes:
- return true
- default:
- return false
- }
-}
-
-func (ps *produceSet) empty() bool {
- return ps.bufferCount == 0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/produce_set_test.go b/vendor/src/github.com/Shopify/sarama/produce_set_test.go
deleted file mode 100644
index d016a10b7..000000000
--- a/vendor/src/github.com/Shopify/sarama/produce_set_test.go
+++ /dev/null
@@ -1,185 +0,0 @@
-package sarama
-
-import (
- "testing"
- "time"
-)
-
-func makeProduceSet() (*asyncProducer, *produceSet) {
- parent := &asyncProducer{
- conf: NewConfig(),
- }
- return parent, newProduceSet(parent)
-}
-
-func safeAddMessage(t *testing.T, ps *produceSet, msg *ProducerMessage) {
- if err := ps.add(msg); err != nil {
- t.Error(err)
- }
-}
-
-func TestProduceSetInitial(t *testing.T) {
- _, ps := makeProduceSet()
-
- if !ps.empty() {
- t.Error("New produceSet should be empty")
- }
-
- if ps.readyToFlush() {
- t.Error("Empty produceSet must never be ready to flush")
- }
-}
-
-func TestProduceSetAddingMessages(t *testing.T) {
- parent, ps := makeProduceSet()
- parent.conf.Producer.Flush.MaxMessages = 1000
-
- msg := &ProducerMessage{Key: StringEncoder(TestMessage), Value: StringEncoder(TestMessage)}
- safeAddMessage(t, ps, msg)
-
- if ps.empty() {
- t.Error("set shouldn't be empty when a message is added")
- }
-
- if !ps.readyToFlush() {
- t.Error("by default set should be ready to flush when any message is in place")
- }
-
- for i := 0; i < 999; i++ {
- if ps.wouldOverflow(msg) {
- t.Error("set shouldn't fill up after only", i+1, "messages")
- }
- safeAddMessage(t, ps, msg)
- }
-
- if !ps.wouldOverflow(msg) {
- t.Error("set should be full after 1000 messages")
- }
-}
-
-func TestProduceSetPartitionTracking(t *testing.T) {
- _, ps := makeProduceSet()
-
- m1 := &ProducerMessage{Topic: "t1", Partition: 0}
- m2 := &ProducerMessage{Topic: "t1", Partition: 1}
- m3 := &ProducerMessage{Topic: "t2", Partition: 0}
- safeAddMessage(t, ps, m1)
- safeAddMessage(t, ps, m2)
- safeAddMessage(t, ps, m3)
-
- seenT1P0 := false
- seenT1P1 := false
- seenT2P0 := false
-
- ps.eachPartition(func(topic string, partition int32, msgs []*ProducerMessage) {
- if len(msgs) != 1 {
- t.Error("Wrong message count")
- }
-
- if topic == "t1" && partition == 0 {
- seenT1P0 = true
- } else if topic == "t1" && partition == 1 {
- seenT1P1 = true
- } else if topic == "t2" && partition == 0 {
- seenT2P0 = true
- }
- })
-
- if !seenT1P0 {
- t.Error("Didn't see t1p0")
- }
- if !seenT1P1 {
- t.Error("Didn't see t1p1")
- }
- if !seenT2P0 {
- t.Error("Didn't see t2p0")
- }
-
- if len(ps.dropPartition("t1", 1)) != 1 {
- t.Error("Got wrong messages back from dropping partition")
- }
-
- if ps.bufferCount != 2 {
- t.Error("Incorrect buffer count after dropping partition")
- }
-}
-
-func TestProduceSetRequestBuilding(t *testing.T) {
- parent, ps := makeProduceSet()
- parent.conf.Producer.RequiredAcks = WaitForAll
- parent.conf.Producer.Timeout = 10 * time.Second
-
- msg := &ProducerMessage{
- Topic: "t1",
- Partition: 0,
- Key: StringEncoder(TestMessage),
- Value: StringEncoder(TestMessage),
- }
- for i := 0; i < 10; i++ {
- safeAddMessage(t, ps, msg)
- }
- msg.Partition = 1
- for i := 0; i < 10; i++ {
- safeAddMessage(t, ps, msg)
- }
- msg.Topic = "t2"
- for i := 0; i < 10; i++ {
- safeAddMessage(t, ps, msg)
- }
-
- req := ps.buildRequest()
-
- if req.RequiredAcks != WaitForAll {
- t.Error("RequiredAcks not set properly")
- }
-
- if req.Timeout != 10000 {
- t.Error("Timeout not set properly")
- }
-
- if len(req.msgSets) != 2 {
- t.Error("Wrong number of topics in request")
- }
-}
-
-func TestProduceSetCompressedRequestBuilding(t *testing.T) {
- parent, ps := makeProduceSet()
- parent.conf.Producer.RequiredAcks = WaitForAll
- parent.conf.Producer.Timeout = 10 * time.Second
- parent.conf.Producer.Compression = CompressionGZIP
- parent.conf.Version = V0_10_0_0
-
- msg := &ProducerMessage{
- Topic: "t1",
- Partition: 0,
- Key: StringEncoder(TestMessage),
- Value: StringEncoder(TestMessage),
- Timestamp: time.Now(),
- }
- for i := 0; i < 10; i++ {
- safeAddMessage(t, ps, msg)
- }
-
- req := ps.buildRequest()
-
- if req.Version != 2 {
- t.Error("Wrong request version")
- }
-
- for _, msgBlock := range req.msgSets["t1"][0].Messages {
- msg := msgBlock.Msg
- err := msg.decodeSet()
- if err != nil {
- t.Error("Failed to decode set from payload")
- }
- for _, compMsgBlock := range msg.Set.Messages {
- compMsg := compMsgBlock.Msg
- if compMsg.Version != 1 {
- t.Error("Wrong compressed message version")
- }
- }
- if msg.Version != 1 {
- t.Error("Wrong compressed parent message version")
- }
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/real_decoder.go b/vendor/src/github.com/Shopify/sarama/real_decoder.go
deleted file mode 100644
index a0141af07..000000000
--- a/vendor/src/github.com/Shopify/sarama/real_decoder.go
+++ /dev/null
@@ -1,259 +0,0 @@
-package sarama
-
-import (
- "encoding/binary"
- "math"
-)
-
-var errInvalidArrayLength = PacketDecodingError{"invalid array length"}
-var errInvalidByteSliceLength = PacketDecodingError{"invalid byteslice length"}
-var errInvalidStringLength = PacketDecodingError{"invalid string length"}
-var errInvalidSubsetSize = PacketDecodingError{"invalid subset size"}
-
-type realDecoder struct {
- raw []byte
- off int
- stack []pushDecoder
-}
-
-// primitives
-
-func (rd *realDecoder) getInt8() (int8, error) {
- if rd.remaining() < 1 {
- rd.off = len(rd.raw)
- return -1, ErrInsufficientData
- }
- tmp := int8(rd.raw[rd.off])
- rd.off++
- return tmp, nil
-}
-
-func (rd *realDecoder) getInt16() (int16, error) {
- if rd.remaining() < 2 {
- rd.off = len(rd.raw)
- return -1, ErrInsufficientData
- }
- tmp := int16(binary.BigEndian.Uint16(rd.raw[rd.off:]))
- rd.off += 2
- return tmp, nil
-}
-
-func (rd *realDecoder) getInt32() (int32, error) {
- if rd.remaining() < 4 {
- rd.off = len(rd.raw)
- return -1, ErrInsufficientData
- }
- tmp := int32(binary.BigEndian.Uint32(rd.raw[rd.off:]))
- rd.off += 4
- return tmp, nil
-}
-
-func (rd *realDecoder) getInt64() (int64, error) {
- if rd.remaining() < 8 {
- rd.off = len(rd.raw)
- return -1, ErrInsufficientData
- }
- tmp := int64(binary.BigEndian.Uint64(rd.raw[rd.off:]))
- rd.off += 8
- return tmp, nil
-}
-
-func (rd *realDecoder) getArrayLength() (int, error) {
- if rd.remaining() < 4 {
- rd.off = len(rd.raw)
- return -1, ErrInsufficientData
- }
- tmp := int(binary.BigEndian.Uint32(rd.raw[rd.off:]))
- rd.off += 4
- if tmp > rd.remaining() {
- rd.off = len(rd.raw)
- return -1, ErrInsufficientData
- } else if tmp > 2*math.MaxUint16 {
- return -1, errInvalidArrayLength
- }
- return tmp, nil
-}
-
-// collections
-
-func (rd *realDecoder) getBytes() ([]byte, error) {
- tmp, err := rd.getInt32()
-
- if err != nil {
- return nil, err
- }
-
- n := int(tmp)
-
- switch {
- case n < -1:
- return nil, errInvalidByteSliceLength
- case n == -1:
- return nil, nil
- case n == 0:
- return make([]byte, 0), nil
- case n > rd.remaining():
- rd.off = len(rd.raw)
- return nil, ErrInsufficientData
- }
-
- tmpStr := rd.raw[rd.off : rd.off+n]
- rd.off += n
- return tmpStr, nil
-}
-
-func (rd *realDecoder) getString() (string, error) {
- tmp, err := rd.getInt16()
-
- if err != nil {
- return "", err
- }
-
- n := int(tmp)
-
- switch {
- case n < -1:
- return "", errInvalidStringLength
- case n == -1:
- return "", nil
- case n == 0:
- return "", nil
- case n > rd.remaining():
- rd.off = len(rd.raw)
- return "", ErrInsufficientData
- }
-
- tmpStr := string(rd.raw[rd.off : rd.off+n])
- rd.off += n
- return tmpStr, nil
-}
-
-func (rd *realDecoder) getInt32Array() ([]int32, error) {
- if rd.remaining() < 4 {
- rd.off = len(rd.raw)
- return nil, ErrInsufficientData
- }
- n := int(binary.BigEndian.Uint32(rd.raw[rd.off:]))
- rd.off += 4
-
- if rd.remaining() < 4*n {
- rd.off = len(rd.raw)
- return nil, ErrInsufficientData
- }
-
- if n == 0 {
- return nil, nil
- }
-
- if n < 0 {
- return nil, errInvalidArrayLength
- }
-
- ret := make([]int32, n)
- for i := range ret {
- ret[i] = int32(binary.BigEndian.Uint32(rd.raw[rd.off:]))
- rd.off += 4
- }
- return ret, nil
-}
-
-func (rd *realDecoder) getInt64Array() ([]int64, error) {
- if rd.remaining() < 4 {
- rd.off = len(rd.raw)
- return nil, ErrInsufficientData
- }
- n := int(binary.BigEndian.Uint32(rd.raw[rd.off:]))
- rd.off += 4
-
- if rd.remaining() < 8*n {
- rd.off = len(rd.raw)
- return nil, ErrInsufficientData
- }
-
- if n == 0 {
- return nil, nil
- }
-
- if n < 0 {
- return nil, errInvalidArrayLength
- }
-
- ret := make([]int64, n)
- for i := range ret {
- ret[i] = int64(binary.BigEndian.Uint64(rd.raw[rd.off:]))
- rd.off += 8
- }
- return ret, nil
-}
-
-func (rd *realDecoder) getStringArray() ([]string, error) {
- if rd.remaining() < 4 {
- rd.off = len(rd.raw)
- return nil, ErrInsufficientData
- }
- n := int(binary.BigEndian.Uint32(rd.raw[rd.off:]))
- rd.off += 4
-
- if n == 0 {
- return nil, nil
- }
-
- if n < 0 {
- return nil, errInvalidArrayLength
- }
-
- ret := make([]string, n)
- for i := range ret {
- if str, err := rd.getString(); err != nil {
- return nil, err
- } else {
- ret[i] = str
- }
- }
- return ret, nil
-}
-
-// subsets
-
-func (rd *realDecoder) remaining() int {
- return len(rd.raw) - rd.off
-}
-
-func (rd *realDecoder) getSubset(length int) (packetDecoder, error) {
- if length < 0 {
- return nil, errInvalidSubsetSize
- } else if length > rd.remaining() {
- rd.off = len(rd.raw)
- return nil, ErrInsufficientData
- }
-
- start := rd.off
- rd.off += length
- return &realDecoder{raw: rd.raw[start:rd.off]}, nil
-}
-
-// stacks
-
-func (rd *realDecoder) push(in pushDecoder) error {
- in.saveOffset(rd.off)
-
- reserve := in.reserveLength()
- if rd.remaining() < reserve {
- rd.off = len(rd.raw)
- return ErrInsufficientData
- }
-
- rd.stack = append(rd.stack, in)
-
- rd.off += reserve
-
- return nil
-}
-
-func (rd *realDecoder) pop() error {
- // this is go's ugly pop pattern (the inverse of append)
- in := rd.stack[len(rd.stack)-1]
- rd.stack = rd.stack[:len(rd.stack)-1]
-
- return in.check(rd.off, rd.raw)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/real_encoder.go b/vendor/src/github.com/Shopify/sarama/real_encoder.go
deleted file mode 100644
index ced4267c3..000000000
--- a/vendor/src/github.com/Shopify/sarama/real_encoder.go
+++ /dev/null
@@ -1,129 +0,0 @@
-package sarama
-
-import (
- "encoding/binary"
-
- "github.com/rcrowley/go-metrics"
-)
-
-type realEncoder struct {
- raw []byte
- off int
- stack []pushEncoder
- registry metrics.Registry
-}
-
-// primitives
-
-func (re *realEncoder) putInt8(in int8) {
- re.raw[re.off] = byte(in)
- re.off++
-}
-
-func (re *realEncoder) putInt16(in int16) {
- binary.BigEndian.PutUint16(re.raw[re.off:], uint16(in))
- re.off += 2
-}
-
-func (re *realEncoder) putInt32(in int32) {
- binary.BigEndian.PutUint32(re.raw[re.off:], uint32(in))
- re.off += 4
-}
-
-func (re *realEncoder) putInt64(in int64) {
- binary.BigEndian.PutUint64(re.raw[re.off:], uint64(in))
- re.off += 8
-}
-
-func (re *realEncoder) putArrayLength(in int) error {
- re.putInt32(int32(in))
- return nil
-}
-
-// collection
-
-func (re *realEncoder) putRawBytes(in []byte) error {
- copy(re.raw[re.off:], in)
- re.off += len(in)
- return nil
-}
-
-func (re *realEncoder) putBytes(in []byte) error {
- if in == nil {
- re.putInt32(-1)
- return nil
- }
- re.putInt32(int32(len(in)))
- copy(re.raw[re.off:], in)
- re.off += len(in)
- return nil
-}
-
-func (re *realEncoder) putString(in string) error {
- re.putInt16(int16(len(in)))
- copy(re.raw[re.off:], in)
- re.off += len(in)
- return nil
-}
-
-func (re *realEncoder) putStringArray(in []string) error {
- err := re.putArrayLength(len(in))
- if err != nil {
- return err
- }
-
- for _, val := range in {
- if err := re.putString(val); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (re *realEncoder) putInt32Array(in []int32) error {
- err := re.putArrayLength(len(in))
- if err != nil {
- return err
- }
- for _, val := range in {
- re.putInt32(val)
- }
- return nil
-}
-
-func (re *realEncoder) putInt64Array(in []int64) error {
- err := re.putArrayLength(len(in))
- if err != nil {
- return err
- }
- for _, val := range in {
- re.putInt64(val)
- }
- return nil
-}
-
-func (re *realEncoder) offset() int {
- return re.off
-}
-
-// stacks
-
-func (re *realEncoder) push(in pushEncoder) {
- in.saveOffset(re.off)
- re.off += in.reserveLength()
- re.stack = append(re.stack, in)
-}
-
-func (re *realEncoder) pop() error {
- // this is go's ugly pop pattern (the inverse of append)
- in := re.stack[len(re.stack)-1]
- re.stack = re.stack[:len(re.stack)-1]
-
- return in.run(re.off, re.raw)
-}
-
-// we do record metrics during the real encoder pass
-func (re *realEncoder) metricRegistry() metrics.Registry {
- return re.registry
-}
diff --git a/vendor/src/github.com/Shopify/sarama/request.go b/vendor/src/github.com/Shopify/sarama/request.go
deleted file mode 100644
index 73310ca87..000000000
--- a/vendor/src/github.com/Shopify/sarama/request.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package sarama
-
-import (
- "encoding/binary"
- "fmt"
- "io"
-)
-
-type protocolBody interface {
- encoder
- versionedDecoder
- key() int16
- version() int16
- requiredVersion() KafkaVersion
-}
-
-type request struct {
- correlationID int32
- clientID string
- body protocolBody
-}
-
-func (r *request) encode(pe packetEncoder) (err error) {
- pe.push(&lengthField{})
- pe.putInt16(r.body.key())
- pe.putInt16(r.body.version())
- pe.putInt32(r.correlationID)
- err = pe.putString(r.clientID)
- if err != nil {
- return err
- }
- err = r.body.encode(pe)
- if err != nil {
- return err
- }
- return pe.pop()
-}
-
-func (r *request) decode(pd packetDecoder) (err error) {
- var key int16
- if key, err = pd.getInt16(); err != nil {
- return err
- }
- var version int16
- if version, err = pd.getInt16(); err != nil {
- return err
- }
- if r.correlationID, err = pd.getInt32(); err != nil {
- return err
- }
- r.clientID, err = pd.getString()
-
- r.body = allocateBody(key, version)
- if r.body == nil {
- return PacketDecodingError{fmt.Sprintf("unknown request key (%d)", key)}
- }
- return r.body.decode(pd, version)
-}
-
-func decodeRequest(r io.Reader) (req *request, bytesRead int, err error) {
- lengthBytes := make([]byte, 4)
- if _, err := io.ReadFull(r, lengthBytes); err != nil {
- return nil, bytesRead, err
- }
- bytesRead += len(lengthBytes)
-
- length := int32(binary.BigEndian.Uint32(lengthBytes))
- if length <= 4 || length > MaxRequestSize {
- return nil, bytesRead, PacketDecodingError{fmt.Sprintf("message of length %d too large or too small", length)}
- }
-
- encodedReq := make([]byte, length)
- if _, err := io.ReadFull(r, encodedReq); err != nil {
- return nil, bytesRead, err
- }
- bytesRead += len(encodedReq)
-
- req = &request{}
- if err := decode(encodedReq, req); err != nil {
- return nil, bytesRead, err
- }
- return req, bytesRead, nil
-}
-
-func allocateBody(key, version int16) protocolBody {
- switch key {
- case 0:
- return &ProduceRequest{}
- case 1:
- return &FetchRequest{}
- case 2:
- return &OffsetRequest{Version: version}
- case 3:
- return &MetadataRequest{}
- case 8:
- return &OffsetCommitRequest{Version: version}
- case 9:
- return &OffsetFetchRequest{}
- case 10:
- return &ConsumerMetadataRequest{}
- case 11:
- return &JoinGroupRequest{}
- case 12:
- return &HeartbeatRequest{}
- case 13:
- return &LeaveGroupRequest{}
- case 14:
- return &SyncGroupRequest{}
- case 15:
- return &DescribeGroupsRequest{}
- case 16:
- return &ListGroupsRequest{}
- case 17:
- return &SaslHandshakeRequest{}
- case 18:
- return &ApiVersionsRequest{}
- }
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/request_test.go b/vendor/src/github.com/Shopify/sarama/request_test.go
deleted file mode 100644
index e54575434..000000000
--- a/vendor/src/github.com/Shopify/sarama/request_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package sarama
-
-import (
- "bytes"
- "reflect"
- "testing"
-
- "github.com/davecgh/go-spew/spew"
-)
-
-type testRequestBody struct {
-}
-
-func (s *testRequestBody) key() int16 {
- return 0x666
-}
-
-func (s *testRequestBody) version() int16 {
- return 0xD2
-}
-
-func (s *testRequestBody) encode(pe packetEncoder) error {
- return pe.putString("abc")
-}
-
-// not specific to request tests, just helper functions for testing structures that
-// implement the encoder or decoder interfaces that needed somewhere to live
-
-func testEncodable(t *testing.T, name string, in encoder, expect []byte) {
- packet, err := encode(in, nil)
- if err != nil {
- t.Error(err)
- } else if !bytes.Equal(packet, expect) {
- t.Error("Encoding", name, "failed\ngot ", packet, "\nwant", expect)
- }
-}
-
-func testDecodable(t *testing.T, name string, out decoder, in []byte) {
- err := decode(in, out)
- if err != nil {
- t.Error("Decoding", name, "failed:", err)
- }
-}
-
-func testVersionDecodable(t *testing.T, name string, out versionedDecoder, in []byte, version int16) {
- err := versionedDecode(in, out, version)
- if err != nil {
- t.Error("Decoding", name, "version", version, "failed:", err)
- }
-}
-
-func testRequest(t *testing.T, name string, rb protocolBody, expected []byte) {
- // Encoder request
- req := &request{correlationID: 123, clientID: "foo", body: rb}
- packet, err := encode(req, nil)
- headerSize := 14 + len("foo")
- if err != nil {
- t.Error(err)
- } else if !bytes.Equal(packet[headerSize:], expected) {
- t.Error("Encoding", name, "failed\ngot ", packet[headerSize:], "\nwant", expected)
- }
- // Decoder request
- decoded, n, err := decodeRequest(bytes.NewReader(packet))
- if err != nil {
- t.Error("Failed to decode request", err)
- } else if decoded.correlationID != 123 || decoded.clientID != "foo" {
- t.Errorf("Decoded header %q is not valid: %+v", name, decoded)
- } else if !reflect.DeepEqual(rb, decoded.body) {
- t.Error(spew.Sprintf("Decoded request %q does not match the encoded one\nencoded: %+v\ndecoded: %+v", name, rb, decoded.body))
- } else if n != len(packet) {
- t.Errorf("Decoded request %q bytes: %d does not match the encoded one: %d\n", name, n, len(packet))
- }
-}
-
-func testResponse(t *testing.T, name string, res protocolBody, expected []byte) {
- encoded, err := encode(res, nil)
- if err != nil {
- t.Error(err)
- } else if expected != nil && !bytes.Equal(encoded, expected) {
- t.Error("Encoding", name, "failed\ngot ", encoded, "\nwant", expected)
- }
-
- decoded := reflect.New(reflect.TypeOf(res).Elem()).Interface().(versionedDecoder)
- if err := versionedDecode(encoded, decoded, res.version()); err != nil {
- t.Error("Decoding", name, "failed:", err)
- }
-
- if !reflect.DeepEqual(decoded, res) {
- t.Errorf("Decoded response does not match the encoded one\nencoded: %#v\ndecoded: %#v", res, decoded)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/response_header.go b/vendor/src/github.com/Shopify/sarama/response_header.go
deleted file mode 100644
index f3f4d27d6..000000000
--- a/vendor/src/github.com/Shopify/sarama/response_header.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package sarama
-
-import "fmt"
-
-type responseHeader struct {
- length int32
- correlationID int32
-}
-
-func (r *responseHeader) decode(pd packetDecoder) (err error) {
- r.length, err = pd.getInt32()
- if err != nil {
- return err
- }
- if r.length <= 4 || r.length > MaxResponseSize {
- return PacketDecodingError{fmt.Sprintf("message of length %d too large or too small", r.length)}
- }
-
- r.correlationID, err = pd.getInt32()
- return err
-}
diff --git a/vendor/src/github.com/Shopify/sarama/response_header_test.go b/vendor/src/github.com/Shopify/sarama/response_header_test.go
deleted file mode 100644
index 8f9fdb80c..000000000
--- a/vendor/src/github.com/Shopify/sarama/response_header_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- responseHeaderBytes = []byte{
- 0x00, 0x00, 0x0f, 0x00,
- 0x0a, 0xbb, 0xcc, 0xff}
-)
-
-func TestResponseHeader(t *testing.T) {
- header := responseHeader{}
-
- testDecodable(t, "response header", &header, responseHeaderBytes)
- if header.length != 0xf00 {
- t.Error("Decoding header length failed, got", header.length)
- }
- if header.correlationID != 0x0abbccff {
- t.Error("Decoding header correlation id failed, got", header.correlationID)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sarama.go b/vendor/src/github.com/Shopify/sarama/sarama.go
deleted file mode 100644
index 7d5dc60d3..000000000
--- a/vendor/src/github.com/Shopify/sarama/sarama.go
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-Package sarama is a pure Go client library for dealing with Apache Kafka (versions 0.8 and later). It includes a high-level
-API for easily producing and consuming messages, and a low-level API for controlling bytes on the wire when the high-level
-API is insufficient. Usage examples for the high-level APIs are provided inline with their full documentation.
-
-To produce messages, use either the AsyncProducer or the SyncProducer. The AsyncProducer accepts messages on a channel
-and produces them asynchronously in the background as efficiently as possible; it is preferred in most cases.
-The SyncProducer provides a method which will block until Kafka acknowledges the message as produced. This can be
-useful but comes with two caveats: it will generally be less efficient, and the actual durability guarantees
-depend on the configured value of `Producer.RequiredAcks`. There are configurations where a message acknowledged by the
-SyncProducer can still sometimes be lost.
-
-To consume messages, use the Consumer. Note that Sarama's Consumer implementation does not currently support automatic
-consumer-group rebalancing and offset tracking. For Zookeeper-based tracking (Kafka 0.8.2 and earlier), the
-https://github.com/wvanbergen/kafka library builds on Sarama to add this support. For Kafka-based tracking (Kafka 0.9
-and later), the https://github.com/bsm/sarama-cluster library builds on Sarama to add this support.
-
-For lower-level needs, the Broker and Request/Response objects permit precise control over each connection
-and message sent on the wire; the Client provides higher-level metadata management that is shared between
-the producers and the consumer. The Request/Response objects and properties are mostly undocumented, as they line up
-exactly with the protocol fields documented by Kafka at
-https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol
-
-Metrics are exposed through https://github.com/rcrowley/go-metrics library in a local registry.
-
-Broker related metrics:
-
- +----------------------------------------------+------------+---------------------------------------------------------------+
- | Name | Type | Description |
- +----------------------------------------------+------------+---------------------------------------------------------------+
- | incoming-byte-rate | meter | Bytes/second read off all brokers |
- | incoming-byte-rate-for-broker- | meter | Bytes/second read off a given broker |
- | outgoing-byte-rate | meter | Bytes/second written off all brokers |
- | outgoing-byte-rate-for-broker- | meter | Bytes/second written off a given broker |
- | request-rate | meter | Requests/second sent to all brokers |
- | request-rate-for-broker- | meter | Requests/second sent to a given broker |
- | request-size | histogram | Distribution of the request size in bytes for all brokers |
- | request-size-for-broker- | histogram | Distribution of the request size in bytes for a given broker |
- | request-latency-in-ms | histogram | Distribution of the request latency in ms for all brokers |
- | request-latency-in-ms-for-broker- | histogram | Distribution of the request latency in ms for a given broker |
- | response-rate | meter | Responses/second received from all brokers |
- | response-rate-for-broker- | meter | Responses/second received from a given broker |
- | response-size | histogram | Distribution of the response size in bytes for all brokers |
- | response-size-for-broker- | histogram | Distribution of the response size in bytes for a given broker |
- +----------------------------------------------+------------+---------------------------------------------------------------+
-
-Note that we do not gather specific metrics for seed brokers but they are part of the "all brokers" metrics.
-
-Producer related metrics:
-
- +-------------------------------------------+------------+--------------------------------------------------------------------------------------+
- | Name | Type | Description |
- +-------------------------------------------+------------+--------------------------------------------------------------------------------------+
- | batch-size | histogram | Distribution of the number of bytes sent per partition per request for all topics |
- | batch-size-for-topic- | histogram | Distribution of the number of bytes sent per partition per request for a given topic |
- | record-send-rate | meter | Records/second sent to all topics |
- | record-send-rate-for-topic- | meter | Records/second sent to a given topic |
- | records-per-request | histogram | Distribution of the number of records sent per request for all topics |
- | records-per-request-for-topic- | histogram | Distribution of the number of records sent per request for a given topic |
- | compression-ratio | histogram | Distribution of the compression ratio times 100 of record batches for all topics |
- | compression-ratio-for-topic- | histogram | Distribution of the compression ratio times 100 of record batches for a given topic |
- +-------------------------------------------+------------+--------------------------------------------------------------------------------------+
-
-*/
-package sarama
-
-import (
- "io/ioutil"
- "log"
-)
-
-// Logger is the instance of a StdLogger interface that Sarama writes connection
-// management events to. By default it is set to discard all log messages via ioutil.Discard,
-// but you can set it to redirect wherever you want.
-var Logger StdLogger = log.New(ioutil.Discard, "[Sarama] ", log.LstdFlags)
-
-// StdLogger is used to log error messages.
-type StdLogger interface {
- Print(v ...interface{})
- Printf(format string, v ...interface{})
- Println(v ...interface{})
-}
-
-// PanicHandler is called for recovering from panics spawned internally to the library (and thus
-// not recoverable by the caller's goroutine). Defaults to nil, which means panics are not recovered.
-var PanicHandler func(interface{})
-
-// MaxRequestSize is the maximum size (in bytes) of any request that Sarama will attempt to send. Trying
-// to send a request larger than this will result in an PacketEncodingError. The default of 100 MiB is aligned
-// with Kafka's default `socket.request.max.bytes`, which is the largest request the broker will attempt
-// to process.
-var MaxRequestSize int32 = 100 * 1024 * 1024
-
-// MaxResponseSize is the maximum size (in bytes) of any response that Sarama will attempt to parse. If
-// a broker returns a response message larger than this value, Sarama will return a PacketDecodingError to
-// protect the client from running out of memory. Please note that brokers do not have any natural limit on
-// the size of responses they send. In particular, they can send arbitrarily large fetch responses to consumers
-// (see https://issues.apache.org/jira/browse/KAFKA-2063).
-var MaxResponseSize int32 = 100 * 1024 * 1024
diff --git a/vendor/src/github.com/Shopify/sarama/sasl_handshake_request.go b/vendor/src/github.com/Shopify/sarama/sasl_handshake_request.go
deleted file mode 100644
index fbbc8947b..000000000
--- a/vendor/src/github.com/Shopify/sarama/sasl_handshake_request.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package sarama
-
-type SaslHandshakeRequest struct {
- Mechanism string
-}
-
-func (r *SaslHandshakeRequest) encode(pe packetEncoder) error {
- if err := pe.putString(r.Mechanism); err != nil {
- return err
- }
-
- return nil
-}
-
-func (r *SaslHandshakeRequest) decode(pd packetDecoder, version int16) (err error) {
- if r.Mechanism, err = pd.getString(); err != nil {
- return err
- }
-
- return nil
-}
-
-func (r *SaslHandshakeRequest) key() int16 {
- return 17
-}
-
-func (r *SaslHandshakeRequest) version() int16 {
- return 0
-}
-
-func (r *SaslHandshakeRequest) requiredVersion() KafkaVersion {
- return V0_10_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sasl_handshake_request_test.go b/vendor/src/github.com/Shopify/sarama/sasl_handshake_request_test.go
deleted file mode 100644
index 806e628fd..000000000
--- a/vendor/src/github.com/Shopify/sarama/sasl_handshake_request_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- baseSaslRequest = []byte{
- 0, 3, 'f', 'o', 'o', // Mechanism
- }
-)
-
-func TestSaslHandshakeRequest(t *testing.T) {
- var request *SaslHandshakeRequest
-
- request = new(SaslHandshakeRequest)
- request.Mechanism = "foo"
- testRequest(t, "basic", request, baseSaslRequest)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sasl_handshake_response.go b/vendor/src/github.com/Shopify/sarama/sasl_handshake_response.go
deleted file mode 100644
index 8379bbb26..000000000
--- a/vendor/src/github.com/Shopify/sarama/sasl_handshake_response.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package sarama
-
-type SaslHandshakeResponse struct {
- Err KError
- EnabledMechanisms []string
-}
-
-func (r *SaslHandshakeResponse) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.Err))
- return pe.putStringArray(r.EnabledMechanisms)
-}
-
-func (r *SaslHandshakeResponse) decode(pd packetDecoder, version int16) error {
- if kerr, err := pd.getInt16(); err != nil {
- return err
- } else {
- r.Err = KError(kerr)
- }
-
- var err error
- if r.EnabledMechanisms, err = pd.getStringArray(); err != nil {
- return err
- }
-
- return nil
-}
-
-func (r *SaslHandshakeResponse) key() int16 {
- return 17
-}
-
-func (r *SaslHandshakeResponse) version() int16 {
- return 0
-}
-
-func (r *SaslHandshakeResponse) requiredVersion() KafkaVersion {
- return V0_10_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sasl_handshake_response_test.go b/vendor/src/github.com/Shopify/sarama/sasl_handshake_response_test.go
deleted file mode 100644
index 1fd4c79e0..000000000
--- a/vendor/src/github.com/Shopify/sarama/sasl_handshake_response_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- saslHandshakeResponse = []byte{
- 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x03, 'f', 'o', 'o',
- }
-)
-
-func TestSaslHandshakeResponse(t *testing.T) {
- var response *SaslHandshakeResponse
-
- response = new(SaslHandshakeResponse)
- testVersionDecodable(t, "no error", response, saslHandshakeResponse, 0)
- if response.Err != ErrNoError {
- t.Error("Decoding error failed: no error expected but found", response.Err)
- }
- if response.EnabledMechanisms[0] != "foo" {
- t.Error("Decoding error failed: expected 'foo' but found", response.EnabledMechanisms)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sync_group_request.go b/vendor/src/github.com/Shopify/sarama/sync_group_request.go
deleted file mode 100644
index fe207080e..000000000
--- a/vendor/src/github.com/Shopify/sarama/sync_group_request.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package sarama
-
-type SyncGroupRequest struct {
- GroupId string
- GenerationId int32
- MemberId string
- GroupAssignments map[string][]byte
-}
-
-func (r *SyncGroupRequest) encode(pe packetEncoder) error {
- if err := pe.putString(r.GroupId); err != nil {
- return err
- }
-
- pe.putInt32(r.GenerationId)
-
- if err := pe.putString(r.MemberId); err != nil {
- return err
- }
-
- if err := pe.putArrayLength(len(r.GroupAssignments)); err != nil {
- return err
- }
- for memberId, memberAssignment := range r.GroupAssignments {
- if err := pe.putString(memberId); err != nil {
- return err
- }
- if err := pe.putBytes(memberAssignment); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *SyncGroupRequest) decode(pd packetDecoder, version int16) (err error) {
- if r.GroupId, err = pd.getString(); err != nil {
- return
- }
- if r.GenerationId, err = pd.getInt32(); err != nil {
- return
- }
- if r.MemberId, err = pd.getString(); err != nil {
- return
- }
-
- n, err := pd.getArrayLength()
- if err != nil {
- return err
- }
- if n == 0 {
- return nil
- }
-
- r.GroupAssignments = make(map[string][]byte)
- for i := 0; i < n; i++ {
- memberId, err := pd.getString()
- if err != nil {
- return err
- }
- memberAssignment, err := pd.getBytes()
- if err != nil {
- return err
- }
-
- r.GroupAssignments[memberId] = memberAssignment
- }
-
- return nil
-}
-
-func (r *SyncGroupRequest) key() int16 {
- return 14
-}
-
-func (r *SyncGroupRequest) version() int16 {
- return 0
-}
-
-func (r *SyncGroupRequest) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
-
-func (r *SyncGroupRequest) AddGroupAssignment(memberId string, memberAssignment []byte) {
- if r.GroupAssignments == nil {
- r.GroupAssignments = make(map[string][]byte)
- }
-
- r.GroupAssignments[memberId] = memberAssignment
-}
-
-func (r *SyncGroupRequest) AddGroupAssignmentMember(memberId string, memberAssignment *ConsumerGroupMemberAssignment) error {
- bin, err := encode(memberAssignment, nil)
- if err != nil {
- return err
- }
-
- r.AddGroupAssignment(memberId, bin)
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sync_group_request_test.go b/vendor/src/github.com/Shopify/sarama/sync_group_request_test.go
deleted file mode 100644
index 3f537ef9f..000000000
--- a/vendor/src/github.com/Shopify/sarama/sync_group_request_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package sarama
-
-import "testing"
-
-var (
- emptySyncGroupRequest = []byte{
- 0, 3, 'f', 'o', 'o', // Group ID
- 0x00, 0x01, 0x02, 0x03, // Generation ID
- 0, 3, 'b', 'a', 'z', // Member ID
- 0, 0, 0, 0, // no assignments
- }
-
- populatedSyncGroupRequest = []byte{
- 0, 3, 'f', 'o', 'o', // Group ID
- 0x00, 0x01, 0x02, 0x03, // Generation ID
- 0, 3, 'b', 'a', 'z', // Member ID
- 0, 0, 0, 1, // one assignment
- 0, 3, 'b', 'a', 'z', // Member ID
- 0, 0, 0, 3, 'f', 'o', 'o', // Member assignment
- }
-)
-
-func TestSyncGroupRequest(t *testing.T) {
- var request *SyncGroupRequest
-
- request = new(SyncGroupRequest)
- request.GroupId = "foo"
- request.GenerationId = 66051
- request.MemberId = "baz"
- testRequest(t, "empty", request, emptySyncGroupRequest)
-
- request = new(SyncGroupRequest)
- request.GroupId = "foo"
- request.GenerationId = 66051
- request.MemberId = "baz"
- request.AddGroupAssignment("baz", []byte("foo"))
- testRequest(t, "populated", request, populatedSyncGroupRequest)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sync_group_response.go b/vendor/src/github.com/Shopify/sarama/sync_group_response.go
deleted file mode 100644
index 12aef6730..000000000
--- a/vendor/src/github.com/Shopify/sarama/sync_group_response.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package sarama
-
-type SyncGroupResponse struct {
- Err KError
- MemberAssignment []byte
-}
-
-func (r *SyncGroupResponse) GetMemberAssignment() (*ConsumerGroupMemberAssignment, error) {
- assignment := new(ConsumerGroupMemberAssignment)
- err := decode(r.MemberAssignment, assignment)
- return assignment, err
-}
-
-func (r *SyncGroupResponse) encode(pe packetEncoder) error {
- pe.putInt16(int16(r.Err))
- return pe.putBytes(r.MemberAssignment)
-}
-
-func (r *SyncGroupResponse) decode(pd packetDecoder, version int16) (err error) {
- if kerr, err := pd.getInt16(); err != nil {
- return err
- } else {
- r.Err = KError(kerr)
- }
-
- r.MemberAssignment, err = pd.getBytes()
- return
-}
-
-func (r *SyncGroupResponse) key() int16 {
- return 14
-}
-
-func (r *SyncGroupResponse) version() int16 {
- return 0
-}
-
-func (r *SyncGroupResponse) requiredVersion() KafkaVersion {
- return V0_9_0_0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sync_group_response_test.go b/vendor/src/github.com/Shopify/sarama/sync_group_response_test.go
deleted file mode 100644
index 6fb708858..000000000
--- a/vendor/src/github.com/Shopify/sarama/sync_group_response_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package sarama
-
-import (
- "reflect"
- "testing"
-)
-
-var (
- syncGroupResponseNoError = []byte{
- 0x00, 0x00, // No error
- 0, 0, 0, 3, 0x01, 0x02, 0x03, // Member assignment data
- }
-
- syncGroupResponseWithError = []byte{
- 0, 27, // ErrRebalanceInProgress
- 0, 0, 0, 0, // No member assignment data
- }
-)
-
-func TestSyncGroupResponse(t *testing.T) {
- var response *SyncGroupResponse
-
- response = new(SyncGroupResponse)
- testVersionDecodable(t, "no error", response, syncGroupResponseNoError, 0)
- if response.Err != ErrNoError {
- t.Error("Decoding Err failed: no error expected but found", response.Err)
- }
- if !reflect.DeepEqual(response.MemberAssignment, []byte{0x01, 0x02, 0x03}) {
- t.Error("Decoding MemberAssignment failed, found:", response.MemberAssignment)
- }
-
- response = new(SyncGroupResponse)
- testVersionDecodable(t, "no error", response, syncGroupResponseWithError, 0)
- if response.Err != ErrRebalanceInProgress {
- t.Error("Decoding Err failed: ErrRebalanceInProgress expected but found", response.Err)
- }
- if !reflect.DeepEqual(response.MemberAssignment, []byte{}) {
- t.Error("Decoding MemberAssignment failed, found:", response.MemberAssignment)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sync_producer.go b/vendor/src/github.com/Shopify/sarama/sync_producer.go
deleted file mode 100644
index c77ae3140..000000000
--- a/vendor/src/github.com/Shopify/sarama/sync_producer.go
+++ /dev/null
@@ -1,164 +0,0 @@
-package sarama
-
-import "sync"
-
-// SyncProducer publishes Kafka messages, blocking until they have been acknowledged. It routes messages to the correct
-// broker, refreshing metadata as appropriate, and parses responses for errors. You must call Close() on a producer
-// to avoid leaks, it may not be garbage-collected automatically when it passes out of scope.
-//
-// The SyncProducer comes with two caveats: it will generally be less efficient than the AsyncProducer, and the actual
-// durability guarantee provided when a message is acknowledged depend on the configured value of `Producer.RequiredAcks`.
-// There are configurations where a message acknowledged by the SyncProducer can still sometimes be lost.
-//
-// For implementation reasons, the SyncProducer requires `Producer.Return.Errors` and `Producer.Return.Successes` to
-// be set to true in its configuration.
-type SyncProducer interface {
-
- // SendMessage produces a given message, and returns only when it either has
- // succeeded or failed to produce. It will return the partition and the offset
- // of the produced message, or an error if the message failed to produce.
- SendMessage(msg *ProducerMessage) (partition int32, offset int64, err error)
-
- // SendMessages produces a given set of messages, and returns only when all
- // messages in the set have either succeeded or failed. Note that messages
- // can succeed and fail individually; if some succeed and some fail,
- // SendMessages will return an error.
- SendMessages(msgs []*ProducerMessage) error
-
- // Close shuts down the producer and flushes any messages it may have buffered.
- // You must call this function before a producer object passes out of scope, as
- // it may otherwise leak memory. You must call this before calling Close on the
- // underlying client.
- Close() error
-}
-
-type syncProducer struct {
- producer *asyncProducer
- wg sync.WaitGroup
-}
-
-// NewSyncProducer creates a new SyncProducer using the given broker addresses and configuration.
-func NewSyncProducer(addrs []string, config *Config) (SyncProducer, error) {
- if config == nil {
- config = NewConfig()
- config.Producer.Return.Successes = true
- }
-
- if err := verifyProducerConfig(config); err != nil {
- return nil, err
- }
-
- p, err := NewAsyncProducer(addrs, config)
- if err != nil {
- return nil, err
- }
- return newSyncProducerFromAsyncProducer(p.(*asyncProducer)), nil
-}
-
-// NewSyncProducerFromClient creates a new SyncProducer using the given client. It is still
-// necessary to call Close() on the underlying client when shutting down this producer.
-func NewSyncProducerFromClient(client Client) (SyncProducer, error) {
- if err := verifyProducerConfig(client.Config()); err != nil {
- return nil, err
- }
-
- p, err := NewAsyncProducerFromClient(client)
- if err != nil {
- return nil, err
- }
- return newSyncProducerFromAsyncProducer(p.(*asyncProducer)), nil
-}
-
-func newSyncProducerFromAsyncProducer(p *asyncProducer) *syncProducer {
- sp := &syncProducer{producer: p}
-
- sp.wg.Add(2)
- go withRecover(sp.handleSuccesses)
- go withRecover(sp.handleErrors)
-
- return sp
-}
-
-func verifyProducerConfig(config *Config) error {
- if !config.Producer.Return.Errors {
- return ConfigurationError("Producer.Return.Errors must be true to be used in a SyncProducer")
- }
- if !config.Producer.Return.Successes {
- return ConfigurationError("Producer.Return.Successes must be true to be used in a SyncProducer")
- }
- return nil
-}
-
-func (sp *syncProducer) SendMessage(msg *ProducerMessage) (partition int32, offset int64, err error) {
- oldMetadata := msg.Metadata
- defer func() {
- msg.Metadata = oldMetadata
- }()
-
- expectation := make(chan *ProducerError, 1)
- msg.Metadata = expectation
- sp.producer.Input() <- msg
-
- if err := <-expectation; err != nil {
- return -1, -1, err.Err
- }
-
- return msg.Partition, msg.Offset, nil
-}
-
-func (sp *syncProducer) SendMessages(msgs []*ProducerMessage) error {
- savedMetadata := make([]interface{}, len(msgs))
- for i := range msgs {
- savedMetadata[i] = msgs[i].Metadata
- }
- defer func() {
- for i := range msgs {
- msgs[i].Metadata = savedMetadata[i]
- }
- }()
-
- expectations := make(chan chan *ProducerError, len(msgs))
- go func() {
- for _, msg := range msgs {
- expectation := make(chan *ProducerError, 1)
- msg.Metadata = expectation
- sp.producer.Input() <- msg
- expectations <- expectation
- }
- close(expectations)
- }()
-
- var errors ProducerErrors
- for expectation := range expectations {
- if err := <-expectation; err != nil {
- errors = append(errors, err)
- }
- }
-
- if len(errors) > 0 {
- return errors
- }
- return nil
-}
-
-func (sp *syncProducer) handleSuccesses() {
- defer sp.wg.Done()
- for msg := range sp.producer.Successes() {
- expectation := msg.Metadata.(chan *ProducerError)
- expectation <- nil
- }
-}
-
-func (sp *syncProducer) handleErrors() {
- defer sp.wg.Done()
- for err := range sp.producer.Errors() {
- expectation := err.Msg.Metadata.(chan *ProducerError)
- expectation <- err
- }
-}
-
-func (sp *syncProducer) Close() error {
- sp.producer.AsyncClose()
- sp.wg.Wait()
- return nil
-}
diff --git a/vendor/src/github.com/Shopify/sarama/sync_producer_test.go b/vendor/src/github.com/Shopify/sarama/sync_producer_test.go
deleted file mode 100644
index c1519a148..000000000
--- a/vendor/src/github.com/Shopify/sarama/sync_producer_test.go
+++ /dev/null
@@ -1,199 +0,0 @@
-package sarama
-
-import (
- "log"
- "sync"
- "testing"
-)
-
-func TestSyncProducer(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- for i := 0; i < 10; i++ {
- leader.Returns(prodSuccess)
- }
-
- producer, err := NewSyncProducer([]string{seedBroker.Addr()}, nil)
- if err != nil {
- t.Fatal(err)
- }
-
- for i := 0; i < 10; i++ {
- msg := &ProducerMessage{
- Topic: "my_topic",
- Value: StringEncoder(TestMessage),
- Metadata: "test",
- }
-
- partition, offset, err := producer.SendMessage(msg)
-
- if partition != 0 || msg.Partition != partition {
- t.Error("Unexpected partition")
- }
- if offset != 0 || msg.Offset != offset {
- t.Error("Unexpected offset")
- }
- if str, ok := msg.Metadata.(string); !ok || str != "test" {
- t.Error("Unexpected metadata")
- }
- if err != nil {
- t.Error(err)
- }
- }
-
- safeClose(t, producer)
- leader.Close()
- seedBroker.Close()
-}
-
-func TestSyncProducerBatch(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 3
- config.Producer.Return.Successes = true
- producer, err := NewSyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- err = producer.SendMessages([]*ProducerMessage{
- &ProducerMessage{
- Topic: "my_topic",
- Value: StringEncoder(TestMessage),
- Metadata: "test",
- },
- &ProducerMessage{
- Topic: "my_topic",
- Value: StringEncoder(TestMessage),
- Metadata: "test",
- },
- &ProducerMessage{
- Topic: "my_topic",
- Value: StringEncoder(TestMessage),
- Metadata: "test",
- },
- })
-
- if err != nil {
- t.Error(err)
- }
-
- safeClose(t, producer)
- leader.Close()
- seedBroker.Close()
-}
-
-func TestConcurrentSyncProducer(t *testing.T) {
- seedBroker := NewMockBroker(t, 1)
- leader := NewMockBroker(t, 2)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(leader.Addr(), leader.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, ErrNoError)
- seedBroker.Returns(metadataResponse)
-
- prodSuccess := new(ProduceResponse)
- prodSuccess.AddTopicPartition("my_topic", 0, ErrNoError)
- leader.Returns(prodSuccess)
-
- config := NewConfig()
- config.Producer.Flush.Messages = 100
- config.Producer.Return.Successes = true
- producer, err := NewSyncProducer([]string{seedBroker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- wg := sync.WaitGroup{}
-
- for i := 0; i < 100; i++ {
- wg.Add(1)
- go func() {
- msg := &ProducerMessage{Topic: "my_topic", Value: StringEncoder(TestMessage)}
- partition, _, err := producer.SendMessage(msg)
- if partition != 0 {
- t.Error("Unexpected partition")
- }
- if err != nil {
- t.Error(err)
- }
- wg.Done()
- }()
- }
- wg.Wait()
-
- safeClose(t, producer)
- leader.Close()
- seedBroker.Close()
-}
-
-func TestSyncProducerToNonExistingTopic(t *testing.T) {
- broker := NewMockBroker(t, 1)
-
- metadataResponse := new(MetadataResponse)
- metadataResponse.AddBroker(broker.Addr(), broker.BrokerID())
- metadataResponse.AddTopicPartition("my_topic", 0, broker.BrokerID(), nil, nil, ErrNoError)
- broker.Returns(metadataResponse)
-
- config := NewConfig()
- config.Metadata.Retry.Max = 0
- config.Producer.Retry.Max = 0
- config.Producer.Return.Successes = true
-
- producer, err := NewSyncProducer([]string{broker.Addr()}, config)
- if err != nil {
- t.Fatal(err)
- }
-
- metadataResponse = new(MetadataResponse)
- metadataResponse.AddTopic("unknown", ErrUnknownTopicOrPartition)
- broker.Returns(metadataResponse)
-
- _, _, err = producer.SendMessage(&ProducerMessage{Topic: "unknown"})
- if err != ErrUnknownTopicOrPartition {
- t.Error("Uxpected ErrUnknownTopicOrPartition, found:", err)
- }
-
- safeClose(t, producer)
- broker.Close()
-}
-
-// This example shows the basic usage pattern of the SyncProducer.
-func ExampleSyncProducer() {
- producer, err := NewSyncProducer([]string{"localhost:9092"}, nil)
- if err != nil {
- log.Fatalln(err)
- }
- defer func() {
- if err := producer.Close(); err != nil {
- log.Fatalln(err)
- }
- }()
-
- msg := &ProducerMessage{Topic: "my_topic", Value: StringEncoder("testing 123")}
- partition, offset, err := producer.SendMessage(msg)
- if err != nil {
- log.Printf("FAILED to send message: %s\n", err)
- } else {
- log.Printf("> message sent to partition %d at offset %d\n", partition, offset)
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/tools/README.md b/vendor/src/github.com/Shopify/sarama/tools/README.md
deleted file mode 100644
index 3464c4ad8..000000000
--- a/vendor/src/github.com/Shopify/sarama/tools/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Sarama tools
-
-This folder contains applications that are useful for exploration of your Kafka cluster, or instrumentation.
-Some of these tools mirror tools that ship with Kafka, but these tools won't require installing the JVM to function.
-
-- [kafka-console-producer](./kafka-console-producer): a command line tool to produce a single message to your Kafka custer.
-- [kafka-console-partitionconsumer](./kafka-console-partitionconsumer): (deprecated) a command line tool to consume a single partition of a topic on your Kafka cluster.
-- [kafka-console-consumer](./kafka-console-consumer): a command line tool to consume arbitrary partitions of a topic on your Kafka cluster.
-
-To install all tools, run `go get github.com/Shopify/sarama/tools/...`
diff --git a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-consumer/README.md b/vendor/src/github.com/Shopify/sarama/tools/kafka-console-consumer/README.md
deleted file mode 100644
index 4e77f0b70..000000000
--- a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-consumer/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# kafka-console-consumer
-
-A simple command line tool to consume partitions of a topic and print the
-messages on the standard output.
-
-### Installation
-
- go get github.com/Shopify/sarama/tools/kafka-console-consumer
-
-### Usage
-
- # Minimum invocation
- kafka-console-consumer -topic=test -brokers=kafka1:9092
-
- # It will pick up a KAFKA_PEERS environment variable
- export KAFKA_PEERS=kafka1:9092,kafka2:9092,kafka3:9092
- kafka-console-consumer -topic=test
-
- # You can specify the offset you want to start at. It can be either
- # `oldest`, `newest`. The default is `newest`.
- kafka-console-consumer -topic=test -offset=oldest
- kafka-console-consumer -topic=test -offset=newest
-
- # You can specify the partition(s) you want to consume as a comma-separated
- # list. The default is `all`.
- kafka-console-consumer -topic=test -partitions=1,2,3
-
- # Display all command line options
- kafka-console-consumer -help
diff --git a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-consumer/kafka-console-consumer.go b/vendor/src/github.com/Shopify/sarama/tools/kafka-console-consumer/kafka-console-consumer.go
deleted file mode 100644
index 0f1eb89a9..000000000
--- a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-consumer/kafka-console-consumer.go
+++ /dev/null
@@ -1,145 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "os"
- "os/signal"
- "strconv"
- "strings"
- "sync"
-
- "github.com/Shopify/sarama"
-)
-
-var (
- brokerList = flag.String("brokers", os.Getenv("KAFKA_PEERS"), "The comma separated list of brokers in the Kafka cluster")
- topic = flag.String("topic", "", "REQUIRED: the topic to consume")
- partitions = flag.String("partitions", "all", "The partitions to consume, can be 'all' or comma-separated numbers")
- offset = flag.String("offset", "newest", "The offset to start with. Can be `oldest`, `newest`")
- verbose = flag.Bool("verbose", false, "Whether to turn on sarama logging")
- bufferSize = flag.Int("buffer-size", 256, "The buffer size of the message channel.")
-
- logger = log.New(os.Stderr, "", log.LstdFlags)
-)
-
-func main() {
- flag.Parse()
-
- if *brokerList == "" {
- printUsageErrorAndExit("You have to provide -brokers as a comma-separated list, or set the KAFKA_PEERS environment variable.")
- }
-
- if *topic == "" {
- printUsageErrorAndExit("-topic is required")
- }
-
- if *verbose {
- sarama.Logger = logger
- }
-
- var initialOffset int64
- switch *offset {
- case "oldest":
- initialOffset = sarama.OffsetOldest
- case "newest":
- initialOffset = sarama.OffsetNewest
- default:
- printUsageErrorAndExit("-offset should be `oldest` or `newest`")
- }
-
- c, err := sarama.NewConsumer(strings.Split(*brokerList, ","), nil)
- if err != nil {
- printErrorAndExit(69, "Failed to start consumer: %s", err)
- }
-
- partitionList, err := getPartitions(c)
- if err != nil {
- printErrorAndExit(69, "Failed to get the list of partitions: %s", err)
- }
-
- var (
- messages = make(chan *sarama.ConsumerMessage, *bufferSize)
- closing = make(chan struct{})
- wg sync.WaitGroup
- )
-
- go func() {
- signals := make(chan os.Signal, 1)
- signal.Notify(signals, os.Kill, os.Interrupt)
- <-signals
- logger.Println("Initiating shutdown of consumer...")
- close(closing)
- }()
-
- for _, partition := range partitionList {
- pc, err := c.ConsumePartition(*topic, partition, initialOffset)
- if err != nil {
- printErrorAndExit(69, "Failed to start consumer for partition %d: %s", partition, err)
- }
-
- go func(pc sarama.PartitionConsumer) {
- <-closing
- pc.AsyncClose()
- }(pc)
-
- wg.Add(1)
- go func(pc sarama.PartitionConsumer) {
- defer wg.Done()
- for message := range pc.Messages() {
- messages <- message
- }
- }(pc)
- }
-
- go func() {
- for msg := range messages {
- fmt.Printf("Partition:\t%d\n", msg.Partition)
- fmt.Printf("Offset:\t%d\n", msg.Offset)
- fmt.Printf("Key:\t%s\n", string(msg.Key))
- fmt.Printf("Value:\t%s\n", string(msg.Value))
- fmt.Println()
- }
- }()
-
- wg.Wait()
- logger.Println("Done consuming topic", *topic)
- close(messages)
-
- if err := c.Close(); err != nil {
- logger.Println("Failed to close consumer: ", err)
- }
-}
-
-func getPartitions(c sarama.Consumer) ([]int32, error) {
- if *partitions == "all" {
- return c.Partitions(*topic)
- }
-
- tmp := strings.Split(*partitions, ",")
- var pList []int32
- for i := range tmp {
- val, err := strconv.ParseInt(tmp[i], 10, 32)
- if err != nil {
- return nil, err
- }
- pList = append(pList, int32(val))
- }
-
- return pList, nil
-}
-
-func printErrorAndExit(code int, format string, values ...interface{}) {
- fmt.Fprintf(os.Stderr, "ERROR: %s\n", fmt.Sprintf(format, values...))
- fmt.Fprintln(os.Stderr)
- os.Exit(code)
-}
-
-func printUsageErrorAndExit(format string, values ...interface{}) {
- fmt.Fprintf(os.Stderr, "ERROR: %s\n", fmt.Sprintf(format, values...))
- fmt.Fprintln(os.Stderr)
- fmt.Fprintln(os.Stderr, "Available command line options:")
- flag.PrintDefaults()
- os.Exit(64)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-partitionconsumer/README.md b/vendor/src/github.com/Shopify/sarama/tools/kafka-console-partitionconsumer/README.md
deleted file mode 100644
index 646dd5f5c..000000000
--- a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-partitionconsumer/README.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# kafka-console-partitionconsumer
-
-NOTE: this tool is deprecated in favour of the more general and more powerful
-`kafka-console-consumer`.
-
-A simple command line tool to consume a partition of a topic and print the messages
-on the standard output.
-
-### Installation
-
- go get github.com/Shopify/sarama/tools/kafka-console-partitionconsumer
-
-### Usage
-
- # Minimum invocation
- kafka-console-partitionconsumer -topic=test -partition=4 -brokers=kafka1:9092
-
- # It will pick up a KAFKA_PEERS environment variable
- export KAFKA_PEERS=kafka1:9092,kafka2:9092,kafka3:9092
- kafka-console-partitionconsumer -topic=test -partition=4
-
- # You can specify the offset you want to start at. It can be either
- # `oldest`, `newest`, or a specific offset number
- kafka-console-partitionconsumer -topic=test -partition=3 -offset=oldest
- kafka-console-partitionconsumer -topic=test -partition=2 -offset=1337
-
- # Display all command line options
- kafka-console-partitionconsumer -help
diff --git a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-partitionconsumer/kafka-console-partitionconsumer.go b/vendor/src/github.com/Shopify/sarama/tools/kafka-console-partitionconsumer/kafka-console-partitionconsumer.go
deleted file mode 100644
index d5e4464de..000000000
--- a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-partitionconsumer/kafka-console-partitionconsumer.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "os"
- "os/signal"
- "strconv"
- "strings"
-
- "github.com/Shopify/sarama"
-)
-
-var (
- brokerList = flag.String("brokers", os.Getenv("KAFKA_PEERS"), "The comma separated list of brokers in the Kafka cluster")
- topic = flag.String("topic", "", "REQUIRED: the topic to consume")
- partition = flag.Int("partition", -1, "REQUIRED: the partition to consume")
- offset = flag.String("offset", "newest", "The offset to start with. Can be `oldest`, `newest`, or an actual offset")
- verbose = flag.Bool("verbose", false, "Whether to turn on sarama logging")
-
- logger = log.New(os.Stderr, "", log.LstdFlags)
-)
-
-func main() {
- flag.Parse()
-
- if *brokerList == "" {
- printUsageErrorAndExit("You have to provide -brokers as a comma-separated list, or set the KAFKA_PEERS environment variable.")
- }
-
- if *topic == "" {
- printUsageErrorAndExit("-topic is required")
- }
-
- if *partition == -1 {
- printUsageErrorAndExit("-partition is required")
- }
-
- if *verbose {
- sarama.Logger = logger
- }
-
- var (
- initialOffset int64
- offsetError error
- )
- switch *offset {
- case "oldest":
- initialOffset = sarama.OffsetOldest
- case "newest":
- initialOffset = sarama.OffsetNewest
- default:
- initialOffset, offsetError = strconv.ParseInt(*offset, 10, 64)
- }
-
- if offsetError != nil {
- printUsageErrorAndExit("Invalid initial offset: %s", *offset)
- }
-
- c, err := sarama.NewConsumer(strings.Split(*brokerList, ","), nil)
- if err != nil {
- printErrorAndExit(69, "Failed to start consumer: %s", err)
- }
-
- pc, err := c.ConsumePartition(*topic, int32(*partition), initialOffset)
- if err != nil {
- printErrorAndExit(69, "Failed to start partition consumer: %s", err)
- }
-
- go func() {
- signals := make(chan os.Signal, 1)
- signal.Notify(signals, os.Kill, os.Interrupt)
- <-signals
- pc.AsyncClose()
- }()
-
- for msg := range pc.Messages() {
- fmt.Printf("Offset:\t%d\n", msg.Offset)
- fmt.Printf("Key:\t%s\n", string(msg.Key))
- fmt.Printf("Value:\t%s\n", string(msg.Value))
- fmt.Println()
- }
-
- if err := c.Close(); err != nil {
- logger.Println("Failed to close consumer: ", err)
- }
-}
-
-func printErrorAndExit(code int, format string, values ...interface{}) {
- fmt.Fprintf(os.Stderr, "ERROR: %s\n", fmt.Sprintf(format, values...))
- fmt.Fprintln(os.Stderr)
- os.Exit(code)
-}
-
-func printUsageErrorAndExit(format string, values ...interface{}) {
- fmt.Fprintf(os.Stderr, "ERROR: %s\n", fmt.Sprintf(format, values...))
- fmt.Fprintln(os.Stderr)
- fmt.Fprintln(os.Stderr, "Available command line options:")
- flag.PrintDefaults()
- os.Exit(64)
-}
diff --git a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-producer/README.md b/vendor/src/github.com/Shopify/sarama/tools/kafka-console-producer/README.md
deleted file mode 100644
index 6b3a65f21..000000000
--- a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-producer/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# kafka-console-producer
-
-A simple command line tool to produce a single message to Kafka.
-
-### Installation
-
- go get github.com/Shopify/sarama/tools/kafka-console-producer
-
-
-### Usage
-
- # Minimum invocation
- kafka-console-producer -topic=test -value=value -brokers=kafka1:9092
-
- # It will pick up a KAFKA_PEERS environment variable
- export KAFKA_PEERS=kafka1:9092,kafka2:9092,kafka3:9092
- kafka-console-producer -topic=test -value=value
-
- # It will read the value from stdin by using pipes
- echo "hello world" | kafka-console-producer -topic=test
-
- # Specify a key:
- echo "hello world" | kafka-console-producer -topic=test -key=key
-
- # Partitioning: by default, kafka-console-producer will partition as follows:
- # - manual partitioning if a -partition is provided
- # - hash partitioning by key if a -key is provided
- # - random partioning otherwise.
- #
- # You can override this using the -partitioner argument:
- echo "hello world" | kafka-console-producer -topic=test -key=key -partitioner=random
-
- # Display all command line options
- kafka-console-producer -help
diff --git a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-producer/kafka-console-producer.go b/vendor/src/github.com/Shopify/sarama/tools/kafka-console-producer/kafka-console-producer.go
deleted file mode 100644
index 83054ed78..000000000
--- a/vendor/src/github.com/Shopify/sarama/tools/kafka-console-producer/kafka-console-producer.go
+++ /dev/null
@@ -1,124 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "strings"
-
- "github.com/Shopify/sarama"
- "github.com/rcrowley/go-metrics"
-)
-
-var (
- brokerList = flag.String("brokers", os.Getenv("KAFKA_PEERS"), "The comma separated list of brokers in the Kafka cluster. You can also set the KAFKA_PEERS environment variable")
- topic = flag.String("topic", "", "REQUIRED: the topic to produce to")
- key = flag.String("key", "", "The key of the message to produce. Can be empty.")
- value = flag.String("value", "", "REQUIRED: the value of the message to produce. You can also provide the value on stdin.")
- partitioner = flag.String("partitioner", "", "The partitioning scheme to use. Can be `hash`, `manual`, or `random`")
- partition = flag.Int("partition", -1, "The partition to produce to.")
- verbose = flag.Bool("verbose", false, "Turn on sarama logging to stderr")
- showMetrics = flag.Bool("metrics", false, "Output metrics on successful publish to stderr")
- silent = flag.Bool("silent", false, "Turn off printing the message's topic, partition, and offset to stdout")
-
- logger = log.New(os.Stderr, "", log.LstdFlags)
-)
-
-func main() {
- flag.Parse()
-
- if *brokerList == "" {
- printUsageErrorAndExit("no -brokers specified. Alternatively, set the KAFKA_PEERS environment variable")
- }
-
- if *topic == "" {
- printUsageErrorAndExit("no -topic specified")
- }
-
- if *verbose {
- sarama.Logger = logger
- }
-
- config := sarama.NewConfig()
- config.Producer.RequiredAcks = sarama.WaitForAll
- config.Producer.Return.Successes = true
-
- switch *partitioner {
- case "":
- if *partition >= 0 {
- config.Producer.Partitioner = sarama.NewManualPartitioner
- } else {
- config.Producer.Partitioner = sarama.NewHashPartitioner
- }
- case "hash":
- config.Producer.Partitioner = sarama.NewHashPartitioner
- case "random":
- config.Producer.Partitioner = sarama.NewRandomPartitioner
- case "manual":
- config.Producer.Partitioner = sarama.NewManualPartitioner
- if *partition == -1 {
- printUsageErrorAndExit("-partition is required when partitioning manually")
- }
- default:
- printUsageErrorAndExit(fmt.Sprintf("Partitioner %s not supported.", *partitioner))
- }
-
- message := &sarama.ProducerMessage{Topic: *topic, Partition: int32(*partition)}
-
- if *key != "" {
- message.Key = sarama.StringEncoder(*key)
- }
-
- if *value != "" {
- message.Value = sarama.StringEncoder(*value)
- } else if stdinAvailable() {
- bytes, err := ioutil.ReadAll(os.Stdin)
- if err != nil {
- printErrorAndExit(66, "Failed to read data from the standard input: %s", err)
- }
- message.Value = sarama.ByteEncoder(bytes)
- } else {
- printUsageErrorAndExit("-value is required, or you have to provide the value on stdin")
- }
-
- producer, err := sarama.NewSyncProducer(strings.Split(*brokerList, ","), config)
- if err != nil {
- printErrorAndExit(69, "Failed to open Kafka producer: %s", err)
- }
- defer func() {
- if err := producer.Close(); err != nil {
- logger.Println("Failed to close Kafka producer cleanly:", err)
- }
- }()
-
- partition, offset, err := producer.SendMessage(message)
- if err != nil {
- printErrorAndExit(69, "Failed to produce message: %s", err)
- } else if !*silent {
- fmt.Printf("topic=%s\tpartition=%d\toffset=%d\n", *topic, partition, offset)
- }
- if *showMetrics {
- metrics.WriteOnce(config.MetricRegistry, os.Stderr)
- }
-}
-
-func printErrorAndExit(code int, format string, values ...interface{}) {
- fmt.Fprintf(os.Stderr, "ERROR: %s\n", fmt.Sprintf(format, values...))
- fmt.Fprintln(os.Stderr)
- os.Exit(code)
-}
-
-func printUsageErrorAndExit(message string) {
- fmt.Fprintln(os.Stderr, "ERROR:", message)
- fmt.Fprintln(os.Stderr)
- fmt.Fprintln(os.Stderr, "Available command line options:")
- flag.PrintDefaults()
- os.Exit(64)
-}
-
-func stdinAvailable() bool {
- stat, _ := os.Stdin.Stat()
- return (stat.Mode() & os.ModeCharDevice) == 0
-}
diff --git a/vendor/src/github.com/Shopify/sarama/utils.go b/vendor/src/github.com/Shopify/sarama/utils.go
deleted file mode 100644
index 3cbab2d92..000000000
--- a/vendor/src/github.com/Shopify/sarama/utils.go
+++ /dev/null
@@ -1,152 +0,0 @@
-package sarama
-
-import (
- "bufio"
- "net"
- "sort"
-)
-
-type none struct{}
-
-// make []int32 sortable so we can sort partition numbers
-type int32Slice []int32
-
-func (slice int32Slice) Len() int {
- return len(slice)
-}
-
-func (slice int32Slice) Less(i, j int) bool {
- return slice[i] < slice[j]
-}
-
-func (slice int32Slice) Swap(i, j int) {
- slice[i], slice[j] = slice[j], slice[i]
-}
-
-func dupeAndSort(input []int32) []int32 {
- ret := make([]int32, 0, len(input))
- for _, val := range input {
- ret = append(ret, val)
- }
-
- sort.Sort(int32Slice(ret))
- return ret
-}
-
-func withRecover(fn func()) {
- defer func() {
- handler := PanicHandler
- if handler != nil {
- if err := recover(); err != nil {
- handler(err)
- }
- }
- }()
-
- fn()
-}
-
-func safeAsyncClose(b *Broker) {
- tmp := b // local var prevents clobbering in goroutine
- go withRecover(func() {
- if connected, _ := tmp.Connected(); connected {
- if err := tmp.Close(); err != nil {
- Logger.Println("Error closing broker", tmp.ID(), ":", err)
- }
- }
- })
-}
-
-// Encoder is a simple interface for any type that can be encoded as an array of bytes
-// in order to be sent as the key or value of a Kafka message. Length() is provided as an
-// optimization, and must return the same as len() on the result of Encode().
-type Encoder interface {
- Encode() ([]byte, error)
- Length() int
-}
-
-// make strings and byte slices encodable for convenience so they can be used as keys
-// and/or values in kafka messages
-
-// StringEncoder implements the Encoder interface for Go strings so that they can be used
-// as the Key or Value in a ProducerMessage.
-type StringEncoder string
-
-func (s StringEncoder) Encode() ([]byte, error) {
- return []byte(s), nil
-}
-
-func (s StringEncoder) Length() int {
- return len(s)
-}
-
-// ByteEncoder implements the Encoder interface for Go byte slices so that they can be used
-// as the Key or Value in a ProducerMessage.
-type ByteEncoder []byte
-
-func (b ByteEncoder) Encode() ([]byte, error) {
- return b, nil
-}
-
-func (b ByteEncoder) Length() int {
- return len(b)
-}
-
-// bufConn wraps a net.Conn with a buffer for reads to reduce the number of
-// reads that trigger syscalls.
-type bufConn struct {
- net.Conn
- buf *bufio.Reader
-}
-
-func newBufConn(conn net.Conn) *bufConn {
- return &bufConn{
- Conn: conn,
- buf: bufio.NewReader(conn),
- }
-}
-
-func (bc *bufConn) Read(b []byte) (n int, err error) {
- return bc.buf.Read(b)
-}
-
-// KafkaVersion instances represent versions of the upstream Kafka broker.
-type KafkaVersion struct {
- // it's a struct rather than just typing the array directly to make it opaque and stop people
- // generating their own arbitrary versions
- version [4]uint
-}
-
-func newKafkaVersion(major, minor, veryMinor, patch uint) KafkaVersion {
- return KafkaVersion{
- version: [4]uint{major, minor, veryMinor, patch},
- }
-}
-
-// IsAtLeast return true if and only if the version it is called on is
-// greater than or equal to the version passed in:
-// V1.IsAtLeast(V2) // false
-// V2.IsAtLeast(V1) // true
-func (v KafkaVersion) IsAtLeast(other KafkaVersion) bool {
- for i := range v.version {
- if v.version[i] > other.version[i] {
- return true
- } else if v.version[i] < other.version[i] {
- return false
- }
- }
- return true
-}
-
-// Effective constants defining the supported kafka versions.
-var (
- V0_8_2_0 = newKafkaVersion(0, 8, 2, 0)
- V0_8_2_1 = newKafkaVersion(0, 8, 2, 1)
- V0_8_2_2 = newKafkaVersion(0, 8, 2, 2)
- V0_9_0_0 = newKafkaVersion(0, 9, 0, 0)
- V0_9_0_1 = newKafkaVersion(0, 9, 0, 1)
- V0_10_0_0 = newKafkaVersion(0, 10, 0, 0)
- V0_10_0_1 = newKafkaVersion(0, 10, 0, 1)
- V0_10_1_0 = newKafkaVersion(0, 10, 1, 0)
- minVersion = V0_8_2_0
-)
diff --git a/vendor/src/github.com/Shopify/sarama/utils_test.go b/vendor/src/github.com/Shopify/sarama/utils_test.go
deleted file mode 100644
index a9e09502c..000000000
--- a/vendor/src/github.com/Shopify/sarama/utils_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package sarama
-
-import "testing"
-
-func TestVersionCompare(t *testing.T) {
- if V0_8_2_0.IsAtLeast(V0_8_2_1) {
- t.Error("0.8.2.0 >= 0.8.2.1")
- }
- if !V0_8_2_1.IsAtLeast(V0_8_2_0) {
- t.Error("! 0.8.2.1 >= 0.8.2.0")
- }
- if !V0_8_2_0.IsAtLeast(V0_8_2_0) {
- t.Error("! 0.8.2.0 >= 0.8.2.0")
- }
- if !V0_9_0_0.IsAtLeast(V0_8_2_1) {
- t.Error("! 0.9.0.0 >= 0.8.2.1")
- }
- if V0_8_2_1.IsAtLeast(V0_10_0_0) {
- t.Error("0.8.2.1 >= 0.10.0.0")
- }
-}
diff --git a/vendor/src/github.com/Shopify/sarama/vagrant/boot_cluster.sh b/vendor/src/github.com/Shopify/sarama/vagrant/boot_cluster.sh
deleted file mode 100644
index 95e47dde4..000000000
--- a/vendor/src/github.com/Shopify/sarama/vagrant/boot_cluster.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-
-set -ex
-
-# Launch and wait for toxiproxy
-${REPOSITORY_ROOT}/vagrant/run_toxiproxy.sh &
-while ! nc -q 1 localhost 2181 ${KAFKA_INSTALL_ROOT}/zookeeper-${ZK_PORT}/myid
-done
diff --git a/vendor/src/github.com/Shopify/sarama/vagrant/kafka.conf b/vendor/src/github.com/Shopify/sarama/vagrant/kafka.conf
deleted file mode 100644
index 25101df5a..000000000
--- a/vendor/src/github.com/Shopify/sarama/vagrant/kafka.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-start on started zookeeper-ZK_PORT
-stop on stopping zookeeper-ZK_PORT
-
-# Use a script instead of exec (using env stanza leaks KAFKA_HEAP_OPTS from zookeeper)
-script
- sleep 2
- export KAFKA_HEAP_OPTS="-Xmx320m"
- exec /opt/kafka-KAFKAID/bin/kafka-server-start.sh /opt/kafka-KAFKAID/config/server.properties
-end script
diff --git a/vendor/src/github.com/Shopify/sarama/vagrant/provision.sh b/vendor/src/github.com/Shopify/sarama/vagrant/provision.sh
deleted file mode 100644
index ace768f40..000000000
--- a/vendor/src/github.com/Shopify/sarama/vagrant/provision.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-set -ex
-
-apt-get update
-yes | apt-get install default-jre
-
-export KAFKA_INSTALL_ROOT=/opt
-export KAFKA_HOSTNAME=192.168.100.67
-export KAFKA_VERSION=0.9.0.1
-export REPOSITORY_ROOT=/vagrant
-
-sh /vagrant/vagrant/install_cluster.sh
-sh /vagrant/vagrant/setup_services.sh
-sh /vagrant/vagrant/create_topics.sh
diff --git a/vendor/src/github.com/Shopify/sarama/vagrant/run_toxiproxy.sh b/vendor/src/github.com/Shopify/sarama/vagrant/run_toxiproxy.sh
deleted file mode 100644
index e52c00e7b..000000000
--- a/vendor/src/github.com/Shopify/sarama/vagrant/run_toxiproxy.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-
-set -ex
-
-${KAFKA_INSTALL_ROOT}/toxiproxy -port 8474 -host 0.0.0.0 &
-PID=$!
-
-while ! nc -q 1 localhost 8474
-
-# The number of threads handling network requests
-num.network.threads=2
-
-# The number of threads doing disk I/O
-num.io.threads=8
-
-# The send buffer (SO_SNDBUF) used by the socket server
-socket.send.buffer.bytes=1048576
-
-# The receive buffer (SO_RCVBUF) used by the socket server
-socket.receive.buffer.bytes=1048576
-
-# The maximum size of a request that the socket server will accept (protection against OOM)
-socket.request.max.bytes=104857600
-
-
-############################# Log Basics #############################
-
-# A comma seperated list of directories under which to store log files
-log.dirs=KAFKA_DATADIR
-
-# The default number of log partitions per topic. More partitions allow greater
-# parallelism for consumption, but this will also result in more files across
-# the brokers.
-num.partitions=2
-
-# Create new topics with a replication factor of 2 so failover can be tested
-# more easily.
-default.replication.factor=2
-
-auto.create.topics.enable=false
-delete.topic.enable=true
-
-############################# Log Flush Policy #############################
-
-# Messages are immediately written to the filesystem but by default we only fsync() to sync
-# the OS cache lazily. The following configurations control the flush of data to disk.
-# There are a few important trade-offs here:
-# 1. Durability: Unflushed data may be lost if you are not using replication.
-# 2. Latency: Very large flush intervals may lead to latency spikes when the flush does occur as there will be a lot of data to flush.
-# 3. Throughput: The flush is generally the most expensive operation, and a small flush interval may lead to exceessive seeks.
-# The settings below allow one to configure the flush policy to flush data after a period of time or
-# every N messages (or both). This can be done globally and overridden on a per-topic basis.
-
-# The number of messages to accept before forcing a flush of data to disk
-#log.flush.interval.messages=10000
-
-# The maximum amount of time a message can sit in a log before we force a flush
-#log.flush.interval.ms=1000
-
-############################# Log Retention Policy #############################
-
-# The following configurations control the disposal of log segments. The policy can
-# be set to delete segments after a period of time, or after a given size has accumulated.
-# A segment will be deleted whenever *either* of these criteria are met. Deletion always happens
-# from the end of the log.
-
-# The minimum age of a log file to be eligible for deletion
-log.retention.hours=168
-
-# A size-based retention policy for logs. Segments are pruned from the log as long as the remaining
-# segments don't drop below log.retention.bytes.
-log.retention.bytes=268435456
-
-# The maximum size of a log segment file. When this size is reached a new log segment will be created.
-log.segment.bytes=268435456
-
-# The interval at which log segments are checked to see if they can be deleted according
-# to the retention policies
-log.retention.check.interval.ms=60000
-
-# By default the log cleaner is disabled and the log retention policy will default to just delete segments after their retention expires.
-# If log.cleaner.enable=true is set the cleaner will be enabled and individual logs can then be marked for log compaction.
-log.cleaner.enable=false
-
-############################# Zookeeper #############################
-
-# Zookeeper connection string (see zookeeper docs for details).
-# This is a comma separated host:port pairs, each corresponding to a zk
-# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
-# You can also append an optional chroot string to the urls to specify the
-# root directory for all kafka znodes.
-zookeeper.connect=localhost:ZK_PORT
-
-# Timeout in ms for connecting to zookeeper
-zookeeper.session.timeout.ms=3000
-zookeeper.connection.timeout.ms=3000
diff --git a/vendor/src/github.com/Shopify/sarama/vagrant/setup_services.sh b/vendor/src/github.com/Shopify/sarama/vagrant/setup_services.sh
deleted file mode 100644
index 81d8ea05d..000000000
--- a/vendor/src/github.com/Shopify/sarama/vagrant/setup_services.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-
-set -ex
-
-stop toxiproxy || true
-cp ${REPOSITORY_ROOT}/vagrant/toxiproxy.conf /etc/init/toxiproxy.conf
-cp ${REPOSITORY_ROOT}/vagrant/run_toxiproxy.sh ${KAFKA_INSTALL_ROOT}/
-start toxiproxy
-
-for i in 1 2 3 4 5; do
- ZK_PORT=`expr $i + 2180`
- KAFKA_PORT=`expr $i + 9090`
-
- stop zookeeper-${ZK_PORT} || true
-
- # set up zk service
- cp ${REPOSITORY_ROOT}/vagrant/zookeeper.conf /etc/init/zookeeper-${ZK_PORT}.conf
- sed -i s/KAFKAID/${KAFKA_PORT}/g /etc/init/zookeeper-${ZK_PORT}.conf
-
- # set up kafka service
- cp ${REPOSITORY_ROOT}/vagrant/kafka.conf /etc/init/kafka-${KAFKA_PORT}.conf
- sed -i s/KAFKAID/${KAFKA_PORT}/g /etc/init/kafka-${KAFKA_PORT}.conf
- sed -i s/ZK_PORT/${ZK_PORT}/g /etc/init/kafka-${KAFKA_PORT}.conf
-
- start zookeeper-${ZK_PORT}
-done
-
-# Wait for the last kafka node to finish booting
-while ! nc -q 1 localhost 29095
-git add
-```
-
-### Before you report an issue
-
-Sometimes gometalinter will not report issues that you think it should. There
-are three things to try in that case:
-
-#### 1. Update to the latest build of gometalinter and all linters
-
- go get -u github.com/alecthomas/gometalinter
- gometalinter --install
-
-If you're lucky, this will fix the problem.
-
-#### 2. Analyse the debug output
-
-If that doesn't help, the problem may be elsewhere (in no particular order):
-
-1. Upstream linter has changed its output or semantics.
-2. gometalinter is not invoking the tool correctly.
-3. gometalinter regular expression matches are not correct for a linter.
-4. Linter is exceeding the deadline.
-
-To find out what's going on run in debug mode:
-
- gometalinter --debug
-
-This will show all output from the linters and should indicate why it is
-failing.
-
-#### 3. Run linters manually
-
-The output of `gometalinter --debug` should show the exact commands gometalinter
-is running. Run these commands from the command line to determine if the linter
-or gometaliner is at fault.
-
-#### 4. Report an issue.
-
-Failing all else, if the problem looks like a bug please file an issue and
-include the output of `gometalinter --debug`
diff --git a/vendor/src/github.com/alecthomas/gometalinter/COPYING b/vendor/src/github.com/alecthomas/gometalinter/COPYING
deleted file mode 100644
index 1852bbf08..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/COPYING
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2012 Alec Thomas
-
-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/src/github.com/alecthomas/gometalinter/README.md b/vendor/src/github.com/alecthomas/gometalinter/README.md
deleted file mode 100644
index a9c902faf..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/README.md
+++ /dev/null
@@ -1,365 +0,0 @@
-# Go Meta Linter
-[](https://travis-ci.org/alecthomas/gometalinter) [](https://gitter.im/alecthomas/Lobby)
-
-
-
-- [Editor integration](#editor-integration)
-- [Supported linters](#supported-linters)
-- [Configuration file](#configuration-file)
-- [Installing](#installing)
-- [Comment directives](#comment-directives)
-- [Quickstart](#quickstart)
-- [FAQ](#faq)
- - [Exit status](#exit-status)
- - [What's the best way to use `gometalinter` in CI?](#whats-the-best-way-to-use-gometalinter-in-ci)
- - [How do I make `gometalinter` work with Go 1.5 vendoring?](#how-do-i-make-gometalinter-work-with-go-15-vendoring)
- - [Why does `gometalinter --install` install a fork of gocyclo?](#why-does-gometalinter---install-install-a-fork-of-gocyclo)
- - [Gometalinter is not working](#gometalinter-is-not-working)
- - [1. Update to the latest build of gometalinter and all linters](#1-update-to-the-latest-build-of-gometalinter-and-all-linters)
- - [2. Analyse the debug output](#2-analyse-the-debug-output)
- - [3. Report an issue.](#3-report-an-issue)
- - [How do I filter issues between two git refs?](#how-do-i-filter-issues-between-two-git-refs)
-- [Checkstyle XML format](#checkstyle-xml-format)
-
-
-
-
-The number of tools for statically checking Go source for errors and warnings
-is impressive.
-
-This is a tool that concurrently runs a whole bunch of those linters and
-normalises their output to a standard format:
-
- ::[]: ()
-
-eg.
-
- stutter.go:9::warning: unused global variable unusedGlobal (varcheck)
- stutter.go:12:6:warning: exported type MyStruct should have comment or be unexported (golint)
-
-It is intended for use with editor/IDE integration.
-
-## Editor integration
-
-- [SublimeLinter plugin](https://github.com/alecthomas/SublimeLinter-contrib-gometalinter).
-- [Atom go-plus package](https://atom.io/packages/go-plus).
-- [Emacs Flycheck checker](https://github.com/favadi/flycheck-gometalinter).
-- [Go for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=lukehoban.Go).
-- Vim/Neovim
- - [Neomake](https://github.com/neomake/neomake).
- - [Syntastic](https://github.com/scrooloose/syntastic/wiki/Go:---gometalinter) `let g:syntastic_go_checkers = ['gometalinter']`.
- - [ale](https://github.com/w0rp/ale) `let g:ale_linters = {'go': ['gometalinter']}`
- - [vim-go](https://github.com/fatih/vim-go) with the `:GoMetaLinter` command.
-
-## Supported linters
-
-- [go vet](https://golang.org/cmd/vet/) - Reports potential errors that otherwise compile.
-- [go tool vet --shadow](https://golang.org/cmd/vet/#hdr-Shadowed_variables) - Reports variables that may have been unintentionally shadowed.
-- [gotype](https://golang.org/x/tools/cmd/gotype) - Syntactic and semantic analysis similar to the Go compiler.
-- [gotype -x](https://golang.org/x/tools/cmd/gotype) - Syntactic and semantic analysis in external test packages (similar to the Go compiler).
-- [deadcode](https://github.com/tsenart/deadcode) - Finds unused code.
-- [gocyclo](https://github.com/alecthomas/gocyclo) - Computes the cyclomatic complexity of functions.
-- [golint](https://github.com/golang/lint) - Google's (mostly stylistic) linter.
-- [varcheck](https://github.com/opennota/check) - Find unused global variables and constants.
-- [structcheck](https://github.com/opennota/check) - Find unused struct fields.
-- [maligned](https://github.com/mdempsky/maligned) - Detect structs that would take less memory if their fields were sorted.
-- [errcheck](https://github.com/kisielk/errcheck) - Check that error return values are used.
-- [megacheck](https://github.com/dominikh/go-tools/tree/master/cmd/megacheck) - Run staticcheck, gosimple and unused, sharing work.
-- [dupl](https://github.com/mibk/dupl) - Reports potentially duplicated code.
-- [ineffassign](https://github.com/gordonklaus/ineffassign/blob/master/list) - Detect when assignments to *existing* variables are not used.
-- [interfacer](https://github.com/mvdan/interfacer) - Suggest narrower interfaces that can be used.
-- [unconvert](https://github.com/mdempsky/unconvert) - Detect redundant type conversions.
-- [goconst](https://github.com/jgautheron/goconst) - Finds repeated strings that could be replaced by a constant.
-- [gas](https://github.com/GoASTScanner/gas) - Inspects source code for security problems by scanning the Go AST.
-
-Disabled by default (enable with `--enable=`):
-
-- [testify](https://github.com/stretchr/testify) - Show location of failed testify assertions.
-- [test](http://golang.org/pkg/testing/) - Show location of test failures from the stdlib testing module.
-- [gofmt -s](https://golang.org/cmd/gofmt/) - Checks if the code is properly formatted and could not be further simplified.
-- [goimports](https://godoc.org/golang.org/x/tools/cmd/goimports) - Checks missing or unreferenced package imports.
-- [gosimple](https://github.com/dominikh/go-tools/tree/master/cmd/gosimple) - Report simplifications in code.
-- [lll](https://github.com/walle/lll) - Report long lines (see `--line-length=N`).
-- [misspell](https://github.com/client9/misspell) - Finds commonly misspelled English words.
-- [nakedret](https://github.com/alexkohler/nakedret) - Finds naked returns.
-- [unparam](https://github.com/mvdan/unparam) - Find unused function parameters.
-- [unused](https://github.com/dominikh/go-tools/tree/master/cmd/unused) - Find unused variables.
-- [safesql](https://github.com/stripe/safesql) - Finds potential SQL injection vulnerabilities.
-- [staticcheck](https://github.com/dominikh/go-tools/tree/master/cmd/staticcheck) - Statically detect bugs, both obvious and subtle ones.
-
-Additional linters can be added through the command line with `--linter=NAME:COMMAND:PATTERN` (see [below](#details)).
-
-## Configuration file
-
-gometalinter now supports a JSON configuration file which can be loaded via
-`--config=`. The format of this file is determined by the `Config` struct
-in [config.go](https://github.com/alecthomas/gometalinter/blob/master/config.go).
-
-The configuration file mostly corresponds to command-line flags, with the following exceptions:
-
-- Linters defined in the configuration file will overlay existing definitions, not replace them.
-- "Enable" defines the exact set of linters that will be enabled (default
- linters are disabled). `--help` displays the list of default linters with the exact names
- you must use.
-
-Here is an example configuration file:
-
-```json
-{
- "Enable": ["deadcode", "unconvert"]
-}
-```
-
-#### `Format` key
-
-The default `Format` key places the different fields of an `Issue` into a template. this
-corresponds to the `--format` option command-line flag.
-
-Default `Format`:
-```
-Format: "{{.Path}}:{{.Line}}:{{if .Col}}{{.Col}}{{end}}:{{.Severity}}: {{.Message}} ({{.Linter}})"
-```
-
-#### Format Methods
-
-* `{{.Path.Relative}}` - equivalent to `{{.Path}}` which outputs a relative path to the file
-* `{{.Path.Abs}}` - outputs an absolute path to the file
-
-### Adding Custom linters
-
-Linters can be added and customized from the config file using the `Linters` field.
-Linters supports the following fields:
-
-* `Command` - the path to the linter binary and any default arguments
-* `Pattern` - a regular expression used to parse the linter output
-* `IsFast` - if the linter should be run when the `--fast` flag is used
-* `PartitionStrategy` - how paths args should be passed to the linter command:
- * `directories` - call the linter once with a list of all the directories
- * `files` - call the linter once with a list of all the files
- * `packages` - call the linter once with a list of all the package paths
- * `files-by-package` - call the linter once per package with a list of the
- files in the package.
- * `single-directory` - call the linter once per directory
-
-The config for default linters can be overridden by using the name of the
-linter.
-
-Additional linters can be configured via the command line using the format
-`NAME:COMMAND:PATTERN`.
-
-Example:
-
-```
-$ gometalinter --linter='vet:go tool vet -printfuncs=Infof,Debugf,Warningf,Errorf:PATH:LINE:MESSAGE' .
-```
-
-## Installing
-
-There are two options for installing gometalinter.
-
-1. Install a stable version, eg. `go get -u gopkg.in/alecthomas/gometalinter.v1`.
- I will generally only tag a new stable version when it has passed the Travis
- regression tests. The downside is that the binary will be called `gometalinter.v1`.
-2. Install from HEAD with: `go get -u github.com/alecthomas/gometalinter`.
- This has the downside that changes to gometalinter may break.
-
-## Comment directives
-
-gometalinter supports suppression of linter messages via comment directives. The
-form of the directive is:
-
-```
-// nolint[: [, , ...]]
-```
-
-Suppression works in the following way:
-
-1. Line-level suppression
-
- A comment directive suppresses any linter messages on that line.
-
- eg. In this example any messages for `a := 10` will be suppressed and errcheck
- messages for `defer r.Close()` will also be suppressed.
-
- ```go
- a := 10 // nolint
- a = 2
- defer r.Close() // nolint: errcheck
- ```
-
-2. Statement-level suppression
-
- A comment directive at the same indentation level as a statement it
- immediately precedes will also suppress any linter messages in that entire
- statement.
-
- eg. In this example all messages for `SomeFunc()` will be suppressed.
-
- ```go
- // nolint
- func SomeFunc() {
- }
- ```
-
-Implementation details: gometalinter now performs parsing of Go source code,
-to extract linter directives and associate them with line ranges. To avoid
-unnecessary processing, parsing is on-demand: the first time a linter emits a
-message for a file, that file is parsed for directives.
-
-## Quickstart
-
-Install gometalinter (see above).
-
-Install all known linters:
-
-```
-$ gometalinter --install
-Installing:
- structcheck
- maligned
- nakedret
- deadcode
- gocyclo
- ineffassign
- dupl
- golint
- gotype
- goimports
- errcheck
- varcheck
- interfacer
- goconst
- gosimple
- staticcheck
- unparam
- unused
- misspell
- lll
- gas
- safesql
-```
-
-Run it:
-
-```
-$ cd example
-$ gometalinter ./...
-stutter.go:13::warning: unused struct field MyStruct.Unused (structcheck)
-stutter.go:9::warning: unused global variable unusedGlobal (varcheck)
-stutter.go:12:6:warning: exported type MyStruct should have comment or be unexported (golint)
-stutter.go:16:6:warning: exported type PublicUndocumented should have comment or be unexported (golint)
-stutter.go:8:1:warning: unusedGlobal is unused (deadcode)
-stutter.go:12:1:warning: MyStruct is unused (deadcode)
-stutter.go:16:1:warning: PublicUndocumented is unused (deadcode)
-stutter.go:20:1:warning: duplicateDefer is unused (deadcode)
-stutter.go:21:15:warning: error return value not checked (defer a.Close()) (errcheck)
-stutter.go:22:15:warning: error return value not checked (defer a.Close()) (errcheck)
-stutter.go:27:6:warning: error return value not checked (doit() // test for errcheck) (errcheck)
-stutter.go:29::error: unreachable code (vet)
-stutter.go:26::error: missing argument for Printf("%d"): format reads arg 1, have only 0 args (vet)
-```
-
-
-Gometalinter also supports the commonly seen `/...` recursive path
-format. Note that this can be *very* slow, and you may need to increase the linter `--deadline` to allow linters to complete.
-
-## FAQ
-
-### Exit status
-
-gometalinter sets two bits of the exit status to indicate different issues:
-
-| Bit | Meaning
-|-----|----------
-| 0 | A linter generated an issue.
-| 1 | An underlying error occurred; eg. a linter failed to execute. In this situation a warning will also be displayed.
-
-eg. linter only = 1, underlying only = 2, linter + underlying = 3
-
-### What's the best way to use `gometalinter` in CI?
-
-There are two main problems running in a CI:
-
-1. Linters break, causing `gometalinter --install --update` to error (this is no longer an issue as all linters are vendored).
-2. `gometalinter` adds a new linter.
-
-I have solved 1 by vendoring the linters.
-
-For 2, the best option is to disable all linters, then explicitly enable the
-ones you want:
-
- gometalinter --disable-all --enable=errcheck --enable=vet --enable=vetshadow ...
-
-### How do I make `gometalinter` work with Go 1.5 vendoring?
-
-`gometalinter` has a `--vendor` flag that just sets `GO15VENDOREXPERIMENT=1`, however the
-underlying tools must support it. Ensure that all of the linters are up to date and built with Go 1.5
-(`gometalinter --install --force`) then run `gometalinter --vendor .`. That should be it.
-
-### Why does `gometalinter --install` install a fork of gocyclo?
-
-I forked `gocyclo` because the upstream behaviour is to recursively check all
-subdirectories even when just a single directory is specified. This made it
-unusably slow when vendoring. The recursive behaviour can be achieved with
-gometalinter by explicitly specifying `/...`. There is a
-[pull request](https://github.com/fzipp/gocyclo/pull/1) open.
-
-### Gometalinter is not working
-
-That's more of a statement than a question, but okay.
-
-Sometimes gometalinter will not report issues that you think it should. There
-are three things to try in that case:
-
-#### 1. Update to the latest build of gometalinter and all linters
-
- go get -u github.com/alecthomas/gometalinter
- gometalinter --install
-
-If you're lucky, this will fix the problem.
-
-#### 2. Analyse the debug output
-
-If that doesn't help, the problem may be elsewhere (in no particular order):
-
-1. Upstream linter has changed its output or semantics.
-2. gometalinter is not invoking the tool correctly.
-3. gometalinter regular expression matches are not correct for a linter.
-4. Linter is exceeding the deadline.
-
-To find out what's going on run in debug mode:
-
- gometalinter --debug
-
-This will show all output from the linters and should indicate why it is
-failing.
-
-#### 3. Report an issue.
-
-Failing all else, if the problem looks like a bug please file an issue and
-include the output of `gometalinter --debug`.
-
-### How do I filter issues between two git refs?
-
-[revgrep](https://github.com/bradleyfalzon/revgrep) can be used to filter the output of `gometalinter`
-to show issues on lines that have changed between two git refs, such as unstaged changes, changes in
-`HEAD` vs `master` and between `master` and `origin/master`. See the project's documentation and `-help`
-usage for more information.
-
-```
-go get -u github.com/bradleyfalzon/revgrep/...
-gometalinter |& revgrep # If unstaged changes or untracked files, those issues are shown.
-gometalinter |& revgrep # Else show issues in the last commit.
-gometalinter |& revgrep master # Show issues between master and HEAD (or any other reference).
-gometalinter |& revgrep origin/master # Show issues that haven't been pushed.
-```
-
-## Checkstyle XML format
-
-`gometalinter` supports [checkstyle](http://checkstyle.sourceforge.net/)
-compatible XML output format. It is triggered with `--checkstyle` flag:
-
- gometalinter --checkstyle
-
-Checkstyle format can be used to integrate gometalinter with Jenkins CI with the
-help of [Checkstyle Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Checkstyle+Plugin).
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/README.md b/vendor/src/github.com/alecthomas/gometalinter/_linters/README.md
deleted file mode 100644
index d5f3e1303..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-This directory looks a bit like a normal vendor directory, but also like an
-entry in GOPATH. That is not an accident. It looks like the former so that gvt
-can be used to manage the vendored linters, and it looks like a GOPATH entry so
-that we can install the vendored binaries (as Go does not support installing
-binaries from vendored paths).
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/LICENSE.txt b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/LICENSE.txt
deleted file mode 100644
index 1756c7821..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/LICENSE.txt
+++ /dev/null
@@ -1,154 +0,0 @@
-Apache License
-
-Version 2.0, January 2004
-
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and
-distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright
-owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities
-that control, are controlled by, or are under common control with that entity.
-For the purposes of this definition, "control" means (i) the power, direct or
-indirect, to cause the direction or management of such entity, whether by
-contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
-outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising
-permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including
-but not limited to software source code, documentation source, and configuration
-files.
-
-"Object" form shall mean any form resulting from mechanical transformation or
-translation of a Source form, including but not limited to compiled object code,
-generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made
-available under the License, as indicated by a copyright notice that is included
-in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that
-is based on (or derived from) the Work and for which the editorial revisions,
-annotations, elaborations, or other modifications represent, as a whole, an
-original work of authorship. For the purposes of this License, Derivative Works
-shall not include works that remain separable from, or merely link (or bind by
-name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version
-of the Work and any modifications or additions to that Work or Derivative Works
-thereof, that is intentionally submitted to Licensor for inclusion in the Work
-by the copyright owner or by an individual or Legal Entity authorized to submit
-on behalf of the copyright owner. For the purposes of this definition,
-"submitted" means any form of electronic, verbal, or written communication sent
-to the Licensor or its representatives, including but not limited to
-communication on electronic mailing lists, source code control systems, and
-issue tracking systems that are managed by, or on behalf of, the Licensor for
-the purpose of discussing and improving the Work, but excluding communication
-that is conspicuously marked or otherwise designated in writing by the copyright
-owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
-of whom a Contribution has been received by Licensor and subsequently
-incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of this
-License, each Contributor hereby grants to You a perpetual, worldwide,
-non-exclusive, no-charge, royalty-free, irrevocable copyright license to
-reproduce, prepare Derivative Works of, publicly display, publicly perform,
-sublicense, and distribute the Work and such Derivative Works in Source or
-Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of this License,
-each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
-no-charge, royalty-free, irrevocable (except as stated in this section) patent
-license to make, have made, use, offer to sell, sell, import, and otherwise
-transfer the Work, where such license applies only to those patent claims
-licensable by such Contributor that are necessarily infringed by their
-Contribution(s) alone or by combination of their Contribution(s) with the Work
-to which such Contribution(s) was submitted. If You institute patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Work or a Contribution incorporated within the Work
-constitutes direct or contributory patent infringement, then any patent licenses
-granted to You under this License for that Work shall terminate as of the date
-such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the Work or
-Derivative Works thereof in any medium, with or without modifications, and in
-Source or Object form, provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of
-this License; and You must cause any modified files to carry prominent notices
-stating that You changed the files; and You must retain, in the Source form of
-any Derivative Works that You distribute, all copyright, patent, trademark, and
-attribution notices from the Source form of the Work, excluding those notices
-that do not pertain to any part of the Derivative Works; and If the Work
-includes a "NOTICE" text file as part of its distribution, then any Derivative
-Works that You distribute must include a readable copy of the attribution
-notices contained within such NOTICE file, excluding those notices that do not
-pertain to any part of the Derivative Works, in at least one of the following
-places: within a NOTICE text file distributed as part of the Derivative Works;
-within the Source form or documentation, if provided along with the Derivative
-Works; or, within a display generated by the Derivative Works, if and wherever
-such third-party notices normally appear. The contents of the NOTICE file are
-for informational purposes only and do not modify the License. You may add Your
-own attribution notices within Derivative Works that You distribute, alongside
-or as an addendum to the NOTICE text from the Work, provided that such
-additional attribution notices cannot be construed as modifying the License.
-
-You may add Your own copyright statement to Your modifications and may provide
-additional or different license terms and conditions for use, reproduction, or
-distribution of Your modifications, or for any such Derivative Works as a whole,
-provided Your use, reproduction, and distribution of the Work otherwise complies
-with the conditions stated in this License. 5. Submission of Contributions.
-Unless You explicitly state otherwise, any Contribution intentionally submitted
-for inclusion in the Work by You to the Licensor shall be under the terms and
-conditions of this License, without any additional terms or conditions.
-Notwithstanding the above, nothing herein shall supersede or modify the terms of
-any separate license agreement you may have executed with Licensor regarding
-such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade names,
-trademarks, service marks, or product names of the Licensor, except as required
-for reasonable and customary use in describing the origin of the Work and
-reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in
-writing, Licensor provides the Work (and each Contributor provides its
-Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied, including, without limitation, any warranties
-or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-PARTICULAR PURPOSE. You are solely responsible for determining the
-appropriateness of using or redistributing the Work and assume any risks
-associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory, whether in
-tort (including negligence), contract, or otherwise, unless required by
-applicable law (such as deliberate and grossly negligent acts) or agreed to in
-writing, shall any Contributor be liable to You for damages, including any
-direct, indirect, special, incidental, or consequential damages of any character
-arising as a result of this License or out of the use or inability to use the
-Work (including but not limited to damages for loss of goodwill, work stoppage,
-computer failure or malfunction, or any and all other commercial damages or
-losses), even if such Contributor has been advised of the possibility of such
-damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing the Work or
-Derivative Works thereof, You may choose to offer, and charge a fee for,
-acceptance of support, warranty, indemnity, or other liability obligations
-and/or rights consistent with this License. However, in accepting such
-obligations, You may act only on Your own behalf and on Your sole
-responsibility, not on behalf of any other Contributor, and only if You agree to
-indemnify, defend, and hold each Contributor harmless for any liability incurred
-by, or claims asserted against, such Contributor by reason of your accepting any
-such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/analyzer.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/analyzer.go
deleted file mode 100644
index 116cf7836..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/analyzer.go
+++ /dev/null
@@ -1,235 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 core holds the central scanning logic used by GAS
-package core
-
-import (
- "go/ast"
- "go/importer"
- "go/parser"
- "go/token"
- "go/types"
- "log"
- "os"
- "path"
- "reflect"
- "strings"
-)
-
-// ImportInfo is used to track aliased and initialization only imports.
-type ImportInfo struct {
- Imported map[string]string
- Aliased map[string]string
- InitOnly map[string]bool
-}
-
-func NewImportInfo() *ImportInfo {
- return &ImportInfo{
- make(map[string]string),
- make(map[string]string),
- make(map[string]bool),
- }
-}
-
-// The Context is populated with data parsed from the source code as it is scanned.
-// It is passed through to all rule functions as they are called. Rules may use
-// this data in conjunction withe the encoutered AST node.
-type Context struct {
- FileSet *token.FileSet
- Comments ast.CommentMap
- Info *types.Info
- Pkg *types.Package
- Root *ast.File
- Config map[string]interface{}
- Imports *ImportInfo
-}
-
-// The Rule interface used by all rules supported by GAS.
-type Rule interface {
- Match(ast.Node, *Context) (*Issue, error)
-}
-
-// A RuleSet maps lists of rules to the type of AST node they should be run on.
-// The anaylzer will only invoke rules contained in the list associated with the
-// type of AST node it is currently visiting.
-type RuleSet map[reflect.Type][]Rule
-
-// Metrics used when reporting information about a scanning run.
-type Metrics struct {
- NumFiles int `json:"files"`
- NumLines int `json:"lines"`
- NumNosec int `json:"nosec"`
- NumFound int `json:"found"`
-}
-
-// The Analyzer object is the main object of GAS. It has methods traverse an AST
-// and invoke the correct checking rules as on each node as required.
-type Analyzer struct {
- ignoreNosec bool
- ruleset RuleSet
- context *Context
- logger *log.Logger
- Issues []*Issue `json:"issues"`
- Stats *Metrics `json:"metrics"`
-}
-
-// NewAnalyzer builds a new anaylzer.
-func NewAnalyzer(conf map[string]interface{}, logger *log.Logger) Analyzer {
- if logger == nil {
- logger = log.New(os.Stdout, "[gas]", 0)
- }
- a := Analyzer{
- ignoreNosec: conf["ignoreNosec"].(bool),
- ruleset: make(RuleSet),
- context: &Context{nil, nil, nil, nil, nil, nil, nil},
- logger: logger,
- Issues: make([]*Issue, 0, 16),
- Stats: &Metrics{0, 0, 0, 0},
- }
-
- // TODO(tkelsey): use the inc/exc lists
-
- return a
-}
-
-func (gas *Analyzer) process(filename string, source interface{}) error {
- mode := parser.ParseComments
- gas.context.FileSet = token.NewFileSet()
- root, err := parser.ParseFile(gas.context.FileSet, filename, source, mode)
- if err == nil {
- gas.context.Comments = ast.NewCommentMap(gas.context.FileSet, root, root.Comments)
- gas.context.Root = root
-
- // here we get type info
- gas.context.Info = &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- Scopes: make(map[ast.Node]*types.Scope),
- Implicits: make(map[ast.Node]types.Object),
- }
-
- conf := types.Config{Importer: importer.Default()}
- gas.context.Pkg, err = conf.Check("pkg", gas.context.FileSet, []*ast.File{root}, gas.context.Info)
- if err != nil {
- // TODO(gm) Type checker not currently considering all files within a package
- // see: issue #113
- gas.logger.Printf(`Error during type checking: "%s"`, err)
- err = nil
- }
-
- gas.context.Imports = NewImportInfo()
- for _, pkg := range gas.context.Pkg.Imports() {
- gas.context.Imports.Imported[pkg.Path()] = pkg.Name()
- }
- ast.Walk(gas, root)
- gas.Stats.NumFiles++
- }
- return err
-}
-
-// AddRule adds a rule into a rule set list mapped to the given AST node's type.
-// The node is only needed for its type and is not otherwise used.
-func (gas *Analyzer) AddRule(r Rule, nodes []ast.Node) {
- for _, n := range nodes {
- t := reflect.TypeOf(n)
- if val, ok := gas.ruleset[t]; ok {
- gas.ruleset[t] = append(val, r)
- } else {
- gas.ruleset[t] = []Rule{r}
- }
- }
-}
-
-// Process reads in a source file, convert it to an AST and traverse it.
-// Rule methods added with AddRule will be invoked as necessary.
-func (gas *Analyzer) Process(filename string) error {
- err := gas.process(filename, nil)
- fun := func(f *token.File) bool {
- gas.Stats.NumLines += f.LineCount()
- return true
- }
- gas.context.FileSet.Iterate(fun)
- return err
-}
-
-// ProcessSource will convert a source code string into an AST and traverse it.
-// Rule methods added with AddRule will be invoked as necessary. The string is
-// identified by the filename given but no file IO will be done.
-func (gas *Analyzer) ProcessSource(filename string, source string) error {
- err := gas.process(filename, source)
- fun := func(f *token.File) bool {
- gas.Stats.NumLines += f.LineCount()
- return true
- }
- gas.context.FileSet.Iterate(fun)
- return err
-}
-
-// ignore a node (and sub-tree) if it is tagged with a "#nosec" comment
-func (gas *Analyzer) ignore(n ast.Node) bool {
- if groups, ok := gas.context.Comments[n]; ok && !gas.ignoreNosec {
- for _, group := range groups {
- if strings.Contains(group.Text(), "#nosec") {
- gas.Stats.NumNosec++
- return true
- }
- }
- }
- return false
-}
-
-// Visit runs the GAS visitor logic over an AST created by parsing go code.
-// Rule methods added with AddRule will be invoked as necessary.
-func (gas *Analyzer) Visit(n ast.Node) ast.Visitor {
- if !gas.ignore(n) {
-
- // Track aliased and initialization imports
- if imported, ok := n.(*ast.ImportSpec); ok {
- path := strings.Trim(imported.Path.Value, `"`)
- if imported.Name != nil {
- if imported.Name.Name == "_" {
- // Initialization import
- gas.context.Imports.InitOnly[path] = true
- } else {
- // Aliased import
- gas.context.Imports.Aliased[path] = imported.Name.Name
- }
- }
- // unsafe is not included in Package.Imports()
- if path == "unsafe" {
- gas.context.Imports.Imported[path] = path
- }
- }
-
- if val, ok := gas.ruleset[reflect.TypeOf(n)]; ok {
- for _, rule := range val {
- ret, err := rule.Match(n, gas.context)
- if err != nil {
- file, line := GetLocation(n, gas.context)
- file = path.Base(file)
- gas.logger.Printf("Rule error: %v => %s (%s:%d)\n", reflect.TypeOf(rule), err, file, line)
- }
- if ret != nil {
- gas.Issues = append(gas.Issues, ret)
- gas.Stats.NumFound++
- }
- }
- }
- return gas
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/call_list.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/call_list.go
deleted file mode 100644
index 200202456..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/call_list.go
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// 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 core
-
-import (
- "go/ast"
-)
-
-type set map[string]bool
-
-/// CallList is used to check for usage of specific packages
-/// and functions.
-type CallList map[string]set
-
-/// NewCallList creates a new empty CallList
-func NewCallList() CallList {
- return make(CallList)
-}
-
-/// AddAll will add several calls to the call list at once
-func (c CallList) AddAll(selector string, idents ...string) {
- for _, ident := range idents {
- c.Add(selector, ident)
- }
-}
-
-/// Add a selector and call to the call list
-func (c CallList) Add(selector, ident string) {
- if _, ok := c[selector]; !ok {
- c[selector] = make(set)
- }
- c[selector][ident] = true
-}
-
-/// Contains returns true if the package and function are
-/// members of this call list.
-func (c CallList) Contains(selector, ident string) bool {
- if idents, ok := c[selector]; ok {
- _, found := idents[ident]
- return found
- }
- return false
-}
-
-/// ContainsCallExpr resolves the call expression name and type
-/// or package and determines if it exists within the CallList
-func (c CallList) ContainsCallExpr(n ast.Node, ctx *Context) bool {
- selector, ident, err := GetCallInfo(n, ctx)
- if err != nil {
- return false
- }
- // Try direct resolution
- if c.Contains(selector, ident) {
- return true
- }
-
- // Also support explicit path
- if path, ok := GetImportPath(selector, ctx); ok {
- return c.Contains(path, ident)
- }
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/helpers.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/helpers.go
deleted file mode 100644
index 8ccfbbf2e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/helpers.go
+++ /dev/null
@@ -1,220 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 core
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "reflect"
- "regexp"
- "strconv"
- "strings"
-)
-
-// helpfull "canned" matching routines ----------------------------------------
-
-func selectName(n ast.Node, s reflect.Type) (string, bool) {
- t := reflect.TypeOf(&ast.SelectorExpr{})
- if node, ok := SimpleSelect(n, s, t).(*ast.SelectorExpr); ok {
- t = reflect.TypeOf(&ast.Ident{})
- if ident, ok := SimpleSelect(node.X, t).(*ast.Ident); ok {
- return strings.Join([]string{ident.Name, node.Sel.Name}, "."), ok
- }
- }
- return "", false
-}
-
-// MatchCall will match an ast.CallNode if its method name obays the given regex.
-func MatchCall(n ast.Node, r *regexp.Regexp) *ast.CallExpr {
- t := reflect.TypeOf(&ast.CallExpr{})
- if name, ok := selectName(n, t); ok && r.MatchString(name) {
- return n.(*ast.CallExpr)
- }
- return nil
-}
-
-// MatchCallByPackage ensures that the specified package is imported,
-// adjusts the name for any aliases and ignores cases that are
-// initialization only imports.
-//
-// Usage:
-// node, matched := MatchCallByPackage(n, ctx, "math/rand", "Read")
-//
-func MatchCallByPackage(n ast.Node, c *Context, pkg string, names ...string) (*ast.CallExpr, bool) {
-
- importedName, found := GetImportedName(pkg, c)
- if !found {
- return nil, false
- }
-
- if callExpr, ok := n.(*ast.CallExpr); ok {
- packageName, callName, err := GetCallInfo(callExpr, c)
- if err != nil {
- return nil, false
- }
- if packageName == importedName {
- for _, name := range names {
- if callName == name {
- return callExpr, true
- }
- }
- }
- }
- return nil, false
-}
-
-// MatchCallByType ensures that the node is a call expression to a
-// specific object type.
-//
-// Usage:
-// node, matched := MatchCallByType(n, ctx, "bytes.Buffer", "WriteTo", "Write")
-//
-func MatchCallByType(n ast.Node, ctx *Context, requiredType string, calls ...string) (*ast.CallExpr, bool) {
- if callExpr, ok := n.(*ast.CallExpr); ok {
- typeName, callName, err := GetCallInfo(callExpr, ctx)
- if err != nil {
- return nil, false
- }
- if typeName == requiredType {
- for _, call := range calls {
- if call == callName {
- return callExpr, true
- }
- }
- }
- }
- return nil, false
-}
-
-// MatchCompLit will match an ast.CompositeLit if its string value obays the given regex.
-func MatchCompLit(n ast.Node, r *regexp.Regexp) *ast.CompositeLit {
- t := reflect.TypeOf(&ast.CompositeLit{})
- if name, ok := selectName(n, t); ok && r.MatchString(name) {
- return n.(*ast.CompositeLit)
- }
- return nil
-}
-
-// GetInt will read and return an integer value from an ast.BasicLit
-func GetInt(n ast.Node) (int64, error) {
- if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.INT {
- return strconv.ParseInt(node.Value, 0, 64)
- }
- return 0, fmt.Errorf("Unexpected AST node type: %T", n)
-}
-
-// GetInt will read and return a float value from an ast.BasicLit
-func GetFloat(n ast.Node) (float64, error) {
- if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.FLOAT {
- return strconv.ParseFloat(node.Value, 64)
- }
- return 0.0, fmt.Errorf("Unexpected AST node type: %T", n)
-}
-
-// GetInt will read and return a char value from an ast.BasicLit
-func GetChar(n ast.Node) (byte, error) {
- if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.CHAR {
- return node.Value[0], nil
- }
- return 0, fmt.Errorf("Unexpected AST node type: %T", n)
-}
-
-// GetInt will read and return a string value from an ast.BasicLit
-func GetString(n ast.Node) (string, error) {
- if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.STRING {
- return strconv.Unquote(node.Value)
- }
- return "", fmt.Errorf("Unexpected AST node type: %T", n)
-}
-
-// GetCallObject returns the object and call expression and associated
-// object for a given AST node. nil, nil will be returned if the
-// object cannot be resolved.
-func GetCallObject(n ast.Node, ctx *Context) (*ast.CallExpr, types.Object) {
- switch node := n.(type) {
- case *ast.CallExpr:
- switch fn := node.Fun.(type) {
- case *ast.Ident:
- return node, ctx.Info.Uses[fn]
- case *ast.SelectorExpr:
- return node, ctx.Info.Uses[fn.Sel]
- }
- }
- return nil, nil
-}
-
-// GetCallInfo returns the package or type and name associated with a
-// call expression.
-func GetCallInfo(n ast.Node, ctx *Context) (string, string, error) {
- switch node := n.(type) {
- case *ast.CallExpr:
- switch fn := node.Fun.(type) {
- case *ast.SelectorExpr:
- switch expr := fn.X.(type) {
- case *ast.Ident:
- if expr.Obj != nil && expr.Obj.Kind == ast.Var {
- t := ctx.Info.TypeOf(expr)
- if t != nil {
- return t.String(), fn.Sel.Name, nil
- } else {
- return "undefined", fn.Sel.Name, fmt.Errorf("missing type info")
- }
- } else {
- return expr.Name, fn.Sel.Name, nil
- }
- }
- case *ast.Ident:
- return ctx.Pkg.Name(), fn.Name, nil
- }
- }
- return "", "", fmt.Errorf("unable to determine call info")
-}
-
-// GetImportedName returns the name used for the package within the
-// code. It will resolve aliases and ignores initalization only imports.
-func GetImportedName(path string, ctx *Context) (string, bool) {
- importName, imported := ctx.Imports.Imported[path]
- if !imported {
- return "", false
- }
-
- if _, initonly := ctx.Imports.InitOnly[path]; initonly {
- return "", false
- }
-
- if alias, ok := ctx.Imports.Aliased[path]; ok {
- importName = alias
- }
- return importName, true
-}
-
-// GetImportPath resolves the full import path of an identifer based on
-// the imports in the current context.
-func GetImportPath(name string, ctx *Context) (string, bool) {
- for path, _ := range ctx.Imports.Imported {
- if imported, ok := GetImportedName(path, ctx); ok && imported == name {
- return path, true
- }
- }
- return "", false
-}
-
-// GetLocation returns the filename and line number of an ast.Node
-func GetLocation(n ast.Node, ctx *Context) (string, int) {
- fobj := ctx.FileSet.File(n.Pos())
- return fobj.Name(), fobj.Line(n.Pos())
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/issue.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/issue.go
deleted file mode 100644
index 22c504487..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/issue.go
+++ /dev/null
@@ -1,108 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 core
-
-import (
- "encoding/json"
- "fmt"
- "go/ast"
- "os"
-)
-
-// Score type used by severity and confidence values
-type Score int
-
-const (
- Low Score = iota // Low value
- Medium // Medium value
- High // High value
-)
-
-// An Issue is returnd by a GAS rule if it discovers an issue with the scanned code.
-type Issue struct {
- Severity Score `json:"severity"` // issue severity (how problematic it is)
- Confidence Score `json:"confidence"` // issue confidence (how sure we are we found it)
- What string `json:"details"` // Human readable explanation
- File string `json:"file"` // File name we found it in
- Code string `json:"code"` // Impacted code line
- Line int `json:"line"` // Line number in file
-}
-
-// MetaData is embedded in all GAS rules. The Severity, Confidence and What message
-// will be passed tbhrough to reported issues.
-type MetaData struct {
- Severity Score
- Confidence Score
- What string
-}
-
-// MarshalJSON is used convert a Score object into a JSON representation
-func (c Score) MarshalJSON() ([]byte, error) {
- return json.Marshal(c.String())
-}
-
-// String converts a Score into a string
-func (c Score) String() string {
- switch c {
- case High:
- return "HIGH"
- case Medium:
- return "MEDIUM"
- case Low:
- return "LOW"
- }
- return "UNDEFINED"
-}
-
-func codeSnippet(file *os.File, start int64, end int64, n ast.Node) (string, error) {
- if n == nil {
- return "", fmt.Errorf("Invalid AST node provided")
- }
-
- size := (int)(end - start) // Go bug, os.File.Read should return int64 ...
- file.Seek(start, 0)
-
- buf := make([]byte, size)
- if nread, err := file.Read(buf); err != nil || nread != size {
- return "", fmt.Errorf("Unable to read code")
- }
- return string(buf), nil
-}
-
-// NewIssue creates a new Issue
-func NewIssue(ctx *Context, node ast.Node, desc string, severity Score, confidence Score) *Issue {
- var code string
- fobj := ctx.FileSet.File(node.Pos())
- name := fobj.Name()
- line := fobj.Line(node.Pos())
-
- if file, err := os.Open(fobj.Name()); err == nil {
- defer file.Close()
- s := (int64)(fobj.Position(node.Pos()).Offset) // Go bug, should be int64
- e := (int64)(fobj.Position(node.End()).Offset) // Go bug, should be int64
- code, err = codeSnippet(file, s, e, node)
- if err != nil {
- code = err.Error()
- }
- }
-
- return &Issue{
- File: name,
- Line: line,
- What: desc,
- Confidence: confidence,
- Severity: severity,
- Code: code,
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/resolve.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/resolve.go
deleted file mode 100644
index 185df7ac5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/resolve.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 core
-
-import "go/ast"
-
-func resolveIdent(n *ast.Ident, c *Context) bool {
- if n.Obj == nil || n.Obj.Kind != ast.Var {
- return true
- }
- if node, ok := n.Obj.Decl.(ast.Node); ok {
- return TryResolve(node, c)
- }
- return false
-}
-
-func resolveAssign(n *ast.AssignStmt, c *Context) bool {
- for _, arg := range n.Rhs {
- if !TryResolve(arg, c) {
- return false
- }
- }
- return true
-}
-
-func resolveCompLit(n *ast.CompositeLit, c *Context) bool {
- for _, arg := range n.Elts {
- if !TryResolve(arg, c) {
- return false
- }
- }
- return true
-}
-
-func resolveBinExpr(n *ast.BinaryExpr, c *Context) bool {
- return (TryResolve(n.X, c) && TryResolve(n.Y, c))
-}
-
-func resolveCallExpr(n *ast.CallExpr, c *Context) bool {
- // TODO(tkelsey): next step, full function resolution
- return false
-}
-
-// TryResolve will attempt, given a subtree starting at some ATS node, to resolve
-// all values contained within to a known constant. It is used to check for any
-// unkown values in compound expressions.
-func TryResolve(n ast.Node, c *Context) bool {
- switch node := n.(type) {
- case *ast.BasicLit:
- return true
-
- case *ast.CompositeLit:
- return resolveCompLit(node, c)
-
- case *ast.Ident:
- return resolveIdent(node, c)
-
- case *ast.AssignStmt:
- return resolveAssign(node, c)
-
- case *ast.CallExpr:
- return resolveCallExpr(node, c)
-
- case *ast.BinaryExpr:
- return resolveBinExpr(node, c)
- }
-
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/select.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/select.go
deleted file mode 100644
index e11c946e2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/core/select.go
+++ /dev/null
@@ -1,404 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 core
-
-import (
- "fmt"
- "go/ast"
- "reflect"
-)
-
-// SelectFunc is like an AST visitor, but has a richer interface. It
-// is called with the current ast.Node being visitied and that nodes depth in
-// the tree. The function can return true to continue traversing the tree, or
-// false to end traversal here.
-type SelectFunc func(ast.Node, int) bool
-
-func walkIdentList(list []*ast.Ident, depth int, fun SelectFunc) {
- for _, x := range list {
- depthWalk(x, depth, fun)
- }
-}
-
-func walkExprList(list []ast.Expr, depth int, fun SelectFunc) {
- for _, x := range list {
- depthWalk(x, depth, fun)
- }
-}
-
-func walkStmtList(list []ast.Stmt, depth int, fun SelectFunc) {
- for _, x := range list {
- depthWalk(x, depth, fun)
- }
-}
-
-func walkDeclList(list []ast.Decl, depth int, fun SelectFunc) {
- for _, x := range list {
- depthWalk(x, depth, fun)
- }
-}
-
-func depthWalk(node ast.Node, depth int, fun SelectFunc) {
- if !fun(node, depth) {
- return
- }
-
- switch n := node.(type) {
- // Comments and fields
- case *ast.Comment:
-
- case *ast.CommentGroup:
- for _, c := range n.List {
- depthWalk(c, depth+1, fun)
- }
-
- case *ast.Field:
- if n.Doc != nil {
- depthWalk(n.Doc, depth+1, fun)
- }
- walkIdentList(n.Names, depth+1, fun)
- depthWalk(n.Type, depth+1, fun)
- if n.Tag != nil {
- depthWalk(n.Tag, depth+1, fun)
- }
- if n.Comment != nil {
- depthWalk(n.Comment, depth+1, fun)
- }
-
- case *ast.FieldList:
- for _, f := range n.List {
- depthWalk(f, depth+1, fun)
- }
-
- // Expressions
- case *ast.BadExpr, *ast.Ident, *ast.BasicLit:
-
- case *ast.Ellipsis:
- if n.Elt != nil {
- depthWalk(n.Elt, depth+1, fun)
- }
-
- case *ast.FuncLit:
- depthWalk(n.Type, depth+1, fun)
- depthWalk(n.Body, depth+1, fun)
-
- case *ast.CompositeLit:
- if n.Type != nil {
- depthWalk(n.Type, depth+1, fun)
- }
- walkExprList(n.Elts, depth+1, fun)
-
- case *ast.ParenExpr:
- depthWalk(n.X, depth+1, fun)
-
- case *ast.SelectorExpr:
- depthWalk(n.X, depth+1, fun)
- depthWalk(n.Sel, depth+1, fun)
-
- case *ast.IndexExpr:
- depthWalk(n.X, depth+1, fun)
- depthWalk(n.Index, depth+1, fun)
-
- case *ast.SliceExpr:
- depthWalk(n.X, depth+1, fun)
- if n.Low != nil {
- depthWalk(n.Low, depth+1, fun)
- }
- if n.High != nil {
- depthWalk(n.High, depth+1, fun)
- }
- if n.Max != nil {
- depthWalk(n.Max, depth+1, fun)
- }
-
- case *ast.TypeAssertExpr:
- depthWalk(n.X, depth+1, fun)
- if n.Type != nil {
- depthWalk(n.Type, depth+1, fun)
- }
-
- case *ast.CallExpr:
- depthWalk(n.Fun, depth+1, fun)
- walkExprList(n.Args, depth+1, fun)
-
- case *ast.StarExpr:
- depthWalk(n.X, depth+1, fun)
-
- case *ast.UnaryExpr:
- depthWalk(n.X, depth+1, fun)
-
- case *ast.BinaryExpr:
- depthWalk(n.X, depth+1, fun)
- depthWalk(n.Y, depth+1, fun)
-
- case *ast.KeyValueExpr:
- depthWalk(n.Key, depth+1, fun)
- depthWalk(n.Value, depth+1, fun)
-
- // Types
- case *ast.ArrayType:
- if n.Len != nil {
- depthWalk(n.Len, depth+1, fun)
- }
- depthWalk(n.Elt, depth+1, fun)
-
- case *ast.StructType:
- depthWalk(n.Fields, depth+1, fun)
-
- case *ast.FuncType:
- if n.Params != nil {
- depthWalk(n.Params, depth+1, fun)
- }
- if n.Results != nil {
- depthWalk(n.Results, depth+1, fun)
- }
-
- case *ast.InterfaceType:
- depthWalk(n.Methods, depth+1, fun)
-
- case *ast.MapType:
- depthWalk(n.Key, depth+1, fun)
- depthWalk(n.Value, depth+1, fun)
-
- case *ast.ChanType:
- depthWalk(n.Value, depth+1, fun)
-
- // Statements
- case *ast.BadStmt:
-
- case *ast.DeclStmt:
- depthWalk(n.Decl, depth+1, fun)
-
- case *ast.EmptyStmt:
-
- case *ast.LabeledStmt:
- depthWalk(n.Label, depth+1, fun)
- depthWalk(n.Stmt, depth+1, fun)
-
- case *ast.ExprStmt:
- depthWalk(n.X, depth+1, fun)
-
- case *ast.SendStmt:
- depthWalk(n.Chan, depth+1, fun)
- depthWalk(n.Value, depth+1, fun)
-
- case *ast.IncDecStmt:
- depthWalk(n.X, depth+1, fun)
-
- case *ast.AssignStmt:
- walkExprList(n.Lhs, depth+1, fun)
- walkExprList(n.Rhs, depth+1, fun)
-
- case *ast.GoStmt:
- depthWalk(n.Call, depth+1, fun)
-
- case *ast.DeferStmt:
- depthWalk(n.Call, depth+1, fun)
-
- case *ast.ReturnStmt:
- walkExprList(n.Results, depth+1, fun)
-
- case *ast.BranchStmt:
- if n.Label != nil {
- depthWalk(n.Label, depth+1, fun)
- }
-
- case *ast.BlockStmt:
- walkStmtList(n.List, depth+1, fun)
-
- case *ast.IfStmt:
- if n.Init != nil {
- depthWalk(n.Init, depth+1, fun)
- }
- depthWalk(n.Cond, depth+1, fun)
- depthWalk(n.Body, depth+1, fun)
- if n.Else != nil {
- depthWalk(n.Else, depth+1, fun)
- }
-
- case *ast.CaseClause:
- walkExprList(n.List, depth+1, fun)
- walkStmtList(n.Body, depth+1, fun)
-
- case *ast.SwitchStmt:
- if n.Init != nil {
- depthWalk(n.Init, depth+1, fun)
- }
- if n.Tag != nil {
- depthWalk(n.Tag, depth+1, fun)
- }
- depthWalk(n.Body, depth+1, fun)
-
- case *ast.TypeSwitchStmt:
- if n.Init != nil {
- depthWalk(n.Init, depth+1, fun)
- }
- depthWalk(n.Assign, depth+1, fun)
- depthWalk(n.Body, depth+1, fun)
-
- case *ast.CommClause:
- if n.Comm != nil {
- depthWalk(n.Comm, depth+1, fun)
- }
- walkStmtList(n.Body, depth+1, fun)
-
- case *ast.SelectStmt:
- depthWalk(n.Body, depth+1, fun)
-
- case *ast.ForStmt:
- if n.Init != nil {
- depthWalk(n.Init, depth+1, fun)
- }
- if n.Cond != nil {
- depthWalk(n.Cond, depth+1, fun)
- }
- if n.Post != nil {
- depthWalk(n.Post, depth+1, fun)
- }
- depthWalk(n.Body, depth+1, fun)
-
- case *ast.RangeStmt:
- if n.Key != nil {
- depthWalk(n.Key, depth+1, fun)
- }
- if n.Value != nil {
- depthWalk(n.Value, depth+1, fun)
- }
- depthWalk(n.X, depth+1, fun)
- depthWalk(n.Body, depth+1, fun)
-
- // Declarations
- case *ast.ImportSpec:
- if n.Doc != nil {
- depthWalk(n.Doc, depth+1, fun)
- }
- if n.Name != nil {
- depthWalk(n.Name, depth+1, fun)
- }
- depthWalk(n.Path, depth+1, fun)
- if n.Comment != nil {
- depthWalk(n.Comment, depth+1, fun)
- }
-
- case *ast.ValueSpec:
- if n.Doc != nil {
- depthWalk(n.Doc, depth+1, fun)
- }
- walkIdentList(n.Names, depth+1, fun)
- if n.Type != nil {
- depthWalk(n.Type, depth+1, fun)
- }
- walkExprList(n.Values, depth+1, fun)
- if n.Comment != nil {
- depthWalk(n.Comment, depth+1, fun)
- }
-
- case *ast.TypeSpec:
- if n.Doc != nil {
- depthWalk(n.Doc, depth+1, fun)
- }
- depthWalk(n.Name, depth+1, fun)
- depthWalk(n.Type, depth+1, fun)
- if n.Comment != nil {
- depthWalk(n.Comment, depth+1, fun)
- }
-
- case *ast.BadDecl:
-
- case *ast.GenDecl:
- if n.Doc != nil {
- depthWalk(n.Doc, depth+1, fun)
- }
- for _, s := range n.Specs {
- depthWalk(s, depth+1, fun)
- }
-
- case *ast.FuncDecl:
- if n.Doc != nil {
- depthWalk(n.Doc, depth+1, fun)
- }
- if n.Recv != nil {
- depthWalk(n.Recv, depth+1, fun)
- }
- depthWalk(n.Name, depth+1, fun)
- depthWalk(n.Type, depth+1, fun)
- if n.Body != nil {
- depthWalk(n.Body, depth+1, fun)
- }
-
- // Files and packages
- case *ast.File:
- if n.Doc != nil {
- depthWalk(n.Doc, depth+1, fun)
- }
- depthWalk(n.Name, depth+1, fun)
- walkDeclList(n.Decls, depth+1, fun)
- // don't walk n.Comments - they have been
- // visited already through the individual
- // nodes
-
- case *ast.Package:
- for _, f := range n.Files {
- depthWalk(f, depth+1, fun)
- }
-
- default:
- panic(fmt.Sprintf("gas.depthWalk: unexpected node type %T", n))
- }
-}
-
-type Selector interface {
- Final(ast.Node)
- Partial(ast.Node) bool
-}
-
-func Select(s Selector, n ast.Node, bits ...reflect.Type) {
- fun := func(n ast.Node, d int) bool {
- if d < len(bits) && reflect.TypeOf(n) == bits[d] {
- if d == len(bits)-1 {
- s.Final(n)
- return false
- } else if s.Partial(n) {
- return true
- }
- }
- return false
- }
- depthWalk(n, 0, fun)
-}
-
-// SimpleSelect will try to match a path through a sub-tree starting at a given AST node.
-// The type of each node in the path at a given depth must match its entry in list of
-// node types given.
-func SimpleSelect(n ast.Node, bits ...reflect.Type) ast.Node {
- var found ast.Node
- fun := func(n ast.Node, d int) bool {
- if found != nil {
- return false // short cut logic if we have found a match
- }
-
- if d < len(bits) && reflect.TypeOf(n) == bits[d] {
- if d == len(bits)-1 {
- found = n
- return false
- }
- return true
- }
- return false
- }
-
- depthWalk(n, 0, fun)
- return found
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/filelist.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/filelist.go
deleted file mode 100644
index ac767ed27..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/filelist.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 main
-
-import (
- "sort"
- "strings"
-
- "github.com/ryanuber/go-glob"
-)
-
-// fileList uses a map for patterns to ensure each pattern only
-// appears once
-type fileList struct {
- patterns map[string]struct{}
-}
-
-func newFileList(paths ...string) *fileList {
- f := &fileList{
- patterns: make(map[string]struct{}),
- }
- for _, p := range paths {
- f.patterns[p] = struct{}{}
- }
- return f
-}
-
-func (f *fileList) String() string {
- ps := make([]string, 0, len(f.patterns))
- for p := range f.patterns {
- ps = append(ps, p)
- }
- sort.Strings(ps)
- return strings.Join(ps, ", ")
-}
-
-func (f *fileList) Set(path string) error {
- if path == "" {
- // don't bother adding the empty path
- return nil
- }
- f.patterns[path] = struct{}{}
- return nil
-}
-
-func (f fileList) Contains(path string) bool {
- for p := range f.patterns {
- if strings.Contains(p, glob.GLOB) {
- if glob.Glob(p, path) {
- if logger != nil {
- logger.Printf("skipping: %s\n", path)
- }
- return true
- }
- } else {
- // check if only a sub-folder of the path is excluded
- if strings.Contains(path, p) {
- if logger != nil {
- logger.Printf("skipping: %s\n", path)
- }
- return true
- }
-
- }
- }
- return false
-}
-
-/*
-func (f fileList) Dump() {
- for k, _ := range f.paths {
- println(k)
- }
-}
-*/
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/main.go
deleted file mode 100644
index 1f8d7740b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/main.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 main
-
-import (
- "encoding/json"
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "sort"
- "strings"
-
- gas "github.com/GoASTScanner/gas/core"
- "github.com/GoASTScanner/gas/output"
-)
-
-type recursion bool
-
-const (
- recurse recursion = true
- noRecurse recursion = false
-)
-
-var (
- // #nosec flag
- flagIgnoreNoSec = flag.Bool("nosec", false, "Ignores #nosec comments when set")
-
- // format output
- flagFormat = flag.String("fmt", "text", "Set output format. Valid options are: json, csv, html, or text")
-
- // output file
- flagOutput = flag.String("out", "", "Set output file for results")
-
- // config file
- flagConfig = flag.String("conf", "", "Path to optional config file")
-
- // quiet
- flagQuiet = flag.Bool("quiet", false, "Only show output when errors are found")
-
- usageText = `
-GAS - Go AST Scanner
-
-Gas analyzes Go source code to look for common programming mistakes that
-can lead to security problems.
-
-USAGE:
-
- # Check a single Go file
- $ gas example.go
-
- # Check all files under the current directory and save results in
- # json format.
- $ gas -fmt=json -out=results.json ./...
-
- # Run a specific set of rules (by default all rules will be run):
- $ gas -include=G101,G203,G401 ./...
-
- # Run all rules except the provided
- $ gas -exclude=G101 ./...
-
-`
-
- logger *log.Logger
-)
-
-func extendConfList(conf map[string]interface{}, name string, inputStr string) {
- if inputStr == "" {
- conf[name] = []string{}
- } else {
- input := strings.Split(inputStr, ",")
- if val, ok := conf[name]; ok {
- if data, ok := val.(*[]string); ok {
- conf[name] = append(*data, input...)
- } else {
- logger.Fatal("Config item must be a string list: ", name)
- }
- } else {
- conf[name] = input
- }
- }
-}
-
-func buildConfig(incRules string, excRules string) map[string]interface{} {
- config := make(map[string]interface{})
- if flagConfig != nil && *flagConfig != "" { // parse config if we have one
- if data, err := ioutil.ReadFile(*flagConfig); err == nil {
- if err := json.Unmarshal(data, &(config)); err != nil {
- logger.Fatal("Could not parse JSON config: ", *flagConfig, ": ", err)
- }
- } else {
- logger.Fatal("Could not read config file: ", *flagConfig)
- }
- }
-
- // add in CLI include and exclude data
- extendConfList(config, "include", incRules)
- extendConfList(config, "exclude", excRules)
-
- // override ignoreNosec if given on CLI
- if flagIgnoreNoSec != nil {
- config["ignoreNosec"] = *flagIgnoreNoSec
- } else {
- val, ok := config["ignoreNosec"]
- if !ok {
- config["ignoreNosec"] = false
- } else if _, ok := val.(bool); !ok {
- logger.Fatal("Config value must be a bool: 'ignoreNosec'")
- }
- }
-
- return config
-}
-
-// #nosec
-func usage() {
-
- fmt.Fprintln(os.Stderr, usageText)
- fmt.Fprint(os.Stderr, "OPTIONS:\n\n")
- flag.PrintDefaults()
- fmt.Fprint(os.Stderr, "\n\nRULES:\n\n")
-
- // sorted rule list for eas of reading
- rl := GetFullRuleList()
- keys := make([]string, 0, len(rl))
- for key := range rl {
- keys = append(keys, key)
- }
- sort.Strings(keys)
- for _, k := range keys {
- v := rl[k]
- fmt.Fprintf(os.Stderr, "\t%s: %s\n", k, v.description)
- }
- fmt.Fprint(os.Stderr, "\n")
-}
-
-func main() {
-
- // Setup usage description
- flag.Usage = usage
-
- // Exclude files
- excluded := newFileList("*_test.go")
- flag.Var(excluded, "skip", "File pattern to exclude from scan. Uses simple * globs and requires full or partial match")
-
- incRules := ""
- flag.StringVar(&incRules, "include", "", "Comma separated list of rules IDs to include. (see rule list)")
-
- excRules := ""
- flag.StringVar(&excRules, "exclude", "", "Comma separated list of rules IDs to exclude. (see rule list)")
-
- // Custom commands / utilities to run instead of default analyzer
- tools := newUtils()
- flag.Var(tools, "tool", "GAS utilities to assist with rule development")
-
- // Setup logging
- logger = log.New(os.Stderr, "[gas] ", log.LstdFlags)
-
- // Parse command line arguments
- flag.Parse()
-
- // Ensure at least one file was specified
- if flag.NArg() == 0 {
-
- fmt.Fprintf(os.Stderr, "\nError: FILE [FILE...] or './...' expected\n")
- flag.Usage()
- os.Exit(1)
- }
-
- // Run utils instead of analysis
- if len(tools.call) > 0 {
- tools.run(flag.Args()...)
- os.Exit(0)
- }
-
- // Setup analyzer
- config := buildConfig(incRules, excRules)
- analyzer := gas.NewAnalyzer(config, logger)
- AddRules(&analyzer, config)
-
- toAnalyze := getFilesToAnalyze(flag.Args(), excluded)
-
- for _, file := range toAnalyze {
- logger.Printf(`Processing "%s"...`, file)
- if err := analyzer.Process(file); err != nil {
- logger.Printf(`Failed to process: "%s"`, file)
- logger.Println(err)
- logger.Fatalf(`Halting execution.`)
- }
- }
-
- issuesFound := len(analyzer.Issues) > 0
- // Exit quietly if nothing was found
- if !issuesFound && *flagQuiet {
- os.Exit(0)
- }
-
- // Create output report
- if *flagOutput != "" {
- outfile, err := os.Create(*flagOutput)
- if err != nil {
- logger.Fatalf("Couldn't open: %s for writing. Reason - %s", *flagOutput, err)
- }
- defer outfile.Close()
- output.CreateReport(outfile, *flagFormat, &analyzer)
- } else {
- output.CreateReport(os.Stdout, *flagFormat, &analyzer)
- }
-
- // Do we have an issue? If so exit 1
- if issuesFound {
- os.Exit(1)
- }
-}
-
-// getFilesToAnalyze lists all files
-func getFilesToAnalyze(paths []string, excluded *fileList) []string {
- //log.Println("getFilesToAnalyze: start")
- var toAnalyze []string
- for _, relativePath := range paths {
- //log.Printf("getFilesToAnalyze: processing \"%s\"\n", path)
- // get the absolute path before doing anything else
- path, err := filepath.Abs(relativePath)
- if err != nil {
- log.Fatal(err)
- }
- if filepath.Base(relativePath) == "..." {
- toAnalyze = append(
- toAnalyze,
- listFiles(filepath.Dir(path), recurse, excluded)...,
- )
- } else {
- var (
- finfo os.FileInfo
- err error
- )
- if finfo, err = os.Stat(path); err != nil {
- logger.Fatal(err)
- }
- if !finfo.IsDir() {
- if shouldInclude(path, excluded) {
- toAnalyze = append(toAnalyze, path)
- }
- } else {
- toAnalyze = listFiles(path, noRecurse, excluded)
- }
- }
- }
- //log.Println("getFilesToAnalyze: end")
- return toAnalyze
-}
-
-// listFiles returns a list of all files found that pass the shouldInclude check.
-// If doRecursiveWalk it true, it will walk the tree rooted at absPath, otherwise it
-// will only include files directly within the dir referenced by absPath.
-func listFiles(absPath string, doRecursiveWalk recursion, excluded *fileList) []string {
- var files []string
-
- walk := func(path string, info os.FileInfo, err error) error {
- if info.IsDir() && doRecursiveWalk == noRecurse {
- return filepath.SkipDir
- }
- if shouldInclude(path, excluded) {
- files = append(files, path)
- }
- return nil
- }
-
- if err := filepath.Walk(absPath, walk); err != nil {
- log.Fatal(err)
- }
- return files
-}
-
-// shouldInclude checks if a specific path which is expected to reference
-// a regular file should be included
-func shouldInclude(path string, excluded *fileList) bool {
- return filepath.Ext(path) == ".go" && !excluded.Contains(path)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/output/formatter.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/output/formatter.go
deleted file mode 100644
index f10a973db..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/output/formatter.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 output
-
-import (
- "encoding/csv"
- "encoding/json"
- htmlTemplate "html/template"
- "io"
- "strconv"
- plainTemplate "text/template"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-// The output format for reported issues
-type ReportFormat int
-
-const (
- ReportText ReportFormat = iota // Plain text format
- ReportJSON // Json format
- ReportCSV // CSV format
-)
-
-var text = `Results:
-{{ range $index, $issue := .Issues }}
-[{{ $issue.File }}:{{ $issue.Line }}] - {{ $issue.What }} (Confidence: {{ $issue.Confidence}}, Severity: {{ $issue.Severity }})
- > {{ $issue.Code }}
-
-{{ end }}
-Summary:
- Files: {{.Stats.NumFiles}}
- Lines: {{.Stats.NumLines}}
- Nosec: {{.Stats.NumNosec}}
- Issues: {{.Stats.NumFound}}
-
-`
-
-func CreateReport(w io.Writer, format string, data *gas.Analyzer) error {
- var err error
- switch format {
- case "json":
- err = reportJSON(w, data)
- case "csv":
- err = reportCSV(w, data)
- case "html":
- err = reportFromHTMLTemplate(w, html, data)
- case "text":
- err = reportFromPlaintextTemplate(w, text, data)
- default:
- err = reportFromPlaintextTemplate(w, text, data)
- }
- return err
-}
-
-func reportJSON(w io.Writer, data *gas.Analyzer) error {
- raw, err := json.MarshalIndent(data, "", "\t")
- if err != nil {
- panic(err)
- }
-
- _, err = w.Write(raw)
- if err != nil {
- panic(err)
- }
- return err
-}
-
-func reportCSV(w io.Writer, data *gas.Analyzer) error {
- out := csv.NewWriter(w)
- defer out.Flush()
- for _, issue := range data.Issues {
- err := out.Write([]string{
- issue.File,
- strconv.Itoa(issue.Line),
- issue.What,
- issue.Severity.String(),
- issue.Confidence.String(),
- issue.Code,
- })
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-func reportFromPlaintextTemplate(w io.Writer, reportTemplate string, data *gas.Analyzer) error {
- t, e := plainTemplate.New("gas").Parse(reportTemplate)
- if e != nil {
- return e
- }
-
- return t.Execute(w, data)
-}
-
-func reportFromHTMLTemplate(w io.Writer, reportTemplate string, data *gas.Analyzer) error {
- t, e := htmlTemplate.New("gas").Parse(reportTemplate)
- if e != nil {
- return e
- }
-
- return t.Execute(w, data)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/output/template.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/output/template.go
deleted file mode 100644
index f7dd23676..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/output/template.go
+++ /dev/null
@@ -1,401 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 output
-
-const html = `
-
-
-
-
- Go AST Scanner
-
-
-
-
-
-
-
-
-
-
-
-`
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rulelist.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rulelist.go
deleted file mode 100644
index 285c1a1be..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rulelist.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 main
-
-import (
- "go/ast"
-
- gas "github.com/GoASTScanner/gas/core"
- "github.com/GoASTScanner/gas/rules"
-)
-
-type RuleInfo struct {
- description string
- build func(map[string]interface{}) (gas.Rule, []ast.Node)
-}
-
-// GetFullRuleList get the full list of all rules available to GAS
-func GetFullRuleList() map[string]RuleInfo {
- return map[string]RuleInfo{
- // misc
- "G101": RuleInfo{"Look for hardcoded credentials", rules.NewHardcodedCredentials},
- "G102": RuleInfo{"Bind to all interfaces", rules.NewBindsToAllNetworkInterfaces},
- "G103": RuleInfo{"Audit the use of unsafe block", rules.NewUsingUnsafe},
- "G104": RuleInfo{"Audit errors not checked", rules.NewNoErrorCheck},
- "G105": RuleInfo{"Audit the use of big.Exp function", rules.NewUsingBigExp},
-
- // injection
- "G201": RuleInfo{"SQL query construction using format string", rules.NewSqlStrFormat},
- "G202": RuleInfo{"SQL query construction using string concatenation", rules.NewSqlStrConcat},
- "G203": RuleInfo{"Use of unescaped data in HTML templates", rules.NewTemplateCheck},
- "G204": RuleInfo{"Audit use of command execution", rules.NewSubproc},
-
- // filesystem
- "G301": RuleInfo{"Poor file permissions used when creating a directory", rules.NewMkdirPerms},
- "G302": RuleInfo{"Poor file permisions used when creation file or using chmod", rules.NewFilePerms},
- "G303": RuleInfo{"Creating tempfile using a predictable path", rules.NewBadTempFile},
-
- // crypto
- "G401": RuleInfo{"Detect the usage of DES, RC4, or MD5", rules.NewUsesWeakCryptography},
- "G402": RuleInfo{"Look for bad TLS connection settings", rules.NewIntermediateTlsCheck},
- "G403": RuleInfo{"Ensure minimum RSA key length of 2048 bits", rules.NewWeakKeyStrength},
- "G404": RuleInfo{"Insecure random number source (rand)", rules.NewWeakRandCheck},
-
- // blacklist
- "G501": RuleInfo{"Import blacklist: crypto/md5", rules.NewBlacklist_crypto_md5},
- "G502": RuleInfo{"Import blacklist: crypto/des", rules.NewBlacklist_crypto_des},
- "G503": RuleInfo{"Import blacklist: crypto/rc4", rules.NewBlacklist_crypto_rc4},
- "G504": RuleInfo{"Import blacklist: net/http/cgi", rules.NewBlacklist_net_http_cgi},
- }
-}
-
-func AddRules(analyzer *gas.Analyzer, conf map[string]interface{}) {
- var all map[string]RuleInfo
-
- inc := conf["include"].([]string)
- exc := conf["exclude"].([]string)
-
- // add included rules
- if len(inc) == 0 {
- all = GetFullRuleList()
- } else {
- all = map[string]RuleInfo{}
- tmp := GetFullRuleList()
- for _, v := range inc {
- if val, ok := tmp[v]; ok {
- all[v] = val
- }
- }
- }
-
- // remove excluded rules
- for _, v := range exc {
- delete(all, v)
- }
-
- for _, v := range all {
- analyzer.AddRule(v.build(conf))
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/big.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/big.go
deleted file mode 100644
index 8ac0d421b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/big.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- gas "github.com/GoASTScanner/gas/core"
- "go/ast"
-)
-
-type UsingBigExp struct {
- gas.MetaData
- pkg string
- calls []string
-}
-
-func (r *UsingBigExp) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) {
- if _, matched := gas.MatchCallByType(n, c, r.pkg, r.calls...); matched {
- return gas.NewIssue(c, n, r.What, r.Severity, r.Confidence), nil
- }
- return nil, nil
-}
-func NewUsingBigExp(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &UsingBigExp{
- pkg: "*math/big.Int",
- calls: []string{"Exp"},
- MetaData: gas.MetaData{
- What: "Use of math/big.Int.Exp function should be audited for modulus == 0",
- Severity: gas.Low,
- Confidence: gas.High,
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/bind.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/bind.go
deleted file mode 100644
index ba91ba658..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/bind.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "go/ast"
- "regexp"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-// Looks for net.Listen("0.0.0.0") or net.Listen(":8080")
-type BindsToAllNetworkInterfaces struct {
- gas.MetaData
- call *regexp.Regexp
- pattern *regexp.Regexp
-}
-
-func (r *BindsToAllNetworkInterfaces) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) {
- if node := gas.MatchCall(n, r.call); node != nil {
- if arg, err := gas.GetString(node.Args[1]); err == nil {
- if r.pattern.MatchString(arg) {
- return gas.NewIssue(c, n, r.What, r.Severity, r.Confidence), nil
- }
- }
- }
- return
-}
-
-func NewBindsToAllNetworkInterfaces(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &BindsToAllNetworkInterfaces{
- call: regexp.MustCompile(`^(net|tls)\.Listen$`),
- pattern: regexp.MustCompile(`^(0.0.0.0|:).*$`),
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.High,
- What: "Binds to all network interfaces",
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/blacklist.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/blacklist.go
deleted file mode 100644
index 747eb4bca..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/blacklist.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "go/ast"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type BlacklistImport struct {
- gas.MetaData
- Path string
-}
-
-func (r *BlacklistImport) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) {
- if node, ok := n.(*ast.ImportSpec); ok {
- if r.Path == node.Path.Value && node.Name.String() != "_" {
- return gas.NewIssue(c, n, r.What, r.Severity, r.Confidence), nil
- }
- }
- return nil, nil
-}
-
-func NewBlacklist_crypto_md5(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &BlacklistImport{
- MetaData: gas.MetaData{
- Severity: gas.High,
- Confidence: gas.High,
- What: "Use of weak cryptographic primitive",
- },
- Path: `"crypto/md5"`,
- }, []ast.Node{(*ast.ImportSpec)(nil)}
-}
-
-func NewBlacklist_crypto_des(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &BlacklistImport{
- MetaData: gas.MetaData{
- Severity: gas.High,
- Confidence: gas.High,
- What: "Use of weak cryptographic primitive",
- },
- Path: `"crypto/des"`,
- }, []ast.Node{(*ast.ImportSpec)(nil)}
-}
-
-func NewBlacklist_crypto_rc4(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &BlacklistImport{
- MetaData: gas.MetaData{
- Severity: gas.High,
- Confidence: gas.High,
- What: "Use of weak cryptographic primitive",
- },
- Path: `"crypto/rc4"`,
- }, []ast.Node{(*ast.ImportSpec)(nil)}
-}
-
-func NewBlacklist_net_http_cgi(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &BlacklistImport{
- MetaData: gas.MetaData{
- Severity: gas.High,
- Confidence: gas.High,
- What: "Go versions < 1.6.3 are vulnerable to Httpoxy attack: (CVE-2016-5386)",
- },
- Path: `"net/http/cgi"`,
- }, []ast.Node{(*ast.ImportSpec)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/errors.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/errors.go
deleted file mode 100644
index 2bf61c928..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/errors.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- gas "github.com/GoASTScanner/gas/core"
- "go/ast"
- "go/types"
-)
-
-type NoErrorCheck struct {
- gas.MetaData
- whitelist gas.CallList
-}
-
-func returnsError(callExpr *ast.CallExpr, ctx *gas.Context) int {
- if tv := ctx.Info.TypeOf(callExpr); tv != nil {
- switch t := tv.(type) {
- case *types.Tuple:
- for pos := 0; pos < t.Len(); pos += 1 {
- variable := t.At(pos)
- if variable != nil && variable.Type().String() == "error" {
- return pos
- }
- }
- case *types.Named:
- if t.String() == "error" {
- return 0
- }
- }
- }
- return -1
-}
-
-func (r *NoErrorCheck) Match(n ast.Node, ctx *gas.Context) (*gas.Issue, error) {
- switch stmt := n.(type) {
- case *ast.AssignStmt:
- for _, expr := range stmt.Rhs {
- if callExpr, ok := expr.(*ast.CallExpr); ok && !r.whitelist.ContainsCallExpr(callExpr, ctx) {
- pos := returnsError(callExpr, ctx)
- if pos < 0 || pos >= len(stmt.Lhs) {
- return nil, nil
- }
- if id, ok := stmt.Lhs[pos].(*ast.Ident); ok && id.Name == "_" {
- return gas.NewIssue(ctx, n, r.What, r.Severity, r.Confidence), nil
- }
- }
- }
- case *ast.ExprStmt:
- if callExpr, ok := stmt.X.(*ast.CallExpr); ok && !r.whitelist.ContainsCallExpr(callExpr, ctx) {
- pos := returnsError(callExpr, ctx)
- if pos >= 0 {
- return gas.NewIssue(ctx, n, r.What, r.Severity, r.Confidence), nil
- }
- }
- }
- return nil, nil
-}
-
-func NewNoErrorCheck(conf map[string]interface{}) (gas.Rule, []ast.Node) {
-
- // TODO(gm) Come up with sensible defaults here. Or flip it to use a
- // black list instead.
- whitelist := gas.NewCallList()
- whitelist.AddAll("bytes.Buffer", "Write", "WriteByte", "WriteRune", "WriteString")
- whitelist.AddAll("fmt", "Print", "Printf", "Println")
- whitelist.Add("io.PipeWriter", "CloseWithError")
-
- if configured, ok := conf["G104"]; ok {
- if whitelisted, ok := configured.(map[string][]string); ok {
- for key, val := range whitelisted {
- whitelist.AddAll(key, val...)
- }
- }
- }
- return &NoErrorCheck{
- MetaData: gas.MetaData{
- Severity: gas.Low,
- Confidence: gas.High,
- What: "Errors unhandled.",
- },
- whitelist: whitelist,
- }, []ast.Node{(*ast.AssignStmt)(nil), (*ast.ExprStmt)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/fileperms.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/fileperms.go
deleted file mode 100644
index 101c7e2a6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/fileperms.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "fmt"
- "go/ast"
- "strconv"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type FilePermissions struct {
- gas.MetaData
- mode int64
- pkg string
- calls []string
-}
-
-func getConfiguredMode(conf map[string]interface{}, configKey string, defaultMode int64) int64 {
- var mode int64 = defaultMode
- if value, ok := conf[configKey]; ok {
- switch value.(type) {
- case int64:
- mode = value.(int64)
- case string:
- if m, e := strconv.ParseInt(value.(string), 0, 64); e != nil {
- mode = defaultMode
- } else {
- mode = m
- }
- }
- }
- return mode
-}
-
-func (r *FilePermissions) Match(n ast.Node, c *gas.Context) (*gas.Issue, error) {
- if callexpr, matched := gas.MatchCallByPackage(n, c, r.pkg, r.calls...); matched {
- modeArg := callexpr.Args[len(callexpr.Args)-1]
- if mode, err := gas.GetInt(modeArg); err == nil && mode > r.mode {
- return gas.NewIssue(c, n, r.What, r.Severity, r.Confidence), nil
- }
- }
- return nil, nil
-}
-
-func NewFilePerms(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- mode := getConfiguredMode(conf, "G302", 0600)
- return &FilePermissions{
- mode: mode,
- pkg: "os",
- calls: []string{"OpenFile", "Chmod"},
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.High,
- What: fmt.Sprintf("Expect file permissions to be %#o or less", mode),
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
-
-func NewMkdirPerms(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- mode := getConfiguredMode(conf, "G301", 0700)
- return &FilePermissions{
- mode: mode,
- pkg: "os",
- calls: []string{"Mkdir", "MkdirAll"},
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.High,
- What: fmt.Sprintf("Expect directory permissions to be %#o or less", mode),
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/hardcoded_credentials.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/hardcoded_credentials.go
deleted file mode 100644
index 1b4b85af3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/hardcoded_credentials.go
+++ /dev/null
@@ -1,148 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- gas "github.com/GoASTScanner/gas/core"
- "go/ast"
- "go/token"
- "regexp"
-
- "github.com/nbutton23/zxcvbn-go"
- "strconv"
-)
-
-type Credentials struct {
- gas.MetaData
- pattern *regexp.Regexp
- entropyThreshold float64
- perCharThreshold float64
- truncate int
- ignoreEntropy bool
-}
-
-func truncate(s string, n int) string {
- if n > len(s) {
- return s
- }
- return s[:n]
-}
-
-func (r *Credentials) isHighEntropyString(str string) bool {
- s := truncate(str, r.truncate)
- info := zxcvbn.PasswordStrength(s, []string{})
- entropyPerChar := info.Entropy / float64(len(s))
- return (info.Entropy >= r.entropyThreshold ||
- (info.Entropy >= (r.entropyThreshold/2) &&
- entropyPerChar >= r.perCharThreshold))
-}
-
-func (r *Credentials) Match(n ast.Node, ctx *gas.Context) (*gas.Issue, error) {
- switch node := n.(type) {
- case *ast.AssignStmt:
- return r.matchAssign(node, ctx)
- case *ast.GenDecl:
- return r.matchGenDecl(node, ctx)
- }
- return nil, nil
-}
-
-func (r *Credentials) matchAssign(assign *ast.AssignStmt, ctx *gas.Context) (*gas.Issue, error) {
- for _, i := range assign.Lhs {
- if ident, ok := i.(*ast.Ident); ok {
- if r.pattern.MatchString(ident.Name) {
- for _, e := range assign.Rhs {
- if val, err := gas.GetString(e); err == nil {
- if r.ignoreEntropy || (!r.ignoreEntropy && r.isHighEntropyString(val)) {
- return gas.NewIssue(ctx, assign, r.What, r.Severity, r.Confidence), nil
- }
- }
- }
- }
- }
- }
- return nil, nil
-}
-
-func (r *Credentials) matchGenDecl(decl *ast.GenDecl, ctx *gas.Context) (*gas.Issue, error) {
- if decl.Tok != token.CONST && decl.Tok != token.VAR {
- return nil, nil
- }
- for _, spec := range decl.Specs {
- if valueSpec, ok := spec.(*ast.ValueSpec); ok {
- for index, ident := range valueSpec.Names {
- if r.pattern.MatchString(ident.Name) && valueSpec.Values != nil {
- // const foo, bar = "same value"
- if len(valueSpec.Values) <= index {
- index = len(valueSpec.Values) - 1
- }
- if val, err := gas.GetString(valueSpec.Values[index]); err == nil {
- if r.ignoreEntropy || (!r.ignoreEntropy && r.isHighEntropyString(val)) {
- return gas.NewIssue(ctx, valueSpec, r.What, r.Severity, r.Confidence), nil
- }
- }
- }
- }
- }
- }
- return nil, nil
-}
-
-func NewHardcodedCredentials(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- pattern := `(?i)passwd|pass|password|pwd|secret|token`
- entropyThreshold := 80.0
- perCharThreshold := 3.0
- ignoreEntropy := false
- var truncateString int = 16
- if val, ok := conf["G101"]; ok {
- conf := val.(map[string]string)
- if configPattern, ok := conf["pattern"]; ok {
- pattern = configPattern
- }
- if configIgnoreEntropy, ok := conf["ignore_entropy"]; ok {
- if parsedBool, err := strconv.ParseBool(configIgnoreEntropy); err == nil {
- ignoreEntropy = parsedBool
- }
- }
- if configEntropyThreshold, ok := conf["entropy_threshold"]; ok {
- if parsedNum, err := strconv.ParseFloat(configEntropyThreshold, 64); err == nil {
- entropyThreshold = parsedNum
- }
- }
- if configCharThreshold, ok := conf["per_char_threshold"]; ok {
- if parsedNum, err := strconv.ParseFloat(configCharThreshold, 64); err == nil {
- perCharThreshold = parsedNum
- }
- }
- if configTruncate, ok := conf["truncate"]; ok {
- if parsedInt, err := strconv.Atoi(configTruncate); err == nil {
- truncateString = parsedInt
- }
- }
- }
-
- return &Credentials{
- pattern: regexp.MustCompile(pattern),
- entropyThreshold: entropyThreshold,
- perCharThreshold: perCharThreshold,
- ignoreEntropy: ignoreEntropy,
- truncate: truncateString,
- MetaData: gas.MetaData{
- What: "Potential hardcoded credentials",
- Confidence: gas.Low,
- Severity: gas.High,
- },
- }, []ast.Node{(*ast.AssignStmt)(nil), (*ast.GenDecl)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/rand.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/rand.go
deleted file mode 100644
index 9cc99e400..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/rand.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "go/ast"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type WeakRand struct {
- gas.MetaData
- funcNames []string
- packagePath string
-}
-
-func (w *WeakRand) Match(n ast.Node, c *gas.Context) (*gas.Issue, error) {
- for _, funcName := range w.funcNames {
- if _, matched := gas.MatchCallByPackage(n, c, w.packagePath, funcName); matched {
- return gas.NewIssue(c, n, w.What, w.Severity, w.Confidence), nil
- }
- }
-
- return nil, nil
-}
-
-func NewWeakRandCheck(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &WeakRand{
- funcNames: []string{"Read", "Int"},
- packagePath: "math/rand",
- MetaData: gas.MetaData{
- Severity: gas.High,
- Confidence: gas.Medium,
- What: "Use of weak random number generator (math/rand instead of crypto/rand)",
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/rsa.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/rsa.go
deleted file mode 100644
index 510ca78c2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/rsa.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "fmt"
- "go/ast"
- "regexp"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type WeakKeyStrength struct {
- gas.MetaData
- pattern *regexp.Regexp
- bits int
-}
-
-func (w *WeakKeyStrength) Match(n ast.Node, c *gas.Context) (*gas.Issue, error) {
- if node := gas.MatchCall(n, w.pattern); node != nil {
- if bits, err := gas.GetInt(node.Args[1]); err == nil && bits < (int64)(w.bits) {
- return gas.NewIssue(c, n, w.What, w.Severity, w.Confidence), nil
- }
- }
- return nil, nil
-}
-
-func NewWeakKeyStrength(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- bits := 2048
- return &WeakKeyStrength{
- pattern: regexp.MustCompile(`^rsa\.GenerateKey$`),
- bits: bits,
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.High,
- What: fmt.Sprintf("RSA keys should be at least %d bits", bits),
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/sql.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/sql.go
deleted file mode 100644
index 9b8b79f2f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/sql.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "go/ast"
- "regexp"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type SqlStatement struct {
- gas.MetaData
- pattern *regexp.Regexp
-}
-
-type SqlStrConcat struct {
- SqlStatement
-}
-
-// see if we can figure out what it is
-func (s *SqlStrConcat) checkObject(n *ast.Ident) bool {
- if n.Obj != nil {
- return n.Obj.Kind != ast.Var && n.Obj.Kind != ast.Fun
- }
- return false
-}
-
-// Look for "SELECT * FROM table WHERE " + " ' OR 1=1"
-func (s *SqlStrConcat) Match(n ast.Node, c *gas.Context) (*gas.Issue, error) {
- if node, ok := n.(*ast.BinaryExpr); ok {
- if start, ok := node.X.(*ast.BasicLit); ok {
- if str, e := gas.GetString(start); s.pattern.MatchString(str) && e == nil {
- if _, ok := node.Y.(*ast.BasicLit); ok {
- return nil, nil // string cat OK
- }
- if second, ok := node.Y.(*ast.Ident); ok && s.checkObject(second) {
- return nil, nil
- }
- return gas.NewIssue(c, n, s.What, s.Severity, s.Confidence), nil
- }
- }
- }
- return nil, nil
-}
-
-func NewSqlStrConcat(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &SqlStrConcat{
- SqlStatement: SqlStatement{
- pattern: regexp.MustCompile(`(?)(SELECT|DELETE|INSERT|UPDATE|INTO|FROM|WHERE) `),
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.High,
- What: "SQL string concatenation",
- },
- },
- }, []ast.Node{(*ast.BinaryExpr)(nil)}
-}
-
-type SqlStrFormat struct {
- SqlStatement
- call *regexp.Regexp
-}
-
-// Looks for "fmt.Sprintf("SELECT * FROM foo where '%s', userInput)"
-func (s *SqlStrFormat) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) {
- if node := gas.MatchCall(n, s.call); node != nil {
- if arg, e := gas.GetString(node.Args[0]); s.pattern.MatchString(arg) && e == nil {
- return gas.NewIssue(c, n, s.What, s.Severity, s.Confidence), nil
- }
- }
- return nil, nil
-}
-
-func NewSqlStrFormat(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &SqlStrFormat{
- call: regexp.MustCompile(`^fmt\.Sprintf$`),
- SqlStatement: SqlStatement{
- pattern: regexp.MustCompile("(?)(SELECT|DELETE|INSERT|UPDATE|INTO|FROM|WHERE) "),
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.High,
- What: "SQL string formatting",
- },
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/subproc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/subproc.go
deleted file mode 100644
index b5a6fa2fa..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/subproc.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "go/ast"
- "regexp"
- "strings"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type Subprocess struct {
- pattern *regexp.Regexp
-}
-
-func (r *Subprocess) Match(n ast.Node, c *gas.Context) (*gas.Issue, error) {
- if node := gas.MatchCall(n, r.pattern); node != nil {
- for _, arg := range node.Args {
- if !gas.TryResolve(arg, c) {
- what := "Subprocess launching with variable."
- return gas.NewIssue(c, n, what, gas.High, gas.High), nil
- }
- }
-
- // call with partially qualified command
- if str, err := gas.GetString(node.Args[0]); err == nil {
- if !strings.HasPrefix(str, "/") {
- what := "Subprocess launching with partial path."
- return gas.NewIssue(c, n, what, gas.Medium, gas.High), nil
- }
- }
-
- what := "Subprocess launching should be audited."
- return gas.NewIssue(c, n, what, gas.Low, gas.High), nil
- }
- return nil, nil
-}
-
-func NewSubproc(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &Subprocess{
- pattern: regexp.MustCompile(`^exec\.Command|syscall\.Exec$`),
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/tempfiles.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/tempfiles.go
deleted file mode 100644
index 8cbd55af6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/tempfiles.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "go/ast"
- "regexp"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type BadTempFile struct {
- gas.MetaData
- args *regexp.Regexp
- call *regexp.Regexp
-}
-
-func (t *BadTempFile) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) {
- if node := gas.MatchCall(n, t.call); node != nil {
- if arg, e := gas.GetString(node.Args[0]); t.args.MatchString(arg) && e == nil {
- return gas.NewIssue(c, n, t.What, t.Severity, t.Confidence), nil
- }
- }
- return nil, nil
-}
-
-func NewBadTempFile(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &BadTempFile{
- call: regexp.MustCompile(`ioutil\.WriteFile|os\.Create`),
- args: regexp.MustCompile(`^/tmp/.*$|^/var/tmp/.*$`),
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.High,
- What: "File creation in shared tmp directory without using ioutil.Tempfile",
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/templates.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/templates.go
deleted file mode 100644
index 0f1dc2407..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/templates.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "go/ast"
- "regexp"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type TemplateCheck struct {
- gas.MetaData
- call *regexp.Regexp
-}
-
-func (t *TemplateCheck) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) {
- if node := gas.MatchCall(n, t.call); node != nil {
- for _, arg := range node.Args {
- if _, ok := arg.(*ast.BasicLit); !ok { // basic lits are safe
- return gas.NewIssue(c, n, t.What, t.Severity, t.Confidence), nil
- }
- }
- }
- return nil, nil
-}
-
-func NewTemplateCheck(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &TemplateCheck{
- call: regexp.MustCompile(`^template\.(HTML|JS|URL)$`),
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.Low,
- What: "this method will not auto-escape HTML. Verify data is well formed.",
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/tls.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/tls.go
deleted file mode 100644
index cbcca56cf..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/tls.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "fmt"
- "go/ast"
- "reflect"
- "regexp"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type InsecureConfigTLS struct {
- MinVersion int16
- MaxVersion int16
- pattern *regexp.Regexp
- goodCiphers []string
-}
-
-func stringInSlice(a string, list []string) bool {
- for _, b := range list {
- if b == a {
- return true
- }
- }
- return false
-}
-
-func (t *InsecureConfigTLS) processTlsCipherSuites(n ast.Node, c *gas.Context) *gas.Issue {
- a := reflect.TypeOf(&ast.KeyValueExpr{})
- b := reflect.TypeOf(&ast.CompositeLit{})
- if node, ok := gas.SimpleSelect(n, a, b).(*ast.CompositeLit); ok {
- for _, elt := range node.Elts {
- if ident, ok := elt.(*ast.SelectorExpr); ok {
- if !stringInSlice(ident.Sel.Name, t.goodCiphers) {
- str := fmt.Sprintf("TLS Bad Cipher Suite: %s", ident.Sel.Name)
- return gas.NewIssue(c, n, str, gas.High, gas.High)
- }
- }
- }
- }
- return nil
-}
-
-func (t *InsecureConfigTLS) processTlsConfVal(n *ast.KeyValueExpr, c *gas.Context) *gas.Issue {
- if ident, ok := n.Key.(*ast.Ident); ok {
- switch ident.Name {
- case "InsecureSkipVerify":
- if node, ok := n.Value.(*ast.Ident); ok {
- if node.Name != "false" {
- return gas.NewIssue(c, n, "TLS InsecureSkipVerify set true.", gas.High, gas.High)
- }
- } else {
- // TODO(tk): symbol tab look up to get the actual value
- return gas.NewIssue(c, n, "TLS InsecureSkipVerify may be true.", gas.High, gas.Low)
- }
-
- case "PreferServerCipherSuites":
- if node, ok := n.Value.(*ast.Ident); ok {
- if node.Name == "false" {
- return gas.NewIssue(c, n, "TLS PreferServerCipherSuites set false.", gas.Medium, gas.High)
- }
- } else {
- // TODO(tk): symbol tab look up to get the actual value
- return gas.NewIssue(c, n, "TLS PreferServerCipherSuites may be false.", gas.Medium, gas.Low)
- }
-
- case "MinVersion":
- if ival, ierr := gas.GetInt(n.Value); ierr == nil {
- if (int16)(ival) < t.MinVersion {
- return gas.NewIssue(c, n, "TLS MinVersion too low.", gas.High, gas.High)
- }
- // TODO(tk): symbol tab look up to get the actual value
- return gas.NewIssue(c, n, "TLS MinVersion may be too low.", gas.High, gas.Low)
- }
-
- case "MaxVersion":
- if ival, ierr := gas.GetInt(n.Value); ierr == nil {
- if (int16)(ival) < t.MaxVersion {
- return gas.NewIssue(c, n, "TLS MaxVersion too low.", gas.High, gas.High)
- }
- // TODO(tk): symbol tab look up to get the actual value
- return gas.NewIssue(c, n, "TLS MaxVersion may be too low.", gas.High, gas.Low)
- }
-
- case "CipherSuites":
- if ret := t.processTlsCipherSuites(n, c); ret != nil {
- return ret
- }
-
- }
-
- }
- return nil
-}
-
-func (t *InsecureConfigTLS) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) {
- if node := gas.MatchCompLit(n, t.pattern); node != nil {
- for _, elt := range node.Elts {
- if kve, ok := elt.(*ast.KeyValueExpr); ok {
- gi = t.processTlsConfVal(kve, c)
- if gi != nil {
- break
- }
- }
- }
- }
- return
-}
-
-func NewModernTlsCheck(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- // https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility
- return &InsecureConfigTLS{
- pattern: regexp.MustCompile(`^tls\.Config$`),
- MinVersion: 0x0303, // TLS 1.2 only
- MaxVersion: 0x0303,
- goodCiphers: []string{
- "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
- "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
- },
- }, []ast.Node{(*ast.CompositeLit)(nil)}
-}
-
-func NewIntermediateTlsCheck(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- // https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28default.29
- return &InsecureConfigTLS{
- pattern: regexp.MustCompile(`^tls\.Config$`),
- MinVersion: 0x0301, // TLS 1.2, 1.1, 1.0
- MaxVersion: 0x0303,
- goodCiphers: []string{
- "TLS_RSA_WITH_AES_128_CBC_SHA",
- "TLS_RSA_WITH_AES_256_CBC_SHA",
- "TLS_RSA_WITH_AES_128_GCM_SHA256",
- "TLS_RSA_WITH_AES_256_GCM_SHA384",
- "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
- "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
- "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
- "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
- "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
- "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
- "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
- "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
- "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
- },
- }, []ast.Node{(*ast.CompositeLit)(nil)}
-}
-
-func NewCompatTlsCheck(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- // https://wiki.mozilla.org/Security/Server_Side_TLS#Old_compatibility_.28default.29
- return &InsecureConfigTLS{
- pattern: regexp.MustCompile(`^tls\.Config$`),
- MinVersion: 0x0301, // TLS 1.2, 1.1, 1.0
- MaxVersion: 0x0303,
- goodCiphers: []string{
- "TLS_RSA_WITH_RC4_128_SHA",
- "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
- "TLS_RSA_WITH_AES_128_CBC_SHA",
- "TLS_RSA_WITH_AES_256_CBC_SHA",
- "TLS_RSA_WITH_AES_128_GCM_SHA256",
- "TLS_RSA_WITH_AES_256_GCM_SHA384",
- "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
- "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
- "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
- "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
- "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
- "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
- "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
- "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
- "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
- "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
- },
- }, []ast.Node{(*ast.CompositeLit)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/unsafe.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/unsafe.go
deleted file mode 100644
index 861f77cd9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/unsafe.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- gas "github.com/GoASTScanner/gas/core"
- "go/ast"
-)
-
-type UsingUnsafe struct {
- gas.MetaData
- pkg string
- calls []string
-}
-
-func (r *UsingUnsafe) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) {
- if _, matches := gas.MatchCallByPackage(n, c, r.pkg, r.calls...); matches {
- return gas.NewIssue(c, n, r.What, r.Severity, r.Confidence), nil
- }
- return nil, nil
-}
-
-func NewUsingUnsafe(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- return &UsingUnsafe{
- pkg: "unsafe",
- calls: []string{"Alignof", "Offsetof", "Sizeof", "Pointer"},
- MetaData: gas.MetaData{
- What: "Use of unsafe calls should be audited",
- Severity: gas.Low,
- Confidence: gas.High,
- },
- }, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/weakcrypto.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/weakcrypto.go
deleted file mode 100644
index 1c859e9b5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/rules/weakcrypto.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 rules
-
-import (
- "go/ast"
-
- gas "github.com/GoASTScanner/gas/core"
-)
-
-type UsesWeakCryptography struct {
- gas.MetaData
- blacklist map[string][]string
-}
-
-func (r *UsesWeakCryptography) Match(n ast.Node, c *gas.Context) (*gas.Issue, error) {
-
- for pkg, funcs := range r.blacklist {
- if _, matched := gas.MatchCallByPackage(n, c, pkg, funcs...); matched {
- return gas.NewIssue(c, n, r.What, r.Severity, r.Confidence), nil
- }
- }
- return nil, nil
-}
-
-// Uses des.* md5.* or rc4.*
-func NewUsesWeakCryptography(conf map[string]interface{}) (gas.Rule, []ast.Node) {
- calls := make(map[string][]string)
- calls["crypto/des"] = []string{"NewCipher", "NewTripleDESCipher"}
- calls["crypto/md5"] = []string{"New", "Sum"}
- calls["crypto/rc4"] = []string{"NewCipher"}
- rule := &UsesWeakCryptography{
- blacklist: calls,
- MetaData: gas.MetaData{
- Severity: gas.Medium,
- Confidence: gas.High,
- What: "Use of weak cryptographic primitive",
- },
- }
- return rule, []ast.Node{(*ast.CallExpr)(nil)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/tools.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/tools.go
deleted file mode 100644
index c26581911..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/tools.go
+++ /dev/null
@@ -1,276 +0,0 @@
-// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
-//
-// 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 main
-
-import (
- "fmt"
- "go/ast"
- "go/importer"
- "go/parser"
- "go/token"
- "go/types"
- "os"
- "strings"
-)
-
-type command func(args ...string)
-type utilities struct {
- commands map[string]command
- call []string
-}
-
-// Custom commands / utilities to run instead of default analyzer
-func newUtils() *utilities {
- utils := make(map[string]command)
- utils["ast"] = dumpAst
- utils["callobj"] = dumpCallObj
- utils["uses"] = dumpUses
- utils["types"] = dumpTypes
- utils["defs"] = dumpDefs
- utils["comments"] = dumpComments
- utils["imports"] = dumpImports
- return &utilities{utils, make([]string, 0)}
-}
-
-func (u *utilities) String() string {
- i := 0
- keys := make([]string, len(u.commands))
- for k := range u.commands {
- keys[i] = k
- i++
- }
- return strings.Join(keys, ", ")
-}
-
-func (u *utilities) Set(opt string) error {
- if _, ok := u.commands[opt]; !ok {
- return fmt.Errorf("valid tools are: %s", u.String())
-
- }
- u.call = append(u.call, opt)
- return nil
-}
-
-func (u *utilities) run(args ...string) {
- for _, util := range u.call {
- if cmd, ok := u.commands[util]; ok {
- cmd(args...)
- }
- }
-}
-
-func shouldSkip(path string) bool {
- st, e := os.Stat(path)
- if e != nil {
- // #nosec
- fmt.Fprintf(os.Stderr, "Skipping: %s - %s\n", path, e)
- return true
- }
- if st.IsDir() {
- // #nosec
- fmt.Fprintf(os.Stderr, "Skipping: %s - directory\n", path)
- return true
- }
- return false
-}
-
-func dumpAst(files ...string) {
- for _, arg := range files {
- // Ensure file exists and not a directory
- if shouldSkip(arg) {
- continue
- }
-
- // Create the AST by parsing src.
- fset := token.NewFileSet() // positions are relative to fset
- f, err := parser.ParseFile(fset, arg, nil, 0)
- if err != nil {
- // #nosec
- fmt.Fprintf(os.Stderr, "Unable to parse file %s\n", err)
- continue
- }
-
- // Print the AST. #nosec
- ast.Print(fset, f)
- }
-}
-
-type context struct {
- fileset *token.FileSet
- comments ast.CommentMap
- info *types.Info
- pkg *types.Package
- config *types.Config
- root *ast.File
-}
-
-func createContext(filename string) *context {
- fileset := token.NewFileSet()
- root, e := parser.ParseFile(fileset, filename, nil, parser.ParseComments)
- if e != nil {
- // #nosec
- fmt.Fprintf(os.Stderr, "Unable to parse file: %s. Reason: %s\n", filename, e)
- return nil
- }
- comments := ast.NewCommentMap(fileset, root, root.Comments)
- info := &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- Scopes: make(map[ast.Node]*types.Scope),
- Implicits: make(map[ast.Node]types.Object),
- }
- config := types.Config{Importer: importer.Default()}
- pkg, e := config.Check("main.go", fileset, []*ast.File{root}, info)
- if e != nil {
- // #nosec
- fmt.Fprintf(os.Stderr, "Type check failed for file: %s. Reason: %s\n", filename, e)
- return nil
- }
- return &context{fileset, comments, info, pkg, &config, root}
-}
-
-func printObject(obj types.Object) {
- fmt.Println("OBJECT")
- if obj == nil {
- fmt.Println("object is nil")
- return
- }
- fmt.Printf(" Package = %v\n", obj.Pkg())
- if obj.Pkg() != nil {
- fmt.Println(" Path = ", obj.Pkg().Path())
- fmt.Println(" Name = ", obj.Pkg().Name())
- fmt.Println(" String = ", obj.Pkg().String())
- }
- fmt.Printf(" Name = %v\n", obj.Name())
- fmt.Printf(" Type = %v\n", obj.Type())
- fmt.Printf(" Id = %v\n", obj.Id())
-}
-
-func checkContext(ctx *context, file string) bool {
- // #nosec
- if ctx == nil {
- fmt.Fprintln(os.Stderr, "Failed to create context for file: ", file)
- return false
- }
- return true
-}
-
-func dumpCallObj(files ...string) {
-
- for _, file := range files {
- if shouldSkip(file) {
- continue
- }
- context := createContext(file)
- if !checkContext(context, file) {
- return
- }
- ast.Inspect(context.root, func(n ast.Node) bool {
- var obj types.Object
- switch node := n.(type) {
- case *ast.Ident:
- obj = context.info.ObjectOf(node) //context.info.Uses[node]
- case *ast.SelectorExpr:
- obj = context.info.ObjectOf(node.Sel) //context.info.Uses[node.Sel]
- default:
- obj = nil
- }
- if obj != nil {
- printObject(obj)
- }
- return true
- })
- }
-}
-
-func dumpUses(files ...string) {
- for _, file := range files {
- if shouldSkip(file) {
- continue
- }
- context := createContext(file)
- if !checkContext(context, file) {
- return
- }
- for ident, obj := range context.info.Uses {
- fmt.Printf("IDENT: %v, OBJECT: %v\n", ident, obj)
- }
- }
-}
-
-func dumpTypes(files ...string) {
- for _, file := range files {
- if shouldSkip(file) {
- continue
- }
- context := createContext(file)
- if !checkContext(context, file) {
- return
- }
- for expr, tv := range context.info.Types {
- fmt.Printf("EXPR: %v, TYPE: %v\n", expr, tv)
- }
- }
-}
-
-func dumpDefs(files ...string) {
- for _, file := range files {
- if shouldSkip(file) {
- continue
- }
- context := createContext(file)
- if !checkContext(context, file) {
- return
- }
- for ident, obj := range context.info.Defs {
- fmt.Printf("IDENT: %v, OBJ: %v\n", ident, obj)
- }
- }
-}
-
-func dumpComments(files ...string) {
- for _, file := range files {
- if shouldSkip(file) {
- continue
- }
- context := createContext(file)
- if !checkContext(context, file) {
- return
- }
- for _, group := range context.comments.Comments() {
- fmt.Println(group.Text())
- }
- }
-}
-
-func dumpImports(files ...string) {
- for _, file := range files {
- if shouldSkip(file) {
- continue
- }
- context := createContext(file)
- if !checkContext(context, file) {
- return
- }
- for _, pkg := range context.pkg.Imports() {
- fmt.Println(pkg.Path(), pkg.Name())
- for _, name := range pkg.Scope().Names() {
- fmt.Println(" => ", name)
- }
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go
deleted file mode 100644
index 3320d5968..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package adjacency
-
-import (
- "encoding/json"
- "log"
- // "fmt"
- "github.com/nbutton23/zxcvbn-go/data"
-)
-
-type AdjacencyGraph struct {
- Graph map[string][]string
- averageDegree float64
- Name string
-}
-
-var AdjacencyGph = make(map[string]AdjacencyGraph)
-
-func init() {
- AdjacencyGph["qwerty"] = BuildQwerty()
- AdjacencyGph["dvorak"] = BuildDvorak()
- AdjacencyGph["keypad"] = BuildKeypad()
- AdjacencyGph["macKeypad"] = BuildMacKeypad()
- AdjacencyGph["l33t"] = BuildLeet()
-}
-
-func BuildQwerty() AdjacencyGraph {
- data, err := zxcvbn_data.Asset("data/Qwerty.json")
- if err != nil {
- panic("Can't find asset")
- }
- return GetAdjancencyGraphFromFile(data, "qwerty")
-}
-func BuildDvorak() AdjacencyGraph {
- data, err := zxcvbn_data.Asset("data/Dvorak.json")
- if err != nil {
- panic("Can't find asset")
- }
- return GetAdjancencyGraphFromFile(data, "dvorak")
-}
-func BuildKeypad() AdjacencyGraph {
- data, err := zxcvbn_data.Asset("data/Keypad.json")
- if err != nil {
- panic("Can't find asset")
- }
- return GetAdjancencyGraphFromFile(data, "keypad")
-}
-func BuildMacKeypad() AdjacencyGraph {
- data, err := zxcvbn_data.Asset("data/MacKeypad.json")
- if err != nil {
- panic("Can't find asset")
- }
- return GetAdjancencyGraphFromFile(data, "mac_keypad")
-}
-func BuildLeet() AdjacencyGraph {
- data, err := zxcvbn_data.Asset("data/L33t.json")
- if err != nil {
- panic("Can't find asset")
- }
- return GetAdjancencyGraphFromFile(data, "keypad")
-}
-
-func GetAdjancencyGraphFromFile(data []byte, name string) AdjacencyGraph {
-
- var graph AdjacencyGraph
- err := json.Unmarshal(data, &graph)
- if err != nil {
- log.Fatal(err)
- }
- graph.Name = name
- return graph
-}
-
-//on qwerty, 'g' has degree 6, being adjacent to 'ftyhbv'. '\' has degree 1.
-//this calculates the average over all keys.
-//TODO double check that i ported this correctly scoring.coffee ln 5
-func (adjGrp AdjacencyGraph) CalculateAvgDegree() float64 {
- if adjGrp.averageDegree != float64(0) {
- return adjGrp.averageDegree
- }
- var avg float64
- var count float64
- for _, value := range adjGrp.Graph {
-
- for _, char := range value {
- if char != "" || char != " " {
- avg += float64(len(char))
- count++
- }
- }
-
- }
-
- adjGrp.averageDegree = avg / count
-
- return adjGrp.averageDegree
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go
deleted file mode 100644
index e5dfede4d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go
+++ /dev/null
@@ -1,444 +0,0 @@
-// Code generated by go-bindata.
-// sources:
-// data/Dvorak.json
-// data/English.json
-// data/FemaleNames.json
-// data/Keypad.json
-// data/L33t.json
-// data/MacKeypad.json
-// data/MaleNames.json
-// data/Passwords.json
-// data/Qwerty.json
-// data/Surnames.json
-// DO NOT EDIT!
-
-package zxcvbn_data
-
-import (
- "bytes"
- "compress/gzip"
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
- "time"
-)
-
-func bindataRead(data []byte, name string) ([]byte, error) {
- gz, err := gzip.NewReader(bytes.NewBuffer(data))
- if err != nil {
- return nil, fmt.Errorf("Read %q: %v", name, err)
- }
-
- var buf bytes.Buffer
- _, err = io.Copy(&buf, gz)
- clErr := gz.Close()
-
- if err != nil {
- return nil, fmt.Errorf("Read %q: %v", name, err)
- }
- if clErr != nil {
- return nil, err
- }
-
- return buf.Bytes(), nil
-}
-
-type asset struct {
- bytes []byte
- info os.FileInfo
-}
-
-type bindataFileInfo struct {
- name string
- size int64
- mode os.FileMode
- modTime time.Time
-}
-
-func (fi bindataFileInfo) Name() string {
- return fi.name
-}
-func (fi bindataFileInfo) Size() int64 {
- return fi.size
-}
-func (fi bindataFileInfo) Mode() os.FileMode {
- return fi.mode
-}
-func (fi bindataFileInfo) ModTime() time.Time {
- return fi.modTime
-}
-func (fi bindataFileInfo) IsDir() bool {
- return false
-}
-func (fi bindataFileInfo) Sys() interface{} {
- return nil
-}
-
-var _dataDvorakJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x98\x57\x57\x1b\x41\x0c\x85\xdf\xf9\x15\xb0\x74\x30\xbd\xf7\xde\x7b\x6f\xa6\x77\x30\xbd\x17\xf3\xdb\x33\x26\x39\x99\xef\x9e\x78\x96\x7d\x88\x5e\x72\xc6\x61\xf9\xa4\x95\xae\x34\xd7\x7c\x14\x14\x16\x46\x63\xf7\xfb\xb7\x67\x51\x67\x61\xee\x83\xfb\x58\xef\x8e\x5b\xdf\x47\xf7\xa1\xa3\x22\x4a\xfd\x39\x5f\x3f\x65\x32\xf9\xce\xd1\xd6\xc7\xdf\x67\xa2\xcc\xb4\x3f\xdf\x2f\x46\xdf\xc7\xed\xdf\xff\x13\x35\x10\xbc\xf7\xf5\x33\xb8\xb1\xdf\xc3\xca\xd3\x91\xfc\x82\x90\x1b\x49\x6e\x28\xfa\x99\xdc\x54\xec\xc9\xa9\x6e\x8d\x22\xe4\x26\x92\x91\x4f\x90\xdc\x5c\xe2\x69\xb5\xbd\x12\x45\xc0\xcd\x04\x23\x9d\x20\xb8\xa5\xd4\xc3\x6e\xe7\x25\x88\x80\x5b\x08\x46\x36\x41\x70\xeb\x8e\x87\xbd\x6d\x48\x10\x01\xb7\x12\x8c\x6c\x82\xe0\xb6\x32\x0f\x3b\x19\x95\x20\x02\x6e\x23\x18\xd9\x04\xc1\xed\x55\x1e\x76\x3a\x26\x41\x04\xdc\x4e\x30\xb2\x09\x82\xa1\xf6\xe8\x70\x48\x82\x08\xb8\x83\x60\x64\x13\x04\xd7\x57\xca\x58\x30\x88\x80\x8b\xcc\x46\xc4\xfd\xcc\xa3\x05\x81\x79\x11\x1c\xe7\x62\x7f\x20\x4c\x2e\xb6\x1a\x91\x12\xab\x11\x29\xb5\x1a\x91\x32\x2b\x25\x97\x5b\x35\xaf\xc2\x4a\xc9\x95\x56\xb7\x48\x95\xd5\x50\x57\x13\x5c\xd7\xe7\x1f\xdc\xce\xe6\x0d\x12\xa5\xd3\x9f\xf9\x7f\x50\xb3\xab\xe4\x14\xc9\x9c\x52\x69\x19\xef\x24\x8e\xc5\xcd\x9c\xb4\x52\xc8\x35\x24\x3f\x2c\xf9\x07\x99\x7f\x4f\xf5\xcf\x45\x7a\xdf\x54\x70\x2d\xc1\x14\x13\xb3\xe4\x20\x73\xde\x8e\x47\x24\x7b\x01\xd7\x11\xcc\x3e\xb3\xff\xa8\x38\xb3\xcf\x15\x36\x85\xb7\x15\x70\x67\x68\x44\x20\x7f\xa9\xe5\xdd\x42\xb0\x2c\x02\xee\xb2\x02\x77\x9b\xc9\xa2\xc7\x4c\xca\xbd\x56\xba\xe8\xb3\xd2\x45\xbf\x99\x37\x1c\x08\x09\x43\x7a\x49\x04\x7b\xd6\xd5\x19\xde\xca\x83\xcc\xf9\x75\xdd\xff\xd2\xd1\xb0\x3f\x9f\x8d\xfb\xf3\xd5\x4c\x32\xc9\x0d\x11\xcc\x0b\x87\x17\x11\x17\x26\x57\xfc\xe3\xb2\x04\x17\xf0\x30\xc1\xe7\x13\xf9\x8d\x1f\x03\x32\xfb\x83\x41\x7f\x76\x6f\x2b\xe0\x11\x82\x59\x3f\xce\x02\x45\xf6\xb4\xe2\xcf\x17\x93\x32\x95\x02\x1e\x25\x98\x97\x3a\x2f\x7b\x5a\x58\x66\xcf\x3e\xb8\xb7\x15\xf0\x18\xc1\x7c\x7d\xc2\x58\x6f\x5e\x4a\x2c\x8b\x0b\x22\xe0\x71\x82\x99\x01\x33\x23\x8c\x0d\x83\x42\x72\xf5\x16\xf0\x04\xc1\xac\x1f\xcb\xc2\x37\x61\x70\xca\xf3\x72\x4a\xc1\x93\x04\x63\x2d\xca\x26\x60\x40\x07\x48\xa4\xe3\x29\x82\xd9\x65\xc2\x28\x43\x64\x19\x0b\x9e\x26\x98\xe2\xa7\xef\xe1\x4a\xe2\x76\xe5\x05\x7c\x3d\xab\xa5\x98\x21\x98\x82\x67\xc7\xd9\xb0\x97\xb5\x64\x19\xcf\x12\x4c\x00\xb3\xe7\x42\x65\x96\xcf\xab\x12\x50\xc0\x73\x04\xf3\xae\xe3\x46\xe3\x14\xb2\xa9\x6c\xb6\xdb\x74\x02\x9e\x27\x98\x00\xde\x1b\xf4\xf2\x94\x21\x1b\xec\x02\x0a\x78\x81\x60\xec\x57\xd9\x1b\xcc\x12\xca\x89\xad\xf1\x22\xc1\x9c\x30\xae\x4a\x2a\x84\xf5\x76\x4a\x60\x83\x05\xbc\x44\x30\x1f\x24\x80\x12\xe3\x4d\xe7\x3c\x1b\x1b\x29\xe0\x65\x82\x29\x31\x66\x4f\x85\x30\x38\xa4\x97\xdb\x1b\x02\x5e\x21\x98\xb5\xe4\x0e\x66\xc3\x38\x85\x18\xef\x5c\xed\x05\xbc\x4a\x30\x33\x60\x66\xd4\x2e\x5e\x3f\xb6\x79\x6b\x04\x73\x0d\x72\x58\x18\x04\x43\x11\x0b\x5e\x27\x98\xaf\xc6\x57\xe6\xaa\xc4\xd8\xc7\x82\x37\x08\x66\x5d\x39\x14\xbc\xa6\xb8\x9b\x19\xdc\x0d\x8b\x80\x37\x09\xe6\xec\xb3\xae\x90\x58\xc8\x23\xfd\x93\xf1\x16\xc1\x18\x84\xa0\xc9\xa2\x93\xa3\xbe\x9d\xee\x05\x9c\x4e\x93\x9c\xe0\x9b\x4c\xe2\x94\xb7\x09\xc6\x46\x4f\x02\x13\xf3\xe9\xd2\x17\xf0\x8e\xd5\xdf\xc9\x76\xad\xbe\xec\xed\x05\x8c\x6c\x10\x10\x63\xa3\x05\xbc\x6f\xe6\x90\x0f\xac\x1c\xf2\xa1\x95\x43\x3e\xb2\x72\xc8\xc7\x56\x0e\xf9\xc4\xca\x21\x9f\x5a\x39\xe4\x33\x2b\x87\x7c\x6e\xe5\x90\x2f\xac\x1c\xf2\xa5\x95\x43\xce\x58\x39\xe4\x2b\x2b\x87\x7c\x6d\xe5\x90\x6f\xac\x1c\xf2\xad\x95\x43\xbe\xb3\x72\xc8\xf7\x56\x0e\xf9\xc1\xca\x21\x3f\x5a\x39\xe4\x27\x2b\x87\xfc\x6c\xe5\x90\x5f\xac\x1c\xf2\xab\x95\x43\x7e\xb3\x72\xc8\xef\x56\x0e\xf9\xc3\xca\x21\x7f\x5a\x19\xe4\xac\x95\x41\xfe\xfa\xef\x76\xd3\xfd\x9b\x2d\xc8\x16\xfc\x0a\x00\x00\xff\xff\xd5\xc4\xca\x21\xce\x20\x00\x00")
-
-func dataDvorakJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataDvorakJson,
- "data/Dvorak.json",
- )
-}
-
-func dataDvorakJson() (*asset, error) {
- bytes, err := dataDvorakJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/Dvorak.json", size: 8398, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataEnglishJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\xbd\x4b\x9a\xe3\xca\x0e\x34\xb6\x15\x7f\x9a\xf4\xe4\xae\xc0\x6b\xf0\x0e\x3c\x4a\x92\x29\x31\x4b\x24\x93\x87\x0f\xa9\xd4\xde\xbc\x81\x88\x40\x52\xfd\x0f\xee\xed\xea\x3e\x55\x2a\x32\x1f\x78\x04\x02\x81\xff\xef\xf6\xff\x94\xfd\xb8\xfd\xdf\xff\xef\xff\x75\xfb\xd4\xf3\xf6\xbf\x5b\xb1\xff\x1d\xd5\xff\x6f\xcc\xf6\xff\xc9\xff\xb7\x0c\xf8\x7b\x3a\xfc\xbf\xfb\xff\xd5\xbb\xfd\xdf\xec\xff\xfd\xad\x7f\xdd\xfd\xff\x16\x7c\x1b\xbe\x7e\x2e\xf5\xed\xff\xf4\x67\xb6\xff\xbf\xd7\xcd\xfe\x7f\xf1\x4f\x1d\xd3\xcb\x7f\x6c\xfe\xd8\xff\x0d\x75\xf9\xe3\x3f\xfc\x73\xee\x07\xfe\xfb\x81\x7f\xb4\xff\xeb\xfc\x7b\xaa\x7f\x9c\x3d\x94\xff\xec\x3b\xf9\x87\xbe\x33\x1e\xe0\x0f\xbe\x2e\xc7\x68\x7f\xec\xf8\xf6\xd3\x7f\x32\x4d\x13\xbe\x07\x7f\xa4\xcd\xbf\x17\xaf\x50\xfd\xfb\x52\x57\xf1\x4d\x5b\x79\x8c\x07\x3f\xf7\x0f\xbe\xe5\x91\x0f\x7c\x23\xfe\xc2\xef\x79\xd4\xb2\x3c\xec\xcf\xa9\x3c\xfd\x1f\x3f\x39\xf9\x27\x94\x3b\xbf\xcf\x7f\x29\x3e\xb7\x4f\xfe\x80\xe7\x8a\xc7\x5b\x0e\xbe\xfb\xf2\xd4\x52\xe1\x21\xb9\x08\x0f\xbc\x78\xf1\x95\xc0\x62\x8d\xfa\x57\xfe\x88\x7e\xf3\xe2\xff\x3f\x94\x01\x6b\xea\xab\xb3\x67\xfc\x92\x8a\x65\x7e\xd4\xca\x3d\xc8\xfe\x9f\xb6\x6c\xef\xea\x5f\x70\x55\xea\x39\xf9\x7f\x9c\x6a\x7d\xe2\xa7\x33\xf6\xa1\x70\x7f\x0a\x96\xa3\x3e\x93\x7f\x7f\x97\xfa\x27\x9f\x1c\x0b\x3f\x67\xbc\xc2\xc1\x25\x2b\x7f\xf0\xc7\x7d\xab\x33\xde\xf4\x83\xd5\xd4\x3a\xe2\x75\x7a\xfd\x26\x7b\x4c\x7e\xc0\x27\xef\x78\xb5\x1d\x7b\x86\xdf\x8b\xad\xde\xed\xa9\x7d\x31\x1e\x78\x1e\xee\x68\x9f\xce\x3d\xeb\xbf\xe1\x20\xe8\x85\xfc\x87\x76\x3c\x1d\x1e\xff\x48\x58\x74\x3c\xd8\x1b\xff\x7c\xee\xd8\x8b\xe3\x98\x70\x72\xf8\xdf\x97\x9c\x07\xac\xcb\xb2\x24\xfc\xf5\x85\x9d\x79\x67\xee\xea\x51\x2b\xf7\x09\xcf\x5d\xfe\xe0\xd0\xed\x27\xff\xdb\x98\xfd\x05\xe7\xca\x85\xe7\x0f\xf2\x98\xed\x75\xdb\x3e\x5c\xc3\x2d\x4e\x37\x3e\x61\xca\xb1\xbf\xfe\x4a\x09\x3f\x9f\x3e\x38\xa6\x43\x7d\x2f\xf8\xeb\x82\xb7\xf2\xef\x3e\xfd\xbc\xd8\xe7\x62\xc9\x3f\xb1\xcb\xf8\xa0\x7d\xd4\x1a\xa6\xe5\x13\x1f\xb7\x27\x6c\xfb\x7c\xf6\x23\xff\x03\xde\xf7\xee\x1f\x6e\xaf\x85\x45\xbd\xdf\xf1\x9b\xf8\xfd\x76\xbc\x70\xcc\x1e\xe5\xc5\xa3\x33\xf1\x77\xd4\x93\x67\x7b\xcc\x93\x1f\xca\xe3\x8d\x6b\x9c\x26\xff\xde\x35\xd7\x75\xe2\x49\xf2\xdf\xb5\x1f\x3c\x17\xef\x84\xfb\x5c\x16\x5c\xf9\x7b\xc1\x4d\xb7\x8b\x18\x2f\xfa\x48\x71\xa9\x97\x87\xd6\x01\xaf\x31\xd4\xbc\xf3\x08\xf4\xbc\x76\x47\xc5\x5b\x3d\xec\x68\x1e\xd8\xee\x3b\x97\xb7\xcb\xc7\x81\x05\xd6\x06\x2d\xba\x7f\xfe\x0e\xfe\x0b\xb8\xc5\xf7\xb2\xed\xfc\xb1\xa9\x64\xbe\xd4\xc1\xab\x76\xcf\x79\xd2\x4f\xb7\xf5\x7a\xd7\xcd\x5f\xc9\xaf\x30\xbe\xd7\x1e\x1b\x27\x8a\x07\x2b\xdd\xf9\x0b\xa7\xb4\xeb\x82\xe1\xd8\x0d\xf8\x45\xcf\x9c\x57\x3d\xbe\x2f\x0a\xed\xc6\x56\xcf\x85\x8b\x52\x57\x5d\x32\x9e\xa2\xf2\x07\xef\x74\xfa\x4f\x16\xbd\x6f\x9a\xec\x91\x79\x22\xf7\x23\xf3\x94\x2e\x07\x0e\xe3\xbc\xf1\xbb\x71\x27\x70\x06\x6c\x4f\xf0\xcb\xbb\x02\x7b\x82\x1b\x3f\xa6\x75\xcd\x4b\x1e\x62\x23\x79\x85\xf9\xe1\xc7\xf6\xe1\x2b\x3e\xb9\x13\xef\xad\x6a\xc7\x37\xdf\x5c\x6d\x27\xbf\x65\x4e\x03\x2f\xc2\x1b\x0b\xc7\x7f\x7c\x9c\x79\xe7\x95\xc4\xd6\x70\x0b\x70\xd3\x66\xdc\xea\x2d\xcf\x79\xee\xb0\x3e\x66\xf8\x0e\xad\x67\xfe\xa3\x3d\xb4\x7f\xe3\xb2\x0f\xf8\x99\x29\xd3\x5a\xaf\x53\xea\xfd\x4f\x5b\xa6\x6c\x1b\x45\x7f\x00\xb3\xa3\x35\xe9\x8f\x53\x16\x69\xcc\x69\xc3\xef\xc4\xb9\x5f\x0a\x7e\xee\x9e\xf4\xb1\x79\xa2\x09\x38\x92\xec\x3f\x2e\x59\xd2\xd2\xda\x37\x15\xff\x2e\x33\x33\x1b\xbe\x6f\xd6\x61\x99\xb9\x1a\x59\x57\x2a\x2f\xb1\x18\x1b\x7f\x25\x9e\xbe\x4f\x73\x98\x17\x7e\xae\x9f\x0f\x1a\x3f\x5c\xd0\x7b\x9a\xcb\xc4\xcb\x5d\x27\x9a\x98\x38\x64\x76\x73\x76\xfd\x84\xfd\xe2\xc9\xef\x5a\x19\x32\x5c\xdf\xfe\xc4\xea\xe2\x28\xcd\xf4\x53\x66\x92\xb9\x6e\xb5\x99\xdd\x38\x97\x34\x02\xef\xb1\xe0\x26\x9b\xe3\xd8\x7c\x33\xb6\x8a\xb5\x9f\xf2\xdd\x7f\xfc\xc9\x1d\x3b\x6a\x5c\x05\xb7\xe6\x78\x70\x18\x90\xba\x62\x57\xf5\x32\xfc\xe3\x9d\xe1\x5e\x4e\xd8\xe5\x79\xd6\x21\xf2\x77\x59\x37\xdb\x45\x78\x8b\x04\x9f\x52\x36\x7c\x54\xa1\x97\x82\x9f\xb9\x6f\x25\x63\xf9\xd2\x64\xbf\x69\xe0\x37\xeb\x98\x2d\xf9\x97\x0b\xbf\xc1\xd9\xfc\xd4\x0e\x9f\x59\xbb\x89\x26\xb2\x2c\xe7\x81\x0d\xd4\x0d\xb1\x9b\x37\xf1\xe0\x9a\xa3\xe3\x47\xb8\x43\xe7\xf6\xf9\xd6\x0f\x78\x85\x05\xbe\x63\x4e\xba\xfa\xf3\x47\x8b\xda\x5f\x47\x26\xff\xda\xa1\xe1\x89\x49\x2f\x19\x9b\x51\xbf\x3c\x75\xfa\x0f\x7e\x51\x78\x3e\x71\x0c\xc7\x73\x83\x91\xa8\xb0\xab\x15\xfe\xdf\xd6\x1a\x9b\x69\xdb\x45\x7f\x70\x1c\xd8\xb7\x89\x67\x60\x2f\x0b\x4e\x60\xfe\xed\xcf\x38\x7a\xf8\x90\x27\xed\xdf\xc8\x47\xf6\xa3\x82\xf7\xaa\x34\x13\x3d\x0e\x71\x2c\xd7\xb9\x98\xb5\xbc\x31\xe4\x60\x84\xe0\x57\x1e\xd7\x8c\x47\xc0\xfe\x0a\x2f\xf4\x81\x97\xd8\xe9\x08\x07\x6e\xeb\x41\xaf\x5c\xf9\x1c\x0f\x3e\x96\x1b\x4d\x9a\x8c\xba\x2d\x72\x02\xe7\xba\x9a\xb1\x18\xda\x8e\xed\x5c\x52\x1a\xa6\x13\x0e\x60\xae\x38\x80\x27\xbf\xed\x2d\x67\xb5\xe7\xbe\x62\x77\x56\xbe\xda\x44\xb7\x70\x6c\x27\x23\xa4\x7e\xac\x15\x8e\x9d\x97\xd8\x0c\x33\x63\x1e\xfb\x06\x98\x87\xd3\x16\x89\x56\x23\x27\x9c\xdb\xcb\x53\xe3\x48\x7a\x28\xe7\xff\xf5\xce\x73\x6b\xb7\x4d\xc7\x9d\x2e\xca\xae\x13\x5c\x02\x7f\xa6\x37\x93\x86\x5f\xb3\x9d\xf0\x8a\xf5\xc5\xab\xf6\xe1\x8b\xaf\x66\x3f\xf0\xa1\xdd\x27\x2e\x6b\x57\xb1\xc8\xc3\xa6\x23\x84\x25\xa4\x2b\x9c\x0b\x1e\x6b\x4e\x9b\xad\x08\xde\xd0\x3c\x20\x5e\x31\xe9\x64\xa5\x30\x86\x19\xaf\x64\xbf\x87\x0e\x65\xa6\x17\x5d\x47\xfe\x5a\xdb\x49\xfe\xda\x21\xcd\x0b\xee\x2c\x16\xd2\xaf\x2e\x42\x97\x8d\x9f\xd2\x27\xbc\xc3\x71\x6e\x38\x76\x65\x87\x91\xa9\xb6\x49\x1b\xae\xd2\xb3\x60\x57\x6c\xe1\x68\x08\xc6\xcc\x70\xca\xde\xf9\x81\x53\x86\x6d\xf0\x87\xe3\xb3\x28\xc4\xb8\x73\x43\xcc\x9a\xd2\x23\xd1\x1e\x99\x71\xd6\xbd\x49\xdc\x4c\xbd\xca\x87\x16\xd4\xe3\x1c\xfc\xb2\xeb\x15\xd3\xc2\x87\x0d\xb3\x65\x66\x99\xf7\x84\xbf\x0f\x61\xe6\x4e\xe7\xd4\xe5\x74\x1e\xe5\x7e\xfa\xbe\x3f\x68\xc4\x6d\xfb\xf1\xd0\x5b\xfa\xfb\xd1\x61\xc1\xe9\x61\x40\xcf\x9b\x96\xee\x1b\x63\x11\x73\xdb\x6f\x1e\xe3\x32\xaf\x75\x3b\x18\xdf\x6e\xb4\x83\x77\x6c\xed\xb3\xe8\x10\xf2\x06\x1c\xd8\xb1\xc7\x94\x9a\xa5\x56\x48\xcb\x07\xda\xdd\x5b\xe2\xbd\x60\x53\xf6\xf8\x26\xed\x7e\x57\x68\x59\x4f\x06\x29\x76\xa6\x7c\x51\x72\xd1\x9b\xce\x1b\x0f\x60\xd6\xd1\x1b\x92\x87\x3a\x8c\xf8\x18\x4c\x67\xdc\x47\x33\xd7\x38\x27\x70\x54\x58\xab\x9c\x10\xfd\x58\x4c\x5b\x18\x06\x54\x06\xa8\x38\x2e\xfd\x44\xf7\x3c\xd2\xa3\xd9\xfe\xf8\xb3\xfc\x67\x3e\xf4\x28\x38\x2e\x87\xce\xdd\x3d\x31\x09\x41\x28\xe5\xa1\xe7\xce\x37\x61\x38\x19\xde\xc8\x22\x6e\xc4\x46\xe5\x7e\xb7\x70\x6f\x09\x33\x93\x69\x14\xf7\xb5\x98\xf3\xe6\xc1\xd0\x5b\x9b\x45\x96\x0f\x78\xe7\x61\x90\x1d\x18\x19\x94\x74\x34\x6b\x45\xb7\xe6\x9e\xb1\x7b\xe1\x7c\x3d\x2d\xa0\x9f\xe7\xbf\x56\x58\x82\x8f\x2f\x1a\xfc\x83\xc7\x75\x5a\xaa\xb2\x2c\x58\x0b\xc4\x72\xb1\x7f\xb8\x1d\xe3\xb9\x77\x49\xae\x41\xa6\x65\xc5\x89\xb2\x83\xf6\x66\xf4\xc5\xb0\xd8\xc2\x4f\x3a\xf2\xcc\x80\xdf\x3c\x18\xd2\x01\xb3\xbd\x30\x4f\xe3\x65\xd7\xc7\x04\x4b\xbf\x97\xa1\x39\xd4\x1b\x82\x0f\xae\xc7\x3e\x31\x00\xdb\x68\xd8\xde\x57\x5c\xec\x76\x99\x26\x91\x19\x81\x7b\x1c\xfc\x87\xca\x87\x5d\x0b\xee\x1a\x32\x0b\x2d\x34\x7c\x54\x97\xf9\x02\x48\x04\x07\x5e\x85\x89\x3b\x63\xf7\x83\x2e\x95\x0f\xf1\xb5\xd9\xf8\xe0\xbc\x95\x7a\xf2\xb2\x8c\x0c\x30\x6c\x7d\xf8\xdc\x63\xc1\x8e\x26\xd9\x5f\xbb\x0a\xc8\xac\xaa\x1f\x2b\x5e\xaa\xbb\x36\x6e\xe5\x9d\xee\xb1\x69\xff\x9d\x05\xbf\x7f\x39\x15\x63\x8d\x8a\xac\x76\x3e\xbc\xa5\xae\x13\x6f\x24\xdc\x3a\x43\xe5\xa5\xea\x34\x3c\x18\x94\xba\xeb\x62\x56\xc0\xa4\x25\xe7\x19\x87\xbf\x2c\x0a\xb1\xdc\xbe\x33\x68\x0c\xb3\x78\xae\x3a\xcf\x69\xc3\x77\xcc\x99\x7e\x12\x9e\xa7\xdb\x22\x2f\xf0\x8f\xc2\x12\xd2\xc6\xa6\x3b\xd7\x4a\xee\x17\xbb\xb9\xc9\xe1\x86\x6d\xf2\x08\x90\xff\xd9\xd2\x42\xee\xe0\x58\x69\x3a\x5f\x5c\xf8\x5d\xe6\xc9\xec\xbd\x3c\x59\x3f\xd1\x82\xd9\x12\x31\xe1\xe2\x4f\xdc\xf3\x84\x9f\x2f\xbf\x58\x36\xbf\x20\xb8\x2d\x1b\x73\xe6\xd4\xed\x75\x32\xcb\x40\xd7\x5f\xdf\x4c\x33\xd2\xa0\x8b\x52\xb4\x18\x0b\x03\xc3\x4c\x83\xc4\x10\x01\xbb\xb9\xe6\xbe\xe0\x7a\x75\x7c\xf9\x89\x19\xb3\x9d\xf9\x3f\xbc\x88\x71\xc1\x26\x5c\x29\xdb\xc5\xe9\x46\xbf\xa1\x7b\xc2\x87\xb6\x35\xd2\x3d\x54\xc8\x73\x4f\xe7\x44\x97\x4f\x7b\xa3\x98\xbf\xf2\x98\x76\xc8\x0d\x66\x5b\x9a\x71\xd7\x51\xe3\xc3\xc0\xec\x4c\x8c\x1f\x7e\x72\xe4\x50\x4f\x5e\x9b\xcd\x8c\xe1\x8c\x4c\x51\x5b\x6f\x46\x54\x59\xe8\x11\x27\x30\xe1\x29\x2c\x24\xd8\x0b\x4d\x81\x6d\xf7\x2e\x44\x60\xa5\x77\x33\x93\xa6\x6c\xb9\x02\xe3\xf0\x93\x8d\x6f\xb5\xdf\x4f\xc8\xa6\x1e\x3a\x33\x8f\xb6\xcb\xf6\xa8\x1b\xc2\x81\x76\xf5\xe0\x5e\xd3\x43\x7e\x72\x2a\x7f\x71\x77\xcc\xd6\xdb\x93\x30\xee\x5c\x26\xc6\x07\x7b\xfe\xe5\x26\x20\x4b\x34\x33\xc8\x2c\xc6\x9e\x01\xbe\x95\x87\x71\xf7\xb4\x63\xe0\x8d\x3d\x94\x71\x9b\xe1\xd4\x69\x61\x6e\xb4\x0c\xfc\x16\x7a\x4e\x19\x34\x33\xfd\xda\xfe\xfc\x6b\x57\x17\x89\xa7\xbb\x38\x3d\x78\x36\x2f\x54\x98\xea\xee\xe5\x81\xc5\xaf\x70\x2d\x5b\x36\x8f\x6b\xf6\x7a\x1f\xcb\xaa\x93\x89\xdf\x92\x10\x05\x4f\xf1\xf3\x63\xa5\x0d\xf3\x18\x41\xe9\xfd\xfd\xd4\x03\xbe\x2d\xf1\x80\xeb\x3e\x69\x64\xe2\xde\x7a\x24\x80\xc7\xf3\x18\x08\x9b\x58\x19\x99\x3c\x19\x99\x98\x33\x85\xa5\x09\x97\xe1\xff\x56\xbb\x97\xdb\x15\xa6\x1a\x55\x8e\x68\xe5\xeb\x78\xdc\x17\xc7\x6b\xce\xf1\x18\x9e\xdd\xb9\x13\xdb\x0f\xf3\xbe\xbc\xaa\x3d\x03\xcb\x3b\xad\x8b\x3b\x59\xd8\x00\x9e\xe9\x45\x9e\x75\xe3\xa5\x90\x5b\x44\xb0\xe0\xa9\x2b\x13\x7b\x8b\x27\x68\x4e\x13\xa3\xc4\x49\x9f\x3c\x6c\x48\x72\x7b\x0b\x59\x2b\x8d\x02\xf6\xb8\x2f\x07\xa3\xb0\x0c\x70\xc3\x1c\xe6\x41\x8f\x73\x78\xf2\x81\x98\x78\xe2\xee\xed\xe7\xb6\x6e\x74\xa6\x05\x37\xd8\x7c\x85\xa7\x8d\x8c\xdc\x56\xfa\x57\x8f\xac\xf4\xeb\xe1\x59\x7f\xfb\xbc\x02\x5a\x43\xe8\xf0\xf9\x23\x78\x70\x50\xb0\x78\x28\xd8\xb1\xeb\xbc\xf9\x3d\x86\x15\xcd\xba\xd3\xda\x72\x4b\x31\xe5\x95\x3b\x1c\x4d\x26\xf0\x8c\xe2\xcb\xac\x0c\x63\x8c\x5c\x92\xc1\x8e\xad\x02\x63\x60\x5b\xe9\x32\x10\x71\x98\xd3\x5f\xc1\x28\x58\x08\x07\x51\x16\x9e\x39\xbe\xf0\x16\xc9\x6a\x59\x5e\x75\xa2\x95\xb3\x57\x84\x75\x58\x4b\xee\x15\x33\x63\x4d\x91\x74\x0d\xf6\x94\xbc\x09\x34\x47\x0a\xd7\xea\xab\xf0\x68\x21\xb3\xe8\x15\x20\x59\x88\xb3\x30\x6d\xd5\x9d\x32\xdf\x6e\x3f\x46\x17\x08\xd7\x78\x17\x8e\xe9\x3f\x20\x30\x80\x6b\x37\x98\x75\x97\xad\xaa\x8c\xbf\xf1\x3e\x85\x19\xec\x82\x75\x67\x7c\x9d\x26\x3d\x00\xdf\x93\xa9\x4e\x1a\x66\x04\x0b\x4a\xef\x70\xf3\x4f\xd9\x9d\x91\x0f\x99\x5f\xc8\x73\x86\x6c\xce\xa6\xe8\x2e\xfa\xe9\x22\xb8\x6b\x89\xc3\x1c\x5b\xe0\x71\x35\x8e\x66\x46\x1c\x6f\x3e\xe6\xc9\x84\x7d\x67\x6e\xe2\x3e\x8c\x40\x42\x9d\x26\x66\xc1\x47\xe1\x9d\x77\x48\x4b\xa9\xe3\xc9\x7c\x19\xbe\x5f\x5e\x84\xdf\xb2\xf8\x37\xdf\x10\x7f\xe1\xb0\x4e\xa7\x27\xa6\x8b\xa5\x7a\x3c\x81\x48\x95\x78\x9f\xfc\xb4\x96\x39\x3d\xe8\xf2\xef\x5c\x8e\x3e\xc9\xe5\x75\x93\x12\xe9\x63\x63\x86\x60\xe7\x48\xbf\xea\x9e\x5e\x58\xb2\xe4\x91\xb0\xc2\x13\x47\x1e\x70\xe8\xb3\x99\x44\x9a\x5d\xf7\x66\x48\x19\xec\x04\x2c\xba\x58\xb8\x8b\x5b\xda\x4b\x66\x9a\x38\xa5\x5f\xbc\xbc\x5d\x6e\xac\x4e\xea\xfb\xb0\x9d\x6f\x1a\x68\x5b\x74\x3a\xb0\x99\xd7\xc4\x02\x98\x9d\x26\xd7\x97\x4c\x0f\x64\x89\x59\x15\x1a\x97\x3d\xd4\x96\x75\xe5\x73\x2c\xdd\xbe\xe2\xec\x0b\x11\x9e\x2b\xd3\x3b\xbb\x30\x8f\x85\xde\x70\x36\x1f\x87\xef\x6d\xe9\xcc\x96\x19\xad\xec\xa3\x50\x3a\xde\xee\x8d\x3e\x86\x0e\x9a\x01\x4e\x12\x62\x40\x9b\x70\x30\x5e\xb9\xdb\xe6\xe1\x9e\x9a\x95\xc6\x99\xf5\x00\x52\x21\xd1\xc6\x50\xc7\x31\xb3\x95\x9b\xa6\xe0\x63\x13\x74\xbb\xdd\x14\xae\x5e\x6f\x47\x7b\xf5\x93\x98\x4d\xdb\x0f\x5c\x60\x97\x47\xae\xd3\xb9\xf0\x8e\xb8\x7f\x2c\xf8\x98\x2c\xab\xf5\xb0\xed\x33\x2f\xc4\x14\xfa\xa0\x0f\x1e\xeb\xca\x9f\xb7\x2c\x2f\x77\x11\x8a\xef\x8c\x68\xed\x15\xb1\xbc\x6b\x5a\xe9\xb6\x1b\x7e\xb6\x0a\x06\x38\x72\x5c\xc7\x1b\x5c\x49\xc3\x49\x6c\xaf\x4e\x38\xab\x07\x51\x91\xae\x98\x11\x21\x2e\xb0\x0b\x8f\x85\x9d\x25\x26\x51\x22\xf8\xb6\x35\x26\xa0\xec\xd1\x3f\x4e\x37\x0d\xef\x9d\x07\x8f\xae\x20\x62\x8d\xbe\xec\xb2\x65\xa7\x45\x5d\x82\x93\x96\xac\x40\x8f\x89\xe7\x4b\x0e\xcb\xac\x91\xac\x1b\x20\x37\xfe\x5e\x47\x1f\x75\x8e\xf0\x81\x16\xcd\xbe\x08\x18\xfb\xc9\xc3\xcf\xf5\xc4\x6e\xcc\xa4\xef\xfb\xd7\xa9\xd2\xdd\x33\xfb\xee\xbb\x60\x21\x2b\x43\x47\x07\x28\xe4\xec\xb6\x2a\xd4\x21\x7c\x6f\xc7\x48\x15\x86\xbe\x30\xfe\x5a\x64\x08\x2c\x85\x72\x84\xb5\x3d\x37\xd3\x25\x22\x72\xcb\x95\xbf\x21\x29\xb9\x23\xf4\xdb\x60\xd7\xf1\x79\x2b\xef\x88\xbb\x13\xde\x1b\xdf\xd9\x66\x61\x62\x5d\xdc\x69\x32\xeb\xe0\x99\x92\xff\x41\x9a\x8a\x7f\x71\x50\x57\xf0\x67\xb9\x33\x2c\x54\x36\xb2\x9e\x71\xdb\xcd\x78\xc2\xb3\x73\x21\x2b\x2a\x49\xa7\x2e\x5e\x2c\xf3\xa4\x4f\x59\xdc\xd0\xc1\x64\x9e\x42\x1b\xde\x9f\xdc\x4c\xc5\xad\xc5\x22\x37\xa6\x18\x3b\xce\xf4\xef\x8d\xf0\x5b\x3b\x46\xf7\x89\xae\xd0\xbc\x7c\xa0\x9f\x0d\xc4\x46\xdc\xe5\x21\x16\x17\xc0\x7d\xe7\x88\x53\xf8\x8b\xad\x20\x54\xfe\x73\xf2\x08\x5b\x74\x6f\xbf\x0d\x36\x74\xa7\x35\xb1\x74\x0a\x05\x34\x45\x87\x8c\x34\x88\xa0\xfb\xc1\x0e\x23\xa4\x57\x37\x6b\x44\x07\xd2\x4d\x2d\xcc\x20\x5e\xe1\x29\x06\x83\xaf\xc5\x7e\xe5\x1e\x3f\xe9\x2f\x85\x5f\x63\xbe\xf2\x86\x22\x8f\x9d\x1c\x5e\x80\x89\x31\x9e\x9d\x9a\x9e\x01\xae\xbc\xc4\x7e\x30\x72\xda\xf2\xca\xec\x22\x92\x60\x62\x41\x45\xf0\x3a\x2e\xc8\x2e\x6f\xd3\x25\x9c\xad\xc8\x4e\x86\x7a\x76\xc7\x2d\x70\x75\x41\x4c\x0d\xed\xee\xeb\xca\x83\x4e\xfc\xde\x5f\x60\x53\xf6\x76\xde\xef\x78\x84\xa9\x1d\x83\x7e\x9c\x2a\x7e\x2f\x53\x9c\x7d\x1c\xf1\x68\x3d\xb1\x8a\x89\x7f\xcc\xca\x60\x7e\xaa\x42\x33\xfc\xab\xd9\x1e\x16\xdc\x6c\x67\xcc\x4b\x32\xd8\x2f\x17\xe4\xb5\x0c\x58\xc3\x2d\x07\x48\x14\xa1\xed\xc3\x2e\xf2\xc1\x25\x7a\xea\x3e\xd8\x7b\x45\x0e\xee\x09\x34\xf3\x08\xcb\x2b\x26\xfc\xd6\x27\xfd\x95\x39\x21\x5a\x52\x33\x7e\x93\x5c\xc5\xac\xe3\xbd\x9e\xdd\x54\xfa\x1b\xc1\x4e\xc6\x24\xfb\x44\xfb\xa6\xec\x15\x8b\xdf\xf3\xba\x4d\xb4\xcc\x1e\x5a\xe9\xda\xba\x57\xc6\x51\x18\x5e\x3c\xe3\x1e\x75\x12\x15\x5e\x89\xf3\x58\x4e\x2c\x1b\x7a\xc2\xe6\xf8\x25\x60\xc0\xdb\xde\xf9\xdc\x03\xdb\x77\x0b\x4f\x97\xd7\xd5\x9d\x89\xb3\xb9\xdd\xe5\x2a\x96\x32\x87\x5e\x6a\xcf\x63\x3d\x54\x7f\xf6\xed\xa4\xd7\xee\x11\x6e\xc1\x8d\xaa\xf8\x51\x88\x40\xd9\x65\xc6\x59\x6a\xf5\x08\xa4\x4f\xb2\x89\x40\x1e\x36\x9e\x21\x5f\x42\xee\x39\x22\x00\x9c\x33\x54\x7b\x16\x02\x95\x5d\xc5\x96\xa4\xb5\x4e\xf5\xc1\x34\x66\x57\x8e\x6d\xd6\x91\x3f\x99\xfa\x8d\xcf\xbe\x57\x1d\x95\xb4\xc9\x51\x98\x69\x93\x2f\x88\x2a\x2d\x8e\xe9\x48\x67\x39\x64\x0f\x88\x4b\xd4\x43\xe2\xb5\x17\xd5\x9e\xce\x07\xe3\x20\x7b\x72\x05\xed\x63\x6d\x31\x04\x3d\x7d\x7a\xd3\x19\xaf\x0e\x04\x32\xef\xf0\x10\x3e\x60\xf4\xe5\xa1\x9d\xb0\xab\xc5\xa0\x93\xdb\xea\xa0\x02\xde\x8a\x39\x33\x76\x62\x08\xfc\xbe\x1e\xdc\x58\xbb\xc1\x0f\x0b\x5c\x4f\x65\x42\x78\xb1\x92\x61\xea\x16\x65\x79\x9e\xa3\xda\x9f\xaf\xb2\x07\xd6\x16\xbe\xa4\xff\x33\xd7\x45\x3b\xc0\xa0\x0d\x11\xad\xee\x24\x33\xca\x44\xcf\x48\x57\x62\xbe\xfc\xcd\xeb\x72\x27\xb4\xec\xa5\x06\x3e\xf3\xcc\x87\x76\xa8\x81\xff\xb0\x66\x25\xda\x33\xdd\xa4\xb2\x42\x6c\x81\xec\x11\xf0\x6b\x25\x86\x8c\x33\x6c\x0b\x36\xe2\xbd\xf6\xb0\xf2\x07\x2d\x5c\xd8\xea\x5f\x1c\x50\x8b\x8f\x33\x2b\xaf\x7f\x92\x58\x06\x04\xb8\xb9\x44\xe7\x16\xa7\x89\xb8\x37\x51\x2a\xbe\xb1\xf2\x5c\xa6\x26\x16\x20\x14\x19\xaa\x27\xcd\x1a\x6e\x9b\x3f\x90\xad\x69\x87\xb5\xf3\x7f\x20\x22\x51\xf6\xfe\xdc\x77\x9d\x5f\x45\xf6\xb8\xed\x77\x1e\x66\xf3\x6e\xb6\x01\xda\xf8\x7b\x52\x81\x47\xae\xcc\xce\x70\x65\xdd\x7c\xc5\x29\x1e\xcc\x57\xb3\x90\xff\xd0\x95\x31\x5b\xbb\xb1\xbe\x61\x06\x95\x60\x73\x52\x4e\x4a\x78\x68\xb7\xcb\x45\x4c\x90\xaf\x95\xb6\x99\x86\x51\x7b\x88\x25\x9d\xca\x8b\xd9\x47\x5f\x01\x69\x31\x05\x5d\xf9\x52\xb6\x31\xc5\x7c\x2a\xee\x6a\x6f\xf1\x5f\xe0\x0b\x85\x19\xca\xb0\x9d\x04\x64\x0e\xb3\xd7\xac\xe4\x38\xe6\x2f\x52\x07\x9e\x45\x15\xd0\x87\x80\xa8\x21\x7f\x85\xd0\x0b\x23\xf3\xfd\xf9\x09\x28\x1d\x3f\x69\xb6\x19\x7e\xd2\x16\x9e\x17\xd1\x7e\x0d\xf3\xe0\x4a\x78\xd2\x83\xd5\x9d\xb7\x83\xf9\x66\xfe\xb5\x57\xc7\x2f\x27\x3e\xae\x00\x81\xab\xf1\x88\x9a\xed\x5b\x15\x56\x8b\x86\x51\xf8\x71\xa8\x8e\xfe\x97\xe5\x27\x00\x65\x9e\xcc\xfa\x27\x7d\x56\x6d\x4a\xec\xe6\xa3\xc2\xea\x55\x58\x93\x73\x61\x0e\xec\x88\x77\x43\x5d\x3a\x95\x08\xde\x76\xa9\x85\x8b\x1c\xc2\x3f\x12\x4f\xf8\xcf\x39\xfb\x66\x9a\xa1\xd1\xfd\xdd\x6a\x65\xb1\x8b\x88\x06\x0e\x3a\x1d\xb0\xbf\x23\x03\x89\x4d\x50\xba\x1b\x0c\x12\x6d\x84\xf1\xd2\x99\xdb\xa6\xde\x98\xdd\xd2\x54\xbe\x05\xbf\x46\xca\xf1\xa0\xcf\x1a\xe2\x77\xee\xb4\x11\x9b\x17\x20\x0f\x78\x0c\x5f\x5e\x5a\xdd\xf9\xee\xf8\xbd\xce\x63\xe1\x45\x43\xe5\x82\xa1\x5a\xa1\xb7\x7e\xe9\xf2\xc0\xa4\x63\x3d\x3d\xe8\xe4\xfe\x02\x26\x87\x0d\x3e\x99\x72\x4e\x0d\xf3\xde\x67\x96\xdf\xa6\x14\x15\x59\x1a\xdc\x47\x1d\xfe\x10\xb2\x27\x72\xee\x3c\x0a\xd5\xd2\xf1\xef\xb8\x50\x6f\xa2\x08\xf9\xb7\x2f\x82\x7e\x99\x19\x98\xc5\x0d\xa7\xaf\x98\x86\x05\x5b\xbf\xc8\xa8\x2a\xc3\xea\xf1\xe9\x95\x30\xfe\xba\x0f\xe4\x01\x74\xa8\x10\xe1\x85\xdf\x7f\x6d\x09\x5c\x8f\x39\xd1\x03\x85\xd8\x85\xc7\x81\xd7\xcf\xff\x43\x72\x04\x06\xff\xe9\x1e\x30\x09\x13\x5c\x41\x0f\x4a\x60\x70\x75\x1d\xbb\x25\xea\xa4\xaa\x74\x47\x32\x06\x1d\x89\x98\x49\xaa\xa7\xf9\x72\xeb\x09\xbc\x82\xce\xeb\x9c\x59\x15\x21\x32\x6a\x66\x4e\xe4\x8d\x24\x6c\x38\xc2\x74\xbc\xb7\x2a\xc3\x85\xfe\xd7\xb1\x3b\xe2\x1a\x87\x2a\x75\x66\x14\x56\x7c\xfa\xc9\xbd\xf6\xaa\x27\x39\x3c\x99\xb5\xab\xad\xe8\xa2\xbf\xb4\xc4\x5b\xc5\x6f\xd9\xcc\x22\x55\xbc\x05\x3f\x68\xcc\x48\xbc\x2c\xff\xe3\x96\xcc\xd9\x5e\x66\xe9\x09\x09\x45\x86\x07\x63\x81\x6a\x11\x21\x2e\xfc\x13\x42\x9e\xaa\xd3\x34\x05\xe6\x40\xc3\xfd\x22\x18\xce\xd2\x8c\x67\x53\x74\x22\x27\xd3\xb8\x3a\xb0\x08\xe8\xd6\x3f\xac\xfc\xe3\x94\x5f\x31\xeb\x87\xb3\xf6\x20\x34\xd6\x47\xe0\x0b\x00\x6c\x48\x3c\x5d\xc0\x37\xf1\x14\x69\xe5\xc3\x44\xbe\x22\x0c\x9d\x05\x32\xb7\x4e\x34\x32\xb6\x1e\x3d\xeb\x41\xb6\x41\x74\xc1\x15\xc1\x21\x2f\x1c\x52\x25\xbe\x2a\x68\x5d\x16\xed\x30\xc2\x64\x21\x8e\x16\x60\xc9\x2a\x44\xa8\xbc\x1a\x54\x27\x12\xbe\xc4\x5c\xd8\x12\xcf\xb6\x65\x47\x3b\x2f\x3e\x16\xca\xcd\x16\xf8\x62\x66\xcc\x19\xe4\x03\xfe\x0e\x5a\x8f\x25\x95\x83\x8c\x82\xfe\xed\xae\xeb\x25\xbb\xcb\x60\x03\xf7\x31\x92\xf0\x70\x72\x55\xe5\x1b\xfd\xfd\x38\x09\x9c\xdb\x6b\x92\x15\x13\x95\x17\xb3\x10\x5c\xbb\x33\x2a\xcf\x53\x7e\x60\x15\x5f\xe5\x59\xb0\x78\x83\x2e\x03\xbc\x3a\x49\x3b\xcf\x3a\x25\xbe\x88\x9d\x8c\xc4\x07\x9b\x6e\x51\x58\x55\x4c\x70\xb0\x92\xf7\x20\xf2\xb3\x90\xc9\x40\x0b\x77\x43\x34\x68\x0e\x05\x26\x5e\xd5\xf3\xc9\xd6\x20\x90\x2a\x2c\xf4\x23\xd3\xa3\xc1\xe2\xdf\xeb\x04\xcb\x4b\xc3\xe2\x67\xbf\x2c\x38\x39\xf7\xda\x9f\xbc\x67\xe4\x22\x58\x80\x89\x73\x9a\x11\x46\x7a\x2e\xa3\xa2\x7f\x3f\x29\xa2\x73\x7e\xc3\x9b\x57\x15\x11\xdd\xb9\x1d\xaa\x19\xc4\xfd\x4c\x02\x3a\xcc\xe1\xb3\x20\x86\x0a\x18\xbe\xc9\xc3\x54\xde\x6f\x40\x4b\xf8\x4e\x5d\x25\x3e\xda\x40\x63\x6c\x21\x0f\x5d\x8a\x6d\xec\x22\x67\x18\xb9\x4d\x9e\x57\x46\x07\xf2\x5a\x24\x4d\xbe\x69\x40\x7c\x99\x71\x43\xde\x34\x0a\x4e\x1c\xd0\x2d\xa2\xb3\xf3\x6a\x47\x20\x66\x01\x94\x09\xec\xde\xcf\xee\x87\xc9\xb4\x33\x7f\x80\x08\xd4\x99\xd9\x25\xf6\x74\x16\xec\x48\x87\xc3\x88\x2c\x91\xdc\x61\x0b\x75\x17\x93\xc0\xae\xc2\x43\xd4\x1a\xa0\xa0\xad\x22\xd2\xe3\x52\x9e\x0e\xfd\x99\x7b\x8c\x64\xcf\x8c\x7b\xd4\xd1\x11\x1e\xad\x49\xb7\xc6\x2d\x2c\xbd\x66\xfe\x54\xb9\xe7\x1c\xd4\xbc\x95\xa1\xa2\x83\x36\x11\xd1\x4d\x42\xfe\x19\xba\x00\x06\x64\x90\xa0\x5c\xdd\x0c\x0e\xfe\xe1\xde\x60\x73\xaf\x07\x64\x56\x1f\x7a\x87\xd0\x18\x2d\xda\xba\xf1\x08\xa4\xa5\xd7\x42\x65\x77\x52\xbe\xf5\xf6\xda\xca\x3e\x68\x42\x3d\xe9\xbf\x29\x84\xc7\x27\x0d\xf8\x8c\x44\x52\xe0\xf1\x76\xa7\xe7\xbf\xdc\xa2\x00\x5a\x66\x95\x3e\x68\x8e\xea\x9d\xd8\x93\x87\x7b\xac\x8f\xdb\x21\xca\x58\xe2\x45\x8e\xa1\xd8\x95\x83\x61\x71\x6c\x15\x36\x01\xc4\x16\xd4\xef\x70\x63\x76\x4b\x04\xf9\x48\x03\xd7\x0a\x9c\xb7\x56\x04\xb1\xd8\x8c\x1b\x75\xce\x64\x6c\x59\x0e\xb3\xf1\x37\xd4\xa8\x18\xe4\xbd\x27\x8e\x85\xdb\xb6\x47\x6d\x3e\x9d\x1b\x91\x40\xcf\x05\x04\xfd\x21\x7d\xf3\xef\x64\xbe\x9a\x86\xc0\x83\x9c\xcd\xc2\x83\x6b\x16\x2c\x18\x5e\x7b\xcf\x9b\x02\xa8\xa2\xd5\x27\x36\x82\x1d\x76\xe7\xf9\x44\x66\xca\xe9\xe4\xeb\x20\x4f\xa7\x52\x14\xa3\xc1\xc3\xdc\x38\x5d\xa4\x62\xe1\x32\x31\xb2\xda\xcf\x80\x7e\x7a\x0f\x2d\x89\x3c\x6f\x28\xdc\x9e\x73\x77\x13\xee\x7a\x47\x00\x73\xb7\xa3\xce\x9c\xf7\x41\x96\xeb\x08\x4a\xa7\xb8\x5b\x48\x27\x68\x34\xea\x9f\x5e\xe6\x91\x70\x25\x0f\x80\xdd\x6c\x9e\x13\x54\x57\x69\xf1\xbc\x4c\x71\x63\x14\xa3\xdc\x64\x62\x6a\x55\x36\x65\x93\x5d\x80\x9a\x79\xe9\x68\xe6\xeb\xc4\xe8\x79\x2a\x81\x90\xbe\x5b\x98\xa7\x9b\xe7\xc8\x81\x40\x38\x0b\xe2\x88\x2b\x3a\xc7\xb4\xc5\x4f\xab\x87\x78\x0a\xcb\xd2\xcc\x64\xd0\x56\xe6\xc9\xca\x91\x79\x24\x86\x19\xa2\xeb\xcd\x69\xc3\x81\x49\xf7\x3b\x81\x8a\x97\xc2\x95\x1c\x0c\x58\x62\x64\x3c\xbc\xa7\xd0\x4c\xde\x0a\xcf\xb5\x6f\x0a\xef\x02\xfc\x27\x4a\xb9\xa9\x50\x1c\xb9\x14\xc3\x40\x82\x7e\xfe\xe2\x13\xb6\xdd\xae\xb8\x1d\x21\x40\x5f\x53\x9f\xfe\xe2\x95\xcd\xf0\xcd\x6b\x7a\x2c\x72\xd5\x8b\xdb\x07\x92\x23\x3c\x51\x25\x0d\xca\x92\xd3\xe0\x10\x79\x95\x00\x56\xe6\x15\xe0\x6e\xe0\xdb\xa3\xce\x75\xd4\x28\xf8\xd6\x67\x1c\x60\xf3\xc9\xab\x2a\x87\x00\x45\x6f\xf0\x4c\xbe\x05\x24\xa7\x82\x8c\x88\x75\xae\xef\xa5\x21\x62\x7c\x88\x1b\x6a\xeb\x84\xcb\x65\x72\x27\x85\x32\x76\x60\x08\x50\x25\x50\xa8\x76\xf8\x96\xe1\x3c\x14\x50\xc1\x57\x10\x8e\xd8\x62\x6b\x87\x7c\x57\x9d\xf9\xd9\xea\x19\xf9\x41\xf4\xc0\x31\x24\xb9\x4d\xa2\xc4\xeb\xe6\x40\x1b\x2f\x8f\xaf\xde\x20\xa2\x75\xc7\xd3\x69\x81\x45\x23\x14\xe3\x01\xcd\xc8\x47\x85\xa8\xd8\x8f\x72\xbf\x3c\x3c\x90\xc3\x8f\x7a\x65\x37\xd1\x3b\x9c\x0f\x3e\xbf\x45\x7a\xeb\xb5\x8e\xbb\xee\x6d\x64\xf7\xbb\xc2\xd6\x4e\xd0\x7e\x4f\x0c\xc3\x9f\x97\x18\x26\x00\x6f\x06\xf3\x01\xd4\x5b\xc8\x9c\x3b\x9d\x57\xfb\x39\x33\xb1\x49\x25\x8b\x25\x90\xc3\x81\x39\x3e\x9d\x07\xaf\x01\xd2\x38\x73\xc0\x07\x2b\xd7\x0e\xf5\x90\x13\xef\x96\x43\xbb\x17\x41\x08\x31\x98\xa3\x06\x13\x17\xee\x90\xa5\xae\x53\xf5\x11\x07\x05\xb9\x52\x1e\x6c\xc8\x53\x6c\xf5\x6e\x87\xa9\xd4\xb0\x98\x49\xf6\x03\x48\x3c\x76\xe3\x17\xc7\xda\x32\xbc\xe2\x9f\x84\x47\x7d\xd9\x63\xf3\x6e\xc1\x89\x37\xce\xe9\x9e\xe6\x82\xd5\xc2\x91\xaa\xc1\xbd\xc5\x37\x01\xdf\xec\xb2\x80\xa0\xe5\xd1\xd6\x95\xbb\x68\xdf\x83\x0f\x57\x46\x27\xe6\x95\xd6\x9b\x1f\x93\x10\x3e\xce\xd7\x06\xae\x1e\x33\x89\x78\xb5\xb1\x68\xcc\x5f\xd5\x18\xcd\x2a\xd9\xb7\x4a\x21\x7d\x6e\xab\x8d\x35\x2a\xad\xd3\x4d\x09\x57\x38\x19\x75\xbf\x29\x53\x8a\xd4\xc8\xd6\x4a\xdc\x24\xcb\xc1\x68\x9d\xba\x0a\x2b\xaa\x56\x07\xf3\xd6\xf9\x15\x75\x06\xcb\x34\xcc\xcb\xf2\xd0\x4f\x55\x5c\xbb\x17\xed\xce\x98\x07\xda\x0d\x42\xa4\x8c\xf3\x56\xa5\x8c\x3a\xdf\x7a\x26\xbb\x2d\xd3\xd9\xb2\x33\x3b\x17\xb4\x80\x93\x02\xb3\xad\x15\x67\xca\xec\x30\x43\x44\x0c\x66\x1f\x9c\xb9\x17\x24\xa0\x2a\xaa\x06\xcc\x0d\x43\x1e\xd4\x2f\x08\xab\x04\x85\xdc\x19\x1c\xcc\x2e\x16\x7e\x0a\x3c\x2a\x2d\xf7\xc8\xb2\x9e\x19\x7e\x7c\xd0\x4f\x92\x15\x18\xc9\x79\x11\x8c\xd2\xf8\x08\x7c\xf4\x97\x57\x3f\x1e\x0d\x1f\xef\x58\x92\x63\x6e\x74\x53\xf5\x2b\x36\x91\x4c\x4a\x3b\x85\xac\x72\x6c\x65\x96\xff\x7e\x34\x33\x01\x9a\x24\x0c\x74\xb1\x15\x9a\xaf\x83\x5b\x49\x9d\x6a\x81\xe2\xfd\x34\x5f\xc7\x17\xae\x57\xaa\x10\xd0\x8c\xae\x7b\x0b\xc7\xbd\x54\xb9\x3c\x78\xce\x09\x55\x5a\x74\x4c\x72\x6f\xc2\xc9\xdb\x05\x6b\x34\xfe\x1c\x2d\x80\xff\x15\xbf\xc4\xa1\xdc\x96\x1e\x1c\x39\x5c\xfc\xf5\x9d\x23\xdd\xa5\x7f\x5f\x8b\x96\x18\xe2\x56\x3b\x1c\x34\x08\x20\xf2\x2b\xa2\xb4\x54\x66\xd3\x69\xb0\x3d\xb7\x7d\x1c\x2b\xe2\x1a\xb7\x39\xb3\x38\xe6\x9b\x18\x08\x7f\x93\x18\x0f\x9e\x0f\xdb\xc9\x21\x5c\x9c\x45\xce\xb6\xb3\xca\xbc\xd1\x2e\x21\xec\xa2\x65\x6e\xfb\x78\x0b\xda\x28\xdf\x23\x62\x72\x3f\x8d\x8f\x85\x36\x84\xf1\x1c\xa1\x41\xad\xd8\x3d\xab\x56\xfc\x48\x8f\xf0\x2b\x02\x9e\xdd\xbf\xd1\x6c\x97\x25\xb2\xee\x70\x3e\xe7\xa6\xda\xf1\x73\x21\x7f\x15\x14\x3c\x22\x52\x89\xbc\x2b\xb2\xc5\x89\x0c\x30\x3d\x1f\x59\x8e\x76\x16\x07\xd3\xac\x6d\x68\xd5\x3b\x9c\xd5\xec\x2c\x66\xec\x3b\x92\x33\x9a\x51\x78\xd6\x87\xd3\x6d\xf9\xd2\x76\x4f\x11\xd7\x9e\xdb\x4b\xcc\x0d\x07\x5d\x64\x95\xb6\x38\x97\xa8\x1f\xea\xd5\x18\x57\x10\x60\x12\xa3\x30\x18\xfc\x7a\xbf\x7c\xda\x0e\xab\xfb\x48\xd6\x8a\x5d\x05\x8d\xf1\xa3\xe0\x6d\x73\xdb\x42\xa4\x7b\xfc\xec\x02\x00\xd3\xcb\x42\xb5\x76\xd1\xab\x19\x2a\x1e\xe3\xcc\x12\xa6\xb3\xf8\x79\x64\x56\x6e\xb3\x19\x03\xc4\xd9\x65\x77\xa6\x83\xbc\x75\x12\x65\x09\x2e\xa6\x5d\x71\xd2\xf4\x6e\xc8\x5e\x0e\x2e\xa8\x67\xd0\x2c\x67\x20\x27\x94\x1b\x75\x87\x2d\x74\xf4\x50\x79\xee\x60\x6e\x73\x30\xdb\xb7\x23\xc6\xcb\x6d\x1e\x9c\x39\x98\x08\x7d\x43\x5e\xb5\x44\xb3\xaa\x71\x64\xad\xf0\xd3\x7e\x4e\x5c\xfb\x05\xeb\x8a\xb7\x35\x67\xc7\xda\xa9\x20\x7f\xb7\x1a\x7f\x5a\x69\x54\xb7\xcc\xe2\xf4\x87\x70\xd2\xb3\xd9\x1b\x10\x92\x96\x56\x1f\xdb\x6a\x2f\xf2\x46\x89\x38\xab\x4b\x4a\xa5\x8e\x0f\x57\xd3\x99\x22\x00\x0f\x26\x46\x73\xbb\x5f\xdc\x24\x9f\xb7\x05\x3d\x22\x91\xf4\xce\x20\xcd\x89\x89\x2c\xee\x9f\x0b\xb3\x02\x6d\x8d\xf7\x0a\x71\x31\x97\x70\xde\x66\x01\xe1\x46\x82\x69\x4b\x54\x2d\x3d\x87\x14\x11\x05\x83\xe6\xbc\xc9\xa9\x46\x81\xd8\x41\xc5\x30\x72\x85\x79\x38\x00\xe1\xe0\x4f\xf4\x07\xe1\x4e\xe1\x45\x8e\xd6\xe2\xa2\x96\xad\x3f\x67\x7f\x03\x5d\x53\xf9\x5a\x1e\x05\xff\xa4\x20\x12\xa0\x89\xcb\x19\xd2\x3a\xa1\xbd\x62\x29\xda\xbe\x1b\x13\xbe\xc0\x5a\x0f\xdd\xff\xab\xb3\x44\x46\x70\x22\xf1\x03\xf9\x25\xa8\x78\x3c\x6a\xa2\x53\x88\x21\x3f\xc6\x39\x99\x89\x62\xd9\x6f\x67\x80\x4b\x27\x22\x4f\x3f\x7f\xdc\x62\x7e\x6e\xaa\x26\xd1\xf5\x58\x12\x73\x4e\x64\xf9\x17\x2e\xd0\x2b\x33\xd1\xd0\xa3\xf0\xec\x81\x2e\x97\xc4\x0b\x22\x40\x9a\xf6\xe6\x0d\xf7\xc0\xcc\xef\xe6\xe1\x19\xc5\x23\xfb\x13\xc4\x9a\x88\x21\xdd\xe3\x26\x58\xc8\xf3\x09\x2b\x22\xd7\x9f\x64\x32\x08\xef\x34\xb6\x43\xda\x3a\x2e\xef\x7b\x24\x24\x74\xf0\x3b\xd5\x50\x32\xa0\x9d\x68\x6f\x4c\xfc\xbd\x95\xce\x2c\x66\xcc\x17\xb3\x2e\xc2\xb0\xf8\xca\xbe\x29\xf0\x30\xaf\xa5\x25\x02\x50\x41\x62\xe2\xcd\x4d\xaf\xca\x6e\xb4\x80\xc2\xee\x41\x61\x06\xf7\x4d\x2e\x95\x95\x5c\x36\x95\x45\x5d\x84\x26\xe1\xa6\xde\x0e\x1c\x6b\x95\x0d\xa2\xa2\x35\x12\x66\xdb\xf0\xbb\xc8\x2e\x02\xb0\xf0\x05\xac\x37\x9b\xb5\xab\x9a\xb8\x7b\x4e\xab\x2e\xa2\x06\x48\xbe\x74\xc6\x19\x6f\x02\xed\x6b\x1e\x89\x2e\x8e\xe9\xb1\x45\x3a\x79\x4a\x45\xf7\x93\xbb\xa1\xa8\x53\x20\xde\xb2\xd0\xc2\xdd\xed\x1c\x46\x5a\xa3\xf6\x1e\xc7\x22\xbd\xb5\x4b\x19\xd5\x1e\xf1\x35\x37\x86\xe9\x9b\x1d\x4d\xe2\xe6\x2a\x1f\x32\x82\xc9\x2c\x75\x99\xa7\x7a\x28\x6a\xe8\x82\x48\x08\x5a\x17\x17\xa3\x55\x85\xdc\xea\x91\xf2\x51\xc9\xbf\xda\xc4\x14\x35\x73\x37\x85\x6b\x2b\x44\x3e\x09\xdf\xfa\x15\x72\xdf\x0e\xdb\x64\x51\x5e\x3a\x18\x73\x6c\x39\xff\xe5\x5d\x0b\x68\x9d\x34\x91\xbd\x8f\x0a\xd7\x4a\x0b\x9a\xf5\x16\x29\xf8\x20\x7b\x12\xb1\x21\x2b\x4c\x5c\x71\xc6\xce\xe5\xdf\x02\xc2\x9a\xb9\x32\x8b\x6c\xc0\x76\xc1\x94\x30\x76\xec\x98\x7d\xe7\x08\xbe\x1d\x14\x51\xf9\x31\xd0\xf4\x63\x6b\xc4\x37\x70\x9f\x18\x8c\x6d\x9b\x60\x7b\xe4\x61\xb0\xb2\x28\xc2\x04\x74\x60\x67\x6a\x5e\x55\x91\x51\x37\x86\x6d\x6d\xe6\xae\x32\x64\x71\x58\x9f\x89\x04\xd2\xc5\x62\xe6\x9e\x15\xc7\xcd\xdd\x2b\x3e\x65\xc9\x1e\xfe\xa9\x1d\xa2\x8b\x6a\x32\xa2\xee\x1b\x7b\x03\x58\x62\x73\x16\x24\xdf\xec\x37\xe2\x19\x33\x21\x20\xd6\x3b\x50\xbf\xc9\xaf\x01\x6a\xcf\xc1\x91\x42\xd9\x99\xf4\xf9\x87\xda\xca\x96\xfc\x99\x59\x9b\x7e\x93\x95\xcc\x02\x87\x5d\xc0\x67\x14\x70\xbf\xfd\x56\x25\xca\xf2\xfb\x15\xd7\xcb\x96\x78\x1c\xc3\x33\x6f\xb9\x38\xd9\xaf\x73\x62\xe7\x31\x0e\x0e\x4a\x24\x44\x21\x97\x86\xbc\xa3\x7e\xd0\xd8\xaf\x3c\xff\xf9\xf8\xaa\x0a\xdd\xd4\x44\x24\x72\xc3\x08\xd4\x77\xad\x8a\xa5\x67\x5b\x56\xb4\xee\x4e\x66\x52\x2e\x58\x59\xa7\x9c\xe5\x54\x92\x12\x1e\x8b\x1a\x5d\x9c\x3e\x07\xa4\xca\x2d\x99\x6d\xd4\x48\x2b\x7a\xef\xd0\x55\x9e\x54\xa1\x39\x48\x22\x31\x2b\x17\x3e\x24\xb7\x12\x66\x04\x3c\xbc\x2c\xa8\xf1\xaa\x0a\x5a\x96\x20\x9a\x33\xc3\x55\x5d\x74\xae\x03\x40\x64\x52\x24\xc2\x7c\x0c\x30\x44\x0f\x82\x59\x76\xa6\x93\x90\xae\x3b\x49\x53\x9e\xe1\x92\xe6\xe1\x79\xca\xad\x01\x1b\xa2\x3e\xa8\x48\xc6\xb4\x75\x7f\x06\xab\x83\x16\x4b\x09\xf3\x29\xee\xfd\x78\x8a\x6a\xd1\x8a\x8a\x40\x55\xdc\x6d\xa8\x60\x88\x55\x15\xe1\x0f\xc7\x8d\x9f\xeb\x2e\xf0\xc6\xd8\x63\x51\x75\x05\xc7\x08\xb9\x0d\xac\xac\x2a\x0b\xd8\x8a\x45\xa9\xad\x02\x4e\x7a\xba\x5d\xe7\xb2\xc5\x30\xdb\x29\x96\x2d\x0d\x91\x99\xc5\x53\x4e\xfa\x90\x11\x75\xd4\xb7\xf1\x72\x10\x16\x47\xc4\x36\x56\xb9\xb7\x16\xc3\x79\x6a\x2f\xab\xa1\xb2\xc6\xc3\x39\xc0\x3c\x92\xa9\x2b\xc4\x86\xdd\x7d\xb2\x6d\xaa\xbe\x85\x84\x6d\x16\x98\x25\xa6\x0e\x76\x57\xd9\xa5\x43\xe0\xfb\xf0\x10\x8c\xc0\x4d\x8a\x02\x42\x1c\xfc\x3a\x5c\xf1\xfc\x1c\xc0\xbd\xc5\xc5\x2b\xd9\xb2\x51\xcd\xb5\x53\xd2\x22\xba\x8d\x86\x68\x4e\x0f\x27\xf5\x22\xa6\x33\x0b\x78\xbb\x18\x76\xcc\xe7\x4f\x72\x86\xd8\x33\xf4\x47\x59\x66\xb8\x35\xcf\x46\xf3\xf1\x69\xab\xcc\x28\x8e\x71\x86\x9d\x3e\xf6\xdd\x31\x37\xf5\x92\xb4\x3d\x1a\xc9\x30\xe0\xa8\x32\x51\x47\x77\x0b\xbf\xc1\xdb\x11\x78\xfb\x80\xbc\x04\x58\xcf\x32\xd0\xb3\x0c\x4b\x52\x31\x6d\xff\xef\x64\x4c\x6d\x3e\xe8\x4f\x00\x33\x4b\x03\xf7\x71\x50\x57\x25\x63\x65\x5e\x5b\x65\x0a\x0c\x0b\x5d\x09\x7d\xd4\xcc\x98\xef\x60\xf3\x41\x12\xd1\x19\xc5\xfa\x88\x05\x36\x99\xb3\x74\x20\x9c\xe1\x13\x5a\x18\x7c\x72\x77\x19\xf3\x89\x3f\x6f\xe6\xeb\xe4\x69\xb3\x44\xc3\x0c\x73\xa0\xfb\x04\x20\xe1\x8e\xec\xea\xf1\x3b\x26\xd2\x88\xec\xc1\xed\x21\x60\x7c\x1b\xbf\xd6\x0e\x9d\xcc\x73\x77\x06\x35\x8d\x98\x5d\x9a\xa2\xbe\x8d\x05\x58\x68\x14\x17\x05\xa8\x8d\x94\xc0\x4a\x38\x8b\x40\x03\x8b\x30\xf6\x11\xc8\x85\x98\x04\x63\xd9\x40\x88\x55\x78\x43\xd6\x2e\x6e\x29\x02\x44\xb1\x96\xf6\xa2\xea\xc0\xbc\x88\xf1\xd5\xe1\x5c\x9c\x9e\x69\xb5\x87\x7d\x9c\xcd\x17\x1e\x0d\x6b\x33\xdb\xa2\xf0\x70\x8b\xa2\xb4\x53\xa4\xe0\x9c\xf3\xa0\x84\xdb\x63\x1f\xe1\x63\x9d\x02\x34\xb4\x83\x82\x6a\x44\x5c\x56\x6c\x53\x44\xa5\xda\x3b\x6c\x79\x02\x6e\x60\xf1\x64\xb9\x7b\x27\x68\xe2\xc5\xc0\x2b\xe7\x07\x62\x9a\x7c\x57\xeb\x97\x39\x81\x9e\xe2\x12\x8c\x6d\x5b\xe1\x8f\x1c\xaf\xe2\x7d\x1d\xc3\x79\x5d\xf2\x70\xad\x6d\x13\x23\x51\xc1\xc7\xea\x48\xa9\xea\xca\xa7\xf2\xce\xc3\x3f\xba\xbf\xe7\xc5\x23\x04\xe7\x82\xe1\xf7\xcc\xb2\xaa\x53\xcc\x26\x85\x10\x62\x31\xd2\x04\xe1\xf7\x9d\x1b\x2b\x7f\x3d\xab\x5c\x5c\x66\x1d\xb7\xb8\xd7\xe0\xf5\x71\x89\xde\xb0\xa2\xde\x0e\xc1\xb6\xfe\x7b\x14\xcd\x7a\xcb\x2a\xfa\x8b\xcd\xea\x06\x0c\x39\x2b\xe8\x8c\x5c\x56\x1c\xd8\x55\x98\xe7\x5e\x59\xba\xf1\x16\x6a\x6f\xef\x21\x43\x52\x6d\x64\x6b\x11\xa5\x91\x17\x6a\x8a\xa2\xe7\xc3\x92\x04\x11\x09\xc9\x11\x97\x05\xc7\x79\x37\x3f\xcd\xef\xaf\xe7\x41\xa2\xc4\xac\xf6\x48\x96\x34\x57\x11\x96\xe7\xf4\x89\xf8\x2b\x3d\x15\x93\x3e\x1e\x0d\xc5\xa0\xa5\xcb\xcb\x4f\x0d\x6c\x17\x3e\x03\xed\xe2\xc1\x04\x8d\x04\x5b\x25\x30\x4b\xdc\x32\x4b\xff\x8f\x45\x67\x6c\x6b\x11\x02\xf0\xe9\x41\xff\x95\x05\x86\xb2\x10\x72\xfc\x7c\xf3\x36\x36\xda\x60\x0b\xd2\x76\x6e\xde\x29\xa3\x2a\x32\x86\x97\x63\x2c\x1f\xe2\xdb\xdf\x27\x46\x80\xad\x9b\xbd\x3b\x8f\xa3\x8a\xca\xad\x7a\x49\xf9\x3d\x18\x1a\x1e\x2d\x8d\xa0\x33\xb0\xdf\x50\xb8\x70\x4c\xc4\x18\xa0\x7d\x5a\x82\x32\xa9\xe0\x90\xa2\x5d\x9b\xed\xa6\x7e\x4e\xdb\x06\xd7\xeb\x36\xde\xc5\xf8\x2d\x2a\x96\xdc\x65\x2f\x10\xef\xd1\x00\x2d\x00\x12\x82\xa6\x85\xfc\x07\xbf\x57\x38\xe6\x9d\xdd\xc8\x4e\xda\x73\xd3\xa7\x80\x7b\x9a\xc8\xfa\x71\x3c\x76\x4d\x37\x61\x1e\x0c\x47\x1d\xec\x2a\x77\xbe\x57\xdc\x15\x0f\xc0\x0e\x06\x91\x6c\x1f\x42\x7e\x08\xc4\xf7\xf1\xc1\xc5\xdd\xce\xcc\xce\x70\x26\x20\x5d\x55\x2c\xe3\xe7\x3c\xce\x97\xf3\x48\x93\x12\x5f\x98\x85\x46\x4a\x46\xdc\x87\xd5\x47\xf5\x16\x5f\x94\x8d\x0f\x09\x5e\x1a\xb1\xa5\x25\xf3\xf0\xdd\xc5\x21\xf1\x36\xe5\x1d\xab\x0a\x6b\x16\xd1\xd2\x61\xd9\x83\x1a\xd0\xbd\x70\xca\xe7\xde\x17\x66\xe4\x33\xb8\xd7\xf7\xb2\x51\x3d\x00\xd8\x24\xb9\xa1\xce\xcb\x98\x1b\x11\xfb\x95\x98\x63\xa9\x5a\xe0\x3c\x47\x50\x83\xf9\x61\x73\x1c\x0e\xb2\x5f\x70\xf6\x40\x3c\xe8\x1b\xc0\x76\xd8\x5a\xe0\x36\xbd\x83\x9a\xd4\x3b\x58\xa2\x3e\x84\xe8\xc3\x66\x88\x7d\xbb\x50\x50\xb9\xe2\xa9\x10\x0e\x6b\x2c\x46\x24\x3a\x57\x40\x42\x8c\x8d\xdc\x03\x17\x93\xa0\xe7\xdc\x48\x5e\x4d\xb3\x85\xf4\x8a\x73\xde\xde\x61\x4f\x6a\xd3\x7e\x61\xe5\x01\x00\xb0\xb2\x0b\xb7\xa3\x56\x26\x10\x61\x5a\x3e\x45\xd1\x95\x55\xf7\x6d\x4a\xde\xb0\xa6\x74\x75\xa6\x2d\x0b\xfa\x88\x97\xde\xf0\xba\xcf\xc2\xe6\x9d\x22\x1b\x15\x4d\xfa\xaa\xc7\xf8\x92\x07\xfe\x56\x57\xe5\xde\x20\xc3\x36\x07\xe4\xbc\xc2\x20\xd5\x17\x9e\x6f\x47\x9d\xc0\x1f\xf8\x6d\x3d\xe6\x5d\x36\xe7\xf1\x11\xc3\x09\x1d\xdf\x47\x03\xa1\x14\x8c\xf1\x7a\x12\x26\xc4\x39\x11\x8d\xc3\x02\x72\xc5\x0b\x8b\x7e\xd1\x5e\xd1\x78\x81\xf6\x28\x96\xc7\xd4\xc1\xca\x56\x42\x56\x73\x82\x37\x90\x17\xa5\x99\x13\xfb\x03\x50\xf5\xc3\x07\x9b\xd5\x51\xca\x03\xde\x49\xd0\x34\x67\xed\x05\xf0\xb2\x41\x74\x9b\x9e\xed\x34\x7b\xb3\x66\xf6\x55\xdb\x68\xae\xac\x59\xb5\xd8\xf1\xb3\x88\x89\x1a\xc7\xcd\x8e\x95\x1f\x9b\x86\x14\x74\xe9\x90\xa5\xf1\x07\xb3\xe5\x12\x8c\x67\x4b\xcb\xe0\xc6\x16\x6e\x8f\x34\x3b\x1d\xb4\xb6\x95\x3d\x21\xfe\x3b\x49\xf7\x50\x0d\x1e\x01\xcc\x39\xb3\x3c\x62\xdf\x04\xbb\x68\xa1\xd8\xc8\x2b\x1e\x2e\xd7\xfb\x54\x75\x32\x1c\x68\x46\x76\xe8\x40\xdb\x9e\x08\x96\x26\x51\xe2\xbc\x6b\x00\xb0\x44\x65\x43\xbf\xd9\x22\x82\x4f\x53\x40\xeb\xde\x67\xcc\x20\x05\x05\x7d\xf8\xd8\x73\xb8\x72\x75\x61\xbe\xa0\x2d\xd1\xc3\xee\x4c\xe8\x41\xca\x8a\xd4\x8e\x9c\x42\xd2\x3a\x83\x2d\x6b\x1f\xcc\x6a\xd3\x44\x26\x98\xa7\x00\xf6\x29\x64\x09\xda\xe3\xb3\x9c\xeb\xd5\xa6\xab\x79\x85\xec\x90\x65\x78\x53\xbe\xc4\xcf\x80\x32\x51\xca\xb6\x74\x8d\xe3\xd8\xa0\x9e\xb7\x87\x16\x0b\x8d\x93\xcb\xab\xfc\xa1\x95\x0f\xf7\x6b\x21\x3d\xfe\xc1\xf1\xa6\xa9\x65\x1c\x41\x77\x62\x4e\xc6\x02\x70\x60\xfa\x02\x2b\xdf\xea\x38\x29\x4a\x19\xd1\x0a\x48\x62\x40\x3f\x7d\x7f\x93\x3a\xb0\xfe\x3b\xa3\x88\xcc\x7a\xc1\xac\x7e\x27\xd5\x16\xc5\x52\x8c\xc7\xca\xd1\xfe\x73\x8a\x8a\xe2\xaf\xaf\x37\x73\xc2\x54\x00\xc8\xc3\x43\xe7\x10\x4c\x87\x68\xa0\x24\x57\x12\x68\x4c\xf6\xa6\x7e\x98\x81\x73\x8b\x46\x88\x20\xba\xd2\x9b\x22\x10\xe3\xee\xa3\xa2\x83\xe6\x86\x20\x7b\x90\x4d\x09\xaa\x11\x0b\x49\xe7\xb4\xb4\x52\x4b\xa7\x06\xc1\xe1\x02\x23\x9c\x97\x25\x3c\xc0\x8d\xcd\x5f\x72\x27\xcc\x02\x7b\x32\x82\x93\xb5\x46\xc1\x7a\xe1\x0b\x3e\x05\xc1\x1d\x42\x0e\x9f\x4b\x0e\x44\x41\xa2\x39\x9b\x36\xad\xf3\x0c\x1b\x9b\x15\xc4\x3f\x5b\x93\x17\xd9\x78\x43\x56\x2b\xd4\xb9\x04\x9d\xc4\xc5\x3f\xf0\x73\x3f\x35\x6a\x22\x0a\x12\xf1\xbc\x22\xd1\x6d\x8c\x46\x5f\xe1\xd8\x5d\x38\x20\x3a\xb2\xa8\x9b\x83\xff\xce\x84\xf8\x21\x78\xde\x42\xa7\x5b\x04\x3c\x3c\xdf\x71\x64\x40\x8c\xf3\x5f\xea\xb9\x53\xc8\x49\xfc\x0a\xa7\xb6\x5f\xcf\xb6\x2b\x88\x1a\xd0\xd1\xdb\xdd\xe5\x81\x7c\x8a\xaf\x7e\x54\xb2\x2d\x2d\x4a\x62\x89\x77\x53\xdc\x65\x9e\x07\x2f\x6d\x29\x9a\x5e\xab\x35\x9e\x98\x7b\x3d\x4a\x6b\x77\x8a\x04\x98\xcc\x3a\x44\xa1\x70\x6a\x21\xd8\x50\xff\x32\xb4\x51\xc6\xac\x27\x75\x00\x82\x66\x0c\x3d\x82\x84\x3b\xec\x93\x36\x5e\xc8\x88\x93\xc8\x9d\xb9\xa1\xe1\x5d\x70\xce\xf6\xd2\x51\x9b\x5a\xa8\xd6\xb7\xae\x8d\x97\xa5\x43\x65\x13\x1f\xb5\x45\x47\xce\x82\x52\xf7\x21\x71\x99\x57\x62\x81\x56\x1f\x6e\x16\x57\xce\x2b\x51\xae\x43\x95\x0e\x2c\x5f\x11\x74\xa0\x05\xf3\x03\x7e\xa3\xbf\x0e\x25\x32\xe1\xf9\x43\xa8\x21\x2d\x17\xba\xd8\x49\xd7\x81\x67\x3a\x48\x04\x0d\xaa\x54\x33\x26\x2a\xae\x61\xa9\x1e\x1b\xfb\x14\x9c\x49\x1c\xac\x37\x12\x2b\x0f\x09\x35\x74\x96\x6c\xdc\x5a\xa3\x23\x8f\xa6\xad\xd8\xe7\x4d\x70\x89\xdd\x63\xea\x5b\x40\xb6\x86\xd2\xfd\x29\x2c\xe2\x55\x36\x46\xf7\xa3\x84\x06\x2c\x54\xb6\xd5\x10\xa4\xec\x80\x69\xec\xb3\x73\x61\xb0\x68\x1b\xa9\x3f\xa2\x8d\xf2\xf6\x9a\x57\x9a\xeb\x8d\x34\x40\x54\xfe\x0a\x3f\x7e\x8a\x7b\xf0\x56\xc7\x6a\xee\xc7\xa5\x15\x08\x98\x1c\x71\x69\x26\xc9\xbe\x2c\xbf\xb1\x8d\x3c\xee\xf0\xd8\xd1\xf2\x56\x24\x97\x02\x96\x86\x02\x88\x7d\x54\xd7\x2b\xca\x86\x03\x6f\x6d\x94\xa0\xdd\x4d\x73\x91\x08\xb0\xa0\x19\xfe\xca\xfa\xed\xcf\x0f\xd0\x0f\x0b\x39\xb0\x6b\x1e\x2d\xca\xbc\x55\xf5\x29\x6d\xdc\x95\x8e\xa4\x4f\x75\x0a\x39\x1d\xdd\xdb\xe0\x14\x9b\xf7\x16\x73\xca\x54\xba\x49\xe6\x3f\xae\xa4\x82\x2e\x76\x02\x74\x26\xee\x28\xa6\xca\xc0\x39\x4f\x27\xb4\x6e\x2c\x6a\xb2\x45\x61\x60\x38\x15\xe1\x16\x43\x11\x99\xb4\x6b\xb4\x2d\x08\x4c\xa9\x9e\x1d\xd1\xd0\x77\x7f\xff\x17\x8a\xa2\xd3\x05\xe9\x31\x1e\x54\xdc\xbb\xc2\x1e\xe6\xad\xfe\x7e\x64\x95\x54\x6a\xb1\xdc\xb8\x35\x90\x4f\x61\x51\xdf\x4c\xc4\x6b\xb7\xb7\x72\xc7\x46\x2e\xfd\xe1\x95\x09\x55\x39\xc8\x57\x62\x58\xe5\x94\x03\x7d\x4c\xbe\x0b\x44\x85\x4c\xc5\x9f\x88\x57\x1b\x62\xbc\x65\x31\x1a\x9c\xfb\x13\x4a\x64\xe2\x80\x14\x42\xd3\x54\x7d\x68\xd0\x61\xb0\x1a\x8b\xf8\xde\xe7\x12\x3c\x25\x05\x0c\x68\x40\x65\xf6\xb5\xd1\xee\xce\x6a\xe4\xbc\x23\xc0\xbc\x85\xe1\xc4\x07\xa0\x94\xa5\xde\x5e\xaf\xed\x32\xaf\x18\x53\x84\x74\x0c\x7b\xe2\xd6\x45\x51\x48\x00\x4a\xe3\x20\xab\x8d\x78\x52\xbd\xae\x17\xd6\x14\xdd\xe9\x8e\x6c\x36\x53\x89\xab\xce\x78\x1a\x66\x9f\xc4\x8b\xab\xab\xd3\xad\x85\x3b\x6b\x55\x11\x3b\x69\x82\xa4\x1e\xb4\x3f\xc1\x66\x82\x85\xd5\xfb\x85\x87\xf6\xdc\x59\x26\xa4\x57\x73\x0a\xd8\x05\x30\x36\x08\x46\xf0\x71\x30\xe9\x1f\x5a\x2e\xb6\xe8\xc9\x42\x4b\x87\x6a\x39\x45\xd8\x13\x78\x0b\xbd\xaf\x3f\x2d\xfd\x53\xe9\x03\x0f\x4c\xbc\x73\x0b\x6d\xbf\x57\xa9\x71\xee\x47\x02\xff\xcc\xc2\x1b\xac\xe6\x14\x5f\x2c\xb9\x6a\xd4\xdb\x45\xeb\x74\xe7\x72\xa8\xe2\x3e\xd5\x0f\xfe\x74\xa5\x03\x25\xcb\xde\x06\x45\x6b\x31\xf1\xf2\xb3\xff\x74\x62\x17\xd0\x5f\x87\x33\xd3\xd4\xd7\xb1\x32\xb3\x60\x0c\x1e\x5d\xb0\x08\x68\xf7\x8f\x6d\x46\x3a\xb6\x12\x44\x3a\x7e\x58\x11\x7c\x83\xb0\xc9\x65\xba\x06\x3c\x60\x11\x45\x4f\x64\x4b\x65\x5e\x04\x12\x24\x8b\x64\x31\x3a\xfe\xf9\x2f\x9f\x30\x20\xa7\x9b\x3a\x0f\xb4\xf1\x27\x65\x34\xa3\x6e\x61\x31\x38\x44\x9b\x16\xcb\x0d\x05\xe8\xcb\xc1\xf5\x66\xae\x5b\xbc\x2f\x50\x87\x31\x63\x99\xc2\x13\x1d\x65\xd7\xb3\xb0\x9b\xff\x52\x1a\x90\x92\x84\xd7\xcb\x3c\x47\xbb\x85\x84\x59\x63\x42\x9d\xb6\x59\xe4\x34\x79\xfd\x38\x73\x95\xc4\xab\x40\x23\x02\x76\xcd\x23\x62\x4a\x16\xfc\x77\x96\x55\x81\x5d\x97\x88\x62\xb9\x34\x13\x3b\xce\xd1\x1f\xa7\x68\x85\x6c\x48\xdd\x87\x70\xec\x7e\xc8\x61\x9a\xc4\x2e\xa3\x15\x9d\x52\x27\x35\x01\x4f\x2f\xb6\x12\x38\x9f\x7a\xa9\xb6\x59\xc5\x2d\x36\xa8\xd3\x61\xf7\x59\xf6\x7c\x38\x17\x88\xe3\x7a\xbf\x0b\xe9\xfa\x7e\x9c\xaa\xea\x57\x0e\xbb\x34\x2d\x2e\x80\x76\x38\xcb\x7f\xa9\x02\xf2\x6c\xd9\xdf\x0f\x7f\xd7\x28\xb7\x9a\x3a\x4a\x23\x9d\x8b\x74\x6c\xaf\x1a\xbb\x36\xc7\x2e\x1d\xda\xe6\xc9\x93\xdf\x69\x9f\x10\xdb\x04\xe6\xa8\x56\x96\xa8\xf8\x6f\xaf\xa8\x32\x7b\xc0\xde\x5f\xdc\xcf\x49\xac\x10\xa4\xb0\x8a\x64\x5a\xe8\xa2\x7e\x63\xa6\xa2\x57\x2b\xdc\x02\x25\xb9\x47\x5c\x2a\xb6\xfa\xa4\xd3\x96\x68\x0b\xb6\xb0\x7d\x40\x99\xa6\x56\xb9\x78\x6b\xf9\xf3\xa6\x22\xbe\x87\x16\x1b\xa3\x2c\xea\xaf\x28\x8b\xa0\x2b\x74\x3e\x0f\xe1\xfc\x8e\x54\x9c\x1a\x5c\x79\xef\x22\x26\x2f\x0d\x68\xf2\xbb\x21\xe9\xe8\xf2\x62\xbd\x9d\x06\xc0\x73\x25\x9a\x33\xa7\x84\xe1\x7d\x2b\xbf\x15\xc7\x1d\xb6\xe9\x3a\xda\x1e\x9f\x0b\x61\x9c\xbd\x66\x4a\xbb\x6c\xe1\xd1\x12\x11\x2c\xea\x70\x24\xbb\xb3\xa1\xd9\x09\xc5\x2a\x80\x86\x14\x4e\xf2\xf8\xb5\x06\xe4\x36\xe8\x2a\x21\xb2\x91\xd5\x0e\xf5\x2f\xfd\x50\x54\x1f\x3c\x72\x1f\xc4\x68\xa4\xb0\xef\x18\x19\x92\xb7\x0b\xf3\x9c\xda\x6d\xd8\x5a\x74\x52\xd7\x20\xc9\x7a\xb7\x53\x73\x19\x8b\x5a\x36\xc0\x4f\xa2\x33\xde\x5e\x82\xbf\xf6\x74\x46\x52\x3f\x97\xc0\xa1\x42\xe8\x07\x04\x06\xf8\x09\xb6\xe2\x82\x6a\x26\x13\x3c\x31\xce\x93\xb6\x8f\x52\xa0\x53\xec\x51\xa7\x97\x20\x7e\x26\x97\x4e\xf5\x8d\x65\xbf\x2b\xbf\x03\x91\x5c\xe9\xfc\xc2\x1e\x27\x18\x11\xa9\xd6\x84\xe2\x1a\xdd\xa6\xed\x2a\x43\x3e\x54\x8e\xbc\x43\xf7\x08\xb3\xbe\x05\xcc\x76\x46\x57\x2f\xdc\x49\x57\xd0\x32\x4c\x13\xbd\x5a\x42\x8d\x02\x81\xca\x17\x1e\xfa\xe2\x98\x14\xe1\x87\x4e\x8e\xd9\x5a\x5b\x40\x24\x58\x53\x6e\x6a\x83\x11\xe0\x38\x8d\x41\x98\x41\xbf\xa9\x13\x23\x88\x72\xf0\xdf\xfc\x34\xca\x35\x8e\x39\x6a\x32\x51\x53\x7f\xa8\x4f\xd6\x3e\x98\xc4\xac\xb4\x3f\xc3\x72\x04\x36\xc5\xa8\xa7\xaa\x3b\xbe\x48\xea\xcd\xcc\x89\x50\x18\x34\x96\xe2\x01\xfd\x32\x6c\x4c\x66\x13\x5b\x43\xf0\x06\xe9\x62\xe7\x7b\xcf\x17\x93\xf9\x9f\xd3\xad\xe1\xc5\x8d\xfa\x22\x51\x3d\x0a\xd9\xc9\xcc\xd9\xc0\x86\xe1\x66\xb5\x1e\x2e\x8b\xf9\xa8\xd9\x1b\xb8\xf1\x76\x52\x56\x54\x8a\x52\x7f\x68\x36\x24\xf9\xe7\x4c\xe2\x99\xc6\x01\x20\xe2\x29\xd9\xe0\x6d\x3e\x71\x96\x59\x1e\xc4\x5a\x2f\x49\xd2\x71\xbd\x52\xfd\x59\x28\x49\x5a\xaa\x84\xb3\xd3\x4d\xd8\x55\xf0\x6b\x8e\xd0\xeb\xb0\x3b\x5e\x42\xbe\x35\xd4\x5e\xd0\xb2\x87\xeb\x0e\xf9\x86\x9d\x09\x02\xef\xba\x88\x8b\x01\x19\x95\xb0\x4a\xad\xce\x2a\x92\x88\x5a\x23\x64\x3e\xb6\x1c\x5a\xb2\xfb\xc8\xf8\xd3\xcb\x96\x6c\xcc\x35\xc7\xaf\x4f\x40\x17\x44\x95\x24\x04\xb7\x07\xd8\xb6\x64\x5c\x9c\x38\x7b\x0b\xcd\x52\x46\x90\x5b\x3c\x88\xa7\x92\x8b\x40\x89\xb3\x45\x5e\xde\x5c\xb2\xc8\x28\x0e\x59\xa0\x96\xed\xaf\xb4\xcb\x8e\x10\x36\x89\xf6\x30\x77\xda\xa4\xc2\x81\xc9\xe9\x2c\x0f\xcf\xe2\x98\x97\xa0\xd6\x4e\xa0\xd0\x7e\x3f\x9c\x3c\x9a\x90\x59\x52\x20\x0a\xc9\xad\x20\xb3\x4a\x3f\x76\x2e\x21\x4a\x7b\x48\x7b\x95\xe5\x7b\x5e\x84\xd5\xd2\x7e\x75\xec\x47\x66\xe9\xf9\x3f\x3e\x4b\x64\x81\x1b\x91\x45\x72\x03\x4e\x95\xbc\xa6\x41\x1c\x02\x67\xdb\xea\x2e\x29\xab\x5d\xcb\xb7\x9a\x18\xe3\xbf\x70\x16\x2e\x74\xde\x7a\x84\x0f\xd2\x68\x67\xa8\xdb\x82\xcd\xea\x4f\xf9\x02\x1d\xa1\x88\x3a\x77\xa8\x5d\x7e\x37\x57\x42\x0e\xcd\x54\xbb\x8e\x30\xc8\xc8\x4b\xf3\x87\xc2\xdd\x0f\x56\x98\xf3\xaf\xbb\x21\xb2\x6c\xa0\xbc\x69\xee\x66\xa6\xf4\x2c\x09\x45\x92\x9e\xba\x27\xb5\x24\x75\x11\xc8\x74\xd4\x26\x17\x67\xc9\xc3\x81\xee\xdc\x70\x5a\x91\x3c\x31\x88\xff\x43\x35\xfe\xee\x8c\x3c\x41\x41\x1b\xf8\x7e\x83\x58\x98\x51\x63\x82\x85\x62\xa2\x30\x47\x0f\x05\xf5\x66\xb2\x8a\xee\xc8\x89\xa2\x94\x39\x52\x8e\xc5\x99\x5f\x2c\x27\x29\xe7\xf3\xb8\x8b\x26\xf0\xa7\x9e\x6a\xfd\xbe\x13\x0f\x90\x6f\xa7\x4f\x3a\xd7\x55\x75\xef\x2d\x51\x49\x6e\x5a\x89\xef\xa3\x56\xc8\x2d\x37\x2b\x3e\x07\x33\xd9\xfb\x97\xa2\xbd\x21\x93\x6d\x76\x15\xb4\xcd\x46\x4e\x2d\x3c\x69\x7b\xb6\xb2\x2d\x48\x35\x7b\x5a\x07\x95\xb1\xb0\x40\x2f\xf6\xcc\xd1\x85\x25\x42\x5f\xc7\xd7\x61\xc2\x43\xd3\xed\xf7\xe1\x1e\xb7\x38\xbd\x66\x1f\xcf\x49\x46\x40\x57\xcc\xfe\x08\x91\xbb\xff\xce\x44\x8f\x75\x09\xb4\xac\x28\xad\xc2\x32\x56\xdd\x0d\x08\x4f\x04\xe1\x21\x0d\x20\xee\x6f\x0c\x15\xf6\x88\xc3\xc1\xea\x21\x1c\x87\xc0\x1a\xfc\x18\x6e\x70\x34\x5f\x28\xf9\x32\x6b\x5b\x61\x1a\x48\x27\x9c\x12\x63\x28\x08\xa2\x30\xf5\x60\xd9\x54\x04\x65\x5e\x11\x6c\x62\x12\x6e\xee\x5c\x9f\x3f\xa8\x89\x91\x39\x19\x9f\x2f\xc5\xb4\x49\x94\x29\xc7\xd1\xe9\x7b\xbd\xf6\x4c\xa8\x07\xc8\x66\x14\x7e\xd5\x08\x06\x5f\x86\x15\x76\xb8\x4e\xa5\x59\x51\x2f\xf0\x53\x9f\x55\x67\xc5\x42\xd6\x4e\xca\x1b\x7b\xd0\xc4\x42\x6f\x8d\xd5\xcd\xd8\xd2\x84\x9a\xdb\x04\xd3\x61\x61\x4d\xb4\x50\xf4\xe7\x26\x9c\xbb\xa3\xb1\xc9\x51\x9e\x38\xd8\x5a\xcd\x0a\xb2\x62\x49\x69\x32\xbb\xa0\x16\x5d\x38\xfa\x2d\x43\x28\xdc\xfc\x57\x94\x18\x7b\xc1\x05\x5d\xc6\xc5\x8e\xb2\xd4\xc9\x03\xdd\xd5\x5f\x85\x33\x13\x53\x42\x33\x96\x83\x50\x71\x66\x2b\xf8\x26\x25\x87\x9e\x91\x0e\x44\x0e\xed\x41\x24\x6d\x6f\x31\x49\x89\xfe\x94\x60\xff\x87\x18\xf5\x43\xb9\xff\xbb\xac\x82\x87\x1f\x59\x4d\x8e\x96\x97\x32\xed\x3b\xb2\xc2\x84\xc5\x1c\x3c\xdb\xaf\x88\x7a\x4f\x82\x9a\x54\x1d\x85\xd1\x34\x4b\x45\x3b\x00\xdf\x41\xe3\xad\x35\x24\x85\xb4\xb0\x81\xae\xb0\x47\x4c\xa8\xba\x28\xef\x2e\xcc\xa4\xe3\xee\x5a\xf9\xcc\x82\x9c\x26\x2e\x72\xb7\xc7\x24\x96\x7c\xb1\x41\xa6\xc7\x7e\x20\xe3\x22\xc2\x70\xf7\xd6\x84\xf0\xcb\x66\x60\xc9\x0e\x3b\xde\xa2\x16\xda\x77\x37\x7e\xae\xfd\x45\x2a\xd3\xa8\xf9\x88\x01\x8c\xc2\x98\xe2\x4f\x8a\x96\xf2\xac\x45\xfb\xe9\x22\x55\xbd\x47\x48\x37\xee\x35\x91\xe5\xf1\xb8\x3a\x44\x1a\xcf\x18\xa6\x20\xbd\x49\x83\x5c\x3c\x5e\x64\xaa\x5a\xd9\xcf\xbe\xd3\xe5\xad\x22\x5b\xb1\xc3\xef\x2e\x3a\x31\x53\xc5\x9b\xc4\x86\x64\x55\x14\x4b\x7b\xc9\x2e\x88\x70\x59\x2b\x33\xa6\xab\xde\x89\x72\x9a\xae\xeb\x98\x24\x25\x3b\x4d\x6f\x69\x30\x4f\x77\x7e\x45\x1e\x1a\x33\xaf\x5d\x3d\x98\xae\xe5\x7c\xb2\xf9\x7a\x40\x20\xf7\x08\x7e\xa4\x3a\xf0\xf0\x24\x70\xfa\x6c\xb0\xde\xb9\xd4\xfd\x53\x8a\x08\xfb\x67\x5e\x0f\x62\xff\x22\x57\xa0\x0d\x4d\x8d\x2d\x54\xbf\x1b\xe2\xe3\x28\x35\x51\x1e\xc9\xb5\xe1\x79\x18\xa0\x6f\xc1\x43\xc3\xce\x49\xdc\x5c\x0f\xc5\xab\xae\xda\x07\x0f\xff\xc6\x22\xda\x71\x3f\xe1\xca\x24\x76\x39\x65\x2a\x7c\xdb\x41\x08\xe8\x52\x1d\x23\x20\x0b\xb7\x45\x83\x3c\xb8\x58\x2a\x95\x92\xa4\x10\x72\x69\x35\x23\x11\x77\xfd\x32\x88\x73\x36\x4a\xe6\xfb\xff\xe4\x7f\xcf\x2e\x26\x26\x31\x1a\xdb\x6c\xe6\x30\xe4\xf8\x8f\x04\x69\xdc\x10\x2b\xef\xc5\x92\x22\x2e\xbb\xb3\x61\x95\x3d\xd8\x55\x6d\x28\xab\x52\x8c\x4b\x50\xd1\xf2\xc1\x18\x6c\xb1\xb9\xcf\xf3\x0f\x87\x4a\x3a\xcf\xa5\x27\x1b\xd7\xc5\xc1\xb5\x5b\x8e\x88\xeb\x46\xcd\x88\x80\x7b\x26\xb3\x90\x81\x11\x96\xaa\xf2\x8d\x9c\xb6\x3c\x91\x52\xea\x81\x1e\x0b\x2c\x14\xe4\xa0\x78\xe5\x8d\x14\x11\xe5\x7b\x54\xbe\xa5\x75\x28\x7d\xf0\x64\xf3\x9d\x4e\x61\xaf\x8c\xbd\x00\xb2\xc2\x57\x31\x73\x5c\x1a\x42\xf7\x41\x88\x82\x24\x4d\xa7\xf5\x1d\xfa\x39\x13\xd1\x0f\x74\x84\x32\x0d\x20\xff\x42\x3d\x20\x6a\xea\xb2\xdf\x7b\xb6\x38\xdb\x35\x7d\x18\xa8\x4c\x74\xb2\x66\xd5\xbb\x16\xfa\x8a\xcf\x5c\x24\x15\x94\x86\x1a\x05\xab\xcf\x9f\x10\x19\x8c\x8a\xb1\x4a\x7b\x61\xf8\xb4\x5d\xd9\xd2\x03\x1c\x5c\xf3\x6f\xa1\xc2\x87\xec\x46\x38\xc5\x1a\xa4\x7a\x04\xe5\x28\x5c\x06\x9e\x63\x7e\x65\x52\x23\x22\x5a\xb3\x14\x68\x65\x32\x62\x9d\x5a\x48\xe8\xf0\xa0\x36\x26\x59\x60\x52\x12\x9e\x97\x12\xf5\x8a\x70\x53\x68\x6a\xc0\xe5\x3f\xaf\xec\x85\x74\xf4\xa0\xb7\x22\x70\x3c\x59\x35\x87\xbe\x80\x07\x3b\x8a\x14\xee\x8d\x17\xab\xa4\x96\xbf\x28\x84\x36\xba\x4e\x5d\x07\x80\x1d\xc2\x11\x6b\x00\x92\x97\x64\x9a\xb3\xb4\x45\xa4\xa0\xb6\xc7\x07\x12\x5f\x60\x7b\xbe\x4a\xa5\x48\xa0\xc8\x9f\x0d\x48\x45\x4a\xb5\xf3\x55\x08\xdb\x43\x88\xd7\xc1\x2c\x44\x83\xca\xad\xb0\x5f\x7f\x5d\x02\x00\x07\x3d\x8a\x07\x2b\xf1\x22\x36\x26\xba\xe0\x86\x48\xcb\x93\xb4\x66\x83\xc2\x60\xbf\x96\x81\xbb\xfb\x1d\x26\x41\xaf\xdc\xdb\x5d\xa2\xc1\x75\x58\x82\xa2\x06\xe6\x84\x35\xce\xc5\x4e\x10\x6f\x0e\x3b\xda\x1b\xd8\xe6\x18\x12\x03\xa6\x43\x39\x89\x77\x1f\x52\xa0\x22\xe4\xe4\xf9\x18\x20\x40\x85\xe6\x42\xf0\xa3\xd9\xc0\x52\x33\x05\x54\x49\xad\xc1\x67\x58\xc6\x7d\xc4\xc3\xec\x3c\x43\x3d\x19\x14\x5e\xf0\xbc\x05\xcb\x36\x6c\x64\x3b\xee\x30\x0b\x64\xc2\x67\x6f\x65\x67\x60\xfd\x0a\xaa\xcf\x21\xc9\xa5\x83\x89\xe1\xde\x34\x8a\xc8\xb4\x24\x35\xaf\xd9\x43\x21\xca\x34\x56\xce\x2f\xfe\xa3\x72\x07\x7b\x48\xcf\x46\x60\x8e\x56\x0b\xbb\x09\x5c\xa5\x7b\x13\x5b\xcb\xbf\x3a\xa4\x87\xfa\x6b\xfa\xea\xbd\xe9\xaa\x56\xaf\xd1\x69\xe5\x11\x38\xbd\x28\x6c\x2a\xe3\xb4\x2d\x04\xd8\x1a\xd9\x97\xd1\x34\xe3\x77\xd1\x98\x7c\x3f\x1a\x95\xda\xb3\x77\x3a\xe5\x70\xe0\x5f\xea\x84\x04\xad\xf7\x5b\xab\x62\x33\x98\x60\x40\x63\xa7\x4a\xdc\xd7\x14\x42\xa6\x76\xf0\xe1\xc0\x68\x20\x3b\x17\x2f\x54\xc7\x04\x13\xab\x95\x15\x67\x4f\x42\xe5\xfa\x08\xc5\x90\xd0\x72\x93\xf4\xd0\xff\x01\x6b\xdd\xd4\x8a\xc4\x0e\x63\x8a\x97\x32\x13\xbe\x9b\x93\x02\x0e\x37\x21\x4f\x0a\x0a\xd0\xd2\x9a\xa1\xec\x52\xad\x5f\x12\xaa\xd8\x0b\x73\xa3\x89\x6d\x84\xf1\x34\x99\x9b\x8f\x36\x23\x24\xe3\x0c\xcf\xa7\xe0\x3e\xd8\xcd\xbe\x78\x92\x60\x75\x6b\xa0\x88\xad\x63\xfd\x50\xcb\xc7\x1c\x54\x54\x4a\xf0\xea\x5e\x23\x21\xf9\xc8\x23\xab\xbe\x50\x8a\x63\x25\xb8\xff\xa3\xd8\xc2\xcb\x04\x22\x94\xf7\x81\xc0\x0c\x9b\xbf\x8b\xa3\x93\xa1\x12\xc5\x23\x6f\x7e\xe8\x3f\x16\x70\xb7\x56\xcf\x6a\xcc\x03\x65\xd8\x99\xb8\x06\x42\x38\x4f\x9a\x50\x99\x4b\xd4\xce\x5f\x52\xf8\xfe\xe5\xbc\xa9\xad\x99\xa7\x42\x2c\x05\x4a\x43\x08\x7b\x2d\x82\xfc\xc8\x7e\xa4\x2d\xdb\x43\xc8\x80\x12\x61\xd1\xcf\xf4\x4a\x60\x52\x88\x0b\x81\x6b\x18\x91\xbb\xd4\x49\x78\x43\xd9\x36\x4c\x93\x7b\x94\xbf\x92\x4e\x9f\xd4\x8d\xd0\x69\xb2\xc5\x46\xce\x53\x28\x4a\x01\xfa\xfa\xcd\xfd\x79\x04\xa1\x7a\x11\x7f\xed\xa8\xe1\x2c\x85\xa5\x25\xb5\x3e\x8e\x69\xeb\xc2\xed\x3b\x5e\x43\xc7\x8b\xd4\x87\x6d\x23\xba\xa3\xa4\x6c\x49\x6e\x5b\x78\x2c\x79\x72\xfe\x3e\x27\xc3\x80\xb9\x86\xe2\xd7\x6c\x29\x52\xe0\x6d\x35\x93\x8a\x18\x85\x21\x28\x2f\xe3\xab\x4f\x28\x02\x89\xab\x12\x6d\xdc\x94\x98\xe7\xdb\x04\xe7\xcd\x35\x90\x83\xdb\x63\x0e\x41\xb7\x1f\x6a\x2d\x2a\x27\x7c\x1a\xd4\x5e\xf6\x56\xe7\x52\x55\x4f\x35\x7a\x2f\x35\x47\xcf\xc9\x40\x4b\x62\x77\xa5\x92\x15\xc6\x29\x7c\x45\x24\x68\x50\x1e\x35\x02\x45\x52\xd1\x5e\x62\x50\x67\x4b\x76\xde\xfb\xa6\x25\x39\x32\x3e\xd0\x36\xc3\xd5\xa9\xfe\x34\x23\x03\xcf\xb2\x89\x80\xba\x30\x82\xe4\xc0\x0e\x42\x2f\xfd\x33\xb2\xe1\x43\xd1\x9d\x46\xf1\x49\x9d\x91\x74\x31\xe6\x1e\x6b\xd9\x29\x7e\x02\x0d\x73\xe1\x2f\x0b\xe9\x20\x76\xb0\x37\xbe\xe0\x7a\x95\x96\x78\xe9\xd8\x00\xca\x68\x5d\x34\x59\x33\x06\x21\xa5\xb4\x65\xd7\x08\x14\x18\xb0\x49\xdd\xd3\x23\xc1\x18\x4c\xb4\x9c\x31\x9a\x60\xca\x6c\xfb\xf0\xaa\x43\x50\x4c\xfb\xcb\x3b\x10\x87\xeb\x32\xb3\x71\x0c\xe5\xc2\x99\xfe\x85\x90\xc0\x28\x29\x67\x1e\x5e\x8b\xa6\x49\x05\x2b\x33\x9f\x5a\x45\x1a\x9a\x8b\x22\xc6\xbc\x8b\xe5\xf3\x58\x17\xa6\xeb\x24\x5e\x5c\x45\x10\xb6\x82\xc4\xaf\x76\xb0\x47\xb0\x4b\xa8\x10\xc3\x09\xf1\x96\x68\xda\x90\x4a\xac\x38\xff\x27\x41\x27\x08\xb5\xed\xd8\x6f\x46\x11\x1e\x7f\x45\x8b\xbd\x1d\x33\xd5\x2e\xe2\x25\x59\x62\x9c\x14\x5f\x76\x1e\x4a\x44\xed\xfa\x14\xca\x2e\xc9\x16\xe1\x38\xd3\x57\x39\x15\xb9\x9d\xb3\xa8\x19\x43\x4e\x93\x04\x40\xc6\x68\x52\xdc\xa2\x72\x94\x3e\xe4\x39\x8c\x41\x02\x83\x05\x46\x25\x31\x34\x96\xa8\x91\xac\x92\xd8\x2d\x4a\x9a\x6e\x0e\x2e\x70\xc2\x4f\x1d\x7e\x2b\x3a\x1b\x2e\x8e\x96\x7c\x59\x08\xf6\x65\x8d\x20\x09\x11\x6e\x3d\xe0\x3b\x82\x65\x92\x9a\xcd\x85\x3a\x72\xc9\xda\x08\xa6\x7b\x6c\x22\xfe\x59\xca\xe9\xec\x1b\x8d\x46\x58\xc4\x00\x71\x82\xba\xc2\xbe\x31\x54\xb1\x9b\xe0\x0b\xa3\xad\xad\x15\x79\x0f\xc5\x34\x2e\x36\xad\x54\xd7\x6b\xad\x8c\xba\xc0\x26\x50\x09\xe3\xc8\xdc\xa4\x05\xe3\x6e\x1e\x31\xf9\xe7\x47\xc5\x98\x3b\xed\xa2\xf9\x20\x09\x7e\xf5\xad\x6e\x1d\x43\x2f\x58\x7d\x20\x3e\xa5\xb1\x77\x22\xa5\x47\x91\xee\xa6\x3a\xbf\xaf\xc9\x7f\x67\x55\x75\xca\xcc\x44\xff\x91\xfa\x08\x55\x50\xbe\x98\x7d\xac\xad\xbd\x5a\x14\x11\x55\x24\x35\x49\x0a\xb6\x1b\x94\x36\x23\xc4\x93\x1b\x82\x32\xb1\x48\xd6\x85\x71\x00\x4a\x6c\x98\x50\x72\x34\xfe\xa4\x39\x1e\x75\xda\x51\x7b\x62\x68\xef\xa0\x1b\xbf\xb4\xd0\xda\xc9\x42\x4d\x4e\x93\x1a\xe2\xa1\x34\x93\x25\x62\xe3\x8d\x81\xbf\xb7\x86\x7e\xde\x22\x09\x67\x08\x57\xa5\x03\x65\x1b\x10\x4a\xdd\xa9\x17\x11\x16\xbf\xeb\xc7\xfd\x7b\x9f\x54\xed\x78\x95\xd6\x4a\x4b\x68\x45\xba\xef\xfe\xe1\x6d\x8a\x50\x6f\x07\x50\x64\x2a\xb3\x98\x78\x43\x9a\xd3\x80\x2b\x1c\xba\x10\xf5\xbd\xe5\xb4\x3f\xa9\x0b\x79\xf7\xa2\x2a\xe1\xe0\xdf\x46\xd7\x9f\x53\x93\x07\xe6\x83\x80\x6b\x0c\xa0\xaf\x0e\xb2\x26\x94\x9d\x56\x5c\x84\xfb\xa5\xb8\x23\x92\x7d\xe2\x06\xed\xdf\xbb\x4b\x91\xde\x89\x87\x0c\xa6\x2d\x76\xd4\xec\x2c\xbd\x20\x24\x0f\x9b\x16\x5c\x62\x92\x83\xa9\x6e\xcc\x03\x34\x70\x68\x43\x1f\x5c\x9a\x54\x0e\x92\x0d\x54\xc7\x09\x74\xb9\xb0\xe0\xb5\x69\x20\x79\x67\x1e\x4b\x1f\x16\xbd\xb0\x3f\xa2\x78\x1d\xb8\x55\xbe\xdc\xbe\xa6\xa6\x0a\xe2\xfd\x06\x3a\x15\x3e\xee\x4c\x79\x4e\x7a\x6d\x95\xb0\x07\x05\x24\xd4\x10\xdb\x9a\xc0\x54\x79\x6e\x3a\x27\x4d\x4c\x10\x89\xf2\xa8\xe2\xc5\xb2\x07\x93\xfa\x20\x28\xb8\x06\x8d\xaf\xfe\x7e\x1e\x70\x6d\x3e\xaa\x90\xe3\x75\x5c\xe8\x8c\xdd\x05\x85\x65\x64\x86\x8a\x44\xdb\xda\x89\x13\xbb\x62\x59\x2c\x76\xee\x23\x56\x05\x79\x80\xe0\xf3\x97\x68\x9a\xbf\x08\x51\x4f\x06\xbf\x78\x80\x09\x3d\x20\x76\xa0\xd3\x62\xb9\x59\xb4\xc0\x69\x9a\x4d\x65\xfd\xb5\xfe\x59\x32\x7f\xf9\x7c\x8a\xe6\xe4\xb1\xdb\x19\x59\x33\xe2\xa1\xa0\x82\xc3\xa1\x7c\xcc\xa6\x92\x2f\x4b\x0f\x71\x91\xc0\xef\x32\x1d\x90\x55\xfd\x42\x8f\xba\x14\xf2\xc2\x39\x45\x70\x9b\x3a\x62\x1d\xe6\xd0\x65\x2d\xdf\x0d\xe0\x15\x5d\xe3\xce\xc5\xda\x72\x50\x68\x57\x4e\xb7\xec\x4e\xea\x90\x27\x94\xe2\x30\xc0\x91\x1a\x36\xd4\xd9\x8d\xb3\x1b\x11\xdd\x7c\xb5\x00\xf7\xb2\x65\x29\xc4\x7f\x49\xe0\x29\xad\xaf\xdd\xc5\x1e\xa4\x97\xfe\xab\xba\x75\xb6\xeb\x6a\xee\xb7\x9d\xa0\x41\xed\x17\xd0\x1f\x90\xb5\x71\x2a\x0d\x0f\xbc\x57\x9b\x95\xa5\x77\xb5\x52\x1f\xfa\xcd\xda\xee\x2e\x48\xb7\x77\x4d\x50\xa5\x9c\xf6\xbc\x93\xfa\x5c\x24\x3a\x96\x96\xd1\x2b\x1c\xe2\x7e\x5d\x38\x6c\x28\xe7\x42\x36\x19\x27\x04\xcd\x4a\xda\x19\x8e\x50\x76\x98\xbd\x0a\x6f\x15\x8b\x75\xf7\x36\x96\x9d\xda\xe4\x8d\x55\xf3\xa0\x6f\xc1\xc4\xc5\x38\x16\x98\x36\xc4\xd2\xb3\x9c\xab\x8b\x0f\xd3\x47\xec\x4f\xce\x40\xb9\xd4\x4e\x07\x56\x8a\x86\x96\xe5\x31\x2b\x38\x97\x2f\xa1\xa1\xdd\x2b\x77\x33\xb1\x56\x4a\xf8\x2d\xbd\x98\x2c\xb3\x07\x7e\x79\x52\x95\x76\xdb\x55\x90\xf0\xcb\xa9\x03\x04\x0e\x33\x0f\x0a\xe1\xae\x63\x83\x4e\xb4\x3c\x51\x1b\x63\x18\xdd\xf8\x2e\x72\x7e\x4a\xe5\x5c\x75\x4c\xc4\x7d\x61\x56\x4f\xdd\x7b\x81\x37\xd3\xf9\x54\x5f\x47\x52\x71\xa6\x8b\xf9\x48\x80\x09\x23\xea\x01\xfe\xce\xb7\x99\x6a\x12\x6a\x43\x08\x9f\xda\xc2\x64\x08\xdc\x69\x5e\x21\x08\x14\xdc\x94\xf5\x94\xd1\x9d\x4a\xf7\xe5\xc1\xcd\x6a\xac\x2e\xca\x85\xbf\x4c\x6d\x0a\xae\x84\xab\xd4\xc2\x62\x01\x1c\xbb\x37\x82\x2a\x2f\xd9\x62\x75\xcc\x2c\x12\xbf\x93\xba\x97\x9c\x8a\xfd\xfa\x00\xe0\x43\x41\x60\xd8\x24\x1c\x0b\x89\x09\xde\xc5\xdc\xc6\x6a\xf9\x99\x25\x32\xe9\x1d\xde\x61\x0c\x43\x0d\x7f\x6f\x83\x69\xd4\x04\x5d\x64\xce\x9c\x9d\x12\xe5\xc7\x36\xd9\x66\x0b\xef\xd6\x9f\x7f\x79\x1e\x74\xe3\x2d\x48\x4e\xca\xc9\xfb\x88\x5d\x64\x91\xd4\x28\xd2\xab\x64\xa8\x59\x38\xbc\x89\x76\xb7\xd8\x0d\xc3\xe6\x27\xf0\x6c\x82\x8b\xa5\x1a\xa7\x37\xef\xb7\xb4\x19\xb0\xbd\xea\x7f\x54\xbf\x77\x1d\x59\x78\x84\x81\x87\xd7\x7b\x9c\x68\xf2\x04\xdb\xbb\x78\xba\x54\xaa\x38\x7e\xe6\xb1\x91\xae\x70\x8f\x30\xce\x1c\x26\x60\x85\x83\x4d\x6d\x0e\x70\x6f\x34\x65\xd0\xd7\xc0\x53\x48\x6d\xfa\xa3\x85\x69\xb0\x1d\xef\x50\x7f\x46\xb3\x9f\x25\xa7\x7a\x54\x7b\x4b\xa7\xa4\x08\x6f\xb0\xbc\x68\x2b\x9c\xaa\x88\x38\xbd\xe9\xbf\xaa\x48\x16\xb7\x12\x2a\x46\x41\xba\x5d\xf3\xd5\x01\x74\xa3\x2e\xe3\xd5\xbc\xfe\x93\xa2\xdd\x17\xc3\x6f\x14\x59\x46\x93\xcb\xe8\x24\xef\x2a\xbc\xfa\x1e\x53\x28\xcc\xc8\xb7\x36\xe2\x4d\xe0\x70\xba\x8b\xf0\xec\xe2\x80\x38\x30\x2d\x74\xf2\xb2\x58\xd5\x98\x93\x98\xb8\xe0\x7f\x32\x10\x75\x90\xb8\x69\xc4\xaf\xa4\x8d\xb8\xed\x3f\x4a\x0c\xad\x6c\x3a\x51\xef\x00\x8f\x2c\x10\xfc\xef\xa4\xa1\xda\x3f\x73\x57\xc5\xc6\x96\x6a\xc2\x9a\x34\x50\xcc\x2d\x31\xa5\x1b\x65\xc2\x52\x04\x61\x54\x78\x9e\xa3\x94\xf5\xe1\x08\x82\xa3\x29\xba\xef\x92\xf1\xd9\x13\xb5\x4b\x37\xa9\x77\x78\xf5\x97\xa6\xc4\x7c\x6c\x63\x90\xb2\xa9\x60\x0c\x4e\x9d\xe7\x80\x9e\x01\xd2\xb6\x02\x29\x9d\xce\xfe\xa3\x94\x21\x4d\x02\x9b\xae\xb8\xa4\xf3\xbc\x43\x7c\xc1\x16\xbd\xde\x38\xaa\x47\xb8\xc0\xf9\x78\x68\x90\x5a\x15\x75\x7d\x17\xfd\xeb\x6b\x05\x6f\x68\xd6\xc7\x8f\x7c\x82\x6c\x2e\x09\x0a\x68\x05\xf3\x79\x38\xd5\x95\x91\x05\xe5\x07\x1a\x1f\x76\xd7\x5f\x1e\xa2\x96\xbc\x23\x8a\x06\x83\x86\x3f\xbe\x5f\x26\x1b\x71\x1a\x3e\xe8\xbf\xd3\x1b\x86\x8b\x1a\x1f\x1e\xb7\x7f\xc4\xcd\xe4\x2f\xff\x25\x22\x36\x39\xb6\x9b\xc2\xe4\xa5\xb4\xb4\x9d\x17\x16\x5e\xcd\xf9\xc9\xaa\xd9\xc5\x0c\xa0\x89\x24\x01\xfc\x50\x73\xd5\x76\xfc\xd0\xcc\x74\x0b\xf5\x15\x95\xc4\xef\xed\x61\xfb\xb4\xdd\x79\x4c\x9c\x24\xc1\x66\xa0\xee\x32\x09\x6c\xb5\xd7\x89\x98\x04\x2f\x4d\x0d\x8d\xf9\x49\x72\x01\x16\x06\x37\xec\x1c\x18\xc6\xd7\xe4\x4f\x94\xaf\xd4\x5d\x97\x1d\xfe\x56\x3c\x33\xf5\xac\x10\x99\xf9\xde\x35\x7e\xd1\xce\x7f\xc8\x6e\x86\x4c\x1f\x46\x6b\x84\xb6\x48\x21\x14\x19\xa0\x1e\x8f\x8e\x86\xe8\xf5\x6c\x23\xdb\x62\xa5\xbe\xa9\x32\xe9\x0d\xc9\x06\x0d\xe3\xa7\x4b\xa4\xe4\x22\x23\x99\xfd\xa4\x82\x67\x6b\xdd\x38\x54\x64\xa2\x04\x94\xe6\x25\xad\xda\x40\x59\x2d\xbb\xf8\x1d\x23\xcf\xe8\xf9\xe5\xf3\x38\xdd\x58\xc8\x04\xa3\xb0\x08\x3e\xf1\x08\x90\xeb\xe4\x1d\x70\x25\x09\x5d\x2c\x3b\xfe\x3b\x9b\x4f\x51\x8f\x60\xce\x4e\x5d\x22\x5b\x62\xf5\xca\x59\x48\x94\x42\xfb\x7e\x91\x6c\x96\xf7\x45\x4b\xb2\xb4\xf6\xd1\xb6\xed\x6a\x44\xbc\x04\x2f\x26\x89\xce\xea\x7b\xe8\xd5\x2e\xbd\x16\x1e\x2d\xd2\xf4\xfd\xa3\xc8\x70\x44\xfe\x12\x2c\x48\xc1\x38\x7e\xe2\xa3\xe7\xde\x52\x27\xc1\x2a\x28\x95\xee\xd1\x2c\xc7\x2a\x1c\x31\x46\xa7\xd8\xe8\xa9\xca\xde\x86\x8d\x85\x3a\x1f\x41\x0a\x5f\x47\xc6\x54\x0f\xc9\x07\x6f\x6a\xad\x53\x2f\xce\x57\xc2\x8c\x75\x98\xc9\x47\xb0\x2b\xb9\xcb\x3e\x69\xbe\x41\x5a\xaa\xcf\xf0\xe5\x4e\x0f\xaa\x70\xdb\xa1\x55\x61\xd2\xe7\x96\x70\x35\x1e\xad\xc8\x69\x17\x97\xb8\x01\x05\x29\xf8\x35\xe5\x5b\x60\x97\x02\x07\xfc\x02\xe1\xd1\xd9\xa3\x9b\xe9\x7c\x27\x31\x0e\x42\x33\xc9\x05\x68\x39\xac\xb8\xbc\xfc\x47\x53\xcc\x55\xab\x6a\xb2\xe2\x8c\x1b\x8b\xbb\x73\x3a\x6f\x82\xbd\x63\x7a\xad\x48\x79\x89\x48\x8e\xd3\x2c\x06\xe1\x7c\x14\xd6\xb2\x5f\xa2\x64\xda\x22\x5f\xcc\x28\xaf\x95\xa7\x31\xc2\x6d\x22\x00\xde\x24\x1f\x36\xcf\xac\x7b\x58\x19\x0b\xbf\x81\x29\xc5\xee\xea\x7e\xcc\xdd\x45\xdf\x76\xf5\xd8\x4e\x83\x7a\x91\x42\xbc\x52\xcc\xc1\xd9\xb2\x1c\x49\x2b\xcd\x98\xb5\x4d\xaa\xb9\x38\x1f\xee\x86\x6a\xef\xe1\xb2\x74\x2b\xca\xb0\xe9\xd3\xb5\x78\xe7\x1f\x99\x2e\x9f\xee\x09\x75\xe0\x4b\xf0\x26\x99\x09\xa2\x71\x70\x10\x86\xfe\xd5\x11\xd4\xab\x47\xd2\x17\xa1\x0b\x40\x2b\x6d\xcf\x28\x0a\xba\xb2\x89\x4a\x17\x49\xfd\x40\xfb\x11\x4a\x5b\xe5\x57\x43\xb5\x55\x47\xf5\x01\x2e\x53\xd6\x04\x19\x6a\x96\x2a\x4a\x90\x9e\xa5\xd9\x4f\x4d\x67\xf0\x0b\x91\x85\xd5\x5a\x66\xd3\xe9\xec\xd6\xab\x7d\x02\x83\x99\xed\x53\x6a\x8c\x40\xd4\x18\x3c\x68\x90\xf3\xa8\x99\x23\xde\x22\xc2\x3a\x02\xe1\x84\xe9\xde\x9a\x96\xe4\xcc\x9c\x11\x24\x2e\x6c\xfd\x03\xe1\xa4\x22\x5e\x0e\x38\x9f\xce\x6e\xd7\x19\x46\x85\x20\xc4\xc3\x97\x50\x97\x04\xae\xad\x25\x79\x5c\x0c\x0f\xc6\xf2\xfe\x09\xb6\x8d\xea\xef\x83\xfd\xe6\x82\xb9\x89\x52\x3b\xa1\x25\x39\x83\xb8\xcd\xec\x8e\x08\xe4\x8a\x36\x04\x44\x23\xd9\xd3\xfb\xc4\xce\x54\xb3\xdd\xf0\x23\x7d\xd0\x6b\x45\x85\xbe\x11\x9f\x9f\xb9\xf0\x48\xcf\x98\x91\x0d\x27\x8b\x8c\x13\x23\x72\x8c\x7b\x0c\x1a\x97\x93\x09\x9a\x1e\x0d\x75\xba\xf6\x7f\x4e\x94\xdc\x2f\x2d\x01\xd1\xd8\x1f\xcd\xc3\x53\x96\x1d\x55\x1f\x8b\xc4\x34\xb4\x84\x3b\xd7\x5a\xb6\xfd\x2f\xb7\xab\x46\x7d\x63\xc4\xf1\x6f\x54\xc9\xb8\x60\x78\x52\xbc\x53\x53\x2c\xbf\x36\x13\x1b\x86\x68\xfb\x1a\x0b\x14\x3d\x5f\x20\xba\xb4\xfe\xb4\x90\x2a\x88\x49\xbd\x5a\xe8\x92\xef\x1a\x5c\xee\x6c\x23\x86\x44\xf6\x40\x0c\x60\x88\x49\x6f\x6a\xb1\xdc\xc2\xc7\xac\xe5\xc1\xa8\x9a\xd8\xa7\x6d\x40\x08\xcb\x33\xbd\x63\x45\x07\xcd\x13\xb7\xff\x49\xb5\x1a\xd9\x2c\x14\xde\x15\x14\x7a\xab\x12\xad\xd5\x67\x55\xbd\x74\x85\x71\xde\x38\xe5\xc6\xf3\x34\xea\xfb\x34\x4e\xc7\x2c\x2b\x13\x44\xc3\x62\x51\x05\xd6\xcd\x91\x78\x16\x7e\x9a\x5e\x09\x6f\xb1\xd4\xcb\x43\x8b\x3e\xcd\x51\x14\x4f\xd3\x81\x4d\x47\x73\x23\xd7\x53\x7a\xa1\x4c\x5d\xca\xa2\x19\x6d\xde\xbc\xcb\x2d\x91\xf4\x50\x6f\x81\x25\x83\x9f\x43\xc2\x80\xec\xad\xc3\x6f\xda\x9f\x92\x9a\x51\xa1\x3e\xda\x0b\xe9\xe2\x28\xc4\x2e\x5c\x6e\x54\x05\x13\x43\xbc\x98\xd5\x06\x0f\xfb\xef\xdf\x8f\x36\x8a\x23\x15\x38\xf7\xb4\x0b\x3e\xb2\x0f\xe4\xda\x55\xd0\x03\xc9\x3d\xd8\x6d\x9b\x86\x87\x6d\x79\x84\x85\xa6\x38\xdf\x75\x66\x89\x4d\xf8\xe8\x1f\x66\xa3\x53\xe6\x0b\x10\xb0\x53\xe2\xf7\x25\xd5\x8f\x4a\x7c\x50\x14\x2c\x98\x68\x87\xcf\x5c\xe9\x9d\x3c\x21\xd4\xe3\x84\x2d\x34\x6f\xf0\x64\xa5\x83\x60\x99\xc3\x42\x1c\x35\x89\x34\x31\xba\x7f\x42\x44\xd4\x8b\x01\x73\x54\x30\x1c\x8a\x1b\xb8\x67\xa3\xba\x14\x58\xc3\x13\x76\x90\x34\x35\x3d\xa2\x0a\x9d\xf2\x45\x23\xc2\xa6\x13\x73\x05\x3a\x75\xa6\x1c\xe4\x5c\xa0\xa2\x26\xba\x1e\x29\x77\xa7\xa4\xf1\x49\x29\xf6\x82\xcb\x57\xf1\x51\x6a\xaa\x78\xcc\x91\x75\xe1\xbb\xf3\x7c\x02\x43\x76\x7e\x61\x2f\x3f\x1c\xcd\xac\x1e\xf2\xf3\xd4\xb7\xc1\x75\x7c\x22\x11\x33\x16\xf1\x3f\xbd\x6b\x1b\x12\xa6\x81\x56\xd9\xb2\x23\x6e\xa1\x4c\x4e\x6b\x22\x0f\x72\xa3\x10\x41\x9c\xb1\x72\xe8\x9e\x5e\xd6\xc8\x5f\x00\x86\xa1\x47\x90\x66\x1e\x4e\x2b\x09\x84\x5e\x97\x06\xc7\xd9\xe7\xfa\x30\xf5\x29\x40\x29\xa2\xd6\x1f\xbd\xbc\x64\x81\xe9\xa5\xcd\xee\xd1\x22\xf7\x13\x67\x29\x7c\x38\x44\x49\x1d\x62\xef\x36\x6d\xe6\x38\x3b\x26\x88\x2d\x32\xda\x29\x52\xbb\x12\xb7\x5f\xe9\xe6\x16\x0d\x61\x1b\x13\x87\x9f\x4f\x4d\xb1\xad\xf5\xe8\xe2\xc6\x4b\xbd\x26\xdd\xd1\xed\x79\x8b\xde\x47\xa6\x14\x73\x89\x8a\xe9\x9b\x0a\x7a\x39\x08\x36\x97\xac\xbc\xff\x0d\x23\x29\x89\xbc\x9d\xd2\x81\xf1\xb1\x59\xbc\x69\xc1\x9b\xdf\x92\x04\x5e\x96\x4f\x6b\xc1\x13\x47\xdd\xa5\x38\xb1\x23\xb3\x9d\xaa\xc2\x1e\x02\x34\x4c\x30\x42\xab\x0a\x14\xb6\x43\x63\x2d\x29\x04\xe4\xc5\xec\xd0\xb8\x8f\x59\xe7\x5d\xdb\x51\xef\xc0\xe0\x9c\xa9\x50\xea\x25\xc6\xb3\x50\xd8\x57\xba\x41\x16\x08\x94\x86\xed\xfb\xfc\x4f\x5f\x05\xc2\xd6\xbf\x57\x8b\xe4\xb9\x5c\x31\x88\xcf\x9a\xc3\x33\x9f\xd0\xb8\x37\xc3\x57\x1f\x12\x89\x0d\x9c\xde\x25\x35\x74\xf8\x99\x20\x91\x76\x29\x3a\x6b\xfa\x48\xdd\xb7\x27\x31\x43\x8a\x1c\xab\x57\x6c\x14\xd3\x8f\x27\x04\xc2\xa3\x61\xc1\xce\xab\x78\xae\x96\x9f\x57\xce\x17\xdc\x17\xc6\x55\xdb\xd5\xe7\x71\x69\xba\x36\xca\x30\x1a\x0e\xc2\x3f\xf6\x4d\xf7\x73\x9d\x44\x47\x27\xf9\xc1\x21\x20\x11\x30\x50\x41\x82\x43\xca\x98\xbe\xee\xff\x7a\x2e\x40\x0c\x55\x6c\x73\xaf\x4e\x7b\x87\x9e\x8b\xe1\xeb\x71\x83\x55\xf0\xcd\xd5\xa9\x6b\xb9\x26\x52\xb1\x7a\x49\xfd\x31\x14\x8d\x61\x59\x3d\xea\xa3\xe4\x7e\x21\x76\x87\x31\x2d\x54\x44\xdf\xa5\x5f\x0c\x8e\xeb\x4d\x7e\xe8\x86\x21\xc6\xb0\x4e\xff\xd1\x70\x0d\xae\x40\xd9\xbc\xee\xa1\x5a\x33\x14\x77\x77\xa8\x1e\xfb\x03\x17\x01\xf2\x4e\xcd\x67\xcf\xde\xd3\x4c\x02\x63\x9b\x31\x10\x9b\xf1\x6b\xd5\x5b\xdb\x55\x16\xb4\x85\xc6\x31\xbe\xa5\x2a\xb0\xd1\x00\xb3\xcb\x70\x88\x6a\xed\x7a\xce\x81\x44\xda\x97\xc2\x21\x6b\x0c\xdc\x8c\x40\x0a\x8d\x4e\x39\x8a\x19\xcf\x80\x01\x89\x31\xce\xe4\x2f\x5b\xda\x3d\x7d\xc8\x0d\xf8\x48\x35\xce\xf5\x36\xf1\x6b\x44\x03\xd8\xdb\x99\x93\x4b\x6a\xca\x73\x13\xdb\x04\x5c\xae\xe0\x2b\x7e\x89\x68\x1d\x97\x3c\x09\x3e\x7f\x4a\xb0\xa4\x4d\x4d\xc4\x81\x80\x68\x0e\xe1\xcd\x12\x38\xd8\xbb\x70\xa2\xe6\x51\x67\x30\x34\x18\x50\xc4\x10\x15\xc0\x6e\xec\x24\x8b\x11\x3d\xff\x4c\x15\x09\x2a\xf1\x4a\x31\x87\xfc\x13\x4b\xda\x1a\x65\x34\xfe\x3e\x06\xb3\x0a\x15\x1a\x04\xf8\x42\x06\x53\x5b\x9d\x43\x80\xa0\xab\xbc\xd6\x16\x2e\x0c\x0c\x4c\x11\x4d\xb8\xce\x36\x16\xe0\x27\x11\x12\xfd\xd6\xda\xa4\x65\xc2\x12\x17\x16\x9d\xca\x2a\x08\x29\x84\x06\x35\xf8\xb6\xd1\x75\xa2\x9f\xcf\x1b\xa8\xff\xe9\x2c\xe2\x35\xf0\x99\x37\x62\x50\xf4\xca\xec\xa1\xc4\x79\x6b\x92\x50\x58\x3e\x33\xf5\x96\xda\xd3\x59\x8a\x40\xe1\x45\x45\xe7\x9f\x70\x04\x11\xd9\x87\xe4\xff\x9c\x31\x93\x66\xa8\x12\x33\xd8\xc2\xce\xe1\xc3\xc0\xbe\xe3\xc7\x72\xcb\x90\x65\xa1\x35\x3a\x12\x12\x2d\xf8\x03\xf4\x5c\x3e\xbf\x65\x02\x7a\xd9\x9f\x33\x44\xb4\x1c\x9e\x0b\xbc\xd5\x8b\x31\x41\x25\xba\x73\x0c\x43\x5e\xfe\x8a\xe2\xfe\xfa\xea\x0d\x0f\xdb\xc8\x84\x36\x40\xe5\xd0\x2c\x94\x50\x2c\x59\x2c\xe6\xc2\x48\x80\x74\x31\x41\xec\xbd\x5b\x14\x05\xfb\x4d\x53\xcc\x9b\xda\x35\x70\xae\x9b\x2e\xe9\x7f\xc7\xc2\x18\x88\x96\x67\x54\x69\xcf\x2d\x09\x32\x44\x4e\x1b\x85\x2a\xfe\x8d\x87\x46\x63\xd9\x86\xf4\x2a\x41\x2a\x0d\xf9\xe0\xaf\xf9\x9b\xe4\x3a\x2c\xde\x4a\xc7\xa9\x20\xef\x72\xfc\xcd\x5b\x9b\xdb\xfa\x22\x47\x59\xf2\xa5\xeb\xf9\xf7\x2f\x33\xc9\x33\x6f\xf0\x01\xde\x9a\x18\x8a\xc7\xba\x5e\xe0\x85\x66\xea\x70\x47\x35\x0b\x93\xcd\x99\x51\xad\x71\x07\x50\xdf\xb5\x4b\xe9\x28\xbf\x6b\xca\xdd\x30\x33\x28\x0a\xdb\x55\xb2\x70\xde\x48\xfd\x05\x85\xf4\xce\xea\x96\x66\x94\x8f\x24\xc2\xbf\xa1\x1d\x93\x31\xb2\x25\xaa\xbd\xc8\x67\x6a\x33\xb4\xdc\x7b\xf9\x0c\x29\x8e\x77\xd3\x45\xea\x85\x32\xbb\x5a\xe8\xd9\x58\x1c\x95\x80\x4d\xaf\x69\x59\xe8\x3b\xa1\x11\x70\x88\xbc\xf9\x52\x28\x10\x69\xff\x22\x04\xb2\x74\x99\xb4\x16\x07\xfd\x90\xaf\xa4\x46\xae\xc7\x88\x3b\x42\x5b\x79\x79\x91\x3d\xc7\x74\x33\xc6\x87\xff\xd1\xf3\x1f\xe4\xe2\x45\xc5\x77\xaf\x77\x46\x5c\xa5\x41\x3e\xc8\xa5\x71\xa7\x31\x5e\x97\x26\xfc\x31\x2a\x18\x1e\x68\x69\x35\x56\x96\x5d\x0c\x79\xba\xd3\x0f\x78\xff\x41\x0d\x4d\xd1\xac\x29\xcd\x07\xc5\x8b\x24\x71\xea\x20\x32\x7f\xf1\x9c\xdf\xd4\x44\xdc\x3e\x7a\x3c\x0d\x22\xdd\x63\xb1\x6e\x0c\xd9\x71\x6d\x30\x4f\x3b\x72\x1d\xb6\xc6\xbc\xa5\xc2\x13\x64\x79\xe5\xe7\x67\xa8\xcf\x1c\xd1\x27\x88\xce\x5f\x62\x07\xae\xbf\x26\x53\x1e\xc2\x04\xe9\x57\x39\x12\x0d\x86\x77\x1d\x65\xa6\x83\xa9\x0d\x54\xb9\xa7\x72\x8c\x74\x35\x9d\x3c\xab\x68\xab\x7f\x0b\xbb\x61\xc5\x00\x7f\xa7\x6b\xb0\x39\xa1\x30\xdd\x7b\x52\x16\xa1\x97\xc1\xb0\x35\xbb\xec\x4b\x20\x0a\x99\xb2\x15\x21\x57\xbe\xc5\xd0\x0a\x94\xc3\x9a\x20\xce\x91\xd4\xa6\xe3\xaa\xa7\x02\xe0\x0e\x0e\x66\xc6\x3a\xd2\xf2\x39\x25\xf8\xa6\x6e\x7f\xbd\x99\xc8\xb0\x31\x37\x3e\xa6\x7d\xee\x78\xf6\x47\x9a\xbb\x4b\x71\x87\x0a\x81\xb8\x09\x1d\x18\xac\x75\xf7\xe1\x05\xa4\xbe\xaa\x66\x21\x2e\x11\x4f\x3f\x94\x17\x02\xb6\x94\x6e\x9a\x8f\x11\x0a\xac\x86\x8d\x34\xed\x8d\xbc\x27\x65\x66\x29\x68\x6d\xde\x66\xcb\xae\x95\xe2\xb1\x64\xe5\xa6\x5c\xaa\xbc\x54\x83\x94\x04\x41\xcc\xd8\x60\xb8\xf9\x83\x26\x31\x97\x5b\x8e\xec\x46\x0d\x63\xf5\x21\x73\xe1\x26\x7c\x8f\xcb\x10\x08\x93\x10\xfc\xef\x29\x13\x9d\x32\x6c\xbf\x84\xaa\x8b\x38\x6a\xb0\xc6\x4e\xee\x75\x75\x10\xa1\x0d\x23\x13\xd2\x0b\x3a\x87\x59\x66\xa2\xe9\x57\xd5\x01\x01\x2f\xe9\xfb\x80\xe5\x19\xdf\x37\x6d\x88\x5e\x38\x03\x0a\x65\xff\x44\x56\x01\x19\x36\x60\x8e\xab\x8e\x60\xb8\xe7\xd8\xf0\xb1\x11\xa7\x6b\x78\x52\xc4\xc1\xf5\x8c\xac\xbf\xcd\xb8\x65\x6a\xd4\xa4\x85\x34\x40\xe6\x21\x90\x43\xe2\x34\xaa\x44\xfa\x93\x33\xe5\x77\x95\xe5\x5e\xf1\x17\xd5\xbb\x60\x70\xa3\xe3\xc3\xfb\xc9\xaf\xbc\xae\x91\xab\x59\xed\x88\xb2\x21\x06\x19\xcf\x1f\xcd\x72\x75\xbe\x3a\x41\xdb\xca\x62\xaf\x03\xde\xfd\x29\x6a\x9f\x32\x68\x87\x4f\x88\x12\xd8\x7f\x9c\x35\x6f\x44\x42\xab\x31\xc2\x9a\x29\x64\xa7\x42\x62\x30\xf1\xc0\x93\x5b\x19\x98\x60\xb8\x91\xf8\xb5\x30\x5c\x49\x4a\xc4\x80\x9f\xa2\x4f\x8c\x41\xb4\xfe\x76\x57\x0a\x6e\x67\x8e\x5d\x3c\x03\xf7\x0b\xd0\xf1\x8d\x55\x2c\x78\x96\x56\xf3\xa0\x0c\x29\xcd\x74\x14\xc2\x2c\xda\x91\x09\x9b\xcb\x35\xb2\x65\x0a\x6a\xd0\x52\x08\xc3\x63\x0c\x3e\xcd\xa8\x1c\x00\x24\xe0\x42\xde\x91\x53\x1d\x89\xf5\x2c\x7d\x5c\xf2\x5e\x54\x29\x47\x82\x58\x4e\x1d\x54\x1a\xdc\x17\x35\x3e\xc4\xa0\xd6\xe8\xd6\x96\x35\x25\x77\xa3\x31\xa0\x96\xca\x11\x93\x4d\x78\x0c\xf7\x28\x31\x40\x92\x9b\xf1\xcf\x66\x25\x00\xa0\xcd\xc3\x4e\x6f\x68\xa2\x16\x7f\x26\x9e\x01\x7b\xc5\xa1\xcd\xca\x92\x68\x80\x52\x37\x8f\x6e\xa6\x12\xcd\xea\xaf\x88\x4a\x91\xfa\x37\xb0\xd9\x1c\xe1\xe4\x6c\x0a\x8e\xac\x48\x31\xf3\x20\x06\xa9\x3a\x53\x57\xfe\xa6\xbc\xda\x9c\x9e\x73\x1a\xc8\xe3\xd9\xcd\x05\xd3\xb0\x1d\x81\x8d\xba\xae\x6b\x12\xeb\xf3\x64\x5f\xab\x4f\x37\x60\x8d\x27\x75\x59\xf0\x9a\x03\x0c\x11\x05\x4f\x64\xae\x02\xab\x6f\xea\x31\xa0\x62\x6c\x5f\x43\x1c\xbe\x26\x35\x39\xee\x81\x38\xcd\x0c\xae\xa0\xb2\x2e\x2b\x91\xa3\xae\x97\x1a\x90\x62\xe3\xde\x31\xf6\x0d\x82\x61\xec\x73\x84\xb4\x4b\x0b\xe0\xa4\xd5\x27\xa3\x42\x59\x58\x90\xb3\xfc\x8b\x05\x30\xd9\x12\x63\x0f\x42\xa3\x84\x5f\x0f\xcd\x18\xb9\x50\x17\x22\x5c\x56\x4d\xd0\x7a\x5b\x42\xaf\x54\xfa\x74\xd2\xb8\x29\xca\x92\xf6\x26\xb9\x6a\xa1\x2c\x7b\xaa\xa3\x47\xc5\xfe\xee\x41\x1e\x77\x9c\xb3\xbd\xef\xd1\x36\x81\x49\x70\x41\x56\xb2\x48\xc2\x8e\x81\x50\xa0\x35\xab\x64\x13\x92\xb4\x6c\x48\x25\x34\x1f\x83\xf1\x26\x1f\x63\xcb\xda\xaf\x67\x2b\xea\xf5\x68\x2c\x94\xab\xb3\x00\x81\xf0\xb6\x7f\x5f\x0c\xd8\xb4\xf4\xa5\x9b\x84\x1a\xa2\xce\x08\x74\xb2\x18\xd7\x61\xdc\x7e\x2f\x6a\x46\xac\xc9\xd7\xc8\xb1\xc8\x03\x9d\x1d\x8d\xe4\x81\x52\x12\x5f\xf3\x7b\x1e\x8f\x4b\x55\x06\xbd\xe2\xc4\x1d\x26\xb6\x5b\x64\x2f\x42\xe8\x3c\xf8\x2c\xfa\xb6\x90\x6a\x4c\x8f\x44\x6e\x49\x9a\xcb\x80\xb1\xae\x38\xd3\xd2\x56\x22\x97\x11\x07\xef\x52\x77\x1a\xce\x28\x7e\xb9\x51\xc6\x0e\xa7\x4f\x5c\xea\x21\x80\x03\xf5\x06\x07\x3d\x87\xfd\xb0\xac\x0b\x3a\xb9\x51\x04\x7f\x41\xe1\xe9\x0c\x45\x8d\x70\x32\x2f\x8a\x53\x84\x0c\x37\x0c\x28\xf8\x58\x5b\x24\xc8\x98\x42\x41\x33\x10\x8f\xaf\x5e\x4a\x0c\x00\x6d\x69\x7c\xd4\x05\x24\x3d\x0b\xe5\x2f\x6e\xd4\xb6\xd2\x4b\x08\x85\xde\x6b\x97\x23\xcc\x8a\xc4\xd7\x89\xa3\xf5\x6b\xbc\x93\xf0\x14\x4b\x58\xa8\x51\x8a\x81\x44\xf4\x5f\xad\x82\x0e\x7e\x88\xea\xd3\xa8\x32\xe7\xa6\xaf\x09\xe0\x60\x6b\xd5\x6b\xfd\x2d\x49\x8a\xfc\x2b\x59\xea\x95\xde\x39\x39\x50\xd3\x0c\xde\x42\x0e\xbd\xa9\xbc\xd9\xa6\x13\x93\x70\xe3\x18\xcf\xa5\x0d\x6c\xf4\x20\x21\x24\x30\x29\x21\xc8\x08\x5c\x27\xf8\x8f\xb7\xe9\x4c\x95\xfb\xb4\xff\x13\xbe\xc9\x8c\x4f\x5e\x10\x42\xba\xb2\x9d\xd4\xc3\xf1\x30\x3c\x32\xd7\x60\x9e\xbf\xd3\x43\x83\x66\xbf\x64\x30\x70\xa1\xe2\xce\x5e\x7d\x29\xce\x22\xb8\x08\x18\x3e\x23\x6f\xf9\x03\x4f\x2b\xb5\x96\x87\xe0\x8c\xbb\xc4\x06\x07\x47\xa1\x5b\xcd\xf8\x1f\x9a\x63\xdc\x40\x41\x2b\xda\xdb\x3d\x02\x5b\xb3\x3c\xbb\x36\x4c\x73\x5c\xc1\x6a\x99\x88\x28\xfb\xc8\xf1\x00\x9c\x73\xda\xa2\x15\x05\xd8\x42\xf4\x91\xa3\x75\x8b\x7d\x12\xd3\x94\x56\xae\xd0\xb9\xca\x8f\xec\xd7\x2c\x80\x99\xc9\xa0\x5d\x6a\xb5\xc2\x50\xfb\x0c\x66\x9e\x12\x69\x50\x83\x69\x05\xe3\xb3\x0d\x47\xec\xc3\x47\xf8\x84\x19\x75\xe9\xd1\xdf\x3a\x02\x41\x5c\x27\x8a\xbe\x2b\x47\x98\x00\x4d\x07\x21\xf8\xd6\xd2\x20\x4a\xab\x22\x1b\x61\xff\x1c\x71\xa3\x35\x46\x7f\xbb\x85\x66\x55\x3f\xbf\x6e\x01\x55\xd4\x96\x50\x83\x6b\x7e\x9c\x97\xc2\x97\x47\x23\xc8\xf3\xcd\xd2\x6b\xda\xf0\x17\xf0\x89\x8b\xe3\xb3\xc6\x83\x0e\x50\x8b\xd8\x7d\xd0\x33\x55\x16\x19\x32\xc7\xf6\xbb\x79\x4d\xfc\x42\xac\x91\x62\xbb\xf0\x62\x0c\xdb\x62\xbb\xad\x0e\x6d\x5d\x58\xa0\xf4\xc8\x7e\x69\x8a\xe9\xb0\x2c\x4c\x67\x7a\xdf\xd1\xa6\xd3\xe2\xa9\x0f\x8d\x88\xb7\xa1\xf1\x88\x2a\xfa\x52\xd0\x37\xfc\x50\xe9\x12\xba\x90\xf4\x72\x55\x74\x88\x26\xf4\x23\xde\xa7\xf4\x15\x10\x84\x20\xf7\xfd\x52\x15\x62\x2b\x18\x89\xa4\x6e\xdd\xf3\xc9\x1b\xff\x13\xbe\xeb\x1e\x33\xf2\x4a\xf8\xde\x7b\xd0\xd2\xfa\xd1\x73\x5a\x75\x33\x45\xa0\x78\xe3\x38\x30\x06\x9a\xcf\xca\xa9\xd9\xa2\xe7\x95\xaf\xca\x8b\x96\xa0\xb4\xc9\x3b\x88\x00\xcb\x15\x9a\x37\x71\x2a\x0e\x74\x9c\xbe\x1b\x05\x61\x3f\xda\x7c\x77\xbb\xda\xeb\x28\x7d\xa7\xe3\x6c\x45\xab\x33\xf4\x9f\x36\x44\x6d\x5e\x54\xd6\xcd\xf5\x58\xa2\xb5\x4d\xd8\x82\x8f\x84\x7f\x3c\x53\xbe\x51\xa9\x47\xb1\xb0\x6f\x0f\x38\xb4\x4d\x9f\xb2\x67\x9b\x73\x3f\x4e\x55\x78\xf2\x54\x30\x47\x26\x75\xa1\xa9\xe9\xf9\x24\xaa\x18\xf5\xf9\x41\xe3\xfa\x18\x42\xfe\x4e\xe0\x0a\xd2\x1c\x87\x5e\xf9\x43\x29\xe8\x20\x77\x6e\x3e\x67\xe0\xc4\x33\x5f\xf2\xa7\xe6\xcf\x37\x52\x22\xb3\x37\x86\x40\x16\x5b\xa0\xbf\x39\xdd\xf7\x29\x17\x0b\xeb\x18\xb9\xdf\x9b\x63\x34\x53\xa8\xc2\xa3\xe4\x06\xe2\x18\xb5\x16\xe3\x77\x51\xe3\x97\x65\x2b\x2c\x60\x35\xd5\x50\xac\xe1\x40\x3c\x68\x5d\x5b\x56\xeb\xbf\x34\x0c\x20\x06\xde\xa8\x06\x97\x21\x14\x51\xb6\x86\x89\x4e\xac\x3c\x08\xf0\x97\x14\xf4\x07\xe3\xd4\x29\xe8\xe8\x5f\x41\xbf\xe6\xee\xbc\x2d\xa6\x1f\x1c\x65\xd5\xf4\x06\xae\x76\xfd\xdc\x07\x0e\xef\x79\x3b\x35\x96\x62\x68\x80\xaa\x0e\x97\xb6\xef\x16\xaa\x62\x71\xf0\xf1\x97\x36\x26\xc2\x15\xfb\xb9\x01\x98\x91\xbf\x91\x10\x77\xf2\xb2\xfc\xc8\xec\x5d\x09\x25\x75\xde\x49\xe0\xd5\xa0\x1d\x33\xe4\x6d\xd4\xc7\x68\x5e\x6f\x61\xf4\x3b\xb6\xa9\x69\xa2\xc6\x13\x1d\x22\xe6\xa8\x5c\x2f\x75\x5b\x78\x80\x68\xee\x3a\x41\xf1\xe9\x1a\x4f\xbc\x3b\x91\xc8\xbf\xa9\x04\x35\xe5\xac\xea\x2f\x9a\x52\x60\x8f\xc6\x32\xd5\x5d\xe7\xdf\xb9\x8e\xa4\x95\x7a\x1f\x26\x53\xa3\x81\x4c\x98\x21\xf7\x93\xf8\x59\xa7\x63\x73\xd4\x55\xd8\xb8\xf6\x87\x2a\xc8\xfb\xd9\xd1\x62\xc2\x11\x78\x76\x11\x46\x82\xa4\x3b\xaa\x79\x4c\xe4\xb8\x4e\x49\x8c\xcc\x91\x7a\x4b\x3c\x27\xee\xe8\x0e\x4a\x13\x0d\xad\xbb\xfd\x9e\xaf\x0e\xcd\x50\x51\x09\x89\x4b\xcc\xda\xa0\x5f\x96\x1c\x86\xff\x9a\x06\x79\xff\x2b\xd3\xe0\xdf\xf6\xc9\xa0\x45\x56\xa8\x0b\xb8\x81\x9d\xa3\xac\x0c\x7e\x3d\x0d\x9e\x73\xf4\xe1\x1d\xf3\xc3\x42\x1c\x75\x7e\x38\xe4\xbd\x2c\xc4\x58\xe7\xf4\x13\xda\x59\x93\x8b\x8e\xb0\x6c\xad\x09\xa7\x25\x84\xb4\x25\xe0\xc4\x44\xd4\xe7\x4e\x36\x37\x1c\xda\x7e\x24\xbb\x9c\xd0\x62\xd1\x3c\xcd\xcc\x55\x7b\x16\xcb\x84\x9e\x85\x07\xc8\x3d\x81\x62\xb5\x93\x47\x2f\xa3\xdf\xff\xe2\x90\x59\x50\xc6\x36\x75\xea\x53\xea\x01\x60\x12\x99\xea\xad\x4d\x84\x4c\xba\x6f\x9b\xb8\x9c\x21\x67\x80\xbf\x41\xd5\x88\x0f\xc5\xb6\xd2\x18\xf7\x86\x15\xf2\xd3\xbe\x28\xaf\xf4\xf3\x19\xed\x35\x52\x26\x3c\x17\xb6\xea\xb3\x82\x1a\xe6\xd7\x0f\xe7\x5f\x42\x50\x10\x36\x69\x14\x2a\x4e\x52\xe5\x81\x8d\xd9\x58\x7e\xec\x71\xa2\xce\x98\x91\xd5\x48\x36\xbb\xea\x5d\x5e\x20\x27\x6b\x9b\xb2\xc0\x37\x58\xe4\x5d\x6b\xb9\x72\x7a\xca\x58\x73\x97\x15\x0b\x1f\x9a\x23\x29\xb9\xdf\xe8\x60\xad\x11\x69\xcf\x62\xb7\xb8\xa0\x89\x68\xe1\xe5\xe2\x14\x8c\x1e\x80\xf3\xfa\x9d\x64\x30\xd7\x98\x12\x09\x36\x59\x1c\xb5\x87\x34\x17\x2e\x66\x57\x6a\x9d\xf4\x3e\xc7\x4c\x78\x14\x04\x72\xa2\xd9\xd9\xd1\xa2\x45\xfb\xee\xb7\x73\x55\x5c\xdd\x5d\x43\x39\x81\x1b\xb7\xbf\x52\x31\x4b\x49\x33\xdb\xa0\x69\x4e\x78\x7b\xee\x12\x83\x53\x0f\x5c\x23\x5d\xe1\xc9\xd2\xa6\x9c\xc6\x5d\x66\x0a\x06\xc2\x91\x62\x66\xe2\x1e\xf2\x6d\x53\xe8\x45\x5a\x64\x99\x7a\xb9\x0f\xf7\xa8\x72\x1a\xe8\x2e\xa5\x91\xda\x6a\x61\x17\xec\x4b\x7f\x0a\x3e\x88\x9c\x28\x9c\xc7\x14\x22\x15\xfc\xca\xa5\xc1\xb4\xf3\xf5\x73\x95\xb0\xba\x48\x91\xbb\x14\x60\x5c\xbc\x82\x7c\x4c\x1b\x98\xfb\x6e\x4d\xc5\x9e\x61\x4a\xe1\x0d\xfd\x1a\xac\x1e\xb8\x23\x57\x08\x9c\xdb\xa8\x84\x77\xce\x51\x68\xbe\xf6\x97\xe0\xe9\x3e\xa6\xb7\xc0\x6b\xc8\x51\x81\x8c\x2c\xdf\xe4\x40\xfa\x4a\xf5\xb7\x15\xc9\xa6\xbb\x87\xb7\x19\xeb\xd8\x88\xe9\x69\x41\x3d\xdb\x13\xe7\x90\xa4\x1e\x85\x8b\x4d\x92\x1b\x81\xc6\xba\x80\xb1\x2d\xba\x3b\x7d\x22\xa6\x2a\x34\x48\x3a\xf8\xd5\x9c\xfe\x8a\x6e\x9c\x19\x9e\x36\x60\x96\x14\x55\x39\x7c\x9d\x8d\x88\x49\xbc\x8e\x49\xaf\x4d\x35\xf3\x28\x8e\xc1\xb1\x7c\x2c\x7b\x57\xaf\x4a\xab\x44\xdf\xd0\x0b\x96\x03\x14\x12\x14\xc6\x8e\xa6\x60\x8a\x0c\x7f\x3e\xbc\xb9\x67\x24\x86\xd0\x72\xdd\x2f\x8b\x82\xed\x9a\xcc\xcd\x44\x5b\x4e\x44\x0c\x0e\xa9\xe0\x8f\x41\x53\xe9\x24\xf7\x0b\x97\xf5\xca\x8f\x7c\x34\x78\x3f\x91\xad\x24\x17\x8c\x4d\x59\xb7\x6b\x90\xe4\xea\x06\xa6\x34\x13\x10\xb0\x69\x95\x88\x61\x54\x72\x97\xaa\x11\x89\x7f\xb9\xa2\x3f\xa2\x01\xab\x71\xdb\x25\xd9\x5f\xd1\x8d\xa4\x52\xe9\x3d\x68\x44\x13\xb8\xb6\xea\x5e\xdc\xa3\x31\x07\xaf\x1d\xe5\x1a\x47\xc2\x71\xc9\x28\x60\xc0\x2b\x05\x27\xf2\x91\xc0\x97\x47\x3b\x2c\x0f\xb4\xa1\xc1\xcc\x9d\x97\x7a\xf7\x8b\xd1\x87\x9e\x4d\x12\xcc\x9f\x62\xae\x1c\x68\xdb\xe2\xca\x58\xc4\xf1\xf9\x2b\xd3\x0b\x77\xe9\xaa\x19\x37\xce\x02\xf0\x6f\x6f\x03\x3c\x91\x89\x60\x2c\x15\x7e\x72\x50\xe4\xe7\xa2\x76\x16\x91\x07\x1a\x6a\x8b\x1a\x9c\x12\x86\x95\xa1\xbd\xd1\x92\x69\x85\xd5\xa0\xdc\x69\xeb\x26\x86\x0d\xa4\x92\x09\x83\x3a\x66\x8b\x0a\x46\x96\x03\xde\xe8\x18\xf3\x97\x3e\x11\x58\x38\x91\x32\x9a\x1e\xf0\x7a\x3c\xb5\x77\xb1\x49\xa3\x54\xe0\xdc\x6c\xf5\x89\x78\x97\xd1\x16\x4d\xa9\xae\xdd\x89\x57\x63\x24\xd7\x3a\x5d\xf2\xd4\x16\x71\x50\xa3\x5f\xcf\x26\x0a\xb3\xe1\x9b\x02\x24\x54\xd0\xe5\xe5\xfb\xef\x19\x5e\x28\xa6\xca\x1c\xfc\x92\x10\xf2\x4c\xad\x50\x61\x57\x80\xc7\xef\xbf\xb3\x48\x24\xc6\xac\xb9\xc4\x2c\x2d\xae\x03\xd2\xd8\x2e\xba\x70\x57\xf3\x8e\x1d\x71\xaf\xe8\xe0\x13\x14\x49\xb5\xdf\x74\x0d\x24\xbb\x27\xae\x76\x5e\xa2\x70\xe4\x83\x7d\xde\x5a\xbf\x41\x64\x03\x79\x44\x5f\x6a\xa6\x10\x5d\x0c\xf8\xf1\x15\xee\xd1\x6d\x48\xa5\x63\x36\xc8\x40\x44\x40\xca\xf0\x63\x1b\xb8\x24\x51\x8b\x2b\x7a\x0d\xde\x36\x98\x8e\x76\x56\xd9\xa8\xf0\xf2\x26\x33\xce\x87\x44\x6c\xc5\xa5\x9e\x1a\x6c\xaf\xf4\x63\x60\x6e\x30\x94\xf4\x58\xaa\x06\x60\xe9\x9e\xa3\xca\x19\x81\xa5\xda\x03\xca\xa6\xa3\x96\x94\x05\xf9\xbc\xb5\x8e\x03\xeb\x5f\x29\x30\x67\x78\xf1\x48\x5d\x38\x0e\x7b\x2b\xec\x58\xd8\x44\x24\x5e\x5d\x8f\xa3\x25\x76\x2e\x46\xd3\x5e\xa2\xc9\xd8\xc7\xf0\x02\xe2\xcd\x73\xb1\x0c\x5a\x12\x01\x3e\x48\x27\x22\x42\xef\x54\x68\xc2\x6c\x8b\xb8\x01\xc7\xce\x31\x73\x75\x13\x62\xbf\x6b\x78\xda\xa6\xa9\x67\x4d\x6e\xdc\x4f\xca\xcc\xa9\x85\xda\x3a\xf4\x09\xde\xa0\xc9\x45\x93\xcf\xd9\xa0\x88\x09\x4a\x48\xa7\x78\xf7\xa6\xf4\x82\x7f\xc7\x42\x1d\xd8\xfc\x82\x77\x66\x3b\xef\x19\x73\xc5\x5c\xf7\x9e\xba\xea\x57\xfb\xb5\xce\x76\x12\xfc\xa5\xa9\x02\xe6\xb0\x9e\xf2\x8d\x27\xa7\x7b\x1f\x63\xe6\xac\xdf\xb3\x25\x82\x51\xd5\xb7\x6b\xef\x53\xfa\x69\x52\xa0\xf6\xd5\x8a\x72\xea\x38\x64\x1b\x63\x24\x6c\x18\xa7\xcb\xb8\xa7\x69\x88\xb1\xae\x89\x57\x94\xec\xf6\x36\x4b\x32\x71\x04\x53\x7f\x24\x55\x11\x48\x6c\x30\x76\x79\xa2\xee\xa1\xfe\xf6\x88\x37\x6e\x21\xea\x4d\x6c\xc8\x20\x15\x00\xcc\xdb\xf5\xfe\xd2\x51\xf4\x4c\x25\x3a\xb4\xb6\x69\xd0\x84\xa9\x7d\x6e\x7d\x82\xf9\xf7\x8c\x01\xd5\x19\x83\x4e\x65\xcf\xf6\x4c\xe5\x0f\x14\xea\x79\x48\x30\xb4\x98\xf0\xad\xe3\x4d\x02\x42\x9f\x39\x28\xbb\x0d\x71\x19\xb0\xa9\xe1\x26\xb6\x45\x96\xa9\xb7\x67\x81\x53\xdc\xc4\x46\xc8\xdb\xa6\x0a\x7a\xeb\x57\x6f\x6c\xe9\x36\x11\xc0\x41\xfd\x9b\x2c\x2a\x83\x97\x4e\x23\xd9\xd3\xfb\x1f\x81\x28\x19\xab\xb9\x83\x3c\x23\x1e\x1e\xed\x6d\x38\xa6\x6c\x61\x88\x11\xf0\x18\x2b\x11\xb7\x3c\x8a\x96\x67\xd7\x35\x2b\x76\x11\x84\x6e\x5f\x72\x39\x5f\xc6\xe0\xc9\x2f\x52\xa8\xb5\x84\xe0\x3c\xd1\xc4\x8a\x52\x59\x9e\x3b\x4d\x40\x70\xd1\x1c\x71\x65\x5a\x81\x12\x13\x89\xa2\x7e\x4a\x7a\xc4\xb3\x41\x44\x79\x57\x37\x1e\x55\x2e\xe2\xca\x62\x79\x23\x66\xc5\x5d\xc5\xdc\x50\xc2\x44\x01\x20\xcf\x16\xe9\xe8\xf6\x7a\xef\x2d\x80\x38\x07\x7c\xb0\x0d\x16\x5a\x06\xaf\x63\x3b\x94\xe9\xd9\xb7\x55\x96\x80\x04\xc8\x12\x4a\xc9\x79\x6b\x23\xab\xcc\x80\xee\xd0\x08\x71\xa9\x0f\x8e\x9d\xa0\xee\xdc\xb9\x5c\x63\x48\xdb\x92\xaa\x58\xe6\xd8\x2c\x9f\xe4\x7b\xb0\x8d\xe0\xba\x80\x0e\x77\x61\x5c\x47\x7e\xc0\x1d\x9f\xbf\xa7\xd2\x7d\x89\x9f\x3f\x3f\x9a\x1a\x6e\xde\xa4\xb4\x12\xc1\x0d\x11\xd7\x4d\x79\x04\xaf\x4e\xf4\x4d\x3d\x8a\x6a\xa7\x8f\x58\x39\xf3\x98\x30\xff\x3c\x70\xd8\x1a\x0b\xc7\x28\xfe\xa3\x46\x3e\x50\x64\x70\x98\x3a\xaf\xbb\xab\x95\x3a\x6c\x22\xc6\x74\x97\xe8\xf8\xa3\x6f\xd9\x9f\x21\xce\x39\x6a\x74\x90\xb7\xb5\x47\xe0\x08\xcd\x3c\x4e\x09\x60\x2f\xfb\x21\xae\x65\x48\x60\xad\xca\x8e\xe8\xba\xe6\xab\x67\x7a\x72\x8d\x55\xfc\x20\x9a\xe5\x70\xcf\x2c\xe8\xda\x6f\x5f\xba\x85\x32\x8e\x9f\x2c\xd1\x7d\x5e\xa1\xf1\xdc\x4b\xda\x5b\xf1\x44\x72\xe9\xe6\x72\xd6\x50\xc5\x4d\x85\x82\x5d\x3e\xbf\x83\x49\x39\x9b\xcb\x14\xbe\x8f\x12\x85\xdb\xa3\x21\x05\x43\x2b\x03\xeb\xff\x51\xda\xb5\x86\x5c\xbd\xeb\xdd\x53\x05\xe5\x6f\xc1\x56\x4c\x32\x45\x13\x27\xaa\x31\x9e\x8d\x8c\xa2\x6b\x2d\x9c\x4e\x21\xd3\xe0\x0d\x52\x30\xd9\xbb\xac\xa9\x6d\x40\x8b\xb7\x78\x3c\x2f\xee\x6a\xc1\x80\x59\xa2\xe5\x98\x18\x02\x59\x8a\x6e\xb1\xc8\x7e\x66\x4b\x44\x3b\xf9\x58\x4b\x6a\x7d\x30\xee\xc2\xb8\x97\x4b\x3f\xc1\xb5\xed\xba\x8e\xf7\x42\x43\xc7\x70\x43\x3d\xa0\xa7\xc1\xac\x00\x79\xc6\x4a\xfa\xf3\xab\x3c\x79\xfe\x5e\x89\x93\x07\x7d\x1c\x94\xba\xf2\x3a\x80\x8d\xab\xba\xb4\x95\x4f\x8a\x43\xdc\x2d\x35\xa6\xf8\xcc\x4a\x1a\x5d\xf6\x87\xe5\x55\x8f\x5c\x10\xfb\x3c\xa4\x9b\x78\x57\x55\xdf\xcb\xdb\xec\x53\x19\xed\x79\x58\xf8\x82\x49\x0b\x64\xad\x6b\xe4\x02\xce\x4c\xa0\x09\x21\x9c\x0d\xa5\x79\xec\xa3\xa2\x6f\x8b\x07\x7a\xe9\x90\x36\x3d\x8e\x19\xd9\xc5\xf7\xb1\x0a\x50\x1c\x40\x51\x59\x82\xe3\x36\xab\x55\xd7\xf6\xb5\x46\xc4\xd2\xf6\x92\x8b\x4a\x42\xc2\x69\x8e\xab\xc4\x70\x4b\xf3\xcb\x8c\xda\x3b\x16\x3c\x8e\xab\xcd\x4c\x09\xe4\x26\xeb\xe8\x93\x22\xe5\x8c\x2e\xc6\x06\x2d\xf0\x94\x2e\xa2\x77\x70\xe0\x2e\x78\x66\xdd\x94\x61\xa8\xbc\x78\x64\x46\x99\xb8\x9e\xf6\x00\x5f\x1a\xa1\xd5\x6c\x93\x3e\xc9\x82\x59\x80\xe0\x7e\x7b\xd1\x3d\x58\xa4\x6e\xa0\x86\x03\x80\x2e\x51\xfd\x69\x60\xf7\x40\xa0\x5b\x73\x83\xb6\xfe\x6c\x03\x08\xd9\x08\x38\x50\x85\xb4\x05\x8c\x6f\x4a\xb4\xb8\xf6\x3b\x03\xea\x6b\xf2\x22\x67\xa9\x7c\xae\x3c\x1a\x11\x88\xa7\x32\xa3\x86\x02\x7e\xb0\x1a\x6f\xcd\x2f\xc6\x84\xce\x2f\x97\x14\x4e\xe8\xfe\x35\x4c\x02\xd4\xb0\xc0\x56\x3f\x04\x68\x96\x65\xff\x4c\x96\x36\x80\x6d\xe0\x31\xde\x14\xf7\x25\xb0\x1a\xc7\x2e\x10\x81\x59\x54\xb8\x0f\x0d\x44\x32\x07\xbd\x97\x28\xf3\xbb\xf8\xad\x60\xaf\xab\x88\xd5\x6f\x67\x1f\xaa\x5e\x6c\x35\xd2\xd4\x52\xf3\x1a\x48\xc7\x91\xcd\x25\x5e\x9b\xbd\x84\xc4\xe7\x7a\x71\x9a\x40\x78\x6b\x5c\x40\x76\xd7\xef\x3d\x3b\x0a\xfd\x5e\xea\xb5\x76\x0d\x7a\xde\x28\xf9\xb8\xd4\xab\x6c\xc4\xa0\xbb\x78\xa9\xe8\xaa\x62\x73\x01\xd9\xbf\x82\xaf\x1a\x90\x3e\xa0\xac\x1f\x75\xc7\xef\x12\x14\x30\x04\x69\x60\x75\xac\x37\x36\x40\x5b\x44\xd2\xf5\x62\xb8\x47\x1b\x78\x2f\x1a\x54\xcb\x64\xdf\x31\xcb\x09\xa2\x5f\x3c\xcf\x12\xa3\xed\xbd\xca\x79\x8b\xfa\xf8\x4d\xb2\x03\xba\x2a\x8e\x0b\x21\x6c\x38\x1f\x8d\x20\xec\xa3\xc6\x64\xbc\xf7\x5e\xa3\x78\x3d\xd6\x7b\x7e\xe2\x8b\xb8\x85\xa1\x61\x5f\x87\x0f\xc6\x98\xf9\x13\x2e\xbf\x1a\x52\xae\xfe\x62\x26\xc6\x6e\x60\xf8\xa0\xa3\xb8\x99\x4d\xc0\x80\xe9\x5c\xd8\xdd\x1b\xe5\x43\xf7\x5b\xc8\x88\xd2\x4f\x94\xa5\xe9\x1b\x37\x49\x09\x0a\xdf\xc5\x80\x90\xa3\xf6\x55\xda\xf1\x2f\x89\x62\x3d\xd2\x46\x68\xc2\x4f\x0f\xe7\xb1\xf9\x65\xc2\x4a\x33\x76\x53\x5b\x58\x72\x20\xec\x86\x4e\xad\xfa\xc8\x8a\x79\x35\x7f\x88\x30\x94\x27\xad\x43\xf0\xb8\xec\xf8\x9c\x5b\x64\xc4\xb2\xba\x5b\xbd\x7f\xc9\x48\x44\x34\xe2\x50\xbc\xf9\x98\xc9\xfe\xa4\x4c\x31\x32\x6c\x56\x86\x81\xb8\x9e\x22\xf5\x6e\xf2\x82\x3e\x3c\x15\xfb\x91\x33\xe9\xe4\x9c\xae\x4b\x1f\x8b\x29\x27\xca\x0c\x1a\x43\x01\x11\x85\x1d\xaa\x4a\xa4\x40\xe4\xaa\xa1\xb6\xc6\x56\x4c\x0c\x2f\x91\x00\x46\xc4\xce\x7e\xc0\xa0\x35\x05\xb7\x0d\xf3\x03\xf1\x64\x9d\x77\xaf\xb5\xab\xd5\x95\x98\xb2\x1b\x86\xd5\x85\xe4\xdd\x8f\x47\xcd\x08\xcb\xe4\x12\x56\x21\x70\x69\xc7\x6d\x23\x6b\xab\xc1\x5a\x7b\x18\x0b\x95\xb9\xa1\x43\x1e\x88\x8f\x08\xec\xde\xcb\xa9\x00\x92\xfc\x20\x4b\xb6\xb9\x67\xa3\xbd\x2f\xc6\xfa\xfb\xd7\x19\x8c\x25\x1e\x57\xdb\x01\x51\x47\x9a\x30\x36\x1a\x24\x9a\x54\xca\x45\x20\x68\xd0\xa4\x28\xb7\x5d\xb0\x2b\xb5\x90\x2e\xbd\x22\x5e\x7f\x54\xbc\xdd\xbf\x0d\x51\xfc\xde\x02\x6b\xf4\x3a\x8d\x7c\xd4\x36\x7e\x8e\x91\x04\x14\x74\x38\x04\xe3\x33\xaf\x2d\xc6\x5e\x4f\xea\x05\xef\x24\xf1\xa6\x0f\x54\x8e\x6f\x5f\x8d\x87\x42\x1d\xfb\x11\x70\x17\x22\x5f\x45\x7f\x9e\x2c\x26\xcd\x73\xf9\x39\x5d\x8e\x91\x04\xf6\x3a\x6a\xec\xc9\x2c\xe4\xf6\xe1\x42\xe6\x94\x3b\x71\xc6\xb1\x46\xac\xed\x31\x75\x20\x12\x20\x0c\x36\xe3\x9d\x76\x30\x5b\x89\xbe\x26\x9e\x63\x8f\x43\x12\xde\x9c\xc2\xc3\x52\x43\x85\x1d\xad\xb7\xfd\x5c\x48\xf8\x15\x0c\xd3\xf9\x3d\xc7\x8a\x21\x78\xfb\x2c\x83\x14\xb0\xb6\x16\x93\xaf\x9a\x16\x00\x09\x25\x29\xcd\x60\x53\x98\x6e\x53\xb2\x47\x1b\xc7\x46\x37\x1c\xe1\x12\x92\x76\x7d\xfd\x27\xb2\xf3\xaf\x4b\xaa\x38\xa4\x90\xee\xce\x93\x39\xaf\xbf\x95\x73\x50\x26\x45\xec\xf6\xa1\x9e\xf8\xb0\x3f\xde\x3b\xbb\x43\x2a\x84\x2c\x04\xc0\x36\xa9\x93\xf1\x7f\x27\x35\x13\x14\xbe\x06\xfc\x06\x6f\x3e\x9b\xef\x8f\x36\x2a\x87\x53\xe3\x8e\xc0\xd3\x2d\x0b\xc1\xff\x53\x89\x65\x3b\xa7\x56\x4f\xde\x63\xca\x93\x97\x11\xff\x8f\x2c\x95\x77\xac\xf8\x0c\x26\xe2\x0b\x1a\x06\xca\xb3\x9d\x5b\x3a\x3e\x24\x3a\x3f\x0c\xc4\x08\x52\x85\x25\xe5\xda\xc8\x81\x4a\xeb\x5e\xa0\x80\xdc\x40\xe8\x3b\xd8\x72\xb3\x69\xa9\xc9\xbd\x1c\x68\xb1\x8e\xa1\xf6\xa3\x5c\xef\x25\xf7\xe2\xf5\x3c\x29\xa7\xee\x54\x64\x85\x0e\xe4\xce\xd3\x78\x69\xae\x09\x79\x71\x35\x43\xee\xe3\x10\x33\xe6\x8e\x28\x35\xf4\xae\xca\xcd\x9a\x45\x6a\x35\x4b\xe9\xb1\xa2\x66\xf7\x7b\x95\xe7\xbe\x48\x7c\xb4\xbf\x73\x84\x5f\xae\x45\x90\x35\x76\x52\xb8\x32\x3c\xc1\x49\x62\x48\xda\xa8\x84\x18\xc0\xf9\xeb\x1a\x75\xdc\xf8\x0b\x0c\x44\xb6\x8b\xfc\xba\x4a\x53\xcb\xb5\xff\x20\xfa\x55\x45\xca\x38\x5c\x90\x3c\xb2\x9c\xe2\xc5\x41\x6e\x50\xa8\x3f\xf8\x03\xb0\x12\x47\xe1\x8d\xd6\x73\xc1\x70\xa4\x35\xdf\x31\xef\x09\x63\x4a\x39\x69\x66\x1f\x02\xd2\x5e\x59\x90\x8f\x03\x56\x4d\x7e\x19\x7f\x06\xc5\xe6\x48\x61\x78\x42\xe5\x85\x2c\x18\x6a\x68\x2d\xb5\x46\xa2\x3b\x0a\x2d\xdf\x33\x98\xb5\x90\x4c\xf8\xfb\x92\xc4\x85\xc7\x59\x0f\xbd\xb4\xc3\x80\x0f\x69\x91\x37\xe1\xf1\x9f\x5c\x57\x17\x83\xf8\x4b\x10\x6c\x51\xef\xa7\x26\xce\x6f\x7a\x70\x2a\x7c\xf0\x3d\x19\xa1\xa6\x7f\x7b\x60\xd4\xbb\x79\x86\x64\x51\x1f\x05\x16\xff\x31\x99\x56\x8f\xc6\x2e\x6a\x01\xbe\x38\xd1\x84\xa2\xd6\xe0\x73\x61\xdb\x63\xd4\x0e\x4e\xb5\xa1\xd6\x17\x55\x7f\xf7\x31\x96\x24\xb3\x9d\x76\x97\x62\xd1\x0e\x0e\x27\x53\x45\x6a\x83\xfd\xa4\x39\x71\x87\x4f\x5e\x12\xe7\x20\x10\x2c\x32\xb7\xce\xee\x6a\x0d\xf2\x2b\xdb\x57\x0f\xe1\x60\xbf\x9e\x90\x56\xb4\xed\x79\x70\xad\x7a\x7e\x57\xe7\x4e\x39\xa4\x9d\xb1\x18\x30\xe9\x84\xdf\xfd\xf8\x2a\x45\x37\x61\xb4\x97\x43\x9b\x88\x3e\x2d\x84\x67\x2c\x04\xc5\x27\xbe\x15\x95\x9d\x25\x59\xb2\xb3\x96\x03\x48\x8c\x7b\xc8\xe4\xd6\x81\xd3\x56\x75\xff\xd2\xf5\xc5\x2b\x15\x1c\x25\x9f\x8f\xca\x03\xfb\x42\x12\xca\xc6\x2c\x01\xd8\x51\x18\xc7\x76\x12\xc5\xfb\xee\x19\x92\x25\xf1\xf0\x28\xf6\xf2\x62\x85\x58\xd4\xd5\xc9\x3d\x86\x50\x9b\xc5\x49\xee\x8a\xdc\x7e\x0c\x73\x1b\xd8\x0b\xdb\x43\x7a\x1e\x99\x7a\x4d\x27\xf8\x0c\xf1\x13\x4c\xe1\xa4\xfd\x01\xef\xfc\xcd\x49\x48\x80\x9f\x3e\xdc\xda\xfb\x3f\x28\x57\x8e\x5a\x5c\x68\xeb\x71\x0c\x9c\xac\xa4\x6b\x0c\x33\xa1\x19\xa3\x66\xe6\x72\x5b\x18\xdb\x31\x9d\x08\x18\x5a\xad\x4b\x6f\xb3\x69\xd4\x93\x7d\xa1\x80\x07\x0d\xbc\xbd\xc6\x36\x51\x59\xbe\xe7\x14\x79\xae\x51\x7a\x53\x2b\x07\xca\xe5\x28\x60\x6b\xb6\x20\x03\x04\x17\x41\x8e\x0b\x1a\x0d\x7f\xa2\xee\x86\x1f\xb7\xe5\x6f\x7a\x37\x0a\x7d\x44\xb7\x15\xe8\xee\x6d\x9d\x6b\x11\xb5\x72\x66\x72\x4e\x84\x11\xc6\x35\x75\x20\xbe\x90\x63\x42\x4a\x89\x6f\x23\x2e\xcb\x03\x2a\x78\x8f\x44\x64\x29\x9c\x92\x37\x54\xc4\x40\x1c\x46\x8c\x1a\xf8\x14\x12\x05\x4d\xce\x70\xbf\x86\x90\xba\xf2\x43\x9b\xe4\x6f\x61\x9b\xa0\xe3\x6e\x93\xe1\x49\xcb\xe7\x52\x59\x77\xd8\x9a\x91\x91\x8f\x53\x51\xfa\x28\x40\xf7\xcd\x49\x1e\x66\x9b\xa9\x53\xba\xdb\xca\x5d\x85\x8c\xa3\x49\x92\x44\x23\x93\xa2\x68\x49\xaa\xde\xa2\x1b\x07\xf7\x78\x5b\xa5\xb1\x54\x29\xdb\x6f\x49\x97\x62\x87\x10\x5a\xe2\xe9\x6e\xac\xa7\xca\x52\x23\xc6\x48\x46\x0c\x21\xc9\xfe\xfc\xeb\x6a\x60\x25\x4a\x80\xea\x4b\xb8\x7d\x71\xc6\x14\x57\xa8\x82\x95\x36\xf6\xfa\xbe\x6a\x9b\xfc\x6e\x21\x84\x5a\x0f\xf7\x13\x1b\xde\x82\x42\x9c\xe7\xa9\x11\x23\x7d\x24\xab\xc8\xf0\x2d\x74\x1c\x2f\x5c\x6d\x3b\x9b\xde\x87\x39\x2b\x05\x8e\xf9\x5e\x94\x99\x79\x5a\x22\xa0\xfb\xa3\x74\x6d\x39\xc1\xac\x99\x6b\x93\x96\x74\x1e\xfd\xcf\x99\x20\xa9\x6c\x91\x04\xac\xd0\x8f\xc5\x8f\xdf\x6c\x30\xa1\x28\x3c\xd6\x0d\xd8\xbe\x81\xf9\x79\x8c\x16\x15\x23\x10\x1d\xb6\x82\x6b\xe7\x13\xd0\x75\xae\x06\x6f\x7e\x38\x32\x87\xcf\x40\xae\xf3\x12\xc6\x61\xc2\xd6\x41\x0f\x90\xb8\xed\xc5\xb9\xe2\x41\xe1\x71\x87\x11\x50\x84\x76\x04\x17\x05\x5c\x3e\x75\x02\x53\x45\xd8\xd6\xf1\x12\x0a\xa4\x58\x9b\xc7\x7c\x02\x55\xbe\xee\x86\xb2\x02\xf9\x05\x4f\xbf\x43\xd2\x41\xb5\x5e\x6f\x3d\x85\x7f\x3e\x17\x73\x87\x82\xbd\x55\x93\xc7\x7c\xf3\x2b\x8e\x8c\x3a\xc5\x5d\x64\x4a\x4c\x8e\xe5\x35\x18\x43\x94\xdd\xbe\x82\xa4\x40\x6f\xaf\x77\xf6\xf6\xbb\x10\x63\x6e\x6a\x65\xad\xa7\x65\x3e\xc8\x65\xe7\x53\x8d\x7a\xc3\x05\x5b\x38\x52\x87\x98\xc1\x42\xc9\x39\x9c\xdc\xc4\x86\x3c\x10\xe8\x02\x0a\x60\x97\x01\xb5\xf1\x34\x4c\x98\x21\xcc\x94\x7e\xa3\x60\xb3\xd0\xd8\xad\x27\x53\x42\x33\xf4\x23\x53\xf7\xab\x3d\x58\xfc\x6a\x07\x8c\x9b\xc8\xaa\x0f\xe8\x89\x40\xc4\xa5\x86\xdb\x78\x6d\x57\x71\x16\x1e\x9a\x1f\x74\x15\x24\x97\x80\x30\x19\x05\x62\x5e\x1a\x0d\x4e\x62\xd8\x7c\x29\x32\xf2\x5d\xc9\xb6\x62\x63\x8b\x37\xdf\x84\x44\x95\x72\x5f\xa2\xca\x51\x8f\xa2\xff\x5d\xe2\x13\x66\xd2\x05\x19\x60\x4d\x3c\xa5\x0f\x89\x35\xcc\x64\x8f\xdc\xd8\x07\x17\x25\xe4\x8d\xc0\xb9\x8f\xdb\xd7\x15\x9f\x75\x68\x67\x1a\xb3\xfe\x8b\xc6\xc6\xa8\x8b\xe3\x7b\xe5\xc8\xce\xab\x85\x4c\xbc\x34\x07\x7f\x57\x0d\x66\xf6\x8f\xe7\x77\x02\x75\x55\x85\x44\xbd\xe6\x4d\xd6\x43\x4d\xac\x50\xe1\x7e\x39\x8d\xe0\x7b\xe3\x08\x00\x0c\x0d\xaa\x59\xc1\x56\xd0\x8c\x2c\x0b\x41\x04\x13\x85\x2f\x50\xfe\x73\x43\x34\x22\x45\xe3\xa7\x8f\xd6\x50\x3c\x62\x8e\x45\x3c\x02\xf7\xdb\x37\x51\x1f\xf1\x67\x78\x40\x28\xb8\x28\x19\xbf\xfb\x95\x96\xdc\xf5\xd0\x2c\x7f\x0b\x3a\xa1\x3c\x01\x33\xe8\x80\xda\x2e\xf3\x2f\x21\x4f\xca\xfa\xf7\xed\xe0\xc4\xbc\xf6\x26\x9e\x17\x3a\x5f\x18\xd6\xfd\x50\x2d\x13\xe7\xd2\x0e\x48\xd9\xda\x6a\x86\x2c\xbd\x47\x9b\x08\x8b\x06\xf5\xd6\xbe\x32\x83\xed\xe3\xcd\xa6\xb6\x03\xf1\x3c\x63\xf8\xed\xd1\x46\xb2\x61\x80\x46\xcc\x11\x3a\xf6\x28\x71\x95\x16\x07\xad\x41\xbe\x0e\xd9\x6d\x0d\x88\x40\x52\x12\x53\xab\xda\xd8\x3e\x20\x72\x52\x93\xb0\x17\x99\xae\xd2\xf8\x22\xba\x65\x93\xee\xa3\x68\x9d\x5a\xbe\xb2\xa6\x89\x6b\xe6\x26\x63\xc0\x28\xfe\xf6\x82\x49\xed\x98\x5e\xcc\xd8\x1d\x9d\x2f\x6c\x06\xb8\xc6\xc9\x39\x1d\x29\xa4\x69\xd2\xf4\xe2\xda\xf8\x84\x02\xb5\x5a\xb4\x49\x39\x8d\x48\xb5\x36\x1e\x31\x68\x2f\xad\x44\x0e\x28\x86\xad\x03\x28\x79\x20\x74\xad\x6f\x67\x93\xdf\xd0\xbf\x7e\x93\x40\x77\x19\x5a\x79\x57\x3c\xf2\x6b\x5a\xd2\x4a\xb3\xe1\xe5\x28\x8a\x04\xf9\x85\x8e\x48\xb0\x5e\xe0\xa4\x8f\xc8\xeb\x34\x11\xae\x8f\x41\x59\x43\x8a\xc9\x38\x30\x57\x1d\xb4\x7f\xfd\x8b\x1a\x0d\xcb\xb8\x47\xd2\xd9\xc6\x02\x89\x3d\xc3\x81\x9a\x51\x6a\x04\x9b\x43\xf6\x5e\x13\x09\x28\xc1\xec\xad\x57\xaa\xc6\xba\x5a\x16\x6e\x93\x07\x24\x1a\xb2\x71\x5d\x87\x95\xd5\x10\x1f\xe9\xa2\xa4\x2e\xc6\x80\x53\xf3\x71\xaa\x7b\x0c\xf8\x65\xfd\x8d\xa1\xd3\xed\x5b\x10\x4e\x37\x26\x4b\xa9\xe0\xba\x2b\x89\xed\x28\xde\xc7\x70\x32\xcb\x12\x31\x9a\xf9\x0c\xca\x36\x61\x48\x6d\xab\x38\xde\x1f\xd7\xe1\x55\xd8\x31\x52\x39\x12\xfa\xa8\x4f\x4d\x1e\x8f\x5a\x12\x47\x63\xb3\xaf\x0a\x16\x64\x6f\x9b\x8a\xbf\x6a\x6e\x37\xfe\xca\xc1\x3d\x29\x7a\xeb\xb6\x1c\x62\x5f\x8a\x0e\x1a\x55\x3f\x5c\xe3\xfe\xd5\x62\x84\x71\xfd\x34\xb2\xde\x2b\x1a\x72\x28\x4e\xa4\xe5\xbe\x47\xb7\xf8\x33\x85\x1c\x17\x6e\xf6\x74\xfe\x70\x68\x68\xe2\xe8\xbb\x2f\x31\x96\xec\xc1\xbf\xfa\xee\x62\x0e\x4e\x5f\x39\x38\x27\x54\x1b\x83\x2a\x9e\x24\x24\x7b\x25\x71\xe7\xc2\x91\xfd\xf6\xd7\x4b\xb6\x8a\xc6\x73\x0e\x2d\xe4\x39\x37\x10\x5e\x2b\xbc\x7b\x2b\x93\xc6\x40\x2f\x90\x6e\x56\x41\x1a\xa4\xc6\x4e\xb1\xa2\xd7\xfd\xb9\x44\x8f\xef\xa2\x87\xa7\x49\x31\x67\x3e\x72\x5e\x04\x92\x1b\x0b\x9a\x17\x57\xd4\xd7\x61\x74\x06\x21\x74\x08\xd5\x8c\xa6\x4e\xdc\x53\x64\x5e\x8f\x27\x11\x5a\xc0\xa4\x9b\x9d\x51\xac\x76\xb7\xcc\x70\x8c\xee\x2f\x07\x9b\x34\xbd\xad\x3a\x57\x1c\xd7\x62\xaa\x75\x10\x85\x8e\x3d\x3b\xcc\x1d\xdf\x12\xfc\xb7\x3c\x34\xb2\xab\x98\xc8\x29\xae\xc8\xdb\x57\x1f\xff\xed\x94\x5a\xf5\x09\x69\xd2\xfd\xad\x0f\x71\xe6\x00\x43\xcc\xe6\xb5\x39\xc3\x33\x45\xae\x81\xbd\x27\x35\x68\xb2\x93\x2b\xc7\x5b\x1c\x5b\xc7\xf5\xf8\x6c\xec\x1f\xbe\xdc\x3e\x47\xaa\x45\x34\xed\xd5\xf8\xa0\x6d\xa3\x4a\xdf\x94\x31\x12\x8d\x46\xaf\x81\x3c\x9c\x60\x50\x76\x45\x88\x5e\x7b\xa3\xb1\x70\xef\x11\xa2\xd8\x9b\x79\xc6\xfe\xc6\xfa\x54\xe4\x19\x58\x5f\x52\xb3\x4f\xa7\x93\xe3\xab\x20\xdc\xb3\xbf\x6b\x0f\xd5\x43\xaf\xf7\x2b\x4c\x34\x8f\xf7\x72\xae\x36\xef\x88\xea\x51\xfb\x05\xfa\x6c\xd7\x14\x77\xcb\x21\xb4\x04\xab\x33\x3c\x17\xa2\xca\x2a\xc9\xba\xec\x25\x0a\x70\x80\x27\x6e\x08\xa0\x71\x98\xc6\x98\xe5\x36\x51\x55\x4d\xaa\x09\xc8\x25\x62\xa8\x52\x70\x5f\x02\x82\x77\x90\x99\x11\x26\x24\x3e\x6f\x52\x2d\x8c\x82\x55\x04\x95\x1b\xa8\x10\x11\x94\xec\x9c\x4a\xd9\xff\x51\xf1\x1d\xfa\x83\xa7\xc6\x31\x09\x97\x0e\x12\x9d\xc3\xed\x5d\xa9\x6a\xf1\xbf\x64\x28\xfc\x2f\x9d\x3b\xc3\xc8\x4f\xfb\xb1\x97\x4c\x9a\xc5\xa1\x4d\x63\xd8\xeb\x9d\xcc\x5a\x7d\x2c\x33\x56\x72\xbd\xee\x9c\x34\xde\x31\x4e\x90\xf9\x08\xf8\x14\xba\x62\x0d\x18\xf4\x22\x7c\x73\xc0\x07\x09\xa0\x18\x8c\x10\xec\x2d\xb7\xe0\x7c\xc0\x25\x6b\x75\x29\xdf\xa2\x58\x3d\x06\x17\xcf\x1a\x0a\xee\x3a\xbd\x43\x0a\xe4\x8d\xf5\xd2\x28\x05\x23\x34\x24\x08\x1a\x9a\xec\x1e\xf5\x61\x46\x80\xd7\x82\x7b\x69\x9e\x7b\x41\x27\xed\x57\xcc\x17\xf2\xd6\x63\x0d\x24\xce\x65\x5d\x74\x0a\x03\x9b\xea\x4e\x89\x15\x76\x27\xa5\xf5\xcf\xb9\xe9\x7b\x80\xca\xc2\x9c\x0f\x19\x3e\x96\x2f\x7d\x26\x29\x66\xec\xa3\x5a\x88\xa4\x36\x63\x67\x70\x90\x35\xc2\x3c\xa0\x5b\xe4\xb0\xca\xeb\x2e\x5d\x36\xe4\x49\x1c\x6e\xe2\xf6\xff\xe4\xa1\xd0\xb4\x6d\x2c\x0b\x4b\x51\x17\x34\xcc\x1c\xc0\x0c\xf6\x9d\x32\x29\xde\x2f\xe8\x27\xd3\x9c\x8b\x34\x5c\xbc\x41\x49\x89\x9e\xdf\x51\xe2\x20\x41\x21\xc5\x75\x9d\xa8\xa4\x60\x71\x23\xc7\x18\xfd\x8a\x30\xeb\x4e\x25\x04\xab\xca\xfe\x50\x0d\x3c\xa4\x25\x5a\xc5\x28\x7f\x51\xca\xc0\x85\x6a\x23\xde\x2c\x07\x24\xce\x7e\x4a\xf4\xd6\x69\x81\xc1\x17\xea\x38\x66\x36\x7d\x09\x1e\xbd\xa2\xe7\xc4\xc2\x41\x0e\x21\x31\x63\xde\x18\x95\x9c\xac\x83\x05\x35\x67\xf6\x66\xf6\x05\xb1\xa2\x4e\x52\x33\x97\xb2\x48\x45\xbd\x89\xf1\xf4\xea\x61\x8f\x8a\x48\x61\xd6\x61\xea\x29\xdc\xcc\xef\x07\x1d\xde\x93\xc6\x3b\x5b\x03\xb6\x45\x17\x1e\xc0\x27\x92\x67\x1f\xd3\x84\x73\x77\x55\xb6\xbd\x60\x17\x0c\xc7\xa1\xb4\xc1\x34\x0c\x16\x75\xb3\xf7\x50\xbb\x39\xb7\x6b\xde\xd7\xf0\x1d\x2f\x7f\x67\x20\xec\x21\xd0\x34\xc8\x4f\x62\xf5\xa1\xb8\xa2\x5c\xb4\x48\x43\x7a\x4e\x22\x2d\x0b\x52\x4a\x02\xdf\x5c\xe1\xa3\x72\x60\xae\x1d\x72\xba\xd2\x2e\xb8\x30\xfb\x21\xac\x60\x07\xdc\x82\xdb\xcc\x11\xf6\x5b\x06\x1f\xe2\x06\xf5\x9e\x51\x84\x4a\x8a\xc7\xec\xba\xb5\xee\xfd\x6f\x54\x63\x4d\xfc\x82\xfc\xc6\xfa\xc7\x59\xc3\x20\x13\xf2\x9a\xcc\xe9\x57\xdc\x6b\x33\x0f\x77\x99\x16\x8e\x86\xe9\x19\x66\x7a\x9f\x6d\xf8\xa0\xbb\xa6\x0a\x48\xf3\x1a\x0b\x56\x2f\x1a\x36\x7b\x7e\x55\xc8\xd8\x25\x04\xa4\x9b\xad\xde\xd7\xdc\xda\x8e\x29\x65\x2d\xac\xca\xee\xea\xd6\xcb\x3a\x74\x2e\x4b\x23\x24\x82\x01\x7f\x44\xe5\xce\x32\x44\x1a\xfb\x32\x33\x4e\x20\x42\xf4\x50\xfa\x1c\x3d\x9d\x07\xbc\x58\x4c\x10\x31\x74\x02\x65\x70\x7c\xc6\x13\x2b\xe9\x4d\x22\x20\x13\x26\xc7\x58\xc5\x7e\x93\xb8\x17\xaa\x6c\xcd\x32\x82\xe7\x2a\x56\xd9\xce\x7d\x5d\x59\xd8\xba\xb1\x0c\x6c\xbe\x5b\xdd\xe7\x2b\x3b\xac\x66\x08\xd2\x31\xc4\xf1\x77\x43\x8f\x21\x19\x69\x9c\x85\xc2\x30\xd3\xc2\x09\x8e\x91\x2d\xcb\xef\x4d\xfd\x19\xd0\xae\xf7\xba\x67\x76\x15\x5c\x31\xac\x01\x7d\x79\x14\x5b\x9a\x22\x54\x09\x4e\xd4\xc6\x0e\xc5\x89\xc5\x5c\x4c\xec\x68\x1c\xf0\x10\x84\x55\x76\x43\x41\x31\x5f\xbd\xa0\x66\x7e\x36\xea\x5c\xfb\x9c\x45\x49\x58\x65\x4e\x3c\xbe\x7c\xef\xdc\xc5\x40\xfb\x2f\x1d\x55\x12\x81\x23\xb7\x69\xb5\xae\xb5\x12\xd8\xfd\x2b\xc9\x24\x71\x2d\xa5\x02\xcc\x92\x02\x44\x7d\x19\xa6\xda\x1d\xd3\xa0\x26\xb5\x4e\x20\x04\x63\xdb\xe8\xa6\x29\x75\x9e\xaf\x9f\x57\x65\x62\x4d\xa1\x76\x35\x35\xda\xa8\x6d\x33\x2b\xd7\xd0\x12\x93\x6b\xc0\x3c\xfc\xf4\x6e\xbc\xf3\xde\x5c\x7a\xb8\xb6\xb7\x43\xc7\x81\xe4\x90\xe7\x68\x29\x1d\x37\xd9\x67\x64\xee\x6d\x21\x6e\xad\x21\x99\xa1\xb9\x0f\xe8\xd1\x11\x70\x59\x2f\xf9\xc1\x0f\x2a\x0c\xb3\x6d\x67\x84\x8f\x97\x4e\xbe\xeb\x61\xf0\xdb\x9e\x69\x5f\x2a\x18\x63\x1c\xa8\x27\x28\xa4\xf1\xe1\x95\xd0\x70\x4a\x51\xfb\x57\x0d\x48\xa6\x73\x92\x38\x3c\xb5\x8f\xf9\xe0\x21\x15\x19\x94\x6f\x82\x60\x1d\x8b\x9f\x88\x40\x24\x3f\x78\x43\x00\xab\xff\xec\x24\x19\x59\x59\x8f\x44\x86\xaa\xc9\x0b\xe8\x66\xb8\x89\xa6\x1f\x22\x33\x03\x47\xf1\xb3\x10\x70\x70\xd1\xea\xed\xd2\x80\x6a\x63\x15\x8e\xb3\x51\xf8\xcf\x5e\x3d\xba\xb4\x62\x67\xf7\x2d\x59\xbf\xfb\x7e\x89\x64\xe6\x42\xf1\xf4\xbb\xac\x9f\x39\x61\x26\xf8\x6c\x5b\x73\x22\x9b\xf3\x6f\x2d\x12\xe5\x8d\xf4\xc0\x01\x4e\x01\x3a\x06\x37\x28\x5d\xfb\x1f\xcf\x45\xeb\x24\x4d\xa9\x8d\x31\xb4\x5c\x8e\xac\x99\x12\x6a\xa7\x6f\xab\x55\x15\xb2\xbf\x4c\x8d\x08\x28\x50\x8d\x41\x78\xe2\x9d\x0a\xdc\x1e\x12\xc6\x31\xb4\xe0\x1d\x38\x50\x7f\x29\x8e\xb7\xce\x55\x86\x1d\xd1\x47\xe4\xb6\xf8\xa1\x14\x60\x7a\xc6\xb8\xe7\x65\xbf\xa2\xe6\xc3\x3c\xf8\x0d\x81\xf0\xa6\x04\x5a\x4d\x75\xb6\x20\xa8\xb2\xb2\x29\xbe\x8f\xdc\xb1\x8b\x49\xf6\xce\x09\x18\x44\x4c\x74\x01\xb4\x08\xda\x38\x55\xa2\x9e\x87\x08\x18\x9e\x2d\x60\x35\x5c\xce\x90\xef\x7e\x15\xa0\xa2\x55\x3b\xb5\xb4\xc0\x57\x9c\x5f\x0f\x4a\x26\xa5\xd6\xe0\x7a\x24\xe0\xd7\x4a\xfa\x5d\x72\x41\x21\xa2\x4b\xf3\xe1\xbc\x22\x61\x7b\x43\x99\x4e\x73\xe0\xb7\xa8\x20\xdf\x64\xf5\xf7\x5b\x33\xff\x3c\xbe\x12\x19\x21\x76\x5b\x66\x69\x92\xa7\x46\x1c\xe0\x4c\xd0\x1b\x7a\xe2\x5d\x10\xea\xe6\x83\xd6\x41\xc9\x7b\xa5\xfe\x44\xd9\xd0\xa1\x15\x16\x18\x03\x0f\x3d\x6c\x23\x19\x29\x27\x8e\x2c\xf4\x5c\x48\x0c\xb1\xd2\x1c\x83\xf7\x5e\x30\xf8\x63\xd1\x39\x37\x19\x64\x8d\xfb\xad\x14\xfa\x0e\xe6\xae\x0f\xfe\xe6\x7f\x26\x8c\xba\xaa\x60\x3f\x73\x66\x3e\x3a\x4a\x75\xfe\xec\x9d\x1e\x18\x66\xa8\x13\xa6\x6c\x6b\x92\x80\x43\x62\xca\xec\xeb\x35\xea\xe4\x0f\x28\xe1\x9e\xbf\x5a\x95\x73\x0e\x52\x59\x53\x1c\xe1\x19\x6d\x9c\x00\xff\x7a\xae\x96\x40\xfa\x2f\x7f\x95\xe7\x21\x72\xba\x19\xe9\x59\xef\xde\x2b\xc1\xb8\xe6\x8c\x66\x25\x0b\xe1\x70\xcd\x53\x3f\x46\x6f\x03\xc3\x7a\x94\x90\xc3\x3f\xa4\xe1\xea\xa3\x84\xc3\xe2\x69\x31\xc8\x6a\x5c\x27\xc9\xbe\xfa\x17\x14\x67\xe7\xf9\x7b\x2a\x8e\xf0\x48\x64\xa9\x20\x47\x2d\x3b\x0b\x1b\x65\x11\x3f\x90\x40\xd5\x4f\x8d\x01\x1b\xd7\x24\x48\xf3\xcc\x15\x72\xa8\xbf\xe9\xf1\xb8\x24\x94\x33\x66\x55\x37\xa9\x0b\xbb\xe5\xae\x73\x1d\xd5\x4e\x37\x6f\x0b\x2d\x9e\x4f\xf5\xda\xa2\xe9\xd8\x87\xd8\xb2\x8c\x7d\x8a\xdd\xa3\xb9\x23\xe1\x4d\x3c\xa0\xea\x2c\xb1\xc3\x1f\x2d\x28\xc0\x44\x79\xde\xe3\xe5\x13\xb5\xb7\x84\x4b\xe9\x48\x88\xb7\x6d\xf8\xa3\xfe\x05\xb2\x42\xb6\xc9\x1e\x17\x7b\x8a\xbe\xd1\xd6\x63\x67\x6b\x1d\x73\x04\xf7\x89\x51\xee\xaa\x86\x22\xa2\x5d\x5f\xad\x8b\x94\x5e\xc6\x89\x3a\x1b\xcf\xdb\x8b\x43\x84\xb2\xa6\x73\x0b\xad\xc8\x1a\xb2\xe1\xcd\xb7\xb6\x01\xf4\x9c\x28\x49\x2d\x66\xde\xca\x11\xd2\x6c\x0f\xd7\xdc\xc5\x8c\xc7\xed\x1a\x07\xfb\x48\x9a\x11\xed\x29\x49\x50\xa5\x21\x46\x86\xdf\xe8\xf2\xaa\xaa\x79\x7d\xcd\x39\xe3\x7f\xf2\xc1\x9b\x4c\x3d\x26\x8e\xb7\xe5\xac\x6f\x86\xcf\x5d\x92\xb0\xc3\x40\x91\xd4\x8f\xfe\xc6\x83\xbc\xc7\xcd\xdf\x8f\x10\x79\xa2\x38\x09\x6c\x00\xa7\x25\xf6\x3e\xb5\xe0\xc6\x22\xd5\x1a\x28\x1d\x21\x6b\xba\xb6\x32\x24\xa6\x29\x4a\xce\x9c\xf9\xa7\xb1\xf6\xea\xdd\xfe\xb6\x1f\xc2\xa1\x5c\xff\x75\x0e\xba\x29\x1f\xff\x03\xe9\x2a\x29\xd3\x1c\x9c\x2d\xce\xe4\x0a\xf3\xf3\x1e\xe5\xd5\x90\x2f\xbb\xd4\xe8\x77\xb9\xa9\x47\x0a\x77\x0c\x60\x92\x24\x0e\x79\xbb\xcc\x4c\xb9\x92\x2c\x0e\x42\x9e\xee\x31\x0d\xc0\x09\xb7\x3d\x75\x42\x97\xb7\xc4\x62\xf7\xc0\x61\xe4\xd6\xe6\x16\x76\xb6\xc2\x0b\x11\x8f\x67\x66\xae\x43\x63\x3e\xe7\x23\xad\xa3\xf8\xe9\x42\x48\x5d\xa5\x45\xd3\x0e\xa0\xea\xcb\xe6\xe8\x2f\xb9\x02\x0d\xd2\x48\x1e\xee\x91\xdb\x1a\x55\xcf\x7b\xeb\x08\xd4\x58\x5c\x5e\x25\x8f\xd7\xbb\xd4\x0c\x75\x93\x94\xc0\x1c\x9f\xe5\xd6\xaa\x32\xb2\xd8\x20\xba\x5a\x08\x10\xdd\xcc\x1e\x3a\x8a\xb4\x84\xc6\x13\x62\x62\xb3\xfc\x09\x35\x4d\xe6\x26\x6e\xe8\x08\x23\x9f\xd0\xcb\x0a\x9a\x97\xba\xcd\x9c\x9c\x69\x21\x4c\x12\x25\xa6\x81\xa7\x5e\xb3\x8c\x6a\x2b\xb5\x9d\xcc\x3b\xe6\xbe\x8f\xde\x90\x2c\x0b\xc6\x21\xdb\x20\xbe\x88\xb5\x15\xb3\x7e\x5c\x19\x4b\x60\xb2\x43\x03\xea\x1d\x78\x84\x82\x99\xf7\x8e\x7b\xe1\x94\x8b\x31\x67\x22\x65\xfd\x27\x54\x32\xbc\xe7\xc2\x73\xd2\xab\xdf\x59\x03\x5a\x5e\xf5\xc3\xb4\xba\x31\x61\x99\x27\x6f\x5d\x22\x2b\xe6\xdf\xf2\xa7\x8f\xfb\x17\x86\x0e\x9e\x32\xc6\xb5\x33\x71\x09\x6e\xec\x3e\x4a\x43\x95\xb3\xc0\x2c\xaa\x7d\x08\x40\x7d\x9c\xd3\xd7\x34\x87\x47\x00\xa6\x2e\xf6\x44\x4f\x35\x9d\x21\xb0\xe0\xf0\x90\x33\x28\x6e\x98\xed\x4c\x8d\x64\xef\xbe\x8a\x1e\x4f\x1e\xb1\x87\xaa\xa2\xee\x8d\xde\x1c\x6d\x82\x76\x43\xe1\xd1\x31\x6c\x85\xa3\x75\x99\xe3\x79\x2c\xac\xa9\x11\x70\x84\x90\xce\xe2\x1d\x47\x7e\x61\x17\xd7\xa7\x69\x9e\x84\x17\xbc\x67\x92\xcd\xc6\xa1\x77\xef\x31\x8d\xea\xbf\xef\xdc\xa9\xac\xef\xb2\xf0\x7b\x5c\xb4\x4b\x26\x6a\x6d\x22\xdd\xaa\x30\x91\xb5\xe9\x93\x5c\x88\xe7\x4c\xd1\xf6\xb7\xe7\x8b\xc8\xce\x60\x0a\x67\x04\x6d\x5f\x2e\xc1\x16\x7c\x58\x4f\xe6\x74\x80\x2e\x85\x00\x7f\x25\xcd\xfe\xb1\x50\x45\xf4\x0d\x80\xf5\xdf\x73\xa4\xa8\x32\xe8\x2b\x75\x8c\x91\x18\x2c\x1d\x5a\x12\x81\x93\x35\xe4\x1e\xf1\xb2\x97\x06\x6b\xdc\xca\xef\x3a\xdd\xc3\xfc\xc2\xaa\x60\x93\x33\x21\xef\xa5\xd3\x7c\xa9\x48\x3e\x2d\x9b\xf5\xff\x5f\x62\x3c\x07\x14\xf3\x04\x65\xac\xfc\x16\x8e\xc8\x60\x7c\x55\x59\xee\x3f\x2f\xa5\x0a\xf6\xf3\x47\x9c\x55\x63\xaa\xa1\x8c\x47\x27\x62\xe8\xac\x0a\xc7\xfb\x94\xc6\xdb\x74\x67\x6d\xf6\xed\xcd\x35\x38\xbc\x4a\x42\xc4\x99\xe1\x46\x1f\x55\xfd\xf8\xee\x67\xbf\x9a\x10\x30\xbe\x47\xa9\x66\xa1\x40\xa0\xd3\xa4\x46\x26\xbe\x76\xb9\xc0\xb5\x38\x00\x47\xd3\x74\x4a\x01\xcd\xc2\x60\x4a\x21\x7a\xf3\x10\xfe\x44\x45\x09\xa7\x7c\xff\xef\xc4\x25\x40\xb9\x00\x57\x9c\x1c\xdc\x31\xc6\xee\x7b\x52\x1e\x39\xf9\x49\x8b\xbe\xa8\x15\x6d\x66\x1d\x4d\x89\x1b\xb3\x87\x39\x7d\x04\x06\x16\x4b\x7a\x6e\x51\x5e\x6b\x94\xab\x73\xd2\x4e\x43\x3e\xe8\x19\xa3\xf1\x1f\x90\xf7\x86\xef\x0c\x95\x87\x7b\x65\xa3\x2e\x2e\x5a\x4c\x61\x24\x85\x5b\xda\x2f\x2f\xa1\x49\x31\x22\x36\x48\x94\xba\xe7\x6f\x0d\x8f\x3c\xc6\x53\xdd\x0c\x5b\x70\xfe\x87\xa0\x2e\x3a\x22\x21\xbb\xe7\x47\x40\xc8\x38\xe0\xeb\xe6\x3c\xe0\x4a\xf8\x5f\x1c\x81\x27\x37\x99\x97\x6d\xb1\x77\x1c\xd8\xcb\xb1\xe4\xf7\x2c\x11\xe0\xb9\x4d\x8a\xb2\xcc\x39\x58\x27\x49\x81\x94\x7b\x33\x76\x74\xea\x2f\xfe\x07\x0b\x16\xee\x20\x19\x0b\xdf\xaf\xe6\xc7\x3b\x07\x27\xdd\x1b\x4a\x32\xa8\x34\xe7\xca\x4a\x92\x39\x96\xbc\x04\x5d\xb0\x23\xd5\x58\x86\xe5\x9f\xe9\x15\x8d\x3c\xea\xb7\xb1\xfd\x45\x7f\x50\xfa\x54\xc5\xaa\xa8\xdf\xbf\x8a\x3c\xb5\xc7\x64\xb5\x49\x12\xd7\x4b\x61\xcd\xcd\x1c\xad\x87\x74\x44\xf6\x0a\xea\xb5\x1a\x2a\x72\x6e\x4a\xd2\x1b\x5a\xcc\x68\x65\xa1\x52\x02\x51\xa1\x55\x0d\xc8\x5e\xbe\x8e\xb4\x40\x54\x63\x69\xdb\x62\x93\xcc\x40\x7c\x0d\x0d\xb0\xc3\x87\x43\x98\x5d\x3a\x86\x91\x1c\x7a\x70\xa6\x90\xd3\x23\x22\x80\xaf\x52\x14\xf1\xa4\x8e\xfb\x50\xdb\xe7\x7d\x6a\xb3\x4c\xcb\x74\x50\xfe\xad\x4d\xad\xa2\x00\x9f\x1a\xaa\xf2\x10\xe3\xf8\x1d\x49\xa7\x8d\x18\xe8\xae\x9d\x1d\xac\xd5\xbf\x5f\xa3\x9b\x5d\x29\x89\x72\x71\xb9\x29\xe5\x11\xaf\xa2\x22\x59\x1c\xd2\xa6\xcb\x74\x7c\x75\x88\x73\x5a\x77\x6c\x44\xee\xca\xee\xa9\xc4\x5b\x8d\xda\xec\x5e\x51\x06\x4c\x00\xe8\x95\x22\x0f\x5e\x5b\xd8\x8c\xde\xbf\x36\x13\x2b\xaf\xad\x3d\x99\x62\x0b\xea\x04\x51\x61\x94\xc9\x88\x4e\x8a\x44\xd5\xc5\xb2\xdf\xf6\x10\xf7\xf9\x2d\x57\x72\xb1\x45\x3d\x85\x23\x6a\x82\x60\x44\x56\x51\x33\x66\x43\xb1\x2f\xaf\xd9\x6e\x3e\x9f\x1f\x35\xd1\x4d\x02\x1f\x88\x80\x62\xd2\x5c\xef\xd3\x8c\xb8\x94\x0e\x2a\x06\x2a\xac\xdb\xda\x9d\x0b\x8b\x08\x41\x1f\x65\xc4\xd3\x84\xff\x10\x0e\x54\xc2\x0c\x20\xe2\xd1\x1a\x26\x49\xc2\x7b\xca\x10\xc0\x47\xbd\xda\x87\xd1\x98\xe5\x5f\xb1\x1e\xc4\x09\x8c\x58\x99\x10\xe4\x71\x9d\x7f\x02\x0f\x2b\x75\x83\xfc\xd2\xab\xd0\xae\xd4\x7b\x81\xae\xf1\x92\x1f\x2d\x70\x9b\xff\x3c\x13\x5b\x63\x17\xef\x4c\x51\x13\x3d\x86\xd2\x42\xbf\x75\xb1\xf5\x13\xbf\x87\xda\x9e\x38\x9e\x76\xa1\xcf\x17\xb2\x09\x1f\xf4\xc2\x53\xe5\xfd\x45\x1a\xf9\x03\x0a\xad\x26\x6f\x6e\x30\x01\x5b\x1b\x03\xa4\xd6\x14\x9d\xaa\x2c\xe5\x84\x34\xe9\xe4\xa7\x61\x68\x2a\x21\x0e\xdb\x85\x5a\xa4\xe6\xd6\x9c\x18\xab\xb0\xd1\xa8\xed\x8e\xca\x60\xc5\x2e\x5a\xe2\x2a\x9f\xb4\x4f\x2a\xe9\x6c\xe3\x47\xda\xd7\x93\x88\xe7\x12\x2f\x26\xb2\x14\xf6\x51\xbd\x8c\x51\x83\x57\x1f\x8f\xd9\xcf\x10\x4e\x59\x05\xae\x79\xbd\x62\x00\xe0\x08\x89\x44\xe5\x33\x0b\x42\x25\x55\xe9\x1b\xbd\xe3\xe1\xcd\x45\xdb\x9d\x72\x6f\x1e\x70\x86\x9a\x7c\x54\x69\x39\xa2\x70\x55\xb4\x7e\x7c\x0f\xa0\xc7\x64\x1d\x40\xa6\xe8\xb9\xc5\xb2\x57\x96\x96\xee\x2e\xf2\x47\x57\x91\x3f\xb9\x13\x59\x6e\x10\x71\xd8\x51\x85\xdb\xff\xbe\xa4\x74\x95\x27\x07\x13\xa2\x44\x90\xd0\x37\xce\xd0\x16\x28\x19\xf4\x0e\x7e\xc9\xfd\x06\x56\xd1\x6b\x3a\x61\x9f\x84\x31\xf5\x0e\x27\x23\x14\xee\xec\x96\x1e\xa8\x4a\xa4\x97\xa5\xca\xd8\xc5\x4d\x79\xa9\x86\x5a\x7b\x08\xcf\x06\x53\x37\x55\x92\x21\xd1\x74\x44\xd5\x84\xb9\xab\x4e\x30\x8d\xb6\x8b\xfb\x9d\xa1\xdc\x5a\x86\x18\x08\xc4\x6c\x75\xcb\x8a\x8b\xb6\xc8\xd5\xd7\x73\x1f\xd5\x26\x16\x89\xc1\x8a\x7a\x12\xfe\x51\x52\x40\xfe\xaf\x75\x64\xe5\xdd\x75\x67\x10\x8c\x91\xb6\x3f\x17\x4d\x60\x6c\x23\x3d\x91\x32\xad\x59\x89\xe9\xd8\x46\x40\xb0\x09\x47\x32\x89\x1b\x11\x4c\x76\xd6\xee\x02\x17\x2c\x26\x5b\xb5\xcc\xf4\x7a\x96\xa2\x35\x19\x85\x26\x3d\xc9\x53\x1f\x03\x6e\xc1\xa5\xb8\x6b\x31\xf9\x07\x4d\x76\x0a\x64\xda\x8c\x02\x9a\x64\xde\xb2\x97\xef\x82\x3a\x2f\x13\xa4\x5c\x62\xca\xd2\xab\x16\xe0\x18\x47\xb1\x1c\x72\x94\x5d\xe1\xb5\xdc\xdf\x57\x69\xf8\xad\xb1\x00\x5e\x6b\xa0\x66\x81\x06\x88\x30\x45\x77\xaf\xb7\xf2\x86\x38\x1a\x88\xbd\x51\x97\x7d\x17\xfa\xa0\x3e\x9b\x19\x21\x6e\xf3\x8f\xa1\xe1\xc2\xd1\x1b\x25\x50\x46\x3b\x69\xb4\xc0\x54\xa3\x0a\x03\x5c\x64\x7f\xa3\x49\x80\x0c\x6d\x9e\x6a\xb1\xfd\x1c\x5e\x0c\x7d\xb4\xbe\x6e\x5f\x92\xc4\x93\x26\xff\x39\x01\x57\x4b\x79\x32\x95\xf1\xcc\x33\x6d\x8c\x23\xb2\x5b\x9b\x59\xab\x1a\x7e\x6a\x27\xfe\x6a\x81\x11\x9a\x9a\xbc\x17\x41\x8b\x72\x76\x6b\xcd\x20\xdf\xee\x9c\x41\x2b\xe7\x1f\x86\x17\xf2\x6f\x4c\xd2\x35\x6a\x91\x68\x0d\x79\x8d\x33\x59\xc4\xcf\x1c\xd6\xb2\x3c\x64\xdb\x30\x33\x8a\x63\xfc\xbd\x9d\x11\xde\x5c\xeb\x9b\x97\x6b\xd2\xec\x00\xa3\xef\xef\x4c\xfe\x56\x09\xdf\x85\x1e\x69\xce\x2d\xc1\x71\x2a\x9b\x1a\x1d\x7d\x42\x0b\x4f\x55\xa7\x0c\xde\x3c\x36\x3b\xb1\x3a\xe8\x80\xce\xec\x6b\x75\x22\x57\xb4\x6a\xf4\xde\xf0\xcd\x72\xd0\xba\x46\x9d\x20\xb9\x16\x40\x4c\xa6\xa4\xc7\x52\xa1\x44\xb9\xf8\x07\x7d\x58\xef\x2d\xc7\x5e\xc3\xfe\xd2\xea\xe1\x6f\x5f\x65\x29\xe1\xcb\x3b\xeb\xb3\xfb\xec\x3d\x83\x21\x01\xd2\x24\xb1\x38\x89\x9a\xfe\x0b\x94\x4a\x84\xfb\x17\x15\x70\x6a\x4a\x52\x6e\xd2\x77\x67\x8f\x22\xde\xca\xdb\x89\x35\xff\xb0\x84\x82\xfc\xac\x2f\x2b\x97\x26\x06\x86\xfb\x97\xeb\x06\xde\xd3\x42\x5d\xca\xd9\xd5\x6f\x61\x71\x2b\x63\x75\xfb\x13\x7a\x86\x0a\xb7\x44\xb3\x25\xa2\xe7\x8d\x17\xac\x7b\x7a\xdb\x50\x53\x6e\x85\x7e\x0c\xbd\xe8\x18\x39\xfc\x88\x0e\x8a\x1b\xb3\x00\x6c\xac\xfb\xc0\x98\x61\x82\x3a\x56\xb9\x1a\x87\xb6\x36\xa1\x45\x9d\x14\xbd\x05\x80\xd2\x17\xf3\xe6\x56\x39\x55\x17\xe9\x52\x8f\xa6\x0b\xd5\x68\x8a\xa5\x03\x93\x8a\x1f\xa0\xe5\x8a\x8d\x7b\x85\x30\x33\xc0\x7b\x5c\xe4\xc3\x12\xfd\xa6\x36\x26\x8d\x2a\x1a\xcd\xef\x4e\x05\x4d\x28\xbc\x98\x55\x1a\xc0\xcb\xb6\xb6\xe8\x31\xda\x34\x82\x97\xb0\x09\xde\xb8\x2e\xd1\xb8\x31\x47\xde\x7e\x89\xee\x7b\xdc\x40\xe0\x29\x6d\xad\x1b\x7e\xbf\x7d\x75\x60\x05\x27\xa9\x69\x15\x78\x7f\xf7\x50\x14\xce\x8d\xe7\xcc\x8b\xfd\xd8\x58\xe4\x7d\xb8\xc9\x60\x45\x86\x57\xff\x6b\x00\x90\x84\xa6\x88\x6d\xe6\xc1\x0c\xab\x46\xe1\x6c\x51\x2f\xb1\x5c\x29\x75\x8c\x17\xd4\xfb\x2d\x56\x93\xb6\x84\xa9\x2c\x1a\x9d\xf3\x15\xef\xf2\x1e\xa1\xda\xda\xf1\x29\xd2\x6f\x40\x59\xba\x37\x58\x8e\x1b\x78\xf1\xa1\x7e\x73\x8c\x96\xb4\xe1\xea\xa0\x01\xfa\xd6\x26\x8d\x45\x77\x25\xe6\x96\x2b\xfd\xa0\x84\x29\x01\x43\xf2\xe6\xb8\x75\x79\xe9\xb2\xd4\xc0\xf7\x35\x0a\x15\x6b\x3d\xa2\x9e\xb8\x8b\xa9\x2f\xf2\x5c\x14\xaf\xc9\xa4\x8b\x5c\x30\xa2\x70\x12\x0c\x6f\xa8\x9a\xe1\xff\x7b\x8d\x98\xd9\xea\x4b\xa9\x72\x59\x03\xa5\x0f\x36\x90\x3b\x4d\x42\x1b\x67\xc1\x35\x22\x72\xc1\x3a\xb5\xf7\x5a\xb0\x3b\x01\x32\xbc\xa4\x59\xe9\x0d\x7f\xd0\x7d\x03\xa5\x72\xfe\x49\x41\x1f\xdf\xd4\x4b\x98\x75\xac\xca\x04\xef\xf4\x56\x16\x0c\x08\xc7\xe0\x31\x71\x6a\x31\x99\xbb\x30\x85\x54\xb3\x12\x27\xa3\x63\x49\x97\xb3\x5e\x19\xb8\xa4\xf7\x74\x85\xe4\x57\xf7\xbd\xd9\xcb\x25\x90\xe2\x66\x17\x11\x64\x7b\x21\x94\xa5\x19\x8b\x2e\xb1\x71\xee\x39\xdd\x40\xbc\xdb\x0c\x77\x4a\xb8\x9c\x07\xcc\x07\xe5\x09\xb5\x6b\xf5\xf9\x07\x8a\xed\xfb\xd5\x2b\xea\x66\x2c\xbe\xac\xd2\xd6\x80\xd0\x4e\xe0\x75\x97\x7e\x63\xef\xc5\x4b\x5d\xcc\x74\x1c\x52\x59\xab\x77\x95\x4c\x5c\x3e\x9c\x2d\x8b\x11\x12\xce\x8b\x5a\x6a\xaf\x21\x3b\x37\x10\x09\xf0\x2a\x66\xc0\xae\x4b\xc7\x5f\x3c\x95\x19\xbc\x21\xff\xe4\x67\xea\xe9\x87\x5e\x0d\x73\x6d\x77\x90\x2e\xf8\xd4\x5c\xd6\x98\x42\x89\x2f\x6b\xe8\x25\x51\xec\x45\xd7\x88\xf3\x26\xed\x5e\xbd\x85\x35\x65\x47\xc6\x53\xa3\x79\x90\xdc\x21\xd3\x66\x5e\x52\xa9\xa5\xd7\x45\xbf\xc6\x06\xcc\x59\xb1\x83\xb3\xf9\x99\xb1\x78\x17\x2b\xf7\xf2\xd2\x03\xd2\x5f\xd3\xaa\xb4\xca\x7b\xd8\x82\x6f\xa8\x09\x6c\x9d\x0b\x9f\x47\x36\x1a\xba\x8c\xa9\x3b\x79\x54\x3e\xf5\xc1\x09\x93\x39\x56\xf2\x1d\x03\xca\xee\x77\x4d\x8c\x2d\xfe\x53\xb4\x9c\x3e\xd3\xc4\xff\xcd\xe2\x32\x97\x10\xc5\x47\x9c\xcb\xd7\xcc\x21\xe2\xfd\x89\x07\x97\x3c\x84\x7c\xfb\x5f\xd3\x45\xe1\x31\x48\xd2\x2b\xdd\x31\x00\x9e\xf7\xaf\xae\xba\x93\xd0\xf5\x0a\xa6\x6b\xcb\x5d\x31\x4a\x23\xb8\xe2\x31\xe0\x35\x22\x0c\x0b\x59\x7b\x9a\x59\x8c\x8a\x65\x69\xc9\x45\x82\x2e\x5d\x51\x73\xd9\x55\x97\xf6\x8f\x45\xc4\xd4\x7a\xcd\x6f\xfd\x29\x66\x88\x39\xbe\x55\x60\xd2\x14\x74\x70\xcc\xbf\x6c\xc1\xd4\x14\x00\xae\x67\x82\xa1\x70\xc3\x76\x7f\x8e\x89\xc6\xed\xf6\x76\x60\x81\xf4\x3f\x28\x23\x89\x4d\xe9\x87\x0a\xe0\x3f\x51\x21\xd4\xf0\x24\xb9\x5f\x6c\x11\x63\x14\xab\x34\x6d\x27\x21\xcb\x0b\x49\x72\x0f\xcb\x29\x9c\xbb\x13\x8e\xf3\x6a\x70\xb6\xc8\xfa\x04\x92\x96\x82\xb2\x4d\xb6\x72\xeb\x91\xae\x94\x16\x76\xa8\xe6\x12\x56\x6f\x43\x8e\xd9\x31\xd2\x8e\x5e\x6b\xa0\xb9\x02\x7a\x8f\xc4\xeb\x42\x69\x52\x1c\x2d\x7b\xec\x2a\x0c\x8e\x99\x8b\xd0\x0d\x18\x8b\xfd\x33\x21\x38\x4b\x8c\x42\x3c\x72\x8a\x59\x9f\xca\x27\x3e\xc8\x73\x43\xdf\xf8\x1d\x6a\x86\x8a\x0d\xbd\xa3\x9e\x9d\x93\xcd\x34\x40\x3b\x21\xc0\xac\xc3\x91\xc3\x98\xb5\x99\x37\xa7\x00\xe1\x54\x95\x2d\x62\xd3\xb5\x68\x74\x7a\xdd\x42\xc2\xd8\xdb\x82\x17\x8a\xc0\xba\xe6\xa8\x78\x3b\xab\x3a\x9a\xbd\x5b\x8e\x36\x66\xc9\xa7\x37\xe9\x40\xa6\x45\x5c\xd8\xfa\x0e\xa1\xc4\x8d\x41\x9f\x67\x43\x22\xaf\xc0\xe6\xfc\xa8\x05\x6d\xff\xca\x88\x1a\xad\xc1\x67\xb7\x48\xc1\x81\xaa\xc2\x96\xd0\x9d\x1a\xfb\x11\xed\x0a\xb7\x0b\x72\x61\xdb\xb1\xab\x87\x90\xc7\xb8\x29\xfb\x76\x91\x6c\x1c\x02\x4e\xce\x6a\x3a\xd9\x2c\xee\x92\x96\xcb\x96\x06\x8c\x71\x0a\x1e\x8c\x93\xc4\x98\x1b\x65\x3d\x86\x87\xcc\x9d\x90\x45\x8b\x63\x24\x82\x9a\xa5\x17\x45\xd1\x44\xfa\x0d\x2c\x61\x8f\x86\x7e\xd4\x24\x43\xcf\xce\xd9\x59\x64\x0e\x79\x19\x47\x43\xaa\xfc\x22\xf7\xa2\xa3\x25\x97\x9c\xae\x21\xa5\x3d\x42\xbc\x17\xe7\xc1\xeb\xe9\xcb\xdc\xa2\x81\x73\x0a\xe6\x47\x30\x42\xd0\x5f\x14\xb3\xda\x5c\xb2\xec\x86\x12\x10\xed\x1f\x3b\xdf\x37\x56\xd1\xbc\xfe\xc3\xc3\x70\x86\x4e\x4a\xd3\x65\x3a\xbc\xcc\x4a\x3f\xee\xca\x8b\xd1\x8c\x72\x88\x50\xe9\x75\xfc\x99\xda\x5a\xab\x72\xa7\xbd\xf5\x0a\xee\x44\x55\xd5\x96\xa6\x7f\x4b\x12\x93\x54\x56\x13\x59\x34\xd5\x8f\xa4\xab\xb9\xeb\x8c\x88\x04\x71\x21\x9a\x49\x62\x56\xe0\x5e\x32\xcf\x5b\xec\xf1\x80\x28\x79\x86\x57\xc3\x62\xf8\x7f\xf9\x29\xd2\xb6\x08\x09\xf5\x8b\x8a\xdf\xf4\x08\x6f\x6d\x18\xac\x70\xa3\x36\xe3\x7d\x8a\xd1\x65\x68\xff\x45\x76\xe8\xbd\x20\xbe\xfb\xbb\xc5\xc9\x81\x68\x44\x5a\x82\x54\x49\x49\x13\x32\x46\xd1\x0c\x8b\x67\x09\x28\xfc\xb8\x1b\x66\x24\xb8\x2d\x92\x0f\xb9\x6c\x7a\x34\x0f\x2b\xa3\x04\xed\xb7\xab\x4d\x99\xdc\x75\xc0\x29\x96\x62\x8e\x88\x96\xc6\xb1\x6a\xa5\x61\x1f\x0d\xcc\x7e\x87\xba\x98\x1d\x39\x0b\x45\xe5\xdf\x25\x5a\x4e\xd5\xd9\xd1\xee\x28\xf1\xaa\x36\x4b\x6e\xd1\xf4\xb6\x9e\x75\x35\x9f\xc5\x4f\x74\xdf\x32\x58\xc1\xfc\xc7\xd6\x70\xab\xa9\xe9\x23\x7b\x80\x7c\xf5\x14\x09\xf9\x71\x58\xda\xb1\x9c\x20\x28\xb7\xce\xbe\xc5\xb5\x67\x79\x76\x43\x25\x5d\xc5\xd0\x9c\x07\x4e\x2f\xc1\x0c\xcd\x1b\x1b\xfb\x14\x39\xcc\x7c\xdf\x14\x23\xe2\xbd\xae\x34\xb2\x87\x71\xce\x4e\x6b\x54\x25\x74\xfa\x0c\x59\x84\x1e\x2f\x65\xdd\x98\xf4\x53\xa5\x57\x01\x20\xc0\x02\x95\x5a\x7b\xc2\x47\x0f\xa7\xdf\xb0\xda\x45\xfc\xea\x2e\x09\xf6\xfc\xf8\x60\x61\x21\x12\x15\xb1\xc6\x57\x2b\x87\x33\xf0\xef\xb8\xe1\xef\x98\xfc\x23\x89\x1b\xc6\xf7\x8e\x4d\x52\xe5\xac\x2b\xa1\x7e\x3f\x62\x22\x25\x0b\xb2\xd1\xb8\xe3\x5a\x20\xbc\x50\x48\xf6\x26\x91\xef\xce\x45\x8d\x84\xde\xe6\x99\x18\x16\xa0\xda\x96\x44\xda\xb5\xef\x93\x8c\x51\x14\x3f\xa4\xcb\xce\x60\xde\xc2\xa5\xce\x9b\x77\xb1\xcf\x35\x44\xc8\x96\x90\x14\xee\x47\x22\x38\xc4\x66\x40\x22\xd1\x5e\x2a\x32\x7c\x45\x9b\x96\x6d\x60\x00\xdf\xfe\x5f\xff\x28\x37\xdb\xcf\x14\x7a\xd1\x9f\x3d\xc4\xc4\x67\xea\xf2\xb3\x88\xb3\x71\x1f\xe7\x60\x48\xce\x31\xfb\x79\x76\xc9\xd4\x99\xd5\x37\x9f\x41\x25\xfa\x3e\x0b\x55\x48\x36\x62\x26\x89\x2b\xee\x06\x71\xe3\xf9\xf0\x10\xff\x87\x70\xe1\x78\x4d\x97\x01\x51\xb5\x04\x7f\x24\x3a\xee\x1a\x63\x51\x5f\xa7\xe5\x9a\xf8\x5e\xcc\x4c\x69\x3a\x40\x3e\xc2\xad\xf4\xa7\x3a\xf4\xce\xb5\x44\x24\x5f\xa7\x6b\xfc\xf9\x1c\x4d\xbc\x50\xe0\x54\xa1\xaa\x3b\x27\xb0\x77\xec\x86\x1f\xc1\x09\xf5\xe4\x2d\x82\x42\x17\x7c\xa1\x0b\xdf\x53\xc8\xf1\x7b\x33\x2a\x08\xf7\xc9\x3f\x3f\xf4\x24\x49\x44\xe0\x37\x74\x9c\x85\xf1\xa1\xf4\x93\xcb\x70\xdd\xa8\x59\xce\x9c\xdb\x15\x6c\x59\x04\x1d\xda\xc4\xc6\x60\x81\xfa\xc2\xde\xfe\x47\x79\x35\xc5\x86\xb1\xe3\x47\x0a\x29\xf7\xd6\xc9\x0e\xa9\x50\x81\x9b\xcf\x8f\x42\x48\x0e\x70\x24\x64\x22\x12\x60\x3e\x14\x3b\xef\x5e\x46\x54\x7b\x4c\x93\x83\xdc\x30\x09\x67\xc3\x52\xde\xc4\x09\xcc\xa1\x95\xc7\x19\x8e\x5f\x3d\x54\x57\xdb\xec\x5a\x9d\x65\xb6\xf6\x2b\x0b\x82\x4b\xbe\xca\xd7\xce\x22\x69\x67\x25\x07\xb8\x30\x27\xde\xed\xa4\xbe\xa0\x91\x69\x9b\x39\x98\x67\x6b\x57\xc0\xa9\xc0\xbf\x22\x85\x7e\xa4\x05\x33\x3e\x08\x24\xdc\xf3\x14\xc3\xa2\xee\x12\xc2\xf2\x3e\x3d\x19\xc1\x26\x79\x15\xfd\x37\x29\xe2\x9f\xc1\x02\xdc\x81\x53\x3a\x37\xf2\x81\x06\x62\x35\x43\x5d\x4e\xda\x88\x87\x50\x33\xfe\x7f\x2f\xf1\x28\xca\xfd\x07\x5f\x9a\x20\xa2\xb2\x7f\x28\x2e\x07\xe4\x62\x87\x3a\xa8\xe3\x9d\x8c\xa8\x65\x19\x39\x2e\x70\xeb\x75\x23\xaf\xa8\x7f\xde\x55\x8e\x88\xaf\xfd\xd4\xb8\x2a\xc4\x8d\x4c\x5a\x42\x52\x17\xbf\x45\xa7\xb1\xbf\x7a\xf7\xa4\xe3\xf2\x72\x8a\xec\x8d\x6d\x14\x33\x29\xc7\xaf\xc2\x4c\xf0\xdc\xd8\x7b\xda\xb7\x16\xff\x73\x9e\xe1\x3e\x18\x20\xd0\xf4\x1c\x47\xad\x02\x12\xb6\x2f\x45\x6f\x9f\xc1\xc2\x6e\x3c\xb3\xc4\x3c\x49\x50\x46\xc6\x57\x5d\x1b\x48\xc3\xe0\x55\x82\xb0\xc2\x8c\xda\xf4\x02\xf9\x9a\xa5\x9d\x32\x32\xa1\x15\x25\xdc\xfe\xc7\x51\x4c\xcc\x57\xb2\x05\x58\x6c\x96\xf4\xc3\x26\xee\xc6\x4a\x39\x98\x43\xca\xc5\xf5\x26\x19\x8c\x1c\xe6\xa6\xc3\x01\x74\x8a\x5a\x04\xfe\x1e\x5b\x76\x85\x4c\x2e\x2a\xcc\xf2\x76\x3c\x17\x29\xa9\x3f\x43\xe0\x8c\xa3\xdc\x5a\x37\xb5\xb4\xd4\x34\xc9\x00\x62\xd5\x83\x97\xec\x24\x92\x15\xa3\xc8\x74\x46\xe4\xe8\x55\xf0\x5b\xaa\x19\x07\x65\xb6\x18\x59\xcd\x33\x97\xf6\x51\xcc\x97\x7e\x0b\xfb\xdd\x18\x1b\x6d\x10\xdc\x11\x05\x69\x9f\xa0\x06\x04\x81\xed\x42\xef\xb4\xad\x4a\x26\xbf\x06\x57\x93\x33\x76\xe1\xe3\x87\xf8\x14\x52\xdc\x14\xd9\xc4\xde\x5b\xb1\x2d\x74\xa7\xb4\x5b\x87\x4a\xf7\x6e\x3f\xc2\x26\xbb\x1a\x60\x69\x3d\x0c\x1a\x7d\x94\x09\x54\x51\xa0\x2c\xcb\x5a\x78\x55\x11\x5b\x15\x4d\x52\xeb\xd5\xc2\x1b\x49\x83\x45\x0d\xac\x15\xb0\x99\xe6\x41\xa7\xe1\x2a\x94\xbb\x27\x2e\xb4\x06\x66\x24\xde\xd1\xef\xc5\x14\x30\x26\xe5\x68\x7d\x4b\xc0\x9b\x4e\x2b\x9e\x38\x74\xd4\x1b\x8b\xba\x26\xe9\x70\xf6\x57\x48\xc0\xe9\xa7\x51\xc2\xd2\xc8\x34\x33\x0a\x92\xd2\x5d\x7e\xea\x27\xae\xb4\xc7\x20\xe2\x17\x7b\xb6\x76\xf2\x82\xef\x5f\xb3\x64\x3d\xea\x17\x46\xe1\xb5\x41\x0d\xc9\x5e\xa5\xfc\x13\xe3\x9f\xbf\x66\x74\xf9\x5c\xba\x20\x3f\xf4\x89\x39\x96\x43\xc1\x16\x94\x90\x0e\x3a\xa9\x1c\xf3\xe0\xf0\x4f\x91\x08\x5b\x93\xde\x39\x34\x25\x84\x36\xb8\x83\x20\x2d\x4c\xc2\x4c\x8f\x64\x07\xfc\x68\xf6\xe0\x85\x21\x91\x0c\x15\xcb\x31\x0e\x54\x1a\x79\xdb\x95\x22\xde\xf0\x66\xe8\xf4\xca\x63\x88\xc6\x52\x9b\xed\xc6\xa6\x5b\xbb\x5e\x41\x67\x58\x34\x53\xb0\xd1\x7c\xc9\xb9\x23\x1a\xcf\xaf\x1a\xf3\x69\x8a\xfa\xbd\x1b\x82\xb4\x8a\x96\x98\x04\xc4\x59\xb8\x69\xd9\x8b\x54\x4b\xbe\x7a\x4f\x27\x19\x01\x99\xc9\xf5\x54\x1b\x92\xb8\xc1\xf8\xd9\x4a\x25\x4e\x57\x26\x6f\x10\xc4\x9b\x11\xdc\xe2\xf5\x05\x89\xd3\xd6\xc2\xc3\xe4\x43\xc5\x05\x1b\x4f\x3c\x9a\x96\x31\x4a\xee\x7b\xe5\xb5\xd7\x0b\x3e\x31\x3d\x5b\x4f\xe5\xf9\x44\x23\x9d\x46\x85\x34\xd0\x64\x10\x6a\xd4\xab\x39\x86\x42\x17\x05\xf2\x1e\xe2\xbd\xab\x56\x07\x0a\x05\x72\x1c\x0d\xcb\x4a\x3b\xce\x62\xd0\x27\xd6\x51\xc4\x12\x33\x12\x13\xa7\x08\x8b\x10\x70\x23\xc4\xa0\x8e\x27\x65\x17\x38\x57\x9a\xe1\x10\x1a\xe9\x51\xa4\x12\x93\xdf\x5b\x8a\x62\x6c\xca\x21\x7e\x53\x17\x78\x50\x97\x46\x09\x5a\x9d\x4b\x7a\x99\x45\x8c\xbd\x7d\xbb\xd9\x65\x74\xe9\x79\x31\x00\x66\xe2\xfc\x64\x17\x97\x4b\xef\xb6\xcd\x44\x01\x94\x1c\xb5\x2c\x0b\x49\xf5\xcf\x87\xc7\x53\xb2\x16\x4f\xa9\x4c\xe7\x98\x0e\x00\x0d\x83\xd6\xe6\xe3\x73\xeb\xb9\xdf\x77\x85\x99\x2e\xb5\x96\x8f\x08\x1d\xee\x79\x53\xbf\xf7\xaa\xdc\xc2\x22\x00\x8e\xce\x61\x3f\x6e\xfe\x92\xdc\x5a\x4e\x16\x5a\x1d\x1a\xe7\x49\xc1\x71\x00\x13\x1c\x2d\x52\x38\x16\xa7\xc6\xd0\xd1\xdb\x79\xd8\xc1\xc3\xc1\xbc\x62\x9f\x65\x67\x98\x4a\xba\x8f\x91\xf1\x1f\x85\x83\xba\xee\x5a\x09\x95\x74\xca\xea\x99\xd1\x13\x7d\xe1\x51\xe9\x55\xf2\x6f\x2f\x70\x30\x4b\xd6\x6e\x38\xe7\xce\xfd\x11\x84\x72\x22\xb7\x98\x4a\x6b\x0c\x4c\xf3\x35\x07\xa7\x2b\xfd\xd4\xf0\xa3\x98\x27\x59\x67\x76\x26\x4d\x51\x07\xb4\x2f\x73\xf4\xa8\x8a\x56\x07\x11\xc8\xa0\x3e\xb2\x38\xa1\x79\xb1\xaa\xa0\x6b\x92\x2f\x0f\x87\x6d\x08\x45\x62\x6b\x53\xe7\x1a\x44\xe4\xf3\xa6\x97\x77\x89\x31\xf2\xe3\x4d\xec\xff\xda\xb1\xe2\x90\x5c\x7a\x48\x88\xc4\xa4\xb6\xd8\xd4\xed\x8e\x8a\x30\x9c\x95\x1e\x24\x88\xdd\x31\x14\xdc\xf5\x6c\x62\x2e\xc8\x30\xa0\x6a\xaf\x20\x24\x8e\x59\x2b\x73\x5c\x73\xc6\xd5\xeb\xbf\x40\xa6\x53\xf2\x3f\x2d\x48\xb3\x0b\x83\xef\xd6\xfd\x06\x14\x2a\xf6\x4a\xa2\x38\x06\x85\x11\xd5\xdc\xcd\x68\xde\xcb\xca\x9b\x4a\xf7\x68\xb1\x63\x7b\xc1\x56\xdb\x20\x8b\xb5\x8d\x56\x3f\x48\x3f\xd5\x01\x84\x52\xdb\x8d\xa9\x50\x63\x90\xaf\x8e\xe4\xac\xd7\xe4\xa5\x1e\x3a\x79\xf8\x71\x61\xa8\xd0\xfe\xb2\xcf\x16\x4c\xfa\x18\x3b\x3b\x7b\x23\xfd\xfc\xd2\x12\x07\xc7\x25\xa5\x6f\x33\xe5\x18\xb6\x04\x51\x17\x79\x3e\x9f\x5b\x5c\x32\x55\x5f\xbc\x08\xb9\x14\x21\x62\x1d\xe7\xd9\x50\xed\xe2\x47\xad\x95\x0e\xe4\x35\xc0\xdc\x87\x52\xaa\x2e\x31\x92\x00\x36\xd6\x4f\xc4\xcc\xfe\x74\x8f\x74\xe2\x91\xef\x16\xfc\x35\x65\x0b\x4b\x96\x21\xc3\xc9\x0e\xdf\xb8\x64\x50\x20\xbd\x45\x0b\x26\x4d\x13\x8c\x66\x73\x88\x64\x56\x80\x8a\xbf\xdf\x82\x75\xd3\x66\x2a\x07\x46\xaf\x98\x78\xfe\x9e\x01\x36\xd5\x4d\x63\x2a\x39\x7f\xb7\xd7\x68\x73\x73\xd2\xfd\x18\x73\xc9\xbc\x5d\x82\x35\xbb\xce\x96\x81\xf4\xbd\xed\xd1\xba\xcb\xd3\x1b\x07\x14\x82\xf0\xd4\x61\xcf\x53\xe3\xa2\x63\x70\x18\xbf\xf4\xde\x7f\xc6\x70\x2f\xb6\x3b\x46\xc5\x2c\xca\x2c\xe5\xd9\xa2\x20\x5a\x8e\x9d\x04\x8e\x7d\xe6\xa4\xed\x9d\x41\x38\x64\xba\x14\x3a\x21\x55\x52\x3f\x63\x6b\x10\xe5\x2c\x16\x02\x2a\x7e\x2d\x94\x6a\x5c\x33\x32\x55\x23\xfb\xff\xb9\xba\xb2\x34\xc5\x75\x25\xbd\x17\x5e\xea\xe5\x6e\x4a\x1e\xc0\x4e\x6c\xcb\xc7\x03\x14\xb9\xfa\xd6\x3f\x84\x4c\xf5\xed\xfe\x0e\x82\x24\x29\x12\xac\x50\x0c\xff\xf0\xc5\x01\x1a\x7d\x65\x85\x4c\x00\xe9\xcd\xaf\x80\x00\x0d\xfa\xf7\x65\xb9\xc6\x05\x30\x5b\xf2\xf6\xad\x3d\x96\xb8\x96\xe2\x6c\xe2\x3c\xda\x4e\x74\xfa\xc4\x07\x7e\xc4\x93\x68\x04\xcf\xd1\x3d\xf9\x1f\xc0\xb5\xdc\xdb\x10\xa1\x15\xa2\x90\x0a\x7b\x53\xb4\x54\xb0\xa9\x25\xfb\x45\x53\xe0\x80\xf2\xb7\x17\xb0\x94\x99\xf2\x54\x4d\x7a\x5f\x29\x6a\xf4\x0e\x26\x17\xee\x97\xad\x55\x75\x14\xe2\x60\x5c\x5a\x7d\x9d\x61\xe7\xb3\x0a\x88\x48\xcb\x21\x7e\x94\x4d\x4e\xb5\x4f\xd0\xd4\x19\x70\x6a\x95\xdb\xa4\xb6\x1d\xab\x7f\x11\x0e\x00\xc9\x8b\xdd\x84\x21\x26\x71\x70\xaa\x34\x15\xc6\x1b\x7c\xe2\x2e\xa2\xb9\x99\x80\x7e\x55\x62\x73\xcd\x59\xc6\x2d\xac\x3e\xfb\x52\x40\x5a\xe1\x00\x5f\x2e\x23\xcf\xc2\x92\x73\x9f\xd1\x74\x55\x83\x2d\x2a\x1d\xe0\x88\x79\x7d\xb8\xb7\xb4\xc5\xa4\x79\x1b\x0d\x74\x51\x65\xa2\x1a\xa8\x24\xa8\x86\xa4\x0a\x59\xaf\xc6\xc4\x7a\x5a\x13\xc0\xb8\x7a\x5d\x27\x6d\x78\x4d\x80\xdc\xef\xd6\xfc\xaa\x4b\x34\x82\x91\x9a\x34\xe3\x86\x61\x46\xf8\x05\xe2\x0a\xd0\x59\xcf\x02\x5b\xbb\x99\x89\x71\x17\x56\xea\xc1\x32\xc7\xb0\xf5\xd4\x04\xd6\xfd\xe8\x69\x6c\xb6\x68\x1b\xff\xf8\xb8\x00\x5a\xb9\x02\xdd\xa1\xa1\x27\xe2\x08\x7f\x34\xcf\x76\xff\x85\xa7\x98\xb4\x29\x1d\x46\xd9\x97\x37\xb2\xa9\x7c\x20\xb3\x7a\x73\x49\x1d\x79\xb5\x9f\x19\x7d\xfa\x40\xe6\x44\xea\x7a\x4f\x7f\x75\xa0\xfe\x3d\x2a\x00\xb6\x64\xed\x15\xb2\x57\xc9\x02\xf2\xd1\xc9\xef\x25\x38\xb8\xdd\x68\xb4\xbe\xfd\xba\xb6\x00\x9f\x43\x79\x3c\x0a\x6e\x34\x09\xe2\x34\xdd\x04\xb5\x4c\xfb\x99\x02\xb4\xd6\x7c\x1e\x39\x1a\x40\xbf\xbf\xd1\xaf\xdd\x02\xa2\xea\x4e\xac\x9c\x5b\xa2\x0d\xaf\x73\xd3\xcd\xe8\x77\xaf\xc0\x70\x61\x12\x38\x19\xb5\x5d\x31\xa9\x99\x1e\x55\x1f\xd1\x65\x86\x5c\xab\xcc\x0c\x21\x02\x15\x13\xde\xa3\x5f\x65\x6e\xae\xd8\xf4\xa5\x3f\xaf\xcb\xad\x3e\x02\x2d\xe2\xcd\x6c\xea\x52\x63\xc6\x20\x38\x5a\x7c\x67\x24\x5c\x59\x57\x0e\xda\x42\x65\xfb\xde\x42\xfa\x47\x5c\x71\x68\xe7\xc9\x01\x7a\xac\xf9\x46\x49\xb8\xfd\xca\x73\xbf\x05\x16\x09\x76\x32\xea\x90\xcc\xb0\x70\x9b\x54\x22\x94\xf4\x15\xcd\xdb\x53\x47\x93\xc3\x0a\xb5\x11\x74\x1a\x95\x5c\x2a\xc4\x83\xfa\xc5\x6d\xc1\xa1\xfe\x09\x8f\xbe\x67\x09\x4e\xb0\xb7\xa6\x73\xc6\x76\xf9\x8b\xf7\x88\xa6\x14\xfd\x1e\xcc\x6c\x2a\xd1\x14\x9a\x41\x24\xba\xa9\xc4\xbe\x49\xe0\x23\xb2\x55\x1e\x42\x02\x1e\x4f\x7d\x53\xfd\xb5\x49\xfe\xd4\x35\x92\x6c\xdb\x17\xa2\xe5\xfe\xea\x3b\xdb\x0d\x96\xf4\xc7\x85\x16\x34\x3d\x2f\x67\xe7\xb4\x3c\x5d\x41\x55\x46\xc7\xf1\xa9\x03\xb8\xb1\x01\xbe\x66\x64\xa4\xa9\x02\x0d\x80\x92\x3a\xc4\xb0\xa9\x51\xe1\xc8\x4b\x50\xb1\x4b\xb0\x35\x2f\xa7\xff\x1b\xce\xd5\x25\x32\x18\x49\xb1\xb7\x97\x26\x64\xa9\xa9\x30\x18\xf5\x64\xee\x6d\x2f\xbf\x12\x52\x50\x3d\x05\x71\x47\xa7\x1e\x29\xb5\xbe\x00\xda\xfa\x51\x02\xb5\xcf\xc4\x7a\x43\x5d\x72\x23\x9f\x84\xfb\xb8\xd4\x51\x75\xc0\x52\xd6\x5f\xf6\x45\x8c\x2c\xc2\x40\x19\x07\xed\x41\x70\xa9\x87\x3d\xb4\x6b\x43\x8c\x71\xea\x3d\x01\x0e\xde\xc1\x94\xaa\x23\xcb\x94\x42\x77\xb2\x1c\x50\x25\x4a\x58\xb9\xf4\x0c\xb6\xd5\x0f\xf7\x87\xcb\xfd\x64\x60\x30\x44\xfe\xcf\xf5\x8a\x41\xd6\x57\xc5\xa1\xf4\x70\x24\xa0\x08\x42\x1b\xa0\x89\xc7\xe4\xe6\xe8\x03\x2f\xa7\x3c\xc7\x20\x62\xbb\x1b\xc4\xdc\xd7\xad\x1a\x1c\xac\x67\xc4\x91\x7d\x0d\xdb\xb3\x1d\xe3\x08\x2b\xe0\x3d\x94\xc0\x0f\x51\x2b\x74\x1a\x66\x97\x3a\xad\xb7\xfa\x57\x49\x0b\xce\x2a\x22\x08\x5b\x38\xf5\xce\x61\xbc\x11\xd8\xe4\x50\x02\xe3\xc5\x57\xb2\xa4\x29\x62\x0c\xfe\xea\xfb\xe4\x28\xd4\x3b\x48\x2b\x2f\xdf\x28\x43\x78\xa3\x7e\xe4\x1e\x3d\x4c\x52\xbf\xaf\x0b\x72\xd2\xcc\x23\x8a\x8b\x5f\x0c\x97\xd4\x0a\xe0\x25\xc8\x93\xa2\x54\xf9\xda\xcf\x07\x1b\xf8\xd0\xd2\xbd\x5a\x40\x21\x93\x0d\x62\x9b\x35\xb5\xd6\xb2\x0d\x2b\xd2\x68\xaf\x72\x0b\xbb\x58\x35\xe5\x3b\xbe\xd2\xc5\x4b\x47\xfb\xd2\x79\xd8\x6b\x7f\x6f\x8e\x5e\x12\xca\xca\x9c\x62\xe4\x17\xec\x9e\xb0\xbf\xf5\xb9\x55\x51\x90\x4c\x92\xca\x21\x90\xef\x12\xd4\x5c\x95\x10\xbd\xbf\x21\x45\xf2\x96\x73\xbe\x44\x58\xc3\xa6\x16\x72\xee\xd4\x04\x80\xcb\x8f\x0a\x42\x31\x5e\xf7\xdb\xb7\xb7\xfb\x35\x4f\x8e\x91\xf9\x38\x7f\xd1\x2c\x70\xa7\x0d\x81\xbb\xb1\xc5\x7c\xb7\x24\xa8\x36\x59\x1f\xac\x33\xd1\x73\xc6\x02\x3c\x49\xc8\x4d\xc8\xa5\xd9\xc1\x6d\x0b\xf0\xc9\x23\x84\x2e\xa0\xcb\x8f\xf9\x4c\x5c\x7a\x8f\x73\x0f\xd9\x0d\x57\x89\xbd\x26\xdc\xb7\x6f\x8c\xe6\x78\x79\x99\xc7\xa9\xf6\x3b\x86\x33\xe5\x12\xd4\x4c\x39\xbf\xfb\x84\x53\x11\x40\x77\x93\xbe\xea\x64\x96\x38\xa2\x7a\x8f\xa6\x08\xce\xbb\x11\xa8\x5c\xab\xe0\xa4\x1c\xa3\x3a\x9c\x6c\x30\x72\xf1\x5a\x79\x95\x49\xbf\x6f\x59\x4c\x6d\x00\x7e\x46\x07\x23\x87\xd2\xbc\x54\x3b\x28\xf0\x79\x77\x8b\x95\xb9\xc5\xca\x9f\x67\x00\xf1\x95\xd4\xa9\x83\x7d\xfb\x9f\x9d\x4a\xa4\xef\x25\x48\x11\x28\xe7\x25\xf6\x24\x23\xde\x26\x5f\xcc\xe5\x63\x5d\xdd\x54\x39\xc2\x6f\x1c\xc4\xc5\xf0\x05\x01\x2f\x62\xab\x1d\x2c\x5e\xe5\x5b\xb6\x32\xfa\x91\xb3\xfa\xa1\x25\x1a\x59\xa7\x49\x43\x70\xf2\x7a\x14\x6f\xcf\x29\x5c\x92\x09\x5b\xc6\x6d\x8c\x94\x30\x12\xd9\x2a\xf2\xa6\xe4\x37\xad\xc1\xc6\x22\x8d\xb9\x97\x61\xa5\x17\x5e\xe9\x52\x09\x88\x51\x5b\x77\xfb\x9e\x98\xf0\x27\xc0\xd1\x8b\xfa\x37\x7d\xb5\x3c\x17\xe4\x36\xed\x44\x10\x3c\x91\x5c\x92\x4f\x80\xf3\xd8\x10\xc4\xaa\xc0\x6d\x00\x2e\xe9\x90\x4c\x8c\x9d\x99\xe5\xe3\x9e\x00\x62\x70\x7f\x83\x1a\xc8\x2e\x17\x47\xda\x5f\x9d\x84\x83\x0d\xa7\x8d\x9c\x6c\xec\x7d\x1f\x0d\x5d\xb8\x13\x61\xcf\xab\x32\x6b\xda\x61\xae\xb0\xc8\x66\x1e\x8e\x87\xad\xe8\x1c\x96\x17\xba\xc2\xcb\xe5\xac\x76\xf6\x76\x5e\x80\x55\x2b\x32\x34\xb5\xf7\x31\x55\x8c\x1d\xa2\x61\x04\xca\x68\x8c\x0f\x94\xfe\xad\x40\xae\xf8\x71\xdf\x3e\x6d\x2c\x59\x12\xb8\xc1\x92\x68\x38\xcf\x55\x42\x4c\x9a\xc4\x69\xbe\xa2\x4b\x2f\x34\x9c\x61\xa9\x1b\x2d\x87\x34\x29\x6c\x9a\x05\xa9\x0f\xe9\x93\x34\x9d\x33\x86\x0c\xee\x9b\x0a\xa0\xc7\x39\xd6\x06\x99\xf7\xba\xcc\x9c\xb5\xaf\x8f\x5c\x2e\x0f\x8f\x4f\xda\x18\x9c\x96\x65\x76\x3f\x63\xdc\xcc\x53\xdb\x57\xf9\x5d\xd1\xc1\x53\xb1\x16\xfa\x72\x92\x2f\x8c\x6c\x40\xd3\x35\x37\x35\xca\xb7\x13\x57\x1b\x8d\xdc\x74\x05\xf1\x50\xf5\xe1\x7e\x84\xcd\x99\x98\xa5\x96\xf2\xc3\xdb\x5a\x4a\xb9\xeb\x77\xb8\x94\xc3\x3c\x6d\x82\x03\x62\xcb\xdf\xcf\x90\x49\x9a\x47\x7b\x71\xcd\xde\x67\xcf\xcf\x92\x76\x35\xe8\x9e\x8b\xf6\x4f\x39\xcc\xd5\x08\x86\xd1\x69\xb5\x7f\x8e\x6a\x31\x8e\xf5\x52\xd7\x4c\x1e\x7b\x97\xb2\x91\x87\x71\xee\x6a\x2a\x7b\x87\x54\x9c\x4e\x54\x28\xaa\xda\xe4\x55\xbd\xb6\x9b\x9c\x87\x97\x36\xde\xff\x7d\x0c\xb3\xd5\x3b\x00\xcf\x46\xea\x1a\x31\xd7\x7d\xf6\x28\x46\x93\x06\x78\xda\xd3\xd2\xde\x7a\xd4\x1a\x9f\xb2\x50\x56\x2b\xbb\xf7\x15\xb9\x71\x86\x03\x4d\x6b\xfa\x91\xc1\x1c\xbf\xba\x2a\xbf\xf2\x8d\xe8\xbf\xe6\x0a\x3f\xd4\xe1\xd0\x5a\x6e\x99\xbe\x5a\x35\x9f\x23\xc7\x4d\xc7\xfb\x64\x36\x49\xb3\x55\xbc\x0d\x26\x64\xee\xd0\x8e\xdb\x31\x98\x28\xd9\x90\x75\xdd\x04\xa0\xa5\x41\x8b\x42\x90\x60\x36\xf5\x0c\x86\xbf\xe6\x7f\x37\x07\x5f\x5e\xb9\x54\xc7\x0d\x6d\xfd\x81\x43\xe2\x72\x53\x2e\x8c\x97\x9d\xd7\xf0\xd6\x8c\x42\x60\x1f\xa5\x6a\xc3\x97\x4f\xcf\xa9\xbe\x79\xcf\x5a\x52\x83\x22\xcc\x0a\x76\xa8\xfb\xf0\x0a\xc5\xeb\x45\x8b\x2d\x94\xd8\xff\x9f\x23\xf9\x7f\x92\x92\xd3\xe0\x9a\xaa\x9a\xda\x96\x40\xdd\x87\xbe\xe6\x16\xa0\x01\x78\x6a\x54\xb1\x23\x66\x52\xca\x46\xaf\x95\x12\x4f\xaa\xf0\xb4\x82\x08\x95\xd0\x28\xb8\x09\x8b\x96\x85\xd1\x5e\xa5\x4a\xed\x87\xe0\x5e\xda\xda\x90\x3e\x54\xe5\x0e\xcd\xb7\xb2\x35\xb3\x12\xd9\xae\x9b\x62\x04\x0d\x5d\xb2\x5d\xb0\xd7\xfc\x34\xfe\x55\x7d\x36\x95\x75\xd7\x0c\xca\xd0\x43\xd2\x2f\xbc\xe6\x00\x56\x66\xbf\x20\xe0\x5a\x30\x62\x48\x9f\xda\xfc\x78\xc0\x12\x51\xfd\x29\x5a\xc2\xba\x90\x99\x5e\xa6\x4d\xee\xe5\x80\x69\xbc\x37\x41\xa7\xc2\x09\xe5\x0c\x60\x8d\x0a\xb3\xe3\x97\xeb\xe6\xf0\xb6\xd5\x52\x1c\xc8\x73\x3f\x3a\x35\x51\xd3\xf6\xbd\x5b\x6b\xa4\xad\xa8\xad\x82\x84\xc9\x69\x65\x15\xe4\x6b\xd2\x6e\x69\x48\x9b\xdd\xa8\xca\x39\x04\x46\xd4\x64\x03\x9c\x76\xee\x0c\xb6\xd3\xf0\xf3\x73\xdd\x15\xdf\xce\xe5\xd2\xf0\x38\x46\xe6\xa6\xfb\x1b\x2d\x6b\x56\x34\x6f\x6e\x51\x5e\x4c\x6f\x9d\x9b\x1c\x15\xb8\x73\x12\x79\xe3\x8d\x35\xcd\xb4\xb2\xb9\xbe\x55\x84\xc1\x91\x4b\x25\xe5\x66\xc8\x1a\x67\x26\xdc\x54\x9d\x0e\xc2\x23\x56\x07\xa6\x3b\xd3\x20\x58\xf2\x1a\xe2\x80\x4f\xa3\x02\xd1\xe9\x1b\x8b\xf3\x39\xfd\x1b\x82\xb4\x33\x9f\xd3\x5b\xda\xff\xc6\x22\x5d\x57\xc3\x97\x55\xe9\xe4\x73\x7a\xd2\x1e\x9d\xaa\x25\xcd\x53\xf8\xf9\x67\x8f\xff\xfe\x28\xa2\xcb\x31\xd6\xc5\x34\xcd\x26\x16\x22\xd2\x3c\xae\x9c\x23\xd3\x44\x45\xaa\xe8\x51\x2e\x8c\x6e\x18\x6f\x55\x21\xd6\x60\xb4\x90\x80\x05\x7a\xa1\x9a\xc0\x7d\x9b\xd4\x54\x49\x1f\x27\x8f\x54\x23\xaf\x26\x0d\xf6\xf9\x8e\xc1\xe3\xf6\x31\x91\x87\xc4\x5c\x23\x99\x60\xea\xea\x0b\xc7\x72\xf9\x21\xf2\x55\x63\x58\xe7\x32\xb9\x4e\x43\x1d\xc2\xf8\x0d\x36\x3d\x1c\x51\x5e\x42\xac\x05\x6b\x4f\x2d\x11\x5b\xb6\x71\x6c\xa0\x39\xa5\xba\x63\x36\x86\xe6\xe1\x5a\x5e\x91\x20\x98\xf7\x07\x80\x7a\x5b\x88\x2b\x74\xbf\x72\xc9\xb5\xd1\xed\x62\x07\xa5\x65\x97\xe4\x9c\xa8\xee\x53\x52\xc9\xeb\x60\xd5\x25\x75\x97\x16\xfe\x24\x2a\x3b\xf9\xe3\x01\x60\x5d\x46\x33\x1f\xfa\x47\x35\xd5\x7a\xf5\xd3\x97\xee\x5c\x39\x7a\x0d\xc7\x2a\x5f\xf9\xea\xcb\xed\x16\x44\xbf\x68\x9e\xb0\x64\x8e\x6c\x2d\xd4\x99\xd7\x3c\x7d\x38\x9a\xba\xb1\x13\xc7\xdf\xea\x17\xef\x31\x81\x3f\x0c\x00\x83\x8e\x6c\x95\xc3\x84\xae\xae\xd0\x8d\xbd\x10\x07\xec\x9d\x85\xa3\xe1\xf1\x09\xae\x97\x82\xfd\x34\xda\x61\x6e\xea\xef\x47\xb6\x16\xc3\x4f\xb6\xf3\xc4\xcf\x38\x7b\x02\x3c\x7e\x95\xca\x8c\x4a\x73\x15\xb0\x18\xaa\x82\x51\x09\x4f\x4c\xd9\x06\xff\xfa\x00\xb4\x4c\x5e\x83\xf4\xd9\x7b\xac\x99\x2a\x8b\x79\x3b\x9a\xcd\x9a\xd4\xe5\x38\x47\x77\x85\xd3\xaf\x20\xdf\x6a\x88\x30\x85\xed\xde\x1d\xa8\xc3\x41\x73\xf5\xfb\x18\x0e\x1a\x6b\xed\xf8\x83\xe9\xec\x5e\xf0\x3d\x3c\xba\x5a\x20\x96\x63\xe4\x85\xe6\x4b\x5c\x9c\x55\x2d\x13\x50\x8a\xda\xc8\x09\x3d\x03\x55\x30\x53\xf8\x90\x0c\x62\x61\x35\x25\x3d\x72\xda\x97\x3a\xcf\x12\x42\x46\xa1\x01\xe9\x89\xe3\xbe\xb4\x92\x4a\xba\x94\xf8\x64\xbf\x96\x98\x4c\xa7\x80\xb0\x38\xbd\x7e\x4b\xba\xe9\x1d\x22\x0d\xef\x5e\xe4\xb7\x12\xd8\x9e\xb5\x4b\x54\xc5\x57\xa2\xcd\x97\xab\x06\xab\xfc\x1b\x7c\xc6\xfe\x63\xfc\x74\x78\xa6\x7b\x94\x78\x26\x76\x36\x2a\x04\x71\x45\x89\xb4\x71\x4d\xba\x9f\x0d\x74\x99\x16\xaf\x47\x0f\x2b\x92\x89\xdc\xa1\x50\x42\x61\x8b\x9b\x81\xba\x77\x6b\x71\x2d\x34\x7a\xd9\xab\xc4\xdf\xee\x1e\x77\xab\x0e\x3f\x28\xdf\xfa\xe2\xb9\xa7\x5d\xb7\x8c\x1c\x2e\xdc\xe8\x80\x8f\x67\xff\x77\xff\x3b\xff\x48\xcc\x65\xb5\xff\x1b\xe6\x65\x51\xa2\x57\x60\xec\xca\x3a\xa1\xd3\x1e\x68\x05\x74\xa2\x48\xe8\x47\x43\xb6\x45\x06\x76\x33\x4e\xf3\x08\xb3\xcf\x3e\xbf\x4c\x58\x46\x02\xab\x68\x9b\x03\x9b\x53\x2a\xa5\xcf\xe2\x2a\x12\x34\x31\xb3\x80\x5a\xf4\x63\x71\x81\xef\x41\x0f\x90\x36\xe0\xcd\x0a\xcc\xba\x74\x2d\x43\x7d\x13\x83\xce\xff\xcc\xc3\x46\x3f\x48\xe2\x6c\x86\x60\x7f\x0d\x20\xac\x84\x6f\x06\x5a\xc2\x0d\x17\x57\xe4\x2e\x63\xb6\xa0\xff\xa4\x98\x58\xf9\xca\x03\xfa\xac\x8d\xb6\x49\xd9\x2e\xa9\xfb\x72\x2d\xdb\xd8\x23\x69\x28\x37\xe2\x87\x92\xcd\x10\x9c\xb1\x09\xd1\x33\xf9\x54\x14\xd3\x56\xe8\xd0\x7f\x04\xa5\xa0\x65\xad\xbc\x6c\xea\xc3\x05\x61\xfc\xeb\x46\xe6\x3e\xa8\xca\xd9\xad\x36\x40\xf7\xf3\xc4\xaf\x73\x37\x45\xe4\x20\x7a\xba\x7c\xa9\x2a\x0e\xca\x39\x6c\xa7\x8d\x89\xd9\x6e\xf2\x3c\xc1\x8c\x3b\xe4\x64\x91\xf9\xad\xf1\x85\xe5\xf3\x90\x6b\x49\x89\x22\x5e\x34\x55\x33\xbb\x7c\x3a\xaa\x39\xdd\x1e\xd4\x89\xf9\x8e\x17\xf9\x21\xfd\xbd\xf6\x5c\x10\x45\x53\xa5\x9f\x1f\x1a\x63\xdc\xbe\xd9\x7a\x0c\x35\x25\x63\xe1\x5c\xe2\x31\x29\xd5\xba\xc6\x7e\x3e\x2c\x7d\x67\xea\xd5\x4e\xc1\x48\xdf\xdf\xd7\x4b\x29\x93\x28\x1b\xfa\x02\xaf\xba\xb3\xbc\xe9\xe8\xec\xb8\x57\x17\x33\xf7\x4b\xdd\x1a\x87\x6b\x05\xc2\x03\xc5\x63\x23\x90\x4c\x11\xd5\x8b\xfe\xaa\x6f\xdd\x69\x09\xf4\x8b\xe3\x6b\x3e\x86\x8b\x1c\xcc\x41\xfb\x8d\x70\xd1\xad\x37\x76\x20\xc9\x2b\x90\x23\xad\xdd\x22\xa0\x89\x3b\xdf\x7a\x98\x72\xca\xe4\x53\x4b\x26\x31\x31\x72\x97\xeb\xf6\x29\xc6\x8c\x54\xa6\x83\x3a\xb6\x55\x22\xa8\x6d\xb3\xae\xcd\x55\x76\x11\x0f\x4a\xfb\x8f\x84\xf8\x85\x40\x38\xae\x48\xa7\xe7\x37\xf0\xab\xb6\xfd\xda\x3e\x44\xc1\x4b\x14\x61\x30\x79\x3a\xa7\xda\x47\x9f\xab\x61\x1d\x81\x19\xba\xae\xb4\xf0\xc1\xb3\xe8\x7e\x34\xfc\x9c\xec\xd3\x7f\x40\x41\x64\x8e\x31\xf1\x8a\x0b\x26\x52\x3c\xb4\x97\x4e\xa7\x76\x5b\xff\x73\xda\xa3\x05\xea\x49\x39\x86\xee\x9c\x9d\x74\x8e\x30\x71\x04\xcf\xda\x03\xf3\x39\x9b\x98\xa4\x6a\x48\x45\xad\xf0\x3f\x63\x9d\x58\xcd\x3e\x01\xe7\x74\xd9\xff\x1f\x76\x2d\xdf\xcc\x66\x72\xee\x0e\x6c\xb6\x22\x92\xd0\x82\x37\x9a\x44\xf4\x31\xf9\xc5\x77\x58\x52\x4d\x09\xe0\x9d\xc6\x89\x80\x9c\xa8\x19\x23\xa5\x40\x70\xe9\x9e\x71\x5e\xe0\x57\x55\x02\x4f\xca\x65\xee\xd1\xcc\x80\x3f\xde\x7e\x0b\x9f\xbc\xa8\x11\xc6\xdf\x54\x25\xff\x89\x58\xd7\x58\x0e\x00\x93\xea\xc9\x32\xbc\x93\x69\x15\x12\x10\xf3\x29\xcb\x7c\x39\xc0\x27\xb5\x5c\xad\xa6\xf7\x3e\x7b\x79\xe5\xc7\x66\x78\x8d\x17\xc0\xc8\xde\xc8\x51\x58\x5b\x22\x32\x76\x4a\x95\x2b\xc2\x1d\x7c\x9b\x7b\x1d\x93\x3d\x9c\xba\x35\xa7\xf4\xb7\x44\x77\x6e\x00\xa2\x7c\x07\xd6\xa6\xb1\x16\x6f\x09\xac\xd2\x1f\x98\x68\xd1\x93\xee\x76\x8e\x7a\xa9\x35\x08\x2e\x97\x61\xe0\x09\xa0\x19\x95\xb7\x62\xcd\xdf\xe4\xb7\x59\x9b\x87\xe7\x22\xd6\xd5\xcd\xec\xa7\x8a\x67\x2a\x1f\xb9\x91\x6c\x30\x4d\xb4\xd5\x86\x6b\xa5\xc0\xb5\x6a\x53\x98\xa4\xb9\x97\x4b\x4f\xe7\x69\x0d\x32\x72\x90\x68\xed\x53\x1e\x03\x8d\x2b\xc1\x17\x1e\x0e\x2a\xef\xda\x18\x9e\xf5\xa9\x5c\xd6\xb9\x9b\x36\x6b\xd1\x56\xfd\x3d\x16\x3e\xb8\x2d\x5f\xb8\xde\x4d\x9a\xfa\xa0\x63\x58\x87\xda\x12\x09\x15\xaa\x2f\x8b\x16\xd7\x3e\x57\xdb\x90\x9a\xd1\x71\x6f\x4a\xd6\x64\x80\xac\xa4\x7f\x13\xa3\x70\x95\xd7\xa0\x65\x79\xdb\x06\xdb\xe6\x66\x77\x2c\x27\xa6\x3a\x83\xe7\x5e\x1a\x9c\xd0\xe1\xeb\x05\xc2\x9b\xdb\xf9\xdc\x04\xc6\xa2\x1a\xb3\x3b\x8e\x5f\xae\x1f\x73\x00\x77\xca\x77\xd5\x9f\x3e\xdf\x25\xe1\x09\x85\x21\x6e\xfe\x72\x30\x7c\x42\x06\x7c\x03\xb4\xfc\x2a\xaf\xa3\x97\xce\xb0\xbf\x89\xfa\x9e\x77\x15\x87\x0f\x0d\xa7\x09\x36\x08\xaf\x6f\xc0\x9d\xa6\x00\x7c\xb7\x97\x6c\x3c\xf8\x5d\x9e\xfd\xf7\xa8\x39\x25\x8c\x75\x59\x17\xf6\x2d\x87\xa9\x6d\x2c\xe5\xf8\x75\x4e\xee\x68\xe6\xcd\x1f\x1b\x27\x42\x97\x34\x74\x07\xd5\x6a\xe1\x5e\x1a\x19\x00\xd6\xce\x57\x7b\xf9\x37\xa2\x51\x1b\xc0\x85\x56\x4e\x35\xed\x64\x7c\xb1\x8c\x21\x3d\x10\x22\x40\x4b\x7b\xe6\x2b\x65\x08\x51\xa2\x26\x06\x23\x65\xaf\x94\x42\xdb\xed\xfa\x3a\x69\x4c\xe4\xb3\xd9\xbd\x3e\xea\x2e\x1d\x1d\x98\x7d\xd8\xd9\x9d\x26\x84\xdc\x68\x9d\x21\xd8\x12\x41\xe4\x43\xc4\x70\xdd\xa8\x70\xab\x9d\x75\x12\x53\x77\xae\x4e\x45\x4b\x12\xe2\x1d\x51\xbe\x6b\xde\xe4\x92\x31\xec\x9c\x19\x96\xf3\xad\x6e\x8e\x63\x10\x8f\x20\x5c\x00\xd8\x05\x85\x79\x0d\x37\x58\xf5\x39\xa4\x64\x8e\x6a\xe3\x92\x9d\xaa\xa5\xbe\x60\xcc\x84\x05\xe8\xfe\x15\x37\x1e\x29\x6f\x2f\x42\x74\x9b\xfd\xd7\xef\x61\x63\x9a\xe4\x6b\x65\xb2\x95\xb4\x24\x6e\xff\xbb\x6c\x2f\xab\x40\x21\x55\x1c\x32\x58\x01\x6e\x3c\x51\xbf\x8a\xff\x24\xa2\xb4\x39\x65\x6a\x85\x6e\x4a\xb0\x67\xa8\x1b\xbb\x83\x2e\x71\x26\x00\x23\x2a\x9f\x15\xf3\x4d\x7e\xcc\xcf\xde\x34\xeb\x9f\xfc\xc9\xb6\x53\x7a\xc1\x3a\xb6\xb9\x5c\x61\xb1\x61\x6f\xd6\xd8\x39\xeb\xe4\x59\x92\x3b\x5a\x41\x79\x48\x6a\x10\xf7\x34\xfb\x65\x18\x5d\xf5\xcc\xe9\x62\x9d\x96\x2f\xc5\x43\x4d\x0f\xd1\x4b\x26\xfb\x98\x2f\xa3\x55\x69\x21\xe9\xa0\x00\x39\x86\x7d\xac\x90\x85\xe3\x89\xb0\x19\xac\x6a\xe5\xcd\x9e\x95\xb3\xab\x31\xf7\xe0\xcc\x80\x52\x27\x34\x09\x8f\xd2\xae\x1e\x2f\xad\xee\x38\x95\x5c\x34\xec\x5a\xf3\xf2\x63\x8f\x2b\x1c\x0f\x4e\x92\x39\x66\x8f\x16\x6b\xda\xba\x90\x74\x68\x2a\x91\xa3\x99\x84\xe9\x9a\xc2\x12\x4a\xc2\xf2\x80\x23\xc9\xf3\x3b\x91\xd5\xa0\xb2\xcc\x06\x51\xae\x9b\x4b\x46\x02\xbe\xf4\xe6\x6b\x99\x3e\xb9\xd5\x52\xe5\x8d\xfa\x81\x68\xd6\x1b\x31\xcf\xea\x54\x22\xc1\xb6\xef\x55\x89\x63\xfc\x46\x5e\xc0\x0f\xf1\x22\xc3\x40\x4c\xc7\xc7\xe5\xa6\x54\x2a\xb7\x53\xa3\xf1\x63\xb3\x11\x6c\xb8\x92\x2a\x3b\x3a\x34\x68\xc2\xc6\x2c\xf1\x8e\xd7\x7b\xcd\xfa\x39\x50\x55\x66\x65\x8e\x96\xd3\xf4\xa3\xd4\x8d\xce\xb8\x94\xcb\x3f\x45\x00\xa2\xda\x68\xb4\xfb\xc9\x38\x7e\x79\xdc\xd4\xbf\xa5\xc0\x78\x13\xdc\x11\x6e\x97\x3c\x1c\x72\x18\x4c\x46\xed\x66\x0c\x7e\x00\x80\x25\xda\xe5\x4b\xfe\x5c\x43\x47\x9a\xa4\xaf\x98\x14\xf0\x44\xf3\x5a\x4a\xeb\x90\xe9\xb8\xac\x46\xdf\x3e\xb8\x78\xb6\xf0\x36\x1b\xa7\x54\xb1\x61\x6b\x8f\xba\x25\x49\xbf\x72\x72\x53\xad\xeb\xd4\x52\xdb\x62\x1a\x35\x86\x6e\x3f\x99\x7d\xc1\x40\xa4\x1b\x83\x76\x9b\xba\xff\xe2\x87\x07\x84\xf1\xa7\xb7\xaf\x4b\x10\xfc\x58\xe1\x7d\x1e\xa5\x38\xf0\xc4\x61\x85\x5c\x71\x0c\x5a\xd7\xfe\xbe\x9d\xa3\xc0\x45\xbf\x7d\x23\xcb\x25\x34\x63\x2c\x18\x66\x6c\x10\x1b\x6b\x3e\x01\xca\xc6\xc3\xc5\x60\x6d\x61\xff\x23\xec\x59\x70\x10\x65\xba\x4f\xd6\xa6\x48\x6d\x30\x00\xcf\x2a\x2c\x28\x9c\x63\x72\x6e\x44\x85\x88\x90\x1c\xbc\xb9\x9a\xb8\x7a\x9c\x25\xee\x73\x08\x4b\xfc\x1d\x9c\xbf\x04\x15\xb0\x76\x58\x9b\x20\xfa\xaf\xa9\x7c\x09\xc5\x2f\x49\xc0\xa6\xa9\xfd\x92\x5d\x85\x88\xa6\x60\x71\x99\x23\xba\x06\x6e\xb1\x1b\x79\xd7\xc9\xdf\xea\x2f\x72\x4b\x5e\xef\x0b\xca\x0f\xaa\x84\x18\x54\xf9\x06\x97\x58\xa1\x42\x7f\xb5\xfb\x70\x90\x5b\x8f\xe6\x16\x67\xa9\xaa\x54\x78\xd9\xc7\x75\x75\x80\x6b\xe6\x2c\x06\x0a\xab\xbe\xb8\x73\x40\xe5\x92\x65\xde\x25\x28\x17\x3a\xc4\x10\xe9\xae\x56\x41\x7c\x62\xae\x13\x1d\x8c\xfe\xa2\x13\x88\xa4\x49\xd6\x65\xb2\xc1\xb1\x81\x7e\xd9\x6e\x76\x15\xaa\x82\x80\xeb\xd9\x84\xe4\x16\x81\xf0\x36\xc8\xe9\x75\x20\xa1\x18\x68\x07\xbd\x93\x0c\x05\xc4\x87\x57\x74\x26\xbd\xd5\x9e\x70\xa7\xa5\xf4\xf9\x10\x1b\xe3\x7b\x9f\xf3\x05\xa4\x0c\xa7\xe7\x98\xac\x4d\x01\xd7\xaa\x42\x6a\x8c\xce\x95\xe1\x52\x3e\xf0\x3a\x14\xc4\x68\x07\x45\x62\x95\x41\xc0\x5a\xd1\x64\x38\xe7\x48\x57\xe8\x2e\x68\x6c\x00\x84\xfc\x8d\xc2\xdd\xe6\x40\x94\x57\xe5\x57\xb4\x7d\x55\x65\xab\x87\xa4\xeb\xf5\xe1\x63\x26\xe4\x67\x19\xf6\xa7\x50\x8e\xed\xb6\x52\x8b\xd8\x55\xa7\xcb\xbb\x3e\x0b\x58\xd8\x8a\x4b\x2c\x37\x9a\x48\x71\xaa\xc2\x79\xbf\x45\x77\xa2\xe4\x37\x15\xb5\x5b\x22\x21\x87\x21\x2d\x2d\x38\x3c\x37\xc3\xec\x34\x8e\x00\xe3\xf2\x03\xe3\x8b\x73\xd5\x75\x33\x46\x62\xf3\x17\xf1\xa8\x7c\x5c\xf3\xd2\xeb\x2a\xc6\xee\x54\x4a\x33\x55\x01\xe2\x66\x84\x66\x85\x2d\xcf\xa7\xc7\x68\x55\x04\x8d\x95\xed\x1b\xc1\xb8\x0f\xfc\x40\xe0\x41\xa9\xdd\x77\xfb\x5f\xb8\x30\x45\x4b\x65\xb2\x96\xf1\x05\xa6\x43\xab\x6e\xb6\x40\x87\x8a\x54\xc8\x1a\x31\x9c\xa3\x80\xae\xf5\x42\x8a\xd9\x4a\xc9\x2d\x59\xfd\x42\x62\x2a\x9a\x68\xa8\xbb\x44\x7c\x4b\x9f\x60\x56\x8e\x9e\x99\x8d\x92\x97\x41\x8e\x63\x34\x01\x60\xab\x8a\xeb\x90\x2e\x30\xdc\x1d\x9b\xc0\x54\x18\x61\xae\xb7\xb1\xeb\xaa\xfb\xc9\x3b\x20\x05\xc8\x6a\x34\xdf\x0d\xd8\x67\x25\x5e\xde\x54\x0a\xfc\x4a\xed\x2b\x76\x83\xa2\x75\x74\x74\x74\xc7\x9c\xb9\x52\x00\x3d\x2f\xb8\x4c\xe2\xb0\x82\x46\xb9\xd7\xb0\xcc\x35\x09\x02\xf6\x9c\x94\xec\x3f\xcb\x76\x56\x79\x86\xb4\x1e\xc8\x5b\x2e\xb7\x34\xb8\x34\x7e\x39\x72\x5b\x9a\xa6\x7e\x24\xe3\x9e\xa7\xaf\x06\xcf\x76\xfa\x4d\x13\x55\x03\xc5\xd4\x80\xaa\x4b\xf3\xca\xc3\xb3\x2c\x00\x8d\xbd\x5c\x19\xd9\xdf\x35\xd5\xf1\x65\x01\xb5\x6c\xba\x87\xf1\xce\xa4\xb6\x22\x94\x60\x79\x9f\x5c\xaf\xc8\xb2\xee\xc1\xed\xbd\xf7\x25\x19\xe6\xb6\x81\x95\x83\xd5\x9d\x08\x66\x5c\x9c\x16\x76\x23\x8a\x6c\x67\x45\x55\xeb\x27\x94\x67\x6e\xb5\x7e\xd6\xb5\x5f\x2f\x28\x61\x6f\x2c\xf9\xbf\xad\x6e\x69\xe7\x50\x30\xcc\x48\x06\xbb\xca\x30\x26\x34\xc8\xb3\xf4\x52\x14\xf3\x22\x87\x5d\xa5\xbe\xc4\xa6\x3a\x20\x43\xb5\x8f\xb8\x59\x6d\x8e\xe4\x1e\x24\xe5\x01\xc2\xf2\xa9\x41\x02\xcc\x8d\x54\x2e\x5c\x37\x84\xd3\x0a\xfc\xee\x47\x12\xcf\x04\xde\xe8\x1f\xfe\x15\xbd\xfe\x66\x83\x40\xb7\x96\xe1\xaa\xb9\x5a\x05\xe7\x35\x56\xce\x97\x1b\xad\x25\xb3\x09\x4c\x0d\x32\x43\x35\x31\x6c\x3d\x6f\x2f\x23\x38\x95\x5a\xf8\xcf\xc2\x11\x9a\xf1\x91\xad\xa0\x95\x12\x2b\xc8\x2f\xb6\x01\x5f\xcc\x1d\xbf\x29\xc0\x1d\x8d\x78\x28\x9f\x66\xb4\xaa\x78\x39\x70\xb7\xf4\xf6\x91\xbb\xf0\xb3\x5b\x0f\x9b\xa6\x0a\xbb\xf1\x61\x4b\x20\x84\xb0\x49\x5b\xcc\xb3\xe5\x64\x1e\xbf\x05\x90\xf4\x59\x4b\x63\x52\xce\xe2\x47\xc4\x8b\x42\xa9\x0c\x1d\xeb\xf1\x9a\x0a\xe9\x81\xfe\x56\x65\xcc\x76\x0f\xb2\x5f\x31\x9e\xec\x6b\xad\x87\x5a\xfb\xb8\x76\x16\xcd\x8b\xb0\x66\xe1\x91\xd5\x54\xce\x7f\x16\x99\x97\x2d\x25\xfc\x78\xb2\xbb\x64\x41\x27\x90\xf2\x5f\x70\x1e\xb2\x22\x5d\x7a\x94\x2d\xeb\xb4\xc9\x6d\xc6\x99\xa3\xe8\x09\x1a\xe4\xfd\x18\xd0\xc9\x6e\x12\x26\xf0\x1b\x79\x7d\xd3\xd0\xc7\xd3\x9f\x12\xf1\x46\x51\xea\x9d\x40\x97\x13\xed\x3a\x98\x20\x35\xa7\x07\x3d\x51\xf3\xd8\xa7\x27\xf8\x65\x48\xd5\xd6\xee\x61\x3e\xf5\x7d\xb3\x35\xdc\x08\x64\x0f\xb7\xe2\x8d\xf5\xb6\x5d\xa0\x4a\xe9\x61\xee\x72\xff\x77\x48\x95\x9b\x5c\x0e\xb4\x21\x0e\x17\x1c\x6e\xeb\x45\x31\x01\x9e\xd0\xc6\x6c\x64\x68\x57\xb7\x1b\x5a\xae\xdb\xd8\xbd\x4b\xf1\x9c\x7a\xde\x44\xcf\xaa\x56\x7c\x49\xad\xf9\x0a\x0d\x7a\x6d\x76\x97\x4c\x04\x3b\x73\x80\x79\xf6\x4b\x8e\x43\xa7\x8b\x43\x47\xe2\xdd\x4d\xaf\x4e\x1f\xc4\x1c\x6b\x1b\xb7\x7b\x54\x83\x98\xc0\x5d\x98\x9a\xd9\x61\x4c\xc9\xad\xf4\x4b\xf5\x61\x1d\x36\xd8\x61\x1c\xa2\xde\x38\x27\x3f\xea\xf4\x0b\x72\xfc\x97\xdb\x02\x1f\x50\x54\x3f\x97\x81\x32\x41\xc1\xf8\x4f\xae\xb7\xe7\x6c\xc3\xbb\x33\x94\xa2\x0e\x9c\x43\x2b\xe2\x01\xee\xf0\xd8\xbe\xd1\x9f\x0c\x88\x55\xa7\x5d\x65\xd3\xa5\x23\x7d\xac\x23\xd6\x5f\x2e\xba\xd4\x77\x7c\x68\x68\xba\x9e\x3a\xa6\x20\x87\x2c\xb5\x74\xd0\x3e\x7c\x9a\x81\xf9\x16\xd2\xa8\x83\x2e\xae\xfd\xab\x40\x04\xf8\x4d\xf9\x94\x8e\xaa\xd8\x4c\x77\x71\x8a\x4a\x2a\xce\x43\x4b\xf2\x88\xfa\x87\x30\x53\x4d\x06\x83\xe4\xcb\xe9\x1d\xca\x01\x74\x94\xab\xdd\x2c\x8b\xba\x52\xa6\x39\x26\x4c\xc1\x33\xc4\xdf\xcd\x9f\x06\x29\xc6\x9b\xee\xb1\x09\x13\x42\x91\x22\x6e\x2c\xbb\x2f\x1a\x0c\x62\x12\xc4\xf1\xd2\x06\x7b\x84\x12\x39\xa0\x73\xa6\x84\x47\x57\x77\xb4\x38\x46\x39\x4d\x1e\xea\xbc\xff\xe4\x20\x6c\xfd\x08\x57\x80\x8c\x4f\xd5\xfa\x3e\x2e\xe7\xc5\xb8\xda\x9d\x81\x83\x92\xdc\x7a\x02\x3b\x8f\x8f\x8a\xd7\x8c\x7a\xc5\xb9\x5f\xde\x66\x5d\x8f\x50\xa7\x49\x81\x83\xdf\xc2\x24\x62\xe9\xd6\xe4\x63\x4f\xac\xd2\x98\xb8\x1e\x43\x25\x37\xdd\x4d\xd1\xbf\x83\x60\xa8\x9e\x17\x07\x06\x87\x8e\xb7\x25\x58\x8b\xe2\xe3\x68\xdf\x75\x31\x71\xe8\xa4\x3d\x13\xfe\x84\x15\x52\x90\xac\x20\xd7\x8d\x8d\xce\x42\x44\xd7\x8f\x97\xab\xa7\x49\xf2\x2f\xec\x6e\x41\x67\x0f\xd1\x36\x00\x76\x03\xf4\xd7\x06\x4b\x9a\xd4\x68\xd7\x84\x80\xff\x99\x17\xd6\x9d\x15\x48\x45\xc9\xda\x3d\x1c\xb3\x19\x76\xae\xbc\xd1\xb2\x49\x16\x95\x83\x34\x47\xb9\x5c\xa4\x92\x60\x06\xf5\x58\x27\xbd\x56\x59\x64\x03\x72\x0f\x78\xf4\x76\x30\x77\x95\x18\x69\xa7\x55\x8a\xfa\x35\x91\x31\xa5\xee\xd8\xd7\x74\x20\x68\xd3\x49\xd4\xa2\x10\x44\x7f\xe5\xc0\xa1\xa2\x62\x55\x1a\xf9\x18\x11\xff\xd5\x58\x40\xec\x95\xa4\x42\xa7\x2f\xf7\xd8\x3c\x30\xa6\x51\x99\x91\xb9\x28\xcc\xdc\x37\x3a\x44\xc7\x3b\x06\xc9\x15\x97\xd4\x80\xbb\x41\xbf\xcb\x6d\x76\xd3\xa1\x7b\x64\x69\x7e\xd8\xb8\xe3\x0c\xb4\x60\x59\xb4\x29\x78\x92\x79\xd6\xf9\x3b\x5a\x22\x67\xff\x22\x94\xac\x75\x30\xb5\x2f\x55\x4f\x17\xd2\xa9\xba\x9a\xc5\x46\x51\x4c\x48\x73\xec\xf4\xaa\xa2\xea\x3b\xfd\xe5\x92\x8e\x29\x96\x4c\x0c\x27\x3b\xcc\x3c\x2e\x08\xf8\xfd\x74\xe3\xba\xd4\xbc\xe3\x1c\x31\x41\xa5\x5c\xd6\x98\x59\x93\x8f\xf5\xfc\xfd\x9d\xdc\xa3\xd8\x00\x25\x34\x0d\x2a\x40\xb2\xf6\x44\x64\xac\x98\x9c\x0b\xc3\x5c\xc8\x53\x0b\x69\x66\x5f\x4c\x06\x31\xc7\x1b\x05\x0b\x89\x44\xb0\xec\xbb\xdf\xf7\xd5\x4f\x5b\x3e\xbc\x20\xad\x62\x13\xb0\x54\x4a\x12\xad\xe6\x8a\x2f\x16\x24\x2f\x19\x2f\x34\x27\x16\x67\xbf\xad\xf0\x92\x93\x38\xe4\x4f\x98\xd6\x6e\x26\x8e\x3f\x7b\xe9\x4c\x7c\xf3\x13\xb8\xa3\x73\xc2\xc3\x0f\xa8\xb3\x6d\xc2\xfa\x70\x2b\xdd\x61\xa5\x24\x04\x78\x1c\x84\xdc\xa8\x0b\xed\x61\xd4\x81\x68\xa4\x53\xd0\x9d\xe2\x9b\xb0\x7a\x43\x97\x63\xaf\xbb\xae\xd2\x31\xa5\xa1\x6e\x35\x92\xc9\xdc\x17\x56\x89\x2d\xf1\xc2\x44\xff\x48\x99\xa0\x1c\xdd\xe6\x2a\x8c\xc6\xc5\xa1\xa9\x47\x41\x67\xcb\x73\xc7\x6a\x39\xbe\xc6\x3e\x10\xbc\xbc\x19\xa3\x5b\x9b\x83\x12\x05\xe6\x0a\x8a\x59\x7a\xee\x64\x01\xb8\xb6\x52\xd5\xaa\x9a\x8e\x4a\xbd\x4f\x1f\x69\xaf\xc7\x40\x18\xa4\x06\xda\x31\xa0\x9a\x69\x0b\x68\x21\x6c\x22\xa4\x79\x62\x21\x6b\xf2\x8f\x55\xe1\x65\x92\x96\xb8\x0d\x21\x9a\xc4\x8d\x07\xf5\x70\x95\x71\xda\x2a\x98\x03\xed\x92\x86\x11\x05\xf0\x6b\x76\x50\x9b\xd5\x3c\x6f\x71\xd1\xbb\x33\x75\xb0\xea\x69\x2b\x8c\xe8\xd3\x05\x30\x0e\x52\x99\x89\xe7\xa5\x54\x70\xb9\xda\xbe\xe4\x38\x4f\xbb\x07\x49\x11\xc7\x33\x9e\x61\x3e\x85\x3b\x2f\xaf\x48\x2d\x7b\x41\x2f\x6e\x91\xc8\xde\xfe\x67\xc3\x64\x67\xaf\xe8\xce\xd4\x2d\x68\x25\x11\xad\xc7\x50\x7c\x64\x33\xc7\xe7\x6d\xb4\x4b\x46\xfe\xe5\x9c\xb0\x8e\xd0\x5f\x0a\x2d\x69\x2a\x96\xcb\xb5\x15\x7d\x70\x03\x1d\xd6\xe9\xd4\x0b\x94\x45\x9d\xfa\x47\x64\x10\xa5\x42\x3c\x8a\x3b\x3d\x72\x9b\x5a\x14\x95\x93\x36\x1b\xd6\x95\xff\x90\x09\xc9\x3e\x0a\xcb\x62\x41\x01\xb8\x14\x75\xcc\xe8\x3a\x1b\x57\x76\x26\xe3\xcb\x08\x00\x38\xf5\xaa\x06\xb4\x9c\xea\xb7\x4c\x53\x6a\x74\x28\xeb\x1c\x9b\xa0\xe4\xcd\x1a\x33\x7d\x14\xcb\x9e\xc2\xb5\x3c\x47\x8b\x75\x3e\x91\x09\xa8\x03\x04\xf2\xe6\xc3\x5c\x6a\x40\xa1\xa6\x51\x60\x10\x1d\xcd\xc6\x13\x68\x29\x35\xb4\xbb\xcd\xbf\x28\xa4\x6c\xd8\x7b\x1c\xaf\xbd\x09\x43\x50\xfc\xf3\xf1\xb9\x6a\x5e\x54\x72\x54\x43\x32\x6d\x8a\xdd\x8d\xd2\x06\x7c\xc0\x4b\x43\x1b\x90\x22\xb9\x3a\x01\xc3\x46\xbe\x3d\x89\x5d\xd6\x96\xda\x73\xc8\xe0\xb7\xa1\xf9\x80\x48\x6e\x81\xa9\x72\xd0\x10\xbc\x59\xa2\xea\xb2\x5c\xfc\x1f\x03\x47\x74\x11\x00\xf9\x5b\xfd\x8c\x12\x19\x79\x7f\xe2\x24\xf3\x74\x67\xd3\x57\x98\x1a\x2b\x6f\x03\x88\x10\x94\xdd\xb2\x7d\x9e\x90\xfb\xe5\x12\xe9\x6b\x34\xfb\xde\x3a\x82\x4b\x6a\x67\x07\x73\xcc\x58\xff\xb0\x61\xf0\x4e\x3a\xfe\xb2\xfd\x7d\x80\x46\x10\x0e\xa7\x5a\x01\x9a\xd2\x08\xc1\x32\x1f\x51\x7b\xa8\x52\x9d\x15\x1a\x5b\x4e\x26\x4d\x04\xf7\x6a\xb2\x34\x5d\x33\x51\x3a\xea\x0a\x73\x9c\xd7\xcb\xd7\x74\x1f\xfc\x87\xcb\x70\x49\xbf\x56\x5b\x11\x68\x9a\x6f\x81\x35\xb0\x7b\xe4\x7f\xe7\xf8\x3b\x87\x7f\x06\xad\x64\x0d\x97\xb7\x7f\x2e\xf2\xf1\x0a\xf1\x10\x23\x3b\x76\xc9\x45\x60\x5d\x87\x52\x30\x94\xeb\xd3\xcc\xec\x29\xc2\x7e\x9e\xca\xb9\x1c\xae\xe5\x7d\x5c\xc8\x9c\x20\xd8\xad\xfc\x3c\x8e\x5b\x00\xec\xcd\xa9\x91\x56\x5a\xc0\x02\x99\x1f\x5a\x3b\x75\xfc\xfd\x1d\x43\xf4\x72\x12\xf2\xf8\x2e\xe5\xf0\xbe\x9c\x2f\x33\xbb\xbc\x01\x01\xe4\x6e\x50\x6f\xeb\xc9\x56\x04\x2e\xf7\x8e\xc8\x49\x58\x89\x2b\x99\x9c\xa6\x41\x97\xd8\xf0\x87\x4a\x12\x8f\x72\xf1\xf3\xd2\x47\x03\x5c\xfb\x81\x5d\x47\x5c\xea\x67\x25\xdd\x6e\x63\x24\x83\x40\xe0\x4b\xbf\xd7\x82\x0f\xae\xf0\x8c\x44\xc5\x51\x57\x43\xc2\x65\x0b\xc3\x27\x22\x5f\x72\x46\x5a\xd2\x2f\x7d\x3f\xdd\xfc\xba\x59\x34\x47\x9e\x05\xcb\x68\x27\xad\xf6\xb4\x05\xef\x65\x86\x44\x8c\x4e\xf5\x6e\x25\x9a\x59\x47\x89\x4c\x88\x13\x91\x88\x00\x25\x13\x86\x0a\x9f\x6a\x6e\x90\x7e\x11\x8a\xa6\x49\x17\x92\xb9\x0e\x39\xd0\x95\x00\x2b\x49\x8d\x12\x2b\x2b\xd0\x9f\xd6\x8d\xfd\xf4\x08\xb4\xc3\xed\x7f\x5f\xae\x71\xda\x49\xa7\x5b\xb1\x32\xcd\x77\x33\x65\x74\xd8\x7f\x0f\xf5\x04\x00\xb1\xc3\x6d\xf5\xf2\x2f\xa7\x67\xb5\xf4\xa3\x26\xae\x9b\xec\x21\x54\xa9\x83\x07\x33\xb9\xa4\x42\xaf\x1c\x50\xc0\x64\xa8\xed\x32\x90\xe1\xb5\x68\x57\xfd\x3d\x4c\x72\x51\x5f\xe6\x76\xe1\x79\xfa\x58\xa3\x0a\x0e\xe3\x5b\x70\x43\x04\xdb\x74\x0d\xd8\x07\xbe\xc1\xe7\x58\xd9\xaf\x97\x55\x3c\x34\xa0\xdc\xba\x91\x8c\x82\x9a\x36\xe5\x0b\x2a\x71\xdc\xed\x7b\x3b\xc6\x4c\xee\xb9\x97\x83\xda\xe0\xf5\x30\x30\x52\x69\x78\xd2\x3b\xb7\x94\x11\x39\xc4\xa4\xb6\xfc\xf7\x13\x3b\x74\x0b\x18\x81\x18\x03\x7b\x9c\x77\x57\xe7\xe5\xa7\x76\xa5\xcb\xe6\x85\x6d\xde\x2d\xd8\xf0\x4e\xf3\xb2\xf1\xb5\x6b\xdf\xbb\x9f\xb9\x32\x87\x5e\x53\xe6\xb6\x71\xe3\xdf\x07\x15\xd0\x69\xe4\x0a\xfe\xe1\x31\xca\x20\x36\x07\x04\x60\xce\x29\x0c\xba\xd2\x89\x78\x7c\x4a\x0c\x66\x72\xc3\xdf\xc8\xcd\x67\x2e\x07\x00\xed\xf3\xa7\xf3\x00\xd8\x6f\xdc\xd2\x7f\xb7\x6f\xf2\x60\x9d\x00\x94\x20\xea\x33\x10\x77\x42\x5e\x96\x16\x15\xda\xa4\x70\x43\xaa\xce\xc0\x56\x0b\x56\xef\xf3\xa3\x46\x1c\x75\xac\x7c\x65\x0c\xe4\x50\x99\xd4\xea\x37\x03\x71\x23\xb7\x63\xa0\x6d\x2c\x2d\xfb\x5e\x5e\x05\x8f\xfe\x49\xd9\x83\xfb\xa6\x54\x39\x70\x8e\x5c\x03\xd9\xa2\xc9\xc0\xdd\xde\x16\xc8\x49\xbd\xb5\xef\x81\xd5\x45\xba\x1d\x1e\xd0\x04\x21\x89\x22\x2b\x57\x54\x0d\x1b\x4c\x36\xe8\x4a\x54\xf2\x84\x6c\x97\x6c\x74\xcd\x46\xc3\x30\xee\xf2\x26\xd8\x3e\xbb\x4d\xfc\x49\xc6\xdf\x72\x30\x66\xcb\x53\x2a\x5f\xf1\xdc\x6c\xb3\xed\x23\x91\xcb\xbb\x85\x01\xa0\x9f\x47\x87\xa3\x1b\x1b\x3c\xc6\xd1\xb7\x43\xe8\xa4\xb7\xc9\x9a\x7a\x17\xc1\xac\x29\xa5\x46\x79\xe7\x9e\x3b\xcf\x01\xd0\xb3\xde\x56\xef\x33\x55\xb3\x5d\x82\x83\xc3\xb9\x13\x91\x2c\x31\xd5\xa0\x5a\x66\x85\xe3\x39\x0a\x93\x70\x3b\xc6\xa3\xa3\x4f\xad\x12\x22\x64\xf0\x8a\xc3\xf6\x3a\x61\xc3\xd6\x15\x15\xe5\x50\xd9\x4d\x6f\x83\xc2\x44\xbc\xd5\xe2\x19\x53\xba\x38\xef\x4f\xe1\xdd\xb3\xf8\xf8\x07\x9a\x76\x3e\x61\xa1\xd0\xbc\xab\xe3\x7a\xbf\xe7\xf6\xda\xc6\x96\x2e\x0c\x17\xde\x7b\x8e\x31\x39\x90\x6b\xd6\x88\xec\xd3\x5c\x41\xc3\x31\x96\x47\xf3\xe2\xad\xda\x84\xd0\x0b\x0d\xa9\xd1\x1d\x6a\x55\x3e\x06\x91\x80\x22\xf3\xdc\xd4\xd1\x94\x2e\xab\x90\x23\x2f\x71\x4c\x70\x0d\x23\xff\xea\x54\xba\xbf\xb0\x62\xee\xa7\xfe\x3a\x8d\x65\x4f\x9d\xa7\x73\x64\xad\x1e\x73\xbc\xcc\xfa\x5b\x7b\xf4\x7c\x31\x3d\xd2\x4f\x7a\x27\xaa\xaa\xf1\x30\x36\x9a\xac\xc7\x96\xa5\x8a\xb7\xc8\x61\xb1\x7c\x88\xb9\x44\xa5\x27\x71\x1d\x27\x34\x0a\x6f\x6a\xf9\x3c\xca\x09\x1c\x7a\xa4\xe3\xf1\xfb\x52\x39\x88\x5c\x32\xdc\xbe\xe7\x51\x04\x78\x71\xff\xc9\x71\x9f\xab\xd1\xb6\x1c\xa1\xb4\x6a\x4d\x5f\x2f\x81\x99\x19\xab\x8d\x65\x9f\x27\xc8\x86\xe4\xc9\x2d\x1c\x48\xff\xf4\x74\x2e\x20\xc4\xa9\xb2\x8b\x43\xd6\xfc\x56\xb9\x98\xfc\x65\x70\xda\x6d\x01\x52\xde\xa8\x95\xa2\x6b\xdf\x34\xb8\xed\x5c\x32\xdc\x11\xda\xbc\xd8\xd1\xe5\x91\xd3\x9f\x53\x67\xe1\x63\x54\xc7\xe5\x61\x16\x1f\x10\x70\xe7\xee\x33\x9e\x5d\x03\xcd\x4d\x2a\x8e\xa0\x44\x05\x62\xa3\xc7\xda\x37\xa2\x3a\x87\x68\x79\xf4\xb2\x44\xf3\x28\xdb\xc2\xbb\xdb\x38\xb1\xc3\x2a\xe7\xcd\x9d\xa4\xf6\xf2\x61\x28\x27\xb3\x82\x4c\x17\xca\x72\x6d\x68\x9b\x70\xd3\x7b\x4f\x87\x42\xe6\x4d\xe5\x24\x67\x8c\x25\x8c\x2f\x96\x6f\xb7\xed\x6b\xb6\xfd\x99\x1d\x00\x30\x74\x60\xc1\x9a\xca\xd3\x42\x3c\x86\x98\x22\x3a\xc7\x31\x14\x86\x6c\x5e\x85\xd7\x6a\x6b\xcf\x16\xe9\x4a\x30\xf5\x37\x7f\x6e\x7a\x00\xaa\xc2\x55\xff\x77\xe4\x96\xae\x42\x33\x43\x6c\x64\xa5\xc1\x52\xc8\x7b\x07\xc6\x18\x4a\x0f\x91\x25\x1e\x24\x9f\x1c\x25\x5f\x75\x17\x36\x2f\xee\x20\x42\xb9\xc9\x90\xc3\xc1\xd0\xbe\xfd\x53\xfe\x56\x99\xa9\x9c\x84\xe5\xa9\xef\xca\x92\x7d\xcf\xf7\x68\xc4\xf4\x53\xa9\xf8\x9f\x82\x41\x41\x6c\xd3\xb9\xef\x64\x7e\x28\xf7\xc0\x76\xea\xee\x36\xfa\x60\x55\x41\xbc\x95\x7c\xf5\x1d\xe5\x24\x38\x8e\x95\x82\x0f\x5a\x73\xa4\xc9\x6f\x95\x6e\xc8\x97\xd5\xce\xa2\x64\xb2\x07\x1c\xfb\x5e\x21\xb9\x82\x4b\x5b\xd1\x75\x2b\x61\x65\x22\x6c\x8a\x6c\x14\xe3\x2a\xec\x8c\xe3\x96\x6c\xe3\xaa\x56\x27\xb0\x3b\x2f\xe5\x15\x25\xcd\x06\x2c\xbc\xe6\xed\xe3\x52\xe1\xb8\x9d\x25\xdc\xca\x45\xcf\x1d\x09\x70\x88\x9a\xde\xa4\x0c\x18\x51\xf8\x18\xab\x4d\x11\x2a\x37\x8f\x04\x61\xae\x73\xba\xe6\xbb\xdc\x74\x42\x2a\x3e\x4e\x67\xe2\x4a\x8d\xb4\x12\xc4\x29\xce\xe1\x50\xdc\xbc\x99\xd1\xaa\x82\x61\x88\xb2\x78\xc8\x4b\xae\xfe\x22\x08\xe1\xdc\x7e\xae\x29\x73\x57\xa2\xec\x9e\x94\x6c\xdd\x3d\x5d\x26\x35\x66\x73\xcb\xb6\x9f\xb3\xd8\x31\x39\x4f\x65\xa3\x73\x2e\x04\xa2\xab\x90\x29\x58\xf0\x80\x96\x89\xa5\xd8\xae\xa8\x18\x0f\x1b\x5f\x8a\x08\xeb\x8e\x6f\xb9\x36\x6c\x6a\x46\x7c\x23\xdb\x17\xc2\x38\x02\xef\xa5\xb7\xd4\xb7\x94\x3b\x91\xb3\xc6\x56\x47\x99\xb9\x73\x23\x3b\x9c\xf4\x63\xc2\xf2\x08\x4f\x1a\x18\xc3\x97\x28\x10\x21\xaa\x3d\xb7\xcd\xde\x63\x44\x81\xfb\x6c\xb6\xdf\x64\xcc\x5e\x5a\x08\x62\x6a\xd8\x39\x87\x7d\x26\xb7\xeb\x19\x27\xf4\xb2\xe6\x67\x16\x2a\x17\xc6\x43\x56\xd7\x82\xb6\xfa\x91\x05\x82\x14\xca\x45\xe7\xf3\x19\x86\xb1\x9d\x6a\xa4\x7a\x1c\xab\xf9\x13\xa2\xd2\xa9\x95\x0b\x78\x05\x34\xee\xcc\x42\x94\xac\x77\xc4\x74\xe0\xb5\x25\xcf\xfa\x5b\x76\xb2\x86\x33\x5b\x30\x97\xdf\x8c\xe8\x37\x14\xb3\x2f\xfe\xb7\xad\x76\x1d\xfd\x72\x1a\x27\xa6\x72\x11\x6d\x04\x66\x86\x80\xcd\x6c\x2e\xd2\xce\xf5\x61\xb5\xe8\x73\xad\x1d\x79\x38\x30\x9d\x4a\xf7\x5b\xd7\x69\xc7\x9b\xd3\xff\xa3\xd4\x05\x77\x59\x4c\x6f\xb0\xab\x0e\xd4\x3e\x9b\x53\x0a\x13\x94\xf5\x62\x58\x81\x47\x98\xd8\x19\x18\x78\xa9\x39\x05\xc8\xbb\x9e\xd7\x07\x24\xa7\x0e\xe6\x0e\x90\x6d\x8d\xc9\x4c\x2a\xbf\x27\x77\x80\xcf\xf2\x31\x35\x2e\x09\x4a\x65\xaa\x24\x1d\xe4\x32\x2e\xa6\x88\x74\xbb\x0f\xe4\x5d\x21\x5f\x78\x05\xeb\xfd\x4b\xf5\x55\x87\x7f\x0a\x71\xac\xf4\x7a\x09\x85\x79\xca\xce\x0c\x6c\x2b\xb1\x3a\x53\xbb\x91\xa9\xac\x10\x73\x36\x8d\xc2\xff\x16\x82\x09\x63\x58\x13\x6e\x6e\x96\x63\xc4\x1b\xa9\x81\x11\x5c\x80\xb1\xe9\xd9\x16\x16\x99\x22\x2b\x40\xf1\xd3\xba\x26\xb8\xf3\x3b\x8f\x18\x75\x8c\x61\x99\xb9\xf2\x14\x87\x7e\xbc\xa6\xb6\xfd\x26\x74\x50\xaf\xde\x03\x5d\x15\x35\x7a\x55\xd0\x62\x26\x05\x08\x28\x07\xb4\xf0\xbb\x52\xb0\xb1\xe3\xdf\x1c\xa4\xbb\x59\xb4\x29\x8c\x09\x4e\xc7\x2c\x7c\x2f\x0a\x56\x0a\x44\x73\xd9\x3f\x65\xcb\x85\xb9\x67\x89\x5c\x31\xc0\x7d\x2c\x66\xa9\x52\x67\x38\x1a\x59\xd5\x4c\xf2\x67\x54\x8c\x7a\x05\x15\x40\xd8\xd1\x2c\x4a\x69\xd9\x2b\x25\x30\x07\xdb\x6b\xd4\x39\x3a\xc0\xb5\xc9\x50\xb8\xcd\x4e\xbd\x40\xe1\x86\x95\xd3\x90\xce\x2a\xe0\x36\x3a\x3f\x38\x17\xca\x4b\xdc\xe4\xbe\xbd\xbc\x55\xd7\x3c\x4c\xba\x85\x92\x36\xfd\x74\xb7\xda\x03\xa3\xac\x9b\xab\x06\x8c\xe4\x95\x29\x30\x01\xb9\x13\x63\x3e\x29\x44\xf1\xbf\x66\x93\xdd\x53\x30\x57\xab\xf2\x0b\x9a\x9b\x12\x13\x2c\x39\x50\x27\x5c\x5a\x77\xb9\x05\x42\x24\x8e\xca\x4d\xf9\x4b\xc2\xbd\x3f\xaa\x7e\x32\x0d\x64\x24\x9a\x9a\x34\x32\x2a\x1f\xcd\xb7\x5b\x5f\x09\x4a\x50\xb6\xa8\x84\x68\x54\xf5\x5e\x0f\x6a\x7c\xa7\x29\xc2\x43\x28\x3c\xe9\xf2\x6e\x4e\x4c\xa5\x9d\xdd\x0a\x7a\x7d\xa4\x0a\x51\xd5\x0c\xbc\x99\xa2\xfa\x6a\xc2\x68\xb8\x49\xd4\x70\x61\xf0\xd1\xf4\x07\xdd\x83\x14\x73\xb6\x74\x01\x4b\x4a\x5d\x70\x93\xd0\xbb\x9a\xd6\xf2\xb9\xf3\x7c\x49\x5d\x84\x87\x18\x93\xef\x21\x33\xc3\x78\x4b\x81\x04\xc3\x65\x4d\x89\xcd\x03\xc0\x54\xe9\x6c\x42\x6e\xb9\x6c\xbc\x43\xfd\x18\x29\x52\xbc\xad\x73\x04\x79\xf8\xde\x27\x58\x89\x29\x55\x92\x62\x84\x95\xbf\x31\x1e\xe9\xef\x5a\xa1\x4b\x47\x3d\x21\x76\x41\x02\x6a\x71\x10\x7d\xb9\xda\xdc\xa6\x6c\xbc\x5b\xe2\x9c\x3f\x44\x5c\xb8\xc2\x48\x13\x5d\xcf\x52\x84\x19\xb0\x3d\x60\xcf\xe2\x6f\xd4\xbd\x6a\x48\xba\xf7\x36\x26\xc0\x57\xe7\x3d\x07\x1f\x51\xc5\x95\x99\xe4\x2b\xc6\x87\x73\x51\x74\x78\x5c\x0d\x72\xe8\x98\x54\x80\x77\x6b\xc5\x3d\x4c\x1f\x35\x3c\x0e\x5e\x27\x00\xab\x61\xce\x1f\xe6\x40\x31\x3d\xcf\x9f\xf0\x8d\x25\x6a\xe3\x54\x78\xca\x13\x0d\x1f\xa4\xb6\xc2\xcb\xbc\xec\x5b\x76\x4a\xb9\x24\x24\x4f\xa8\xd6\xbc\x83\x4b\x27\x33\x9b\x09\x3e\x35\xf6\xb0\x01\x7f\x72\xb2\x9a\xc2\x4c\xe4\xaf\xf8\xbc\x40\x4f\x0d\xe5\x70\x3b\x5c\x3c\x2c\xa7\x5a\x3d\xbe\x73\xaf\x94\xc4\x72\xcf\xcd\xc2\xe9\x94\xfb\x8e\x88\xcd\xc0\x23\x0b\x63\x95\x93\x3e\x87\x52\xfb\x10\xc9\x30\x5e\x3e\x7b\xc3\xb9\x4d\xde\xfb\x2e\x18\x3c\x2c\x41\xd7\x0f\x90\x38\x6e\xef\x9e\x68\x69\xef\xef\xe8\x76\x2f\xb6\x9f\xa1\xcf\x28\x7f\x98\x42\xf8\x65\x9c\xfc\x4d\x2b\xcb\xf0\x9e\x06\x87\xc4\xa4\x0a\x9a\xa9\x6d\x1e\xdb\x75\x17\x28\xb2\xfb\x93\x00\x30\x10\x63\xa2\x35\x8f\x9f\x06\x29\x4e\x19\x16\xf2\xb8\x83\x3e\x31\x8d\x15\x2b\x9b\x2d\x30\xd0\x4e\x6c\x2d\x4c\xce\x25\xec\x10\x5b\x4e\x62\x37\x04\x77\x55\x02\x9c\xf9\x79\x74\x6d\x79\xd0\x18\x24\xa5\x50\x92\xe1\xf0\xd2\x08\x72\x68\x79\xa1\xa0\x66\xde\x3f\x87\x47\xe5\x51\x91\x1e\x40\x98\x2f\x76\x04\x34\xaa\x30\xc4\x8a\x9a\x3e\x82\xb6\xb3\x09\x26\x16\x79\xea\xd5\x34\x7f\x45\x8f\xef\x50\x22\x60\x7b\xc1\xf2\x55\xbe\xd5\x4d\x3f\xef\xb4\x05\xd5\x61\x72\x64\x95\x69\xd1\xe7\xa3\xda\xbe\x8e\x7c\xeb\xf9\xee\xef\xe0\xfa\xc6\x36\x0d\x35\x2e\xd5\x0c\x93\x7d\x1c\x26\xc3\xff\x08\x41\xd4\x69\x3d\x80\x5b\x7c\x88\x3f\x11\x81\x4b\xb2\x94\x3c\x7f\xf3\xc3\xdb\x84\xde\xcf\xb6\x7a\x1f\x75\x68\x6e\xe2\x53\x83\x14\xdb\xa9\x84\xef\xfa\x79\xad\xea\x1e\xbd\x41\x79\x74\x80\xaf\x30\x55\xaa\x7b\xf8\x4a\xb1\x9d\xb1\x9e\x35\xe0\x42\xcd\xab\x7d\x7f\x52\xeb\xde\x6c\x5e\x91\xa1\xf3\xf8\x95\xa2\xc7\x8d\xfd\x73\x7f\x47\xf3\xc9\x7d\xc6\x97\x74\x97\x4e\x2f\xdf\x69\x3f\x3d\x63\xd1\xea\x58\x4e\xa0\x78\x58\xfc\xb2\x02\x86\xcb\xa6\x61\xe3\x7c\xbc\x53\x49\x0d\x9b\x26\x9b\x28\xf7\xcc\x3f\x23\x37\x51\xe7\x76\xf8\xcf\x29\x64\x9a\xa0\x8b\x6a\xdc\x99\x99\xea\x4a\xc1\x14\x0e\x95\x10\x63\x55\xd7\x41\x57\xcf\x54\x23\xe3\xfd\x8e\xf8\x09\xf9\xd2\xc3\x29\x9c\x95\xe5\xc3\xe9\x60\x61\x44\x41\xd5\x2a\xc7\x6c\x4a\xe2\xd2\x95\x53\xf3\x98\x6c\x08\xfe\xa0\xf0\xd1\xc3\x14\x28\x55\x05\x98\x43\x56\xb5\xf2\xfb\x24\x34\xc7\x1d\x04\x2b\x15\x0d\xae\x24\xca\xc9\x6f\xbc\xa0\x7d\xad\x2a\x16\x0b\x41\x4a\xc9\x3d\x20\xff\x01\x15\xd9\x04\x1d\xd9\xf2\x14\x30\x90\x1d\x7b\xd1\x1e\x8a\xbd\x80\x90\x91\xe6\x5b\xfc\x4e\x7b\xf2\xdc\x02\x76\x75\xae\xd1\x56\x32\x94\xeb\xde\x8f\x1a\x2b\x7f\x19\x73\x77\xb4\x45\xa9\x4a\xc0\xe8\xf8\x05\x9b\xb0\x36\x5e\x41\xef\xd7\x01\x8f\x49\x06\x91\x11\x82\x10\x0b\x48\x5f\x89\x84\x1b\x13\x79\x88\x06\x97\x93\x7f\xe4\xd2\x1e\xc7\x25\x83\xaf\x50\x51\xe2\xbd\xee\xa2\x35\x35\x34\xe9\x69\xea\x47\xdd\x20\x4e\x88\x9e\x55\x36\x8a\xba\x8c\x09\x22\x36\xc6\x1f\x13\x31\xe2\xce\x01\xb0\x66\xf6\xb1\x25\xf7\x82\xd5\x88\xf3\xf4\x8f\x8e\xf4\xbf\x5f\x70\xb0\x8f\xdb\xf5\x6f\x50\x78\x2b\x20\x19\x12\xc5\xfd\x35\x4b\x73\x22\x73\xae\x21\x61\x7a\x62\x3e\x18\xa1\x04\x90\xc5\x0a\xcf\x94\x21\xca\x51\x4d\x7d\xd5\x4b\x10\xaa\x0b\x7a\x2b\xe5\xe0\xe5\x10\xbf\x7c\x5c\xe3\x52\x12\x9a\xf0\x66\x46\xdf\x8f\x81\x62\x35\x2f\x6d\x27\x64\x01\x5e\xac\xe1\xfb\x35\x55\x44\x66\xae\x4c\xf3\xe8\x67\x94\xed\x36\x59\xa6\x1d\xfd\x55\x93\x50\xa6\x20\x97\x83\x85\x66\xed\xc9\x6f\x7b\x0f\xfd\x74\x1d\xb6\xe4\xa8\xb2\x86\xb6\x04\x68\x9d\x25\x91\xae\x98\xe7\xae\xef\x2b\x50\xc4\x54\x96\x5a\x26\x95\x83\x76\x92\x22\x01\xea\x0f\xb5\x27\x3e\x81\x81\xc6\xe9\xdd\x44\xd3\x62\xac\xb8\xb2\xfd\xcb\xdb\x88\x8e\x88\xed\xc7\x77\x28\x21\xa3\xb5\x7b\xc7\x6b\x55\x65\x33\x89\xd2\xd1\x0c\xc8\x17\xb5\x93\x6a\x04\x33\xb8\x72\x55\xb1\x23\x8f\xa4\xce\x8d\x4a\xb6\xc1\x20\xd6\x82\xd9\x7b\xeb\x06\xa5\xc5\x2c\x43\xa2\x50\x49\xc6\x09\xd0\x8e\x40\xa2\xd4\x5c\xed\x18\x3b\x96\x8c\xf6\x9a\xc1\xa1\xf8\x7e\x1f\xea\xfe\xcd\x9f\x83\xc2\xd1\x02\xaa\xa8\x4b\x66\xbd\x1a\x85\xc0\xf2\x4f\xe6\x40\x66\x57\x02\xd8\x9c\x00\x5e\x1e\xd9\x2f\xba\x99\xc8\x60\xfc\x24\xa2\x21\x00\xbd\x66\x32\x8f\x97\xdc\x3f\x36\x9c\x71\xdc\x73\xa3\xce\x0a\x63\xa6\x36\x4a\xf4\x2d\xb7\xaa\x9d\xb8\xec\x11\x0d\x69\xbd\xed\xd2\x85\xd3\x2d\x0f\x00\x87\xcb\x32\x46\xfa\x6d\xc8\x8e\xca\x11\xc4\x5a\xf8\x21\x42\xf7\xc3\xf8\xbb\xc7\x20\x70\xd0\x43\x55\x95\x0c\xff\x9d\x9e\x94\xeb\xe5\x57\xfd\x94\x8f\xfb\x26\xb9\x33\xd1\x0d\xd0\x7d\x2d\x80\x64\xe3\xaa\x9c\x7c\x55\x32\xe7\x6f\x82\x38\x94\xa7\x17\xf8\x1a\x2a\x4d\xab\x7a\x63\x7b\x96\x5f\xc3\x01\xf2\xec\xc9\xb0\xf0\xc7\x68\xb7\x06\xb7\x39\xba\xfe\x95\x0d\xb5\xb9\x57\x94\x78\x5b\x22\x9c\x9a\x55\xdd\x9f\xdc\x9f\x2f\x7b\x8e\x12\x0a\xd0\xe6\x52\x6a\x54\x63\x10\xea\xdf\xa7\x2a\x6c\xb2\x07\x54\x96\x22\x27\x0e\x86\x53\xcc\xb8\xe0\xd2\x54\x62\x99\x9a\x24\xe8\xf3\x72\x51\x12\x97\x2e\x1e\x8c\xe6\x5a\x73\x56\x9b\xf2\xec\x4a\x1b\x04\x3b\x5b\x0b\x25\xab\x10\xb0\xc8\x6a\x52\xf3\xd9\x47\x4f\x37\x46\x52\x33\x18\xf7\x10\x8f\x63\xf8\x19\x26\xde\xa7\x7d\x87\x56\x8e\x5e\xac\xec\x68\xe4\x7a\x59\x94\xbc\x5e\xdc\x53\xfc\x4f\x75\x8d\x1d\x37\x68\x51\x4c\x56\xdc\x7b\x18\xad\xe0\x38\xee\xcf\xbc\xe2\x1d\xbc\xd3\xa4\xc1\xde\xeb\xf2\xda\x7d\xb1\xab\x8b\x17\x03\x15\xf5\x0a\x88\x15\x49\xbb\x40\x5f\xd1\x21\xd1\x32\x66\x62\x25\xd5\xd9\x07\xe8\xa3\x31\xe6\x6c\x9f\x94\x1a\x56\x89\x03\x4d\x94\xa0\x1d\x2d\x3a\x3f\x19\xda\xf8\x3e\x0c\x2d\xd8\x4e\x13\xf1\x36\x75\xaa\x76\x4b\x11\x93\x99\x57\x55\xaa\x7a\x28\xfa\x64\xf7\x42\x66\x25\x4c\x5d\xd7\xbb\x8d\x91\x27\xf7\x31\xe0\x76\xe3\x28\xf7\x38\xbf\x86\x9b\xe8\xbd\x56\x49\xc8\x10\x92\xfb\xef\xcc\xc7\x77\xa7\x55\xd1\xc4\xa0\x03\x45\x1b\x50\x56\x2b\xe3\x0e\xcd\x1e\x96\xe5\x8c\x24\x46\xf8\xe7\x79\x7c\xb0\x66\xc8\x92\x68\x59\x50\x12\xe7\x35\x22\xc9\x5d\x7c\x8f\x25\xa9\x81\x81\x3c\x9b\x83\x91\x9e\x56\x76\x9e\x62\x70\x7f\xa3\xa5\x20\x29\xf0\xb1\x69\x42\x9e\xf7\x25\xe0\x5b\x0c\xd6\x26\xe8\x48\xee\x8a\x0b\xb9\x5a\x16\x3c\xc3\xa1\x56\x2e\xb7\x5e\x85\x71\x8f\x07\xa1\x4b\x6e\xeb\x00\x04\x49\x0a\xe5\x5c\x91\x34\xed\x55\xd2\x57\xce\x68\xe3\xfc\x8f\xce\xf2\x70\x06\x3a\xa4\xb6\x38\xf8\x70\x32\x7a\x13\xed\x0c\x7e\x5f\x0f\x9b\x37\x3e\x90\x0a\x39\x8f\xea\x89\xe8\x0b\xc2\xec\x22\x3e\x4b\xc9\x99\x0e\xdd\xaa\xfd\x1a\x8a\x12\xf0\x91\xf5\x7c\xe2\x3e\x32\x43\xbc\xf7\xce\xb2\x4a\xd6\xcb\x7c\x09\x2a\x80\x6b\x38\x88\x75\xdc\x4a\xdd\xc7\xc3\x90\x77\x58\xf9\x71\x1e\x32\xdf\xf5\xd7\x40\x94\x61\xb9\xbc\x63\x8f\x1c\x6d\x5b\xc9\xbb\xf9\x70\xef\x7a\xd9\xc1\x80\x01\xca\x05\xd1\x83\x4a\x6f\x49\xae\xdd\xdb\x2b\x72\x70\x44\xea\xee\x47\x39\xf5\x3c\x42\xa9\x1f\x9a\xee\xce\xf9\x6b\x5d\xd1\x14\xe5\x92\x94\x5c\x66\x49\x8e\x77\xed\x60\x69\x9f\x4b\xa2\x33\x59\xba\x97\x72\x0d\xea\x76\x94\x04\x83\x88\x5b\x32\x46\xa4\xf9\xba\xcd\x56\x4c\x7a\xb3\x46\x85\xf9\x5e\x66\x82\x21\x92\x56\x4c\x50\xf8\x26\xba\xfa\x3d\x7e\xce\x27\xdf\xcf\xc7\x49\xc8\x3b\x84\x95\x06\x05\x27\xb5\x65\xdd\x4d\x2d\xdf\x95\xf2\x2f\xea\x13\xaa\xb3\xa9\x4d\x74\xfb\xd6\x75\x60\x3e\x34\x6c\xee\x83\x00\x00\x23\x24\x12\x2d\x78\x88\xab\x40\x19\x7e\x44\xff\xe7\xc0\x71\xa9\x96\x28\xfd\x6c\x0c\x9e\xfd\xd8\x72\xcc\xde\xdb\xe1\x97\xbe\x29\xd4\x48\x0d\xd9\xc1\xa2\xac\x93\x3c\xb5\xd6\xab\x79\x52\x72\x21\x62\x24\xf7\x3a\x2b\x90\xe5\x75\xd9\x34\x5f\x00\xa6\xa3\x96\x98\xe5\x8e\x84\x56\x77\x87\x67\x8c\x56\xdf\xbc\xc0\xb6\x5c\xc9\x19\x20\xbe\x45\x74\x79\x3a\xa4\x94\x74\xe6\x54\x9c\xd1\x25\x0f\x58\xa0\x73\x2f\x99\x3c\x56\x3e\x0a\x42\x4b\x64\x41\xa6\x74\x85\xf0\xac\x03\x0e\xe6\x20\x61\x50\x41\xa7\x01\x77\x55\x26\x09\x99\xac\x56\x0b\x1a\x6b\xdf\x70\x05\x88\xc3\xf8\x04\x18\x61\x1e\x6e\xb1\x22\xb2\x29\x54\xc9\xe4\xc2\x79\x52\x39\x62\x42\x4f\x92\x1c\x05\x56\xa3\x8b\xb8\x95\x4b\x15\xc3\x5c\xd2\x6b\x34\x29\x69\x29\x51\x06\x56\x1d\x5a\xcf\xbd\xe1\xb9\x7b\xaf\x43\x87\x52\x69\xbd\x82\xd8\x3b\x9d\x4f\xee\x13\x24\x40\xf5\x13\x9b\x71\x3e\xb2\x01\xab\x2c\x68\x0b\x12\x79\xf9\xfb\x0f\x51\xf9\x83\x01\x30\xa5\x4a\xe9\x5c\x57\x5e\xe0\x50\x29\x1a\x23\x8a\x49\xe1\xf1\xe6\x4c\xa7\xc2\x61\x81\xe6\xb8\xdf\xab\x6e\xad\x70\x1c\xc6\x43\x96\xa3\xbd\x1a\xa7\x61\xaa\x0b\x6c\x91\xfa\x30\x8c\xa9\xa5\x10\x14\x09\xb4\xd4\x01\x2f\x77\x6e\x61\xd4\x1b\xf9\x51\x12\xb7\x15\x15\x62\x85\xad\x95\x6b\x86\xb2\xbc\x49\x77\x7c\x71\x63\x10\x6c\x40\x10\x84\xc4\x0f\xed\xae\x07\xd9\x68\x37\x26\x56\x02\x84\x60\x0e\xf5\xc7\x05\x23\x82\xa0\x96\xed\x33\x82\x61\x05\x7b\xb9\xc5\xa5\x69\x93\x39\x73\x01\x1b\x2a\xd5\xe2\x76\xb6\xd5\xc9\x95\x8e\x69\xfe\xeb\xfb\x65\x88\x3e\xa8\x97\xb7\x4b\xd6\x1a\x4b\x18\x85\x8d\xce\xbe\xbb\x60\x4e\x76\x91\xbe\x83\x75\x87\xe2\x25\x09\x3e\x49\xae\x81\x9e\x01\x86\x41\x0d\x8b\x77\x29\x0a\x2a\x78\x36\x9b\x1c\x18\x3d\xc4\x68\xa9\xdf\xca\xc0\x76\xb6\xf1\x0f\xb4\x67\xa3\x51\x73\x39\x0c\x20\x08\x70\x53\xee\xd5\xef\x36\xdd\x08\xed\x61\xc5\x4f\x58\x59\x0c\x42\xc0\x40\xb8\xe3\x8f\xfb\x4e\x81\x2c\x81\x5e\xc7\x1c\x5a\xdb\xa4\x55\x6d\x4e\xce\x6c\x36\x6c\x02\x37\x1c\xb6\xf5\xbb\xe5\x80\xee\x75\xdb\x4d\x7d\xf4\xe3\x09\x53\x8b\xd3\xb6\xd9\xce\xe8\x11\x68\xa9\x6b\x86\x85\x73\x74\x9a\x07\xdb\x12\x41\x13\x21\xd4\x0e\x42\x11\x8c\xeb\x6e\xab\x72\x9d\xa1\xcd\xdd\x1b\x94\x0c\x82\xb2\xbe\xed\x92\x8a\xc4\x0e\x4c\xa5\x80\x6e\xac\xf6\x49\x0b\xe5\x12\x81\x42\x57\xe3\xcd\x12\x3b\xcf\x4e\xd9\x58\xf5\xbc\xfa\xa0\x26\xbe\x38\x6a\xc4\x02\x42\x34\xd6\xd5\x41\x39\xa4\x88\x5a\xa2\xa0\x54\xb7\xbf\x7c\x16\x8f\x1c\x7e\xa5\xe3\x31\x79\x10\x5e\x22\x8f\x43\xb0\xd8\x98\xa8\x49\x15\xab\x71\xb5\x2b\x81\xa6\xb1\x18\x6f\xc3\xcb\xf4\x34\x07\x9f\x91\x59\x8b\x10\xd5\x83\x39\xc6\xd0\x57\xd3\xd3\x71\x6b\x55\x68\xca\x63\x41\xc9\x5f\xb9\xa2\x85\x7c\x61\x97\x60\x47\xe9\xe1\x51\x33\xd7\x7d\xf2\x3a\xc7\xce\x17\xaf\x57\xcb\xf1\xab\xf9\x6d\x14\x2f\x2e\x1c\x34\xde\xfd\x0e\xfa\x49\xa6\x5a\x25\x7c\x9f\xd5\x74\x15\x32\xe1\x5e\xc2\xa1\x41\x9f\x98\x98\x9e\xa6\xb4\xeb\xf8\x13\x0e\x5c\x9f\xe2\x26\xfc\xca\x36\x76\x06\x84\x7f\xcb\xce\x6c\x3d\x8d\xef\xa3\x76\xbe\x6f\x81\x1a\x6f\xf9\xdf\x54\x65\x6f\x36\x29\x63\x73\x49\x74\x84\x45\x51\x8e\xcb\x83\x7b\xcb\x3f\x01\xaa\x00\xe5\x82\x91\xbc\x24\x43\xd9\x87\x6d\xa9\x7b\xff\x63\xd8\x5b\xc7\x29\xb9\x8f\x6e\xb4\x2e\x25\xa5\x9d\x85\x4a\x9e\xf7\x4f\x79\x63\x93\x79\xf4\x59\x7e\x49\x33\xca\xd8\xf6\x63\x67\xc1\x4b\x5e\x3a\x7a\x78\x7c\x25\xb4\xf2\x42\xf1\x92\xbc\xac\x24\x81\xa6\x29\x78\x02\x93\x54\xbf\xa6\x51\xae\x45\xa1\x16\x59\xea\x52\xe5\xa2\xe5\x0f\xc6\xe2\xe7\xd2\x8c\xf9\x29\x05\xb8\x57\xa5\xc6\xba\x82\xb8\x32\xcc\xfe\x45\xa0\xef\x77\x60\xf6\xb9\x37\x7c\xd6\x30\x02\x1b\x02\xa3\x82\xb8\xdc\x63\xdc\xa2\x12\xb6\xb1\x85\x02\xb4\xbc\xd4\xcf\x67\xac\xbe\xf7\x93\x06\x6d\xdb\x64\x4c\xc0\xb8\x49\x4b\x81\xd5\xec\x46\xf2\x05\x9a\x2b\x82\x9c\x03\x45\x00\xde\xda\x2d\x4a\x5b\x05\xe3\xb0\xe2\x08\x2d\x97\x9b\x66\x6d\x15\x96\x03\x94\x06\x53\x5a\x62\xd4\x95\xa3\xf6\xc7\xa9\x92\xd7\x6d\x33\x29\x06\x9c\x6e\x12\xf4\xff\x55\x05\xd4\x1e\x1e\xa6\xa1\x2a\xcc\xfa\xd8\x02\x47\xfb\x85\xd1\xc2\xfd\x3e\x2a\x4e\x44\xcc\x86\x3b\x05\x2e\x4b\x87\x6e\x1f\x02\xf1\xa9\xcb\xde\x66\x04\x23\x9b\x93\xa2\xbf\x17\x32\x30\xa8\xc3\x8f\xba\x6c\xbf\x44\xb3\xb1\x77\x0c\x24\x90\x35\x66\x2d\x79\x8d\xcd\xb5\x25\xd4\xd5\x1d\xb4\xa0\x76\xa9\x66\x8c\x16\x60\x2b\xd0\x3f\xa7\x8d\x81\x01\x4c\xf6\xae\x35\xd3\x84\xe8\x02\xc7\x60\x9b\xe6\xfd\xb1\x56\x2d\x4c\xa5\xdc\x2e\x0c\x42\x71\x03\xb6\x8d\x7e\x9a\x77\x3b\xe3\xd9\xa1\x77\x2c\x85\x0a\x78\x04\xaa\x9b\x31\xd2\xc9\x9b\x89\x75\x28\x39\x1c\x75\x79\x09\x8a\x6d\x76\x53\xcc\x05\x88\x90\xe9\x30\x1d\xa0\xdd\x31\xec\x8d\x71\x7f\xe7\xcc\x1e\x46\x60\x01\x6f\xe6\x96\xa9\x11\x78\x4e\x8f\x24\x2a\xb6\x8a\xfb\xf3\x30\x6e\xe4\x5c\xce\x9a\x9c\x9f\x0b\x7a\xec\x83\x1b\x83\xe5\x45\xcc\x1f\xe5\x90\x4e\x6f\x83\x1a\x1e\x1a\x1a\x18\x86\xe0\x67\x57\xed\x54\xbe\x3c\xc4\x95\x69\x18\xb3\xf9\x0e\x0b\xeb\xb7\x49\x23\x34\x20\x52\x8e\x6c\x94\x71\x17\x77\x4a\x3a\xdf\x2b\x50\x37\xa7\x98\xc3\x65\xb5\x02\xb3\xe0\x90\x8c\x04\xd7\xc1\x6f\xf9\x54\xd7\x9a\x85\x65\xcc\xfe\x04\xdd\x49\xe7\x3d\xb5\x04\x2b\x02\x11\x69\xb2\x23\x2a\x04\x70\x8c\x36\x84\x03\xf5\x6e\x37\xf3\x9c\xa7\xc7\xc8\xf1\xd6\x96\x67\x72\x71\xfd\xa1\x6c\x71\x1c\x20\x4b\x1e\x45\xab\xa1\xd9\x92\xf3\x65\x4b\xfc\xaa\xec\x86\xf0\xc7\x4d\x7c\xb5\xaa\x08\x7c\x9f\x7c\x1d\x6e\xb5\xa7\x03\x49\x7d\xb7\x3f\x56\x7e\xcd\xab\x69\x79\xa6\xd3\x38\x7f\xd6\xd1\xb2\xe6\x5c\xc5\x34\xfd\xe5\xac\xca\x71\x65\x60\x1c\x7d\x64\x80\x19\xdb\xa0\xad\x94\x03\x9a\x66\x11\x9e\x4a\x6e\x47\x08\x33\x2f\xe7\x56\x59\x6d\x9a\x87\x9b\xaf\xba\xf5\x7f\x18\x3b\xf3\xc2\xe4\x90\xe1\x73\x1e\x08\xee\x27\x5a\xd1\x93\xc5\xed\x69\x33\x41\xe2\xd7\xf4\xbc\x29\xdb\xcb\x87\x93\x10\xe5\x4b\x3f\xb9\xea\xde\xfe\xc8\x0b\x0e\xd0\x92\x7b\xe8\xaa\xde\xc7\x29\xa0\x56\x32\xda\x61\x40\x25\xf6\xf5\x08\xfc\xed\x70\x6a\xe8\x4c\x04\x82\x0d\xc4\x61\xec\x44\x3f\x89\x5e\x02\x64\x8f\xd0\xa7\xda\x82\xa1\x77\xdf\x20\xf9\xc5\xc7\x72\x0c\x07\xee\x79\xa2\xf3\x81\x03\x9d\xdc\x39\xca\x82\x5f\xe7\x9d\x82\x68\x0a\x7d\xb0\x53\xe5\xeb\xf6\x32\x35\x53\xe8\xe3\x57\xd4\xaf\x23\xd4\xe2\x15\xf7\xa8\xd6\xc8\xbc\x74\xa2\xa6\xd1\x70\x33\x4d\xe1\xc6\xac\xb4\x6f\xab\x51\x64\x27\x85\x9f\x71\x2f\x11\x7b\x39\xae\xb9\x87\x65\x87\x2e\xb5\x6d\x59\x87\xab\xe3\x37\x41\xb7\xab\xba\x7e\x8f\x9e\x6d\x95\x2c\xb5\x82\x9f\xc9\xbc\x3b\x1b\x87\xd5\x52\xa2\x84\xcf\xc5\x7a\x0d\x3d\x2a\xdd\xa0\x5d\x34\xf6\x94\xe1\x31\x9d\xfb\x95\x6e\x96\xec\xc0\x57\x14\x54\xb8\x77\x66\x5d\xca\x2d\xd1\x75\x17\xca\xa7\x39\xa7\xa7\xc2\x99\x52\xcb\x14\x9a\x35\x40\x3d\x03\x46\x48\x2a\x11\x6c\x06\x62\xbc\xd0\x48\x10\x22\x59\x36\xe5\xcd\xb9\x4a\x9a\xc5\xaa\x4c\xd3\x39\xd3\xb4\x2a\xe9\x63\xf2\x14\x94\x86\x2d\x41\x7d\x67\xe2\x88\x87\x7f\xfb\xa0\x2f\xc3\x1d\x43\x9b\x9c\x14\x78\xfd\x91\xaf\x72\xa9\x45\x58\xeb\x0f\x14\x74\xbb\xc6\xa2\xac\xd3\x2b\x39\x62\xef\x7b\xf1\x66\xe5\x25\xef\x80\x05\xb6\x73\xee\x38\xa6\x60\x50\x1b\xc2\x53\x04\xb1\x2c\x57\xc6\x44\x15\x03\x65\x1e\xaa\x4c\xb3\x52\x58\x0f\x7b\xdf\xb0\x1b\x90\x63\x4a\x5f\xee\x21\x9e\x5f\xc9\xea\x75\xff\xa6\xf4\x34\xaa\xe2\xa3\xc2\x1f\x8e\x64\x38\xe0\x91\x58\xd7\x7f\x16\xa9\x2d\x68\x5d\x35\xd3\xf6\xb7\x54\xe1\x61\x69\x3a\xb9\xcd\x40\x09\x3e\x33\x72\x6b\x5a\xea\xfc\x31\xe3\x83\xe1\x43\x39\x08\x15\x14\xc2\xeb\x15\xf4\xa0\xf8\x15\x49\x65\x32\x98\x60\x4f\xe0\xf3\xdd\x94\x15\xf2\x7c\x0f\xc8\x9e\x21\x54\xc6\x4e\x2d\x96\x71\x76\x95\xbb\xc2\xdf\x22\xf2\xc1\x9f\x6a\x1f\x00\x55\x8b\x4a\x84\x5d\xf3\xbb\xab\xaa\x5f\x46\x60\x67\x69\x2c\x2b\x9a\xb5\x21\x31\x8f\xce\xab\x46\x21\x4b\x1f\x71\x62\xbd\xe0\x59\x98\x81\x64\xeb\xf2\xa7\xca\xab\x2e\xd7\x3e\x03\xe1\x62\x63\xb5\x92\x78\x95\xe7\x99\xac\xaf\x22\xa3\xe3\xfa\xdc\xbe\xba\x08\xc2\x6f\x2b\x06\xbe\x6f\x41\xa2\x12\x59\x03\xa1\x5f\x91\x10\x4a\x96\x86\x60\x04\xab\x83\xed\x8d\x50\x56\x07\x48\x42\x83\xbb\x19\x26\xac\x4e\x33\xf3\xa9\x54\x66\xaa\x58\x25\x21\xca\x45\xae\xe2\x95\xfb\x63\x6a\x1b\xd5\xfc\x07\x37\x2f\xbb\xe0\x04\x8e\x5f\x94\x58\x48\x70\x88\x59\xcb\xf7\x5d\x2e\xbd\x24\x91\xa9\x21\x4f\x71\x3c\x4b\xea\xc1\x59\x64\x9a\x67\x7f\xda\x43\x9a\x68\x9a\x73\x23\x4a\xcb\x0b\x08\xdb\xf2\x23\x7c\x4c\x52\x38\x29\x05\x7d\xf5\x42\x2e\xdb\xea\x13\x12\x01\xbb\x84\x0c\xd0\xdd\x6c\x1d\x57\x01\x7d\xd5\xf6\xe2\x74\x38\x30\xa6\x6f\x27\x90\xf8\x90\x84\x4a\x4d\x27\x36\x58\xff\xa6\x6d\x2d\x28\xb0\xce\x56\xca\xd2\x7c\x3b\x4e\xfe\x63\x8c\x4c\xd5\x9c\x9b\xf4\xa5\x2a\xa0\x54\x49\x4f\x97\x5b\x33\x42\x36\x16\x18\xa6\x24\x97\x22\x24\xf4\x68\xcb\xa5\x46\x86\x8a\xa5\x02\xb8\xc2\xf4\xcb\x55\xf9\xa6\x32\x03\x2a\x01\x06\x80\x97\xa3\x1d\x40\x50\xad\xe1\x13\x18\xb2\x69\xc8\x31\x85\x3f\x4e\xe2\x28\xd3\x58\x56\xb9\xe4\x94\x2b\x8d\xcc\x28\x5b\x70\x0e\xb8\x6b\xdb\xaa\xc7\xce\x02\xdf\x95\x52\x3b\xc8\x08\x3c\xec\xb2\x34\xae\x2e\x79\xbd\x41\xbe\x94\x95\xf6\x4b\xaa\xea\xaf\xb2\xd0\x34\x10\x8c\x8a\x9e\xd5\xba\xbd\x6b\xf5\x58\x49\x3a\x23\x26\xe3\x26\x47\x4b\x45\xf6\x2f\xfa\xc5\x31\xb4\x6c\x9b\x74\xfa\xc2\x6b\x00\x2a\x13\xce\x8c\xf0\x31\x96\xf3\x81\x4d\xe9\x90\xdf\xff\xe3\x90\xa5\x76\x5c\x6a\xac\xed\x45\x00\xac\x80\xaf\xf6\xb0\x7c\xab\x34\x7b\x5b\xca\xff\x5d\x95\x4f\x5e\xa3\x9c\xe0\x97\xfe\xd7\xf4\x95\x13\x68\x2d\xcb\x50\x9e\x93\xe2\xcc\x61\x9a\xeb\x81\xd9\x72\x00\x90\x21\xf4\xff\xfc\x12\x88\xd3\x44\x26\x86\x06\xfb\xdb\x02\x9e\xef\xb2\x73\x85\xea\xdc\xdf\xc6\x80\x9d\xa8\xf8\xf6\xe3\x32\x74\xe4\x70\x3a\x96\x01\x0e\xaa\x5a\xd4\x37\xd6\xf3\x23\x67\x82\x3b\xa2\xd2\xae\xed\x51\x52\xca\xac\x9f\x0e\xe7\xfd\xae\x80\x09\xf9\x5d\x9b\x43\xf7\x1a\x26\x02\xbf\xea\x07\xd2\x5d\xb8\x2a\x33\xd6\x04\x34\x7b\x49\x63\x21\x75\xe1\x1f\xbc\x05\xfe\x1b\x00\x55\xdc\x94\x28\x0f\x29\xf9\x64\x7b\xbb\x29\x86\x39\x93\x36\x10\x27\x39\xa1\xbb\x6b\xc5\x82\x5a\x69\x97\xc3\x3a\x74\x47\x59\x73\x3a\x6d\x44\xc3\x5e\x51\xb4\x64\xf0\x81\xd6\x5b\x7b\x73\xa4\x34\x56\xae\x5e\xc0\xa8\x49\x55\x6c\x4f\xf6\x14\x5d\xce\x43\x57\x4c\xb5\x97\xe6\xfa\xb1\x65\x3e\x11\x46\xef\x8a\x9b\xbc\x4a\x60\x17\xa6\xc0\x28\x16\x7a\xf9\xa4\xcb\x55\x91\x0f\x4d\x80\x10\x2b\x2d\x55\x3d\x53\x1a\xf5\x16\x63\x64\xe3\x6b\xb6\x30\x86\x82\x0a\x5b\x28\x13\x05\x5e\x4d\x78\xb4\xc3\xb1\x34\x3c\xa4\x26\x94\x4a\xf6\xbf\x9f\x42\x52\x5e\xd6\x8f\x31\x41\x5a\xac\xae\x02\x25\x84\xe9\x0a\xa9\x3e\x5c\x0c\xd0\x77\x5f\x14\x05\x7a\xb0\xb3\xa8\xaa\xfb\xac\xfa\x5b\x43\x49\xe7\x71\xd2\x2b\xca\xce\xab\x5a\xa5\x13\x6d\x6e\xeb\xd0\x41\xce\x7b\x37\xba\xb5\x97\x60\x62\x1d\x5e\xd4\x12\x0c\x9a\x25\xdd\x66\x72\x20\xf4\x1b\x74\x1d\xa2\xda\xc6\xa7\x45\xff\x8a\x3d\x48\xaf\x04\xc8\x2b\x28\x2e\x8f\x54\xe3\xdf\x9b\xed\x44\x2e\xed\xe8\x03\x56\x8c\x78\xea\x55\x62\xe5\xe5\x32\x7c\xf7\x9c\xf0\x4a\x29\x75\x87\x63\x56\xff\x04\x28\x33\x01\xf8\x89\xb6\xa9\x49\xe7\x2b\xba\x45\x50\x78\xd8\xea\x10\x89\x7c\x44\xd6\xee\x16\x9a\x70\xf2\xea\x89\x8e\xb4\x29\x03\x99\x9f\xe7\x1a\xd7\x38\x30\x12\x23\x59\x4f\x9c\x4b\x32\x55\xf1\xff\x83\x88\xb9\x43\xb4\xc9\x01\xbc\x71\x26\xd0\xc6\x06\x02\x0a\xc7\xe6\x83\x78\x9f\x9e\x4a\x8f\xe5\x9a\xd4\xaa\x1b\x2f\xcf\xeb\x92\xa7\xda\xd7\x8a\x0d\x74\xc5\x45\xa2\x9e\x9a\xfc\xb6\x04\x5a\x36\x0d\x20\x87\x39\x61\x39\x8d\xab\x78\x2c\xe0\xa5\xda\x87\xf0\xc2\x84\x67\x2d\x47\x9c\xe9\x0d\xfa\x45\x80\xfc\x3e\x1a\x49\x97\xc8\xce\x58\xd8\xe9\xa4\x53\x55\xde\x2a\x1b\xea\x62\x5d\x3d\x59\xac\xb3\x7c\xcd\xab\xf0\x21\xfe\x02\x65\x8a\xc5\x27\x1c\xed\x2d\x8a\x45\xac\xad\x92\x5e\x24\xd2\x6e\x62\xbe\x07\x9a\x4b\x71\x99\x36\x49\xcc\x2e\x1d\xc2\x84\xc8\x03\x6a\x03\x41\x3d\x54\xc1\x75\x0d\xdb\x8a\x93\xb3\xda\xb5\x66\xc3\x24\xc4\x3a\xd1\xc5\x21\x51\xd2\x16\x75\x5c\x79\x25\xdd\x9c\xf6\xa2\xab\x1b\x34\x82\xe0\x0d\xfb\x0e\x00\x33\x6e\x44\x20\x27\x16\x95\x60\x83\xb2\x7a\xb4\xe1\x8e\xfc\x57\x8d\x15\x4c\x0e\x2a\xd7\x20\xba\xd3\xd8\x0f\xe5\xec\x3f\x6d\x25\x40\x2d\xcb\x52\xe4\xeb\xdf\xf0\x2c\xfc\x6c\x6a\xde\xcd\x2e\x6c\x0a\x31\xc7\x1d\xba\xcf\xea\x10\x40\xd0\xc9\x61\x9d\xe2\xe9\xba\x5c\xf7\x92\x1c\x9e\x3c\x6b\xf6\x3c\x50\x20\x1a\x94\x27\xfe\xa4\xec\xf3\xc3\x68\xc6\xda\x43\x18\xaa\x0e\x2d\xec\x70\x2f\xef\xa8\x93\x17\x02\xf2\x95\xe8\xb4\x5a\x07\x08\x8c\x44\xdc\x8c\x73\x23\xc1\x9f\x4d\x1a\x34\x14\xab\x52\x96\x2c\xd4\xb3\x96\xe3\x34\x46\x1f\xc0\x0a\x40\xb7\xaf\x7e\x2b\xd7\x83\xca\x32\x70\x17\xa7\xa9\x26\xce\x5b\x72\x5b\xb0\x7c\xdc\x4b\xe0\x21\x89\x7d\xaa\xc8\x23\xb0\x81\x83\xaf\x50\x8a\x2d\xb1\x99\xf3\xba\x8f\x52\x5c\x87\x22\xd1\xee\xba\x90\xb4\xbf\xca\xb2\x02\x6e\xb7\x5c\x93\xe7\x51\x01\x47\x86\x15\xdd\xfe\x57\x15\xac\xa3\x13\x7b\xf8\x28\x41\x73\xf6\x4b\x9e\xcc\xba\xa7\x58\x91\x0e\x8e\xbf\x00\x1e\xaa\x93\x1c\x89\xd9\xae\xe5\x63\x34\xf3\xd0\xf0\x4d\xc7\x89\xdb\x10\xfd\xc3\xe5\x32\x1a\xe8\x59\xe9\xf7\xcb\x5f\xf2\x3c\xfe\xad\x92\xbe\x78\xf5\x24\xca\x24\xfb\xbf\xed\x03\xfd\x38\x9f\x14\xdb\x8e\x06\xb1\xd9\x5b\x81\x6f\xf6\xfe\x9a\x65\x56\x32\x31\x1f\x28\x19\xee\x6a\xc1\x02\x60\xb5\x6d\xa8\x60\x69\x1b\xa3\x93\x60\xcc\x6b\x2d\x90\xc0\x90\x3e\x7b\x31\x51\x7e\xe4\xd2\x86\x41\xef\x65\xd1\x66\x9f\x26\x61\x35\x2b\x2d\x8c\x77\xfc\x14\xad\xb9\x2c\x69\x72\xef\x51\xd6\x48\x9f\x83\x98\xe3\x41\xc0\xb3\x5f\x42\xdf\x1b\xdf\x40\x49\xad\x79\xe1\x5a\x72\x6f\x13\x2f\xd8\xd4\x6d\x4a\xe8\x29\xd8\x97\x1f\x65\xa5\x41\xe5\x68\x3e\x35\x62\x84\xa6\x7d\x30\xb8\xb7\x14\x76\xa1\xa2\x71\x56\x50\x25\xd0\xda\xbb\xb9\xae\xf0\x32\x77\x3e\xf9\xe0\x1f\x79\xdf\x2e\x2b\xb9\x03\x4d\xfe\x6a\x0e\x36\x2a\xbc\x86\xa3\x31\xd7\xec\x5d\xf2\xc7\x62\x16\xdf\x78\xd6\x18\xa8\xbd\x7f\x09\x23\x02\x2e\x56\x01\xd8\x04\x37\x8d\x71\x66\xa5\xb7\x30\x13\x5d\x7a\x99\xf3\x1d\x58\x8f\xce\xc5\x7a\xe7\x91\x6a\x97\xe6\x5d\x87\xc0\xb9\x55\x53\xa7\xed\xf8\x04\x1e\xd4\x52\x7d\x71\xfa\x34\xe7\xfe\xc5\xd9\xe8\x2f\x5a\x19\xc8\x1c\x96\x61\xe2\x9d\x87\x1f\xbe\x39\x19\xbf\xfd\x4f\x52\x60\xba\x6e\xcb\x39\x93\xad\x25\x91\xb6\x58\x58\x3a\xd9\xf0\xa8\x79\x8d\x9e\xef\x68\x6e\x22\x3d\x5b\x74\xe8\x94\x77\x07\x2c\xd0\xcd\x79\xf9\x1e\x0b\x5b\x49\x99\x5f\xd0\xa0\x2d\xe5\x43\x09\x99\x8e\x5f\x10\x03\x24\xe5\xec\x10\xf5\xba\xfb\xa8\x28\x19\xfc\x13\xe9\x38\xbb\xde\x54\x35\xb7\x04\x4b\xc9\xb5\x1f\x01\xaa\xe2\xd4\xd1\x24\x92\x08\x9f\x49\x8e\x95\x58\xdd\x1f\x88\xaa\xbb\x68\x10\xe5\x25\x96\x72\x4a\xf6\xee\xe3\x51\x91\x82\x6f\x00\xaa\x38\x96\x07\xfc\xf4\x6a\x1b\x81\x6d\x12\xb8\x8a\xb2\xbd\x85\xf4\x7b\x63\x50\xc6\x53\x8c\x0a\x85\x42\x04\xbd\xf2\x1c\xd4\xd0\x97\xae\x54\xbe\x3f\xbd\xdc\x59\x9d\x15\xce\x65\xad\xbc\x8d\x13\x32\xf5\x50\xcb\x94\x49\x51\x17\x63\xbe\xd0\x43\x22\x56\x49\x27\x8e\x9c\x77\xb5\x73\x8e\xcc\x91\xe3\x31\x5e\xfd\x14\xb0\xe5\x66\xad\xdc\x0c\x39\xe1\xde\xa1\x43\x44\x62\x85\x7d\xdc\x89\xc1\x5f\x2d\x0e\x82\x7f\xcc\xb2\x5d\x3f\x0c\x0f\x8e\xc3\x62\xb4\xac\x1a\x36\x4d\x30\x29\x00\x66\xb0\x7e\xf8\xae\xf7\xb7\x0a\x0e\x8b\xb6\x77\x3d\x53\xf7\xe7\x68\x11\x57\x68\x67\x66\xdf\xea\x94\x1a\x48\x9a\xe6\x4a\xb2\x19\x35\x43\xda\xfb\x5e\xc2\x8b\xed\x00\x8d\x68\xbe\xe4\x9f\x18\xb2\x6d\x62\x90\xd3\x6c\xc4\x0f\x2c\xc4\x2f\x54\xdb\xf6\x57\xb4\x80\xfe\x19\xce\x84\xb1\x30\x97\xab\xd1\x63\x4b\xb4\x69\x60\xf6\x9e\x89\x2e\xb0\xed\xbb\x99\x77\x7d\x38\x8a\x97\x53\xeb\x99\x2b\x71\xc6\x43\xe8\x1b\xfb\x43\x5d\x28\x47\xcd\x1a\x64\x3b\x12\x58\x3b\xfe\x7a\x60\x3d\xcb\x75\xf0\x6b\x15\x1d\x11\x16\xae\x16\x52\x9c\x7b\x6c\xd0\x63\x2d\xf0\x70\xb9\x41\xdf\xc7\x23\xc5\x72\xb0\x3e\xad\x3a\x95\x30\x69\xe4\x39\xd6\x07\x56\x75\x25\x52\x47\x87\x6c\x59\x4b\xab\x82\xeb\xb4\x6b\xb3\xf3\x30\xe3\xf5\x59\x56\x34\xcb\xc0\x92\x96\x13\x10\x7e\xf4\x51\x74\x06\x98\x71\xae\xbd\x89\x12\xd3\xf0\x65\xeb\x00\x1a\x21\xff\x75\x88\x4f\x04\xa7\xe2\xcd\x13\x41\x74\x36\xcb\x93\xaa\x1a\x9c\x1c\x10\x82\x9a\x0c\xde\xa0\xcf\xaf\x07\x59\x49\xae\x81\x56\x3b\xf5\x4e\x30\x1a\xaa\x06\xf7\xf9\xc2\xd3\x65\xdd\xd4\x1e\xd4\x04\x71\x74\x8f\x31\x0f\x1b\x5c\x4c\x4e\x0b\x27\xc3\xcf\x9f\xe5\x92\xc0\xa7\xf8\x93\x87\x65\xb1\xe5\x59\x1f\x2b\x1c\x52\x63\x7b\xd1\x94\x45\x39\x68\xc5\xfc\x51\xef\x89\x64\x93\x41\xc6\x99\x30\xe5\x65\xcb\x89\xf0\x16\x35\x9f\x00\xa2\x97\x45\x22\xef\x7e\xe1\x5f\x4b\xa5\x7a\x36\xa1\x44\x89\xe5\x4d\xcd\x2a\x77\xaa\x1a\x1c\xac\x37\x76\xa7\x96\x60\x2c\x04\xef\x15\x4b\xdd\x8c\xee\x5b\xe9\x10\xe3\x11\x5e\xce\x32\xb2\xcc\xd9\xc3\x52\x97\xea\x13\x13\x4f\x78\x04\x86\x86\xdb\xbd\x5c\xcf\x54\x2f\x91\xea\x29\xe6\x10\xfd\x66\x9a\xd2\x08\xa1\xd0\xb7\x6d\xfb\x35\x0c\x05\xd0\x08\xd7\x56\x68\xcc\xd6\x23\x90\xa7\xde\x8a\x14\x07\x9b\xc4\xf5\x7d\x3f\xb0\xff\xff\x78\x2c\x99\x27\x20\x1a\x1a\x46\xfd\xa6\x7b\x30\xa1\x8d\xd1\x4b\x9a\x88\x52\x93\x57\x75\x17\x30\x2c\xec\xf4\xff\x49\x9b\xf9\xd0\x59\x83\x8f\x36\x33\x25\x51\xb3\x69\x0b\xd3\xfb\x96\x2e\x17\x37\xb7\xa9\x30\xc5\xaf\x78\xdf\x12\xe1\x42\xef\x00\x6a\x7f\x31\xfd\x6c\xcd\x6f\x74\x3f\x27\x87\x83\x68\x6b\x3e\x51\x39\xec\x64\x7a\x8f\x1a\xaa\x3f\x82\x46\x6e\x2c\x4c\x43\xe8\xb2\xc3\x1f\x95\x7b\x7d\xc2\x69\x4b\x35\x17\xe4\xb9\x51\x01\x93\x90\xbb\x72\x78\x09\xb0\x9e\x0a\xa5\xe9\x2c\xdf\xa6\xe8\x0e\x93\x9c\x7e\x21\x8e\xf4\x70\xd2\x5e\xb2\xd7\xc3\xc3\x83\xd4\xbd\x82\x47\x52\x96\xe8\x87\x59\x6f\x1a\x83\x5d\xc9\x2b\xd5\xa2\xcb\xa5\x96\xa1\xc3\xcd\x1e\x1a\xc1\x29\xf1\x0b\x79\x97\x8f\x4c\xe7\x99\xa4\x36\x65\xa5\x68\xdb\x4f\x24\xd2\x15\x3c\x7b\xae\x8d\x6c\x41\xce\xe5\x7b\xe4\x5b\x0e\x1b\x15\x3d\x55\xe1\x1a\xa9\xae\x35\x2f\x8e\xa8\x73\x0f\x93\x26\x34\x33\xc0\x9f\xe1\xae\x3f\xaa\x0c\x23\x52\x22\x29\xb3\xf6\x9f\x60\x91\x47\x30\xa5\x41\x85\x4f\x9a\x7a\xce\x21\x00\x86\x0e\xd6\xf2\x90\x7e\x0c\xc2\x75\xdc\xe2\x38\x51\x5f\x6a\x4d\xd2\xde\x54\x33\x73\x27\xf2\x4c\x8b\xe4\x5e\x23\x1a\x56\x84\xa5\x0c\x15\x30\x12\x56\x5f\x7b\x15\x58\xea\x7b\x9a\x72\xb3\x30\x62\x94\x7d\x4b\x72\x83\x1b\x50\xc7\x02\x15\xf0\xaf\x29\x40\x77\x86\x05\xab\x37\x55\x39\x04\xce\x2f\x8d\x7e\x54\x32\x00\x84\x5e\xc0\xcc\xcd\x56\x38\xb8\x30\xf0\x7d\x00\x40\xc3\xaa\x62\xef\xcf\x4e\xd6\x20\x99\x72\xc7\x26\x47\x6c\xd1\x38\xc7\xb9\x8a\xaa\x63\x8a\x02\xe8\x08\xac\xc6\x0a\x8e\x87\xbd\x41\xca\xd7\x23\x1d\xfa\x21\x1f\x6a\x61\x7b\xa2\x70\xdd\x17\xec\xf9\xbb\xee\xe1\x13\xa2\x27\xb5\x86\xa0\x37\x32\x65\x7c\x00\xa2\x52\x6c\xe3\x63\x74\x07\xa9\x7c\x6b\xd9\x96\xd3\x4b\xff\xde\xd5\x84\xba\x7d\x35\xc9\x74\x32\xc0\x5e\xd1\x34\xb1\xab\xd3\x5f\x96\xbd\x92\xcc\xb9\x47\x82\x19\xe8\xc1\x0f\xb4\x48\x74\x7d\x93\xc2\x19\x3a\x14\x5b\xb6\x35\x70\x5b\x75\xa8\x27\xb8\x3a\xdf\x28\xdf\x76\x23\x62\xc5\x17\x54\x65\x58\xf0\x59\x4f\x5e\x12\x3f\xa7\x80\xcf\x6a\x0b\x5f\x42\x52\xc1\x33\x93\xc4\x82\xeb\x95\x9f\xb3\x0a\xf4\x8e\xf3\x5a\x8d\x61\x87\x88\xbe\x97\x5e\xb7\x43\xb5\xa1\xb9\x83\x8f\x94\xc7\xe4\xce\xf8\xc3\x5a\x3b\x40\x0f\xfd\xb2\x92\xb0\xa8\x4d\x39\x55\x56\xf7\xbc\x4e\x8b\x79\x9b\x1f\x46\x38\xdf\xae\x79\xaf\x86\x02\x2b\x22\xe4\x43\x30\xbf\x07\x7d\x77\xf8\x37\x58\x01\x2e\xd4\x5a\x7b\xe0\x56\x07\x87\xec\xae\x6a\x80\x77\x15\x07\xd4\x6d\x31\xef\xef\x72\x4c\xa1\xbb\xcb\x16\x40\x98\xaa\xea\xbd\xa5\xa6\x18\xf9\x23\x5d\xfa\x20\x7a\xb3\x33\xf5\x51\x65\x53\x8e\x7f\x9b\xa8\x6c\x67\x28\x91\xb5\x61\xfe\x2c\xb8\x8a\x56\xaf\xd0\x4e\xb3\xd6\x69\x44\xe5\x8a\xb4\x8a\x10\xec\x8c\xcd\x00\x6e\x67\x09\x6d\xd6\x63\xed\x73\xf5\x80\xc0\x1e\xae\x2d\x7d\x47\x93\x1e\x2b\xf9\x15\x47\xad\xb7\xff\xd9\x41\xf2\x5f\xd6\xf9\x3b\xeb\xf3\x6a\x36\xf5\xa2\x81\x46\x51\xd0\x6c\xe4\x18\x51\x82\xb5\x41\x8a\x30\xfd\x53\xf5\xb0\x45\xad\x11\x23\x48\x75\xbc\xb4\xdc\x77\x8b\x8e\x04\xfc\x4f\x8f\x36\x54\x13\xbe\x51\xf7\xee\xa3\x1b\x87\x8d\x72\x86\xdd\x48\x5b\x1f\xb2\xf3\x8a\xf4\x94\x87\xcc\xb6\x46\x63\x16\x8a\x1a\x53\x35\x4b\xb1\xd2\xaa\x52\xef\xf7\xa5\x48\xf9\x1e\x3e\x7f\x36\x23\x06\x27\xdb\x97\xc2\xa7\x92\x2f\xfa\x42\x45\xf7\x69\x5c\x67\x8c\xe8\xd7\x28\x2c\x52\x07\xbd\x92\xfb\x8d\x68\xe1\x0a\x5e\xd7\x6d\x10\xdc\x8f\x37\x0e\x00\xa9\xc1\x94\x02\x78\xc1\xc4\xf4\xc6\xa0\x1e\xf6\x97\xcb\x1e\x7d\xb2\xc3\x73\x0e\x68\xe6\xf5\x6e\x61\x45\xba\xae\x66\x96\x13\x7c\x2a\x22\x13\xdc\xb8\x0b\x50\x5c\x6a\x6b\xfa\x5a\x96\x58\x3e\xee\xe9\x72\x01\x74\x84\x07\x7f\x5c\xa3\xb7\x72\x9a\x95\x0f\x2c\x14\x62\xa1\xd8\xef\x22\x63\xcd\x55\x9b\xa7\x5c\x17\x81\x62\xb4\x4f\x37\x1f\x5e\xc2\xf5\x69\xb9\xb8\xf4\xec\x65\xc4\x01\xb9\x57\x64\xd7\x8e\x71\xa2\x7b\x5c\xe3\xf4\xa2\xcd\x95\x06\x1b\xa3\x85\x65\xab\x5a\x28\x00\x87\xeb\x14\x12\x7c\x67\xe3\x85\x2b\x25\x50\x26\x93\x08\xbf\x6b\x34\xea\xfd\xa4\x2d\xc7\x28\x09\x36\xfe\xb1\xba\x57\x4d\xcd\xaa\x83\x89\x39\x05\xfb\x7d\x31\xe8\x10\x23\xbe\x54\x11\xf2\x29\x92\x6e\x90\x16\x98\x43\xeb\x7d\x6f\xc9\x54\xe2\xd4\x59\x92\x80\x40\xc4\xf0\xd8\xde\x07\x2b\xa3\xac\x12\xc1\x58\xa7\x6b\xd8\xe0\xf0\x3f\xee\x81\x34\x0f\x4d\xbe\x95\x3a\x7e\x21\xe7\xb1\x72\xe0\xac\xd7\xbb\x82\x72\x79\x4f\x31\xb4\xc7\xc4\x3a\x96\xb0\x38\xe1\xcc\x64\x84\x02\x87\xe7\x23\xf1\x35\x2c\x29\xec\xba\x31\xf1\xb2\x1d\xc3\x26\xd5\x4e\xd2\x49\xb9\xca\x96\xff\xb8\x1a\xe5\x73\xee\x02\x04\x3f\xd7\x5e\x70\xa9\x28\xdc\xaf\x4d\x55\x43\x8b\xde\xcd\x29\x7a\x61\x6d\xed\x8a\x39\xb5\xac\x4e\xf3\x59\x80\x9d\xe9\x7e\xc5\xfa\x49\x0c\xf1\x69\x0c\x26\x5e\x25\x9e\x4e\x69\xd5\x40\x45\xdd\xaa\xe7\xf8\x4a\x42\xb1\x1b\x5f\x23\x21\x42\xe9\xce\xc1\xc6\x77\xab\xd0\x6d\x40\x1f\x6d\x40\x60\xf4\x3a\x62\x5d\x8c\x52\xa6\x4e\x28\xf5\x51\xdd\xa6\xc1\xa6\x11\x32\x8b\x70\x8d\x60\x43\x63\xcb\xef\xab\x58\x48\x1d\xc4\x56\xf4\x3b\x9c\x68\xd7\xaa\xa0\x7c\x1e\x0e\x3a\x0f\x42\x50\x05\x2c\xa5\xf6\x48\xd8\x23\x62\x38\x13\xe8\xb6\x47\xf8\x1d\x82\xb2\x63\x04\xff\x23\x9d\x8c\x1a\x0f\x8c\x17\x38\xc4\x61\x6b\xdf\xee\x30\x1e\x80\x8f\x25\xd8\xe8\x4c\x07\xb6\x68\x72\x26\x8c\xb5\x2b\x0d\x9f\xfe\x16\xc4\xf3\x83\xfd\xa9\x59\xf8\xb6\x25\x0b\x97\x9c\x93\x8d\x24\xcb\x17\xbd\x47\x87\x55\xba\xa7\x25\x03\x1c\x5b\x4b\x0b\xbb\xe6\xb8\x71\x34\x9e\x14\xa5\xc1\x13\x8b\x81\x37\xdc\x23\x3d\xa5\x21\xd5\x47\x83\xee\x35\xc4\xbd\xe1\x76\x1f\xca\x93\x5d\x4f\xa5\x6c\xaf\xc1\x0c\x5f\xfc\x9b\x08\xc9\x30\x2d\xf6\xd9\x58\xea\x63\xb2\x09\xcf\x70\x02\x6d\x31\xf4\x14\x66\xb8\x75\x6b\x41\x06\x7d\x5e\x95\x53\xed\xe3\xa6\x53\x2b\xf7\x26\x61\x2f\xbf\xe8\x41\x38\xe7\x2c\xc1\xbf\xfa\x88\xe3\x81\x17\x03\x72\xf3\xb1\xe9\x33\x89\xee\x6c\x23\x16\xe3\xd0\xdf\xdd\x63\x2b\x6f\x25\x6b\xb5\xe5\x0a\xdd\x85\x4a\xeb\xe9\xf1\x78\x08\x3d\x94\xb3\x45\xfe\xec\x7b\x93\x05\x7a\x37\x16\x13\xb4\x46\x75\xd9\x44\x09\x6d\xc6\x0b\xe1\x80\x09\x8f\x58\xb5\xf6\xbf\x54\x9b\x6d\xb7\x00\x1f\x99\xda\x8a\xf1\x89\x51\x64\xd4\xb9\xf6\x30\x4c\xa6\xc2\x97\x3c\xcd\xe1\xa1\xfd\x9b\x7c\x8c\x7d\xb2\x95\x68\x3f\x89\xc1\xac\x5c\xa7\xb3\xfb\xcf\x14\x63\x14\xda\x3d\xa8\x87\xec\x10\xf1\xf5\xcb\x3d\xf8\x2e\x73\x25\xb6\x9a\x8d\x33\x17\x8a\x7e\x1d\x55\x64\xe5\xad\x36\xe3\xf1\xd2\x79\x24\x73\x62\x1c\x64\x8a\x7b\xc0\xc7\xe0\xc6\x9c\xeb\x23\xdf\x31\x31\x0b\xa1\x57\xd5\x24\xa6\x2d\x25\x15\x1e\x70\xd1\x51\x97\x8c\x78\x22\x2f\xfb\xad\x91\x72\x00\xa5\xc9\x3f\x3e\xd3\xa2\x1f\x75\xc8\x4c\x4a\x14\xee\xa3\x5f\x77\x9b\x3f\x33\x42\x61\xb5\xb3\x0e\xbb\xca\x16\x9d\x63\xc9\x06\x66\x7b\x3e\x21\x0e\x60\x79\xba\x76\xcc\xab\xd8\x28\x7b\x08\x54\xed\x93\xcf\x43\xd3\xc3\x55\xd3\x8c\x55\x07\x90\x23\x1b\x75\xc6\xca\xde\xd7\x3c\x1e\xc7\xa5\x88\x4f\x13\x8a\x7c\x03\x4b\x78\x74\x99\xd2\x42\x7c\xe7\x28\xff\x72\x62\x3c\xba\x68\x93\xed\xba\x4d\x82\x50\x22\x87\xe4\x4d\xd3\x84\xb9\x4f\x08\x6f\x40\x4f\x7d\x33\xe4\x73\x4a\x7f\x2f\x0e\xe6\x45\xe7\xe4\xb7\xfa\x5b\x7f\x72\x79\xbe\x28\x5d\xb8\xb1\x08\x12\x16\x14\x61\x91\x0a\x95\x06\x8a\x5b\x91\xf6\x6a\x7e\x9d\x62\xf3\x93\x53\xee\xb9\x4c\xde\x03\x3f\x9a\x5d\x0f\x4d\x95\x22\x5d\x5e\xdf\x8f\x55\x67\xbb\x5a\x08\xa9\x37\x76\xbf\x07\xc1\xfc\x72\x40\xe8\x6d\xe5\x65\x9d\xd4\xf2\x2d\x1d\x9f\x41\x4a\x56\x40\x09\xa8\x20\x3a\x43\x15\xca\x8a\x7c\xb5\xc2\xab\x9e\x39\xbc\x93\x07\xf5\xce\xca\x99\x62\x4c\x01\xd0\x76\x26\x43\x2c\x71\x66\x01\x88\xc5\xab\xcf\x56\x2a\x3a\xa7\x96\x46\x3a\x7e\x9a\xd5\x95\xdb\x21\x2c\x55\xe0\x1c\xa6\x24\x0f\x62\xb3\xbc\x59\xca\x35\xa3\x48\x5f\xd6\xcb\x38\x24\x01\x0c\xb6\x6b\x42\x54\xaa\x8b\xf9\xa3\x75\xe0\x07\xf2\x07\x3a\x0b\x96\xe1\x8d\x41\x80\xf3\xa2\x29\x7d\x34\x8d\x40\x59\x83\x2d\x04\xa1\xe6\xb0\xba\xfc\xc9\xfb\x10\xc8\x7f\x16\x2d\x16\xe8\xc0\x6b\xd8\x4e\xf2\x80\x4a\x7b\x54\x5a\x8e\xc2\x23\x53\x4f\xb4\xa3\xc2\xba\x65\xcd\x47\x08\x02\x22\x23\x48\x95\xd4\x55\x4d\xcb\xc7\x40\xbe\x6e\xb6\x2c\xb6\x0c\xe8\x45\x3c\x46\x7b\x21\x78\x03\xae\xd0\x7c\xd4\x96\x77\x8e\xf0\xad\x3e\xda\x67\xdd\xad\xc7\x7d\xa6\x12\x31\x15\x83\x1e\x80\x02\x48\x10\x04\x9c\xae\x89\xf3\xd2\x47\x06\x30\x50\x07\x64\xd9\xc3\xab\x4c\x2e\x65\x0a\x19\x99\x43\x52\xf3\x6c\x9a\x67\xd7\x83\x3c\xdf\x1e\x89\x7a\x2e\xf7\xbe\x37\x6f\xeb\xd3\x87\x72\x23\x35\x7d\x62\x08\xa4\x8f\x61\xae\x33\xcc\x7e\xf9\xcd\x9e\x29\x75\xc0\xf8\x06\xeb\x75\xf9\x82\x44\xf5\x32\xdf\x17\x1d\xbf\x3b\xeb\xb8\x8e\x6a\x55\xe6\x17\x40\xdd\xdc\x1b\xbd\x14\x75\x40\x6f\x4f\x01\x81\x18\x4b\x30\x73\xdf\x8c\xfe\x33\x31\x73\x90\x00\x58\xb6\xb5\xcc\xa5\x23\x59\x0e\xd2\x2c\xd8\xed\xbd\x0e\x8c\x88\x86\xd0\xad\xaf\x7e\x30\xd0\x82\xcd\x4f\xfd\xc4\x1b\xcb\x43\xcf\x28\x5a\x02\xdf\x19\x61\x00\x2b\xd3\xe6\xa5\x2e\x51\xf4\xf2\x72\x4c\xaf\x28\x70\x78\xf3\x71\xb9\x54\x08\x05\xb9\x8f\x7a\x73\xc4\x94\x39\xcd\xc1\x61\x2e\x72\x1d\x1d\x6c\x46\x03\x29\x36\x48\x5d\x3c\xfb\x7f\xee\x70\x9d\x23\x5c\xb4\x09\x66\x1a\x3a\xe1\x18\xbd\x5b\x06\x1d\x96\x89\x2e\xfe\x72\xb8\x88\x80\xd9\x7f\xe8\x16\x97\x01\xdb\x82\xa0\x3b\x1b\x59\x56\x0e\x45\x08\xe0\xd8\x13\x07\x79\xf9\xa0\xc2\xa6\xa1\x74\x40\x2c\x78\xbb\xc1\xc9\x80\xab\xe5\x27\xeb\x56\xc3\x27\xfa\x5e\xe9\xbc\x6d\x4c\x29\x7b\x8b\xe5\x45\xa3\xe9\xb0\x67\x07\x18\x2e\x85\xbe\x7a\x0e\x75\xd5\xf2\xe3\x26\x44\xe6\x89\x26\x33\x67\x2c\xfa\x82\x91\xbd\xff\x6b\xde\x8b\x67\x7f\x92\x8d\x06\x34\xad\x51\xf1\x89\xa4\x7a\xb2\x46\xda\x68\x1d\x16\x80\x2d\x24\xb8\x34\x1d\xce\xd3\xc2\x0a\x3e\xc6\x59\x2c\x42\xc5\x5a\x1b\xb9\x7d\xc2\xac\xe7\xc6\x76\xe2\x45\x53\x00\xfe\x78\x32\xee\x1d\x0a\x79\xab\xd3\x3c\xe0\x30\x21\xe0\xa5\x32\xd5\x84\x26\x34\xfd\x0c\xc7\x48\xe2\x51\x09\xff\x86\xb3\x7f\x0c\xe4\xef\x66\xd5\x0b\x9f\xc6\x3a\x73\xb7\xb1\x02\xdb\xb6\xe6\x6c\xc3\x08\x18\x38\x1d\xad\xa6\x90\x2f\xa8\xe6\xf2\x47\x12\x78\xc2\xb4\x94\x7d\x39\x55\xbb\x2e\xa5\x36\x90\x9c\x81\x8e\x46\x89\x36\xc7\x91\x0b\x06\xb2\x64\x9f\xbe\x2d\xa7\xc5\xab\x48\x61\x45\x8c\x5e\x89\x94\x19\x80\x42\x82\x07\x2c\x4f\xe7\xf0\xda\x2f\x0b\x69\x74\xef\x3e\xe9\x37\xc8\xcf\x51\x8f\x64\xcb\xbf\x96\x8d\xca\x6c\x66\x5b\x38\x2a\x60\x6a\x98\x5d\x65\xb7\x00\x01\xaf\x08\xce\xe5\x57\x93\xf2\xa6\x53\x79\xb5\x28\x0c\x8c\xc3\xfc\x74\xb7\x25\xe3\x1c\xde\x57\x98\x27\x4b\x0e\x26\xa4\x5d\x60\x5b\x7c\xd9\x61\x82\x5e\x35\xab\x23\x89\x53\xd8\xad\x1a\xc1\xc8\xd3\x97\x39\xbe\x67\x52\x9e\x46\x29\xf2\xe1\x40\xb6\x78\xcb\x18\x20\xb6\xd5\x73\xf3\x92\x10\xa5\x4a\x79\xf3\x57\x8f\x03\xb7\x1a\x90\x21\x93\xd3\x89\x8b\x0c\x65\xea\x09\xbe\x89\x1a\x54\xe7\x6d\x2d\xad\x16\xf3\xe8\x97\xbb\xcf\x52\x88\x5d\xf1\x63\x88\x35\xeb\x95\xa5\xca\x56\xcd\xe7\x11\x35\xd1\x7c\xb6\x83\xca\xd0\xd3\xbb\x77\xa6\x06\xab\x5b\x98\x18\x39\x08\x89\x35\xc3\x04\xe5\x46\x14\xdf\xe1\xa3\xf5\xe8\xc3\xc5\x3c\xa8\x71\x17\x74\xaf\xde\x4f\x8f\xaa\x18\x33\x85\x8f\x28\xef\x8d\x44\x8d\xc5\x58\xeb\x6d\xab\xb4\xb1\x62\xfb\xa7\x1c\xc8\x3e\x9c\x73\xf1\x20\x3e\x5b\x0d\xc0\x38\x8b\xbc\x99\x66\x8d\x47\x9e\x06\x52\x3f\x93\xb8\xe8\x3e\xb8\xab\x60\xc1\xcf\xb9\x31\x2c\x7c\x35\x3c\x7f\xce\xc9\x73\xf1\x1f\xb9\x90\x61\x2e\x16\x86\x0d\x3f\x08\x06\x77\x09\x9f\xfe\x44\x3f\x26\x20\x20\x37\xfb\x8e\x86\xb0\xc4\xf2\x8d\x5e\x1a\x69\xcb\x5c\x19\xdc\xf7\xb0\x9a\xfe\xc2\xd6\x52\x94\x7b\x5e\x0f\x64\xe5\x21\x67\x3a\xcc\xf3\x2c\x0d\x9b\xfb\xe1\x7a\xb5\xec\x00\x16\xa5\xd4\x98\xe0\x2f\x3e\x3a\x22\xb6\x59\xa6\xdc\x58\x9c\x72\xc6\xc6\x02\xf3\x12\x53\x2c\xa1\x7c\x3f\xdc\x47\x41\x58\x57\x21\x4b\x15\xd0\x3b\xe0\xfd\x3a\x99\x43\xba\x46\xad\xd7\xa3\x9a\xf3\xf6\xcb\xcb\x1a\x06\x9a\xe0\x05\xbf\x25\x48\x26\xd8\xa9\xa6\x0c\x77\x25\xef\x13\xcb\xa5\xdf\x4d\x64\xc1\x75\x79\xd1\x5a\xca\xbd\x20\x5a\x97\xe3\x37\x2a\x6b\xe1\x11\xa3\x91\xa2\x47\x5c\x39\x75\xe3\x3c\x56\xa7\xa6\x0e\xe2\x83\x6e\x85\x74\x63\xaa\xe8\xc4\x35\x57\xd4\xe2\x37\x03\x9c\x4a\x39\x5c\x60\xb0\xe8\x21\x17\xea\x5e\x4f\x77\x50\xde\xba\x6d\xfb\xea\x55\xa5\x32\x3a\xfb\xa4\x45\xdb\xb6\xd2\x08\xed\x05\x09\xa1\x4d\x41\xd2\xdb\xe9\x6a\xff\x0a\xd1\x6d\xf9\xb0\x4e\x12\xa0\x7b\x23\x33\xba\x04\x02\x6d\xaf\x02\x75\x72\xdf\xa0\x4d\x83\xa5\xb5\xda\xa4\xc9\x1a\x91\x3d\x66\x68\x8f\xf1\xba\x74\xab\xe2\x82\xc8\xc3\x46\xaa\x07\xe8\xd4\x4a\x20\xa3\x97\x8a\x5d\x93\x02\x77\x80\xfe\x27\xd3\x15\x09\xfe\xa7\xf3\x7b\xdc\xc1\xa3\x34\x98\xed\x12\x1e\x0b\xd7\x3a\xd4\x91\xac\x94\x13\xfc\x62\xc7\x90\x5e\x49\x10\xe5\xaf\xf0\x11\x72\xf2\xf5\xba\x38\x72\x83\x70\x91\x90\xb6\x7f\x88\x3a\xa4\x90\xa1\x8d\xef\x81\xff\xeb\xe0\x3b\x5e\xd6\xbf\x27\x31\x0d\xbf\xdf\x66\x40\x95\xc5\xe3\xdb\xae\x93\x8b\xa4\xca\xe1\xbe\x42\x47\x66\x03\x8a\x5e\x69\xc7\xf9\x37\x0b\x20\xc2\xfa\xb4\xad\x88\xc4\xd1\x03\xa1\xe3\x32\xef\x3e\xb2\x50\x7f\x07\xbc\x20\x1f\x5a\x2d\x2e\x82\xc3\x4d\xa0\x7a\xf8\x90\xf0\xd5\x88\x24\x4e\xbf\x03\xbb\xee\x13\xf8\xe0\x4c\xd2\x82\xa7\xf5\x1f\xd8\x3f\x30\x8f\x12\x10\xfc\x6d\xb5\xf8\x70\x48\x70\xb9\x2c\x13\xee\xfd\x6c\x70\x05\xb5\x95\xf6\x82\x23\xf9\x55\x3d\x6b\x03\xb2\x58\x62\xac\x5e\x03\xdc\xca\xd0\x41\x43\xbe\x2f\x93\x85\xa5\xdc\x1e\x72\x1b\xd8\xe7\x91\xe9\x1f\x55\x18\x55\xdc\x96\xb3\xbc\xab\xbd\xde\xa5\xb3\xbd\xed\x3c\x7f\xf9\xdc\x26\xad\x66\xb9\xe5\x95\x22\x40\xc4\x77\x40\xde\x46\x1d\xdf\x9c\x81\xfa\xf4\x36\x68\x0e\x22\x44\xe1\x7d\x84\xdc\xc9\xd8\x47\xd3\xca\xf3\x5b\x72\x8d\x39\x5c\x11\xb6\xdc\xc5\x81\x1b\xc2\xd6\x5b\xff\x45\xcf\xc5\xa9\xb9\x6d\xfd\xd7\x5d\x6c\xe8\xe8\x0e\x87\xbf\x29\x2c\xc9\x52\x1c\xe9\xa5\xe2\x48\xf6\xf9\x03\xbc\xb1\x3b\x85\xae\xf4\x80\x51\x4f\x67\xe3\x58\x6a\x48\x15\x8b\x44\xce\x7c\x89\x55\xfe\x86\xa1\xa2\xb2\xfb\x14\xff\x0b\x73\x1c\xaf\x5f\xf9\x59\xe1\xf3\x25\xfe\x86\xf4\x73\x73\x55\x06\x6b\x28\xe6\x73\xf6\x18\xb3\x46\x39\xb1\x78\x3a\xd9\xbb\x1e\x2f\x01\xf6\xea\x27\xad\x68\xcb\x4d\x6a\xcb\xac\xd6\xae\x5b\xc3\xd9\xa6\x7c\xc7\x6e\xca\xae\xe3\xc3\xa9\x40\x0c\x51\x57\xbe\xf3\xb2\x80\xa6\xbe\xdd\x9f\xca\xa5\x11\x0a\x12\x65\xbd\x8a\xaa\x9b\x37\x2b\x00\xe0\xf0\x07\xd2\x44\x7d\x04\x60\x2e\x33\x40\x8e\xd2\xc3\xaf\x79\xc9\x72\x86\x70\xf3\x92\xeb\x5f\x57\xc9\x4f\x2a\xc5\x23\xc1\x5a\xca\x4b\x34\x52\xba\x3c\xf7\x68\x44\xce\x00\x6c\xbb\x7f\x3d\x85\xb3\xcc\x0c\x72\x37\x1b\x17\xb1\x53\x29\x90\x82\x32\x70\xe9\x93\xd9\xf7\xb7\x40\xf9\x9b\x72\x35\x43\xcc\x39\x20\xff\x3a\xf9\x7d\x07\x3e\x42\x97\x35\x55\x53\xcf\xa3\xf2\xef\xf9\xcf\x98\x3c\x73\xc1\xf4\xb0\x43\xef\x46\x65\xfa\xd2\x91\x41\xc4\xb5\x95\xde\xa8\x1c\xc5\xdf\xfe\xc9\x53\x94\xe3\xa5\x06\x99\xb9\x64\x00\xd1\xaa\xbc\xd3\x90\xd6\xdc\x52\x38\xea\xdc\xd3\x71\x5e\x30\xce\xee\x9c\x1e\x17\x5b\x60\x47\x72\x1b\x3f\x0a\x79\x8f\x48\x03\xa4\xc9\xc9\xb6\xc0\x5c\xb5\xb9\x86\x72\xdd\xf3\x3c\x18\xce\x05\xb8\x1e\x7e\x32\x43\xc9\x73\xa2\x1d\x8e\x1d\xca\xbd\x3c\x60\xe4\xc0\x3a\xbe\x7c\x62\x84\xc5\xc0\x5c\x72\x37\x6f\x6b\x39\x9f\x4f\xbe\x0e\xb5\x3c\x59\x9c\xb3\x76\xbf\xa0\x31\x65\xbb\x50\xc1\x37\xd8\x5b\xa2\x74\x25\xb7\xb5\x1d\x1b\x1e\x25\xe1\x46\xee\x45\x01\xee\xd3\x0a\x67\x25\x79\x70\x4f\xef\x6e\x06\xe1\x7d\xfc\x6b\x6d\x2a\x26\xfe\x77\x97\xf8\x7d\x67\xf6\x2d\xab\xf9\xb1\x5a\x2e\x67\x68\x7e\x0a\x26\xa3\x57\xec\x4b\xd4\xd6\x26\xc1\x98\x7e\x0e\x15\x17\x16\xf7\x37\x53\xbd\x0c\x8c\x31\xd9\x84\xd3\x56\x65\x10\x12\xb7\xf2\xd4\xd6\x40\xc4\x2e\xb7\x21\x44\x88\x64\x02\xda\x19\x5e\xe7\xa6\xaf\xeb\xa5\xff\xb8\x82\xb3\xc7\x2c\x57\xfd\x23\x9b\x18\x36\x7c\xba\xad\xfa\x59\x3a\x1d\x93\xc0\xbf\x11\x35\xbb\xec\x2b\xe9\x6c\xff\x1b\x45\xba\x74\x06\xea\x14\xb7\x87\x77\x4a\x55\x13\x5e\xf6\xf0\x94\x45\x0d\xbf\x56\x78\x4d\x8f\xdc\x4f\xa9\x03\xd0\x86\xee\x7b\x4f\x9e\x10\xc0\xb2\x5d\xb7\xe5\xd7\x4e\xff\x92\xad\x87\x7a\x57\xfb\x4e\x7b\x5b\x5c\x58\x0b\x46\xd6\x37\x0e\x83\xb7\x2b\xf7\x00\xc2\x2d\x24\x8b\xa7\x6a\x47\x2d\x13\xea\x1b\x49\x64\xfd\x5c\x45\xfe\x12\xdb\x99\x29\xa4\x63\x84\x6d\x2d\xe7\x44\xf2\xa4\xf8\x9c\xa4\x6e\x5c\x0e\xaf\x98\xe4\x03\xbb\x3a\x56\x0d\x83\xa4\x5b\x4c\x6c\xd5\x40\x80\x7b\xa0\x16\x41\xc7\x6a\x66\x4a\xa4\x42\x0f\xd5\x42\x4e\x4d\xb2\x0f\x7d\x68\xfa\x97\x4c\x85\x19\xc3\xd9\x59\x1c\x10\xc0\x0b\x4b\x7a\x6d\x82\x83\x55\x85\x83\xdd\x77\xca\xc6\x43\x9b\x98\x78\x64\x15\xfb\x24\x8b\xaa\x09\x90\x2c\x47\x51\x5e\x37\xeb\x6d\x43\x3b\xb0\x84\xfd\x4d\x63\x20\xf1\xd5\xf8\xf9\x7f\x94\xd4\x7c\xbe\xa6\x47\xef\x51\x86\x45\x6f\x28\x11\x2a\x35\xa1\x75\xbe\x97\xe3\xd6\x39\x0b\x78\xa3\xd3\x63\x13\xfb\xe6\xaa\xf9\x5e\xbc\xa8\x6f\xae\xe2\x9f\x2e\xe2\xed\x99\xa8\x5c\xe2\x5d\xf6\xf5\x8d\x15\xfd\x8e\x39\xa2\x97\xbc\xa1\x30\x84\xab\x7c\x51\x2d\xf4\x2b\xb4\x10\x8d\x9a\x42\xd2\xe9\x6c\xf6\xe3\x13\x1f\xb5\xb2\x27\x20\x34\x6a\x6e\x4c\x68\x42\x56\xe7\x18\x36\xb6\xf8\x61\x64\xb3\x55\xaa\xf1\x66\x26\x82\xf3\xa7\x40\x16\x25\x55\x0d\x57\x1f\xa0\x56\x58\xfb\xea\x52\x18\x92\x5b\x4c\x26\xb2\x7a\xf7\xfe\x71\xc9\x55\x35\xb0\x1e\x65\xa9\xb9\x03\xc8\x6a\x63\x6f\x68\xaa\x3a\x9d\xd8\x64\x96\xcd\xb6\xbb\xe7\xc9\x9e\xe1\xed\x54\x3c\x16\x2b\x6e\x13\xc0\xac\x6c\x59\xd0\xaf\x1f\x92\x4e\xc8\x36\xfa\x1e\x1f\x32\xfa\x1e\xbb\xf1\x0b\x3d\xe9\xbb\x46\xb4\x5a\x85\x68\xab\xd0\x24\xce\x99\x2f\x14\x12\x7d\xf6\xf9\x2a\xb5\x93\x90\xac\xf7\x03\xf5\xb2\xc4\xdb\xf1\xaf\x24\x37\xd7\x13\x04\x20\x8f\x87\x4d\xad\x5f\xad\x0f\x4f\x76\xf3\x4d\x19\xc4\xd8\x99\xf0\x5c\x32\x4d\x04\x58\xeb\x37\x4c\x01\x36\x0b\xf0\x6a\xd0\x34\xa0\x51\xe8\xbc\x01\xc4\x29\x37\xed\x8f\x35\xb2\xe3\x75\x12\x73\x4e\xb3\x67\x61\x27\x57\x5a\x72\x28\x4f\xd8\x46\x43\x57\x57\x3e\x6a\x7e\xb4\x4f\xba\xe8\x20\x68\x09\xb6\x90\x27\xd3\xf4\xa1\xb8\x11\xc3\x14\x29\x5d\xbe\x4c\xf1\x11\x7c\x4c\xdd\x5f\xf2\xc1\xed\xb1\xd4\x91\x03\x78\xd3\x69\x92\x97\xfb\x92\xbf\x64\x0a\x60\xea\x27\x8d\x08\x52\x04\x85\x80\x5d\x9e\x7d\x18\x5e\x95\x1d\x94\xc5\x01\xd4\xfd\x29\xc6\xb0\xb3\xcd\x18\x4b\xaa\x20\x09\x9c\x39\x7d\x80\x99\xb2\xfb\xb1\x9a\xf4\x37\x4e\xa5\x35\x9c\x2e\xb9\x88\x82\x03\xc6\x84\xd3\x18\x92\xf5\xa3\xe4\x1e\xf5\xa4\x52\x31\x9a\x04\x38\xa2\x82\xd8\x9d\x24\x84\x87\xca\x13\x1c\x58\x7e\x99\x4f\xa1\x1c\x9e\x18\xd9\x61\xf1\x63\x8e\x1e\x34\x7d\x94\x2e\xf4\xe5\xab\xdc\xba\xb8\xc8\x7f\xd2\xef\xaf\x93\x82\x57\x15\x36\x82\x30\x5b\xa4\x0a\xdf\xdc\xae\x71\x19\x92\x0b\x7d\xe8\x05\x06\x91\xe3\x3e\xa5\xaf\x84\x81\x39\x30\xd6\x0f\x16\x1d\x63\x17\x6a\xdd\xd9\x07\x2f\x74\x27\x6d\x91\x46\x2d\x8a\xf1\x88\xe4\x60\x9a\x15\x76\x87\x12\x94\xcc\xd3\x2e\x4b\x13\x46\x06\xdb\x0d\x00\xd9\x60\x29\xf7\x01\x78\x24\x55\xbe\xa0\xd0\xb2\x91\xc0\x96\xaf\x72\x87\x33\xe2\x45\x49\x1d\xdc\x2c\xb8\xd8\x21\x7c\x4a\xce\xf7\x78\xbc\xd3\x40\xef\x31\x25\xfb\x4b\x6f\x21\x21\x74\xe9\xee\x1a\xf3\xcc\xac\x81\xba\x64\x77\xb6\xe2\xb5\x7a\x9c\x1a\x0a\x89\x0a\x49\xbf\x02\x2c\xb8\x65\x68\x31\xa4\xab\x11\x66\x80\x06\x9b\x94\x0c\xa2\xad\x69\x58\x29\x7c\x05\xe6\xd6\xf7\x18\xca\x6f\xd7\x98\x60\x32\x94\xaa\x9c\xcd\xe5\xa3\x90\x72\x9b\xb3\x82\x33\xd2\x8c\x2e\x30\x5f\xbf\xce\x28\x64\xd8\x02\x1b\x5b\x2a\x89\x74\xa3\x8d\xa9\x41\x9e\x04\xf8\xf3\x4b\x93\x63\x0b\x01\x4e\x73\xce\x4d\x40\x4f\xd1\xfb\xb7\xde\xb3\xb2\x0c\x5d\x54\x31\x38\xe7\x7a\xb3\x82\x09\xd9\xe5\x32\x1a\x33\x84\x06\xd7\xc4\xb9\x46\x76\xb1\xe5\x25\x7d\x29\x1a\xf5\x98\xfc\x06\xd8\x17\xbd\x88\xf5\xfa\xa1\x52\xcf\xc0\x8c\x59\x5c\x2e\xc4\xcd\x4b\x5a\x61\x87\x83\xbe\x1c\xdc\x8f\xc8\x11\xd4\x8c\xa0\x5b\x84\xd2\x00\x28\x99\x39\x21\xb0\x84\x4b\xf3\xe1\xd8\xd6\xbc\xc9\x73\x8f\x86\xc4\x19\x60\x5c\x12\x5a\x2e\xe5\xce\xa8\x4d\xe1\x78\xa8\x03\x7e\x5c\xa2\x39\x61\x6e\x25\x55\xcf\x4f\x7e\xd7\x65\x9d\xbd\x43\x1b\x9a\xa2\xfa\x44\x97\x1a\x5e\xc2\x48\x59\x0d\xff\x52\x62\x26\xe5\x04\x80\x10\x93\x99\x32\x4b\x6c\x59\x27\x7c\x0f\xf1\xf3\xcd\x4e\xc4\x77\x69\x83\x76\xa8\x63\x4f\xb7\x2c\x53\x97\xa3\x36\x4c\x1d\x38\xbf\x7b\x5d\xf9\x51\xba\x39\xb9\x93\xf5\x41\x1b\xe2\xc6\xc6\x7f\xb4\xfd\xde\xa3\xc1\x67\xb0\xf4\x90\x86\xa4\x72\x82\x19\xc8\xb9\x8f\x26\xf8\xa2\xec\xbc\xfb\x6e\xd2\x39\x0c\x61\x51\x6d\xd3\x37\xcd\x91\x04\x51\x3b\x27\xb4\xed\x6a\xe9\xf5\x32\xd6\x8b\x89\x04\xaf\x60\xc2\x9b\x75\x54\xbf\xbc\xfd\xce\x93\x16\x2e\xe7\x46\xf6\xc1\xe9\xa6\x18\xba\x54\x75\x80\x7c\x2e\x99\xba\x87\x49\x30\x81\x6a\xc2\x41\x78\x50\x40\xae\x6c\x1b\xae\xd5\xdd\xd4\x99\x00\xb9\x1e\x54\x3d\xc1\x37\x58\x47\x71\x25\x02\xe7\x63\xf8\x18\xdd\x86\x6d\xa3\x15\x14\xd5\xed\x10\x99\x8c\x71\xb3\x54\x74\x29\xe2\xde\x02\x1c\x7f\x20\x60\xae\x93\xfc\xe4\xf1\xee\x4f\x97\x70\x74\xf5\x2b\xce\xb0\x60\x81\xc5\xcc\x5f\x02\xd0\x8e\x00\x14\xed\x6b\xb8\xbe\x66\xcb\x97\xcc\x15\xfe\x36\x55\x65\xde\x7d\xfc\x5b\x3b\x91\x7b\x78\x48\xb2\xd1\x11\x08\xb6\x4b\x07\x75\x0e\x9c\xdc\x70\x09\xe9\x6d\x8f\x9e\xde\xb1\xbd\xcd\xea\xf7\x5e\xde\x13\xe1\xba\x60\x54\x74\x8a\x3c\x5b\x8d\xd5\x72\x51\x2d\x61\x95\x3e\xe7\x70\x97\xb5\x98\x2b\xfa\x16\xaf\xaa\x31\x5f\x2e\xb0\xbb\x10\x01\x54\x49\xd1\xef\xb4\xe3\x1a\xfc\xcf\xf4\xaa\x7d\x36\x9a\xcf\x5a\xe4\xfd\x5c\x25\x74\x42\xe1\xa7\xaf\xa1\x3f\x49\xfc\x22\x77\xc6\xb0\x78\xcd\x59\x82\x50\x95\xa7\xb5\x0e\xb9\x6f\x9c\x25\x54\xc8\xe9\x1a\xb8\x24\xd0\x3a\x4d\x5e\x81\x2f\x0d\x88\x38\xb7\x2a\x98\x12\xd3\xeb\xfc\x6b\xe6\x8b\x35\xe4\xdd\x61\x38\x8f\x2f\xcb\x75\x8c\xfd\x75\xb2\x67\x18\xe5\x10\x5d\x0c\xef\x54\xc7\x8b\x52\xa3\x0a\xf9\x86\xc2\x54\x5d\x06\xc7\xe5\x25\x2c\x0c\x96\x51\x3d\xed\x59\xca\xaf\x33\x00\x44\xd1\x5a\x28\x1b\xd3\x8c\xcd\x1c\x76\x7d\xbb\x0c\xaa\xb6\x3e\x7a\x0e\xce\x31\xe1\xdb\xd7\x7b\x9c\x2b\x7f\x0a\xfb\xe5\x98\x35\xb3\x41\x02\xd1\x26\x1d\xde\x3a\x73\x12\x5f\x6c\x3a\x57\x7b\xc0\xcf\x4d\x0a\x62\xcd\x2e\x10\x1a\x52\xb7\x0a\x7f\x93\xd2\x8b\xfa\x11\xcf\xaf\xdc\xc3\xaa\xbc\x6c\x43\xd4\x79\x44\x52\x7c\xff\x51\x50\xff\x71\x48\x42\x78\x34\x29\xdf\x7d\x06\x2a\xb1\x47\x66\x50\xc5\x5d\x90\x25\x60\xc8\x55\x9b\x0e\x06\x03\xc2\x93\xab\xfc\xa1\x15\x48\x30\x27\xfb\xfd\x0d\x1c\xa5\x75\xd2\x6c\x55\xbf\x73\x00\xaf\x18\x80\x77\xe5\x01\x4b\x57\xc2\x4f\x89\xf9\xfd\xdd\x77\xc5\xf8\xfc\x2c\x60\x17\x47\xdb\xe7\x01\x9e\x7a\x39\x0c\x7a\xf8\x54\x08\x48\x37\x64\xf5\x13\x2a\x68\x41\xc8\x39\xed\x5a\x10\x46\x9b\x8f\xa1\x01\xc4\x21\x69\x56\x87\xc1\x1a\x0f\x74\xd0\x46\xa4\xf7\x72\xc8\x31\x04\x42\xba\x37\x8b\x0a\x46\xef\xe0\xd3\x4f\xe1\xcd\xe9\xf5\xcd\x22\x83\x76\xf4\x92\x53\xc8\x9f\xaf\x34\xc0\xe3\x08\x8e\xf6\x08\x8d\x93\xa5\xbf\x54\xb9\x16\x1b\x80\xf0\xf9\xd5\xe0\x03\x1d\x00\x9e\x4c\x98\xf0\xef\x9a\x06\x94\x7f\xa1\x0e\xeb\x1f\x61\x13\x2a\x7d\x64\x80\xfa\x83\xdc\xd1\xc2\x6a\xd1\x5c\xd0\x15\x82\xb3\x0f\x0f\x09\x96\x9f\xf3\x91\x34\xa6\x87\xc5\x72\xa5\xf1\x44\x4d\x63\x7d\x98\x2a\x81\x60\xc3\xfd\x6c\x53\xe2\x01\xb5\xb5\xce\x62\xcc\x0d\xd0\x19\x53\x19\x10\xca\x30\xae\xce\xa9\x3c\xd8\x40\xa1\x54\xc7\x34\x52\x39\xc0\xd7\xf9\x3e\x5d\xd4\xeb\xdf\xd5\x3c\x10\x28\xfa\xac\xdb\x70\x30\xdf\x82\xf4\x06\x70\x5c\xa8\x35\x94\x12\xd9\x67\xf8\x49\xcc\x97\xea\x7d\x56\xa7\xcd\xf9\x78\xe8\x4c\x3f\x17\x65\xe6\xcd\x96\xcb\xd7\xf7\xda\x9f\xb2\x3a\xa9\x4e\x20\x8d\xfa\xd2\x4d\x06\xc3\xc1\x63\x5c\xd0\x58\x6d\x5d\x36\x55\x06\xd0\x19\x98\x74\xe8\xcd\x68\x71\x54\xae\xce\x31\x40\xcb\x58\x87\xfe\x5e\x45\x91\x58\xc3\x04\x67\x32\x79\xa2\x61\x13\x55\xfe\xda\xd4\x3f\x01\x9f\xe6\x71\x3f\xe0\x7f\x58\x00\xe8\x59\x2d\xd4\x1f\x25\xe8\xcf\x8b\xd5\x16\xe4\xa8\xa4\x9f\xfc\xb2\x5f\x58\xc2\xbb\xfc\x02\x40\x09\xd2\xe1\x20\x79\x42\x9d\xf9\x1b\xa2\x05\x69\xac\x25\x3b\x4c\x83\x1d\x4f\xde\x59\x72\x0c\x25\x47\x6a\x12\xf9\x76\xc0\x05\xac\xfe\x5b\xde\x66\xef\xbc\xc6\xe7\x73\xd4\x81\xdf\x57\xf1\x6a\xda\x0c\xe0\x1f\x3c\xd7\xae\xaa\x2d\xbc\x01\x82\x32\xe1\x35\x54\x5a\x6a\xe7\x60\x0f\x1d\x02\x42\x00\x6e\xd1\x0d\xc8\x3e\xdc\xeb\xbd\x9b\x99\x47\xb3\x94\xd2\x0f\xd5\xae\x00\x82\x2e\x5a\x5c\xc0\x7a\x68\xfc\xbe\x95\x03\x0c\x74\x61\xf2\xec\x03\x56\xca\x75\x69\x36\xed\x90\xe5\xbb\xc1\xc9\x08\xd9\x5f\x5c\x49\x48\xfa\x1f\x2f\x50\x0e\x49\xc2\x7f\xae\x94\x29\xa2\x48\x25\x17\xda\xa5\x0a\x21\xe2\xfd\xc4\x44\xb4\xff\xc7\x23\xde\x90\xc1\xf2\xf2\x87\x18\x84\x94\x29\xd3\xb9\x9b\x75\x19\xee\xf5\x5d\xee\xa1\x84\x52\x2e\x44\xdf\xa8\xed\xf0\x1b\x33\x18\x9b\x49\xaa\xf5\x10\x80\x87\xa1\x7c\x93\x8b\x91\x80\x2f\x43\x03\x17\x8b\xac\x5f\x84\xd2\x72\xcc\x57\x65\xc8\xea\x88\x0f\xad\x07\x73\x72\xed\x5e\xb2\xe5\xbf\xc8\x8f\xd5\x37\xe8\x6b\x3f\x73\x33\x18\x29\x8c\xe2\x4e\xf5\x15\xaa\xb4\xe3\x11\xb3\x06\xcc\x3e\x27\x1f\xe7\x8b\x50\x7e\x9e\x8d\xc6\xf8\xe0\x38\x61\xe3\xab\x43\x3e\x9c\xad\xaa\x8c\x4d\x49\x0c\x4a\x3c\x9e\x7d\xbc\x1f\x81\x0c\x5b\xab\x3c\xcd\x5a\xf6\x38\xf6\x13\x97\xf6\x21\xca\xaf\x8b\x97\x0e\x32\xab\x35\x45\xf2\x1a\xd0\xec\x5b\x60\x07\xb4\x0d\x81\x60\x67\xaf\x7c\x29\xa5\xca\x16\x88\xd7\x85\x1e\x32\xea\x0a\xcc\xee\x42\x2d\xfd\x5b\x98\x82\xf7\xce\x52\x41\x6b\x56\x82\x5c\xae\x49\xf6\xf7\xce\xb8\xec\x5f\x19\xe7\xb2\x4d\xae\x6f\xff\xe8\xfb\x08\x96\x4e\x8c\x80\x9e\xf7\x83\xbe\x98\xe1\x02\x00\x3b\xf5\xa2\x41\xed\x61\xbd\x35\x55\xb5\x0e\x08\x3a\xf0\x11\x9b\x38\xa1\xf0\x47\xbe\xa4\xd2\x7f\x3b\x3b\x05\x30\xb0\xda\x83\xdd\xf6\xec\x3f\xad\xbe\xf4\x27\x15\x1f\x03\x51\xfc\x73\x2e\xcf\xf0\xe8\x22\xd3\x91\xcf\xf9\x29\x67\x86\x73\xec\x9f\x4c\x0c\x19\x56\xfa\x50\x84\x02\x88\xf9\x3e\xed\xeb\xe3\x8e\xc4\xa8\xca\x97\x91\xff\x5e\x1a\x43\xc1\xb9\xd2\xb2\xec\x50\x0f\x16\xca\xe1\x77\xee\xf5\x57\x21\xfc\xc9\x05\xe8\xb1\x66\xdf\x22\x9b\x39\xc2\xb6\x07\x6d\xec\xac\x33\x69\x40\x45\xe0\x2f\x6b\x20\xc7\x84\xad\x16\x5c\x4d\x07\xef\x10\xb9\x3d\xe4\xd9\x74\x5c\x35\x1b\xe6\xa0\x9b\x94\x08\x37\xe9\x73\x1e\xf0\xef\xde\xd8\x75\x10\x26\x16\xe5\xc4\x85\x23\x7c\xc8\x5c\xac\x7c\x77\xd1\x9d\xf8\x96\x3f\xba\x91\xb0\xbb\x0f\xd9\x6e\x63\xb3\x6e\xc6\x45\xee\xd1\x96\xa5\xf0\x52\x3b\xfc\x91\x2d\x0a\xfb\x20\xac\xa3\xf1\x2c\xe9\x31\x56\xa5\xe5\x92\x61\xcc\xbd\x90\x30\xe5\x6f\x95\x6c\x52\x70\xda\xe9\xd7\x92\x64\x33\x38\x06\x09\xfb\x5e\xd3\xe1\x7b\x2f\x60\xf1\x5d\xe3\xfe\x3b\x45\x51\x9c\x6f\x98\x2a\x84\xae\x43\xb4\x2e\xca\xc7\x3f\x54\xff\xbe\x0a\x87\x70\xeb\xa1\x44\x2a\x8f\xf9\x4a\xe9\x80\xd8\x2f\xd1\xcf\xdb\x97\xb1\xcf\xd5\x87\xf8\xb4\x08\x57\x1d\x3f\xc0\x52\x9e\x3e\xd4\x26\xd8\x6b\x85\x8f\xd9\x45\x2f\xef\xbb\xb2\x24\x00\xf5\x66\x89\x26\xaa\x14\xdf\x84\x7b\x70\x43\xa2\xb7\x80\x06\x8a\xb3\xdd\xba\xf4\xd3\xa0\x1f\x4d\xa9\xdd\x32\xdb\xe2\x5d\xff\x05\x0b\xe9\xe2\xcd\x76\x7d\xcb\x7c\x21\x88\x6c\x81\xe6\x2f\xa5\x87\xb1\xfb\x50\xa1\x56\xe6\x53\xaa\xed\x26\x74\xf4\xd8\x76\x58\x42\xcf\x6e\x79\x20\xcf\xbf\x9a\x0e\xcc\x59\xf7\xdb\x77\x02\xe4\xbc\x67\x85\xad\x79\x45\xfc\x4f\xfd\x17\xfc\x5f\xa3\x10\x65\x42\x40\xf9\xf1\xa5\xd1\xb1\x71\x45\xc5\xe9\x85\x7e\x3e\xf4\x40\x15\xda\xd2\x39\x55\xaf\x22\x81\xfe\xec\xe2\x2c\x97\xa1\x0f\x8c\xb9\xb1\x38\x15\x84\x9b\xf2\x6a\xf7\x30\xbb\x69\x68\xc3\x17\x6c\xb6\x69\x7a\x48\x37\xae\x49\x31\xb2\xa2\x54\x06\x64\xe4\x02\xef\xb0\x23\x0d\x51\x6f\xc1\x60\x43\x2e\x3d\xf6\x34\x46\xe5\x26\x3e\x1b\x02\x7a\x0c\x1d\xae\xbb\xa3\xf9\xcd\xbf\x43\x3f\x06\x77\x17\xdd\x80\x87\x89\x66\xe8\x59\xe8\xc1\x71\x63\x73\xfd\x66\x62\xf3\x9e\xcc\x66\xce\x13\x3d\xe5\x5b\xe1\x99\x92\xbc\xb6\xdc\x85\xa7\x11\xf5\x3f\x9c\x39\xbd\x9d\x46\x14\x5c\xfd\x0b\x0d\xd5\x05\x55\x2c\xa6\x06\x99\xcb\x2f\x8d\x2b\x7f\xa1\x06\x86\xcd\xfd\x5b\x76\x32\xb3\x20\x6e\xfe\x4f\x85\x09\xbd\x09\x33\xa1\xde\xd4\x87\x8b\xa5\x66\x44\xe3\x64\xf6\xe6\x7b\xb0\xd1\x52\x0a\xc0\x46\xb2\x8c\xcc\x9b\x96\x96\x5e\x72\x46\xf9\x1a\x37\xbf\x5b\x60\x22\xd1\xa8\xc1\xb2\x77\x6a\x00\xab\xd9\xa9\xf6\x30\x28\x65\xae\xd5\xf8\x1a\xbb\xab\x83\x61\x42\xa8\x9f\x37\xf1\x8e\x22\xcb\xf1\x96\x40\x33\x62\xe9\xd3\x46\x38\x32\xbc\x76\x7b\x23\x04\xa8\x6d\x11\x10\x30\xb4\xb2\x6a\x07\x25\x47\x95\xaa\x8e\x9b\x40\x8e\x8c\x53\xb0\xb4\xd5\xe1\x80\xc2\x94\xa9\x73\xa0\x6d\x49\x9f\xaa\x9a\x39\x1d\xf6\x72\x72\x56\xc3\xd4\x61\xcd\xc6\x62\xef\xab\x13\x2a\xa8\x4e\xd9\x13\x6a\x0c\xbf\x97\x69\x54\x2b\xa2\x53\xdb\x84\xf9\x91\x33\x0f\xdb\x12\x80\x78\x2f\x63\xa5\x8d\xf5\x18\x7d\xf7\x85\x50\x44\x13\x47\x7d\x89\x44\x54\x10\xf5\x3c\xea\xa8\x03\x9c\x79\xe1\x30\xf6\x50\x26\xde\xfa\x9f\x4b\x77\xda\xa6\xac\x41\xe0\x96\xbc\x5b\x9d\x93\x9c\x5b\xa5\xec\x41\xe5\x5c\x2d\x03\x30\x21\x85\x8d\x2c\x75\xe9\x2c\xa0\x04\xa6\x90\x29\xf8\xd7\xf9\x4b\x6d\x87\xd9\xce\xf6\x25\x54\x08\xdb\xdc\x20\x2d\x44\x6f\x2b\xe8\xdb\x5a\xf2\x80\x8d\xa7\xb4\xf2\x87\x02\x6b\x2f\x08\x0e\x36\x4d\x59\xcb\x47\xa2\xc4\xc8\x02\xc2\xab\xbf\xae\x2a\x5a\x35\x1a\x4a\x89\xf5\xd3\xdc\x85\xcb\xd3\x6e\x4d\x9d\x3b\x20\xad\x99\x3d\xab\x69\x60\x79\x7b\xd9\xbe\x0e\xfe\xa0\x01\x79\xcb\x0d\x87\x37\x56\x02\x5d\x6a\x72\xcf\x56\x86\xeb\xb6\x12\x76\x5f\x79\x17\x4d\xe1\x75\x4d\x24\x60\x88\x27\x76\x9f\xa6\x24\xe3\x62\x6e\x9f\xec\xba\x7b\x64\x04\x16\xfd\x38\x37\xe3\x20\xfb\xc9\xba\xda\x27\xff\xeb\x3b\xe5\xc2\x0a\x80\xbd\xd1\x95\x7a\x5c\x98\xa5\xe9\x7c\x64\x9a\xbf\x4d\xe3\x5a\xde\x20\x16\xf0\x45\x6c\xe1\x57\x75\xc3\xe0\x43\x98\xfd\x67\xba\x93\x79\x4b\x42\x4b\x0a\x57\xbd\x7f\xfa\x4c\xe3\x22\xe7\x86\x3e\xee\x6c\x2f\x0d\xee\xd4\xb1\x48\xdf\xb6\x34\x74\xfa\x3a\x7d\x87\x00\xd8\x48\x5c\xbe\xa4\x5a\xc8\xd4\x9c\xfd\x2b\xd4\xbc\x32\x9f\x1c\xe8\x47\x76\xa8\x1c\xb4\x9c\xd9\x04\xf3\xcf\x34\x03\xe4\xf1\xa9\x11\x5c\x77\x20\xa7\x40\x7d\x3d\x2e\x2c\x70\x3b\xc3\xe7\x20\x60\x54\x03\xfb\xfb\x58\xa4\x5f\x4d\x3f\x3e\x24\xcf\xde\x94\xa9\x98\xfe\x34\xe0\x00\xe0\x2d\x79\x0e\xdb\x69\xf4\xf9\x03\x1a\x02\x81\xaa\x48\x0b\x1a\xb5\x76\x2c\x5f\xba\xe7\xd8\xf9\xf1\xff\xa7\xa7\x25\x2e\x61\xee\x76\x95\x69\x0f\x9e\x6d\x78\xea\xfd\x43\x3f\xaf\xb3\x3a\xd3\xde\x6d\x32\x52\x76\x9f\xb0\x9a\xfc\x92\xe1\xc4\x10\xbe\xd9\xc4\x5d\xf0\x29\xa3\x52\xe5\x3b\xd2\xff\x89\x28\xc4\x7b\xa3\x0b\xef\xee\x3a\xb3\xe4\x30\x25\x52\x73\xb6\xc2\xbb\x7f\xbf\xbc\xbd\x68\x86\x5e\x3f\x6b\xa0\xa6\x36\xcf\x45\x9a\x80\x36\xf7\x54\xa0\xea\x9f\x6c\x83\x9c\x9d\x05\xb6\xca\x7b\xc1\xe9\x2e\x00\x86\xde\x42\x97\xff\x11\x26\xdf\x2a\x0a\x5d\x62\x91\x37\x69\x79\x2d\xd7\x97\x87\xa4\x24\x1c\x77\xfa\xeb\xf3\xea\xbe\xc8\x50\x1d\x4d\x2c\x94\x16\x41\x7c\xd6\xa4\x43\x77\x4f\x40\xb4\x57\x3a\x41\x34\xe6\xa4\x41\x09\xa6\xe2\x72\x28\x13\x75\xbd\xcd\x19\xdc\xca\x98\xa3\x10\x9e\xe1\x06\x07\x00\xe1\x8b\x6c\xf3\xff\x45\xde\xb1\x75\x53\xe5\x7a\x29\x89\x72\x7e\x81\x38\xa0\x77\x50\x1b\x38\xff\xe8\x54\xa6\x00\x67\xb5\xd9\xc4\x0a\x7c\xba\xd5\x8d\xae\x6d\xdd\x64\x39\x5b\xe3\x3b\x91\xc6\x97\x2f\x95\xc3\x8e\xf3\x7e\x67\x0e\xd6\x40\xcd\x48\x59\xca\xe6\xd6\x6d\x93\x09\x8a\x6f\xb2\x35\xb8\x9b\x29\x9c\x26\x9b\xcb\xd7\xba\x01\x89\x81\x7c\x89\xf1\x87\xe7\x77\xd3\xf3\x8c\x56\xa7\xa5\x6c\xd0\x57\x94\x10\x8d\x35\xe8\x9a\x8b\x30\x4b\xc4\x05\x13\x89\x4d\xdc\xc5\xcb\x51\x16\x19\xde\x22\x4f\x6a\x6b\x80\xcd\x49\x9c\xbc\x34\x95\x5a\x65\x4b\x68\x07\x7e\x29\x57\xf2\x27\xcd\xf7\xe5\xf0\xce\x5b\x58\x30\x42\x43\xce\x28\x04\x38\x4e\x44\x49\xe8\x0e\x89\x32\x87\x98\xae\xa4\x8f\xe1\xc2\x65\xe5\xa2\xeb\x5d\x71\x95\xaf\x71\xf9\x70\x02\x02\x94\x94\xb7\xd2\x2b\x5d\xa0\xd4\x73\xdd\xdb\x64\xed\x4a\x9e\xe4\x97\xae\xfb\x6a\xc5\x61\xba\x4f\x50\x19\xac\xfe\x2c\xbd\x72\x95\xa8\xa6\x99\x7d\x68\xa1\x01\x36\x17\x13\x92\xc3\x79\xc3\xb2\x73\xce\xeb\x4e\xca\x29\x6b\x49\x28\x56\x0a\x34\x3a\xc7\x04\xa4\x9f\x9d\x28\x08\x33\xea\xd7\x09\x86\xcf\x91\xca\x49\x8f\x10\x60\x98\xc5\x5b\x07\x35\x11\x90\x55\x50\x0b\xf4\x4a\x9a\xb8\x7c\xdf\xb9\x31\xad\xa8\xe2\x63\x97\x1d\xa3\x68\x1d\x5c\x94\x3d\x68\xfe\x22\x47\x6f\xf1\xf3\x0c\x1f\x06\xbd\x40\x0e\xd7\x22\x19\xed\x6b\xf0\x02\x10\xe3\xc3\xc7\x16\xd2\x94\xf2\x35\xf5\x36\xd9\x97\xb4\x80\x7e\xc7\x56\x6c\xc0\xa2\x2a\x7b\x19\x05\x61\x26\x2d\xd3\x27\xe9\x9e\xcd\xfe\x9f\x2d\xfa\x40\xa9\x32\xf1\x4d\x77\x39\x88\xed\x52\x08\x53\x8f\x85\x1b\x66\xb1\xb0\x00\xf7\xad\x3e\x97\x96\xe6\xbb\x82\x87\xd4\xf3\x9e\xf8\x90\x1b\x89\x20\x4b\x60\x4b\x99\x0b\x29\x63\x09\x65\x1f\x8a\x6b\x8e\xf5\xb8\xf9\x76\xdf\x85\x7a\x59\xd2\x02\x18\x43\xab\x75\xd2\x88\xe3\x66\x68\xc8\xdf\xe0\x81\x7c\xda\x20\x63\xb6\xb3\x4c\xed\xde\x9d\x79\x9a\x86\x5f\xa1\xe5\xcc\x7e\xff\x7f\x27\xf1\x47\x14\xa9\x21\x47\xf3\x5b\x73\x0b\x53\x9b\x51\xad\x61\x78\xe0\xf1\x49\x44\x00\x71\xe1\x46\x50\x09\x64\x61\x1d\x40\x92\x26\x78\x1e\x56\x6d\x9e\x42\xa9\x67\x75\xfb\x66\x1d\x34\xc1\x89\x61\xd6\x8a\x81\x87\x61\xa7\xd4\xaa\x51\x02\x03\x19\xe1\xa3\xc2\x43\xc3\x77\xa1\x2c\x4b\x79\xad\xd6\x0f\xf4\x45\x99\x52\x72\x56\x18\xb0\xd2\x3f\xa8\x37\xc3\x0e\xb8\x6e\x5b\xd3\x48\x72\x1a\x9c\xe9\x98\x93\xb5\xf4\xef\x59\x79\xc3\xd2\x97\x7f\x25\x14\x36\xe6\x93\xca\x49\x66\x8b\x5c\xec\xc5\x72\x28\x9c\xd5\x34\x3c\x24\x9a\x94\xff\x54\x3f\x08\x65\x3f\x4b\x55\x3f\x6b\xa1\xca\x32\x75\x6e\xf9\x7c\xee\x93\x45\x5d\xe6\x04\x36\xff\x96\xac\xa8\xbf\xc8\x9e\x18\xb5\x91\xa6\x76\x13\xf6\xb4\x66\xc8\xd3\xc9\x63\x15\xe3\x9c\xcd\xda\x68\x2f\x6f\xfc\x29\x9f\x55\x89\xbf\x36\x63\xc0\xca\x95\x64\xcb\x34\x06\x23\x6f\x2a\xdf\xca\x63\x91\xf7\x53\xc9\xc4\xd5\x2e\x02\xf4\x0b\xb7\x7d\xef\x80\xf6\x73\xbe\xec\xe3\xd7\x99\x0c\x92\x2b\xc3\xf3\x38\xc7\x6a\x43\xca\x24\x37\x06\x3f\x4a\xa6\xa9\xf7\x3a\x7d\x63\x42\xb6\x80\x3c\x63\xd8\x73\x69\xb3\xca\xde\xb8\x9a\xf6\x7d\xf6\x60\x12\x56\x9d\xea\x1b\xa5\xff\xd7\x9a\xff\xbc\x3e\xb4\xf9\x61\xdb\x87\xa8\xb9\xd1\x7d\x19\x0f\x74\x98\x7b\x40\x34\x2d\xe0\x1e\x10\xb0\x77\x9b\xba\x94\x40\x74\x91\xaa\x5d\x90\xc7\x9f\xc5\xaf\x75\x3f\x8d\x30\xba\x67\xf7\x99\xa8\xf4\x1f\x2d\x97\x71\x16\x2f\x94\x9a\x3e\x41\x3a\xf9\x9b\xc2\xe5\xf4\xf8\xc5\x48\x5c\xd5\xee\x7d\xfc\xa2\x8e\x56\xa1\xf9\x3b\xfd\xaf\xd5\x7a\xf9\xf4\x76\x59\xef\xff\xe6\xe5\xa2\xa4\x1c\xea\x19\xc7\x84\x07\x12\x40\x91\xed\x93\x30\xbc\xc7\xf0\x1c\x04\x58\x79\x14\x40\x0c\xc8\xf8\x0f\xa1\x32\xb2\x73\x70\x14\x99\x55\x8b\x54\x83\x07\x0b\x61\x1a\x57\xea\x1f\x40\xa4\x37\xa9\x39\x03\xea\x89\xa9\xa2\x17\x3c\xa3\x24\x41\x53\xbe\xb2\xa1\x4a\x5f\xe9\xa9\xc6\x8f\x55\xfa\xfd\xad\xd4\xd0\x77\xe8\x96\x2e\x7f\xf8\x9a\x69\x5e\x7a\x83\x92\x3a\xc8\x9b\x84\xae\xd0\x1e\xb2\x42\x67\xab\x7f\xb3\xc5\x98\x65\xb2\x3a\xc3\x65\x47\xf0\x89\x7b\xa9\xd1\x71\x7b\xf9\x0e\xfa\x89\xec\x90\xd5\xfc\x66\x3e\x97\x4b\x00\xb5\x44\xef\xf8\x41\x75\x29\xc8\xae\x98\x68\x8b\x1f\x0b\x59\xc0\x80\x61\x2a\x1c\x38\x96\xd1\xa8\xb1\xdd\x21\x30\xca\x2d\x2e\xcd\x40\x72\xb4\xb4\x4f\x99\x42\xac\x1b\x7a\x3c\x76\xcd\xda\x9a\xb2\x05\x9c\xb4\xa5\x20\x0e\x34\xc1\x3f\x4d\x46\x9c\xf6\x68\xc9\x72\x99\x95\x44\xd1\x16\xcd\x9a\x45\xc8\x35\xbe\x9c\x0d\x76\xb7\x0b\x4a\xc6\x15\x9d\x9c\x26\x48\xbe\x30\x6b\xff\x44\x62\xd2\x54\x53\xe1\x86\xff\xb2\xb8\x90\x58\xab\x23\xf3\x1a\x89\x6e\x85\xa0\x3d\x5d\x6d\x6e\x6c\x03\x85\x08\x7a\x82\x10\x42\xf8\x55\xa2\xe3\x43\x85\xa8\xb4\x94\x23\x57\x7d\x97\xe5\xc1\xf1\x1b\x1a\x3b\x38\xa7\xb1\x7c\x5c\xd2\xc9\xa9\xa3\xfe\x3c\x56\xf8\xb2\xaa\x23\xdc\x6f\xf2\x67\xfe\xc9\xa7\x6e\x2f\xed\xdc\x8f\xcc\x5a\xdf\x5b\xf4\x76\x61\x2f\xe9\x86\x0c\x53\xff\x8a\x5e\xb5\xae\xdd\xe0\xb6\xcf\x5b\x13\xc1\x92\x66\xed\xe9\xad\xc5\xaa\x9b\x41\x0d\xd6\x37\xde\x1a\x53\xab\x72\xd9\x55\x48\xca\xb9\x4b\x74\xc2\x51\x8a\x57\xcb\xce\x05\x48\xe5\x6a\xc9\xc8\x4f\x49\x4b\xd9\x8a\x9d\x4b\xc3\x0f\x4c\x3d\x9b\xc7\x64\xd9\x6c\xb0\x06\x4b\xdc\x8d\xc2\x55\x93\x28\xd9\xdc\x64\xc0\xfe\xf8\xe0\xb8\x1e\xd9\x70\xd5\xfe\x82\xae\x42\xfe\xcf\x12\x4b\xd0\xca\xdf\x25\x06\x09\xb3\x06\x66\x50\x1f\x10\xd7\x85\xf3\x78\x57\xb2\x54\x59\x2a\x35\x3a\xb7\xeb\x40\x0e\x43\x31\x27\x15\x67\x73\x4c\xbd\x72\x95\xe3\x8c\xf6\x4d\x75\xfe\x87\x3a\x93\x52\x27\xb9\x7b\x7b\x6d\xd2\x2b\xf9\x70\xf5\x99\xe5\xad\x28\x7b\x59\x37\xb5\xe9\xe1\xce\xfb\x31\x52\xd6\xfc\x8d\x7d\xa9\xd6\x3a\xf3\x65\x17\xfe\x3c\xdd\x11\x92\x97\xcb\x18\xa9\xd3\xfb\xf2\xea\xf5\x44\x53\xe2\x15\x58\xb4\x84\xaa\xc8\x09\xa8\x64\xe0\x95\x35\xb4\x9d\xb3\x20\x79\xdb\x05\xc0\x83\xf3\xc3\x71\x50\x5d\x6f\xcc\x6e\xf0\xe0\xc2\xb6\xb8\xeb\x6a\x74\xb4\xed\xbf\xb5\x74\x56\x75\x81\x4e\x74\xb7\x5c\xc9\x42\x54\x22\x85\xb2\xba\x52\x8f\x2b\xc1\x12\xb3\x7d\xff\xa5\x4f\xde\x77\xe3\x4d\x28\xdb\x47\xbd\xe6\x37\xab\x36\x20\x8d\x8a\x47\xba\x9a\x40\x6e\xa8\x2d\xfa\xc3\x9d\xf8\xad\x6a\xfe\x96\x5c\xcb\xce\x49\x04\xc6\x58\x28\x6b\xfd\x00\xb0\x22\x9f\xb3\x73\x9a\x43\xfd\x72\x25\x3e\x4a\x58\xdd\x2a\x68\xbe\x49\xa4\x84\xe8\xdc\xfd\x6a\x42\xcd\xdc\x14\xe2\xeb\x54\x95\xa1\x95\x7f\xdc\xb9\xf5\xce\xe0\xc8\xdf\x57\xcb\x09\xb4\x78\x4d\xb6\xd7\x48\x70\x56\x78\xf5\x95\xc2\x8c\xa9\x9d\x93\x31\x83\x6c\x6c\x60\x14\x90\x56\x40\x6c\x02\x6c\x13\x21\x98\x6a\x82\x71\x3a\x33\x82\xf7\x81\xb5\xd9\xd8\xab\xa9\xf9\x2f\x72\xb7\x4d\xa8\x0a\xd0\x78\x76\xa5\x6b\x18\xff\x1b\xa5\xfb\x41\x92\x43\x4a\x0f\xc7\x6d\x18\x25\xbf\xe9\xed\xb1\xe8\xee\x6c\x4d\x8d\x1c\xc4\xb0\x85\x1d\xfc\xe8\x63\xe9\x8e\xf2\xaf\x73\x17\x53\x4a\x77\x1e\xf2\xd2\x15\x24\xc7\x98\x5e\x78\x6c\x3a\xf7\x72\x52\x77\x23\xf8\x66\x1b\x6d\x77\x14\xa2\x5f\x90\x2d\x2c\x79\xaf\xf3\x37\xe7\x6c\x7e\x95\xc4\xfe\x9a\x99\xc4\x69\x2b\x25\x6b\x95\xaa\x7a\xa8\xcc\xa0\x0e\x8b\xb5\x10\x99\x86\x95\xbc\x46\x30\x60\x11\x31\x27\xc3\x87\x45\x01\xe6\x62\x0a\xdd\x8e\x66\x24\xbc\x79\x4a\x6f\x35\xa5\x9e\xa7\x9c\xd6\x9e\x4b\xa0\x2d\x9e\x0c\x15\x3a\x81\x9f\x90\xf8\x71\x31\xfe\x73\x1a\x6f\xf6\x73\x76\x8f\x38\xc0\x21\xed\x71\xda\xae\x4e\x7a\x4d\x3f\x8a\xc5\x3f\xa0\x13\xfb\x71\xa6\x7a\x11\x7f\x30\xe3\x9b\xbe\x8c\x9a\x39\x24\xdf\x2b\x21\x58\x9a\x20\x95\x10\xcc\x56\xe9\xd5\x24\xe3\x36\x32\x54\x58\xa1\x1b\x5c\xb3\x25\xbe\xa2\x0b\x00\x54\x95\x19\xb7\x2c\x84\xc2\xf8\x8f\x0b\x3b\xa0\x41\x2c\xcf\x95\x7a\x3a\x0d\x44\xd7\x5a\x5d\x31\x78\x44\x01\x4b\x6c\xfe\x11\x3f\x9a\x20\xbd\x0f\x39\x64\x39\x4b\x51\x13\x7e\xd0\xfd\xb8\x55\x27\xa9\x0d\x5a\xc8\x6a\xae\x7d\x42\x77\x6f\xa0\x48\x1b\x64\x7a\xd9\x4a\x3b\xf9\xe2\x02\x15\x61\xb6\xa8\xac\x12\x4a\x00\xc2\x1d\x5d\x6e\xe1\x68\x9f\xd5\xbe\x4c\x89\x8d\x04\x14\xa3\x1b\x08\x5f\x2a\xb7\xcb\xa6\x7b\xa9\x14\x02\x62\x7c\x3e\xc6\xf8\x38\x98\xd4\x70\x41\x75\x6b\x26\xa3\xc0\xea\x3c\x2b\x04\xf9\x11\xcf\xc4\x18\xbd\xef\xab\x37\x15\x04\x7a\x77\xad\x36\x33\x9b\xaa\x5a\xcf\x7d\xac\x8e\xa8\xa3\x2f\x19\x0c\x0e\xa3\x5f\xa4\xb5\xf2\x59\x2b\x76\xf1\x29\x6c\x9e\xf8\xe1\xd1\x6a\xaa\x77\x77\x11\xfb\xbf\xeb\x65\x63\x07\x68\x53\xaa\xe8\x2e\xc9\x6f\x63\x71\xb2\xb7\x53\xbe\x5c\x9f\x52\x06\x2f\xf3\xd5\x89\x28\x8c\x4a\xb9\x1f\xef\x77\x4e\xbf\xc0\x6a\xe4\x4f\xd3\x66\xc5\x93\xd3\x64\xe9\xd3\xee\x07\x55\xcb\x52\x42\x25\x40\xe2\x6f\x75\xf4\xe8\x7f\x87\xf8\x66\xcf\x1a\x35\x8e\xd4\x73\x23\xd4\x95\x8c\xd7\x60\xe7\x3b\xa9\x97\xee\x26\x76\x63\x29\x8d\xf2\x1e\x86\x31\x07\x90\x94\x76\x26\xdc\xd9\x09\xe4\xd0\x53\xf9\x6f\xe4\xbd\x25\x05\xe6\x54\x12\x0a\x5d\x4c\xfc\x3e\x53\x54\xe4\x6d\xed\xc7\x95\x70\x27\x24\x1e\x84\xa5\x57\xe5\x66\x2d\x04\x93\x3f\x5a\xb4\x4f\x49\xb1\x50\xe3\x3f\x32\xd7\x60\x93\x2a\xdd\xdd\xba\x30\xe8\x5a\x3f\xb5\xcb\xb7\x9f\x97\xd5\xeb\x17\xd9\x3f\xc6\x98\x9e\x48\x56\xe4\x74\xcc\x2b\x25\x76\x6b\xa7\x00\xa5\xc2\x7d\x12\x6c\xa3\xc4\xff\xb2\xfd\xb6\x18\x33\xb6\x84\xdc\xc6\x6a\xd4\x9b\x1c\xa0\x76\x92\x6c\x21\xb0\x9a\x07\xda\xa2\x09\xdd\x3b\x78\xb5\xb5\x47\xd9\x45\xf7\x70\xea\x4c\xd9\x4a\x47\x15\x2e\x6f\xd3\x2a\xcc\x70\x10\xb8\xa6\x0a\x8d\x82\x3c\xb3\x0a\x37\xd0\xb5\x4c\xc7\xb2\x3a\xf3\x61\x32\x79\x5f\x65\x58\xf2\x2e\x43\x25\xd8\xde\x0c\x5a\xcc\x4d\x74\x09\x01\x7f\x31\x18\xa0\xe4\xd7\x6f\x75\x71\x9a\x28\xbf\xcb\xe1\xba\xde\x9c\x6d\x07\x6e\x7b\x4a\xbf\x91\x6b\x97\xb3\xa7\x4b\xee\x6c\x8e\xff\x34\x44\x60\xa2\xa3\x34\x7e\x4c\xbb\xfb\x95\x3b\x84\xc9\x6f\xec\x4c\x96\xff\xe7\xdf\xd8\x04\x30\xb1\xe4\x02\x5b\xfa\xb9\x99\x18\x96\xed\x64\x5a\xee\x24\x27\x4a\x82\x89\x69\x16\x0a\x07\xa3\x75\x1b\x2b\x09\x8b\x09\x7a\x1b\x04\xf7\x25\xfc\x49\x94\x7d\x4f\x6d\x26\x8e\x8b\x3f\x1b\x23\x0d\x06\xa4\xaf\x23\x38\x21\x51\x02\x0b\x9a\x31\x47\x68\x82\xa6\x2e\xd9\xe1\x2c\x04\x36\x79\x47\xbc\x58\xff\xf1\x25\x69\x17\x99\x0c\x7a\x05\xcc\xbc\x47\x18\x33\xec\xbd\x06\xa8\xc7\x30\xd8\xcc\x47\xa3\xce\x60\x91\x95\x7b\x46\x9d\x41\xc3\x90\xcf\xed\x61\xce\x6d\xbe\x59\x32\x1a\xf8\x1d\x00\xc9\x57\xf9\x8c\x4f\x1d\x10\xaf\x91\xdd\x5e\xbe\x43\x0c\x4a\x4b\x36\xb8\xfa\x39\xc9\xf6\xe9\xca\xce\xd7\xe9\x74\xf3\x4a\x86\x0a\x5e\x02\x05\x61\x23\x5f\xf5\x3f\x4b\x41\x16\xe2\xbb\x5f\xc9\x70\xc9\xde\xb3\xfb\x1c\xc7\x76\x39\xf9\x00\x54\x33\x84\x34\xcd\x2c\xd7\xea\xc9\xd4\x35\x8e\xcf\xba\xba\x8e\x5f\x4e\x21\x5d\x84\x2c\xc2\xbf\x5b\xb6\x97\xb1\xe5\xa3\xc9\xf9\xc3\x67\xcb\xea\xaf\xf6\x61\xf6\xa2\xc1\x6b\x0a\x3f\x92\xa3\xf7\x25\x74\xa4\x77\x67\x1d\x1c\x95\x05\x76\x4a\xf8\x50\x1e\x71\xbc\xaa\x01\x03\xd0\x62\x74\x4d\xcd\x3a\xc3\xce\x25\x90\x80\x4c\xff\xf0\x2d\x10\x48\xdc\xaf\xe0\xfd\x55\x73\xa1\xf7\xa8\xe7\xf5\x6b\x97\xd4\x19\x0d\x3f\x67\xb0\xf8\x08\x41\xcb\x5f\x1a\xdc\x98\x18\xe9\xcd\x3c\x8d\x20\x1f\xe7\xaa\xb8\xc9\x91\x99\xde\xd4\x50\x29\x38\xd4\xe4\xd6\x63\x39\x40\x6b\x38\x90\xf5\xdb\x0f\x41\xd3\xe7\xca\x79\x64\x8b\xd4\x7d\xd3\x61\xfc\xcd\x6b\xf9\x75\xc5\x89\xdd\xc3\xc4\x9d\x4c\x0f\xad\x8e\x71\x17\x18\x82\xe9\xf6\x27\xfd\xa1\xe5\x5c\x39\xac\x79\xbf\xc4\x0c\x61\xd5\x80\x3f\xb1\xb7\x71\xea\x9a\xb0\x2c\xdb\xe4\xcb\xbf\xd1\xb8\xb9\x0e\x96\xf3\x53\xed\x53\x22\x16\x54\x53\xac\xc1\xf9\x5f\xf2\xeb\x92\xbe\x9b\xae\x81\x32\x4b\x86\xa0\xe6\x3d\xfc\x5b\x1e\x3a\x1b\x2c\x9f\x5f\x55\x05\x16\xdc\xd8\x78\x94\x7a\xd8\xfb\x85\xa9\xef\x7d\xae\xd3\x52\xcf\x4c\xbe\x92\x8f\xb1\xf2\x50\x35\x71\x93\x43\x12\x7f\x01\xe5\x03\xab\xf8\x15\xc4\x09\xa4\xb8\x5c\x07\xe3\x3f\x34\xd1\xa4\xf2\xd3\x5e\x62\xe3\x3f\x21\x4e\x0b\x25\x80\x92\x90\x48\x91\x5c\xfa\x08\x66\xf1\x41\xa6\x9b\x55\x05\x26\x10\x37\x31\xf8\xa2\x6c\xd8\x8f\xd6\x1d\xc5\x15\x7b\x48\xd8\x3e\x9b\x5a\xaf\x06\x3f\x50\xc3\xf4\xa3\x85\xc4\xf1\x6d\x45\x11\x0d\x86\x15\xa5\x53\x4c\xaf\x2b\x04\xf0\x72\x5d\x8a\xfb\xa0\x40\x08\x91\x0e\xca\x9a\x94\x7f\x08\xe8\x63\x61\x91\x1d\xa6\x2c\xe9\x94\x87\x99\xff\x75\x81\xb9\x7c\x28\xed\x0a\x64\x7f\xf4\x7c\xc1\xae\x93\x14\x80\xcc\x52\xb5\xea\x05\xe2\xe7\xe4\x47\x28\xc0\x51\x5a\xe7\x49\x71\x08\xdd\x7c\xde\xb0\x90\x84\xe2\xad\x86\xe1\xd5\x18\x77\x3e\x9d\x02\xcc\x2c\xd7\xd0\x26\x3e\x43\xdc\x76\xf3\x41\x07\xab\x6f\xd1\x60\x4b\x0c\xfe\xe5\x8d\xa0\xd5\x7a\xde\x38\x8f\xa6\x15\x76\x6f\x49\x8c\x04\xfa\xdf\xc4\x81\xb6\x9d\x92\x09\x84\x7f\xc3\x38\xaa\x04\x8f\xa7\xd4\x07\x48\x52\x98\xa9\xe4\x3d\x53\xba\xeb\x46\x24\xe1\x70\x53\x99\xc1\x22\xe2\x6c\x47\x63\x09\x77\x4b\x90\x70\x19\x5a\x44\x06\x16\xbe\x97\x39\xbc\x38\xa2\x5d\x5f\xf2\xba\x2c\x7f\xf6\xe7\x96\xfb\x41\xdf\xc2\x73\xe3\x10\xd6\x35\x86\x3b\x01\x3f\x31\x6a\xfd\xf1\xeb\xfd\x8c\xcb\x5f\xbc\xfe\x0f\x86\x40\x38\x64\x7f\x04\xab\x29\x75\x86\xd3\x96\x9f\x74\x11\x27\x7f\x6a\x91\xcc\x66\x73\x1c\xb3\xd4\x1e\xb2\x3e\xc4\xb8\x30\xcb\xbf\x5d\x75\x45\x14\x19\x14\x34\x30\xd3\xc0\x66\x5d\xb2\x9b\xda\xbf\xcb\x8a\x57\x05\x51\xa3\xb4\x50\x9b\x05\xab\x64\x70\xf2\xa8\x93\xba\x54\x0b\xb3\x9b\xb8\xe5\x0a\xf6\xe0\x0d\x08\x2e\x78\xe8\x89\xaa\x08\x11\xf0\x0b\x3d\x58\x0e\x5c\x33\x12\x21\x3c\xeb\xa2\x22\x9d\xe6\x2b\xc6\x76\x1e\xd0\x44\x55\x20\x2b\xcb\xe8\x6a\x27\x02\xe1\x20\x67\xd0\xbf\xc2\xe2\x0a\x02\x33\x9c\xe2\x3f\xf8\xe5\x3d\x04\x3f\x94\x4b\x4b\x49\x50\x45\x6a\x74\xc7\x3a\xda\x49\x28\x07\xc6\x87\x07\x4a\xf7\x6c\x1b\xa7\xfb\x24\x27\xd8\x92\x0e\x6e\xd1\xb0\x46\x8e\x06\x85\x2c\xdc\xe9\xa4\xc2\x8b\x0f\xe3\xca\xe5\x65\x31\x17\xf7\xca\x1f\x9e\x2a\x82\xa6\xa7\x12\x54\x90\x15\x7e\xf2\x27\x80\x81\x60\x9a\x70\xea\x8e\xf1\xb7\xdb\xbe\xa7\x53\xe2\x4e\x82\xa5\xdd\xd9\xb8\x10\x84\x46\x1a\x1f\x61\x50\xe0\x73\x73\xd5\xb3\x1f\x77\xdb\xe6\x44\x4e\x4f\xfc\x44\x20\x89\xcb\x7d\x0a\x4a\x68\x59\x39\xf7\x1a\xde\x07\x2d\xa2\x95\x50\x53\xb5\x7b\xe9\x40\xe8\x8f\x01\xbe\x1f\xa1\xbe\x21\xf3\x63\xa8\x23\x44\x72\xbd\xc1\x5a\x53\x49\xf9\x18\xfa\x49\xa7\x08\x3a\xea\x1f\x99\x7c\xb8\xb9\xdd\x14\x34\x08\xc3\xa9\x91\xa6\x3b\x5d\xe7\x7f\x9d\xd4\x87\x2e\x7e\xa4\xea\x16\x58\x08\x30\x62\x0a\xce\x0f\x58\xdc\xa7\x47\xfe\x38\x0f\xc2\x1c\x17\x19\xfb\x5e\x3f\x02\x41\x0c\x5d\x30\x94\x0f\xea\xae\x0c\x3e\xa9\x5b\x3d\x86\xa6\x30\x75\xdb\x97\x00\x1d\x96\xfa\xa3\x65\xb7\x99\x00\x44\xe5\xc0\x25\x94\xb3\xad\x58\xd2\xf0\x3f\x4a\xcd\xe7\x35\x68\x93\x53\xab\xfc\xb4\x39\x75\x01\x41\x4b\xd1\x87\xa7\x52\x73\x25\xe4\xd9\x6d\x7f\xb0\x27\xd4\x45\x21\x65\xd2\x8f\xa5\x51\xd9\xf9\x5f\x67\xe9\xa7\xc6\x97\x50\x4f\x68\xc8\x90\x55\xb6\x7d\x22\x3d\x74\xc2\xcd\x06\xf8\x61\x5f\x82\xa6\xbc\x28\x33\xc8\x86\x17\x50\x83\xf1\x94\x12\xed\x0a\xc9\x81\x3d\x98\x3a\xdc\xd4\xe7\x65\xe2\x1b\xd2\x50\x7c\xf8\xe0\x3c\xf5\x6b\x19\x78\x48\x18\xf8\xf0\xfd\x95\x5c\x5d\x22\x8a\x1b\xf1\xfc\x14\x84\x5a\x2c\xde\x16\x32\x07\x4a\xbb\xbb\xb0\x16\x9b\xc9\x4f\xc1\x6a\xaa\x51\xa0\xfc\xb1\xae\xee\xd3\x20\xc1\x29\x9e\x48\xbf\x8c\x57\x6f\x22\xe8\xb0\x18\x15\x90\xdf\x63\x67\xd0\x21\x16\xf6\x15\x2b\xd9\xeb\x7b\x0c\x6c\x01\xf1\x7f\x6f\xd6\x38\x81\x3c\x14\x6a\xa5\xdc\xfa\x3e\x3b\xff\xaf\x91\xb6\x6e\x9b\xf2\x64\xbc\xe9\x17\xe7\x13\x49\x89\x30\x30\x89\x01\x44\xcc\xfc\x6f\x97\xe3\x7e\x03\x99\x40\xdf\x69\x25\x29\x05\x1b\xd9\xcd\x40\x77\x5e\xb5\x8a\x83\xe5\x13\xe5\x8c\x2a\x04\xa3\xd8\x45\x88\x55\x5f\xb9\x12\x4a\x72\x4b\xf1\xa7\x14\x56\x1e\x18\x3b\x26\x7b\xf6\x01\x78\xf7\x78\x99\x6a\x06\x03\xc6\xbf\xc0\xb8\x7a\x26\xe4\xa4\x66\x96\x29\x4e\x61\xe9\x0b\x63\x6a\x05\xe7\xff\x4e\x5e\x2b\x46\x84\x53\xdd\x80\xae\x96\x3b\x77\x4b\xee\xc3\x32\x33\x94\xa6\x4a\xe9\x64\x53\xb2\x2c\xb9\xce\x1d\xbd\x46\xfe\xc2\x4c\x71\x32\xbd\x12\xf7\x4b\xf4\xa9\xf3\xdb\x22\x8d\x65\x79\x46\x66\xdb\x83\x7c\xd6\x39\x91\x9d\x6a\x96\x2b\xeb\xd5\xbd\x27\x78\x3d\x54\x98\xa5\x9b\x68\x8d\x08\x81\x20\x87\x10\x43\xd5\x52\xb2\x64\x25\xb7\xe5\x3b\xb1\xca\x56\x02\x64\xa0\x7c\x1a\x34\x4a\xfb\x33\x9b\x2a\xb1\x39\xd7\xa2\x7e\xda\xf8\x2f\x4d\x43\xeb\xb9\xda\x60\x97\x34\x14\xc3\x2c\x2d\xc1\x50\xdf\xa2\x4d\xdd\x87\xe1\xd8\x3d\x70\x85\xa0\x15\x05\x87\x98\xda\x0c\x4e\xe0\x7a\xc8\x32\x2f\x4e\xd6\xcc\x58\xda\x7c\xaf\xcb\x97\x5c\xe3\xba\x19\xd7\x88\x3b\x4d\x1d\x78\x62\x50\x1f\x3d\x5f\x93\x85\x73\xc8\xe8\xc9\xa9\xb4\x64\x6b\xe3\x23\xab\xbd\x1b\xda\x8e\x79\x7b\xf7\x0f\x75\xef\x96\x6a\x2d\xb4\x8c\x7e\x53\x50\x5c\x2a\x7f\xe1\x31\x24\x71\x2f\xe0\x49\x77\x64\xf3\x2a\x69\x25\xee\x29\xfd\x18\xbd\xe9\x39\xf3\x93\x9d\x85\x8a\x98\xc7\xe9\x29\x2e\xe5\x2e\xaf\x05\xfa\xd3\xdc\x02\x75\xb8\xdb\xaf\x19\x3a\xd9\x65\x3f\x29\xc3\x2a\x57\x09\x12\x6e\xad\xc1\x05\xeb\xd5\x12\x1e\x63\x8a\x6f\xa3\x54\x4e\xeb\x53\xe7\xc1\xfd\x78\x4d\xe7\xf3\x53\x02\xcb\x19\x87\x0c\x1f\x2a\x67\x96\x25\x1d\xee\x3d\x40\x23\x7c\xb0\xb7\xd3\x59\x5a\x3c\x98\x7f\x12\x02\xff\x44\x55\x7f\x43\x3e\x65\xee\x10\x08\x18\xe6\xfe\x8d\x0c\xd5\x21\xc9\x8e\x7b\x31\x24\x81\xb2\x32\x9b\x91\xfc\x0d\x86\x08\x65\x97\x30\x33\xdb\x3a\xdb\xc5\xd3\x63\x93\x59\x49\x16\x77\x7a\xc8\x73\x23\x62\x65\x7e\x54\xc4\xa1\x92\x15\x96\x38\x82\x1c\x6a\x26\x5f\xce\x0d\xdd\x45\xe4\x8c\x3c\x66\x94\x08\xc7\x90\xee\x96\x76\x8a\x13\xfd\x61\x6c\xe0\xe3\x84\xf0\x44\x0a\x27\xe9\x1d\xa6\xc3\x4a\x10\xe8\x2b\x7d\x21\x0c\xb1\x28\x7f\x57\x24\x86\xf0\x1c\xa8\x7c\xe8\x92\xd9\xec\x9e\xaa\xdc\xcb\xe7\x4b\x24\x24\x66\xf0\xe0\x33\x18\x5c\x71\xaf\x4d\xcb\x92\x14\xbc\x55\x40\xdc\xe1\x6d\xe4\xae\x66\x1f\xdf\xcf\xbd\x8f\x79\xc8\xbd\x37\x2e\xef\x5e\x4a\x39\x4b\x38\xf0\x3c\xb5\x0a\x94\xf2\x9d\x73\x25\x03\x95\x2a\x50\xc0\x67\x6d\x61\xdf\x43\x24\x85\x90\x87\xec\x61\xa2\xa3\x25\xfe\xc4\x04\x0e\xb1\xcc\x7f\xa6\x98\x86\x9f\x34\xee\x87\xf8\x0b\x5b\xd8\x65\xf5\x54\x8a\xd9\x59\x6f\x1f\xbc\x57\x79\x59\xa3\x02\x64\xba\x92\xcb\x45\xab\x9f\x59\x03\xbd\x24\x3f\xd1\x33\x00\xe1\x3f\x0c\xac\xc7\x92\x10\x0d\x72\x3c\x50\x2f\x93\x2f\x03\xb3\x21\x3f\x17\xa2\x73\x7a\xec\x2e\x55\x36\xa5\x43\x7f\x4a\x96\xaf\xcc\x03\x47\xba\xd3\x0c\x34\x49\xea\x54\x7e\x5c\xce\x2f\x17\xec\xaa\x15\x62\x79\xa8\xe8\xda\x10\x9f\xb8\xbd\x02\xaa\x08\xbd\xca\xe8\xfe\x0b\xa0\x58\x5b\x92\x53\xff\xcf\xec\xfe\xff\xe5\x39\xf1\xef\x4e\x8e\x3b\xed\x3f\xb2\x51\xca\x6f\xc0\x76\x33\xd7\xd4\xb3\x38\x74\x26\x83\x7f\x59\xd6\x73\x9e\x43\x10\x22\xe0\x00\xec\x30\x9e\xfb\xed\x6a\x36\x8a\x4d\xb1\xb1\xb5\x75\x53\x57\x31\xe0\x87\xf9\xd3\x96\xd2\xe7\xf6\x3f\xe9\x44\xeb\x31\x34\x04\xa3\x37\xf8\x04\xf0\xe7\xa6\x1c\x24\xf8\x9f\x53\x9d\xb1\x41\x6f\xb2\x4e\x2e\x41\xbf\x38\xa7\xca\x01\x2d\x47\x19\x6f\x9b\xf1\xa8\x79\x77\x9d\xc1\xdf\xd8\xe1\xe3\x11\x9a\x66\xe9\x3a\x9a\x21\x1a\xfd\xbe\xd1\x78\x9a\x80\x19\x81\x58\xd1\x43\xcf\xd0\x94\x8b\x2a\x0e\x5d\xd5\x21\x2e\x39\xe7\x84\x03\xc4\xa4\xc8\xbf\x25\xce\x03\x77\x4a\xaa\x28\x53\x8a\xbc\x05\xdb\x80\xb4\x08\x86\x23\xd9\x71\x7b\x1c\xdf\x63\x4b\xd9\x4f\x8d\xb8\x17\xc2\xb4\x5f\xe8\x95\x6b\x67\x9f\x8a\xae\x22\x83\xf2\x81\xe5\xdd\x4f\xad\x8a\x16\x8c\xdf\x29\x4a\x61\x5f\xd4\x05\x96\x6c\xee\xd8\xad\xd2\x76\xe3\xd4\x63\x0e\xb9\x5c\x8c\xdc\x23\xe7\xf8\x94\x7f\x81\xdd\x9d\xe3\xec\xf7\x2e\xcc\x8b\x50\x64\x88\xcb\x40\xda\x68\xf5\x89\xfe\x92\x66\x3c\x0c\xf8\x38\x7a\xc1\x1e\x01\x01\x32\x91\xa2\x0e\x6f\xdd\x4b\x8b\x61\x7a\xb9\xf2\x71\x08\xba\xa3\x76\x97\xf2\xaa\x59\x0e\xc7\xa9\x14\xa0\x64\x27\x34\x2d\x0d\xe7\x09\x2c\x74\x13\x90\xa5\xb2\x2f\xee\x77\xfd\x4e\xf2\xa1\x54\x56\xe3\xa6\x62\x71\xdf\x77\x59\x46\x84\x70\xd5\x45\x09\x30\x60\xd1\x77\x96\x53\x37\x7d\x1f\xd2\x54\x73\x9f\xc2\xf0\x88\x14\x8a\xdd\xfe\x25\xfb\x24\x13\xbc\xa7\xe8\x17\x68\xd0\x01\x05\x59\xd5\x39\xd5\xb1\xb3\xf1\xb8\x52\x18\xa7\x36\x76\x3a\xdc\x7b\xff\x2d\xfd\x5b\xc1\xad\x44\x99\xa3\x64\xdf\x4c\x51\x5a\xf6\x23\xbc\x9c\x67\xa7\x32\x22\xc1\x26\x0c\x1f\x90\x15\x6b\xb3\xef\x69\x1e\x65\x9a\xe4\x2e\xef\x16\x0d\x5b\x68\x81\x3a\xa7\x99\x2d\xe6\xb8\x5d\x5c\x95\xad\x1e\xfc\x50\x21\x54\xee\xb9\x41\x14\xb6\x6a\x5f\xf6\xb0\x5e\xf1\x8c\x7e\x0f\x56\xf1\xd6\x97\x7c\x43\x19\x0f\xfb\xe4\x5c\x2d\xfe\x5b\x28\x67\x21\x88\x64\x39\xb9\x63\x56\x6f\x60\xcd\x66\x6f\x37\x61\x1f\x0f\x53\x3f\x2c\x58\x01\x55\xec\xba\x71\x80\x7a\x4c\x9e\x0a\xaf\x46\x63\x4a\x4c\x6b\xeb\x07\x4e\xa1\x64\x38\x51\x72\xaa\x96\x66\xa4\x6a\x7d\x49\xfe\x2a\xd4\xba\x69\x73\x22\xa2\x6c\x56\x27\x69\x35\xe6\x7b\x2d\xb1\x2e\x1a\xf1\x65\xcd\xd6\xce\x1a\x98\x79\xa0\xb6\xb4\x65\xd6\xaa\x5a\x00\x8f\xa7\x94\xed\xf4\xfa\xe2\xcd\x62\x57\xb6\xb5\x9f\x5e\x76\x38\xf7\x08\x9f\xde\xe6\x5e\xee\xec\xf9\xa5\x90\xd0\x20\xc2\xb2\xf3\xd3\x97\xde\x66\x81\x95\x17\x44\xba\xad\xdf\x45\x8a\x81\x3b\x3e\xcf\x52\xfc\x2b\xf5\x2b\x11\x31\x77\x8c\x23\x76\xca\x50\xa3\x6e\xe9\xa5\x40\x9f\xcb\xe9\xf4\x1a\x45\x38\x81\x87\xd4\xc5\xb4\xc8\xe9\xd9\xa5\x29\x74\x3b\xf9\x0c\x9b\x8e\x20\xeb\x43\x8b\x8d\x0f\x61\x8a\x08\xe4\x4b\xcf\xcf\x66\x49\xa1\x1b\x8b\x3a\x81\x37\xbb\xb2\x6a\x2e\x92\x57\x1a\xde\x02\x8e\x69\x01\x07\xe4\x7f\x9e\xd6\x8f\xe5\x90\x83\xff\x98\xb9\x2a\x87\x45\xd7\x6e\xd2\xf7\x84\xf9\xab\x5a\x75\xb8\xf4\x2d\xa9\x51\xd6\x00\x0e\x45\xfb\x68\xae\x96\xbf\x33\x2a\xc0\x51\x79\x64\x3b\x28\xc0\x4c\x9f\x8e\xa0\x26\x25\x75\x20\x12\xe1\x36\xa3\x6f\xac\x4c\x0c\xb3\xa6\xe4\x94\xef\x63\x69\xef\x97\x20\x7a\x93\x69\xbb\x4b\xb6\x64\xcc\x73\x28\x7b\xa8\xbc\x32\xbe\xe1\x67\xf9\x76\xb2\x9b\x6e\x36\xcb\xf8\x21\x3e\x92\x8b\x87\x31\x6c\xc4\x62\x55\x27\xe6\x1f\x9d\xeb\x3f\x65\x33\x08\x97\xf4\x93\x1a\x6a\x10\xea\x6b\xed\xaf\xc1\xfd\xd1\x73\x1e\x78\x5e\x8d\x37\x50\x1c\xcc\x82\x01\xa4\x73\x0e\x32\x2f\x10\xc3\xa3\xa7\xf7\x50\x0f\x0d\x64\x28\x32\x1c\x1a\x2e\x56\x9e\x6f\xdf\x84\xae\x87\x46\xf9\xbe\x53\x85\xc5\x29\x6a\x53\x93\xd3\xea\x54\x6a\x44\x68\x39\xf3\xf8\xb3\x73\x0b\xa7\xdb\xb2\x94\x49\x2f\x40\xe9\x41\x90\x05\x90\x4a\x4d\x50\xe8\xbc\xe9\x73\x1c\xfa\xf2\x7f\x37\x75\xe4\xec\xe6\x08\x2c\x6c\x68\x89\x59\xb8\x69\x00\x5d\x7b\x72\x2e\x1b\xd9\x0e\xe0\x7d\x6a\x90\x60\xd5\x24\x8d\xf4\x4b\x8a\x82\x82\x00\x6b\x73\x80\x27\x36\x48\x1e\x96\xe3\x7c\x4c\xd1\xde\xc6\x80\x3e\x29\xc4\x97\xa2\x99\x53\xd5\x07\x0a\x2a\x26\x9f\x27\xcc\x61\xa4\x1f\x72\x56\xeb\xae\xfb\x56\x5b\xec\xf0\xa4\x2f\x27\xb4\x1f\x76\x97\x4e\x90\x1f\x7b\x6e\x45\xdf\x2f\x1c\xef\x35\xf9\xd7\xa3\xe5\x3d\x3c\x75\x3b\xcf\x17\x30\xe0\xa9\x24\x19\x7d\xbf\xfe\x4a\x86\x75\x79\xdc\x53\x55\xe7\xc6\xb8\x7f\xd1\xdc\xff\xa1\x1f\xb5\x98\xcd\xea\x9b\xea\xff\xf6\x82\x18\xc1\xd1\x72\xfd\xe2\x1e\x22\x38\x4b\xb7\x6c\xd7\x91\x8c\x92\x89\xfb\x07\xbd\x42\x90\xb5\xb0\x81\x6f\xa6\xea\x54\x18\x40\x65\xb7\xa3\x15\x56\x22\x89\x80\xaf\x73\xd3\xa3\x99\x1e\x4d\x45\x05\xa3\xee\xa4\x1c\x7f\x77\x1a\x22\x80\xc2\xfc\x9e\xdc\x40\x3c\xc2\xfb\x92\xd5\x41\xa7\x11\x0e\x21\x02\xc1\x3c\xb0\x80\xaa\x56\x40\x0d\xa7\x2d\xbe\x29\x3c\xd0\xbd\x80\x78\x50\xba\x3d\x4a\x44\x2e\x74\xd9\xb9\x4c\xeb\x50\xf2\x7c\xa9\xac\x9c\x61\x46\xc6\xb7\xec\x7e\x62\xf5\x15\x7b\x8d\x5d\x28\x6b\x85\xc9\x19\xaf\x90\xf6\xdc\xaa\x22\x5a\x6f\xad\x75\xe4\x93\x91\x16\x5f\xbd\xc4\xd6\x79\x33\xb0\x45\x91\x28\xa3\xc3\xab\xe7\x61\x24\xa0\x07\x23\x43\x2d\xb9\xb0\xc7\xf7\x69\xfb\xd6\xff\x6f\x47\xf3\x8b\x4f\x8b\xb3\xa1\x17\xa8\x99\xff\x10\xc4\xc1\xca\x6e\x0c\x39\x55\x67\xc8\x90\x4b\xd5\x70\x3e\xea\x0b\x48\xad\x18\x85\x90\x56\x76\xab\xa1\x46\x2c\x90\xeb\xb2\xc4\x4f\x40\xb8\xf7\x1f\x9f\x9c\x1f\xb6\xe9\xe1\x09\xfe\x7e\xb8\x89\x58\xae\x41\x4f\xf7\x83\xbb\x2c\xf7\x10\xad\xf8\xa3\x9c\xe7\x01\x7a\x2a\x37\x0d\xe9\xf5\x33\x44\x4c\x40\x32\x2b\x18\xf6\x46\xee\x10\xf2\x73\x8a\xb7\x8c\xdb\x17\x47\x3a\xc4\x0c\x1a\xa8\x0c\x6f\x75\xfa\x3e\x51\x53\x97\xaf\x5b\xd3\x3e\xf4\x0a\xc3\x92\x15\xee\x6c\xf2\x3b\xdb\x4b\xac\xaf\x68\x58\x04\x5f\x93\x8c\x12\x1a\xec\x7c\x6a\xf9\xb3\x3f\x56\xda\x46\x97\x40\xda\xad\x63\x45\xc0\xa0\x55\xc8\x1b\xa0\x88\x75\x71\xa5\xe8\x17\x71\xeb\x95\x24\xd0\xf4\xe9\x06\x5c\x07\x26\xb8\x54\x79\xf1\xae\xe5\x65\xd9\xc6\x46\x28\xf9\xfd\x16\xd9\x3b\xaf\xa6\xde\x6c\xe8\x4e\x4a\x0b\x25\x23\xbf\xe3\xdf\x7b\x8f\xd2\x4b\xa2\xaa\xab\x50\xb3\x9c\x3e\x88\xa3\x94\xf6\xc1\x30\x08\x63\x65\xd9\x31\xcc\x93\xaf\xfe\x17\x61\x59\x4b\x70\x9a\x01\xeb\xd0\xb2\xa5\x75\x1a\x93\x7a\xe0\x61\xd8\xc2\x3d\xd7\x77\x80\x66\xc3\xa8\xd1\x42\x7d\x20\x28\x7d\x07\xfb\x73\x90\xca\x9b\xe7\x72\xc7\xfb\x22\x7f\x81\xcd\xc1\x9b\x1e\x25\xcb\x24\xbe\x73\x49\xe2\x53\x9d\xec\x1c\xd9\xd2\x56\xc7\x78\xbf\xa7\x25\x34\xdb\xfa\xba\x00\x82\xf6\x76\xa9\xb6\x38\xdf\xef\x09\x12\x94\x72\x9b\xbe\xd2\x23\xd4\x90\xca\x89\xf1\x8c\xba\x68\x7f\x4b\x3e\xa9\xd2\x96\x22\xfb\x67\x7b\x37\x60\xb5\xf8\xe3\xda\x0a\x98\xf5\x6c\x7d\x14\x97\x75\x57\xfb\x53\x4b\x25\x36\xe2\x22\xfd\x67\xc4\x3d\x66\x19\xe1\x48\x0a\x14\x6d\xa4\xf7\x4a\xd3\xd7\x6a\x48\x0b\x35\x7c\x8f\x26\xf6\xea\x2a\xba\xdb\xe1\x6e\x5f\x64\xa5\xc9\x0a\xc0\x69\xbf\xf9\x49\x4f\xeb\x5e\xee\xb1\x8b\x4a\x5a\x2a\x58\xee\x00\x60\x35\x17\xe5\x97\xa3\x29\x89\xb5\x3d\x8c\xa2\x9b\xf9\xc7\x3d\xcc\x4d\x5b\x9a\x92\x72\x4a\xec\xcf\x69\x0d\x7c\x02\x06\xf0\xf1\x89\x24\x82\x1a\x4a\xe0\xb4\x99\x69\x49\x76\x04\x72\x2d\x95\x9f\x3c\xe7\x4e\x3a\x46\x73\xd9\x29\xe1\xd9\x80\x1b\xbe\x23\xbf\x10\x53\xe9\x35\x06\xcc\x36\x3c\x77\x91\x72\xe7\x4a\xcd\xde\xbf\xb0\x65\x5b\x3f\x06\x7a\xa4\xec\x0f\xfe\x0b\x64\x35\xc5\x1c\xfd\xf4\x84\xde\x5d\x7e\xa8\x5d\x8d\xb6\xa0\x31\xd5\x1c\xb7\xc9\x48\x01\xf3\xba\x23\xa5\xa7\xc4\xad\x49\x4c\x1b\xc1\xd8\x5a\x52\x0e\xbf\xba\x6f\xa3\xce\xf0\xc6\x2c\x35\xda\x24\xc5\x8e\x12\xb2\x3f\x87\x0e\xe8\x72\x1c\xf8\x1c\x42\x88\x79\x07\x49\x09\x80\x5a\xdd\x3e\x0e\x9b\xff\xac\x63\xb2\x94\xfd\x4a\x41\xeb\x95\x03\x18\x8a\x0a\x42\xa9\x20\xd8\xde\xdd\x54\x87\xe0\x6e\x19\xe7\xf7\x1b\x97\x8c\x60\x26\x95\x8f\x9a\xb7\x46\xb7\x16\xdf\x90\x52\x1d\x53\xed\x3f\x28\x0f\x6e\xd2\xba\x6d\x23\xac\x5c\x12\xb7\xcc\xac\xcb\x85\xed\x2c\xf6\xb3\x1d\x4e\xc4\xe7\xf2\x35\x8a\xf2\x39\xcb\x91\x10\x52\x75\xd3\x28\xb2\xb7\xdf\x21\xf2\x84\xfb\x28\xf4\x4f\xc9\x9f\xcb\x11\x69\xf6\x77\xa9\xb4\x46\xaf\x34\x6d\x9a\xa1\x55\xe3\x41\xf1\xac\x6b\x28\xd2\xe6\x12\x4b\x55\xad\x80\xc2\x76\xdf\xa4\x5f\x01\x8c\xa7\x0a\xb2\xb2\x72\xa2\x45\x7d\x1c\x65\x26\x53\x39\xc9\x79\x93\xa2\x0b\x33\xd5\xca\x70\xea\x75\x05\x97\x1a\x20\xe4\x72\x2e\xca\x93\xb6\xe0\x94\x9c\x8b\x03\x71\xca\x56\x02\xbd\x93\x94\x88\x77\x1f\x6b\xc9\x12\x48\xa7\x6a\xfd\x67\x54\xfd\xfe\x13\xd3\xf0\x9f\xf4\x64\xc9\x3a\x2e\x46\x8b\xfc\xab\xde\xc7\x7b\xcb\x95\x40\x27\x3f\x07\xa8\xca\xd1\x39\x31\xe9\x50\xa3\x85\x7a\xc0\x15\x67\xcf\xab\xba\xc8\xd6\xec\x07\x16\x17\x52\x10\x18\x94\xff\x95\x0f\xb9\xda\x26\x0f\x99\xc2\x55\x43\x9e\x15\xbc\x5d\x80\x2a\x95\xae\x6c\xa3\x01\xea\xbb\x31\x99\xa6\xf9\x6c\x34\x76\xa7\xa9\xd1\xbf\x52\x3e\x98\x4e\x3f\x8f\x89\xce\x90\x6a\x6e\x3c\x87\xaf\x35\xba\xbb\x16\x42\x7b\xc0\xd8\xeb\x6d\xa9\x7d\x08\xf5\x87\xd1\xea\x03\x13\x78\x94\x43\x37\x72\xb1\x56\x8f\xb2\x2f\x86\x57\x6d\x4a\x4b\x85\x57\x21\xe9\x91\xb5\x47\x1f\x19\x20\xb1\x49\xf9\xf3\x23\x93\x6d\x12\xa2\x2f\x4c\xaf\x7b\x5b\xcb\x9e\xbf\xc0\x4f\xdc\x43\x33\xfb\x5e\x12\x25\xf6\x9d\xb9\xf0\x68\xc4\xd0\xd8\x1b\xfd\xfb\x8e\xa0\x9d\x4f\x0a\x6c\x77\x08\x4c\x19\x02\x4b\xf8\x94\xbe\xf5\x7b\x4f\xa7\x01\x63\x5c\xf7\x2f\xdd\x9f\xfe\xaf\x14\x0e\x7d\x87\xb3\x5b\x46\x80\xb2\x6e\x4f\x11\x50\x71\x8f\xa1\x84\x79\xeb\xd1\xb2\x1f\x76\xbb\x2c\xdf\x99\xdd\x42\x76\x4b\xfc\xf6\x68\x35\xe0\xd4\x89\x68\x4f\x91\xbf\xcd\xf8\x26\xb2\x0f\xac\x2c\x58\x75\x49\xcb\x53\xd1\x24\x63\xb6\x19\x62\xe3\x5f\x68\x58\x67\xb4\x50\xe2\xa9\xa3\x74\xe6\x14\xfa\xc1\xec\xdc\xf5\x95\x22\xcc\x75\xfd\xa1\xce\x13\x5c\x86\xf6\xd1\xec\xae\x10\xee\xd2\x3d\x1c\xe4\x76\x1c\x0a\xe6\x58\xda\x9e\x56\x8b\xe5\xbd\x90\xf4\xfb\x2c\xa3\x2d\x12\xda\x4f\xb2\x9d\x5a\x5b\xb1\x60\xa5\xe4\x5e\xa2\x0d\xfc\xca\xd1\x46\x1e\x97\xb3\x36\x87\xd9\x61\xfe\x27\x05\xae\x1d\xe6\x7b\xb4\x6d\x38\x17\x5f\x6a\xf8\x13\xad\xbd\x32\xd3\x78\x77\xb9\x04\x7b\x60\x2e\x7d\x98\xe6\xde\xc4\x0b\xdc\x75\x5a\x91\x15\xcb\x9f\x51\x56\x4b\xb9\xb1\x25\x0b\x9d\x16\xf7\xb5\x93\x5c\x8e\x9d\x26\xf4\x0f\x01\xd8\xd8\x91\xe8\x09\xc0\xda\x24\x29\x1e\x60\x3e\xae\x06\xf2\x59\x52\xaf\xc5\x79\x6f\xd7\x0d\x8a\xf6\xcd\x76\xf6\xa6\x37\x80\x20\x3f\x33\x71\xb8\x29\xfd\xbd\x79\x68\xee\xa6\xf3\xaf\x44\x0b\xd1\x64\x6f\x45\x89\x9f\xca\x11\x67\x0b\x83\xc9\x2c\xf6\xb2\xa8\x00\xa4\x06\x2c\x4f\x91\xe8\x2b\xe2\x01\x72\x6d\x36\x08\xee\xd3\x09\x3b\xe3\x9b\xf8\xf2\xfe\x31\x84\xfc\x7b\x3d\xc6\x11\x53\xa3\x7d\xdb\x88\xe9\xc6\xcb\x2e\xfd\x65\x73\x5b\x0e\xf9\x37\xf6\xb3\xb7\x64\x9c\x6a\x0a\xfb\xbf\xb4\x4b\x26\x5d\xa2\x07\x32\x42\x70\x3f\x84\xa5\x16\x3f\x58\x94\x50\x19\x40\x8e\x24\x53\x25\x8d\xd4\xab\x9e\x21\xdc\xed\x23\x17\xf6\x54\x1d\xb0\x4a\x35\x3a\x90\x0b\x56\xe4\x5d\x6a\x79\x48\x7c\xca\xdf\xcd\x8c\x76\xb3\x10\x35\x86\x3c\xeb\xc5\x23\x83\x77\x0a\xaf\x2a\x0c\xd3\xf3\xdb\xa4\x32\xf1\x2d\xd0\xd6\x5e\x63\xe0\xce\xd1\xbb\xc6\xed\x7d\x5f\x3b\xdc\xbd\x9e\x58\xfe\x7e\x3d\x90\x94\xf4\xbd\xca\xc1\xaf\x53\xa1\x42\x53\xf1\xab\x50\x42\x8c\xe4\xa0\x6c\xad\x20\x12\x92\xe2\x7f\x54\x8e\x99\x74\x79\x94\x30\x4f\x81\xf2\x05\xcb\x2c\xe4\xbe\xce\xc5\x41\x8b\x59\xeb\x5b\x7f\xfc\x41\xf6\xdb\x8d\x6d\xee\xfb\x3d\x6c\x13\xc7\xc7\xe3\xc2\x9f\x06\xd1\x11\x22\x6c\xfc\xd5\x72\xa9\x13\xe5\x89\x35\xa5\x4f\xf9\xcc\xb1\xe3\x77\x7a\x5c\x74\x5a\xc8\x20\x3a\x8b\x1e\xb7\x50\x40\xde\xc4\xa5\xe0\x78\xa7\xad\x52\x41\x01\x59\x5d\x2c\x8a\x58\x4e\xda\xb0\x29\x2f\xd7\x28\x74\xcb\x3d\xd5\x3b\xe8\x3a\xcf\xc5\x24\xcb\xa9\xd4\xda\x7c\x52\x20\x80\x74\x5c\xf4\xb5\x37\x8f\x14\x25\xd9\x63\x6b\xc7\x17\x18\x4b\x55\xf9\x80\xa6\xfc\x01\x41\x55\x2b\xbb\x4a\x8d\xf4\xad\xba\x54\x90\xfa\x58\x76\x93\x21\xb2\xc7\x55\x58\x40\xd0\x6c\x0b\x78\x80\xa4\x74\x58\xa2\x70\x17\x80\xb9\xc3\x0f\x83\x82\x01\x4f\xbf\x96\xf5\x02\x6a\xa7\xbc\xfc\x96\x6d\x2f\x20\xdd\x58\xd3\xf6\xf0\x9f\xc2\x09\x06\xb8\x15\xd6\x8b\xc9\x79\x0b\xcf\x91\x7d\x09\x5e\xfd\xae\xf2\x1f\x72\x8e\x55\xd8\x99\x1e\x6f\x6d\x40\xd8\x4b\xb2\x7e\xa1\x0c\xde\x2e\xce\xb0\xb4\x22\x21\x2d\xfe\x27\x67\xee\xc7\xe3\xb4\x2b\x74\x86\x34\x9a\x3e\x97\xa1\x7c\x42\x9a\xd7\x94\xe5\xdd\x7c\xbb\xb2\xf7\x6d\xc2\xa9\xbc\x7e\xb7\x6c\x41\xf9\xb7\xf8\x84\x5e\xff\x64\x5f\x9d\x2e\x40\xf0\x52\x11\xd3\x02\xfb\xa1\xc6\x3f\x8a\xfc\x47\x36\x38\xe1\x83\xca\x46\x79\xff\x61\x94\x4b\xa9\x00\x3a\x3b\x4e\x9c\xc1\xd8\x9b\x2b\x7b\xaf\xfc\x2d\x6a\x4f\x81\x9a\x76\x63\x13\x3f\x42\x1c\x7b\xe7\xf2\x7e\x90\x95\x65\x64\xfd\xff\x60\xac\x00\xb9\x3d\x03\x1c\x5b\xca\xf5\x00\x3d\x54\x99\x50\x62\x68\x29\x11\x1f\x77\x87\x64\x69\xa9\x70\x19\x0f\xe8\x2f\x88\x79\x7c\x12\xa5\x0e\xf6\x9b\x0c\xa9\xcd\xd8\x5c\x99\xee\xf1\xed\x88\x6a\xf7\xe7\x2b\xeb\x0f\xe2\x5c\x79\x57\x51\x33\xd8\xdf\xa6\x1c\x93\x7b\x2d\x11\x72\xae\x30\xc6\x15\x2a\xf1\x50\xe0\x56\x96\x4f\xc2\xa4\xd5\x2c\xca\xe1\xad\x13\x7d\x75\xdf\x86\x1a\x09\x21\xa1\x43\x22\x85\xfe\xbd\x29\x3d\x4e\x43\x6a\x03\x28\x3b\xc6\x24\x74\x1d\xdb\x45\x78\x69\x7c\xb1\x6a\xe5\xbf\xa3\x5a\xd8\x21\xea\xab\x84\x8f\xb8\x8d\xda\xe1\xbf\xa1\x82\x70\xef\x9e\xbc\x79\x66\x11\xd8\xc4\x3d\x25\xd9\xb2\xe0\x27\x20\xc0\xf1\x24\x09\x5f\x0c\x55\x10\x2d\x61\x41\x04\xcc\x8e\x28\xe0\xb9\xb0\x6e\xc2\x5f\xf5\xed\x4d\xf5\x09\x7b\x6b\x35\xe4\x4f\x01\x64\xcd\xc9\x28\xd9\xa4\xfc\x37\x4b\x6e\x23\x5b\x93\x79\xfc\x2b\xfc\x04\xe6\x0f\x51\x5b\xf4\xd0\xca\x61\x5d\xd0\x36\xda\xa8\x94\x48\xeb\x55\x1e\xa0\x92\xf3\xca\xee\x9a\x65\xdb\x79\xa8\xe5\x22\x63\x38\x5d\x56\x98\x8c\xc2\x9a\xc2\x11\x0a\x90\x8d\xaa\x93\x90\xee\x21\x7e\x7d\xbc\x84\xa5\x62\x5e\x33\x84\x99\x29\x30\x1a\x04\x2d\xdc\x84\x8d\x55\x9d\x70\x3e\x10\x65\x82\x77\xfd\xcc\x1d\x55\x47\x9f\x1a\xc0\xb1\xcd\x6e\x89\x62\xc0\x5e\xc3\x73\xb3\xbc\x3c\xfe\xf6\x51\x73\xea\x71\x19\xc6\x66\xb4\xee\x25\xe4\xd4\xaa\x48\x76\x95\x3b\x21\x7a\x75\xf9\xc7\x58\x63\xcd\x97\x0f\xd7\x3f\xf8\x40\x98\x6c\x5f\x26\x1d\x01\x0c\x61\xe3\x7e\x6e\xfa\xd6\x85\x07\xd4\x64\x88\x85\x18\xce\xd8\xb8\xbc\x66\xbf\x70\xac\x6a\xaa\x33\xe1\x2f\x85\x62\xc4\x64\x60\x60\x6f\xb5\xc4\x88\x4d\x35\x8c\x18\xe6\xf0\xe7\x25\x44\xa1\x0a\xbb\xa9\xeb\x7e\x33\x62\xc4\x48\x11\x87\x01\x08\x3c\x3b\x2d\x7a\x9c\x41\x55\xe7\x4a\x75\x42\x34\x1b\x1f\xb9\xeb\xd2\xcc\x4b\xec\x21\x7b\x02\x90\xb2\xd9\x5b\x37\x17\x2e\xa4\x30\x33\xcc\xd4\xb4\xe8\x4e\x75\xba\xd9\xc0\x73\x27\x5c\x31\x09\xfe\x14\x2c\xf9\xfe\x8f\xaa\x2b\xcb\x52\x5d\x47\xb6\x73\xe1\xe7\xfc\xbc\x49\xc9\x0d\xc6\x89\x6d\xb9\xdc\x40\x92\xa3\x7f\xda\x4d\xc8\xdc\x5b\xb5\x16\x32\x09\x1c\x1a\x5b\x52\xc4\xee\xa0\x87\x0a\x6f\x07\xfe\x60\xf7\x51\x0b\x66\x30\x43\xd4\x18\x17\x05\xe6\x8e\xf5\xef\xc5\x13\x5b\xd5\x82\x31\xad\x52\x5c\x83\x91\xe5\x1a\x21\x08\xb5\xb5\x50\xed\x7f\x99\xf7\x2f\xde\x48\xae\x86\x95\xe8\x98\xf7\xe1\xfb\x3d\xb2\x61\x07\x1f\x83\x66\xaa\xbe\x3f\xec\x57\xc5\xd2\xd3\x2f\x6c\xee\xf3\xe1\xa5\x58\xfc\xb8\xb4\xef\xe7\xce\x36\xe2\x34\xba\x8a\x46\x7a\xa9\xff\xbb\xa0\x9e\x8c\x8e\xde\x2d\x5b\x99\x6f\x5f\xab\xcf\x82\x8e\x2e\xb7\xee\xa7\x15\x8f\x65\x25\xdc\x6c\x1a\xf1\xb6\x36\x2e\xa3\x65\x26\x2a\x2e\x9e\xbc\x58\x3c\x47\x0b\x1a\x57\x16\x12\x5d\x54\x5e\x2e\x33\x4f\xe2\x40\xe9\xe3\xf5\x28\x70\x8a\x6e\x6c\x1a\x3d\x1b\x4e\x60\xf6\x2a\xaf\x7e\x48\x1d\x49\x0b\xea\xa3\xf3\x14\x0e\xf7\xad\x7b\xe0\xff\x61\xdf\x77\x85\x93\x5f\xee\x14\xe9\x78\x34\x6e\xc2\x27\x8b\x13\x25\xc7\xe3\x7d\xae\x4a\x4e\x7b\xaa\xb5\xee\x64\x81\xdf\x12\xc5\x04\xe4\x1d\xbc\x75\x93\xb0\xdd\x02\xd5\x6e\xcb\xf4\x67\x3e\xcb\x3e\xc3\xfc\xb2\x6c\xf1\xa4\x9d\xdb\x0e\xe0\x3d\x87\xe9\x29\xeb\x47\xec\xbd\x6a\xd8\xe5\x67\x2f\x90\x7c\x5c\x21\x27\x58\x80\xda\xa0\x02\xd7\x28\xe0\x36\xdb\x2b\x37\x9e\x84\x54\x51\xf3\x89\xcb\x69\x34\x2f\x5f\x35\xcf\x78\x15\x3c\x67\xf5\x3d\x07\x71\x26\x02\xd8\xd2\x21\xae\x4f\x9b\x2f\x95\x69\x9b\x1f\x14\x37\xde\x54\xee\xd8\xbd\xe2\x8a\xce\xa5\xef\xc5\x7c\x51\x26\xda\xc7\xb9\xae\x4a\x76\x75\x38\x6a\xb9\x7d\x96\xb9\xa4\x63\x63\x8f\x9d\xa7\x88\x72\x2b\xdb\x00\xb8\x37\x39\x83\xaf\xec\x15\x68\xbd\xb7\x8b\x56\x8c\x6c\xc0\xa1\x3a\x9b\x36\x6a\x24\x97\x52\x27\xc9\x7f\xb9\x81\x88\x7f\x8e\xea\x25\x47\x00\xac\x28\x99\x94\xeb\x55\x33\x0c\xcc\x4c\x15\x23\x2e\x77\x3c\x5d\xfd\x64\x01\x00\x76\x04\xdb\x80\x9c\x6b\xa4\xd7\xe8\x1f\xe9\x35\xba\x7c\x6e\xca\xee\x21\x99\x9d\xb3\xb9\xfa\x59\x9e\x30\x9e\xd2\x50\x15\x47\xd9\x0e\xb3\xdc\xb0\x4d\xaa\xfd\xd9\xb7\xdd\x0a\x24\x9a\xa6\x57\x17\x52\x34\x07\x1d\xbc\xfe\x14\x1e\x29\xab\x76\x1a\x8d\xdd\x27\x6d\x9a\x52\x57\x66\x7d\xf7\xef\x5b\xc1\x51\x2a\x68\xa8\xe5\x74\xff\x07\x56\xa7\x2e\x83\x1a\x7d\xc8\xbf\x48\x07\x2e\x53\x0e\xdf\xd2\x5f\xf0\x50\xfe\xcc\xa9\xf8\x9c\xf6\x8b\xfc\x60\xaf\x16\xce\x43\x9f\xbc\x79\x13\x07\x4d\x13\x6e\x40\x60\xd7\x40\x22\xba\xb7\x3b\x76\xef\xc7\x67\xf9\xc7\x3f\x00\x26\xe0\xbf\x51\xaa\xa0\xa5\x72\x6a\x4c\x28\xd6\xb0\x14\x58\xb0\xe9\xbf\x5d\xa6\x65\x37\x74\xff\x69\xf4\x7f\x63\x65\x03\xd7\xbd\xcb\xa7\xcc\xa6\x14\xae\x69\xc2\x04\x6a\x09\x03\xd4\x55\x94\x70\x40\x9f\x59\xcf\xb7\x8b\xdd\x52\x5f\xa2\x8d\xf8\xf6\xb2\xe9\x10\x6d\xe7\x9c\x73\xd4\x3b\x3c\x75\x3d\x5e\xf6\x0a\x15\x1f\xe8\x9b\x38\x27\x1f\x78\xbf\x12\xe4\xc6\x59\x38\xc9\x31\x72\x71\x2a\xc5\xcf\x36\x88\x0e\xc8\xee\xe1\x2e\x7e\x02\xc6\xaa\x6f\xca\x35\x7e\xaa\xa8\x71\x50\xee\x4d\x42\xbd\xa3\xee\x2e\x60\x80\x06\x8e\xd4\x8d\x88\x42\xb8\xab\x95\xf3\xdd\x7f\x96\x73\xd7\x7e\x2d\xa9\x65\x77\x77\x8f\x94\xb9\x93\x51\xa6\x2e\x56\xce\x80\xa0\x1d\x46\xbd\xd5\x83\xf1\xf8\x89\x94\x54\xc0\x66\xbe\xfd\x26\xee\x54\xe6\x3a\x31\x87\xaf\x8d\x2e\xe0\xae\xe3\xf2\xf1\xd8\x02\x8b\xa8\xb1\xb9\x6b\xdf\x5e\xa6\x80\x7b\xd9\xc9\xb6\x61\x4a\x3f\x4d\xf9\xef\x8f\xa4\xe3\x0c\x20\x4e\x95\x44\x96\xd3\xd9\x02\xd1\x26\xff\xbd\x19\x3e\x5a\xa0\xbe\xf3\x7d\xb8\x17\x55\x7e\x06\x93\x8e\xf8\x5e\xcb\x43\x93\x7d\x22\xb0\x2d\x88\xbc\x5e\xa8\x48\x6a\x82\xbe\xb9\xb8\xc4\x23\x44\x41\x77\x35\xb3\x56\x1b\xb5\x47\x5f\x9e\xa1\x37\xd7\xbf\x22\xa7\x1e\x96\x89\xe6\x29\x4d\x55\xef\x01\x8a\x52\x74\xaf\x41\x8a\x34\x3f\x19\xc1\xfc\x4d\x13\xc3\x9c\x5d\xd5\x6c\xfd\x5b\x65\x20\xf3\xfa\x54\xf4\x80\x8d\xed\xef\xa4\x4d\x76\x0e\xd9\xc1\xd8\xf2\x15\xb1\x13\x45\x53\xac\xff\xd2\xe1\x7a\x70\x05\x54\x0e\x48\x7c\xd9\xcb\x14\xb5\xcf\x0e\xf5\x0b\x4a\x3d\x09\x4e\xad\xd1\x0d\x48\xe2\xa3\xce\x79\x29\xc1\x44\x54\xa6\x5a\xfc\x84\x37\x2f\xeb\xa0\x64\x47\x92\x52\xa2\xf6\x2e\x87\x18\xac\x15\xd4\x19\x64\x8a\x6e\xd5\xca\x0a\x05\x8f\xe6\x23\x44\xef\xc8\x5c\xce\x8f\xd5\x59\x0c\x45\x11\x7f\x11\x44\x01\xaa\x28\x08\xa1\x8b\x9c\xde\x9a\x64\xe2\x2d\x73\x83\xbf\xdd\x46\xd8\xa2\xa8\xd9\xc1\x53\x1f\xad\x2f\x6c\x20\x22\x08\xde\x05\xd3\xbd\x5a\x44\x48\x44\xc8\x7f\x27\x5f\xdb\x9c\xb5\x02\xd7\xab\xfc\xf1\x95\xee\xe3\xe2\xa7\x4c\xff\xb6\x3d\x99\xbc\x7e\x21\x48\x66\x62\x7b\xca\x99\x3f\xaa\x7a\x7c\x32\xda\x84\x84\xf7\xa5\x1a\x04\xb8\x7b\x2b\xc7\x50\xc0\xca\x01\xc8\xe7\xd1\x8d\x31\xa8\xd8\xc9\x18\x0e\x6e\x5a\xbc\xb5\x08\xe6\x8d\x1b\x16\xe8\x0c\x17\x9f\x8b\xa0\x2d\x6d\xb1\x48\x2e\x68\xaf\x8a\xc2\xe5\xc0\x00\x0e\xcb\xa0\x72\x94\x61\xd3\x1d\x46\xf6\x70\x90\x5b\x24\x06\x3c\x8f\x47\x99\xb7\x55\xb5\x94\x5f\x41\xbc\xa2\x1c\x8b\x31\x60\x16\xc3\x2e\xb0\x24\x17\xc9\xbd\x7e\x27\x73\x88\xf6\x09\x16\x88\xbe\x2e\xdc\xa5\x5e\xfc\xb3\x58\x60\x33\xf3\x13\x6e\x02\x63\x54\x50\x85\x9e\x00\x29\xc6\xa4\x14\x6b\x4c\x74\xda\x4f\x4d\xfb\x74\x55\x5f\xf6\xe2\x35\xe1\x16\x0a\x2d\xbd\x1d\xc4\xa1\xbf\x22\xbf\x40\x63\xbf\xf7\xb2\xa3\x73\xf7\x02\x2c\xa8\x48\x1b\x98\x82\xef\xc1\x8e\x97\xcc\xda\xe0\x8e\x67\x0e\xd4\x3d\x1a\x98\x93\x03\xbb\xc3\x98\x6b\x42\x6a\xd8\x56\xdd\x4f\xfa\x90\xb8\x4d\xe5\x2a\xe2\x6b\xf4\x83\x27\x61\xf0\x5d\xc4\x98\xb7\x4a\xe0\x59\x7e\x8f\x56\xf8\xcf\xb3\x2c\xa4\x24\x9e\x3c\x47\xd4\x7c\x18\xa4\x95\x78\xea\x0f\xf8\x08\xf7\x58\xcc\x7e\x4a\x99\xc1\x09\xac\x7c\xb3\xa7\x8b\xaf\x32\xa5\x89\x04\x31\x06\xbb\xd9\xe3\xae\x5a\x99\x2c\x27\x1a\x44\x1a\x3a\x08\xa1\x14\x58\x63\xf8\x93\x8d\xf2\xfa\xbe\xc8\x54\x1d\x10\xf1\x10\x26\xf6\x6d\x60\x3c\xf4\x34\x71\x19\x37\xd1\x33\xe9\x06\xe6\xd3\x2c\x0f\x93\xe8\x90\x51\xf6\x28\xdc\x67\xd7\x4e\xeb\xcf\x05\x1c\x52\xfe\x1f\x7a\x92\x0c\x24\x1f\x59\x6f\xcb\xee\xc1\x5a\x28\xd0\x12\x52\x82\x52\x99\x28\x1e\x26\x71\x3e\xd2\xe7\x3d\x3a\x4b\x69\x8e\x6d\xc4\xa3\xbc\x76\x63\xf2\xd3\xb8\x31\x1e\xef\x26\x32\xbf\x63\x15\x4f\xee\xe2\x91\x77\xa0\xf9\x63\xd8\x46\x1b\x9d\x40\x54\x6d\xe9\x17\xdd\x67\xcb\x76\x9e\xdf\xd5\x30\x41\x3b\x46\xe6\xd4\x14\xb9\xed\xc3\x48\xcd\x17\x5f\x7c\x40\xb4\xa3\x5e\xa2\xff\x0a\x6e\xa2\x61\xca\x76\x33\x0c\x54\xed\x54\x84\x09\x69\x43\x30\xf4\xbd\x52\x1f\x85\x49\xdf\x4f\x43\x44\x0f\xe5\x6d\x7c\x19\xc4\xdd\x41\x6c\x1e\xe9\x83\x70\xe7\x64\x7f\x63\x8d\x88\x96\xab\x7f\x0a\xa4\x58\xee\xba\x8d\xb2\xd0\xb6\x5f\x40\x8e\xe6\x6a\xc0\x82\x0e\x81\x0b\x40\x07\x48\x33\x2f\x78\x57\x01\x18\x66\x7b\xbd\x75\x95\xdb\x95\x20\x00\x5d\x25\xe1\x9c\x90\x2e\x81\x91\xb9\x49\xfc\xc7\xa3\xf2\x29\x6a\x53\x3c\xf2\x1f\x2b\x5f\xca\x85\x5b\x3f\xf0\x9a\x86\xdf\x70\x50\xfe\x43\xb5\xe3\x96\x1a\x2f\xf0\x6b\x4b\xc0\x78\x69\x0b\x26\x3a\x2b\xcc\x15\x03\x19\xb5\xda\x0e\x3a\xb7\xc7\x53\x4d\xf8\x57\x24\xe4\x9a\x44\xf7\x60\x7c\x83\x2f\xfd\x4e\x9d\x8e\xae\x5c\x8c\xbc\xbc\x48\xfa\x0b\x06\x17\x02\x1b\x09\x89\x97\x82\x2e\xd2\x91\x3a\x7e\x2a\x05\x46\xf4\xed\x18\xe1\x55\x09\x11\x25\x1a\xf1\x77\x21\x80\x84\xdb\xed\x72\x6a\x68\x33\x68\x26\xa3\x41\xa1\xb7\xab\x9a\x57\x1f\xa2\xcb\x37\x13\x16\x75\xf0\xe4\xda\xce\x71\x7e\xba\xe3\x86\x42\xea\x4a\xa1\x91\xf5\x71\x77\x85\x3d\xd4\x28\x2b\xbd\xc4\x74\xce\x86\x8e\x22\xe9\x3c\xc9\x71\xa5\x79\x2b\x7a\xae\x9d\xb2\x03\xbc\x18\x5e\xed\xf7\x38\x55\x0b\x89\x52\x5b\xed\x34\x51\x19\xe1\x5e\xb9\x18\x59\x6c\x71\x65\x06\x07\xbd\xfc\xf6\xd2\x6b\x3e\x1c\x8e\xf9\x9f\x7c\x96\x16\x57\x82\xb9\x53\xb1\x6a\xb6\xd0\x91\xf1\x76\xd2\xb5\x83\xfd\x47\x59\x93\x09\xee\x9c\xd3\xd4\xe5\xa1\x4a\x30\x1f\x61\x8d\x92\xfe\xfa\x8a\x2b\xbd\x2f\x6b\xc0\x0d\x28\x37\x06\xd1\x0c\x84\x61\x8a\x65\x98\xe5\x1b\x73\xdb\xb9\xf1\xf7\x25\x31\xe6\x19\x9f\xae\x99\xaa\xc6\xa8\x0c\x53\xf0\x8a\x3c\xe6\x13\xfa\xc9\x02\xae\xb2\xef\x5a\x3d\x88\x56\x80\xdc\x9a\x07\x13\xb0\xb0\x9f\xd2\x45\x9c\xde\xa2\x36\x24\xa5\x01\x90\x7c\x65\xe6\xd5\x5e\xab\xc8\x04\xae\x4c\x1a\x94\x7b\x59\x76\x19\xbc\x5d\xe5\x6b\x23\x42\x56\xdf\x76\xca\x87\x82\x7f\x1e\x7f\x37\x32\xae\x2e\x07\x15\xed\x24\xd2\x44\x12\x33\x46\xc3\x80\xc8\xef\x80\x96\xee\x12\xeb\xc2\x69\x81\xb1\xfd\x41\xff\x6a\x05\x24\x56\xf1\x85\xb3\x29\xf8\x4f\x7d\xd2\xd3\xdf\x0d\xa1\x28\x41\xf1\x65\x69\xc2\x0f\x1f\xb9\x13\xe5\xdf\xeb\xe5\x1c\x5d\x2e\x48\x07\x70\x5a\x3e\xfb\x1e\x87\xf0\x36\xcc\x79\x77\x46\xf7\xfe\x34\x71\x0b\x36\x23\x50\x3f\xf2\xe0\xb8\x92\xb8\x60\x04\xa2\x91\x14\x52\xac\xd3\xf2\xe4\x80\x2e\xb9\x69\xc3\x48\xc5\xa8\xf3\x6b\x34\x0d\xbe\xd4\x72\x46\xa6\x94\xe1\xc3\x82\x6c\xd7\x6f\x78\x46\x57\xed\x24\x2d\xe5\xa6\x04\x8b\x5d\x05\x59\xad\xa3\x4a\x79\x07\xaa\xa9\x86\x22\x2d\xfa\x62\x2e\x85\xdd\xb9\x84\xec\xea\x5c\xa0\x9a\x8a\x6e\x3f\x2b\xbc\x97\x7c\x70\xf9\xb3\x1c\xa7\xe2\xe8\xbe\xbc\x9f\xc1\x00\xdb\x1d\x92\x14\x32\x0e\x95\x72\xbf\x63\x1b\x96\x7a\x47\x2e\x97\xa3\x0a\xc3\x52\x35\x64\xbd\x3b\x07\x7b\xfa\xee\x7c\x3c\x92\xe3\x2f\xa2\xc0\xae\x91\x73\xc8\x5d\x1e\x47\x71\xd0\xca\x9e\x42\xfd\x1c\x94\x84\x55\x4a\x82\x9e\x07\xfd\x75\x51\xff\x41\x4f\xa8\x8a\xaf\x1a\xb5\xfc\xfb\x3a\xae\xe6\xbf\x40\xc3\xd0\xd9\xd2\xdf\x3a\x3f\xa6\x7d\x2c\x5c\xc9\xc2\xdc\xc5\x15\x41\x19\x4d\xff\x84\x2f\x80\x87\xa6\x2a\x35\x79\x65\x25\x88\xa8\xba\xe2\x33\x37\xa3\x4e\xe6\xdd\x39\x20\xd0\xa0\x64\xe7\xac\x81\x93\xd6\xff\xef\xfc\xd2\xa3\xac\xce\xe9\xde\xa3\x42\xe6\x38\x3a\x95\x65\x69\x6f\x03\xe6\x22\x51\x0f\xf1\xcf\x81\x8e\xc1\x89\xdb\xf8\xd8\xb8\x54\xc1\xac\x48\x99\xc2\xbc\x22\x20\x95\x16\xe4\xbb\x9a\xcb\x3c\x74\x34\x2c\x9c\x2d\x2d\x68\x59\xf2\x1b\xdd\x55\xbe\xde\x04\x1c\xd5\x56\x44\x3b\xf7\xf9\x8f\xe4\xc5\x7f\x37\x78\x8c\x5d\x96\xca\xc1\x43\x39\xc8\xe6\xa2\xe5\xf7\xe0\x4f\x4d\xfc\xcb\x6f\xe4\x51\x76\xc8\xab\xaa\xc6\xb4\x3d\x11\x74\xa3\xb1\x7a\x19\x3b\x14\xb0\x29\x40\xac\x74\x19\x5f\x7e\x59\xc9\x24\x1d\xab\x84\x71\xe5\x57\x56\xd2\xf8\xd6\xdb\x70\x9b\x91\x8f\xdc\x47\x43\xc4\xcf\xf1\xf3\x26\x27\x76\xef\xe0\xcf\x87\x1d\xef\x66\x44\x67\x33\x0b\xed\x94\xe3\xd1\x96\x8f\xb0\x7f\xf9\x3c\x7f\x4a\x4d\x26\xda\x9a\xd3\x97\xe1\xf1\x8d\xb2\xce\x60\xd8\x75\x19\x61\x37\xa2\x77\xa4\x3f\x7d\x87\x6f\x5f\x16\x34\x2a\x12\xe7\x64\xb7\x9a\x49\x21\xdd\xaa\x17\x7f\xf2\x68\xc8\xec\x21\x67\xad\x8b\x45\x17\xf5\xa3\x0e\x9e\xc1\x70\x44\x0e\x8a\x19\x74\xcd\x39\x4e\x1e\x01\x2b\xe4\xa8\x72\x61\xe3\x28\x28\xb0\x1b\x8b\xee\x7d\xf1\xdb\x08\x9f\x73\xb4\xa6\x49\x02\x29\x95\x26\x2d\x69\xb6\xfc\xd6\x59\x85\xf2\xf1\x26\x19\x8d\xea\xb7\xcd\x3e\x0d\x2b\xfc\x35\xbf\xf2\x60\x53\x35\x15\x2f\xe5\x89\x46\x8a\x1e\x58\x83\x93\xba\x56\x67\xc2\x15\xa0\x84\x98\x75\xa8\xfd\x84\xb9\x31\x5c\x3e\x38\x22\x6b\xaf\x69\x67\xed\x9f\x9c\xfe\xd6\x8a\xf4\xaf\x0c\x6b\xbc\xa9\x92\x74\x58\x3d\xdc\xce\x76\x87\xac\x84\x1e\xa0\x8c\xd2\xbf\x28\x33\x05\xad\x89\xf5\x57\x36\x7e\xe1\x00\xab\x72\x53\xbf\x62\x76\xec\x2e\xe4\x93\xd4\x2f\xa0\x4c\x74\xe2\xca\xfd\x4e\x28\xae\x81\x48\x52\x5f\xfb\x92\xd5\x8c\xe2\x90\xff\x71\xb4\x44\xce\xc5\x4d\x46\x97\xfc\x2c\x0b\xca\x47\x3e\xb2\x17\x32\xd7\x0f\x53\x8d\xdf\x5f\xd2\x89\x4e\x88\x2b\xb2\xd8\x72\x97\xc1\x85\xc6\xa9\xab\x34\x9f\x4b\xf0\xd4\xe7\x6b\xab\x35\xc7\x96\x80\x85\xaa\x40\x9b\x19\x16\x31\xab\xc8\xa7\x40\xef\xca\x94\x76\xaa\x7c\x9d\xed\xc1\x39\xbb\x80\x04\x50\x70\x0a\xb5\xeb\x7b\xd7\x9f\xe9\x77\x9c\x6d\xa3\x5e\xce\x9b\xde\xf1\xf8\xf0\xaf\xae\xe6\x98\x60\x7a\xf1\xbd\xd1\x3b\x71\xbc\xa9\x94\x74\x01\xaa\x30\x9b\x29\xbf\x51\x2a\xb2\xfe\x83\x01\xc5\xac\xe0\x12\xa4\xd8\x08\xa3\x7b\x29\x39\x6f\x54\xb5\x5b\x36\x63\x60\xcd\xd5\xd2\xb1\x5a\xa1\x97\x22\x83\x95\x62\xd4\xa1\xe5\xd6\x5c\xe6\xa9\xaf\x19\xb7\xb0\x27\xc6\x87\x20\xca\x17\xce\xea\x61\x54\x26\xe7\x74\xdd\xf5\x65\x58\xf9\x04\x09\x93\x83\xa4\x45\xe5\x59\x96\x29\x2a\x72\xf2\x16\x8e\x10\x3f\xb0\x34\xa8\xa0\x60\x60\x82\xb3\xb3\xb7\xc6\x8d\x86\xfe\xb5\x8d\x0a\x8b\xf5\x26\xa0\xbe\x2f\x6f\x61\xe5\xef\x6f\x75\x24\xcc\xb0\x7a\x18\xfe\xe7\xa8\x0d\x60\x50\x56\x0e\x84\x08\x43\x89\x03\x38\x83\x65\x1f\x7e\x7d\x62\x79\x19\x1b\x7f\xfd\x7e\x90\x3d\x6a\x76\x7c\xc0\xcd\xf5\x46\xc6\xdf\x93\x37\x50\x84\x1e\xc1\x02\x2c\xbb\xfe\x80\xbc\x87\x2f\x8b\x5e\x8d\x99\xc5\x58\xef\xc8\xb3\x8b\xc2\x71\x75\x71\x68\xd9\xf1\x00\x59\x73\x8d\xe6\x4f\x72\x7d\xa0\xc1\x8d\xaa\xbb\x49\x5c\x9a\x3b\xed\x5f\x54\x74\x9d\x9e\x67\xee\xdb\x49\xf5\x57\xa9\xf1\x9a\xa8\xb7\xee\x5b\x7f\x76\xda\x7f\xde\x69\xe6\xa6\x99\x9b\x05\xdf\xfe\x70\x0f\xba\x2c\x50\xde\x75\xdd\xc7\x70\x63\xbb\xf7\xb3\xd4\x39\xc0\xe9\xf8\x4a\x97\xa4\x06\xa3\x90\xd2\x94\x0a\x31\xeb\x76\xd4\x85\x20\xf5\x8c\x4d\xaa\xee\xb4\x4a\x74\x6d\x68\x17\x4d\xdd\x3f\x5a\x50\x48\x23\xf8\x18\xb6\x95\xb0\x89\x88\x60\x41\x19\xa5\x80\xc4\x9e\x74\xd0\xef\xcd\x23\x6c\x46\x98\x04\x91\xa6\xb8\x4b\xed\x2a\x4b\x11\xb1\xd7\x72\xdb\xa0\x47\x7a\x88\xcb\x42\x83\x07\x14\xdd\x84\x02\x5d\x68\xa2\x79\x8c\x0b\x6c\xcc\x49\x9d\xfb\x2f\x66\xa8\x82\x93\xde\x9c\x7c\x52\x17\x16\x77\xa5\x72\xb8\x5f\x16\x93\x9c\xec\x54\x6f\x46\x86\x02\x81\x43\x90\x5b\x6e\x36\xe0\x74\x1d\xb9\x56\x07\x24\x98\xce\x27\xc7\x01\xa2\x7f\xa9\xd2\x12\x29\x18\x9e\x7f\x83\x9d\x18\x10\x1f\x20\xc9\xab\x25\x20\x36\xa2\xc5\x0f\x5d\x4f\xd5\x14\x47\xcd\x89\xb6\x8b\x5e\xa0\x94\x16\x61\xc8\x29\x16\x54\x87\x2f\x9d\x58\xde\x29\xfb\x40\x10\xdb\x65\xc0\x09\x0b\x7a\xc1\x99\x48\x5b\x58\x3d\x02\xd9\x45\x65\xe0\xb9\x1d\x51\xc3\x29\xaf\x27\xd4\xf0\x8e\x8e\x12\x6b\xb1\xd6\x8f\x08\x92\x6a\x2f\x42\x23\xb5\xa3\xef\x3c\xa7\xb0\xe4\x1c\xab\x0c\x94\xd9\x82\xbc\x4a\xf7\x38\xea\xfa\x2b\x9e\xb0\xcd\xdf\xde\x9d\xe5\x6b\x0d\x2b\x22\xf4\x01\x96\xce\x90\xdf\x17\xe8\x6f\xff\x7b\xb1\x2f\x31\x39\xf3\x76\x12\x89\xd4\xc5\x6d\xef\x3e\x3d\x44\x43\x21\x1f\x1a\x2f\x9f\xad\xf6\x41\x95\xb1\x6d\x83\xdc\x53\xa2\x59\x50\xd8\x7b\x66\x73\x1e\xcb\xa7\x02\xe1\xe5\xc6\x22\xd5\xd6\x9c\x2d\xce\xb1\x2b\xf4\xa1\xbc\xa8\xb3\xd6\x9b\x0d\xff\x1a\xa1\x36\x78\xe6\x6e\xc9\x65\x67\xd7\xb3\x65\xa3\x12\x93\x83\x84\x68\x6f\xb9\xfd\x4c\xe1\x1b\xdf\x8c\xd2\xc1\x37\xea\x39\x34\xb2\xed\x6b\x30\xc7\x23\xe0\xc7\x32\x1f\x86\x34\x0b\xff\x4b\x16\x1a\xf5\x76\xa9\xa3\x11\x67\x1d\x6c\x66\x81\x20\x1b\x71\xad\xfe\x14\xf0\xe3\x8c\x9f\x02\xa4\x99\x5d\x57\x04\x9c\x14\x3e\xc7\x63\x16\x3e\xe8\xb3\x95\x31\x8d\x7e\x9a\xd5\xfb\xc2\x01\xcb\x16\xec\xf6\xed\xdb\x69\x85\x0e\xa4\x65\xf0\xc9\x67\x61\x5a\x3d\xd6\xc9\x70\x79\xf4\xfa\x3e\x59\xa6\xd6\x8e\x7b\xc2\x02\xa6\x7f\x7f\xe0\x09\xa4\x97\x67\x8a\xa2\xf5\x46\x5d\x5e\x6b\x31\xca\xef\x58\x90\x62\x58\x07\xa0\xa3\xc0\x66\x5f\x4a\x49\x90\xe4\xfb\x9a\x8d\xd1\x37\x25\xfc\x81\xc1\x18\xa2\x7f\x69\x5f\x6e\x12\x12\x99\x2e\x69\xb3\x47\x82\x86\x7e\x6e\xf5\xeb\x78\x83\x23\x3e\xc7\x40\x36\x2a\xef\xf4\xeb\x32\xb3\xa9\x8b\x2e\x6d\x01\x38\x55\xf1\x1a\x30\x28\xce\xaa\xb4\xfa\x0d\x96\x0b\x9e\xbb\xc0\x52\x96\x66\x97\xa7\x63\xe7\x40\x69\xbb\x6a\x94\xa2\x54\xae\xcd\x52\x1e\x55\xb7\x10\x06\xeb\x6b\xb0\xb7\xe1\x05\x8b\x22\xf5\xae\x9a\xb4\x1a\x66\x23\x07\x09\xf3\x68\x64\x94\x92\x6c\x39\x44\x34\x34\xd6\x2e\x3b\x15\xb4\xec\x7c\x82\x76\xe9\x98\xdc\xa3\x76\x3f\xb0\x24\xdf\x2a\x13\x53\x23\x9f\xa5\x48\x44\x98\xc2\x84\xa0\x9c\x82\x29\x52\x1a\x55\xd5\xb2\x36\x45\x55\x2b\x5a\x0b\x86\xe5\x6c\x71\x2c\x01\xd0\xca\x52\x4a\x65\xb1\x14\x71\xb5\x66\xde\xce\x8a\x57\x2a\x2b\xa6\xab\x58\x85\x83\xb2\x16\x37\x5e\x49\x52\xb4\x2a\x57\x86\x0a\x70\x5f\x74\xc8\xe7\xd7\x75\xe7\xea\xc4\x6a\xa5\xac\x62\x92\xdc\x9c\x2f\x19\x76\xc5\xa8\x43\x45\xc7\x0c\x8b\xff\xf7\x55\x42\x6a\x6b\x85\x40\x48\xde\x98\xb1\x54\xea\xcf\xea\x22\xb9\x1f\x1f\xa3\xfe\xca\x72\x0a\x62\x66\x28\x98\x8e\xf1\x12\x47\xd5\x0c\x13\x56\xa1\x99\x97\xb2\x1c\x9b\xf8\x4a\xa4\xe4\xb9\xb4\x34\x31\xf3\x2a\x46\xc1\xe8\x74\xd5\xd9\x22\x6a\x49\x7f\x01\x13\x5d\x40\xa5\x89\xfb\xa8\x40\x5d\x89\xaa\xc9\x50\xea\x93\x9a\xc7\x3d\xd3\xfe\x49\xc3\x70\xb3\x66\x99\x2a\x44\xf1\xb1\xc9\x66\x01\x98\x64\x50\x26\x73\x6f\x7c\xcf\xe8\x1f\x62\xeb\x1f\x1e\xf0\x26\x85\x6a\x62\x87\xd9\xbf\x4d\x4e\xfb\xae\x1a\xd0\x33\xf9\xb2\xd2\x52\x5b\xca\x77\x84\x48\x42\x36\xc8\x51\x3a\x3e\x7c\x4f\x29\x7c\x63\xf7\xf4\x60\x54\x4d\x59\xde\x10\x7d\xfe\xb1\x82\xca\xc0\xdd\xa6\xf9\xb2\xda\x99\x62\x8c\x7e\x6e\x23\xe9\x2f\x63\x34\xf9\x80\x72\x7a\xb4\xb5\x92\x04\x97\xd1\x7c\xcc\xb2\xce\x4d\x53\xd8\x9a\x46\x97\x08\xe1\x51\xbb\x74\x4d\xb0\x31\x75\xcb\x6e\xeb\xef\xa7\x04\x9b\x2e\x1f\x3d\xac\x0b\x20\x8a\xc7\x29\xfe\x0d\x50\xe0\x93\xc1\x49\x68\x2d\x38\x71\x96\x33\xfd\x4f\x94\xf5\xff\x9d\x32\x63\x5c\x1c\x65\xf7\x3f\x40\xe0\x4a\xf4\x3e\xbd\x81\x5b\xad\xbc\x11\x40\x69\xbe\x16\x66\xd4\x73\xda\x2b\x20\x69\xcb\xd2\x8c\xfc\x5b\x8d\x1c\xd3\x0b\xfe\xc9\xcc\x7b\xbc\xf1\x42\xfc\xc1\x18\x19\x9c\x5d\x80\x06\xdf\xe1\x9d\xa6\x27\x04\xeb\x72\xe9\x2d\x1c\x1b\x07\xb9\x75\xae\x8f\xcf\x0e\x55\x43\x08\xb6\xf4\x57\xac\x3c\x6e\x95\xac\xcc\xb8\xd9\x22\x97\xf3\xc3\x05\x53\xb5\xe2\x51\x1d\x43\xe0\xbe\x60\xfe\x24\xba\x98\x5d\x94\x9f\x7c\x35\x54\x8e\x29\xa0\xec\xfc\x0a\xdc\x0b\xa1\x38\xdb\x14\xe3\x64\x32\x76\xd9\x4c\x70\xb2\xcd\xb6\x5a\x95\xde\xcb\xf5\xdf\x29\x94\x6b\xe9\xe1\x0a\xc5\x7f\x6d\xc1\x0e\xbe\xc9\x92\x77\x23\x7c\x99\xdb\xe9\x52\x28\xc6\x95\xb8\x24\x9b\x10\xcd\xce\x18\x97\xd8\x4b\x71\xf3\x3c\x6c\xc6\x88\xc2\x52\xcd\x60\x93\x05\xff\x79\x9c\x9e\xb0\x0e\xd1\x1f\xca\xef\x65\x35\x59\x7f\x6c\x5f\xa4\xa9\xb9\xf7\x42\x0d\x43\x05\x15\x7e\x9f\xe4\x0a\x51\x95\x29\xd4\x08\xc7\xea\x0c\xa5\x99\x04\x6f\xdd\x3f\x9c\xac\xd9\xce\x45\x1a\x14\x38\x94\xc9\x06\xa9\x6c\x35\x16\x74\x36\x0d\x25\x22\xd3\x2e\x9b\xc1\x79\x54\x52\xa7\x73\x14\xda\xec\x04\xd2\x52\x10\xea\x1f\x9e\x70\xb6\x4f\x61\xc9\x52\x76\x1e\x7e\x4a\x99\xa3\x9b\x93\x17\xc1\xb3\x9c\x3a\x42\x89\x9e\xe8\x0a\xf2\x6c\x79\xe6\xcc\xa9\x52\x41\xeb\x18\xa8\x5d\x82\x50\xf5\x8f\x93\xd4\xc7\xf0\x42\xd5\x0c\xf2\x53\x26\xf6\xab\xdd\xf6\x23\x5d\xbd\x1c\xef\x82\xe6\xf9\x9c\x62\xf4\x48\x5f\xa1\x59\x0c\x14\x6d\xed\xb1\x70\x9f\xaa\xb9\xa9\xa4\xfd\x26\xca\xd9\x05\xd5\xcf\x6f\x2d\x17\x1b\x97\xe6\xaa\xfa\x78\x6e\xe9\xc7\xa6\x49\x18\x1a\x23\xae\x32\x25\x6d\x83\x44\x4c\x6c\x69\x1c\xfc\xd3\xde\xf1\xf1\x59\x69\x83\x21\xfe\xe7\x69\x44\x99\xf5\xa2\x71\x47\x53\x56\xaf\xd8\x75\x2d\x67\xcc\x8c\x13\xd1\xef\x91\x9f\xbd\xee\x52\xf7\xe6\x81\xa6\xcd\x23\xb8\xf4\x17\x3c\xa9\x52\x33\x75\x0f\xfa\x6c\xe2\x20\xed\x76\xf4\x78\xd8\x28\x10\xe4\x51\x6f\x58\x6e\x02\x26\xdb\xd3\x7f\x40\x86\x0a\x76\xb5\xa5\x1e\x43\x64\x87\xd4\x67\x3d\x1a\x78\xd2\x92\xa5\x3f\x25\xb2\x71\x2c\xa8\x65\xd0\x1f\x96\x3f\x07\x37\xd8\xa5\x1c\x09\xda\xd8\x82\x3a\x86\xdd\x05\xde\x29\x9c\x9e\xe2\x0c\xe7\x32\xe4\xe3\xdd\xab\x2e\xcd\xda\x3a\x43\x98\xae\xd2\xb2\xff\xbd\x02\x87\xf0\xa3\x1d\xa6\xbc\xde\xd1\x44\xe0\x75\xc5\xc7\x45\x82\x43\xb9\x8a\x59\x0b\x62\x8f\xe5\xba\xf1\xa2\x81\x22\xbd\xfd\xac\x05\x19\x2d\x5a\x4d\x2d\x05\x9d\xf4\x46\x12\x69\x64\xe4\xf7\x8b\xc2\x60\x02\x57\xb4\xda\xb4\x94\x1b\x61\x4c\x66\x67\x05\x31\x45\x33\xbb\xc7\x37\xc2\x89\x0a\x26\xb9\xd1\xae\xd5\xfd\x88\x4e\x06\x47\xe0\xe2\xf3\x16\x7e\x2b\x1f\x0d\xc4\xd1\x56\x96\xea\x3f\x0f\xef\x7a\x54\x56\x8c\x22\x62\xc8\x04\xd3\x23\xd1\xc5\xfe\xab\x91\xc2\xd5\x8d\xbf\xf1\xbc\xd0\xad\x45\x61\xc8\x09\xcf\x7f\x01\x84\x1a\x06\x0d\x8c\x51\xe7\x70\x90\xc2\xb9\xa3\x97\x81\x5e\xa4\x3f\x52\xfb\x98\x6b\x46\x43\x1f\xe1\x09\x1d\x88\x33\xaf\x18\xcf\xb2\x03\x75\xaa\xc3\x74\xc5\xbd\x97\x1a\xb2\xa6\xb9\x76\x97\x6f\x09\x79\xa6\xa7\xc8\xaa\xf1\xc6\xd3\xa7\xfe\x7c\x65\xcc\xfe\x06\x87\xfb\x83\x84\x45\x8e\x41\x28\xe1\x60\xbe\xc8\xb7\xff\x00\xe3\x4e\xd9\x64\xd4\x2a\xec\x95\xd1\x6c\x8c\xc7\x48\x38\x28\xc5\xe7\x5f\x24\xa5\xa1\x0c\xbd\xa9\xf2\x6c\xc7\x29\xaa\xc8\x32\x5f\xbb\x32\x34\xe3\xb4\xb2\x4c\x91\x33\x2e\xbf\x09\x32\x4e\xaf\xca\x8f\xd3\x8d\x46\x94\x4b\xa4\xe3\x2b\xd3\x3e\x58\xa3\x90\xec\x57\x24\x45\x87\x55\x8c\xf7\x48\x49\xa7\x59\x3b\x9d\x55\x63\xd3\x4e\x61\x97\x50\x46\x51\x4e\xce\x86\x49\xed\xb9\x42\x96\xa0\xdd\x26\xb0\x70\x3b\x04\xab\x2c\x92\xff\x3b\x43\x64\x87\xe8\x0b\xb1\xdc\x60\xe3\xa6\x3b\xb1\x37\x8a\x2f\x2a\xb2\x03\x5b\x06\x5d\x9b\xc3\x8a\x3e\xb4\x5d\xdc\xb6\x70\xf3\x03\x4e\xba\x33\xbc\xb2\x4d\xa6\x50\x82\x96\xba\xeb\x43\xa0\x12\x9b\x90\x77\x7a\xab\xc5\x6a\xc0\xab\xb0\x6a\x52\xe5\x8d\xab\x0f\xfd\x21\x1f\x34\x59\x7b\x18\x00\xae\x56\x5f\x20\xe0\x2d\x9d\x48\xec\x10\xce\x5a\x4e\x83\x7b\xda\x9d\x4e\x51\xf3\x25\xcb\xf0\xdf\xc1\x8b\x0a\xa8\xaa\xb9\xab\x27\xce\x49\x45\xd9\x96\x4d\x67\x37\x56\x3d\x9f\xff\x9e\x4c\x56\x6b\x46\x4d\xa8\x1c\x4a\x52\x38\x1a\xe1\x05\x80\x60\x66\x66\x35\xba\x50\x14\x1c\x5b\xd9\xa1\xed\x8b\x02\xd5\x70\x43\x7a\xa9\x5f\x0d\xaf\x8b\x66\xd4\xb5\xc0\x42\xd2\x32\xb1\xb4\x79\xe3\x99\xca\x46\x41\x02\x3e\xd7\xc2\xe5\xb7\x3e\xfa\x1a\x1e\xc0\xe2\x56\x33\x17\x0a\x8b\xf2\xd3\x39\xd6\x5f\xac\x49\xb4\x70\xf7\xde\xbd\xef\x54\xb6\x3b\x9f\x58\x78\x10\x05\xa8\xfd\x54\x9a\xd6\x47\x6a\xfa\xfa\x07\x88\xc0\xc3\xe3\x62\xaa\xe6\x1a\x53\x3f\x3e\x4f\xa5\x63\x74\x2f\xcc\x0c\x9f\x6b\xb8\xc7\xf0\xf2\xc6\x38\xa7\xb0\x89\x67\xa0\xef\xe5\x94\x11\xec\xaf\x3f\xc8\x3f\xcd\xae\x2d\x5b\x17\x56\xb0\x98\xce\x35\x1d\xbe\xe1\x39\x29\x69\xe0\xf1\xb0\x2f\x36\xf5\x80\x86\x66\xcb\x57\x2b\xdb\xf2\xf7\x65\x69\xf9\x06\x9e\x25\x3c\x36\x6c\x57\xdf\xa5\x90\xd2\x45\xaa\xa9\x58\xdf\x0d\xc3\x2d\x8c\xc3\x52\xba\xfa\x4f\xd5\xef\xa0\xb5\xe7\x45\xfa\x0f\x4b\xd4\x5d\xa7\x1d\xd2\x86\x66\x17\xa9\x63\xb9\x4a\x0c\xbc\xfe\x87\x28\x04\xcd\xe0\x32\x5e\x84\xd9\x20\x39\xb8\x93\x83\x99\x25\xc4\x09\xe7\xd2\x6c\xa3\xd5\x1e\x65\xd9\xea\xff\x8c\x35\xbe\xe6\xf2\x16\xf6\x48\x05\x8e\x3c\xde\x03\xa1\x24\xeb\xc3\x49\x76\x5b\xd5\xad\x61\xa6\xee\xa3\xbc\xed\x2a\xe5\x96\x04\x5c\xdf\xef\x9a\x36\x5e\x3f\xc0\x04\x67\xe6\x1e\x65\x5b\x69\x1f\xae\xe3\xa1\x76\xf2\x21\xfe\x43\x29\x96\x89\x78\xec\x67\x18\xe4\x39\x28\x38\xf8\xb3\x6d\xcb\x8b\x45\x07\xcd\x15\x3b\x45\x35\xaa\x6a\xcb\x72\x1a\xbf\xc5\x70\x29\xe3\xe1\x2b\xd5\xe2\x0c\x95\x32\xed\xab\x5c\x88\x2a\xd2\x0e\xbe\xae\xac\xf1\xd6\xc0\xd0\x11\x8d\x59\xad\x3a\xfa\xf0\xc3\xab\x29\x4c\x70\xe8\x18\xeb\x48\xe5\x20\x74\x1a\x9b\xef\x83\x7b\xea\x26\x02\xed\xd4\xcf\x8b\xeb\xd2\x7b\xec\x00\x1c\xa5\xb1\xdb\xcf\x43\x61\x7c\xcb\xb8\xae\xae\x52\xf5\xd9\x59\xa2\xfa\xc3\xc2\xba\x9f\xb7\x65\x5e\x36\x81\x67\x87\x4d\x98\x95\x84\xf2\xff\x00\xdd\x48\x4d\xf2\x7d\xac\xd1\x29\x28\x59\x34\x00\x98\x1f\xb6\x1e\x11\x47\x0d\xf8\xb4\x7f\xc0\x4b\x27\xec\x8b\xcb\x12\x67\x15\x62\xd9\x41\xd6\xd5\x61\xef\xcb\xf6\xdb\xdf\x5a\x1b\xfe\x5b\x20\xd5\xc2\x31\xd8\x2e\x7f\x28\x0a\x67\x7d\x51\x65\x56\x34\x62\x7a\xd8\xa2\x54\xc3\x60\xca\x5e\x41\xc6\xf8\x4a\xd9\x83\xda\xea\x6a\x56\x4a\x5d\x5d\x2f\x5b\x6e\x18\xee\xff\x7b\x53\x89\xbb\x4b\x47\x5e\x76\x76\xae\x2d\x80\x9d\x2a\xd2\xe2\x26\x06\x2d\x53\x92\xa2\xca\x3d\xf2\x97\x6d\x48\x3c\xb7\xec\x0b\x52\xd4\xdd\x40\x58\xe5\xb0\x1d\x72\xc3\xde\x63\x25\x24\x19\xc4\xec\x45\xd5\xfa\x76\x85\x81\x8b\x60\x17\xab\x12\x50\xd7\xa1\x42\xb1\xb1\xb0\x56\x40\x75\x2c\x2f\x6d\xb0\x5e\x69\x1e\x7c\xb3\x65\x41\x49\x53\x18\xa2\x90\x31\x99\xaa\x07\x61\x2b\x6c\x19\x6e\x31\xe4\xbb\x82\x94\x6b\x95\xdf\x9e\xec\x45\x28\x80\x0b\x2f\xfd\x95\xb5\x65\x52\xae\x35\x8b\xb9\xf9\x67\xaa\x2e\x73\x5f\x55\xfa\x02\x43\x3a\xf5\x1a\x60\xfe\x05\x1a\xdb\x9b\xc9\x7a\xfb\x46\x60\x75\xd0\xf6\x9d\x75\x8d\xa7\x73\x9d\x8f\x10\x9d\x40\xf9\xeb\xfa\x95\xb1\xcc\x16\x07\xac\xbd\xce\xe4\x15\xbd\xbe\x87\x06\xc1\xf5\x85\x52\x4f\xb5\xaf\x76\x8f\xa8\x78\xa7\xf8\xec\x04\x4e\x73\x55\x26\x56\x6a\x5f\x39\x3f\x5d\xfc\x36\xbd\x1b\x9f\xcb\x67\x96\xa7\xfb\x12\x7d\x9c\x32\xe8\xb1\xc2\xea\x4e\x32\xbe\x96\xf1\x99\xa7\x84\xef\x70\xa9\xce\x0a\x18\x09\x53\x3c\x2b\xb6\x80\x76\x39\xd2\x46\xcc\xb3\xc5\x56\xda\xff\x4c\xc4\x39\xab\x94\x1d\x27\xfb\x3a\x8f\xbd\xca\x5c\xb8\xe6\xec\xa6\xd3\x96\x12\x26\x2a\xde\x09\xf2\x28\x8f\xbb\x6a\x7e\x34\xc3\x5f\x4e\x95\x08\xf6\xd9\x62\x3d\xcf\xb0\x8f\x77\x91\x04\xef\x93\x6a\x77\x3f\x97\x22\xc8\x90\xda\xfc\xcf\xff\xee\x74\xfe\x9e\xc1\x25\x9e\x62\x37\x55\x06\x69\xb7\x88\xf1\x10\xac\x69\x6e\xc4\x45\x4b\x9b\xca\xea\x31\x3a\xfb\xf9\x5e\xbe\x25\x9e\x45\x53\xef\xd9\x53\xf0\xa7\xee\x4a\xdb\xe2\xc8\x0f\xf0\xa5\x26\x8e\xf6\xbf\x49\x91\x83\xdb\xcb\xd1\x1f\x3c\x6b\xa0\x72\xc4\x2d\x92\x3d\x5c\x90\xbe\x32\xec\x09\x92\xeb\x51\xf4\x75\x4d\x72\x45\xeb\x77\xbe\x29\x18\xba\xf9\xcf\x66\xb5\x94\xba\x17\x60\x39\x54\x51\x23\x0a\xa6\x74\x39\x07\xae\xb2\x85\x37\x7d\xb6\xec\x35\xc2\xeb\x7a\x11\x15\x76\xac\x62\x63\x54\xab\xc3\xf4\x69\x7b\xf5\xea\x1f\x4c\x77\xe4\x00\x09\x2c\x2a\x3e\x4f\xd0\xaa\x3d\x2e\x9b\x05\x49\xb3\x91\x24\xe1\x76\x53\x19\x46\x79\x09\xd1\xb9\x9d\x00\x55\xa4\xda\x62\xa5\x9f\xec\x94\xad\x13\xcb\xc6\x28\xa0\x0d\xdd\x1c\xf3\x11\xf5\xe9\x32\x24\xdd\x37\xdd\x0d\x6c\xb1\xa2\xe1\xed\x50\xb6\xd2\x8f\x7e\x14\x89\x76\x93\xfb\xb5\x43\x4d\x01\x8c\x56\x0b\x39\x1e\xcc\x22\x6b\x0f\x99\xa5\x2d\xef\xce\x11\x30\x02\x8e\x4c\x10\x68\xf3\xa9\x6a\xb7\x5c\x90\x0f\xf5\x26\x08\x8e\xa9\xf6\x2c\x1b\x00\x27\x98\xd9\x41\x50\xb5\xea\x69\xf6\xc3\xbd\x6c\x8b\xcd\xc4\xc5\xde\x77\x15\xe7\x02\x60\x95\x8a\x5b\x1a\xcb\xeb\xe9\x7d\xfd\x8c\xf7\xe0\x4e\xdc\x23\x07\x1b\x01\x81\xf7\xd3\x05\x71\xb5\xde\xbd\xa7\xb2\xff\xe0\x3c\x56\x2a\xd8\x0b\xaf\xc2\xc1\xad\xba\x6b\xeb\xcf\xda\xac\x22\x49\xf0\xe4\xbc\x4d\xad\x64\x04\x0a\xf6\x1b\x3c\x1e\x84\x54\xc2\x03\x5d\x77\xef\xab\x6e\x20\xcb\x73\x9d\x2c\x08\x54\x70\x27\xf2\x84\xac\xaf\xb4\xdc\xab\x7c\xf5\x5f\xb6\x6a\x20\x70\xbf\x5d\x32\x13\x0d\x0d\x92\x2d\xca\xe6\x00\x42\xcb\xa4\x14\x05\x26\x7e\x04\xd7\xbc\x12\x4a\xbe\x97\xc0\x2d\xcb\x10\x53\x9a\x8b\xc9\x2c\xe1\x12\x34\x95\x6f\x9b\xa6\x64\xda\xb9\x08\xa3\x1c\x5f\xe7\x64\xc3\xc1\x9d\xfb\x82\x1a\x5c\xb2\x47\x01\x0c\x51\x95\xf3\x0f\x41\xbd\x85\xfa\xb5\x9a\xba\x6c\x87\x3c\x29\x19\x50\x38\xe6\x8a\xb6\x5c\xc7\x2a\x62\xb1\x02\x04\x03\x57\x5b\x2a\xab\x28\x97\xc8\x42\x59\x46\x15\xb9\xf7\xfe\x7a\x8d\xb2\xc0\xff\x69\x00\x87\x5c\x43\xad\x76\xe1\x10\x9c\xfa\xe9\x30\x5f\xb1\xe4\xfa\x53\xa8\xe1\xb9\x4d\xaa\x6f\xa7\x55\xda\xb3\xd6\xe5\xdd\xf6\x69\x64\x10\x5d\x5e\x15\x24\x69\xfe\x0d\x32\xa0\xff\xb1\xbb\x02\xfd\xc8\x5a\x2b\x62\xf3\x46\x4a\x71\xb5\x5c\xe9\x20\x6d\xc0\xa9\xe7\xea\x5c\xee\x0c\x7d\x19\x07\x51\xe5\xe5\xe5\x65\x91\xaa\x94\x97\x31\xc4\x67\xaa\x78\xeb\xe1\xfe\x8d\xbc\xc7\x2b\x0e\x4b\x46\x70\x8c\xe6\x5c\x31\x58\x18\xc6\x7c\x15\xca\xa5\xc6\x0b\x25\x78\x3b\x55\xaf\xc4\x71\xf3\xe7\x78\x9c\x11\x6b\xdd\x3e\xd4\x87\x2c\x17\xca\x2b\x4d\x9b\x90\xd5\x5e\x31\x13\x69\xd5\x61\xa9\xb3\xb0\xa0\xfe\x8b\x62\x17\xc5\x68\x8e\x22\x16\x65\xea\xe0\xaf\x0f\x29\x43\x0f\xbb\x60\x32\xac\xc5\x58\xeb\x96\x7d\x97\x56\x2a\x0e\x81\xad\xaa\xfe\xe3\x85\xad\x52\x32\xaa\x55\x15\x65\x4d\xd9\x78\xc9\xab\x66\xfa\x49\x8b\x00\x98\xe6\x6c\x82\x01\x24\x2b\x0d\x95\xb2\x58\x9e\x45\x20\x1e\xe7\xb0\x13\x21\x99\xb8\xaa\x36\xcb\xa2\x91\x35\x30\x7d\x38\x08\xc5\x9d\x63\x1b\x49\x73\x35\x8a\xdb\x2a\x86\xb9\xe9\xc7\x1f\x3f\x4c\xc4\xc0\x26\x75\xa4\x1b\xf9\xce\xa4\x2b\xbc\x14\xae\xac\x21\x4b\xbd\xba\x96\x35\x93\x55\xde\x11\x7e\xde\xbb\x8e\x84\x21\x94\xdd\xc2\xac\x3b\x1e\x36\x5c\x48\x7b\x2b\x52\xfd\x4d\x60\xae\xcc\x20\x05\xc6\x96\x1d\x09\xb8\x22\xa2\x19\xc3\x88\x19\xb7\x8a\x63\x81\x64\xd5\xc7\xdc\x46\xc0\x0c\x5c\x05\xab\x53\x28\x19\x6e\xd9\xe8\x2e\xf9\x7e\xa4\xa9\x7c\x1c\xfe\x93\xa3\xbe\xed\x34\xba\x20\x45\xfe\x55\x2d\x42\x63\x1a\x2e\xd7\x81\x5c\x1e\x9b\xdd\xe9\xa8\xa5\xf2\x71\x95\x96\x52\x22\xd3\x26\xf1\x3f\x8c\x90\xbd\xc8\xef\xe2\x93\x5d\x7f\x7c\x42\xfa\x86\x0c\x75\xd5\xab\x9f\xa5\x7b\x70\xe3\x40\xff\xf6\xd8\x45\x61\xa2\xdc\xcb\x4b\xe3\xd7\x79\x8f\xb1\x1d\x78\x3f\x04\xfb\x22\xf7\xc6\x8e\xb5\x6f\x4a\xc8\xb8\xe7\x29\xe5\xd3\xf1\xe7\x82\x76\xb2\xc4\x97\xee\xee\xc6\xa2\x5f\x60\x5b\x39\x96\xb1\xa9\x5b\x6c\x86\x3c\xbb\x9e\x1d\x9c\x3c\x63\xd7\x9b\x5b\x05\x72\x75\x50\xca\x5a\x50\xd7\xf6\x60\xad\x9c\x4b\xdd\x01\x62\x23\x56\xce\xa6\xfd\x76\x99\x49\x46\xed\xaa\x99\x29\x68\xc4\x30\x6a\xc2\x08\x95\x96\x57\xc3\xe3\xc3\x4d\xd9\x71\x79\xc9\x94\x2a\x72\x25\xb6\xdc\xeb\x60\xb1\xf5\xf7\x81\x98\x3c\xac\x7e\xba\xdf\x49\xd0\x44\x6e\x86\x6a\xac\x93\x6c\xb6\xd3\xd7\xec\x09\x9e\x75\xb8\xcd\xa3\xe0\xd7\xae\x11\x88\x3b\x86\xb1\x4d\xa9\x67\x75\x63\xa3\x2d\xb2\xa2\x20\x11\x27\x1a\x8b\x33\x5b\x34\x5f\x39\x54\xea\x4c\x04\x89\xd8\x24\xf5\xa3\xef\xe3\xf4\x3f\xc0\x92\xe3\x7d\xe4\x06\xb3\x6e\xfa\x48\x37\xe4\x92\xf7\x03\xbf\x7d\xe3\x8d\x6f\xb3\x51\xe9\xa7\x19\x3d\xc8\xfd\x0d\xa1\x1c\x47\x27\xc8\x28\x35\x85\x58\x51\x3b\x39\x64\x94\x32\xe1\x0f\x34\xb7\xb2\x89\x97\xfe\x3f\x77\xf8\xa0\x45\xf5\x7f\x63\xc5\x5d\x56\x66\x95\xd9\x65\xaa\x08\x84\x17\x06\x01\xc6\x4b\x0f\xe4\x08\x06\xe7\x18\xdd\x01\x39\x4d\x1e\xfd\x3d\x3c\x63\xca\x46\x71\x7f\x86\x54\x55\x85\x23\x84\xb4\x49\xfe\x96\xe8\xde\x84\x70\x96\x2e\x3d\x1e\x67\x27\x98\x97\x2b\x67\x44\x9b\xf5\x88\xe2\x5a\xb5\x3e\xb6\xfe\x82\xb5\x4b\x45\x7d\x11\x86\xdd\xcb\xd9\xe7\x51\x69\x1a\xe0\x1e\x4d\xab\xf0\xdc\x49\x7e\xc1\xbb\x9c\x64\x11\x5c\x1f\x9f\x67\x0c\xf4\x09\x9a\x55\x31\x7f\x47\xee\x85\x19\x71\xb9\xf7\x7d\x3c\x0e\x70\x81\x40\xe0\xd3\x31\x30\x0e\x34\x71\x55\x2d\xdc\x18\xb3\xb6\xe0\x65\x34\x35\x55\x64\xcf\x07\x0d\x63\x77\x46\x86\x8b\xbc\x8c\x1e\x4e\x18\x73\x52\xc2\x1a\x6a\x56\xf5\x60\x09\x23\x2f\xab\x32\x9d\xca\x7e\x40\x81\x43\xb8\x6c\x6e\xc2\x92\x3b\x15\x19\x28\xb9\xcb\x59\x9c\x5d\x74\xdf\xfb\x27\xe1\x6d\xbe\xe1\x90\xc8\x6d\x88\xcc\xbe\x85\x5d\x0f\x47\x39\x7c\x4a\xca\xc8\xa4\x39\xca\x58\xed\xd3\x1f\xd1\x1b\xe5\x07\xeb\xa2\x06\x4f\x2e\x9c\x0f\x47\x50\xa0\x14\x2f\xa5\x75\xa5\x3d\x53\xc9\xfc\xe5\xf7\x53\x33\x96\x15\xce\xaf\x90\x45\xda\xf6\xf3\x76\x3d\x8f\x2f\x6e\xf3\xd3\xb1\xf9\xa0\x33\xeb\xef\xf7\xf2\xb4\x68\xf4\xe3\xab\x28\x57\x65\x3d\x42\x27\x5a\xa5\x36\x64\x0f\xca\xcb\x8c\x28\xcd\xc5\x9f\x19\xf3\xfb\xe2\x2a\x9c\xe9\x00\x29\x44\x18\x5b\xaa\x99\x99\x9e\xcd\x24\x65\x08\x25\x2b\xba\x69\x66\x5c\xac\xa7\x95\xa7\xb0\x0d\x5d\xda\xa8\x9d\xb3\xce\x68\x85\xf0\xc7\x03\xea\xf5\x85\x70\xcd\xb1\x7f\xbb\xe6\x5e\xdd\x5b\x5d\xd1\xfa\xc0\x8f\xb3\xf3\x14\x5e\x29\x03\xd5\x1f\x10\x03\xa0\x57\x99\xe8\x1f\xc0\x20\x80\xb2\x33\xe4\xbf\xd1\x1f\xe7\x14\x1e\xff\x07\xa9\xf8\x86\xa4\x37\xaa\xa4\x83\x3a\x4d\x63\xf7\x9a\x26\xe0\xe8\x01\x61\xdd\x7a\x78\xa4\x39\xc9\xd4\x66\x85\x07\xb1\x8d\xff\x71\x41\x5b\x54\xbb\xd9\xbf\x92\x11\x01\xf6\x59\x5d\x6d\x38\xbb\xc6\x36\x1b\xf3\xeb\x5f\x9f\x6c\xa0\x8f\xa3\x32\x15\xb2\xce\x0d\xc1\x58\x46\xb6\x86\x56\xf6\xf2\x55\x71\xc7\x98\x61\xdf\xb8\x54\x21\x6e\xd9\x2c\xc9\xb4\x74\x8d\xce\x30\x62\x64\x28\xe9\x05\xc0\xbd\xbb\x11\x60\x73\x79\xf5\x0a\xc8\x41\xc1\xd5\xfe\xe1\x11\x24\x04\x5b\xed\x18\x74\x2e\x6e\x3d\x94\x70\xb7\xfc\x68\x1e\x70\xc6\x35\x1f\x74\x21\x89\x4b\xc0\xb9\x6c\xe1\x16\x6d\xb3\xe6\x37\x57\xe2\xf9\x74\x70\xe7\x69\x44\xbc\xfa\xa5\x03\x2b\x0f\x98\x9c\xbd\x5a\x33\xa2\x29\xb7\x95\xf8\x37\x37\xc1\x8e\x4e\x35\x7c\x00\xe3\x7e\x31\x6d\xba\xac\xb5\xbd\x74\xe3\x73\x99\x65\xd4\x71\x68\xcb\xd9\x23\xd6\xe1\x1c\xf6\x4c\x88\x03\x0d\xca\xc1\x0c\x23\xc1\xa4\xd7\x4f\x7f\x56\xe6\x9e\xbb\x49\xd3\xd0\x44\x37\xd5\x22\x69\x7f\x98\x69\xbd\x9c\xa8\xc9\x20\xb1\xd1\xf1\x23\x0f\x49\x06\xa8\x9f\x5d\x51\x31\xec\x22\x70\xcf\xb6\x84\xb5\xeb\x34\x3e\x83\x03\x8d\xb9\xef\xdd\xdb\xd7\xd6\xc4\x6a\xfe\xa1\x7f\xb9\x51\x3e\xf5\x87\xbb\x88\x53\x6f\x1f\xd6\x52\x3c\xb9\x89\xf0\x59\x7e\x35\xe8\x92\x14\xbf\x98\x1b\xf8\xcf\x07\x19\xb7\x4c\xc4\x7c\xab\x4f\xe6\x24\x70\x20\x32\xf5\xd8\x2d\x97\xeb\xc3\xb3\x17\x49\xe9\x09\x83\x05\xec\x11\x7f\x54\xd3\x00\x77\x17\xbb\xba\x6f\xcc\xa9\xde\x53\x63\xbe\xe6\x18\x1d\x86\x2d\xfd\x0f\xb3\xc3\x98\xf9\x61\xc7\xb2\x53\x55\x23\x61\x29\xf5\xd8\x52\xb5\xeb\x68\x62\xec\xb5\x89\x01\x57\x63\x05\x6e\x21\xc4\xb1\xad\xac\xec\xb2\x38\x74\xe9\x2b\x3a\x61\x53\x22\x92\xbb\x15\x7b\xe8\x2b\x31\x9c\xbf\x3b\x1f\x58\xe2\xf4\x12\xb5\x9d\xf1\xf3\x85\xe1\x53\x42\x1c\x50\x3f\x1d\x79\xe2\x5f\x57\x80\xae\xb5\xc5\xe1\x06\x55\xdd\xa1\xa6\xaf\x7f\x63\x5e\xcf\x48\x36\x4d\x9a\xea\xc7\x59\xc1\x44\x1c\x4f\x64\x46\xf8\x1f\xff\xc7\xd9\x70\xfc\x37\xd2\xbd\xa9\xd4\x71\x6a\x86\x9c\xfa\x87\x1e\x20\xef\x4a\x14\x43\xd5\x8c\x62\x8b\xd0\x08\x71\x7b\x64\xf2\x72\x4f\x37\xf1\x63\xcb\xee\x7f\xc0\x38\x56\x29\x2c\x0f\xa5\x82\x3e\xd8\xcb\x60\x59\x8f\xe1\x68\xf9\xf6\xf0\x99\x97\x52\xcc\x9f\x56\x14\xbf\xa7\xa0\x82\xc3\x1f\xd6\x12\x5f\x8e\x39\xd8\xa4\xf5\x55\x9f\x6f\x18\x37\x79\x4c\x0c\x68\x4a\x08\xf5\x47\x08\xf6\x43\x7b\xf2\x21\x12\xdc\xcb\xc0\x66\xd4\x64\x35\xf1\x76\x52\x8e\xdb\x1d\x9b\x52\x26\x28\x6c\x16\x6e\xdd\xc1\x47\x37\xde\x4f\xce\xb8\xe1\xfd\x9a\x0c\x0f\x8b\xa9\xe8\x80\x94\x13\x95\x75\x28\x52\xc6\xe4\x23\x7e\xef\xcb\x95\xeb\x5e\xdd\x5d\xc1\x8d\xee\x8d\x1c\x91\xd5\x80\x74\x28\xab\x86\x9f\xf5\xf6\x4b\x2b\x2c\x21\x55\x39\xd0\x59\x02\x87\xd9\x9b\xfa\x1f\xff\x4a\x65\xc5\xbf\x71\x7f\xcc\x36\xc5\xbe\x6b\x55\xd5\xc1\xd3\x0a\x88\xb2\x77\xab\x4b\x69\xef\x1b\x71\x7a\x22\xdd\x10\x12\xea\xc1\xec\x53\x74\x3e\xd0\xe3\xa4\x59\xed\x3c\x8f\xbc\x41\x2f\x53\x0e\xb7\x73\x93\xcd\xaa\xa2\xc9\x97\x5c\x81\x20\x27\xe3\xb2\xd5\x29\x32\x9d\xcd\x04\x20\xd7\xb8\x75\x52\x61\x57\x1b\x91\x5d\x6e\x4f\xca\xe5\x02\x12\xcf\xbe\xd0\x28\x43\x36\xb6\xbf\x87\x3c\x01\x22\xe4\xf1\x19\xe0\x3f\x6d\x26\x0f\x2b\x90\xa5\x90\xbe\xb9\x25\x02\xab\xdc\xe8\x88\xac\x53\xb6\x77\x95\x86\x36\xac\x7d\x8d\x29\x98\x01\x6d\xa4\x53\x4a\xa0\xec\xe1\x7a\xc5\xc2\xf2\x93\x77\x97\xbb\x60\x19\x4e\x02\x19\xe8\x46\xe5\x36\xca\x5d\x5e\x59\xfd\xbd\x0d\x0f\x2a\x37\x46\xc4\x1c\x17\x28\xd3\x6e\x17\x69\xde\xe9\xb1\x1a\x22\x71\x2f\xee\xde\x9c\x1f\x63\xaf\xa8\x4b\xfe\x46\x57\xa8\xa0\x52\xfb\x0e\x12\x81\xb5\x4c\xe0\x88\x18\x77\x45\xec\xdd\x77\xc8\x13\x7a\x16\xc9\x30\x7d\x13\x7e\xb7\x53\xd6\xcd\x68\xe8\xb1\x9d\xc2\x2d\x90\x90\xbc\xae\xbd\x72\x0a\xcc\xc6\xe3\xc9\xfe\x76\x67\x42\xbb\x96\x72\x6b\x56\x35\x8c\xd3\xd5\x1e\xe9\x81\x86\x98\xdc\x81\xee\x45\x30\x11\x5b\x85\x8d\xea\x6e\x03\xef\xaf\xc0\xd9\x6b\x32\x5b\x59\x6c\xd0\x60\x51\x0b\x03\x58\x86\x43\x25\xca\x9b\x66\x9f\xa1\x6c\xc4\x84\xa8\xa3\x9d\xe8\xd6\xc0\xa5\x42\xde\xce\x49\x19\x12\xdb\x68\xdc\x7d\xdc\x65\xa5\x0b\x78\x53\xf7\x80\x5f\xea\x10\xda\x1a\xdf\x5a\x46\x9d\xb6\x9d\x7c\xb7\x4d\xd0\x17\x1a\xf7\xb4\x9b\x9e\x20\x87\xe8\xe3\xd3\x29\x7a\x7a\x1f\xf5\x7f\xd3\x3f\xca\xab\x8a\x64\xfe\xf0\xf6\x12\xde\x6b\xd1\xb9\x00\xf5\x51\xe7\x37\x74\xce\x63\xc4\xc1\xa1\xa0\x35\xff\x7c\x12\xb7\x9d\x72\xcf\x58\x61\xa3\xff\x71\x13\x27\xdd\x01\x11\xa5\x88\x8a\x78\x8a\x43\x56\x52\xf0\xc3\x0f\xd6\x39\x4e\xf5\xda\x4c\x2a\x13\xcf\xaa\x26\xc4\x06\xeb\x75\xb6\x15\x96\x0f\xf6\x37\x1c\xe5\x1a\x1e\xab\xc4\x8a\x28\x07\xe1\x5d\xc4\xd3\xce\x5b\xa6\xb2\x7d\x5b\xfe\x6c\xb8\x7b\xc7\xf9\x8a\x8f\xc8\x83\x3b\x98\xe5\xce\xa4\xb8\xc3\x44\x2f\x78\xea\xdd\x26\x3b\x85\xff\xf8\x97\xa7\xb2\xdb\x82\x82\x96\x97\x85\x1b\x32\xc0\xe4\x4d\x0c\xfd\x94\x5f\x11\xff\x3c\x5a\x18\xa4\x9b\x63\xc5\x30\xf6\x4e\x6f\xc8\xf7\x63\x74\x5f\x99\x01\xb8\x96\x19\xbc\x41\x97\xe3\x59\xcf\x38\x8b\x8e\xa7\xf4\x1b\x65\xa3\x50\x69\x40\xef\x01\xc2\x8b\x73\xf6\xca\xb3\x97\xd1\x17\x04\x91\xb3\x2a\x41\xb0\x64\x6f\x8c\xc7\x65\xd3\x02\x0a\xaa\xaf\x70\x8b\x57\x6a\xed\x76\x70\x35\xd0\x4e\x2d\x74\x88\xb0\x53\x13\x82\x9a\xcc\xe8\x48\xc8\x5a\xdf\x63\xd8\x5e\x99\x4e\xfe\x14\xc2\x78\x2e\x3f\x92\x54\x95\x7a\xa2\xce\x2b\x84\xeb\xcb\x92\x11\x47\xa4\x2f\x54\x97\x73\x10\x1d\x35\x65\xf0\x68\x98\x84\x38\x1f\x9f\x40\x24\x8e\xf7\x88\x9d\x14\x1b\x1b\xec\xdf\x1d\x04\x51\x6f\x96\x53\xf7\x12\x56\xa7\xd9\xcd\x52\x0c\xfb\x08\xd6\x68\x05\x3d\x1e\xd2\xf3\x1d\x59\xb2\x5e\x7a\xec\xf2\xb1\x65\x97\x70\x3e\x0f\x0a\xa0\x1f\xef\x20\x10\x70\x33\xdf\xc8\x1d\xf3\x78\x28\x5e\xe3\x11\xb6\x4e\x65\x34\x47\x90\x1e\x26\x2d\x07\xf5\x21\x60\x07\x75\x0a\xc7\xc1\x6a\x2e\xa3\xe4\x87\x3e\xfb\x28\x0d\xf6\x0f\x55\x2c\xf2\xc9\xfd\xcc\x20\x8e\x8a\x8c\x6e\xfb\x5a\x58\x66\x55\x26\x80\xed\xb3\xf8\x3c\x5b\xe1\x9e\xe1\x7b\x75\x29\x1c\xe8\xa7\xe5\x80\xbe\x74\x9c\x66\x4a\xa2\xdd\x30\x79\xfb\x8a\xf1\xf0\x08\x5e\x80\x12\x01\xd0\x85\xe0\xfa\x05\x63\x46\x3e\x19\xfd\x87\xd9\x6f\x63\xcd\x4f\x61\x4e\xe0\x08\xd4\x93\x83\x17\x65\x8d\xcb\x2a\x47\x4a\xc9\x5b\x83\x42\x40\xc0\x5f\xad\x8a\x35\xc5\xbe\x80\x84\x02\xfc\x18\xa4\xd4\xcf\x95\x51\xb2\x4f\x0e\x01\x9c\x92\x0f\xeb\x5f\x9e\x61\xd3\x52\x96\x78\xa7\x7e\xf4\xb2\x07\x7b\x26\x9b\xf2\x62\xab\x57\xce\x45\xb6\x29\x1e\x5b\x9d\x96\x20\xa5\x36\xb9\x1d\x46\x5b\xa7\x9d\xb5\x44\xfb\x80\xf5\xe6\x54\x1f\x58\x4a\xd1\x60\x07\xc8\x58\x5c\x1f\xaa\x9c\x99\x77\xed\x92\xb9\xd7\x90\xec\x3d\xbc\xb8\x5a\xf7\x2e\x36\xba\x14\x55\xff\x2d\x39\x9b\x3b\xfb\xf3\x7e\x99\x93\xc1\x6d\x28\x14\xda\x8f\xde\x52\x70\xf5\x2e\x22\x34\x50\x96\x5b\xee\x5e\x38\x62\x25\x89\x54\x4f\xe9\x9c\xfb\x17\xda\xba\x6c\xb2\x1f\x2b\x53\x58\x57\x6a\xc4\xf6\xb1\xf4\x96\xc1\x6f\xf6\xf0\xdd\x1e\x9f\xb0\xe2\x7a\xf4\x91\xcf\x47\x2b\x2e\x35\x0e\xa8\x47\x31\x66\xff\x32\xe0\x6f\xe6\x9c\xc6\xc6\xca\x30\x9a\xc6\x2f\x62\x81\x48\x07\x1c\xcf\xc2\x6c\x18\xc0\x0c\x17\xcc\xe0\x0a\x84\x11\x68\x29\x66\x4a\xcd\x5a\x05\xd4\x34\x58\xb9\x38\x04\x7e\xc8\x28\x01\x29\x48\xf8\xd1\x02\x19\x2c\x75\x06\x05\xdf\x6f\x8d\x3d\x10\x07\xa8\x44\xb3\xb7\x8c\xaa\x5d\x6d\x19\xf7\x7d\xf5\x46\x46\x42\x8a\x86\x72\xd4\xf0\x98\xae\x61\xee\x89\xac\x96\xf6\xfe\xef\x9c\x53\x68\xb5\x43\x1b\x0d\xba\x41\xb5\x6c\xd0\x91\xd9\xf8\xec\xdf\xc4\xa3\xfa\x9f\x13\xf6\x2c\xee\x6e\xb4\xd5\xf6\x6a\xcd\xef\xb7\x2c\xbe\xf2\x45\xa1\x58\x61\xca\xaa\x57\xe1\x48\x4d\x0e\xb5\x25\x5e\xce\x72\x45\x8f\x4b\x1d\x33\x8c\x3c\xf1\xac\xa0\xb6\x3a\x83\x50\x8c\x7c\x4d\xe1\xeb\x63\xea\x19\xcd\xb5\xf6\xdb\x3d\x68\x20\xf0\xac\xc1\x87\xe6\xf0\x89\x72\x9b\xcb\x76\xfe\x15\x1d\x04\x14\x7b\xb6\x0c\xce\x43\x6e\x50\x65\x50\x77\x1c\x59\xdc\x23\xb5\x25\xd6\xa4\xfa\x31\xe7\x2c\x1d\x55\x06\x9c\xcc\xb2\x26\x5b\xb4\x92\xff\x1d\x59\x78\xe9\x72\x6e\x26\x30\x2d\xe8\x23\xcd\xf2\x39\x44\x00\x2f\xd9\x7e\x18\x57\xee\xeb\x52\x36\xd0\x6a\x5d\xce\x5c\x6a\xdc\x19\x20\x23\x54\x96\x5b\x75\xb7\x33\xe7\x41\x4a\xec\xb2\xa1\xdc\x47\xf5\x07\x76\x18\xea\x24\x99\xb1\xcf\xf4\x5a\xdd\x9c\x7d\x3d\xb2\xcc\x9e\xc5\x78\xe6\xae\x82\x51\xd0\x35\xb5\xa5\xb3\xb4\xba\x47\x08\x90\xd8\x0c\xe0\x5f\x79\x87\x8f\x26\xc3\xc3\x25\xa6\x1d\x99\x93\xba\x0b\xdb\x80\x94\x83\x68\x25\x40\x8d\x7d\xf1\x28\x50\x1f\x02\x3f\x3e\x74\xd0\xf5\x53\x93\x4e\xb1\x19\x96\xb2\x5d\xf7\xde\x61\x06\x9b\x92\xb7\x53\x88\x48\x4d\x90\xd0\x87\x82\xb0\xda\xeb\x00\xc6\xc8\xd2\x32\xe7\xa1\xec\xda\x62\x8b\x04\xc5\x87\x9a\x05\x7c\x0b\x9f\xc9\x32\x6f\x25\x98\xd0\xe0\xf7\x90\xa0\x7b\xa5\x1b\xb8\x16\x09\xb9\xa8\x90\xb8\x5f\xb6\x4e\xb4\x61\x7e\xe6\x9f\xd1\xdd\x06\x19\xa8\x3e\x7b\x97\x82\xcf\xb2\xb7\xd2\xfc\x23\x93\x30\x6f\x3f\x7f\xfa\x32\xeb\x94\xe5\x8b\x7c\x86\x7d\x4b\xbd\x5c\x87\xa0\x85\xb8\x49\xbf\xcd\xb9\xe4\x6a\x20\x2c\xb5\xa2\xb7\x6d\xa6\xfa\x02\x07\x64\xff\xd3\x1e\xe3\x52\x8a\x92\x9e\x7f\x53\xc4\xe2\x76\x56\x5b\x11\x26\x2e\x56\x2a\x39\x9c\xc7\xc0\x05\xd7\xab\x5f\x1c\x47\xe2\x9b\x67\x3c\x06\x30\xf1\x74\xb5\x2b\x08\xb7\xd8\x65\x0c\x1d\xcb\xdb\x77\x68\xf8\xe5\x15\x7d\x11\xa8\x6b\x70\x38\xc6\xdd\x3f\x36\x02\x10\xc1\x78\x23\x7d\x02\xd9\xe1\xe5\x45\x9f\x3a\x22\x7b\xe2\x54\x90\xa4\x5c\xa4\x55\xd1\x3f\xf2\x1c\xf0\x12\xd8\xba\x9e\xa9\x1f\xf6\x3d\x78\x84\xaa\xf0\xe1\x7e\xe6\xc3\x04\xb8\xc7\xf8\x13\xed\x69\xe8\xcf\xdd\x53\x58\x0d\x11\xc0\xbd\x4c\xbe\x08\x28\x45\xa2\xe1\xb0\x1d\x72\x26\xdb\xf7\xc8\xad\x59\xba\xf6\xe4\xa6\x08\x0a\x01\x9e\x1f\x1c\x77\x2c\x6e\xd5\x6b\xb0\xf1\xc7\x70\x7e\xec\xfe\x39\x9c\x4e\x6e\x2a\xd7\xd9\xaa\x1b\x51\x29\xce\xb0\xa1\x1d\x36\xbb\x76\x0f\x30\xed\xb0\xa5\x19\x7a\xcd\xc7\x65\xc7\x38\x6c\xf2\xb0\x82\xa0\x3d\xd9\xe1\x2c\x67\x87\xe4\x4c\xc1\x12\x1a\xa4\x2d\x18\xe4\xe3\x3c\x84\x2b\xcc\x90\x42\x56\x81\xf3\xe1\x57\x53\xc0\x90\xba\x41\x7d\xc8\x72\xbd\x74\xf6\x9b\xe1\x21\xd6\xbf\x8b\xc3\x7d\xdf\xf2\xe5\x3f\x75\xdf\x54\x86\xdd\xc1\x54\x60\xeb\x62\x83\xb6\x45\xbd\x0d\x34\x87\x75\xb5\x7d\x25\x4d\x40\xcd\x30\xe5\xec\x9c\x75\x1b\x3d\x52\x7b\x22\x4f\xb4\x71\xab\x57\xba\xac\xb4\x2d\x67\xb8\x5c\xd0\xa4\x72\xc0\x08\x53\x11\x9b\x1c\x23\x92\x0a\xf5\x4a\x50\x6c\x3b\x20\xf1\x0e\x1b\xaa\xea\xf3\x0a\xfb\xec\xa0\x92\x5c\x91\x98\xd5\x37\xf5\x5e\x36\xe3\x62\x81\x40\x06\x61\x6d\x3c\x7a\x04\xea\x95\xa0\x1d\xaa\x59\xba\x7f\x05\xeb\x02\x76\x94\x5c\x72\x7a\xd1\x6a\xfa\xe5\xef\xa3\xaa\x96\xfd\x0e\x4b\xed\xb1\x51\x7a\x48\xd1\x04\x23\xed\x8f\x5a\x26\xa4\x7a\x07\x2b\xa4\x9c\x00\x4d\xbf\x89\xfd\x51\x16\x15\x14\x5c\x65\x76\x72\xbb\xa4\xcc\x96\x6c\x95\xa4\x2d\x4c\xf4\xcb\x06\x1e\xde\xf5\xb4\x37\xab\x74\xc8\x6e\x4b\xef\xd0\x03\x76\x9b\xd7\xf2\x2e\x7f\xec\x35\xd3\xe5\x33\x50\xf7\x2e\x07\xf5\x02\x3f\x83\xff\x6a\xc9\x43\xce\x94\xe8\xc8\x91\x3b\x94\x12\xaf\x08\xc3\x51\xff\x64\x8c\xf6\x08\x1a\xbf\x6e\x9b\x48\x3c\xe6\xfb\xd1\x4e\x71\x67\x65\x38\x77\x87\xfc\xbc\xe4\x0b\xd8\x95\x6d\xd1\xef\x4d\x1d\x92\x2f\x2f\xcf\xb2\x9f\xd2\x3f\x29\x87\xb9\x5e\x04\xb9\x8b\x23\x52\x97\x1f\x10\x22\xb7\x0a\x32\x42\x37\xd1\x89\x62\x52\xd6\x00\xc8\x2e\x79\x2f\x12\x7a\x3c\x83\x77\xff\x18\x58\x5c\x7e\xa8\x31\x26\xa7\x96\x96\xa5\x6a\x19\x54\xbc\xa6\xcd\xef\x6a\x67\x6c\x01\x84\x02\x34\x35\xfe\xea\x9c\x0c\x57\x6a\xa6\x4d\xa6\xa2\x89\x42\xfb\x14\xd6\x73\x3e\xd2\x88\x32\xc4\xe8\xab\x4c\x94\xa4\x87\xec\xfe\x7e\xee\x55\x8f\x8f\x93\xb9\xde\xef\x05\x94\x3a\xfd\xbd\x3e\xa6\x3b\x47\x73\x48\xc2\x9d\x8f\x01\xf6\xe5\x72\x30\xb5\x43\xfe\x72\xa1\xa8\x68\x3c\x28\xab\x58\x35\x12\x88\xce\x11\x56\xb9\x68\xd8\x98\x91\x40\x73\xee\xea\xd5\x8b\x23\x8a\xfa\x6d\x67\x0f\x1e\xd6\xa2\xef\x17\x7e\x64\xcd\x16\x92\x30\x13\x48\xd4\x5b\x21\x14\xee\x6f\x31\x59\x81\x58\x06\xf6\xd5\x6d\x53\xcd\xf7\x93\x7f\xb7\x94\xfb\xeb\xb5\xee\x80\x60\xa2\x3b\xfd\x05\xa4\x11\xf6\xc2\x7e\x76\x17\x74\x94\x2e\xbd\x4c\x42\x09\x07\x2b\x30\x4d\x3e\xd1\xc2\xe9\xf2\x9f\x7d\xeb\x22\xb8\xa6\x39\x23\x0a\xb0\xd9\xce\x45\xd3\x3d\xb5\x14\x41\x3f\x81\x6a\xcb\x46\x72\x5b\x7c\x85\xa4\x9f\xb0\x85\x52\x1d\x76\xc9\xfd\x3c\x82\x81\x02\x2b\x81\x46\xe6\x68\xcd\x34\xd6\xee\x0e\x13\xa8\xde\xaa\x98\x9a\xf1\x72\x93\x00\x41\xc5\xad\x9d\xe3\xb8\x52\x93\x44\x0f\x69\x2a\x6e\x8a\xfc\xa4\x43\xb7\x4c\x41\x7e\x6a\x2c\xfb\xbd\x04\x40\xdc\x7a\xd6\x06\x25\x73\xa8\x01\x1a\xec\x99\xec\x7b\x0e\x1e\x85\x9a\x3d\xed\x53\xf6\x28\xee\xf2\x04\xfb\xe3\x55\x7e\x33\x77\x69\xca\x95\x42\x0d\x9a\x44\x14\xfb\x6e\x05\xc7\xe5\x4a\xce\x27\x6c\x73\x99\xf4\x26\xa2\xd2\x14\x69\xa8\x57\x83\xbd\x2b\xc9\x64\x6a\x14\xad\x97\x09\x6f\xa2\x95\xa6\xda\x40\xe2\x88\xdd\xa8\xc5\x70\xeb\x87\x51\x72\x8c\xbf\xaf\xae\x77\x68\x25\xa8\x17\x9d\x06\x26\xd9\x7a\x73\x0b\x21\x90\xed\x11\x20\x83\xe7\x6a\x53\x3e\xd6\x52\x0a\x87\xbe\x8b\xa6\x15\xb6\xb1\xaf\x2b\xdf\x49\x86\xe7\x0e\x70\xb2\x7b\x9e\xde\x01\x82\x0c\xca\xd9\xd3\xb0\x88\x4d\x44\xf4\x6e\x70\x40\x5f\x5a\xde\x4c\x3c\xd5\x3f\xca\x0a\xf9\x18\x27\xfb\x2d\xdb\x4a\x4c\x59\x6f\xf6\x9e\x4d\x6e\x81\x36\x99\x4e\x07\xf9\x9c\x3a\x76\x96\x46\x2f\xeb\x6f\x24\xd4\xa9\xc3\xa4\x44\xc2\x37\x6c\xde\x82\xde\x01\xe3\x3d\xf7\x9d\xf8\x65\xbc\xcb\xdc\x40\x9b\x7b\xf5\xa0\xfa\x66\xb7\x06\xf2\x0d\x2d\xfd\xb2\x89\x2b\xb3\xf3\x5f\x28\xcb\xb1\xd0\xb5\x17\xb3\x9d\xf8\xf5\xbe\xc6\x21\x18\xa7\xaf\x91\x67\x1c\x49\x8c\xb3\x05\xa0\xe5\x20\x4b\xf8\x73\x92\x8f\xe6\x9e\x0f\x68\x0d\x6d\xed\x2a\x95\xbd\xd2\xc5\x59\x82\x53\x41\x7b\x86\x9d\xfa\xbd\xbf\x3a\x53\xcb\xbd\x1a\x59\x55\xc3\xbd\x2a\x09\xe9\xa5\xdc\x0f\x3e\x8d\xab\x15\x1e\xe2\x1c\x67\x97\xe8\x64\xe7\xcb\x8e\x7c\x3d\x26\x1b\x57\x18\xc7\xf6\xd9\x25\x00\xc9\x3e\x56\xcf\xc9\x16\x06\x97\xe5\x3a\x9d\x84\x44\xb4\x41\xa2\x56\x28\x3e\xe0\xb4\x85\xc1\xb8\x69\x09\x87\xe1\xac\x0b\x46\xd4\x1d\xbc\xc5\x76\xa6\x06\x4c\xdd\x27\xc7\xb6\xd2\x3b\x58\x96\x06\xf8\x28\xaa\xff\xdf\x94\xa1\x68\x74\xb7\xc0\xa1\x9c\x9a\x7f\x49\xa6\x04\xd4\x02\x5c\x2d\xa2\x68\x18\x73\x3c\x46\xb7\x08\xdb\xde\xa3\xa6\xda\xf1\x98\x96\xba\x37\x31\x5c\x70\x03\x5b\xc2\xbc\x2d\x91\x94\x4a\xa8\x39\xd2\x4f\x49\xd0\x8e\x98\x57\x18\x9f\xf9\xa9\xa1\x3c\x89\xce\x93\x5c\xda\xc5\x95\x19\xef\xf7\x68\x42\x55\x67\xbb\xe3\x6a\xea\xd0\xb2\x4d\xbd\x21\x73\x40\x60\xe3\xa3\x1e\x13\x31\x9f\xb2\x4d\x2f\x55\x15\xbb\x3b\x33\x14\x5a\x37\xb2\x56\xd8\x91\xdf\xa7\x20\xb6\x72\x91\xdb\x2c\xfa\x28\xfb\x1e\x1b\xa6\x43\xff\x61\xee\xca\x63\x93\x9f\x23\x60\x2b\x35\xa6\x90\x13\xe5\x5e\xcd\x72\x31\x82\xfa\xe8\xf2\xf4\x41\xc0\xe9\x3b\xb5\x13\x61\x2a\x56\x4e\x1a\xfd\x18\xad\x3c\x5f\xcb\x2d\xfb\xd7\xb2\x4e\xb7\xf8\x59\x95\xa8\xc9\x26\x6a\x9c\xa5\xed\x19\xcd\x9c\xf2\xf6\x48\xcd\x28\x5b\x90\x10\x51\xe4\x5f\xab\xad\xcb\x0c\x23\xa8\x6d\xeb\x7f\x7d\x63\xb1\x87\x3b\x5f\xa5\xbe\x0a\xbb\x3c\x59\xe7\xa9\x0b\xa2\xdf\xde\xd6\x79\xa0\x90\x54\xf9\xc6\x39\x45\xc0\xec\x6a\xd1\x39\xb4\x1c\x97\x97\x1e\xb5\x1c\xb7\xda\x91\x89\x3e\x8c\x5b\x2e\x41\x37\x8f\x47\x0f\xb6\xf1\xbd\x85\xda\x43\x44\x04\xdf\x81\x0d\xa8\xce\x9a\x30\x5d\x17\x1b\xc5\x3d\x1f\x35\xd4\x39\x2a\xb3\xa0\x1d\x11\x39\xb6\x12\x24\xc4\x9f\x32\x44\xd0\xaf\x49\x33\x8c\x73\x35\x05\x65\x6e\x12\x59\x20\x54\xbe\x78\x7e\x81\x2d\x42\xac\xa2\xd2\x84\x8c\x32\x3f\xc8\x4d\x34\x67\x88\x4c\xe9\xb1\x4e\x82\xda\xe0\x05\xda\xd5\xe6\x0d\xaa\xfc\xba\xbf\x2f\xbb\xeb\x23\x0c\xbb\x31\x0e\xcf\xfd\x55\xd6\xa4\xce\xaa\x0a\x5a\x0c\x5c\x1d\x94\xf3\xb7\xaa\x49\x8a\xc4\xde\xe5\xa1\x3b\xb4\x83\x29\x9b\x8f\x72\x9d\xd8\x40\x69\x35\xc5\xfa\x66\x47\x3e\xbb\xce\x96\x8f\x20\x36\x2f\x28\x28\x63\xd9\x0a\xcb\xc1\x41\x5e\x6d\x30\xde\xfb\x68\x00\x73\x55\x13\x3f\xb0\x6e\x9e\x84\x0f\x3c\x0c\x16\x0a\x34\x5f\x6b\x15\x95\xb4\x52\x3c\x94\x21\x7f\xd4\x72\x91\xe1\x3a\x72\xc3\xc7\xbc\x93\x60\x89\x6c\x5d\x70\x95\xd8\xeb\xc1\xed\xd2\x5e\x3b\x85\x7c\xa9\xce\xac\xf8\x2e\x73\xb4\xd9\x5a\xb9\xd3\x15\x21\x8f\x78\xeb\x4d\x3e\x65\xff\xc2\xcb\x6f\xc9\xa0\xb9\x69\xf2\x5f\x32\x10\x5c\x55\x9d\x0b\x2d\x16\xfa\x18\x01\xb0\x53\x63\xe8\x8d\x9d\x0a\x75\x2c\xe2\x13\x60\x94\xd4\x9b\xd4\xf9\xf8\x56\x17\x6b\x09\xb5\xe8\x22\xbe\xe8\x5c\xa6\x6c\x93\xaa\x67\xc5\xe5\xcf\x26\x3e\xce\xe0\xc6\xb7\x7a\x3b\xe8\x5f\x49\x5e\x92\xb9\x06\xbb\xe1\x42\xc4\xd1\x7a\x97\x5c\x7d\xa8\xe6\xcc\xc9\x0a\xd1\xea\x3c\x6a\xc2\x22\x7c\x26\x23\xdd\xd1\xe3\x98\x2d\xc2\x41\x70\xfc\x32\x80\x78\x18\x55\x93\x4d\x3d\x7a\x76\x49\x16\x10\x00\xad\x07\x2f\x62\x94\xa7\xeb\xb6\xd3\x6d\x97\x42\xad\x4f\x94\x6b\xae\x46\x9b\xb3\x33\x7a\xe6\x4a\x8e\xc3\xa8\x7d\x44\xe3\x69\x3b\xf2\x79\xf7\xa8\x66\x7d\xd1\x7b\x48\x31\xc4\x8b\xfc\x9b\xe6\xb0\x5d\x81\x08\xc7\x2f\xfc\x63\x83\x0c\x94\x79\xb5\xe3\x33\x13\x8e\x33\xbb\x26\x98\x24\xd3\x87\x6c\x7f\xf8\xda\xb3\x0d\x75\x56\xb1\x0d\xd2\x6b\x06\x79\x4b\x20\x9b\xd8\x42\x67\xb8\x54\x94\x6d\x35\x49\x30\xe3\xfe\x27\xee\x0c\x7f\x57\x35\xae\xca\x6a\x1a\x62\x1d\x30\x6a\x64\x52\x01\x5d\xda\x2e\x6e\x4c\xf9\xab\x4c\x0d\xb9\x6d\x73\xfe\xd8\xac\x5a\x79\x42\x7a\x99\xa9\x0d\xd0\x0a\xf9\x77\x7a\x6e\xda\xae\x3e\x45\x93\x78\x0a\x23\x7d\x8e\x41\xb3\xff\xc9\x9f\x4d\xa7\x10\x8c\xa1\x37\x31\x4d\x98\xf7\x68\x2e\xcc\x92\xdb\x1e\xdc\xb6\x5b\x8d\x29\xf3\xaa\x89\xcc\x67\x34\x59\x25\x4d\x86\xd3\x60\x05\xed\xcb\x7c\x79\x5e\xf4\x99\xb6\xcc\x57\xa1\xee\xa9\xb1\x65\x7e\x18\xab\x34\x32\xb2\x74\x87\x42\xf3\xcd\x56\xd9\x10\x43\x51\x73\x90\x55\x4a\xc2\x9e\x42\x1d\x9f\x0f\x35\xc7\xda\xa2\x3c\x3e\x91\xde\xf7\xb8\xd6\x13\x0e\xcd\x5f\x29\x05\x2e\x1f\x97\xdf\xff\x24\xf4\xa1\x4f\x7e\x66\x43\x28\x67\xfb\x52\xc8\x49\xe7\x91\x91\x83\x70\x63\x6e\xb2\xb3\x94\x7f\xd4\x76\xa6\x15\x22\x27\x24\x04\xcd\xcb\x64\xbf\x1f\xe7\xb2\xfa\xaa\xf3\x84\xa4\x90\x48\x54\x4e\xf3\xb9\x94\x7a\x6a\x13\xe9\xa5\xfc\x20\xca\x43\x4b\xe3\xf3\xe4\xad\x7d\x41\x1e\x89\x33\xf9\x70\xca\xd7\x6c\xd8\xce\xe8\x14\x0e\x50\x48\xc4\x50\x1c\x16\x20\xac\x6a\x21\x61\xcd\x8b\xbd\xf9\xb0\x39\x53\x0b\xd1\xbe\xaf\x8f\x07\x6e\x62\xd5\xb0\x6d\x69\x89\x8e\x2a\x49\x1f\x72\x07\xee\xa1\x03\x98\xbd\x91\x18\x22\x98\x61\xd0\x81\x1b\x56\xd8\x70\xf1\x0b\x28\x9b\xfd\xdc\x8e\x66\xcd\xac\xd1\x63\x42\x55\x21\xfb\x8b\x52\x87\x4c\x91\xe9\x82\xa6\x12\x14\xdc\xfe\x4b\x0f\x2b\xf3\x9b\x1a\x4c\xa1\x7b\xbf\x57\xd1\xe9\x3d\x8b\xaf\x75\x77\x8e\xfd\xdd\x2d\xb6\xfb\xe8\x66\x0f\x1d\x19\x35\x48\x9b\xb9\x33\xfd\x3f\x5d\x0d\xb0\x64\xb4\xd3\x7f\x29\x55\xa9\x23\xfa\x98\x95\xdb\xff\x1a\xdd\x84\xd9\xfe\x36\x7e\xd3\x4e\x70\x4f\x27\xe4\xcb\x22\x21\x3f\xc5\x50\x0e\xea\xbd\x7e\x7d\x6c\xba\x0e\x98\xd0\x3c\xb9\x7b\x74\x8c\xf6\x4f\xc4\x3e\xc5\x7a\x21\x9f\xa8\xbd\x97\x06\x75\x91\xe0\x05\xa8\x87\x86\x57\x44\x2f\xe4\x40\x7e\xfd\xfe\x07\x3b\xff\x44\x6c\x61\x96\x85\x5e\x6c\x17\x1e\x05\x79\xa2\x2f\x75\x96\x1b\x38\xe7\x12\xd0\x48\x77\x0e\xda\x2a\xb2\xa1\x14\x4d\xa3\x13\xf2\xcf\xde\x82\xa4\xe8\x29\x8d\xf4\x69\x0e\x6a\x0d\x84\xad\xf5\xfe\x14\xd6\xb9\xf5\x60\xbb\x99\x52\x33\x7d\xa5\xab\x95\xad\x27\xe5\xfe\x49\x1a\xa4\x25\xbc\x39\x08\xef\x77\x63\x67\x65\x50\xa9\x6e\xbc\xc7\xe8\xc6\xf4\xd7\xaf\x8e\x78\x23\xdf\xc6\x50\x42\xf9\xc9\x73\x8d\xdf\x77\xce\x9b\x29\x36\x97\xa5\x46\x7f\x0f\xa5\x52\xeb\xb6\x29\x7a\x48\x7e\x65\x10\xc1\xf1\x33\x97\x57\x94\xf7\x34\x52\xdd\x1e\x9b\x16\x78\xc5\x05\x58\x6e\x74\x8a\x87\xe3\xee\x92\xee\x23\x71\xcd\x4b\x5d\x4b\xb7\x92\x6b\x57\xc2\x63\xf7\x65\x4a\xe5\xf8\x4f\xbe\x89\x44\xf7\xa2\xb5\x8b\xe2\x75\x8a\xf6\x8e\x75\x37\x35\xd2\xad\x9a\x6f\xa0\xba\x88\x2c\xb6\xda\xc3\x5a\x0c\x9d\x52\xbf\x95\x6a\xa4\x81\x8c\x1b\xfb\x5b\x90\x78\x5a\x7f\x4e\x9b\x38\x5a\x52\x84\x34\x82\xe0\xf3\x94\x95\x38\x95\x05\x6b\xd4\x1f\x52\x2c\xc4\xb6\xe0\xd0\x30\x23\x50\xc3\xdd\xa4\xea\x3e\x8f\x61\x68\x03\x4a\xb9\xb5\x45\xe2\x75\xb9\x30\xfe\x92\x86\x08\xbf\x66\xf3\x86\x61\x70\xed\x18\xb1\x75\x65\x82\x37\xbf\xa7\xac\xb1\x5c\x07\x21\x5c\x62\x3e\x74\x15\x2e\x9d\x4f\xa5\xc5\x49\x71\x93\xe4\x23\xc9\x96\x53\x04\xdd\x80\x1c\xe4\x09\x1e\x6a\x26\x30\x66\x9d\x11\x07\xd5\x93\xdb\x47\x66\x21\x35\xe7\xdf\x9f\x65\x4b\xbb\x23\x4a\x9a\x13\xc1\x24\xea\x9e\x9c\x8a\xd0\x6c\xe0\x46\x53\x05\x4b\xea\xf6\x50\xae\xa4\x76\x52\x9f\xec\xb7\xb1\xb9\x29\x45\x2f\x24\xbb\x64\x94\x59\x27\xb4\x4e\x39\x18\x52\xcd\x04\x34\x97\xff\xc2\xb8\x3d\xbd\x3d\x6f\x7a\x2c\x35\x9d\x28\x40\xce\xa5\xeb\x11\x93\xa1\x0e\xbe\x68\x41\xea\x18\x95\x79\x5b\xf2\x82\xa6\x6f\x9f\xef\x2c\x54\xa2\xe9\x9d\xe6\xd6\x98\x2e\x0d\xe5\xb7\x8b\x84\x26\x0d\xab\x13\xd9\xca\x70\xd0\x5f\x9b\xb2\x43\x8a\xa8\xf4\x74\x85\x07\xa6\xf3\x17\x95\x9c\x0c\x30\x0e\x1b\xe6\xa8\x51\x14\x1a\x27\x14\xa1\xe1\xbc\x0f\xef\x54\xde\xec\x55\x59\x04\x92\xc2\x95\x81\xb0\x2d\xd9\x4c\xec\xb2\x16\x68\x5d\x85\x57\xca\xe1\x2e\x47\x19\x27\xed\x79\xd2\x5a\xca\xa2\xe9\x13\x6e\x1e\x91\xb2\x6e\x2a\x91\x92\x79\xd9\xc2\x01\x53\x49\xba\x29\x01\xe1\x69\x6e\xce\xe9\xab\x8d\x94\x75\x03\x2e\x9e\xd2\x19\xca\x56\x47\xb9\xe2\xd3\xe0\x02\xa2\xcc\xc5\xfb\x53\x29\xe2\xe3\xe6\xa6\xd3\xfd\x8e\xcf\xed\xcf\x50\x13\xc9\xbb\xd7\x05\x9f\xc3\x1e\x1a\x96\x6f\x22\x23\xcd\x96\x21\xa4\x0e\x5b\x04\xf5\xc3\x2e\x7a\x38\x43\x1c\xd6\xb4\x78\x6f\xf7\xd7\xf3\x6b\xfa\xe4\x0f\xf3\xd5\x3f\x99\x2c\xf7\x4f\x6a\x35\x19\xd1\x2e\x53\xcd\xa3\xed\x72\xfc\xb0\x33\x77\xb9\xf5\x1d\xee\xad\xbd\x91\xff\xa3\x1f\x1b\x71\xe3\x1e\x4c\x65\x82\xe1\xa9\x02\xa7\x10\x5e\xb7\x6f\x98\x07\x6b\xe2\x7f\x33\x0b\xd5\x43\xef\x20\x21\x5d\xe8\x9d\xe1\xb0\xc8\x17\xfd\x25\x72\x52\xb4\x93\x2e\xbf\xe0\xf2\xa9\x5a\xc5\x3c\x44\x70\x4e\x99\xa6\x45\x49\x7b\xb1\x73\x27\xd2\xd2\x8a\xc0\x9b\xe8\x10\xd1\x9e\x9b\xa7\xa7\xda\x4a\xd8\x7a\x0e\x95\x75\x64\x24\x21\x6c\x30\xd1\x3e\x3a\xc2\x3a\xb3\xbb\xdc\x38\xd8\x40\xa2\xb3\xd2\xd4\xdb\x9a\x73\x51\xde\xfd\x8d\xba\xac\x71\xf2\x6e\xfd\x78\x2b\xbb\xf5\x70\xdf\x15\x8e\x59\xd5\x47\x73\xfb\xdf\x19\xe9\x0d\x78\x53\x96\x4d\x6d\x67\xf0\xdf\x68\x3c\x62\xfa\x12\xb3\xce\xa3\xe1\xa4\xcc\x11\x53\x9c\x62\x8a\x3b\xa8\x5e\x9e\x39\x72\x6f\xfe\xa0\xa2\xc0\x7f\xcd\x48\xdd\x12\x7d\x29\x93\xd3\x77\x60\x02\xfd\xc4\x80\x8f\x1f\x93\xe8\xa3\x87\xcd\x6f\x39\x14\xc3\xa9\x5c\xf0\x9c\x29\x0f\x68\x4e\xfc\x5b\x7c\x65\x40\xf0\x08\x67\xb7\x4e\x86\x32\xee\x92\x6c\x35\x95\x9e\x7f\x58\x14\xb8\xbf\xdd\x86\x79\x07\x99\x72\x3f\xf7\x2b\x0a\x74\x87\xd5\x69\x50\x68\x38\xb6\xfe\x4b\xf6\x27\x1a\x36\x6e\x7e\x95\x01\x5a\x3d\x4b\x1f\xfd\x2b\xf4\x4d\xfd\xd4\xa6\xb3\x59\x0f\x7a\x56\x0c\xf8\x2f\xf3\xc3\x4a\xda\x9c\xc6\xed\x53\xd6\x1f\x3c\x2a\xef\xe9\x9d\xc2\x21\xa5\x37\x70\x89\x4d\xe3\x10\xfd\xaa\x20\xd6\xa9\x5f\xa5\x06\x52\x59\xa0\x7a\xb9\x42\xa2\x67\x15\x00\x83\xfa\x57\xa2\x3e\x4d\x4a\x0d\x5f\xc7\xff\x50\xa1\x9c\x39\xb1\xa6\x3f\xdd\x40\x41\x87\x11\x42\x44\xe9\x0d\x1a\x32\xb7\xb2\x91\x46\xde\x39\x5f\x75\x96\xe7\xde\x6e\xfb\xc1\x9d\x35\x97\x9a\x4b\xd3\x58\x19\xd6\xfb\xd3\xa8\x04\xa9\x51\x7e\x43\x65\xe3\x0a\x66\xa0\x3b\x62\x76\x0a\x7d\x98\x35\x84\x01\x56\x4c\xdf\x39\xf6\xd1\x98\xa3\xfc\x5f\x3d\x40\xc0\xd5\x62\x77\xec\xbd\x63\x64\x77\x06\xd1\xa9\x7b\xa6\xda\x75\x97\xda\x50\xf2\xab\x9e\xc1\xeb\xa6\x4e\x0d\x35\xcb\xb0\x4d\x01\x88\xee\xe9\xdd\x89\x14\xa8\x94\x89\xf8\xc8\xe5\x2b\xd7\x64\x48\xa7\x14\xf1\xe1\x12\xf8\xfe\xf6\xca\xdf\xd3\xe3\xe7\xe1\x1c\x8a\xb6\x9e\x7a\xd0\x38\xb0\x13\xc6\xca\x87\x83\xd5\x0d\x91\x4d\xee\x31\x54\x2a\xa9\xd9\x16\xbe\xc5\x1b\x6c\xb8\xf2\x76\xbf\xd9\x76\x25\xfa\x50\xb9\xf3\xdb\x2d\x65\x98\xde\xe2\x36\x9a\x60\x55\x83\xde\x69\x88\xac\x1e\xd9\xab\x9f\xbe\x14\x5b\x4c\x9e\xd4\x88\x71\x16\x8d\xdb\x79\xeb\x77\xe7\x4c\xfc\x3d\x77\xf6\xd6\xca\x7e\x5a\xd3\x15\x01\xbf\x84\x30\x0c\x1d\x0a\xbd\x04\x9d\x44\xbf\x7a\x75\xf1\x6a\xa1\xdf\xea\x47\x05\x26\x57\x3d\x18\x01\xf3\xe8\x04\x76\x63\xa5\x6a\xd1\x6c\xec\x26\x75\xd8\xf2\x96\x63\xd4\x15\x93\xe8\x77\x50\xea\x38\x75\xe5\xe6\x3d\x1c\x67\x48\xa1\x54\x2b\x4f\xe2\x00\xec\xfd\x78\x0a\x96\x8b\xa2\x66\xe0\xad\x9f\x9f\xf2\x83\xb1\x95\x75\x12\xa6\x52\xb0\xa2\xda\x6f\x67\xf9\x12\x92\xed\x5a\x22\x5e\xd1\x4d\xbc\xb3\x8b\x16\xde\x41\xd9\xc9\x7e\x1d\xf4\x71\xc0\x32\x3c\x94\x65\x3c\xd0\xf0\xab\x2f\x09\x33\x9b\xae\x8a\xcf\xbe\x4c\xd3\xa3\x37\xe8\xbf\x8d\x33\xc0\x98\x24\x56\x97\x33\xa9\x38\xb0\x6f\x8c\x7c\x52\x3d\x86\x0f\x8c\x15\x63\xa8\xfa\xa2\x6f\x98\x86\x1a\x02\x89\xbe\xff\x95\x7c\xbf\x57\x70\x09\x63\x91\xf5\xf1\xa3\xfb\x6b\xc8\x0c\x6a\xd7\x1b\x51\x6e\x04\xad\xdf\xd4\x4f\x7c\x65\x31\x5f\x56\xc0\x5c\x6c\xfa\x29\xd0\xa3\xaf\x92\x36\x72\x68\x37\x77\x16\x0f\xfa\xea\x29\x1b\x52\x1d\xc9\xbe\x75\x1f\xf1\xd1\x5f\xf1\x67\xb0\x08\x56\x07\x71\x4b\x66\x4d\x52\xd1\x62\x0d\xdb\xd2\xe5\x2d\xb2\x3d\x66\xb0\xc9\xf4\x61\x43\xd1\x6d\x35\x5b\x30\xc5\xa3\x87\xa8\xbf\x21\xc3\x98\xbf\x29\x3f\x20\x8a\x4b\x86\x7e\x2c\x6d\xa0\x93\x79\x8c\x5e\xa1\x1b\x79\xe7\x01\xeb\x03\xad\x21\xe5\x20\xbe\xb7\x45\xfe\x1b\x3e\x7f\xcb\x66\xe2\xf8\xdb\x95\x62\xb4\x8c\x55\x9c\xbf\xf4\xef\xe9\x23\x16\x72\x19\xb6\xd9\xdf\xc4\xd2\x5b\xba\x42\x53\xd7\x49\x2f\x9d\xc0\x8e\x30\xe2\x3d\x7f\x1c\xbe\x0f\x52\xb8\x5b\x69\x78\xe4\x97\x0f\x4e\x67\x2e\xd8\x19\x54\xdd\xb9\x3a\x41\xce\x11\xb7\x30\xdb\x28\xa3\x9c\x3d\xd6\xe3\xa0\xaf\xd8\xcf\x1e\x98\x29\x37\x67\xed\x6b\xe9\xb5\x32\x45\xcf\x71\x4a\x5e\x97\xe7\xdc\x91\x0f\x1a\xff\xf4\xb8\x57\xcf\x57\x94\x9f\xac\x7e\xbe\xfe\x2a\x85\xd8\xcc\x14\x1b\x25\xfa\x8f\x1d\x98\x5f\x37\x6a\xe0\x76\xdd\x44\x12\x3a\xcd\x1b\xe2\x2a\x96\x93\x03\xb6\x23\x8a\xba\x44\x62\xba\x3e\x23\x90\xd4\x21\x3a\x7c\x7b\x90\xec\x98\x4c\x3b\xeb\x01\x35\x8f\xb3\x94\x37\x91\xac\x49\xfe\x07\xff\xc1\x64\xff\x1d\x98\xf2\x38\x93\xe4\xed\x9b\x1a\x22\x92\xdf\x21\x84\x43\x3e\x73\xdc\x59\x66\xf2\x8d\x55\x2c\x58\x6c\xfe\xd7\x4a\x75\x96\xf7\x8a\x24\x94\x09\xed\xc4\x36\xc3\xdb\xec\x69\xec\xca\x4c\xa1\x0a\x72\x42\x5c\x22\xdf\xc1\xd4\xbf\xd9\x7a\xec\x5f\xa1\xb5\x85\xb1\xbf\x37\xa0\x53\xef\x24\xa6\xa9\xaf\x3e\xca\x53\x2a\x03\x47\x6e\x26\x50\x0c\xed\xf5\x83\x1d\xbc\xbc\x15\x70\x4d\x3a\xf5\x64\xeb\x95\xaa\x39\xb8\xed\x08\x4b\x5f\x8c\x9e\x80\x20\x3e\x72\x02\x2a\x45\x41\xa9\x38\x44\x9b\xc3\x4a\xad\x5e\x59\x79\xa0\xd7\xca\xa7\xda\x0d\x8a\x9f\x41\x26\x0a\x18\xa7\x27\x1b\x63\x65\x97\x8f\x3b\x7f\x4e\x00\x4f\x66\xd9\x79\xd3\xf0\xa3\x65\xf9\x27\x7f\xb4\xef\xfc\x19\x1f\xac\xc4\x7e\xb0\x4c\xc6\x83\xcd\xee\x1f\x37\x30\xdd\x92\x3a\x88\x2f\x27\x1e\x71\x23\x02\xe7\xf6\x3e\x7a\x9a\x9b\x8d\x64\x38\x46\xb3\x74\xbf\xc9\x8d\x28\xea\x7b\x1e\xfe\x58\x2c\x57\xfe\x99\x8a\x9d\xc3\x57\xd7\x74\x09\xf4\x39\xf5\xa3\xc3\x07\xa7\xef\x4c\xb5\x3b\x25\x0f\xa4\xa6\x67\xa8\xbc\x3f\xba\x4c\xd6\x7e\xe9\x1c\x7d\x2f\xd0\xec\x2a\xbd\x88\x09\x98\x7b\xf0\xef\x70\x22\x6b\x67\x50\xf6\x62\x22\x76\xf1\xa5\x9e\xfa\x41\xc7\x41\x12\x4a\x9b\x2f\xd0\xab\x57\x89\x2d\x1f\xcc\x49\x88\x77\x98\x75\xc8\x42\x9c\x33\x8a\xba\xa5\xe1\x1f\xf1\xa0\x81\x9d\xf8\x78\x59\x7d\xcb\x5c\x2e\xac\x9a\x36\xfb\xa0\x69\xbb\x9b\x98\xe2\x8d\x3c\x20\xf3\x36\x57\xfe\x51\x6e\x77\xdf\xea\xf1\xe5\x4b\x92\x8b\x52\x99\x7d\x7f\x79\x2b\x8b\xf7\x07\xa5\x97\x18\x40\x1d\x23\x5f\x0a\x90\xf3\xac\xfc\x2f\xc3\x1e\x04\x1b\x8d\xa1\x1f\x88\xc6\xe9\x32\x44\xf2\xe8\xf3\x5c\xdc\x1c\x0d\x8b\xa3\x73\xb7\x31\x52\x15\x34\xc1\x33\x49\x2d\xd1\x7e\x88\x46\xe7\x9f\x7b\x9f\xe9\xf8\x9e\x5e\xd8\x01\xed\x4f\x71\xf1\x36\xa2\xc5\x43\xee\x10\xba\xc3\xe6\xea\x12\x3a\xa8\x61\x8a\xa0\xcf\x32\x2a\x3f\x76\xcd\x16\x5d\xae\xf4\x20\x10\xf3\x74\x3e\x0e\x49\xc6\xa3\x77\x38\xbe\x78\x47\x5c\x36\x1c\x30\xce\x12\xcb\xed\x62\xeb\x99\x81\x57\x56\xc2\x46\x97\xcb\xdd\x16\x11\xf7\xf2\x96\xed\xc5\x5b\x86\xe7\xd4\xdb\xb1\x89\x36\xe1\x31\x87\x95\xd5\xee\x38\x11\x2a\x6c\x8c\x4f\xdd\xd6\xae\x7f\x7c\x3a\x91\xf5\xc0\xd7\xa0\xa7\x07\x9a\xa9\xee\x97\xdc\xa7\x53\xfd\x86\x3b\xd9\xb0\xfe\x8e\xe9\x3e\x1c\x6c\x34\xa7\xde\x68\x08\x5b\xf7\xaa\x3b\x0a\x9a\xd3\x3d\xc8\x83\xa3\x5d\x32\xee\xfd\x61\x66\xd4\x1d\xc2\x34\x7d\x4e\x10\xfd\x6b\x2c\xce\x15\x63\xe3\x30\xd3\xdf\x03\x8c\x78\x17\x94\x0c\xad\xe9\xbc\x83\x91\xb6\x51\x77\x47\x8f\xd6\x7f\x18\xab\xd9\x31\xf7\x38\xfb\x35\xf4\x03\xfc\xb4\x72\xf5\x85\x03\xd4\xaf\xdd\x21\x65\x99\xfc\x4a\x6b\x38\xf8\xf4\xd8\x0a\xdf\xa8\x86\x1c\x91\x27\xac\x16\x53\xbf\x96\xca\xd5\x4d\x0d\x34\x7b\x93\x8c\xf3\x7a\xf4\xf3\x6c\x99\x8c\xc6\x6f\xe5\x0a\x46\xdf\x10\x08\xf0\xe0\x95\xbb\x1f\x06\xc4\x01\xe8\xd1\xe1\xb5\xda\x9d\xef\x24\xfb\x0c\x9a\x24\xeb\x56\xa1\xab\x5b\xff\xf1\x79\xdf\x6d\x69\xff\x4e\x66\x7d\xf5\xba\x3d\x1b\xdf\x91\xff\x74\xbb\x78\xda\xed\xb2\xc2\x5e\x82\x00\x78\x13\xd1\xcf\x49\x5b\xd5\x42\xb9\x36\x77\x8f\xab\x54\xef\xb0\x5d\x3b\xfa\xa1\x7a\x4e\xd1\x42\xe2\x08\x52\x60\x02\x52\x10\xf5\x49\xa7\x58\x15\x18\x2b\x8b\x7f\x58\xeb\x59\x5a\x4a\xcd\x55\xfe\xc8\xb6\x6e\x90\x00\x85\x2f\x87\x91\x32\x5d\x95\xc5\xfd\x9b\x94\xf4\x8a\x98\x8e\xeb\xef\x6a\x2c\xfa\xe5\x45\x37\x8b\x2e\xb0\x9b\x38\x5d\xef\x26\x5e\x17\x36\x9c\xa5\x94\x7e\x3a\x56\xba\xb3\x6f\x02\xa2\xe5\xdd\x29\x8e\xc4\x72\x2a\x1d\x70\x4f\x7b\x8a\x51\xa1\xb0\x6e\x75\x7f\xcf\xb5\x75\x7f\x1d\xd4\x60\xcb\x34\xf3\xb9\x4a\x57\x55\x86\x9c\x17\x68\x49\xd5\xba\x40\x45\x2e\x7c\x18\x4b\x9d\x21\x10\x81\xd5\x06\x10\xe6\xec\x86\xee\xfa\xd9\x3c\x43\xa2\x29\xdc\x57\xa7\xe5\x71\x39\xab\x07\x73\xaa\x3f\x1a\x8e\x74\xb3\xc3\x74\x23\x3a\xce\xe4\x11\x7c\x8f\x5b\x3f\xaa\xcb\x7e\x3d\x04\x01\xd5\x84\x9f\x2b\x05\xa1\xf2\x0c\xf7\x38\x60\x39\xa2\x04\xdb\x60\x3a\x4e\xc0\x56\xfc\x08\xf0\x65\xfd\x4c\xff\x7b\x68\x15\xb2\xa9\xcb\x66\xb0\x68\x92\x60\xb2\xbd\xf2\xc7\xbc\x4c\xf3\x0f\xf9\xfe\x1f\x59\x4a\x18\x73\xa3\xb4\xb6\xb3\x9e\x8a\x9e\x33\x4c\xad\x9c\x7f\x86\x68\xdb\x3e\xac\xc2\xd1\xdc\x1e\xbe\x52\xca\x5b\x6e\x08\xda\x30\xb2\x12\x38\x8a\xc4\xee\x73\xfa\x62\x22\x3a\x73\xa0\x75\x9a\x67\x73\x12\xa7\x30\xb5\x70\xeb\xa4\xb3\x04\x53\xfb\x51\xf9\x48\x8d\x3d\xd5\x9a\x30\x49\x6c\x36\x07\x9f\x96\x01\xdc\x79\xc4\x26\x8c\x1b\x84\xe4\xb8\x1f\x0b\xb1\xc8\x71\x51\x0c\x51\x84\x55\x7e\x61\x5c\x4e\xb0\xb9\x4a\x22\xfd\x37\xe5\xb7\xb2\x8e\x34\x37\x2c\x2e\x9a\x2c\xac\xab\xec\xd5\x59\x74\x97\xf3\xf2\xd4\x4d\xef\x43\xc7\x8a\x31\xd8\x28\x4b\x86\xd5\x8c\xbb\x3a\xfd\x0d\xeb\x57\xed\xe2\xc1\x49\x64\xbf\x9e\x07\x58\x0d\xdc\x46\x46\x88\x48\x7c\x01\x32\x6b\xe3\x30\x7d\xe0\x94\xa6\x16\xb2\x2f\x1a\xd0\x10\x27\x8b\x35\x9a\xb4\xf2\x8d\x40\x7c\x91\xbd\xe2\x80\x8e\x68\x9d\xea\x54\xd5\xab\xcf\x29\xd1\xe7\xb1\x21\xab\x2f\xc8\x8a\x77\x4f\xd4\x4d\x6a\x78\x99\xa4\xf7\x13\xad\x4b\xf7\xb1\x6b\x3f\xba\xd3\x81\x56\x20\x34\xa6\xa5\x28\xe0\x63\xca\xce\xbf\x26\x0c\x62\x33\x70\x4e\xbe\x7f\x7d\xa4\x49\xba\x55\x64\xb0\xba\x25\x5d\x7e\xa6\x72\x21\x6a\xcc\xd4\x08\x36\x77\x95\xb3\xa4\x1e\xf8\xca\xc2\x56\x32\xdf\xb4\x94\x2d\x27\xfb\xcb\x0b\xb8\x0f\xd1\x2d\x9e\x5a\x67\x81\x81\xab\xd8\xda\xd9\x1a\x8e\xd1\x21\x63\x45\x96\xd2\xf1\x6d\x20\x8d\x6e\xa7\xd3\x67\x53\xc3\x7a\x48\x49\x4a\x8e\x4f\x62\x8e\xd2\x0d\xde\xd1\x50\x0b\xde\x68\xce\xb5\xf3\xc6\xec\xa6\x4f\x29\x38\x6f\x72\xe8\x2a\xd5\x80\xe7\x08\x68\x5c\xc3\x9b\xf4\x53\xb6\x36\xec\x22\xbe\xcf\xae\x93\x97\xf4\x95\xb0\xfa\xce\xf6\x2c\x66\x54\x98\x9d\xac\xdf\xb5\x0b\xf5\xbe\x1e\x08\x7f\x74\x3e\xb9\x8f\x93\x1e\xd1\x9a\xf4\x12\x82\x44\xf6\xe3\x8e\x72\xdc\x02\x86\xd9\x44\xee\x84\xed\x97\x02\x9e\x94\x05\x7d\x5c\x9d\x68\xc9\x65\x39\xc9\xbe\x10\xd9\x61\xf3\xae\x8c\xaf\x91\xeb\xe4\x2b\x97\x42\xdb\xce\xd6\x57\xff\xa5\x7c\x9f\x51\x1e\xd1\x75\xc7\xd3\xce\xcb\x41\xf7\xa6\x3b\x0e\x63\xd8\x4e\xc0\x03\x27\x8c\xde\x99\x44\x5c\x59\xe3\x2f\x63\x51\xb0\x75\x8c\x66\xf6\xd8\x89\x7b\xf4\x4a\x6d\x99\x4f\xdd\x7c\x66\xb4\x11\x97\x5d\xb4\xb6\x69\x22\x7d\x2e\xaf\x7e\x54\x9b\x7a\xca\x2f\x77\xa4\x2f\x23\x46\xe4\x3e\x5d\xfb\x87\xb2\xbb\xe4\xc9\xa9\x83\xe7\xe6\xda\xea\xf8\xd0\x8b\x92\x2d\x6a\x35\x71\xdf\xf2\x16\xc3\x0e\x4f\x1e\xd5\x30\x04\x62\x29\x79\xec\xad\xb4\xb6\x50\xc0\x3a\xf0\xa9\x5c\x03\x7a\x9d\xe0\x47\x46\x17\x5b\xfe\xd8\x59\x3e\x63\xc9\x0d\xca\x23\x0c\x47\x0f\x9a\x1f\x93\xf7\x18\x0a\x80\x23\xaf\xf6\x2c\x86\xf1\x9d\x3b\xe9\x39\xd2\xda\x0e\x6b\x65\x8e\xb1\xb3\xd1\x58\x5f\xa3\x91\xcb\x24\xa0\x5d\xab\xa2\x8b\x75\x1f\x6b\x11\x42\x21\x57\x20\x71\x4c\xc3\x47\xe2\xf6\x55\xa3\xc1\xd3\x05\xf6\xac\xba\x8a\x11\x20\xe1\xb8\x89\x23\x0d\xd4\x3e\x96\xe1\xfe\xb7\x46\x10\x01\x59\x99\x6e\x84\xbe\x8d\x71\xed\x67\xd8\x48\x95\x12\x2b\x5c\xc7\x44\x61\xdb\xcb\xb6\xd4\x59\x52\x73\xb5\x2e\xde\x4f\x37\xb6\x1d\x31\x07\x26\xe6\x41\x03\xab\xaa\xea\x3d\x6b\x19\x1b\xad\x6b\x76\x46\x8f\x7e\x9d\x79\xc6\x52\xa5\x1b\x9d\x5b\x06\x45\x5d\x59\x1a\x08\xa9\x53\xf3\x97\xc6\xde\xb3\xbc\x2b\x60\x68\xa2\x9f\x79\xcf\x91\xe4\xb5\x33\xaa\xc6\x1a\x5b\x71\x71\xeb\x7b\x84\x64\xd5\xfa\xe4\xd9\x05\x14\x7a\xd2\xfe\xe8\x33\xa5\xe8\x6c\x4a\xeb\x35\x05\xc3\xfa\x0d\x3d\x3f\x55\x72\xfc\x2c\x2b\x83\x58\x9a\x47\x4c\x54\x90\x74\xd9\x28\x1b\x74\x17\xfd\x6a\x74\xf1\x76\x1b\x7d\x44\xb0\xa1\x58\x3f\x65\x6c\x75\xee\x19\x2e\x3b\x68\x5a\x2f\x8e\x1c\xdf\x1f\x59\x1a\xb8\xfd\xc1\xff\x38\xaa\x09\x07\x1c\x9a\xfb\x59\xb6\x51\xfd\x5d\x23\x74\x9c\x35\x0a\xda\x16\x32\x5a\x75\xbb\xbd\x2a\xc3\x14\x4e\xbd\xe2\xf1\xc2\x52\x2a\x3e\x5a\x5b\xbf\xbb\x16\xfb\x5c\x3e\xab\x75\xa4\x97\x75\xbe\xa6\x54\x2b\xe9\x4a\x5f\x57\x3a\xfb\x2d\x08\x4a\xb0\xbc\xd8\x8d\xfa\xef\xd8\x39\x38\x7b\xd9\x8f\xdc\x3a\xef\x3a\xcb\xb0\x6c\xb7\x1e\xce\x7e\xa7\xc1\x19\xf7\x0c\xf0\xd8\x1b\x83\x5c\x4a\x1a\x0c\xfb\x74\xdd\xcd\x0e\x67\x7a\x53\xa5\x70\x8c\xfc\xac\xb7\x3d\x90\xcb\xf6\xef\xf0\x6b\x6f\x41\x05\x64\x5e\x73\xb4\xc7\xa7\xbb\x0c\xbd\x18\x15\x13\xfe\xe3\xc1\xf4\xa2\xd2\xaf\x52\x51\xfb\x4a\x1d\x25\x15\xf5\x52\x4e\x94\x3b\xf2\x52\x55\xbf\x5f\x8b\x20\x2d\xc0\xbe\x1a\xe7\x79\xed\xc3\x25\x8d\x5c\x62\x8f\x86\x7c\x8c\x61\xa5\x26\x65\xb1\xc6\x12\x13\x1f\xee\xae\x43\xb1\x2f\x9a\x07\xca\x93\x39\x44\xc4\x15\x56\x42\x83\x80\xe7\x2e\x58\xab\x74\x3a\xdd\x7d\x30\x94\x3a\xb3\xf6\xc8\x23\x38\x6b\xeb\x6b\x10\xd5\x96\xde\x0f\x7f\x74\x80\xc2\x68\xe2\xba\x19\x8e\xa6\x47\x92\x6a\x38\x82\x3f\xd7\x33\xca\x59\x78\xa8\x9d\xaa\xdc\xca\x10\xf4\xb0\xb0\x04\x5e\x25\xc6\x5c\xcf\x46\x8d\x63\x36\xc7\x2f\x1f\x0b\x70\xde\xec\x58\xa6\x76\x2c\x16\xae\x3a\x88\xc6\x33\x93\xbe\xdc\x0c\x82\xaf\x9a\x04\x3f\x3a\xa0\x4d\x61\x65\xb6\x4e\x22\xc3\xda\x71\x38\x48\xad\x9b\x1a\xd2\xe3\xee\xee\x7b\x4e\x81\x13\x82\xcf\xea\x46\xb0\xc8\x0c\xbe\x5b\x72\xc9\xc0\xae\x7c\xe8\x4f\x5d\xf6\xb8\xd6\x14\xbb\x39\xad\xa7\x2f\x47\xae\x94\x1d\x07\x2e\x45\x12\xf5\x30\x7c\xdc\x6c\xfe\xc0\x47\xbd\xd7\x30\x8b\x29\x0e\x8c\x9d\x96\xe4\x21\x63\xf6\xee\x02\x2a\xc8\x40\x0f\x12\x35\x8a\xe5\xa6\x47\x9e\x82\x67\x7f\x74\xa9\x1f\x89\x5d\x33\x0c\xef\x53\x84\x2f\xe4\x6d\x80\x43\xac\x89\xad\x33\x43\x4f\xf3\x0f\xcd\xd1\x15\x1c\x66\x7f\xb6\xae\xd3\xac\x6f\x4f\x35\x3d\xf7\xdf\x43\x5e\x99\xf9\x5f\xd9\x0f\x8d\x62\xa0\xe6\xe0\x0e\x2d\xd9\x61\x3c\x26\xb5\xb2\x2d\x3d\xd6\x38\x22\x92\x5a\x49\x3e\xbb\x39\xb4\x5a\x3d\x6a\xf4\xdd\xad\x80\x3e\xcb\xd7\x12\x5f\x2b\xbc\x33\xca\x6e\x20\x0c\xd9\xfa\x8d\x73\x19\x5a\xdb\xd5\x88\x60\x49\xaf\x71\xb8\xf4\x96\x0b\x74\xec\x3e\x55\x17\x6d\xca\x96\x04\xce\x34\xdb\x60\x30\x0c\xd3\x93\x16\xe4\x37\xb2\xeb\xbf\x40\x64\xc9\x6e\x70\xa9\xdc\xd8\xc9\x99\xcb\x2c\x91\x1d\x1c\x3a\x9f\x53\x6c\xa4\x69\x74\x87\xad\x81\xd9\xb3\x4a\xd2\x92\xed\xdb\x3d\x96\xaa\x99\x61\x10\x1c\x2c\x4c\x3a\x8b\xc6\x73\x56\x50\x20\xf3\xb0\x63\x72\x28\x07\xdb\x57\x64\xda\x2e\x03\x19\x8e\xe1\x46\x28\xc9\x36\x5d\xe0\xf5\xd4\xa5\xd4\xd5\x76\x84\x9b\xc6\xf0\x89\x8f\xa4\xb5\x5d\x07\x7d\x6c\x33\x67\x82\x73\xd5\x9a\x6d\x06\x43\x6d\x52\xe6\xd0\x4d\xec\xdb\xf2\x5e\xcb\xc9\x66\xf1\xb8\xe2\x0b\xa9\xee\xe6\x31\x3e\xcf\x52\x09\xb5\x07\x1b\x08\xbd\x0f\xca\x4f\x9d\x44\xb9\xa5\xc3\x28\xf9\xa4\x33\x1c\x69\xc4\xa8\xdd\x3e\x7a\x5c\x99\x9e\xfd\xf4\x32\x39\xb5\xca\xf0\xfe\xf1\xe6\x01\x16\xed\xca\xe4\xc2\xa8\x0d\x12\x6d\x79\x3f\xb3\x5c\xeb\xdf\x4e\x5e\xcb\xfa\xcd\x85\x5a\xe9\xbd\xa1\x97\xb4\xc4\x40\xeb\xdc\x84\x1e\xec\x32\xf7\x1f\x27\xbb\xcd\xfd\xf4\x65\x49\x47\xe7\xfa\x3e\x60\x74\xd0\xd5\xd5\x00\xef\xd3\xaa\xee\xf6\x6f\x9c\x32\x53\x3a\xa2\x0d\xae\xa0\x07\x88\xee\xd6\x6c\x5e\x2d\xa5\xbf\xdc\xee\x4d\xa9\xf9\xa0\x87\x8b\xef\x0c\xa6\x2e\x9e\xc3\x63\xbd\x7c\xf6\x83\x6f\xd4\x27\x7b\x26\x88\x82\xb8\x76\xfc\x04\x3e\xf0\x73\x76\xf8\x21\x7e\xb2\x4e\x9c\x9f\xbe\x6c\x11\xed\xe8\x8b\xd6\xb6\x33\x39\xca\xec\xc3\xfe\xae\xa4\xe5\x37\xf7\xac\x97\xe8\x46\xef\xe7\x57\x32\x9c\xa8\x66\xe3\xd7\xb4\x34\x2e\x5c\x7d\x3c\x0e\x5d\x2a\x05\x82\xb3\x3e\x14\xda\xdc\x7a\xf6\x1d\x04\xeb\x6a\xb2\x8f\x8e\xb3\xdb\x5a\x38\x9a\x42\x4d\x39\xc2\x3f\xa9\xdf\xcd\x02\x86\xbc\x35\x34\x5b\x0c\x12\xdf\xaf\x94\x33\x1c\xcb\x70\x1b\x1e\x24\xc4\x80\xd1\xc9\xae\xad\x8f\xb1\x7c\x9b\x0b\xf7\xd3\x8f\xcf\xba\x38\x42\xb8\x0c\xcd\xd3\xe5\x0f\xcc\xb6\xb5\x5a\xd4\xe0\x24\x44\xff\xad\x1c\xa1\x17\xa0\x37\xfb\x70\xa8\x08\x8c\x4c\x6a\xeb\x7a\xae\xf9\xfb\x60\x10\x84\xcc\x5a\x63\xcd\x98\x8f\x71\x2b\xfb\x91\x72\x79\x4f\x7e\xd8\xa0\x18\x36\xfd\x73\x65\xf6\x16\xa3\x12\x96\x76\xee\x42\xc3\xc9\x8e\x33\x86\x4f\x83\xa0\x0a\x96\x43\xd6\x09\xf8\x3c\x65\x66\x4b\x73\x6d\x4c\x9b\x82\xfb\x79\x78\xae\x40\x47\x3a\x9a\xd5\x69\x91\x5e\x98\xcd\x68\x34\xaf\xf8\x60\x80\x41\xce\x44\xcf\xea\x48\x0c\x48\xf1\xe0\xbf\x3a\x31\xb9\xff\xa3\x61\x2b\xba\xfe\x30\x65\x39\x1d\x0d\x63\xde\xb8\xfb\xc1\x65\x35\xba\xb5\x3e\xf4\xf6\x4c\x02\x6d\xe4\xa0\x63\xd2\x90\x6c\x62\x31\x04\x97\x63\x08\x06\xf2\x7d\xe3\x5c\x11\x81\xe9\x6e\xda\xc3\x02\x0f\xaa\xc3\x67\x68\xc5\xab\xf8\xe9\x9e\x7f\x0d\xec\xdc\xc9\xa4\xab\xc2\xf3\xec\x70\x51\x90\x7d\x0f\xc9\x81\x80\xc3\x1b\xfa\xbf\xe7\x89\x56\x8e\x37\x3a\xe5\xe5\xad\x76\x35\xee\x91\xf8\x7c\x9f\x42\xfe\x7a\x07\x61\xd1\x3d\xe8\x89\xe4\x5e\x8d\xb4\x4f\xbf\x43\xcb\xef\x86\xf4\xd6\xdf\x0d\xfb\xdf\xd5\xf7\xe5\xb0\x0a\xcb\x3f\x3a\x6a\xb5\x9d\xb9\x63\x91\x18\x4e\x09\xcb\xa7\xc9\x5e\x22\xf7\xcb\x46\xbc\x0c\xc3\x3d\xef\xd7\xfe\xcc\xea\x1d\xff\xd6\x8e\x33\x01\x68\x11\x8a\xed\x1a\xe7\x8e\x74\x74\xaa\x5b\x53\xe7\xb0\x2d\xa4\xef\xd6\x20\x85\x07\x36\x27\xbc\xe2\xfb\x52\xce\xc6\x96\xbf\x17\x06\xab\x66\x35\xe2\x06\x82\x6a\xbc\xc9\xb8\xa2\xcc\x77\xa7\xee\xea\x67\x19\xf2\xad\xd2\x35\x4a\xaa\x8e\x01\x30\x2d\xbe\x94\x43\xfc\xf4\x5a\xda\x6d\x44\x86\xbb\xde\x90\xd5\x94\x7d\x6d\xbc\x77\x7e\xd1\xb2\xf1\x0a\xc6\xb1\xd4\xde\xe7\x1c\xea\x00\x24\xc8\xcd\x31\xcc\xd5\x76\x13\xe6\x7e\x7d\xcd\xfb\x83\x87\x56\x97\x5d\x52\x60\x60\xd1\x7a\x7b\x98\x3c\x8d\x4e\x34\x5a\x6a\x35\xc0\x60\xfd\xea\x51\xaf\xe7\x51\xe9\xc7\x92\x14\xf9\x29\x5d\x72\xbc\x5f\xf9\xfd\xd6\x29\x38\xc5\x65\x81\xed\xa2\x29\x8d\x30\x06\x0d\x19\x8a\x6f\x6f\xbf\xa3\x82\x79\x04\x47\xb6\xaf\x70\xbf\xd1\x1d\xe6\x7b\x64\xd9\x81\x5e\x3c\x57\x4b\x29\x51\x8c\xd5\x69\x7e\x2f\xb5\xe5\xec\x10\x3f\x5c\x11\x2f\x36\x17\xca\x3b\xf3\x59\xd7\x4a\x19\xd9\x02\x97\xea\x4c\xce\xdd\x2c\xaa\x77\x9c\xfc\x2f\x87\xa5\x46\x73\xe3\x78\x8b\x56\x73\xbf\x8a\xae\x5c\x7f\x10\x84\xfd\xf5\xba\x7d\x9b\x57\xfc\xea\x2b\x1b\x79\x9d\x42\x45\x6e\x49\x2b\x79\xc9\x60\xd7\x74\xb5\x25\xbd\xd5\xed\x5a\x39\x78\xce\x29\xc2\x00\x68\x43\x1d\x1e\x73\x6d\xce\x47\x64\x29\xe4\x35\x5a\xd5\xca\xda\x89\xe6\xf3\x95\xdd\x2c\x6e\xf3\xfa\xc5\x6c\x3e\xe7\x10\xbc\x73\xe5\xf9\x4f\xda\xfd\xe6\xee\xf6\xfe\xe5\x43\xc8\x83\x78\xe1\x72\x8e\x46\x6f\x7c\x60\x0c\xac\x85\xe5\xe8\x66\x83\x2c\xe2\x96\xbb\x0e\x3d\x82\x29\xe3\x1e\x63\x8b\xa8\x2f\x76\x80\x7d\x00\x70\x98\xa6\x5b\xf4\xc2\xe3\x31\x7d\xa5\xfe\x58\x68\xaf\x3f\x4c\xd3\xe8\xd4\x7c\x58\x5d\xee\x75\x74\x23\x73\x9a\x53\x44\xb9\xcd\x62\x1c\xb4\x20\x2c\x04\x69\x19\xe3\x11\x27\xd2\xae\x23\x65\x85\xb2\x55\xee\xdf\x07\x6c\x48\x7f\xaa\x11\x89\xa6\xda\x69\xa1\xb0\x50\x0e\x44\xa9\xdf\x6a\xf3\x3b\x18\xd4\x6e\x6f\x97\xeb\x5d\x1f\x27\x1d\xfb\xd3\xe1\x22\xad\xae\x78\xda\x25\xae\xd8\x3c\xf9\x01\x69\xf2\xb9\x97\x82\x81\xd6\x3a\x1d\x15\x3a\xff\xc8\xe3\xdf\xe8\xdd\xe5\x9d\x34\x0e\xaf\x70\xc4\x6e\x54\xab\x7d\xb3\xf1\xe2\x0a\x8b\x3e\xcb\xfc\x57\x5a\x74\x87\x2b\x40\x52\x83\xa9\x81\xa0\x92\x8e\x87\x27\xac\xd3\xd5\xfc\x3e\x1d\x85\x5d\x0a\xcf\x10\xc8\x9f\x6e\xaa\x93\x08\xaa\x07\xd9\x51\x91\x49\x74\xb7\x2f\x17\x00\xde\x0b\x02\x77\xaf\x41\xfb\x84\x29\xb3\x38\xdc\x8a\x5a\x84\x89\xe3\xc7\x03\x75\xc1\xc1\xc6\x05\xdb\xff\x14\x12\x0d\x62\x77\xea\xc4\x04\x4f\xd1\xf4\x6c\xa4\xa2\xbc\xd1\x12\x60\xd0\x64\xda\xe4\xa9\xbc\xd7\xd7\x48\xc1\xfe\x54\x36\x2d\x8a\x8a\x80\x4d\xc0\x5c\xf9\x09\x71\xe4\x61\xb7\x47\xea\x34\x3d\x22\xd5\xf7\x68\x62\x93\xc9\xf6\x3d\xb3\xc3\x6f\xff\x67\xbb\x48\xbf\x0a\x8a\x3c\x6d\x4a\x1b\xb8\x4b\x54\x77\x03\x24\x45\x0f\x5e\xa6\xcb\x06\x75\x3c\x44\xd3\x83\xbb\x00\xef\x4a\xe1\xb7\xd5\xf8\xb7\xb4\x89\x40\xbd\xd3\x91\x90\x69\x79\x46\x2f\x19\xcb\x98\x9b\xfb\x8d\x6f\xd4\xc8\x4b\x60\x14\x89\x40\x5e\x46\x4a\xbf\x51\xe8\x22\xd2\x98\x35\x33\x27\x9a\xf4\xe6\x39\xf2\x17\x69\x30\x60\xba\x34\xb8\x79\xe6\x59\x6f\x65\xb9\x11\xc6\x08\xab\x81\xa1\xef\x84\xb8\xa0\x10\x3d\xb2\x3e\x02\xe3\xbd\xf8\x8f\x2d\x9f\xf2\xee\xc8\xe3\x2e\x95\xc4\x27\x7a\xe7\x4b\x3f\x3b\x08\x52\x1e\x01\x4b\x1a\x44\x05\x57\xcf\x26\x4d\x83\xc5\xd9\xe2\x7c\xd7\x91\xf3\x25\x47\x43\x02\xe3\x5c\x4b\x40\x03\xb4\xe9\xc1\x05\xc8\x66\x94\x6a\xf9\x77\x61\x24\x0b\xfa\xb7\x7c\x0a\x20\xc7\x94\x0f\x6c\x4a\xb0\xfb\xd3\x80\xfb\xb3\x3f\x55\xbb\x9f\x3c\x20\xd9\xf8\xc6\x56\x3d\xef\x71\xa0\x86\x3a\xe3\xdb\x18\x28\x0b\x86\x61\x34\x90\x25\xac\x87\x3b\x89\xe7\x99\x52\x6b\x07\x45\x7c\x34\xd3\x02\x1a\x4d\x3e\xea\x91\xf3\x1a\xbd\xfb\xb1\xfa\x5a\xca\x68\x0f\xdd\xfc\x2b\x56\x92\xd4\x72\xb3\xc8\xd3\x9f\x98\xe6\x69\x57\x62\xc7\xa8\xc6\xf6\x4b\x8c\x97\xd7\xb8\x29\x15\xf4\xa5\x3e\xd8\xcb\x65\xd5\x8b\xe9\x3f\x11\x3b\x69\x8f\x13\x0a\xd4\x1a\x19\x28\xf0\x3b\xe2\x2b\xa0\x29\x11\x9e\x97\xe5\xaa\xd2\xe9\xf9\x4a\xe4\x33\x68\xd8\x56\x9f\xe2\xb3\xac\x87\x6c\xb0\xaf\x91\x1c\x75\xa2\x25\x23\x5b\x4b\x27\x88\xb8\xbb\x0e\xd2\x5a\xe7\x4d\xe1\xb9\xa0\xcd\x55\x2e\x83\x38\xec\xd0\x56\x79\x7e\xd1\xc8\x01\x0f\xdf\xc4\x10\x97\x91\x73\xd9\x70\x96\x53\x6b\x11\x47\x93\x2e\xe6\x6c\x8e\x33\x1c\x37\x48\xdf\xb0\xee\x4b\x37\x37\xd7\x3f\x13\xde\x73\x3d\x5c\x23\x29\xe5\xc8\x1f\x77\xd8\xdf\x4b\xcd\xf1\x40\xbf\x84\xb7\xee\xa5\xcb\x71\xc0\xf6\x9a\x8f\x8f\x7d\xd6\x11\x4e\x49\xcb\x84\x4c\x43\xe7\xe3\xa1\xa8\xca\x87\xaa\xaa\x5b\xf5\xbe\xdc\x39\x2c\x05\xfe\xe6\x56\x7c\x7a\x9b\xff\x5d\x79\xe3\x65\x45\xe3\x9f\x80\x8c\x23\x71\xf5\xe6\x36\x3c\x2e\xbd\xa8\x70\x8e\x74\xfe\x63\x13\xf6\x28\x53\xf8\xad\x76\xe5\xdd\x77\x37\x33\xf1\x80\x45\xfa\x16\x1d\xfa\xfb\x5d\xe2\x85\x43\xab\xd7\x11\xb6\x59\x7b\x59\x1d\xd0\xba\xe6\x90\xae\xcd\x5c\x62\x14\x08\xa2\x41\x99\x73\x0e\x77\x10\xf6\x77\xa2\xe1\x71\xb9\x95\xfb\x01\x6c\x14\xa2\x1f\x54\xb6\x64\xf7\x2f\xe3\x84\x77\x0e\xa3\x04\x78\xf2\xeb\xee\x59\x91\x9d\x80\x00\x4c\x65\x03\x53\xfd\x9c\x22\x34\x44\xd9\xab\x7a\x6c\xb3\xe6\x5e\x15\xe0\x7e\xd0\x46\x8c\x23\x89\xca\x77\x70\x28\xcb\x1a\x21\x98\xb7\x6c\x5f\xde\x6e\xf6\xf7\xeb\xea\x74\x90\x1e\x0d\xb1\xf0\xe8\x3c\x22\xd4\x11\x7c\xe3\xca\x3e\xa0\xc3\x85\x5a\xc1\xe8\x01\x71\xb0\x8e\xad\xb2\x20\x30\xe2\x4d\xa4\x01\xee\x19\xd5\xa0\x1a\xdd\x65\xa8\xe7\x41\xbf\xab\xcf\x96\x43\x8e\xbf\x2f\x24\x0a\x95\xc5\xd4\x35\xe6\xbe\x5c\x19\x6f\xbb\x1a\x42\x3e\x80\x2b\x38\x6f\xe3\xab\x9a\x52\xd8\x84\x5f\xb2\x1e\x74\xf9\x6b\xb0\xc7\xc8\x6d\x8e\xde\xfd\x48\xd9\xb1\x47\xa6\x11\xed\xe6\x5d\x95\x8f\x6b\x87\xcf\x0e\xfa\xd5\x37\x87\xa1\x51\xd8\x1f\xe7\x12\xa6\x0e\x5b\x45\x58\xca\xa3\x9a\xf1\x4f\x23\x13\x19\xca\x28\xc7\x6c\x56\xde\x18\x7e\xb6\x80\x06\x70\x42\x20\x0e\xa2\x66\x83\x46\xa3\x7b\x67\x7b\xb5\xef\xd5\xfd\x60\x07\x3b\xc2\x48\x7a\x65\xa3\xef\x7d\xe5\x77\xec\x2d\x5b\xc0\x88\x9e\xd2\xd1\xdc\x28\xeb\x9e\x5d\xd9\x26\x90\x82\xde\x6e\xa4\xb0\x71\xea\x36\x73\xe6\xcb\x8e\xa4\xec\xfd\xfd\x90\xa4\xcc\xd3\xd6\xa7\x65\x3a\xdb\x80\x0e\xbe\x4c\x03\xe9\x05\x6a\x3a\x7d\xd7\x45\xff\xbc\xec\x07\xbd\x90\x60\xb8\xb9\x18\xdf\x90\x01\xe8\x07\x88\x83\xe7\xa0\xd1\xd3\x41\x01\xdb\xfe\x12\x51\xde\xdc\xf7\xd9\xcb\xf5\x86\x22\xc4\xd8\xc1\xa3\xe7\x4c\x8d\x24\x8f\xb0\xa1\xd8\xc3\x85\x0b\xdd\xfd\xe5\xb8\xc6\x5c\x18\xc5\x61\x47\x2b\x39\x87\x81\xc5\xa3\x9e\x12\x18\xb3\x7f\x52\xc1\x83\x01\x42\xee\xda\x8e\x1f\xc6\x6a\x03\x18\xa6\x9f\x7a\x58\x6f\x72\xdf\x76\x31\xe2\x5b\x9c\xb8\x6d\xfd\xe7\x9b\x51\xfa\x33\x52\xdc\xb3\x99\xec\x6b\x50\xdb\xa7\xf5\x11\x4d\x7c\x86\x8f\x6a\x1c\x1a\xa1\xcd\x57\x61\xb9\x84\x42\x30\xb7\x7e\x26\xfa\x9a\xad\x60\x2e\xab\xbf\x0f\x9a\xe4\x4b\x4d\xff\xe0\x35\xab\x97\x4f\x5f\x35\xb6\xf6\xcb\xd7\x6f\xd7\x89\x1c\xa1\x6b\x1e\xda\xff\xc1\xbd\xfe\xca\x75\x47\x07\xe9\xcb\x6a\x74\xa8\x16\x9c\x20\xb5\xeb\xc6\x91\x16\x80\xf8\xdc\x4c\x06\x95\x3d\xee\x54\x7a\x69\xb0\xd3\x3f\xa3\x20\x01\x14\xfa\x3c\x67\x4c\x48\xdf\x2b\x39\x6a\xcd\x33\x26\x65\x97\xfb\x6b\x9e\x06\xd9\x04\xac\x13\xa6\xb4\x78\xa5\xa9\x02\x57\x18\xd6\x3b\x11\xfe\xe0\x8e\x3d\x7a\x85\xfa\xa8\xe5\x2a\xff\xe7\x01\x39\x48\xeb\x23\x1f\x4a\xda\xae\xb9\xa9\xe3\x14\xc1\x08\x38\x44\x8c\x2d\x3f\xaf\x04\x25\x91\xd4\x22\xb8\x61\xd7\x78\x25\x76\xe0\xaf\xa9\xdf\x6c\x74\x3a\xe2\x35\x93\x9f\x8b\x10\x0b\xbd\x1e\x0d\x50\xb3\x86\x91\xbc\xda\xdb\x63\xa3\xb7\x1f\x47\x37\x0e\xea\x39\xac\x65\x95\xb5\x6d\x47\xd9\x4d\x23\x7f\x92\x4c\xfa\xb2\x07\x5c\x8c\x6e\x01\x63\x90\xb9\xc0\x9a\x7e\x94\x99\xb3\x26\x77\xbf\xe1\x66\x7c\xd7\xd2\x59\x96\x5a\x4c\x35\xd5\x7e\xc3\xe0\xc1\x79\xc0\x8f\xd8\xee\x1a\x2b\x7c\x71\xf0\xe6\xf3\x53\x2f\x44\x2b\x09\x2c\xec\x36\xc9\x38\x8f\x3d\xf3\x36\x45\x52\xcb\x69\xf3\x0c\x73\xdf\x49\x7d\xe4\x66\x4e\x43\x61\x08\xf4\x5c\x00\x4e\xa6\x0b\x67\x81\xbb\x27\x6f\xa1\x88\xd6\x2b\x97\x75\xfb\xa3\x5b\xc1\x16\xa3\x94\x75\xf0\xd9\x20\x29\x92\xe3\x17\xda\xa4\xb2\x6e\x05\x01\x7b\x33\x26\x11\x19\xb3\x08\x7c\x7d\x1b\xb5\x18\x4a\x29\xd0\xeb\x91\xed\xe6\x4a\x6f\xe9\x1b\x79\x5d\x07\x46\xa1\xf7\x5c\x49\xf8\xa3\xd0\x89\x52\x45\x2b\x4d\x67\xfe\x4c\xf6\x7e\x75\xa7\x9d\xd7\x94\x3a\x52\xf0\xdc\x7d\x5d\x30\x87\xb3\x64\x38\xa2\xc1\xdf\xf8\x67\x54\x22\x62\xfc\x71\x30\xaf\x72\x7a\xdd\x15\x12\x12\x98\x03\x55\xc7\xeb\xc5\xa6\x5f\xc6\xe8\x08\xcc\xe3\xf3\xa9\xac\x99\xf2\x21\x71\x02\xe9\x1f\x83\x65\x6a\xd9\x7e\xcc\xfa\x4b\xc3\xcc\xaf\x99\x4a\x74\x0c\x40\x35\xe2\x5f\xb0\x08\xce\x35\xce\x26\xed\x42\x4d\xd2\xc6\x52\xee\x76\x39\xc4\xda\xee\x35\x3d\x93\x30\x81\x2e\x0d\x09\x93\x3d\x0e\xfe\x11\xd4\x98\xce\x3f\x19\xd5\x83\xf9\x6c\x9e\x3c\xbc\x23\x36\xfb\x2f\x94\xca\xfc\xc5\xdf\x05\xe9\xb6\x68\x42\xee\x1c\xc7\xb5\xf8\x9f\x4c\x0b\x39\x68\xf0\xca\x29\x8f\xa3\xd7\xec\xd4\xc3\x7d\xc5\x10\xc0\x5d\x7f\x49\x91\x65\x3a\xa5\x4f\xcc\xf4\xe0\xc2\x77\x86\x03\x66\xb5\x64\x9e\xa7\xc0\xa2\xe7\x52\x4d\xb6\x9e\x4a\x01\x7b\x8e\x8d\xb6\x2e\x65\x5b\xbc\xf2\xa6\x5c\xf1\xa6\xb2\x97\xf5\x5d\x96\x80\x3f\xd9\x1e\xb2\xe5\x2b\xe1\xcd\x24\x33\xb0\x9f\x6c\xa4\x00\xf1\x8b\x2f\x8f\xca\xf7\x96\xca\x42\xc7\xab\x1c\x4e\xb2\xd8\x38\x47\x83\x1e\x7e\xb1\xfd\xf2\xdd\xe4\xd7\x6c\x00\xd0\xe6\x75\x41\x02\xf4\xec\x88\xa4\x5c\x39\xe5\xe3\x5c\x60\x6a\x50\x12\x8b\x1d\x0e\x61\x63\x7b\xc5\xeb\xca\x16\xe0\xeb\xb8\xbd\xa2\x66\x08\x0f\xf3\xf7\x03\x87\xbd\x1f\xc2\x77\x2e\x7a\xff\x93\x1b\xff\x9a\x73\x38\x2e\xbb\xb8\x20\x0b\xc2\xd5\xa4\x12\xe9\xa7\x69\x89\x9d\x20\x48\x3f\xce\xe2\x5d\x5c\x3b\xc2\x48\x36\xe2\x79\x83\xf2\x23\x37\xd9\xf1\xe5\x6e\xff\x39\xdf\xe5\xe8\x40\xb4\x38\x5d\x28\x81\xff\x9e\xe3\x81\x79\x9d\x64\x46\x5b\xbe\xec\x21\x19\x57\x98\xed\x02\x22\xe9\x3c\x5c\x67\xb5\xcf\x2f\x7b\xa0\x72\x66\x7e\x84\x4b\x8c\x6c\xca\x43\xfa\x29\xe1\x53\x59\xed\x3f\xba\xdd\x43\x79\x02\xb6\x84\x91\x02\x46\xf4\xda\x83\x05\x07\xa6\xf3\x3d\xd2\xe8\x9a\x0a\xe6\xb3\xc1\x5f\x7f\xa3\x01\xc0\x0e\x3e\xf6\x47\x06\x05\xce\x91\x73\x0e\xef\x2e\x6b\xe5\x10\x46\x20\x83\xee\x01\xdd\x42\xa1\xbf\xa7\x2c\x65\xb7\xc8\xb2\x18\x2a\xb1\x49\x5e\x1d\xbc\x6f\x8a\x7d\xed\x50\xe9\x40\x43\xcf\x6b\x78\xb0\x71\xd0\x40\x32\x9d\x8c\x3f\xc8\xab\x20\x80\x90\x2a\xee\x07\x8c\x00\x9c\x03\x0e\x49\xe1\x18\x90\xda\x8b\x26\x46\xa5\xb4\x5f\xf2\xaf\xfb\x56\xce\x71\x3b\x72\xc0\x40\xa9\x73\x46\xc1\x7d\x63\x68\x60\xc4\xdb\x6c\xbd\xe5\x9d\x77\x5a\xf3\x2b\x5e\x38\x93\xe1\xa7\x66\x0a\x60\x03\xc7\xe6\x94\xcd\x29\x92\xbc\x3d\x34\xdb\x3d\x87\xbf\xac\x7a\xbe\x77\x18\xdf\x2c\x74\xb8\xbf\x8f\xbf\x7a\xcc\xb8\xa9\x56\xff\xe2\xb1\xf3\xc8\x27\xaf\xf8\xeb\xc2\x10\xfa\xbf\xbf\x51\xdd\x7f\xc0\x0b\xee\xd9\xdf\xd1\x30\xd5\xd5\x75\x4f\x1b\xd3\x8d\x7d\x50\x3e\x46\x04\xf6\xcc\x14\xe0\xab\x9a\xba\x9b\x24\x74\x47\x2f\x22\xdd\x35\x04\xb5\xd4\xa9\x43\x4a\x3b\xbe\x1c\x47\x50\xb1\x96\x59\x4f\xfc\x36\x1e\xb6\x95\x04\x5f\xc9\xbc\x0c\x41\xae\xfe\x9d\x8e\x44\xfe\x72\x2d\x99\xd2\x72\xfd\x91\x06\xcf\xce\x44\xce\x93\x60\x40\xfd\x09\x5e\xa8\x93\x3b\x77\xd8\xba\x0b\x18\x38\x97\x93\xb5\x13\x36\x5f\xfc\xcb\xae\xfe\x1e\x86\xf4\x06\xe6\x9d\x4b\x64\xbe\xf5\x94\x52\x1a\xdb\x80\x38\x6e\xaf\x24\x71\x5a\x9e\xf8\x2f\xf3\x7a\x7c\xea\xb0\xdf\xcc\xc8\x40\x89\x40\x45\x58\x19\x94\x39\x2c\x36\x5b\x65\x8f\x8a\xe2\x54\x7f\x11\x5a\xd6\x37\x54\x29\x75\xa5\x26\x25\x98\x50\x3e\x87\xb1\x02\x43\x11\x78\x39\xc6\x2d\xab\x29\x8f\x4d\xaa\xa9\xf2\x83\xc1\x86\xc9\x86\x27\x53\x54\xf8\x9d\xd5\x64\x9d\xc6\xf4\x65\x09\xcc\x81\x71\xca\xfe\x03\x1a\xf1\xb5\xbb\xd1\x01\x8d\x2f\x27\xb0\xe8\xef\x62\xc5\xd7\x67\xf1\x48\xcf\x1a\xd0\x47\xb1\x31\x4a\x67\xdc\xe1\x55\x63\x84\x5e\x63\xe5\xb2\xd7\x44\x66\x43\x10\x61\x9c\x90\xa6\x7a\x18\xd8\x03\x1c\xf5\xf5\xa4\x32\x4f\x67\xfd\x7d\x22\x89\x68\x0a\xa8\x42\x37\xe9\x13\x4f\x81\xe7\xaa\xff\x75\xf1\xa4\x3a\x2d\x57\xa5\x0e\x8b\xf0\x8d\xee\x5f\x9a\x3c\x73\xd8\xb5\xb3\xf3\x90\x1b\x0b\x63\x12\x1f\x5e\x20\x80\x2e\x7c\xc6\xc0\x45\x25\x02\x96\x65\xa8\xa2\x61\x76\x82\x34\x18\xf2\x61\x35\xb2\x79\x3b\x44\x97\x7d\x03\x18\x2f\x77\xec\xff\x3e\x15\x8f\x38\xec\x03\x0e\x03\x95\x73\xcb\x6a\xfb\xe7\xa7\x41\x0d\xe2\x0a\x15\x1a\x28\xdf\x58\x95\x86\xc2\x37\x65\x1a\x2f\x60\x63\xb9\x8f\x9d\x19\xbd\xa0\xc6\x43\x30\xe5\x87\xb5\x7d\xf5\xde\x09\x13\xde\x40\x07\x42\x77\xbc\xff\xf7\xd0\x47\xf4\x5c\x89\xd7\xc7\xe7\xfe\xbd\x60\x09\xf8\x4a\xdc\xbe\x01\x07\xff\x6b\xf0\xb4\xe6\xa0\xc2\x2f\xd7\x4b\x24\x75\x1f\xdb\x29\xbf\x6d\x8e\x8b\xee\xf1\x7b\xf4\xbd\xbd\x99\x3c\x02\x13\x04\xb3\xe0\xcb\xa9\xae\x5b\xed\x43\xf1\xa5\xb8\xd5\xae\xb4\x7d\xb0\xd7\x5a\xcb\x07\x30\xf0\x7b\x15\x14\x02\x12\xb2\x54\x57\x8e\x99\x76\x48\x76\xd9\x4d\xad\x99\xbd\x44\x84\x7a\xf5\x66\xe3\x8f\x8f\x33\x95\xff\x73\xdc\xf7\x12\x21\x02\x89\xa8\xcc\x7d\xd7\x71\x6d\xb9\x12\x1a\xf5\x4c\x5b\x3b\x23\xb4\x11\xf8\x84\xe2\xf5\x82\x12\xfc\x9d\x94\x97\xf8\xd8\x1f\x18\xb5\x8a\x5f\x45\xad\x2c\x84\x54\x1f\xa3\x1e\x56\xd6\xc0\x26\x45\x62\x75\x67\xc4\x43\x69\x56\x4e\xfd\x53\x66\x75\xd9\xb2\xca\xa7\xa0\x39\x23\x00\xca\x5f\x17\x00\x04\xe8\x32\x38\x34\xf5\xa8\x39\x6b\xfa\xd2\x86\xde\xb8\x1a\x43\x65\xdc\xed\xf4\xde\x6a\xf8\x0d\xbe\x8d\x0f\x8c\x7a\x20\xda\x28\xc8\x66\x08\xd4\x80\xbf\x87\x9e\x97\x60\x88\xb6\x3f\x62\x3c\x26\x46\x66\x67\xd0\x72\xd4\xb4\x2f\x3f\x38\xa8\xc5\x37\x11\xfd\x59\x48\x34\x75\xf5\x25\x36\x10\x0e\x2f\xe3\x9a\x85\xdb\x94\x11\xae\xf8\x5d\x56\xc6\xf6\x03\x1e\xe7\x26\x6b\x00\x0b\x78\x7b\x11\xf7\xdc\x6e\x37\xd1\x55\x10\xa2\xa0\x2f\x0d\x90\x02\x3b\x3f\x0d\x71\x05\x6c\x85\x05\x3a\xf4\xec\x1a\x35\x7d\xb7\x26\x3b\x0d\x03\x5f\x30\x5f\x01\x4e\xc8\x10\xcf\x18\x2b\xc0\x6c\x28\x80\xa4\xca\x5e\x1b\x88\x97\x78\xbb\xfd\x89\x06\x55\x46\x8b\xcd\x3c\x1b\x2c\x88\x1e\x34\xc9\x6c\x0a\xe4\x59\x8d\x7a\x91\xea\xf1\xc2\x40\x2b\xff\x23\xed\xf3\x94\xa7\xf0\x8b\xbf\x7c\x52\x32\x51\x3a\x03\xf1\xac\x92\x01\x8d\xc7\xe3\xec\xec\x66\xa3\x6e\xbf\x63\x17\x89\x63\x66\x45\x82\xca\xcb\x26\xa8\xfa\x11\x97\x6f\x3b\x9b\x1d\x3c\x3d\xe1\x1a\xe5\x0d\xb1\xa6\x40\xe3\x67\x0f\x80\x62\x04\x36\xcc\x47\xfe\x8f\xe7\x7f\x02\x1d\xd9\xc5\x05\xbd\x6e\xac\x65\x94\x80\x20\xba\xb2\xc4\x31\x34\x18\x7a\xcb\xdd\x52\x29\x19\x79\x53\xae\xbc\x57\x3c\xac\x0d\xbc\x65\x21\x38\xc7\x21\x54\x3a\xfc\xe7\xa7\xf5\x91\x9a\x2f\x25\x7a\x9a\xb2\xee\x9f\xec\xa4\x8c\x0d\xcd\xc8\x9d\x5e\x1a\x1d\x61\x50\xb6\x17\x51\xa3\xa5\x07\xa9\x6c\x69\x18\x9c\xdc\xaf\x17\x19\x90\x3c\x60\x27\x1d\x98\xc3\xcd\x42\x0b\xc3\x2f\xc7\xae\x41\xe5\x84\x79\xd8\xb0\xbe\xaa\x1d\x0c\x94\x60\xe9\x93\x1a\xa3\x13\x20\x8d\xba\xcc\x88\x89\x66\x46\xbd\x13\x76\x70\xfd\x48\x2c\x3b\xb3\x48\x59\x0e\x2a\xff\x73\x27\xee\x2f\xbb\x45\x86\x04\xd8\x9b\xac\x74\x78\xfb\xcf\x1e\xad\xef\x4f\xd5\x33\x53\xf2\xa0\x3b\xc7\xe3\x1d\x83\x47\x99\x6e\xdf\x75\x18\x9a\xcc\x38\xd2\x05\x00\x60\xc5\x5e\x85\x6f\x06\x4e\x09\x8e\x7a\x8f\x36\x76\x9e\xa6\x60\x99\xc2\xdc\xf9\x2e\xa1\x43\xd9\xe2\x87\xe9\x24\xc6\x6b\xb4\x3c\xdf\x35\xf4\x48\x56\xa8\x1c\x5c\x59\x8d\x65\x3c\xc1\xb0\x58\x80\x10\x5a\xbf\x2e\x30\xdf\xd8\x45\xeb\xde\xb4\xa8\x73\xfb\x4e\x23\x36\x0e\x65\x23\x96\xac\x6b\x78\x09\x91\x79\x09\x9f\x41\x14\x3d\xdf\x40\xa8\x22\x42\x3a\xf1\x14\xa9\x2f\xdc\xa2\x2d\x83\xd8\xbe\xd5\xab\x8a\x54\xc7\xa7\x07\xe7\x5a\xbf\x38\x90\x17\x4e\x2b\xe7\xea\x89\xe8\x5c\xde\x5c\x98\x17\x8f\x39\x43\x9e\x65\x6d\x35\xce\x72\x51\xea\x2b\x48\xb3\x96\xcf\x64\xaa\x0c\x20\x9b\xed\x2c\x27\xac\x96\x8f\x73\xc1\x3a\x5e\x3d\xa5\xff\x77\x6a\x4f\x8e\x51\x9a\x46\x93\x29\xce\xa5\x7c\xd7\xf7\xd8\x99\xa1\x70\x3e\xae\x3d\x0b\xeb\xe8\xc9\x12\x6c\x26\x9d\x7d\x91\xd5\x6e\xa1\xc0\xf8\xf2\xa9\xae\x9e\xe5\x7a\xc6\x3c\x33\x58\xe4\x9c\xdc\xf5\x45\x84\xc7\x92\x65\x28\xd4\x27\xe1\x42\x0a\x28\x83\x36\x63\xd1\x40\x6b\x2b\x89\x9e\xce\x48\x3b\xcb\xcf\x29\x58\x28\xaf\x6c\x4f\x1d\x9b\xa9\xcf\x9c\xcc\x6d\x6a\x8d\x6b\xa6\xb5\x26\x63\x93\x14\xeb\xb8\x28\x2f\x07\x3b\xe6\x1a\x74\x36\xaa\xe6\x08\x03\xfd\xce\xc7\x78\xc9\x98\x21\x62\xda\x23\xba\x0a\x45\xce\xcb\xc0\x10\x74\x83\xbe\xb3\xdf\xd7\xd1\xa3\xb2\x73\xb2\xb5\xa3\x50\x24\x5d\x5c\xe5\x5d\xe3\x6f\x87\xdd\xb0\x7f\x25\x30\xc1\x2e\xa1\xd5\xbf\xdb\x6f\x81\x2d\xf9\xfb\xe9\x13\xe5\x84\x1c\xa7\xdf\xd5\x18\xf4\xc1\x44\x05\xbf\x0c\x5c\xba\x35\x40\x6a\xa7\x5a\xfb\xdc\x8e\xdb\xc2\x23\x22\xe6\x8d\x22\x01\xa7\x75\x7b\xff\x5d\x65\x03\x65\x9f\xbe\x84\x46\xe0\xac\xae\xd8\xa0\xdb\x07\xc7\x1d\x98\x51\x6a\x7d\x3f\xdd\xb6\x53\x04\xb5\xdd\x2b\xcb\xb3\x6c\xf9\x92\x1c\x32\xf7\xd3\x74\x37\xbb\x17\xe9\x8a\xa1\x07\xb7\x16\x49\x68\x3f\x42\xe4\x04\x66\xac\x24\x0f\xf4\xe1\xd6\x9f\xf3\x3b\xc9\xea\xa0\x0c\xf5\x39\x44\x98\xf4\xa8\xcf\xc7\x67\xb5\x79\x37\xb8\xb7\x16\x94\xd8\x66\xdf\xc6\x46\x31\x46\x33\xfe\xaf\x8a\x48\x92\x07\xd9\xac\x3a\x3a\xa8\xc5\x37\x87\x94\xee\xb8\xbb\x37\xf3\xa9\x8c\xca\x8c\x34\xf7\xf5\xfe\x36\x2e\x16\x5e\x6c\x65\x93\xcc\x7f\x1c\x84\x6e\x0b\x4f\x64\x25\xb6\x97\x8d\x2f\x2e\x5f\x3d\x2d\xbb\x9c\x20\xde\xa4\xcf\x31\xcb\xe0\xc8\x60\xcf\xdc\x2b\x5f\x6e\xb6\x90\x7b\x47\x27\x4c\x6f\x60\xc2\x4a\x7b\x5c\x4e\x2c\x48\xde\x17\x30\x15\x8f\x7d\x6a\x35\xdd\x9f\xfd\x05\x61\x3d\xcb\x8f\x5e\x69\x79\xfb\x58\x1b\x14\xfb\xf8\x6b\x59\xca\xa6\x6e\xb1\xf4\x29\xee\x64\xee\x8a\x7d\xac\x7c\x91\xfd\x91\x23\x57\x2e\x4c\xe7\x60\xb4\x6a\x63\x0f\x04\xcb\x09\x46\x7b\xa4\x77\x40\x4c\xfe\x17\x1f\x74\x80\xe2\x13\x7a\xa6\x72\x84\x99\x13\xe4\x66\x34\x77\x87\x6d\xa6\xde\x4a\x7f\x15\xbe\xca\xc7\xe7\x7c\xb2\xe3\x74\x38\x1c\xbe\x51\x0e\x1a\xc5\x7e\x95\x59\xed\xa3\x9b\xd1\x81\xec\xd8\x59\xca\x5e\x09\xcc\xa7\x3d\x06\xfe\xdb\x63\xa4\x54\x26\x4e\x88\x96\x01\x9c\xfa\x55\x90\x48\x77\x99\x34\xd9\x45\x2b\x4d\x91\x9b\x89\x26\x80\xb3\x23\xf6\x7f\xa1\x30\xfa\x47\xd2\xd8\x76\x02\x99\x92\x2d\x78\x2e\x27\xe9\xeb\x66\x74\x69\x74\xbe\xfe\x5c\x97\xe2\x2d\xb3\x5f\x59\x6e\x02\xe7\x2d\x9b\xf4\x1f\x22\x4e\xe3\x5d\xe7\x42\xf9\xf7\x56\xa3\x4a\xaf\xd1\x8a\x0f\xb8\x68\x58\x45\xb2\x9e\xc8\xcc\x92\xcd\xd1\x77\x75\x83\xa3\xd4\xd6\x1a\x9e\x5e\x4b\xc2\x92\x96\xfe\x1d\x0f\xb1\x3f\x4a\x28\x4c\x9c\x92\x37\xa5\x5f\xfb\x2b\x91\xf9\x6c\x68\x2a\x9a\x7c\x17\x66\x25\x25\xca\x40\x23\xfa\x78\x45\x7b\x27\xe8\x81\x70\xde\xb0\xa4\xa9\x9c\x4e\x52\xe5\xe0\x87\xad\x12\x95\x2f\xed\x33\x16\x83\xfa\xd6\x53\x0d\xad\x5b\x81\x50\x6a\xa8\x15\x1b\x1e\xfc\x81\x5a\xe9\x32\xdf\x92\x5d\x7c\x39\xd0\x57\x95\x6c\x23\x57\x55\xbd\xb7\x0b\xfb\xd2\xb3\x61\x65\x26\x78\xe5\x5c\x7e\xcb\xd4\x06\x1a\xa0\xd5\x2a\x41\x86\x58\xf7\xdd\x3e\x4a\x67\x67\xa5\xca\x69\xbd\x04\x51\xad\xf6\xc2\xb1\xaa\x6b\x01\x94\x2a\xe3\x95\xa4\x07\xab\xec\xe0\x5a\xc1\x8e\x89\x36\x00\x4b\xaa\x88\x55\x6e\xbf\x6d\x9c\xaa\x06\x67\xdd\x64\xa9\x48\xa4\x2b\x42\xf9\x33\x11\xf3\x9b\x1c\x96\xaa\x07\xcf\x0a\x56\xa3\xf4\x27\x59\x5e\xa9\xab\x2d\xf6\xd6\x71\x0d\x85\x4b\xec\xce\x57\xe5\x45\x71\x08\x67\xee\x68\x1b\x02\xa2\x82\xe3\x18\xd8\x42\xfa\x7c\x0f\xe4\x00\x29\x01\xac\x8c\xd3\x1e\xfe\xed\xec\xfb\x8e\xe1\xe5\xb9\xd2\x87\x5a\x56\x4c\x19\xb4\xc5\x49\xe0\xd4\x22\xe2\xfa\xcd\x70\x93\x05\x35\x8a\x73\x5c\xa5\x80\x80\xeb\x7b\xb6\xa4\xb0\xea\x5f\xf4\x8f\x80\x3e\xd2\x0f\xbc\xcc\x31\x66\xe9\xab\x67\xe2\xf0\xef\x4f\x80\xd5\xf2\xcc\x7a\xf4\xb5\xc1\x5b\x43\x6a\x19\xa0\x94\x87\xf4\xaa\xe2\x38\x2e\xe8\x32\x71\x51\x38\xa1\xe1\x64\x0e\x07\x2c\x17\xfd\x02\x6b\x1f\x79\x10\x79\x5e\x4a\x51\x67\x2e\x70\x2e\x6f\x0c\x37\x4f\xae\x65\xf9\xc9\x0e\x6f\xee\xaa\xb3\xd3\x1b\x00\xea\xad\x66\x02\x12\x4e\x42\xc3\xda\x20\xd2\x7b\xb7\xa9\x81\x30\xa6\xc9\x71\xa5\x02\x9a\x34\xea\xe5\x73\x2b\x09\x4c\xc8\x66\x41\x8d\x99\xbc\xc8\x96\x45\x82\x2d\x9c\xc5\x60\x11\xee\x9b\x6b\xbe\xce\x4c\x75\x9e\xf5\x2b\xbb\x55\x2d\x9b\x8d\xcf\xf3\x2e\x5f\xa5\x1c\x36\x4e\xb3\x10\xa2\xf2\x69\x75\xbf\xbd\x9b\xf8\x42\x79\xea\x74\xa7\x6c\xe1\xa7\x38\x98\xaa\xe7\x3b\x6d\x26\xb6\xb2\x8d\x93\xfc\xa4\x7c\x61\x10\x69\x3b\xaa\x70\xa9\xe8\xd3\xd8\x08\xf9\xc1\xce\x71\xb1\xef\xfc\xd8\xf2\x3a\x51\xf6\xa0\xe3\xcd\xc0\xe0\x14\x65\x7e\x8e\xc8\x6e\xa8\x3c\xe0\x23\x63\x8b\xf8\xd0\xaa\xd8\x1d\xde\x2e\x53\x89\xf9\x57\x71\x4d\xd1\xe7\xa9\x0d\x0d\xca\xee\x54\xa0\x72\x15\x45\x8e\x2e\xe6\x61\xb9\x91\xc5\xd1\x5d\x14\xf6\x59\x12\xab\x39\x1c\xd3\x10\x1d\xdc\xe4\x5f\x3f\x8c\x39\x60\x7b\x4d\x29\xc4\xed\x3f\x68\x57\x38\x78\x98\x3f\x4a\x81\x0b\x6e\xdd\xd2\x9f\x4e\x5e\x10\xd3\x49\x96\xdc\x64\x77\xa7\x8c\xad\xb6\x50\xa7\x1c\x19\x6d\x53\xbe\xe8\x82\xf6\x3f\x87\xe5\x9d\x6a\x1b\xc5\xf6\xb7\x1a\x1a\x98\xa6\x34\x86\xaf\x01\x6f\xf6\xcd\x0e\x51\xbd\xb2\x51\x90\xc8\xe3\x87\x81\xa7\xc5\xce\xeb\x04\x2b\x80\x6d\x78\xa8\xde\x9f\x10\xfe\x23\x34\xab\x6c\xdd\x09\xba\x3e\x73\xd9\x09\xa9\x81\xf2\x5c\xc0\xcf\x24\x20\xf0\x64\x37\x95\x83\xcc\x74\x81\xe7\x03\xc5\x77\x3a\xad\x83\x01\x0d\x45\x46\x51\xf4\xfb\xe5\x23\xcb\x97\x4d\xc0\xac\x5c\xc6\x63\x97\xcb\x7a\xbb\xe2\xf3\xfc\x84\xa3\xd8\x0f\xcf\xd6\x45\x62\xd0\x9f\xf2\x15\x98\x9c\xf0\x03\x0e\x3b\x25\x34\x7d\x48\x09\x7f\xca\x87\xe3\x3d\xe9\x03\x43\x47\xfd\xc4\x3f\xf8\x61\xe4\x79\x3f\xca\x4c\x1d\xdb\x15\x2c\x50\x5b\x14\xf2\x0e\x62\x34\xaa\x75\x70\x22\xf6\x1f\x7c\xca\xf6\xb2\x71\x72\x9e\x47\xa8\x6d\x8e\x1a\xe9\x32\x2a\x2e\x8c\x23\x90\x36\x34\xa2\x3c\x22\xb0\x37\xb9\xd2\x69\x98\xb6\xeb\x7e\xf8\xa6\x5b\x4c\x23\xe7\x0e\x97\xf0\xa3\x9b\x91\x7a\x7d\xaa\x67\xea\xd8\xe1\x8c\x01\xb6\xc1\xef\x14\xa3\x32\xb3\xb4\x72\x79\x2a\x8f\x68\x24\xc6\x20\xd3\x1d\xb7\xe7\x26\xa3\xc4\x47\x39\xdb\x04\x05\x30\xac\x91\x40\xd9\x59\xfe\x87\x5b\xff\x6b\xf0\xd4\x5c\xb3\xc0\xb4\xad\x7c\xe1\x9e\x10\x61\xee\x11\x20\x5a\x37\xa9\x13\x59\xce\xe5\xa7\x50\xb1\xb2\xe7\x79\x8c\x21\xb2\x51\xb0\x23\x65\x33\xaa\x5a\x1f\x88\xf5\x90\xf0\xb4\x2c\x10\xf6\x9a\x44\x49\xf3\x50\x16\xdf\x43\xa5\xb5\x74\x39\x18\xb7\x93\xcc\x66\x1e\xac\xb3\x5b\x69\x0c\x01\xec\x0d\x3a\x91\x31\x0c\xc7\xea\x47\xe8\x68\xca\xde\xf1\x19\xa3\xad\x97\xb3\xd4\xd2\x85\xbd\xd6\x23\xcc\x6f\x19\xfb\xb8\xea\xeb\x18\x4a\xd5\x09\x1f\x18\x94\x7f\x74\xc5\xb7\x91\x7e\xb8\xe2\xdf\x98\xd0\xb8\xf7\xcd\xa9\xb0\x12\xc4\x35\x1a\x64\x8b\x09\x08\x16\x51\xba\x91\x30\x67\x0c\xf5\xe3\x60\x36\xf9\x20\x7e\xc5\x00\x93\x65\x41\x70\x69\xf7\x3d\xdb\x36\x06\xd7\x4b\x09\x8d\x1c\x00\x7d\xd1\xa0\x37\x55\xe9\x0e\xde\x30\x31\xa7\x72\x1e\x2c\x17\x34\xa6\xde\x98\xc6\x43\x1f\x78\x5b\xd9\x60\xde\xf9\x7d\xf2\xa9\x39\xf8\x49\xf7\xa8\x1d\x94\x15\xa5\xbb\x22\x5d\xf2\x3e\x55\x13\x93\xfb\x94\x62\x57\x72\x1f\x8f\xbf\x01\xdd\x09\x49\x71\xc6\x2b\x12\xeb\x3e\x06\x0f\x10\x53\xf3\x9c\xaa\x39\xd4\xbd\x5c\x55\x9c\x46\xef\x94\x1c\xca\x18\x6a\x9a\xd8\xa6\xba\x3b\x64\xe7\x9e\x42\xf7\x50\xae\x85\xff\x9d\x29\x19\x5b\x73\xad\x46\x60\xcd\x00\x18\x0d\xa2\x76\x9b\x3c\xe1\x20\x3c\xa1\xaa\x04\xb1\xff\x05\x16\xb5\x4b\x7d\xf3\x10\x43\x0c\x86\x4f\x92\xd7\x50\x55\x13\xce\xfb\x38\xdd\x38\x90\xb3\xbf\xfe\x09\x7a\x3d\xed\xa1\xb5\x11\x9f\xb9\x5f\xb6\x24\xa9\x7e\x99\xb3\xce\xf1\x16\xe1\x90\x7f\xbe\xaf\xcb\xef\x88\x81\x04\x7b\xe2\x41\xae\x26\x5f\x79\x5e\xab\x2d\x54\xd3\xd7\x5a\xa9\xec\x67\x35\x89\xd0\x11\x5c\x30\x18\x56\x38\x8f\xc6\xdf\x51\x7f\x64\x8e\xe4\xf4\xb1\x34\x67\xaa\x25\x6f\xd9\x66\xbb\xae\xc2\x64\xcd\xf7\xd0\x0a\xde\x6b\xf9\x20\xfe\x25\x0d\x11\x1b\x09\x55\x08\xf3\x1a\xb7\x8f\x0d\xf9\xb7\xfe\xd7\x2e\x53\x11\xbf\x16\xd1\x93\x37\x03\x67\xbe\xb7\x9c\x8d\x32\x7b\xca\xad\x6e\x9a\x51\x66\x16\xdd\xf8\x82\x7d\xaa\x30\xb4\xaf\x70\x00\x3c\x11\xa6\xbf\x15\x0f\x3b\xa2\xe5\xdb\x41\xd0\x7a\x49\x0e\x81\xbc\x6d\xf9\x65\x10\xae\x14\x31\x9f\xfa\x94\x72\xd0\x8d\x9e\x06\xe9\x48\x85\x8d\xa3\x36\x78\x80\xe2\xfc\x62\xd0\xbd\x6c\x01\xc8\xad\xbe\x01\x97\x52\x43\x21\xe4\xe4\x2e\x09\xe2\x02\x61\xf2\x48\xf5\x19\x04\xe7\xfc\xcf\xf7\x55\x68\x84\x60\x82\xbc\xb9\x19\xae\xc3\x80\xd1\x5e\xe1\xc1\xd1\x45\x31\xd5\x21\x5e\xc3\xdf\x31\x68\x99\xc1\xba\xb2\xba\xc8\xcf\xb3\xa5\x66\x87\x04\xec\xc3\x21\x05\xd0\x01\x4b\xc1\x04\xcb\x23\xdd\xfa\xcd\xf4\x32\xc8\xf2\x81\x0c\xb2\xf4\xa2\x77\xb7\xa5\x31\x4a\x1e\x91\xab\xe3\xc7\x9a\x1d\x18\xff\x6e\xb9\xe4\xdf\x54\xdf\x76\x6e\x94\x77\x40\x5e\x2c\xbb\x12\xaf\xbe\x4b\xf7\x7b\xd9\x81\x0a\x64\x29\xdb\xce\xdd\x46\x58\xbb\x53\x21\xcf\x95\xea\xef\xf6\x54\x94\x5a\xe0\x81\xc4\x76\xce\x1f\x22\x42\x56\xe6\x03\xf3\x7b\x3a\x9e\x80\xd9\x09\x86\xcd\x20\x87\x72\xd4\x26\x62\x3a\x03\xfa\x7a\xc1\x68\x8d\xa3\x73\xab\xda\xa5\x45\xad\x33\x8c\xf6\xba\x55\x84\x85\x16\xcc\x87\x38\x5c\xd8\x95\x0e\x84\x0f\xfb\x6a\x5f\x76\x3e\xaa\xf2\x23\xbb\x68\x5d\x72\x24\xcc\x8d\x61\xb1\xc5\xbe\x81\x89\x2f\x12\x1e\xed\x4a\xa7\xe1\x01\xec\x04\x5e\xc6\xf2\xae\x58\x6f\x0a\xc0\x9c\xc1\x28\x31\xd8\x11\xa3\xa5\x6a\x9b\x66\x99\x34\xd4\x67\x57\x4a\x8e\x34\x46\xf5\x9d\x4f\x86\xbe\xa1\x30\xea\xdb\x2b\x7d\x14\x96\x8a\x4a\x05\x68\xb3\xb7\x02\x61\x08\xd8\x4e\x67\x7f\x48\x70\x84\x1e\xb9\xef\x63\x0c\x43\x17\xc3\x29\x02\xc5\x5a\xf1\x2f\xdb\x29\x55\xb5\xd1\x31\x86\x14\x0f\xa4\x4b\x46\xc5\x95\x01\x69\xb3\x30\xde\xe8\x37\x01\x7d\x96\x4d\x3d\xc4\xce\xc6\x55\xfd\x96\x0b\x3a\x86\xbb\xb5\x5e\x65\xb1\x5d\xb5\xbd\x69\x1f\xe9\x08\x54\xef\x2c\x4b\xf4\xe4\xbd\x01\xd4\x48\x69\xb3\xa4\xc9\x56\x5e\xe1\xeb\xd5\x3e\x02\xfc\xab\x72\xa3\x6e\x1c\x22\x45\x94\x2e\x5e\xdc\x2a\xb7\x69\xc9\xab\x50\x45\x6e\x99\xdb\x34\xb7\x4c\xa8\xe5\x78\xca\x52\xd2\xb7\x57\x7f\xb2\x4d\x8d\xd9\x1f\xcd\x87\x8b\x75\xa4\x86\x42\x19\x2b\x50\xea\x2b\x37\xbd\x89\x04\xe7\x26\x34\xd7\x0d\x1c\xd4\x25\x52\x9a\xa6\xd5\xe2\xa4\x72\x7d\x08\x36\xdb\xb2\x76\xee\xcd\x96\x0c\xf6\xd9\xbc\xa5\x29\x45\xa0\x96\x91\x26\xe7\x70\x04\xcb\xd0\x6f\x09\xfc\xca\x43\xff\x99\x3d\x14\xba\x37\x9d\x71\x12\x63\xd8\xf0\xd6\xa6\x8c\x54\x13\x85\x22\x18\x71\xa4\xbb\xd6\x70\x32\x74\xc1\x96\xe3\x38\x9b\xda\xde\x8c\x03\xf7\x65\x80\xfa\x9c\x7c\x51\xd6\xa5\xbb\x61\x33\xa4\xef\xc5\x00\x04\x44\x4b\x1f\x9b\x68\x40\x36\x7d\x40\xa2\x65\x7b\xc0\x0b\xac\x29\x3b\x93\x37\x9d\x05\x9a\xbe\xda\x86\x85\xf9\x02\x0c\xc4\x96\xd1\x39\xa6\x21\x7e\x4a\x7f\x49\x9f\x29\xed\x0f\xbf\x53\x6c\x62\x9c\xc2\xdc\x54\x2a\x6c\x53\xfd\x3a\x9b\xf4\x23\xcb\xb0\x61\x10\xd3\xbe\x49\xd5\x1a\xec\x2d\xb7\xae\xb7\x92\x15\xca\x1e\x1f\xa2\xa3\x8f\x87\x73\x59\x7a\x8c\x77\x1d\xc0\xc7\x6e\x46\xfe\x46\x67\x57\x5c\xc0\xd3\xfe\xd8\x0c\xea\x69\x42\x2b\xb7\x7a\x6f\xa4\x77\xf3\x76\x5e\x55\x23\xd4\xe4\x68\x6c\xff\x1f\x73\xa0\x5f\xcb\x32\xa2\xab\x21\xc0\x6c\xd1\x64\x8f\xcc\x8a\x6c\x5f\x85\x04\x1e\xba\x11\xbe\xff\xc0\x66\x73\xe4\x78\x96\x82\x69\x1c\xce\x6b\x1c\x02\x27\xfc\x12\xb1\x4c\x60\xf2\xdd\x3a\x43\x6c\x17\xfd\x03\xb1\x14\xc7\x11\x4f\xe8\xe8\xe3\x52\x4f\xdb\xd4\x89\x0c\x9b\xca\x84\x80\x9b\xe6\x23\xd7\xbf\xd4\x94\x29\x2e\x68\x9b\x7f\x11\x26\xf3\x07\x9c\x9f\x33\x3d\x90\x36\xeb\x98\xd2\x9f\xe2\x2b\xca\xce\xdf\xbb\x10\x58\x92\x09\xd2\x2a\xb3\xf8\x50\x51\x31\x6a\x99\x38\x48\x21\xb4\x7e\xe7\xb2\x84\xbc\x25\xd8\x7f\xbb\x27\xfa\xa6\x82\x06\xa7\x90\x8e\xca\xc9\x1e\xd1\xa9\xe5\x5d\x2c\xe1\x47\x06\x5c\xd5\x49\xaa\x79\x95\x73\x19\xc9\x99\xda\xa1\x71\xcc\x78\xf6\xbe\x33\x26\x37\x5a\xf5\x51\x46\xed\x43\xdd\xa1\x37\x1a\xdb\x06\xea\xfa\x7e\x6a\xb9\x75\xbf\x49\x15\xf5\x4f\xb2\xa8\xf2\x6b\x08\x37\xec\x45\x22\xd4\x10\xce\xd7\x1c\x26\x7a\xfe\x40\x81\x54\xa3\x34\x2e\x31\xd2\x3b\x85\x4a\xe7\x8d\x32\x83\x3f\x35\x82\x3a\xb3\x14\x55\x01\x00\xa6\x2e\x24\x57\x56\xd1\xbc\x8c\x7d\xbc\xc6\x0d\xb9\x26\xc2\xee\xf8\x86\x5f\x0e\xe7\x00\x57\x58\x59\xd6\x18\xca\x7c\x8c\x31\xd4\x9b\x06\x8d\x1f\xd5\x84\x39\x1a\xc9\x55\xbb\xee\xb5\xa9\xc8\xab\x6f\xcb\x77\x98\x2d\xbb\x9a\x81\x2f\xdc\xe8\x6f\xc6\x50\x0f\x28\x2c\xf9\xd6\x31\x8b\x79\x71\x2b\x2b\x6a\x36\x02\x5a\x96\xd4\x47\x7a\x56\x04\x0d\xc9\x04\x81\xc5\x6d\xa7\x1f\xbc\x69\x0e\x39\x97\x1a\x77\x07\x57\x34\x41\x01\xe7\x72\x41\x79\x43\xee\xfc\x8c\xee\xac\xf8\xdd\x5c\xf1\x3b\xa8\xb4\xf2\xb7\x64\x8b\x6f\x6f\x09\xf1\xb0\x96\x47\xc2\x7c\xd4\x0f\x57\x54\x11\x13\x8c\xdf\xe0\xf1\xc6\x96\x92\xea\xad\x73\xa1\x06\x8a\xf5\x3f\x51\x2a\x65\x1e\xc2\x02\x33\xe2\x66\x81\x0a\x39\x3a\xef\x80\xeb\x96\x3a\x7e\x07\xa4\x18\xa3\xe3\xb8\x41\x20\x68\x7a\xc9\xc1\x22\x90\xc6\xce\x6b\x95\xf0\x83\x0c\x30\x83\x54\x65\x58\x6a\xe1\x1c\x63\xce\xf8\x65\x32\x1a\x92\x90\x8d\x03\xe2\x61\xdc\x7e\x53\x89\x2d\x02\x6b\xc4\x31\x8b\x23\xb5\x1a\x00\xe8\xa1\x2a\xe5\x93\xcb\xfa\x27\x33\xb5\x87\x35\x59\x0f\x9b\x4c\x13\xb3\xb3\xb7\x15\xa5\xea\xbc\xed\x17\x97\x1e\xff\xb1\x63\xe3\x71\x64\x9c\x21\x36\x44\xef\xa1\x54\x66\x72\x8e\x2b\xbf\x75\xd9\xc4\x72\x24\xf4\x21\xd4\x5d\xfb\x75\xc0\x65\x76\xff\xe0\x27\x90\x4b\x56\x5c\xd1\xbb\xdc\x03\x39\xea\x25\x9c\x3a\x03\x81\xa3\xe2\xcb\x88\x0f\x7d\xda\x22\x54\x02\x2e\x0f\x01\xf6\x21\xde\x45\xe2\xaf\x96\xb1\x7e\x04\x4c\xce\x86\xe1\x68\x1e\x1b\xe2\xf5\x0b\x35\x10\xc6\xa8\x0f\xc1\x34\x12\xeb\xb9\xbe\xd6\xeb\x72\xb0\x66\x89\xc0\x5c\x7b\xa3\xfd\x32\x47\xf8\xc8\x66\x7b\x3b\x79\x61\x0f\x96\xb1\x1d\x34\x11\x9f\x2e\xc5\x57\x45\x6f\x0e\xf5\xf1\xe2\x7e\x57\x0b\x65\x30\x70\x7a\x85\xa6\x2c\x19\x55\x61\x16\x6f\xc0\x58\x08\xac\x38\x57\x8f\x0c\x46\x1e\xc9\x1c\x38\xf9\xca\xed\x1a\xd5\xe6\xc3\xbe\x96\x42\x7b\x5f\xc5\x47\x66\xde\x49\x45\x05\xb9\xdd\xc0\x37\x1a\x7a\x25\xa1\x80\x57\xd2\xc3\xbe\x86\xc5\x40\x19\x89\x63\x0f\x2b\xba\xd1\xd1\xb9\x5a\x5f\xf6\x7c\x3f\xdc\xa9\xd8\x73\xb0\x9b\xf6\x9c\xd6\x86\x29\xfd\xfb\x62\x3a\xd3\x3e\x33\xc3\xc5\x7f\x07\x4c\xd8\xc0\x5a\xed\x46\x50\xd0\xe4\xe7\x5d\x0e\xd0\x1c\xc1\x1b\x94\xa3\x27\xec\x52\xa5\x55\x7b\xd2\x07\xd9\xa7\x8e\x83\x8b\x3b\x8d\x47\xf6\xd0\xa4\x48\x9b\x5e\x84\x13\x24\x52\x33\xe8\x45\x99\x5a\x60\x85\x51\x60\x52\x96\xa6\x64\x13\xc7\x0f\xf3\xb1\x0f\xb4\xa2\xfd\x08\xc2\xe2\x0a\x23\x86\x67\xcc\xc1\xd9\x18\x9b\xf6\xcb\x4e\x66\xef\x4d\xc5\xdf\x61\x7b\xe6\xf3\x48\xf5\xb2\x55\x69\x43\x80\x0d\x7b\x8d\x68\xa7\x31\x9d\xf3\x55\x60\xfe\x1b\x11\xd0\xed\x76\x2a\x2d\x1f\x26\x75\x8a\x8f\x01\x79\xf1\x34\x00\x08\xaa\xf8\xa1\x4c\x21\x1d\x8f\xd0\x74\x3b\x6f\xa5\xdc\xbb\x3c\xad\xe6\x0b\x56\xca\x8e\x06\x17\x6f\xcd\xdb\xdb\x95\x5e\x58\x6e\x46\x83\xb4\x69\x7a\x45\xbe\x40\x19\xcf\x70\x20\x98\x14\xeb\x72\xef\x69\x28\xc3\x71\xbb\x31\x40\xe9\x46\x79\x9a\x74\xa2\x5b\x18\xea\x6d\x27\x99\x60\x72\xa9\x13\x3a\x78\x0e\xa1\x1c\xcb\x47\xf8\xd5\xed\x8f\x2a\x54\x2b\xab\xb6\x76\x7d\xc0\xb5\x0c\x1f\xc6\xc9\xc3\x88\x8f\x07\xfb\x58\x10\x77\x13\x33\xd8\x10\x05\x1d\xfe\x51\xf4\xb3\x0b\x27\x6f\x5a\xaa\x9d\x86\xfd\x0e\x05\x7b\x61\x2d\x01\x5e\xa1\x3b\x77\x5f\x9d\x5b\x4f\xef\x3c\x8e\x10\x0d\x34\x7a\xbc\xba\x16\x08\x18\xd2\xf7\xf6\xc7\x77\xf4\xf2\xcb\x2f\xe1\x00\x99\x50\x44\x13\x37\x14\x0a\x38\x80\x27\xc2\xd1\x7d\xfa\x8a\x78\xee\x00\x81\xe8\xa1\x5d\x0d\xaa\xa6\x0b\xbe\x34\x7d\x3d\x93\xe6\x05\x6d\x6d\x84\x89\x8d\xff\x7d\x7c\x5b\x4e\x3f\x7e\x51\xb6\x96\xa9\xc0\x60\xc8\xe2\x96\x2b\x23\x66\x0c\x79\xdc\x9d\xb1\xd5\xb1\x43\x80\xa1\xc5\xe7\x26\x95\x5c\x75\x0a\x2f\x3f\xe1\xc3\xa2\xb3\x7c\x54\xe6\x01\x94\x6d\xa5\x22\x11\xa7\xad\x1c\x80\xf0\xeb\xfb\x21\xbc\xe9\xcf\x7a\x60\x83\xc5\x32\x26\x19\x62\xf2\x41\xf9\x3a\x0c\x19\xde\x7b\x23\x81\xf9\x4a\x6f\xce\xad\x88\x64\x80\x07\x7b\xab\x70\xf1\xf5\x87\x5f\x6a\x19\xaf\xf6\xd6\x2b\x5f\x1c\xda\x91\x7e\x04\x7a\x0d\x66\xca\xae\x71\x42\xa1\x0c\x2e\x73\xec\x79\x05\xbb\xac\x6b\x20\x8e\xf9\x2b\xe1\x25\xab\xe2\x20\xbf\x31\x4b\x12\x08\x23\x14\x6c\x71\x88\xc3\x4d\xa7\xa3\x55\x26\x07\x86\x60\x42\xf5\x05\xb1\x4e\xe9\x63\xe4\x0b\xc3\xfa\xa2\x93\x57\x1b\x68\xeb\xf4\x22\xc9\x67\xce\x8a\xcd\x43\xd9\x5a\x3f\x39\xde\x03\x7f\x1c\x17\xf7\xb7\x80\x64\x56\xb9\x5e\x55\xdc\xc5\x71\x79\x87\x5c\xef\x29\xa3\x7b\x6a\x90\xac\x9b\x53\x77\xc0\x90\xe4\x06\xe1\x93\x53\x66\x96\xc5\x6f\x06\x6d\x3c\x81\xb9\x7d\xff\x0a\x39\x5d\x08\x3b\x90\x4b\x6d\x17\xc0\xe4\x8e\x2b\xf4\x8f\x6e\xea\x62\xf8\x15\xc0\xe3\xa6\xcd\x0a\x46\xa2\xd7\xd8\xb5\xcc\x18\xbc\x81\xb7\xaa\x4c\xd3\xb2\x3c\x60\xd0\x50\x79\xf3\x92\x3f\xe2\xe8\xd1\x4f\x4c\x59\xfe\xf8\x0e\xd9\x34\x0a\xc1\x2c\x87\xdf\xec\x2c\x5a\x01\x86\xef\x1c\xe0\x4d\xcd\x38\x40\x37\x2d\x81\x2b\xc3\x20\xf7\x52\xc1\x5c\xea\x80\x49\x9b\xc0\x8c\x24\x8b\x25\x1c\x5a\xec\x1d\xc8\xcb\x1e\x26\x06\x63\x05\x26\x2a\x1f\x8a\x8b\x15\x4e\x3c\x1e\xa0\xaf\x47\x1c\x14\xce\x0b\x7a\x60\x23\x98\xbb\xd7\xb8\x87\x60\x5b\x17\x6a\xfe\x27\x69\x9d\x03\x71\x8c\x23\xd7\x43\x8e\xe7\x26\xfc\x00\xcf\x66\xb4\xc0\xef\x3f\xf9\x0e\xcc\xd6\x96\x26\x50\xff\x71\xd8\xd9\x9f\xb0\xc9\xf6\x89\x5f\xfa\x35\x62\xc5\x17\x80\xbd\x0d\x4e\xe7\x6c\xc4\x95\xbd\x85\x52\x1f\x18\x3f\x25\x61\xd0\xc3\xc7\xc9\xdb\x6d\x7d\x44\x28\xce\x84\xcf\x2a\x63\xb8\xf9\x6c\x79\xf5\x7e\xab\xc0\x31\x6e\x5c\x3b\xc1\x16\x70\xa8\xfc\x83\x72\x24\x92\xda\x8c\x32\xe9\xa8\xc8\x69\xd9\x4a\x48\x11\x88\x61\x90\xad\xa4\xdc\xab\xce\xf0\x38\xc4\x1a\xb2\xf4\xda\x22\xe0\x38\x4d\x6d\x5d\xae\x51\x54\xce\xc2\x6c\xe6\x71\x71\x98\x4e\xd9\x1c\xbc\x39\x28\x67\x11\xdf\x2e\x3b\xf6\x5a\xcd\x80\xb4\x36\x46\x24\x6a\x1a\x37\x9f\xce\x0d\xa0\x75\x81\x53\x5c\xbf\x8e\x88\xef\x3d\x34\x60\x33\xa7\x4f\x56\x34\xf6\xef\x48\x81\x8c\x30\x58\x9b\x3f\x28\x65\xc7\x43\xe8\x35\x35\xbd\xcd\xe8\x0f\xf1\xd6\xa2\xa8\x19\x38\x79\x20\xb0\x88\xe3\xd6\xa8\xcc\x07\x72\x9e\x93\xca\x50\x77\xfe\xe4\x00\x6e\x47\x49\x07\xcb\x2f\x37\x24\xcb\xfb\x18\x72\x26\x90\x54\xd2\x87\x72\x33\xee\x61\xc2\x39\x55\xc2\xc6\x84\xd0\x26\xde\x86\x05\xd4\x14\xbe\x98\x97\x0f\x0c\xf2\x79\x76\xde\x76\x35\xbc\x87\x66\x88\x37\x62\xb0\x87\x2d\x92\xa7\xf1\xda\xd2\xe2\xe2\x6a\x42\x7f\x84\x88\xa2\x69\xe4\x0f\x3b\x8d\xff\x64\x4a\x38\x5c\x9e\x0f\x13\xe2\x3d\x3f\xdf\xc2\x43\x7e\x51\x53\x5a\x3b\x9a\x09\x03\xe1\xbf\x0c\x62\x9f\x79\x85\xa5\xa0\xe1\x58\x16\x4c\xcf\x65\xf4\xa4\x8d\xdd\x5c\xf4\x19\x9f\x63\xb7\x68\x37\x52\xde\x45\xde\x25\xe7\x7a\xda\x62\xe4\x89\xd2\x18\x7f\xfb\x29\x35\xdf\x64\x5f\x42\xbe\xc3\x1f\x95\x46\x3f\x39\x92\x7e\x7e\xca\xfb\x71\x0c\xd4\x4f\x4f\x85\xd3\x4f\x39\xf7\x46\x56\xa6\x3f\xa9\xfd\x1f\x43\xaa\x6d\x5a\x58\x2e\x1c\x76\x6f\x46\x84\xe0\x54\x35\x22\x3c\xef\x08\xf1\x39\x9b\x67\xd7\x10\x5c\xd7\x2b\x5f\x47\x89\xe3\x69\xf2\xc1\x56\x49\x2f\x11\x5a\x51\xdd\x0e\xf3\x54\x3d\x09\x77\x9c\xe0\x4e\xeb\xd9\xb1\xea\xaf\x11\x53\x5e\xd6\x2d\xc7\x97\x3f\x52\x85\x6e\x99\x7d\xa1\x7f\xfd\x0e\xca\x8d\xdd\xa4\x75\x47\xbf\x1f\xd7\x3f\x72\x77\x58\x30\x68\xba\xaf\xb1\x3b\x63\x12\x64\xf8\xcf\x52\xf9\x0c\xe3\x12\x79\x18\x56\x3a\x2e\xb0\x16\x73\x16\x12\xc3\xcd\xf7\xea\x17\x87\x43\x74\x9d\x1f\xdc\xde\x5a\x65\x99\xce\xc1\xf1\x8c\x23\x96\xfc\x32\x73\xb7\x01\x09\x6b\xab\xe0\xa3\x6c\x78\x61\x84\x6b\xe6\x72\x25\x0a\x85\xb1\xa2\x3f\x21\x60\x10\x61\xc5\x43\xbc\x09\xe5\xc9\x8e\xff\xc8\x3f\x51\x48\x90\xb8\xa5\x88\x4f\x67\x71\x1f\xfe\x8b\x1b\xb1\x71\xb7\xc6\x78\x07\xfd\xd5\xf9\x8d\xf0\xb0\xfe\x24\x0f\x58\x28\x54\x04\xb9\x73\x48\x50\xa4\x08\xc5\x1f\xb4\xd5\x7a\x64\xcd\xe5\x8f\x4c\xa5\x21\xff\x34\x56\xca\xe1\x63\x5c\xc2\x79\xd1\xad\xcb\x0b\x5a\xfe\x51\x04\x3b\x66\x2c\x36\x55\x68\xd5\x68\x6a\xcc\xa3\x6c\x1a\xe1\x81\x38\x0a\x67\x26\xaf\x00\xa6\xd6\xf4\x9d\x7d\xf4\xe3\xe2\xe0\xa1\x25\x2b\x74\x9d\xef\x70\x90\x29\xc7\x70\x02\xa3\x29\x33\x28\xef\xdb\xb2\x2c\x28\xca\x80\x80\x2d\x5a\x33\xd6\x48\x20\xe2\x25\x2c\x24\xcb\xa9\xb3\xab\xbe\x24\x62\xac\xe4\xf4\x5b\xb5\x71\x14\xdb\x92\x0f\x2c\x2b\xb5\x1e\x97\xa1\x8e\xe3\x5d\x53\xcf\x7e\x53\x55\xe3\x0d\x68\x8a\x6b\x17\x08\xa7\x75\xe2\xd7\xcc\xbe\x05\xef\x97\x63\x33\xdd\x86\x52\x69\xea\x46\x47\x47\xff\xec\x4d\xfb\x1b\xd2\x36\xe4\xcf\x14\xe8\x72\x07\x2f\x35\x8f\x85\x17\x0e\x48\x1b\xe0\xed\x14\xe1\xee\xc9\x19\xc4\x65\x60\x13\x6c\x8c\x0c\xcf\x9e\xa2\x07\xa3\x45\x28\x48\x1a\xdf\x7c\xc8\x3a\x61\x39\xb1\x54\x87\xc8\x4e\x9b\xff\xbb\x8d\x71\x35\x2e\xc5\xf3\x78\x68\x49\x02\x03\xe2\xd4\xf7\xcb\x20\x46\xe9\x35\xb3\xbb\xea\x77\xd8\x0b\x4b\xd2\x99\xd8\x02\xbe\x4f\x39\x3c\x46\xee\x98\x01\x75\x6b\x9d\xe6\x68\xc6\xe2\xee\x83\xfb\x58\xbf\xea\xbb\xff\xe9\x71\x3a\xaa\xaa\x13\xb8\xa1\xa4\xa5\xb1\xb5\xbf\xd7\x24\x0a\x8e\x2a\x1a\x7d\x58\xcb\xca\xaf\x87\x03\x62\x60\xd6\x81\x4a\xb6\x59\x91\xe9\xc4\x32\xc2\x62\x4f\x43\xd2\xd3\xe7\x1a\x1b\xbb\xa5\x70\xd3\x12\xca\x97\x45\x95\x48\x2c\xa8\x49\xef\x67\x3b\x71\x8f\x5c\x76\xfb\x49\x3c\x76\x06\xb7\x0a\x5e\x7e\x19\x09\x87\x47\x9a\xef\x4a\xe1\x55\x82\x5c\x3b\xde\x05\x25\xe5\x33\xa0\x66\x21\x4c\x82\x96\x07\x4a\xbe\x75\x02\xf5\xaa\x13\xba\x53\x2c\x29\x02\x93\xe7\xf2\x76\xa6\x7e\x77\x86\xab\x7f\xb7\x89\xaf\x03\x6b\xc7\x48\x92\x0f\xd8\x19\x5a\x4f\xce\xa6\x1d\xd2\x4f\x22\xad\x5d\x46\x4f\xe5\x66\x5b\x74\x55\x76\x5e\x1c\xbb\xf8\x79\xbb\xb2\x4a\xea\xa1\x7a\xe9\xf8\x47\xcb\xcf\x52\xf6\x40\x01\x9b\x51\x77\x39\x7e\xcd\x5d\x44\x7d\x19\x97\xa3\x3f\xfb\x55\x9d\x3c\x85\x40\xa2\x50\x75\xf6\x8e\x28\x6a\x8f\x2b\x9b\x1e\x72\x1b\xce\xc8\x97\xe0\xd2\x78\xae\x9f\x2f\x5f\xe0\xe8\x7f\x7b\x96\xf6\x2c\x5a\xca\x9f\x2d\xbc\x81\xcb\x78\xaa\x51\xfa\x7d\x82\x96\x59\xdf\x54\xd9\x59\x2a\xbd\x09\x00\xc1\xc9\xe5\xac\xfd\x2c\xc7\xc3\x59\x70\xad\xe6\x16\x04\xce\x93\x1f\xd7\x6e\x70\xe3\x94\xbf\x63\x86\x44\x30\x02\xe9\x47\x51\xc0\xf0\xe1\x95\x37\xdf\x77\x52\x5e\xa2\xf5\x33\x69\x74\xe1\x5e\xf9\x93\xc3\xfa\x10\x18\x6e\x78\x16\x9e\x6b\x7d\xc0\x89\xc5\x12\xe6\xdd\xdb\x75\x78\xef\xc7\xcb\x05\x12\xb1\x57\xd7\x41\xad\x9d\xdb\xbc\x5e\xde\x90\x15\x77\x8d\xac\x10\xe2\xb1\x9f\x1c\xfe\x8f\xe7\xa5\x9c\xf4\x81\xc6\xca\x12\x8f\x87\xd1\x3c\xdb\x2f\xb4\x20\x71\x5f\x59\x6b\xe5\xe8\xa7\x8f\x85\x16\xea\x4d\xb7\x6b\x84\xb5\xc6\xdd\x33\x5b\x02\x55\xad\xd9\x87\x93\x63\x05\xfb\x80\xad\x86\x78\x55\xe0\xea\x05\xb5\x0a\xa7\x46\x0b\xcc\xd8\xad\x20\x56\x0e\xbb\xce\x38\x6d\xfb\xdc\x6b\xa2\x74\x9b\x89\x85\x41\xb2\x79\xd8\x46\xae\x9d\xbc\x62\x91\x90\x64\x79\x66\xbf\xb9\x23\xdb\x96\x89\x09\x6d\x8f\x52\x54\x36\xa3\x11\xd8\x7d\x8f\x36\x08\x6c\x20\x63\x45\x84\xfd\x23\x17\xd8\xf6\xa1\x4e\x69\xb9\x1d\x06\x61\xb0\x28\xf9\x77\xe3\x15\x12\x74\x5a\x6d\xde\xd2\x99\x29\x94\x9d\x63\x38\x29\xb6\x0f\x2b\xf2\xbe\x7d\x22\xf5\xf8\x1a\x49\x55\xf6\x37\xcf\x9a\xe8\xaf\xf2\xcb\x3f\x2c\x0d\x2d\xf8\x8a\x8c\x40\xf5\x9d\xe5\x37\x33\x22\xbb\xfb\x22\x83\x7e\xb3\xac\xfb\x3a\x2f\xd3\x36\x85\x9d\x32\xe0\x5b\x0f\x10\x08\x2b\xa4\x16\x65\x09\x7f\x3d\x88\xe2\x26\xc3\xc0\x1c\x6a\x14\xb2\xce\xb2\x89\x2e\x9b\x10\x8f\xcb\x5a\xad\x3f\x83\x59\xde\xb3\x5b\xea\x04\xa7\xfd\x1a\x1a\xb2\xdd\x1b\x69\xed\xe0\x22\x99\xce\x72\x35\x58\xf8\xb9\x94\x85\x4c\xa2\xc7\xb3\x94\x33\x82\x54\xcf\xee\xdd\x8f\xbb\x05\xa1\xa1\x1d\x68\x4e\x39\x95\xc0\x56\x72\x89\xae\x16\xd3\xff\x27\xf9\x48\x52\x65\x20\x43\xc8\x13\x17\x29\x5f\x3f\x1f\xec\xa8\x22\x16\xc9\x00\x28\x21\x5f\xbd\xc1\xdc\xb1\xe1\xde\x4c\x67\x85\x9e\xa7\xb0\x08\x91\x2f\xa4\x92\xa6\xa6\x60\xa8\x52\xfc\x59\x93\x98\xb0\xdf\x11\xd0\x0a\xac\x37\x22\x4e\x1b\x90\xf8\x0e\x8d\x42\x80\x19\x31\x8f\x52\x7b\x6a\x04\x69\x8b\xc1\xde\xc0\xa0\x7b\x4c\x46\x22\x3d\x34\x80\xd6\xaa\x46\x74\xa0\xc7\x77\xc5\x80\x05\xe0\xf6\x83\x2c\x9d\x01\xee\x5a\xc1\xa9\x9c\xfb\x26\x31\xf1\x5b\x78\x2e\x59\x9c\x65\x71\x41\x27\xfd\x3f\x68\xef\xae\x03\x9f\x14\xb4\xa0\x6c\xcf\xfe\x7b\xdc\x79\xec\x07\x40\x9b\x37\xe4\x4b\x1e\xaa\x7b\xcb\x32\x5b\x47\x72\x9a\x72\xa2\x54\xe0\xcd\x50\x0f\x13\xff\x2c\x45\x42\x4d\x5c\xa2\xf0\x82\x30\xea\xc9\x30\x1c\xa1\xc4\x74\x29\x57\x16\x14\xa8\x25\x01\x1d\xdb\xaf\x2a\x1d\x0e\x68\xa9\xea\x50\xe3\xc0\xc7\x58\xae\x33\x01\xd0\x5b\x39\x39\xec\x1e\x82\xcf\xf9\xd2\x69\x9b\xb6\x6c\xa9\xe8\x9c\x1d\x2f\x05\x4c\xc4\x7a\x48\xb4\xc4\x30\x03\xd4\x03\x63\xd6\xe8\xee\xf0\xc1\x65\x37\xd4\x4a\xe7\x0a\x96\x0b\x6f\x05\xfb\x2e\x8b\x40\xea\x00\x9f\x8d\x06\x03\x6a\x7e\x1b\x6b\xee\x48\xf5\x0c\xe0\x19\xe6\x0c\x5e\x59\x52\xd8\x02\x25\x93\x38\xd3\x5c\x6d\x5b\xe0\x80\xd1\xd5\x68\x2d\x5c\x5a\xfc\xa0\x50\x94\xfa\x33\xe3\x5b\x8f\x18\xac\x3b\xfe\xcf\x51\x9b\x1f\x01\x12\x19\x66\xad\x3c\x40\xb4\x37\x17\xdb\x84\xd2\x45\x33\x68\x55\x80\xab\xbd\xb7\x29\xcb\x22\x2d\x7c\x52\x77\x49\xb5\xca\x2e\x67\x3d\x97\x98\xe6\x53\x2b\x32\x79\x6a\xe4\xcf\xe4\x17\x64\x70\x96\xa2\xb3\x6a\x75\xfd\x37\x96\xf5\x87\x7f\xe6\x48\xf7\x95\x25\x8d\x6f\xfa\x73\x4e\xfd\xa1\x99\xfc\x53\xd6\xc2\xee\xe3\x24\xad\x05\x4c\x4b\x0d\x9d\xc9\xf5\x2b\x55\x02\x34\xa5\x4f\x63\xdc\xd1\xa1\x7d\xe7\xa8\x3c\xde\x57\x40\x3c\x5c\x3a\x77\xdd\x76\xb3\x9d\x76\xdf\x63\x67\x3c\xe5\xfd\xa8\xab\x22\xe0\x6b\xbd\x60\x6f\xd5\x0b\x24\x02\xc6\xc9\xfb\xb2\x21\xb7\x1d\x35\xe3\xb5\x60\x03\x5a\x0f\xee\xe2\x81\x73\xdc\x18\x85\x46\xfb\x92\xe7\xc2\x3b\x2d\x11\xc0\x55\x5e\xde\xaf\x30\xea\x2f\xb1\x1b\x7e\xa7\xa4\x3b\x12\xdb\x96\x2f\xc3\x18\x2f\x5b\xa2\x44\x3b\x03\xcc\xa9\xbe\x4c\x6b\x1e\x03\x8c\xf0\xfd\x4b\xa0\x9e\x02\x9d\x25\x1a\x7c\xd5\xa4\x27\x85\x69\x09\xdb\x95\x32\xfb\xfc\x72\xdb\x2f\xfb\x06\xf9\x53\x9d\x6b\x17\xd7\x10\x90\x64\xd8\x33\x06\xd8\xcc\xf4\xf2\xa7\xd1\x61\xb0\x37\xbf\x80\xe8\xa7\xb0\x5f\x7b\xc2\xf8\x20\x4f\xdd\x85\x1f\xef\xe3\xf6\xad\x13\x8d\x7f\x0e\x63\xcb\x92\xca\x19\xa5\xbd\x16\x8d\x83\x3d\x15\x50\x25\xda\xa7\xaa\x4b\x4d\x4d\x9e\x15\x7b\x7f\xde\xd9\xad\x3a\x3e\x46\x5d\x11\xaa\xc2\xd7\x81\xa9\x68\xc8\x42\x7f\x7b\xf1\x2a\x0e\xf4\xe8\x09\xc4\x82\x16\x7c\x68\x20\x51\xe8\x39\x2f\xf2\xea\x14\xe5\x16\x68\xa4\xb1\x15\x62\xd2\xa9\x93\x23\x3d\x6d\x74\x5b\x0e\x46\x4b\x18\x14\xf2\xe1\xbc\xaf\x3e\x59\x63\x9a\x64\x8d\xdd\xc5\x81\x8d\xd0\x38\xfe\x8a\x6c\x47\x14\xd8\x92\xe2\x7a\x3e\xa2\xe7\x5b\x06\xed\x03\x21\x4f\xba\x57\x02\x9f\x23\x4f\x65\xa6\x16\xd8\x8c\x7f\x48\x23\x55\x44\xb4\x27\x0d\x4f\x52\x45\x97\xa1\xe4\x6d\x4c\x1a\x85\x35\xc8\xeb\x4a\xdf\x04\xf8\xac\x5b\x75\x4f\x0f\xcc\xa4\x83\x92\xb2\x0f\xb0\x6f\x78\x6d\x1c\x69\xfb\x13\x5b\xeb\x28\x7b\x00\x3d\xb1\xb2\xfe\x40\x65\x4b\xc8\xf6\x15\x86\x8e\x1f\xb5\x45\xc0\x35\x1e\xb5\x7f\xca\x24\xf8\x99\x8d\x67\x7e\x16\xec\x82\x16\x83\xb8\x9f\x79\x85\x7a\x29\x74\xa7\xb0\xda\x8b\x0d\xd7\xfe\x61\xc8\x93\x00\x68\x64\x8b\x45\x43\x6f\x87\x38\x1b\x4e\x96\x18\x97\x5f\x2e\xa8\x7b\x10\x9c\xc6\x3e\x88\x8a\xd3\xf5\x52\x99\x2e\x46\x19\xaa\xf8\x54\x63\x2e\xdd\x1c\x96\xeb\x19\x56\x7f\x1c\x77\x36\x37\x25\x70\x6d\xe4\xf9\x5c\x1d\xb8\x4c\x64\x7a\x35\x38\x8c\xfc\x54\xf9\x97\x05\x36\xdd\x5e\x49\x65\x40\x8e\x25\x43\x44\xd6\x9b\x04\x91\x47\xb5\xff\xe5\x2a\xab\xfb\x46\x2b\x73\x20\xc1\xd5\x3d\x64\xc2\x5b\x9f\x3a\x09\x74\x46\x1a\x59\xb5\x73\xa7\xbd\xa9\x46\xbb\xc3\xbd\x90\x76\x18\x88\x28\xc7\x81\x3a\x67\x6b\x73\x57\x8b\x45\x99\x4a\x85\x6e\xb1\x03\xd9\xd6\xc8\xf2\x81\xf5\xa9\xa6\xa6\x3d\x97\xe9\x8a\x0f\xce\xe1\x25\x5b\x96\xd1\x2a\x6b\xc4\x92\x6a\x03\xcf\x05\x5b\xad\xce\x23\xde\x54\xf1\xc2\xbe\x8c\xc0\x2f\xf9\x8c\x25\x29\xcd\xa4\x0c\x9e\xbd\xa3\x8f\x77\x88\x93\xfc\xc1\x67\x60\x0b\x65\xdf\xa7\xdf\x8e\xa9\x6a\x7e\x91\xa9\x9a\x8a\x97\xa1\xfa\x9a\xfb\x94\xe5\x60\xb4\xd3\x17\xe8\xc1\x82\x14\xd8\x76\x40\xdb\xc2\x66\x10\xb0\x36\xc7\x48\x7f\x22\xd7\xca\x71\x8a\x3b\x14\x9e\x81\x4e\x77\x6c\x61\x6a\xa8\xf8\xc9\xdb\xff\x39\x4e\xcd\x0a\xd5\x71\x7d\x6f\xc2\x01\xe9\x96\xca\x0f\xf3\x60\x04\x8a\x1c\x56\xfb\xc6\xfa\xda\x07\x8c\x4f\x96\x80\xb7\xcb\x9d\x8f\x64\xe5\xef\x23\x88\xf3\x40\xb4\x23\x18\xed\xdc\x5e\x02\xa9\x21\xd2\x53\x05\x0b\x47\x3c\xa5\x8a\xa3\xaf\x6f\x41\x2a\x75\x46\x02\xb9\xd3\x6f\x8e\xa8\xa8\x3d\xbd\x4b\x71\xc1\x77\x95\x5e\xa3\xe6\xa4\x1d\x2d\x45\xbe\x8e\x94\xaa\x7a\x81\xc4\x93\xc2\x62\xd5\xa5\x6b\x92\xf1\xe8\xc8\x3d\xdb\xff\xad\xda\xf9\x6c\xf9\x93\xa2\x0b\xe2\x5c\x34\x09\x3a\x19\xf5\xd1\xa8\x49\x40\xf9\xea\xe2\x81\x70\xe2\xb2\x09\x08\x74\x7a\xac\xf7\x71\x49\xd9\xc6\x7b\x4d\x3a\x7b\x55\x8f\x2b\xa5\xa6\xd5\xdc\x32\x04\x45\x6d\x6a\x98\x10\x5e\x1e\xdb\x8a\x0e\xef\x6e\x42\x21\x40\x6d\x7a\xc5\x2b\xed\x55\xc0\xba\xb7\xe1\xb2\x8d\x40\x85\x80\x1e\xca\x18\x51\x5f\x01\x03\x0b\xbc\xfa\xd3\xeb\x2f\x56\x96\x55\xba\x50\x19\xe4\xd7\xa5\x90\x55\x17\x1a\x02\x04\x5f\xff\x5b\x4f\xa5\x95\xb1\x6b\x89\x88\x3c\x9c\x2d\x43\x85\xd9\xa0\x1e\x0a\xd3\xc4\x4d\x6f\xa7\x3d\x2d\xcc\x15\xbb\x75\xaf\xe3\x7f\x31\x5c\xda\xb1\x7e\x39\xce\x60\x0b\xd9\x2d\x0f\x77\x7f\x30\xc4\x0b\x5c\xe8\xf6\xe5\x06\x86\x83\x3e\x1c\x68\x9b\x78\x87\xe8\xca\xa7\xe8\xac\x7e\x65\xcb\xc1\x6d\x51\x9f\x3c\xad\x26\x2a\x42\xfd\x3a\x09\xbe\x2e\x4f\x80\x9a\x80\x5f\x6b\x79\xfe\x83\xfd\xd0\xf5\x33\xcc\x01\x69\x57\x8d\x83\x36\x7a\xb1\xab\x93\xdb\xab\x2c\x4f\x78\x06\xaf\x20\x3a\xdc\x88\x48\x5f\xfc\x49\xba\xba\xee\x15\xee\xf6\x2d\xa0\x91\xda\xdb\x0f\xc1\x6c\x3d\x52\xd9\x42\x55\x8f\x45\xb9\x9b\x30\x09\x2a\xb5\x7e\xa5\xb8\x05\xf7\x5e\xd6\x22\xc4\xb7\xfd\x94\x24\xc0\x1b\x2d\x6b\x03\xd5\xfb\x51\xe7\x4f\xb4\xd3\x83\x02\xb0\xa2\x97\xb0\xc4\x40\xf7\xa4\xa8\x4c\x6d\xff\xea\x51\x13\x77\x1a\xc7\xc6\x76\x9e\xcf\x1c\xc3\xfc\xac\x8c\x82\x2c\xb9\x8e\xff\x53\x61\x04\xa3\xfd\xd6\xfc\xbb\x75\x0c\xa3\x43\x06\x39\x0c\x82\xb4\x07\x14\x22\x7e\xac\x6e\x20\xc2\x95\x01\xc5\x8a\xcd\xc1\x1c\x1c\xa5\xc0\xa9\xf5\x97\xed\xc7\x78\x3f\xf0\x6a\xdf\xb2\x85\x6f\xe0\xfa\x40\xaa\x90\x95\xb7\x0a\xa1\xc2\xd4\xe4\xdf\xa0\xaf\xfa\x5b\x29\xff\xa0\x2d\xab\xa4\x81\xaa\xa6\x2d\x5f\x98\x3e\xcd\x65\x5a\xb4\x42\xc6\xc7\xa9\x06\xfe\x05\x92\xf1\x84\xb5\xbb\x1e\x0a\x8b\xf0\x88\x1f\x93\x0e\x97\x83\x69\xd7\x43\xa3\x9b\x0b\x59\x6e\xc5\xa8\x89\x69\x7b\x8c\x64\x58\x0f\xfd\x65\x96\xab\xd3\xf5\x1e\x18\xd9\x89\x1e\xec\xb0\x94\xcd\x51\xe7\x80\x81\x69\xf6\x40\x19\xea\x8b\xcd\xe7\x48\x3e\x72\x46\x5c\x30\xbf\x87\xec\x20\x50\xe4\xeb\xf1\x57\x65\xdf\x4c\x77\xb5\xa5\x7e\xf1\xaf\x08\x98\x1a\xd0\x50\x60\xd6\x97\x71\x58\x0e\x6f\x0a\x1d\xf4\xf5\x09\x2a\x46\xf2\x3f\xd0\x78\x84\x67\x2f\xf2\xbf\xc9\xff\x1e\x4c\x8a\xc4\x13\x96\xcf\x14\x38\x75\xbe\xd2\x6e\x17\x68\xce\x26\x67\x5b\xb0\x5a\xd2\xb6\x0c\xbd\xd2\xee\x76\x81\xd9\x42\xb3\xf5\x3f\x0d\xd1\xfa\xd1\x06\x69\x61\x1c\xbc\x12\xf9\xf8\x0b\x32\x7a\x4f\xe2\x63\x87\xc4\x2e\xfd\x79\xf9\xd3\x3e\x1f\x79\x73\xcc\x06\x7d\x6b\x19\x00\xa1\xf7\x96\xaa\x30\xdd\xf9\x79\x1c\xe9\x9f\x4c\x3c\x53\x96\x7f\x3a\x99\xe7\x4f\x39\x2b\x9f\x31\x30\xdf\x20\x90\x67\x13\xf9\x88\x91\x2f\x5f\xfe\xb5\xa7\xdb\x71\xc2\xc9\x2d\xc6\x99\x4d\xdd\x9b\xf3\x72\xce\x97\x30\x82\x98\x79\xf2\xce\x11\xb1\x3f\xa5\x60\xb8\x49\x82\x6c\xa4\xdb\x2a\xdc\x71\xcf\xc3\x67\x89\x8b\xe4\x5b\x81\x1c\xc8\x3a\x50\x1a\x95\xd3\x08\x5b\xf3\xb6\x6f\x1e\x67\x3f\xa1\x3b\x14\xa1\x4a\x01\x32\x57\x57\x3e\xb4\xd2\x21\xe7\x7e\x48\xb1\xe8\xce\x6e\xae\x0b\xfc\x8e\x7f\xa1\x4f\x91\xb2\xc6\xa1\xc0\xec\xe8\x80\x96\x45\xe2\xd4\x4d\xd9\x05\x4c\x46\xad\x4b\xa1\x58\x7e\xa3\xd9\xe3\x49\xee\x28\x90\xf5\x23\x82\x52\x43\x20\x55\xa3\x6c\x1a\xc3\x43\xd7\xff\x1c\x66\x77\x23\x2f\xd0\x23\xfb\x25\xd1\x24\xfc\x49\x52\x1a\x93\x22\x33\x9d\x93\x1a\xfc\xd3\xf9\x04\xeb\x91\x40\xb9\x74\xc6\x86\xbf\x5f\xbd\xf7\x72\x10\x2d\xfb\xe7\x98\x72\xf8\x2c\x4f\x65\x3d\xda\xd8\x9f\x9e\xca\x7c\x64\x28\x82\xd9\x5c\x1a\x04\x53\x20\xdc\xcf\x70\x1b\x1d\xb7\xf2\x6f\x9c\xb4\x83\xb1\x06\x79\x16\x0f\x7d\xea\xc7\x3d\xb8\x79\x53\x3a\x59\x2e\xdd\x1c\xc0\xa7\x5b\x7b\x6e\xfa\x1b\x99\x52\x14\xe2\x53\xd2\xa9\xf3\x2c\x2b\x0f\x31\xec\xb2\x87\x98\xe0\xa6\xb3\xbf\xa5\xe6\x7e\xe6\xfd\x23\x6e\xeb\xf3\x01\x87\xd1\x1b\x85\xc8\xfa\xee\x9f\x96\x55\x3d\xfd\xd0\xb2\x23\x9f\x38\xa1\xfc\xd0\x69\x58\xf0\xf6\x89\x08\x35\xae\xdd\x65\x38\x3a\x03\xf9\x87\x42\x79\x41\xe1\x79\x72\xec\xd3\x8f\x34\xab\x3f\xc0\xeb\xc7\x56\xa0\xf8\xa6\x9e\x17\xdc\xc4\xb4\xca\xfe\x54\xd5\x0a\x80\x6f\xed\xa4\x81\x7b\x7f\x87\xe5\x05\xd4\x6d\x84\x5a\xd4\x59\x3f\x72\x1f\xd7\x51\x23\x6d\x4f\x0c\x87\xd3\xf8\x54\xf7\x0b\x6b\xb6\xcd\xef\x9d\xc0\x47\xbc\x6e\xff\x0b\xff\x83\x2b\xbd\x0f\x8e\xa8\x61\x08\xdc\x7d\xd1\x50\x05\x4b\x97\xc3\x80\xa4\x9d\xed\xe7\x7f\x21\x8e\x6e\x55\xc1\xac\xa9\x14\xc0\xfb\x12\xbc\xde\x72\x90\x84\x9b\x37\x5b\x48\x95\x19\x9a\x1c\xfa\xe6\x2f\x03\x92\x4b\xd4\x1c\xe9\x81\x61\x81\x3a\xfa\x0a\x85\x9c\x80\xec\x82\x51\xfa\x86\x87\xe2\xb8\xa1\x6b\x2e\x2f\xb3\xd8\x27\x58\xdd\x1b\x38\xff\xfe\xf3\x60\xd5\x0f\x01\x25\x73\x40\xd0\xb9\x33\x06\x1d\x66\x45\x0f\x1a\xf5\xda\x35\xb8\x9c\xc7\x65\x4f\x72\x24\x3b\x0e\x33\xfd\xf0\x26\x04\x5a\x30\xf2\x21\xd3\x05\xf6\xce\x85\x30\xef\xce\x5d\x05\x88\x8f\x42\x52\x43\x8b\x5f\x01\x40\xc7\x35\xfd\xe8\xcd\x58\x63\x7c\xa0\x2f\x89\x47\x2a\x2b\xc0\x5d\x0a\x65\xed\x44\x1e\xc9\xb6\xc1\x5b\xac\x4d\x65\x88\x56\xb6\x86\x4b\x37\x38\x10\x11\x3d\xbd\x36\x68\x06\x38\x1a\xdf\x21\xf6\x79\x80\x19\x4e\x80\xbc\x36\xf1\x10\xda\x50\x87\xdd\x4f\xb9\x29\xf3\x63\xea\xdb\x8b\x83\x36\x20\x90\x81\x80\x16\x48\xd4\x44\xbe\xd1\x56\x17\xb4\x7c\x26\xea\x26\x6c\x7c\x3a\xa8\xc4\xbe\x90\x67\x1e\x1b\x15\x1f\x97\xfa\xe9\xca\xc1\x9c\x47\x3d\x62\x84\x7c\xb2\xf5\xbd\x9e\xf2\x07\x10\xf5\x47\x81\xe6\xfd\xe7\x7a\x56\xd9\x0e\x4c\x55\x7f\x1d\x26\xc6\x59\xca\xe2\x01\x5a\x65\xaa\xb7\x27\x41\xe8\xe5\xc5\x3e\xec\xfd\x53\x09\xd1\x87\x20\x65\xd0\xde\x63\x20\x83\x54\xe8\xf7\x9f\x5d\x1a\x87\xca\xd6\x1e\xd2\x19\x77\x1d\x01\x84\xbb\xa5\x74\x77\xde\xe4\xfd\x7c\xda\xad\x38\xcf\xb4\x47\xb8\x6f\x97\x9e\xfd\x5e\xbe\x15\x4e\xfd\xf7\x0c\x1d\x25\x17\xda\x7b\x39\xdb\xb4\xe4\x43\x8b\x1d\x6b\xf7\x1d\x7b\x0e\x09\xa9\xcb\x5c\xfa\x16\x5f\x11\xc3\x47\xc4\x22\x2e\x7f\xbc\x19\xf5\x18\x25\x2e\x32\xfe\x90\xc0\xf8\x34\x2e\x15\x10\x1f\xc3\x29\xe5\x3e\x56\x20\xbb\xfc\x86\xf7\x90\x86\x8f\xd8\xf8\x6b\x9b\x04\x24\xbc\xee\xa6\xef\xf2\x30\xd2\xfd\x5d\x24\x95\x72\x0d\x71\xb7\x1b\xfe\x10\x30\xba\xaa\xcf\x00\xd7\x51\x9c\xb0\x7b\x0f\xe7\x09\xa3\xf9\x1c\xeb\x6b\xe9\x0d\xc4\xa7\x17\x66\x9a\x48\x55\xb4\xdf\xdc\x3d\xc1\xf0\xa0\xd7\x28\x39\xb4\x15\x26\x60\x7a\x4d\x44\x2a\x2e\xb1\x93\xea\x7f\x1d\xee\xfc\x75\x20\x50\xfb\xb7\x54\x4d\x75\xd8\xaf\x81\xc1\x43\x97\xe6\xbd\x5a\xff\xab\x1b\x2b\xbe\x8d\xac\xb3\xd8\x44\xec\x7d\x10\xe3\xfa\xe5\xef\xc3\xdf\xa8\x2f\xb3\xaf\x45\xdf\x6f\x6f\x39\xd1\x0e\x0d\xf1\x72\x79\x53\xb4\x8e\xd5\xfd\xd0\xad\x54\xc1\xf7\x80\x13\x53\xff\xd8\x12\x24\xa8\x7e\x1e\x05\xc4\x43\xe3\xa3\x3b\x90\xc6\x15\xcf\x99\x43\xf2\x5d\xe5\xfe\xd6\x7a\xeb\x93\x96\x45\x8c\xf4\xf9\xfe\xb1\xfd\x3f\x57\xdf\xb6\xe5\xaa\xce\x33\xfb\x2e\xb9\xe9\x9b\xfd\x52\x06\x1c\xa0\x03\x98\x8f\x43\x32\xe9\xa7\xdf\x2a\x55\xc9\x64\xfd\x73\xad\x31\x90\x09\x49\x68\x02\xb6\x25\xd7\xc1\x7e\xd9\x41\x57\xc6\x13\x13\x3d\x04\xdd\x35\xe9\x2e\xea\x5c\x6f\x8d\xb4\xe3\x33\x64\xf8\xba\x28\xb9\x74\xee\xa3\xa2\x9d\x10\x3d\xc2\xb6\x50\xfd\xd7\x66\x33\x10\xb7\xa0\xe9\x54\x17\x66\xaa\x5d\x89\xed\x66\xf3\x4d\xbe\xb4\xfa\x75\xf5\x70\x76\x5d\xb9\x58\x38\x97\x88\x0d\x96\xf5\x4b\xf5\x70\x74\x0f\xa6\x4a\xf9\x3e\xc8\x7b\x08\xdf\x46\xbe\xcf\xfe\xec\x0f\xd7\xe4\x77\x37\x4e\x7e\x88\xe7\x0d\x54\x64\x65\x87\x27\x99\x12\x20\x5c\x9d\x2a\xae\x8f\xa4\x0d\x4a\x65\x7e\x43\x0e\xc4\xa3\xf0\xd5\xee\xf4\xfb\x75\x23\x68\x8f\xfa\x74\x5f\x9e\x74\xce\xf3\x98\x62\xf1\x13\x90\x00\x4a\xd1\x8b\xbe\xad\xd5\x7d\x0d\xb0\x8c\xc7\x5e\x1d\x6a\x57\x61\xea\x50\x61\x9e\x58\x1d\x47\x48\xf8\x30\x69\xe9\xd9\x2b\x14\xfc\x98\xa7\x8d\x6e\x21\xbc\xdc\x96\xd8\xdb\xa4\x5b\xab\x39\xb1\x57\xe8\x30\xe7\xf3\xed\xca\xde\xb3\x4b\xb3\x2a\xaa\x16\x05\xd0\x20\x8d\xfb\x25\xf2\x76\x47\x3a\x5c\xf7\x53\xb2\xbc\x0e\x5a\xa7\xca\x08\x65\xb0\xe9\x86\x80\xf1\x3e\x5f\xe4\xdd\xd0\xd2\x0d\x14\xaa\xcc\xb7\xb9\xe0\x66\x23\x19\x83\xbc\x0a\x7e\x60\x93\x13\x2d\x7b\x39\x56\x60\xbb\xd8\xb5\x79\x43\xab\xe9\x5b\xe0\xf0\xd9\x5a\x6e\xdb\xc8\xb5\x9a\x45\x5a\xfa\x5a\x0e\x45\x42\x11\x10\x21\x53\xa1\x06\xa5\x42\x01\x9c\x0c\xc7\x90\x62\xaf\x15\x2f\x00\xf4\x40\x1b\x4e\x94\x0e\x1f\xe8\x6e\xc9\x67\xfb\x75\x26\x31\xe9\x49\xde\xfe\x72\xa7\xb4\xce\xef\x56\x61\x83\x06\xf4\xd9\x86\x07\x65\x17\x00\x34\x97\x86\x9e\xbf\x98\xe2\x33\x7d\x35\xf4\x75\xf3\x2c\x1f\x18\xb7\x8b\xac\x3b\x6f\xa7\xca\xb0\xc4\xb3\xa8\x39\x83\x12\x1e\x4e\x91\x32\x7f\x2c\xc2\x0b\x30\x57\x6f\x03\xb7\xde\x86\x72\x14\x70\x01\x5a\xa6\x1f\x1d\xd3\xcd\x45\x7f\x9b\x43\x48\x5e\xda\xa6\x28\xbb\x82\xb9\xae\xf9\x8f\xcc\x9d\x2c\x00\xb9\x9a\xcb\xff\x23\x96\x8b\x3c\x42\xb7\xc7\x40\x3f\xd8\x90\x33\xb9\xde\x39\xf4\xbc\x3c\x8c\x17\x63\x39\x02\x58\x02\x51\xc6\x87\x2a\xd8\xec\x02\xcf\x12\x74\x46\x77\xac\x9c\x94\x0d\xb1\x6d\x5c\xf2\x79\x92\x9b\x24\xca\x0a\xda\xbb\x55\xb8\x47\x72\x7f\x8e\xda\x50\xca\x82\x3a\x66\x3f\xbe\x05\x3b\x80\xdb\xa4\x64\xc5\xe0\x38\xe9\x9b\xf5\x88\xfc\xbd\xf5\xf9\x06\x61\x09\x98\x4e\xa1\x27\x7a\xed\x6a\x06\xbf\xdc\xa2\x2e\xd4\xa8\x7d\x89\xd4\x23\xac\xb9\x27\xd9\x5f\xda\x44\xde\x7f\xa8\x84\xc5\x7b\x5f\xd6\x86\x24\xa5\xd6\xc3\xb1\x56\xc0\xed\x22\xb9\x68\xae\x51\x9f\xb1\x8a\xd1\x54\xab\x5b\xd0\xc4\xb1\x40\xc8\xa5\x71\x14\x9e\xb9\x74\xed\xac\x34\x5f\x1c\x0f\xe4\x47\x03\x8a\x4d\xe0\xe7\x9b\x2d\x5c\x7f\x6c\x1e\xfc\xd1\x56\x7c\x6e\x24\x3a\xa4\x84\x40\x64\x5a\x48\x06\xdc\xfe\x02\x1b\x9c\x01\x43\x38\xb5\x30\xdb\x94\x9d\x5e\x76\xf6\xb7\x08\xd3\xd6\x4c\x67\x96\x2f\x82\xb3\xc9\xb5\xc0\xd0\xd8\x7d\x47\x90\x83\x3d\xb7\x49\x35\x55\x98\x73\xb1\x0b\x07\x51\xd1\xf7\x10\x02\xdc\xe4\xac\x85\x6b\xeb\x39\x9a\xb3\x67\xd4\x9e\x54\x6e\x6f\xc4\xa7\x69\x00\x41\x14\xab\xfb\xaf\x94\x17\x89\xdd\xd7\x47\x45\xe4\x26\xbd\x6f\x09\xe8\x5d\x03\xbc\xac\x2a\xab\xf8\xf3\xe6\x00\x17\x72\xc8\xb7\x99\x0b\x7a\x16\xf5\x81\x1d\x08\xdc\x40\x22\x74\xbe\x49\xac\x11\x34\x20\x55\x7b\xc1\xa1\x41\x29\xda\x45\xb7\xd3\x8b\x78\x85\x97\xde\x0b\xea\xb4\x9c\x36\x53\x5b\x91\x09\xed\x6b\x95\xbc\x25\xad\x2f\x43\xc3\x13\x69\xe6\x34\x92\xb0\x7d\x48\x4c\x82\x8d\xad\xb4\x9a\xe5\x20\xbf\x22\xa2\x00\xec\x60\x5f\xc3\xde\x03\xe2\x01\x32\x3a\x79\xfb\x96\xd2\xd7\xa5\x75\x74\x5f\xa3\x64\xa7\xd7\xe1\xfa\x77\xab\x2d\xef\x43\xa0\x37\xec\x09\x22\x04\xc7\xeb\x67\x7c\x72\xd2\x26\x54\x00\x5d\x52\x7d\x00\xfc\x17\xd6\x55\xae\x7f\x3b\x54\xdc\x2d\x9a\x36\x38\xf8\x75\x81\x56\x35\x94\xb3\xf9\xed\xcb\x15\x3a\xd4\xb4\x24\x96\x62\xb5\x5e\xc4\x9a\xb9\x0f\x69\x4a\xbf\x5d\xc1\x3a\x56\xd0\x20\x49\x2d\x04\xbf\x5d\xe0\xed\x8c\xc2\x49\x02\x56\x80\x00\x01\xd7\x26\xd1\x29\x58\x2f\xbc\xdc\x0d\xc7\xa9\x2a\x4c\xfc\x88\x2a\xdc\x91\xc6\x0d\xa5\x55\x9e\xd7\x28\xfa\xbb\x4d\xfb\xe9\x3b\xc0\x3f\x02\x2a\xb7\xa8\xd5\x71\xf6\x9a\x9e\x36\xd3\x5e\x14\x8d\x5e\x9f\x48\x36\x54\x0a\xb1\xf0\x55\x64\xb6\x5f\x19\x89\x3a\x25\xa7\x15\x7b\xd8\x9e\x73\x48\x50\x42\xb0\x1a\x88\xd4\x9a\x5d\xa7\xe6\x82\x4f\xad\x47\xee\x41\x8c\xa3\xfe\x46\x97\x14\xbe\x38\xe7\xb8\x4a\x19\xbc\xb4\x76\xcd\x0e\x70\xba\xc2\xa9\xf5\xb2\x5b\x6e\x1f\x2c\xef\xb6\xf8\x73\x72\xfd\xea\xb3\x8d\xf2\x4c\x07\x59\x9e\x03\x1f\x26\xf7\xb3\x2c\x40\xad\x7b\xe3\x93\xe0\x4c\x79\x59\x33\x01\x60\xb0\x8e\x3e\x3d\x73\x3f\xd0\x7f\x0a\xb8\x06\x03\xad\x6a\xad\xfe\xfb\x7c\xfd\x21\xb3\xd0\xc0\x1e\x8c\xa1\xcd\xee\xf2\xd5\x01\x43\x60\xe6\xf6\x51\x25\x0a\x5b\xbd\x94\x34\xb7\x70\xcc\x01\xe9\xf0\x07\x1d\x77\x3f\xb7\xff\xf6\x27\x91\x3f\x00\x71\x7b\x5f\xa6\xf5\x38\x7c\x1b\x81\x36\x70\x9e\xba\xa5\xb7\xce\x65\xc7\x72\x9b\xff\x1e\xef\x32\xbd\xf6\x4f\xea\xfd\xaf\x7d\x8f\x7f\x0b\xf5\x43\xde\x23\x34\x56\x76\x46\x63\xa0\xf2\xdc\x7d\x54\x13\x59\xa2\x0f\xe0\x4f\xce\xe4\x13\x56\x74\x2a\xeb\xbd\x69\x2a\xa2\x08\x6c\x4b\xc6\xc4\xe4\xbd\xf3\x30\xfa\x5a\x25\xe2\x74\x0d\xa7\xf0\x0b\x17\x37\x1c\x18\xde\xf1\x2d\xc9\x2e\x7a\x61\xd4\x8d\x4c\xea\xcf\xd3\x97\x47\x4f\x18\x5d\xf6\xc4\x32\x08\x6c\x72\x42\xbf\x92\x43\xa9\xa5\xd8\x81\x36\x40\x65\x30\x60\x05\xa3\x63\x29\x26\x21\x17\xc6\x50\xa1\xa9\x7b\x64\x5d\xce\x37\x52\x17\xa8\x36\xdc\xcc\xf4\x94\x48\x37\x99\xf2\x4b\xc4\xad\x9e\x8c\x73\x69\xc3\x2b\xc0\x19\xf2\x9b\xe8\xf2\x96\x2f\xee\x0f\x42\x16\x1c\x14\x70\xee\xac\xae\x40\xd9\x5a\x65\x8c\x03\x00\x7c\xe1\x11\x2e\xae\xc9\x1d\xee\xd9\xc6\xd5\x78\x87\x25\xf0\x55\x16\xf7\x6d\xeb\x43\x9b\xf6\xb5\x5a\x11\xc5\x02\xb6\x3e\x25\x2b\x6f\x26\x68\x41\xb9\xb9\xf5\x62\x76\x87\xc8\x75\xd5\x0d\x55\x29\x28\x48\x0c\x83\xb4\xf9\xbd\x81\x62\x50\xc5\x34\x70\xfa\x72\x58\xa7\x26\xbf\x61\x54\x57\x77\xf8\xff\x3f\x82\x8a\xcf\x1f\xff\xc0\x53\xe4\xa0\x08\xa4\xc6\xab\x86\xfc\xc3\x26\x5c\xdc\x42\xbb\x46\xaa\x01\x70\x0c\xf5\x7e\x0e\xd6\xf8\x1a\xf7\x8e\x71\xb5\xfd\xfa\x9b\x85\x7c\x70\x05\xee\x86\xd3\x95\x83\x86\xdb\x07\xcc\xa8\xfc\x34\x98\x11\x57\x07\xd8\xb1\xbb\xe2\xcd\xc4\x74\x1e\xc3\x39\x0b\x0e\x7f\x0c\xdb\x19\xf0\x3f\x8b\xab\x55\xe3\x81\x89\x5a\x64\x76\xe0\x00\x49\xdc\x94\xa2\xdc\xba\x55\x49\x09\x89\xe9\x0e\x50\x9b\xd6\x9b\xf8\xef\x60\x37\xbe\x74\xba\x97\x14\x17\xa7\x26\x79\xc0\x65\x00\x01\xc1\xbd\xc2\x6d\x84\xe5\xeb\xb6\x09\x53\x07\x15\x1d\x3a\xe1\xee\x2e\xa5\xd0\x88\x4c\xe5\x72\x3e\x5c\xe8\x46\xde\xb8\x3f\x2a\x54\x62\xe4\xaf\xb6\x7b\x5f\x90\xef\x90\x41\x38\x82\x9e\x7f\x90\x86\x10\xcb\x7f\x0b\xca\xf2\xb9\x62\x1d\x94\x50\x01\xf4\xad\x84\x46\xcc\xeb\x0f\x83\x9e\xca\x01\x2e\x05\xf0\xa8\xa0\x09\x82\x3b\xce\x46\x29\x81\xb7\x28\xf3\xb0\x33\xa4\x5b\xa2\x5b\x4f\xf7\x2a\x89\xec\x94\x5a\xf7\x48\x42\x9c\x1e\xe7\x8f\x54\xd4\x80\x95\x0d\x03\x45\x36\xd3\x8c\x64\xdd\x63\x22\x40\x8e\x10\x24\x75\xf8\x9c\x76\xc9\x60\x6d\x77\x17\xcb\x10\x94\x06\x7e\x5a\x9c\x7d\x94\x31\x85\xed\xb0\xf1\xb5\x4a\x7c\x83\x22\x7f\xd5\x48\x57\x03\xe0\x09\x99\xf0\x52\xed\x8c\xc4\xfc\x6d\x0b\x68\xc4\x06\x3a\x12\x57\xf9\x89\x94\x47\x99\xe8\x13\x2a\x10\x7b\xe0\x94\xb0\x92\x2d\x6d\x05\x00\xa2\x42\x67\x9a\xd5\xb3\x7d\x71\x64\x04\x61\x15\xe5\x43\x71\x1c\x35\x50\xe9\xe1\xb1\x80\x57\xe8\x98\x24\xd0\xa8\x45\xfe\x84\x07\xb4\x42\xb1\xf0\xfc\xfb\x3c\x06\x71\x60\x9f\x73\xf5\xbe\x8d\x1a\xd1\x3e\x65\x62\x3e\x6c\xbb\x16\x19\xca\xa3\xe1\xf0\x82\x29\x05\x72\xda\x86\x0e\xbb\xb9\xa9\x18\x30\x86\x1a\x38\xd6\x46\xf4\x79\xa3\x2a\x6a\xa2\x66\x09\x61\xe1\x86\xb6\x71\x44\x57\xa5\xe3\xdd\xb8\x56\xf0\x08\xa7\xbb\x33\x74\x55\x00\xc5\x70\x08\x4b\x5a\xe0\xb7\xdf\xe1\x60\x37\x65\x11\x4f\x21\x90\x19\xf1\xba\x34\x06\x30\xd5\xf1\x53\xb3\xe4\x08\x93\x3c\x22\x37\xd2\x07\x90\x0c\xc5\xf3\xc9\xed\x0f\x35\xba\xb1\xec\x28\xb8\x17\x44\xc4\xf4\x41\x19\x65\x75\x55\x66\xf7\x2c\xde\x2e\xf4\xc6\x5b\x16\x5c\x76\x32\x7b\x76\x7b\xf2\x57\x76\x87\xd4\x18\xe7\xc2\xec\xde\xd2\x6b\xd5\xdf\xd4\x06\x7a\xdd\xa2\x2d\x57\xa4\x92\x35\x2a\xda\xa5\xf5\x7a\xbd\x1f\x1d\x5e\xcf\xbb\x93\x8d\xe4\x91\xec\x5a\x02\x02\x74\x4c\x55\x61\xc3\x42\xed\x4a\x73\xb0\x3d\xb6\xb3\x17\x70\x9a\x32\x02\x77\xe4\x90\x80\xb3\x2b\xd5\xfa\x15\xac\xfd\xed\x21\x55\x81\x4a\xa7\x47\x43\xbb\xc1\x74\x11\xd8\x63\x17\x2e\xc4\xce\x5a\x6f\xa6\x58\x1a\xb2\x21\xa2\x44\x22\x8b\x05\x89\x3d\x8e\x69\xb8\xb1\x41\x99\xb0\x10\x69\xec\x6c\x55\x35\x12\x33\xca\x25\x09\x14\x11\x2e\x66\x81\xd6\x20\x52\x8d\xaf\x79\x02\x2f\x14\x84\xd0\x82\x08\x82\xb0\xb1\xe5\xea\x2e\xa1\x96\xcd\xfc\x53\x05\x79\xec\x1a\xbe\xa0\x8e\x1e\x46\xbb\x2e\xa5\x7d\xe3\x47\xa6\x00\x7c\xf8\x8a\x0b\x3f\x7f\x8e\x35\xac\xcd\xe6\x4f\x21\x61\xbe\x41\x75\xab\xda\xf5\x82\xf0\xc4\x23\x74\xdf\x5a\xf0\xd4\x8e\x00\x7b\x74\x00\xd0\x84\xcd\xd8\xe6\xaa\x87\xbd\x34\x16\xda\xf0\xf6\x05\x30\x5d\xc4\x22\x6b\xe4\x6a\x28\x0c\xb3\x9e\x7e\x99\x03\x76\x92\xaa\xae\x7a\x5a\x03\x56\x92\x26\x9d\x01\xc0\x89\x7e\x58\xc5\x88\xd4\xc3\x2d\xb1\x8a\xc7\x1d\x55\x77\xb8\xcf\x51\xda\xc0\x26\xce\xbc\xc4\xff\x3b\x9d\x30\x07\x52\xe7\xe4\x5b\x5f\x09\x50\xd1\xcd\x5a\x1c\x60\xd6\x73\xdb\x4f\x51\xef\xcf\x4d\x7b\xfa\x8a\x0d\x09\xb0\x86\x3d\x13\xa4\xef\x9f\x90\x3b\x0b\x48\x05\x1a\xf7\xf2\x13\xc1\x23\x5c\x96\xa8\xed\x5a\xc1\x42\x69\x70\xd4\x23\x01\x99\xf5\x2a\xb2\x5e\x5a\xa2\xe7\x56\x01\xb6\x57\xc7\x65\x87\xd4\x3a\x16\xe9\xc9\xb0\xc7\x14\xf1\x10\xe4\xcb\x46\xb2\x77\x92\x2e\x2a\x46\x35\x2f\x54\xd0\x61\x18\x8e\x96\xf1\xd3\xb8\x79\xf0\xbe\x96\x30\x1c\xce\xff\x29\x86\xac\x31\x4a\x01\x2e\x72\x86\x5b\xf0\x44\x81\x75\xfb\x89\x5d\x55\x40\x92\xb9\xd0\x31\x38\x42\x7c\x00\x03\x5a\x42\x97\xb3\x8e\xff\xc6\xe0\x6a\xaf\xe3\x9b\x6a\xe5\x63\xcc\xdd\x50\x12\x5b\x88\xd9\x5c\xc7\xdc\xea\xa8\x4e\x04\x7b\x4c\x91\xf4\x07\xc4\x60\x4f\x95\x83\x2c\x13\x61\x2c\x83\x0d\x21\x54\xb6\x0e\x52\x9f\x5d\x9f\xcf\x27\x75\xd9\x8f\x1c\x62\x06\xba\xdc\xd9\x9d\x33\x43\xeb\x40\x58\x13\xc6\x85\x07\x6c\xe7\x9b\x09\x1f\x6e\x35\xe7\xfb\x54\x6b\x62\x99\x08\xdb\x0d\xd2\x12\xd0\x66\x53\x09\x79\x15\x63\xa5\xcb\xcb\x8c\x2b\xa9\xdf\x55\x08\x01\xde\x95\x8c\xec\xc7\x79\xd1\x45\xd8\x45\x8c\x09\x0e\x59\x38\x71\x85\x21\x5f\x72\x4f\xf9\x35\xcd\x12\x4b\x98\x32\x2c\xfb\xbf\x54\x14\x46\x97\x5d\xd4\xab\x10\xd7\xf1\xfd\xe5\xef\x8f\xf2\xeb\x81\x2a\xd9\x1f\xa1\xfc\x1e\xd5\x49\x6f\xc5\xf2\x96\x2b\xc1\x73\xfe\x8f\x70\x4a\x21\x0f\xff\x64\x91\x06\x61\xc7\x97\xcf\xc3\x09\xfa\xc2\xa1\x4c\x5c\x90\xa5\x50\xbc\x7f\x09\x12\xdb\x0e\x24\x36\x9e\x08\x6b\x77\x65\x93\x6d\x0f\xfc\xda\xb8\xed\x64\xf5\x1a\xf3\x23\xdf\xeb\xff\x06\x45\x44\x75\x5a\x1f\xea\x9e\xcb\xfe\x3a\xcc\x69\xc6\xd0\x4e\x38\x84\x75\x91\xbd\x40\x49\xaf\x0f\x6f\xf2\x45\x52\xe3\x55\x3a\xc1\xef\xf0\xc5\x86\x9e\x60\x07\x2c\x05\xc6\xec\x1e\xbc\x0b\x4a\x66\x8c\x8f\x6a\x9a\x5c\xca\x7f\xe5\x13\x1e\x04\x91\xf0\x6a\x2d\x82\x8b\x2d\x70\x0c\xf6\xad\x25\xf2\x5e\xad\xf3\x46\x0b\x61\x7e\x77\xd6\x72\xbc\x89\x66\xc0\x8b\x25\xa5\x9a\x32\x2f\x2e\x7a\xfa\xa0\x5e\x7d\xe8\x39\xa4\x2a\x8a\xef\xbc\x0c\x7e\x01\x78\xac\x61\x95\x2c\xe7\x64\x97\x6c\x00\xf9\x3a\xc7\xa7\x25\x0d\x1b\x8b\x0d\xe7\x84\xaf\xbc\x92\xe5\x0f\x8e\x9f\xb0\x74\xc9\x71\x1a\x96\xbe\x26\x3a\x41\xb8\x50\x9b\x2c\xdd\xe6\x72\xfc\x25\x05\xd6\x35\x3d\x6f\xb7\x20\x78\x28\x50\x9a\x1e\x9a\xd8\x74\x5d\xfe\x52\x6f\xb6\x06\xed\x95\xcb\x16\x0a\x6a\x20\x69\xea\x27\x75\xf0\xea\x83\xd8\x15\xad\x59\xcc\x76\x19\xb4\x4f\xb4\xcb\xb9\xa2\xe0\xe7\x32\x38\xe7\x65\x2e\x9d\x50\x2e\x9d\x65\x11\x0e\x0a\x81\xd4\xba\x66\xc1\x3e\x05\x64\xb6\x20\x51\xb3\xc8\x7d\xad\x09\xb7\xc8\xa4\xb4\xe2\x4b\x0b\xa2\xea\xec\x97\xaa\x7e\x0e\xd1\x07\x45\x59\x44\xd1\x39\x7b\x61\x8e\xfb\x30\x4c\x9c\x84\xb8\xd8\x05\xaf\x23\xd1\x4c\x39\x94\x2e\xfc\x5e\x35\x0c\x49\x07\x22\xf6\xfd\x50\xf0\xe1\x82\x7b\x31\xc1\x66\x92\x82\xa8\x5a\x10\xa8\x12\xa9\x52\xee\xba\xfb\x0a\xfc\x78\x01\x5e\xa0\xe8\x12\xf0\x98\x90\xdb\x03\x87\x2d\xcc\xb0\x51\x37\x2f\x4d\x52\x98\xda\x38\x20\x9f\xef\x1c\xda\xfe\x04\xe1\x24\x57\xa7\x6a\xd5\xb3\xcd\xa9\xab\x35\x95\xe9\x0a\x88\xb9\xf5\xdf\x3e\xc7\x70\x59\x7e\x87\x9c\x08\x1a\xe3\xa1\x80\x33\x85\x1c\x2e\x08\x44\xd4\x4f\x28\xd6\x09\x10\xe2\xf2\x0e\x9d\xfe\xd1\x0b\x45\x94\x80\x10\x38\x66\x72\x57\x0e\x79\x52\x6b\x1f\x62\x46\x2d\x6a\x7c\xfc\xb8\x0c\x89\x37\x56\x33\xfd\x71\x0f\x0d\x09\x8a\x44\x08\x28\x13\xc0\x41\xcb\x30\xdf\x89\x48\x19\x51\x47\xb1\x6e\xa8\x51\xdd\x3d\xf8\x26\x81\x4e\x26\x8d\xd6\x96\x1f\x5e\x55\x52\x29\xc0\x77\xaf\x73\xfb\xf3\x6f\xb4\xe0\xf8\xfb\x50\xb6\xf0\x45\xdb\x99\x97\x25\x1a\x6e\x15\xa0\x2e\xc1\xb2\x06\x21\x83\x60\xfc\xf2\xf3\xe6\xbe\x99\x38\x34\xeb\x0e\x7f\x5d\x8c\xc2\x3a\x18\x01\x6d\x16\xdf\xa6\xbf\x93\x6a\xff\x57\x58\x83\xff\xc2\x9f\xc6\xef\xd3\x5f\x20\xac\xb4\x93\xc3\xc4\xef\x28\x45\xd3\xdf\xb1\x42\x17\x7e\xb3\x25\xb2\x9c\x35\x58\x88\x2c\xc8\x81\x36\xf9\xf9\xdc\x34\x8c\xfd\xa6\xb9\x46\xed\xff\x96\xe2\x13\x61\xac\x45\xec\xbc\x61\x7e\x93\xcf\x3d\xa1\x67\x2d\x03\x80\x9d\x5a\x0c\xdb\x76\x63\x68\x6d\x48\xfb\x9f\xd4\x1c\x3c\x17\xf7\xaa\x23\xdb\x96\x08\xcf\x2c\x29\x0a\x1c\x73\x4b\x5e\xcb\x15\x20\xc8\x1a\x6e\xb9\x2d\x51\x50\x8b\x2b\x58\xc2\x62\x2a\x52\x3c\x27\xf7\x42\x16\xce\x07\xfa\x12\x59\xd8\x99\xee\x9c\x7a\xa1\x6d\xba\x8c\xf4\xa1\xa9\x5f\x27\xc6\xae\x60\x3b\x6d\x19\x42\xe9\x75\x5c\xbe\xf4\x31\x50\x04\x0d\x8c\x8e\x0b\x47\x48\x44\xd8\xa1\x36\x6f\xd5\xb7\xbd\x81\x99\x1c\xdf\x3f\xdf\x9e\x2d\x7c\xd5\xa6\x11\xbe\x8c\x04\x29\x7f\x75\xdb\x8e\xf6\x09\x8d\xb7\x91\x26\x46\xc3\x35\x13\x90\x22\x93\xeb\x73\xd3\xd4\x64\x38\x41\x39\x71\x30\xcb\x09\x37\x60\x0f\xe8\xd2\x30\x58\xe6\x43\x6f\x00\x40\x73\x78\x34\xba\xd6\x2d\x75\xcc\xe2\x06\x0e\x36\xe0\x87\xd3\xf5\x7c\xc0\x92\x1e\x05\x4a\xc0\xbe\x12\xff\x71\x28\xbd\x3a\xef\xa1\x04\x85\x73\xa8\xae\xbe\x00\x0d\xcd\x36\x1c\x9e\x1e\xdb\x87\x6f\x94\x99\x1c\xc6\x4e\x2a\x11\xb7\xc7\x9a\x4d\x0b\x56\x88\xce\x20\x74\xed\x06\x3f\xd0\xc9\x7e\x7a\x92\x86\x58\x3d\x09\x7b\x6f\xfe\x01\x01\xbc\xe1\x21\x2f\x96\x7b\x86\x44\x8c\x31\xb0\x3a\x3e\x1c\x32\x96\x97\x36\x13\xa8\x88\xfc\x0f\xe9\x37\x5a\x5f\xf4\x30\xfa\x11\x60\x86\xef\xda\xea\x40\xeb\x16\x05\x0e\xca\x7d\x54\x95\x89\x00\xdd\x24\x9a\x26\xf7\x50\x4a\xb6\x4e\xce\x7f\xdf\x7e\xfc\xfb\x63\x4a\xd9\x43\xad\xcf\x75\x75\xfa\xb1\x1a\x75\xf6\x10\x47\x93\x2e\xc4\x5e\x3d\x09\xc4\x03\x73\x89\x88\xea\x58\x30\x25\xc9\xcc\xf7\x69\xdc\x3e\x17\xdf\x23\x8c\xe1\xd3\xd7\xa2\x85\x11\x21\x59\xcc\xb1\x2f\xe7\x0c\xbd\x17\x42\x68\x60\x07\xae\x0a\x9d\xb8\x5f\xd1\xc8\x45\x30\x1a\x77\x66\x0b\xad\x05\x00\x31\xb8\xad\xb7\xe3\x53\xfe\x2a\xc0\xd4\xa8\x72\xca\xd0\x03\x1b\x51\x7a\x02\x66\xce\x7f\xbe\x29\x42\x26\x3e\xbd\x83\xa5\xa4\x44\x66\xf9\xe6\x69\xf3\xb9\x5f\x2d\x0a\x3d\xe1\x68\xc6\x03\x39\xdf\xe6\x4e\x64\x26\x15\xb8\xe3\x7a\x57\x02\xd9\xb4\x82\xbf\xdc\x12\xbd\x4f\xa8\x35\x00\x92\xca\x83\x73\x77\x83\xd7\x9f\xe9\xb8\x25\x7d\x9e\x69\x6b\x74\x91\x68\x17\x2e\xe7\x70\x7e\x39\xd7\x35\x1e\x5f\x32\x13\x16\xe7\xab\x1f\xaa\x49\x78\xdd\xf9\x8f\xac\xb7\xdd\xe3\xa4\x2e\x12\x29\xb2\x88\x10\x90\xe7\x13\x3f\xc2\x26\xec\x36\xe1\x27\xf7\x23\x3b\xe9\x9f\x1f\xb7\x30\x81\x7e\x10\xf4\x42\x3c\x8c\xa3\x63\x63\x3c\x07\xa4\xcf\x9f\x6d\x88\xa5\x6f\xb1\x0f\xa5\xb5\x88\x29\x3c\x9a\x6d\x66\x99\x6e\x74\x01\x6e\xa8\xc0\xbc\x34\x2e\x27\xb4\xdf\x5e\x06\x90\x23\x64\xd5\x25\xd0\x2f\xf7\xfb\xb8\x43\xbe\xe4\x4f\x21\x29\xf8\x92\x3d\xa9\x90\xea\x76\x24\x4f\x6b\xfd\xab\x2f\xf6\x0a\xb6\xc6\x31\xdb\x57\x38\x1e\xc0\xc6\xd8\x38\x48\x98\x48\xe8\x24\x76\x9b\xa5\x5d\xb1\x6e\xdc\x6d\x51\x15\x73\xe2\x9c\xfb\x04\xaa\x21\x7c\xcb\x34\x3d\x93\x6c\x08\xde\xf2\x15\x70\x44\x4b\x48\x4a\x40\x08\xeb\x88\xa8\xfd\xde\x7d\xbb\x1c\xf8\x65\x0e\x9f\x83\xb5\xdc\xfe\xe2\x6e\x50\x55\x5b\x18\x7d\x96\x2f\xb5\x8a\x3d\x34\x8d\xe2\x73\x7c\xdd\x4a\xe7\x50\x75\xab\xa9\x70\x21\x68\xc9\xbb\xdc\x66\x05\xe3\xed\x26\x7e\x10\x8e\xce\x3f\x14\xcb\x7d\x22\x32\xf9\xea\x5f\x7b\x1b\x06\xb8\xa1\x7c\x40\x53\x26\x99\x0a\xf0\xd9\xed\xc2\x9c\x2d\xbc\x06\xf8\x8b\x84\x1f\x3a\x8c\xd9\x02\xe7\x32\x47\x56\x0c\xc1\x40\x00\x7e\xf4\xbd\x4d\x33\xc6\x29\xa4\x63\x90\xc2\x46\x22\x40\xa5\x73\x86\xb6\x60\x2e\xcb\x8b\x0b\x6a\xed\x5f\xb6\x19\xf9\x6e\xf3\x2d\x9b\x1b\xf8\x8e\x0b\x0b\x51\xf4\x4b\x68\x2f\x10\x2d\x56\xfe\x38\xed\x79\x34\x7a\x7c\xed\x71\x74\x9c\xc3\x39\xad\xa1\xbd\xef\x68\x72\xc1\x5f\xd6\x70\x30\x07\x3d\x6f\x67\x28\xb2\x03\x23\x79\x95\x9f\x39\xd0\x31\x62\x54\x5a\x70\x46\x09\xae\x75\x8b\x68\x06\x94\xe7\x18\xbf\x2a\xf9\x2e\xd2\x41\xab\x01\x48\xb9\x05\xce\xe4\x13\xdd\x03\x4a\x7c\x92\xa2\xa8\xb4\xf4\x56\x00\x8f\xb2\xbd\x42\x5a\x03\xe6\x3a\x2e\x16\xe2\xd8\x98\xfd\x46\xc7\x3b\xce\xe5\x16\xc5\xb3\x26\x84\x40\xf4\x2e\x80\x5c\x42\xba\x63\x71\xf3\x43\x09\x1a\x84\x76\xc6\x97\xb9\x39\xe0\xbc\xd1\x37\xb7\x45\x32\x1c\x13\x3d\x60\x5b\xa8\x9f\x09\xa6\x52\x97\x8c\xdc\x64\x40\xe2\x19\xee\x49\xee\x03\x37\xe0\x2b\x0d\xcb\x6c\x50\xb5\x08\xa8\xa0\xbf\x57\x60\xae\x76\x54\x3d\x1e\x40\xe1\x60\x72\xb6\x03\x46\x26\x19\x99\xd7\x11\x0d\xd7\x58\x62\x29\x80\xb8\xa4\xe5\x2f\xf3\x08\xd5\x22\x1c\xb5\xe2\xd6\x66\x6a\x25\x2a\xf5\x43\x0a\x7c\xd9\x99\x62\xb7\xde\x47\x65\x45\xd5\xcd\x03\x86\x86\x47\x38\x86\xd8\x0c\x18\x6c\x68\xe9\xa6\xe4\x0c\xf8\x6b\x9b\xde\x15\xfa\x63\x1d\xf5\x7a\x4e\xc4\x89\xec\x7b\xe4\xd7\x10\xc1\xa8\x16\x0d\x09\x9e\xca\x7d\x4f\x63\xf4\xa4\x4a\x2a\xf0\x2a\x5f\x96\xf9\x29\x94\x7d\xa1\x75\x21\x8a\x3e\xc2\x2a\xc2\x6f\x1d\x16\x12\x9a\x50\xdb\x98\xc6\x86\x27\x8e\x04\xed\x08\xf0\x8a\x0d\x0f\xfe\x2b\xc1\xb3\x40\x30\x95\x63\x0a\x59\x8c\xfd\x6a\x0a\xa1\x1b\x67\xcc\x72\xa8\x8a\xa1\x23\x65\xa6\x66\x41\x27\x21\xff\x73\x12\xa7\xc1\xa2\x3e\x51\x40\x1f\xf8\x15\xbd\x79\x3b\xb5\x2d\x1f\x48\x72\x33\xb4\x2c\x41\xf2\x15\x88\x17\x29\xb5\x7b\x3b\x4b\x0a\x17\xe8\x95\x57\x30\x90\xed\xda\x9e\x42\x5c\xa0\x8a\xd8\xc4\x55\x6b\xca\xa5\x4a\x5b\x53\x8e\xb4\xa8\xc3\x6e\xca\xa2\x8b\xd3\xc4\x1a\x01\x2c\x11\xc4\x91\x03\x03\xd7\x37\x63\xd5\xda\x70\xe5\x8c\x12\x2f\xa3\x41\xa1\x6d\xd7\xce\xd8\x19\x28\x8d\x75\x93\x04\x49\x6c\x50\xe7\xac\x19\xed\xa3\x6e\x57\xfc\x06\xc2\x40\xd8\x0e\x69\xf6\x3c\xbb\xc9\xd6\x3f\xe5\x21\x53\x39\x43\x57\xbc\x8a\x76\xe4\x29\x48\x88\x0d\xca\x14\x0f\x2a\x65\x84\x4b\xfa\x87\xe0\x94\x2f\x9f\x09\x79\xe1\x37\x60\x57\x8e\x3a\xde\xd2\x45\xd9\x7e\x3a\x00\xc6\x13\xbb\x1b\x0f\xd3\x0a\x41\x08\x3d\x8d\x80\x2a\xc2\x09\xbf\xba\xb2\x8b\x83\xe6\x22\x19\xb4\x7d\x48\xe1\xf9\x60\x6f\x5d\x90\xa8\xe9\x4d\xed\x6b\x20\x60\x34\xfd\x1d\x6e\xfa\x91\xfe\x51\x13\xe2\xdc\xdb\xe1\x33\x1e\x00\x18\x27\x0a\x56\x5c\xbb\x80\x13\x58\xa7\xdd\x5b\x41\x39\xb6\x9e\x64\x9b\x10\x70\xb0\xb6\x56\xa0\x6d\xf6\xc2\xfb\x09\x12\x62\x5b\x3e\x28\xa6\x61\x5d\x5e\x22\xe8\xc2\x45\x31\xb0\xb8\xeb\x69\x93\xfb\xa6\x07\x6b\xcf\x2e\xbc\x8d\xed\xa3\xec\x15\xfe\x55\x44\x19\xb4\x31\xfa\x52\x39\x3a\x69\x29\x50\x85\xa0\xb0\x44\x2c\x3b\xda\x4c\xa7\x50\x01\x64\xc9\x6d\x27\xe1\xa3\xb4\xe8\xaf\xb4\x34\xa7\xb8\x4d\x0a\x60\x93\x25\x4c\x19\x72\x9d\x47\x02\x35\x94\xc3\x8a\xa1\x30\xed\x02\x06\xd4\xad\xdd\xa7\x6a\xa4\x4a\xf5\x74\x7f\x73\x48\x8f\xd8\xdd\xaf\x29\x6a\x7a\x3a\x44\x2c\xcc\xd3\xa5\x7b\x21\xbf\x74\x49\x5f\x14\x17\x97\x49\x1d\x88\x23\x21\xc3\x61\x43\x48\xe3\xbf\xbf\x7b\xa6\xcf\xa5\xab\x78\x99\x16\xbd\x51\x95\x39\x74\x2b\x87\x26\x62\x61\xbe\x2c\xd8\x2a\x22\xa9\xea\x65\xe8\x8f\x4a\x1f\xfb\xf7\xa0\x74\x86\xdd\x40\xf8\xd7\xf7\xbd\x34\x34\xce\x17\x27\xa2\x7f\x45\xb4\x82\x3f\xfc\x2e\xd8\xc2\xd4\xcf\x57\xfe\xaf\x33\x64\x7b\x2f\x98\x34\x62\xfb\x33\xd0\x58\xed\x73\xf9\xb5\xf9\x6c\xb1\x10\xf1\x01\xc8\x49\x68\x13\x76\xad\xb7\x35\x44\x14\xc7\x2c\x7c\xfa\xc6\xbe\xc0\xd9\x58\x1f\x17\xc0\x64\x30\xb8\x37\x8b\x3e\x61\x74\xc8\x66\x2b\x91\x0d\x94\x81\xe6\x1d\x93\x3b\x36\x03\x25\xf6\x41\xba\x7f\x45\x10\x6f\xcd\x14\xce\x18\x28\xae\xc9\x4c\xef\xc3\xf3\x79\xd0\x12\x82\x32\x96\x88\x76\xbb\x2d\xb5\x6a\x8b\xa6\x8d\x16\x33\x0a\x43\x93\x2f\x3d\x7c\x20\x4a\xe0\x7c\x01\x8b\xba\xf0\x91\xa8\x65\x18\x78\x88\xc7\x97\xa6\x7f\xc4\xcb\x84\x05\x8f\xa5\x9a\xf4\xc0\x48\xdb\x50\x08\x9b\xd9\x9e\x69\x93\x66\xc7\x8a\x7b\xd9\x23\xeb\xfc\xc3\x4c\x42\x1a\x1f\x1d\x51\x88\x1f\xbb\x61\x1f\x40\xcd\x6c\x4c\x5a\xdf\xa5\x0f\xb3\xc9\xb7\x65\x22\x44\x66\xd8\xe4\x9c\x88\x17\xeb\xdd\xce\x56\x6e\xf0\xdb\xe8\x2a\x93\x88\x33\x9d\xe3\xf3\x41\x3d\x14\xbf\x15\xdb\xea\x24\xb1\x05\x88\x40\xfa\x1e\x01\x95\x09\x21\x47\x7f\x8b\x9d\x73\xcb\x55\x92\x77\x68\x03\xbe\x41\x87\x9b\xa4\x25\x45\xc3\x89\x1c\x18\x9a\x12\xdb\x78\xcf\xa4\x57\x5a\xf2\x4f\xf8\x16\xae\xe0\x08\xbd\x22\x59\x22\xf7\xa5\x77\x40\x4d\xdc\x38\xe7\xfa\x22\x38\x95\xe2\x73\x01\x40\xf3\x3c\x39\x3c\x25\xf6\x9c\xc2\xae\xc2\x29\xb5\x8a\x87\xb1\xaa\x7d\xa8\x9f\x3b\x17\x58\xdd\x59\xbf\x11\x92\x21\x58\xa6\x7d\x57\x37\xcc\x13\xc6\x97\xc7\xa0\xf7\xf8\x88\x75\xbb\xca\x2f\xe3\x1c\x3d\x91\xb5\x3a\x98\x7c\x49\x92\x44\x58\xaa\xe3\x42\xff\xb2\xe1\x5c\x0f\xbb\x75\x89\xcc\x38\x99\x85\x1e\x27\xfc\x91\x3c\xc0\x93\xec\x01\xd7\x5b\x8e\x33\xe0\x22\x7b\xa2\x03\xfc\x76\x2a\xc7\x97\x79\x45\xb5\xcb\x73\x43\x0c\x17\xad\x80\x7b\x85\x50\x37\x40\xab\x10\x34\x33\x06\x58\x04\x72\xe8\x21\x1f\xf2\x62\x09\xc2\x11\x36\x7b\xfe\xc7\xa4\x91\xe0\x9b\x3a\x67\xf4\xe6\xb3\x0a\xb4\x61\x4d\x4f\xd4\x6e\x07\xd5\xd8\x90\x2f\xdb\xe2\x70\x4a\x3a\xa8\x80\x74\xb8\x30\x1a\x0f\x1c\x8f\x50\x37\xa1\x8f\xcb\x11\xdc\xf1\x63\xa4\x15\xac\x6b\x3a\x13\xf1\x7d\x7c\xd5\x33\xe5\x84\x51\x91\x31\x1b\x0d\x63\xdd\x12\xa3\xe5\x05\x1a\xc6\xfd\x87\x87\xe6\x10\x1e\x43\xb9\x3d\xc1\x50\x38\x30\x34\x85\x0e\x8e\x87\x3d\xa1\x1d\x51\x9a\x87\x25\xbb\x7e\x68\x5e\x54\x53\x03\xf8\x4a\x2a\x25\x4b\xf8\x52\x00\x2f\x73\x0c\xf2\xc6\x9f\x32\x68\xe5\xd2\xb4\x73\x3f\x8d\xd1\xdd\xb8\x1e\xc4\xd2\xac\x45\xc7\xd1\x1f\x9f\x61\xeb\x3d\xc3\x81\x0c\x85\x7f\x4f\x52\x5f\x76\xb8\x56\xa9\x50\x46\x36\xf0\xbd\xa4\x7b\xe2\x4c\x5a\xdb\x8e\xa5\x0d\x25\x94\x0f\x5d\xa4\x31\xe1\x71\x20\x9d\xbb\x53\x71\xcf\xa4\x9f\x04\x13\x3e\xee\xa1\xdb\x7f\x58\xb0\xdf\x5a\x28\xbe\x7e\xff\x09\x2f\x04\xeb\x0a\x7d\x93\x02\x31\xf1\x49\x2a\x26\xc1\x96\xe3\x96\x8b\xb9\x4d\x3a\xf4\xda\x6d\x69\xbc\x9f\x21\x7e\x61\x41\xda\x02\x91\x33\xbb\x14\x99\x87\xd3\x21\x4b\x8e\xe9\x49\xdd\x08\x4a\x7a\xed\x67\xe3\xf2\xff\x6f\x41\x78\xce\x8d\xd0\x28\xb7\xf5\x48\x4b\xf5\xe5\xbf\xb6\x02\xf9\x4e\xc6\x15\x43\x02\x8f\x7e\x05\x45\x10\xa4\x63\xe3\x80\xe9\x29\xb8\xb4\x4c\xa8\x95\x42\x68\xc8\x51\x6c\xd2\x2f\x80\x8b\x3b\x73\x74\xe1\xf6\xe8\x65\x97\xe8\xa4\x6a\x83\x71\x9a\x04\x15\x82\xdb\x0f\x5f\xb7\x07\x2d\x7c\xe7\x0f\x2f\x29\xd3\xa8\x43\x01\xef\x04\x44\x8d\xb4\x4b\x56\x57\x8a\x12\x1c\x08\xc8\x00\x2c\x34\x30\x9d\xf0\x55\x3e\xff\x24\x40\x7c\x0f\xca\x69\xb8\x70\x8a\x1e\x2d\x37\xf3\xa8\x3a\x19\x6e\xe4\x1f\x78\x1b\x28\xc3\x6e\xa3\x97\x9d\xf7\x12\x36\x11\x65\xbb\x57\x61\x30\x03\xb0\xe9\x89\x9f\x43\x01\xcc\xa0\xfe\x26\xc5\x39\x93\x1e\x3d\xe9\x7d\x61\x5b\xdd\x85\x34\x02\x89\x8f\xc3\x97\x4b\x46\xc5\xc1\x42\xda\xbf\xa4\xaa\xa9\x67\xf1\x76\xef\xe6\x4a\x98\x05\x6d\x45\x00\x5d\xf6\xe0\xf1\x9e\x02\x18\xc8\x83\x29\x6c\x62\x9d\xda\xb8\x4b\x57\xe5\xd6\x33\x77\x68\x50\x05\x06\xa5\xbf\x2c\x19\x91\x49\x52\x0a\x16\x50\x07\x57\x87\xbf\x2e\x4e\x9d\xf7\xd7\xd8\x09\xc0\xf3\xaa\x9e\x22\x6f\x97\x4d\x73\x8c\x75\xa2\xf3\xd6\x3e\x56\x9e\x8b\x85\x2d\xf1\xf5\x3b\x32\x28\x5e\x37\xe8\xaf\xfa\x76\xaa\x6e\x78\x3b\xd7\xae\x19\x76\x59\x5a\x3c\x63\xdb\xea\x4b\xf8\xb9\xc3\x15\x3a\x3f\x83\x16\x2a\xf7\x61\x3b\x25\x57\x0a\xb4\x51\xd6\xbe\x2c\x61\x5a\xe0\x7e\xf9\xa1\x43\x39\xa7\xee\x27\x3d\x84\x44\xca\x4b\x44\x2d\xd3\x62\xaf\x72\xc5\xb0\x06\xa4\x5d\x5c\x5f\x70\x41\x05\x72\xb2\x21\x29\x8c\x5b\x86\x14\x9f\x8b\xc5\x4f\x7e\x95\x73\x2a\x22\x5e\x85\x5f\x1b\x50\xa9\xf6\xd3\xcb\xff\x42\x46\xc8\xad\x0d\xc3\x60\x26\xaf\x9c\x95\xc3\x15\x45\xf2\x49\x79\x42\xd5\x73\x8f\x4b\x93\x89\xcd\xab\x76\xf4\x36\xce\x36\xee\x1d\xb8\x4b\x52\xcb\xad\x4f\x44\x02\x45\x1c\x48\xac\xb6\x6a\x14\xb5\x5a\xcc\x84\x3c\x4d\xfc\x09\x40\x6b\x84\x76\x10\x3a\xd9\xe3\x8f\x9d\x96\xdd\x78\xea\x71\x6c\x40\x0e\xbc\xd2\x15\x1d\x03\xb3\xf7\x1d\x53\xef\x99\x2a\x36\x0b\xef\xf0\xb4\xbc\x12\xed\x87\xa2\xfe\xb0\x27\xe7\x06\xb3\xce\x62\x93\xbb\x30\xe0\xb1\x19\x89\xcc\x57\xa6\x3f\xcd\x23\x21\x60\xf3\x11\x67\x12\x9a\x23\xfc\x9c\x09\x4e\xa4\x1b\xa9\xbb\x7b\x7a\x9d\x53\xe1\x77\x3f\xab\xa3\xed\x9e\x42\xad\x25\x8c\xd9\xad\xdf\x12\x1c\xea\x5c\x04\x96\xfa\xc2\xca\x28\xf6\x70\xfc\x7d\x67\xa2\xa1\xfe\xa9\xe8\x75\xd3\x61\x5d\xdc\x95\x1f\x0c\xea\x0e\x47\x2e\xd7\x51\xfe\xaf\xcb\x8a\xef\xce\xef\xb1\xaa\xd9\x1c\x20\xcc\x56\x0c\x53\xd9\x02\x57\xb4\xe4\x3e\xf6\x7e\x7b\xac\x83\xcd\x50\x75\x62\x26\x27\xc2\x56\xd4\x10\x5d\x45\xf9\xf6\xe9\x16\x73\x80\x56\x8d\x6b\x31\xf3\x15\x00\xf2\xf4\x51\x3d\xa0\x3b\x47\x80\x9d\xfa\xea\x23\x00\xa9\xe5\x49\x3a\x39\x4f\xac\x3b\xb5\xf1\x8e\x90\x0e\x01\xa6\xa9\x0d\x38\xd3\x96\xeb\xfb\x54\x9c\x7a\xdc\x88\xa6\x25\x3c\x60\xda\x54\x55\x69\x54\xd6\x46\xf5\x5f\x7d\xd6\x86\x59\xbb\x5e\xa5\xbc\x95\xdc\xcd\x5d\x9b\xc6\xbb\x12\x40\x90\xf8\xe5\x90\x4a\xf7\xe1\x04\x56\xda\x01\x10\xaa\xa5\x6e\xe2\x81\x76\xc9\xa9\x60\xb9\x05\x73\x26\x41\x8a\x96\x73\x69\xc7\x2f\xd1\x19\xfa\x32\xc8\x93\x05\x4c\xe0\xc0\x1e\xd9\xd5\x12\x6d\x01\x62\x34\x98\xcc\x3d\x28\x47\xd3\x8e\xab\x70\x2e\x9b\xc0\xdc\x36\x2c\x7f\xfb\xde\xac\x71\xcd\x02\x52\x64\x1f\x15\xc7\x25\xc1\xe9\x57\x71\x44\x28\x4d\x43\x4b\x13\x48\x5c\xb6\xc2\xfa\x54\x5b\x0d\x00\x8c\xae\xc4\x8c\x76\x2d\xd5\x64\xca\xc3\x4a\x39\x06\x2a\xa2\xf5\x1c\x34\xac\x58\xf6\x88\xf5\x87\x6b\x4c\x5b\x0b\x68\x8f\x04\x6f\x15\x4b\x07\x08\xf3\x81\xd2\x97\x16\x12\x56\x14\x0a\x03\xb5\x74\xf6\x35\xcc\x39\x27\xf9\xb3\x20\xf0\xeb\x35\x55\xa5\xb1\x15\xe3\x1b\x91\x49\x21\x55\x05\x6a\x60\xab\x67\x68\x1d\xa0\x58\xba\xf3\x54\x87\x52\x7c\xa2\xe8\xb0\x51\xc9\xd1\xdc\x8b\x2c\xd0\x2d\x08\x73\xf8\x15\x17\x51\xc2\xc8\x2e\x6f\xb3\x56\xe0\x18\x4a\x17\xf2\x6c\x84\xb6\x99\xef\x4b\xc7\x3d\x9f\x82\x4e\xcd\xe8\x62\x7a\x42\x6e\x61\x98\xa9\xc2\x35\x69\xba\x7c\x2e\xb1\x12\xb0\x12\x07\xb4\xc3\x29\x4b\x1e\xbb\x2d\x1d\x14\xef\xb0\xaa\xa4\x1f\x22\xc9\xbc\x69\x4d\x76\xe7\xd3\xa4\xe5\x1f\xca\x3d\xb4\x5e\xf9\xc8\xa3\x88\x88\x22\xbf\xe3\x11\x42\x62\x7e\x51\xdc\x71\x31\x0b\x21\xea\xcf\xbc\x27\xbc\x85\x22\xee\xb2\x7f\x23\x94\xda\x50\xc8\x84\xec\xa8\xcd\xa7\xf9\x67\x01\x7d\x92\xa4\x9b\x43\x47\x96\x7c\x87\x71\x53\x7f\x01\xaf\x5d\xfd\x46\x9f\x03\xb1\xbd\x1c\xce\x3c\xc5\xee\x3f\xf6\x79\x6e\xde\xc7\xc2\x41\x59\xda\x28\x76\xab\x6c\x55\x66\xaf\xd0\xc1\x93\xc8\x9b\x2f\x0d\xf6\x96\x8f\xe2\x21\x78\x48\x3a\x47\x10\xc9\xd2\xec\xb7\xd9\x4b\x71\x9c\xcf\xe9\x37\xf9\x72\xda\x3d\x21\x8f\x17\xfb\x0d\x13\x51\x49\xcb\x90\xdd\xbc\x03\x58\x19\xc9\xd5\xa0\x84\xee\xe9\x32\x88\x6e\xab\x14\x70\x8e\xdb\xe2\xc5\xfe\x32\xc7\x04\x41\xe0\xc6\x86\xdd\x36\x33\x23\x5f\xc6\xd7\x48\x24\x10\xba\xdb\x39\xdc\x71\xbd\x05\x91\x29\x8f\x31\xf5\x73\xb9\x1c\xd7\xc2\xf1\x9f\x54\x0e\x30\xe7\x26\x18\xd1\xfb\x52\xf0\x45\xf5\x58\x00\x61\x3b\x1f\xd4\xc1\xd9\xa1\xda\x45\xac\x92\xd4\x0c\x30\x95\x22\x98\xe6\xb4\xdf\x57\xc4\xcb\x19\x80\x8d\x97\x14\x5a\x20\x82\xb3\x4e\x21\x90\x03\xd7\x18\xcc\x61\x08\xd0\x39\x27\x30\xd6\x09\x54\x9a\x08\x13\x3a\x5b\x49\xde\x00\xb9\xe4\x01\xc6\x9a\x87\xf0\x4b\x02\x21\x51\x7a\x9f\x8e\x69\x73\x68\x20\x02\x93\xe4\x97\xc3\xd2\x36\x70\x47\xc9\x3d\x9b\xdd\x99\x41\x68\x10\x6f\x34\x42\xc9\x80\x22\xeb\xdb\x99\x2c\x86\xb9\xd0\x10\x6c\x1e\xff\x79\x6a\x34\xbb\xfd\xb7\xea\xd9\xf3\xb8\xf7\x3e\x64\xa9\x11\xa6\x25\x4e\xcc\x97\x55\x0b\xe4\x20\xfc\x12\xdb\x5f\x58\xf4\x2a\x64\x8a\x24\x53\x67\x59\xa4\xf5\x91\xf2\x8e\xd9\xe7\x2a\x67\x3d\xc7\x9a\x32\xee\x32\x87\xf7\xd8\x28\x26\xb8\x15\x0c\x76\x14\x25\x42\xa0\x9a\xcf\x49\x44\x11\xba\x8c\xa4\xa4\xa0\xb6\x42\x05\xc8\x39\xf5\x57\x8d\xe6\x50\x89\x63\xb3\x65\x81\x19\xb9\x51\xf9\x0f\xe2\x88\x90\xa7\xb4\x9e\x03\x3f\x75\x39\x89\xe8\xe6\x31\x61\x06\x35\xa7\xc9\x9e\x50\x9e\x85\x25\x50\x4b\x7b\x57\x43\x20\xc3\x73\xcc\x49\x11\x01\x4a\x0e\x7f\xf7\xa8\x5d\xd2\xcc\x09\xcf\x9c\x5c\x5b\x45\xbf\x7d\xf2\xd5\x91\xa3\x02\x9d\x40\x9e\x5d\x74\x18\x8c\x61\x3d\x09\x9b\xae\xbd\x10\xb8\xf4\x2f\xcf\xb8\x69\x1d\x26\x74\x52\x72\x16\xb3\x77\xef\xdd\xdc\x12\x84\x77\xd0\x44\xeb\x38\xc7\x35\x51\x90\x77\xc2\x08\xd3\x09\xed\xd4\x4a\x84\x65\x2a\x4d\xa3\x5c\xd3\xe6\xfb\xb2\xd2\x82\xe1\xb8\xd3\xcb\x30\xdb\x26\xb8\x09\x35\x14\x09\x06\xa2\x21\xe4\xd3\xac\x1d\xd5\x97\xc1\xee\xf4\x16\x35\x02\xbb\xce\x94\xfc\x19\x73\x03\xe4\x90\x87\x1d\x8f\x68\xbc\x14\x07\x1d\x52\x02\x9c\xb2\x9d\x61\x95\x41\x23\x0a\x4a\x3c\xf5\x29\x57\x0a\x2f\x2c\x65\xb9\x88\x32\xc9\x5b\x7d\x8a\x84\xc4\xa6\x3d\xba\x76\x53\x7e\x1e\xb1\xcd\x1a\xe8\x6c\xc0\xda\x42\x3d\x62\x72\xb7\xce\x9d\xe1\x95\x28\x60\xe6\x99\x0b\x05\x81\xa6\xb4\x63\xb1\x4b\x17\xd0\xc6\x0e\x1b\x0c\x59\xe8\x9e\xa0\x9a\xb7\x2a\x62\x95\x67\x4a\x85\xed\xa5\x73\x3f\x76\x04\x4f\xfa\xc3\x4e\xf4\x29\xd7\x61\x94\x62\x98\x80\x43\x93\xac\x51\x13\xfe\x4e\xaf\xab\xf8\x43\x07\x24\x96\x1f\x05\x18\x16\xe1\x58\x12\x3a\x5a\x5c\xdb\x5c\xd7\x03\xe8\xac\xac\xe0\xb6\xfd\xf1\x3f\x0d\xfd\x8d\xbf\x61\x9c\xfc\x73\x46\xac\xa4\xc8\x3f\xf4\x05\xda\xa9\x90\x79\x98\x72\x1f\xbe\x6d\xf9\x68\xff\x9e\x28\xe7\x73\x9c\xb4\x38\x11\x6a\xe9\xca\x47\xf7\x13\x05\xf5\xa3\xe4\xdb\x97\x90\x5a\x33\x27\xd9\xbf\x18\xef\x6b\xc8\x0f\xcc\x5c\x08\xfd\x85\x55\x9a\xef\x48\x81\xd3\xe2\xc9\xff\x02\x5f\xc3\x1d\xc0\xf4\x6d\x11\xb6\x59\x87\x2d\x3d\x0d\x86\xb0\xe6\x40\xa1\x26\xcb\xe1\xbd\xfe\xf2\x9b\xc6\xc9\xcb\x7b\x0f\x62\xbd\x84\x10\x83\xec\x92\x2a\x07\xbf\x3f\x9e\x29\xda\xaf\x48\xb4\xd5\x3b\x51\x59\xc0\x1b\xce\x4b\xab\xfa\x46\xb8\x65\x81\xfa\x4a\x5b\x34\xff\xd3\xf5\xfb\x1e\x9f\x75\x08\xb8\xe5\xcd\x4e\x9f\xc4\x35\xfc\x07\xc1\x60\x50\x8c\xe3\xdf\xe1\xbe\x44\xe7\x97\xc2\x92\xf3\x5f\x08\x03\x63\xa7\x06\x38\xd8\x78\xab\x3e\x49\xb7\x45\xa7\x44\x59\x16\x7e\x6c\x7e\x3e\xf3\x0d\xf4\xd2\xb2\x97\x07\x0f\x82\xb8\x8e\xf3\x0b\xde\x35\x06\x76\x05\xcb\xab\xbc\xb9\x20\x82\xba\xed\x3c\x3a\xba\x48\x6f\x34\xb9\x95\x27\xc5\x38\xfb\x24\x8a\xd6\x42\xdc\xd3\x61\xb2\xd6\x7a\x54\xa2\x02\x63\x3f\x0d\x4d\x47\xc7\x1f\x61\x00\x21\xcc\xd4\x02\xaa\x05\xcd\x32\xb6\x07\xbf\x81\x87\xab\xdb\x60\x1a\xef\x3b\xed\xae\x0e\x29\x22\x28\x38\x11\xc9\x85\xd1\x51\xfd\xcc\x40\xb0\xbc\x6d\x46\xbe\x44\x34\x3d\x4c\x13\x88\xd5\x3a\xc3\xac\x66\x70\xc7\x63\x85\xf8\xd5\x1e\x04\x92\xe9\x3a\x0e\xd0\x02\x23\x4e\x2c\xf0\x64\x73\xa0\xcd\xe6\x2c\x57\x01\x17\xf3\x06\x56\xfa\x27\x5a\xc8\x00\x39\x89\x1a\x0a\x3b\xa3\x61\xfc\x95\x38\xf8\x90\xbd\x9b\x42\x26\x71\x68\x39\x68\x80\xdd\x9e\xd4\xa0\x36\x20\x63\x3c\x97\xb6\xe4\x77\x7d\x10\x57\x56\x73\xb1\x21\xe7\x8b\x5b\x68\x9b\x11\x82\xa6\xf5\x03\x3c\xca\x0d\xab\xda\x96\xff\xbf\xb9\x01\x82\x46\x95\x4d\x14\x05\x74\xea\x90\xa2\x0f\x25\x9e\x01\xf5\xfb\x73\xd3\x11\x0d\xef\xb6\x01\x99\x01\x67\x05\x43\x9a\xa1\x9d\xca\xab\x91\x6e\x2d\xaa\x14\xff\x79\x03\x33\x7d\x89\x66\x25\xc1\xcf\xce\x85\x14\xe6\x9e\x95\x81\xfe\x2b\xe3\x85\xaa\x53\xe0\x9c\x2d\x7e\x4a\xbf\x29\x0b\xaf\x66\x7f\x84\xa4\xfc\xa2\x29\x40\xdb\x97\x2d\x52\xa0\xd6\x02\x10\x97\xd8\x41\xf7\x98\xe4\x6a\xd0\xec\x31\xaf\xcb\xea\x9e\xfa\x52\xaf\x6b\x5f\xc0\x0e\xd6\xde\xae\x96\x06\xfb\xe9\x1e\x94\x7b\xeb\x6e\x23\x09\xea\xf3\xc5\xc4\xa4\xb7\x3f\xf1\x8a\xe5\xa6\x3e\x7f\x01\x88\xa4\x1b\x95\xe3\x0d\x12\x4c\xec\x51\x04\xe6\xec\xd0\x42\x5f\x74\xef\xd3\x1e\x7e\x4c\xee\xaf\xa4\xbf\x51\x31\xdf\x8e\x7e\x7f\xf2\x13\x4d\x53\x48\x4a\xd9\x13\x4c\xd7\x24\xad\x7b\x3f\xcf\xd7\x68\xef\xf0\x5b\xec\x0b\x66\xfe\xb4\xc9\x8f\xb3\xca\xdd\x5d\x69\xa9\x18\x39\x38\x2d\x09\x6d\xb6\xe5\xc6\x37\x49\x6c\xf9\xa7\x93\x71\x62\xc1\xe3\xb9\x55\xb5\xa9\x7f\x4d\x29\x84\xb8\x61\x29\x91\xd2\x59\x70\xc9\x24\xde\xac\xb8\x21\x4c\xc4\x4d\xb5\x82\x85\x20\x95\xf6\x8e\xe2\x66\x3e\x27\xa8\x61\x28\x24\x6e\xc4\xb6\xb9\x25\xdc\x2e\x1d\x8d\x70\x76\x36\x7f\x64\xa9\x14\xa4\x0b\x41\xea\xe4\xcd\xe4\x31\xea\x20\x4e\xd0\x60\x4b\x47\xd8\xb0\x7f\x4a\x11\xe2\xe9\x05\x0c\x59\x30\x0d\x53\x08\x0a\x03\x60\xc7\x5b\xeb\x89\xe4\x59\x68\xa6\x67\x9e\x79\x2a\xee\x42\xc8\xf7\x58\xf7\xda\x9f\x01\xb6\x9b\xa3\xb2\xf3\xb4\xf9\x1a\x13\x33\x20\x6c\xd3\xfe\x75\xb5\x08\xc4\xa3\x71\x94\x8d\xab\xcf\x2c\x04\xde\x39\xc5\xca\x50\xbe\x50\x7b\x21\xee\xee\xb8\x55\xf9\xa0\x5b\x45\x8b\x37\xc1\xe8\xfe\xad\x10\x06\x26\xf4\xed\x9f\x97\x85\x17\x02\xd5\xfe\xa9\x47\xa5\x9e\x15\x41\x73\xff\xda\x29\x34\x1b\xb2\xd6\x72\x41\x69\x6b\x2b\x7b\xcc\x21\x7c\x5c\xda\x81\x57\xd4\xc3\x5d\xa2\x2c\x3d\x5d\x59\x77\xb6\x1f\x73\x09\x1e\x75\x76\x07\x58\xa9\x5b\xfd\xef\xcc\xd5\x05\x03\xc6\x71\xfa\xbe\x75\x8c\x9a\x45\x5e\x36\x4a\x7c\x02\xdf\x00\xc1\x2e\x7f\x1b\xcd\xa5\xfc\x8f\x9c\x1b\x94\x09\x84\x57\x77\x10\x5f\xd2\xe2\x55\x34\x14\x4e\x4a\x44\xf3\x2c\xaf\x9c\x3c\x91\x29\x99\xa7\x7d\xe5\xdd\x26\x54\x9f\xb4\x69\xd9\x0a\x4d\x50\x4b\xb1\x78\xcc\x90\x7d\xd3\xf7\x5e\x1e\x45\xc8\x1e\x32\xfb\xe4\xb7\xf5\x59\x66\x16\x67\x29\x7b\x17\xe8\x37\x5e\x86\xe2\xac\x4f\x64\x81\xfa\x73\x5e\x5d\x07\x7d\xd1\x23\xb4\xb1\xe6\x06\xcc\x50\x85\x31\x09\xe8\x4e\x62\x4b\xba\x73\xdc\x45\x7d\xe9\xb6\x58\x16\xe9\x7c\xe9\x8d\x6f\xc7\x82\x8a\x43\xd6\x60\xf7\x4b\x24\x4c\xb7\xb9\x44\xba\xf0\x83\xdb\x4c\x1b\xac\x29\x96\xba\xbb\x32\xca\x95\xea\xfd\xd6\xb6\x6a\x60\x74\x44\x5e\x00\x28\x78\x26\x69\x56\xed\x5b\xf6\xe5\x83\x1b\x1e\x08\x18\xfe\x5c\xf1\x85\xe1\x08\xe3\x50\x41\x0a\x55\x0b\x18\x38\x43\xce\x25\x1a\xbd\x4b\x55\xf6\xfa\xea\xea\x9f\xa5\x77\xb6\x94\x4f\xaf\x92\x5a\xf1\x65\x0b\x47\xab\x6e\x9c\x3f\xbc\x46\x94\xce\xd2\x17\xa2\xf4\x17\x16\x5b\xdd\x2f\xc5\xb6\xe8\x60\xd5\x8d\xac\xdd\x31\xac\x30\xc4\x40\x88\x5a\x1c\xd8\xb4\x2e\xcb\x89\x1e\xf2\x5a\x98\x06\xc5\x11\xa8\xc3\x26\xe7\x28\x74\x10\xef\x4e\xff\xd1\xdd\x0a\x08\xe3\x26\x63\x86\x2e\xdf\xe8\xc2\xd5\xe5\x04\x5a\x02\x09\x9d\x4f\xa5\x43\x66\x37\x42\xd5\x50\x0c\xe6\x8b\x80\xd3\x50\x70\x57\xc9\x58\x3a\x5d\x1e\xd9\x03\xf5\x62\x60\x49\x8a\xff\x71\x0e\x67\xac\xbe\x5f\xa8\x5f\x7a\xd0\xd8\xc4\xe4\xa9\x2f\xb7\xa1\x59\x62\xa1\x5d\xfa\xe3\xe6\x88\x9e\xa8\xb3\x59\x74\x17\x8e\x60\xf3\x12\x90\xca\x34\xd5\x82\xac\x4d\x26\x2c\xc5\xdd\xd0\x05\x75\x3f\xa9\x2f\x92\x29\x3a\xdf\xea\xec\xda\x0a\xe5\xaa\xa0\xfd\x76\xbb\xfc\x32\x63\x48\x13\x5e\x31\x4b\xcf\xc0\x6b\x50\xa7\x8a\x19\x60\x13\xb3\xb2\xee\xc0\x8a\xec\xaa\x4b\x0f\x21\x10\x7d\x5b\x45\xd8\x1d\x89\x18\x62\x5d\xce\xc8\x14\x71\xc8\x77\x1c\xfb\x27\x24\xac\x6c\xce\x04\x2b\x18\x07\xba\x15\xf7\x3d\x05\x2a\x31\x38\x97\x44\x28\x1e\x31\x3a\xfc\x17\xb0\x38\x4a\x14\x4b\xaa\x5e\x55\xc6\x4b\x9e\x60\xd1\xac\x8e\x00\x94\xf8\x22\x6a\x30\x80\x8e\xb7\x93\x58\xda\x14\xb9\x20\x8c\xde\xfc\x74\xeb\x39\x61\x21\x9f\x72\x1a\x57\xb8\xa0\x8a\x34\xc5\x6b\x0e\xc5\x6e\xd5\x6a\x39\x9f\x23\x30\x52\xb7\xba\xcb\x7c\x55\x6d\x2f\x5d\x8d\xb8\x42\xb3\x97\x33\xf4\x6b\xb8\x0a\x58\x1b\xe7\x3c\xcf\xb1\x13\x63\xbd\x0e\x7f\x86\x1f\xa7\xc5\xf9\x5c\xd7\x54\xbf\xa3\x49\xd5\x5f\x6d\x4e\xc1\xd9\x41\x4d\x0d\x5a\xc0\x33\xe3\xea\x92\x66\x93\xcf\xa6\x7c\xe9\x98\xd1\x24\xab\xd8\x38\xa2\x4b\x9b\xfe\x05\x3c\x73\x7c\x3e\xc3\xfd\x0d\xac\xd2\x70\xe8\x9a\xc2\x6c\xba\x0d\x1f\xba\xe1\xbc\xb8\xd1\x0f\x32\x9c\x22\xc7\x57\xe9\x31\x1d\xa7\x72\xb0\x77\xbd\x2c\xbe\x58\x38\x75\x32\xaa\xf5\x38\x6c\x91\xc1\xc8\x7d\xc5\xac\xc4\xe9\xb9\x4e\xfd\x81\x23\x7e\xf9\x70\xd9\x1b\x95\x2a\x4a\x2e\x40\x5d\xac\x9a\x75\x38\x7c\x3d\x1c\xcc\xe6\x55\xe6\xee\x3a\x0c\xec\x46\xfe\xe5\x24\x46\x5a\x56\x46\xac\x4e\x6b\x73\xe2\xb1\x7a\x93\xb9\x2a\x91\x10\x95\xeb\x5d\x67\xb1\xc6\xce\xd2\x8f\x45\x2b\xc4\x51\x89\xd6\x5c\x47\xba\x40\xb9\x2b\xd9\xa2\xf5\x2d\x34\x46\x8b\x19\x76\x13\x98\x45\x6c\xd0\xbf\x2d\xdd\x98\xcd\x2f\xf6\x1c\x16\xf9\x3e\xc9\x65\x4b\x5a\x1b\x18\xfc\x0f\x4a\xd6\x91\x48\x8c\x0f\x70\x05\x07\xfa\x9d\xff\xe4\x27\x76\x4f\x9b\x6d\x5a\xf1\xe2\x2e\xe2\x30\x89\xd3\xec\x25\x28\x86\xd4\x46\x10\x4b\xe0\x45\xa8\x28\x76\x2e\x81\x45\x85\xce\x98\x33\x3c\x6c\x80\x3e\x7c\xd6\x6e\x01\x5f\xb0\x9b\xdb\x7d\xba\xec\xb7\x24\x74\x04\xf0\x4b\xeb\xf1\xe8\x6f\x12\x2a\x63\xbd\xe0\x99\x96\x24\x93\x0c\xee\xf6\x67\x8e\xec\x64\x43\x25\xa0\xc6\x89\x5e\x0c\xb4\x95\xba\x4e\xe3\x8e\x05\xfa\x5b\x6c\x72\x59\x09\x4d\xcd\x14\x53\x38\x8b\x42\x94\x8c\x5f\x47\x80\x08\x95\xc9\x46\x09\x92\xd9\x73\x16\xa6\x8b\xcd\x94\x54\xed\x6a\x46\x96\x2b\x1b\x96\x41\x61\xab\x59\x9b\x02\x7e\xf2\x5e\x6f\x46\x00\xc3\xf5\xa2\x08\xcf\x70\x55\x1b\x77\x79\x2b\x59\x23\x7b\x4a\xd2\xdc\x20\xbb\x26\x9e\x64\x00\x3b\x2f\x6e\xf5\x20\x7a\xcd\xe5\x7d\xf2\x45\xf1\x77\x11\x64\xe9\x5d\x34\x39\x56\xbf\x9a\x3c\xbe\x0a\x45\xc7\x32\x2b\xdf\x36\xf5\xdd\xb1\x7a\xc3\x57\x3b\x41\x47\x53\x88\x9d\x7d\xf8\x55\xc0\x23\x04\x92\x17\x71\xdc\x0e\xb8\x73\xff\x88\x0a\x5d\x2e\x8a\xa9\x4d\xf6\xd3\xfe\x25\x21\x40\xe7\xc2\x49\x5b\x93\x5e\x3b\xbd\xe6\x34\xd5\x6a\x52\x57\x6f\x16\xac\x78\xb9\xe9\x8c\x1a\xb0\xed\xb4\x30\x7d\x5e\x48\x8c\x89\xb3\x7c\x6b\xe5\x27\x01\x19\xe5\x63\x6f\x12\x93\x2a\x1d\xc7\xc9\x99\xb8\x8b\xa0\xf1\x28\x4b\xdd\xc4\xbc\x4f\xee\x31\xe3\x70\x46\x88\x9c\x09\x1f\x95\x02\x36\x09\x93\x34\x74\xb2\x3e\xb9\x86\x9c\x5b\xb5\x1d\xdb\x84\xb2\x4f\x5b\x7f\x4d\x81\x24\x9d\xc3\x5b\x03\x7a\x6f\xae\x20\xf0\x20\x70\xf4\xf0\x49\x08\x21\xa4\x58\x9b\x76\xdd\x08\xfa\x39\xf1\xdc\x56\x24\x6b\x39\x60\xa2\xc7\x38\xc0\x55\x4a\x22\xa5\x68\x93\x5e\xec\xab\xc5\xc8\xcb\x6f\x42\x78\x9a\x4f\xb9\x57\xa4\xc9\x52\x48\x2c\x1a\x7a\x0c\x2c\x51\xc0\x0d\xb5\x90\x93\x26\x5a\x4b\x58\x1e\xb0\x89\xf0\x9e\x46\x25\x2f\xa9\xaf\xf2\x61\x2e\xe9\x4b\xd5\x27\x9e\x5b\x57\x89\x24\x76\x69\xed\xa3\xda\xb8\x06\xf0\x46\x0b\xf0\x6c\xf7\xe5\x11\x80\x2e\xa2\xda\xba\x61\x6f\x5c\x6c\x39\x74\x78\xa8\x1f\xac\x09\x8d\xb9\xc6\xd5\xfc\x05\x2d\x6d\x42\x8e\xd4\xa2\x8e\x7b\x9e\x7e\x69\xf8\x8f\x5e\x6a\x3e\xbb\xfd\x2b\x13\xf5\x79\xfe\x0a\x1f\xc8\xbf\xcc\x2e\xfe\x2f\x39\x5e\xcd\xe5\xcd\xd2\x4c\x41\x33\x4e\x79\x3f\x5b\x8b\x84\x04\x06\x69\xc4\x2e\x96\x12\x5b\x9b\x16\x53\x64\x6c\x84\xc2\x86\x23\x28\xed\xa9\x2d\x9f\x7d\xd4\xee\xc5\xa6\x8b\x5a\x36\x45\xe3\x29\x4d\x32\x9b\x88\x8b\x92\x89\x30\x55\xdc\x28\x94\xcc\x04\xd2\x1c\x67\xee\xb1\x07\x36\x50\x9c\x9d\x90\x99\xe8\x5a\xfc\x69\xb3\xfe\x59\xa7\x94\x47\xdd\xda\xd0\xc3\x62\x6a\xfa\xc9\x4d\xad\x09\x7f\x12\x45\x66\xc1\x0c\x64\x5f\x07\x67\xb5\xc2\x2d\x1f\xbe\xf7\x78\x04\x91\xd6\x86\x95\x7c\x25\xba\x7c\xbd\x51\x81\x9b\x35\xc5\x7d\x43\x14\x8b\x40\xc7\xbc\x75\x49\x58\x4b\xa1\x03\xde\x58\x8d\xf0\x2d\x7d\xd7\x1c\x3d\xe9\x3d\x19\x54\xae\xcb\xf9\x8e\xdd\x36\xe8\x5f\xed\x48\x84\xe5\x34\x06\x7e\xb2\xaa\x9a\xbe\x13\x52\x56\x9c\xa3\x8d\xda\xd6\x2d\x2a\xe9\x3f\x57\xb9\x18\x9d\x37\x29\xeb\x5c\x31\x8b\x55\xbc\xfc\x8d\x02\x51\xa6\x3d\x00\x8e\x30\x95\xaa\x10\xca\x73\x3c\x2a\xd6\x71\x3f\x4e\x1f\x22\x60\xce\xe6\x2b\xd5\x81\xae\xd4\x9d\x9c\x34\x99\x3b\x17\x20\x98\x43\xdd\x8c\x0f\x2b\x0d\xda\x18\xe5\x79\x9d\xca\x75\x83\x2d\x6d\xae\x9c\xaa\xc0\xd9\x19\x1a\x68\xd6\x21\xf8\x45\x3f\x17\xcc\x3e\xab\x9c\x19\x66\x74\xae\xac\x18\x7f\xe2\xbd\x47\xef\x6c\x32\x0a\xd9\x0b\xaf\xc6\x92\xbc\xce\xc9\x4f\x6f\x30\x81\x96\x93\xf4\x71\x01\x1e\x94\x65\xc6\x16\xc0\xc6\x73\x5b\xe0\xdc\xca\x50\xd8\x9e\x43\xda\xde\x87\x5d\xe1\x4e\xc5\x66\x8a\xa3\x31\x8a\x95\x33\xe0\x32\x57\xa9\x9f\xe1\xda\x1c\x04\x03\x6e\x79\x7d\x51\x76\xcd\x01\x98\x0c\x72\x1f\x32\x69\xe9\xa8\x1d\xda\xe1\x4e\xa2\x93\x5e\x41\x9c\x43\x8a\x2d\xad\xf9\x4f\x80\x4d\x9b\xe4\x28\xea\x32\xb5\x31\x50\x51\x70\x80\xa0\x74\x21\x0e\x00\xc5\x37\x97\x98\x38\xbc\x0c\xe9\x81\x34\xc1\x9c\x1f\xe3\x48\xd3\xe0\x45\xbb\x36\x99\x5b\xe1\x78\x63\x2b\x29\xf0\x93\x5a\x55\x3f\x28\xf5\xaa\x38\x2d\x91\xbc\xc1\xfa\x8d\x95\x02\xea\x94\x2d\xa1\xbe\x84\xb2\x37\xbd\xc7\x1d\x3d\x29\x13\x4b\x17\x21\x4b\xdb\x2b\x32\x09\xb4\x5f\xa8\x0b\x13\xbb\x88\x7a\x3e\xd1\x93\x59\x45\x81\xa3\xe5\xa7\x05\x12\x0f\xae\x70\xc2\x95\x26\x5f\xa4\x62\xd7\x7d\xa4\x00\xaa\x78\x83\x72\x68\xe9\x65\xbd\xed\x03\x08\xc7\x22\x0b\x10\x6a\x9a\x59\xca\x5a\xd8\xd8\x6e\xcf\xb7\x58\x63\xb6\xc1\x69\x8d\x42\x05\x94\xca\x42\x0c\xc2\x01\x90\x3c\x75\x36\x91\x2a\x12\xec\x8a\x07\x44\x28\x28\xcc\xbd\xf6\x80\x31\x9e\xee\x96\xee\x77\x12\x44\xcc\xbe\x90\x95\x8d\x04\x4b\x2c\x82\x93\xe3\xd9\x0b\x0f\xe9\x3a\x51\x92\xee\x3a\x9b\xb9\xea\xb6\xec\x00\xfb\xd6\x86\xf5\xb7\x4b\x45\x85\x41\x55\x4a\xf7\x0e\x15\xcf\x58\x46\xc7\x4f\xb2\x1e\x82\x54\x20\xa9\xb5\xfe\x03\x2c\x25\x22\xae\x70\xe3\x04\x7e\x0f\x56\x71\x23\x8f\x92\xb7\xb6\xa3\x26\x19\x8c\x36\xea\x8d\x8c\xfa\x39\x79\xb2\x49\x4b\x39\x0f\x30\xaa\xca\x31\x0e\x4a\x6a\x94\xb7\xb2\x9f\x4a\xbe\x66\xc0\xb9\xd2\x18\x0f\x3f\xcf\x1c\x9a\x6b\xa9\xce\x4f\xf7\xff\x9d\xd9\xee\xe9\x9d\x61\x55\x47\x83\x2e\x90\x90\x6a\xab\x0b\x48\x09\x45\xe9\xcb\x56\x04\x4d\xf2\x0b\xd6\x71\x09\x6d\xb5\x7c\x97\x69\xad\x21\x0f\x46\x07\x52\x3e\xaf\x88\xb0\x98\xab\x3f\x1a\xfc\x3f\x62\x20\xa9\x69\xbc\x63\x74\x9c\xb4\x67\x9a\x55\x02\x00\x33\x1b\x13\xde\x9f\x68\x80\x30\xc5\xb5\x6c\xc1\x29\x03\x32\x69\x77\x1f\xad\x20\xf7\xd2\x54\x84\xa2\xf5\x40\xcf\x49\xa2\xb2\x21\xaf\xa6\x58\x8a\x6d\x22\xcd\xed\xd3\x18\x7c\xbf\xdd\x4d\x7e\xfd\x32\xbc\x2e\x57\xf8\x0a\x61\xb4\xd3\x33\x85\xfd\x35\xbe\xdf\x82\x2c\xbe\x6c\xb0\x94\xa7\x9e\x65\x12\x71\x4d\x3d\xf4\x20\xb4\x99\xf7\xfa\x67\x23\x45\x0b\x2b\xba\xdc\x04\x9e\x91\x5d\xd3\x3e\x9c\x55\x89\x6e\xe0\xa8\xb7\x87\xb7\xf4\x1e\x96\x70\x96\xcd\xff\xbc\xb9\x67\x7c\x73\x23\xd2\xbb\x43\x0d\x03\x5e\xe8\xa0\xc3\x4e\x71\x86\x06\xdf\x0d\x41\xfc\xcf\x5b\xba\x0a\x62\x45\xec\x5f\x81\x47\x40\x08\xcb\x3c\x91\x20\xbe\x7b\xc5\x8f\x69\xa4\x0d\x6d\xf2\x1a\xcc\xd2\xf8\x85\x4a\x1a\xa1\x93\xe0\x5a\x06\xb8\xc8\xa5\x0e\x22\x5f\xda\x41\xee\x11\x60\xb2\xbd\x5d\x12\x5b\x68\xfc\x4c\x53\x4c\xed\xf7\x76\x98\xab\x41\x33\x20\x87\x0b\xaa\xaf\x32\xcb\xcb\xa1\x5e\xd8\x7e\x71\xb4\x76\x50\xf2\x46\x06\xc0\xdf\xfb\x01\xa1\xe3\x66\xd3\xce\x41\xb9\xc7\x4e\xa8\xc4\x8e\xd5\xc8\x54\xc1\x87\xa1\x3b\x97\x96\x20\x00\x03\x46\xc8\x03\x5b\xe7\xde\xb3\x57\xdd\xec\x11\x0f\x9b\x3c\x09\xa2\xed\xb9\xa1\x25\xbc\x85\x09\x17\x99\xa0\xc1\xa5\xe3\xb4\x0a\x72\x68\x51\xb4\x76\xf3\x3c\xe2\xde\x46\x39\xe7\xb5\x05\xfa\xde\x0f\x82\x06\x21\x12\xe0\x37\xc0\x96\x3f\x5b\x11\x50\xef\x4d\x78\x19\xe3\xe4\xab\x4f\x98\xa8\x81\xb6\x14\xa6\x77\xbb\x6c\x9a\xab\xca\x19\x63\x87\x17\x0a\x2d\x48\x67\x16\x59\xc1\x65\xaf\x43\x6a\xc4\x87\x64\x3c\xff\xb6\x5c\xaa\xa3\x21\x74\xd1\x3e\xd4\x56\xd3\xf2\xbf\x5c\xf2\xf8\xd1\x73\x83\x19\x13\x35\xca\xec\x77\x05\x1c\x6e\xb8\x11\x8b\x37\xc2\xf1\xb7\x8c\x15\x4c\x08\xef\x98\x6d\xa9\xd8\xc1\x71\x6e\xce\x6d\xaf\x00\xc4\x8a\xf5\x77\x3c\xdd\xa6\x13\x92\xf3\x03\x4f\x53\xba\x6a\xfc\x7b\x28\xd4\x64\x5b\x7f\xef\xa3\x22\x13\xe3\xdb\xe0\x4c\x1f\x13\x0d\x80\xf2\xf6\x6a\x47\xd8\x7c\xa1\x2b\x29\xb7\xc6\x30\xdc\xc8\xa0\xb5\xb6\xc6\x0d\x8d\x34\x90\x25\xe0\x4d\xd2\xdb\xd6\x7d\x07\x5a\x14\xd4\x51\xee\x3a\x76\xc7\x7d\xda\x30\x48\x84\x08\xf1\xa0\xa8\x5a\xe9\x9b\x52\xf7\x95\xbf\x80\xcd\xe2\x4f\x9d\x05\xac\xd9\xa2\xf3\x7d\x3e\x28\xc3\xf6\xe2\x96\x72\x56\xeb\x85\xfb\xc0\x39\x0e\xd1\x7c\xb8\x08\xdb\xc8\x0c\x60\x95\xfb\x2e\xb0\x91\xf1\xc7\x57\x15\x36\x62\xf0\x5c\x77\x6d\xaf\xe6\xab\x15\x3c\x99\x04\x77\xb4\x53\x69\x18\x1d\x61\x3b\x0e\x1c\xe5\x36\xe6\xc0\xd3\x41\x6e\x63\x0f\xcd\x13\x20\x27\x43\xd5\x7e\x75\xb1\xa4\xf8\x22\x9a\x12\x31\xf9\x85\x7f\x9f\xce\x26\x54\xd6\x6e\xbb\x3f\xfb\x71\x42\x8c\x7b\x75\x10\x69\xf7\x05\x9e\x8c\x77\x81\xa1\x51\xe3\xe5\x55\x0d\xfd\xe4\x66\xb6\x56\x46\x33\x50\x95\x70\xad\xf3\x27\x59\x86\x7f\x8a\xe2\xcc\x5c\x7d\x96\x1e\x7c\x2e\xe6\x16\x6f\x74\xe4\x81\x4d\x7e\x3f\x81\x7c\xac\x97\x10\x9a\xea\x5c\xa8\x02\x7f\x05\x98\x9d\xc2\x78\x97\x11\xe0\x82\x3b\xcc\x3f\x71\x04\x97\xb9\x65\x8d\x86\x0c\xcc\x50\xb8\xf3\x86\xe0\xa3\xae\x1a\xab\xba\x26\xa4\xd6\x76\x81\x1e\xc3\xdc\x8b\x40\xe6\x58\x48\x91\x73\x92\x10\x4f\x98\xed\xdc\xba\x71\x74\x03\xd4\x51\xa3\xd2\x04\x84\x01\x27\x95\xde\x4b\x1c\xdd\x3a\x7e\x52\x2f\xad\x97\xb6\x6b\x76\xe2\x8b\x37\xec\x69\xf6\x2b\x96\x6f\x60\xa6\x1c\xfe\x6c\xf0\xb6\x8e\x93\x36\x83\xb0\x9d\x15\x38\xf2\x18\x0a\xb5\xa1\x31\x3d\xa3\xf3\xc4\x0a\x41\x2f\x61\x33\x37\xa0\x33\x8b\x46\xcb\xaf\xa6\x5a\xe0\x91\xe3\x6f\x4b\x8f\x0a\xd0\xd4\xd7\x06\x29\x6c\x4d\x37\xdb\x68\x4d\x22\xb0\x58\x10\x72\x00\x58\x70\xc4\x88\xab\x8f\xec\xe3\x9b\xda\xe1\xb2\xf7\xcd\x8c\x2b\xe2\x12\xb9\x69\xc0\x32\xed\xb7\xbc\x14\xe2\x17\x99\xd5\x1d\xf9\x43\x40\xb8\x9a\x4d\x72\xb8\x7c\x82\x84\xe2\x25\x45\x5d\x8b\x7b\xce\xe0\x2d\x6a\xa8\x11\xb7\x8d\x72\xfb\xb3\x9c\x7a\x51\x5d\xb8\xd0\x96\xa5\x14\x8e\x3f\xa5\x50\xa3\xed\x96\x79\xf3\xa9\xbe\x2b\xc1\xfa\xd6\xcb\x35\xa5\xeb\x54\xbc\x2c\x0d\x2d\x2e\xf7\x47\x00\x2c\xf9\x9c\x95\x66\xba\x7d\x49\xd1\xa0\xb8\x96\x4c\x0a\x4b\x94\x10\xd8\xe6\x1f\xc4\xf5\xcf\xf2\xf3\xb2\x8e\xc5\x31\x91\x57\xef\x05\x81\xe5\x22\x30\x12\xb9\x2c\xa1\x8e\xf5\x41\xb2\x28\x26\x58\x4b\x51\x1d\x6d\x59\x68\x08\x68\xb7\x9f\x03\x24\x6f\xec\x97\x85\xbd\x9e\xaf\x45\x85\xd8\x25\x7f\x76\x27\x86\xee\x6c\x3c\x7d\x26\xc7\xe1\xc8\x9a\x4d\x61\xc6\x4f\x50\x26\xe6\xf3\xfe\xbb\x2e\xd9\x7d\x93\x74\x0e\xe8\x9c\x85\xe8\x24\xa6\x4c\xb8\xcd\x2d\x5e\xef\x27\xbb\xee\x52\xb0\x73\x47\x43\x04\x28\x8e\xeb\xa7\x84\x5f\x84\x4c\xef\x16\x28\x57\x14\xc1\x3c\xa1\x37\xa7\xcf\x00\x02\x83\x8b\xa8\xae\x3d\x67\x29\xd1\x4e\xf4\xe7\x4a\x0f\xc4\x89\x9b\x11\xbe\xa4\x0f\xa0\x33\xc9\xb1\xf4\x70\x6f\x27\xa1\x3b\x37\x2e\x55\xdb\xac\xdc\x67\x61\x0e\xf7\x94\xae\xac\x70\xa0\xae\x00\x3f\x9f\x31\xdc\xa0\x6a\xb5\xfb\xf6\x45\xb7\xc5\xb9\xea\xb4\xce\xa7\x27\x9a\x42\x7c\x22\x71\x14\x5c\xb2\xd8\x0c\xff\x41\xa5\xba\x5e\x0f\x31\x3c\x94\x4f\x45\x05\x72\xe2\xf4\x61\xa4\x85\xe2\xc5\xb0\x63\x4e\x33\xa3\xb7\xdb\x5f\x8f\x50\xa4\x13\x2e\x14\x61\xd5\x8d\x2b\x61\x48\x58\x3a\x4c\x73\x6e\x64\x22\x68\x08\x3a\x09\xa1\x4b\xc7\x9d\xdd\x96\x05\x91\x9f\xce\x58\xb9\x0c\x23\xbf\x19\xc4\x7d\xdf\xda\x5d\xf3\x61\xd0\x71\x56\x3c\x8f\x73\x21\xff\x15\x88\xd8\x00\x8f\xcc\xe3\x6b\xa0\x22\xcd\x9c\x31\x6d\x1b\xe5\xbb\xb8\xb9\x63\xd4\x83\x28\x51\xcb\xe8\x13\x0f\xd1\x9a\xed\xec\xe0\x00\x5d\x53\xf7\x66\x1c\x3b\x85\xfa\x59\x2d\xd4\x0a\xbb\x45\xc0\xd6\x13\xfa\x31\xb7\x7d\x0a\x05\x67\x3c\xf9\xc2\x8c\x56\x7d\x0d\xc4\xa9\xe5\x34\x71\x16\x95\xca\x66\x53\xf1\x06\xfa\x32\x7e\xc7\x82\x99\xda\xfd\x7f\xc6\xbb\x26\x68\xf6\x48\x37\xcf\x6e\xa4\x6b\x0f\x51\xbc\xdf\xb8\x85\xe7\xd4\x71\x8e\x0c\x28\x28\xa1\xa7\x2d\xbd\xa8\xf5\x3d\x30\x5c\x11\xc2\xf1\xd2\x24\x72\xba\x5a\x87\x92\x4e\xa7\x33\x09\x3d\x93\xf3\x58\x58\x4e\xeb\x76\xc4\xb2\x98\x2c\x9f\x59\xfe\x84\xd8\x8c\x5c\x1b\x3a\x76\xda\xc3\x0a\xfd\x24\xde\x19\xf1\xa0\x74\x88\xb4\xf1\xb9\x0f\x30\x24\x0a\x33\xc2\xd1\x4d\x50\x45\xe1\x8a\x16\xee\x63\x02\x46\x01\x1e\x5f\x02\x15\x5a\x45\xa0\x3c\x8e\x1b\x6b\x1a\x25\x81\xed\xfa\x78\x7c\xb9\x4f\xd2\x4b\x9e\x2c\xef\x60\xb1\x04\x90\xed\xa6\xa4\xb0\x8e\x9c\xc7\x8f\x10\x59\x53\xee\x7d\x78\x76\x44\x27\xd1\xa5\x28\xa2\xf3\xed\xe9\x73\x85\xfa\x1e\x70\x49\x49\xc0\xd8\xa4\x39\x24\xd4\x4c\x5a\x1a\xc7\x43\xe3\x8a\xfc\xe6\x17\xae\x3f\x65\xee\x96\xa2\x25\x86\xd7\xc2\x04\xc6\xfa\xf9\x57\x05\x56\xfa\x26\x23\xa5\xb2\xa1\x4d\x2e\x2c\x36\x82\x5c\xaa\x3e\x58\x58\x76\x5f\xab\x79\x65\xdc\xd4\x8e\x57\x78\x25\xf7\xd1\x75\x0d\x3c\xdf\x52\x72\x8f\x45\xd8\x5f\x15\x61\x7f\x35\x59\xfb\x2d\x57\xa0\x1f\x69\x39\xa9\x98\xee\x2d\xbf\xfc\xf1\x7e\xc7\x70\x2b\xfa\x0d\x7b\x42\x60\x2d\x5d\x8b\xf3\x37\x2b\xbf\xfe\x4d\x4b\xe0\x30\x21\xc7\x98\xf6\xe4\x7d\xd2\x6f\xa8\xdf\xfe\x12\x6e\x00\xb5\x45\xff\x09\x6c\xba\x76\x94\x55\x02\x79\x00\xa6\x3a\x56\x11\x65\xa3\x15\x3e\x4c\xb7\x5b\xe5\xa6\x42\xf8\xb8\x78\xe5\x6b\x09\xbd\x3b\x61\x2a\xa5\xa7\xc7\xe5\x66\x37\x5a\x79\x50\x45\xef\x79\xfb\x65\x05\x38\x52\x9f\xe3\x86\xcf\x01\x9b\x1c\x62\x39\xdf\xc3\x50\x85\x02\x98\x88\xa8\x46\x0b\x96\x93\x50\xc8\x50\x5c\x96\xb0\xde\x5f\x88\xec\xe5\x7f\xd5\xc8\xd2\x7d\x32\x3d\x02\xca\x38\x7d\x79\x6e\xe6\xff\x9c\x8f\x75\x10\xf1\x16\xe0\x01\xe6\xd8\xdf\x55\x9e\x8c\x3b\x66\x1e\xb7\xd4\x1f\xea\x39\x9a\x6c\xa1\xf1\x04\xb9\xe8\x96\xec\x73\x6b\x84\x2a\xa0\x24\x7f\xcd\xed\x4b\xd3\xcf\x8d\xa8\xb4\x38\xa3\x91\xd5\x75\xfb\xde\x51\xfc\xb5\x16\xc6\x48\x7e\xc1\x74\x63\xd7\xec\x84\xca\x26\xbb\x4a\x10\xe8\x75\xf9\xb1\x9c\x39\xba\x88\x3e\x80\x97\x85\xea\x3b\xad\x9a\x72\x8c\xb4\xac\x5b\x0a\xa5\x03\xbc\x23\xf4\x68\x02\x74\x39\x8d\xb5\x73\xb7\x66\x52\x95\x64\xa0\x71\xc6\x70\xea\xda\x0f\x67\x17\xeb\x18\x83\x13\x59\x36\x59\x5a\x96\xb7\x70\x98\x8b\x1c\x29\x86\x92\x7a\x2a\xe7\xcd\x9c\xe6\x0c\x63\x70\x84\x06\x54\xb7\x06\x2e\x30\x0f\x2a\x11\x0d\x7e\x39\x85\xd4\x1b\x60\xa3\x5e\x4d\xc4\xa0\xcb\x36\xea\x6b\x32\x6b\xf6\x83\xbb\x31\xca\x82\xd3\xae\x8c\x80\x9e\x79\xdc\x26\x19\x32\xc1\xd5\x43\x03\xbd\xaf\x77\xee\x64\x7c\xba\x0d\x27\xab\xec\x08\x3b\xd9\xbd\x0d\xd5\x12\x01\x4e\x9c\xa3\x44\xfe\xec\x5d\x6e\x7a\x26\x90\xe4\x97\xf8\x2b\x1b\x71\xb6\x96\x0d\x36\xb5\x0c\x0f\x45\x9b\x58\xdc\x1e\xd2\x1a\x57\xd8\x1e\x45\xca\x0c\x52\x46\x90\x7a\x81\x18\xa9\xf8\xaa\xdd\xfd\x1c\xc7\x06\xb0\x33\xb1\xaf\x3f\x0f\x61\x31\x59\xd7\xed\xcf\xd9\xc7\x6f\xf8\x73\x8a\x42\x63\x61\x97\xb1\x2a\x8b\xd8\x06\x6d\x5f\xae\xe8\x37\x69\x88\xf5\x5b\xa0\x38\xc7\x9d\xed\xb0\x88\x87\x17\x27\xf7\xa8\x73\x71\x91\xc1\xf7\x28\x57\xcc\x8d\xe5\xc3\x7e\xab\x34\x07\x70\x48\xec\x21\xf0\xef\x29\x42\xe7\x58\xf0\x54\xa0\x3a\x4a\xbf\x88\x10\xda\x87\x52\xa3\xcd\xc6\x1c\x05\x65\xdb\x79\x0d\xc8\x66\x0a\x50\x45\x3f\x62\xb9\x93\x7b\xb1\xe4\x1b\x54\x8f\xde\x06\x45\x4c\xf4\x10\x66\x4a\x6d\xf9\xee\xec\x12\xca\x81\xd7\xf4\xc5\x1c\x3f\xcf\x74\x75\x5e\x20\xeb\xb9\xac\xdd\xfb\x64\x2e\x11\xba\x09\x90\xa6\x8e\x5a\xfa\xa6\x5a\x79\xf4\x90\x40\xff\x0e\x85\xd9\x94\x7f\xe6\x49\xe8\xd3\x13\x22\x62\x0c\xca\xa7\x82\x31\x0b\x0b\xe4\x16\xfc\x1c\x7e\x49\x9e\x5b\xe0\x09\x37\xfa\xd4\x3d\xc1\x20\xbe\x84\xee\x04\x39\x4d\x30\x1a\x9f\xf1\xf2\x5b\xad\xdf\xea\xb3\x4c\x0c\x80\xbf\xdc\x69\xfd\x09\x50\x88\x12\xb5\x67\x11\xfc\x12\xa8\x9e\x8b\xd1\x5a\xf1\x8d\xd0\x3a\xfc\xd1\xeb\xb2\x6c\x79\x4e\x4a\x47\x9e\xd5\xef\xd3\xe6\xa5\x4f\xfa\x4f\x54\x58\xa6\x50\x97\x0e\xcc\xdc\xc6\x90\x64\xfb\xda\x21\x8c\x26\xda\xf5\xb5\x34\x09\xb8\x49\x79\x22\x30\x1b\x32\x3f\x55\x57\xce\x61\x9c\x0f\x47\x68\x6a\x01\xfb\xe9\x75\x14\x47\x60\x52\x1e\x91\x9f\xeb\xb1\xfe\xc0\xf4\x47\xa8\xe6\x47\x5e\xab\xe9\xa8\x18\xcd\x3d\xb2\x64\x0f\x43\x1b\xfb\x99\xb6\x80\x6b\x12\xc4\x29\xd5\x49\xfc\x82\x0c\xa6\x3d\x72\xe4\x67\xf2\x34\x2d\xa4\x15\xf5\xa7\xc4\xa2\x17\x80\x9d\x59\x2b\xbe\x37\xae\x53\xd0\x48\xfa\x93\x6a\xd6\x17\xc8\x4e\x1e\xd9\xda\xe5\xff\x63\xb4\xc5\x08\x01\x7b\x52\x08\x53\xeb\x83\xdb\xf4\xbe\x11\xa2\x69\xfe\x62\xf3\x64\x09\xa8\xdb\xe4\xd3\xf1\x8f\xc2\x76\xf9\x02\xb6\x1c\x4d\x77\xa6\x6e\xd2\x70\x64\xe1\xcd\xe5\x4d\xb0\x6a\x42\x70\xe9\xff\x54\xf1\x42\x30\xc9\x5b\x0a\x0f\xaf\x75\xc4\x5f\x9e\xe9\xae\xf1\xc8\x33\x42\xfd\x4d\x7a\x8f\x70\x73\xe0\x17\xa1\xf8\x9a\x15\x02\x5a\x4d\x80\x26\x00\xa2\x5b\x75\x30\x0d\xf3\x95\x0c\x21\xb9\x41\x4b\xf1\x20\x1c\x89\x7f\xe0\x30\x50\xbe\xb1\xef\x65\xc1\x92\x3b\x69\xbb\xa1\x00\x52\xe2\x0a\x57\x32\x61\xd8\x83\xe2\x6b\xe4\xfe\x12\xb5\xb4\xee\xda\x31\x6a\x13\xaa\x29\x8f\xcc\x93\x6e\xa6\xd0\x65\x16\x54\x0f\x66\x49\x42\x1b\x5a\x96\x03\x1e\xdc\xc3\xf1\x9c\x0b\x67\x6c\x44\x76\x0a\xcf\x09\xce\x2a\x51\x9c\xd6\xd3\x07\xfa\xa4\x83\x7c\x95\x0c\xc4\x2c\xee\x29\x4d\x80\x28\xa0\x7d\xe5\xe3\x8f\x1b\x64\xce\xa0\xdc\xaf\x50\x1f\x8a\x1a\x56\x61\xe4\x3f\xed\x36\xfe\xf3\x46\xbc\xac\x4a\x8f\x05\xac\x8b\x38\x24\x54\x32\x7a\x10\x96\x04\x9c\x78\x7f\xdc\xa2\x91\xa1\x04\x89\x25\xd6\xe9\xd0\x51\x3e\x73\x8a\x04\x02\x90\x4e\x64\x8b\x0a\x87\xb4\xdd\x82\x92\x09\x1d\x77\x80\x0f\xc7\x4d\xc3\x42\x67\x87\xa3\xa0\xc7\xef\x59\xfa\x81\x1f\x1b\x95\x38\x22\x40\xe3\xc3\xc1\x29\x5c\x3c\xc9\xb2\x78\xe6\x91\x51\xda\xeb\x46\x27\x83\x22\x71\xda\x46\x02\x6f\x69\xa7\xca\x8f\x71\xda\x6d\x84\x36\xeb\x8d\xab\x6a\x39\x0e\xe0\x5d\x1b\x21\x95\x75\x36\x43\xc5\x4a\xee\x84\x11\x55\xf8\xa6\xee\x79\xbb\x41\xa0\x2b\x37\x04\x70\xae\x3c\xe0\xdb\xc0\x0e\xad\xf4\x0e\xc5\x4a\xe1\x43\xf9\x99\x76\x77\x2f\x81\x4f\xb5\x3e\xbf\xce\xf3\xc2\xca\x55\x2f\x79\x41\x3a\xc7\xa7\x3d\x75\x07\xfb\xec\xad\xd3\x3e\xbf\x43\x74\x46\x79\x6d\x8b\xfe\x12\x87\x8c\x4a\x1c\x13\xd5\xe4\x5d\x21\x14\xb8\xf7\x1a\xa6\x1b\x56\xda\xd6\x0a\x52\xc4\x1e\x36\x02\xb1\xa6\xae\x29\x13\x21\xa4\x76\x1f\x9f\x1a\x7e\xbb\xe4\xcb\x71\xbc\x59\x6d\x40\x15\xfa\x98\x49\x76\xa0\x4a\x19\xf7\x2a\x6d\x75\x96\x2a\x7a\xb5\xa6\xfb\xf1\x9e\xa5\xbd\x00\xd6\xc6\x2b\xd6\x5f\x41\x06\x9f\xe5\x02\x4b\x43\xdf\x11\x20\x95\x23\x72\xd1\x95\x9b\xb9\x77\x1d\x25\x08\x79\x92\x47\xdd\x9e\x30\x5f\x58\x7c\x61\xa9\xdd\x4e\x55\xd4\x2c\x12\x2a\x74\x13\x08\xbf\x85\xa2\x71\x00\xe4\x10\x6b\x8a\xd9\x6e\xe1\x9d\x89\xb4\x19\xde\x60\x94\xd4\x8c\x15\x46\x88\x4d\x54\x20\xeb\xd3\x95\x57\x10\x17\xfa\x3a\x0b\xb0\x9a\xda\x43\x8d\x3d\x07\x6a\xf4\xac\x80\xca\x4d\xb2\x7c\x00\xb0\xe6\xa4\xa0\xd9\xc2\xda\x76\xeb\x12\xb1\xa0\xb0\x10\x96\x90\xaf\xa3\x57\xaf\xc0\x9f\x1e\x55\xb2\xce\x1b\x15\xed\x8f\x56\x3c\x82\x1e\xcf\x6b\x78\xe3\x63\x6a\x7f\x02\x63\x13\xf0\xd4\x6f\xb4\xb3\x37\xc7\xf5\xf6\xa8\xb5\x9b\x6d\x0b\xa7\xdb\x98\x1b\x5b\xf8\x5b\x34\x5f\xb4\x58\xb3\x99\x87\xb0\xae\x31\xe5\x77\xe7\x5a\xbf\x6c\x6c\xb4\x50\x99\xd2\x09\xb4\x45\x97\x65\x69\x25\x21\x6a\x83\x10\x15\x4b\xdd\xc3\x3a\x00\xae\xeb\xd7\xa7\xfd\x87\x59\xce\x6c\x64\xdc\xab\x58\xe8\xfc\x1f\x18\xec\x71\xe8\xf9\x14\x0c\x36\x7f\x35\x51\x9f\x51\x7e\xdd\x86\x22\x76\x7b\xff\x39\x3d\xa4\xf8\x84\x7d\xa5\xcd\x61\x5b\xaa\x3e\xab\x75\x90\xc1\x0e\x69\xa7\xb3\xaa\xe4\x43\x94\xd4\x93\xdf\xd6\xa6\x3b\xcb\x93\x48\x27\x8b\x93\x30\xab\xf0\xc8\xe6\x2f\x3e\x39\x88\x8f\x3b\x09\xf9\x73\xcd\x52\x62\x4b\x5d\xbd\x54\x97\xd8\x85\x4a\x39\xda\xb4\xe3\xd6\x9e\x73\x5b\x5b\x18\x22\x28\x37\x3b\xda\x6c\xf4\xd8\x08\x62\x3d\x8f\xbf\x95\x8f\x8f\x85\x04\x28\x3a\x6a\x36\xe0\xae\xa7\xaa\x02\x14\x6b\xd2\x2c\xad\x1d\xc6\x7a\x5b\x02\x1d\x9b\x14\xa4\xbe\x08\x5f\xfb\xb5\x08\xe9\x86\xbb\x77\x98\x60\x1c\x16\xac\xca\x36\xd4\xc3\x11\xe8\x4f\xc0\x02\xeb\x3f\x06\x59\xcf\x73\xba\x32\x35\x83\x5a\x14\x3b\x88\x44\xdd\xc8\xbf\xe7\xfa\x59\xe8\xb2\x26\x9f\xf6\x48\x23\xd5\x81\xb1\x40\xc6\xf2\xa5\x90\x09\xa5\xa9\x6e\xc7\xa8\x8d\x0b\x67\xd9\x32\x11\xb4\xa8\x0e\x4a\xce\x14\x20\x6f\xf0\x91\x5a\x36\x3b\x0a\x5b\x9e\x7f\x7f\x7b\x72\x03\xdb\x93\x2a\xdb\xf0\xd4\x0d\xd1\xd2\x45\x3f\x79\x73\x4a\xd3\xd2\xe9\x2f\x32\x6b\x05\xa3\x7d\x49\x92\x11\x0d\xae\x3c\x6c\x73\x8b\xf6\xd5\x65\x76\x38\xe7\x6a\xce\x4c\x2d\x37\xce\xec\x1d\xbb\xca\x9d\xc9\xbe\x48\xb2\xa7\xe5\x6a\x6b\xbd\xba\xf1\xe1\x80\x6f\xc4\xce\x56\x29\x45\x53\xa8\x64\xe4\x61\xd9\x8f\xff\x62\x5b\x6b\xab\xa7\xe5\x6e\x38\x79\x5a\x44\x9d\x20\xc0\x5c\x5d\x9c\x36\xb0\xae\xa5\x3b\x6c\xac\xa3\x52\x1c\x56\xb1\x0f\xc2\x24\xdc\x77\x57\x70\x57\x47\xea\x8e\xb0\xe4\x61\x7e\x60\x8f\x31\xbc\x0f\xf9\x55\x28\x78\xb2\x5f\x69\xc6\xbe\x29\xb2\xf5\xcd\xd4\x46\x14\x06\x95\x6e\x98\x9e\x13\x6f\x81\x38\xb5\x7e\x25\xf9\xec\xa7\xb1\xac\x97\xe0\xde\x3c\x94\x22\x2c\x6b\xe5\x50\x37\x90\x8e\x89\x1f\x45\xb1\x87\xd4\x64\xf7\x90\x40\xd2\xdc\xad\x74\xf1\x6a\x72\x17\xea\xa4\xba\xae\x09\xeb\xda\x15\x9e\x6b\x37\x71\xc5\xb8\x86\x4c\xe9\x26\x9d\x49\x44\x99\x93\xd8\x26\x20\xdf\x80\xb8\xca\xd9\x77\x9c\x84\x43\x4e\x82\x26\x3b\x94\x35\x35\x4d\x88\x99\xb6\xa2\x24\xa7\xc8\xb7\xec\xf7\x16\x5c\x1f\x85\x26\x56\xb6\x13\xf2\x38\x07\x75\x9e\x9c\xe1\xc1\x0e\xf7\x46\x67\xde\xcc\x0e\xd7\x3d\xd5\xd4\xd3\x71\xe9\x47\xb8\x80\xa1\x96\x8b\xd5\xba\x74\x1f\xfa\xe5\x69\xe4\x93\xe0\x31\x1c\x7b\x21\x05\xdd\xea\xb4\x36\xa4\xdf\x4e\x4c\x85\xaf\x00\xef\x45\x44\x29\x7f\x01\x50\x37\x7b\x9c\x08\x80\xb5\x59\x08\x95\x52\xb1\x94\x4f\xc4\xe7\xea\x6b\xed\x84\x7c\xae\x7c\x93\xfe\x52\x38\x8b\x2e\x84\xe8\x2e\xa8\x27\x72\x67\x40\x70\xec\x59\xdd\x24\xa8\x02\x42\x41\x91\x52\x02\x63\x1e\x31\xa3\x6c\xe6\xa9\x70\x28\x9c\x58\xfe\xd1\x09\x14\x3b\xf2\x10\xac\x04\x52\x53\x12\xe5\xd0\x40\x97\x3a\x5d\x2a\xc9\x81\xf5\x6e\xf1\x52\xcd\x96\xa8\xa9\xfb\x47\x82\xbc\x8e\x12\x57\x05\x96\xde\x0f\x18\xa1\x36\x41\x87\xe4\x11\xda\x98\x99\x91\xd4\x25\xd2\x10\xff\xbe\x1b\x5f\xf1\xc3\xc1\xb6\x87\xaa\xf3\xee\xcd\xb0\x94\x00\xcb\x3e\xfb\x81\x7f\xa7\xfb\x02\xd7\x1f\x28\x94\x59\x11\x67\x4b\x94\x7c\x67\x07\xad\x04\xb7\xf9\x6d\xc3\x7e\x16\xa8\xda\x42\xcc\x5a\xa2\x0f\x04\x3c\x80\xfc\xf7\x73\x9c\xd7\x97\x39\x74\xdb\x3a\x01\x4f\x16\xc2\xf6\xf8\xcc\x95\x34\x98\x1a\xf5\x84\x09\xa6\xdd\x55\xa3\x15\xaa\x63\x84\xe2\x76\x4e\xfa\x7e\x10\x8e\x1b\xaa\xac\x7f\x98\x92\xfd\x31\xff\xb6\x3c\x4d\x4e\xf8\x7f\x79\xe2\xb5\xb2\xc0\xab\x0c\x17\x47\x8a\x2b\xbf\x7b\xfa\xf8\x5e\xd9\xd9\x0f\x57\xde\x5f\x61\x45\xcc\x32\xd1\x95\x29\x18\x7e\xe5\xe4\x5f\x71\xa5\xf9\x74\x86\xd1\x45\x45\xbd\xcf\x95\x84\x39\xff\xec\xab\x63\x6c\xb7\xb1\x5a\x63\x7d\x90\x51\x4c\x21\xe4\x7a\x4e\x50\x27\x25\x7f\xdb\xad\x8b\xab\xe8\x1d\x30\xbf\x9a\x89\x7d\xc6\x65\x91\x15\xf1\xc2\x81\x18\xbd\x92\xa0\x9c\x40\x91\x55\x20\xfc\x67\x88\xf5\x0b\x07\xfe\xca\x9e\xe3\x03\xa5\x2b\x87\xec\xda\xd8\x41\x7f\x45\x8b\xb2\xfc\x90\x2d\x9a\xf4\x3d\x08\x1b\x2f\xdb\x78\x2b\x85\x16\xab\x2f\x4a\x85\x58\x2c\xf5\xe9\xf9\xb7\xe4\xfc\xd2\x22\x96\x85\xa1\x34\x9b\x93\x90\x25\xae\x05\x66\x13\x13\xfe\x4e\xb4\x3b\x0d\x94\xf0\x3e\x84\xa8\xf4\xc7\x9e\x72\x29\xbc\xb2\xa8\x68\x33\x58\x75\xde\x88\x74\xfc\xf4\xe2\x43\xfe\x91\xe3\xe2\xc7\xee\x4f\xc1\x89\xed\x22\x7a\x31\x00\x4e\x85\x6b\x10\xf0\xdf\xa3\x4c\x73\x09\xa3\x20\x94\x18\x7d\xbc\xa2\xde\xa7\x1c\x99\x8d\x2e\x97\x23\xad\x81\x4e\xbe\x61\xb1\xc0\x55\xf9\x11\xd9\x26\x96\x44\x1e\xdb\xdf\x43\x74\xb1\x3d\xc0\x61\xa1\xf9\xbe\xeb\xcf\xef\xe4\xc8\xe9\x77\xd2\xd4\xfd\x2d\xfa\xa4\x6d\x6d\x36\x2f\xe1\x0a\xb7\x4a\x3e\xc2\x2d\x79\x2d\x44\x2b\x0b\x2c\x0f\xd0\x31\xa7\xed\xe7\x3a\x94\x69\x8f\xa9\x99\xb7\x2a\x02\xd9\x75\x71\xa3\x71\xee\x01\x42\xa6\x77\xab\x4d\xd1\xaf\xef\x5a\xc1\xb9\x6c\x60\x3f\xd5\x46\xf6\xc9\xe1\x5f\xc5\x12\x3b\xf8\xa3\xfd\x2a\xc9\x9f\xcb\x9c\x76\x82\x96\xa1\x2d\x35\xc4\x17\x7d\x99\x2e\xb3\x8d\xca\xc4\x56\x05\x5f\x7b\x1b\x93\xf9\xfd\x55\x0a\xf6\x21\x54\xb2\xc8\x52\x1e\x6f\xe9\xcb\x98\x59\x75\x31\xf7\x53\x12\x33\xea\x5c\xa0\xbe\xee\xfd\x8b\x85\xa3\xc4\x66\x9b\x31\xc5\x9f\x49\x90\xea\x19\x9d\x16\xf0\xc7\xe1\x90\x7a\x54\x81\x2c\x09\xbe\x0a\x0a\x3c\xa6\x8e\x81\x3d\x2b\xc1\x48\x45\x65\x66\xa0\x0c\x0b\x96\x4f\x46\x96\x5b\x0f\xb2\xfa\x78\x00\x4c\x96\x27\x25\x18\x54\x76\x2d\x61\x07\x81\xe6\x12\x7a\xb0\x61\xb3\x49\x14\x78\xbc\xb9\xab\x91\xfd\x71\x45\xdc\x8a\x03\x8b\x49\x80\x06\x38\x70\xd8\xfe\xfa\x4b\xdb\x21\xc0\xb8\xf6\x5b\x6d\x01\x44\x4e\xd5\xf4\x58\xb0\x5d\x14\x9d\xf9\x55\x72\x44\xf6\xd0\xfd\xdb\x6f\x04\x3b\x14\x5f\x17\x39\xd0\x49\xde\x95\x7f\x31\x70\xc8\x52\x0d\x0a\x60\xb2\xb0\xc7\xdb\x36\x2a\xa2\xd2\x87\x6d\x9f\xbc\x9b\x80\x4b\x06\x1c\xf5\x21\x60\xf2\x40\x79\x14\xc5\x52\x9e\xad\x28\x65\xe9\xbd\x46\xdd\xf5\x08\x89\x05\x92\xbf\x15\xe4\xa8\x02\x1d\x29\xfc\xd4\x0f\x49\x98\x1d\x72\x65\x39\xbc\x28\xef\xc1\x2b\x4b\xc9\xd5\x8b\xd3\x9e\xb3\x1c\xa9\x83\xc0\x9a\x7f\x03\x60\x3f\x0d\x87\xd2\xfd\x72\xc9\x3f\xec\x76\x88\xb2\x20\xcc\x58\xb7\x25\x6c\xb9\xba\x0f\x9f\x9a\xb5\x3b\xc0\x61\x67\xf0\xfc\x82\x2d\x63\x59\xbd\xb6\x06\xfb\x56\xf6\x3e\xbb\x3d\x6c\x2b\xb7\x42\xb5\x52\xcf\x55\x1f\x31\x87\x19\xbf\xe5\xa5\x27\x37\xeb\x20\x39\xd7\x09\x9e\x64\x81\x8c\x9e\x9e\x14\x71\xa5\x29\x32\x60\xcf\xa1\x2a\xe9\x6b\x73\xc2\x52\x37\xb4\x4f\xad\x2d\xe1\x85\xcf\xc6\xbe\xa7\x8f\xbd\xdd\x49\x90\xf0\x55\xe1\xc9\x28\x01\xf2\x55\x17\x9f\x20\x2e\xd9\x86\xe4\x1e\xa9\xc3\xae\x56\xae\x08\xe8\xe4\xe5\x68\xa9\xbf\xaa\xa5\xc3\xca\x76\x1d\x81\xad\x47\x2b\x3b\x19\x94\x0d\x51\x5f\x43\x30\x36\xbe\x1c\xf8\xe7\xa4\x63\xaa\x25\xf2\x91\x89\xca\x73\x3a\x09\xb1\x9c\xe8\xd6\xec\xde\x5f\xb5\x94\x66\xed\x95\x6a\x3c\x6a\x38\xd5\x2e\x5a\x42\xe5\x5a\xb0\x06\x90\x9a\xf2\x44\xda\x9d\x5e\x55\x4a\xd2\xa6\x2f\x67\x18\x54\x83\x7b\xa7\xc8\x72\x00\xe8\xf1\x6d\xc0\xc4\xbe\x6c\x7a\x77\xcd\x82\x61\x2f\x1d\x9c\x1c\x69\x5e\x6c\xf7\xdc\x87\x6b\x17\xee\x25\xa6\xf9\x85\xfb\xde\xf0\x13\x51\xf3\x39\x2a\x10\x5b\x0a\x5e\x40\x5f\xcb\x91\x78\x3d\x79\x46\xd6\x85\xfb\x7a\x0b\x02\xa2\xa7\x37\xda\x15\xec\xab\x9d\x67\x52\xb4\x45\xa5\xc5\x12\x92\x71\x09\xf7\x6a\xaf\xa5\x85\xaa\xad\x53\x37\xfd\x84\xd6\xdb\x0a\xdb\x7b\x07\x1e\xe0\x52\xf1\x7e\x3e\x28\xc1\x06\x40\x5b\x28\xdf\xb2\x9c\xdf\x6a\xb6\x40\x66\x0b\x7c\xdd\xd6\xe1\x67\x5f\xce\xea\x5b\x5d\x3e\x22\x0d\x39\xf4\xba\xb8\xe6\x32\x61\xd9\xa3\x0c\xc2\x97\xf4\xf4\xdb\x7a\x06\x59\xd5\x25\x4a\xbd\x35\x4a\xfd\x77\x3a\x43\xfd\xd7\xa2\x95\x5e\xd4\xf2\x5e\xdd\x27\xda\x0e\xbb\x66\x2d\x46\x73\xfe\x2d\x76\xf2\xdc\x2b\x74\x3f\x14\xa0\x08\xed\x7f\x5d\x5d\xe8\x71\x82\x59\xa9\x5a\x83\x43\xb4\xbf\x4f\xed\x95\x88\x43\xd8\xc7\x7f\x3c\x80\x54\x6f\x58\x61\xb3\x59\xbb\x28\x86\x1e\x2c\x7d\xd5\xb5\x75\x99\x1e\x41\xbd\x5d\xbb\x96\x08\xef\xfe\x29\x65\x9c\x7d\xa4\xec\x17\x9e\xbd\xb4\x51\x16\xb7\x93\x65\xea\xee\xc6\xfd\x1e\x34\xf5\xc1\x07\xd1\xf7\x22\xf2\xfb\xa4\x8c\xad\xc3\x87\xaa\xbf\xb4\xf5\xda\xc8\xb2\x74\xf5\x07\x1b\xa4\xc2\x4b\xbb\x7c\xbe\x14\x8f\x07\xac\x36\xf1\x1c\x87\xff\x4c\x12\x5d\xed\x16\xa3\x3f\xe3\x75\xa2\x04\x8c\x85\xa5\xaa\xf5\x0e\x63\xa2\xef\x1a\xe0\xa5\xf1\xdb\x0d\x49\x46\xdb\x54\x7b\xd9\xb1\xa0\xdf\x8d\x2b\x07\x7c\x6f\xc9\xe1\xda\xa5\xeb\x73\x84\x82\xcc\xed\x30\x7a\x09\xd6\xd6\x0e\xfa\x7e\x40\xe5\x73\x0e\x4f\xdd\x3d\x77\x51\xc3\xdb\x73\x68\xdf\xc3\x75\x20\x47\x72\xb7\xdf\x3e\xe7\xf0\x5c\xb1\xcb\x72\xba\x85\x04\xfd\xba\x3d\x28\x9f\x1b\x81\x7e\xd6\x83\x0b\xa4\x4a\x65\xd0\x6d\x5d\xf1\xf6\x07\x29\x56\x75\xe5\xc8\x23\x42\xed\xb9\x1d\xe6\x53\x6a\xde\x50\x89\x8a\xbd\x49\xfa\xb8\x69\x5a\x63\x47\x85\xa3\x3f\x9f\xb7\x98\x6e\x3a\xab\xdd\xb7\x4b\xde\x32\x5e\xa4\x33\xec\xda\xb7\xd2\xb6\xbd\x8d\x67\x76\xff\x2c\xed\xb7\x87\x55\x9e\x2b\x16\xab\x53\xb0\x1b\x9a\x3a\xba\xf0\xbc\xc4\x9e\xed\xea\xd3\x44\x8f\xcd\xed\x8c\xc2\x07\xcc\xb2\x34\x4d\xdd\xce\x5b\xdc\x04\xf6\x48\x42\x8a\x9f\x5d\xb2\x4c\x8e\xea\xb8\x5a\x3e\xb3\x7e\xc0\x65\x59\xcb\x71\x54\x27\x92\x4d\xea\x8c\x7c\xbd\xc8\x2e\x30\x26\x80\x8c\xd1\xa5\x37\x53\xf0\xd9\xac\xdd\x11\x2c\xcf\x8a\x38\xb0\xf0\xb8\x01\x11\x12\x1c\xb0\x81\xec\x4b\xcf\x6d\xd5\x5e\xb7\x21\x3b\xc6\x83\x7e\xe0\x15\xcf\xed\x0d\x41\xb2\x81\xe9\x54\x08\xff\xb1\xb5\x0a\x67\x6d\xd9\x67\x91\x8a\x31\xf0\x26\x01\xe7\x7d\x8c\xd9\x19\xae\xa3\x00\xe5\xfb\x6d\x83\x41\x31\xde\x3b\xa6\x33\xb9\xde\xa0\x95\x4a\xb8\x89\x4f\xbb\x20\xf3\x2e\xce\xae\xc3\xd7\xd0\x6f\x77\x1d\x5f\x9d\x99\x3a\x1e\x0f\x02\xf2\x4e\x61\xde\x47\x95\xdf\xf5\xf9\xf9\xe6\x0a\xe9\xe1\xee\xfd\x94\xc0\xa3\x45\xd3\xed\xda\xe8\x18\xea\x56\x45\x77\x80\xde\xdb\x72\x7b\x92\xc3\xf4\xea\xa8\xe8\xf9\xbb\x5a\x1d\xc2\xbc\xb1\x23\x0e\x67\xf5\xb7\xb6\xdc\x08\x53\xf1\x28\x77\xf2\xf1\x06\xce\xaf\x71\x96\x08\x53\x1b\x46\xe6\x79\x7c\x57\x43\x72\xcc\x7a\x15\x2e\x63\xcd\xe0\x51\xd1\x0c\xc2\x01\x94\xf8\xbc\x27\x27\x66\xde\x3f\x1b\xc7\xed\x11\x38\xd6\xf9\xf6\x31\x3f\x62\x91\x17\x48\x05\x9b\xd7\x6a\xe5\x04\xfe\x1a\x3e\xc8\x5b\xd0\xfe\x25\x5a\x9a\x6f\x12\x10\x0e\xf7\x29\xe9\x0c\xeb\xb3\xe3\xc9\xc2\xf4\x99\xf7\xa0\x4d\xf6\x38\xe5\x82\xa7\x91\xdb\x53\x3e\xdc\x0e\xfd\x10\x4e\xc8\x86\xe2\x3f\x55\x0c\x2c\xf4\xc7\xda\x15\x78\x22\xd7\x03\x46\x3f\x52\x27\x5f\xa1\x7d\xde\x88\x28\x98\xa4\x07\x08\x7f\x9e\x83\x13\xbe\x9e\x14\x92\xa3\x23\x7a\xa8\xd6\x02\x97\x9f\xb1\x5a\x25\x54\xfe\xbf\x91\x36\xd8\xc0\xe1\x0b\x13\x8e\x90\xb0\x75\xdd\xe6\x81\xc0\xf7\x95\xb0\x40\xc7\x7b\x8b\x91\x25\xc4\x7d\xdd\x8d\xc5\x3b\x21\xf3\xcb\x0d\x83\x82\xda\xb1\x13\x25\x42\x14\x19\xde\x5f\xb7\x4b\xfb\x46\xa0\xfb\x37\xa1\xd4\xa5\x8f\xf5\x62\xfd\xd2\xbc\x37\xd7\x11\x63\x93\x35\xa9\x0d\x7b\x43\xfc\x09\xad\x97\x38\xb2\x64\x60\x95\x0d\xf2\xa3\x90\x2a\x3e\x02\xe8\x4f\x68\x7e\xac\xee\xad\xe5\x00\x82\x67\x67\x68\xfb\x37\x1f\x7a\x39\xaf\xd1\x8a\xb0\x35\x58\x84\x74\x9f\xf6\x2c\x9c\xff\xac\x8d\x83\x4a\x78\x6a\xd6\x00\x3e\x43\x00\x03\x9b\xdb\x5f\xa0\x38\xea\xb5\xe9\x92\x1c\xb4\x63\x36\x1d\x90\x1e\x94\x0d\x78\xbb\x67\x6d\x9b\x20\x12\x4c\xe7\xc8\x7d\x48\x8b\x3c\xc8\xbb\xe3\x4c\xb1\x8e\x2c\x67\x74\x8b\x82\xb4\xe6\x19\x5e\xe8\x27\x2f\x15\xea\x3f\xb9\xa1\xf9\x93\x59\x81\xf5\x46\x20\xf5\x12\xe2\x3e\xda\x98\x50\xb4\x1b\x59\x4a\x2b\x1d\x66\xf7\x85\x7f\xfc\x3f\x99\xc1\xfb\xeb\x03\x91\xfc\x83\x5b\xe4\xaf\xa2\x0d\x0c\xe3\x54\x79\x65\xeb\x33\x63\x9a\xac\x33\xcf\x55\x4a\x24\x2c\xe4\x2a\xd1\xe0\x8c\xee\x1a\xb6\x12\x39\x0a\x64\xd1\x90\x3f\xbf\xfd\xd4\x70\xac\xfe\x6a\x4e\x62\x70\x60\xc9\xc9\x7a\x11\xa2\xf9\x3f\x01\xe0\x3f\xf7\x80\xef\x9f\x81\xfc\xc7\x34\x33\x5e\xfe\x52\x71\xe6\xb4\x0c\xb9\xb3\xfa\x37\x90\x39\x2a\x59\x24\x49\x7f\x05\x22\xcf\x5e\x8b\x41\x10\x2a\xce\x40\x6b\xc6\x5f\x95\x90\x15\x33\xb2\x2f\x44\xc5\x4b\xfb\x75\xc6\xd5\x04\xaa\xbc\x6f\xdd\x8f\xa0\x07\x3c\x6e\xe3\xf8\x88\xd7\xdb\xed\xaf\x36\x2b\x57\xa0\x2a\xd3\xa8\x8d\xc5\x05\xbd\x08\xb3\x08\x4a\x3f\x9f\x7f\xe5\x41\x3e\x01\x20\xec\x3b\x63\x01\x77\x2c\x7a\x0a\x17\x67\x21\xb7\xc7\x21\xd7\xf8\xb0\x93\x07\xc1\x20\xb4\x9d\xdd\xe3\xda\x23\x9b\x99\x9f\x24\xff\x94\x15\x0c\x86\x49\x91\x8f\xc0\xf6\x30\xd8\x53\x72\x56\xfb\xad\x52\x5c\x88\x0c\x7c\x04\x27\x12\x94\xff\xb8\xcf\xab\xcc\x51\x96\xeb\x9f\x6f\xe4\xeb\xf0\x70\x8a\xc2\xee\x66\xe4\xfe\x9d\x31\xe5\x2a\x6d\x00\x4f\x6d\xce\xed\x63\x0a\x43\x30\xf2\xfc\x2a\x97\x9f\x0e\xc8\x5c\x8f\xa0\xb4\x24\x36\xc1\x79\xfc\x96\xc6\x83\xc5\x73\xd6\x05\xb0\xf6\x2b\x58\x07\xc8\x0d\xc9\x11\x28\x8b\x97\x47\x6d\xfb\x4c\x64\x29\x34\x32\x52\xb7\x71\x45\x98\xff\x91\x58\x22\x70\x0e\xa8\xf0\xfc\xd9\x3f\x45\x69\xb8\xa8\x04\xa2\x0f\xec\x12\xd4\x42\xe9\x62\x14\x5f\x00\xa1\x12\x14\xb8\x08\xed\xd5\x20\x6a\xc9\x3f\x14\xad\x06\xc8\x98\x65\x01\x90\x74\x29\x10\x40\x4e\x01\x5f\xde\xc3\x87\x7e\x73\xd3\xa7\x05\x0b\x98\x2a\x8e\xcc\xca\xa8\x67\xeb\xfb\x63\x00\x13\x15\xe0\x0a\x0a\x40\x47\xe4\xff\xf1\x16\xd6\x1f\x5e\xbe\xd2\x1a\x9f\x1d\x5b\xfb\x08\x06\x80\xa0\xe6\xc5\xad\x08\x09\x6b\x2f\xd5\x87\x17\x52\x8c\x09\x1a\x83\x3c\x1e\xd9\xa7\xe4\xa0\x49\x14\xe8\x14\x87\xcc\x71\xb1\x7e\x9e\xea\xaa\x01\xc8\x03\x79\x00\xf5\x37\x47\xa0\x97\xb0\x33\x98\xa5\x28\xe1\x6c\x00\xbe\xf3\x56\x60\xa0\x3b\xfd\xdf\x4d\x1d\x68\x1a\xe1\xfe\x0f\x40\xbb\xf5\x27\x62\x0d\x86\x2c\x80\x9d\xf3\xa4\x2c\xc8\x99\xed\x18\x5e\xe2\x0f\x3c\xfd\x2e\xe5\x89\x8c\x7b\x37\x6e\xd5\x78\x15\x54\xb3\x61\x84\xfe\x18\x5f\xb4\x94\x54\x86\xef\xe0\xa6\x23\xc9\x78\x04\x9d\xe0\x41\x36\x81\xce\xdc\x79\x05\xc4\xf4\x8f\x03\xb5\xad\x3b\x82\x03\xe6\x11\x40\x06\x39\x72\x58\x43\xc2\xdd\xf9\xb0\xc9\x7e\x93\x68\xc2\x9f\x0f\x5d\x16\x7b\xb8\x7d\xb3\x1c\x15\xb0\x8f\x51\x2b\xc0\x54\x73\x8b\x69\x18\x99\x01\x57\x58\xd8\x9f\xda\xee\xce\x20\xa7\x12\xb4\xe5\xc2\xc3\x2d\x51\x0d\xe4\x0e\x03\x74\xd0\xfc\x43\xbd\xaa\xa5\x77\x6e\xe3\x6f\xfa\x24\xe9\x40\x6f\x1a\xcf\x66\xd7\x13\x0a\xf6\xc1\x25\x37\x7c\x79\x96\x63\xd6\x0d\x9b\x1f\x86\xa1\xaf\xee\x6e\xf9\xdc\xf2\xfb\xe6\x51\xef\x9f\xf0\x75\x3c\x6f\x77\xcc\x0f\x7f\xfe\x9e\x1d\x87\x07\xf7\xb7\x01\xf5\xcb\xcf\xe9\x9c\xc3\x3e\xa7\x5b\xde\xc4\x25\xac\x79\x1b\xff\xcc\xfe\xa5\x3f\x83\x36\x84\x13\xb9\xf1\xfe\x83\xea\xd5\xbe\xa9\xf0\x37\x48\x0a\x39\xef\xe0\xc4\x9a\x68\x18\xf0\xbf\x73\xf5\x79\x99\x4a\xcc\x44\xc0\x59\x70\xca\x03\x20\x0e\xfe\x69\x25\x75\x22\x14\x1c\xbe\x68\xd0\x3f\xc4\x5a\x08\x71\x6b\x38\xd8\x3c\xc8\x5e\x00\x2e\x5a\xec\x85\x9d\x9b\xfe\x1c\x03\xbf\x34\x49\x95\x08\x8a\xd6\x9b\x6c\x84\xbd\xfe\xd7\x9c\x13\xba\x29\xa0\xac\x59\xc8\x9d\x32\x6b\x1c\xd0\x11\xf5\x73\x00\xbf\x2a\x24\xaa\xb1\x5c\xe9\x5d\x0f\x5b\xd5\xe4\x5f\x85\x79\xcc\x08\xde\xf2\xe5\xbf\xd9\x0a\xd5\xf3\xd5\xba\xda\x8d\x95\x40\x79\xfe\x4b\x2d\x9a\x0c\x22\x1b\xa1\x84\x25\x44\x21\xbc\xaa\x58\xef\xb2\x96\x9d\x92\x8d\x77\x51\xf7\x45\x1a\x37\x15\x2d\x1b\xbb\xd0\x98\xce\x84\xb7\xe7\xeb\x9c\x81\x28\xf4\x28\x51\x7f\x7a\xe3\x54\xe5\x65\x9d\x8c\xa3\x5f\x5f\x5b\x26\x43\x22\x51\x44\xe3\xc5\x1f\xff\x4b\x8e\xda\xf7\x3a\xfb\x4b\x59\xe8\x6b\x7c\x53\x80\xfa\xd8\xb9\xea\xf6\xaa\x26\x82\x2f\xb9\x9e\xbd\x46\xe8\x4e\x7e\x3c\x7a\x91\x44\x71\x51\xe7\x1f\xeb\xf0\x7b\xd2\xbe\x26\x35\xbe\x4d\x7a\xc2\x5e\xd6\x03\xbf\xdc\x60\xd0\x1b\xdb\xc4\x93\x85\x86\x89\x16\x4d\xc0\xa3\xf0\xcc\xf7\xf7\x1c\x59\x57\xf9\x3d\x55\x15\xb6\xa0\xcf\x44\x49\xa2\xb5\xfb\x5a\x34\x90\x38\xec\x82\x7e\x8b\x8f\xbe\xbf\xd9\x66\xf8\xf9\x21\x41\x6b\xbf\x58\xbf\xf9\x75\x79\x89\xea\xd7\x72\x82\xb7\x64\x76\x7f\xb3\x26\x69\xbf\x99\x7a\x1f\xb6\xe5\x74\xc4\x82\xfd\xd4\x2b\x5e\x7e\x02\x13\x83\xcf\xdc\xaf\x3d\x6a\x36\x29\xa2\xa8\x35\xa5\x9d\x5c\xc8\x9a\x70\xd5\xdf\x24\x98\xc1\xaf\x5b\x34\x29\x18\x42\x60\xc7\x65\xae\xd9\x29\x8c\xff\x16\xef\xbd\x50\xdc\x0d\xd6\x2b\xb4\x26\x79\x95\xc4\xe4\xf0\x08\x37\x00\x77\x6e\x5b\x95\x2f\x66\xfc\xc5\xe8\xb0\xbc\xb9\xb4\x41\x4e\xd8\x90\x69\x1e\xb5\x35\x27\xbd\xff\x25\xae\xc3\xbb\xa8\x7a\x3e\xba\xdd\x60\xaa\x1c\x07\xf4\x70\x92\x64\xe7\x9a\x4d\xec\x7e\x90\x00\xd2\x7c\x39\x52\x8c\xff\xc9\x44\xd1\x42\x31\xb2\xb6\xd6\x5c\x17\x71\xc7\x65\xaf\xba\x9a\x16\x43\x2f\x40\x27\x42\xa7\x95\x78\x0f\x67\x7e\xe3\x62\x77\x00\xdf\xe6\xac\x12\x1d\xfa\xf4\x12\x7d\x65\x75\x60\x41\x25\xd5\xac\xcd\xd5\xb6\x7d\x0b\x09\xc8\xca\x4a\x01\xf5\x23\xc8\x22\x80\xf0\xed\xf1\x4d\x2d\x14\x3a\xf9\xc6\x16\xe0\x3b\x8f\x6c\x76\x74\x6e\x37\xfb\x05\xbe\xa6\xb1\xc0\x0e\x5e\x47\x88\x16\x7b\xdc\xc7\x45\x50\xa3\x1e\x36\x15\x51\xd1\xa5\xd8\xed\x27\xf2\x72\x68\x9b\x44\xb8\xfd\x33\xba\x6f\x2d\x63\xd4\x08\x27\x6a\xb5\xdb\x1d\xbf\x8a\xe9\x70\xad\x40\xaa\x43\xda\x95\x2f\x61\x87\x3b\x65\xcc\x41\x0a\xe1\xbd\x02\xe0\x93\x6f\x6c\x28\x1e\x3d\x98\xa9\xed\x32\x9c\x0e\xc2\x91\xef\x2e\x28\x20\xe4\x45\xc0\x6d\x5b\xcc\x0c\x54\xbf\x29\x09\x27\xce\xc7\x12\x2f\x34\x36\x3b\x6b\xbe\x1b\x08\x00\x80\x85\x70\x9f\xf7\xb3\xdf\x82\x5e\xc3\xb8\x95\x61\xf4\xee\x07\xf6\x9e\x0e\xb7\xe0\x59\xda\x85\x57\x4a\xbd\xab\x49\xee\xc4\xe8\xfc\x39\x32\x40\xc6\x17\xfd\x0a\x07\xcd\xfe\xb0\x6e\x72\x04\x36\x79\x00\x89\xde\xfe\x6e\xcb\x7e\xf8\xb5\xa1\xc6\xed\xaa\x75\x40\xe4\x1c\xe5\x49\x88\xa7\x35\x9a\xd0\xb3\x8c\x31\x69\xc8\xcb\x76\x91\x39\x62\xf9\xe7\x53\x1d\xfa\x90\x59\xf4\xb6\x14\x7d\x1b\x25\x11\x0e\xba\x88\x2f\x7c\xa8\xd9\x61\xae\x13\xfc\x92\x0c\x19\x17\x4e\x9e\x07\x77\xac\x3f\x2a\x59\xa4\x42\x75\x06\xaa\xa1\x3d\xc8\x12\xd1\xc4\x85\x61\x93\xd4\xe8\xc7\x43\xf2\xdd\x8d\xcf\x0a\x7b\xfb\x81\xc3\x24\xa7\x3f\x2f\x9a\x2c\x5a\xa0\xad\x33\x6e\x96\x91\x2f\x83\xcd\xe0\xdb\x60\x67\x80\xdd\x3f\x55\x7d\xef\x22\xb3\x33\x8b\xfc\xb2\x3a\x29\x24\x4c\xd7\xfb\x4d\x5a\xa8\x3d\x08\x5f\xdd\xa8\x22\x68\x5f\xd5\xf6\x7a\xe8\x04\x0f\x25\x7a\x79\x58\x2f\xaf\xf5\xa3\x93\x13\x80\x7a\x37\x7b\xba\x65\xc0\xbb\x91\xd4\x3b\xca\x85\xef\x54\x14\x57\x51\xa2\xdf\x94\x0e\xbb\x4c\xb8\x4e\x37\x75\xe4\xc8\x58\xd4\xd8\x65\xd0\x27\x15\x67\xf2\xf5\x48\x5c\x3a\x05\xda\xf2\xcc\x4b\xb7\x4b\xda\xa5\x2f\xba\xd2\x3d\x98\x51\xec\xd4\xfa\x29\x81\xb2\xe0\x4c\xbc\x1e\x02\x1c\x7e\xa6\x40\x4d\xbb\xbe\x5b\x0f\x85\xf9\x2f\xde\x88\x1b\x94\xf8\x49\x83\x8d\xe2\x1c\x93\x3c\x92\xef\xd7\xa7\x3f\x4f\xe9\x6c\x8b\xb5\x2b\x3f\x3c\x6d\xe4\x14\x5a\xd0\xf0\x76\xec\xd3\xd4\xdf\x96\x18\x3d\x46\x03\xa8\xc3\x7a\xfc\x74\x2e\x76\xff\xc3\x79\xe9\xf3\xb2\xd1\x0d\x5b\xac\xdb\xfa\x42\xd1\xf3\x54\x81\xdc\x66\x91\x61\xca\xf5\x0c\xfb\x7a\x0f\x48\x7d\xd8\x80\xd9\xac\xea\xe2\xbe\xae\x36\x4a\x85\x08\xc2\xe2\x9e\x99\x58\x90\x35\xc5\x7a\xba\x23\x23\x0b\xaf\x1e\xdb\xb7\x85\xb2\xf8\xd9\x9d\xe2\xab\x8a\xc9\xe2\xa1\x3d\x2e\x9f\xa4\x6c\x1d\x8d\x76\xe2\x2f\x89\x38\x91\x90\x07\x61\x46\xf2\x12\x9f\x31\xf9\x78\xc6\x93\xef\x34\x17\x91\x5c\x7a\xad\x84\x3f\x65\x93\xf7\x9c\xc2\xa8\xd4\xa2\xe7\x33\x76\x56\x81\x03\x90\x5b\x8e\x5d\x18\x8b\x27\x38\xa1\x64\xb4\xd8\x44\x28\x54\xc2\xc1\xef\x2c\x97\x4e\xd5\x66\x3c\x2e\xa1\x89\xb5\x36\xc8\x5c\x7a\xb8\x89\x5c\x72\xaf\xc8\x80\xe4\x02\xaa\x1e\xd9\x31\x64\xcf\x40\x14\xa2\xf2\x63\x5a\x2f\x3a\xf8\xa0\xfe\x0c\x99\xc8\xa7\x94\xd1\xa5\x55\xf7\x84\x14\x16\xfb\xda\x27\x3d\xc2\x9e\xb7\xc1\xda\x33\x34\x5c\xa5\x58\xde\x31\x1c\x58\x94\x42\x94\x63\x2d\xf6\x29\x3c\xf9\xf3\x3e\x23\x54\xa8\xd4\xd9\x3f\xd3\x28\xf1\x72\x8c\x8f\x64\x53\x5c\x36\x45\x56\xd0\x4f\x01\x33\xb0\x06\x99\x18\xff\x7c\xec\x29\x0c\xed\xc2\xdd\x8a\xb9\xd6\xb6\x39\x2c\x07\x35\x12\x5d\x46\xf2\x56\x80\xf1\x1e\x53\x55\x99\xce\x6f\x09\xed\x6e\x6c\xd9\x45\x8b\xc5\x17\x18\xb6\x5c\x1c\x44\x41\xdc\x3f\x64\x72\x9c\x01\x1b\x21\xc8\x36\x9f\x7d\x48\xf2\xe4\x93\x7a\x8b\x58\xba\x29\xb2\x81\x8d\xf8\xe1\x4c\x18\xef\x22\x82\x81\x82\x75\x46\x97\x92\xca\xe0\x4a\xf0\x4f\xb5\x67\x41\x9f\xb5\x4d\x92\x35\xe7\xd5\xb2\x71\xef\x20\x91\x1b\x11\x7b\x9c\x2f\x5e\xcc\xfe\xf8\x3f\x34\x19\x65\xd0\x58\x75\x72\x59\x43\x18\xcb\x9e\xfb\xf8\xad\x15\x8f\xd4\xd4\x25\x38\xb2\x34\xd3\x8f\xba\xee\x69\x83\x81\xee\x79\x8b\x82\xd4\x32\x7f\x55\x85\xb2\x9b\x29\xef\x8c\x86\x6b\xe7\x0d\x91\x67\x39\x0e\xba\xb2\xba\x57\x41\xed\x85\x9d\x5a\xb3\x7c\x1f\x52\x68\xd8\xd3\xf3\xe2\x00\xeb\x10\x98\x45\xf7\xab\xf6\x4a\x51\xee\x2f\x98\x67\x91\x3e\xf4\xb4\xfb\xd5\xcf\x96\xab\x60\xbe\xaf\x1d\x84\x36\xb3\xc7\x11\x9c\x98\x47\xe5\xd7\xb8\xfa\xf5\xb9\xba\x26\x16\x6f\x67\xb6\x82\xa8\x60\x63\x04\x59\x13\xd0\xb0\xcd\x9d\xb8\x0f\xe7\x53\x87\x56\xac\x6d\x27\x8e\x5c\x77\x2a\x61\xee\x4e\x97\xf6\x7d\x04\x1d\x67\x51\x5a\x82\xaf\xe7\x3a\x6d\x17\x5d\x55\xb7\x91\x5c\xea\xea\xeb\x24\xe5\x8c\x5c\x1d\xec\xb6\xf4\x69\x42\x8d\xc5\xa9\x3a\x73\x65\xe5\x04\x13\xba\x2b\x95\xd8\xe3\x44\x00\xba\x8f\x76\xb0\x0e\xb8\xc2\x3a\xa2\x2b\x35\x37\xee\x28\x43\xcb\x63\x96\x9f\x83\xb3\xb5\xae\x78\x39\xdd\x59\x3c\x55\xd8\xa4\x2b\x1a\xbd\xbb\xd2\xb7\x44\x8d\x79\xa3\x75\x19\xd3\x38\xa6\xad\xa9\x3f\x63\x7f\x2a\x9d\xf9\x43\x32\xc6\xf8\x56\x41\x1c\x12\xf0\x62\xf4\xec\xb0\xfa\x4a\x9b\x1a\xff\x91\x80\x87\xf1\x5c\x66\x3c\x8d\xaf\xba\x3f\x6c\x65\xea\x8e\x01\xce\xe2\x49\x31\x58\xb6\xc1\x0e\x1a\xea\x21\x79\x89\xe2\x8e\xcb\xc2\xfb\xf2\x67\x30\x79\x76\xad\x63\x82\x35\xf4\xd6\x04\x40\x85\x95\xb7\xce\x96\xb6\xc6\x36\x2a\x6b\x38\x04\x21\x28\x58\x42\xe8\xd8\xea\x17\x85\x82\xfb\xf8\x2b\xfa\x92\xab\xc7\x93\x94\x62\x33\x83\xa2\xaf\x6c\xe3\x78\x67\x07\x55\x12\x10\x11\xc0\x08\xf8\xe7\xa0\x07\x29\x6b\xcd\xca\x3a\xe5\x50\x98\x11\x8c\xe2\x9f\x4a\x36\x3e\x38\x39\xce\x89\x48\xa2\x0f\xb9\x1e\x2d\xa3\xfc\x96\x11\x7e\x97\xa1\x59\x59\x19\x46\x2e\xc2\xc7\xfd\xf0\x10\x64\x04\xd9\xdf\x2d\xc4\xda\xb1\xce\x52\xd1\x77\xde\x8a\x9c\xa6\x23\xec\xb0\x4a\xcd\xf7\x89\x5b\x5f\x7f\x2b\x3c\xd1\xa7\xb8\x5e\xe1\xf5\xf8\x08\x3e\x91\xee\x08\xd7\x97\xe7\x39\xda\xaf\xb2\x52\x7e\x1f\x61\xec\x2c\x5d\x5c\x9d\x76\x74\x90\xb8\xef\x4f\x92\xff\x4f\x9f\x4e\xcc\xa0\x73\x1d\xaa\xfe\x7c\xde\xc9\x4d\xf3\x2e\xc9\xbf\x26\x81\xe0\xc1\x20\xe6\x53\xe4\xff\x04\xb2\x1f\x2b\x25\x51\xac\x6d\xcf\xf6\x8c\xce\x08\x3c\x9f\x4d\x69\x4c\xbb\x5d\x50\xef\xa9\x7d\x60\x8b\x95\xe0\x89\xaf\x94\x4f\x17\x7c\x1f\x02\x4e\x3d\x20\x81\x00\x48\xd3\xd0\x5b\xdf\xfc\x2f\x6c\x51\x3f\x10\xbb\x07\xc8\x7a\x9d\x11\x62\x7d\x0a\x7a\xac\x08\x25\xc0\x6d\xcf\x7f\x9d\x2f\xb8\xba\xbd\xe8\x43\x91\x0e\xfb\x2a\xe7\x21\xca\xc9\x3b\xfe\x30\x30\x85\xae\x6f\xd2\x10\x9e\x9e\xe9\xf6\x37\x68\xcb\x66\xd3\xe4\x20\xa5\x6c\x6b\x65\x1a\x6d\xdd\x2d\x1e\xbf\xee\x84\x56\x81\x1f\x74\x4e\x81\xf2\x45\x0b\xeb\xbd\xc1\xc8\x81\x26\x7e\x0c\x8b\xd2\xc1\xbf\x09\x43\x10\xf2\xaa\xab\xb2\x6d\x30\xa7\xca\xf2\xb4\xd1\x34\xb8\x47\x0e\x65\x4a\x15\xcc\x88\x3d\x5e\xe2\x00\xdb\xa7\x4c\xf5\x84\x97\x6e\xfc\x3e\x86\xad\x20\x0f\x75\x63\x0c\x69\x4e\xf1\xd9\x6f\x4a\x4f\x58\x47\x23\x1e\xa7\x4a\xfc\x19\x45\x5c\xb2\xc8\xb2\x4d\xc5\x28\x48\x4b\xbc\x7e\x2e\x9d\xce\x2f\x24\xf1\xd5\xd2\x83\xd3\x3a\x8a\x87\x41\x33\x86\xf2\xba\xcb\xd9\xeb\x7d\x20\x8b\x54\xfd\xfa\x29\x6d\x95\xee\x53\xa9\x56\x36\xb2\x6a\x86\xd6\x42\x58\x84\x5f\x3d\xc1\xca\x81\xe2\xf2\x53\xda\x83\xe3\x03\x66\xef\xb0\x55\x11\x5d\xdf\xa1\x8a\xb9\xed\xf9\x9f\x6f\xb0\x98\x4e\xb6\x0d\x96\x38\xef\x64\x98\xfa\xf6\x36\xa8\x5e\xdf\x0d\xb5\x6c\xde\x8f\x64\xcf\x05\xf8\x91\x68\xfa\x30\x42\xbd\x7b\x8e\x56\xa0\x19\xe9\xb7\x1e\x9c\x20\x2c\x41\x18\x6b\x61\x8d\x2b\xc2\x56\xba\xf7\x76\x7f\x4a\xa3\x7f\x48\x7f\xdc\x9c\x6f\xf4\x95\xda\x47\xbe\x50\x12\xea\xb1\xfd\xca\xeb\x30\x58\x96\x10\xca\xc7\x83\x38\x53\xa7\xc6\x5a\x2f\xea\x74\xb7\x44\xce\x58\x5f\xb7\xab\xb3\x27\x0b\x4b\x21\x54\x0c\x07\xe6\x22\xd6\x40\x67\xc9\x3f\xdf\xe2\x66\xfb\xe2\x01\xbd\xb3\x57\xf7\x5a\xcc\x35\x71\x77\xf8\xfc\xb4\x05\xd7\xba\xf4\xa7\x7e\x48\xe2\xd3\x04\xf8\x00\xa1\x48\xe4\x26\x9b\xe3\x8b\x62\x24\x0e\x19\xbc\x53\xb3\x98\x48\x6b\x98\x3b\xa4\xb5\xea\xe4\x73\x08\xb1\x6d\xb0\x8a\xde\xa9\xda\x5c\x48\x7a\x3f\x4e\x60\x49\x5d\xa8\xf9\x7b\x99\x5e\xf1\x34\xc9\x0f\x0c\x58\x99\x26\x60\x0c\xd6\x88\x99\x80\x85\x3a\xb4\xc1\x8f\xd0\x5c\x55\x04\x16\x7c\x24\xb2\x90\x0e\x67\x74\x3b\x1f\x91\x0d\xce\xf4\xf7\x07\xa9\x4a\x3a\x1a\xf3\x6d\x51\x55\x40\x2e\x24\x31\x89\xa4\x9c\x13\x62\x35\xce\x00\x3a\x5f\x09\x42\x90\x1e\x8e\x00\xec\x78\xd4\x89\x0c\xe4\x3a\xfc\x22\x2f\x49\x79\xbf\x34\x9c\x96\x36\x5b\xc0\x73\x1a\x49\xdf\x36\x40\x3e\x51\xb1\xa7\x01\x2e\x2f\x08\x4e\x89\xea\x59\x4e\x2d\xe0\xf6\x55\x5f\x12\x67\xad\xd9\xbe\xec\xba\xd0\xe0\xde\x72\x31\x31\x74\xc9\x70\xdd\xc1\x4d\x61\x51\xba\x81\xf1\x74\xcf\xa8\xe8\xa8\x22\x4f\xa7\xa6\x2c\x8d\x98\x56\xbc\x07\xa1\x29\xce\xad\x5d\x01\xbf\x6c\xd3\x29\xd9\x95\x06\x0f\x79\x58\xd0\x36\x53\x55\x6e\x43\x38\xdf\x61\xb7\xc7\x02\xb6\xb7\x86\xb0\x22\x85\x36\xd9\x1f\xaf\xed\x34\x8a\xa5\x6d\x13\x4b\x9e\xa2\x3d\xf2\x07\x0f\xb2\x81\x98\x77\x43\xe3\xe5\x7b\x7e\xf3\x28\x83\x81\x91\x76\xb5\x2d\x63\x24\x0c\x2d\x0f\xe5\x2f\x3c\xfe\x92\xa2\x35\xf6\xf2\xb1\x6a\x50\x05\x7b\x38\x71\xca\xd1\x9c\xbe\x2f\x6f\x3d\xdc\xc4\xc4\x9e\xda\x50\x9f\xe7\x7e\x12\xa9\xd4\x70\x6a\x4f\xf3\x25\x21\x65\x71\xe8\x28\x35\xd4\x47\xf5\xef\x12\x7d\x4a\xef\x0a\x2b\xe7\x26\x7d\xfc\x8c\x1c\xb4\xc0\x1d\x47\x5d\x27\x45\xac\x39\x69\x63\x19\x43\x58\x23\x58\xd8\x84\xed\x44\x83\x65\xc3\x2e\x58\x56\xbc\x46\x69\x6b\x94\xf1\x38\xb7\xaa\xd5\x33\x0b\xdb\x38\x79\x41\xdb\xdb\x65\x3a\x30\x56\x26\x5c\xea\x07\x2e\x4e\xe2\x69\x0a\x6f\x74\xc4\x00\x85\xbf\x14\x77\x1b\xd7\xcb\xd2\xe5\xb5\xb0\xf4\xf1\xdb\x05\x65\x4c\x4c\xbd\xe8\x19\xd0\xde\xbc\xaa\xc3\x21\xcf\x24\xcb\x78\x4c\x4a\xcc\x01\x8f\xed\x4b\x91\x1c\xaa\x2c\x19\xcf\xdc\x0e\x48\x30\x5b\x1e\x18\xcc\x9b\xfd\x9a\xf9\x83\x7a\x8f\x65\xf7\xc0\x10\xf2\x93\x58\xe6\xd7\xb6\xda\x11\x60\xb2\xa7\x6f\x0d\x32\x2c\x16\xcc\xda\xea\x50\x9e\xb6\xcd\xa9\x37\xdb\x4c\x5d\x65\x12\x7f\xb6\xd9\x99\x94\x0f\x39\x13\x90\xd6\x05\x3c\x7c\xf0\xc1\xa2\x11\xa7\x81\x19\xd0\x22\x0d\xfe\x95\xf7\x3e\x6a\x58\xd9\xd1\x79\x8f\x70\x2d\xf8\xab\x64\xad\x11\x78\x56\xbe\x15\x12\x8a\x30\x9c\x8e\xd7\xac\xbf\x66\xa6\x05\x62\x2a\x19\x5b\xa1\x5c\xe2\xe2\x66\x62\xdd\x26\x2c\x13\x0f\x22\x8d\x2d\xe1\x62\x6d\xd3\xb8\xb3\xea\x64\xa5\x19\x4b\x3f\xa2\x5e\xe5\xe9\xe4\xa7\x4e\x10\x64\xb1\xab\xe6\x1f\x32\x35\x80\xc0\x93\xc7\xf5\x9b\xc4\xc2\x92\x1a\x3a\x59\x58\x1e\xf0\xe0\x2a\x74\x6f\xf7\x4a\x75\x6e\x90\x95\x42\x5f\x3d\xb3\x53\x75\x82\x4f\x3d\x0a\x7e\x91\x86\x90\x84\xa5\x18\x20\x2a\xcf\xce\x3d\x9a\xe9\xff\x82\x18\x68\x16\x92\xa8\x2a\xb3\xea\x9c\xef\x5f\xab\xe5\x3c\x25\xd2\x09\xb4\x27\x81\x33\x2c\xf6\x42\x03\x2f\x3e\x39\x58\x7e\x6a\x8d\xd8\xea\xa9\xf1\x6e\x86\x91\xdf\x4b\xcd\x82\x42\x7e\xd0\xb4\x9c\xe4\xa1\x2b\x87\x27\x44\xd7\x39\x39\xcc\x81\x46\x09\xce\xcd\x9a\xca\xe1\x00\x99\xbf\xcc\x15\xc7\xbf\xbc\xfd\x9d\xae\xa1\xf6\x97\x56\xa8\xf8\x3a\x41\x8b\xbe\xb7\x7f\xf0\x11\x60\x81\xe2\x3a\xfb\xb2\x4f\xa0\x6c\xa0\x51\xce\xe2\x9b\x0d\x90\xd7\x8b\x45\xd6\x2b\x7b\x19\xcd\x39\x5b\xdc\xda\x38\xc3\x15\x5d\xb0\xb7\xf0\x9d\x17\xdd\x1a\xae\x1f\x08\xdf\xbb\xfb\xc1\xcf\xbc\x03\x23\x68\x3b\xbd\xfd\xa0\x31\x83\x3c\x0e\xb6\x4a\x78\x76\xd6\xd6\x8f\x1b\x24\xd8\x7c\x56\x6f\x80\xfe\x15\xf9\x54\x45\x2a\x48\x1f\xef\xe6\x49\xec\x9a\x9e\xbc\xeb\x2c\xb2\x0f\x79\x79\xc4\x8f\xf5\xeb\xcf\x20\xf7\xf4\xe6\xfe\x60\x0d\x46\x93\xcc\x8f\x32\xf3\x4f\xac\x6c\xc3\xdb\xc1\x09\xb8\x72\x7a\xe8\x7b\xbe\x1c\x7e\x88\x16\xe1\xc6\xce\x74\xb8\xfc\x0c\xae\xdd\xfc\x20\x1f\x4c\x9d\xe1\x67\x08\x32\xd8\xc1\xcd\x96\x55\x78\xff\x78\x4d\xdc\x5f\x94\x85\xfb\x87\xca\x6b\xb0\xe7\x89\x62\xdf\x27\xf3\x8f\x72\x40\x45\x48\xfb\x5b\xab\x17\x65\xeb\xad\xbc\xc9\xf9\x5e\xa3\xbc\x20\x0e\xeb\x5c\xe5\x90\x53\x4d\x43\x3f\xc9\x87\xb8\x8f\xbc\x65\x91\x57\xe7\x4a\xf7\x9a\x14\x50\x14\xf4\x93\xc4\x89\x02\x0b\xd5\x57\x70\xf8\x0d\x2d\xb4\x79\x67\x0f\xe5\xfe\xfd\xde\xae\x97\xdd\xc7\xbe\x28\x0d\x66\x18\xb7\x07\x2f\xde\x9b\x3a\x0f\xb6\xe9\xb9\x7f\x82\x75\x12\x79\x58\x60\x2b\x79\x50\x1d\xd8\xde\xa3\x43\x9e\xff\x82\x17\xb6\xb7\x41\x2d\x63\xc5\x08\x5b\xdf\x94\x38\x6f\x71\xc7\x54\x71\x79\xe7\x8f\x7f\x8c\xfb\xae\x71\xc7\x76\x04\x9f\x8c\xda\x56\x6f\xcb\x6a\x8f\x14\xc6\xe0\x6f\x8d\x0f\xef\x7b\x58\x72\xaa\x58\xf7\x10\x4f\x8c\x42\xb3\x6f\x8c\x37\x2d\x91\xd3\x6f\x5c\x34\xbd\x19\x05\x62\x79\x66\xa4\xea\x0d\xe1\x49\x98\x53\xaf\xe8\x7c\x66\x37\x34\xcb\x29\x27\x8b\xa5\xc0\x58\x47\xb7\x72\xa2\x17\x74\xda\x55\xa0\x34\x2d\xd1\xcd\xa2\x94\x7d\x6a\xe9\x17\x66\x17\xb9\x72\xb8\x58\x8b\x53\x38\x6b\xa7\x74\xbb\x49\x0b\xa3\x29\x03\x5f\x28\xa1\x73\x0e\xf0\x93\x8b\x12\x80\x55\x66\x3f\xc4\x3b\xf6\x4a\x73\xe5\x9b\x72\x36\xdd\x62\xa2\xe7\x42\x5f\xdc\xb0\xf5\x02\x34\x78\xf7\x12\x20\xdf\xee\x32\x26\xef\x78\x73\xe7\x82\x42\xb2\xd7\xb0\x46\x4f\x55\x1d\xb6\xa9\xd5\x10\x67\xd3\xc0\x9a\xc0\xff\xf6\x17\x96\x3c\x58\x13\x3d\xae\x2d\xc8\x5f\xd7\xca\xf1\xe1\xb8\xb8\x86\x71\x5c\xa0\x53\x23\xf8\x14\x09\x57\x42\x91\xd6\x5f\x3a\x49\x0f\x06\x2f\xad\xa3\x3e\xf7\x81\x6c\x5f\x9d\xe8\x71\x36\x90\xce\x84\x34\x0c\x5a\xbb\x8d\x08\x83\xbe\x0e\x4a\x61\xc9\xcb\x32\x16\xca\xd1\xe2\x64\x81\xe5\xd8\x48\x29\x3f\x20\x86\xbe\xb2\x23\x82\x63\x81\xf6\xf5\x50\xf9\xc9\x94\xe0\x85\xd3\xe3\x14\x07\x40\x64\x98\xb4\x36\x7a\x37\x29\x7c\x45\xd4\x08\x66\xe7\x27\x8e\xc5\xe7\x30\xcf\x40\x42\x78\x44\x24\x64\xaf\xff\xee\xa2\x92\x61\xe6\x1c\xa6\x1b\x80\xa4\x85\x19\x08\x5a\xad\x34\x5c\xac\x01\x3a\x13\xfb\xaa\x03\x55\x42\x59\x6d\x2c\xc2\x13\x1e\xf0\x6e\x03\x7a\x9f\x24\x38\x2e\xa5\x1c\xf8\x25\x3c\xf0\x89\x2a\xff\x12\xac\x14\x3b\xee\xf9\x40\xf5\x75\xe3\x4a\xdb\x31\xd6\x75\xf8\x63\x20\x49\x0c\x4b\xa1\xbc\x98\x43\xb1\x99\x44\x65\xdd\xd9\x24\x49\x14\x38\x4c\x24\xb6\x53\xb1\x4f\x3c\x74\x7c\x16\xf3\x6c\x48\x9f\xa0\xd8\x61\x7e\xc5\x80\xb4\xb6\x7f\x87\x2c\x45\x0f\xd7\x25\x2e\x32\xc0\x39\x5c\xb8\xdc\x03\x39\x93\xf2\xfd\x79\x76\x60\xf2\x91\xfe\x8d\x7e\x2b\xf2\x0e\x12\x10\xe6\x70\x64\xa4\x07\x50\x1e\xe1\x4b\xad\xac\xa6\x31\xad\xbb\x90\xef\xf1\x96\xf9\x49\x2f\x12\x4b\xf7\x6b\x71\x9b\x25\xef\x08\x6c\xfe\x06\x3b\xa2\x28\x11\xed\xd6\x4b\xb7\xf4\xe9\xc8\xf9\x70\xf1\x95\x9d\xad\x4e\x94\xb8\x54\x1d\x31\xd0\x25\x8f\xde\x49\x5a\xc8\xb3\xdc\x4f\x7e\x28\x90\xa0\x4b\xa1\x67\x01\x62\x77\xc8\x13\x31\xcb\x9e\x93\x54\xe9\x1e\xa4\xbe\xf1\xab\xed\xc6\x2d\x15\x5f\xbd\x9f\xf6\xbc\x93\x33\xe1\x72\x17\xad\xec\x39\x8e\x91\x18\x62\x71\xd9\x3a\x86\x5e\xe8\x90\xff\x07\xa5\x92\xf5\xf1\xb1\x6e\x6d\x51\x82\x7a\x0e\x26\xa4\xfb\x71\x62\x6d\x96\x1d\x31\x7c\x3d\x44\xc7\xb2\x87\xaa\x11\x35\xec\x14\xde\x0d\x8b\xc0\xef\xca\x89\xb3\x2b\x72\xd3\x8e\xdc\xb2\xb2\xaf\x26\x0f\xce\xda\xfc\x8a\xb1\x6a\x2d\xbe\x1f\x60\x40\xea\x8a\x2d\x96\xb3\x47\x08\x65\x40\x60\xa6\xce\xa7\x48\x7d\xd3\x79\x39\xa4\x97\x51\xfb\x22\x63\xb0\x92\xea\x72\x9a\xc9\xc0\x50\xab\x93\xf7\x9d\xc7\xcf\x24\x22\x9e\x18\x3e\xa0\xb3\xc9\x5a\x03\x33\x41\x89\xca\x02\x76\xa3\x7d\xad\x32\x0d\xeb\xd6\x09\x13\xdd\xbf\x64\xfe\x11\x47\xc1\xdc\x19\x6b\x22\x8b\xb9\x49\x88\x76\xc3\x8b\x60\x65\xe0\x9a\x8c\xb2\x92\x26\x65\x4d\x87\x97\xc3\x17\xcd\xb9\xbf\x04\xb8\xc0\x42\x71\x4e\x5c\xb3\x81\x7c\xc9\xd5\x95\x2d\x44\x87\xcb\xb9\x6b\x64\xe7\xe2\xea\x6d\x12\x6b\x01\xb1\xcd\x7e\x89\x35\x3c\x32\xd6\x24\x62\xdb\x32\x8a\x02\x0e\xbb\x11\x7d\x89\x8b\x80\x8f\xfd\x72\x88\xdc\x76\x0c\x36\xdc\x2c\x8c\x49\xf9\x43\x8a\xbb\x82\xea\xe2\x0d\x4b\x34\xf7\x44\x74\xeb\x1e\xea\x05\x3b\x16\x62\x15\x90\xae\xc4\x86\xdd\xd7\x72\x3b\x91\x12\x37\x8c\x46\x8e\xa0\xc3\x6d\xaf\xa0\x06\xec\xcb\x18\xba\x94\x58\xc5\xaf\x3b\x03\x6f\x01\x86\x9c\xd8\x79\xe0\xca\x91\x0d\xb7\x78\xc7\x17\xc7\x66\xbd\xcc\xb5\x64\x70\xe6\xfc\x01\x43\x2e\xae\x43\xa6\x4c\xcc\xfc\x3e\x55\xdf\xa0\xbd\xde\x5c\x0e\x51\x8f\xc8\x1e\x46\x3d\x00\x53\x02\x34\x04\x51\xf5\x3e\xf1\x86\x7e\xd2\xd7\x38\xb1\xe4\x60\x53\xaf\x29\xb3\xae\xbf\xbf\x12\xe9\x6e\x47\xa6\xff\x0a\x92\x94\xb1\x12\xe3\x7c\x5b\x25\xe7\xdc\x1a\x56\x77\x81\xdd\x01\xc1\x94\xeb\xf2\x4b\x80\xbc\xdd\x9d\x28\x11\x80\xd8\xb6\x47\xe0\xdb\xf2\xf9\xa2\x89\x0e\xe5\x08\x3a\x9b\xdd\xb5\xaf\x80\x4a\x81\xce\x16\x73\x1d\x87\x2d\xf0\x4c\x44\x6c\x8b\xb7\xae\xf1\xd6\x1c\x01\xff\x14\x4a\x99\x32\xda\xe2\xf3\xad\x5b\x86\x3a\x8d\xc7\xc0\x7c\x6f\xfa\x70\x51\x0d\xad\x77\x0f\xa6\xdb\x60\x19\x55\x97\x46\x86\xdb\x2a\x0e\x9d\x5e\x0a\xad\xf3\x7d\x08\xc8\x1b\x28\x74\xd9\x49\x99\x59\x5c\xbf\x40\x89\xc1\x8b\xa5\xe3\x63\x0e\xb3\xd0\x99\x81\x38\x74\xc0\x2c\x88\x56\x96\x81\x06\x24\xc5\x66\x47\xbd\x63\x69\x2b\xcf\x2e\x4c\x8c\xc0\xb3\xd3\x8f\x8b\x65\x6c\xfe\x9d\xf9\x8b\x64\xb4\x67\xfb\x02\xf6\x85\xa0\xe6\xab\xef\xc8\x29\xb2\xbd\x3d\x57\x72\x5b\x4e\x03\xd0\x8f\x0c\x1d\x30\x82\x90\xcc\xbb\x8e\xe1\xa4\xb1\x17\xc4\x3b\x6e\xf8\x94\xb7\x65\xd3\xb2\x1b\x43\x0f\xec\x37\x24\x20\xcf\xc2\xa5\xfc\x31\x98\xa5\xa6\x6f\xe1\xe4\xd5\x1e\x00\x83\x1d\x80\x81\xc0\xeb\xac\xbc\x7a\x61\xce\xe7\x34\xbc\x4a\xbf\x9b\xe4\x33\xd5\xba\x1d\x8c\xa2\xca\xc7\xbb\x58\xed\xb6\xc0\xe6\x67\xf2\x8e\x4a\x5c\x34\xc3\xf2\x59\x3c\x5d\x29\x5c\x12\xf6\xaa\xa9\x84\x08\xbd\x77\x18\xc7\xa4\xe9\x13\xc4\xbc\xb9\x24\x6d\x7d\x33\x9d\x37\x61\xce\x5a\xc1\xe5\xa5\x25\xd6\x0e\xa9\x1c\xfd\x01\xa9\x17\x5d\xf7\xc7\x6e\x30\xa7\x26\x05\x9e\x71\xdb\xdf\xab\x23\x7d\x36\xc8\x07\xe6\x87\x8c\x67\xc8\x8d\xb2\x9b\x8a\xa4\x2a\xeb\xa1\xfc\x60\x08\x80\x91\xa9\x07\x79\xdf\x37\xf7\xe1\x87\x68\x49\xf7\x67\xfb\x39\xf2\x73\x62\x3d\xb3\xca\x33\xa1\xb2\xb9\xa8\x72\xb1\x69\x69\x73\x73\xd9\xda\x00\x32\xe3\xb2\x7c\xa8\x15\xba\x0d\x17\x67\x35\xdb\x90\x6d\x2f\x19\xfd\xf0\xad\x19\x0f\x11\xed\xea\xdc\xdb\xc3\x93\x6b\x95\x63\x7d\xf1\x75\x53\xfb\x64\x93\x44\x66\x1f\x5f\x3f\xc0\x59\x22\x2d\xcd\xae\xb5\x82\x91\xe2\x39\x95\xda\xc7\x0f\xaf\xba\x3e\x7a\x4d\x7c\x40\x19\xdf\x38\x97\x2f\x33\xe4\xd5\xca\xd6\xa5\x37\x61\x2a\x03\xba\xce\x17\x8f\xaf\xd2\xe8\xc2\xd3\x7e\x73\x75\xcd\x5d\x21\xd9\x58\x5b\x5d\xf8\x03\xb7\x75\xe6\x2e\x87\x73\xf3\x84\x26\x18\xd6\xea\x33\x5f\x63\xc8\x64\x6d\xf9\xf7\xb4\x67\xe6\xb6\xa8\x51\xb3\x92\x03\x5d\x94\x5f\xaf\xb1\x75\x7b\xe2\x58\x6f\xc9\xef\xf3\x05\xc8\x8e\xd4\x67\x50\xff\xc6\x6f\xfd\x51\x67\xee\x71\xb8\xb4\xb0\xca\x5e\x90\xbb\x17\xab\x4b\x20\xbc\xae\xa1\x2a\xb2\xe5\xa6\x54\xc6\x21\xca\xec\x73\x98\x02\xa5\x60\xf7\xe9\x57\xce\x52\xaf\xc4\x58\xae\x07\xcf\xc2\xdb\xdd\x72\x03\x56\xaf\x3a\xe4\xd0\x10\x29\xf9\x5c\x6f\xf3\x85\x09\xbe\x62\xc3\x2f\x39\x86\x58\xde\xe4\xdb\xd6\xa0\x57\x2a\x21\xda\xa0\x48\xc8\xa3\xa1\x37\xec\x41\x37\xd6\x4b\x83\x98\x9f\x80\x19\x7a\x96\x8f\x4e\xa9\xf5\x34\x58\x0a\xf2\xb1\xf0\x88\xbf\x93\xcf\x56\x90\xdc\x07\x15\x0d\x3b\xc4\xbd\x87\x7c\x1f\x84\xdc\x19\xda\xd3\xf2\xaa\x91\x07\xc9\x46\xad\xd2\xd1\xa5\xc7\x61\x8a\x81\x98\x53\x93\x34\xa3\xcb\x9f\xb9\x91\x64\x30\xeb\x07\x61\x5b\xea\x64\x0e\x79\xf5\xa8\x06\xb9\x9e\xd2\x57\xb0\x80\xbc\xa6\x93\xd8\xeb\x15\x69\xeb\x10\x39\xe4\x7a\xc6\xc4\x9d\x3c\xc2\x07\x49\x84\xf4\xfe\x91\x93\x0d\x6b\x96\xb4\xf7\x91\x14\x87\x5f\x51\xee\xe1\x59\xc1\x9d\xaa\x85\x9b\x62\x10\xf0\xca\xde\x8e\x90\x40\x61\x23\x5c\x79\x2a\x65\x70\xcd\x41\xa7\x10\xad\x50\x61\x5f\xb1\xad\x20\x0c\x86\xfd\x0c\x98\x84\x98\xed\x2f\xdf\x6c\xc2\xaf\x03\x9b\x74\xe3\x13\x7c\x32\x18\xdf\x33\x56\x82\x1c\xfa\x83\x43\xe7\x9a\xa1\x76\x13\xe9\x37\x9a\x42\x4f\x03\xdc\xa4\x49\xbd\xd3\x49\xb6\x77\xde\xef\x38\x05\xbc\x01\x64\x43\x17\xd3\x5b\x9d\x20\xeb\xd2\x4f\xda\x2f\x61\xa8\xd5\xd1\x00\x1b\xa3\xec\x57\x45\x7f\x20\xb2\xa3\x36\x48\xe8\x6b\xf9\xe8\xf1\xb6\xe9\xe9\xa9\x2d\xcf\x11\x10\x94\x95\xc1\x58\xbf\xb7\xec\xe2\x10\x6e\x36\x8f\xa7\x61\xb6\xc7\xaf\x34\x15\x1e\x50\x26\x29\x6c\xac\x65\x3a\xa0\xb0\x11\x0e\x41\xae\x26\x2b\xce\x23\x4d\x23\xd7\xe9\x14\x00\x16\xc4\xc3\x39\x5e\x9d\xaa\x4c\xe1\xca\xc1\x6c\x85\xe0\xb6\x1c\x8a\x6c\x02\x86\x94\xf4\x41\xf2\x61\x9d\x85\xae\xce\x3b\xf8\x89\xb0\x29\x97\x42\xfb\xc9\xc4\x9d\x04\x13\xb1\x9d\x70\xfb\xf8\x4b\x61\xca\x34\x2e\x6b\x85\xcc\x5b\xe3\x15\x7b\x5f\xdc\x4e\x3d\x7e\x41\xde\x85\x63\xbf\xbf\x64\x89\xf4\x7c\x06\x47\xf1\xeb\x67\x1f\xdb\x96\xea\x37\xc1\x54\xbc\x18\x43\x74\xe7\x41\xfe\x21\x8d\x80\x64\x5c\x2f\x83\x1f\x94\xb1\xf4\x3a\xb4\xf0\x17\x86\xcf\x93\x93\xed\x35\x6b\x4f\xf8\x05\x65\x7a\x25\x31\xe6\xf2\x80\x8d\x02\xaf\xd8\x8a\x74\xf8\x0e\x4a\x22\x54\x7b\x38\xf5\x80\x8c\xe7\x12\x64\xc4\xa8\x4b\x63\xbd\xb1\x3a\x0d\x61\x21\x62\x0c\x47\x4a\x60\x79\xf0\xcb\xb7\x11\xa7\xd0\x27\x41\x8b\x7a\xfd\x1e\x01\x76\xaf\x2b\x00\x8d\xb8\x32\xd5\xb7\xc4\xe7\xae\xa3\x78\x8d\x2b\x7b\x14\x8f\xed\xa2\xc3\x28\x9c\x67\xa6\x5b\x35\xa5\x91\x3d\x6c\xf9\x47\x1b\xa3\x8f\x68\x75\x0e\x94\x90\xf1\x88\xc7\xf6\xc3\xbf\x1e\xb7\xcf\x51\x65\x2b\x6e\x27\x69\x7c\x16\x4e\x95\x26\xfd\x6d\x81\xf4\x08\x56\x63\xb0\x18\xcf\x03\xc9\x00\x7b\x71\xf7\x3e\xca\xf2\x3e\xea\x8a\x3d\x54\x57\xc4\xdc\x86\x9d\x71\xf1\x4c\x74\xa4\x52\x77\xb0\x17\xf5\x65\x9b\x2f\xbb\x87\x83\xd1\xa6\xba\x82\xcd\xca\x05\x9f\x06\x6f\x31\xae\x39\xe2\x25\x8c\x34\xb1\x18\x79\xa3\xf8\x9d\xbb\x48\xf2\xe2\x7c\xae\x9f\x44\x53\xa5\x60\xb3\xdb\xd9\x5f\x5d\x21\xcb\xc9\x9e\xbe\x44\xab\xa7\x21\xd1\x67\xbb\x20\x73\x0e\xfa\xe5\x93\x7e\xa8\xa5\xf3\xc9\x15\xc8\xcb\xdb\x16\x93\x66\x52\x99\x17\x71\x1b\xd1\xc5\x84\xbd\x12\x66\x9a\x41\x1f\x84\x0d\x53\x1f\x64\x9e\x92\xa8\xd7\x51\x7e\xb0\x52\xa1\xc4\xb9\xfc\xf4\x3e\x7c\x2d\x97\xe8\x24\xcb\x79\xd3\xdc\x96\x33\x9c\x96\xce\x5e\x5c\x47\xb7\x02\xd5\x4d\x84\x6c\x91\xb3\x64\x8b\x5a\x4f\xcd\x97\x52\xfc\x96\x5d\x00\x51\x09\x8f\x19\x6b\x60\x62\xaf\xd1\x65\x29\x5f\x35\x22\x6b\x00\xac\xe2\x51\x66\xd1\x7b\xe1\xec\x72\x01\x55\xa7\x7b\x90\x55\x29\xb7\xa3\xb1\x97\x62\x2a\x22\x1d\x8d\x62\x5e\xe2\xe9\xe4\x8f\x8d\x66\x64\x62\xda\x05\x09\x1c\x15\x44\xfc\x79\x68\x1e\x7c\x8d\x64\x71\xbc\x84\x8f\xde\x4b\x46\xdd\x84\xf3\x5a\x30\x29\xfb\x6a\xb9\xb4\x77\xe9\x7f\x1e\x6c\x10\x82\xf3\xc8\xfa\x39\xcf\x1d\x97\x9f\xe5\xc7\xf9\x7d\x97\x5d\xe9\x94\x3d\x4a\xcb\xec\x97\x71\x3e\xc9\xf8\x9f\xcf\xd3\xfe\xf7\x00\xce\xf5\xc1\x4d\x24\x9a\xd1\x23\x9b\x76\x0e\x34\xaf\x16\xfb\xf2\x26\xe8\x87\x33\x13\xdf\xe2\x8a\x5e\x0c\xed\xe6\xf0\x2f\x2e\x7f\x61\x84\xee\x4c\x73\x71\x2d\xcb\xd6\x90\xc2\x24\x3a\x66\xf5\x48\xf2\x96\xf8\x94\x47\x6a\x82\x8d\x19\x96\x4a\x5b\x27\xee\x22\xfd\xc0\x66\xfc\x84\x32\x61\x02\x91\x55\x91\x8b\x8e\x01\x25\x53\xb4\xd5\xd2\x07\x9c\x9a\x78\x02\xb4\x6a\x06\x9c\xc4\x1e\x78\x96\xe8\xe6\xa2\xc5\xcf\x59\x0e\xb1\xf3\xfc\x12\xdb\xd1\x0e\x12\x01\x93\xba\x88\x02\xfc\xfc\x28\xee\x32\x13\x56\xbb\x57\x4e\x24\x6a\x99\x31\x79\xa5\x12\xf9\xb5\x2d\xb0\x28\x89\x64\xcb\xe9\xa8\xef\x9e\xb4\x67\x02\xe6\x8e\x0c\xcc\x97\x78\x95\x3d\x2f\x65\x68\x33\xcd\x63\x7e\x89\xc7\x38\x76\x32\xfc\x7e\x38\xd3\x12\xfe\xa2\x72\x7a\x02\x8c\x17\x2e\x79\x7e\x98\xf3\x74\x69\xaa\x95\x43\x03\xdd\x05\xa9\x78\x35\xf3\x52\xc0\x2b\x4f\xb7\x19\xd4\x46\x52\x25\x97\x8d\x66\xd4\x0b\x94\x80\xcf\xad\xfb\x4d\xb4\x82\xb0\xce\xe9\xa2\xcb\x82\xbf\x96\xfe\x8d\xa4\x20\xcc\x18\x08\xf0\x4b\xf0\x23\xed\x67\xdd\xe9\x6f\x85\xb5\x6a\xbf\xd5\xa8\xad\x27\x86\x10\x5a\x45\xfe\x4f\x7b\x22\xf1\x72\xfb\xc3\xd8\xc0\x90\x55\xcf\x19\x8e\x20\xca\x08\xed\xee\xff\xd3\x3c\x12\xc4\x4d\x00\xba\xab\x51\x14\x34\x53\xca\x16\x44\xcf\xc5\x85\xed\x16\x35\x34\x5d\x46\xe4\x78\x22\xc6\x76\xa3\x31\xb2\x7c\xb6\xba\x58\x4d\x4f\x3a\x4e\xea\xad\xe3\x12\x26\x5a\x58\xf3\xd5\x31\xdd\xa7\xcc\x3a\x49\x57\x47\x8f\x2f\xb5\x2c\xda\x1d\xae\xc9\xd9\x5c\x78\xb3\x59\x50\x6d\xa5\xae\x58\x98\x9c\x4e\x50\xde\xfd\x66\x9a\xce\x5f\x8e\x56\xd3\xe9\xc6\x0b\x34\x5c\x2a\xd2\xa5\x9d\x4a\x65\x6f\xce\xdc\x3c\xbd\x93\x86\x30\x45\x96\xaa\xbb\xc5\x96\x9c\x91\x4e\xf3\xa0\x27\xd5\xb8\xf2\x01\x99\x8a\xcf\x99\xa7\x89\xf8\xd4\xf0\xa1\x0a\x47\x29\x9b\x53\xc7\x9f\xe2\x1c\x4e\x75\xb4\x88\x81\xfe\xf0\x2f\xc2\xc8\x3b\x68\xb7\x18\x90\xf0\x98\x22\xbb\x12\x22\xd3\x7c\xb7\x1d\x7f\xc4\xbb\x7d\x26\x32\xb9\x4b\x84\x07\x24\x47\xb9\x63\x78\x70\x3d\x77\xe2\x0b\xa6\xbc\x2e\x3a\xa8\x54\xa5\x5e\x47\xb8\xf9\x1f\x96\xb9\x66\x3a\xe5\xf4\x8c\xad\xb4\x17\x27\x64\x4d\x64\x8a\xa6\xbf\xcc\x45\x02\xf7\xb3\xf2\x6f\x22\x24\xd2\x23\xe7\xa9\xc6\xf5\xb7\xd6\xf3\x26\x76\xda\x1f\x3c\x8d\x62\x87\x92\xf1\xc9\xfd\x7d\x71\x32\xee\x94\x3a\x5d\x1a\x15\x1a\x5e\xe7\x87\x9c\xc3\x97\x4f\x29\x9d\xae\x09\xb0\x1c\x5f\xac\xca\xed\x2f\x24\x94\xac\xb6\xbe\x90\x68\x7a\xb6\xf1\x2a\x9f\x22\x25\xa1\x57\xd9\xcb\xdb\x69\xa3\xb0\xcd\xd2\xb2\xd3\x0b\x06\x68\x9d\x07\xb9\x6e\x5b\x87\xd9\xbf\xc6\x4e\x38\xcb\x57\x7e\x13\x8a\x8a\x07\xd3\x1f\xd5\x57\xd6\x7a\xdd\x2b\x41\x36\x95\xfb\xd2\xf9\x0c\xd8\xcc\x2b\x01\x4a\x34\x17\x56\x59\x5f\x18\x2a\x82\x05\xaa\xd7\x37\xf9\x6b\xd9\x24\x5d\xa7\x07\x36\x0b\x95\x13\x7e\xcf\x59\xeb\xa1\xbf\xe7\x44\xe6\xd8\xef\x89\xf5\x42\xe7\x62\x16\x08\x11\x93\x09\xf0\xeb\xba\x02\x7e\xa0\xf5\x5a\x3e\x94\xfd\x66\x58\x87\x23\x48\x34\x5c\xfe\x4d\x21\xe5\xf2\xeb\xea\xc5\x22\x27\xee\x96\x39\x4c\xe3\x4d\xb1\xec\xc5\xf2\xab\xf4\x4a\x91\x2d\x85\xff\x54\x33\x96\x73\xf4\x9c\x8e\x36\x82\x53\x94\xdc\x22\xea\x5e\x72\x37\xd6\xdb\xce\x60\x5a\x56\x6f\x01\x5f\xb9\x44\x95\x44\x4c\x46\xb4\xc2\xa8\xd7\x5b\x0e\x40\xcc\xd5\x78\xea\xb8\x0d\xb5\xa4\xaa\x59\x3f\x86\x90\xd9\x78\x75\xaf\x6b\x0c\x4e\xce\x3c\xce\x0a\x48\xf5\xf6\x54\xa3\x18\xbc\xa3\x51\xdf\xe3\x75\xb9\x71\x09\xd9\x09\x7e\xff\x72\x62\x21\x45\x7f\x86\x5b\x7d\xc5\xb9\x3e\xa7\x60\x86\x3e\x6d\x24\xf9\xa2\x52\x3e\xe5\x39\x61\x11\x4d\x0c\xdd\xa2\x2b\xde\x76\x83\xdd\xf7\xaf\x76\x3e\xd4\x28\x8f\x9b\xca\x19\x3c\x55\xc0\x74\x1f\x37\xab\x53\x5f\xd3\x86\x8e\x1c\xc2\xe6\xfe\x7a\x68\x24\x59\xaa\x72\x86\xcd\x99\xcd\x92\xdd\x02\xd7\xce\x96\x97\x6a\x46\x7e\x7e\x44\x28\xe5\x0f\x7a\x79\x05\xe5\xb3\x1c\x82\xf6\x8e\xb3\xe8\x16\x7a\x01\x73\xa8\xb1\xd2\x3f\xe5\xce\x2a\x06\x28\x24\x73\xea\xdb\xe6\x9b\x91\x3b\x4b\x6b\xc1\x1b\x40\xde\x7e\x5d\x2c\x6b\xce\x77\xce\x3d\xda\xdf\x2f\xc2\xb0\x93\x44\x99\x05\x89\x30\xea\x67\xd9\xba\xd0\x97\xcf\x04\xc7\x34\x37\xe2\x86\x62\x3c\xae\x0b\x7c\xc3\x85\x07\x67\xa5\x5a\xd6\x70\xf5\x76\x4e\x22\x49\xc2\x58\xcc\x86\x40\x12\x2b\xe9\x32\x86\xcf\x1f\xce\xbf\xbf\x44\xdf\xb0\x9d\xec\x48\x87\x9e\x47\x41\x1b\xa6\xe5\x11\x68\x08\x19\x42\x0e\x70\xc0\xb8\xc1\xd7\x9a\xc6\x0b\xfa\xee\x33\xd6\x0a\xaa\x06\x5c\x61\x4f\xd6\xa7\x5d\x51\x3e\xf6\x83\x56\xe1\x2d\xcb\x25\x17\x92\x3b\x89\x45\x1d\x50\xb5\xb0\xa7\x59\xd8\x08\xf0\xd3\xab\x9a\x31\x68\x14\x67\xe4\x5c\xce\xa9\xd0\x13\x8a\x05\xa2\x6b\x3f\xb5\x5a\x3d\x94\x39\x57\x07\x18\x34\xfa\x71\xa3\xd7\xd9\x14\x0e\x63\x98\x7a\xe9\x23\x5d\x5c\x42\x15\x16\x87\x18\xfb\x7d\x01\x88\x31\xdd\xd0\xc6\x57\x50\x59\x83\x97\xea\x2d\x1b\x5f\xfc\x07\x03\x2a\x66\x64\x60\xd7\xb5\xac\x47\xe5\xa1\xc6\xd9\x88\x88\xe9\x23\x64\x93\xe5\xbd\x65\x2d\x65\x6e\x03\x4a\x71\xc3\x18\xd6\x40\x4e\x44\x4d\xfb\xfd\x31\xa9\x73\xfe\x1b\xe2\xf4\x61\x65\x77\xb0\x09\x78\x65\x89\x0f\xd0\xf0\xf3\x2f\x02\xb9\x5e\x84\x55\xbb\x66\x9b\x38\xaa\x8b\x24\x88\x06\x22\xf6\x87\xf4\x35\x01\xb4\x09\x3b\x94\x47\x48\xe9\x4d\xae\x8a\xcf\xc9\xf4\xa0\x62\xcd\x50\x59\xb9\x29\xf5\x32\x44\xc3\xbf\x07\x98\xac\x5e\x1b\x01\x67\x55\xb4\xd1\xd3\xaf\x72\x7f\xce\x58\x80\x61\x34\xbb\x29\xd8\x39\xf1\x05\x94\x01\xc8\x82\x3d\x0e\xf7\x26\xdb\x2a\x25\xc0\xc2\x73\xad\xcc\xd6\x1b\x1d\xeb\xe4\xd6\xd8\x3f\xee\x87\x1c\xcf\x44\xa6\xec\x61\xe3\x0d\x3e\x28\xf7\x0a\x36\x6e\xc1\x70\xd3\x52\xb1\x3a\x8c\x08\x5f\xb5\x54\xd6\x4a\x5f\x84\xdb\xec\x4b\x2f\xca\x27\x68\x47\x9e\x15\xf4\x94\xa4\xd0\xb7\x4e\x4c\xd7\x7b\xac\x01\x6a\x4f\x4e\x73\x84\xf1\x95\xf2\x4a\xed\x3d\x05\x7b\x54\xaf\x34\x9e\xc4\xd8\x84\xd8\x86\xc3\x53\xc8\xcb\xcd\x34\x3f\xcb\x37\x56\xd6\x62\xa7\xde\x2a\xfd\x03\x8f\x25\x09\xfc\xd8\xd7\x4a\x5e\x7f\x5b\xcb\xf6\x2e\xcd\x5d\xa3\x87\xd3\x56\xb1\x6e\xc5\xa8\x87\xa4\x08\x99\xc1\x69\x7b\x82\xe2\x35\x31\xee\x62\xe1\xd5\xe2\x36\x68\xb5\xc9\x6d\xc3\xe1\xba\x16\x56\x6c\x96\xb8\xc8\x50\xbf\xb7\x34\xd6\x4f\x16\x25\xb0\x41\x4c\x59\xea\xd4\xc6\x6f\x8f\x3c\x59\xab\x01\xbd\x4d\x5b\x43\xb7\xb7\xe7\xe4\xb2\x07\x54\xd3\xe7\x0e\x4f\x67\x1d\x4c\x14\x62\x43\x83\xf3\xd5\x27\x1d\x6e\xc8\x62\x75\xb2\xac\x07\x3d\x12\xc3\xe7\x66\x39\xb5\xb7\x29\x54\x40\x24\x2f\x04\x30\xfd\xcc\x9f\x40\xa9\x88\xaa\x89\x52\xa1\x26\xee\x16\x7b\xf2\xca\xfd\x89\x82\xab\x4f\x74\x78\x1b\xc7\x44\xf8\xb6\x00\x9b\x38\x50\x11\xdd\x99\xe2\x1f\x82\x22\x61\xf6\x56\x1e\xd5\xf4\x4d\x1d\x0e\xb0\x6f\xbb\x38\xe1\x1e\xfb\x85\x86\x2e\x35\x5c\x45\xfd\xe3\x2d\xd9\x8b\xaf\x2c\xb1\x50\xc0\xc8\x83\xe9\xe5\x37\xcb\x93\x46\x2a\xc1\x8f\x3d\x39\x71\x72\xfa\x6c\xec\xa3\xf1\x5c\x6d\x6d\x32\x8c\x2b\xae\xbe\x26\xd6\xac\xdd\x72\xa9\x52\x5c\x41\x15\xd4\xd1\xae\xcc\x15\x24\xdb\xea\x09\xf7\xf7\xe7\x9b\x7f\xd5\x5a\x6d\x7c\x87\x15\xdc\x3e\x2c\x72\x87\x23\x51\x75\xa4\xc0\xa2\xf3\x62\x6d\x30\xa5\x7b\x9e\xcd\x64\xb6\x1c\xd7\x6a\x7c\x92\xd7\xf8\xc4\x2f\x21\xae\x33\x14\x1f\x34\xc4\x3d\x73\x98\x92\x3d\x2b\x16\x18\xfe\x72\x89\x6f\xca\x59\x34\xb1\x27\xe6\x8f\x62\xe6\x86\x69\x88\xbb\xca\x85\x4f\x9c\xbc\xe4\x3c\xb6\x1f\xab\x39\xa5\x52\xf6\x74\xe3\x38\x1e\x83\xe5\x40\x22\x73\x60\x21\x37\x54\x4e\xee\xa8\xa4\x0a\x91\x48\xb9\xf2\x69\x79\xa6\x51\x3a\x6e\x4f\x16\xfc\xb8\xb3\xf5\x89\x25\x16\xa2\xe4\x64\xd7\xe6\xb8\xbc\xf9\xca\x6b\x22\x4c\x3f\xff\xfb\x27\xaf\x38\xaf\x7f\xc1\x6c\x15\xf5\x47\xef\x8e\x7c\x5f\x47\x3d\x4a\x8f\x6f\x06\x97\x5e\x1e\x99\x10\x78\xc3\x57\x05\x3a\x86\x85\xc9\x13\x38\xbd\xa0\x0e\xd1\x06\x06\xad\xa0\xfb\xe7\x7f\x28\x5a\x54\x5f\xbb\xb1\x0f\x2f\xbb\x61\x74\x0f\x2b\x7d\x50\xb5\xe6\x62\xa8\xb7\xba\x17\x92\x76\xdb\x29\x05\x5d\xc8\x1a\x61\xd6\x0f\x4f\xbc\xfd\xcb\x43\x4f\x0e\x79\x8a\x59\x60\x60\x54\x59\xc4\x5b\x53\x3a\xb2\x8b\x81\x38\x8c\x33\x38\x31\x9c\xa4\x5d\x44\x62\xca\x36\x62\xbb\x66\xb1\x5f\xc1\x6b\xec\xcb\xa1\x90\xe2\xbf\x96\xcd\xec\xc1\x09\xf6\x44\xa2\x55\xe3\xc0\xa0\xaa\x6b\xbb\x0e\xe4\xc5\xde\xbc\xdf\xc7\x4d\xf1\xbd\x19\xc3\x80\xfb\x8a\xf1\xeb\xa1\x47\x3d\x4c\xae\xb4\xd7\xa6\x52\x6f\x9a\x6d\x50\xed\x63\xaf\x91\xbf\x4e\x4e\x70\xf5\xd4\x03\x2f\x31\xcc\xfe\xe6\x75\x48\x61\xaa\x07\x35\x7b\x5e\x15\xa8\xe2\x84\xad\xde\xec\x54\x0f\xed\xa6\xd3\xdf\x0c\x72\x42\xb8\x99\xa1\x80\xd6\x56\xb3\x29\x61\x8e\xed\x4f\x94\x0a\x99\x3d\x0d\x51\x7f\xca\x96\x96\x57\x3f\x3f\x79\x13\xe5\xa7\x33\xd6\xb5\x93\x7e\x7d\x31\xe5\xcb\xee\x86\x01\x45\x47\xcd\x99\x73\xda\xaf\xfe\x26\x15\xcb\x43\xb5\x3b\xe9\xd8\x76\xb2\xf8\xdf\x49\xb4\xab\xb3\xee\x3a\xe8\xbf\x27\x7b\x64\x6c\x49\x67\x84\xe2\xac\x2a\x28\xdd\x16\x38\x0d\x67\x00\xab\x2e\xd2\x6d\xd9\x1f\xa1\x0e\x5d\x2e\xb7\x60\xf4\x7b\xb5\x09\x46\x7d\x74\x95\x41\xaa\xb9\x07\x94\xaa\xa3\x73\x4d\x07\x4f\x52\x72\x76\x97\xf2\xa1\x16\xb6\x53\x7c\x99\x6e\xd0\xb3\x4f\x04\x4d\x61\x3a\x64\xd0\x27\xcb\xb6\x51\x22\x34\x5f\xcd\x40\x2a\x74\xee\xe6\xdb\x05\xbd\x76\x2f\xd3\xbb\x12\x6f\x77\xff\x0d\x18\x7b\x06\xc8\x90\xfa\x9f\x7a\x73\xa8\x33\x90\xca\xfb\xc5\xda\x6d\x4f\xad\x89\xb9\x88\xeb\x22\xbb\xe4\x6f\x78\xa9\x2c\x00\x03\x2b\x86\x26\x78\xf0\xd1\xb0\x74\x04\xeb\x31\xfc\x88\x25\x08\xc0\xc1\x59\xb4\xc4\xe7\xb6\x12\x6c\x2b\xc1\x38\x35\x5c\x7e\xea\xf2\xe9\x0e\x86\xd9\xe6\x70\x95\x6d\x9c\xeb\xb2\x1d\x0f\xb1\xec\xa7\xf2\x77\x01\xcd\x09\x27\x41\xf7\xee\x63\x04\x34\x4d\x4b\x62\x2b\xe5\x06\x48\x8d\x5d\x8b\x5c\xf2\x56\x2e\xd3\x77\xd5\x79\x6f\x76\xe1\xd9\xaf\x2f\xf1\xaa\xcb\x57\xfb\x29\x7b\x89\xae\x6a\xdd\x7e\x35\x82\x2e\xbb\x5d\xd5\x44\xd1\xee\xe0\x6b\x57\x70\xae\x22\x55\x43\xcf\x36\x56\x11\x90\xeb\x35\x99\x1c\x63\x70\x0b\x82\xa9\x9b\xa6\xfa\xf7\xa4\x67\x64\xce\xb0\xe7\x13\x89\xa2\xab\x66\x44\x9d\x80\xd2\x1d\x56\xf3\xf5\x73\xda\x9c\x47\x24\x65\xb1\xdf\x3a\x1a\xdc\x6a\xdf\xac\x99\x5a\x87\x07\x2b\x3e\xa5\xe7\x19\xff\xe4\x83\xdc\xbc\x3f\x10\xf6\xf7\xa9\xbc\xd3\x4b\x8b\x8e\xb0\xb8\x0f\x8b\xb1\xb3\x4a\x7c\x59\x67\x9b\xda\xe4\xdc\xc3\x73\x75\x69\x6f\xee\x75\xdc\x94\xe8\xad\x36\xa6\x1d\x87\xde\x38\x7d\x65\x82\xb5\x45\x36\xde\x4e\xc4\x36\xd4\x81\x09\x7c\x70\xe3\xbe\x41\xe2\x12\xd6\x58\x2e\xed\x75\x77\x32\x22\x09\xa6\x2a\x92\x86\x1d\x44\x23\x51\x2e\x56\x3d\xbd\x13\x79\xf5\x0d\xb7\xe6\x6e\xeb\x4e\xc2\x08\x44\x3c\x17\x4b\xd7\x3e\x61\x57\xc5\xb3\x2d\xdb\x4e\x79\xc3\x16\xb3\x13\x25\x8a\x28\x81\x06\xaf\xb7\xc8\x7d\x0d\x9c\xdb\xea\x9c\x17\x8c\xdb\xca\xc0\x1d\x97\x93\x83\x3d\x7d\xf8\xa2\x66\x31\xdd\xbb\xaa\x0c\x2d\x9a\xbc\x29\x3d\x9a\xc2\xd2\x3e\x9c\xbb\xf5\x15\x0b\xef\x3d\x9d\xc5\xf2\xbc\xd9\xaf\x14\xf9\x94\x17\xa2\xb5\xe2\xae\xf7\xb8\xab\x9c\x71\xb7\xf1\x73\xe3\xbd\xf8\x5a\x0c\x93\xf5\x43\xa0\x95\xfc\x9f\x86\x72\x50\x6f\xa5\xe9\xf6\xdd\x83\xbc\x74\xbd\xce\xa0\xd0\x24\xa9\x26\xb3\xd1\xde\x07\xc6\xaa\xa3\x5b\xfe\x91\xad\x49\xb3\xf1\xd8\x6b\x37\xa5\xbf\x23\x5a\x5d\x44\x5f\x4b\x01\x6a\x72\x99\xd2\x1b\xf5\xdd\xc0\x8a\x6d\x71\xb1\xa6\x73\x5e\xb4\x60\x0d\x42\xf0\xe2\x29\xf8\x15\xad\xfb\x95\x49\x09\x9f\x87\x4d\xb9\xdf\x0f\xbb\xbc\xf0\x35\xac\xca\x52\x76\x89\x1c\x4a\x68\x5b\xc1\x6a\xdd\x19\x30\x5e\xb4\x5e\x45\xcc\x71\x94\x8b\x19\xc0\x7e\x5e\xa7\x8e\xae\xb2\x8d\xf0\xf9\xf4\xfa\x17\xe9\xc6\x20\x96\x7d\x29\x32\xb7\x28\xa2\x62\x3b\x1e\xac\xba\xda\x2c\x85\x54\x61\x58\x06\x8e\xc4\xb5\x57\x86\xf1\xcd\x28\x2e\xab\x6b\x09\x82\xd0\xb6\x07\x9f\x37\x6e\x50\xb7\x5d\xe7\x15\x45\xfe\x9f\x3f\xf2\x04\x14\xeb\x7d\xb0\x13\xe2\x77\x0f\x22\x1f\x21\x48\x0e\x4d\x65\x63\x5b\x4a\x73\x91\xca\x1c\x1e\x93\x48\xbb\xab\xcd\x60\x9a\x57\xf8\xd6\xea\xe3\x12\xad\x98\xc1\x16\xf6\x2f\x42\x2d\x90\x09\x1f\x38\xc2\x81\x75\x45\x1c\xb0\x0a\x70\x82\x37\xb1\x83\x8f\xb0\xed\x4c\x87\x9b\x13\xb6\x8c\xab\x61\x52\x8b\xc5\xee\xc5\x46\xdd\x68\x65\x08\x2d\x3e\xc8\x12\x76\x7d\x14\xbd\xb0\x95\x90\x81\x01\x6b\x78\x7c\x17\x41\x45\xad\xf5\x1b\x84\x5e\x9b\xe2\xa9\x48\xc4\x57\x56\x12\x93\xd7\xf1\x96\x63\x11\x65\x98\x11\x88\x3f\x54\x14\x48\x4b\x15\x41\x6f\x7d\xcd\x23\x66\x10\x6c\x4d\xe4\xbc\xa7\x8a\x20\x6b\xd3\xcc\x9f\x0e\x74\x65\x9d\xd5\xf4\x17\xb7\x0a\x12\x02\xa7\xf4\xb6\x62\x4e\xb6\xa9\x91\xfe\x77\x13\xa8\x6b\xf2\x86\x1b\x1a\x53\x40\x00\x8a\x0b\xf2\xcd\x69\xbd\xd6\xce\x03\xb0\x5c\xce\x00\xf6\xc4\xa2\x65\x5a\x7f\x96\x4e\xb9\xc5\x35\x40\xa7\x8b\x67\x7b\x66\xa2\xd3\x9a\xed\x0a\x12\x28\x90\x85\xf1\x6d\x76\x87\xfd\x05\xa5\x58\xb3\x3f\x8b\xbc\x72\xdf\xc8\xbf\xdd\xb6\x58\x1f\x64\x94\x48\x2c\x06\x73\x35\xdc\x03\xb7\xcc\xa3\xa9\x2c\x0f\x36\xf1\x3e\x4a\x1b\x07\x44\xe2\x49\x47\x25\xd2\x06\xe1\x9b\xd8\x55\xe7\x45\x1b\x39\xf3\x02\xf6\x9c\xf3\x48\xdd\x11\x42\x2f\x7c\xe2\x0c\x81\xdc\xfe\xdf\x29\x96\x70\xf8\x29\xea\x20\x12\xcf\x9a\x12\x85\x6c\x30\x8d\x55\x97\x70\xd2\x71\xd0\x8f\xfb\x5c\xed\x14\x11\x7b\x30\x37\xfa\x90\x89\x9e\xb7\x0d\x45\x18\x6d\xc3\xeb\x25\xd3\x8d\x30\x5a\x69\xa6\xf3\x14\x79\xf8\x2b\xa7\x6d\x26\xb9\x49\xc3\x9e\x91\x14\x63\x0d\x35\x0d\x86\xc3\xa2\x80\xb9\xa7\x18\xcd\xf1\x32\x15\x98\x9c\xb5\x0c\x79\xe0\x88\x47\xbd\x3e\xd2\x2e\x92\xdf\x22\x90\x4b\x33\xa5\xef\xbd\x09\xce\x8e\x33\xef\x77\x6b\xc5\x24\xab\x19\x29\x80\x05\x01\xbd\x88\x98\x1c\x36\x61\x60\x85\xf8\x49\x6b\xbe\x46\x10\x7c\x68\x72\xe4\x4d\x44\x69\x0b\xdc\x49\xd9\xdf\x94\x5d\x68\xde\xa3\xe5\x17\xc3\x2c\xf7\x2e\xc0\x4f\x6a\x32\xd3\x54\xb2\x60\x03\xf0\x20\xef\x92\x3c\xd9\x4d\xf2\x27\x34\x29\xd2\x87\xab\xfa\x5c\x59\x0b\x7d\xb1\x22\x1d\x30\x84\x12\x1c\x8c\x20\xfd\x82\xd9\x2d\xfd\x5b\x6c\xbc\xe1\xce\x90\x64\x6f\xd2\xbf\x10\x38\x05\xe3\x59\x84\xe7\x3d\x07\x11\x3d\x8a\x05\x16\x3c\x6b\xd4\xd0\x25\x72\x91\xa4\x99\x45\xaf\xea\x1b\x64\x8d\x4c\x6e\xf2\x34\xed\x97\x02\x9f\xdb\x32\x7e\xc9\x31\x34\x4d\x6d\xbd\xd3\x92\xca\xa9\x0d\x6a\x74\x64\x43\x3f\x9f\x41\xad\x0f\x63\x1f\x04\x7c\x4d\x9b\xf6\x08\xf6\x75\xfb\xea\x13\xc6\x43\x6f\xa4\x97\x73\x4a\xff\x8e\x0d\x0b\x78\x33\xe3\x4c\xf6\x32\x6f\x27\xcb\xf5\x9c\x5c\x7a\x1e\xa5\x19\xff\x53\x5e\xb3\x5d\x81\x83\x85\x9d\x33\x08\xba\x89\x74\x6a\xac\x1d\x28\xf1\x27\xb7\xfa\x87\x61\x17\x2b\x1f\x08\x65\xc4\x48\xbe\x75\x25\x59\xdb\x04\x46\x2a\x8d\x22\x57\x8f\xe2\x5c\x83\x56\xad\x17\x9c\xf4\x5c\x28\x83\x46\xb3\x05\x9e\x29\x96\xa3\x1f\xff\xef\xcb\xbf\x92\xe7\xb6\xd1\x08\x72\xd3\x4a\x92\xd3\x9e\x8f\x22\xde\xb3\x38\xd0\x08\x2d\x79\x91\xc3\x24\xa1\x80\x8a\x48\xa8\x5d\xd7\x4d\xca\x04\x08\x41\xfa\x14\x95\xc6\xc6\x31\xa4\x13\x69\xb9\x64\xfa\x93\xdc\x71\x83\x13\x15\x5f\xd5\xf6\xf1\x93\x0d\x2c\xc8\xfb\x9b\x48\x98\x6e\x19\xf2\xe7\xb6\x3b\xc4\xd3\x73\xdc\x29\xc3\x58\xc9\xc3\xa0\xe1\xb1\x43\xd7\x5a\xa8\x76\xf7\x63\x71\xe8\xda\x15\xad\x87\x13\xa9\x49\x0b\x9e\xf1\x03\x4c\x14\xa1\x4a\x20\xb1\x51\x77\xd2\x3f\x65\x16\xd1\x5d\xc6\x98\xfc\xe8\xb9\x19\x7b\xcd\x23\x11\xcb\xfb\xd2\x59\x47\xf4\xfe\x9c\xae\x5d\x39\x76\x9a\xbc\x02\x28\xf7\xc7\xa9\xe5\x42\x77\x82\x8a\x05\xcb\xc8\x90\x56\x9e\x75\x68\x6a\x02\x68\xed\x9e\x99\x12\x36\x4c\xc3\x41\xfe\xf5\x66\xaf\xfb\x2d\xf3\xb4\x99\x25\x5c\xce\xfd\x5d\x1d\x56\x0e\xdd\xfb\xdf\x42\x29\x0f\x5b\x84\x6e\x82\x7f\x5e\x07\x90\x42\x5c\x09\x35\x3c\x8c\xbc\x26\x85\xfd\xb2\x5b\xc1\x74\xbc\xae\x2d\xe8\xc7\x53\xee\xaa\xdc\x1a\x68\xda\x62\x59\x8b\xa2\xcd\xd0\x9e\x7b\xbe\x01\xd2\x22\x5f\xf4\x6a\x2f\xe1\x26\x18\xfd\xca\xcd\xb4\xb1\x59\x61\xa7\xab\xd6\xec\x01\xef\x4e\x80\xac\x89\xab\x0d\x10\x31\x0f\x05\x50\x8e\x57\xaa\xa1\x11\x1f\x3d\x34\xab\xb5\x66\x57\x0d\xb5\x53\xd3\xc8\x39\x55\x38\x38\xdb\x36\x3e\xa7\x4a\xd4\x2b\xa1\xe3\xa6\xd3\xba\x55\xd8\xfc\x83\x1d\x8e\xf7\x7d\x7f\x58\x31\x84\xe8\x86\xc7\x33\xde\x99\x3d\xac\x2e\x5b\x7f\x79\x1d\x2e\xef\x41\xfe\xd0\x5f\xb6\x8c\x08\x0e\xbc\xca\xe9\x50\xa2\x0b\x58\x1f\xee\x78\x71\x3e\x7d\x51\xc0\xe2\x42\x06\xa6\x99\xc8\x15\x22\xbd\xd7\x0f\x9d\x07\x0f\x9e\xde\xe7\x5a\x00\x15\x40\xb4\x51\x5d\xe4\xe3\xc2\x1c\x4e\x49\xf6\x01\x1c\x1f\xf8\xd1\x70\x15\xce\x9c\x62\x79\xa3\x2a\xad\xfd\xc1\xbb\x47\x14\xbb\x5e\x54\x8a\xfc\x10\x1e\xf1\x29\x85\x89\xce\x87\x12\xfe\xee\xe4\x79\x45\x10\x1c\xf2\xd2\xb9\x95\xb5\xc7\xbf\xa9\x3b\xad\x07\x8d\xc5\xf2\xcf\xd7\x58\xf7\x01\xf3\x28\x42\x30\x3e\xfc\x1b\x6c\x28\x3a\x12\xbf\xec\xe6\x5b\x7d\x22\x25\xfa\xe0\xf1\x68\xc8\x0b\x87\x9e\xbc\xf6\x0e\xa7\x00\x65\x64\x85\x2b\xf0\xe9\xfd\x07\x58\x96\x3d\x4d\x72\x04\x1d\x6b\xa6\xeb\xd6\xa1\xdc\x89\xd9\xa8\x73\x10\xc9\x12\xe7\xab\xfe\x9c\x7c\xb2\x03\x11\x7d\x8f\x8d\x8c\x1f\xf9\x7a\xe6\xe5\xe4\x2e\x1b\x77\xc5\x76\xcf\x3a\xa8\xe1\x26\xbd\xab\x91\xa8\x0c\x62\x3e\xb9\x9e\x6e\x3a\x4e\xd7\x61\x71\xf6\xb8\x1f\x94\x5c\x4e\xe1\x47\xf1\x73\xcc\x53\x10\xc9\x57\xba\x1e\x03\x49\x11\x29\xbf\xc5\xfb\xd1\xe8\xb7\x4f\xfc\x99\xed\x7e\xf2\x0e\xf4\x4d\x2a\xaa\xb3\xb7\xcb\xe1\xdd\xc3\xbb\x60\x09\xe0\x87\xaf\xca\x81\xef\x3d\xbe\x99\x0b\x5b\x90\x23\xe0\x43\x86\x20\x06\x93\xf7\xc8\x7c\x53\x4e\x48\x8c\x58\xf7\x00\x45\x7c\x64\x3f\x09\x34\x20\xa7\x0a\x96\x66\x2e\xe4\x97\x2f\xad\xf8\xda\x58\x3f\x63\xd0\xeb\xa3\xba\x5c\xf4\x52\xcb\xfa\xe8\xdb\x55\x78\xf8\x6a\xd6\x28\x8f\xce\xc7\x67\x94\x3b\x1b\x4b\x18\x9d\x86\x43\xf3\xdb\x8b\x87\x53\x01\x39\x62\x66\x5b\x93\xa1\xb7\xab\xa9\x71\xb4\x7b\x5b\xa6\x40\xe4\xcc\xdb\xb9\xe8\x47\x8d\x5a\xbe\x4c\xea\x79\xc7\x78\xe4\x76\x71\x1e\x24\xc3\x4e\xd4\xf9\xca\x39\x78\x43\x41\xa2\x96\x3c\xec\xe9\x75\xa8\xdb\x59\x57\x12\xce\xbd\xde\xe0\xe7\xde\x91\x97\x1e\x76\xa4\xdb\x49\x7a\xfa\x6d\xe4\x2c\x8e\x3a\x3f\x0b\x31\x89\xe5\xab\x3d\xda\x5e\x37\x38\xc1\xfe\x0b\x3e\x7a\xf0\x4c\xd5\x5a\x63\x1a\x0f\x69\x21\xcf\x06\x3c\xb0\x8b\xa0\xfc\xde\x9b\xf4\x29\x45\x6d\x60\x0f\xc7\x8b\x13\xcf\x95\x38\xe6\xd3\xf8\xaa\x66\xa9\x53\xc8\x04\x5b\x1e\xef\x25\x4b\x01\x94\xd4\xcc\xd1\x40\x6e\x5e\x39\xed\x20\xbf\x44\xc3\x2d\x44\x65\xb3\x5a\x39\xd9\xe7\x32\x04\xac\xd7\x3a\x27\xbf\x58\xcb\xf3\xe4\x7d\x62\xd1\x96\xf3\x5f\x9c\x96\x56\x82\x6a\xd3\x86\x30\x3d\xac\xe7\x22\x8d\x51\x7d\x4e\x5d\xa4\x41\x48\x99\xb9\x78\x25\x71\xbe\x48\xfa\x7c\x79\xd7\x17\x6a\x89\xb3\xf2\xe9\xdd\x79\x65\x89\x86\x04\xdf\x19\x83\x74\x17\x8d\x58\x6f\x89\x46\x8e\x98\x98\x5d\x1e\xe7\x95\xa2\x98\x65\xc2\x1b\xe9\x3d\x06\x14\x02\x08\x84\xff\x63\xc5\x0f\x09\xcc\x8c\x65\x01\xc4\xbd\x94\x6a\x4f\xfa\x17\x1f\xb2\x63\x39\xdc\xe9\x3e\xc2\x46\x26\xa9\xf8\xed\x26\xed\xa4\xd9\xc4\xe1\x66\xa9\x99\x91\x58\xd9\x1b\x8c\x39\x6e\x32\x38\xf8\x8b\x5c\x64\x85\x75\xac\xdc\x48\x37\xa9\x31\xba\xa0\x74\x70\xe6\x63\x5e\xeb\x44\xfa\xf0\x60\xc5\xe3\xd2\x4b\xd4\xaf\xda\xcc\x8a\x12\x1f\xad\x07\x9d\x66\x33\xdd\xac\x2c\x3c\xe7\xc4\x23\xec\x27\x95\x4c\xab\x2b\xb7\x06\xc5\x7e\xd9\x9d\xd3\x51\xf9\xf9\x09\x34\xa7\xe9\x21\xcf\xd9\x7a\x1a\x90\x46\x8d\xb7\xa8\x0a\x7a\xac\x3f\x64\xb3\x97\x7f\x3e\x23\x9b\xe5\xbe\x7d\x00\xb8\xe1\xdf\x0e\x27\x35\x75\x3b\x16\xeb\x37\xb2\xc8\xc6\x88\xa2\xb7\xd2\x8e\x06\x24\x4e\xfe\xe9\x65\x5d\xa4\x6a\x75\x88\x93\x79\xa0\x48\x47\x5a\x3e\xaa\x8c\xdc\x17\xa7\x0b\xac\xcc\xc0\x60\x84\xba\x2c\xaf\xf3\x38\xe9\x27\x41\x87\x5b\x83\x70\xae\xbd\xed\x47\x8f\xb1\x6b\x24\xa8\x30\x56\x02\xc6\x01\x3e\x9b\x6f\x37\x55\x11\x2c\x82\xaa\xa1\xb3\xef\xab\x0f\x2e\xcd\x65\x21\x69\x3c\x04\x50\x18\x2d\x2e\x95\x43\xec\x77\xe6\xf1\x18\x2c\x26\xee\xfb\xd6\x20\xc2\xfa\x14\x37\xd4\x14\xc8\x54\x45\x85\x1e\x00\x5d\x18\xbf\x8d\x74\xfd\x95\x7c\x0c\xb5\x4a\xe1\xda\x00\xaf\xf2\xf6\x70\xdb\xd2\x97\x67\xb0\xcb\x03\xf0\x32\x64\x76\xa4\x58\xcb\x28\x8b\x8c\xa1\xad\xd1\x10\x92\x09\x43\xdd\x7f\xda\xaa\x64\xef\x21\xd8\xf7\xee\xa2\x8b\xc5\xd6\x26\x56\x6d\x20\x30\xd0\xba\x7a\xa1\x45\xbc\x4e\x92\x91\xe0\xa2\x71\xa7\x30\xf5\x82\x51\x1e\xe0\x33\x68\xf7\x22\x98\xc2\x81\xda\x96\xd7\xbe\xf0\xc4\x87\x70\x05\x00\x23\xab\x64\x0a\x5a\xbe\x95\xca\x86\xbe\x7c\x5e\x03\xa7\xa7\x58\x63\x07\x62\x49\xf4\xd4\x8b\x37\xf4\x7e\x85\xf1\xa6\xb4\x0b\x76\x8f\x6d\x3e\x5f\xf8\x9c\xef\x1f\x17\xa9\xa1\x2e\xc1\xf8\xf7\x47\x1e\xff\x67\xbc\xf7\xc5\x9a\xfb\xfe\x19\x63\xe1\x74\xff\x54\x9d\x0f\xb7\xfa\x05\x4b\xd8\x3f\xf8\x93\xae\xbf\x24\x7e\xfe\x27\xd5\x42\xe6\xfe\xf9\x36\x70\xd8\x6d\x08\x7d\xd1\xb1\x62\x3f\xff\x24\x09\x65\x1d\xf6\x9a\xe4\xc2\xbb\xc6\xc2\xa2\x4b\x20\x50\xc2\xcb\x43\x1d\x39\x57\xa3\xf1\x9d\x1a\x33\xc0\x25\xea\xb5\x9e\xe3\x93\x07\x75\x97\x93\x49\x4f\x79\x0e\x37\x6f\xa2\x44\x2c\x3a\x1d\x9f\xe1\x5e\xbf\x48\xcb\x44\xbb\x76\x81\x04\x1d\x0b\x71\x37\xa5\xa5\x3b\xac\xe9\xe6\x74\x2b\x24\xfc\x82\x96\x20\xd1\x85\xc3\xed\xa1\x6c\x33\x8f\xa1\x89\xb0\x1c\x62\xac\x5a\xfa\xda\x85\x28\xc2\x85\xd4\x52\x8a\x06\x9b\x2b\xdd\x52\xc2\x01\x16\xc1\xf1\x37\xb9\x5e\xc2\xcd\xf9\x47\x9f\x04\xad\xce\x68\xa0\x2b\x1c\xc8\x25\x95\x54\xb4\x1e\x5f\x27\x47\x74\xb7\x13\x71\x92\x23\x9a\xcd\x15\x3e\x90\x54\xe0\x31\xea\x43\x7c\x02\xe1\xba\x2b\xb2\xf7\xad\x1d\x2b\x10\x8b\xc2\xda\x22\xec\x82\x93\x0b\x22\xa1\xfc\x61\xf1\x00\xf8\x75\x3f\xdc\x97\x85\xd1\x71\xea\xd2\x1f\x10\xe2\xd2\xb9\xa7\xe5\x4f\x07\x2e\xc1\xf9\xb0\xb8\x5f\xc2\xa5\xd8\x3d\xa1\xeb\x55\x70\x1d\x05\x04\x96\x77\x3b\x23\x7a\x3d\xf9\x53\xf9\xb2\x3e\xaf\xf4\xea\x62\xee\x3c\x7e\x55\x9d\x8f\x7e\xbe\x98\xc7\xb2\x01\xb1\x51\xfa\xfc\x4e\xc1\x74\xf4\x70\x7f\xab\x02\x88\x29\x01\x59\xbb\x54\x36\xb0\xbb\x5d\xdb\xee\x5b\x3f\x41\xfa\x1a\x6b\x6e\xef\xb5\x25\xb4\x46\x94\x6a\xd9\x48\x62\x4b\x62\x90\xd1\x13\xb5\x26\x7e\x40\x92\x4b\xd9\x5e\xae\x46\xa4\xf5\x72\xbe\x27\x71\x9b\x91\x4e\x91\xcf\x8d\x28\x05\x53\x0d\x0e\xc2\xeb\xc9\xdf\xb3\x9c\xab\x74\x17\xc4\xc1\x77\x1e\xea\xa1\x1f\xa1\xac\x43\x3c\x3b\x25\xe8\x69\xa8\xe8\x01\x42\xe0\x94\x9d\xdd\xa5\x2e\xa5\x5c\x50\x9e\x61\x33\x5d\x6c\xea\x5c\xbb\x32\xca\xb7\x69\x1a\xa0\x06\x29\xf4\xcb\x15\x4e\xc8\x96\x22\x53\xbf\x2f\x5a\xe8\x6a\xa5\xd3\x90\xaa\x34\xc3\x7c\xf6\x71\x1f\xce\x3c\x1f\xff\xb6\x39\x06\x54\xb7\x25\xd6\xd6\x37\x45\xd9\xd8\x3e\x65\x01\x80\xf6\xd7\xe5\x94\x6b\xc6\x7a\x90\x5e\x59\x94\x73\x3b\x49\xcd\x03\xf7\x11\x90\x0e\x5a\xe3\x8e\x6b\xb1\x3c\xcb\xe9\xf0\xb8\x8d\x42\x24\x61\xfe\x52\xd6\x09\x49\x05\xc5\xc0\x76\xf0\x77\x1d\x2d\x3b\xdf\xee\x28\x34\xb6\x20\x3a\x76\xd0\x77\x38\x63\xdd\xd4\xa3\x2e\x7f\xc2\x76\x63\x1f\xae\xf8\x4b\x87\xf3\x9d\x88\xf9\x87\xe2\x82\xfa\x34\x98\x04\xdf\xae\x69\xe8\x1b\xe9\x0e\xc2\x46\xb8\xde\x43\x3f\xa1\x1a\x67\x63\x32\x17\x26\xe4\x96\xed\xda\x54\x68\xd5\xfe\x10\x36\xb6\xf0\x29\x57\x61\x36\xdd\x84\xe1\x47\xf1\x24\x4b\xe2\x3c\x35\x57\xbd\xc7\x07\x58\x08\xbd\xa4\xe9\x40\x21\x90\xc1\x17\x2c\xf8\xa6\xf4\xbf\xb3\x1e\xe9\x6c\x23\x88\x2d\xd8\x5f\xa4\x68\x0c\x47\x62\xf5\xac\xec\xf1\x15\xae\x23\xb5\x6e\x9c\x91\xc1\x3f\xd3\x79\x6d\x60\x16\x84\x7d\xb1\x5c\x5a\xf6\x2c\x50\x97\x05\x14\x69\xf0\xb5\x40\xbe\x07\xa5\xa0\xd0\x28\x0f\x45\x05\x8f\x7d\xe1\x54\xe2\x04\x36\xdb\x6a\xa6\x2a\x87\xb0\xc6\xaf\x1a\x20\x57\xe8\x21\xa4\xf3\x2f\xfc\x88\xe7\x50\x3f\xf8\xa3\xbe\xfa\xde\x42\x12\x5a\x8e\xd4\x2d\xe5\x37\xdc\x61\x95\xf7\x00\xca\x8e\xfe\x29\x76\xbb\xf0\xa7\x06\x28\x8a\x7b\x96\xfd\x45\x15\x67\xac\xfe\xc0\xb6\x50\xbb\xab\x42\x02\x72\x2f\x0f\xa6\x50\x90\xb0\x2c\xbe\xf2\x2f\x76\x47\x69\xf8\x91\x3f\x2d\x7f\xe8\xad\x02\x3b\x2d\x72\x58\x15\x29\xf8\xe7\xc2\x7b\x67\xc3\xe4\xd9\xc7\x72\x10\x12\x49\x2f\x07\x82\x8d\xbd\xbf\x4d\x92\x29\x0d\x80\x99\x16\x96\xd7\xa4\x4d\x10\x7e\x46\x8c\x3a\x8f\xa0\x47\xc4\x59\xb8\xc5\xe8\xe7\x9c\x66\x5e\xc5\x4f\xb7\x60\xba\x57\x3b\x62\xed\x1e\xae\x95\x76\x03\x5b\x51\x71\x34\x24\x0f\x74\xbc\xd4\x4a\xe1\x53\xac\x8f\x1a\xa3\x90\xb0\x01\xe2\xe9\xfa\x01\x63\xf5\x3d\xf1\x50\xc7\xa9\x38\xb0\x29\xcf\xc6\x16\x0c\x92\xe2\x31\x32\x90\x8e\xa1\x16\x3b\x6f\x4d\x84\x9d\xad\xe9\xff\x73\xf5\x6e\x59\xb2\xea\x3e\x13\xe7\x7b\x0f\xa3\x5e\x6a\x54\xfd\x60\xc0\x09\xae\x04\xcc\x9f\x4b\xe5\xce\x5a\xab\xe7\xde\x0a\x45\xc8\xe4\xf9\xea\x9c\xbd\x90\x49\xee\x17\x63\xcb\xd2\x2f\x5a\x7a\xfe\xaf\xa7\xf8\xab\x40\x30\x96\xa8\x00\x68\x84\x47\x70\x21\x44\x0a\xc3\xcb\x04\x9f\xcd\x5c\x1a\x4a\xc0\x95\x71\x94\xbe\xef\xe8\x11\x5a\xad\x59\x03\x7b\x48\x32\x9c\x92\x19\x0b\xf7\x97\x40\x0c\x3b\xe3\xf6\xf6\x2c\xfd\xa5\x38\xcc\x2d\x58\x0a\xd2\x97\x95\xed\x22\x7f\x1f\x18\x02\x7c\xb2\x74\x02\x76\x81\xe4\xae\x34\xdb\xa5\x47\xa5\x4b\x2c\x1d\xd2\x4b\x8b\xdd\x8a\xe0\x3b\x84\x57\x52\x83\x6d\xa2\xff\x20\x41\x61\xeb\x8b\x68\xab\x18\xd1\x0e\xac\x02\x18\x6e\x11\x0a\xea\x41\x2a\x5c\x44\xa9\x15\x0d\xa8\xf0\x1b\x64\x65\x8f\x4a\xe4\x35\x99\x28\x90\x15\x30\x08\x78\x05\x76\x22\x07\x02\x0a\x1f\x5a\xc6\x8f\x2b\x90\x3d\x3b\xc8\xb0\x63\xde\x83\x4b\x86\xb4\xf3\x35\x7e\xca\x8a\x13\xb4\x57\x72\x0f\x51\x64\xd7\x67\xd6\x5c\x0c\x5c\x87\x59\x90\x2e\x9f\xa8\xb8\x8c\x0a\x21\x85\x56\x72\x88\x26\xbf\x28\x9e\x1d\x1f\x99\x1d\xd0\x6c\xce\x09\x95\xdf\x3d\xfd\x64\xe9\x7d\x27\xb9\x5f\x9c\x28\xac\x0d\xd8\x71\x49\xfc\x78\xb4\x9e\x52\xa6\xa5\x6d\x0d\x6a\x42\xa2\x92\x63\xa3\xcd\x07\x9f\x3c\xc4\xee\x2b\x00\x08\x84\x2b\x38\xe6\x00\xb9\x65\x92\xd9\x7d\x7b\x5d\xb2\xbd\xc7\x25\xcd\xa1\x7b\x7c\xe8\x21\xda\x04\x49\xb3\xc6\x0d\x32\x56\x68\xfd\x57\x22\x79\x61\xab\x7f\xbb\xb4\x83\x0d\x6f\xbe\x82\x1b\x1c\x5e\x50\x90\x97\xd7\xb0\x00\x57\x88\x0f\xd7\x5f\xc4\x1b\x64\xda\xf8\xe0\x47\x52\xb6\x8b\x23\xef\xc1\x34\xd8\x4b\x66\x1a\xbf\x87\x9e\x0d\xb4\x9a\x10\x72\x23\x16\x68\x3b\x9f\x9c\x00\x2f\x44\x06\x8c\x4b\x20\xb3\x1e\xb5\xe7\xfb\x1d\xf8\x81\xdf\x26\x30\xbe\xe1\x7d\x6c\xc2\xc6\x91\xe0\x0f\x16\x1f\xe9\x1c\xe0\x11\x30\x02\x83\x04\x82\x40\x0a\xb4\xfc\x7e\x85\x70\x62\xaa\xa6\x9e\x4c\x6e\x13\xbc\x28\x5e\x93\xba\x7d\x7c\xf0\xad\x01\x28\x74\x06\xb8\x02\x4a\x3e\xaf\xf5\x41\x72\x81\xbd\x2a\xbc\xca\x08\x0c\x29\x54\x4d\x76\x91\xe3\x5b\xb6\xd3\x66\xcc\x55\xbf\x40\xf2\xf1\x4b\xf0\x81\x80\x0e\x08\xdf\x30\x7b\xe8\x4e\x30\x07\x44\x7c\x03\x47\x80\xd1\xf6\x2a\x71\xfc\x2a\x0a\xe8\x8f\x86\x9d\xd3\x25\x74\x41\xd2\x38\x16\x35\x90\xdb\x79\xcc\x29\xe8\xe4\x5b\x39\xe3\xdd\xdf\xca\x1d\x99\x00\xe0\xc0\x3b\xac\x10\x21\xdc\x90\xb9\x63\xed\x05\x9e\x4a\xd1\x00\x10\x0c\xd1\x0a\xc6\xf1\x1d\xe9\xf4\x05\x78\x24\x6d\x20\x87\x72\x35\xd2\x4d\x3f\x3a\xe4\x4c\x3f\x8d\xcf\xb4\xf5\x27\x0f\xc4\x6c\xfa\xa1\x20\x87\x98\x18\x44\xd7\x55\xde\x8e\x30\x3b\x32\x0c\x24\x0a\xb3\xc1\xbb\x54\xdd\xc7\x6f\x55\xda\x7b\xe7\x94\x12\xcb\x2c\x1c\xd3\x59\xa8\x87\x6d\xad\x05\x56\x9a\x9e\x6e\x73\x4b\x73\x6c\x2e\xe2\x85\xd6\xe1\x9b\xa5\x2d\x47\xb2\x3c\x39\x79\xf1\x0d\xd8\xa0\xc7\xee\xd3\x35\x7c\x37\x4e\x41\xe0\x94\xc8\xa6\x2d\x2f\x08\xf3\x24\x21\x21\x0b\x82\x30\x04\xbb\xc9\xea\x99\x3e\x2f\xa2\xbc\x42\xb0\x19\x6d\x38\x37\xe3\xeb\xbd\x39\xaf\x85\x57\x48\x3c\x04\x80\x9d\x2f\x1f\x2e\xda\xf4\x89\xf4\x1e\x41\x96\xc5\xf8\x32\x28\x33\xeb\x55\x42\xe3\xe1\x5b\x56\x62\x48\xc3\x96\xe6\x93\x6a\x90\x1b\x50\xef\x52\x77\x8e\x08\x3c\xb3\x44\x3c\xda\xee\x6e\x9e\x83\x0c\x66\xb6\xac\x60\x4f\xed\x53\x88\xd2\xa0\xd8\x49\x4f\x1e\xb2\x7b\xe0\x1d\x07\x2f\x10\xc9\xe3\xba\xcc\x33\x9d\x0d\xd6\x0b\x39\xbc\xe5\x6d\x06\xaa\xc0\xf8\x5c\x50\x86\x59\xf4\x00\xe8\x3c\xd0\x6b\x0e\xb2\xd7\x1e\x14\x83\xe4\x29\x29\xf8\x24\x89\x8e\x05\xd3\x27\xd1\x9d\xfa\xcc\x7e\xab\xb5\x52\x70\xf9\x3f\x4a\xcb\x21\xb4\x6c\xaf\xa2\x42\xcf\xeb\x4c\x79\x27\xb2\x0a\xdc\x0f\xef\x4b\x71\xb9\x51\x54\x87\xe1\x7d\x1c\xf9\xa2\x59\x43\x3d\xea\x96\x5a\xbf\x4b\xab\x0f\x1f\x06\xa1\x80\x36\xd2\x14\x23\xcc\x7a\x7d\x57\x42\x01\xec\x00\xa6\x9b\x54\xb3\xda\x75\xe1\xcb\xb2\x5e\x3e\xb6\x6e\xf5\xc7\x1f\xc3\x94\xd6\x8a\x51\x49\xbf\xb1\xab\x30\xf3\x2b\x3d\x31\x2b\xc9\x6f\x6b\xdd\x5f\x79\x54\xeb\xcd\x79\x05\x07\xc3\x11\x20\xe3\x4c\xbd\x65\x0c\x54\x32\xd5\x68\xad\x90\x19\xf3\x25\xd1\x79\xc0\x40\x2b\x37\xe2\xfd\x5d\x11\x03\x5c\xfd\x88\x80\x75\xb3\x19\x1d\x62\x6f\xc5\xc5\x89\xbd\x04\x5c\xaa\x7f\xae\x82\x12\x99\x9d\x9b\x9a\xf3\x4b\x9a\x1f\x6b\x76\xce\x05\x15\xa5\xf3\x78\x87\x2e\x22\x53\xd5\xb3\x60\xad\x51\xbf\x73\x46\x04\x72\xac\x11\xe1\x6d\x8d\x6d\x6b\x12\x2d\xb4\xbc\x49\x8c\x88\x23\x96\x57\x6f\x33\xad\x50\xcb\xa7\x3c\xb4\x18\x6d\x2b\x6b\xa6\x15\x03\x9d\x98\x7e\x1f\xef\xd5\x55\x7f\xdf\xf7\x7b\xe4\xc5\xe3\x0c\x75\x86\xe5\x96\x6a\x42\xd2\x9f\xe4\x9d\x01\xd2\x7d\x14\x5a\x07\x87\x21\xcd\x22\x59\x02\x46\xe0\x8e\x96\x6b\x3f\x13\x6f\x89\x18\x08\x92\x9f\x6e\x4f\xa4\x99\x52\x09\xbe\x5a\x36\xf7\x62\x9f\x25\x4f\x63\xbf\x82\x2a\x60\xa7\x1a\xfd\xa9\xa5\x4a\x28\x61\xe1\xcd\x05\xc4\xa0\x49\x74\x2f\xc8\x6a\x59\xc1\xd6\x7f\x84\x4a\x74\x95\x62\x35\x52\x4a\x69\x58\x73\x97\x7d\x92\x05\x8c\x9b\x95\x86\x67\xfd\x8b\x80\xe0\xec\x35\xae\xdd\x3b\xf2\x9e\xf6\x37\x8f\xbd\xfc\x0b\x19\xe7\x63\x67\x35\x66\x56\x04\x3d\x40\x39\x3a\x73\xec\x0f\x66\x0a\xaf\xdd\xe2\x79\xa0\x74\xb7\x2c\x1e\x5b\x2d\xd0\x15\xb7\xb4\x96\x0f\xbc\x01\xc2\x0a\x38\xe8\x03\x7a\x41\x28\x2c\x9b\xa9\x0c\xde\xa5\x8c\x7b\x58\x56\x63\x21\x6c\x30\xcf\x1c\x29\x5b\xb2\xe2\x61\x98\x78\x45\x51\x18\xb6\xe8\x40\x33\xb0\x57\x53\xa1\x83\xc0\xf5\xec\xb1\x4a\xae\xc2\x16\x1c\xd5\x7a\x6b\x12\x95\xae\x3b\xb5\xb1\x33\xb6\xce\x4d\x06\x57\x6e\xf1\x64\x00\x69\x62\xe7\x20\xd5\x21\x06\x37\xe4\xc5\xfb\x35\x6b\xc8\x6f\xe9\x47\x74\x9d\xdc\x4a\xfb\x4a\x87\x99\x3d\x97\x7f\x5e\xdf\x2c\x11\xab\x83\x27\x35\x2f\xe9\xd6\x3b\x43\x80\xe0\x7e\xfb\x44\x22\xc1\x98\xe9\x83\xf8\x48\x0a\x4e\x60\xc5\x5e\x7c\x5b\x48\xab\x24\x06\x57\x42\xd4\x5a\x9c\x81\xfd\x37\x9a\xc3\xd0\xb6\x0e\xd0\xc0\x6e\xcf\x50\xa6\x55\x95\x74\x0c\xb3\x01\x07\xac\x11\x39\x5c\x4f\x2d\x11\x88\x85\xbd\x6f\x72\xd7\xeb\xc7\xad\x05\xbb\x3b\x50\x09\x20\x1f\x84\xe9\x9c\x12\xf2\x1a\x56\x7a\xd8\x17\x97\xdc\xa7\xf1\x21\xf2\x04\x36\x82\xb5\x61\xd4\xb0\xb0\x52\x9a\xd8\x46\xc3\xc7\xef\x9c\x64\xc0\xf5\x70\xca\xae\xbf\x41\x88\x28\x4b\x9c\xdc\x98\xfe\xfe\x03\x4c\x38\xbc\x0b\xbe\x24\xb4\x89\x3d\xd9\xde\xc5\xad\x99\x77\x8f\xf4\xf3\xb8\x6c\xb3\x0f\x8a\x71\x2b\xf3\x65\x3d\x14\xdf\xc4\x7c\xf9\x57\x4a\xe8\x84\xe0\x1a\xb8\x64\xee\x48\x8b\xfc\x03\xeb\xca\xd6\x4b\x74\x84\x4a\x29\x34\x34\x7d\x09\x31\x00\x28\x84\xcd\x15\xe1\x35\xe7\x3a\x04\xc8\xc4\x3e\xa7\xd5\xa9\x24\x5c\x85\x5d\xea\xb9\x86\xfc\xc5\x5c\x02\x64\xa0\xc1\x02\xf7\xc4\x7a\xa2\xa9\x7e\xb7\xcf\x1d\x5b\x9d\x80\x26\xa0\xd3\xc0\x1d\x95\x87\xa4\xb7\x35\xf1\xce\xec\x5c\xa4\xd9\x34\xe7\x97\xf0\x08\x60\x9c\xc7\x69\x91\x4f\x59\xdd\x31\xe6\x04\x05\x3f\x26\xb4\x9f\x29\x7b\x9d\x05\xeb\x98\xf3\x72\x91\xa9\xa0\x8d\x8d\xe5\x50\x22\x8b\xd9\x37\x27\x7d\x46\xc8\x35\x52\x81\x09\x39\x78\x2d\x32\xac\x35\xba\x87\x2c\xf6\x71\x3c\xeb\xf6\x70\xd3\xb3\x16\xbf\x04\x4e\x40\xaf\xe6\x50\xe1\xc1\xc1\x14\x88\x48\x5a\x23\x95\x16\x42\x73\xdc\x0a\xaf\xc6\x0c\x46\x09\xb7\xdf\xd3\xf5\x39\x03\x76\xa7\x2d\x76\xd6\x06\x97\x5e\x37\xb2\xc8\x49\x2b\x78\x05\xc4\x80\x7e\x95\x27\x82\x7d\xac\x07\xe2\x24\x84\xed\x1f\x1e\x8a\xa7\x14\x4b\x9f\x90\xce\xf5\x19\xf8\x9a\xd9\xe7\x8c\xd1\x28\x4f\x7b\x98\x1c\xba\xf8\xb4\x1a\x7a\x25\x0f\xcc\x4c\xfb\xee\x9c\xee\xb9\xb2\x8b\x8d\x10\x7e\x5a\x12\x42\x83\x45\x5d\x21\x90\x06\xbf\xa9\xc9\x8d\x47\x4f\x6a\x9b\x00\xb5\x2e\x12\x5c\x7b\x4e\xfb\x75\x58\xdd\xf6\xcb\x5f\x26\x3a\x6b\x9f\xf9\xdd\x12\x0d\x9e\xf9\x45\x70\x03\xfd\xe8\x78\x3d\xb2\x00\x0e\x5c\x07\x94\x93\x2a\x0b\x31\x5f\xbe\x3f\x7b\x2b\x17\x8e\xa7\x41\x97\xd9\x61\x4b\x66\xf0\xf8\x7e\x1a\x97\xe7\xe7\xfa\xb1\x85\x2e\xb7\x86\x60\x74\xfc\xb0\x97\xf7\x03\xa8\x25\xa7\xd6\xf4\x62\x67\xeb\xa7\x9e\x21\xda\xbd\x22\x08\x96\x47\xf0\xc3\xbc\xc4\x9f\xdb\x1f\xfa\x53\x90\x65\x4a\x13\xe3\x9f\xde\x93\x32\x4b\x81\xc2\x3f\x1e\x0e\x49\x17\x35\xec\x98\x9b\x37\x4e\x11\x7e\xc6\x87\xfc\x27\xfd\xfa\xf9\xfc\xd8\x2b\x80\x61\x85\x35\x6c\xfd\xba\xe0\xae\xe7\x2f\xca\x79\xfb\xbc\x22\x66\xae\xdb\x48\xec\x83\xe0\x71\x68\x6a\x87\x24\x66\x09\xa8\x00\x34\x81\xcb\xf8\x29\x49\x1d\x73\xc4\x2c\xf0\x28\x07\x9a\x88\xb9\x6a\xf0\x87\xbd\x22\x58\x8a\x6d\xc5\xc6\x82\x90\x9a\x35\xc6\x01\xaf\xad\xa9\x70\xef\xdb\x9e\x1b\x6d\x01\x45\xb0\x5b\x45\x22\xf3\x19\xca\xeb\x27\x36\x62\x4f\x62\xdf\x48\x8d\xbb\x01\x16\x58\xd2\x66\x0e\xe5\x90\xf1\x68\xe8\x10\x12\x0d\x42\xcd\x2c\xa4\xef\x4a\xc8\x7a\x45\x62\x6e\x83\x3c\xcc\x9e\x7a\x44\xee\x43\x6c\x0e\x39\x15\xf3\x0d\x6a\xb8\x15\xf5\xca\xea\xd9\x8c\x4d\x82\x7b\xb8\x98\x28\x19\x47\x8c\xde\x79\x6a\xec\x0a\x7d\xe9\x65\xaf\xb1\x7b\x04\xb0\xcb\x00\xe9\xf9\x8c\x43\xe9\xa5\xe0\x7d\x2c\x0c\x2e\x36\xb3\xf7\x64\x1b\x1d\x07\xb1\x5b\x24\x3a\x28\xf0\xd1\xb5\xba\x55\x33\x7b\xff\xf2\xd3\x8c\xfc\xc1\xb2\xd8\x47\xf4\x92\x63\x46\x49\xe6\x68\x53\x85\xac\x00\x24\xbd\x7d\xde\x00\x20\x9c\x67\xbf\x51\x69\xf5\x51\xe2\x49\x19\xbe\xfd\x2c\xfa\x48\x07\x2a\x1d\xc2\x4e\x1e\x5e\xbb\x95\xef\xf2\x4d\x69\xef\x85\x70\x81\xf7\xb0\x5b\xdb\xeb\xa0\x0d\x21\x4d\xac\x31\x21\xd4\x04\x38\xd7\x6f\x95\xd8\xbb\x9b\x14\x8f\x60\x53\xde\x58\x33\xec\x78\xf4\x93\x67\x92\xc9\xee\x42\xee\xdb\x7a\x01\xc0\x46\x0f\x6e\x2b\x0f\x6f\x6a\x69\xc6\xee\xd2\x9f\x44\xa3\xf2\x82\x1d\x72\x6a\x8a\xe0\xcd\xe5\x6f\x66\x2f\x45\x66\x40\x99\x09\x5c\x00\x1f\x43\x59\x42\x28\xf4\x1c\x20\xf2\xfc\x8a\xd1\xfb\x4c\x84\x35\xc4\xc6\x18\x87\xed\x9c\x86\xa5\xd6\x9b\xcd\x50\x1d\x1e\xd8\xb3\x50\x04\x73\x58\xf2\x3d\xea\x33\xd5\x47\xe3\xc9\x4c\xab\xd7\xe1\x13\xbc\x0a\x1f\x5c\x06\x8d\xc0\x4e\xc5\xc9\xe0\xd2\x2a\x9f\xe7\x35\x44\xaf\xa7\xfc\x2f\x51\xf5\xc2\x0b\xaf\x97\x13\x1f\x72\xd3\x4e\x81\x2f\xc7\x3b\xb5\x66\x58\xeb\x8f\x90\x48\x0c\x5a\x48\x32\x1c\xf9\xaa\x5c\xd5\xea\x04\xce\xd2\x89\x03\x84\x33\xb2\xcb\x64\x76\xbb\x5e\xd9\x9a\xc7\x6f\xe9\xa1\x6b\x94\x00\x89\xac\x9b\x3b\x61\xa7\xac\xaf\xef\x94\xbb\xdd\xba\x39\xb4\x42\x7a\x3d\x64\xae\xfc\x23\xae\xf7\xd1\x6c\x6a\x98\xb7\xfe\xb5\xc7\xd8\xc9\x2f\x82\x20\xbb\x60\x17\x99\xbd\x87\x10\xd6\x94\x3c\xdc\x47\xf4\x06\x6f\x93\x68\x99\x6d\x7b\xcb\xa2\xc2\x5b\x14\xc6\x68\x31\xa1\xdd\x56\x34\x6d\x72\x2c\x2c\x8c\xfc\x1d\x7a\x5b\x39\x37\x88\x44\x6c\x62\x7e\xec\xf9\x29\xab\x1d\xde\xc8\x08\xe6\x09\x19\x4f\xb8\x3c\xe3\x9b\x4e\x4b\x97\x3f\x27\xb9\x41\x41\x3a\xe3\xf5\x21\xb6\x34\x5e\x2d\x6b\x79\xbc\x42\xe0\xc0\xda\xc9\x18\xab\x56\x2c\xcd\x28\x94\xb8\xc3\x23\xbe\xc3\xea\xa9\x5d\x5e\x91\x4e\x11\x96\x16\xaf\x74\x2b\xd9\x11\x49\xab\x9c\x6e\xd4\x11\x74\xc3\x4a\xe3\xf1\xd0\x86\xb2\x84\xbe\xbe\xa4\xa1\x7e\x30\xaf\x1b\xdd\x0a\x85\x1a\x33\x9a\x3c\xe6\xae\x94\x24\xdf\xbd\x49\x72\x4e\x4d\x56\x1d\x57\xad\xd3\xe2\x03\xbd\xbb\xe3\x1e\xd4\xfa\x51\xb0\x97\x11\x47\xbb\xd1\xaa\xec\x6e\x9b\xd1\xcd\x61\x68\x6b\xf1\xe2\x58\xef\xcc\x3e\xbe\x6f\x72\x2d\xf8\x34\x49\x36\x9d\xd6\x80\xfe\xa4\xae\xd1\x2a\x1d\xf8\x59\xee\x39\x33\x9c\xf4\x60\xcd\x49\xdd\xfa\x71\x96\x80\xf5\x58\xfe\x48\xce\x1d\x8b\x9e\x04\xab\x32\xfe\xa8\xb4\xbe\xb0\xc6\x82\xe1\x5f\x4d\xd7\x53\x0f\x78\x04\x7c\x56\xbb\xb4\xd4\xad\x9e\x9e\x42\x56\xdd\x2f\x76\x3a\x59\x94\x2a\x7c\x10\x33\x20\xb5\xae\x23\xb2\x6b\x34\x95\x1f\xbf\x32\x69\xc6\x28\x65\xac\xe9\xb9\xbc\xdc\x05\x84\x06\xe7\xc8\x0f\x18\x93\xd5\x95\x8a\xdc\x1a\x13\xf5\x99\xec\x4b\xa5\x86\x32\xac\x16\x36\xf8\x00\x7f\x86\x34\x89\xa5\xb4\x20\x88\xc7\x35\x0c\x3e\xe9\x05\x8b\xb0\x0a\x0a\xd9\x86\x54\xa3\x80\x20\x7b\x27\x7a\xc0\xde\x74\xdb\xa3\xf5\xa4\x20\x3b\x59\xe2\x67\xc3\x44\xa6\x95\x96\xb0\x6a\x77\x56\x94\xd3\x03\x12\x8c\x4a\x54\x79\x20\xaf\x87\x6c\x03\xef\x91\x17\x11\x22\x76\x56\x54\x4e\x95\x60\x0e\x5b\xa8\xb4\x93\x04\x60\xa5\x2e\x0d\xb2\x28\x36\x6f\x75\x6e\x93\xa1\x83\x34\x0a\x5e\x71\xfe\x10\x5a\xb2\x8f\x4a\xe4\x3f\xd4\xdb\x51\x29\x34\x53\xfb\x02\x51\x8f\x60\x8a\xf9\xe2\xe4\x56\xc3\x36\xbb\xb5\xfc\xcd\x8e\xc4\xd0\x07\x12\x6d\xa2\x85\x63\x05\xb9\x4c\x60\xf9\xa4\x08\xce\xfa\x98\x1b\x53\xdb\xcc\x44\x49\x33\x6b\x35\xf0\x2b\xf0\x28\xff\xd4\xbf\x01\x8f\x42\x70\x0d\x6b\x16\x30\x10\x02\xf8\x89\x10\xc0\x23\x8a\x22\xed\x77\x69\x0e\x00\x87\x7f\xee\xba\x24\x96\xc5\x7a\xf7\x2b\x1e\x91\x39\xf0\x80\x97\xd7\xa3\xab\x1e\xec\xe0\xa0\xa9\x22\x14\x04\x95\xdf\xc9\x79\x68\x8c\x05\xb3\x1c\x3c\xe7\x66\x19\x89\x94\xf8\x6d\x90\xa1\x07\x69\x02\x0f\xeb\xa1\x78\x5d\x04\xe3\x4b\xc0\x0a\xfe\x10\x6a\x44\x8f\xb4\x3f\xc5\xa9\xa0\xbb\x04\x7d\x14\xb5\x20\x1c\x52\x61\x67\xba\x06\xa7\xe2\x96\xa7\x36\x5b\xc3\x57\x5c\x87\x2b\x58\xfb\x99\x17\xc6\x89\x12\xe8\x69\x93\x60\x43\xc0\x84\xb0\x11\x01\x96\x10\x06\x22\xe4\x65\x1a\x5e\x42\x78\x05\x07\x4d\x90\x4b\x70\x2b\xcb\x7b\xc9\x9a\x0a\x5a\x18\x96\x1b\xe9\xd8\x9a\xc3\x31\xff\x7a\x0e\xbb\xd0\x03\xbf\xcc\xa3\xe5\x0f\x1e\xe0\xeb\x6c\x09\x08\x7a\x73\x7a\xc7\x1e\xe5\x63\x41\xaa\xf9\x90\x64\x7f\x89\xfb\xa0\x41\x5c\x28\xd1\x89\x4c\x41\xfa\x23\x46\x28\xa3\xd1\x6d\x6d\x7a\x8f\x71\xcb\x5b\xf5\xfe\x16\x0e\x57\x7b\x75\x06\x44\x98\xf6\xac\x91\x97\xb1\x1e\x97\xe6\x4d\x49\x79\xbe\x19\xb1\x96\x0f\xcd\xe5\x47\x81\xc7\xb5\xa2\x52\x0f\xdb\x5a\x51\x50\x6a\xe6\x0a\x89\x84\x6e\x87\x66\x90\x1f\x01\x69\x78\xb9\xfd\xf2\xb2\x78\x8f\x24\x2b\xf5\x96\xe6\x1a\x10\xb6\xbc\x04\x15\xc3\x3a\x6d\x88\x50\x13\x03\x22\xed\x2d\xdc\x96\x25\xca\xac\xc6\x3a\x48\x1b\xe6\x6f\xe2\x43\x68\xcb\x0d\xcf\x11\x14\x10\x07\x44\xc4\x8f\x2e\x68\xad\x5b\x12\x09\x37\xb9\xe8\x3a\xda\x97\x45\xc1\x82\xc0\x46\x44\xf3\x3f\x87\xa0\x58\xce\x3e\x9a\x07\x65\x5c\xbf\xc4\x43\x21\x56\xfc\x60\xc1\xc9\x00\xb9\xff\x93\x0a\xbe\x0b\xaa\xc7\x15\x00\x56\x47\x92\xfe\x88\x0e\x7e\xd3\x08\xef\x44\x96\x6f\x6a\x78\x67\x65\xcf\xbf\xd4\x04\x1a\x7e\xbd\xa1\x39\x5c\xbf\x99\x28\x0a\x6b\xc5\x13\x1d\x70\xcd\xbd\x66\x35\x64\xcf\x10\x28\x36\x47\x4e\x84\x1c\x3d\x1b\xdf\x03\x92\xcc\xd3\xd5\x7f\x09\x35\x21\xd5\xee\xfa\x3a\x82\x0b\x60\xbd\xbd\x5d\x42\x70\xb0\xf1\xe5\x65\xf2\x7f\xc4\x0f\x0e\x9e\x30\xf8\x25\xc4\x44\x89\x03\xf9\x04\xee\x5a\xc1\xb3\x56\xf9\xad\x1f\xaa\x64\x27\x90\xa1\x40\xe0\x43\xd5\xf6\x15\xf0\x31\x94\xdf\x6b\x0e\x98\xc3\x6f\x69\x23\x8f\x0d\x58\xd1\x94\xdd\x4f\x02\x07\xbe\x1a\x97\x22\x68\x12\x47\x43\x83\x40\x68\xbe\x49\x19\xa0\x80\x2e\x91\xe4\xea\xbd\xd0\xc4\xd5\x91\x53\x50\x6e\xb5\xfb\x72\x58\x0b\xdb\xbe\x36\xb3\xb6\x72\x8b\x26\xa1\x80\xfe\x56\x5b\x10\x35\x68\x04\xf2\x01\x72\x91\x43\x7d\xcd\x0a\x8e\xfb\x69\x4b\xf6\xd6\x90\x3f\xf2\x57\x23\x5e\x58\x87\x36\x16\x64\x4b\x90\x85\xb5\x21\x2e\x22\xf9\xdc\x85\xe8\xaf\x33\x0e\xe0\x83\x56\x68\x05\x90\x95\x56\x51\x38\x6e\xb1\x78\x6b\xb4\xeb\x8a\x7b\xf3\x9d\x07\x07\x16\xec\xc1\x91\x16\x6b\x07\x6e\xd3\x9e\xc6\x85\xbf\xb8\x54\x3d\xaf\x1f\x55\xf4\x24\x4f\x2f\x49\xfa\xdf\x24\x19\x06\x09\xc5\xb3\x62\x2c\x8d\x9a\x91\x1a\x96\x0f\x6c\x8c\x5e\x6f\x13\x45\xea\xb9\xd1\xed\x56\xc2\x07\xfd\x95\x46\xbd\xda\x1d\xcc\x41\x69\x0e\x0c\xc6\x5d\x4e\x5a\x1a\x8e\xd8\x2f\x21\x34\x78\x18\x0d\x45\x42\xd5\x44\x0a\xd8\x87\x62\x3d\x78\x1d\x7e\x41\xb3\x13\xcd\xe8\x6a\x1c\xfe\x1b\xc1\x30\x64\x67\x5a\xd1\x8a\x4f\x3a\x84\xed\x3b\x47\xac\xdd\x42\xf7\xd1\xc3\x76\xad\x7b\xe9\xd4\x43\xea\xbe\x8f\xac\xcf\x01\xc3\xda\x71\x34\x83\xbb\x31\x55\x70\xfc\xc2\x7e\xf5\x1f\xbc\x8e\xa5\xe1\x41\xa8\x7b\xdf\x16\x05\xa7\x83\x5b\xf3\x8e\xbc\x86\x68\x86\xfc\xe1\xc0\x07\xc3\x63\xbb\xfd\x89\x43\xee\x2e\xbf\xff\xfc\xad\xb3\xcb\x55\x78\xd0\xd6\xcb\x29\xa2\x76\xbc\x62\xec\x10\xd9\x75\xfe\xbe\x27\x60\x99\x75\xc3\xd3\x8e\x4c\x26\x1f\x81\x19\x90\xc3\x7e\xd2\x20\xd9\xc6\xda\x1a\x99\x53\x6b\x28\x22\xa3\x9d\xf1\x14\x94\xdf\xf7\xcb\xe0\xda\xaa\x4e\x00\x78\x9f\xf5\x1f\xd9\x18\xc8\x26\x1f\x42\x64\xff\xac\x1e\x1b\x6d\x86\x90\x32\xfd\x25\xaa\x87\x07\xbb\x7d\xd3\xde\x7f\xa3\x9b\xd0\x7f\x40\xcc\xcc\x7e\xb0\x73\xd7\x83\xfb\xbf\x77\x84\xaa\xf7\x56\xc3\x55\xba\xd2\xfa\xdd\x61\x8a\x32\xfb\x82\x56\x51\x15\xc2\xe3\x52\x52\xb0\x99\xae\x81\x00\x85\x7e\xc8\x99\xf3\x67\xab\x01\xb8\x56\x8b\x57\xea\x71\xd7\xc9\xf3\x28\x1d\x67\xe4\xd7\x12\xb8\x0f\x88\x7f\x29\xb9\xdf\x43\xe0\x35\x9b\x39\x56\x50\xf5\xcf\x6c\xe4\x63\xf0\xc5\x73\xf4\xa1\xe8\xf5\x0e\x43\x8b\xbb\x8a\x1f\x57\x08\x8d\x6f\x0f\x65\xd9\x69\xf5\xcf\x18\xd2\xef\x2b\x1a\xbb\x62\x7f\x38\x36\x64\x4b\xa2\x76\xe0\xad\x01\xed\x58\x05\x4e\x3c\x7d\xee\x5b\x52\xff\x82\x4f\x30\x18\xf7\x5b\x05\xc7\x04\xaa\x80\x5b\x2e\x8b\x43\xc0\x3d\x52\x12\x8e\xcd\x99\x1d\x5a\x1b\x19\x16\x83\x0e\x60\xbb\xef\x08\x41\x24\x5c\x04\x20\x12\x3d\xa9\x31\xa3\x78\x5d\x18\x8b\x9e\x5e\x3b\xca\x9d\x84\x72\xfa\x84\xb1\x54\xb0\x56\x65\x78\x38\xf6\x5a\x37\x29\xf6\x5b\x25\xb8\xdd\xe4\x90\x70\x46\x9a\xf9\xe4\xc4\x23\xb1\xb5\x28\xfd\x4e\xb4\x95\xfe\xd2\x50\x22\xf5\x83\x92\xd2\x0b\x64\x45\x25\xca\x33\xb6\xa8\xe9\xc2\x84\xde\x46\x28\x41\xbe\x47\x6a\x6c\x11\x07\x8d\xf4\xc1\x20\xb9\x2b\x5a\x67\x8d\x30\x7e\x2b\x60\x35\x4e\x0a\x19\x50\x79\x70\x67\xd6\x26\x89\xf3\x87\x29\xd0\x0d\xc2\x76\xe5\xe1\x36\xbb\x2b\x71\x49\x97\x6f\x6d\x77\x6e\xb2\xc4\xb2\xef\x5d\xba\x40\xa0\x7e\x99\x3f\x74\x7d\x9c\x31\xb2\x77\x42\x5f\x34\xe0\x48\x9c\x51\x03\x90\x68\x55\x35\x6c\xfa\x40\x10\xf4\xd5\xba\xed\x97\x8e\x3a\x46\x35\xfb\xaa\x07\xbc\x0e\x08\x47\x1b\xe2\x4a\xdb\xa1\x37\xf5\x0d\x94\x98\x64\x02\x4b\xef\xd2\x7c\x9d\xf1\xfa\x59\xc7\xe8\x6c\xdc\x12\x8c\x43\xe7\xf4\x60\xe1\x50\x9e\x89\x99\xa5\x8d\x8a\x22\x1c\xac\xad\x1a\x72\x96\x3d\x08\xd4\x9c\xee\xa3\x70\x0a\xf0\xb3\xf1\x61\x05\xa1\x2f\x06\x66\xfb\x39\x02\x49\xfb\x72\x47\xd6\x58\xe5\xbc\x5a\x9d\xb7\xd3\xf4\x58\xd6\x7e\xf2\xc4\x25\x5a\x74\x0a\x7a\x8e\x28\x0d\xcf\x1f\xf7\xc3\x04\xf0\x74\xf5\x71\x1b\xba\x18\x6d\x46\xb1\xab\x4c\x86\x49\xf5\x38\x14\x9e\xfc\x34\xa7\xe5\x4d\x0f\x4b\x8f\xe0\x18\x9e\xf2\x54\x90\x06\xe2\xcf\xed\x94\x33\xbd\x29\x6e\xf1\x3a\x4d\xb9\x9f\xd6\x37\xd7\x49\xd7\xaf\x77\xa8\xc8\x23\x99\x92\x57\xca\x08\xe3\x38\xf7\x7c\x69\xdf\xa8\xa2\x45\x5c\xb1\x0f\x81\x78\x29\x5b\xe0\x3e\x26\x88\x2e\x0e\xb4\x06\x22\x28\x81\x46\xc9\x7f\x82\xa4\x5c\xb3\xf0\x45\x79\x97\xb7\x95\x8b\xcc\x47\x61\xd5\x66\xad\xcc\x6b\xa6\x37\x06\x36\xb7\x95\x1d\xad\xc3\x3d\xc0\x07\x28\x6f\x82\xdb\x3d\x7b\xd4\xbd\xe4\xfc\xf1\x01\x16\xb0\xe4\x04\x76\x53\xf7\x24\x11\x2f\x93\x28\x77\x31\xd0\xa6\x88\xa7\x19\x53\xb8\x26\x61\xab\xbe\xb7\xcf\x52\xf2\x51\x77\xb3\x5c\xcb\x94\x7b\x21\x64\x45\xb6\xdd\xc9\x3a\x66\x31\x5d\x76\xa4\xfe\x7f\x87\xbd\x86\xb9\x5d\x22\xc5\xa4\xbb\x9e\x72\xb3\x1d\xc7\x76\xba\xaf\xb9\x87\x40\x95\xde\xb8\x90\x29\xee\x7d\x9c\x99\xc6\xe0\xa4\x24\x6d\x15\x5f\xfe\x3b\xfc\xac\x4f\xcb\x31\x91\xd4\x8b\xd8\x63\xd6\xf5\x69\xd6\x78\x9d\x5b\x3b\x0d\xd4\x0c\xc1\x8e\x99\x3d\xc7\xa0\xea\x6a\x15\x2e\x61\xef\x5d\xeb\x72\xda\xa5\x4d\xbf\x71\x35\x7b\xf8\x78\x89\x93\x4a\x62\xe2\x76\xef\x8d\xa3\x20\xb0\x5f\x89\xaa\xf8\xd7\x1f\xa3\xb0\xbb\xeb\xcd\x0f\x2f\xa9\x17\x45\x9c\x96\x43\x20\x1b\xe0\x5b\xe6\xe0\xc6\x20\x2d\x46\x53\x6e\xa3\x6a\x5b\x6b\x09\x8e\x0b\xdc\x3f\xf5\x25\x7b\x98\xb5\x5a\x7c\x7a\xbb\x6b\x9e\xa7\xc8\xd4\xec\x02\x4a\x72\xf5\xef\x27\xa7\xd1\x1f\xe9\x38\xd6\x46\x99\xd7\x6e\xaf\xaf\xae\x45\x2f\x81\x0b\x43\x42\xde\xa1\x12\x21\x1c\x7b\x5d\x66\x19\xfc\x88\x76\x08\x3f\x1a\xc4\xa5\xb1\x13\x78\xc8\x0b\x02\xbf\xff\x18\xd9\x5b\xee\x13\x56\xe4\xb3\x78\x31\xf3\xfb\x2f\x07\x3e\xe6\x79\x6d\xf1\xcb\x40\x92\x87\x3d\x96\xaf\x8b\x80\xe0\xce\x47\x80\x64\x44\xa0\x08\x58\x32\x43\x33\xb5\xc3\x80\xf2\x81\x2a\xf3\x16\xc6\xaf\xab\x7f\x7c\xf4\x80\x8b\x09\xdc\x8a\x9b\x6d\x6e\x5c\x8c\x7a\x52\x6a\xbd\xab\xcd\x89\x6e\xe6\xe1\xbb\x46\x20\x15\xa9\x0b\x5d\xc3\xcc\x3c\x11\x2d\xff\xa0\x3d\x16\x32\x3d\xec\xf3\x77\x04\x5c\x66\x46\xef\xa3\xf0\xfa\x59\xa5\xce\xb3\x75\x30\x2f\x67\xa5\x3d\xe6\xe9\x19\xec\x66\xe8\x66\x29\x28\x01\x61\x61\xa7\xc4\x07\x1d\x1f\x23\xa2\x0c\x1d\xaa\xdd\x2c\x91\x61\xe8\x97\x08\x62\x32\x23\x82\xb3\x04\x0d\xc6\xea\xc8\x53\x49\xc4\x5c\x2e\x0d\xed\x37\xb0\xe2\x5d\x3a\xe4\xcb\xf9\x30\x88\x6f\x78\xd2\x54\x1e\x99\x59\x7d\x7a\x13\x4e\x02\x6e\x0c\xf9\xf9\x30\x7b\x26\xbf\x74\xe0\x83\xf4\x34\xe8\x31\xe6\x49\xfd\x97\x46\xd2\x15\x09\x83\x59\x87\xa4\xfe\x73\xe6\x4a\xb0\xec\xbb\xc2\x9b\xe9\x99\xeb\x1d\x52\xba\x79\x09\xac\x5d\x27\x35\x43\x38\xad\x34\xcf\xda\x10\x47\x90\x62\xc8\xb7\xb1\x2e\x86\x7e\x9b\x35\x88\x0c\xab\xfe\x4f\x46\x40\x64\xe6\x86\xb3\x01\x5d\xba\xc1\x67\x46\x51\x81\xf2\xa3\xc9\x7a\x77\x19\x51\x32\xbf\xf2\xfe\x77\x9e\x2f\x22\x6b\xfe\xcb\x64\x80\x9b\x4d\xa7\x4b\x97\xd1\x6d\xd7\x13\x04\x9b\x97\xcf\xac\x02\xb6\x05\x6d\x8f\x91\x77\xb3\x7f\xea\xb5\xc5\xf8\xd7\x19\x07\x9e\xae\x33\x8e\x3c\xde\xd4\x74\x09\xdd\x49\xeb\x8b\x48\x9b\x39\x2b\x68\x8d\x05\xc6\xb6\xb6\x22\x37\x91\x90\x12\xda\x69\x5d\x8c\x6d\x38\xbd\x86\xa5\xc6\x11\x85\x8b\x86\x09\x96\x66\xad\xa9\xd7\x1e\x24\xc4\xdc\x85\x38\x60\x17\x84\x64\x33\xa2\x6e\x48\x91\x06\x43\x8b\x47\xb3\x46\xfa\x56\x97\x16\x39\x2d\x21\x0b\xae\x63\x9d\x67\x8a\x7b\x71\x2d\xff\xb6\x74\x69\xda\x93\x76\x26\x39\x49\x07\xe5\x68\xcb\x2e\x7e\x40\x9d\x4b\x14\xda\xb1\x22\xd4\x29\xee\x5d\xea\xde\x07\xb1\x56\x66\xa1\x21\xa6\xad\x74\x42\x5c\xd9\x6d\xfe\xf5\x49\xfe\xe3\x84\x7d\xfc\x04\xa1\x36\x06\xd2\x3b\x19\xe4\x1a\x97\xc8\x06\xf8\x12\x05\x87\x63\xd7\x32\x65\xd5\x93\x91\xe6\x22\xe2\x30\xb4\x2d\x29\xc9\x02\x29\xa5\x4a\xbe\x81\x19\x52\x95\x18\xc5\x72\x30\x08\x6a\x11\xe9\xe5\x79\xf1\x00\x66\xc2\xcf\x22\x44\x0c\x7d\x6b\xfb\x35\x32\x89\x32\x61\x90\x28\x62\xca\x71\xab\xfc\x0c\x5c\xbe\xa1\xd2\x7a\xf8\x44\x8d\x3e\x24\x45\x24\xe2\x6a\xa0\x04\xf0\xcf\xdd\x93\x3c\x9d\xcd\x47\x88\x09\x2e\x21\x96\x33\x0a\xf0\x6d\x51\xf9\x16\x0d\xfc\x09\x6e\x9b\x06\xa1\x59\x41\x1e\x39\xc9\x7c\x00\x60\xfd\x1d\xee\x46\x28\xee\xcf\x61\xe0\xf5\xd2\x59\xac\xa3\xfc\x6e\x8c\x43\xbb\x9a\xa5\x9f\xed\xb9\x45\xc6\x6b\x44\x9e\x81\xe0\x56\xb5\x6f\x4a\x5a\xcb\xab\x06\x62\x1a\xc2\x96\x08\x58\x59\xc1\xb5\xc9\xb4\x1c\x7a\xc7\xce\xb0\x1d\xa7\x3c\xa8\x69\x21\xdd\xc7\x9a\xe9\x6d\x00\x34\x21\x04\x8c\xb7\x62\xf1\xa7\x96\x80\x9c\x6b\x61\x08\x51\xf0\x71\x74\x19\x54\xca\xed\xa7\x76\xe5\xe6\xea\xcd\x06\x3b\xb0\x80\x23\x62\xb8\x46\x40\x1e\xb0\x9e\xfd\x24\xc3\x5f\xef\x43\x83\x83\x7e\xa4\x64\xa9\x90\x3a\x6e\x71\xa4\xc2\x1e\xbc\x78\x04\xda\xab\x9b\x46\x0a\x9d\x5b\x65\xaa\xbd\x40\xee\x77\x9c\x7d\x8c\x39\x3d\xf6\xf0\xdd\xd9\xcb\xb1\x57\xba\x93\xd2\x43\x9a\x0c\xa1\xf7\x90\xf2\xae\x41\x66\x12\x79\x76\x59\x33\xa7\xf0\x9e\x11\x73\x33\xfc\x26\x17\x4a\x5a\x45\xf2\x81\x20\x28\x6f\xe7\xb0\x40\xb9\xfa\x3b\xec\xd5\x53\x4b\xd4\x04\x4a\xc3\xcf\x25\x32\x73\x1a\xa6\x16\x00\x61\x55\xd5\xff\xae\x76\x08\xc3\xd0\x24\x06\x69\xeb\x25\x1c\xd0\xa4\xe3\x89\xc1\x8c\x1b\xd7\x7b\xc6\x67\xeb\x3a\x21\x6a\xe9\xb7\xdd\x14\xa0\x3f\x49\x00\x12\x44\x08\xb1\x0f\x47\x98\x08\x8a\xbe\xcf\xa1\x3b\x5a\x0e\x9b\xbd\xf9\xbf\xd9\x3f\xa6\x2c\xf8\x0d\xea\x82\x11\xe2\xdc\x1e\x9e\xa0\x7d\xf4\x58\xdf\xa6\x44\x19\x9e\xe4\xcc\x1e\x33\xfe\xae\xbf\xcb\x7f\xf9\xbb\x5e\x85\x42\x55\x7f\x95\xde\xfd\x3f\xc6\x0c\xfd\x95\x6d\x76\x04\xe9\x5f\x7a\x22\xb6\xd6\xfb\x0f\xef\xcb\xd1\xbe\xef\x6b\xc1\xf3\x69\xcd\x3b\xef\x11\xbd\xab\xa3\x0c\xdf\x20\x02\x78\x19\xa0\x96\xc3\x8d\x41\x54\xf1\xb7\xf7\x5e\x06\xe6\x53\xbc\x33\xd5\x03\xde\x39\x11\x87\xe8\x86\x1a\x51\x6e\xfb\x89\xbc\x1b\xfe\xf5\x8d\x2a\xd6\xa7\xd3\xf9\xe7\xa3\x96\x6f\xc0\xb3\xfc\x04\xde\xdf\xe2\xa1\xbe\xbf\x29\xdb\xf3\x4f\x08\x98\xeb\x83\xa9\x83\x06\x17\x16\x06\xe5\xe7\x8b\x80\x1f\xb1\x4c\xcd\xb4\x7e\x56\xf5\x01\x0d\xf8\x3b\x8e\x56\x43\xa2\x54\x8a\x36\x50\xa1\xe8\x7c\x12\x81\xc1\x45\xdd\x89\xfc\x52\x38\x39\xcd\x41\x5b\x5c\x9f\x84\xff\x2c\x77\xb6\xd4\xcb\x6a\x04\x6b\x77\x1f\xfc\x65\x7d\xbe\x7c\xe2\xb5\xfa\xab\x88\x56\x8f\xc9\xb0\x27\x6f\xe2\xbe\xec\xb2\xbd\x35\xe5\x42\xfa\x38\xbb\xe1\xd3\xb5\xb2\xac\x98\x78\xa4\x8a\x3a\x00\x21\xab\x00\x31\x5e\xed\xdc\x7d\x61\x0b\xbf\xcd\xaf\x12\xcd\x31\x5a\x83\x2c\xaf\xdf\x5f\x93\xdf\xa0\xd7\xf4\x62\xf2\xe6\x6b\x72\x9e\xc3\x6b\xe2\xbe\xa6\x50\x42\x30\x6b\xb8\xe8\xa8\x33\x93\x3a\x12\xa0\x08\x45\xc3\xd2\x89\x42\xc7\xca\x71\x6c\x2b\xec\x6d\xbe\x1d\x84\xf7\x69\xcd\x0a\xc2\x89\x9b\x5c\x30\x9d\x91\xb1\x0d\x7b\xf8\x0e\xfc\xd0\x99\xc2\x22\xc8\xc1\x0c\xc5\x38\xbe\xd8\xae\x01\x86\x28\x04\x0f\x31\x4e\xe1\x7e\x3c\x18\xf9\x60\x58\xb5\xd9\x3d\x63\xdb\x88\x27\x0a\x13\x71\xee\x22\x1f\xe5\xcc\x9a\xe4\x95\x87\xb1\x08\x5f\x14\xf1\x1c\xaf\x9c\xe8\x52\x32\x63\x53\x4b\xf9\xc5\xe7\x0e\x59\xee\x8c\x60\x7d\xa5\x7f\xe2\x16\xc1\x03\xbf\x8e\x22\x4c\x79\x20\x92\x1b\xba\xa7\x36\xdd\x45\x3f\x7c\xa1\x6b\xa9\xcd\x39\x2f\xcb\x0f\xc0\xae\x9b\x8b\x8b\x03\x6f\x94\xdc\xf3\xce\xcd\x0f\x03\x2f\x03\x5c\xa7\x7e\x5f\x92\xc6\xcc\xad\x43\xba\x7a\xe6\xc0\x6f\xf5\x5e\x1c\x88\x46\x3c\x70\x64\x0b\x34\x1f\x36\x0a\x8a\xdb\xfa\x2d\xff\xb2\xe0\x44\xc7\xb4\xd6\xe0\x19\xb9\xa7\xcf\x4d\x74\xd4\xc3\x3c\xaf\xea\x20\xb1\x5f\x0a\xf8\xdc\xae\x26\x10\x8d\x84\xba\x74\xf3\x9b\xd6\x2c\xc7\xef\x6f\xf1\x5c\xa7\xdf\x32\xe6\x20\x27\x21\xc2\xc0\x3f\x75\xbf\xc5\xd6\x74\x17\x06\xc3\xed\x38\x80\x09\xa6\x91\x03\xd3\x89\x3d\x0a\xe7\xa1\x57\xed\xea\xcc\xb6\x84\x41\x27\x1a\x65\xad\x36\x73\x32\xe6\x26\x55\xfb\x9b\xe3\xf5\x87\xa5\x35\xc8\x55\xfc\x4d\xce\x7c\x76\x6b\xae\x7c\x29\x5d\xd6\x16\x7d\x52\xb7\x47\x69\x5a\x9b\xa5\x69\x7f\x47\x08\x5e\xd7\xe2\xfc\x20\xe4\x7a\x7a\x77\xd5\xc9\x44\x1c\x32\xba\x36\x74\x6f\xb9\xdf\x6b\xf3\x01\x2b\x5f\x65\x7d\xdd\x58\x66\x2b\xa0\x86\x24\xea\xe7\x24\xb3\x9e\x76\xf8\x8d\x02\x4d\x54\xfe\x53\x6a\x99\x29\xd7\xea\x5a\xf2\x53\x5b\xd1\xc9\x45\x5c\x74\xa1\xb4\xd4\x8d\x2f\xaa\xbf\xcd\x06\x79\x6e\xe5\xe1\x90\x5d\x24\x7b\x7d\x04\xdb\xcc\x0a\xcb\x27\x51\x08\x41\x46\x45\xd8\x24\x8f\xde\xd1\xfc\xfc\x6f\x83\x88\x05\x0b\x43\x0e\x8e\x86\xdb\x63\x0a\xec\xbe\x17\x63\x20\x27\x96\x5d\x4b\x03\x31\xb9\xcf\xd3\x5a\x45\x47\x5c\x97\x1e\x3c\xcd\x49\xa6\xb5\x26\xb4\xd2\x7f\x49\x41\x6a\x42\x5d\x2b\xfd\x0a\x5a\x46\xbd\x42\x95\xfc\xa6\x5d\xcb\xe6\x77\x67\xbe\x7c\x14\xed\x9a\xa6\xc9\x51\x2b\x2f\xd5\x37\x27\xd2\x6c\x3c\x8d\xe8\xbc\x8e\x27\x27\xfe\x86\xda\x14\x60\x5d\xbf\xb7\xf6\xf2\xd2\xd7\x61\xc6\x38\xf9\x1b\x0f\xf0\x50\xbc\x1d\x84\x10\xb1\xf3\x70\x5e\x8f\x07\x57\x57\x9c\xcf\x79\xb8\x73\x1c\x83\x2f\xa4\xe8\x5b\x5b\xff\x1f\x99\x3f\xfe\xd1\xb6\xc9\x86\x76\x0f\x67\x81\xf2\x7a\xee\xb2\x37\xd6\xcc\x50\x42\x5c\x82\x2a\x64\x6f\x8c\x40\x46\xa5\x23\x9e\xac\x91\x86\xb8\x2c\x6b\x49\x27\x0e\x85\xcc\x0c\x99\x43\x67\x7c\x87\x1c\x31\xe4\x2f\xdc\x79\x23\x87\x12\x02\xd4\xe8\xf2\x43\xf9\x5b\x3f\xd8\x17\x26\x36\x31\x10\x08\xb3\xb7\x16\x3f\xe2\x70\x59\x47\x9e\xf5\xda\xb3\x88\x64\x27\x32\x92\x02\xec\x03\x8f\x99\x1f\x4e\x95\xf6\xb9\x1b\x3a\xad\xaa\xe4\x34\x87\x12\x89\x13\x64\xfd\x70\xe6\xbc\x9d\xca\xb2\x47\x67\xa2\x97\x31\x72\xba\xf0\x3e\xd5\xa5\x22\x40\x8e\xf3\x82\xba\x7d\x56\xc1\x47\xce\xea\xbe\x24\x3b\xe9\x3f\xe2\x86\xa0\xfc\xeb\x21\xce\x80\x16\xe9\x04\x0a\x35\x8d\x6c\xda\x11\x30\x35\xbd\x9c\x2a\x8c\x80\x04\xd1\x84\xce\x89\x3f\xec\x17\xfd\x98\xb0\x0e\x81\x81\xf6\xd0\xad\xa4\x39\xc8\xb2\xf3\x6f\xcb\x96\x9e\xab\x5b\x3b\x80\xb1\xca\x88\x84\x7c\x06\xe7\xde\x0a\x7e\x75\x10\x9f\x58\xd7\x0b\x9e\xe4\x5d\xe5\xa4\xb8\x3e\x50\x89\x5e\x42\x0c\xe1\x1b\x18\x5b\xe6\x8f\x08\x16\xe1\xe9\xe6\x7f\x6c\x3a\x23\xe8\x58\x6b\x22\xce\xfa\xd1\x5e\x15\xd0\xfd\x78\xdc\x0e\x1f\xba\xad\x2f\x52\x86\xc0\x35\x10\x65\x88\xf4\xa1\x68\x03\xdd\x08\xa2\xb6\xa5\x19\xda\xf9\xf9\x0c\x28\x51\x03\x93\x9d\xf6\x85\xdc\x6a\x6c\x3c\x2d\x81\x8d\x06\xae\x85\xfb\xb6\x66\xb6\x43\x98\xe0\x1b\x3d\xaf\x39\xb8\x44\x9a\x5a\x55\x4f\x9f\x97\x63\x89\x06\x1a\xc4\xfa\xb8\x34\x88\xf6\xe2\x44\x71\x51\xbf\xac\x59\xaa\xe7\x0e\x61\x39\x5a\xa7\x28\xd9\xd1\x2c\xad\x6c\x6d\x11\x76\x99\xad\x8e\xd6\xac\x5e\x31\x4a\x67\x8a\xd1\x82\x53\x62\xe4\xde\x70\xf7\x13\x89\x82\xe7\x22\x1c\x6f\x66\x08\x1d\xf4\x10\x21\x95\xcc\xfb\x69\x8a\x2a\xf0\x32\xa7\xe8\x06\xf4\x61\xb2\x86\x05\xef\x48\x77\xfd\x70\xbc\xa3\x58\x0d\xaf\xb2\x80\x22\x74\xc8\x5e\x02\x03\x63\x6d\x95\x76\x59\x9d\xa9\x10\xae\x6f\x2b\x64\x61\x68\x5e\x0d\xef\x71\xfd\x22\xb3\xcb\x2d\xb1\x8c\xf0\x71\x73\x63\x5f\x99\x73\x89\xa6\x20\x61\x14\x17\x32\xa1\x09\x35\x35\x3b\x84\xe6\x55\x82\x47\x5e\xcb\x6f\x88\x66\x9f\xe1\x52\x3b\xa2\xdc\xd0\x1f\x28\x3c\xe6\x46\x43\x02\xe8\xc2\xd3\x68\x0f\xa7\xef\xf1\x74\x40\xb2\x1b\xd2\x1c\x9c\xa5\x55\x42\x41\xb0\x74\x5e\x00\xeb\xe9\x78\xd7\x48\xca\x3f\xc8\x9e\x3f\x2e\xe2\x6a\x40\xf1\xf6\x9e\xc5\x71\xc5\x86\xfa\x27\x6f\xc3\x65\xdd\xa3\x93\x8d\x20\xa2\x94\xda\x69\x58\x3f\x69\x2f\x6d\xb0\x1a\x38\x25\xe0\x90\xb3\x0a\x18\xc3\x99\x69\x86\x9b\x08\x25\xc8\xa5\xf9\xf5\x39\xe1\x01\x11\x12\x09\x26\x77\x8b\xfa\xb8\x04\xe2\x28\x94\xf4\x1b\x3f\xa9\xd1\x94\xd2\x12\x1c\xbd\xc3\xab\xcf\x23\xac\x86\x55\xa2\xfb\xdc\xa1\x2f\xaf\x06\xb4\x41\x69\xca\xab\x30\x47\x18\xce\xf3\xfb\x6a\x75\xd5\x8d\x90\x41\x8f\x31\x8e\x40\x68\x19\xae\x5b\x9a\xe0\x0b\x6c\x78\x01\x68\xe7\x97\x72\x47\xcc\xfc\x65\xb4\x33\x64\x54\xaa\xa6\x9c\x2c\x8b\xb6\x92\xf3\xfa\x7a\xbb\x47\xef\x70\xb0\xc7\xa2\x25\xcc\x9e\xe8\x54\x86\x3f\x6e\x6c\x47\x83\xdc\x1d\x09\x51\xc2\x9d\xb2\xb4\xa7\xf5\x4c\xc8\x06\xf2\x6b\xfa\xbf\x2b\x1c\x9f\x32\x33\xcd\x26\xc1\x02\x3b\xd6\xdb\x42\x01\x12\xac\x25\xd6\x17\x07\xf2\xf3\x81\x4f\x25\x9b\x67\x03\x00\xcf\x0d\x77\x0c\x73\x09\xe8\xf9\xd3\xa8\xcf\xd8\x92\xab\x4b\x80\x68\xe3\x25\x38\x8d\x19\x35\x78\x6c\x37\x97\x09\xad\x5b\x66\xc9\x98\xed\xcd\xbf\x06\x5c\xd2\x73\x83\x4c\x8b\x3d\x89\xb2\xc4\xd7\x0b\x9e\x24\x6b\x9b\xf2\x67\xb1\xb1\x5c\x0e\xfe\x22\x44\xe9\x25\x96\xd2\x39\x45\x4f\xc4\x0e\x64\xe7\xa4\x17\xf4\x07\x21\xf3\x42\x22\xf1\x5e\x58\x9f\x7e\xca\x9e\xc9\x8a\x4e\xe8\x07\xa0\x8e\x45\x19\x9b\xa0\x4e\x0b\x5c\xe5\xf1\xbb\x93\x96\x2a\x77\xf0\x20\x3e\xa6\x0e\x4c\x73\x3b\xf8\x05\x3c\xaa\x67\x1c\x85\xc5\x0b\x5c\x53\x33\x88\x7a\x02\x6b\x89\xf7\xdb\x39\x4b\x3e\xc0\x1d\xc8\x25\x5d\xd4\x35\x50\x7a\x07\x1a\x8e\xf7\xec\xd2\x90\xdf\xde\xd9\x0b\xf2\xcf\x7a\x53\x68\x16\xca\xe6\x3b\x9f\x89\xcf\xf5\x82\x41\x12\x5f\x6c\x69\xcd\x09\x37\x45\xa0\x3b\x66\x6b\x5e\x8b\x05\x36\x5f\x6d\x43\x60\xc7\x7b\x2b\xeb\x98\x4b\x40\xdd\xe6\x9b\x78\x84\x7c\x74\x49\x2a\x98\x9d\xfe\x22\x96\xe3\x78\x56\x66\xea\xda\xb1\xed\xde\x40\x3c\x58\xd8\x1a\xdb\xed\x99\xa3\xca\x2e\xe7\x93\x0c\xa6\x13\xb4\x6e\xc1\x9b\x0e\xe2\xc4\x8f\x50\x67\x3f\x4a\xf4\xd3\x0e\xa4\xa2\x40\xbf\xe7\x50\x81\x13\xbd\xe4\xa0\x1e\x73\x07\x65\x7e\x6a\x68\x06\x66\xcc\xe2\x35\x28\x10\x9b\x14\x02\xea\xee\x8b\xa2\x43\x19\x0e\x9e\x63\xba\xdc\x21\xee\xe6\x7e\x5f\x10\xb4\x36\xf8\x86\x4f\xd5\x23\xa6\x0e\x38\xf3\x55\xa7\x4c\x1f\x38\x63\xb4\xaa\x9c\x79\xcd\x4b\x6d\x9f\xc3\x50\x85\xc3\x5b\xf2\x8e\xbd\xa0\x4b\xa2\x95\xcd\xaa\x8d\xf3\x94\x79\x3a\x93\x35\x2a\x57\x1a\xe0\x29\x88\x15\x65\x4f\x0b\x01\x68\x53\xc8\xcf\x1c\x4c\x2a\x38\x64\x6a\xb1\xa1\xfd\xa8\x91\x43\xb3\xac\x6f\x3d\xbf\xc3\xe4\xf3\x8b\x01\x04\xbe\x60\x9e\xdb\x1b\xce\xaf\x23\x6f\xdb\xf5\xf4\xef\xb0\x35\x9f\x02\xa0\x66\xed\x7d\xbe\x98\x66\x80\x0b\xbf\x88\xb4\x8e\x6a\xbd\xe9\x6e\x1e\x79\xfe\x5b\x99\xd3\x8a\xb8\x30\x24\x5d\x09\x9e\x86\xe8\x87\x42\xa2\x14\x4f\x01\xf5\xb7\x2e\x7f\x7f\xb1\xe9\x78\x20\xe8\x47\x86\x5f\x9a\x7e\xbf\xac\x0e\x09\x76\x19\x43\x7f\xf8\x78\xf9\x57\x47\xa2\x3a\x28\x74\xca\xaf\x43\x97\xfa\x0c\xab\x91\xcb\x10\xf2\xa0\x99\x45\xea\x35\x07\x44\x4d\xd6\x86\x94\x2a\x83\x20\x58\xfd\xc4\x40\xff\x03\xf2\x21\xed\x2b\xd0\x27\x81\xde\xfa\x06\xf9\x87\x69\xa7\x58\x5f\x5a\x4f\xbc\x3b\x34\xdd\x1a\xbf\x8a\x41\xee\x36\x65\xa2\xe3\x21\x49\xfb\x23\x12\xed\x61\xa8\x7a\x48\x7b\x5f\xad\xe6\x14\xbe\xd1\xd3\x1f\xb8\x44\x08\x5c\x1d\xf0\x23\xcb\xa0\x97\xef\x48\xf4\x64\x81\x51\x0c\xdd\x30\xae\x39\x82\x23\xb2\x73\x74\xdf\x4a\xe2\x54\x3d\xb2\xf7\x27\x39\xb3\x17\x06\xab\x47\x4f\x4f\xac\x42\xeb\x71\x5b\x93\xc3\x6f\x50\xea\x30\xc7\x9e\x8c\x89\xc1\x9e\x20\xba\x0a\x33\x74\x2d\xae\xee\x0f\x6f\x05\xc6\x27\xdd\xec\xba\xa0\x54\x59\x73\x9c\x83\x77\xbb\x7f\x34\x06\x92\x91\x2a\xf1\x4f\xd5\x85\xe5\x19\x66\xbb\x57\x7b\x1e\xf8\x3a\xed\xa1\x80\x6d\x46\x34\x62\x61\xa2\xe5\x20\x7a\x12\xee\xd3\x3b\x4c\xef\xf2\x61\xaa\x95\xa8\x21\xcf\x60\x44\x94\xb4\xdc\x5c\x07\xf7\xe1\x9b\xf5\x88\x59\x21\xfd\xba\xd7\xe1\xde\x60\x27\x4a\xa6\x33\xb0\x38\xaf\x28\xd1\xdd\x23\x42\x76\x05\x5b\xee\x45\xf1\xb4\x3b\xb8\x9a\xfe\x04\x20\x1d\xa6\x59\xa3\x7e\xf4\x04\x3d\xb7\x02\x64\xb2\xe7\xd7\x8d\xcd\x42\x44\xb8\xd6\xc9\xbf\x37\x4c\x49\x0b\x3a\xe7\xea\xa0\xc9\x0f\x57\x40\xad\x62\xc1\x43\x01\xe7\x9e\xf1\x70\x41\x49\xbf\xfd\x82\x1e\xab\x20\x57\x1e\xe0\x1c\x88\xa9\x23\xc0\x51\x60\x39\x22\x1a\xe3\x22\x7a\xe9\xb8\x65\x9d\x44\xc8\x92\x99\xcf\x7b\x77\x56\x25\x44\xb5\x20\x32\x16\xcd\x3d\x5e\xb3\x06\xc1\x5a\x62\x1d\x68\x26\xb0\x0b\x1a\x36\xcd\xea\xa2\x0d\xb4\x91\x9b\xc0\xa3\x5b\xff\x2a\xa7\xce\x1b\xff\x22\xd6\x6a\xe7\x6f\x4b\xb9\x8f\x64\xc9\x9d\x90\x51\x76\x39\xda\x30\x9b\x95\xd2\xbf\x14\xc7\xf7\x73\xfd\xe6\x35\x30\x56\x3f\x77\x2a\xe7\x9e\x7d\x54\xc5\x1a\xce\x70\x75\xc5\x9a\xe2\x5c\xf1\x9e\x5b\xa9\xae\x71\xd4\xa3\xb5\xcb\x65\x31\x7a\x54\x67\x3a\x2a\x24\x6c\xcf\x8f\xda\x0b\xd9\x85\xf8\xd0\x58\x8f\x0d\x3e\xa4\xb4\xd8\xbe\xb5\x8e\xfc\x31\x6a\xfa\x5a\x8d\xf1\x56\x82\x23\x2a\x8f\xf2\x21\x5c\xb6\x67\xc6\x85\xa5\x58\x70\xbe\x81\x5a\x7d\xba\x19\x5e\x7d\x6b\x27\xe0\x61\x39\x99\x20\x8d\xb4\x2b\x28\xd6\xb5\x1f\x66\x29\x28\x00\xba\xd4\x10\x5d\x89\xc3\x3b\xde\x36\xda\x3b\xaf\x69\xf6\xa6\x98\x62\xd6\xe8\xbd\xb4\x5d\xb9\x74\x3b\x47\x86\x57\xe5\x30\xaa\xf8\x45\x16\x17\x39\x63\x09\x3e\x14\x7d\xfa\x1d\xe7\x27\xe4\xd6\xc6\x36\xa0\x7b\x3b\xfc\x63\xb0\x7b\x42\xe5\xc8\x5f\x7f\xfc\x0b\x0f\x44\x57\x71\xcd\x00\xce\xb5\x4f\x9f\x57\x17\xc9\xa3\xbb\xd7\x30\x83\xfa\x35\xb4\x4e\x31\xec\x80\xa4\xe1\xab\xa6\xa3\xef\xbc\xa6\xfb\xdf\x45\x3c\xcb\xff\x2e\x74\x44\xbe\x48\xf6\xf2\xc7\x03\x2c\xc4\xdb\xe0\x85\x32\x33\x73\xad\xec\xb9\x3c\x68\x22\xef\xfa\xa8\x4b\xd5\x90\x0b\x02\xf3\x85\x7d\x83\x56\xaa\x29\x54\x45\x0f\x9a\x48\x1c\x1d\xdc\x8c\x1c\xc1\xcd\xbe\x54\xe7\x75\xd3\xbe\xec\xbb\x05\x8d\x21\xb7\x47\x6f\x61\x6f\x60\xcd\xc6\x29\x39\xf0\x2b\x04\x3c\x59\xd8\xa4\x98\xc0\x92\x8f\x59\x7a\x1d\xb7\xed\x21\x70\x86\x21\xd8\x74\x94\x27\x4d\xab\x0d\x86\x36\xdf\x53\x5c\xfc\x2c\x50\x10\x21\x09\xb8\xb0\xf6\x4a\x44\x69\xfd\x0a\x74\x58\xcf\xc6\x2d\x0a\x19\x41\xbc\xc2\x4f\xed\x2d\x8b\xc9\xf5\x51\xf6\x26\xa4\x8f\xe2\xf4\x6e\x60\x00\x14\x23\x7e\x0c\xbc\xf8\x47\x58\x4b\x0c\xd4\xd1\xce\xda\xc9\x23\xbc\x9e\x8e\x23\xcb\x37\x8a\x6c\x2e\xbf\x91\x17\x6d\xb5\x07\xf4\x65\xc2\x9b\x86\xbe\x8a\xae\x01\xab\x59\x1d\x61\xa4\x4f\xb9\x27\x95\xcd\x75\x87\xf1\x89\x8b\x96\xbd\x7d\xa0\x0d\x66\x7b\x71\x49\xb3\x42\x75\x31\x00\x7a\xa5\xe5\x1f\xfe\xbd\xd8\xf0\x1a\xba\x3e\x5d\x6c\xb2\xb7\xce\x68\x03\x98\x2d\xf4\xed\x6e\xe2\x57\xed\x69\x56\x67\x77\x43\x6c\x7d\xd2\x80\xe8\x76\x67\x84\xb9\xc9\x4f\x39\x7a\x52\xfe\xd1\x52\x97\x2a\xa8\x33\xe8\xc4\xc7\x7c\xd7\x89\xa0\xa9\xba\x86\xd5\x26\x8d\x40\xb1\xc3\x91\xa0\x79\xfb\xf9\xcc\x6f\x59\xe0\x42\x30\x6a\xd0\x4a\x2b\xe3\x64\x82\xb7\xd6\x0e\xc7\x9e\xd0\x5e\xb4\x29\x90\xe1\xce\x30\xb4\x5c\xdd\xe2\x58\x16\x89\x3e\x6c\x95\xdd\x8c\xad\x16\x31\x1e\xb6\xaa\x9d\x0f\x60\xd4\xf9\xde\x67\xf6\x3b\xac\x99\x40\x5f\xaf\xb3\xd2\xf4\xc2\x23\x48\x43\x8d\x05\xc7\xa0\x89\x1c\xec\x49\xf9\xdf\x11\x09\xe2\x01\xb7\x5d\x3d\xc2\xd4\x6d\xfc\xe1\xf9\x96\x7f\x8c\x93\xdf\x02\x53\xb5\xa1\x9f\x60\x6d\x41\xae\x50\x3c\x84\xca\xba\x99\x29\x7e\xdd\x1b\x6e\xad\xac\xd5\x9a\x74\x99\x26\x08\x83\xba\xc0\x56\xd1\x3e\xf8\x9d\x71\x7e\x9a\x66\xaa\x0b\x0d\x43\x57\xb8\xc4\x76\x1a\x90\x0b\x64\xd4\x95\xd3\xe7\xe6\x30\x5b\x2e\x60\xad\x29\x7c\x65\xfe\xc3\x56\xe3\xd6\x9c\xae\xe6\x86\xbd\x8c\xdc\x5c\xa4\x6f\x83\xa4\x56\x09\xfa\x3d\x3e\x8b\xba\x1f\x48\xc8\x56\x8d\x32\x15\x62\x16\x74\x10\x13\x32\x26\xf2\xda\x76\xe1\x90\x17\x1e\xc9\x94\x8e\x58\x08\xe2\x72\x84\xd1\xe5\x97\x5e\x3d\x7c\xdd\xe5\x1f\x07\x5f\xad\x12\x6e\x1b\xb0\x36\xad\x98\x77\x78\xda\x79\x31\x33\xb5\x0c\xf0\x88\x28\x82\xc2\x4d\xd5\x7e\x4e\x69\xbb\x6e\x32\xdb\xee\x28\x27\x9a\xa0\x14\xe9\x85\xb1\x02\x4e\xea\x2d\xdb\x61\x1c\x5a\xff\xa1\x26\x8d\x33\xde\x98\xd1\xe4\x9d\xc5\x8b\xbf\xe3\xd9\x94\xb4\x9e\x78\x6f\xb1\xa6\x67\x2f\x72\xeb\x73\xdb\xff\x3c\x6b\x0b\xf6\x35\xe4\xe8\x1c\x40\x05\xbd\xba\x0a\x66\x53\x78\x5a\x07\x1f\x3d\xe2\x2d\x2b\x1e\x62\x4b\x0e\xce\xfb\x96\xad\x69\x8c\x8c\x6f\xc0\x61\x1d\xa2\xb6\x9d\xe7\xbb\xe7\x90\xeb\x06\xd5\xaa\x99\xbd\x7a\xda\xaa\x07\xd3\x59\x79\x75\x01\x93\xa3\x21\xc5\xcd\x26\x58\x80\xa6\xd0\xea\x23\xdd\x1b\x17\xd8\xc9\xa1\xc3\xc5\xbb\xcf\xf5\x2e\xb2\xc4\xc8\x62\xda\xf6\x1e\x5c\x0d\x5a\xb7\xf9\x18\xcc\x06\xfe\xbc\xd5\xa4\xdc\x94\x9d\x47\xe2\x56\xaa\x22\x67\xb6\x04\x54\xbc\xce\x03\xd2\xfe\xf2\x24\x6f\x01\x1f\x72\x7b\x89\x5a\x21\xcd\xdb\x47\x64\xf5\x26\x1d\x1b\x10\xec\x42\x56\x7d\x83\x36\xf8\xed\xc1\xd8\x92\xbb\x28\xeb\x8b\x18\x38\x80\xa2\x24\xd0\xe1\xb9\xf2\xa7\x1c\x90\x5e\xc0\x3d\x55\x5b\x15\xe5\x35\xdc\x77\xae\x9a\xf1\x2f\xe8\xd6\x28\xa5\xf5\x9f\xbc\x85\x5e\x42\x57\x90\xc9\x6a\xd6\x16\x7d\x35\x80\xdd\x75\xfe\xd6\x66\xae\x97\x04\xa5\xcd\x9e\x55\xa7\xbb\xb9\x36\x93\xf1\x7b\x6e\x29\xfd\xc1\x79\x78\x6c\x8c\x9a\xc9\x1c\x0b\xb8\xbe\x6c\x81\x20\xe3\xd9\xb3\xfc\x76\x43\xcd\xcd\xea\xbe\xdf\x95\x29\xa6\xcc\x2c\x6b\xe3\xa1\x08\xb1\xcc\xd4\x00\x56\x59\x89\x46\x75\xf3\x2f\x96\xce\x7d\x23\x4c\x95\x3b\x00\xc6\x70\x97\xe5\xb4\xbd\xea\x6e\xb3\x3a\x37\x12\x2f\x7a\xb4\x98\x28\xe6\xb5\x3e\xbd\x3d\x2d\x7a\x9e\x00\x7a\x9f\x76\xb8\xf4\xab\xfb\x90\x32\xad\x8e\x08\x58\x7b\xeb\xd2\x1a\x71\x95\x5f\x4e\xd0\xfb\x90\x35\xaf\x9d\x58\x34\x55\x4d\x92\xfa\x8d\xd1\x13\xbe\x1b\xf5\x7b\xe2\x80\x5a\xfd\x86\xda\x9d\x3f\x52\x34\xd9\xf4\xb1\x1b\xb0\xf9\xd7\x73\x55\xd7\x7e\xbd\xf8\xb1\x5e\x49\xee\x5a\xaf\x88\x01\x73\xec\x45\x38\x2b\x57\x34\x86\xb2\x46\x2e\xad\xd0\x2c\x6b\x33\xf0\x7a\x39\x6b\x2f\x3b\xd2\x60\x65\xb1\x73\x44\x5e\x5d\x04\xb7\xf1\x84\x32\x2e\xb9\x88\x4d\x57\xbd\x73\xba\x16\x6a\x38\xac\xc5\x73\xef\x5d\x77\x8d\xdf\x6d\x3e\x7b\x62\x61\xad\xf9\xb5\xf0\xf2\xac\xe8\xb4\xf9\x74\xe1\xeb\xb3\x22\x90\xa1\xab\x3b\x9c\xb5\x9a\x31\xa2\xc9\xcf\x51\x8e\xd5\xe5\xde\xf9\x84\xd3\x76\xa3\xf7\xbe\x6a\xef\x4f\x18\x98\x7b\x5c\xb1\xf7\x0b\x4e\xb4\x4f\xa4\xe6\xaf\xd6\xbe\xbe\x48\xd9\xdb\xc0\x02\x9c\x09\x80\xb0\x9e\x01\xda\x6c\x53\xd3\x68\xc5\x8c\xfe\xcd\xf6\xb3\xd9\x74\xcf\xac\xc9\xae\x8f\x2c\x12\x05\xd6\xef\x37\x49\x18\xce\xde\x6b\x38\xbb\xf7\x64\x47\xed\xf7\xc8\x6b\x6c\xcd\xbd\x8e\x27\x45\x3d\xcd\x6a\xb3\xf2\xc5\x48\xd4\x05\xa3\x16\x27\xad\x45\x81\xa4\x4b\x08\x9e\x2f\xd7\x48\xfc\x9b\xf5\x11\xbd\xc7\xbf\x5c\xbd\x6d\xeb\x29\x58\x5f\x3f\xe1\x70\x7c\x8d\xdd\xaf\xe6\x12\xd9\x49\x8b\xe3\x8e\x84\xd4\xc3\xa8\x3c\xba\xd5\x64\x94\x01\xb7\xb9\xca\xf0\x7d\x80\x3a\x1f\x04\x48\x16\x1e\x14\xf9\x72\x74\x5f\xa1\x3b\x7e\xf1\xf7\x93\xcb\xcb\x8b\xb8\xd8\x9d\xf2\xe1\x30\xc0\xfa\xe8\xa3\x00\x0d\x06\xdf\x88\x9d\x36\xaf\xd5\x52\x3d\x52\x90\x5b\xb1\x13\x73\x4c\x21\x52\x55\xf0\x6c\xf2\x4c\x6a\x21\xeb\x6f\x8a\x10\x3a\x50\x98\xe3\x95\x5e\x2a\xc3\xd9\x17\x7a\x84\x17\x72\x9a\x16\x0d\xff\x2e\xe5\x63\x40\x03\x29\xa6\x5b\x0e\x6a\x5f\xc3\x16\x45\x9f\x01\xce\x53\x77\x8f\x02\xe9\x97\xa8\x58\xea\xe2\x26\x5a\x19\x2f\xc5\xb5\xcb\x4c\x5c\xc3\xea\x2f\x3f\x33\xeb\x56\x46\xaa\x8e\x63\xfe\x08\x64\x67\x89\x6f\xdf\xe2\x19\xf3\x6c\x2f\x90\xf9\x17\x7b\x85\x56\xcc\xf7\x19\x66\x11\x79\x30\xef\x7f\x2f\xe6\xb4\x2c\x65\x78\x29\x20\xcf\xf6\xe2\x2a\x31\x24\x38\xa2\xd0\xeb\x2b\xe6\x85\x2e\x16\x9a\xb2\x46\xa6\x96\xc9\x03\xd9\x96\xfc\x87\xd1\x47\x7f\xa8\x17\xab\x5b\x22\x5c\x69\xc1\x38\xe7\x35\x37\x74\x9d\xd3\x03\xf9\x54\x2f\xd0\x63\x83\xd8\x24\xc3\xbe\x17\xcf\x8f\x8f\x7e\x01\x46\xec\xa9\x2c\xb4\xe4\x42\x1e\x21\x07\xf0\x96\x8c\xb7\xae\x73\xcb\x73\x34\xb9\xa9\xc1\x15\x64\x6d\x1a\x94\x3d\x5c\xac\x55\x50\xbf\x7e\xcc\x2f\x5e\xce\x7e\xb8\xd6\x80\x7e\x2e\x3d\xfd\x32\xae\x92\x88\x69\x7a\x9f\x4e\x67\x30\x43\x84\xc3\x74\xfe\x25\x71\x07\xa1\x5b\xdb\xcb\x26\xf3\xb0\x21\x08\xd5\xf2\x00\x8b\xc5\x1a\x58\x37\x79\xf0\xc8\x7a\xd2\xd3\xfe\x4f\x80\x46\x6b\x18\xbc\xb5\xe9\xfd\x0c\x28\xab\xdb\x29\xe8\x80\xc0\xef\xc5\xec\xd9\x2a\xa4\x2a\xfb\xe9\x6a\x22\x1c\x94\x21\x65\x94\x8f\x52\xda\x23\xa8\xc6\x87\xe9\x74\x41\x40\x8d\x8d\x99\x88\x98\x77\x6b\x2d\x8f\x7c\xdc\x1f\x7d\xcc\xe8\xa5\xb8\xb5\x78\xe8\x14\x37\xb8\x2c\x81\x3d\x5c\xb8\xad\x59\xf5\xb8\x96\x9c\x89\x37\x9c\xc9\x85\x58\xd2\x4f\x25\xea\x66\x49\xf0\x3e\x71\xcd\xa9\xf9\xf7\x16\xe4\x25\xaf\x32\x30\xa2\x1e\xa9\x7d\x4b\xc2\x17\x54\x20\xca\xa6\x3c\xeb\x2c\x42\x8f\xbe\xe0\x88\xb3\x95\x07\xbb\x61\x7c\x44\xe0\xdd\x2c\x0c\x6c\x36\x9b\x71\x7e\x30\x56\x3e\x29\xdf\x07\x53\x2b\xe6\xf7\xfa\x8f\x13\xd1\x04\xdf\x31\xf2\x3a\xbf\x07\xa5\xe0\xcf\x8a\x43\x98\xd5\x8a\x9c\xaf\x80\xf6\x5d\xf6\x32\x8c\x32\x7b\x3e\xaa\xc2\x1a\xae\x02\x17\x5e\x45\x9a\x65\x73\xa8\x09\xcd\x51\x29\x01\x66\x88\x8f\xd5\x79\xdb\xfc\x7d\xf1\xd0\xf2\xb9\xaa\xd9\x3b\x7b\x1c\xd9\x9f\xd6\xe9\xe9\xe5\x77\x9c\x21\xa6\x73\x7d\xf3\x23\x14\xa4\x5b\x37\xad\x32\x0c\x76\x1a\x0a\xd9\xdd\xa6\xb3\xd4\xb6\xf0\xbe\x5d\x91\x76\x36\x17\xa6\xc2\xcd\xc5\x2f\xa3\x36\x25\xa4\xe1\x87\x74\x14\x8e\x74\xe6\xb4\xb3\x57\x9a\x3f\x87\x46\xdf\x8c\x0c\x6a\x19\x0d\x7d\x38\x25\x8f\x1e\x9c\xf3\xab\xb0\xab\x8e\xe1\xe0\x5d\x91\x5b\x73\xf6\xb7\x41\xf3\xad\x32\xa3\x73\x7a\x06\xc3\xaa\x99\xd4\x68\x85\x91\x22\x88\x70\xce\xee\x69\xa4\xd9\x5c\xba\x40\x8d\x01\x9f\xe1\x5d\x66\xd2\xb8\x60\xa4\x7f\x29\xa2\x87\xe7\xf4\x1b\x4f\xa5\x75\x42\x9f\xe4\x1c\xc6\xb0\xc5\x0c\x18\x14\x71\x88\xab\x46\x68\x66\xbe\xa8\x80\xaf\xbc\xbf\x6e\x7e\x22\x1f\x3c\x94\x22\xaa\x7d\x46\xc3\x4f\x97\xc8\x51\x9a\xec\x55\x02\xba\x53\xb4\x40\xff\xc4\x13\x24\x6a\x62\xdf\x1c\x8a\x24\x28\x36\x0b\x9f\x10\xad\xf1\x9d\x16\x0e\x10\x3c\xdf\xfb\xf8\xfe\x93\x2a\xdc\x73\x8f\x21\x3f\xfb\xae\x12\x91\x58\x7f\x8b\x20\x85\xf8\x88\x42\x15\xcb\x59\x84\x35\x34\xa0\x9f\x10\xaa\xc7\x26\x11\x8b\xf6\x4d\x03\xe6\x97\xa8\x8b\x74\x3c\x3b\x7b\x51\xe6\xc2\xac\xe3\xe7\xac\xc4\xac\x67\x79\x49\xff\xe4\x69\x4d\xec\xc0\x29\x9e\xf2\xd0\x3c\xf5\x65\x7b\x42\x42\x9f\x5d\xbd\x67\xd9\xbb\x58\x6c\x1d\x07\x76\x3f\x9f\x45\xa1\x6a\xa7\xbe\xf4\xcf\x62\x9f\xef\xe0\x34\xea\xf3\xf0\x2c\xb3\x10\x8d\x65\x58\xbd\x17\x67\x06\x83\x37\xcc\xa0\x47\xe0\xa9\xf0\x69\x4c\x23\x9f\x36\x6c\x99\x8c\x8d\x73\xcc\xe3\x04\xce\xa3\x17\xac\xcd\x44\xc9\xb0\x67\x7e\x31\x6c\xfa\x69\x75\x0b\x77\x4b\xb7\xed\x13\x21\x3a\x3e\x9d\x43\x50\xf6\xd9\x0f\xf8\x5e\x3d\x51\xa3\xeb\x8d\x87\x4d\xdc\xe3\x9e\x99\x48\xf2\x4c\x85\x33\x1e\x79\x5e\xa5\x4b\xf6\xb4\xfb\xd9\xf9\xd4\x57\xfa\xb9\xd6\x1f\x1f\xb5\xfe\xd1\xf8\xc9\xcf\x35\x3b\xcf\xfb\x07\xd0\xd3\xec\xc6\xea\x01\x8a\x3f\x75\x66\xf7\xf2\x07\xe9\xab\xb8\xb1\x3f\xf9\x95\xe3\x78\x7e\xb2\x32\x69\x7e\xb2\xd4\x44\x7e\xb2\xe7\xed\xaa\x52\xff\x49\xef\x80\x38\xbe\x94\x15\xfc\x83\x76\x61\xd5\x20\x1c\x0a\xde\xe6\x85\x21\x2e\x63\xc8\x84\x14\x74\x81\x51\x1f\x94\xd5\x55\x32\x1b\xea\xd0\x29\xbf\x34\xe1\x63\x6c\xa6\x7f\x6b\x60\x60\x9c\x2c\xbe\xd9\x0d\xc5\x28\xda\x23\x4a\x75\x4c\x37\x53\xd1\x15\xdb\xfa\xe0\x2d\x06\xaa\x51\xac\x43\xb4\xe5\xe5\x28\xf7\x82\xa7\x4f\x9f\xf9\x3f\xc5\x1b\xe2\x08\x07\x7f\xd8\x0d\xc6\xe0\x25\x04\xdc\xad\x5e\x68\xf0\x7e\x33\x11\x41\xa1\xa3\xf7\xec\xf3\xb4\xe6\x80\x52\xc2\xb1\xd1\xf8\x8b\xd1\x23\x15\xcd\x70\xf5\x51\xc8\xc0\x14\xae\x50\x45\xe1\x4a\xab\xea\x29\x00\x20\x0b\xb7\xfb\x13\x5e\xd4\x02\xc9\xb9\x56\xf7\x00\xdc\xef\x13\x6f\x68\x41\x2b\xe0\xeb\x03\x12\xc9\x25\x1e\x3b\xd9\x8c\x88\x0d\xbd\x43\x88\x01\x8d\x2c\x7d\x43\x3c\x3e\xbc\x4d\xa6\x13\x1a\xae\xfb\x87\x81\xed\xb0\x28\xe0\x2b\xce\xcd\x81\x9b\xc2\xda\x7e\x6a\xa7\xe0\x4d\xa1\x2a\xc6\xe6\x10\x75\xbe\x8f\xb3\x47\x23\x09\xfa\x02\xdd\xbd\xd0\x7f\x47\x2a\x50\x6e\x83\xc5\xc8\xad\x06\x21\xa0\xe4\xb5\xdd\x02\xe4\xf7\x5b\x6f\x39\xf6\xa7\x0f\xa3\xfb\x6c\x43\xd6\xcd\x19\x95\x9a\xee\x9f\x5b\x4e\x7b\x03\x26\x95\xb5\xdb\x73\x03\x4e\x02\x55\x89\x5e\xa9\xb6\xba\x6c\xd7\x10\xb7\x8c\x31\xb4\xa5\x06\x9b\xca\x1d\x7a\x4b\x04\x2e\x03\x55\x19\x29\x1f\x66\x7b\x1a\xf2\xda\x4a\xbd\xd6\x28\xe8\x72\xe3\x6d\x2f\xe1\xe7\x2b\x43\xa9\x88\x34\x83\x86\x33\x6f\x52\x2f\xf2\x97\xb5\x4b\x3c\xa9\x94\xf4\xd1\x1e\x23\x53\xfe\x41\xb2\x26\x1a\x7e\x9e\xde\x00\x97\x3a\x09\xf0\xed\x8e\x5c\x75\xf1\x1d\x5b\xd9\x4f\x73\xdd\xd9\xbd\x99\x28\xdb\x3a\x5d\xfa\x2e\x4d\x17\xf9\x9b\x48\x4e\xe7\x0f\x8b\xb7\x97\xa7\x6b\x56\x83\x67\xba\xba\x3e\x89\x66\xd9\x71\x70\x79\x3a\x4f\xd4\x24\x08\x4a\x48\x9c\x76\x4c\x03\x36\x8b\x55\xa6\x3b\x85\x47\x97\x35\x89\x92\xab\xc2\xad\x5e\x3a\x5f\x4c\xb1\x30\x2b\xc2\xc9\xc0\xb0\x8c\x8c\x41\x28\x5d\xa1\x51\x7e\x5e\x5a\x0a\xaf\xaf\xac\x41\xd3\xa4\x48\x74\xa4\x76\x86\xe3\x64\x82\x08\x07\xa7\xac\xb2\x1a\xc3\x92\x4b\x8a\x60\xc9\x43\x5e\xf2\x6b\xcf\xca\xfb\xb7\x52\xb7\x0b\x9a\x89\xc8\x86\xef\x30\x83\x7d\x09\x4b\x5b\x7c\x02\xfa\xcb\xbd\xb8\x93\x63\xaa\x23\x22\xfc\xb9\x5c\x48\x2c\xda\x6e\xaa\xb6\xd7\x35\xc2\x27\x4c\x1e\x7d\x62\xfa\xde\x54\xf8\x9d\x9f\xca\x22\xbc\x09\x5c\xaf\xbd\x44\x46\xa6\xf2\xd3\x1a\x9d\x93\xbd\x83\x8c\x84\x11\x47\x13\xd2\x03\x6e\x74\xf9\x7e\x92\xa7\xcc\xe4\x04\xeb\xa1\x5e\xdf\x17\xb9\x95\xf6\x81\x4e\x9a\xa7\x87\x7a\xca\xf0\x47\xf3\x13\x37\x65\x51\x1c\x79\xc6\xd0\x76\xe2\x25\xcf\x81\xde\x9e\x32\xd5\x3b\xdd\x6c\xff\xdd\x25\xb7\x86\x31\x36\xdd\x92\xb0\xdd\xe4\xdd\xcc\xe9\xf7\x4d\x00\xc8\xe4\xa2\x8e\x71\xb7\x90\x30\x9d\x05\xe4\xb4\x2b\xe8\xb9\x9e\x2c\x0c\x9b\x38\x3c\xce\xd1\x94\x6e\xcf\x94\xbf\xfd\x94\xd3\x9f\x7d\xf3\xf8\xb4\xa5\x3f\x55\x87\x53\x7a\x2b\x9b\x17\x31\x2c\x7e\x77\x24\x22\x30\x41\x5c\x43\xa7\x02\x87\xa8\x40\xad\x49\x11\x72\xa0\x70\x96\x20\x69\x9a\x39\x24\xcd\x8d\x38\x57\x33\x83\x0e\x38\x79\x92\xa2\xac\x5e\xa2\x97\x13\x58\x18\x8d\x9d\x0a\x30\x27\xe9\xe1\x30\x75\x8d\x81\x4c\xd4\x29\x03\x9c\xc0\xe7\xc8\x1a\xd4\x13\xa7\x9d\x2b\xf0\xfa\x3b\x97\xca\xbe\xe9\x67\x08\x00\x9f\xb2\x3c\x76\x32\x0e\x92\x4d\x91\x89\x49\x21\x53\x62\x62\xce\xf4\xfd\xf6\xf2\xf8\xf6\x96\xcf\x78\x51\x69\x6e\x54\xb0\xfb\x78\x89\xfe\x32\x5e\x37\xc9\xd1\x53\x0a\xf8\x6b\x51\x94\x87\x5b\x7e\xae\xe3\x7e\x65\xe2\x34\xaf\xb8\xb9\xe3\xee\x7f\x5f\x24\x77\xfa\x03\xfc\x01\x69\x23\xba\x93\xab\x22\xf1\x85\x8e\xe9\xb1\x45\x55\x8e\x3b\xc8\xd6\xea\x39\x8e\x08\x27\xdd\xf9\xe9\xb0\xcf\x93\xb0\x91\x4e\xee\x3c\x69\x35\xe0\xe2\x18\x8d\x02\xf7\x14\x6a\xb9\x95\xe2\x9d\x76\xad\x67\x06\x88\x8e\xb5\x7a\x27\x83\x44\xce\x43\x56\xe2\x74\x88\xce\x15\xec\x99\x8b\xcd\x43\x70\x0b\xc7\xea\x4f\xd8\xc1\x05\x86\xf4\xa2\x43\x0d\xe6\xe2\xc7\x47\xaf\x8a\x4d\xb8\x8d\xf9\xdd\xab\x2e\x18\x11\x25\xc3\x79\x8c\xce\x1a\x89\x1d\x03\xae\x13\x83\x1c\x11\xc3\x38\x7a\x6f\x87\x27\x31\xe7\x35\x86\xe0\xc6\x39\x5d\x7d\x25\x89\xb4\xec\xb3\x07\x11\xd1\x46\x52\xa4\xaf\xc8\x78\xb3\xb1\xd8\x33\xf2\xa6\xc1\x63\xf0\x50\x4b\xc9\x39\x8e\x13\x93\x18\xc6\x7c\x34\x8f\xda\x98\x3f\x72\xe4\xad\xd0\xb2\xd7\x79\xf6\x20\xd0\x39\xe7\x33\x3f\xc5\x32\x1f\x33\xbe\xd5\xb4\xf2\x53\xb3\xd2\x1e\x6e\x49\xd8\x9c\x99\x42\xa3\x70\x04\x72\x70\xa0\x31\xdf\x2d\x84\x11\x63\xd9\x27\xf7\x6b\x6f\x86\x1f\x58\xe2\x33\x49\x9e\xc1\x08\xaf\x6a\xff\xc7\x48\xd4\xf1\x7b\xa2\xda\x19\xc8\x9f\xe5\xeb\x06\x7f\xfa\xb6\x1e\x37\x1d\xd9\xee\x49\xe4\x50\x3d\x40\x13\xe0\x3a\xfd\xf3\x95\xc2\x62\xbd\x65\xd6\x44\xd7\xd0\x03\xd2\x5f\x82\x62\xee\xf9\x62\x8f\xed\xb1\xb7\x30\x13\x32\x42\x09\xdf\x44\x16\xa8\xc6\xc2\x1c\x18\x2a\x1a\x26\x94\xc4\x98\x37\x6c\xed\xa4\xbf\x12\x73\xdd\x77\xdc\x27\x6d\x30\x15\xa1\x3c\xff\xc5\x30\xea\xa3\x6a\xbc\xfe\x81\x97\x23\xfa\xd0\xd6\xc4\x12\xf3\x15\x8d\xad\x4b\x89\x4e\x66\x3f\x32\xc3\xc3\x31\x30\xf8\x62\x4c\x64\x00\x45\x63\x45\x26\x40\x01\x27\xaa\x57\x11\x44\x51\xb5\x0f\x3c\x28\x24\x96\xa4\xa3\xea\x81\x8f\xbd\x80\x99\xad\xdf\x0f\x1c\xe8\x8e\x30\xc2\xb0\x23\xf6\xf0\xe1\x20\x1c\x6d\x77\xce\xec\xdd\x3c\x66\x8f\x16\x93\x89\x5c\x97\x93\xe6\xf9\x62\x06\x26\x4c\xe4\xc7\xf4\x51\x88\xd1\x8d\x07\xde\xc8\x21\xb5\x1f\x0a\x8f\xa8\x45\x8b\x3e\x42\x0c\xf8\x21\xe8\xdf\xa3\x90\xbc\xff\xb0\x27\xb0\x91\x39\x1e\x68\x2e\xeb\x67\x84\x6b\x14\x59\xf3\x2c\x2b\x8d\xda\xc8\xfc\x24\x2e\x74\x46\x45\x43\xd3\x71\x78\xbc\x38\xb0\x23\x28\xe9\x51\x1e\x5c\x19\x99\xab\xd2\xe4\x7c\x40\x14\x90\xbb\x49\x91\xdb\xf6\xc8\x0c\x12\x7b\x64\xaf\x43\x11\x6b\x53\x7c\x50\xfa\x91\x97\x08\x77\x7f\x84\x8b\xfd\x61\x5f\xfc\x9d\x8b\x79\xc7\x00\xba\x17\x8d\x2c\x2a\x86\x0c\x11\xc3\x31\xd3\xfa\x26\xd7\xf4\xa4\x29\xe8\xab\x5e\xae\x47\x8a\x18\xfa\x47\xfa\xa1\xb2\x22\x84\xe0\xdf\x8d\x59\x5a\x76\x57\x12\xec\xa3\x74\xeb\x81\x3d\x92\x26\xd6\x15\xf0\x6e\x01\xf4\xcf\x4e\x4d\xd5\x26\x71\x48\x29\x7e\xcb\xef\xcc\x51\xb3\x2f\xe7\x8f\x32\xbc\x82\xfe\xbf\xfc\x8f\x90\x79\x0e\xc2\x90\x41\xca\x03\x47\x36\x18\x82\x91\xe3\x07\xc4\x5c\x47\x2c\x24\x8a\x43\x69\x04\xd3\xc4\x63\xca\xff\xea\xde\x53\xcf\x36\xff\xf3\xbe\xce\xd9\x90\xf2\xf9\x9f\x7d\x9f\x8f\x60\x76\xfe\xcb\x3d\x57\xb0\x36\x1f\x86\x2f\x77\xee\x03\x90\x2b\xc8\xe9\x37\x36\x2a\xdc\x18\x5d\x70\x4d\x31\x42\xac\x43\x43\xba\x60\x13\xdd\x05\xe5\x94\x43\x6a\x19\x5f\x41\xbf\x58\xf9\xa2\x1f\x57\x26\xb2\xc8\xbc\x4e\xca\x37\x0d\xf5\xeb\x86\xa1\xc6\xbc\x44\xc0\xb2\xa3\x07\xe7\x08\x0a\x0a\x32\x1f\xea\x71\xeb\xc6\x72\xfc\x4d\x27\x65\xfd\x52\x28\x32\xae\xf9\x52\xdf\x17\xa7\xcc\xb0\xbe\x0c\x7a\xbf\x3c\x2d\xd0\xa2\x59\x74\xb0\xeb\x28\x59\xc0\xbc\x3e\xe4\xbe\xb3\xf5\xfd\x00\x56\x0d\x3a\x85\x22\x25\x62\x33\x7a\xcf\xb2\x63\x8b\x2e\x53\x8c\x96\x97\x60\xe1\xaa\xe0\xe6\xbf\x25\xd5\x68\x05\x0c\xca\xb3\xfa\x01\xec\xf4\x86\x9a\x96\xa6\x20\x0e\xa0\xe9\xa1\xaa\xc4\x7a\x62\x2e\x58\x99\xfd\x46\x7f\x09\x5b\xba\x83\x8f\xee\xc7\xa1\xe0\xb6\x2f\xc7\x94\xd6\xa6\x2c\x2b\x66\x69\x4b\x18\xcd\xc3\x2f\x6b\x96\x6c\x9d\xc5\xe8\xce\xe5\x01\x83\x20\xaa\xc2\x73\x7f\x25\xc2\xf0\xd1\x75\x65\x5a\x52\xee\xcb\xee\xd3\x74\xe8\xe1\xb3\x36\xd8\x24\x3d\xf8\x0c\xfd\x1a\xc2\x02\x65\xf2\xe0\xad\x6d\xe6\x1b\x1c\xde\x87\xcb\x3f\x62\xbd\xc1\xa5\xc5\x79\x59\xe0\x28\x55\x0e\xb9\xa3\x4d\x89\x2a\xbc\x98\x0d\x3a\x58\xfd\xc6\x24\xd4\xe1\x52\x3a\xfa\x70\xad\x1c\x3b\x37\x43\x2d\x6f\x58\xfa\x6d\x19\x3c\x6a\x64\xb8\x40\x5a\xe2\xac\x61\xa6\xe8\x85\x9d\x29\x2e\xd1\xb0\x5f\x41\x13\x1f\x3c\x8c\xdb\x9f\x0b\x98\x3c\x06\xb4\x91\x6a\x58\xd5\xa3\x2b\xbe\x04\x4b\xe5\x3e\xc0\xb2\x94\xa4\xf6\xb0\xcb\x71\xea\xdc\xd4\x20\x40\x22\x77\xfc\x0c\x96\xe3\x9e\x62\x5a\xd6\x8d\x7a\x79\x66\x8f\x6a\xb9\x0e\x55\x43\x15\x78\xff\xb9\x7f\xfa\xf7\xe0\xae\x56\x93\x78\xa8\x82\x3a\xe2\xeb\x34\xd3\x78\x4a\x3b\x71\xb0\x8f\x04\xe4\x52\xf8\x7b\xf5\xc4\x36\x3f\x9e\x0a\xa0\x99\x2e\xbc\xd9\x88\xae\xe1\x79\x60\x40\x4b\x86\x7e\x25\xd9\x38\xec\x9e\xc9\x6c\x43\xa5\x90\xc9\x80\x84\x05\x29\x90\x0f\x3f\xee\x7e\x1e\x90\xcf\xa7\xa3\x2e\xbf\x94\xba\x02\xa1\x75\x10\x17\x68\x00\x4a\xfd\x4b\x64\xd6\x43\x40\xd2\xe3\xae\x15\x07\x68\x58\x8d\x91\xc3\x1a\x30\x56\xd9\x4b\xd2\xaa\x50\xed\x89\x99\x6e\x7f\x09\xb2\x8a\x6a\xfa\x8c\x42\x73\x8a\x70\x06\x02\xcb\xb5\xa0\x67\x50\xc7\x51\x1e\x7d\xd9\x22\x20\x0b\x90\x55\xa7\x94\x68\xeb\x7b\xc4\x29\x0e\xd0\x8a\xf1\xe9\x12\x48\xd5\x2b\x70\xaa\x57\xaf\xc6\xc4\x50\xc6\x7c\xb4\xed\x0a\xcc\x34\xdc\x31\x40\xc8\xcb\xf6\xf7\x49\x03\x5e\xad\xfc\x45\xba\x6a\x83\xd8\x3a\x68\x95\xe3\x3e\x5f\x4e\x56\xd5\xa7\x7c\x40\xf6\x7b\x51\x1c\xe5\x40\x4d\x5b\x5a\xf5\x9f\x76\x91\xcf\xb6\x2c\x2a\x6c\x3f\x44\x45\xfd\x72\xae\xc8\xab\x03\x0b\x7d\xdc\x17\x7c\x24\x69\x78\xd2\xb0\x2c\x5d\xb1\x6c\xaf\xb8\x56\xdf\xca\xcd\x28\x85\xad\x0d\xad\x11\x61\x20\x60\x2b\x57\x5b\x2e\x6d\x69\x71\x8e\x60\xb0\x49\x05\x83\x18\xb2\x34\x9d\x86\xf6\x34\x66\x05\xa9\xc3\xe8\x3e\x09\xac\x73\xb7\x73\xc8\x16\x63\x48\x52\xa1\x1f\x72\x84\xfc\x0d\xf6\xc8\x5c\x6c\x94\x0f\xf9\xd1\x20\xac\xbc\x36\x8f\x56\x59\x03\xdf\x1a\xd0\x59\x34\x41\x6e\x5a\xeb\xaa\xe1\x16\xd8\x7d\x00\x5d\xe1\x2a\xd3\xe9\xf5\xfb\x7b\x6b\xf6\x0d\xa8\x0c\x56\xeb\xb3\x9d\xbc\xb0\xab\x59\x05\x49\xda\x0e\xea\x05\x73\x21\xe8\x2b\xd0\x40\x9e\xa4\xe6\x2d\x1e\xbc\x41\xd3\x07\xc5\x06\x97\x75\xe4\xc3\x97\x9a\x0f\xc2\x4d\x1e\xc8\x37\x02\xbf\xdd\xc0\x50\x1c\x31\xc9\xdf\x31\xec\x6f\xd6\xb8\xa2\x25\x63\x76\xff\x97\x39\x38\xed\x46\xf5\xb4\xfa\x67\x11\x83\x15\x30\x53\x82\x04\xdf\x40\x63\xbb\x61\x57\x7e\x60\x0e\x25\x42\x3a\x89\x69\x33\x4b\x7e\xac\x5e\x02\x12\xa0\xb1\xde\xb0\x53\xe2\x58\x79\x9d\xc9\x63\xd5\x42\x70\x02\xa9\xdf\xd2\x93\x64\xdc\x5f\x4c\x6c\x80\xb8\x2f\xdf\x6d\x67\xb2\xd2\xb7\xd2\x37\x4d\x8d\x3e\x72\x76\xc1\x68\x55\x38\x6a\xdf\x84\x69\xcd\x92\x2b\xad\xf7\x88\xfb\x2e\xd8\x86\xee\x74\xe4\xe6\xf3\x11\xf0\x54\x8a\xe4\x12\x64\xb9\xc7\xbc\xb4\x68\x8d\x14\x0a\xbc\x50\x17\x67\x9d\x05\x7d\x9f\x17\x33\x88\x7a\xc4\x0d\x11\xd6\x07\xa9\x25\xe6\x9a\x82\xd2\x7c\x06\x20\x42\xe8\x55\xd2\x96\x5a\x79\x55\x1b\x1a\xa5\xa3\x91\xa2\x7a\xeb\x55\xaa\xc5\xd0\xd7\xe3\x86\x0d\x59\x81\xa3\x9d\x66\xf8\x01\x20\x79\x9a\x60\x4e\xf1\x3c\x03\xbd\x7a\xfc\xa7\xc4\x42\x84\x7c\xc1\xe4\x04\xba\x41\x4f\xed\x66\xef\x1a\x59\xb3\x2a\xd4\xb8\xf7\x71\xc5\xad\x9e\xcd\x56\x47\xce\x0a\x68\x79\xf2\x91\xb0\x0f\xc8\x70\x30\x5a\x0e\xfe\xda\x6b\x96\xaf\x80\x4c\xd7\x21\x5e\x7f\x21\x5e\x1b\x2b\x15\x78\xd7\xfb\xb8\x81\x6f\x15\x2c\xd6\xcd\x9b\x87\xe8\xcc\xe3\x54\x02\x25\xbb\xfe\xa8\x39\x6a\xe6\x98\x25\xaf\x64\x36\x24\x13\xe2\x52\xae\x6c\xcd\x8f\x51\x18\xf2\xc7\x15\x5a\x09\x18\xf7\x8f\xbc\x63\x5d\x45\xd2\xf6\xd8\x5c\xc5\x9f\x01\x67\x60\xe7\xc1\x26\xaa\x33\x5b\xad\x6d\x7b\x36\xf4\x2a\x22\xe3\x3e\x48\xa9\xee\xea\x15\x43\x77\x59\xea\xf0\xb1\xe4\x92\xf7\xde\x9b\xc3\xdc\x9b\xd5\x3e\x69\xbc\x02\x40\x3b\xb7\xb1\x39\x2f\x3e\x85\x3d\x2d\x22\x65\xd6\x11\xa4\x56\x31\x52\x1f\x51\xfb\xf5\xb5\x7b\xe5\xce\x0d\x96\xd7\xce\xef\x02\x86\x94\x39\x63\x76\x79\x22\x99\xcb\xc1\xd4\x2c\x33\x1b\x62\x75\x16\xc8\xdd\x8d\x95\x06\xc3\xaf\xdc\xc8\x34\x36\x4e\x06\xcd\xbf\xd7\xd6\x10\xa9\x19\x4b\x17\xfb\xc9\x84\xb0\xe6\xb4\x47\xcc\x15\x08\xb9\x51\x17\xcc\xc0\x91\x09\x1e\x0c\x09\x39\x35\x73\x60\x4f\xb1\xd5\xb4\x3e\x6f\x73\x6c\xe6\x22\xc7\x52\x5f\x7e\x7f\x75\x55\xad\xfa\x78\xd1\xcb\x6d\x66\xfc\xba\x0b\x80\xf9\x8e\x92\x3a\x2a\x6a\x6f\x82\xcf\x2a\xe8\x28\xa9\x5c\x41\x16\x9d\x40\xad\xe0\x12\x95\x0d\x31\x24\x6f\xf1\x27\x68\x6e\xba\x61\xaf\x65\x6d\x60\x0d\xe0\x58\xa3\x89\x0b\x7b\x26\x36\x79\x12\x3f\x55\x83\x88\x88\xa2\x3c\xb5\x1d\xf0\x59\xb9\x26\xe8\x6b\xd6\x25\xff\xc7\xc2\xae\x70\x32\x87\xae\xee\x1a\x38\xe8\xa1\x01\x74\x31\x39\xda\x6c\x57\x9a\x4b\x25\x76\x67\xdd\xc1\xc6\x37\xb5\x82\x3f\x55\x50\xed\x8a\xa7\xdb\xda\xfb\x60\x9c\xf1\xe1\xf6\x9e\xca\x20\xeb\x43\x7e\x92\xc5\x07\x45\x2d\x1d\x3e\xca\x6b\x91\xed\x77\xbf\xac\xd6\x99\xe4\xd9\xa0\x6f\x1b\x97\x38\xfd\x66\x7a\xfb\x1c\xd5\x5a\x82\x25\x7a\x21\xc1\x3d\x50\xa7\x57\xf0\x66\xed\x43\x3b\x44\xcd\xd8\x74\x8f\xcd\x9a\x82\xf6\x7a\x46\xee\x3f\x38\xae\x51\xeb\xf9\xf8\xc9\x96\x49\xbd\x4d\x07\x70\xb0\xfa\x61\x0f\xda\xea\x7e\x02\x32\x34\xcb\x76\x4c\xa7\x7e\xd8\x82\xff\x9b\xe8\x60\xb6\xe9\x7c\x74\x49\xb3\x72\x78\x30\x61\xe3\xf9\xe3\x5b\x91\x90\x59\xd3\x7e\x00\x03\x76\xe1\xce\x11\xfa\xaf\x00\x04\x7e\xad\xe7\xc6\xd2\x05\x2a\xb7\xe1\x4e\x43\xf7\xb0\xf7\xd8\xd6\xef\x30\x8b\x30\xc8\x69\x4d\xfc\x84\x82\xec\x06\x2d\x1a\x22\x7b\x01\x77\x13\x49\x76\x6e\x41\x49\xb0\x8b\xfb\xf0\x54\x7a\x68\x48\x1e\xa1\xc0\xda\x72\x0c\xfc\xf7\x09\x98\x67\xd1\x18\x81\x69\x25\xa9\xf0\x3a\x5b\x98\x7f\xe7\x8c\x74\x2d\x70\xbc\x25\x77\xd3\x5d\x72\xdf\x76\xd7\xbe\x69\x3a\xd6\x25\x17\xf9\x61\xba\xcb\x41\x3e\x5d\xcb\xf3\x37\xeb\x19\xa1\xff\x20\xb7\xf6\xf4\x2d\x75\xd7\xfc\xd4\xb7\xa0\xbb\xca\x3c\xc4\xfe\x03\xaf\x78\x59\x6f\x91\xd8\x46\x58\x5c\xac\x7f\x42\xb5\x94\x5b\x45\xf2\x25\xc1\x9f\xfb\x25\x61\x5c\x20\x5c\x0f\x51\x55\xd1\xc5\x10\x52\x1a\xd0\x56\x61\x29\x11\xfc\xfc\xa6\x21\x49\x57\xb3\x62\xf8\x4d\x94\xd6\xe3\x36\x65\x89\xaa\x9a\x45\xf9\xc0\xe8\x9a\xe6\x24\x74\x22\x57\xed\x52\xc8\x5b\x07\xa3\xf0\xc8\xab\x07\xd8\x75\xde\x0b\xa0\xb7\xb8\x6b\xda\xf2\x1d\xf5\x06\xdc\x3a\xf8\x7d\xb7\xaa\x7c\x54\xe4\x59\xd7\x12\x5b\xba\x5a\x41\xbd\xe4\xef\x35\xe6\x11\xa8\x89\x51\x2b\xf6\x30\xbb\x8a\x7e\xbb\x70\x94\x35\x02\xce\x3b\x84\xe4\x12\x1e\x8b\x6f\xc2\xbe\xa9\x59\xda\x55\x77\xb8\x76\xf6\xc1\xf3\x15\x66\x24\x78\x13\xe2\x89\x67\x89\xb7\x17\xb2\x40\x80\x2c\xe8\xa4\xbd\xd8\x88\x8f\x1d\x24\x4e\x05\xdf\x9c\x19\xaf\x6f\xed\x2a\x26\xa9\x77\xb3\x54\xa2\x88\x61\xd5\x42\xa0\xc9\x53\x38\xda\x6d\xf5\x1d\xdd\xa6\x77\x95\x66\x6c\xde\xed\xb0\xba\xe0\x23\x00\xde\xaa\xcd\x75\x4d\xbb\x15\x5c\xd6\x2e\xc0\x9a\x05\x21\xeb\xd6\xbb\x8a\x00\xb3\xae\x54\xd7\x5c\x18\x34\xe0\x0b\x86\x97\xd5\x89\xf4\xe7\x74\x56\x0f\x2b\x9f\xaf\xf3\x00\x23\x0e\x12\x75\x11\x88\xd8\x95\xf1\xfb\xe2\xa5\x2e\x5e\x19\x7d\xcb\xce\xa4\xaa\xc2\x21\xc2\x59\xf9\x08\x29\xcc\x2e\x1f\xfa\x95\x99\x09\x18\x77\x53\x56\x7f\xe7\x1c\x57\xad\x20\xf2\x2b\xe4\xaf\x35\xc3\xba\x75\x7e\x57\x00\x79\x9d\xf8\xeb\x7c\x92\xf3\x82\x1a\xb9\xab\x6f\x2e\x38\xdf\x6c\x35\x14\x42\xc7\xbd\xcb\x53\x11\x14\x37\x43\xad\x4e\x7b\x1f\xab\x70\xb2\x79\x0e\xb0\xac\x2d\xf8\x4b\x8b\x48\x05\xae\x03\x4c\x6b\x6c\x35\xb1\xd3\x09\xa3\xe1\x68\xad\x96\xe5\xbb\x83\xf1\x6a\xe7\x32\x7a\x81\xfb\x4e\x97\xdf\x59\x38\x30\x59\x26\x23\xb0\x43\xd7\x80\x97\x3a\xe9\xcd\x94\x02\x1b\x97\xda\xa3\x47\x63\x66\xf7\x69\xd2\x51\xd0\xb1\xcf\x0f\x0e\x01\xde\x5c\x1d\x1d\x08\x30\x40\x69\x4d\x2c\x0c\x8a\xd9\x72\x0a\xeb\x17\xd1\xab\x7a\xb7\xd3\x28\x6f\x47\x97\x24\x1b\xd8\x25\x41\x10\xf0\xbc\x53\xe1\xaa\x0b\x7c\x1c\x90\xaa\xdc\x45\xfa\x7b\x2a\x63\x2f\xbd\xad\x49\x00\xf0\x25\x6c\x0e\x9a\xa6\x17\xfe\xdc\x48\xcf\x1c\xd4\x55\x86\x7e\x00\xb8\x2a\xca\x22\xba\x12\x6a\x18\x98\x0d\xaf\x22\x49\xd8\xc9\x83\xad\x9c\xcf\x69\xd5\x82\xaf\x74\x61\x18\x2e\xde\x14\x7c\xeb\x7a\x1a\x3b\x75\xe5\x81\x29\xaf\xae\xb3\xad\x92\xd7\x21\xc3\xd7\xcd\x58\xfd\x22\x53\x75\x0f\xb0\x24\x6d\x9e\xca\x81\x04\x6c\x79\x0c\xad\xb1\xc4\x67\x05\xb1\x99\x1c\xce\x4f\x22\x7f\x25\x0c\xd5\x25\x87\x67\xca\xdb\x8c\x18\xcc\x38\x52\xab\xe1\x05\x01\xdd\x07\xc5\x48\x78\x9a\xc7\x1e\xd6\x50\x6a\x4f\x96\x9b\x73\x59\x73\x83\x9e\xee\x5d\x41\x1e\xab\x40\xa9\x7b\x62\xfc\xb6\x3b\x3f\x36\x0f\x30\x19\x54\x4c\xc1\xf0\xdc\xe0\x3f\x0e\x64\x26\x72\x53\xd4\x4b\x48\xeb\x1b\x3a\x4c\xdf\xbe\xc2\xfa\xaf\x84\xac\xbc\x75\xa0\xe4\x17\xf7\x64\xeb\x19\x81\x76\xb1\x06\x61\xbc\x10\x6e\x0b\x66\x6b\x59\xc8\x77\x1d\xe7\x7a\xc8\xd0\x10\xb7\x80\xad\x81\x0d\x05\xad\xf5\xb0\x16\x34\x53\xa7\xbd\x68\xad\x37\xae\x3c\x54\x0e\x49\xc0\x9a\xe9\xf3\xc7\x73\xc8\x43\x5e\xb9\xb5\x85\x6f\x6e\x5a\xe8\x4f\xb0\x66\xe8\x54\xba\xa2\xdf\x56\x5c\x2e\xe8\xa4\xf8\xd7\xc6\xca\x88\x8f\xf1\x43\xb6\xd6\xbf\x7a\x16\xd0\x40\x42\xa8\xa6\xdf\x00\x7c\xfb\x31\x9d\xb5\xd5\xf9\x97\x8f\x24\xdb\x69\x69\x3e\xd1\xc7\x95\x89\x81\xfe\x0d\x59\x33\x7f\x5c\x65\x9b\x00\x04\x65\xf7\xca\x4a\x89\x84\xdb\x19\x4a\xdd\xbe\xcb\x78\x5d\x40\x7d\x8d\xa9\x9e\xaf\x79\xae\xfd\x0d\x87\x9d\x4b\x43\xe2\xc2\x45\x2a\xaf\x25\xec\x51\x73\x41\x9f\x1a\x18\x7c\x65\x85\x5e\x9b\x4d\xe5\xa9\xc3\xb4\xb7\xca\x0d\xc4\xd5\xf9\x79\x15\xbe\x36\x76\x84\x5c\x16\xb1\x5d\x2d\xf6\x22\x8d\x02\x6f\xd8\xdb\xbb\x7b\x0c\x45\x1a\x91\x8b\xc0\x45\x01\xb1\x08\xdf\x5e\x7a\x60\x60\xa7\xf5\xf8\x12\xd2\xa7\x31\x1d\xea\x76\x43\x59\x7f\x22\xcc\x11\x6d\xa0\xfe\x03\xd6\xea\x59\xfa\x3c\x42\x17\xc5\xfa\x6a\x6c\x56\x92\x90\x69\xf3\x48\xfa\xfd\x4d\x3f\x06\xa0\xac\x50\xe5\x90\xbb\xdf\x8a\x0d\x52\x67\xdf\xa8\x4a\x84\xbd\x5d\xf8\x7d\x17\x45\xb6\xf3\x14\x90\xc4\x14\x2a\x0c\xc7\x7f\x70\x58\xdb\x1f\xca\xdf\xc2\xeb\xfe\x5d\x08\x12\xf6\xa7\xeb\x8f\x1d\x0a\x9b\x3c\x83\xf5\xf4\x67\xdd\x92\x4a\x4a\xd6\x5f\x23\x99\xfd\x41\x6a\xcd\xdb\xb6\x7f\xd9\x1a\x81\x7c\x2d\xfe\xbc\x7d\xfe\x76\xab\x9c\x18\xc1\xf5\xad\xa7\x95\x4f\xe6\x1f\x48\xc2\xbe\x19\x5c\x5d\x9b\xbe\x67\xba\x8b\xdf\x8d\x02\xf2\xce\x87\x4b\xdc\xbe\x31\x88\xe1\xd3\xd1\x17\xc8\x76\x80\x53\x18\x98\xa6\x77\xf5\xc9\x6b\xe3\x84\x44\xd7\xa4\x28\x9b\x77\x9a\x86\xc4\xe5\x18\x95\xf0\xfe\x1e\xdd\x33\xf0\xcf\xaa\x19\xa6\xbd\xbc\x5e\xb5\x7a\xe5\xfa\x82\xb7\xe5\x95\x18\x3f\xfa\xda\x9b\xc2\x0f\xa8\xad\x83\x9f\xc0\xab\xfa\xc0\x8e\x80\x9d\x04\xed\xbf\xe8\xf4\x64\xd5\x47\xb2\x2b\x0d\xcf\xee\xc1\xf4\xe4\x40\x23\xcc\x68\xe7\xda\x2e\x49\xd0\xb4\x16\x8e\x83\x5e\xb5\x36\x3d\xb1\x2f\x24\x32\x72\xb1\xd9\x1d\x34\x5a\xc7\x3e\x61\xa7\xb6\x3e\x07\x5b\xb5\x42\xd5\x8f\x68\xd0\x3b\x9c\xc7\x93\xbf\x78\x27\x5e\xe5\x70\x94\x67\x11\xa5\x35\x08\xaa\x08\x54\xe4\x9c\x75\x1c\x62\x2d\x60\x95\x88\x66\x81\x5d\x5f\x80\xbc\x79\x01\x01\xde\x34\xce\x58\x56\x61\x19\x2f\x77\xb2\x3d\x65\x41\xbc\x56\x47\x63\xed\x6b\x2a\x4a\x1d\x2a\x59\x1f\x8f\xad\x2e\x2b\xb8\xfc\x08\xb0\xaf\x17\x77\x26\x60\x2f\x7a\xc8\xe2\xe2\x4e\xef\xb7\x6f\x66\x6a\xb9\xb8\x4e\x7a\xf5\x69\xf9\x6b\xe8\x56\xe6\x93\x90\xf7\x7a\x86\xf5\xe0\xf7\xe9\x05\xc0\xb5\x6e\xe1\x54\xe2\x67\x4a\xee\x3a\x09\xf6\xda\x48\xda\x85\xdd\x69\x6e\x56\xf7\xf6\x85\x10\xa0\x30\xd3\xdf\x1f\x81\xa8\xd6\x17\xd6\xbf\x24\x40\x2d\xa3\x15\x1c\x17\xdb\x68\xb1\xdf\xcd\xdc\xbf\x04\x8b\xf5\xed\xe4\x7f\xd1\xb9\x79\x65\xf5\x33\x61\x7c\x11\x23\x7b\x91\x67\x9b\x43\xae\x17\x4c\x59\x89\x39\x60\x61\x92\x70\x73\x1b\x34\x7a\x49\xab\xfc\x95\xbb\x8d\x09\x3c\x56\x4f\xb7\x94\xbd\x17\x44\x09\x7d\xea\x6a\xfb\x82\xd2\xbd\xf8\x69\xa6\xe5\x55\xc4\x2b\x35\x97\xfd\x4b\x34\x64\x4c\xb3\xfc\xd0\x66\x77\x12\x84\x79\xa5\x59\x9e\x4a\xa0\xc3\xba\x24\x99\xe8\x57\x2a\xe2\x9e\x83\x16\x8b\x7f\x5f\x00\xbd\xca\xd1\xf9\xeb\xba\x25\x44\xc2\xee\x0a\xd1\xfd\x65\xa7\xce\x26\xf0\x31\xb8\x35\xc3\x8d\xbe\x93\xf6\xfa\xeb\x6d\xe3\xdf\x12\x70\x05\x07\xc4\x5e\x6e\x6c\x2c\xe3\xb3\x57\xc9\x83\x1d\x72\x1d\xd3\xa2\xe5\x82\xeb\xf0\x0b\x6f\xc6\xb7\xac\xe9\x7d\x1c\xb5\x04\xf2\x35\xed\xea\x1e\xff\xaa\x1b\x6a\x3d\xf4\xeb\xb7\x68\xd6\x2e\x70\xeb\x3e\x5e\x92\xb2\xf2\xd1\xdb\x86\x71\x85\xdd\x80\xb0\xf9\xef\x42\xb8\x3d\x0b\x9e\x20\xf4\x9b\x67\x64\x9a\x65\xce\x9b\x39\xa0\x05\xa3\x2f\xf6\x85\x61\xc5\x1e\x88\x58\x7f\xf0\x7e\xad\xa9\x9b\x23\xe4\x06\x12\x73\x81\xb5\xb5\x06\x6b\x0f\x5c\x3b\x4f\x2c\x6d\x3a\x2f\xbf\xb9\x93\xf3\x8b\x7f\xed\x63\xca\xe6\x30\xdc\x1a\x83\x3e\x15\xb0\x43\xa9\x0d\xa0\x76\x85\x31\xfd\xda\x37\xe6\x5a\xb8\x40\xdf\xab\x3a\xb9\xfe\xba\xfc\x2c\x8a\xa4\xbf\x8e\xcb\xbf\x11\xd6\x11\xdb\x57\x7f\x27\x2f\x81\x03\x70\xf6\xc4\x79\x5c\xab\xd7\xce\xbc\x18\x60\xc8\x7a\xeb\x58\x87\x7c\xad\xbf\x60\x68\x37\x00\xea\x19\xc3\x96\x66\x3a\x89\x53\xd9\x71\x48\x67\x8b\x7a\xd5\xe5\xc9\xaf\xa0\xb8\x1e\xfd\x1e\x34\x81\x6b\xdd\xf3\xc7\x06\x80\x0c\xdc\x9f\xe9\xfe\x6d\xbc\xa5\x92\xae\xd5\xb9\x11\x6d\xbf\x88\x9e\x76\x02\xed\xc5\xbd\x55\x40\x06\xf5\xdb\xea\xc1\x6c\x2b\x0b\x0b\x55\x7b\xae\x75\x2e\x4d\x27\x1e\x48\xe9\x60\xd2\x06\x6b\xd7\xfa\x27\x76\xf0\xf2\xcb\x39\x9e\x16\x7d\x91\x76\x30\x4e\x05\xde\xd3\xcc\x42\xef\x1e\xc5\x6b\x7d\x04\x5e\xc9\xcc\xe4\x79\xca\x6d\x85\xc1\x73\xe7\x3a\xfd\x6a\xf7\x13\x2c\x9c\xb8\xa6\x2a\xe6\x28\x34\xe2\x49\x94\x9a\xad\x78\x00\x1d\x2d\x5c\xc5\x9b\xa3\x19\x52\x1c\x28\x9a\x18\x42\x02\xc3\x5b\x7c\x8a\x6a\xcb\x77\x0f\x06\x9a\x82\x67\x5b\x00\x6d\xc0\xa0\xe2\xb2\x8f\x02\x57\xc1\x6e\x6d\x93\xbe\xc4\xc5\x81\xb6\x12\xb8\xd2\x51\x24\xe4\x76\xfd\x94\xd7\xb1\xcf\xc4\x3d\xc6\x78\xad\xd1\x9e\x64\xc1\x03\x92\xbe\x9c\x8b\xab\xb7\xe4\x52\x02\xdc\x35\xbd\xdc\x7d\x74\xa9\x38\x92\xfb\x6d\x53\x9f\x3c\xe8\x7f\x01\xf5\xcb\x2f\x0f\x01\x9b\x8e\xb2\xcc\x1f\xe6\x40\x93\x9d\x2d\x33\xd6\x88\xf7\x74\x5b\xd3\x31\xd6\x68\x43\x97\xb4\x71\xcd\x4f\x50\x3e\xb8\x19\xeb\x8c\xce\xac\x55\xcf\x96\x8c\x09\x2b\x29\x98\x58\xe1\xbf\xa7\xdd\x74\x85\x99\x9f\xd7\x82\x01\x21\xc1\x64\x2f\xe5\xab\x9c\x8c\x13\x83\xb5\x33\x69\x18\xe3\x95\x4f\xcd\xb9\x3a\xe4\xe9\xf1\xe4\x30\x24\x34\xd3\x80\xbb\x2b\x11\xd0\x0b\x5f\x8a\x92\xfa\xad\x20\xdd\x0e\x00\x78\x4b\xa2\x90\x0b\x6c\x4e\x12\x24\x6a\x1b\x39\xd5\xe3\xc6\x1a\xf6\xd7\xb5\x2f\xb8\x77\xf1\x78\xb9\x45\xeb\xec\x02\x3b\x71\xc6\x6f\xeb\x71\x33\x08\xbd\x18\x22\x1d\x2c\x28\xc4\xdd\x0b\x0f\xba\xd7\x68\x5b\xa3\xa1\xfd\x00\xb8\x88\xae\xac\x17\xf3\x1a\x1b\xff\x1f\xa7\xcb\xa6\x2d\x96\xad\x91\x83\xcb\x1a\x88\x5f\xc5\x11\x9a\xf5\x48\xf3\x48\x28\x2d\x72\xdb\xb3\xd8\xc2\x9e\x05\xed\x7b\xf6\xbc\x3a\xef\xce\x3a\xf8\xb7\x70\xe6\x19\xc1\x36\x34\x79\x20\x15\x38\x32\xb6\x6b\x4f\x66\xae\xcb\x2a\x73\x98\x81\x13\x86\x87\xcd\xab\xea\x93\x60\xfd\x53\x8d\xb2\x13\xef\x08\xa8\xbf\x6e\xc3\x37\x42\x77\x87\xf7\xd5\x79\xc1\x2a\xe3\xed\xce\x3a\xb2\x48\x37\xcb\x59\x1f\xd7\xce\x61\x12\x47\x04\xc7\x21\x85\x57\xf4\xac\xdd\x7e\x11\x2b\x0c\xd7\x85\xe6\x25\x34\xc5\xaa\x3f\x10\x95\x19\xf7\x8a\x48\x72\x15\x52\x2e\x24\xb9\x0b\x50\x53\xdf\x9a\x9e\x51\xd1\x9e\x1e\x1a\xed\x8d\x9e\xb3\xc8\x6d\x76\x16\x88\xfd\xf0\x58\x27\x6a\xe4\x9f\x71\xe7\xa6\x6b\x1c\xdd\x8f\x4e\xca\xb0\x0e\x12\x03\x0d\x1d\x9f\x68\x33\x73\x18\xaa\x65\x00\x19\x7e\xf0\x5a\x4f\xd5\x69\x67\x9d\x5e\x1f\x08\x01\x4c\x8a\x3c\x47\x8b\x59\xd4\x49\x12\x88\x69\xd9\x91\xf0\x57\xfb\x02\xcf\x89\x38\x5f\x04\xa8\x70\x03\x5e\xbf\x55\x0d\x94\x9d\x1e\xe6\x74\x49\xdd\xfc\x74\x46\x42\x68\x16\x11\x35\x4c\x23\x1f\xfc\x3a\x03\xb5\x86\xcb\x7c\x0a\x22\xbc\x5d\x7e\xe3\xf3\x7a\xc5\xd6\xed\x2b\xd4\x0b\x5e\x1c\x63\x35\xb0\xf2\xae\x81\x4d\x14\xb4\xa9\x96\xfc\x04\x50\x0b\xf5\x78\xa3\xf4\x20\x44\x13\xa6\x4f\xda\x1d\x8d\x81\xf6\x33\xfd\x83\x56\xb8\xf7\x04\x60\x73\x3b\x9e\x84\x27\xc0\xaf\x55\xc1\xe2\xbe\x9d\x10\x11\xd2\x9e\x12\x02\x98\xce\x30\x13\xc4\xc5\x68\x0f\x9c\x7c\x73\x8a\xc1\x7a\x01\xf3\xe3\xb6\x5a\x25\xf0\xd6\x34\xc0\xc2\x84\x55\xda\xbb\xb0\x5c\x5c\x0d\x09\x6c\xda\x4f\x47\x1d\x1c\x7f\x6a\x4e\x0a\x51\x41\xcb\x36\xe0\xd0\xc9\x23\xf8\x79\xa5\x0e\x8c\xb0\x33\x13\xf8\x78\xab\x61\x71\xbc\x81\xcd\x18\x1a\x94\x18\xb0\x9c\x43\xe6\xca\x70\xef\xe3\xc5\xfc\x0c\x9b\x02\x2b\x00\xcb\xda\x4b\x3f\xea\x25\xc0\x1e\x13\x67\x5f\xbf\xbe\x9c\x80\x9d\xd7\xfe\x0b\xad\x19\xc5\x8a\x5a\x71\x61\x23\x0e\x2c\x61\x0f\x0f\xd5\xec\xfc\x60\xba\x06\xd0\xc2\xb1\x04\x21\xc3\x6d\x55\x72\x86\xe3\x0d\x17\x5c\xf8\x60\x9b\xca\x4b\x87\xa4\x2a\xc9\x19\x26\x66\xf2\x72\xfa\xca\xd6\x4c\x3b\xf6\x20\x0e\xe3\xe1\xa1\xd1\x45\x23\xe5\x70\x71\xd6\x7e\x2e\xde\xc2\xb5\x07\x5a\x3c\x68\x34\xea\x83\x1d\x3c\x06\xf8\xf4\x7a\x3c\x4a\x5f\x84\x33\x3a\x40\x07\xe0\xce\x03\x4d\x79\xb5\xa0\x0b\x07\x0e\x73\x6a\x5f\x62\xd5\xaa\xc7\xd5\xe1\xe9\x88\xb3\xe9\xa8\x1c\x1a\x44\x5e\x2b\x17\x64\x85\xdd\x3f\x07\x49\x14\xed\x24\xc4\x76\x88\x3f\x3c\x5d\xc2\x40\x9f\x04\xc2\xe2\x03\x14\x73\x90\x0d\x33\xc8\x1a\x93\xda\xed\x88\xed\x0a\x5e\x2a\x3e\x2f\x23\x32\x24\x74\x48\x56\xb6\x7e\x8b\x9c\x08\x18\xf9\x7e\xb7\x1f\x92\x52\x24\x82\x44\xfc\xdf\x42\xfc\x66\x5f\x99\xf3\x06\xbb\x9e\x20\x86\xc6\xc6\xaa\x5d\x03\x6f\xab\x59\x95\x80\x54\x3a\x1e\x40\x11\x9c\xdb\xab\xaa\xb0\x96\x4f\x62\xf1\x23\x5e\x5c\xd0\x88\x63\xc3\xf6\x56\x05\x5a\x14\x15\x46\xb5\x36\x45\xfb\x89\x47\x92\xb7\xa5\x0a\xba\x69\xf6\x94\x82\x59\x9c\x85\x5f\x25\xa0\x58\x17\xea\x86\x09\x9f\xde\x91\xe2\x8b\x70\x46\x16\x2e\xe2\x34\xdb\xf6\xd3\xa2\x4e\x15\x86\x34\xf6\x50\x33\x0f\xed\xe8\x46\x90\x86\xd6\x0f\x91\x53\x30\x6f\xc0\xd1\xe1\xfc\xb5\x41\x56\xeb\xea\x7b\x01\x53\x30\xc0\xa2\xc1\xe3\x05\x5d\x15\xc7\x18\xf3\xdc\xac\xbb\xeb\xb5\x83\x1b\x99\x19\x99\x66\x3f\xf3\xe1\x62\x31\xad\xa4\x57\x00\xa1\x63\xd1\xce\x76\x7a\x31\x1f\x4f\x67\x4e\x71\x7b\x92\xd1\x3f\x36\x4a\x56\x1e\x1e\x79\xcb\x75\x19\x72\x8c\xa9\x52\x6d\xcc\x84\x9f\xf6\x52\x5a\x13\xb0\xc6\x82\xb0\x83\x6c\xcc\x37\x77\x4b\x7b\xe3\x28\x27\xb1\x4c\x37\xe7\x60\xf9\x61\xd7\x77\x97\x05\x3e\x46\x8b\xf6\xfc\x40\x1e\x0b\x90\xe1\xb6\x3a\xcd\x6e\xab\x2f\x7d\x54\xc9\xfc\x1f\x08\x15\x50\x3a\xee\x51\x39\xe6\x71\x38\x2a\x8c\x86\xbd\x04\x1c\x35\x23\x34\x59\x3c\x56\x7d\xea\xed\xd1\x19\xef\x06\x28\x70\xc8\xdf\x02\x23\xcf\x18\x66\xe5\x01\xcc\x65\xae\xff\xbb\x78\xbc\xac\xa4\x40\x45\x0e\x64\x6b\xd5\x61\xf6\x45\x59\x10\x5e\xea\xec\xcd\xe2\x91\x44\x42\x35\x00\xc8\x87\xa6\x01\xe8\x85\xe9\xed\xb9\x63\x45\x7b\x37\x16\x6c\x6d\xdf\x63\x6d\x88\x9d\x63\x4d\xd7\xa1\x58\x1c\x00\x0b\x35\x17\x14\x64\x2d\x6b\x66\xe4\x15\x98\x6d\xcd\x7a\x57\x36\x38\x88\x50\xa0\x35\x07\x56\x75\x56\xaa\x8e\x19\x11\xa1\x02\x4a\x32\x9f\x98\xb9\x2a\x4c\xfd\xb0\x76\x97\xdc\xf3\xc7\x1c\x70\xd0\x63\xce\x57\xc4\x42\x03\x92\xfc\x1b\x7a\xe1\xc7\x1c\xe3\xe4\x18\x2f\x5e\x1b\x0c\xb9\x34\x2e\xfb\xd3\xda\x66\xe1\xdb\x82\xbe\x1e\x88\x81\x0e\x4d\x3b\x9e\x69\x8c\xc0\x7b\xe7\x23\xfb\xb4\x5e\xff\x7c\xda\x08\xef\x65\xfd\xe1\x21\x14\x6f\x18\x0b\x44\x6d\xaf\xe8\x4b\x06\xbc\xa7\xda\x2d\x6a\x8e\x3b\xff\xf5\x28\x70\xbb\xcd\x4c\x89\x40\x21\x40\xca\xe3\x45\xde\xb7\x63\x52\x04\xf0\x36\x1b\x0a\x3b\x39\x16\x59\x6f\x6c\x75\xa1\x62\xaf\x3d\x9b\xfc\x6d\x40\x80\xb0\x9b\xd3\x3b\xea\x9b\x29\x6a\xca\xe9\x66\xd3\x4f\x27\x69\xbf\x4d\xa6\xc7\xac\x92\x49\x6e\x9e\x5a\x6c\x83\x9b\x3e\x20\xcc\xc2\xf6\x6c\x12\x8a\xc7\xa4\x21\x00\x17\x96\xe5\x77\xc6\xbd\x66\x27\xad\x33\x44\xb6\x61\x7b\x18\xbe\xec\x2e\x71\xcb\x65\x8b\xce\xa5\xa7\xd9\xc4\x2d\x99\xa0\xb4\x42\x23\xa4\xe7\x61\x86\x68\x92\xd9\x85\x7b\xcd\x03\x85\xd5\x0e\xa4\xda\x71\xf7\x99\x78\x06\x80\x9c\x15\x8b\x73\x30\xb2\x44\xa6\xb5\xe2\xb8\x69\xab\x32\xe9\x7a\x26\xca\xf9\x94\xf9\x88\x0b\x96\xbe\xed\xe1\x26\x68\xf9\x9f\xe4\xd2\x88\x6b\xe6\x96\x72\xd4\x4e\x99\x0f\x08\xe3\x6f\xd5\x67\x38\xe0\x1b\xd7\x97\x32\xef\x1a\x1b\x39\x32\xe4\x6c\x90\x00\xc0\x47\x24\x47\x2b\x06\xc1\xf0\x59\x96\xea\x35\x84\xe7\x73\x6a\x15\x11\xdf\xd9\xbb\x85\x08\x82\x46\x8b\xd2\x38\x3c\x42\xfd\x68\x56\x44\x5e\x1d\xb9\xac\x0f\xf9\x3b\x8f\x1c\x07\xdd\xb6\x40\xa7\xde\xa1\x38\xf9\xc3\x23\x35\xa3\x1a\xca\x14\xfa\xa6\x63\x3d\x4a\x6e\x22\x40\x4c\x2b\xf4\x76\x71\xc4\xb0\x4e\x71\x25\x52\x40\x18\xcc\x9c\xe3\x92\x21\x8c\x4b\x9f\xc2\xfe\x6a\xc3\xbb\x66\x7b\x90\xde\x81\x7c\x87\x78\xd2\xa4\x31\x3f\xd0\x2e\xcb\xc2\xae\x31\xe2\x8e\xf3\xca\x1a\xd1\x8b\x76\xb3\x54\x2b\xf4\xb6\x3f\xce\xb3\x8b\x13\x10\x67\xb2\xa6\x27\xe5\x60\x1c\xfd\xb4\x8b\x61\x0b\xf6\x34\xb8\x63\xe4\x67\xf7\xf7\x43\x8b\x28\x26\x1d\x42\x6a\xd5\x88\x87\xaa\xac\x89\x51\x06\x07\xf4\x86\xb9\x39\x3c\x2d\xfa\x48\x27\x09\x51\x99\x61\x87\xca\xeb\xd5\x46\x22\x8f\xb4\x6b\xa3\x70\x59\xf9\x46\x3c\xfb\x7d\x24\x62\xde\xda\xd4\x55\x46\xc7\x1f\x67\xe1\xab\x9d\x2c\x4e\xa3\x88\x0c\xfd\xc8\x3d\x55\x69\xbc\x34\x70\x40\xcc\x0c\x09\x04\x03\x2d\x5d\xc0\xe2\x50\xc5\x92\x3a\xe5\xeb\x98\xa5\xf7\x01\xc4\x47\x36\x75\x76\x04\xc2\xe4\xc2\xf6\xba\x75\xc2\x0e\x45\x9f\x01\x32\x40\xf6\xb1\xa3\xa5\x71\x32\xf0\x11\x04\x00\xb7\x3a\x53\x7c\x75\xf3\xa0\xaf\x01\xc8\x52\x2e\x76\x04\xff\x59\x42\xbc\x60\x6e\x39\x06\xb6\x81\xa2\x8f\x25\x4a\xcc\x27\xc3\xa8\xf7\xe9\x0d\x5f\xa0\xa2\xf9\x8c\xef\x35\x40\xd1\xf6\x35\xe7\x17\x75\x77\xd0\xa3\x58\xb5\xc1\xf4\x47\x8a\xc0\x1e\xe3\xf4\x76\xa6\x5b\xa5\x6a\xf5\xee\x7d\x56\x35\x43\xec\xf9\xf1\x95\x4a\xb4\x72\xed\xcd\xd7\x68\x46\x53\x61\xdc\x4b\x27\xd9\x5b\x9c\x9a\xce\x61\x7a\x9f\x13\x47\xb7\xed\x19\x22\xe4\xf7\x25\x8a\x1e\x48\xd1\xd5\x07\xcd\xb2\x4a\xec\x39\x82\xa5\xc0\x2d\x13\xa5\xe4\xae\x4d\x40\xa3\x0f\x97\x46\xd7\xba\xd6\x7a\x8f\xa5\x08\x8d\xbe\x4b\x8a\x52\x3d\xa2\x48\x78\x6f\x46\xee\x9c\x02\x37\x01\x56\xdd\xf1\xb8\x69\x99\xe6\x6a\x41\x77\x94\xd8\xec\xcc\xc4\xa5\xc8\xb2\xbf\x09\xd1\x77\xd1\x5e\xf3\xd8\xe9\x07\x03\xcf\x0a\x73\xe9\x03\x80\x0c\x38\xd6\x6d\xcf\x73\xb3\x99\x94\x01\xa3\xdc\x58\xe4\xba\x8f\xe9\x43\x34\x7f\x57\xf0\x3a\xf7\x08\xd2\xd9\xf9\x41\xd1\xb6\x66\xe6\x1f\x8d\x14\x07\xe5\xe2\x94\x7d\x50\x9a\x17\xb2\x88\xb3\xdc\xa6\x80\x4e\x0b\x8a\x8c\x18\x0f\x9c\x9f\xb8\xc4\xd9\x3d\xd0\xb4\x20\xa5\xf8\x75\x33\xa9\xdd\x7c\xde\x19\x30\x7b\x06\x00\x20\xf0\xd4\xe3\x1d\x0a\x49\xe0\x74\x40\xac\x47\xf5\x56\xad\xab\x77\xe5\xb8\xb4\x0f\x7b\x69\xee\xf8\x58\x94\xb3\x37\xc5\x09\x44\xce\x48\x16\x64\x17\x1c\x1d\xc4\x35\xcb\xb8\x41\xd1\xf9\x5f\x5a\x62\x7e\x3e\x34\x1c\x6f\xcf\xd2\x1a\x44\xee\xc1\x9e\xac\x0f\x66\xb5\x2d\xd1\xe9\x66\x0e\x7a\x8c\xf3\xd0\xd7\x80\x93\xf7\x77\x87\x1b\xbc\x5c\x1f\x2c\x72\x70\x2e\x94\xae\x1a\x18\xbc\x2f\xe0\xf9\xa6\x8f\x62\x69\x67\xd9\x07\xfe\x97\x40\x6b\xce\xec\x5a\xd8\x85\xf3\xac\x5b\x38\x20\xb2\x2e\xdf\x9a\x16\x31\x68\xc8\xb8\xbe\xaf\x88\x82\x82\x77\x4a\x54\xbb\xf5\xfd\x64\x57\x7b\x4f\xaf\x39\x20\xe8\x5e\x41\xfa\xfa\xa9\x7d\x43\xf7\xe4\x9f\x80\x9d\x3d\x77\xb8\x96\x31\x04\xc1\x03\xb5\xda\x71\xf7\x78\x80\x0f\xc2\x79\xb2\xa7\x82\x17\xd0\x1e\xc0\x61\xaf\x5a\x6d\x62\xbc\x0c\xa2\xa9\xf9\x6e\x0a\x34\x0e\x5c\x35\x4f\xb0\x75\xd2\x61\x71\x03\x9d\x35\x40\xe1\xfa\x04\xb7\xda\x7b\x07\xce\xab\xbe\x64\xc9\xe1\x6b\xdf\x6b\x4d\xd4\xcf\xa5\x1e\x1d\x8d\xf9\xab\x71\xab\x8f\xdb\xe4\xa1\x5a\xa1\x68\x7c\xc4\xcc\x71\xa1\xef\xc0\x4c\xe4\x2b\x11\xe5\x0a\x89\x63\x4c\xaf\xf3\x5a\x38\xb6\x6c\xe6\xb7\x3f\xfe\x80\x5c\x3f\x84\xfc\xa5\x39\xd0\xcc\x32\x56\x85\xff\x6d\x17\x02\x24\x49\xb5\x16\x2c\xf8\x1a\xbc\xeb\x65\xd3\x86\x01\xf6\xae\x10\x8f\xcb\xec\x9e\x1f\x06\x00\xa1\xeb\x60\x97\xeb\xed\xbc\x5f\x87\x5d\x0f\xb8\xc2\x5e\xca\xd7\x00\xc7\x8a\xdb\x49\x38\x67\xd7\x21\x26\xb3\xb9\x62\x44\x6c\xd7\xec\xf3\x13\x57\x26\xbc\xb5\x7b\xf8\x88\xb7\x66\xc5\x09\x3b\x35\x5e\x75\xfd\xa8\xa5\x36\xc8\xcd\x3f\xe2\xa7\x71\xff\x00\x60\x82\x56\x7d\x7b\x30\xc4\xae\xbe\x77\x34\x94\xf8\xde\x35\x7c\xb5\x96\xeb\x62\xcb\x1d\x89\xf5\x41\xb5\x16\x84\x15\x4a\xa8\x6b\x98\x18\x37\x3a\xc3\xb6\x57\x25\xc0\xbe\xf6\xe2\xfb\x44\xbe\x38\xd9\x29\x54\xd8\x36\xaf\xce\x37\x7d\x09\xb6\x9b\x4e\x40\x02\x76\x18\xeb\xe7\xa5\xc9\x1f\x42\x54\x9b\xc3\xf8\xa3\x26\xda\xf0\xe4\xc0\x69\xb2\xc7\xa1\x5a\x4d\xb0\x9d\x61\x15\xed\x03\x09\x49\x08\x61\xd2\xe9\x91\x98\xbd\x7d\xec\x00\xaf\xfa\x19\x48\x6f\x6b\xdc\xf8\xdb\xe2\x28\xec\x8d\xd8\x4f\xb7\xa3\xb7\x43\x30\xf6\x21\x2b\x48\xd4\xe7\x26\x10\xf5\x41\xc1\x02\xbc\x92\xcd\xd1\xe2\xc9\xb0\x3e\xaa\x0e\x0b\x61\x06\x32\x1f\x76\x17\x49\xda\xad\x7c\x2f\x31\x8d\x75\x88\xaa\xad\x9e\xc9\xbf\x55\xd5\xed\x5b\x9d\xdf\x5a\x72\x7e\x2f\x2d\x4e\x7a\xf3\x3c\xa7\x3e\xac\xc8\xa8\x44\x41\x00\x07\xe4\x97\x08\xa4\x1d\x14\x61\x6f\x24\x3c\x81\xce\xf3\x92\x5d\x73\x7f\x8e\x67\x6b\xf7\xb1\xc9\x02\x16\x36\x52\x85\x37\xda\x2e\xb9\x17\x77\x1a\x45\x3e\x0d\xf3\x4d\x09\x0a\x62\x36\xcd\xa3\x09\x95\xa1\xb0\x38\xdf\x5b\x11\x4e\x36\x43\xd5\xc4\x06\x1c\x91\x8c\x1e\xd4\xc1\x66\x73\xeb\xd6\x31\x4a\x1e\x46\x00\x4c\x36\x1f\xe9\xb2\xe5\x06\x32\x2f\x9b\x16\x5b\x01\x98\xac\x34\x5d\x93\x2b\xc0\xd9\xae\xf7\x2d\xfb\x29\x24\x71\x11\xd9\x74\xf3\x2f\x19\xd7\x9a\x67\x0d\xc9\x99\x49\x85\xd5\xad\x84\xc3\x6a\x2b\xa3\x5a\xf3\xb4\xdc\xc8\x42\x54\x97\x9c\xf9\xe6\x96\xde\xf3\x9a\x19\x7b\xbc\xd9\x25\x0c\x7a\xf6\x7e\x23\xae\xcd\xe4\x4e\x00\xd7\xfe\x01\x06\x2d\x92\x80\x7d\x0e\xb4\xf6\x84\xd6\xb6\x6a\xc0\xfa\x05\x97\x0a\x02\xde\xb2\x90\xbb\x58\xc6\xf7\x44\x22\x6c\x5c\x11\x94\xd0\xbf\x8f\x9f\xdc\x4b\xc5\x23\xb5\xeb\x5f\x17\x3d\x57\x53\x8a\x57\x0f\xfa\x99\x95\xba\x81\xdb\x83\xcf\xfb\xc3\x41\x5d\xeb\x85\xf7\x13\x65\x34\xe0\x7e\x69\xb4\x74\xba\xcd\x5f\x2b\x7d\xfe\xed\x6a\xfb\x55\xb4\xc6\x16\x8b\x3b\x74\xb4\xb2\x4c\x7b\x6e\x9c\xe8\x07\x1b\xe3\xf8\xf1\x03\x72\x60\x78\x35\x9c\xcb\xbd\x7f\x70\xb9\x75\x5b\x1d\x21\xa6\x67\x39\xef\xc8\xd3\x21\x23\x7b\x2f\x75\xa8\xa1\xe8\xed\x54\xee\x35\xf4\x4f\x51\x42\x02\x26\x4d\xe9\x7b\xb9\xbf\x98\x9f\xc1\x0d\xd1\x03\x6c\x1d\x7a\x9b\x6d\x89\xfb\x88\x42\x84\x35\x6e\xf7\x20\xc4\xd6\x88\x48\x01\xf4\xa6\xb9\xbe\x3b\x25\x82\xa1\xd0\xed\x95\x80\x35\x2b\x4c\x4c\xdd\xdc\xb2\x64\x56\x90\x61\x47\x87\x88\x5b\x7b\x3c\x54\x0c\xe2\xb6\x49\x43\x7f\x67\xed\x27\x6f\x51\x49\x78\x4b\x89\x1f\x64\x78\xeb\xb4\xbd\xf4\x7c\x6b\x7a\x73\xf9\xed\x73\xc8\x8f\x5a\xfa\xd7\x7b\x47\x68\x4b\x72\xab\x81\x03\x1e\xd1\xa4\x00\x81\x6b\xe6\x21\x6d\x15\x87\x7b\xfb\xd4\x91\xa8\x69\xa6\x1d\x7d\x09\x77\xfb\x59\x17\x95\x4f\x86\x47\xe8\x72\x43\xfb\xd0\x00\xec\xf6\x04\x6d\xe8\x48\xf5\x51\xf8\x78\xe4\x51\x64\x8d\x80\x94\x94\x58\xb9\x7d\xe2\xec\x2d\x81\x02\x27\xd7\xd4\xb7\x37\xad\xb9\xa1\xb9\x15\x32\xe3\x46\x0b\x85\xdc\xec\xae\xcd\x49\x27\x14\x81\x8d\x66\x09\xcd\x6e\x86\x82\x2f\x37\x6f\x76\xd1\xc7\x0e\x12\x38\x5e\x13\xd5\x6d\x56\x42\x55\x39\x69\xd7\xf6\xaa\x07\xfd\x3d\x31\xf2\x42\x2c\xf4\x31\x47\xe3\xc3\xea\xcf\xa8\x22\xac\x45\xc4\x27\x1a\x06\x5b\x1a\xf5\x4d\xb4\x75\x44\x03\x3b\x47\x1c\xfa\x9f\x6b\x14\xbe\x82\x21\xce\x87\x1e\xf6\x5e\x14\xb2\xa1\x02\x37\xf1\x0b\x4f\xce\xfb\xfe\x01\xc9\xdb\xb1\x15\x04\x19\x66\xc8\xb2\xe6\x7b\x46\x5b\x0b\x19\x40\x3c\x42\x7b\x16\x4e\xe5\xe1\x99\x69\xaf\x69\xbe\x1a\x7d\x7c\x8e\x4d\x3b\x5a\xbc\xd9\x0f\x85\xdc\x79\xb2\x61\x18\x9c\xf8\xbe\x2e\x31\xc6\x1b\x73\x57\xb4\x59\xe5\x77\x55\x07\x35\xa4\x88\xee\xa8\xf0\x99\xf9\xb4\x47\xd5\xaa\x0f\xb8\x7f\xfe\x00\x22\xe0\x96\x3f\x7a\x41\x69\xfe\x3f\x33\xfc\xee\xd6\xdd\xbb\xbd\x15\x51\xc3\x2c\x7f\x0f\x59\x99\x3b\x35\x3c\x20\x95\xdc\xe9\xe5\x76\xda\x12\x4f\x4e\x3a\x38\x4c\x60\x72\x60\x57\x86\x5c\x4b\x98\xdd\x0f\x7e\x55\xb0\xab\x23\xe9\xfc\x3c\x16\xde\x79\xbb\xac\x1a\xe6\xab\x4f\xa4\x79\xee\x0f\xf6\xf3\x91\x54\x37\xf0\x5d\xaf\x0f\x9d\xfa\x83\xdf\xd8\xda\x61\x0c\x63\x67\xb8\x76\x2b\xf0\xcc\x3a\xe6\xfb\xdb\xd4\x7b\xc7\xf5\xdb\xbe\xab\x3b\xb7\xf2\xbd\xe7\x32\x37\x40\x79\x5e\xbd\x1a\x5b\xdf\x50\x7e\x71\x23\xb5\xff\xb1\xe6\x7a\x49\xa9\xd0\x0c\x4f\x69\xb7\xe9\x1e\x5d\x15\xb3\x95\x38\xbe\x5e\x3b\x18\xd6\xc5\xcd\xa5\x3b\x9e\x97\x66\xcf\x68\x38\xe6\xe3\xb6\x5b\x40\xef\xda\xf2\xf9\xd6\x0b\xda\xe6\x30\x4e\xff\xea\x7d\x52\x72\xd7\xea\xa3\x75\xde\x6a\x74\xac\xb9\xea\x09\x20\x89\xad\x8a\x52\xab\xd4\x4a\x8f\x96\xb1\xbd\x2a\x4d\x05\x53\xef\x08\xac\x75\xaa\xa4\x7d\xd7\x8e\x3d\x21\x6b\x9c\xbf\x78\x8b\xcd\x22\x70\x63\x65\x48\xd9\x5a\x3a\x4d\x34\x78\xbe\xe6\x57\x24\xcb\x99\x49\x4d\xc8\xb0\x13\xb5\x48\x3f\x8b\x6d\xc1\x3e\xc9\xad\xbb\xe6\xdf\x36\xfb\x8a\x59\xd6\x78\x40\x6c\xb9\x9f\x95\x0f\x75\xbf\xea\xee\x0f\xfc\x2a\x14\x9d\x35\x1d\x1c\x01\xcf\x8f\xbd\xa3\xd2\xf9\x40\xac\x72\x9e\xae\xd6\x5b\x23\x20\xc2\x7d\xce\xe9\x63\xdc\xc8\x66\x70\x7f\x48\x08\x3b\x42\x98\x62\x0d\x45\xef\x35\x11\xe6\xb9\x92\x74\xb4\xa6\x87\xbb\xcd\x97\xb7\xf5\x47\xf7\x81\x35\xf2\xf2\x9e\x95\x5b\xb2\xbc\x9d\x93\xfa\xe5\x28\xf4\x32\xdf\x30\xf4\x00\x8c\x8b\x61\x7e\x3a\x52\x81\xb8\x74\x61\x91\xaf\x53\xdf\x1e\x5a\x6e\x1c\x02\x68\x5f\xc7\x33\x68\xe9\x7b\x90\xb5\xcc\x24\x99\x75\xb9\xe6\xd7\x3d\x73\xb6\x56\x40\x3a\x02\x6b\x6c\xf5\x42\x0d\x4e\xf3\xf5\x93\x3d\x93\x74\x89\x81\xd3\xe5\x1a\xe0\xf6\x1a\x63\x59\x87\xac\xab\xb0\x7b\x47\x76\x61\x0d\xb9\x20\x8b\x3b\xcb\xc0\x47\x72\xa3\xbd\x8b\x5a\x6e\x06\xc7\x7e\x96\xea\xd1\xd7\xda\x06\x11\xeb\x7c\x02\x85\x58\x77\x0b\x83\xa3\x34\xd8\x81\x72\xca\x7a\xac\x63\xa6\xce\xbe\x42\x5f\x99\x3b\xd8\xef\x7c\xbc\xa5\x2a\xd2\xc8\xc7\x61\xde\x61\xc4\xea\x78\x03\x56\xd6\x72\x28\xec\x49\x8c\xf5\xb5\xa2\xbd\xfd\x97\x55\x18\x29\xbb\x03\x93\x2d\x09\x8c\xe4\x4c\x14\x46\x35\x33\xed\x9a\xea\xd8\x1f\xfe\x91\x04\x9e\x5d\x79\x35\xa0\xb3\x5f\xbc\x0a\x3d\x2f\x94\x8f\x45\xea\x28\xca\xf9\xf7\x9b\x88\x7e\x2f\xcc\xc7\x27\xaf\xbd\x5d\x19\x7b\xce\x4e\xc7\xb6\x2e\x40\x5b\x7c\xf6\xab\x38\xef\xe7\x22\xbf\x62\xf9\xbf\xc8\x0a\x8c\xe5\xef\x11\xa9\x62\x85\x0f\x67\x8b\xe8\xee\x45\x5e\x09\x10\xde\x35\x82\xee\x0e\xa9\x67\xd9\x4f\xd9\xcb\x7d\xa0\xeb\xf0\x42\x2a\x25\xd7\x97\x93\x6b\x29\x33\xc4\xb8\x2a\xe5\x2c\x1c\xfb\xde\x44\x56\x96\x32\x5e\xc8\x69\xaa\xb4\xf7\xfb\x8c\x00\x0b\xe3\xa5\xb1\x2e\xc3\x25\xa1\x4f\xd8\xae\xaf\x4b\x7b\xe7\x28\xff\x82\xf1\x1c\x6d\x7c\x48\xdc\xac\x53\xde\x61\xa1\x39\xeb\x5d\x23\x16\x26\x7b\xe0\x98\xd1\x63\x5f\xd2\x41\x11\xab\x0b\x50\x5d\xa4\xb7\xef\xfd\xa5\x24\x1e\x6b\xfa\x5f\xfe\xa6\xc2\x88\x39\x0a\x6c\x35\x8b\x41\x99\x0b\xc2\x65\xed\xa5\xd5\xef\xcb\x42\x7e\x3b\xc6\x64\x38\x67\x6e\x3c\xdb\x25\x8f\x89\xae\x1e\x58\x7b\x92\x31\xbb\xc3\xd7\xe3\x18\x16\x75\x2e\xac\x65\x73\x31\x1a\x0a\x5c\xd9\x5f\xfd\x16\xc0\xd9\xc5\x19\xd2\xf0\x71\x1d\x6a\x2d\x2f\xfd\x8a\x98\x21\xbe\xd0\x3d\x12\x5b\xa7\x37\xbd\xc9\x4b\x7a\x6f\x6c\x5c\x9a\xc5\xe0\xa5\x25\x5d\x9a\xb6\x78\xda\x25\xb5\x20\x75\x0c\x36\xbd\xc3\xd0\x9c\xbb\x6b\xb7\x24\x75\x30\xc9\x82\xe7\x1e\xa0\x15\xbd\x04\x24\x7d\x77\x61\x4f\x99\x59\xcd\x55\x04\x8d\xea\x09\x43\x93\x32\xc8\xf2\x30\xd5\x0c\x5b\x3c\xa6\x6d\x0f\xd3\xbe\xfa\xf4\x52\x7a\x81\x53\x57\x7f\x89\xc3\x58\xfb\x00\xae\xaf\x4c\xbc\x5c\xd2\x22\xce\xfa\xec\x9f\xc8\x78\xbc\x31\x50\xb0\x24\xb1\xea\x67\x40\xa9\xfb\x49\x6b\xce\x1e\x79\xa9\xdd\xcc\xa9\x68\x47\x4f\xeb\x0f\x6a\x89\x9f\x1c\x51\x60\x0b\x94\x1f\xf4\xea\xdb\x64\x11\x69\x1f\xc7\xc4\x1b\x09\x98\xca\x4c\xe2\x92\x00\xf1\x3a\xc9\xd1\x29\xcf\x4b\xca\x33\x6a\x29\x5e\xb1\xa1\x67\x85\x17\x6a\x3e\x80\xc5\x5f\x9c\x3e\xd2\xee\xe2\x53\x9a\x9d\xf8\x00\x26\x4f\xc0\x58\xbe\x39\xfa\xbe\x7c\xe3\x5b\xc2\x4b\xeb\xcd\x3b\x5f\x1a\x1c\xef\x5d\xc8\x73\xf8\xc1\x56\x37\x14\x65\x39\x5f\x8b\xc0\xee\xae\x3a\x13\x20\xf1\x10\xc8\x98\x2f\x0a\x77\xcf\x8a\x30\x17\x28\x5e\x2c\x70\xa4\xfb\x53\x6e\x64\x8e\xc1\x7b\x33\x14\x75\x3e\x57\x0e\x4c\xcc\x80\x45\xf8\x94\xa4\x33\x9b\x72\x68\x67\x6e\xb0\xc5\x19\x48\xa0\xf0\x21\xcf\x55\x6d\xfa\xb9\x16\xad\x88\x71\x60\x0e\xef\xb3\x6d\xa7\xd6\xd4\x6c\x2d\x2f\x2e\xa8\x64\x6d\x37\x76\x5a\x9d\x42\x71\xe6\x9a\xd8\xdd\x77\x19\x1a\x1e\xa3\xb5\xf7\x2f\x49\xc9\x3b\x68\xfe\xe2\xef\xeb\x93\xe3\x19\x4d\x4c\xdd\xf1\xf2\x52\x79\xd4\x8c\xd1\x61\x9d\x5f\xc2\xcc\x07\x8a\x1d\xba\x03\x49\xa3\xad\x28\x34\xdd\x52\x14\x3c\x47\xf6\x8b\xbc\xf9\x90\xa0\x71\xbe\x8c\xb0\xf7\x09\x2e\x35\xce\xfc\x74\xb9\x59\xb3\x93\x2e\x4d\x7b\x41\x30\x0a\xca\xb7\x6a\xce\x91\x40\x0d\x8b\xdc\xf3\xe0\xe8\xcd\xd9\x23\x84\xf9\xbc\x5b\x47\xec\xef\xab\x41\xe6\xf9\x3d\x9a\x51\xab\x04\x94\x9f\x76\x03\xdf\xbb\xf6\x19\x0c\x40\x51\x8f\x30\xfc\xf3\x39\x5b\xa7\x92\x18\x96\x39\xbd\xde\xf1\xca\x9b\x1d\xae\x40\x33\x3d\xcf\x4d\x05\xeb\x10\x88\x1b\x7f\x59\x67\xdb\xbb\x6a\x33\x2a\x12\xfd\x7c\xee\x8d\x42\x1f\x4d\x12\x8f\xd0\xa6\xa1\xcf\xde\x6c\x8d\x36\xea\x18\x24\x17\x2c\xd5\xba\xb1\xbf\x67\x8e\x21\xac\x99\xe9\x0c\x33\x34\xfc\x7d\x0a\xb4\xd8\x65\x4d\x2d\xd2\xf2\xfb\x69\x7f\xdb\xe7\xdf\xcf\xde\xd1\xf5\x7e\x60\xdf\x9e\x77\xcf\x37\xe1\xdb\x5f\xde\xe7\x2b\xd1\xb9\xfb\xbc\xfe\x20\xff\xe1\x56\x38\xb7\x9e\xfb\xd5\xff\xbd\x35\x98\x6c\x4d\x17\x86\x4c\xd3\x7e\xda\x42\xe4\xd7\x5b\x7b\xd4\x19\xf5\x15\x55\x3c\x81\xef\xf5\x7a\xa4\x7f\x6e\x58\x9d\x27\xcc\xba\x75\x45\x9c\xfa\xbe\xd6\x7f\xd1\x6b\x07\xdd\x3e\xd9\x06\xb4\x83\xb5\x48\x82\xde\x19\xf7\x7e\x00\xb3\x47\x4e\x58\x5d\x29\x60\x83\x7d\x63\xc5\x98\xb7\x35\x39\x63\x05\x81\x93\x74\xfa\x96\xd8\xf8\x04\x9c\xba\x0c\xb2\xe7\x3b\xe0\x12\xb4\xfa\xd4\xf4\xad\x41\xa0\x67\xcf\x9e\x58\x7a\x52\xeb\x27\x5d\x6d\xeb\xe9\x78\x52\x15\xcd\x25\xda\xcf\xcf\xfc\x2b\x26\xfd\xaf\xa2\xeb\x9f\x79\x7d\xf3\x7e\x3e\xf3\xa8\x17\x11\x01\x0f\x87\xba\xa0\x4f\x08\x01\x69\xdd\x44\x72\x3f\x38\x10\x4f\xa2\xe8\xd1\x3d\x1d\x2e\x9a\xb1\xe7\x04\xe1\x4d\x3f\x5e\x5c\x73\x62\xf1\xad\x3e\x9f\xf5\xeb\xe8\x0d\xe5\x9f\xeb\xb7\xf8\x64\x47\x2b\xa5\x6f\xdd\xc8\x9f\xeb\xe7\xed\x18\x4f\xb7\x07\xc7\xfa\xfe\xd4\x48\x37\xfa\xa9\x52\x27\xf9\x71\xbd\x75\x36\x3f\x7f\xc4\x4a\xf9\xa9\x6a\x9c\xff\xc0\x6d\xa8\xc5\xa6\x35\x3e\xd8\x3f\xd6\x26\xf3\xad\xd9\xf7\x8d\xd5\xf9\x8f\x23\x55\x65\x71\x19\x75\x18\x6c\xea\xfd\xb3\x9f\xbc\xfe\xf9\x03\xf7\x83\x54\x06\xb1\xef\xf3\xca\xed\x58\x9d\xad\xd7\xf6\x87\x5a\xf6\x3f\x79\xc0\x67\x9d\x30\x7d\x0c\x20\x69\x7c\xfe\x27\xbd\x85\xe7\x8f\x34\xe1\x9f\xb4\x2f\x59\xa0\x7c\x06\x27\xfe\xa4\x51\xa0\x7d\xeb\xf1\xda\x4b\xe4\x0f\xd5\x8f\xc0\xbf\x98\xba\x02\x29\x0f\x2e\x45\x35\xf9\xe3\x99\xf3\x3f\xae\x33\x02\x67\xab\x53\xea\xaf\xc5\x79\xee\xe0\xa2\x07\xc1\x7d\x87\x04\xf0\x2e\xde\xbd\x28\x40\xe0\x9b\xbf\x55\xe6\xc8\xa8\x78\xe7\xfb\x7f\xd4\x6b\x51\xfc\x18\xa5\x03\xa5\xdf\xaa\xf2\xb1\x09\x88\x59\x33\xf2\xd7\x63\x53\x30\x98\x54\x3e\xf0\xfb\x57\x97\x6e\x9a\x3f\x65\x3f\x1b\x7d\xdf\xf5\x8c\xc3\x1d\xed\x64\x7f\x4e\x5b\xe6\x85\xc7\xc7\x51\x28\xc3\xcd\xe3\xd6\x13\x25\xd9\x3f\xb6\x9c\x15\x27\x4a\x6c\x7f\x59\xdb\x61\x5a\x11\x41\x0b\x7b\x14\x7a\x7b\x86\xee\xed\x01\xab\x32\xc6\x82\x63\x2c\x05\xd2\x4c\xac\x7f\x9c\xef\x66\xed\xd7\xf2\xd1\xfe\x76\xc0\xff\x18\xe0\xf8\x0f\xc0\xbf\xce\xc6\xea\x4e\xb6\xc1\x59\xe2\x31\xff\x38\x0b\x45\xe7\xa6\xbb\xc2\xfc\x17\xce\x1a\x35\x91\xcf\xc9\x1b\x84\xd2\x96\xf7\xd4\x8a\xb6\xef\x9b\x16\x07\xac\xff\xd1\x78\xfd\x21\xa2\x05\xbe\x7f\xeb\xb3\xa9\xc0\x23\xf1\xa1\xdb\x9b\xef\x6f\x7d\x75\xaf\xe4\xcd\x4e\x92\x37\x20\xee\x53\x0a\x68\x56\x84\xce\x95\x80\xf4\xf0\xea\xdd\x17\x67\x40\xe3\xe4\xad\xfb\x0f\x0c\x62\x58\x76\x3e\x6d\x75\x80\xf8\x3e\xe4\x0c\xd8\x15\xa1\x49\xa1\xd4\x7b\x49\x8c\xc0\x0f\x0d\xf3\x3f\xfc\xe7\x62\x13\xbb\xd6\x08\xff\xd7\xde\xce\xd9\x11\x52\x94\xfc\x6b\x3f\xdb\x33\xd2\x82\x8e\x34\xc7\xb5\xfc\x75\x84\x7d\x9d\xfc\x3d\xd0\x8e\x7b\xc2\xfb\xbf\xa4\x1d\x10\x17\xad\x2f\x7e\x08\x33\xd7\x49\xe4\xd2\xc7\x0d\x4f\x83\xed\x20\xf5\xba\x2e\xcb\x86\x20\x12\x6e\x62\xf1\x71\xc2\x36\x52\xec\xe5\x6d\x6f\xb9\xed\x28\x97\xa3\xfd\x54\x6e\xd1\x80\xcf\x21\x40\x2b\xd6\x23\xe4\x10\x16\x0c\x34\x49\x16\x1c\x52\x03\x42\x74\x22\x57\x2a\xf2\xed\xa0\x2c\x20\x9d\x02\x64\xfa\xb5\x96\x02\x8a\x8a\x6e\x81\xd9\x15\x2d\xd4\x5d\xfa\xb9\xc3\x78\x7b\x98\x88\xc2\x76\x49\x8e\xd9\xdb\x9d\xf1\x16\xce\xde\xde\xa0\x59\x3c\x1c\xce\xbe\x40\xee\x72\x80\x64\x81\x3f\x3d\xbd\x88\xe9\x1e\x77\xe7\xdb\x90\x14\xc1\x25\x85\x02\xab\xcd\x56\xcd\xa7\xfb\x0c\x2a\x04\xd0\x2f\xe6\x55\x99\xae\x95\x44\x7d\x6b\x81\xa6\x90\xcb\x84\x2e\x81\x20\x26\x66\xaa\x43\x0f\x91\x82\x30\x3c\x41\x5c\xeb\x5b\x27\x31\x06\x8f\x27\x29\xc3\x79\xce\x05\xd1\xe9\x68\x02\xf3\xd3\x37\x9d\x0b\x45\x0a\x3c\xfe\xd3\x26\xb3\xe0\xfe\x27\x89\xfe\x27\x07\x51\xa7\xaa\x37\xc9\x8c\x50\x02\xb0\xfa\x07\xac\xa5\x2f\x4a\x08\xc4\x4b\x0a\x1b\x14\x83\x30\x19\xd6\x08\x01\x98\x5b\xe0\x70\xaa\x4d\x08\x40\xf9\xaf\x53\x2d\xf1\x06\xbb\x8a\xc0\x4c\xb6\xd6\x54\xa3\x29\x3d\x49\xd9\x0d\xd2\x01\x45\x12\x03\xc2\x55\x4c\xcb\x22\xa1\x86\x22\x70\xcf\x54\x10\x84\x2f\x23\x24\x04\xd0\x8b\x61\xe3\x12\xb6\xcb\x43\x14\x72\xeb\xe0\xc2\x70\x3a\x8a\x56\x6e\xd5\x3c\xb4\x06\xd4\x84\x00\xda\xe0\x60\xa4\xdb\x94\xdf\x83\xc7\x24\x4c\xd6\xda\x26\xf5\xdf\x7a\x84\x0a\x4a\xa4\xcc\x00\x1f\xe2\x09\xae\xbb\x6d\xc2\x10\xb5\x3f\xac\x56\x76\x42\xbd\xb5\x76\xad\x2d\x4d\x90\xff\x12\x03\x7f\x32\x69\x31\xec\x6a\xca\xf3\xf6\xd1\x03\xb6\xe2\x72\xcc\x59\xbf\xcc\x13\xa2\x35\xbe\x3e\xb4\x08\xdc\xd6\xcf\x31\x1d\x06\xee\x51\x9d\x30\x57\x17\xe8\x24\x72\x6f\x85\x4d\xc7\x99\x42\xde\x01\x81\x9a\x27\x9b\xe2\x6e\xe7\x58\x72\x50\x64\x9c\x64\x08\x74\xab\xd2\x2b\x06\x55\xa6\xf4\xeb\xcd\x54\x9b\x46\x04\xd5\x94\x24\x1f\x48\x89\x01\xee\x2a\x1d\x9c\xb3\xff\x66\x31\x19\x5d\x61\x80\xd3\x81\xda\x41\x93\x34\x36\xd2\xaa\x4d\xae\x47\xa5\x28\xc0\x3a\xae\xec\xa0\x7a\x54\xdf\x19\xbb\xc6\xad\x6d\xb3\xd9\x60\x98\x62\x9c\x25\x9a\x7e\x13\xc8\xb1\xa7\xcc\x19\x72\x61\xd0\xa3\x5c\x55\xac\x5c\xf4\x6e\x9d\xb8\xec\xa3\x4f\x27\xc9\x0b\x50\xe9\x02\x39\x2a\x83\x7b\x08\x70\x81\xc7\xb7\x1c\x9e\xe3\xa5\xb3\x19\x2f\x6f\x7a\x8f\xe8\x82\xb2\x3c\x7b\x0b\x7c\xe4\xe0\xf0\x88\x18\x92\x99\x81\xe8\xd6\xb3\xfa\xa5\x34\x81\x3d\x2f\xe8\x9d\xaf\x2c\xec\x71\x36\x66\x5b\x57\xc4\x9a\x8d\xa4\xda\xef\x17\xd2\x5f\x76\x99\xcc\x82\x87\x85\x70\xa2\x10\x13\x88\x0c\xf8\xd1\x75\xc3\xbf\x24\x41\xa0\x95\x2a\xbb\x45\x23\xf9\xa4\x63\x0c\x29\x9b\xc1\x10\x49\x33\xec\x30\x86\xa2\x6d\x95\x47\x50\xfb\x19\x32\x27\x73\x98\xab\x76\x9d\xc9\x2e\x30\xc3\x1a\x52\x6f\x5a\xa9\x89\x20\xa4\x5f\x47\x37\x71\x2d\xbb\x1b\x4f\xcf\x26\x18\x11\xb4\xc3\x65\x15\x08\x3c\xba\xec\xac\xcc\x2b\x14\x16\x5c\x99\x89\x07\x52\x01\x81\xa2\x31\x86\x66\xc1\x43\x47\x56\xe7\x61\x61\x48\x03\xcc\xbc\xee\x95\xdb\x29\xc4\xd2\x8d\x4d\xe5\xc0\x61\x9f\xef\x91\x21\xdd\x2a\xe6\x56\x4c\xdf\x97\xba\xc5\xe3\xac\x1b\x05\x72\x7c\x34\x5f\xa0\x55\x30\x4a\x04\x72\x04\x9c\x4f\xe8\x77\xb3\x17\x7f\x72\xcc\xe8\x45\x7b\x1b\x5d\xc1\xc8\xcf\x01\x4d\x6a\xd6\x5a\x66\x32\x88\x60\x2c\x4a\xd5\x1d\x43\xeb\x7a\x54\x23\x7b\x2c\xe0\xd8\x71\x54\x75\x9c\xa0\xbc\x49\x39\x87\xc9\xe6\x79\x5d\x36\xe2\x91\xe6\xaf\x8c\xab\x1a\x73\x3c\x0e\x7a\xae\xc7\x08\xc1\x71\x1b\xec\x19\x8d\xdc\x8c\x08\x3e\x9e\x65\x45\x20\xc2\x98\x5d\x5e\x07\xa8\x3f\x7e\x34\x47\x04\xf1\x15\xaa\x21\x54\xc5\x5f\x24\x7f\x0e\xf1\xdd\xe2\xd4\xeb\x31\x20\x25\xcf\xf8\xc5\x75\xe4\xa8\x55\x81\xf4\x9a\x7b\xa4\x4b\xc5\x2c\x7b\x40\xe3\xde\xcd\xb9\x63\xff\x60\x4c\x7f\xa8\x74\xad\xbd\xe2\x27\x9a\xde\x92\xbc\x48\xed\x21\x48\x72\x7a\x87\xb0\x02\x4d\x46\x8d\x43\xcc\x4c\x57\xdc\x15\x16\x69\x24\xcd\x90\x3f\xd7\xbe\x1e\x1e\xde\x35\x2a\x51\x0d\xd3\xb9\x19\xac\x3e\x46\xa5\xac\x8d\x2d\x92\x1e\xde\x84\xd9\x9d\x94\x66\x39\x6a\x87\x15\xda\x98\x34\x4a\x34\x26\xd6\xab\x23\xe3\x37\x1e\x97\xeb\x93\xd2\xd5\xfe\x60\x18\xd1\xe3\xda\x83\xba\xfa\x68\xa0\x38\x58\xd2\x2a\xb8\xd6\xe7\x5b\x3d\x35\xb3\x07\xc2\x81\xf4\xcb\x90\x3e\x59\xea\x0f\xab\x41\x76\x6f\x94\x3e\xec\xc2\x2c\xf5\x74\x3f\xf2\xe3\xd2\xcd\x40\x94\x22\x0f\xfb\xd1\xf4\x49\x30\x66\xe2\x8e\x76\x1f\x3c\xf1\x7a\xec\x81\x70\x5f\x1e\xc4\xfe\xd1\x98\x79\xec\xd6\xaf\xb7\x7f\x34\x2b\x35\x20\x10\x87\x10\x12\x0f\x15\xae\x34\x6f\x2b\x9b\x3d\x6a\x03\x88\xed\xd7\xea\x25\x22\x86\xd8\xa6\x96\x65\xf7\x2a\xa2\x8b\x50\x92\xc2\x03\x06\xf5\x86\x50\x5c\x84\xbc\xc4\x5c\x93\x46\x8b\xbd\x94\x42\xc2\x0a\x7a\x13\x22\xbf\x3c\x20\xf4\x94\xfe\x84\xf2\xc7\x61\xef\x1f\x61\xa6\x90\xa0\x78\xda\xa5\x96\x40\xc2\xee\x5b\x90\x2e\x01\x0a\xd6\x22\xd0\x21\x25\xc1\xa5\x1e\xb5\x25\xf3\xd3\xbb\xa2\xa5\xeb\xbe\xde\xe3\x86\xad\xc4\xa3\x91\x4a\xc5\x5d\x6a\xce\x1e\x2f\xac\xb1\x85\x31\xe2\x03\x21\x54\x71\x4e\x3e\xb0\xfc\x25\xb5\x0a\xbf\x00\xd0\xaa\x50\x9a\xed\xe3\x6e\xf0\x50\xb7\xa2\xd9\xcf\xb0\x12\xf5\x22\xa4\xac\xf2\xf0\x6c\x98\x30\x05\x0c\x7c\xcc\x1f\xe3\x98\x2e\x76\x21\x54\x9a\xd9\xbe\x47\xe4\x54\xb9\xc2\x03\x67\xe6\xc2\x70\x77\x2d\x93\x87\x90\xc0\x81\x8d\xd6\xca\xc5\x1f\xd2\x5b\x5b\xf4\x76\x8e\x4d\x5e\x2d\xd1\xe0\x31\xb7\x34\x0a\x17\xb8\xe8\x92\x36\x90\x9a\xbc\x46\xc3\x94\x3e\x66\xbd\x5b\x8f\x72\xa8\x83\x02\x58\x8a\xce\xa2\xec\xf1\xa3\xc7\x24\x3b\x68\x02\x76\x3b\x3e\xb3\xbb\x6b\x0c\xab\x50\xa3\x03\x4f\xd9\xfe\x11\x7a\xfc\xf0\x70\x9a\xac\xdf\x24\x45\x51\x80\x0c\x56\xd8\x27\x0a\xca\xd1\x46\x48\x2e\x5b\x34\x8f\x0f\x97\x27\x9a\xc9\xbd\x1e\xca\x92\x1f\x83\xb7\x35\x1e\xa5\x8b\x44\x82\x07\x1c\x9c\x5e\xed\xb3\x20\x37\x03\xc4\x31\x78\x8b\x20\xab\xe6\xbf\x21\x32\x7b\x97\xc1\xee\xcf\xc3\x83\xa8\xdf\x5c\xcc\xba\x8b\xbc\x06\x94\x9a\xfa\x92\x66\x46\x3f\x79\x3e\xf6\xc3\x73\xd7\xb8\x93\xfc\xa9\x93\x01\xf5\x99\xea\x75\xe7\x23\x11\x8c\x63\xd3\x5e\xe7\x61\xb5\xaa\xea\x31\x33\x73\xa4\xf9\x41\x40\x21\x1d\xef\xf6\xcb\x9a\x5a\xec\xfd\xc3\xf9\x59\xbc\x5e\x56\xe3\xa9\x06\x43\x8a\x20\xef\x75\x62\x67\xe1\x91\xe2\xbd\xcf\xff\x90\xd0\xcf\x95\xa5\x91\xe1\xc7\x45\xdb\x37\x64\x26\xfd\x0c\xed\xa7\xe9\xba\xe5\x23\xfe\x79\x8b\xfa\xa3\x98\xa4\xe7\x9a\xff\x21\x5c\x50\x2a\x16\xff\x10\xe9\xa8\xd7\x2a\xff\xeb\x43\xa6\x19\xe6\x4c\x03\x32\x3b\xfb\xbd\x8b\x14\x81\xf3\xf9\x57\xf9\xa3\x66\xf4\x21\x71\x02\xd7\x8e\xfc\x50\x6e\x36\xb0\x5a\xfe\x4d\x11\x3c\x0a\x7d\x8c\xd1\x45\xf7\x5c\xa1\x22\xc4\x2d\x22\x16\x3c\x1f\xde\x07\x95\xf2\x45\x8d\x9e\x1c\xd2\x31\xbd\x79\x96\xa5\x01\xe5\x49\x3e\xcd\x71\x93\xbd\x99\x35\xca\xf2\x43\xd9\xd7\xe3\x55\x18\x15\x90\x37\x30\xf3\xb7\x24\xc5\xdc\xbc\x79\x63\x9f\xfb\xdf\xfa\xda\xb4\x33\x22\xff\x05\x83\x71\x4b\xa0\xe6\x5a\xa1\x89\x6c\x4c\x7b\x70\x23\xf3\x7a\x5c\xda\xed\xea\xf9\xea\xc9\x4d\x3b\xe4\x90\x06\x59\x55\x0b\xe5\x75\x6e\x55\x0f\x42\xbb\x14\x39\x28\xb3\x9d\xfc\x0a\x21\x84\x58\x0a\xa9\x64\x6e\xf4\x7b\xc4\xd2\xb8\xde\xa0\x6b\x85\xac\x49\x83\xa9\xd4\xdc\xd0\x3a\xe8\x8d\x4b\xf0\x62\x41\x1c\x02\xaf\xdd\x62\xf7\xa1\x68\xe1\x2e\x4b\xff\x06\xca\x1b\xa1\x63\x81\xc1\x2e\x56\x78\xb9\x11\x84\x33\x52\x1c\x35\x30\x60\x76\xf1\xc9\x22\x47\x10\xd2\x78\xb7\x68\xa9\x60\xc0\x68\x95\x0f\x2e\xd3\x8d\xa1\xf9\x90\xef\x68\xf2\xcf\xcc\x90\xe2\x71\x5a\xbd\x25\x31\x10\x55\x5a\xd6\x2a\xe4\x60\x25\xd7\x1c\xbd\x21\x99\x43\xb4\x87\x12\x1f\x5c\xe1\xd1\x64\x2f\x73\xf6\x08\x29\x48\xbf\x1c\x9a\xc6\x51\xc4\x37\xd9\xf5\x3d\x10\x35\xea\x36\xc9\x89\xdc\x03\xc9\x62\x19\x92\x5f\x43\xa3\xb2\x63\xac\xb7\x53\x0f\xcf\x2e\xfe\xcb\xc3\x90\xf3\xb7\x64\x3b\xc2\x93\x36\x5c\x6b\x27\x34\xe0\x70\x2d\xcb\xb3\x6e\x0f\x37\x47\x06\xcd\x0f\x40\xe1\x94\x83\x1c\xfb\x26\x0b\x33\xd8\x3d\x44\x1f\x84\xab\x59\x07\xe2\x29\x0d\x8f\x5d\x03\xe8\x03\x20\xf2\xf7\x02\xd5\xbb\xe2\x36\x65\x58\x2b\xd4\x38\x62\xca\x63\x35\x2b\x42\x59\x86\x5d\xb8\xfa\x41\x34\x61\xda\xe9\x2f\x4b\x88\xe3\xe5\x8d\x7f\x4c\x85\x43\x87\xb9\x85\x1a\xc7\x2b\xd1\xed\x08\x31\x0e\x9f\x44\x56\xa9\x3d\x8c\x35\xc0\xc8\x43\x85\x6a\xdf\x2e\x2b\xcf\x63\xc0\xa1\xac\xa8\x85\xef\xcf\xb2\xe4\x3a\xb8\x53\xff\xc4\x20\xcc\xb2\x89\x73\xd4\xdf\x26\xd0\xb1\xe6\x71\xe2\x62\x4b\xe1\x44\x1b\xfb\x71\xf1\x89\xda\xd3\xdf\xa9\x6f\x30\xa4\x38\x56\x5d\x4f\x37\xfd\x26\x43\xa7\x86\x42\x27\xe5\xf2\x1c\xa0\xe3\xc3\xfe\xa2\x58\x07\xde\x20\x06\x7e\xa0\x44\xc9\x21\x2e\x76\x1c\x45\x5e\x33\x88\x77\x5c\xdb\x79\xdc\xe6\xbd\x90\x47\xce\xfb\x5a\x29\x54\x38\x3c\x7e\x8e\x92\x2f\x05\xa9\xcc\x71\x5c\xc7\x82\xb7\x6c\x5f\xda\x46\x59\xfe\x0a\x59\x0f\xba\x1e\x61\xc3\xc3\x55\xea\x7a\x2f\xe9\x9e\x82\xdc\x4e\xeb\x08\x09\x52\xde\x70\x17\xfe\xb0\xdf\xd9\x71\xf0\xa2\x7d\xb0\x18\x27\xec\xa5\x59\xee\x29\xc8\x80\x1c\x77\x92\x12\x8a\x4d\x80\xa1\xec\x67\x89\xab\x85\x80\x37\xf4\x58\xbe\x28\x10\xc2\xad\xc2\x47\xc9\xb5\x46\xae\xf0\x68\xbe\x5d\xd8\x52\x97\x29\xc4\x9f\x0d\x76\x97\x5f\x59\xcb\x87\x1c\x1a\xac\x18\xd9\x1b\xbc\x3f\xd4\xe5\xb0\x27\x45\x6e\x9b\xdd\xb5\x5b\x95\x5f\xa9\xe9\x83\x28\x4a\x12\xea\x20\xa5\xd5\x24\x90\x05\x69\x42\x2e\xf0\xa0\x9e\xb7\x15\x2f\x65\x3e\x53\x7b\x20\xa8\x2d\xa0\xcb\x2a\xc9\x90\x50\xbb\xc0\x45\x8d\xd4\x01\x24\xde\xc7\xb9\xe5\xbd\xe5\x17\x0c\x79\xbb\x4e\x39\x2f\x07\x8e\x48\x48\xe5\x24\xbb\xd3\x44\x32\x22\xb1\x6c\x91\x8a\x09\x3c\xc7\x49\xfb\x5c\x43\x9b\x0a\x82\x22\x7e\x0f\x63\x0b\x0b\xdf\x3a\x0c\xb5\x7a\x8f\xa0\xcd\xb7\xf7\x42\x9f\x9c\x21\xcf\x3a\x41\x10\x16\xa5\xc6\xe1\x29\x58\x4a\xc7\x80\x8a\x48\xaf\xd7\x97\xa2\x20\x3c\x54\x77\xa5\x87\xfb\x16\xc5\xee\x2b\x44\x41\x62\x09\xf5\xff\x87\x9c\xa5\x51\x63\xd5\xe2\xc7\x51\x74\xd4\x9f\xc9\xe9\x7f\xbc\x2a\x29\x44\x70\x12\xa3\x05\x87\x74\xe7\x4a\x0f\xa8\x21\x15\x07\x3b\xb8\x4c\xe5\x18\xf3\x9f\x1f\x62\xa1\x83\x2b\xe7\xc7\xab\x14\x05\xda\xfd\x7f\x05\x44\x06\x9a\x21\x34\xb2\x78\x74\x58\x8d\x82\x4f\xe6\xdd\x9f\x50\xb7\xc7\xda\xb9\x9b\x68\xa0\x7f\x76\xf8\xb6\x9a\xc8\xc3\x1d\x86\x6f\x04\x1a\xef\x6f\xdf\xcb\xb7\x13\x77\x5c\xc9\xe0\x1d\xa4\xf4\xf7\xca\x47\xcf\xc5\x42\xd6\xd0\x8b\x70\xb5\x10\x1a\xd9\xc7\xdc\xcc\x48\x6c\xa1\x59\x67\xe1\xf4\xb4\x4a\x29\x81\xec\x67\x43\xdf\x63\x18\xc0\x9f\x26\xb3\x16\x54\xe6\x04\xde\x5f\xfb\x20\xbd\x91\x35\x97\x07\x89\x8b\x90\x13\x71\xe6\xe7\xc0\xc2\xc6\xf1\x7a\x6e\xd2\xe5\x76\x7a\x64\x11\x6a\x58\xbe\xbf\x22\x67\xd2\xf5\x5b\x8e\x30\xbc\x57\x66\x16\x3c\x69\x3c\xf0\xdd\x47\x77\x3f\x32\x78\xd1\x77\xed\xe6\x50\x05\xb9\x06\x09\x42\x40\xff\xa9\x87\x5f\x92\x05\x1e\xe8\x0e\x19\x73\xf7\x17\xa3\xba\x11\xcf\x1d\x1f\x17\xb6\x5c\x7a\x64\xde\x30\xb4\x1b\x42\x24\x6a\x00\x20\x2b\xd8\xdf\x05\x08\x91\xb0\xd1\x48\x4b\x3f\x32\xb4\x1c\x32\x24\xcf\x43\x06\x27\x8f\x53\xe8\x09\xb7\xe3\xf4\x52\x67\x1f\x4f\x4a\x2f\x40\xcb\x37\x44\x3e\x7c\x60\x78\xa6\x7d\xd9\x5d\xff\xa6\xb4\x08\xb0\x65\xa2\x1d\xf6\xe8\xef\xd1\x38\x9b\xf6\x41\x3d\x5a\xeb\xcd\xec\xd9\xc7\x24\x6f\xc9\x11\x1e\x62\xdd\xb7\x10\x36\x84\xea\x48\xa0\x4c\x21\x3d\x72\x21\x7d\x42\x22\x26\x6b\x6e\x72\x1d\xd4\xff\xb2\xe9\x10\x82\x08\xb5\x86\xf8\x49\x9d\xa5\xb0\x52\x23\x4f\x1e\x66\x48\x64\xd4\x27\xa8\x06\x9c\x0b\xa5\xa1\x10\x91\xc0\xa0\x91\x52\x2c\x69\xfb\xab\x4e\xb3\xbb\xce\x38\xc3\x10\x2b\x09\xd1\x0f\x0d\x52\xc2\x90\x58\x92\xe2\x8d\xda\x96\x5a\x57\xc7\x0b\xcb\x16\x35\x84\x6b\xff\xdc\x42\x27\x4c\x84\x95\xc8\xc7\xea\xe9\x5f\x4d\xc3\xa1\x7e\x0c\xf5\x41\xaa\x04\xfe\x89\x4f\xe9\x93\x87\x9a\x49\x6e\xee\x92\x2c\x79\x94\x33\x8c\xa3\xf5\xe4\xa5\x7a\x12\x07\x70\x5f\x3d\x28\xf8\x95\x5b\xfa\x65\xf5\x0e\x79\xdb\x81\x8b\x44\x48\xc7\x05\xe1\x7e\xb1\x31\x49\xd6\xf8\x08\x96\x36\xb4\x04\x16\xc8\x4d\x49\xda\xc3\x8e\x61\x13\x57\xf2\x8b\x4b\x10\xd2\x27\xa1\x91\xc2\x01\xd5\xa6\x92\xf2\xd1\xdc\xf0\xe2\x52\xf7\xfb\x4c\x96\xc5\x3d\xdc\xba\x44\x4b\xdb\xba\x1d\x1e\x8f\x14\x24\xad\x18\x03\x54\x49\xbb\x45\x7c\x54\x6d\x56\x88\x8e\x54\xf8\x12\xd8\x30\x81\xbd\xaa\xfb\xdc\x13\x4b\xde\xde\x36\x44\x19\x66\x09\xc3\xcc\x91\xc0\xda\xd7\x1f\xf9\x18\xfa\x5a\xd8\x19\xc6\xa0\x62\xd4\x46\x6e\xea\xfe\x85\xf0\x6d\x6f\x15\x5c\x7b\x40\x07\x08\xa2\xb9\xd5\x5b\x97\x26\x16\x68\xfa\x91\x2e\xdc\x72\x28\x03\xa2\x9f\xaf\xb3\x05\xeb\x49\xc8\x25\x2c\x4e\x97\x23\x52\x6c\x50\xd8\x68\x04\xbd\x9e\xf2\x2d\x87\xc6\x5a\x7a\x97\xfc\xe4\x91\xd3\xe4\xb6\xb2\xfb\xa4\xb5\x0d\x25\x7b\xf6\x33\x05\x8b\x21\xe1\xc2\xf3\x9a\xc1\x87\xd1\xca\xe9\xbd\x08\xdf\xd0\x63\xfc\x48\xd5\x14\xcd\x26\xeb\xa2\xb1\xba\xbe\xb8\xfa\x58\x53\x24\x29\x17\x55\x7c\x89\x40\x94\xeb\x20\xf4\x5a\x72\xfb\xa5\xe8\x75\x81\xf6\xfd\x12\x35\x4c\xe1\xb3\x3f\x21\xb0\x99\x73\x30\xce\xa7\xab\xe3\x3a\x2e\xd1\x33\xb5\x12\x42\x41\x42\xcc\x08\x25\xad\x50\xd9\x72\x33\x63\xd9\x42\xf3\xa5\xf6\xd4\x75\xb1\xbb\x3d\xc7\xd6\xca\x2e\xf5\x97\xe2\xf8\x4e\x74\x2d\x59\x97\xa0\x8f\x99\xfa\x49\xfe\x74\x2b\x0a\x46\xef\x52\x2f\xf4\x7c\xbb\x99\xad\xa9\xff\x2f\x0a\x69\xa0\x92\xca\x24\xfd\x09\xdc\x87\x23\xb4\x58\x71\x27\xae\x8e\xc6\x22\x15\x9f\x29\xc1\xef\x75\xed\xad\xd4\x6b\x27\xe0\xac\x9e\x9a\xb9\x8f\xda\x58\x82\x90\x12\xf2\x09\xe3\xe8\x31\x64\xcc\xf1\xd7\x7e\xe2\xb7\x3f\xce\x35\x2d\x7c\x4f\xa7\x34\x5f\x4e\x1c\x31\x0b\xa3\x22\xbc\xf4\x53\xe2\xa7\x38\x33\x27\x19\x53\xe6\xca\xd0\xba\xdd\x86\x28\xbb\x63\x2a\x6b\x39\x64\xc1\xd3\xca\xdd\x2e\xbd\x19\x98\x9c\x89\x86\x99\x5e\x00\xd4\x98\x6b\xe8\x34\xa1\x2b\x1f\x9a\x34\x40\xec\xb1\xae\x45\x3f\xd7\x1b\xcb\x7d\x6e\xb9\x4f\x56\x17\xa5\x90\x85\xf1\xdc\x61\xd7\x8c\x79\xf9\xb8\xdb\x18\x45\x2a\xb1\x1c\x2a\x8e\xf5\x56\xa2\x39\x83\x6f\x6f\x66\xb2\x77\xec\x90\xca\x0f\x24\x66\x86\x10\xa1\x39\x0a\x13\xa3\x61\x29\xff\xaf\x8f\x8f\x2b\x46\xf1\x42\x66\x86\xc3\xbb\xb1\xbd\x5b\x11\xc7\x1a\x8d\xb3\xe6\xb5\x30\x6b\xd8\xf4\x28\xc0\xd2\x36\x6f\xfd\x03\xb7\xad\xe9\xd1\xe6\xb7\xad\xae\x92\x86\xd9\x25\x8b\xb3\x0f\xa5\x5a\x93\x00\xef\xc9\xde\x66\x28\x4c\xbd\x07\x4c\x78\x95\xba\x52\xda\x85\xd7\xe8\xd3\x76\xc9\x07\x68\x66\x08\x27\xa5\x88\xf6\x72\x6e\xa3\x8e\xd1\x9a\xd0\xd7\x1c\x76\xda\xb2\x8c\xa1\x64\x2d\xba\x6c\xa9\x8c\x7a\x48\x92\x7b\x36\x42\xc7\xc6\x9a\x72\x4d\xd9\x67\x46\xbb\xf6\x3c\x69\xa7\xa5\x9c\xa1\x98\xc3\xa7\xca\xb6\x07\x2f\x1c\x67\xd9\x0d\xe1\x82\x5d\xfe\xe3\xd1\x76\x2e\x84\xe9\xc2\x0e\xef\xbf\x46\x71\x87\x9c\xcd\x93\x81\xf7\x30\x43\xd5\xc3\xcc\x6f\x1a\xef\x26\x6b\x63\x4f\xa4\x4f\x8f\xa6\xa8\x71\xb1\x7a\x74\xec\xb7\x97\x91\x8a\x43\x43\x81\x5f\x9d\xd5\x9a\x4f\x0e\xf8\x75\x1e\x95\x4e\x0b\xce\xd3\x98\x3b\xcf\x4d\x59\x67\x9e\x87\xea\x5d\x79\x33\x3b\x9e\x5c\x27\x99\x4f\x28\xdb\xbc\x3b\x77\x6b\x75\x68\x8f\x4a\x40\xe4\xe2\xf0\x49\x77\x75\x17\x7f\xea\x3a\xbe\x33\x1d\x86\x33\x29\x4a\x23\xe7\x1a\x14\x6f\x56\xe6\x01\x76\x90\x0b\x4e\x13\x25\x68\xea\xaa\xf7\x5a\x42\x38\xfe\xea\x98\x2d\x3f\x1b\x44\x6f\x86\xe8\xbe\x76\x56\xd3\x3d\xa5\x8a\x53\xf2\xa3\x57\x2b\x11\xe1\xbf\x52\x41\x81\xd4\x75\x2c\x9b\xf3\xa4\x4d\x78\x7a\xa2\xcb\x27\xb1\x98\x9e\xa1\x94\xee\x85\xd0\x5b\xd9\x7d\xd0\x9c\xe3\xb1\x1d\x86\x3d\x29\x57\xef\x26\xb7\x6e\x2f\x14\x2f\x07\xc6\x41\xe3\x4c\x51\x05\x95\x30\x9b\x40\x8f\xd5\x1f\xaf\xf4\x1b\x8b\x94\x55\x3d\x64\xb3\xc7\x91\x6d\x71\x33\x07\x8e\x4e\x41\x2f\x85\x62\xdf\x6e\xf1\x71\x80\x35\xd0\xe0\x88\x66\xe7\x9a\x7f\xab\x22\xcf\xed\x66\x9c\x8a\xa8\x6c\x32\xb8\x2e\xcf\xf3\xa6\xa1\x4e\x14\x34\xd7\xa4\xc0\x53\x0f\x49\xfd\x40\x80\xe7\x1f\xad\xa7\x23\x99\xb2\xe6\x3f\x11\xe6\x2e\x93\x95\x3d\x2c\xe9\x61\x76\x68\xf7\x59\xdb\x58\xbb\x5c\xc7\x2a\x23\xd0\x5c\x30\xe3\xc7\x38\x62\x38\x04\xd5\xcc\x52\x41\x07\x4a\x25\xd0\xae\x16\x49\xd1\xba\xc5\xa9\x6a\x89\xae\xe2\x3a\x69\x3b\x5d\x57\x35\xa5\xfe\x09\x06\x77\x4f\x19\x9d\x7c\xe5\xd0\x06\xfa\xa9\x12\xdd\x81\x04\xd0\xc4\xe7\x15\xfa\x3f\xa5\x09\x00\xf5\x4d\xca\x09\xb6\x37\xa6\xa4\x1a\x04\xbc\x15\x1f\xae\x99\x1a\x38\x73\x96\x46\x90\x86\x67\x3b\x26\x8e\x73\x69\x44\x36\x72\xe1\x34\x0c\x6d\x26\x95\x83\x5a\xa1\xcb\xd2\x3c\xfa\xa9\x8e\x34\x71\x95\x62\x9f\x52\x7e\xad\x63\x8e\xbd\x4d\x26\x44\x36\x0f\xb4\x35\x18\xab\x5f\x7a\xd7\x76\x26\x75\xff\x2e\x7a\x01\x15\xc1\xc5\x17\xa6\xcc\x7c\xb8\xcb\xb8\x88\xda\x6c\xe6\x14\x7b\x45\x20\xe8\x11\x01\xb3\x5d\xb1\x56\xf1\x56\xa4\xbf\x73\x1d\xd2\xbb\x02\x58\x15\xc2\x6c\x6e\xdb\x17\x64\xef\xa9\xca\x73\x94\x2c\xd5\x1a\xb4\xa4\x28\x85\x64\xfd\x8d\x68\xd5\x9b\x9d\xa9\x96\xe6\xc7\x04\xd7\xf6\x1a\x31\xc4\x28\xd1\x5f\x6c\xd6\x4f\xc9\x61\x68\xc5\x35\xbb\xb8\xf7\xae\x52\x3f\x31\x26\xc6\x4d\x3d\x33\x70\x73\xf9\xd4\x5a\x3e\xe9\x9e\x8b\xa0\x19\x2a\x7a\xe1\xe3\xcf\xa9\x8b\x0d\xee\x3a\xd2\xf0\x1b\x74\x79\xda\x75\x28\xa3\x23\xde\xc2\x8c\x2d\xe5\x55\xeb\xe7\x07\x97\x07\xad\x94\x2d\xe4\x2e\x87\x62\xd2\xc0\xd1\xab\x0e\x90\x2c\x9f\x42\x3c\x07\xa3\x1f\xac\x77\x73\x0a\xe5\xa9\x9c\xfa\x50\x4d\x8a\x31\x71\xb7\xaf\xa1\x5e\x12\xee\xd1\x13\x4d\x54\x6b\x2b\xec\x31\x86\x0c\x9b\x11\xd1\xfa\x45\x4d\x3a\x58\xaa\x8e\xf0\xd1\x7c\xeb\xd7\x2e\xa6\x3a\x80\x04\x31\x71\xd6\xdc\x69\x3b\x15\x30\xec\xa2\x44\x97\xd4\x5a\x51\x68\xf2\x45\x0b\x77\x69\x7d\x07\xcd\xb0\xd7\x32\x8e\xdf\xe3\x99\xb8\xeb\x67\x8c\x87\x76\xf0\x67\x31\xec\x1e\x01\x6c\xd6\xf8\x1e\xb8\x44\xc7\x31\x99\x2e\x25\xbe\x5b\xdf\x0f\x82\xc3\xa0\x40\xe4\x9a\x32\x52\x80\x76\x21\x22\x37\xd0\x0f\x1f\xc3\x5c\x15\xcf\x96\x7e\xd3\xc9\x26\x8e\x44\x89\x24\xe0\x73\x61\xbc\x44\x0e\x36\x2f\x28\x37\x49\xb6\x54\x88\x20\xb3\xb6\x7c\x35\x11\xa3\x33\xdd\x6b\x4c\x88\x99\x8c\x1c\x91\xcf\xb2\x17\x39\xbc\x0b\x01\xa9\x16\xf4\x90\xae\xce\x5d\x3d\xd0\x38\xe2\x43\x05\x2d\x53\x65\xeb\x26\x64\x69\x4d\x45\xb3\xed\xbe\xe8\xe9\xf7\x8a\x22\x5c\x06\xe9\x78\x1f\x27\xd3\x99\x3c\xfc\xc1\x1a\x89\x0f\xb7\x8f\xb2\x94\xe8\x0e\xdc\xa5\xaf\x26\x86\xd4\x54\xc7\xe5\x70\x95\x76\xd0\x01\x07\x6c\x09\x6d\x23\xdc\xdb\x2c\xab\x0f\xc9\x20\xd8\x53\xd5\x05\x46\x54\x9f\x76\xef\x8d\x34\xce\x44\xea\xee\xac\xd1\x13\x6f\x86\x69\x4d\x45\x65\xb8\x54\x92\x9d\xcf\x3b\xec\x81\x46\x40\x17\x13\x30\xa3\x14\x95\xd9\xfc\x05\x0c\x3d\x24\x9a\xc8\xae\xe0\x2a\x9b\x7b\x2e\x75\x83\xad\xa0\x96\x66\xda\x3c\xd8\x9d\x96\x3d\x6c\xdc\xe8\x7a\x82\x68\x42\x6b\x96\x5c\xd1\x59\x10\x9f\xfb\x96\xbd\x6a\x2a\xd7\xa9\x74\x6a\x6c\x86\x22\x14\x13\x86\xd0\x10\xeb\xe2\x63\x6a\xda\xe8\xd4\xa4\x9d\x10\x6f\x45\x3d\x24\x07\x29\xe8\x31\x51\x14\x3d\x60\xe6\x89\x09\xe3\x50\xa3\x54\x27\x2b\x11\xdf\x9d\xec\x3b\x37\xd3\x90\xe6\x12\x9f\xb5\x55\xfa\x4a\x7d\xe4\x37\xe3\xd3\x5f\xd5\x99\x45\x2b\x73\x7a\xcf\xb7\xb8\x53\x92\xac\x5a\x44\xd4\xa5\xe5\xdc\x13\xb5\x96\xa0\x5f\xe0\xfb\x5b\xb6\x2b\xd0\x62\xc4\x33\xcb\xf4\xbc\x0e\xae\x94\x43\x4c\xcb\x5e\x58\xe8\x34\x70\x24\x0d\xc9\x07\x45\xd2\x4b\x54\x5a\x3a\x19\x65\x01\xc7\x66\x89\x1b\x7b\x6b\x2b\xf1\x27\xbb\x3f\x14\x57\xaa\x57\xe6\x47\xc9\x31\x75\xa1\x66\x85\x48\x3a\xfe\x0e\x68\xcb\xfe\xa1\xac\x94\x57\xd5\x8f\xae\xa6\xa4\x13\x76\xf3\x96\x5c\x2a\xe3\x1a\x3f\x78\xfc\x12\x1f\xb7\x59\x1d\xaf\x34\xdf\x1f\x31\xb3\x33\x33\x7a\xd2\xec\xe2\x98\x5f\x2e\xb5\xf4\x52\x46\x2f\x24\x40\xa9\x72\xa4\x06\x63\x9a\x3c\xbb\xcc\xde\xc4\xa6\x13\x4e\x5b\xc7\xf7\xdf\x88\x8d\xf4\xa0\xb8\xd2\x7f\x6e\x1d\xc0\x82\x1b\x35\xfd\x60\x0f\xef\x15\x94\x07\xff\x69\xf0\x70\x6b\xc9\x8c\x0d\x22\x23\x98\xe1\xcf\x8d\x06\x49\x12\x64\xff\x23\x65\xcf\x0a\x48\x2f\x3d\x3f\xc2\xa5\xac\x1f\x60\x55\xf5\xa0\x2c\x19\x34\x5e\x35\xde\x96\xe0\x0a\x3f\x58\xd3\xa6\xfe\xda\x00\x06\xf1\x70\x23\x96\xf9\x94\xd9\xac\x24\x08\x5d\x13\x76\x3a\x54\x68\x72\x10\xa9\x97\x4f\xd5\x76\xb2\xd6\x17\xc2\x3f\x78\xc8\xfd\x24\x59\xa7\xbe\x41\xcd\x20\x5d\xac\xea\xa5\xef\x2f\x39\xaf\x60\x2e\x37\xf5\x1f\x02\x51\x6a\x99\x41\x1c\xca\xf3\x14\xfe\x53\x80\xdd\x1d\x70\x3f\xbf\x69\x42\x40\x59\x5a\x51\x47\x9d\x7f\x6b\x58\x8a\x71\x31\x3b\xc7\xc3\x60\xcd\xdc\x49\xba\xd2\x48\x76\x2a\xa3\x58\xd2\xc9\xc5\x17\xdd\xc0\x10\xdd\x6a\x4f\xa6\xdf\xfc\xf8\xfb\xaf\xe0\x14\x0a\xdf\xac\xa5\xfe\xdf\xff\xef\xff\xf9\xff\x03\x00\x00\xff\xff\x71\x1d\x08\x34\x38\x36\x05\x00")
-
-func dataEnglishJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataEnglishJson,
- "data/English.json",
- )
-}
-
-func dataEnglishJson() (*asset, error) {
- bytes, err := dataEnglishJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/English.json", size: 341560, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataFemalenamesJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\xbd\x4b\xb2\xab\xbc\xd3\xe5\xdd\x7f\x47\xf1\xc6\xbf\xfd\x8d\xe0\x1b\x43\xcd\xa0\xa2\x1a\x32\xc8\x20\x5b\x80\x0f\x17\xef\x83\x2b\x6a\xee\xa5\x14\xde\xe4\x6f\x71\x2a\xe2\x69\x1c\x1e\x6f\x63\x90\x52\x79\x5d\xb9\xf2\x7f\xff\xd7\x7f\xff\xf7\x7f\xfe\x47\x5a\xd6\xff\xfc\xff\xff\xfd\x3f\xcb\xbf\xcb\xd5\x10\xe6\xfd\x3f\xff\xdf\xf1\xef\x57\x58\xe7\xd4\xa4\xf0\x7b\x9d\xd3\xd8\x9e\x17\xb7\x30\x97\xff\xce\xcb\x98\xd3\x27\xdc\xe2\xda\xff\xfe\x8f\x47\x1c\xc7\x74\x8f\xf3\xef\x75\xb9\xb1\xdf\x69\xd9\x96\x30\xe2\x93\x2e\xcc\x71\xfd\xbd\x6e\xa7\x79\x5a\xfb\xdd\x7f\x75\x39\xbf\x37\x86\xb1\x39\x3f\x78\x96\x2f\x9d\x37\x29\x3f\xbd\x9e\x9f\xf4\x31\xfb\x27\xe5\x97\x5a\x7f\xce\x76\x1a\xc7\xf3\xa2\x09\xf3\x94\x7f\x2f\xe6\xcd\x1f\x7e\xe9\xcb\x27\xfe\x80\xa9\x29\x77\xcc\xf1\x7c\xa2\xb0\xf9\x0d\x97\xb2\x08\xe7\xf7\x9e\x69\xb8\xc5\x39\x9f\x0f\xd2\xc6\xdb\x84\x8f\x1f\x71\x59\x52\xe3\x5f\xed\xd3\x9c\xe3\xf9\xc7\xcd\x3e\xae\xbd\xaf\x51\x18\xbb\x98\xcf\xab\xa1\x2c\xf0\xe2\x0b\x71\x2b\xaf\xee\x7b\x11\x86\xdd\xbf\xe5\xaf\x37\xc7\x5b\x6c\xfc\xe7\xde\x69\xee\xd2\xe8\x3f\xf0\x0c\x6b\x9f\xa3\x2f\xd4\x2b\x0c\xfc\xc1\x30\xaf\x7d\xc0\x8b\xcc\xf8\xb9\x80\x1f\x5f\xd6\xf8\xea\xc3\x98\xa2\xac\xea\x7e\xde\xb6\xe9\xe7\x22\x61\x69\x8c\x94\x84\xf3\xe2\x11\x46\xdf\xf9\xa6\x3c\x51\x9c\xf1\xa7\xf7\xb9\x6c\x78\x5c\xf0\x72\xe7\xf7\xa6\xbd\x39\xff\xac\x4d\xc1\xbf\x13\x72\xf2\x4f\x1e\x5b\xf6\xdf\xea\x63\xbd\xff\xef\xe5\x1a\xe7\xb8\x40\x30\xca\x63\xfe\x5e\x74\x79\x82\xb4\xc6\x77\xc4\xfb\x3c\x62\xc0\xbb\xc5\x79\xcf\x2e\x27\xb9\x9d\x63\xcb\xf5\x95\xb7\x79\x4c\xfe\xcd\xb0\xf4\xd8\xfa\xc7\xd6\x26\x97\xbe\x79\x5a\xb8\x3e\x78\x9d\x67\x11\xc3\xf3\x4b\xe5\x83\x29\xe3\x4d\xdb\xfd\xba\xe4\xb2\xd5\xe7\xa7\xf6\x54\x78\xf1\x5b\x79\x3d\x11\xd9\x31\xf9\xcf\xaf\x61\x70\xd9\x4a\x45\xe8\x64\xe3\xce\x03\x51\x56\xeb\x7c\xf8\x60\x87\x85\x7b\x8d\xb5\xb3\xa3\x18\xe5\xa9\x66\xff\x30\x4f\x1b\x7e\x79\x81\x72\x29\xfb\x8e\xdf\x6d\xfe\x6c\xe5\x30\xf8\xff\xf9\xa1\x34\xde\xca\xf9\x4e\xb2\xfd\x7e\x1c\xb6\x9b\x2b\x95\xc9\x37\x9b\x0b\xf5\xea\xf7\x9c\xfd\xa3\x71\x9a\x07\xff\x2c\x6c\x7e\x3c\x4c\xe4\xf8\x7c\xfe\x9b\x39\x95\x3b\xf8\x46\xc7\x22\x15\xbb\xef\xec\x2d\xf9\x79\x8b\x5d\xe7\x5b\x36\xef\xcb\x1a\xb2\x0b\x60\x68\xf7\xf3\x31\xe6\xb4\xfa\x0f\x87\x1f\x17\x3f\x79\xd9\x7b\xd9\x86\x38\xba\xb0\xac\x65\x2b\xce\xfb\xc7\xd6\x1f\x77\x4d\xf7\x7b\x18\x77\x9c\xd7\xc1\xb5\x40\x11\x3e\xd7\x8f\x45\xe1\x9f\x7f\xd6\x95\xdb\xf9\x9a\x47\x7c\xf2\x4e\xcd\x2a\xe7\x85\xc2\x5c\x54\xa2\xeb\xbb\x38\xbb\x75\x59\xf6\xfc\xf6\xef\x3c\x8a\xcc\xbf\x7a\xec\x6a\x91\xd2\x3c\x40\x55\x96\x35\x76\x8d\x5c\xee\x94\x7c\x2f\xe2\x0a\x89\x33\x45\xed\x8b\x9f\x83\x2a\x9e\xc7\x34\x8b\xa2\xe2\x55\xd1\xf9\x79\x5a\x57\xff\xf3\x69\x84\xb2\x8e\x0b\x75\x87\xc9\x02\xee\x1c\x07\x7f\xd4\xc7\x56\x8e\xec\x0a\xd9\xc0\xc5\xdc\x4f\x90\xd5\x3e\x7c\xfc\xb9\x83\x59\x0e\xd7\x38\xd4\xbc\x37\x7f\xc8\xf0\x2a\xe7\xe9\x94\xb4\xb8\x40\xbb\x35\x19\x27\x26\x6f\x4d\x82\xc5\x7a\x84\x21\x89\x1a\xc2\xa3\xe7\xa2\xcf\xa6\xf3\x97\xdf\x21\x47\x2c\x4a\x6b\x8a\x1d\x37\x1a\x62\x07\x1d\x96\xe9\x1d\x2c\xdb\x87\xf7\x3d\x8c\xe6\x79\xd9\x05\x7f\xee\xf2\xa2\x34\x2d\x65\xd9\xa1\x57\x8a\x32\x92\x75\x7f\x94\xf7\x38\x9f\x75\xf6\xd3\xd3\xc5\x39\xe4\x16\x7b\x60\x56\xd9\x77\xbe\xa1\xc6\xab\x6f\x0c\x65\x35\x53\x2a\x8a\x7a\x82\xaf\x00\xfd\x3a\xc7\x0e\x9a\xa1\xfc\x76\x03\x9d\x59\x5d\x23\x5f\xa6\xc9\xce\xde\x82\x17\xa4\xd6\x0e\x5b\xd1\x7a\xe7\x6d\xf7\xf7\x84\x65\xb2\x25\x83\xcc\x3d\x36\xb5\x93\x2e\xf2\x2d\xf4\x4d\xd1\x14\x0d\x2c\x3e\x0c\xfe\x18\xcf\xaf\xa7\x16\x96\xff\x0d\x8d\x54\x94\x50\xd9\x00\x97\xc2\x09\xef\x7c\x2b\xaa\x66\x85\x6e\x30\x8f\x80\xba\xad\xbc\xe5\xea\x5f\xdd\xa7\x4c\xdd\x6b\x96\x91\x2f\x63\x3b\xe2\xdf\x2d\xda\x1e\x17\x66\xa0\x7c\xb7\xde\xe5\x8b\xf0\x6e\x02\x4f\xfe\x06\x51\x5d\xfc\x0e\xea\x6b\x52\xf2\x8a\x3a\x7a\x26\x9c\x71\x57\x14\x2b\x4e\x88\x19\x59\x3a\xbb\x45\xa1\xc0\x17\x2a\xbe\x81\x9b\xb4\x22\x6a\xeb\xbc\xb5\x11\x87\xcb\x8d\xe9\x34\xee\x70\x82\xb3\xec\x91\x6f\xfa\x4f\xc2\x2b\x51\xac\x9e\x87\xa5\xf6\x37\x59\xf0\x8e\x63\x28\x26\x01\x87\xbf\x1b\x5d\xc6\xca\x39\x09\xa2\xba\x70\x86\x6e\x72\x97\x36\x8a\x70\x9a\x27\x89\x4d\x7b\xc5\xf2\xdd\xf3\x17\xe4\x36\x83\x9d\x28\x1c\xa9\x22\x28\xb8\x0c\x66\x28\x5d\x3e\x8b\xa7\x80\xd5\x2d\xee\x99\xaf\xde\x54\xfc\xce\x00\x9b\x55\x96\x06\x66\xaa\xda\x4b\x6a\xb1\xe2\x0b\xf9\x7d\x42\xd9\x4b\x9e\x08\x28\x1c\x93\x53\x8f\x0c\x22\xef\x32\x24\x1a\xc6\x41\x5f\xab\xd8\x8e\xd6\xf7\x36\xd3\x91\xce\x3b\x7e\xfb\x9d\xa6\x8c\xc7\xde\xe6\x75\xf4\x0d\xad\xe1\x8c\xeb\x8d\x95\x5b\x5f\x1d\x60\x68\x98\xe2\x5a\x62\x61\x44\x4c\xf1\x8c\xeb\xca\xab\xbf\xf8\x7e\x82\x13\x32\x94\x20\x8b\xde\xd5\xe2\x8a\x74\xd8\xe7\x15\x41\x4a\x44\x9c\x53\xfd\x41\xb8\x78\x8c\x12\x4a\x94\xb7\x78\xe4\x54\x5c\x58\x97\x53\xb3\xf2\x93\xb8\xbe\x5c\xd6\x11\xaf\x65\x31\x1c\x3e\x49\x8c\xb1\x16\x8d\xc0\x8a\xbd\xe9\x5d\xf8\xc6\x11\xf1\x9c\x47\x9e\xe5\x79\xcd\x80\x21\xf0\x9b\x86\x24\xeb\x7b\xfe\xd8\x94\x3b\xd7\xcb\x22\x4b\xe6\xa3\x8d\xe2\x0e\xf9\xfe\xe5\x38\x8d\x81\xef\x75\x7e\x72\x8f\x6a\xd6\x26\x84\x4c\x43\x2a\xbb\x3e\xf8\x11\xc4\xa1\x2e\xa1\xd6\xd3\xd5\xe8\x44\xa3\x6d\x82\xe4\x41\xce\xf3\xe2\x9b\x17\x0d\x92\xfc\xfe\xd8\xa6\x21\xb8\x33\xdc\xd3\xf1\x6f\x43\xf2\x1d\x9b\xc3\x80\x37\xa9\x2e\x56\x82\xcd\x7a\xd2\xdb\x9e\xb9\x2f\xc5\x35\x9a\x71\x08\xc7\x76\xc1\xea\xd8\x65\xc0\x11\x1e\xe1\x91\x74\x5b\x68\x43\xde\x5e\x50\x37\xa2\x51\x8e\x78\x1e\x5e\xcf\x22\x51\x52\x03\xb1\xb9\x87\xdd\xb5\x5b\x1b\xa8\xf7\x20\xd8\x4b\xb8\xf1\xc9\xd3\x72\x39\x03\xdd\x56\x5e\xd4\xcd\x4e\x2f\x47\xa9\xaf\x4e\xde\xb9\xfa\x03\xad\x5d\x13\x8b\x90\xa5\x8b\x2e\x3e\xdf\xaa\xc4\x9e\xae\x27\x6e\xc5\xd2\x15\x87\xc6\x1f\x09\xfe\x6f\x31\x25\x17\xef\xca\x9f\x15\x41\x65\xdc\xc4\x29\x18\x71\x60\xca\x61\xff\xb8\x0e\x92\xb5\x6c\x25\xd6\xb1\x10\x1d\x29\x82\x2c\x96\xbc\x6e\x53\x2a\xe1\x9c\xbf\xec\x98\xfe\x6c\x78\x34\x7f\x9f\x07\xcd\x7a\x39\x79\x99\x02\xbf\x43\xff\x8e\x17\xb9\x85\xf7\x5c\x9e\xd3\xdf\xe7\x1e\x2e\x2a\x77\x87\xcf\x35\xbd\x3c\xb4\x09\x62\x36\xf6\x37\x3d\x86\xf2\x76\x93\xaf\x6b\xde\xce\x45\x59\x36\x2c\x71\x51\xae\x88\x1c\x2c\xec\x09\x72\x50\x5c\x8e\x9f\xb3\x1e\x28\x78\xc1\x19\xc1\x5c\x86\xa2\x2f\x76\x75\xc4\xa1\x2e\x7f\xd5\xfb\x96\xad\x53\x12\x0f\xc7\xd6\x40\xb2\x0d\x61\x14\x6f\x48\xfe\xf8\xe5\x9a\xc3\xe2\xf8\x73\x2b\x7e\xfa\x44\xcb\x52\x64\xbd\xed\xa0\x2e\xe8\xc0\x34\xdc\xfd\x1c\xd6\x69\xa7\x1a\xf7\x37\xb5\x65\xf0\x3f\xec\xca\xf6\xd2\x1b\xc0\xcb\x26\x28\x2d\x73\x84\xa9\x71\x5c\x8f\x1c\xc6\x6e\x84\xbc\xcc\xb4\xd0\x16\x8f\xbb\x91\x88\xb0\x56\xf5\xd4\xd0\x40\xc1\x0a\xac\xd4\xb2\xe5\xe9\x65\xcf\xe0\xa6\xfd\x0d\xe2\x2e\x77\xa6\x9e\xf1\xf1\x0d\xd9\x85\xb6\x9c\x74\xfc\xb1\x85\xb2\x74\x9f\x72\xfc\x2b\x96\xe8\x36\x4f\xd3\x53\x1c\x4a\x78\xbe\x4b\x68\xe9\x6c\x16\xa1\x68\xb9\x99\x66\x4d\x12\x0e\x96\x8b\x5c\xe4\x4f\x94\x13\xdf\xc3\x56\x59\x72\x24\x50\x77\xdd\xfc\xb3\xf2\x13\x51\xf3\x64\xe6\x3d\x53\xcf\x35\xdc\xba\x48\x03\xff\xd4\xec\xc1\xb1\x4a\x23\xf4\x29\x03\xa5\xb2\x7b\x6e\x21\xaa\xe7\xa2\x16\x53\x12\x1e\xe2\xcf\xd3\xe0\xc3\xe8\x14\xff\x26\x4a\x02\x21\x4a\x8a\xaf\x8d\x4b\xb1\x34\x91\xa7\x68\xa4\x87\x37\x26\x04\x4e\xf0\x45\xbe\x59\x2c\x24\x03\x23\x14\x63\x9c\x25\xcd\x50\x04\x50\xb6\x07\xd2\xdb\x5c\x0c\x6e\xe4\xc9\x8f\xa9\xeb\xfd\x9e\x5d\x0f\x9f\x6e\x7a\x21\x1b\x1b\x2d\x63\x04\xc9\xd2\x8c\x70\x57\xc2\xa2\xf2\x7f\x46\x18\x16\x1e\xc0\x39\xd8\x11\x39\x2d\x52\x1c\xcd\x22\x21\x45\x90\x77\x04\x3f\x0f\xe8\x10\xf3\xc0\x5c\x9f\x60\x6b\x2e\x89\xf9\x60\x5a\x4b\xf4\x23\x32\x78\xb4\xa4\x89\x39\x97\x58\x2e\x90\x19\xe7\x13\x17\x67\x21\x52\xb3\x24\xc8\x00\xe5\x4e\xbc\xee\xa2\xd6\x1f\xfe\x4c\x48\xd0\x64\xbc\x52\x4b\x7d\x36\x30\xc1\x24\x41\xcb\x40\x03\x5b\x7f\x94\x61\xa0\xa4\x8d\xee\xe9\xa2\x74\x19\x07\xcc\x0c\x50\xdb\xf4\x97\x06\x00\x2b\x68\xd9\x6e\x78\x25\x14\x2c\xe4\xc4\x1f\x53\xcf\xf3\x61\x55\x02\x38\xa5\x03\x33\x2e\x25\x1c\x4a\xf8\xbb\x1f\x88\x1f\x0b\x1a\xf1\x36\x49\xb0\x7d\x3b\x3f\xc1\x59\x33\xc9\x4e\xb8\xf3\x2d\x21\x7d\x32\x71\x07\x7e\xd2\x98\xee\x4c\x41\xeb\x09\xb2\x63\x89\xac\x65\x79\x10\xbf\x4f\x48\x83\x9f\x51\xee\x71\xd1\xda\x23\xd7\x89\xe1\xf4\x40\x83\xaa\x4e\x5b\x79\x31\xb8\x80\x2f\xcd\x97\xcc\x4c\x83\x1d\x3e\x2b\xfc\xc0\x96\x67\xbe\x18\x10\x86\x52\x16\xcb\xba\xbe\xb0\x20\x9b\xdf\x9c\x99\x95\x6d\x68\xc2\xca\xa2\x31\x05\x55\x8e\xa7\xa9\x3e\x17\x9b\x1f\x3f\x9f\x0d\x33\xcf\x2d\x72\x58\x56\x4f\x79\xba\x3b\x60\x02\x44\xe1\x9a\x66\xa4\x9c\xe2\xfd\x8e\x2d\xe3\xb2\x97\xbb\xc0\xb3\xe5\xee\x95\x70\x7b\xa2\x85\x64\x80\x45\x7d\x61\x59\x4a\x38\x6f\xf4\xf8\xcb\x2f\x61\x0f\xc6\xf4\x7c\x5e\x54\x7d\xd0\x95\x5d\x1a\x1e\xa5\xa4\xe6\x4d\xe4\x06\x1a\xca\x0c\x88\x17\xde\x2c\x63\x04\xf7\xc5\xea\x02\xac\x95\x95\xb8\xb9\xf5\xe4\x43\x4d\xd2\x41\x13\x32\x2e\xbf\x17\x1d\x06\xd5\x84\xd0\xbb\xfc\x1c\xcc\x57\x39\xff\xfe\x73\x89\xce\x1a\x97\xa5\x1e\x33\x26\x89\x02\x12\x62\x4d\x39\xe1\xd9\xdf\x21\x8d\x5d\x71\xba\xce\xab\x37\x4c\x45\xf1\xa9\xd3\x25\x8e\x76\xed\x3c\xe5\x96\x8b\x84\x14\x51\x51\xd6\x2c\x7e\x1e\x25\x17\x48\xf1\x88\xcd\xc4\xf1\x7a\x5c\x13\x68\x92\x5e\x6a\xa8\x13\x2d\x8f\x52\x8c\xca\x44\x85\xf3\x84\x5f\xb4\x50\x62\x8e\x3a\xa4\x1c\x0c\x57\xef\x8c\x88\x5a\xd1\xa5\xe5\x50\x64\x57\x8a\xbe\xc5\x5a\xe1\x38\xea\xb5\x11\xea\xca\xbf\x65\x79\x33\x28\xf8\x57\x2c\x52\xf7\xb9\x68\x05\x97\xab\xa3\x7a\x1a\xe1\xc6\x52\xdd\xf6\xe2\xf2\x34\x25\x82\x77\x35\x10\xef\x8c\x67\xcc\xf1\x9b\xd3\xe4\x2a\x52\xbc\x0d\x78\x58\xa2\x3c\x19\xd2\x06\x2a\xe9\x22\xc3\x3c\x09\x08\x3e\x6b\x1d\x9b\x79\x37\x6c\x5e\xfd\x4c\xb4\xbe\x87\x0d\x16\x77\x7a\xf0\x57\xe3\x59\x66\x6e\x16\x96\x06\xa7\x86\xde\xf5\x2b\xa4\x0e\x01\xdd\x78\xa9\xbb\xf1\x2e\x78\xed\x36\xbc\x7a\x56\x48\x5d\x32\x4c\x2b\x78\x55\x23\xae\x2e\x25\x5d\x55\x01\x7e\x8f\x34\x4c\x1d\xeb\x7f\x13\xcf\xee\x33\x52\xef\x64\x66\x5a\x2c\xc3\x06\x8f\xc6\x62\x79\xdc\xf5\x09\x1d\xbd\xcd\x0b\x5d\xb3\xf4\xf9\x40\xcb\xa5\x99\x09\x63\x93\x0c\x51\xd2\x52\xe6\xd9\x19\x9e\xec\x52\x3b\xc4\x52\x76\xa2\xe3\x8a\xf3\x02\xbf\xbd\xd6\xc4\xa4\x18\x0e\x79\x38\xe2\x8a\xb1\xf5\xf3\x64\xe9\x0e\xa6\x84\x13\x94\x92\xc9\xf8\x47\x6e\xe4\x98\x03\xab\xd9\x30\x7e\x8c\x22\x9e\xc5\x30\x46\x16\x19\x3b\x79\xcd\x7b\x59\xc7\x96\xee\x16\x8f\xcd\x06\x93\xfd\x6f\x7e\x55\x43\x58\x45\x01\x1c\x3f\x73\xdd\xaf\x0c\x23\xb5\x6e\x83\x27\x05\xca\xb7\x83\xd6\xb8\xa1\x12\xab\x79\x76\x81\xbc\xe8\x51\x0f\x9f\x36\x89\x7b\x98\x55\xcb\x1b\x6d\x96\xe5\x7a\x04\x28\x52\xfc\x47\x26\x38\x96\xa9\xd8\x8a\x79\xc2\x9f\xd3\xef\xb7\x6f\xe3\xb3\xb7\xbb\x11\x8d\x98\xe1\x9a\xbc\xe3\x86\xad\x1f\x3c\x0f\x4f\x6e\x96\xba\xc3\xe1\x7b\xd2\x57\xa1\x8c\x4a\x79\x21\xb3\x0c\x99\x83\x80\x52\x7e\x92\xbc\xf1\xb8\x41\x0e\xbb\xe0\x3f\xbe\x70\x9d\x5a\x2a\xf1\x65\xbf\xb9\xa7\x13\x6e\x5e\xf5\x4e\x6f\xe4\x80\xe9\x34\x6a\xe6\xa6\x41\x06\x06\x62\xff\x90\x8c\x40\xd7\x06\xaa\xe3\xe9\x4e\xa9\x19\x62\x60\x9d\x70\x6b\x99\x29\x5e\x99\x63\xce\x2c\xe4\x96\xdd\x1b\x79\x9b\x5b\x62\xfa\x60\x29\x1a\x48\x75\xed\x8e\xc0\x1a\xb9\xba\x0a\x74\xa1\x11\xa5\x6e\x32\xdc\x12\x94\x5c\x2d\x4e\x88\x9a\xc6\x66\x47\xa4\xb0\xbe\x69\x19\x3f\x38\x73\x3f\xb1\x94\x0b\x95\x6d\xfa\xc8\xad\x21\xd4\xf0\x91\x46\xe0\x19\xce\x13\x83\x1e\x2c\x85\xc9\xb9\x2b\x9c\x6d\xed\x91\x5d\x8f\x58\xbf\x72\x02\xe2\xfc\xa6\x1a\x70\x39\x58\xc5\xaf\xce\x11\x51\x43\x5f\x7e\x0a\xb5\x2f\x73\x0d\xcf\xcf\xde\x21\x33\x7c\xbf\xcd\x92\x14\xa8\xca\x0f\xd9\x9e\x12\x10\x48\x52\xd0\x2a\x56\x10\xfb\x37\x9e\x34\x88\xda\x83\x43\x99\x53\xcb\x02\xd1\x4c\x85\xf2\x9b\xb5\x91\x0a\x52\x13\x5f\x0d\x6a\xa3\x6b\x92\x98\x0c\xd0\xad\xd9\x73\xe8\xed\xa4\xc5\xdc\x27\x6c\x84\xc7\x6a\x31\x8f\xe2\x29\x5d\x4a\x17\xe5\x43\xec\xc3\x9b\xba\x65\xa7\x9b\x20\x41\x5e\x89\xd8\x02\xd6\x7e\x89\x0c\xaf\xa8\x87\x82\x46\xd3\xf7\x24\x71\x2d\x12\xa0\x2d\xab\xa5\xa3\x84\xbc\xdf\x7c\xf7\x0a\x55\xc3\x6a\xf7\xab\x18\xed\x3c\xbd\x10\x21\xe7\xd0\x95\x3d\x3d\xdf\x7f\x60\x46\xfc\x16\x05\xca\x50\x64\x0b\xa9\xdb\x0a\x61\x42\x58\x0a\xab\x17\x97\xa1\x96\xe7\x35\x64\xf0\x8f\xdf\x78\x1e\x13\xa0\xf3\xf2\x43\xa5\x36\x04\xa9\x2b\x8c\x92\x66\x2a\xfe\x6e\x7c\x22\x90\xda\xb8\x51\xbd\xe9\x50\x97\x6f\xe6\x7d\x8b\xf3\x03\x5f\xf5\xd7\x94\xf3\x00\x31\xbf\x1e\xa4\x60\x32\x53\x2a\x1f\x22\x1a\x66\x9a\x1d\x45\x61\x18\x03\x94\x04\x18\xa1\xb5\xd4\xaf\xe5\xe5\x2f\x49\xbf\xc3\xf1\xa0\xfa\x88\x03\x8d\x51\x43\xa0\xd1\x07\xce\xc1\x78\x71\x22\x27\xaa\xee\x78\x2d\xec\xe6\xf2\x84\x04\x00\xf1\x53\x6e\xf9\x22\x3e\xb7\xed\x31\x54\x69\x31\xfe\x40\xb0\x65\x49\x11\xe7\xf0\xe4\x9f\xc6\xf6\x47\x2d\x71\xf1\x7a\xd4\xae\xc7\x99\x29\xd4\x5d\x2c\x1b\x3d\xfb\xbf\xe2\xe6\x43\x13\x55\x34\x19\x56\x72\xd4\x58\xca\x9c\xb4\x41\x70\x1f\x41\x80\x18\x89\x4b\x50\x33\x1b\xe7\x1a\x6c\x1f\xb9\xd1\x34\x4b\x32\x75\xc7\x4f\x68\x1a\x96\x8a\xb0\x15\x57\xa1\x4a\xd9\xa8\x6b\x07\xa9\xe3\x53\x6e\xb0\x41\xcf\xb0\x48\x05\x7a\x17\x20\xcf\xfb\xea\x21\x1a\x3c\x50\x8b\x2b\x30\x14\x41\x60\x73\x7b\x89\x4e\x71\x7e\xcd\x4a\x61\x77\xda\x2e\x72\x95\xa1\x88\x5e\x52\x68\x38\xc0\x43\x90\x5d\x7a\xa1\xeb\x47\x9c\xaa\xd3\xd0\x99\x05\x96\xf5\xad\x08\x00\xc5\x80\x62\x69\x16\xf1\xc3\x69\xa1\x8b\xc8\x49\x14\x72\x04\x67\xfe\xd7\x02\xaa\x4a\xed\x4c\xd1\x58\x92\x14\x4f\x90\xae\x8e\xcc\x98\x16\xcb\x07\xd0\x4f\x4c\x33\xee\xd2\xe1\xa0\xdc\x24\x11\x15\xac\xf2\xec\xf5\x1e\xcb\xad\x42\x6e\x4d\x05\x61\x1b\xad\xe6\xee\xe9\x1c\xea\x79\xa9\xf5\x95\x25\x7c\x23\x34\x13\x97\x20\x68\x7a\xb9\x6a\x0d\x37\x61\x13\xf4\x94\x1a\xef\x85\xf9\xbb\x5a\x79\x44\xe9\x9f\x4b\x59\x51\xb5\xd8\xb2\x56\xe2\x14\xcb\xf0\x28\xb0\xef\x8e\x0f\xbb\x0d\x19\x94\xe3\x1c\xc0\xbe\xd2\x1b\x0a\xa6\xff\xa1\xe1\xdf\xf6\x08\x28\xc6\x85\x72\xa3\x85\x70\x0d\x98\x8e\x03\x39\x23\x92\x02\xa5\x5a\x2b\x5d\xd7\x23\x8d\x4d\x96\x4a\x43\x16\xb4\x44\x18\x5e\xc1\x23\x0c\x3b\x61\x62\x92\x90\x39\xa4\x28\xfe\x24\xb5\x85\xbe\xae\x25\x7a\x89\x40\xc2\x6f\x74\x94\xd3\x3f\x47\x3b\xa8\xd0\xd0\xfd\x84\x92\x64\x05\xb3\x9c\xea\x96\x82\xc1\xd5\x06\x88\xec\xd8\x51\xdf\xec\xe6\x89\xbd\x2f\xcb\x91\x2e\x25\xe9\xa8\xb0\x4a\xc4\xcd\x0a\xe9\xa5\x24\x34\x61\xb9\x94\xdf\x0e\x8f\xda\x77\xd4\xde\x71\x0d\x14\x39\x82\x39\x2e\xb0\x39\xa9\x31\x19\xb8\x8c\x99\x40\x45\x65\x1b\x22\x7c\x5c\xa9\xc2\x22\x1e\xb2\x16\xbd\x60\x0b\xa9\x62\x4c\xc9\x0a\xa2\x34\x7b\x2c\x5f\xe1\x6d\xe7\x0e\x44\xc0\x50\x3a\x6e\xf7\x0c\x77\xa3\xdc\xee\xcf\x96\x14\x7b\x87\xa4\x2b\x45\xc6\xfc\x1b\x22\xa0\x6d\x6d\x10\xea\x7e\x91\xf1\x48\x9e\x69\x4a\x33\x4f\x5c\x4a\xab\x91\x27\x16\x46\x7f\x22\x15\xe3\x0e\x13\xff\x83\x20\xc4\x6a\xfa\x97\xc4\xee\xa9\x72\x00\x45\xab\x0e\x39\x14\x8e\x29\x2a\x3a\x5c\x37\x6e\x79\x97\x70\xf0\x82\x38\x94\x6f\x56\x05\x5e\x61\xf4\x52\x20\x0b\x23\xc5\x23\x92\x34\xd7\x9a\xe0\xfe\xb7\x1a\xb2\x59\x54\x48\x97\x48\x94\x00\x02\xac\x12\xbc\xc6\x46\x83\x08\xba\x03\xf9\x1f\xb8\x3c\x12\xd0\x47\xf6\xce\xb7\x34\xce\x03\xbb\x2c\x2c\x08\xf3\x23\x20\x87\x78\x05\x6c\x7e\x6a\xd6\x40\x38\x74\x68\x99\x2d\x46\x8e\xa8\x8b\xea\xc6\x7c\x9b\x53\xa0\xca\x98\x8d\x1f\x05\x37\x64\xe8\xcd\x5e\x8d\xa0\x8b\xe6\x34\x22\x7f\x9c\x8b\x29\xe0\x6e\x58\x83\xc2\xf9\x13\xbd\x64\xe0\xc3\xb8\x96\xa3\x29\x8e\x86\x25\x5a\xfc\x58\x5b\x34\x9c\x5a\xfa\x65\xbe\xae\xdc\xae\x28\xf5\xa8\x56\x6c\x41\x4e\x48\x63\x54\x1f\xe4\x5c\x0f\x62\x57\xac\x06\x05\xdf\x71\xa0\xcf\x69\xa5\x4a\xd4\x30\xbe\xb9\x66\xe4\x06\x97\xc1\x8f\x8f\x45\x68\x0c\x4a\x5a\x38\xfa\x5c\x15\x29\x2c\x17\xd3\x86\x47\xae\x91\x14\xfc\xfa\x81\x79\x9d\x40\x7c\xd8\x3c\x35\x9e\xac\xae\xe7\x18\xf1\x75\xbb\xaf\x0e\x3b\xaa\x21\x17\x2a\xd6\x8b\xc8\x93\x39\x40\x58\xc1\x8e\xe5\xaf\x4c\x79\x7e\x99\x69\x0d\x94\xa0\x10\x99\x2c\xde\xa5\x45\x4a\x5d\x15\x9a\xe4\x0d\xee\x41\xf3\x47\x10\xf1\xb5\xf7\x48\xd4\x28\x6b\x31\x15\xaf\x80\x0c\x38\x53\xd5\x52\xdc\xba\x69\x95\x3d\x2d\xb2\x15\xdf\xe0\x89\x41\x18\x9a\xa2\x5a\x05\xad\xb4\x71\x88\xeb\x4c\x55\x01\x7f\xe1\x11\x2e\x4d\x25\xa6\x00\x80\x4f\x4e\x92\x25\x92\x63\x74\x2f\xa6\xc7\x6f\xb4\x4a\xb6\xf5\x0b\xae\x67\x74\x87\x52\x1d\x1c\xd2\xa2\x75\xad\xdf\xe1\x62\xe1\x21\x9e\xe6\x1a\x48\xf0\xb2\x6a\xe2\x98\x41\x1a\x76\x8c\xf6\xd7\x3a\x09\x10\x3d\x6c\x6d\xd2\xd4\x25\x57\x26\x01\xf6\xd4\x28\x70\x50\x15\x43\x5f\xf4\x4d\x1c\x89\xca\xed\xe3\x44\xc0\x6b\xed\xb2\x62\x0b\x84\x65\x57\x89\x6a\x57\x47\x32\x4b\x13\xc8\x4d\xb7\x70\xa4\x5d\x6d\xf9\xc8\x56\x89\x75\xac\x5e\x51\x1d\x2e\x5a\xcc\xac\x32\x22\x79\x43\x56\x0c\xc1\x27\x0e\xb3\xa6\xbc\xac\xb4\x82\xde\x9c\xcd\x0a\xfd\xf3\x20\x82\x37\x41\xb7\x1c\xc5\x65\x0d\xea\xe9\xe4\x49\x10\x93\x27\x56\xac\x8b\x32\x45\x75\xa9\x57\x50\x73\xa8\xf2\x0f\x03\x86\x65\x0e\x9d\xa4\x98\x8a\x5f\xda\x06\x77\xfc\x92\x65\x6b\x7d\x8f\xd2\x5b\x23\x63\x05\xe3\x57\x43\x7f\xae\x52\xa4\x49\x16\x1c\x82\x28\xe8\x35\x0a\x18\x38\xb1\xab\x22\x6f\x4d\x39\x31\x04\x97\x30\x3b\x62\x25\xc7\x1e\x9b\xca\xea\x50\x10\xb3\x7c\xd4\x79\x7c\x03\xb5\xcb\x62\xe9\xf9\xcd\x57\x91\x4b\xe6\xa3\xd1\x78\x64\xb6\x0d\x4d\x54\x2d\xdc\xd7\xd5\xa2\xe2\xf3\x6a\x1a\xf8\x5b\x2d\x9f\x6a\xa4\x71\x00\x76\x92\x69\xe8\x39\xdc\x83\x24\x39\x76\x58\x1f\xba\xcc\xe5\x3b\xbc\xf9\x9b\x87\xcd\x9a\x6a\xfc\x0d\xc5\xd6\xd1\xcd\xe6\xc6\x2c\x45\xbb\x13\x20\x32\x73\xeb\x8f\xf4\x3b\xf4\x88\xb8\xbb\xef\x48\xe8\x9d\x24\xff\xec\x80\x51\x43\xa0\x81\xce\x8a\x71\x90\x12\x4b\xbe\xf9\x87\x35\x15\xe6\x1a\x5b\x92\x6d\xcd\x25\x65\x63\xb9\xf9\x73\x5d\x27\x37\x0f\x87\x8b\x85\x23\xed\x26\x41\x4e\xc4\x01\x16\xe4\x8a\x0f\x1e\x21\x48\x3a\x4a\xce\x55\xf5\x0c\xa4\x13\x14\x10\x13\x39\x38\xe2\xe9\x1d\xf0\xce\xe0\x0f\x0c\xcf\x59\xb2\xf7\x51\x6c\xf4\x26\x2d\x34\xcf\x9d\x4e\xc2\x81\x2f\x38\xdf\xf4\x65\x59\x7a\x28\x87\x99\xf0\x3f\x3e\xf2\xd1\xd1\xe7\xa6\x25\x28\x88\x8f\xbf\x1f\x27\x38\xea\xb3\xe8\xfd\x07\xd7\xeb\x48\x44\xf2\xac\xb1\xac\x5f\x8e\x06\x83\x24\x48\x7d\x2d\xca\x75\x3c\x11\x2b\x7d\x30\x96\x07\x33\xa2\xdd\x9a\xe6\xf7\xe7\x97\xe2\x6b\x9a\x89\x38\xa3\xee\x78\xc7\x71\x3b\x77\xea\x00\xee\xfb\xaf\x35\x02\xfe\x3d\xde\x27\x49\x94\x52\x74\x0d\x01\xd9\xa3\xe2\x16\x8b\xfe\xd0\x76\x21\x6d\x6f\x5b\x80\x54\x64\xff\xab\xc9\xa0\xaf\xbe\xe1\xf4\x20\x33\x4f\xdd\xe0\xc7\x36\x76\xbe\xa3\xfb\x82\x2c\xfe\x8e\x0a\x5d\x90\xda\x4d\xc5\xb9\x68\x59\x13\xe7\x41\xa0\x19\xf7\x94\xa7\x01\xbe\xc1\xa7\xfc\x3b\xb1\x6a\x75\xd4\x0a\xc4\x3f\x81\xdd\x78\x03\x93\xbf\x31\x9f\xc5\xc7\x79\x5d\x4a\x40\x47\x97\x25\xd3\x94\x4c\xf5\x5a\x24\x7a\xbe\xb1\x98\xa1\xa8\xfd\xbf\x52\x46\x6a\x43\x35\x7e\xd4\x1b\x52\x75\xbe\x31\xb5\x39\x86\xa7\x00\xfb\x98\xc1\xae\xe9\x54\x44\x84\x9a\xca\x45\xe1\xa8\x15\xc8\x61\x2b\x5d\x9c\xd6\x7c\x4f\x7f\x6b\x95\xac\xca\xc4\x8c\xed\x37\x2d\x0e\x9d\xc1\x4a\x96\xa9\x4a\xd9\x9f\x5a\x5e\xe6\x59\x65\x31\xaa\x9d\xde\x8c\x19\x06\xc9\xae\x0e\x40\xf6\x7f\x1b\xa4\x4f\x99\x40\x8a\x7a\x25\x44\x73\x60\x11\xde\x92\xa0\x2b\xb3\xa0\x56\xbb\xbf\x68\x56\xff\x62\x43\xcb\x56\x02\x47\x7a\x4f\xd1\x0b\xb1\x97\xb4\x64\xf6\x96\xe6\xc7\xd4\x8f\x92\x33\x84\x73\xc2\x44\x8f\x99\xbc\xc8\x96\xf7\x27\xb2\xc8\xd2\xcd\xdb\x5f\x8c\xcb\x1e\x5a\x58\xd9\x57\x9c\xa5\xb8\xda\xb1\x61\xb9\x42\x92\x05\xbb\xd3\x13\xa0\x3f\x4c\x1f\xe9\x81\x35\xf7\xd0\x7b\x0f\x25\x1d\x51\x34\x41\x7b\xcd\x7e\x8a\xab\x95\x24\xff\xb3\x0a\x9e\x2c\x07\xf9\xf0\xdb\x38\x37\xaa\xa7\xe0\x8f\x18\xd0\x10\x6d\x7d\x5b\xb1\x0b\x33\x8e\x6e\x11\x7b\xaa\x89\x2f\x4d\x03\xce\x65\x27\x29\x49\x07\xa5\xfc\x42\x3e\x60\x5d\xd8\x63\x0a\xaf\x68\xbe\x10\x63\x4c\xcc\xa9\x1c\x72\x78\xee\xaa\xf4\x1d\x04\xeb\xcb\x56\x27\x07\x66\xa8\xc8\x39\x96\x68\x22\xa0\x31\x5e\x52\x91\x33\x0b\x40\x70\x8e\xca\xaf\x11\x16\xbc\xc6\xcb\x42\xc4\x91\xfe\xd2\x4d\xb0\xf2\x45\xb7\xa8\xd7\xdd\x48\x10\x2a\xc9\xad\x56\xe3\x44\x96\x16\x0f\x0e\x11\xc2\x5c\xc5\xb9\xbf\x91\xa3\xa4\xd8\xb1\xb8\xfc\x03\x30\x72\x17\x0e\x39\x86\x38\x4e\x6f\x04\x8e\x4d\x2e\x61\xed\xb8\xa6\x4b\xd7\xc3\x8d\x5e\x1c\xb0\xdc\xf5\xea\x1f\x09\x1b\xa9\x9e\x99\x2e\x6a\x82\xd7\xa6\x25\x77\xbc\x02\x62\x55\x5e\x5a\x8b\x0f\xde\xe7\x62\xea\xef\xfc\x77\x24\xf7\xc9\x9b\xd0\xd4\x37\x0f\x67\xcd\xd5\xfb\xae\x5a\xd5\x2a\x09\x42\x52\x4e\x6a\x09\xcb\x47\xd2\xad\x80\x6d\xa5\x91\x22\xac\x96\x0a\x44\x52\xad\x71\x12\x0e\xeb\x85\xf5\xa6\xb6\xbd\x5e\x0a\x89\x0a\x98\x12\x0f\xba\xb6\x5a\xfb\xda\xfc\x40\x28\xc7\x48\x2c\x41\x10\x9c\x58\x76\xa3\xdd\x4b\xc2\xf9\x5e\xa4\x73\x12\xa7\x33\x88\x97\x62\x41\x51\xa6\xcc\x91\x79\xc5\x9c\xaf\x4c\x35\xed\xdb\xb4\x9d\xaa\x22\x27\xa9\x6f\x66\x62\xf2\x61\x49\x25\xb7\xf4\x88\x02\xe9\x17\xc8\x6f\x5d\x20\x46\xbf\xbd\x04\x94\x41\xc1\x4f\x89\x7e\x37\xdc\x8a\x46\x3d\x25\xb3\x85\xc8\xc7\xa6\x0c\x77\xb7\x93\xfa\x7a\x74\xf0\x96\x94\x1b\xec\xf9\x11\x02\xbb\x16\xb3\x7e\x10\x3c\x46\x0c\x84\x44\xb6\x5b\x6e\x90\xba\x5c\xd3\x9b\x0e\x52\x16\xe8\xd4\x13\x38\x92\xe3\x68\xc1\xb1\x92\xfa\x84\x35\x1e\xb9\x2e\xf4\xd3\x53\xa1\x58\x04\xf0\x2f\xe2\xf4\x1b\x0e\x88\x66\x38\x06\x36\xac\xfc\x62\xb2\xb0\xb6\x8b\x58\x9f\x6f\x26\x16\xd1\xde\x28\xb6\x88\x4a\xb2\x52\x13\x11\x8a\x28\x70\x0b\x83\x49\x45\x26\xf4\xda\x24\x61\xea\xb8\x8a\x9c\x43\x70\x9a\x83\x64\x83\x6f\xac\x8d\x94\x8a\x12\x60\x79\x37\x12\x8b\x26\xcc\x27\x2d\xfb\x2b\x1a\xa9\x50\x97\xcd\x04\xb4\x3b\x6b\x47\xbb\x65\x3a\xfc\xaa\x16\x63\xfc\xd8\xfd\x20\xfb\xd7\x3c\x23\x51\x55\xd4\xd5\x87\x5a\xf7\x1d\xba\xed\x17\xd3\x91\x34\xbf\xd3\x06\xb9\x91\xaf\x70\x45\x61\x78\x35\xac\x7c\x79\x94\x6e\xc5\x0d\xdb\x2a\x94\x11\x06\x35\x07\xd6\x3c\x56\x94\x12\x0e\x95\x36\x29\x70\xcb\x2d\x26\x0a\xa0\xd0\x9a\x15\xed\xb3\x86\x0a\x91\x65\x8c\x86\x8f\x5b\x4d\x92\x7d\x0c\x67\x04\xb0\x8e\x91\x13\xb9\x10\xec\xd2\x5e\x5c\x51\xd8\x7e\x27\x40\x2d\x56\x8a\xbb\x91\xf1\xb8\x5e\x7e\xf5\xdb\xe4\xd1\xd2\x73\x57\xfa\x03\x13\xf5\xf3\x45\x6a\xaf\xee\x79\xcf\x30\x5e\x28\x59\xe6\x89\xe6\x7e\x6c\x04\x97\x20\x39\x57\xe9\x1e\xb2\xe2\x95\x38\x89\xc7\x8d\x45\x5e\x11\xd8\x5f\xfb\xde\x2b\x63\x15\xab\xaa\x45\x34\x5e\x78\x07\x65\xb7\x98\x60\xd6\x4a\x00\x1c\x77\x04\x18\xe5\xa0\x3a\xf2\xe7\xb9\x63\x55\x52\x8e\x17\x7f\x31\x66\xe1\x5d\x13\xe4\xbf\x45\x1b\xd0\xa9\x9a\x52\x3e\x8a\x09\x00\x02\x33\x03\x16\xd9\x1b\x19\x06\x81\xcb\xee\xac\x42\x1a\xc6\xc6\xcf\x97\xa5\x8a\x7d\x9b\x3a\x03\x3f\x9d\xf2\x1e\xdf\xec\x3e\xb9\x9c\xb0\x9d\x09\x14\xba\x03\xcf\x1d\x11\xf4\x97\x7f\x44\xde\x76\x4e\x6a\x1d\x2f\xc2\xe5\xac\x18\x89\x29\xb4\x30\xb2\xc5\xbc\xc8\xfd\xc2\x04\xf7\xe6\xba\x40\x51\x34\xd6\xfb\xcd\xfc\xc1\x5d\xba\x12\x6a\xde\x71\x54\x4c\x1c\x5e\xd3\xba\x02\x8b\xc3\x4c\xa6\x27\x56\x2b\x0e\x22\x1e\x78\x25\xd6\x14\x43\x87\x9a\x57\xb7\x5b\x84\x52\xfd\x1b\xc4\x3b\x8c\x9a\x23\xeb\xc6\x89\x4d\xc5\x89\xaf\xa3\x64\x4a\x33\x7f\x3d\xb0\x5f\x4a\x7c\x60\x92\x8b\x19\xc7\x15\x19\x23\xde\x82\x6d\x4b\x92\x1d\x95\x5a\xcf\x23\xaa\x4f\x21\xf8\xc1\x72\x1f\x84\x9b\x59\x6d\xc6\x1f\x65\x03\xf8\x65\x17\x84\xc2\xfc\x52\x4d\xf9\xca\x4b\xc4\xd9\x24\xa5\xe1\xcb\x37\x29\xd9\xfa\x41\x2c\x9b\x8f\x5a\x63\x3d\x5a\xe2\x53\xc2\x0f\xbe\x92\x23\xb2\x19\xe4\x19\xa3\x97\x68\x2b\xc3\xc6\x79\x40\x2c\xb9\x49\xbf\xca\x60\x0d\xa8\x50\xb1\xff\xd5\xae\x16\x0a\x6c\x7f\xd1\xd4\x34\xe5\xcc\x07\x5a\x6b\x95\xc6\x81\xaa\xa2\x58\x92\x9d\x14\xc6\xe8\x7e\x96\xd4\xfb\xe7\x01\x32\xf4\x81\x15\xf8\x9b\x26\x62\x45\x8a\xd7\x0f\xd9\x30\x0f\x03\x05\xe8\x31\x8a\x8e\xbe\xd4\x97\xd9\xc6\xc9\xac\x48\xd5\x00\x6e\x65\xd2\x40\x8a\x05\xcf\x92\xdd\xc3\x8c\x38\x21\x4a\x30\xda\x68\xfd\xf5\x37\xa9\xb8\x70\x17\x32\xb3\x8a\x8e\x34\xd9\xa7\x3c\x49\x02\x82\x15\xe5\x95\x18\xa9\x97\xd1\x09\x81\x03\xe7\xa5\xc4\x2a\xbb\xa0\xef\x8a\xf3\x31\xa2\x13\x66\x9a\x5f\x44\x69\xcd\xef\x08\xc0\xe1\x47\xa4\xec\xc8\x35\x63\x75\x66\xcd\x97\x5c\xa8\x80\x0e\x5e\x15\xe8\x2f\x42\x17\x2a\xf5\x09\x5c\x4f\xcd\xea\x82\xc5\x05\x42\x62\xd2\x2c\x0f\x60\x45\x70\x28\x3c\x44\x35\xbd\x2f\x62\xb1\x3a\x4f\x6f\xed\x3a\x40\x7c\xb0\xe6\x02\x83\xea\x93\xf0\xc2\x3d\x04\x8f\xd5\x5c\x18\x2b\x8a\xfe\x5d\x01\x5f\xae\xa8\x3c\x74\xed\x08\x9e\xb8\x0f\xb2\x97\xb5\x95\xc4\xd7\xb5\xa1\xd3\xcf\xee\x32\xff\x46\xca\xcc\xe6\xa6\x1c\xaf\x1c\x5b\xc9\x8f\x08\xfc\xee\x1d\x8c\x00\x07\x5f\x1e\xe2\xb7\x56\xf3\x9a\xc0\x0c\x08\x0d\xc5\x53\xf2\xf1\xf1\xe6\x6a\x61\x97\x94\xde\x48\x8d\xca\x74\xe7\x10\x81\x51\xb6\x83\x73\x2b\xc1\x8c\x6b\xa5\xe9\x4d\x0b\xd2\x91\xfc\xee\x5b\x4b\x74\xd3\xb9\xb5\x9e\x0a\xfe\x20\x99\xf9\xbe\x64\xc1\x7c\x83\x6b\x9e\x4a\xba\xa0\x12\x71\x1a\x66\x43\xa1\x27\xaa\xf0\x31\x5b\x83\x93\xf2\x08\x9f\x41\x9a\x3c\xcf\x6f\xf5\x93\xff\x53\x6a\x67\x95\x55\x0e\xa7\x9f\x32\x10\x4b\x28\x21\x49\xac\x56\x4b\x7f\x54\xff\xb4\x56\x86\x03\x51\x48\x59\xe2\x29\xb5\x2e\x52\x31\x45\xe7\xbf\x8d\xd6\x10\xa5\xfc\x31\xb6\xe9\xd2\xdd\xbc\x48\x90\x0d\xcd\x8a\x74\x78\xf5\x51\x20\x61\x40\x16\x95\x33\xbd\x8a\x3b\x82\xa5\x33\x33\x88\x78\x8f\xd1\x3e\x1d\xb0\x46\x94\x84\xe1\x53\x04\xf9\x25\x4c\x7f\xab\xb1\xbc\x31\x99\xc7\xa4\x2a\x0b\xf8\x59\x83\x96\xe2\xc2\x02\xf8\xa6\x64\x00\x07\xaa\xc3\x1f\x8e\x29\x96\x86\x05\x9c\x6f\x6d\x3d\x53\x1b\xa0\x65\x6a\xfb\x30\x0a\x0d\x2c\x27\x4c\x42\xba\xb2\x0b\x32\x14\x6f\x57\x31\x2d\x70\x54\x8f\x52\x0f\xb0\xdb\xda\x04\x20\x04\x61\x82\xeb\x97\xae\xf2\xe6\xd2\x1c\x2f\x48\xd2\x90\x87\x48\x10\x83\xb0\xf1\x65\x85\x56\x58\xf7\x16\x9b\x1f\xcd\xb7\xf0\xda\xcb\x9b\x52\xdf\xec\xd8\x8b\x86\x41\x5f\xc3\xce\xef\x4f\xd2\xc2\x12\xa4\x4f\x48\xda\x70\x5a\xbf\x91\x1a\x3e\x95\xd2\xf4\xe1\xa9\xc1\x61\x16\x44\xa0\xb1\x14\x45\x28\x39\xeb\x5b\x64\xe3\xa1\xd0\x2e\xe1\x79\x12\x21\x16\x49\xea\xb9\x35\xa3\xbe\xf0\x8a\xcc\x74\x15\x3f\x48\xe2\x92\xb4\xb2\x60\x09\x2f\x67\x49\x6c\x20\x3f\x88\x79\x15\x10\xb7\x3b\xf1\x5b\x56\x0e\xa1\xde\x7a\x23\x3a\x55\xa0\xda\x0e\x10\xff\x62\x3d\x67\xa5\xc9\xb0\x56\x20\x24\x5b\xb6\x57\x22\xba\x1a\xa9\xde\x1c\xf0\xa6\x51\xf6\xc8\x4e\xf4\x55\xe2\xce\x2b\x6b\x55\xde\x71\x66\x60\x32\xbf\x4d\x27\xe7\x65\xa7\x70\xb8\x1f\x09\xba\xab\x1a\x97\x33\x86\x9a\x4f\xbf\x51\x07\x3a\xac\x6c\x67\x38\x57\x99\x41\x11\x86\x59\x0d\x9a\x55\x84\x74\xdb\x19\xea\x8d\x23\xdd\x95\x4b\x73\xf4\xc6\xb8\x57\x5a\xbc\x60\x98\x9f\x2a\x6f\x48\x54\x3d\x26\xe2\x5b\xee\x24\x5f\x31\x46\x0f\x5f\x3d\xd1\x55\x86\x76\xf5\x55\xff\x6c\xa4\xb7\x83\xab\x31\xa1\x6c\x55\x13\x27\x81\x44\x28\x82\x1e\x78\x08\x03\xc7\x37\xc0\x16\xe2\x27\x56\xed\x03\x6b\x8f\x54\xe2\xef\x8a\x8f\xe6\x99\x25\xf5\x78\xb5\xc8\x6c\xac\x91\xaa\xe9\x28\x98\xda\x0b\x9a\x9f\xeb\x57\x01\x97\x90\x1e\x85\xfe\x77\x6c\x48\xba\x0b\xc7\x53\xd4\xc6\xf3\x98\x6b\xe7\xb3\x5f\xb7\x91\xdd\x88\xab\xe4\x1a\xc9\xcf\x77\xfe\x73\x92\xb4\x87\x64\x70\x93\x32\x5b\x89\x56\xac\x99\x4b\x3f\x96\xda\x16\x3d\xad\xc2\x24\x67\xdd\xea\x09\xba\xbf\x61\x43\x7f\x2f\x59\x8a\x12\x65\xf3\xea\x4a\x6b\xfb\x08\x1b\x8f\x51\x14\x2e\x1d\xcb\x98\xa3\xad\x1a\x99\xb4\x30\x84\x56\x3c\x95\xc4\x73\x24\x79\x5f\xab\x27\xf8\x21\x9a\x6e\x48\x29\x9b\xf4\xba\x7d\x29\xa7\x1f\x7a\x62\xda\x24\xdd\x07\x52\x9e\x81\xf0\xfb\x83\x82\x4d\x0a\xe2\x92\xe3\x20\xd7\xef\x81\x47\xf1\xf3\xb2\x81\x2c\xbc\xc8\x64\x66\x71\x2d\xb2\xcd\x73\x6a\x55\xdd\xd2\x60\x97\x23\x98\x23\xfa\x5f\x90\x9d\x78\xb2\x8e\x5f\x0d\x0a\x5c\xbf\xa4\xc0\xbc\x39\x2b\xb9\xc3\x47\x42\xd7\xea\x5a\x9c\xd7\x01\x1d\xc6\xf3\x51\x8e\x3f\x9f\x8d\xe9\xba\x21\xcd\x1a\x61\x8c\x9a\x9b\x93\x7e\x3a\x82\x31\xbe\xb0\x02\x17\x0a\xb2\xc1\x1e\x20\xca\xf0\x8f\x45\x91\x02\x8d\x1a\xa8\x86\xce\x09\xbb\x80\xaa\x26\x40\x46\x36\x4c\x4c\xdf\x8c\x77\x1c\x76\x7a\x1e\x0e\xf8\x92\x39\x01\xc4\x28\x2d\xbd\xf4\x13\xbc\x82\x34\x7e\x5e\xd4\xb5\xb0\xcf\x10\x12\xf8\xa5\x90\x87\x96\x96\xb2\x85\xad\x13\xa9\xb5\xc4\xd7\x3f\x26\x54\x20\x73\xde\x6f\x54\xdc\x42\x96\x19\xaa\x73\x85\x3e\xb4\xa8\x48\x5d\x28\xd6\x5a\x4d\x6c\xc4\xf6\x43\x0d\x66\x6e\x44\x6d\x74\xe4\xe1\x17\x4c\x6e\x00\x8e\xdf\xb0\xc1\x6c\x36\x25\xc2\xb6\xa5\x14\x37\xc2\xac\xd0\x10\x29\xff\x91\xda\x8f\x14\x50\xde\xe0\xbc\xa9\xea\x81\xf9\xc2\x90\xaf\xc3\x1b\xa0\xf0\x8d\x44\x4b\x55\x3e\xfa\xdc\xd0\xb9\x57\x55\x3a\xbc\x76\x16\x5e\x02\xe3\x9a\x9f\x9d\x20\xdd\x55\x18\x6e\xed\xd4\x4f\x52\x67\x12\x07\xe3\x22\x5d\x2d\x0f\x21\x01\x8a\x69\x7c\x4a\x37\xbd\x22\x0a\x12\xfa\xb8\xb3\xf4\x16\x6c\x34\xe6\x59\xf8\xff\xc8\xab\x19\x85\xf9\x77\x12\xaa\x73\x4b\xe2\x46\x5e\x8a\x84\xed\xd2\x87\x04\x65\x64\x96\x53\xc8\x43\x77\x49\xf0\x8d\xf6\x12\x91\xd8\xa9\x48\xbb\x60\xed\x4e\xf4\xb9\x07\xe4\x57\xe6\x8d\x38\x09\x63\x8e\x83\x23\xf2\xc1\x01\xad\x72\xbc\x5f\xd8\x40\x83\x74\xdf\xee\x33\x3b\x55\xb5\xf8\xaa\x64\xa1\xc6\x71\x87\x45\x1a\x22\xad\x80\xe1\xd4\x67\xae\x99\x52\xd0\x1f\x45\x35\x7f\xf9\x07\x83\x90\xe9\xa6\x5d\x3c\xc2\x18\x83\xae\xce\x5a\x45\x80\x1a\xd9\x9c\x9a\x93\xc9\x1d\x6b\x84\x93\xb6\x00\xa9\x41\xdd\x95\xca\x4d\xa8\x59\xbf\xc8\x7f\x3f\x97\x3b\x93\xca\x8d\xb2\x7e\x57\x3e\x04\x7a\xd2\xb5\xb7\xb1\x11\x5f\xd1\xb5\xe3\x47\x56\x76\x9f\x7c\x33\xd7\x38\xfe\xdb\x00\xcb\xc3\xc3\x08\xd0\xca\x2a\xf8\xb7\x14\x32\x0c\xe4\xc3\xa4\xfa\x2a\xbc\xd0\x65\x41\x50\xcc\x7b\x46\x88\x93\x55\x40\x3c\xd6\x22\x36\xb7\x13\xc7\xf5\xb7\xeb\x17\x4e\x7f\x47\x4c\x4e\xe5\x8c\x84\x88\x44\x72\x4f\x5a\xf5\xe1\x83\x44\x5e\x25\x94\x64\x32\x11\x11\xa7\xb1\xa9\xc4\x0b\x09\x74\xc4\x51\x60\x04\x3f\x5e\xe0\x4c\xc3\x85\xa1\x9b\xb3\x0f\xf2\x26\x9d\x94\x54\x44\x4f\xa9\xe4\xc5\x56\x75\xf7\x8d\x54\x98\x77\xe4\x23\xd7\x4b\xdf\x04\x49\x0b\xca\xde\xb1\x93\xa9\xc3\x4e\xf4\xf8\xd9\x44\x21\xc6\x01\xda\xf5\xfc\x88\xe9\x3f\x92\x34\xcc\x92\xb6\xfc\x6b\x2b\x62\x25\xb0\xa2\x26\xc2\x0e\x8f\x22\xef\x22\x0b\x38\x21\x5f\x89\xf8\x46\xe0\xd7\x03\x6b\xac\x8c\x76\x84\xe1\xe1\x99\x3e\x9e\x94\xb9\x1b\x65\x01\x90\x2d\x47\xcb\x82\x87\xea\xd3\x0d\x85\xf7\x72\xb6\x1b\xd6\x48\x4b\x40\xe3\x5a\x62\xde\xa4\xf5\xca\x55\x70\x6d\xc5\x4d\xff\x16\x8e\xfc\x79\x6a\xcb\xd8\xf9\xf7\x69\x1e\x88\xb8\x4b\x04\xe2\xf4\x6c\x46\xae\xd1\x36\xca\x4d\x08\xd8\xad\x49\x2c\xd2\x2c\x72\xf8\x4e\x4b\x4a\x8d\x86\xe9\xb9\x1f\xf7\xb0\x84\x98\x8a\xa0\xaa\x97\x39\x94\xa4\xb8\xdc\x50\xa5\x5d\x82\x9f\xd9\xbc\xbd\xd9\xfb\x5f\x37\xc1\x2f\x7c\x7d\x8a\x89\x41\xfa\xa8\x73\xa8\xc4\x31\x77\x86\xdd\x01\x82\x96\x35\x4a\x1a\x97\xa7\x89\x55\x9e\xca\xa0\xb9\xd2\x4c\x43\x96\x9e\x20\xce\x1d\xe3\x44\xf7\xf0\x20\x18\xc7\x56\xb5\x8c\xd4\x2a\x31\x23\xbd\x51\xe0\xaf\x03\x01\x69\x8a\x24\x3b\x60\x8f\x91\xbb\xb6\xcb\x9c\x14\xd1\xe7\xbf\xb8\x3b\x57\x3b\x5f\x4a\x10\x66\xc5\xb6\xf2\x57\xee\x58\x25\x75\xba\x2d\x8b\xce\x3a\x77\xf1\x64\x11\x9b\x88\xba\x7c\x09\x53\x72\x62\xe9\xa8\xb6\xc3\xf2\x04\x42\x65\x3d\x26\xba\xd8\xc5\xed\x27\x97\xa0\x98\xab\x9b\xcc\xd0\x61\x0f\xe5\x01\xce\xf4\x0d\x73\x8e\x1b\x22\x95\x89\x71\x3f\xd8\x68\xa1\x0e\xa3\x72\x86\x48\xba\xdd\xcc\xc0\x18\xf5\xa4\x44\x9c\x14\x3c\x7f\xbc\x94\xb7\x0c\x6a\xc7\x10\xe9\x2d\x4d\xf0\xc6\x3c\x48\x26\xb2\x8a\x7e\x85\xc4\x74\x21\x03\x0b\xdb\x26\x71\xca\xa5\x43\xa3\xc4\x46\x0a\x19\xc2\x87\x47\xb7\xaf\x9f\xd8\x79\x13\xb8\x7f\x1d\xde\x73\x2e\xf9\xb7\x2d\x0c\x7b\xc0\xf6\x64\x2b\x0b\x8d\xe8\x61\xe3\x46\x06\x36\x9b\x7d\x70\x62\x76\xe4\xca\x6a\xfa\x37\xea\xea\x9c\x57\x96\xa2\x5a\x59\x72\x41\x43\xef\x32\x0d\x03\x49\x00\xcd\x42\x40\xdc\x28\xd1\x42\x57\x55\xd5\x3f\x29\x67\x40\x8e\x91\x39\x8f\x2f\x0b\x7d\xde\x2f\x67\x9c\x87\x3d\x8a\xf8\x3c\xa4\x96\x61\x1a\x9b\x7f\x28\x4c\x36\xc9\x43\x0a\x03\xcc\x9c\x1f\x6a\x89\xeb\x7d\xf7\x8a\x59\x6d\x44\xf1\x6d\x92\x8c\xd6\x6d\xde\xa4\xd1\xb0\x36\xad\x9f\x6a\xbe\x96\x38\xce\x8b\x59\x6a\x40\x2b\xbb\xc7\x56\x3f\x2a\x2b\x67\x04\x96\xe7\x47\x91\x67\x89\xc2\x0d\x4b\xa4\x4b\x9d\xec\x80\xbd\x46\xfd\xaa\x0e\x3d\xa0\x06\xac\x2d\x76\x8c\x8b\x2f\xe3\x4a\x8c\x1f\xc1\x17\x54\xb8\x5e\x1a\xc1\xa0\x17\x15\x41\x95\x06\xb7\x9c\x49\x95\xb7\xe0\x1e\x8d\x87\x34\x93\x00\x7c\x50\xf2\x6b\x69\x50\x2f\x51\xce\xf0\xe2\x44\x8d\x86\xe5\xde\x2a\x1b\xac\xe1\x3e\xa6\xcc\x88\xbd\x88\x1f\x4f\x22\xb4\x67\x2f\x64\x9b\x31\x2c\x4c\x6e\x64\xa1\x27\x30\x93\x03\x97\xa6\x67\xfd\x35\x58\x43\x86\xbf\xc9\x62\x7b\xd0\xba\x4e\x26\xc9\xcb\x4c\xd8\xc0\xd8\x4d\x8d\x1b\x2b\xc9\x3f\x5d\xcc\x2b\xb1\x44\x59\x4f\x97\x51\xd5\x09\xad\xb7\xce\x0b\x7b\x08\x0e\x1a\x9d\x10\x11\x43\xfa\x5a\xe9\xa9\x6f\x74\x60\x53\xb8\x68\x81\x5e\xda\xb9\x7b\x99\x35\x38\xb2\xc4\x4f\xc7\x62\x60\x13\x46\x66\xd9\x45\xd0\x67\x06\x77\xda\x58\xbe\x49\xc2\x6a\xba\x33\xc8\xfa\xb3\xe1\xfc\xa7\x6e\x64\xec\xd3\x43\xc7\xf5\x69\x46\xb8\xf3\x4b\xa4\x0e\x1b\x4d\xb6\xcf\x56\xd1\x0d\x6d\xe8\xb3\xb0\xcc\xc9\x68\xa3\x4a\xa6\x8b\x4f\xc7\x22\x96\xa8\x7b\x89\x59\xba\x05\x21\x7a\xb5\x23\xc3\xe8\xe3\xff\xe5\x5d\x73\x91\x7f\x46\xad\x66\x03\x76\xf0\x67\x4b\xd2\xba\x27\x07\x09\xb5\xec\x81\x25\x9a\x21\x5e\xc8\xbd\xe6\x2e\xc1\x69\x15\xeb\x9b\x22\x63\xf2\x5d\x0b\x68\xa8\x75\x3d\x64\x0a\xa4\xfe\x40\x64\xcd\xc1\xca\x69\xa4\x0e\x48\x88\x0c\x9b\x20\xf3\xba\xe8\x6e\x84\x9b\x02\x81\xf0\x87\x75\x16\x18\xd6\x8b\xdc\x1f\x75\xf5\x98\x75\x7e\x32\xc6\x50\x17\xf1\xd2\x21\x07\xde\xd0\xea\x2e\x4a\x33\x3d\xf5\xf6\x33\x09\x6a\x73\x93\x72\xcb\x67\x90\xd4\xfc\x88\xf0\xa0\xaf\x69\x18\x34\xfb\xd7\xd1\x52\x13\xb9\x26\xeb\x18\xb1\xf3\xf2\x38\x8c\xa7\x71\x2a\xf2\x08\xe3\x35\x97\xb8\x91\xdc\xc8\x75\xca\x09\xdc\xbe\x7b\x26\x5d\x48\xa3\xf5\xe4\x2f\x47\x89\x4b\xe1\x78\x21\x96\x7e\x13\x74\xbe\x0a\x1b\x84\xa9\x43\x11\x57\x57\x8d\xe2\x08\x8c\xd2\x88\xa3\xa9\x85\x41\x11\x81\x79\x93\xa7\xcb\xd7\xac\x3b\xc7\xfa\x3d\x38\x0b\xcd\xdd\xa1\xde\x73\x01\x8a\x49\xae\x83\x32\xcf\x45\xa1\x9d\x8d\x64\xde\x8c\xa4\x4a\x2d\x7b\x88\xce\xa4\xd6\x30\x17\xf0\xd8\x84\xf3\x2f\xb2\x1f\xaf\xb1\xe9\x8b\x8d\x94\xf3\x7a\xba\xff\xcc\xf0\xbc\xc9\xc8\x50\xd9\xbf\x59\x13\xff\xa1\xf9\x09\xec\x06\x5f\x64\x8c\xda\x12\xc4\x3a\x1e\xa6\x34\x8a\x7e\x10\x16\xbd\x51\xa0\xcc\x32\x3c\xe4\x42\x40\x00\xd7\xbd\xa3\x71\xd2\x06\x95\x59\x8c\x51\xb8\x14\xf3\x74\x0f\x89\x74\x88\x02\x68\x8c\xc8\xb1\x57\x41\xec\x7d\x5b\x19\x18\x9b\xd0\x4b\x8f\x39\x1e\xd3\x5a\x7b\x26\xf4\xf6\xa4\x7f\xc8\x91\x9e\xb8\x6e\x99\x64\xc9\x48\xf1\xec\xe4\xf4\x78\x07\x24\x5f\x66\x06\x5f\xab\x20\x66\xb6\xa7\xff\x93\x31\xc5\xe4\x28\xb5\x62\xb3\xfc\xff\x5f\xaa\x03\x40\x74\xce\x25\x1e\xe0\x48\xe6\x5a\x2b\x90\xba\x15\x90\x4d\x4c\xd7\xe7\x89\xac\x39\x45\x5e\xe7\x0b\x2e\x02\xa4\x30\x65\x7d\x77\x8e\x43\x05\xd3\x15\x07\x01\x35\x52\x3b\x3e\x68\xfc\x3d\xfc\x48\x34\x22\x41\x13\x18\x61\xd9\x46\xd2\xaf\x5e\xe8\x32\x8a\x3c\xbb\xc8\xbe\x25\x6f\xbd\x4a\xde\x7a\x9d\x04\x2d\x2d\x1f\x69\xc2\xc8\x6a\x47\x82\xa5\x5e\xd8\x36\x72\xcc\x6d\x81\x7c\x0b\x70\x8f\x58\xbd\xc8\x54\x84\x5d\xc1\xe2\x09\x99\xa4\x81\xde\x66\xbf\x60\x27\x69\x27\x5e\x45\x65\x37\x4f\xe8\x41\x2f\x76\x87\x41\x48\x50\x4c\x44\x14\xb5\xa9\x93\xe6\x5a\xe7\x4c\x6a\xcd\x07\xc2\x41\x90\x01\x8d\xd2\x3d\x93\x05\x6b\x33\x0c\x42\x66\x71\x63\x9f\x76\x2d\x99\x4a\x95\x72\xbe\xc8\x25\x1c\x8f\x4d\x7e\x66\xd4\x1e\x1e\xcb\xe6\x91\x2d\x85\x72\xf4\x8c\x17\x8a\xd0\xcf\x46\xef\x5e\x08\x92\xec\x65\x30\x46\x20\x08\xca\xa0\x38\x68\xc4\xe7\x37\x79\x12\xe2\x8a\x6f\xbd\x04\x26\x4f\x5d\xdb\x83\x68\x90\x42\xbb\xb5\x52\x4d\xc6\xa6\xfd\x92\xa7\x9e\x4a\x82\x7a\xa1\xfc\xe1\x65\xac\x0b\x18\xa9\x65\x7e\x45\xe5\xe4\xf3\x73\x1f\x65\x74\xc4\x9f\xa4\x9d\x22\xba\x82\x60\xdc\x8e\x4a\x14\xaa\xb4\x3f\xcf\xdd\x5b\x2b\x4b\xf0\x13\x2f\x73\x94\xae\x9d\x9d\xe0\xc9\x60\x66\x33\xb2\x00\x64\xed\x95\xb0\x85\x3a\x2c\x3f\x74\xc0\x06\x34\x32\x3b\x79\x62\xc8\x77\x80\x11\x31\xc0\x5c\x28\xca\x5e\x13\x8b\x78\xaf\x2b\x19\x6d\xcd\xba\x27\x41\x9f\xaa\xef\xc6\xdf\x3d\xb3\xb2\x50\x8d\xb3\xb8\xad\x28\xd6\x28\x49\xcf\xaf\x4f\xc5\x36\xb6\x27\x53\x37\x8b\xa4\x6e\x8a\xbf\x85\x79\x2e\x2d\x59\x47\x1a\x61\xc5\x3d\xf2\x03\x6a\x8d\x22\x39\x9d\x63\x27\x69\xfd\x08\xa7\x75\xd1\x99\xff\x0b\xfa\x02\x8b\x3a\x7a\x0b\x83\x25\x54\xdc\x2c\xc8\xc3\x39\x48\xcf\x99\x35\x91\x08\x99\x51\x59\x30\xa7\x83\x26\x85\x4c\x11\xa7\x1b\xd1\xec\x4f\x0a\xe9\x01\xb7\x63\x81\x4f\xc8\x76\x39\x33\xfc\x21\x39\xc8\x24\x54\xcf\x83\x92\xa7\xc1\xa7\x6b\x09\xdc\xb4\x7c\xea\x40\x26\x14\xc3\x90\x30\x75\x29\x08\x0b\xab\x6b\x83\x81\x4e\xfb\xd6\x66\x76\xcb\x76\x28\x7c\x1c\xb3\xe3\x7c\x63\xc0\xb7\xf1\x21\xd9\xf6\x2f\xb4\x2c\x8a\x16\x60\x31\x66\xce\xc2\x16\xab\x23\x4b\x00\x7e\x99\xcb\xeb\x17\xc9\xf1\x1e\xb6\x28\xf1\xbe\x65\x6b\x91\xe4\x1e\xd8\xcc\x54\x5c\x03\x7c\x32\x09\xcd\xd0\xc1\x31\xe1\x4a\x42\x67\x6f\x90\x69\xa9\x12\x12\x9f\xdb\x64\xd8\x9b\xcb\xc0\x02\x99\xe8\x5f\xe2\x70\x09\x8c\x92\x80\xf4\xea\x38\xd8\x20\xda\x1b\x1a\xa0\x78\x25\x96\x2b\xd4\x90\x24\x42\xfb\xb2\xbb\xaa\x5a\x7e\x99\x80\x86\x68\xd3\xb8\x96\x94\x6b\x86\x25\xce\x3e\x60\xe4\x8d\xbc\x79\xd9\x09\xa9\x2d\x84\xb7\xe2\x9e\x25\x17\x68\xad\xa6\x38\x40\xcc\x99\x4c\x2d\xa1\x5c\x23\xf5\x76\xd2\xce\x29\xf8\x64\xbb\xe4\x2c\x9f\x44\x9e\x95\xd3\x81\xbb\x9b\xd7\xe9\x47\x45\x52\x9b\x8c\x3c\xfa\x1d\x6a\xcc\xd5\x78\x31\x62\x9e\x0d\x31\x83\x06\xe8\xfd\x2c\x94\x34\xd2\x96\xfa\x25\xbf\x81\x35\x9c\xdf\x29\x5f\xbb\xca\xe1\x32\x13\x4f\x54\xdc\xd9\xc4\xae\x96\x11\xce\xd0\x5b\x1a\x5a\xc5\x0d\x5c\xbd\xfd\xe9\x0b\xfd\xc1\x4e\x25\x19\x91\x88\x9a\xa1\xb5\x63\x42\xec\xc7\xc5\xe0\xe5\xc2\x61\x2d\xe3\x51\x2d\x5a\x03\x3a\x52\xda\xcb\x2a\x60\xc3\x77\x04\x64\xb7\xbf\x23\x2b\x3d\xaf\xb4\xbb\x37\xdb\x09\x66\x3d\x66\x1d\x29\x76\xd4\x1d\xaf\xff\x83\x96\x30\x08\x2c\x3f\xac\xf1\x02\x24\xca\x4c\x90\x14\x2f\x16\x01\xa5\x50\xd5\x88\x5b\x55\xcb\xd8\x5a\x3b\x22\x84\x6f\xdb\x3d\xbb\xb1\xec\x25\xf8\x41\xe9\xc8\x4e\xbc\x13\xa8\xec\x12\x2f\xee\xbe\x47\xf5\x0a\xb2\xcd\xf0\x5d\x48\x54\x31\x9c\x85\x63\x58\xb3\xc0\xb9\x7e\x6b\xa5\x11\xba\x07\x75\xce\x49\x7c\xb5\x72\xfb\x56\xe0\x4c\xca\x03\x1a\x08\x94\xff\x81\x15\xce\xc2\x01\xd4\x68\xb7\x4c\x09\x17\xc7\x1f\xcc\x06\xcd\x32\xe0\x02\x6c\xf3\xab\x90\x74\x6c\x3c\xab\x4b\xf1\x01\xd8\xe1\x37\xc9\xd8\x21\x4b\x4d\x05\xea\x7d\xea\xc3\x2f\xbc\x0d\xd9\x54\xe5\x15\x2e\x97\x6c\xdf\x1b\x2e\x4c\x7f\x34\xe8\xaf\x2c\x65\x2b\x24\xb2\x8c\x3e\xfb\xfc\x77\x89\x0a\x2f\xdc\x41\x44\xb9\x4a\xd3\x67\x05\xd6\x5f\xc6\x47\xc2\x66\x48\x07\xcf\x53\x4c\x6d\xbd\xf2\x73\x04\xb5\x06\x2b\x6f\x60\x11\x70\x18\x9c\xdc\x34\xe2\x8d\xba\x5b\xb6\x89\x3b\xfa\x26\x75\xd1\x3f\x2d\x6a\x42\x67\x0b\x6b\xd9\x4e\x32\x17\xb0\x92\x45\xc3\x8d\x05\xda\xa8\x06\x0a\x32\x87\x59\x80\x55\x39\xfd\x85\x1d\x92\xae\x86\xb9\x15\xc8\xe7\x8f\xa6\xc9\x7e\x44\x32\xc2\x26\x23\x53\xc4\x7a\x6b\x57\xc1\xcc\x87\xfb\x4e\xe3\x50\xab\xe2\xe7\x10\x8a\x25\x4f\xcc\x0e\xa4\x45\xd8\x55\x55\x14\x1f\x02\x20\x7e\xb0\x19\x62\xf1\x25\xeb\xf7\xda\xf2\xe3\xa9\x99\xe8\x01\xb6\x59\x7e\x6d\x4b\x62\x3a\x58\x5b\x59\x26\x99\xdd\x70\x99\x40\xdd\x5e\x22\xde\x4b\x63\x67\x93\xd8\x91\x77\xd3\xee\xfb\x4c\x22\xdc\x63\x58\xaf\x9f\xee\x85\xd0\x5d\x13\x75\x66\x3f\x33\x1f\x70\xdf\x98\x9c\x60\xf1\xae\xfc\x5c\xe7\x4a\xe1\x47\xa9\x1a\x2e\x28\x44\xfc\xda\x68\xcd\x3b\x38\xd9\xa9\xdb\xb4\x25\x59\xc6\x26\xed\x37\xc5\xd4\x65\x0d\x0b\x8f\x51\xe6\xf8\x3f\x2d\x71\x0d\x80\xc8\x9b\xb8\x0b\x39\xc6\x44\x9e\xd9\x9a\x0f\x92\xd1\x08\x9b\xf6\xf6\xcb\x0b\x65\x25\x2a\x7a\x2a\x11\xc0\x93\x59\xfc\x27\xe7\x1c\x3d\x82\x75\xae\xb8\x7f\xa8\x58\xfa\xce\x3c\xc4\xeb\x20\x07\x02\x33\xe2\x2b\x89\x57\xd0\xee\x32\x53\x90\x0c\xa1\x11\x73\x16\x0c\x3b\xca\x51\x8a\x95\xd5\x97\xd0\x52\x99\x12\xa8\x03\x50\x1b\xe1\x4c\xb5\x61\x45\x17\xe3\x8c\x8d\x34\x32\x4a\xf1\x82\xd8\xf3\xba\xce\xe8\xde\x30\x22\x0f\xa0\xa0\x16\x2b\xc4\x77\x0c\x17\xc8\xa6\x7b\x94\x7f\x99\x2d\x24\xac\xe4\x3b\x58\xd8\xf7\xbf\x22\xef\xfe\x89\x7e\x21\x20\x6c\x4d\x23\x2c\x2f\x6b\xdb\x5f\xe6\x48\xb8\xa7\x8c\xf0\x8d\x92\x8d\x67\x6a\x9d\xae\x56\xa7\xd5\x22\x65\x65\x32\x37\x0c\x9c\x23\x61\xdc\x14\xe2\xff\xd4\x0d\x61\xe1\x8d\x5a\xf5\x68\x9b\x42\x4c\x28\xe8\x20\x73\x62\xdd\x4d\xbb\xcd\xf0\xdf\xc2\x67\x6b\x64\x04\xc5\xa8\xc9\x9e\x0e\x59\xf3\xb7\xf8\x25\x6f\xad\x6d\x59\x78\x7e\x99\x97\x4c\xbd\x1e\x6f\xc2\x84\x1c\x08\xec\xe3\xcc\x88\x59\x17\xeb\xc5\xae\x7e\xdb\xee\xde\x2f\x50\xb3\x4a\x73\x64\xae\xa9\x0e\x91\x5a\x92\xfa\x6b\x59\x8e\xb1\x8c\x76\x3a\x7c\x2e\x98\x6a\x76\x61\x04\x65\x3a\xf4\x34\x92\x36\x0d\xd6\x09\xc7\x7e\x15\x0d\x42\xea\xc7\x5d\x9a\x27\x4e\x2f\xda\xc3\xc5\xbc\x59\xbe\x45\x1c\x01\x22\xe3\x7b\xb4\x79\x77\xa2\x2b\x0e\xd5\x80\xe2\x96\x96\xad\xe3\x5f\xe2\x29\x51\xd2\x9d\x59\xd7\xb1\xb6\x07\x3f\xbd\xf1\xcd\x83\xec\x59\xac\xb0\x2c\xdb\xc8\x6c\x81\xa4\x57\xcd\x72\x40\x07\xd8\x85\x3f\x7f\x31\x1d\xf0\x54\x0e\xbc\xcd\x79\xf9\x43\x15\xfa\xe3\x0d\x27\x3f\x21\x17\xcb\xe2\x65\xbf\x37\xb5\x48\x64\xcf\xb9\xc9\x9e\x60\xe3\xd2\xc5\xa3\x14\x58\xdd\x2b\x91\xe1\x59\x3d\x0c\xeb\xeb\x15\x8e\x80\xe4\xec\x41\x45\x4a\x88\xd7\xdd\xa4\x21\xe1\x21\xd9\x7a\x43\x69\x6b\xd0\x94\x04\x0b\x4d\xcd\x74\x0f\x50\x0d\xe0\x06\x8e\x4d\x3f\xf9\x0e\xbd\x29\xfb\x25\x54\xda\xfc\x34\xd3\xcb\xb3\x31\xf0\x4c\xef\x0c\xfc\xf0\x3b\x4d\xc7\x13\x6c\x2f\xc8\xf9\xe1\x50\x70\xfb\xa4\x26\x87\x8a\xe0\x26\x85\x08\xe1\x1c\x30\x0a\x73\x4e\xb9\xe6\x3d\x2c\xe7\x70\x49\xaa\x7b\x53\x63\x94\xb0\x66\x8e\x52\xba\xb3\x69\x9e\xe8\x9e\xba\xb5\x9b\xd4\xf6\xa5\xa5\x5d\x06\x3c\xc4\xae\x0b\x5a\x5a\xe5\x55\xc7\xba\xf6\xdc\x5c\x26\xa1\x4a\xba\xa2\x0d\x32\xc8\xa4\xf8\x57\xec\x65\xfe\x70\x14\x6e\xd0\xb7\xce\x57\x38\x3f\x43\x9b\x72\x44\xf0\x11\x4e\x4f\x1a\xa7\x46\x80\xa1\xdd\x0f\x87\xca\x94\x23\x3f\x09\xc8\x40\xe6\x66\x58\xd8\xec\xee\x40\x1a\x10\x05\x1d\x72\x44\x8b\xc2\x1c\x63\xe5\xb4\xe2\x25\xa9\x49\x28\xec\x87\x59\x10\xb4\x13\x06\xaa\xb5\xe5\x7b\x04\x45\x4b\x62\xec\xef\x64\xf0\x10\x4f\x51\x89\xa9\xad\x10\x57\x99\xcb\x2c\x85\xad\x0b\x42\x1f\xd0\xea\xf3\x34\x54\x9e\xb7\xf3\x82\xf8\x24\xeb\xbd\xf4\x7b\x8f\x97\x6d\x1a\xa4\x57\xbc\x4e\x7b\xd7\xd6\x96\xe7\x24\x92\x33\x73\x4a\x20\x18\x10\xd3\x47\x19\x01\xa3\x96\x74\x12\x27\xe2\xcb\x90\x9e\xca\x30\x82\x91\xe2\x92\x5d\x1c\x47\x4e\x18\x1a\x39\x7a\x43\x5a\xde\x7b\xce\xb9\x8a\x3a\x73\xb1\x55\xc3\xd0\xea\x51\xf9\x92\x24\x9d\x92\x91\x25\xed\x78\xf0\x6e\xb8\xda\x30\xb6\x16\xf4\x91\x68\x2a\x3c\x08\x84\x6c\xc7\xa4\x9f\xdd\xcb\xc1\x3f\x7e\x9c\x7e\x02\xf1\x52\x9b\x2f\x9e\x49\x83\x6b\x0b\xf6\xd9\x2d\x02\xff\x3c\x46\x54\xf9\xa5\x0d\xe5\xe1\x14\xa1\xd0\xa1\x8b\xb0\x92\x57\x35\x02\x0a\x86\x9d\x9d\x72\x22\xc4\x6e\x6a\x15\x45\xb4\xa2\x75\x51\x34\x6b\x09\x5d\xc0\xa5\xc2\x42\xd7\x10\x59\x6e\x2d\x82\xf4\x26\xb6\x80\x13\x71\x77\x51\x81\x96\x59\x90\x79\xe6\x1b\x87\x43\x05\x9d\x56\x6f\x23\x03\xaf\x60\x25\xfa\x8a\x4f\x4c\x74\x7c\x4c\x8b\x54\x0b\x1f\xa4\x2d\x7a\x68\x8b\x34\x91\x4c\x87\x15\x73\xd5\xf5\xae\x3e\x96\xc7\x2c\xe5\x2e\x7e\x0e\x94\x1a\xf5\xdb\x4c\x4d\x61\xdb\x21\x6c\x26\x7b\xf2\xa9\x50\x88\xce\x0c\x48\x2d\x53\x75\xfe\x9b\xa6\x26\xe8\xb8\x8b\x4a\xe3\x44\xf7\xc3\xe3\xd3\x5a\xf8\x8d\x48\xd9\x5a\x5d\xa1\x77\x03\x26\x8d\x24\x2e\x71\x65\x37\xb2\x66\xb0\x66\xf1\x38\xe2\x85\x03\x67\x93\x9e\xa0\x45\x8c\xcb\x2c\x5c\xcc\xca\xf4\x2c\x63\xd5\x6b\xbc\x83\x5d\x5e\x05\xf1\xf8\x67\x53\xd2\x0a\xe6\x6f\xb5\x1d\xe7\x99\x83\x36\x94\x25\x61\x93\x86\xd6\x09\x3a\x1c\xec\x81\x74\x5a\x57\x5c\x73\x19\xa6\xb4\x62\x6a\x7f\x1c\x24\xfa\xae\xad\xfc\x88\x1d\x15\x5f\x5c\x2c\xc0\xd8\x71\x4b\x49\x0a\xc5\xa1\xbf\xb3\xcc\xa4\xb2\x89\xbf\xd3\xe9\x7e\xd7\x89\xc0\x73\x2b\xd8\x2d\x2c\x6b\x2d\xf7\x03\x63\x34\xcb\x6c\xee\x20\x6c\x14\x04\x85\x8b\x4f\x8f\xdc\xf6\x7e\x29\x1a\xaf\xd3\x0d\x43\x03\x16\xd6\x25\x59\x16\xae\xae\x28\x2f\xa2\xd4\xbf\xb2\xa4\x41\x95\x65\xc5\x10\x4c\xf0\x88\xec\xed\x5c\x6b\xcd\xd3\x3b\xb5\xe2\x21\x54\xe4\x81\xb0\xec\xf7\xf4\x91\x08\x6f\xba\x76\xa5\xba\xb6\xb2\x8d\x52\x02\xd2\x5d\x5c\x19\xa6\xa8\x9e\x51\x3b\xf5\x59\xe2\x7a\x46\xba\x7a\xdf\xf9\xa2\x10\x2a\xe4\xe7\xbb\x3a\xd0\x14\xd1\xb2\x72\x7c\x44\x1d\xc9\xc3\xc0\x59\xc7\xb8\x1f\x4a\x85\x52\x45\xb5\xa1\x29\xe5\x9b\x8c\x51\x29\xaa\x15\x76\xf2\x97\x26\x18\x02\x22\x9c\xc5\x32\xed\x94\xd3\xb9\x0e\xd2\x32\xd4\x19\x96\x7e\xe5\xc8\xa2\x70\x1d\x3a\x11\xa5\x12\xba\x2b\xdb\xa2\xf6\xc8\x07\x48\x85\xfb\x3a\x01\x1e\xe3\x48\x26\xe9\xb4\x2e\xc8\xd5\x59\x74\x2c\x21\x8e\x52\xcb\xef\x4a\x6a\x58\xcc\xa5\x00\x3e\x6f\x17\xf6\x0f\xc5\x0f\xc8\x7c\x8c\xf5\x52\x4d\x95\x0e\xe4\xac\x5b\x90\x83\x30\x80\x3e\xa5\x04\x67\x69\x58\x5e\x44\x09\xac\x17\x28\xde\x47\x54\xaf\x49\x7f\xe4\x21\x21\xe9\x23\x08\x8b\x68\x22\xc1\x5e\x44\x8e\x47\x26\xbd\x15\x1f\x64\x25\x4c\xb7\x0e\xce\x47\xc7\xad\x10\xe0\xcd\x34\x49\xb5\x8c\xeb\x17\xff\x20\xc6\x48\x0d\x63\x15\x56\x17\xc0\xa4\xe0\x48\xb6\x7b\x7b\x0c\x58\xc4\x8d\xf9\xd8\x90\x39\x7f\x83\x7d\xe0\x49\xee\x87\xae\x76\xab\xaf\x09\x70\x8f\x16\xcc\xba\x15\x85\xf9\x50\x14\xe3\x22\xda\x5e\x89\x75\xe6\x78\xdf\x3a\xba\x54\x17\x84\xf5\x85\xed\x51\x5c\x39\xeb\x69\xa4\x47\x04\x50\xa3\xb5\xa6\x41\xf0\x24\x1e\xa9\x49\x0f\x08\xe2\xa5\x44\x33\x29\xb4\x5e\x80\xd0\x99\x23\x2f\x9e\x6c\x09\xae\x08\x00\x12\xa6\xda\x75\xa4\xbe\x23\xc3\x77\x46\x7b\x45\x94\x6e\x80\xb4\x4c\x68\x50\x3e\x89\xe3\xfd\x7f\x80\xaf\xf6\xe0\x4c\x44\x76\x22\x8a\xba\x39\x86\x07\x21\xe9\x67\xe3\xdc\x57\xe0\x09\x1b\x69\xf6\xbd\xb4\x2d\x37\x75\x0f\xe7\x4b\xb8\xa7\xed\xbf\x2e\x0f\xcc\xd2\x12\x32\x7a\x40\x72\x91\xb3\x3d\xfa\xc3\x12\x45\x07\x46\x6d\x57\x7c\xb4\x52\xcc\xd2\xf8\xc9\x00\x87\x2a\x6f\xa7\x40\x4d\x0b\xe1\x61\xe3\xd4\x63\xb0\xf7\x08\xef\x61\x98\x38\x5e\x42\x67\xd6\x0c\x4a\x56\x10\xc9\x56\xf4\x6d\xd0\x67\x6e\x40\xac\x67\xd0\x5e\x89\x41\x79\xd8\x8f\xa9\xae\xe4\x1f\x69\x13\x33\xbc\x59\xb0\xc0\x93\xf0\x4a\x66\x75\x6f\xaf\x83\xc0\xb5\xfd\xa5\x02\xda\x5a\x11\xe5\x09\x2d\xbf\xec\xb6\xf5\x76\xe6\x28\x2d\x9c\xab\xd4\xee\x9f\x01\x3c\x0c\x8c\x08\x84\x0a\x74\x67\xeb\x8c\x70\x16\xf5\x5e\x9e\xea\xa5\xf4\x7f\x8c\x58\x65\xca\x3b\x49\x28\x1a\x97\x97\x0c\xf8\x66\xd7\x77\x1b\x85\x88\xae\x36\x8b\x36\x82\xd7\x9f\x50\xe6\xbc\x6d\x28\x10\xfc\xd2\x43\xba\xa2\x75\x4c\xd8\xcd\x48\x29\x11\x74\xdc\xd2\x0d\x1d\x83\x41\x6e\x13\x31\xe8\xc1\x82\x74\x5c\x15\x6f\xe5\x25\xf4\x4f\x33\xca\xfd\x6f\xe1\x90\x5f\xb5\x0e\x36\x0d\x03\x7b\x79\xe1\x3c\xce\x8c\x38\x30\xe5\x30\x0c\x83\x1e\x11\xa2\xdf\x42\xeb\x77\xfb\x92\xdb\x23\x20\x6e\xd0\x92\x5a\x42\x4e\x38\x8e\x40\x25\x8d\x92\x15\x35\x86\x7e\x69\x34\x9f\x95\xd1\xdb\xfa\xfe\x84\xe0\xfb\x8d\xb4\x87\xf6\x6e\x66\x16\x46\x6a\x20\x8b\x2b\x75\x30\xc9\x20\x15\x81\xb4\x4f\x34\x7b\x47\xaf\xeb\x45\x67\x42\xd8\x88\x0b\xfe\x81\x49\xbf\x17\x3d\xe1\x97\x03\x5c\x6f\xc0\x0f\xea\x98\x50\x17\x3e\xa9\x7e\xc7\x20\x90\x4e\x01\x99\x34\xca\xc2\xd3\x28\x92\xbf\x09\x25\x56\xa1\xb2\xb5\xff\x51\x8b\x2b\x1e\xdd\x1c\x01\x8c\x5e\xbb\x6e\x96\xe2\x7d\xb8\xf8\xa4\x6f\x19\xa5\x72\x0c\x8f\x77\xd9\x9a\x29\x44\x2b\xdb\x12\x75\xee\xf7\xa2\x44\x98\x07\xcd\x05\x50\xce\x0c\x61\x37\x94\x90\x8b\x42\x06\x1d\x1d\xfa\x74\x67\xe6\xa6\xfe\x6c\x68\x19\xa8\xd0\xd5\xf3\x4b\x46\x59\x84\xfa\x8f\xf6\x6a\x52\x0a\x47\x49\x6b\x8c\xa4\xcd\x02\xfe\x46\x8a\xca\x43\xd8\x27\x45\xea\xe8\x74\x2c\x63\x8b\xea\x71\xd1\x89\x7b\x72\x49\x8b\x09\x93\xad\xf9\x15\x42\x34\xc5\xce\xfa\x1c\x55\x53\x8b\x5a\x97\x42\x65\x16\x0c\xf8\x33\x89\xcf\x11\xd7\x0d\x79\xfe\xaa\xb0\x93\xb4\x87\x10\x3a\xca\xf4\xe1\x41\x8d\xc6\x72\x04\x5b\xd2\xa4\xdd\xaa\x0e\x2d\x71\x25\x5e\x82\x28\xcc\xe2\x4e\x8e\xeb\xed\x05\x73\xde\xa5\x6d\x89\x2f\x2a\xbf\x7a\x2c\x71\x2a\xef\xc6\xe3\xe0\xc7\xf2\xc0\xf3\xc3\x06\x88\x3e\x34\x3b\x32\xb0\xf2\xe1\xd3\xc1\xdb\x0d\x3c\x4c\x36\xd4\xd6\xd3\x03\x3b\x92\x69\x35\x35\x84\x24\x43\xed\x11\xc7\x01\xea\xae\x24\x03\x6f\x66\x47\xff\xd2\xb4\xfe\x04\x90\x38\x69\x9b\xfa\x2a\xa3\x70\x6a\xd2\x98\x40\x3d\x3c\x4f\xd1\xd7\x37\x41\x2b\x8b\x8b\x24\x2d\x18\x7d\x92\xb8\x7f\x13\xb7\x88\xdc\x4f\xb5\xb1\xf4\xcf\xc6\x4f\xfd\x2e\x51\xa2\xbc\xe2\x92\x87\xbb\x94\x58\x05\x2b\x33\x2d\xaa\x41\x5e\xe5\xe4\xb3\x43\x6b\x12\x7d\x33\x86\x96\xc7\x62\x9b\xd8\xc2\xda\x5f\x41\x1a\x4d\x6c\xe3\x87\x27\xce\x12\x5e\xb8\x6e\xe4\x88\x21\x91\xde\x81\x53\x62\x08\x77\x66\x6d\x73\xd0\xf9\x30\x3b\x61\x15\xd5\x05\xc0\xf5\x40\x98\xc0\x53\x9a\xf2\x6c\xd0\xb4\x5f\xc8\xf7\x2a\x8b\xd9\x05\xc4\xcb\xad\x4f\x32\x96\xe3\x34\x42\xea\xe5\xf4\x9c\x24\x5f\x89\x8c\xe8\xf6\xc0\x91\x8a\x3d\xa0\x61\x51\x20\xbe\x36\x29\x47\xfa\x42\xa3\x40\xf5\x78\x0a\x6b\x5e\x03\x26\x48\x46\xfb\xcd\xd3\x9e\x49\x83\x35\x5c\x10\x1a\x9c\xe0\x68\x1e\x03\x52\x20\x3b\x58\x4d\x24\x23\x64\x58\x6f\x06\xa3\x97\xd1\x1c\x45\x97\x61\xe9\x8f\xd2\xcf\xef\x95\xa8\x99\x7d\xba\xa4\xd6\xa4\x80\xb4\x87\x9e\x6c\x36\x06\x97\x66\x5a\x7a\x4d\x92\x2c\x50\x60\xe8\xaa\x2d\x82\xc6\x2f\x48\x8b\xa6\x33\x9e\xde\x97\xb9\x62\xdb\xc8\xd1\x75\x34\xc7\xd5\xdf\xc2\xb9\x64\x63\xda\xce\x86\x82\x0d\xf6\x0f\x1c\x60\x73\xec\x58\x94\xb3\x06\x44\x8c\x27\x35\x23\x44\x0d\xf4\x0a\x03\x02\xae\x41\x28\xe6\x86\x09\xe5\x9f\xef\xc8\x71\xfa\x65\xc4\x39\x64\xe9\x82\x63\xfa\x25\xe9\xc6\xe5\x28\x6d\x62\x6c\x27\xb2\xf9\x25\x52\xb2\x3c\x02\xe1\xf3\x52\xe7\xe4\x1b\xd7\x10\x69\x40\x49\x52\xf2\x24\x38\xd2\xf2\x83\x8e\xaa\x88\x97\xfe\x09\xcd\x7a\x3c\xb6\x0b\x17\x21\x0d\x1d\x5d\xdd\x47\x00\x23\x52\x6f\xa9\x3a\x87\xde\xa5\x16\x15\xde\xee\x9f\x7e\x49\xe9\x67\xb9\x93\xab\xf9\x98\x4b\xee\x5d\x81\xc5\xf0\xdd\xc8\x4f\xf6\xc1\xbf\x15\x3d\x76\xd0\x8a\x72\x0e\x1c\x9b\xd4\x24\x78\x6a\x93\xc0\x59\x2a\x4f\xd7\xc2\x63\x2f\xa3\x42\xbf\x54\x94\x24\x9f\xe8\x95\xe7\x0e\xec\x6a\xb7\x98\x9f\xa8\xf2\x73\x7f\xcc\x28\xe0\xf4\xa2\xac\x69\x1a\x1f\xa7\x73\xf6\xa3\xf9\x90\xa3\x19\x10\xee\xe0\x71\xb6\x3c\xc3\x75\xa8\xb0\x00\x3f\xa1\x86\x56\xc3\x78\xcc\x28\x97\x7d\xfa\x6c\xf4\x41\x47\x65\x39\x52\x0a\xf6\x5e\xc7\x6c\xd4\x4c\xa9\x5e\xff\xd9\x14\x4e\x5a\x6c\x2b\x9c\xd5\x8f\xc6\x49\xd6\x86\x86\xc4\x15\x19\xba\x74\xc0\xef\x1c\x24\xc6\x7f\xf5\xa8\x28\x59\x6b\x8a\x20\x88\xad\xb8\xdc\xb0\xe9\x6f\x04\x89\xad\x75\xa7\xf8\x61\xa6\xf3\x37\x88\xb3\x5b\x71\xce\x51\x5c\xd5\xf7\xa5\x67\xd9\x52\x26\xd2\xae\xd4\xcb\xd5\x95\x09\xf4\x23\x63\x54\x6e\x37\x16\x9a\x7a\xba\xb2\xa1\xc5\x08\xaf\x67\xba\xb4\x9c\x5f\x5a\x9b\x64\x6e\xde\xf3\x42\x57\x23\xdd\xb5\x86\xa6\xe5\x99\x4e\x0c\xe9\xcc\x81\x5d\x94\xc2\x33\xa0\x62\x90\x06\x29\x7a\x3f\x8f\x39\xad\x7e\xf2\x13\x69\xb9\xac\x7b\xcd\xfd\x5b\xf5\xe8\x0d\x48\xc1\x11\x02\x2c\x5a\x15\x57\x81\x03\x7d\xe2\x70\x29\x38\x00\x5d\xdd\x12\x32\x3d\x29\x16\xf7\x7b\x8d\x93\x1e\x67\x45\x61\x82\x9e\xaf\x02\x4f\x78\xea\x39\x0d\x3f\xd9\x69\x95\xd9\x45\xfd\x45\x01\xc4\x45\x60\x7f\x4a\x0a\x56\xee\xbc\x48\x00\x4a\x7e\x89\x85\x04\x9a\x38\x05\xc6\xe1\xe3\x7e\xc2\x91\x51\x89\x8a\x2c\xf6\xbf\x4d\x98\xfb\x76\x73\xcf\xee\x77\x2a\x2c\xe2\xd7\x4e\x5a\xcb\xa2\x60\x8e\x2f\xc0\x31\x38\x4d\xc5\x11\xc0\x91\x34\xb7\x40\xf0\x87\x0a\x91\x3e\x58\xc1\xe0\xb9\x43\xc2\xd7\x38\xbc\x48\xbb\x33\xc8\xa0\x14\x72\x8d\x2d\xc5\x36\x3f\x51\x85\x9b\x40\xf0\x54\xb4\x93\x30\x6a\xcc\x32\x44\x9f\xb3\x1a\x8f\x29\x28\x50\x34\x69\x12\xad\x03\xc7\x20\x02\x2a\x46\x54\xde\xcc\x2c\xca\x24\x63\x6c\xe2\x65\x48\xbd\xef\xde\x04\x1f\x1e\xd8\xa7\x31\xc8\x0c\xca\x21\x65\x52\x78\xcd\x3a\x40\xca\x82\xe2\x59\xe7\xe9\x69\xf3\xc4\x20\xb3\xb9\xb6\x59\x27\x27\x66\x99\x89\x55\x04\xd4\xa6\x16\x4a\x52\x53\xca\x40\x97\x5a\xb9\x39\x1f\xca\x7a\xb6\x37\xa4\x92\x17\xb6\xab\x1d\x9e\xfd\x25\xfa\x0d\x54\x25\x1c\x56\xce\x44\x55\x57\x01\x50\xe7\x55\x0e\x7b\xeb\x10\x86\xf2\x52\x28\xe4\x76\x88\x29\xcc\x7b\x68\xaf\x3e\x80\x1f\xef\x9b\x30\x4a\x07\x01\xd4\x1e\xec\xc8\xd2\xab\xdd\x12\xed\x50\xdc\x51\xe4\xd6\x9b\x49\x43\x81\x78\xe9\xe4\x56\xeb\x56\x29\x37\x50\xe4\xac\x63\xe9\xe0\x06\x08\xb2\x5f\x1a\xc8\xcd\xef\xc5\x40\xac\xf1\x21\x2c\xf2\xa4\x80\x0c\x59\xa9\x26\x82\x22\x9c\x3e\xc0\xc5\xed\x1b\x2b\x48\x06\xbb\x98\x5a\xfc\xe6\x5b\x60\xac\xd2\x70\xb8\xee\x52\xb1\xc2\xc8\xb2\x75\xd2\x2a\x97\xfc\x1d\xeb\x9a\x2b\xe2\x90\x25\xe9\x7c\xce\x9a\xd9\xe4\xb1\xf5\x6c\xc3\xa2\x53\xde\x17\xa5\x09\xb1\x5c\xd7\x8e\x4e\x62\xe6\xc7\x22\x01\xa6\x45\x4d\xb8\xab\x10\x36\xd6\x21\xc6\xe9\x86\xa0\x7d\xec\xd8\x7f\x66\x54\x8d\x08\xb4\x9f\x9c\x14\x7e\x54\x2c\x60\xde\xff\xa6\xe1\x32\xca\xde\xff\x9d\x60\x49\x2d\xe1\x1f\xe4\x74\x5e\xce\x1e\x4f\x1e\xca\xfb\x39\xa0\x93\xa9\x92\xf2\xe3\x14\xae\xbd\x06\xe0\x72\x60\x67\xed\x76\x4e\xec\xe7\x04\x71\x88\x71\xd7\xdd\x2f\xe1\x38\x82\xb5\x03\x6f\x84\xab\x27\x8d\x46\xbf\xbb\xb5\x27\xb9\xe6\x1c\x3e\xa8\x57\xdc\xb3\x64\x6f\xee\x52\x8a\x89\xd7\x21\xf1\x3f\x3a\x1f\x40\x46\x62\x93\x25\xec\x81\x0f\x5a\x58\x72\x70\x87\x49\xf3\x70\x39\xb7\xa4\xcf\xca\x12\xb4\x97\xa7\x77\x71\x68\xb4\x3f\xa6\x39\xc2\x57\x89\xf7\x8d\x1e\x80\xd7\xb0\xef\xa0\x32\xbb\xf1\xa4\x2b\xad\xd6\x2c\x24\xb5\x96\x65\x01\xfd\x4b\x71\x41\xfd\xa3\x41\x1a\x81\x18\x1d\xbc\x27\xe9\x0a\x72\x80\x9f\xb9\xfd\xfe\x49\x14\x08\xdb\x0e\x81\xfa\x36\x65\x9e\x77\x2c\x37\x6c\x12\x1b\x0d\x34\x07\xc7\x5a\xa4\x8e\x9b\x5f\x13\xf1\xbf\x6b\xd4\x2b\x30\xc9\xae\x51\xb1\xa4\xe4\xb7\x5e\xc9\x6c\x5c\xeb\xc3\x88\xfb\xc3\xba\xcd\xe4\x48\xb6\xe4\x08\xd2\x04\x2f\x2f\x31\xbd\xc2\xe2\xa9\x4a\x26\x67\xc7\xed\x26\xbd\x08\xe9\x3a\x13\xff\xe2\xd7\x5b\x69\x5b\xfe\x47\x2b\xbd\x6c\xd2\x9c\xc2\x7a\xb0\xb9\x51\x3a\x2b\x71\x6c\xdd\xe7\x3b\x2c\xf3\x45\x17\x60\xd0\x62\x44\x22\xe7\xe8\x82\xf2\x2b\x49\x60\x3f\x2f\x8d\xbb\xcf\xbe\x32\x99\x81\x4e\x39\x66\xf6\x3d\x2a\x29\xd8\x28\x94\xd7\xe5\x88\x13\xdb\xa1\x23\x08\x50\xa2\x7d\xc8\x88\xc3\x1e\x88\xdf\x4a\x55\x01\x93\x5e\xcd\xf6\xdb\xd3\x6e\x68\xb4\xad\x4c\xd9\x70\xef\x87\xa0\xd9\xba\x3b\x1b\x51\x24\xde\x6b\x55\xea\xca\x7e\x34\x52\xb1\x0c\xd2\x33\x39\x23\xdc\x6b\xb6\x46\x4e\x3e\x61\x70\x49\x66\x6c\x31\x93\xad\xb3\x05\xad\xb2\xc4\x32\xfe\x92\x58\x3d\xf9\x76\xa8\x53\x11\x44\xfa\x60\x15\x45\xe7\x57\x93\x30\xf0\x9d\x28\x3a\xff\x03\xd8\xae\x5b\xf9\x29\x41\xcd\xb1\x67\xc5\xd2\xac\xae\x1f\x58\x26\xfe\x10\x7f\xf1\x61\x9a\xcb\xd0\xc0\xe8\x03\x09\xd0\x7d\x3f\xd2\xb1\x79\x90\x8f\xbb\x7e\xb0\xc9\x0a\xf4\x02\x70\xae\x67\xc9\x00\xac\x02\x08\x32\xa2\x6b\x39\xf6\x3f\x4c\xde\x6b\x52\x91\x48\x9e\x0a\x6a\x60\xc6\x9e\x44\x97\xc2\x49\x28\x45\xbe\x9a\xcb\x40\x60\xd1\xc7\xcb\x28\xf0\x78\x89\x18\x88\x21\x9d\x85\x21\xd6\xa2\x04\x2a\x1d\xc4\x05\x88\x1d\x18\x8f\xcc\x2c\x8a\x5a\x0a\x22\xef\xb8\x1c\x9b\x4b\x2d\x17\x00\x54\xc2\xc1\xb4\xfb\xe5\x79\xe1\x43\x49\xcd\xbc\x31\xd3\xdf\x44\x45\xf7\x48\x6b\x5b\xde\x6e\xd0\x53\x8a\x1c\x23\x2f\x42\x8e\xcd\xa5\x76\x06\x9f\xa4\xaa\x63\x7c\x4a\xb7\xa3\x0f\x6d\x7a\x68\xb5\x4c\x7b\xb5\x16\xd0\xba\xe7\x7c\x49\x3e\xc8\xe8\xa0\x65\x5b\x92\x5c\xaf\xe2\x99\xb0\x99\xec\x11\xef\x77\x49\x54\xec\xc4\xfa\x04\xe5\x2d\xfc\x82\x7d\xdc\x05\x49\x02\x29\x8f\x6f\xc9\x3f\x60\x4e\x09\x01\x09\xf1\x48\x99\x41\x35\x2d\xac\x64\x0b\x1d\x6f\xcb\xe6\x4f\x38\x2a\x23\xc1\xda\xc7\x50\x80\x05\x97\xc2\x44\xb9\x23\x37\x60\x9e\x0c\x3c\x10\x63\xf7\x14\x57\xe6\x9a\x7e\xc8\x52\xac\xb8\x94\xcc\x6b\x31\xd6\x53\x96\x46\x74\x2c\xad\xc8\x30\x1b\xd6\x97\x1c\xe9\x98\x20\x6b\xd9\x6d\x10\xd9\xd0\x8d\xdb\xe2\xfa\x45\xa8\x1e\x12\x0b\xcb\xef\xd4\xac\x02\x58\x5c\x77\x8d\x1f\x24\xe0\x5e\xa7\xa6\x21\x23\x18\x38\x9a\x0e\x92\x1b\xfe\x2d\xc7\x1b\x2c\x93\x14\xf7\xe2\x25\x7b\x39\xe8\x80\x4e\x0b\xe0\xe4\x12\xdc\xd2\xf1\xb5\x46\x92\x05\x2e\x52\x19\xb4\x0e\x46\xbf\x10\x7a\x16\xae\xc1\xac\xdc\xd6\xb5\x2a\xe1\xd9\x82\x95\xc2\x58\x82\x4d\x18\xcb\x63\x22\x01\x69\x18\x1a\xb2\xca\x33\x4c\x32\x2e\x3e\x5c\x68\xa6\x61\x5d\x3c\x43\x33\x70\x32\xe6\x10\x95\xc1\x6f\xee\x90\x92\xe8\x75\xbc\xa1\xd6\xc4\x8a\x32\xd1\xc9\x07\x64\xf8\x93\xa2\xc6\x34\x8a\x9e\x19\x05\x7b\x42\x2f\x36\xd7\xf9\x7c\x59\xf4\x8e\x0e\xb7\xb3\x7e\x7c\x37\x2c\xd6\x31\x4a\x48\xfd\x41\xc5\xc9\x20\x88\xed\xa4\x62\x84\x1e\x13\xe7\xae\x17\x6f\xc5\x3f\x09\x47\x5b\xe8\xef\x75\xef\x60\x96\x8e\x53\x11\xba\x3e\x2d\x9a\xd4\x3c\xf8\x51\x41\xa6\x57\x24\x65\x49\xa8\x4c\xde\x95\xd0\x4b\xa6\x39\x69\x1d\xd9\x7c\x51\x22\xae\xa1\x45\x84\x6b\xa4\x66\xa1\xa2\x5c\xd3\x78\x14\x8d\xb3\x53\xe1\x48\x42\x94\xcf\xde\xec\x25\xb6\xc4\x48\xf4\x9a\x20\x71\x8d\xb1\x5f\x00\xb5\x6c\x6a\xa6\xdf\x77\xdb\x38\xb1\x6e\xe3\x07\x24\x1c\x2b\xa7\x86\xfc\xb9\xe1\x8d\x54\x40\x90\x35\xfd\xe0\x4c\x15\x6f\xc4\x30\x87\xf8\x1f\x0a\x12\x38\x52\x91\x4f\x5e\x67\x85\x82\x17\x37\xea\x09\x84\x8e\x50\xd0\x10\x84\x1b\xa7\x7b\x62\x03\xe5\x4e\x07\x65\x1b\x39\x42\x9d\xe2\xb9\x86\x67\x60\x42\x13\x4d\xd3\x8b\x10\x5e\x2d\xe9\xaf\x62\x0d\x58\x1e\x8d\xcc\x3e\x9a\xff\xc1\x16\x96\x9b\xf0\x77\xef\x46\xee\xed\x39\x8e\x88\xd9\x19\xdc\x15\x99\x83\xa4\xbc\xb7\xc2\x2e\x50\xab\x9a\x50\x0c\x3a\xf5\x77\x53\xc0\xf0\x8c\x2a\xb7\x5d\x5d\x7c\x94\x46\x58\x00\x68\x7f\x86\xf0\xe4\xac\xb5\xe9\xad\x60\xf6\x6d\x26\x59\xcf\x3c\x0b\x0e\x48\xc0\x70\xc7\x40\xab\x20\xda\x82\x94\xfd\xd2\x5c\x9e\x75\x7a\x52\x33\x4b\x7a\xd3\x62\x29\x34\xea\x18\xf0\x94\x0c\x03\x6f\xfc\x3b\x51\xe1\xcc\x13\x6b\xa2\xf0\x47\x12\xe0\xc4\x8f\x18\xb4\x14\xf1\x08\x2c\x8c\x24\xf0\x94\xa4\x4a\xb7\x0d\x8d\xe2\x7f\x78\x0f\x36\x7f\x03\x3e\x8b\x80\x48\xa3\x82\x7a\x12\xfe\x8d\x25\x52\x48\x6c\x5b\x8c\x36\x70\x3c\x32\x67\xa8\x81\x6b\x6a\x05\x10\x71\x27\x8a\x1f\xd6\x92\xa8\x4b\x2e\x95\x7c\xa3\xb9\xea\x64\xab\x79\x44\xed\x34\xca\x54\x2d\xe2\xa8\x28\x74\x2f\x93\xe7\xff\xa6\x1d\x13\xb5\x44\x12\x47\xa4\x5e\xa8\x7c\x80\xe7\x34\x1a\x4d\xa1\x75\x63\x8f\xc9\x2c\x6e\x61\xe5\xc3\x16\xfa\x3d\x9c\xa9\xc0\xa1\xbc\xa1\x92\xd4\x96\x7f\xff\xaf\xff\xfa\x3f\xff\xf5\x7f\x03\x00\x00\xff\xff\x1c\xf7\x13\x7e\x95\xd2\x00\x00")
-
-func dataFemalenamesJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataFemalenamesJson,
- "data/FemaleNames.json",
- )
-}
-
-func dataFemalenamesJson() (*asset, error) {
- bytes, err := dataFemalenamesJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/FemaleNames.json", size: 53909, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataKeypadJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x9c\x94\xcd\x6a\x85\x30\x14\x84\xf7\x3e\x45\xc8\x52\xeb\xff\x5f\xec\x0b\xf4\x21\x4a\x17\xdd\x75\x21\xa5\x14\xba\x2a\xbe\xfb\xcd\xd5\x8b\x99\x91\xe3\x3d\xea\x46\x26\x42\xe6\x3b\x33\x1c\xf2\x1f\x19\x63\xdf\x7e\x3f\x7f\xbe\xec\xab\xb9\x1f\xfc\xb1\xf0\xf2\x7d\x96\xc6\x7c\xff\x8d\xe3\xcb\x43\xdb\xd2\xae\xb2\x0a\xb2\x0e\x32\x5b\x25\xde\xdb\xea\x59\x7e\x2c\x7f\xbc\xa7\x0c\x23\x70\x13\x10\xad\x38\x43\xb1\x0b\x26\x58\x05\x30\x4c\x23\xfb\x77\x4a\xc6\x0d\x95\x48\x35\x92\x2a\xc5\xfe\x59\x59\x32\x97\x58\xcd\x91\x0a\xfb\x70\xdd\x69\x6d\x96\xfb\xb9\x5a\xcc\x05\xb5\xc9\xf6\x83\x56\x26\x41\x09\xd4\x21\xa8\xd5\xdc\x13\xb5\x4b\xa6\x12\xaa\x3f\xd0\x1f\x59\xe5\x5a\x97\xcd\x7e\x81\x0e\x73\xf5\xe2\xd8\xe8\x1f\x6b\x65\x12\x95\x48\x03\x92\x60\x4e\xd9\x3d\xd5\xca\x64\x28\x91\x62\x24\xe5\xe7\xd6\x5a\xe4\x62\x56\xc7\xac\x04\x59\x83\x12\xe5\xc8\x04\x9b\x8c\x04\x4b\x11\x16\x5f\xb6\x25\x04\xa5\x24\x5a\x86\xb4\x42\x79\x6b\xaf\xcc\x40\xb4\xfc\xe4\xd6\x53\x08\x79\x2d\x1d\xbe\x07\x0b\xcc\x7f\xa7\x68\x8a\x6e\x01\x00\x00\xff\xff\x2d\x9a\xa0\x40\x67\x06\x00\x00")
-
-func dataKeypadJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataKeypadJson,
- "data/Keypad.json",
- )
-}
-
-func dataKeypadJson() (*asset, error) {
- bytes, err := dataKeypadJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/Keypad.json", size: 1639, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataL33tJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xaa\xe6\x52\x50\x50\x4a\x2f\x4a\x2c\xc8\x50\xb2\x52\x00\x71\x80\xdc\x44\x20\x33\x1a\xcc\x04\x72\x4c\x94\x74\x60\x4c\x07\x25\x30\x2b\x16\x22\xa0\x94\x84\xac\xcc\x02\x55\x2e\x19\x59\x4e\x03\x61\x44\x35\x82\x19\x8d\x60\xda\xa0\x6a\x4e\x45\xd6\x6c\x8c\x2a\x97\x8e\x2c\x67\x86\x30\xc2\x12\x55\x59\x26\xb2\x32\x43\x84\x32\x45\x04\xb3\x06\x55\x47\x0e\x0e\x1d\x35\x08\xa6\x39\xaa\x8e\x7c\x64\x1d\x06\xa8\x72\xc5\xc8\x72\x2a\x08\x23\x4c\x51\x95\x95\x20\x2b\xd3\xc6\x69\x53\x05\xb2\x32\x55\x54\xb9\x2a\x64\x39\x23\xa8\x1c\x90\xac\xe5\xaa\xe5\x02\x04\x00\x00\xff\xff\xd5\xd6\x71\x46\xdd\x01\x00\x00")
-
-func dataL33tJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataL33tJson,
- "data/L33t.json",
- )
-}
-
-func dataL33tJson() (*asset, error) {
- bytes, err := dataL33tJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/L33t.json", size: 477, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataMackeypadJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x9c\xd4\xcb\x4a\xc6\x30\x10\x05\xe0\x7d\x9f\x22\x64\xd9\xda\xfb\x35\x42\xd7\x3e\x84\xb8\x70\xe7\xa2\x88\x08\xae\xa4\xef\x6e\x6c\xa5\x39\xa7\x4c\x99\xd4\xcd\xcf\xf4\x87\xcc\x97\x39\x24\xf9\x4e\x8c\xb1\x4f\x9f\xaf\x1f\x6f\xf6\xd1\xfc\x7e\xf8\xcf\xca\x97\xcf\x5b\x69\xcc\xfb\xd7\xb2\x3c\xfc\xd5\xb6\xb6\x47\xd9\x84\xb2\x0d\x65\x71\x94\xb8\xee\x5c\x6f\xe5\xcb\xfe\x8f\xef\x29\x63\x04\x77\x81\xe8\xc5\x3d\x54\x97\x30\x61\x0d\x60\x38\x8d\xdc\x7f\x50\x66\x3c\xa9\x24\xb5\x28\x35\x5a\xfb\x4c\xcd\x8d\x59\xa2\xba\x98\x04\xc7\xb0\x7c\xd2\xc2\xac\xaf\xc7\xea\x71\x2c\x48\x4d\x6e\xef\xb4\x2c\x09\x25\x68\x40\xa8\xd7\xba\xe7\x5a\x94\x8c\x92\x34\x46\xc4\x47\xad\x66\x2d\xca\xee\x3a\xbf\x09\xc7\x1a\xe5\xad\x42\xff\x52\xcb\x92\x54\x92\x1c\x4a\xb0\x4f\xb9\x7b\xaa\x64\xc9\x26\x41\x29\x42\x65\xd4\x03\xa0\x46\x9c\xe3\xdc\xa4\x65\xa8\x0d\xca\x61\xb8\xed\xb6\x8c\xe5\x88\x39\x25\xb8\x28\x80\x12\x25\xab\x40\xab\x52\x1e\xda\xff\x84\x4b\x5a\x89\xda\x7c\x6f\x06\xf9\xac\x38\xbc\x15\x64\xcd\x37\x2f\x18\x61\xf2\x0d\x98\xf0\xe5\xd9\x31\xff\xbb\x26\x6b\xf2\x13\x00\x00\xff\xff\xa3\x67\xe0\x02\xd0\x06\x00\x00")
-
-func dataMackeypadJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataMackeypadJson,
- "data/MacKeypad.json",
- )
-}
-
-func dataMackeypadJson() (*asset, error) {
- bytes, err := dataMackeypadJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/MacKeypad.json", size: 1744, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataMalenamesJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x5a\x4b\xb6\xeb\x38\x6c\x9c\xf7\x2a\xfa\xbc\x71\x56\x90\x35\x64\x07\x39\x19\x50\x22\x2d\xd1\xa6\x48\x3f\x52\xb2\x5b\x37\x27\x7b\x0f\x28\xb1\x0a\x78\x3d\xd3\xf5\x95\xf8\x01\x0a\x85\x02\xc8\xff\xfd\xf5\x5f\xb1\xed\xbf\xfe\xf3\xbf\xff\xfa\xfb\xef\x5f\x4f\xb7\x85\xf6\xeb\x3f\xae\xc7\xb2\xe6\xfb\xa9\x96\x29\xd4\xfd\x7e\xde\xe2\xbc\xba\x90\xee\x3f\xbe\x31\xa5\xe8\xb6\xfb\x0f\xef\x3e\xd1\x8f\x0f\xfa\x4b\x75\xfc\xd1\x1f\x93\x0e\xda\xc2\x7b\xbd\x9f\xf7\xb5\x6c\xae\xe1\xa5\x2a\x8b\x28\xef\x35\x54\x8c\x96\x23\xa6\x79\xbb\x63\x3c\x6d\xae\xbe\xc6\xff\x4b\x76\x69\xcc\xb0\x84\x52\x97\x70\x3f\xbf\x42\xce\x61\x1f\x33\xb4\x3d\x7c\xc2\xd8\x44\xf0\x5f\x2e\x69\xaa\xd1\x71\x6f\x3a\x8e\xcb\xb2\xa4\x7c\x62\xa0\x4f\x1c\xef\x3c\x5d\x2b\x19\x0b\xd8\xf7\x35\x7c\xc7\xbc\xae\x8e\x97\xf7\xb8\x95\x7d\x3d\x75\x8f\xf7\x53\x72\x15\x6f\x3c\xc3\xe3\x51\xc3\xf8\xe3\x51\x5d\x1e\xfb\x68\x73\xd9\x87\x69\x83\x98\x8d\xeb\x16\x4b\x64\xac\xca\x57\xcc\x58\xdd\xb9\x95\x8c\x6d\xd7\xb0\x94\xaa\x93\xae\x87\xc3\x5c\x9c\xd6\x8b\x39\xe2\xb0\xf1\xd7\xa5\x1d\xe6\x7d\xbb\x5d\x66\x1b\x6b\x78\x07\xfe\x2e\xbe\x2a\x30\x87\x2f\xc7\x92\xe0\x20\x59\x0e\xc6\x9c\xc5\x9f\x63\x69\x75\x5f\x8f\xf1\x65\x3d\xd5\xa4\x0b\x86\x7b\x96\x61\x89\xe7\xe1\x68\x4c\x4c\xeb\x92\xc2\xea\x29\x6e\xd8\x57\xbe\x73\xb4\x1d\xc6\xdf\x75\x33\x32\x2c\x7d\xf5\x0a\x91\x5e\x76\xdb\xf1\x07\x22\x03\x8c\x95\x00\xb5\xe4\xbe\x35\xe4\x79\xfc\x23\x0b\x3c\x0b\x77\x56\xcb\x18\x7e\x0a\x59\xe0\x8f\x79\xa7\x7a\xe0\xfd\x49\xdc\xe5\x81\x00\xe7\x01\xf8\x55\xbd\x2b\xae\xf5\x30\xf2\x99\xf1\x99\xac\xe5\x34\x40\x1c\x4b\x29\x07\x1c\x22\x7e\x0a\xdb\x78\xc3\x89\xe1\x61\x3f\x99\x6d\xfc\x1a\x8e\x25\x60\xb8\x6e\xf6\x82\x35\x1f\xad\x85\x34\xf6\x3c\x95\x69\x1a\xef\x7f\xe2\xbc\x97\x0a\x38\xe5\xd0\x86\x79\xdf\x6b\xb7\xcb\x7b\x58\xb4\x78\x8f\x05\x34\x40\x75\xae\x2e\x2e\xf0\x0b\xfc\xd0\x56\xf7\x1d\x8f\xb3\x60\x59\x2d\xd8\x02\x5e\xe9\x23\x63\xe0\x2b\x88\x95\x3c\x10\x49\x81\x78\x79\xc6\x8d\xfb\xcd\x7b\xc9\xb1\x30\xd8\xf1\xf2\xa4\x38\xda\x19\x8b\x89\x26\xdb\xe2\x0b\x4b\xd8\x5d\x4e\x08\xa8\x14\x04\x3f\x88\x6e\x8b\x24\xef\x52\x40\xe4\x66\xa2\xa4\x16\x9f\xf1\xe9\x7c\xd4\x1d\xa3\xe7\x52\x37\xc7\x48\xaf\x24\x00\x79\x98\x43\x1e\xb6\x5c\x92\xc4\x94\x06\x75\x20\x07\x54\x21\xc0\xa6\xff\x20\xfb\x79\x02\xbf\x4c\x63\xec\x90\x38\xb6\x4b\x0a\x9e\xd7\x89\xd5\x76\x86\x98\x31\x9a\xe0\xcf\x73\xab\xe2\xb3\x83\x31\x59\x35\x82\xfa\x28\x41\x63\x5a\x98\x82\x21\x98\xc8\x80\x98\x94\x68\x0e\xde\x33\x5c\xe4\x5b\x6e\x05\x31\xd1\xb1\xe8\x08\x34\x05\xbc\xcc\xab\x06\x17\x53\xc1\x93\x29\xf0\xd3\xb1\x85\xb9\xf0\xa5\xf9\xa0\x17\xe7\x35\xb8\x31\xaa\xf0\x69\xf1\xa5\x02\x87\x29\x3e\x1e\x85\x23\xc7\x85\x4e\x2b\x4d\x22\x00\xa6\x3c\x09\x28\x60\x65\x43\x94\x58\xd3\x86\x7f\x48\x2f\xf0\xbc\xf0\xa1\x89\xcf\xb1\xea\x54\x4e\xcf\x81\x36\x03\x2a\xb0\x68\x0d\xc8\x3b\x62\x03\x46\x9e\x04\x70\xd9\xe0\x31\x1d\x43\x3e\xc4\x02\xb8\x96\x1d\x2b\xfd\x86\x46\x5f\x7a\x86\x51\xe7\x72\x2c\x95\xb9\xcc\x1b\x1a\x7c\x07\x5f\x0b\x57\xa3\x7e\xf6\x18\xe1\xc7\xf5\x44\x0b\x50\x17\xe6\x1a\x01\x89\xc1\xf4\x21\x5f\x8e\xd1\x3f\xe2\xc2\xf2\x47\x86\x2f\x70\xc1\xe9\x83\x62\x1d\xc3\x28\xb3\x08\x2d\x64\x05\x8d\xc0\xa0\x90\x88\x15\x4a\x30\x45\x63\x6e\x99\x2a\x63\xa8\xba\x0d\x53\xef\x82\xf9\xf1\xc2\x12\x4d\x46\x50\xe2\xeb\xc8\x19\x9f\x85\x25\x6a\xba\xae\xc7\x14\x48\xd6\x01\x59\xd4\xe5\x05\x88\xb9\x89\x80\x32\xa2\xba\x87\xd3\x58\x58\x00\xa6\x2d\xa6\x5d\xa9\x17\x4a\x83\x43\xcf\x61\x8e\x09\xfe\xe0\xbe\xaf\xa4\x3c\x86\x4a\x9b\xee\x10\xc1\xbe\x38\xd1\x18\x4a\x37\x34\xb3\x50\x2b\xe9\x80\x61\xef\xbc\xea\x91\x17\xc9\x72\x66\x6e\x17\xee\x3d\xe0\x11\x09\x71\x83\xc4\x13\x3b\x0d\x58\xe3\x2d\xa4\xa2\x66\xdb\x4f\xc4\xea\x1e\x3d\x66\xb3\xa7\x97\x63\xe6\xbe\xf7\xc0\x50\x56\x79\xb3\x9f\xb2\xf0\x60\x60\x3f\x5e\x4e\x26\x86\x64\x3f\xc0\xd3\x5c\x90\xb5\x9e\x47\x02\x1f\xbc\x0e\xf8\x53\x58\xc4\x69\x2e\x39\x39\xf5\x7a\x2c\x2b\xe6\x1e\xd1\xea\x4d\x12\x15\xce\x5a\x56\x0c\xd1\x91\x8c\xf5\x3f\x42\x8a\xff\x90\x05\x36\x2c\x48\xf2\xac\x62\x41\xad\x4a\xa0\x80\x82\x9f\x2e\x6e\x4c\xac\x0d\xc1\x72\x93\x31\xa3\xd7\x04\x85\xa8\xdb\xf1\x7a\xfc\xd0\xb8\x3d\xc9\x61\xe2\x16\x35\xa7\x4c\x27\x5d\xde\x6d\x81\xf7\x63\x73\x6e\x56\x9a\xa3\x09\xba\x68\x21\x99\x8a\xa5\xe1\xd5\x4f\xac\x0b\xfc\xaa\x9a\xa0\x09\xab\x38\x8f\x58\x7c\x45\x28\xe2\x16\xe4\x6d\x44\x22\x25\xf0\x8b\x31\xd7\x85\x94\x7a\xab\x32\xbc\x82\xc0\x9a\x21\xdc\x5f\xd2\x34\x2f\x9a\x2f\xfe\x3e\x98\x92\x4c\xb2\x68\xbb\x7c\x64\x32\x8f\x46\xbc\xfc\x7c\x54\x5a\x30\x3c\x7b\xa4\x14\xd8\x0b\x06\xca\x4a\x10\xc7\x4e\xcd\xff\x0d\xd9\x5b\x6e\x0d\x5b\x74\x2b\xdc\xea\x8c\x41\x91\x47\xbc\x41\x62\x61\x16\xdf\x6b\xf8\xc0\x3c\xe9\x80\x5e\x90\x62\x83\x3c\x23\x3a\xb2\x1a\x91\x4b\x4b\x41\x6f\xac\x87\xf2\xd0\xc5\x27\x85\xc4\x77\x20\x08\x4e\x15\x16\xa4\x9e\xf4\x28\xb9\x8d\x77\x4b\x4d\x0a\xd6\x8a\x44\xd4\x45\x1c\xfd\x7e\x2b\xb4\xf1\xca\xdb\x4d\x98\x26\x09\x7b\xe7\x1f\x8c\xb3\x81\xa8\x04\x26\x13\xd4\xf6\x94\x9c\x6e\xac\x3a\x7a\xb5\x58\x0d\xf0\x52\xe9\x2c\x74\xe4\x56\x4b\xcf\xf0\x44\xac\xce\x30\x1a\xaa\xb1\xd0\x98\x6a\x05\xe3\x46\x4f\x6d\x2e\xcd\x25\x61\x9c\xc3\x17\x4a\x6c\xaf\x94\xfe\x32\xf2\x46\xde\x19\x33\xbd\x6b\xdf\x2c\x53\xb3\x3e\xd6\x79\x8d\x86\xea\xc7\xbe\xbf\x63\x92\x5e\x9c\x80\x9c\xb3\x99\x6f\x71\xa6\x2e\x28\xa6\xb8\xba\x4b\x09\x8c\xde\x69\xe2\x8d\x84\x1f\x14\x2e\x37\x06\x0a\x42\x00\x60\x10\xf9\x8f\x22\xec\xf2\xc2\xf8\x3d\x98\xc4\x24\xfb\xc7\xe6\x96\x43\x22\x57\xf2\x2b\x86\x71\x46\x72\x4f\x0a\xa7\x5c\x8c\xf0\x2c\x02\x92\xb1\x59\x65\x89\xe0\xb7\x03\x89\xe1\x8a\xef\x5d\x05\xd1\x15\x5c\x58\xd2\x97\xf1\xd1\x15\xc3\x02\x58\x9a\x1c\xef\xb5\x6e\x6d\x67\xfa\x98\xfc\x5b\x8b\x14\xa6\x9f\x90\x40\x8e\xad\x32\x1d\x3e\xfb\x00\x11\x8c\x20\xfa\xab\x72\x1f\x5f\x9b\x94\x53\xd0\x04\xd6\x22\x1d\x1e\xbb\x54\x1e\x8b\x91\x25\xd2\xf5\x0f\x04\xea\xb7\x14\x61\x81\x91\x57\x5e\xff\x2a\xf5\x93\xac\xd8\xb8\xbf\xc1\xb6\xa2\xf0\x3f\x88\x88\x28\x99\x48\x7b\x00\x3b\x1c\x1f\xd3\x1f\xba\x25\x82\xeb\xc4\x89\x5a\xe0\x49\xf6\x34\x9c\x16\xdb\xc6\x6d\x17\x59\x77\x42\x1c\x6b\x95\x1d\x54\xf9\xfb\xf0\xd5\xdc\x40\x83\xa8\x62\xef\x65\x37\x38\x63\x19\xeb\x88\x4b\x76\x33\x98\x58\xf4\x68\x18\x29\x67\xd7\x76\x87\x78\x2c\xa9\x06\xd7\x88\xbd\x1a\x03\xd1\xe6\x5c\x02\x47\x58\x28\x2a\x49\xeb\x7e\x9c\xa4\x63\x70\x85\xbc\x82\x19\xd4\x67\x16\xbb\xa2\xbb\x22\xd8\x78\x2e\x99\x72\x25\x17\x10\xed\x22\xbf\x21\x60\xd7\xa8\x52\x44\xcc\x4f\xda\x4d\x8e\x9c\x74\x2b\x1a\x3a\x00\xba\xfc\x1d\xea\x4c\x8d\xfb\xcf\x6e\xf5\x91\x11\xf7\xa1\x26\xdd\x2a\x45\xfb\x06\x04\x5c\xb9\x08\x70\x97\x5f\xc1\x4e\x51\xdd\xd3\xa8\xd7\x44\x88\x6b\xcd\xd7\x57\x9b\x94\x34\x58\x69\x14\xd5\x09\xbb\x96\xa2\xdd\xce\x5a\xf5\x4b\x0e\xd2\x02\x94\x75\x35\x7e\x72\x13\x3c\x32\xb8\x62\x38\x4e\x52\x15\xdd\x23\x96\x7a\xc2\x9c\x33\x25\xf9\xf5\x3e\x20\xe2\x8e\x89\x7c\x15\xb6\x8d\x82\x65\xeb\x35\x3e\x60\x61\x2b\xd6\xa7\x69\x7d\x08\x59\xb0\x07\xd4\xe7\x25\x52\x55\x35\x95\x7d\x27\x56\x3c\xfc\x29\x33\x76\xf1\x5c\xb8\x53\xf4\x5e\x42\xd3\xcc\x89\x08\x5a\x8f\xcd\x84\x96\xac\xd1\x2c\xe6\x6a\x4f\x39\xaa\xc1\x03\x36\xfd\xc4\x5e\x25\x53\x19\xca\x2a\x77\x72\xb5\xf2\x86\x14\x7f\xcc\xea\x82\xf7\xc8\x02\xc3\x41\xb3\x08\x4b\xb2\x83\xe4\x83\x58\xa7\x12\x7a\x41\x53\x91\x89\xa0\x5a\x58\xba\xbe\x63\x47\x0d\x1d\x81\xbd\x9e\x0c\x17\x11\xbd\x24\x3a\x29\x7b\xa6\xa8\x8d\x43\xad\x74\xa5\x88\x65\xab\x43\x60\x98\xc8\x6e\x4b\x2d\x1f\x2c\x2d\x68\x0e\x9b\x53\x27\x56\x6e\xd1\x9f\xaa\x75\xd7\x43\x4b\xb5\x4d\xdb\x8e\x41\x8b\x97\xde\xc9\x00\x13\x5e\x6d\x0c\x88\x86\xab\xc9\x03\x8e\x60\xed\x2e\xdf\x45\xf8\x45\x8c\x81\x92\xba\xd0\xf2\xa2\x0d\xb8\x43\x91\x18\xd8\xe0\x4c\x29\x2e\x92\x2e\xb3\xb0\x74\x8b\xa9\x32\x9f\x12\xd9\xc4\xd3\x47\x5b\x5e\x9a\xb4\xf6\xb3\x19\xd9\x6a\xd4\xf2\x44\x3d\x28\x95\x8d\x78\x90\x81\x03\x43\xfa\xc0\x4e\x64\xb7\x44\xa0\x88\x76\xbf\x0f\x82\xe0\x02\x0a\xde\x6f\x06\xe7\x49\xc2\x6b\x67\xbc\xd2\x18\x77\x0f\x94\xd5\x86\xa4\xb1\x08\xaa\x2b\x6d\x46\xf7\xb1\x27\xc1\x89\x21\xac\x65\x4f\x2b\xa9\x30\x89\xe5\x52\x2d\x69\x92\x63\x72\x51\x67\x3a\x46\x2d\x77\xd8\x17\xaf\xc5\x0c\xac\x37\x29\xb0\x2b\x4a\x8e\x90\x7a\x1a\x54\xb4\xd9\x22\x5e\x11\xbe\x95\x48\xa6\xeb\x74\x80\x61\x1e\xd1\x07\x76\x4c\x9c\xf7\x01\x1f\x5c\x1d\x13\xbe\x3f\xe3\x25\x07\xf0\x57\xf7\xd6\x8e\xbd\x44\x82\xea\xae\x8d\x80\xed\x92\x83\x2a\xbd\x77\xaa\x49\x8d\x00\x92\x68\xf7\xa6\x8d\xfb\x43\xf5\x46\x0e\xd4\x2d\xca\xae\x02\x5d\xe4\xe8\xab\xd7\x93\x14\xa4\xb4\x1f\x7b\xa7\x6e\x32\x61\xb1\x2c\x0c\x48\x36\x13\xa5\x6e\x62\x21\xb0\x60\xdb\x52\x8f\x61\x04\xed\xbc\x48\x7d\x42\x8a\x35\x5a\x71\xb3\x05\x96\x90\x05\x34\xe6\x22\xa9\xd3\x25\x6d\xab\x68\xf7\x4c\xe4\x4a\xc4\x48\x8b\xca\xe8\xfe\xa3\xa1\xc5\xde\x60\x56\xc5\xcf\xad\xc9\x30\xd8\x44\x2e\xa6\xdb\xa2\xd0\xd2\x24\x6d\xe2\xfd\xee\xce\x00\xcb\xab\x28\x73\x9c\xac\x94\x5c\x98\x81\x26\xd7\x40\xf9\x3d\xfd\xa8\xcc\xe9\x27\x09\xe0\x61\x06\x5d\x47\x27\x32\xb1\x66\x82\x26\xd1\x60\x9a\x04\x8f\xbb\x73\x38\x26\x3e\xd2\xd9\x88\x40\x11\x69\xd1\x56\xc1\x52\x70\x31\xb5\x7a\x55\xb8\x8b\x63\xb8\x08\x5f\xd3\x5a\x52\x72\x01\x54\x4e\x79\xc3\x47\x3e\x39\x92\x96\x30\xe8\xc6\xe4\x33\xa3\x87\x58\x4c\x3d\xd8\xfb\xb1\x6c\x88\x1e\x19\x62\xab\x35\xd4\xd4\xfe\xd0\x2e\x69\x73\x59\x85\x86\x68\xc1\x49\xcf\x2e\x36\x96\x73\x57\xf5\x85\x83\x8f\x22\x0c\x03\x4b\xee\xe1\xe1\xb4\x53\x8a\x4d\x92\xe0\x24\x26\x35\x92\xa7\xe0\x8e\xc1\x87\x26\x23\x2d\x8e\x9d\xb3\xd8\x22\x2b\xe0\xbd\x1e\x46\xa8\xa7\xed\x5f\x55\x16\x79\x29\xd2\xab\x68\xeb\x8e\xb1\x94\xf9\xb6\xde\x05\x4c\xec\xfa\xf4\x33\xb6\xd3\xb2\x40\xcc\x54\xa0\x35\x71\xfa\xa0\x5c\xf5\x32\x8d\xef\xae\x90\xa9\x5f\x64\x0a\x15\xb8\x1f\xe6\x9a\xb9\x5b\x88\x6b\xcf\x1f\x95\xef\xaa\xcd\xc3\xc6\xb0\x7e\xbb\xf6\xfb\xd0\xee\x7b\x91\xea\x73\x73\xa6\x61\xec\xb2\x36\xff\x23\x68\x33\x99\x83\x16\xcf\xce\xc6\x75\xfe\x12\xf4\xfc\x05\xcc\x73\x49\x14\xb2\xa0\x8b\x50\x99\x87\xba\x7e\x31\x95\xd1\x64\x92\xa1\xe4\x2e\xb6\x03\x3a\x62\x09\xce\xde\x46\x25\x80\x9f\x6e\x96\x5c\x09\xe9\x21\x59\x0d\x58\x2c\xed\x60\xf7\xe4\xab\x11\xdc\x33\x22\xa7\xee\x7d\x0d\xed\x2b\x9e\xbd\xc0\xe3\x8e\x59\x59\xee\xbd\x16\xd2\x83\x33\x1e\xe4\x88\xa5\xc5\xde\x9a\x95\x59\xb5\x66\xf2\x74\x99\xa5\x3e\x62\x99\x51\x8c\xe6\x5d\x0f\xc8\x95\x9e\x89\x6d\xda\xd3\x9e\x70\x53\x56\xee\xe4\x3f\x86\x8f\x9d\x67\x72\x04\x86\x2b\x14\xd9\x7c\x56\xa6\x9b\xb3\x46\xed\x6b\x66\x73\xc0\xc5\x9e\xa0\xf6\x01\x64\xac\x5d\x95\xf0\x46\x59\xe2\x8e\x5b\x75\x68\x53\x73\x5e\x89\x64\xff\x25\x0f\xdf\x2d\x0f\xd6\x93\xd0\xa9\xdb\x69\x0e\x94\xb3\xe3\xa9\xc2\x6e\x52\x8d\x29\xe2\x7e\x34\x8b\x89\x25\x09\xb5\x1f\x57\xff\xe4\x71\xd3\x67\xd0\xba\xc3\x3d\x8b\x09\xd2\xc8\x81\xaa\x69\x39\x6b\xab\xd7\x4d\xfe\x60\xb7\x98\x39\x30\x1d\xb3\xe2\xbd\x85\x73\x2b\xe8\xe3\x5c\xc7\xbf\xec\x5d\xf6\xd3\x3e\x78\xf4\x8e\x18\x86\x61\xe7\x13\xd5\x6c\x35\x1f\x54\x64\x7d\xf0\x40\x26\xaf\x3e\x66\xa6\xf5\x9d\x87\x4f\xe1\x87\x7d\x9e\xa4\xfa\x72\x52\x8d\x72\x22\x04\x2f\x2b\x8e\x8f\x1c\x0b\x34\xa9\x7b\x18\xba\xbf\x79\x1a\x97\xf4\xdc\xee\x25\x98\x0e\x1b\xad\x0c\x62\x9b\x8a\xc9\xe2\xda\xcd\x93\x84\xac\xdd\x73\x38\x81\x50\x15\x46\x79\x17\x2e\x73\x74\x74\xa9\x43\x5a\x78\xe0\xd3\xc2\xda\xca\x1e\xe8\x1b\x61\x55\x43\x34\x25\x4f\xb7\x14\x45\x8e\x6a\xd4\xaf\xe9\x4b\xf5\xc8\x20\x86\x24\x25\x1d\x0a\x17\xcd\xe0\x13\x95\xf4\xf3\x20\x10\xd9\xa9\x15\x22\x6d\x3c\x00\x5a\xc9\x79\x39\xf2\x5c\x42\xca\x1e\x3d\xdc\xdf\xbf\x14\xa6\x89\x24\x27\xf6\x93\xe8\x23\xf5\xd6\xf0\x38\xd8\xdb\xf5\x64\xf6\xd2\x3e\x66\x73\x58\x48\x3f\x54\xe2\xe1\xc4\x7d\xa2\x09\xd1\x19\xd9\x16\x8e\x9f\xa2\xe7\x96\xec\xca\xde\x0a\x18\xd9\xd1\x89\x13\x78\x04\xd6\x8f\xba\x50\x80\x3e\x64\x65\x3f\xb0\x76\x0b\xe4\xb5\xcd\xd2\x9f\x64\xe0\x05\x0b\x62\x99\x34\x6e\x79\x80\x79\xaf\x86\x29\x9a\x17\xe9\xdc\xb4\xb1\xae\x58\xe9\xe4\xaf\xad\x28\x3d\xa9\xa1\x5e\xe9\x68\xd3\xa2\xe5\x1b\x11\x95\x93\x4d\x76\xa2\x7a\xd1\x9f\x52\x45\xed\x2e\x0e\xd2\xe6\xc5\xe1\x09\x8f\xc3\x33\x23\x2c\x7c\xe5\x3a\x34\xd2\xd3\x81\x30\x1b\x2e\x60\x07\x31\x2b\xb3\xe7\xe8\xe1\xfd\x1d\x0f\xef\x52\x1f\x91\x05\x4b\xf1\x0c\xa5\x90\xed\x8d\x99\x43\x14\x1c\xfc\x53\xd8\x2f\xd1\x0e\xd8\x4c\x11\xf3\xa2\x23\x6f\x52\x05\x4f\xbf\xf4\xea\xcb\x2a\x72\x82\x53\x4e\x87\xf6\x19\xc7\x22\xea\x87\xc1\xef\xd8\xbb\xef\x67\xf2\x20\xa6\xfb\x6c\x91\x2e\x29\x49\xe1\x1b\x27\x25\x8e\xc4\xe0\x52\xfe\xc9\xe3\x1b\x71\x92\x22\x95\xac\xb1\x17\x55\xd6\xda\x05\xbe\x3a\xda\x5c\xaf\x9e\x58\x5e\x94\x48\x4b\x9b\x73\x37\xaf\xdb\xdb\xa0\x06\x7b\x62\x58\x4d\xb0\xf3\xd4\xb0\x4c\x68\x71\xe8\x25\x1c\x26\xcc\x7a\xbc\xb5\x59\x56\x92\x96\xf4\x2f\x03\xa6\x5e\xbe\x2a\xa4\x23\x23\x99\xa7\x65\x5f\x0d\xcb\x71\x38\x42\x2c\x7b\x5c\x09\x79\xe1\xd6\x84\xb0\x09\xea\xba\x53\x38\x14\x4b\xee\x37\x0b\xd8\x7a\x5c\xb9\xed\xaf\xbd\x54\x62\x45\xae\x76\xab\xb7\x22\x14\x06\x9f\xbc\x48\x3a\xb9\xcc\xab\x46\x06\x65\xd6\x55\xbf\x9a\xfa\x3f\x12\xf8\x8f\xab\x03\x3e\xeb\x25\x0d\x73\xec\xbc\x97\x29\x6a\xde\x85\x93\x57\x27\x6a\x9c\x61\x73\xb4\xf0\x7e\xb3\xf8\xb7\xe7\xff\x22\xf6\x89\xd3\xbe\x69\x9e\xc3\x9f\xba\xae\x57\x90\x88\x40\xa7\xa1\x9f\x94\x54\x60\x2a\x68\x5d\xa6\x76\x16\xb5\x24\x72\x90\x13\xac\x81\x6d\xf8\xba\xb3\x90\xea\xd7\xc7\x78\x79\xe2\xe0\x09\xb9\xa1\x15\x51\x73\xe6\x8e\x04\x92\xce\xae\x9d\x7a\x3d\x45\xba\xaa\x52\x0c\x16\x85\x2b\x49\xd7\x8f\xde\x86\xd0\xfe\x0f\xc5\x98\xff\xe3\x44\xb1\x6b\x11\x84\xc1\x75\x03\x02\x08\x96\xea\x31\x1b\x31\xff\x4f\x44\x86\x6c\x85\x4d\xcd\x14\xe2\xa2\x77\x9b\xfe\xe8\x07\x4f\xdc\x6e\x75\x4d\x05\x80\x14\xe7\xbb\x36\x50\x14\xbe\x24\xc6\x7e\x8d\x8a\x94\x20\x91\x0b\xe7\xfe\x66\x0e\x0c\xe2\xd1\x29\x6a\x29\x08\x7e\x17\x9b\xf0\xd4\xc4\x1b\xc9\x79\x1f\x1d\x8c\xb5\x88\x37\xd9\xb5\x2a\x27\x43\xf0\xd4\x4a\x2a\xfc\x84\x17\x85\x94\x10\x4e\xb3\x30\x54\xa2\x0e\x89\x57\x4c\x46\xd1\x88\x9d\x57\xe6\xcf\x1c\x4c\x63\x3f\x78\xc5\xb4\x0f\xf6\x4e\x93\x53\x49\x2f\x3f\xb3\x7b\x3a\xee\x0d\x38\xaa\xfd\xea\x4d\xc5\x4a\x9a\xbb\x32\xc6\xfd\x48\x02\xed\x47\x31\xba\xa3\xfb\xba\x1e\x9f\x4d\x45\x7a\xe5\x41\x52\xa7\xdb\xa6\xca\x4b\x83\x7b\x64\x6c\xac\x9a\x12\x1f\xa6\xdb\x28\x86\x92\xa8\xd5\xd6\xa0\x6b\x1b\x4f\x0e\x49\xad\x5a\x7f\xbe\x48\x06\x6c\x64\x69\x75\x28\xc9\x0b\xab\xed\xd7\x89\xc0\x65\x22\x20\x78\x3f\x6e\xa5\xd0\x7d\xf2\x1a\xc2\xb8\x1b\x88\x70\x93\x8d\x31\x88\x4b\x33\xf4\x27\xbf\xb6\x6f\x61\x1d\x71\x9f\x68\xf3\x1c\xa3\xf0\xc4\xfc\x36\x39\xdb\x54\x6c\x75\x4d\x21\x8b\xfb\xe6\x9d\xcc\xc6\x14\x01\xf4\xc5\x56\x79\x95\x68\xb9\x54\xf9\x30\x58\xcf\xee\xc8\xd5\x0d\xe2\xb7\xd2\x2c\x3f\xbc\x87\xb8\x15\xaf\xc7\xb0\xd7\xad\xa5\x60\x6e\x2d\x65\x06\xc5\xd3\xa1\x0a\x73\x67\xd2\x0a\xd3\xa9\x7a\x7c\xc8\xde\x6c\xb7\x24\xd8\xc3\xe3\xeb\xe6\x2c\x30\xb9\xc8\x34\x06\xa2\x5f\xed\xf8\x25\xdc\xef\xe8\x0b\xd4\x0b\xa6\xbc\x3f\x99\xf5\x9a\xd6\xfc\xaf\x83\x34\x49\x41\xb1\xe8\xad\x99\x34\xe3\x52\xd4\xab\x98\xd3\xd1\xf6\x0e\x2b\x39\x53\xef\x20\xf4\x3d\x8d\x67\x36\x7e\x57\xb1\xb7\x63\x7c\xa8\xb0\xa3\x2e\xed\x07\xc0\x43\x8d\x57\x7d\x62\x8f\x34\x18\xf1\x7d\x8b\x96\xc4\x33\x24\xd1\xe2\x94\x2a\xd7\x3e\x1e\xe6\x0e\xaa\xe6\x5d\x29\x75\x8a\xa9\x58\x02\xbb\xe6\x29\x98\x9b\x05\x2f\xbd\xbd\xf8\x0c\xff\xbe\xa0\x05\x9a\x37\xb7\x98\xe7\x3f\x6f\x2c\x24\x6d\x0b\x98\x8c\x2a\x30\x4e\x7a\x01\x71\x19\x79\x5e\x84\x00\x55\xf4\x53\x64\x0a\x8d\xb1\xe8\x1a\xae\x63\x3c\x49\x66\xe0\x1f\x53\xfb\xb7\xc8\x4b\x62\xf1\xc1\x45\x3a\x2c\xf2\xbe\x51\x0d\x3f\x5c\xd7\x0e\x7f\x78\xf9\x80\x97\x90\x2f\x24\x8d\x61\x4e\xd3\x8b\xea\x77\x26\x60\xc3\x88\x00\x24\x29\xf6\xb6\x03\xaf\xf2\xfd\x79\x53\xa0\x1f\x22\xb6\xf2\xeb\xaf\xff\xf9\xbf\xbf\xfe\x3f\x00\x00\xff\xff\x45\xf8\xc0\x95\x0f\x2e\x00\x00")
-
-func dataMalenamesJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataMalenamesJson,
- "data/MaleNames.json",
- )
-}
-
-func dataMalenamesJson() (*asset, error) {
- bytes, err := dataMalenamesJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/MaleNames.json", size: 11791, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataPasswordsJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\xfd\xeb\x72\xf3\x3a\xd0\x2c\x8c\xdd\x0b\x7f\x24\x55\x7b\xbf\x3b\x65\xc9\xe7\xe4\x16\x72\x07\xf9\x91\x02\x49\x88\x84\x44\x12\x7c\x78\xd0\xe9\xbb\xf9\x6f\xa6\xbb\x21\x2f\xfb\x59\x65\x2d\xd9\x92\x48\x60\x30\xc7\x9e\x9e\xff\xab\xfa\xff\xa6\x75\xab\xfe\xdf\xff\xbf\x6a\x0e\xeb\x7a\xcb\x4b\x5b\xfd\x4f\x75\x38\xbe\x7f\x7c\x7e\xbd\x1e\x7c\xff\xe8\xa1\xfd\xf8\x77\x8b\xcb\xf6\x28\xbf\xb2\x9f\xed\x12\xba\x3c\xd9\x83\x79\x5f\x57\xff\x45\x1d\xd6\x58\x87\x61\xb0\x87\xa7\x9c\x37\x3d\x1c\xe2\x36\xc6\xe4\x7f\x37\xe6\xe9\x12\xfd\x0f\xbf\x7e\xfd\xdb\x1e\x84\xba\xb1\x77\xf3\x5f\xed\xeb\x16\xa6\xce\x1e\xad\x7d\x68\xf3\xcd\x9f\x0a\xeb\x16\x17\xff\x3c\x7c\xd9\x83\xe3\xdb\xdb\x9b\xfd\x38\xdb\xa5\x06\x7f\xbf\x75\x9f\xe3\x32\xe2\x61\x1f\x96\x21\x3e\xfe\xae\xdb\x2f\x61\x6f\x2e\x63\xf4\xdf\xed\x13\xdf\xc8\x9f\x79\xe4\xdd\x1e\x6d\x8b\x7d\xde\x94\xfd\x4d\x17\xfb\x58\xfc\xb6\xde\xf5\x79\x5b\xea\xf8\xcc\x9a\x9b\xe6\xf5\x42\xdc\xdf\xc6\x4f\xdb\xa2\x2d\xdc\xff\x60\xdd\xec\xc7\x25\x0d\x03\xfe\xac\xcf\x0d\xef\xaf\xf1\xcb\x49\xfe\xd9\x43\xbe\x46\x5c\xe9\xb4\xf6\x69\xf2\x87\xf6\x9a\x3e\x0f\x51\xab\xe0\xef\x12\xe7\x19\x2f\x0f\xf6\x69\x78\xc3\xb2\xf6\xfe\xdb\xaf\xcf\x8f\xf7\xe3\x01\xcb\xd1\x75\x78\x4b\x5b\xa8\xe5\x16\x16\xff\xc3\x35\x0d\x57\xbc\xb4\xb5\xa5\x0e\xfe\xcc\x23\xd8\x12\x47\xbd\x09\x97\xf6\x0b\x5f\x7e\x79\x71\x18\xb2\xfd\xcc\xb8\x65\xbf\x9f\xb4\x45\xac\xd0\x69\x89\xb1\xcd\xa3\x5f\x79\x1e\xe7\x9d\xcb\xb0\xc6\xbb\xdf\xcb\x66\xcb\xd7\xe2\x89\x2e\x69\xa5\xfa\x30\x8e\xfc\x93\x5d\x0f\x9a\xbc\x5c\xe3\xb6\x45\xad\x15\x6f\xc7\xd6\x13\xdb\xae\xdd\xb3\xbf\x1c\xf8\xff\x47\xff\xf6\x37\xcc\xc3\x89\x2f\xef\xed\x9a\xfd\xc5\xf3\x92\x26\x2d\x82\x3d\x37\xac\x31\xf8\xcd\xa5\x60\x92\xe3\xd2\xf9\xf0\x3b\xb8\xe1\xca\xbb\x36\x43\x5a\x62\xb3\xc4\x0d\xcb\xda\x9e\xba\xde\x9f\x99\xc3\x72\xc1\x26\xe4\x5b\x9d\xf1\x20\x8c\x61\xc9\x58\xc2\x6d\x49\x77\xbf\xc6\x30\x34\x90\xdc\xe4\xfb\x43\x91\xe8\xf6\x64\x0b\x0b\x69\x5e\x66\xec\xcf\xda\x98\x10\xe3\xfa\xe6\x3e\xc7\x09\xaf\x0c\xf8\xa2\x90\x44\xec\xc1\x9c\x97\xd5\xae\xd5\xdf\x3e\x69\xfb\xc7\x60\xbb\x92\x20\x32\xf6\x16\x17\xec\xda\x14\xd6\x86\x6f\x1f\xc3\xb4\xfb\x15\x1f\xde\xfd\x9b\xc7\x02\x2f\xeb\xf3\x32\xf9\xcf\xd5\xae\x77\xda\xfa\x00\x09\x9b\xb6\x84\xed\x34\xd9\x8c\x03\x3f\x71\x9d\x72\x9e\x71\xde\x72\xe6\xf2\xdf\xfa\xb0\x45\x4a\x42\x6a\x22\x65\x74\x1d\x33\xaf\xa6\xb3\xdf\xdd\xc2\x03\x52\x72\xc9\x5b\x78\x2d\x8d\xbf\x57\x0c\xdd\x10\xb9\xdc\x7e\xf5\x13\x96\x9b\xc2\x3e\x04\xfc\x7c\xde\x9b\x6b\xed\xcf\xdb\x56\x2d\x61\x49\x2e\xf0\x53\xea\xfa\x8d\xa7\xae\xb5\xad\x8f\x12\x9c\xf0\x0f\x0f\x4e\xa7\x18\x79\x75\xf6\x8f\x62\xd6\xf4\x38\x60\xc3\xc0\x5d\xbb\xe3\xcb\x2f\x3c\xda\x46\x40\x04\xe7\x21\x3c\x70\x03\x53\xd3\x1c\xbe\xdf\x5c\x60\x6e\xe9\x19\xa0\x94\x7c\x23\x6a\xbf\x81\xf3\x3e\xa5\x8c\xbb\xf4\x13\x3d\x61\xe3\x5d\x14\x74\xc5\x26\xd7\x2d\x44\x36\x4e\x53\x5a\x71\x0f\xf9\x76\xce\x35\x8e\xee\x64\xdf\x5c\x6c\x1d\xf3\x75\x4e\x94\xeb\x21\x5c\xb8\xb0\x4b\xa8\xed\x5a\x7d\x55\xa4\x30\x6c\x75\x9b\xd8\x62\x7d\x4e\x51\xa7\xe0\x61\xbb\xd3\x4b\x2c\x6b\x9c\xa7\x3a\xaf\x1b\xa4\x09\x32\x81\xfd\x5f\x78\xd6\x7d\x51\x4d\x47\xbe\xb4\xcc\x8a\xed\x98\xec\xb4\x9e\x70\x7f\xfa\x18\xbb\x85\x2d\x6d\xb8\xe0\xb0\x50\x16\x96\xe0\x17\x27\xf9\x9a\xf0\x9b\x96\xd2\xec\xf7\x84\x15\x33\x41\x9f\x20\xe8\xbe\x02\xa1\x6d\xa9\x78\xa2\xee\x6e\xb0\x13\x83\x8b\x1a\x53\x5b\xb6\xab\x1e\x76\x9c\xd0\xe4\xba\xc8\xf7\xe1\x0d\x5f\xd8\xc8\x69\x0a\x38\x3d\x65\x1b\x0e\x87\x97\xda\x35\x45\x60\xff\xfc\xa2\x62\xbb\xe6\x3b\x74\xc2\xfd\x70\x78\xff\xd1\xb1\xe3\x1d\x0f\x75\xc6\x21\x73\x91\xed\xf1\x16\x94\x1c\xd7\x2a\xa6\xad\xe2\x14\xdc\x18\xfc\x0b\xcf\xdb\x7a\xc7\x3e\xe8\xaf\xbe\xf9\xe5\xbb\x1b\x56\x2a\x42\x5b\x98\x89\x1a\x27\x0f\x2d\x64\xb2\xde\x37\xfb\xf3\xe0\xc2\x70\x4d\x17\x5e\x7c\xba\xd9\x27\xf9\xc9\xf5\xa5\x1d\xd6\x97\xf6\xe0\x89\x8f\x0b\xee\xbe\x4b\x0b\x7e\x35\x86\x36\xad\x78\xa6\xc7\xa1\xe6\x91\x0a\xcb\xb6\x44\x1c\xd3\x30\x6f\x81\x36\xca\x56\x12\x32\x6a\x57\x33\x72\x17\xfd\xc3\xb9\x4f\x39\x77\xe5\xba\xfc\xae\x17\xd7\xf7\x1b\xd6\x43\x87\x6e\x48\x76\x0a\x67\x48\xfd\xc9\xf6\x89\xc6\xc3\x0e\x08\xcf\xe6\xb8\x9f\x4e\xf8\x90\x6d\x5f\x36\xaa\x98\x3c\xf7\x50\x0f\xbe\xb4\x76\x5f\x7e\x59\x5b\x7e\xf0\x94\xae\xc9\x4f\x1c\xd7\x43\x12\xd6\x25\xbb\x67\xdc\x6a\x68\x24\xb4\x53\xbc\x3d\xf2\xc2\x9b\xd0\xfa\xd5\x7b\x5d\x07\xec\xe1\xf1\xf8\xfe\x5e\xd1\x0a\xe1\x8f\xc7\x6c\xb6\x90\x37\x6a\x47\x69\x8b\xbe\xa0\xed\x92\x78\x79\xa6\x70\xe7\xb1\xa8\x70\xae\xf1\x5c\xd4\xd7\xe0\xa6\x13\xcb\x73\xb7\x33\xeb\x3b\xf9\xf3\xf5\xfd\xf9\xfe\xe6\x26\xaa\x8e\x81\xc6\xc0\x5e\xb5\x51\xe1\x64\x7c\xda\xe7\xe1\xd3\x85\xeb\x88\x2f\xff\x8b\x3e\x95\x5d\xf4\x8f\x30\x45\x81\x75\xee\xf6\x40\xeb\xb9\x71\xe5\x75\x16\xba\x68\xeb\x9f\xca\xd5\xbf\xb4\x06\xf4\xc6\x4b\x66\x1a\x3b\xd5\x6d\xe0\x72\x2f\x09\x8f\x7e\xf4\x85\x0d\x32\x87\x64\x6f\x71\x92\x37\x33\x91\xa9\xf1\xfb\xcd\xcd\x06\x25\xb2\x2d\x79\xaf\xb9\x0d\x7b\x31\xbd\xeb\xb6\x9b\x5a\xc0\x2e\x8c\x4d\xf0\xbb\x31\x53\xbb\x50\xe9\x98\xe6\xf6\xf3\xe5\x12\x37\xcf\xd4\x9a\x7e\x94\xaa\xe2\x1a\xed\x09\x0b\xd4\xe1\x53\xec\x63\x71\x22\xdb\x3c\xd8\x16\x4f\x54\x2f\x69\xaa\x61\xbe\xba\x5d\x02\xfe\xfb\xf3\x6d\x06\xbe\x82\x05\xe6\xdf\x87\x21\xde\xa9\xbb\x16\xb3\x22\xd0\xcc\x19\xda\xed\x78\x80\xcd\x94\xe9\xb4\x27\x43\x93\x07\xbf\xdf\x7b\xb8\x26\x3a\x01\xfc\xa8\x8a\xfe\x09\x37\xb0\x36\x35\xf0\xf6\xf6\x8d\x15\x18\x6b\xfc\xd9\x35\xe7\x16\x12\xaa\x25\x34\x73\xc3\x93\x11\xe6\x4c\x07\xe1\x94\xa0\xd2\xb7\xa2\x4b\x6c\x83\xaf\xb8\xa6\x6b\x7e\x04\x9e\x00\xd7\x4a\xd0\x6b\xfb\xda\xeb\xca\xea\x48\xb3\x3f\xbf\xac\xe7\x32\x27\xff\x1b\x13\xec\x19\xf6\x6a\x7d\xb4\xd2\x6e\xb1\xa5\x6f\x32\xeb\x8c\xf8\x27\x50\x29\xd3\x06\x9f\x4d\xbc\xe9\x5c\x9d\x86\x07\x45\xd7\xcd\x89\xff\x3c\xbe\xfb\xb7\xab\x17\x7c\xfd\x7d\x12\x6c\x57\x96\x93\x34\xc4\x2e\xc2\x65\xc8\xfb\x0f\xae\x8e\x8e\x51\x05\xbb\xf6\xc4\x47\x2d\x65\x13\xea\xb4\xb4\x49\xfe\x90\x36\xf8\x13\x5f\x10\x83\xd9\x36\xab\xa2\xa2\x93\xb2\xeb\xfd\x62\x27\xa8\x22\x39\x6e\x53\x1a\xc3\x20\x49\xc7\xfb\x74\xd4\xd5\x1f\xf6\x55\x41\x2f\x5d\x03\x9c\xa3\x2e\xb7\x4f\xf3\x16\x03\x54\xc5\x29\xf6\x34\xb1\xb3\xa9\xdf\x0d\xee\xd7\xc2\xbd\x0e\x7b\xb7\xc3\xc3\xb4\xbd\x19\xe9\xcb\x64\x7f\x7f\x33\x92\xb6\xaf\xfb\x88\x15\xba\xe0\x92\x4d\xcd\x35\x19\x17\x75\x09\x5f\x37\x8a\x86\xfc\xc9\x66\x1f\xcd\xd5\xe4\x89\x5c\x4e\x29\x0e\x2d\x74\x89\x5c\xa8\xc6\x34\x81\x7f\xc2\x00\x67\x84\x1e\x39\xfc\x51\x3b\xc4\x5b\x7c\xb9\xd7\x55\xf1\xb7\xb1\xe6\x70\x17\x60\x13\x4c\x59\xc0\x24\xbb\xa6\x35\x23\x57\xc9\x62\x50\x94\x23\x04\xf5\x9d\x8e\xab\x2d\xe9\x15\x66\xca\xcc\xbf\x6b\x80\xd7\x55\xaf\x15\x7d\x1e\x88\xc4\xba\x2f\xf4\x05\xcd\x72\xaf\xd0\xa5\xbf\xf8\xc2\x22\x98\xbe\xc4\x1e\xa4\xa5\xf6\xbf\xf7\x0b\x19\x22\x56\x4d\x5a\xc5\x7f\xd9\x6c\x94\x01\xd3\xf4\x2d\x7c\x61\x9c\xca\x8a\x8e\x96\xbf\xe4\x3e\x9b\x8e\x90\xf4\x9a\x2a\xa0\x81\x5e\x92\xbc\xd4\x36\x36\xe5\x84\xdc\xa8\xde\xd7\x5b\x2c\xda\x5d\xfb\x92\xa7\x81\x26\xc1\x3d\x0e\x69\x32\xbb\x97\x7c\x19\x1e\xfe\x16\x8d\x3b\x7d\x78\xc9\x12\x1a\x29\xd0\x48\x4f\x44\x76\xd6\x9c\x38\xaa\x82\xd8\x9a\x52\xef\xfc\x61\xbb\x44\x3b\x80\x15\xdc\xc7\x3e\x75\x8c\x66\xa2\x6b\x69\x6a\x13\x6e\x37\xf4\x04\xd7\xb3\x2d\x51\x94\x39\xb3\xa6\xc3\xa1\x64\x52\x67\xce\xab\x4b\xc8\x3b\xbe\xfc\x5a\xcc\xb6\xd1\x26\x99\x63\x6b\x82\x5e\x02\x0b\x8b\xb8\xfc\xd6\x66\x73\xf8\xb9\x29\x27\x73\x86\xb3\xb6\xdd\x9f\x99\xd3\x38\x63\x41\xb0\xd7\xfe\xd3\xad\x0f\x03\xb8\x29\x2d\x57\xba\x51\xd7\x60\x7f\x05\x2d\x21\x8d\xec\xfe\x1b\x85\x7e\xde\xc7\xf9\x82\x3f\x37\x47\xf5\xa6\x20\xd0\x75\x09\x8f\xfc\x5a\xe2\x83\xd1\x14\x1d\x44\xd7\x0e\xff\x26\x75\x6a\x3b\x1a\x10\x4a\x36\x71\xd8\xa0\x47\x4d\x7a\x96\x85\x5e\xfc\xba\xe2\x94\xbe\xb4\xfb\x3a\xe9\xfc\xd9\x51\x8f\x6b\xa2\x38\x99\x52\x6f\xb9\xc0\x34\x26\xae\x4f\xcd\xe3\xa2\x8b\x3a\xb8\x5a\x70\x89\x2e\x9a\x0d\x91\xef\x1b\x9c\x4c\x3b\xb4\xd2\xb4\x16\x49\x5d\x63\x07\x11\x5a\x87\x34\x5f\x26\x9c\x21\xad\x6b\x6b\x17\xeb\x2a\xff\xf0\xef\x78\x7b\xc7\xf2\x34\xf6\x37\x08\x5e\xf8\xd4\x07\x54\xf1\x52\x22\x23\xf3\x37\x37\x79\x9e\xfb\x8a\x3b\x52\x00\x61\x1b\x64\x52\x38\xd1\x1d\x37\xc1\xb4\xa8\x17\x22\x64\xef\x9f\x10\x33\x22\x5c\x3b\x40\x69\x64\xca\xe5\xc9\x2d\x1c\x1d\x7f\xfb\x55\x73\xc1\x15\x36\x99\xfb\x66\x1b\xdb\xc6\x53\x45\xeb\xcf\xe5\xec\xc3\x2d\x24\x17\xa3\xd3\x60\xdb\xac\x10\x63\xc5\xaf\x2c\xaa\x1b\xb9\x78\x52\x74\x1e\xc3\x33\xd2\x68\x2d\x7e\x92\xbc\x30\xa8\x3a\xc3\xb9\xb6\x8b\xe0\xef\xdd\xb2\xc1\x01\xb6\x63\xda\x52\xc4\x26\x53\x58\xfd\xc6\x0f\x98\x60\x84\x5d\xc7\xe2\x09\xc5\x9e\xa6\x88\xf8\xff\x08\x76\x0e\xdc\x75\x44\x05\x6e\xdd\xe1\x75\x48\xbc\x57\x93\x3f\xc8\x9d\xf9\x1e\xbd\x5c\x8b\x8f\x0f\x69\x52\xf3\x82\x69\x16\x5a\x58\x38\x7f\x43\xfa\x83\xfe\xdc\x50\xe2\x05\xfb\x13\x5d\x97\x7b\xd8\x13\x16\xd6\x84\xcf\xf4\x81\x3f\xe7\x9f\x57\xff\x39\x14\x7e\xac\xcd\x21\xe0\x33\x83\xef\x2e\x8d\x42\x70\x53\x84\x94\xc8\x9b\x7f\x43\x81\x98\xb7\xc8\x60\x45\x09\x93\x83\x16\x0e\x37\x64\xf1\x92\xf9\x1b\x90\x04\x13\xc3\x31\xa4\x01\x07\xcd\xb4\x03\xf5\xa4\x59\x80\x1d\xd6\xc2\xe4\xeb\x12\x78\x33\x32\xa6\x61\x71\xf7\x14\x31\x64\x58\x1e\xe7\x30\xe9\xfe\x67\x2c\x98\xdd\xd5\x86\x1b\x6d\x63\xc6\xd1\xeb\x28\x36\x16\xc0\x6c\x32\xd5\x7e\x4a\x32\xed\x5b\x93\xf7\x8e\x8b\x76\x7c\xb3\x7f\x65\xd3\xfd\xfa\x2d\x0e\x18\x43\x55\x82\x8b\x0a\x3e\xc6\x13\x97\x59\x7b\xb8\x10\x25\x0d\xc8\xed\xec\xf8\xdf\x76\xc9\x37\x53\xc7\xb3\xf6\x69\x40\x86\xc5\x7c\xf8\x23\x9d\x78\x13\x0a\x6c\xaa\x9d\xc4\x97\x3b\x9a\x8a\x6f\x64\x36\x75\x8d\xfe\xe6\x8b\x44\xd5\xfd\xb9\xe8\xca\xec\x66\x9b\xb7\xa6\x96\x9e\xd7\x73\xbf\x24\x2d\x29\xf5\x77\x5f\x8e\xce\x10\x5a\x4a\x5c\x30\xbf\x26\x48\x75\x60\xfd\x0f\x1f\xdf\xf6\x0f\xca\x6a\xa1\x61\x5d\xa3\x8b\xf3\xc9\xdf\xe9\x6c\x1e\x1c\x4f\xb7\x29\x81\x05\xda\xd3\x4d\xd2\xbe\x52\xb7\xbb\x1f\x40\x4f\x23\x31\x7c\x6a\x77\x73\xf4\x78\x09\x0b\x3d\xaf\x50\x3f\x3c\x6e\xa8\xe0\x79\xb7\xb6\x02\x5c\xec\x25\x31\xe9\xe3\x51\x9b\x42\x49\x1e\xc7\x39\x14\xbf\xa1\x5e\xf6\x6d\xc7\x9f\x8f\xb6\x34\x2e\xde\x66\x00\x5c\x01\x73\x6b\x99\xa2\xf2\x80\x00\xd6\xdd\x0f\xbb\x5f\x1e\xf2\x21\x30\x9d\x26\x1a\x3d\xfe\xf4\x9e\xc6\xfd\x6f\x39\xb1\xfb\x5a\x9e\xd9\xf6\x79\xc4\xa3\xa6\x77\x25\x8c\x87\x2e\x06\x14\x79\xbb\xe0\xc4\xf8\x3f\x9f\x4a\x06\x6e\x36\x03\xcd\x40\xfa\x61\x7a\x8f\x69\x9e\x1a\xb7\x10\xa7\x33\x74\x36\xdc\xfb\x03\x77\x94\x0e\x14\x63\x58\xdc\x4a\x6c\xf6\xa5\xd8\x19\x1e\xe2\xd0\x8e\xb8\x25\x73\x26\x5a\x5b\x3c\x04\x24\x76\x6c\xa1\x3c\xa6\x46\x39\xa2\x85\xf1\x27\xf2\x41\xad\x14\x94\x52\x89\xd4\x55\x08\xe2\xcc\x13\xe0\x85\x9b\xd1\xf5\xac\xc9\xa4\xed\x52\x6e\xcd\xb4\xf2\x82\x57\xaf\xff\xf6\x84\x63\x70\xf6\xb4\x52\xc3\x53\x56\xd7\xb8\x42\x73\xcc\x97\xe1\x8c\xa5\xf4\x88\x7d\x5f\xe8\x78\xdb\x35\xfa\x79\x91\x17\xb1\x78\x02\xc6\x57\xc3\xdc\x05\x7e\xe2\x68\xa6\x7f\xa1\xa2\xab\xf1\x85\xb7\x32\x3f\x8a\x69\x8b\x29\xf0\xba\x4d\xdf\x0d\x0a\xa0\xcd\xeb\x68\xcc\xea\xc2\x82\x9a\xdf\x54\x82\xc8\x4e\x32\x68\xfe\x3d\xa3\x78\x17\x0c\x65\xd8\x3a\x7e\xd6\x33\x8f\x35\xb3\x77\xb7\x34\x8e\xf4\x0d\xda\x1d\x2e\x1c\x83\x87\x03\x05\x2f\x16\x9d\x3e\x04\xb8\xaf\xa6\x16\xe4\x32\xe7\x2c\x9b\x35\x96\x98\x0c\x2a\xe8\x44\xbb\x67\xce\x9c\x1c\x7e\xb3\x29\x97\xc3\x8f\x3b\x82\xc5\x4c\x9a\x7b\xb1\xf3\x77\x1e\x17\x22\xb3\xd2\x33\x69\xe3\x86\x73\xc1\xa2\xf8\x72\x9b\x4f\x0f\x47\x2a\xbc\x92\x5c\xa6\x54\x68\x85\x87\x54\x4b\x9f\x9b\x58\x3c\x33\xd4\x8f\x6f\x62\x85\xf8\x53\x2f\x84\x9f\xcf\x83\x67\xf6\x69\xe3\x01\x77\x11\xa4\x2d\xb2\x18\x00\xd6\x2c\x0c\xca\x18\xc1\xf7\x82\x3a\x08\x54\x14\xc7\x0f\xff\x86\x2c\x8c\x35\x82\xaf\xb6\xa4\x62\x9b\xc1\xf5\x03\x03\x2b\x64\x91\x98\x1a\xc9\x8c\xb5\x43\xd3\x30\x7d\x3d\xe7\xb9\x61\xbe\xc4\x5c\x46\x7a\x49\xb5\xb9\xf9\x34\x3c\x3b\xb4\xa0\x45\x43\x0c\x88\x2c\xcc\x34\xc7\x9d\x77\xc7\xa8\xdd\xaf\x01\xee\x18\x3e\xd2\x83\xf6\x4d\x07\xcd\x1e\x0f\x34\x4a\xeb\xa3\xe9\x21\x1d\x66\x09\xe8\x73\xcc\x66\xe1\x53\x80\xaf\x92\xa7\x09\x91\xa2\x59\x11\xe8\x29\xf3\x32\xa9\xb0\xcc\x15\xd7\xa6\xdb\x41\xd5\xd6\x32\xff\x34\x32\xcd\x67\x52\x95\x19\xf5\x66\x65\x69\xda\x78\x4d\x03\xd5\xa6\x3c\x2d\x58\xe3\x0a\x9e\x43\x9b\x98\x4e\x59\xfb\xd0\x75\xd0\x29\x4b\xe6\x83\x7f\x0c\xa8\x2e\x66\xfa\xd7\x00\xcd\x7a\xc9\xa6\x11\x18\x66\xcc\x90\xf1\xe2\x48\xda\x8d\x68\xbf\x7a\x13\x29\x25\x12\x1f\xf4\x76\x4c\x85\xd7\xd2\x23\x13\x23\x0d\x77\x5d\xab\x57\x7a\xce\x6f\xe0\x1f\xbe\x2a\xf8\xe5\xe6\xfe\x31\x57\x62\x9a\x82\x02\x1b\xae\xb6\xd1\x0c\x23\x3a\xe5\x07\x4c\x36\xb1\x1a\x52\x1b\x38\x94\x8c\xa4\x3c\x37\x7a\x0a\x0d\x3d\x7b\x33\xe3\x35\xbc\x68\xd3\x16\x8c\x8e\xb7\x65\xa7\x09\x71\xcf\x7c\x56\xd0\x14\x97\x2b\xfd\x7b\x53\x10\xf2\xc5\x15\x8c\x30\x5f\x66\x22\x04\x63\x63\xe1\xee\x83\x4b\x75\xa5\x26\x31\xaf\x54\x69\x7c\xcf\xd7\x71\x25\x12\xdf\x7f\x09\x33\x73\x03\x07\xc6\x42\x08\xa3\x97\xc0\xd7\x97\x6c\xf0\x69\x09\x4c\x33\xf9\xd9\x57\x72\xc9\x34\x36\xb6\xd4\x4e\x82\x3f\xf3\xfd\xf3\xcb\x32\x8a\x7b\x33\x16\x5d\xd3\x3d\x31\x25\xc2\x54\xab\x29\x3d\x08\x5e\x1f\xfa\xa0\x3c\xaf\xc5\xbb\x90\x60\x73\xfd\x5b\x26\xa9\xcd\x5e\x5d\xa9\xe8\x56\x4f\x6c\x21\xdb\xed\x1e\xff\x35\xc8\x1e\x61\x5b\x8e\x9f\xfe\x5d\x54\x0d\x34\x13\x8b\x15\xab\xbd\x44\x7e\xd4\x1c\x1f\xd8\xc1\xb0\x6d\x38\x2e\x9b\xb9\xc4\xab\x8e\x12\x23\x9c\xb0\x2f\x34\x5b\xe6\xb5\x64\x85\x40\xcc\x3e\x28\x9d\xe7\x0f\xcf\x61\xa6\x44\x98\xb0\xe2\xb3\xe1\xfa\x70\x23\x71\x98\xe1\x05\x79\xb2\x46\x99\xca\x92\xf0\x77\x85\x0d\x53\x6b\xeb\xd5\x47\xe6\xea\x16\xf7\x37\x83\xb6\xb4\x63\xe9\xc7\x83\x04\x95\x56\x46\x8f\xf9\x98\xca\x33\xdb\x8a\xa8\xfa\xbc\x73\x35\x3c\x4e\x0a\x71\xf0\x0f\x9b\x8a\x7a\x38\x7c\xfe\x7e\x7f\xba\x7b\x0e\x57\xe1\x00\x91\x31\xe5\x20\x4b\x74\xbb\x70\x01\xcc\xae\x04\x9a\xfc\xdc\x96\xec\xbd\x9d\x11\xaf\x3c\xe1\x23\x1b\x95\x68\xe6\xc7\x12\x46\x64\x81\x2c\x0e\x88\xc8\xc5\x5d\x42\xf1\xe2\x4d\x0f\x63\x31\x93\xfc\x88\xc6\xd3\x75\xfe\x4c\x9a\x4e\x25\x1e\x9b\xe3\xbc\x22\x73\xc5\xd2\x17\x75\x3b\x6e\xb1\x77\xfb\x44\xff\xc8\x0c\x56\xc4\x92\xf9\xea\x60\xa7\xf2\x6e\x6a\x1f\xe5\x0d\x73\xbb\x26\x9a\xbf\x61\xb0\xb0\x0a\x96\xa9\xfc\x15\x42\x29\xed\x33\x6f\xc1\x14\x45\x2a\x1e\xc1\xd4\xd1\x45\x6d\x42\x5c\x59\x6f\x30\x85\x23\x67\xce\x1c\x7b\xb9\x5d\x75\xbe\x0d\x14\xa9\xdb\x5e\xea\x6e\xfb\xb4\xb2\x92\x32\x04\x3b\x39\xc8\x70\x97\xd2\xd8\xd3\x4b\x54\xdc\xcb\x19\x5f\x15\x8a\x71\x70\x7f\x65\xcb\xfc\xbd\x99\xbb\xb1\xd3\x60\x7a\x30\x50\x17\x31\xe6\x33\xd9\xcc\x4c\x88\x87\x95\x46\x59\x15\x32\xd4\x85\xf0\x55\x31\xa9\xdf\x31\xe1\xe9\xe9\xf2\x41\xe9\xa4\xc0\xea\xca\xe6\xd1\x78\xd1\x70\x66\x2f\x91\x68\xc9\x75\x38\xc5\x0d\x22\x6c\x2f\x59\xe9\x4d\x31\x3d\xb4\x9a\x12\x56\x92\x15\x5f\xbe\xbe\xe6\x8c\xed\x33\x85\xba\xcd\xf8\x24\x88\xf0\x5a\x54\x0c\x2b\x28\xe6\x41\x21\x67\xbf\x9a\x2a\x80\x4f\x11\xcc\xfc\x79\xa2\xd9\xae\x80\xb1\xe5\x35\x45\x6c\x93\x39\x8a\x6d\x86\x8b\xd5\x4a\xfd\xb6\x69\xa8\xa9\x95\x66\x0f\x21\x71\xa8\xce\x52\xae\x26\xca\xca\x17\x9e\x86\x62\x29\x4f\x25\x69\xda\x46\x93\xd8\xc4\xa3\x64\xd2\x3a\x49\x9b\xee\x4c\x1d\xa2\x98\x53\xc9\x2b\x43\x8a\x2e\x6e\x7c\xab\xfb\x29\x0d\x2a\x10\x95\xf2\xdc\x9c\x9e\x4f\xc6\x17\x35\xb5\x54\x0c\xc3\x46\xb7\x72\xda\x37\xbf\x83\x6e\x37\x07\x05\x7e\xa0\xb9\x3f\xd8\x2a\x53\xd5\x5d\x4f\xcb\x69\x02\x63\x92\x83\xcc\xdd\x38\xd5\xd7\xe6\xee\x39\xb6\x5b\x92\x17\xa7\x42\xad\x6f\x9c\x69\x27\x5b\x21\xbf\x6b\xcf\x00\x2a\x0b\x18\xcc\xb9\x67\x45\xc7\x23\x29\x8a\xc1\xe1\x76\x8c\xef\x8b\x2b\xf2\xde\x42\x5e\xfa\xcc\x97\xa9\xa8\xdc\xd8\x4e\x11\x1a\xcb\x9d\x43\x39\x88\x5d\x7a\x8e\xd8\x02\x3b\x2c\x08\x3a\x58\x6b\x46\xfa\xc3\xed\xa2\x12\xc5\x4b\xb2\x28\x16\xa5\x25\xb3\x99\x9e\xc6\xab\xa0\xa7\x37\xa6\xec\xcc\x97\xbb\x21\x24\x42\x81\x80\x25\x48\x66\x81\x43\x25\xa5\x0d\x8f\x79\x9c\x03\x33\x72\xb6\xea\x38\x46\x76\xfd\x1d\x3c\x1c\x64\x85\x0f\x7e\x41\xa8\x08\xcd\xa8\x7e\x99\x60\x2d\x88\x5c\xd7\x51\x29\x13\xb3\x6b\x4f\x85\x9e\xbb\xdd\x96\x1c\x10\xf9\x8c\x6e\xb5\x75\x57\x76\xbd\xd2\x57\x90\xb6\x0a\x41\xf0\xbe\xb1\xca\x6a\x9a\x97\x7e\xc1\xab\xfa\xfb\x06\x99\x69\x3d\x5f\xd8\xf0\xec\x50\x9e\x4d\xea\xa9\x74\x91\x63\xa6\x2a\xa0\x8f\xe3\x55\x02\x46\x4c\x2b\x8d\xb7\x97\x2e\x2a\x2a\x65\x56\x39\x3d\xa9\xa0\x98\xd1\xd6\x89\x65\x1d\x86\x0c\x2a\x37\x3e\x4b\xf5\x28\x2a\x0b\x66\x97\x6a\xa1\x15\x04\xd3\xd3\x14\x2c\xab\xbd\x4a\xf3\xc7\x57\x31\xd7\xdf\xb5\xc4\x1b\x4b\x6c\x52\xa6\xec\xef\xb2\x42\xc1\x3d\x5a\xa8\x52\x2f\xea\xe0\xdd\x16\xfa\x91\x73\x1e\x14\x78\x6d\x49\x81\xb9\x49\x0e\xf5\x85\xbf\xa1\x2a\xc4\xe5\xc4\xac\x97\x47\x49\xc2\x41\x26\x56\x9e\x3e\x5a\x58\x1d\x61\x8b\xb9\xec\x4f\xe8\x08\xe5\x92\x87\x6b\x18\xe9\x5a\xf0\x1d\x37\x94\x47\x90\x7b\xc4\x3a\x86\x85\xce\xf9\x2d\x6e\x05\xcb\xc0\x45\x91\x80\x52\x50\x4e\xd9\xd4\x0d\x77\xcf\x5c\x09\x7f\xb3\x31\x2f\x73\x1f\x71\xa3\x1e\x06\xd0\x69\xf9\xf0\x6f\xad\xef\xb6\xa3\xc6\x31\xdb\x63\xa4\x3b\x3d\x14\xc6\x8e\xf9\xb9\xff\xff\xdb\xd9\xa6\x3a\x76\x25\xc2\x77\xde\xcd\x76\x42\xc8\xd7\xd4\xb1\x5a\xb5\x6d\xb8\xb4\xe3\x9b\x7f\x57\x25\x54\xf7\x37\xb3\xc3\xf2\x03\xb1\xb5\x13\x09\x49\xbb\x06\x6a\xe0\x2e\x5b\x88\x99\xe8\x5f\x4d\xac\xeb\x87\xba\xf3\x0a\x85\xef\x08\xbe\x20\x4f\x0a\xd5\x78\x3e\x29\xd0\x8c\x50\xe3\x7d\x56\x60\x74\x4d\x4b\x07\xbd\xff\x2c\xeb\x7f\x33\x0d\x74\x61\x12\xd8\xf5\x1f\x7d\x3c\xf3\x7c\xd7\xfd\x95\xf0\xba\x30\xc3\x63\x0e\x4c\x94\x41\x34\xcd\xbc\x2f\xc8\x68\xfe\xfe\xbe\xf2\xba\x48\x93\x33\xa9\x6f\x7b\x12\x37\x25\x9b\xa3\xfd\xab\x0a\xfc\xc3\xdf\xa7\x44\x23\xe6\xaf\x7a\xc9\xe3\xe5\x6e\x6c\xf0\x1f\xec\xaf\x3c\x13\x9c\xb0\x07\xd8\x6b\x3f\x40\x72\x83\x7f\x95\x37\xc5\xd5\xdc\xf7\x80\x4d\xf3\xe0\xda\x5f\xf9\xfd\x57\x7a\xac\x5d\xf9\xc3\x47\xe8\xed\xd8\x16\x07\xdd\x13\x16\x84\x6a\x98\xe3\x30\x97\xb4\x50\xc9\x2d\xed\x1d\x37\xdc\x62\xe7\xc4\xd4\xb5\xf9\xc1\xb6\xf0\x8d\xca\xfd\xb8\xf1\x9b\x99\xb9\x52\xbf\x51\xf6\xb6\xed\x5e\xd1\x0f\x51\x33\xfb\x22\xb8\xc9\x14\x58\x28\x37\x9b\xea\xaf\x90\x57\xe4\x15\xc9\x44\x1c\xcb\xaa\x24\xcb\x9c\x3a\x3a\x6e\x10\xac\xf2\xae\x4c\x25\x79\xd6\x84\xbe\x80\x45\x7b\x8f\xbf\x7b\x63\x10\x36\xf2\x75\x0a\xc0\x7b\xee\x82\x83\x75\xa8\x45\xa8\x9b\xed\x06\x59\x11\xf2\xa3\x2a\x93\x65\x3e\x3c\x4b\xb1\xf6\xba\xa2\x65\xcc\x1f\x2b\x29\x0c\x48\x65\x52\x59\x7a\xa1\x43\xe5\x36\x5e\x77\xe6\x96\x94\x05\x7c\xf3\xf7\x99\x21\xb1\x38\x30\x00\x60\x12\xbd\x7e\xe3\x9f\x8f\x7a\x71\x85\x54\xb2\xce\xa5\x69\x75\x66\x24\xaf\x09\xb9\x36\x05\x1f\x48\x01\xfd\x22\xaf\xe8\x25\x46\x95\x19\x1b\x8f\x38\x58\x09\xeb\xcc\xf9\xa7\xfc\x17\xa9\xcd\xa9\x51\x21\x68\x72\x91\x85\x8e\xb4\x3b\xba\x06\x54\x4e\x6f\x7d\x5a\x15\x2d\x2a\x6d\xef\x1a\x8e\xd9\x5a\x06\x5a\x12\x75\x77\xb4\x87\xcc\x4c\xd2\x62\xf1\x0a\x21\x1d\x76\x8e\x19\xfd\x08\x7d\x43\x53\x33\xd2\x11\xeb\x7d\x31\x07\xfa\x3c\x29\x9e\x90\xe6\x36\x95\x72\x62\x5a\x03\x2e\x69\xc5\xf8\x0d\xe7\x64\x18\xcb\x81\x72\x60\x4b\xd4\xb2\x54\x88\x5f\xc6\x52\x1e\x82\x2e\x4d\x0c\x88\x96\x56\xa9\x92\x25\x8f\x23\xb4\x92\xd2\x95\x76\x84\xdb\xc0\x68\x66\xf4\xe0\xf9\x2a\x77\x9a\x7e\xfe\x38\xe2\x8c\x7a\x0e\x44\x5b\xc4\x3a\x69\x58\xcc\x6e\xe3\x12\x16\x93\x1f\xd6\x15\xb9\x26\x66\x08\xa6\x8b\x72\xaf\xb4\x20\x9e\xdb\xb6\xeb\x1f\x2a\x66\x65\x58\x3b\x2e\xa6\x21\x2d\x14\x9c\x03\x0f\xfb\x39\x7a\xfc\x0e\xd7\xdc\x7c\xf4\x52\x45\x01\xb0\xa7\xd4\x47\xfc\xa2\xd7\x5b\xf1\x62\xec\x7e\x19\x3b\xb8\xc5\x66\xe6\x2b\x6d\x1e\xb1\x54\x2f\xbf\xfa\x88\x1b\xf8\x0f\x6a\x0c\xb1\xdc\x90\xec\xa6\xb1\x38\x84\x22\xd1\xd7\x2e\xe5\x66\xc8\xd4\xe5\x51\xc4\x9d\x81\x9c\xe9\x29\xb3\xf8\x2d\xad\xa2\x39\x1c\x37\x84\x49\x87\x4f\xff\xae\x18\xa2\x08\x54\x63\x07\x82\x22\x26\xf7\xb9\xcb\x6d\x4b\x4d\x69\x7f\xa0\xda\xe8\x5a\x3c\x55\x64\x18\x54\xd7\xf0\x3f\x3e\x15\x88\xcd\x64\xf7\x4f\x4b\x8a\x5c\x7d\x55\x92\xfd\x70\x5c\x93\x85\x0a\xf1\x59\xde\x67\x8e\x54\x72\xb9\x94\xe4\x51\xfe\xf4\x3b\xb7\xbb\x9c\x54\x34\xc8\x9e\xe6\xc6\xb9\x76\x93\x48\xf7\x63\xc9\x67\x9d\x42\x57\x95\x48\x25\x23\x11\x2b\x13\xe1\xf8\x88\x34\x12\xb0\xa1\xc4\x58\xb3\xa4\xb1\x9c\xfb\x4c\xab\x7d\x32\x8d\x14\x8a\x07\x21\x2c\x9b\x17\x0e\xe5\x70\x8e\x28\xeb\x9e\xca\x96\xdd\x4a\x70\x87\xc2\x28\x73\xe2\x2c\xae\x75\x4b\x8c\x52\x2e\xbf\xff\x29\x65\x41\x7b\xcc\x54\x6e\xc9\x74\x99\x5f\xa4\x69\xc1\x97\x6f\x6c\x42\x0e\xa1\x6a\xe9\x2d\xd9\x3d\x8d\x35\x1d\x83\xd0\xee\x03\x7d\x12\x4f\x86\x61\xfd\xf7\x81\x49\x6d\xcf\x2e\xf7\x50\x4a\xf8\xf4\x0c\xe1\x8b\xb8\x7f\xcf\x36\xb0\xe6\x66\x0e\x1b\xc3\xcc\x56\xa5\x0e\xcf\x84\xc1\x83\xbf\x28\x2d\xfc\x6e\x66\xfc\x13\x39\x80\x81\xf0\x22\xa0\x3d\x4a\xc5\x44\x69\x72\x13\xdf\x4e\x01\x21\x4a\x6a\xfe\xde\xf8\xe2\x51\xa3\x9b\x6a\x0e\x3d\x65\xa5\xcf\x88\x6d\xbb\xec\xdf\xd8\x41\xaf\xb4\x22\x01\xe0\x29\x56\x7a\x4c\x44\x9b\x9c\x06\x1e\x4e\x25\x7d\x6d\x2b\xf7\xb0\x28\x8d\x01\x95\xb5\xc5\xa6\xc7\xbd\x0d\xc5\x8c\x0f\x61\xa0\x1f\xeb\xd9\x8c\xde\xed\xa1\x1d\x03\xe2\x92\x96\x74\x4f\xcc\x29\x0d\x70\xc1\xcc\x83\x64\x50\x59\x67\x79\x5c\x17\x99\xce\xdf\x2f\xa4\x0c\xe7\x9d\x8b\x30\xa4\x7f\x3b\x02\xe1\xba\x54\x03\x2d\x40\xa3\xaf\x69\x2a\xfa\x46\xdc\xc9\x05\x5f\x78\xf5\xb7\xa2\x3d\xe6\x90\x6b\x93\x5f\x85\xac\x1e\xc4\x2d\x14\x5a\x13\x56\xe4\xec\xa6\xc0\x2a\x61\x67\x4e\xc2\x5e\x80\x0e\x54\xf7\xb8\x96\x4b\x28\xb9\x7d\xcf\x40\x31\x31\x3f\x75\x97\x7c\xa9\x5e\x48\xce\x23\xc4\xd7\xcc\x2f\x81\x1d\xe1\xb1\xd1\xa5\xb4\x50\xdc\x14\x24\xd7\xeb\xf2\xb8\x85\xe1\xa2\xfc\xac\x4e\xad\xb9\x22\xe6\x4b\xe3\xd3\xaf\xc1\x36\x60\x88\x2c\x3c\x04\xa5\x50\x4d\x5b\x24\x66\x4c\x96\xe7\x2b\xe5\xd1\x4a\x2d\xc5\x62\xd1\x3b\xba\x96\xa6\x10\xb6\x86\xe1\x99\xc9\x64\x1a\x75\xd1\x3d\xdc\x1d\x4f\xdd\x6c\xca\x17\xa0\x1c\xb9\x6c\x4c\x7a\x36\xfc\xbd\xfd\xa0\xbf\x77\x85\x77\x3a\x3f\xa4\x7c\x4d\x43\x9c\xfd\x4e\x1e\xa6\x60\x6f\x9e\x63\x43\x31\xfe\x84\x58\xe8\x85\x0d\xdd\xe8\xe4\x9f\xf9\xd6\xa6\x61\xf7\xb5\x14\xe0\xcd\xeb\x83\xb7\xb1\xbc\xd0\xa5\xe6\x3d\x21\x00\xc8\xc2\xb8\xd9\x8d\xe0\x83\x2c\x22\x1b\xf1\xc4\xf8\xd0\x01\xaf\x93\x85\x5d\x78\xea\x11\x7a\x68\x42\xbb\x99\x95\x90\xa4\x78\xff\x20\xf8\x6c\x54\x50\x3b\xc7\x52\x6d\x9c\x53\x83\x1f\x7d\x62\xc8\xb6\x71\x79\xec\xc6\xa9\x03\x94\x52\xc4\x4e\x87\x86\x4e\x80\xa7\xd2\x2e\xc8\x81\xe0\x0b\x97\x89\xd8\xcd\x64\x00\x2e\x9d\xd9\xd0\x25\x0c\x8a\xeb\x88\x7b\x63\xcd\x87\xfe\x7e\x28\xa0\x0f\xfb\x71\x4f\x58\xca\x3b\x9f\xdc\xc2\x53\x49\xbe\x52\xf0\x31\x0f\xbc\x4f\x35\x23\x10\xf3\xb3\x58\x08\xa3\xa4\xf1\x7c\x9e\x03\xe0\x24\x2e\xbe\xbb\xdf\xc0\x63\xe7\x1b\xe4\x91\xe0\x0c\xdf\x2b\x5c\x74\xb6\x63\x89\xc2\x96\x79\x00\x8b\x47\x50\xd0\x63\x2c\xcc\xc2\x7d\x47\xa9\x57\x65\x0d\x0b\x16\x97\x70\xa2\x3b\x43\x13\xb3\x16\x41\x5b\x79\xaf\xd2\x2f\xe7\xa4\xaa\x84\x97\x11\x33\x5e\xb1\x70\x09\x4f\xd2\x1f\x71\x53\x68\xfd\xcf\x3c\x59\x3a\xd6\x76\xe4\xe0\xbf\xf2\x2f\x6e\xf8\xf2\x4b\xcf\xfe\x6d\x0f\x9e\xbd\x3e\x8a\x7f\xe0\x55\x19\xfa\xfc\xe1\x79\x5f\xfd\x2f\xff\xf1\x53\x1b\x7e\x52\xd3\xf3\x9e\x5b\xfe\xf9\xa4\x03\x91\x63\xd2\x42\xc5\xf9\xa5\x63\x23\xec\x8c\x69\x0c\x56\xf5\x2d\x34\xda\x25\x56\xd8\xf6\x7e\xef\x1c\xe2\x82\xd3\xcf\xe5\x4d\xfc\x8c\x91\xfb\x34\x16\xef\x76\x62\xf2\x9c\x05\x68\x3f\x22\x87\xfa\xd8\x00\xe0\x43\x89\x7d\x96\xe5\xba\xcb\xd4\xbb\xfb\xd9\x64\x56\x57\x1f\x82\x70\xa6\xa0\xcf\xd0\xbb\xc6\xd1\xe4\x10\xa2\x16\xf5\x31\x5d\x6a\x98\x9f\xec\x92\xeb\xce\x72\xb3\x5c\x1c\xf3\x87\x74\x68\x61\x11\xb3\xb0\x82\x9b\x02\xfc\x0b\x57\xc5\x7e\x24\xde\x00\x71\x15\x42\x9e\x8f\xf2\x78\x3a\xfe\xda\x71\xb2\x70\x5f\xbb\xa8\x32\x0f\xfe\x6e\x2e\xf7\x9b\xe8\x47\xff\xe3\xd3\x66\x56\xaf\xf8\xeb\x89\xab\x33\x69\xe5\x4b\x91\xc7\xcd\x41\x56\x2e\x90\x21\xbd\xad\x02\x51\xb5\x81\x1b\xcc\xd7\x3d\xf9\xba\x27\x45\xea\xc1\xa5\x7a\xf2\x77\x77\x7e\xd4\x93\x57\xf0\xf6\xff\xb2\x6f\x3a\x5b\x7c\xde\xb6\x2c\x51\x1a\xf9\xc3\x53\x79\x7c\x50\xa4\x14\x61\x3a\x3f\x60\xe6\x55\xcc\xfc\xf4\x41\x7b\x19\xcb\xce\x8e\xfe\x16\x8b\xe4\x55\xcb\xdb\xf0\xc7\x22\xd1\xd2\x2b\xf9\x7f\xff\x52\x91\x3b\x6a\xc3\x1d\xfe\xcc\xae\x08\xab\x14\xf1\x99\x39\xe5\x0f\x6d\x85\x67\xfb\x68\xf6\xd7\x66\x60\xec\x4e\x0b\xa6\xda\x7c\x45\x57\x6f\xcc\xd8\xc8\x27\xdf\xff\xc9\x5b\xb9\x4b\x4a\x9e\x7d\x7c\xfd\xe4\x0f\xfe\x51\x28\x27\x07\x27\x69\x64\x32\xf4\x49\x85\xfd\xe4\x25\x3e\xa5\x1b\x98\xd0\xc6\x2a\x65\x8a\x3f\x7e\xbd\xe9\x26\xf9\xfe\x97\xfd\x25\x9d\xf0\x2b\xdf\x3f\xbf\x11\xff\x22\x15\xc1\x33\x98\xf1\x83\xdb\xf5\x4f\x97\xe7\xf2\x99\xb0\x00\x5a\x07\xfc\xd5\xa4\xdf\xea\x97\xc7\xe3\x0b\x5e\xf9\xd4\xda\x3c\xf5\xab\xb5\x2f\xfb\xab\xff\x77\x40\x03\x71\x65\xe7\x82\xfe\xf8\xfa\x7a\xb5\x07\x20\x25\x9b\xa1\x84\x91\x62\x85\x2e\x54\xa4\x77\x33\x8d\x6b\xbf\xf4\xcf\x3f\xbe\xbd\x01\x87\x08\x6c\x29\x40\x19\xe6\x13\x4b\xd5\x3a\xc2\x11\xfe\x9f\xbd\x9c\x39\xd4\xe3\xc7\xd7\xcf\x81\x69\x0b\x33\xaa\xc8\x0a\x98\x39\x26\x02\x0d\xe9\x06\xd5\x50\xcd\x39\x24\x74\x83\x70\x1d\xa1\x22\x16\xc4\xa5\xaa\xdc\x9b\xaa\x43\x45\x65\x5f\x4e\x0a\xd2\x6c\xbd\xfe\x83\x39\x44\x68\xb1\xb6\xf6\xcf\x1f\xec\x35\x31\x63\x8e\x6c\x36\xad\x8f\x9e\x14\x77\x3d\x92\xc2\xe4\x89\xbb\x2a\x00\x3a\xd2\x99\x6a\x60\x70\xb1\x11\x5c\x35\x8e\x01\xb2\x75\xf0\xbb\x45\xc2\xd9\x9b\x30\x70\x8b\xdd\x92\x33\x60\x6d\xdd\x90\xf9\xf6\x87\x1f\xff\xe6\x85\xfe\x56\x52\xf7\x2c\xd5\x98\x09\x52\x75\xf6\xa1\x8e\x0b\x7b\x91\xb4\x46\x1b\x6e\x34\x3e\xf6\x57\x6c\x82\xb0\xd7\xbf\xe1\xc7\xd7\x47\xc5\xa2\x68\x85\x2c\x19\x5d\xfd\x86\xfe\x42\x6c\x23\x8b\x21\x8c\x5b\xed\x35\xd8\x95\x6f\xff\xc6\x03\x64\xe7\xdd\x6f\x71\xcf\xf7\x6c\xe1\x06\x9b\x01\xdc\x11\x87\xeb\x1d\x66\x41\xc6\xe6\x02\x6f\xbe\x06\xb9\x38\xd1\xdc\x64\x58\x15\x3b\x64\x7d\xa4\xd7\xe7\xf0\x77\x24\xba\x95\xb6\xed\x53\x4b\x3d\x86\x16\x8a\x1d\x97\xf0\xf3\x06\x99\x6f\x9f\xf0\xb6\x0f\x1f\xdf\xc7\x4f\x5f\x8f\x53\x59\xc6\x7a\xef\x4a\xab\xcd\x49\x69\xfb\x31\x0f\x54\xb5\xca\x6e\xdd\x5e\xc5\x6d\xaf\x79\x6d\xbc\xf4\xc4\x92\xeb\xc1\xfe\xe4\xdd\xff\x88\x60\x7a\x56\x79\x62\x8d\xb3\x6e\xab\x31\x6f\xfd\x92\x99\x17\x35\xb9\x50\x45\x70\xf4\x70\x8e\x81\xee\xc2\x92\xfc\x98\x5b\x06\x29\x76\xbd\x1f\x92\x50\x9e\xdf\x9b\xa2\x0d\x40\x0d\x16\xdc\xad\x29\xbd\x2d\x01\x42\xe2\x18\x4f\xac\x84\x42\xea\x39\xdf\xb8\x5a\xdb\xad\x84\xd0\x5e\xfe\x8d\x0d\x74\xb9\x5d\xcc\x4e\x9c\x22\x32\x91\x15\x4a\xc2\x02\x2a\x2a\x83\xce\xe8\x3d\x2b\x81\xdb\x67\xe6\xac\x57\x7b\xa5\xc3\x93\x2a\xe2\x9f\xa0\x34\xc6\x5a\x48\x5b\x25\x75\xd7\x50\xf3\x3d\xaf\xf9\x41\x48\x91\x4a\x80\xef\x5f\xfe\x5d\x11\xff\xee\x97\xdf\xa1\x3d\x0a\xfb\x9e\x08\x96\x54\xc5\x76\xda\x5b\xba\xa1\x0a\xa7\xd6\xc1\xd6\x8f\xad\x13\x76\xf3\x88\x22\x4e\x9e\xbf\x66\xee\xa4\x76\xa8\xbd\x5f\x79\xb8\x78\xe2\x33\x41\x56\x1c\x34\x93\xe9\xe1\x0c\x6a\x68\xf9\xfd\xf6\x05\x35\xb1\x7f\xd8\x4e\xe3\x32\x26\x39\xe4\x4d\xe3\x95\x2c\x5c\x3b\x73\x43\xde\x7f\x85\x3b\x97\xba\x86\x48\xe6\x61\x1f\x6b\x24\xf5\x2e\x16\xf9\x8c\xdc\x2d\x8f\x18\x06\xa2\xe0\x07\x33\x37\x70\x6b\xed\x68\xb8\x7c\x16\xfc\xef\x25\x28\x87\x31\xee\xaa\x1d\x6e\x7d\x44\x32\xe0\xea\xf9\xe3\x02\xa0\x45\x49\xa3\x0d\x45\x06\xb3\xd0\xbf\x4c\x29\x78\x32\xf8\x05\xfc\x67\xa5\x41\xd0\x1d\xe6\x80\xcd\x25\xe6\x41\x48\x26\xba\xfe\x8e\x3f\xe7\x8f\x47\x7c\xdf\x9f\xb8\x4f\xf3\x74\x18\x76\x03\x93\xe3\xaf\x28\x90\x70\xc4\xb4\x5e\x16\x56\x52\xd1\x6e\x72\x43\xf7\xdc\x1f\x98\xfd\xee\x18\x76\x74\xa5\x05\xd3\x45\xc2\x06\x32\xe5\xde\xe1\x0b\xeb\x76\x62\x4e\xc1\x13\x7c\xc8\x59\xf8\xe9\xc5\x5a\x99\xdf\xbd\xed\x4a\x0b\x3a\x48\x12\xf6\xc7\xbd\x02\xa4\xa5\x1d\x17\xb5\xaa\x0e\xc1\xfc\x82\xd9\xb1\x85\x30\xa4\xfb\x46\x05\x6b\xa2\x4d\xd4\x64\x9f\x37\x96\x6e\xdf\x3f\xfc\xbb\x7a\xb5\x81\x54\x7f\x58\x40\xc8\x95\x62\x5e\xaf\xf5\x0e\x44\x5e\xac\xdb\xab\x91\xee\xe3\xd3\xbf\x2b\xba\x53\xaa\x00\xe7\xac\x8c\xc7\x9a\x9b\xe2\xbe\x17\x00\x04\x6b\x35\x5e\x9b\xc2\xb1\x7c\x7f\x35\x46\xb9\x21\xe0\x3e\x9e\xd2\xb0\xf5\x7e\x61\xb9\x7f\x44\x34\xaa\x84\x93\x60\xc7\xc9\x73\x50\xc4\xec\xb3\x44\xca\xfa\xc7\x2a\xf8\xf8\xa2\x32\xcc\x9c\xb7\x80\xb8\xb3\xc7\x17\x64\x6c\xea\x98\x1c\xbf\xc5\xc8\xb2\x07\xf0\x27\x08\x2a\xbd\x80\x0b\x05\x53\x74\xca\x50\x20\x12\xf3\x4e\x30\xbb\x39\x66\xac\x02\x79\x96\x06\x9e\x08\x52\x48\x28\xb4\x79\xd2\x90\xb5\x95\xe9\x31\xf2\xb7\xed\x2b\x2f\xe0\x69\x6f\x81\x62\x72\xb8\x48\x2c\x32\xbe\x28\x37\xb4\x60\x66\xfd\x59\x34\x6f\x8a\x1d\x54\x3e\x95\xd8\xba\xb5\x51\x57\x44\x5b\x34\x66\xe3\x1d\x3f\x8b\x44\xb9\x94\x85\x16\xc2\x0a\xd7\xd2\x51\x73\xce\xe7\xac\x6b\x55\xda\x70\xf4\x90\x14\xb1\x96\xfd\xbf\x1a\x1d\x4f\xf8\xa2\xae\xb2\x05\xc8\x04\x9c\x9b\xeb\x8a\x15\xff\xcb\xdf\xbc\xba\x30\xf0\x55\xa9\x6e\x87\x9c\x94\x89\x83\xda\x2c\xc6\x87\x3e\xc9\x65\x52\xe5\x18\x53\x15\xc0\x2c\x98\xa9\x55\x23\x80\xa7\x3a\x14\x38\xd8\x19\x40\x1c\xeb\xf0\x3d\x22\xb0\x54\xb3\xf9\xd3\x20\xf4\x58\x5a\x47\x94\xc0\x27\x76\x3c\xec\x5d\x7b\xfa\xf7\x11\xe8\x19\x95\x73\x74\xfc\xf6\xef\x0a\x21\x2c\xa0\x8b\xc4\x7b\x75\x9e\x09\x1a\x1e\x52\x44\xc4\x1c\xc5\x93\x94\xa5\x57\xc9\x99\x1d\xf9\xc3\x37\x8e\x79\x4a\xbc\x2f\xd3\xfb\x14\x9f\x75\x08\x14\x09\xbb\x74\x82\x48\xb7\x95\x4d\x5f\x8e\x2a\x45\xad\x1e\x05\x7d\xec\xd2\x1b\xf2\x5f\x15\x01\xd3\x32\x38\x40\x86\x4c\xb8\x13\x93\xd1\x11\xc9\x8c\x2e\x5f\x5c\x25\x0c\xf8\x82\x5c\x84\xf5\x89\x58\x33\x5b\xec\x4d\x94\xd9\x0a\x5f\x80\xdd\x78\x78\xc6\x44\x67\xd3\x05\x09\xf9\xff\xd7\xd9\x6b\xde\x0f\x4b\x12\xad\x29\xd9\xb2\xf5\x5e\x76\x2a\x49\xab\x0a\x30\x0a\xf3\x4d\x2b\x04\x3e\x43\xa4\x85\x08\x25\x2e\xf3\xa6\x27\x15\xfb\x81\x05\xae\x98\x15\x4c\x84\x70\x2d\xa5\x5e\x88\xdc\x1f\xed\xeb\x17\xf7\x38\xd4\x03\xd1\x9b\x0b\x50\xf5\xaf\xe6\x22\x77\x47\x59\xf7\xeb\x4d\x1c\xb9\x12\xb1\xa3\x51\x31\xbb\x4e\x2b\xbd\x86\x25\xf4\xbe\x84\xa6\x40\x94\x9f\x18\xf2\x3e\xb0\x8b\x97\xc5\x0f\xb8\x96\x4c\x53\xbe\x09\xda\x65\x8a\xb4\x66\x9b\x12\x7b\x78\xfd\x0d\xce\xb1\x45\xf4\x66\x47\x34\x13\x2b\x96\x99\x7a\xf4\x22\x14\xf6\x48\xcb\x07\x24\xbc\x2a\xac\x91\xb9\x8c\x39\x5d\x82\x1d\xc8\xea\xd5\x0e\x4b\xdd\xe0\x0d\x78\xb8\x12\xc2\xd5\xa9\x70\x72\xe9\x1e\x46\xd7\x22\x0e\x83\x59\xec\x9a\xb0\x71\x57\xff\x8b\xa0\x52\xbb\xdc\x66\x34\xbb\xf8\xb5\x96\x86\x16\x4f\x08\x94\xf4\xf2\xdc\x0b\xe2\x6e\xc1\x09\x72\x9a\xee\x91\xab\x51\x75\x11\x48\x74\x2e\x50\x17\xc7\xe2\x09\x37\xb9\x04\xe6\x28\x7a\x22\x9a\xfd\x7a\x59\x3f\xaa\x00\x63\x1c\x99\x2f\xb6\xf0\x68\x64\x8f\x66\x8c\xa7\x86\x40\xaf\xe7\xf3\xaf\xb3\xa6\x57\x00\xec\xe9\x1e\xc8\xa7\x6a\x87\x0e\x0a\xca\x54\x32\xa6\xb7\x6b\xc1\x66\x9b\x0b\xd0\x15\x5d\x5e\xd4\xe3\xe2\xea\x44\xb0\x2e\x73\xf9\x4b\x0a\xcd\x93\x8b\xaa\x64\xd8\x5a\x9c\x94\xbc\xf3\xd4\x24\xde\x6f\x0c\x4f\x02\x47\xed\xa0\x13\xeb\x8d\xe2\x16\x32\xba\x2d\x74\x36\xa3\xa4\x7f\x2f\xfc\x19\x77\x8e\x67\x82\x28\x3a\xc0\xd0\xa1\x02\xdd\xc6\x60\x07\xa5\xbe\xdd\x20\xfa\x7d\xe4\x7e\xf2\xff\x2a\xf8\xa9\x3f\x9f\xc7\xea\xd5\x99\xcd\x2a\x5d\xf7\x82\x18\x48\x0b\x9b\xc7\x52\xfc\xe3\x87\xe9\xb6\x5d\x49\x5f\x13\x01\x75\x63\xc6\x50\xfa\x1a\xec\x46\xe9\xa9\xd9\xbd\xb4\x2c\x0f\xb3\x3f\x1d\xa6\x0c\xbd\xc7\x10\x7b\x40\x14\x51\xbb\xba\xc4\xc9\x7d\x41\x3c\x7a\xd4\x99\x87\x12\x9e\x35\xcd\x88\x29\x33\x3a\xa9\xe1\x89\x75\xb0\x07\x03\x74\x0f\x44\x05\x6e\xb2\xbb\x89\x75\x45\xec\x25\xd3\xe7\xa5\x5b\xdd\x71\xfa\x29\x76\x4c\xba\x74\x93\x72\xad\x16\xb5\x11\x16\xd4\x94\xfe\xba\xd1\x4e\x35\x11\x63\xee\x87\x69\xb5\xee\xd4\xc5\x1b\xd1\x91\x5b\x41\x0c\x12\x1e\xcc\xae\x59\x3f\xaa\x15\xbd\x20\x87\x49\xf0\x38\xd0\x54\xe4\xfb\x89\xda\x27\xaf\x89\x35\x99\xbc\x74\x61\x1d\x25\x05\x44\x14\xb1\x81\x1a\x09\xcd\x3d\xae\xea\x70\x58\xdc\x26\x63\x47\x4b\xc1\xd5\x53\xd4\x61\xc9\xcc\x79\x9b\xc9\x0a\x34\xf4\xe6\xc3\x40\x4f\xd8\x06\xb1\xc7\x41\x9e\x17\x65\x9f\x70\xbc\x73\x69\x58\x3f\x87\x6b\x69\x8c\x84\xa0\xe6\x56\x2a\x58\xdd\xe6\x4a\x9f\x16\x37\xe2\x34\xa8\xa7\xc5\x34\x5e\x8b\xa5\x99\xa2\x9f\x2c\xc2\xf7\x4d\xd6\xa0\x3f\x2e\x05\x76\x70\x8b\xf5\x8b\xb4\xe0\xba\x0f\x04\x22\x1e\x7e\xfd\xbb\xa2\xb1\x53\x1d\xd6\xac\x27\x0d\xe8\x29\x2c\x82\x00\x2c\x7b\x57\x0b\x62\x1d\x65\x38\x01\x45\x20\x45\x80\xb7\xc9\xe1\x08\xdb\x92\xf7\x6c\x16\x37\xcf\x29\xca\x20\x65\x0b\x0e\x59\xbc\x5c\xa4\x52\x3c\x25\xbb\xd2\x76\xba\x72\x3c\x13\x18\x98\x77\x57\x05\x74\xb7\x1c\xce\xc2\xa0\xbd\xb7\xcd\x2e\xd5\x32\xd3\x66\xb0\xbc\xf8\xaa\x4a\x2e\xae\xfd\x80\xc4\xb0\xe1\x2c\xf7\xdc\xda\x38\x5c\x89\xf8\xc3\x27\x40\x49\x78\xb0\x34\x31\x1b\xe2\x29\x7b\xbc\x93\x83\xf5\xd8\x28\xe1\x65\x79\x61\x86\xbd\xe3\x53\x47\xa4\xf1\x9e\x6d\xe1\x2b\x52\xe9\x5a\x74\x38\x28\x0b\xd5\xad\x63\x7d\x2a\x04\xec\x0c\x02\x47\x17\x66\x66\xc0\x00\x5a\x87\xfb\x91\x85\x72\x18\x77\xfb\x2b\x4a\x95\x90\x73\x2c\xf4\xf9\xee\x33\xf7\x20\x67\xf5\x92\xf4\x41\x4c\xce\x9b\xc3\x2f\xfb\xcd\x4c\x95\x93\x57\x28\xb3\x00\x47\x92\xa8\x74\xf9\x44\x27\x47\xb8\x52\x31\xed\xee\xf3\x32\x63\xb8\x32\x98\x76\x0c\xe1\x40\xe1\xf1\x18\x46\xc9\x13\x74\x90\x42\x53\x0f\x8f\xd1\x77\x81\x47\x49\x1d\x4a\x2e\x31\x40\x7c\xf6\x81\xfd\x97\x08\xdf\x36\xa0\x20\xa0\x41\xe9\x94\x45\x7c\xf1\xa2\x7b\x79\xdd\xb6\x9f\xb2\x14\x5e\xda\x52\x60\x63\xdb\x61\xf2\xca\x9c\x7f\xbc\x2e\x44\x30\x6c\x05\xb4\x6a\xfe\x83\xad\x02\x2e\xa1\x77\x48\x34\xd5\xe5\xc8\xb3\xec\x62\x21\xc8\x86\xbf\x2f\x1b\xc1\x1c\xd0\x69\x07\x8e\x10\xbd\x66\xaf\x77\x59\x77\x6e\x3e\x99\x19\x9e\x61\xa6\x55\x35\x93\x31\x64\xf2\x30\x30\x28\x19\x93\x5a\x83\xa0\x1e\xa0\x7b\x5c\x19\xf2\x54\x09\x1d\x0f\xc0\x15\x42\xae\xa5\xf4\xc4\x83\xed\x82\xd5\xe6\x50\xe0\xbd\xe8\xcf\x64\x5a\xc3\xac\x20\xdb\x96\x4c\xe0\x3c\xfb\x53\xd6\x02\xf8\x3c\xb4\x65\xaf\x65\x21\x99\xb2\x5f\xc6\x1d\x26\x29\x9b\xee\x1e\x0a\x78\x55\x96\x61\xb9\x34\xac\x3d\x02\x16\x51\x01\x6d\x3e\x35\x40\x42\x3c\x04\x03\x48\xd3\x29\xb2\xe3\x15\xe2\x2e\xf2\x09\x27\x5d\x60\x45\xfb\x84\xba\x82\x43\xa5\x10\x5a\x0d\x81\x87\x73\x96\x4e\x9a\x97\x0c\xac\x83\xc5\xa3\xbe\xc9\xfe\xc7\xe6\x9b\xb3\x74\x6e\x47\x92\xde\x94\x6d\x20\x53\x14\x0f\x7c\xd9\x03\x74\x1e\x11\x65\x69\xb7\x0c\x25\x6b\xb6\x1b\x7e\x2b\xc3\x42\x0f\x2c\xf7\x8e\x92\x57\x68\x59\xcc\x09\xe0\xfb\x09\x56\x79\x60\xae\x1f\x19\xc2\xbc\xa0\x47\xff\xb6\xa4\x52\xf5\x7f\x21\x24\x9c\xba\xa5\x40\x6a\xe6\x85\x0b\xee\xbd\x04\x0c\x6d\x28\xdd\x8e\xf2\xb3\x1f\x9f\x5f\xfe\x0d\xe9\x9c\x4e\xfb\x5f\xb5\x19\x4b\xfe\xa0\xe5\xe8\xf7\xa5\x40\xb1\xd1\xf2\x05\x99\xb9\x1f\x9f\x97\xee\xc7\x73\x7f\x4f\xa1\xa6\xcc\xd7\xdf\x98\x48\x66\xef\x26\x91\x0d\xbe\xe2\x66\x6e\x19\x1a\x00\xd9\x59\xbd\xfa\x12\x8a\xb8\xe2\x73\xfb\x87\x5d\x3c\x5f\x7a\x89\x57\x21\x6d\x7d\x83\x80\x8f\xfa\x78\xf5\x8d\xad\xee\xd3\x95\x1e\xc3\x85\x2d\xb1\x53\x27\x4c\xee\x69\x27\xac\xcb\xeb\x83\x35\xa3\xbd\x9c\x86\x52\xa0\x2f\x28\x24\xf4\xae\x03\xf6\x90\xc6\xd1\x96\x1d\x0b\x02\x64\x33\x43\xef\x41\xb8\xf9\xfb\xc8\x02\xed\x39\x2e\x82\x1c\x78\x4f\x57\x89\xfe\xfb\x58\x58\x1d\xd6\x15\x79\xa5\xa6\x64\xdf\x46\x8b\x2b\xa1\xf2\x4a\x5b\x07\x0f\x91\x5a\x2b\x04\x18\x87\xde\xa6\x33\xeb\x91\xa9\x84\x9d\x4b\xc7\xf8\xbc\x62\x24\x53\xda\xab\x4d\x66\xfd\xe3\x04\x9c\x29\x66\xeb\x51\x0a\xcd\xb2\x16\xd9\x7c\xa1\x9d\x39\xd6\x2f\x24\x6b\x23\x81\xed\xef\x5f\xc7\x0f\x24\x94\x04\xea\xc1\x96\x25\x35\xec\xd8\x05\x44\xc7\x7a\xe2\x0e\xef\x04\xc0\x0b\xfa\x56\xba\x69\x70\xfe\x14\xbb\xc6\x9b\xa2\x08\x28\xcc\xd3\xae\xca\x36\x9a\x66\x2a\x28\x7a\x0b\x83\x82\xaf\x97\xd9\x33\x05\x8c\xbb\x23\x1e\x29\x4d\x93\x6e\xfc\x66\xfb\x40\xa4\x8e\xfb\x7c\xfe\x8c\x99\xd4\xc7\x5f\x9e\xb5\x42\x1a\x88\x18\x2b\xc7\x51\x9d\x86\xac\x16\x2d\xef\xb0\xc0\x0e\xd9\xdf\xed\x38\x78\xf0\x0a\xfe\xa3\x1e\xa0\x5a\x2c\xde\xe1\x29\x14\xfd\x0b\x62\x0f\x7b\x2d\xa5\x27\xbb\x69\x52\xb2\x2a\x2b\x59\xd5\x2c\xca\xf9\xc4\xbb\xda\x65\x92\x97\x3e\x4a\xc7\x9a\xf2\x1e\x43\x40\xf0\x62\x6a\x5f\x88\x0a\xd7\xc7\x5c\x1c\xf3\xca\xbc\x29\xa4\x52\x45\x11\x6f\xe9\x96\xac\x62\x3f\x85\x44\xc1\x71\x6e\x15\xaa\xbf\x6a\xa4\x35\x0d\x4d\xd4\x67\x2c\x46\xc0\x85\xa1\xa7\xf3\xe8\x19\x13\x75\x2b\x98\x63\xca\x48\xea\xb2\x2f\x6a\x36\x50\xd2\x25\xa3\x39\x95\x65\xa7\x9b\xaa\x75\x38\x5c\x7e\x87\x17\x2f\x96\x2b\xc3\xb7\xa9\x7c\x7f\x43\x3e\x8d\xa5\x71\x46\x93\x66\x1b\x6d\x69\x89\x51\x31\xa1\xe9\x91\x6e\x06\x59\x8d\x9e\xaa\x69\xbd\xe6\x2c\x03\x1e\xdc\xb5\x64\x5b\xeb\xf4\xa4\xb5\xf3\x83\x95\x8a\x33\x40\xdc\x89\x79\x41\x2c\x76\x7b\x3f\x0c\x53\x48\x4d\x66\xc2\xa5\x15\x5d\xc5\xbe\x8e\x0d\x85\x44\x08\x90\x8b\x43\xcb\xe8\x8a\xd8\x71\xbf\x28\x80\xf3\x15\x01\x42\x2d\x35\x0f\x6a\x7e\x73\x72\x96\x91\x91\xfb\xb6\xb7\xc8\x0a\xbe\xbf\xbf\x1a\xa7\xd7\x59\x4d\x78\xe6\x51\x13\x23\xe5\x8a\xb5\x34\xa7\x9a\xad\xe9\x05\x7e\x32\x6d\x31\x6a\xd3\xc0\xd5\x82\xb8\x41\x81\x74\xbc\x37\x05\x34\xee\x72\x8d\xf4\x4a\xf2\x92\x4b\x82\xda\xb0\xcd\x56\xb6\xc3\x8e\xcd\x1d\x77\xb9\xf5\x0a\xfb\x87\x53\xa1\xd0\x0a\x0d\xff\x1a\x75\x0b\xe6\xa5\xc6\xd0\x14\xaa\x17\x77\x73\x85\x2b\xbe\x7a\x57\xda\x7f\x78\x7d\x08\xad\x09\x4f\x5c\xbd\x57\xd2\xe5\x08\x85\x7f\xe6\x77\xa5\xbf\xc2\x3b\x4c\x15\x9d\x1a\xf7\x72\x70\x4e\x08\xee\x9f\xe7\x17\xce\xdf\x4c\x57\x9b\x80\x8c\x99\x8a\x13\x6c\x21\x65\x81\xc9\x5e\x4d\x3f\x21\x42\xb9\xfd\xd5\x38\x92\x52\xee\x6b\xf2\x30\xf3\x85\x09\xe0\x26\x75\x4b\xde\x67\x7a\x01\xf1\x8a\x3f\x2b\xa9\xa3\xee\x95\xec\x6c\xf3\xde\xf5\x72\xbc\x3d\xd4\x82\xbd\x9c\x76\xb5\x2e\x0f\x2c\x81\x0c\x16\xe7\xa4\x19\x66\x7b\xb7\x43\xc5\x93\xe8\x9d\x35\x2c\x93\xe4\x41\x11\xf1\x95\xfc\x20\xb7\x54\x17\xae\x8f\x91\x78\x07\x33\x66\x9f\x90\xb9\x99\x39\xf0\x93\x19\xd2\x27\xfb\x40\xd9\xc3\x4c\xae\x1a\x78\xd1\x9e\xf4\xe3\xf5\x9b\x1a\x61\x53\x98\xe7\x71\xfc\x03\xf0\xe5\x5b\x93\x0b\x8f\x93\xe7\x82\x3b\x1c\x6c\x4f\x89\x88\xb3\x6b\x6f\x21\xce\x26\x8b\x8e\xf7\xb4\x47\x3f\x87\xd3\x7e\xb9\xf8\x9d\x7f\x7f\x1c\x18\x80\x36\x25\x62\xf3\x46\x14\x38\x14\x28\x37\x75\x92\xfe\x8d\xaa\x28\xf2\x50\xda\xfe\xb3\xa1\x19\x3b\x5d\x87\x9a\x7b\x9d\x88\x74\x6f\xbc\x95\x44\x59\xb7\x41\x71\x42\xe9\xe3\x01\x3a\xe1\xc0\xd3\xbc\xc8\x99\x43\xd6\x07\x3c\x44\x08\x87\x5e\x9d\xce\xab\x85\x95\x38\xdc\xab\x30\x86\xa5\x2c\x6d\x87\xb6\xe8\x1c\xd1\x45\x8c\x21\x7a\x30\x56\x09\xc5\xec\x1f\xf0\x42\xfa\x3a\x7d\x0f\xfd\x50\x25\x5f\x1f\x19\x4b\xec\x35\x66\x26\xb1\x7b\x6a\x39\xbb\x46\x75\x86\x21\x27\x46\xb2\xaf\x42\xc9\xd3\x79\x73\x3c\x37\x4b\xa4\x56\x70\xbe\x6a\xfb\x58\xdf\x89\x30\x17\xbe\x12\x3b\x66\x74\x05\x72\x47\x6b\xdf\x27\x19\x12\x6f\x3d\x13\xfe\xdd\xd3\x2e\xca\xf4\x1f\x7e\x7f\xd4\x92\xce\x2c\xa9\xc0\x13\xa8\x94\xbf\x6a\xe5\x82\xb4\xad\x68\x02\xf5\x07\x8e\x00\x56\x01\x73\xd8\x45\x9e\x40\xa2\x30\x44\xcc\x0e\xd0\x62\x4e\x68\x63\x11\x1a\xf0\x33\x04\x45\xe1\xc1\x9e\x32\x3b\xbf\x44\xf2\x1c\xde\x90\xd0\x0c\x43\x4d\xab\x88\x32\x1d\x8e\x4b\x74\x4e\x9f\x85\xa4\x19\xbb\x7b\x7f\x44\x0b\xfa\x77\xe5\x2a\xaf\x94\xb7\x98\xd7\x3d\xfc\xfe\xfe\x60\x23\x2f\xd4\x39\xb7\x9c\x4f\xfe\x5f\x45\xa7\xb2\x62\x9e\x1e\x2a\x3a\x31\x09\xdf\x98\xd2\x5c\xa8\x66\xfe\xd7\xff\x72\x45\x3d\x3d\xce\x74\x9e\x2d\x40\x4f\x6b\x2f\x55\x6b\xce\x2f\x33\x74\x57\xdb\x30\x3a\xb0\x2c\x7c\xb1\x43\xd6\x9b\x47\xd4\xa6\x1c\xd8\xc2\xe3\xbd\xbc\x5b\xa0\xab\x33\x09\x0c\x89\xb7\x1d\x42\x6d\x4b\xe3\xeb\x1f\x27\x66\x90\x18\x33\xd7\xc4\x4d\x8d\xe1\xd1\xa3\x45\x79\x89\xad\x4a\x33\x5d\xbe\xe6\x81\xba\x23\x8e\x34\x06\x9f\x6f\xfe\xed\x4f\x95\x43\xb7\x14\x8a\x23\x81\x4a\x59\x1d\x74\xac\x05\xf1\xce\x93\x99\x78\xdc\x66\x1b\xd7\xcb\x99\xfd\x0c\x7b\xdb\x0e\x6a\xdb\x2e\xfe\xf5\xe8\x5d\x18\xe8\xb2\xef\x05\x2b\x3e\x7b\x89\x1f\xde\xb0\x49\xc9\x91\xa7\x44\xad\x26\x75\x7a\x32\xf9\xb2\xa6\x7b\xb1\xf2\x05\x26\x66\x96\x4f\x1d\x84\xce\xbd\xb2\xaa\x15\x3c\xda\x5a\xab\x6c\x66\xae\x2f\xcd\x8b\xa7\xa1\xde\x0f\x2c\xdb\x99\x0b\x44\x6d\x77\x1a\xe4\x58\x9a\x1d\x07\x3b\x88\x19\x99\x61\xc9\x81\x25\xa4\x15\xc0\xcd\xc6\x42\xf7\x01\x49\xc9\x7a\x79\x6b\xdf\x17\x4a\xf0\x52\xe8\x98\x6e\xb1\x2d\x4e\x64\xb8\x11\x81\x82\x6c\x96\x52\xeb\x70\xa9\x27\x6f\x65\x61\x5d\x38\x33\xb9\xea\xc1\x26\x37\x5d\x05\x09\x27\x5d\x51\xca\xa8\x5e\x82\x10\xb6\x33\x23\xb3\x81\x08\xe5\xb6\x30\x27\x22\x73\x4a\x71\x34\x91\xe1\x03\xef\x06\x60\x0e\xe6\x29\x44\x96\xf2\x21\xc7\x2f\xff\xc6\x95\xa6\xa9\xa8\xb9\x6d\x61\x9a\x01\x80\x57\x62\x03\x4a\xb1\xdf\xdc\xe3\x89\xf2\xe3\x5c\x19\x2c\x66\x38\x31\x0d\xd6\xd0\xae\xa0\x65\xfb\xd4\x68\x3a\xa2\x58\x50\x14\x9e\x09\x48\x50\x4e\xe5\x45\xe9\xd7\xc6\x17\xa3\xdb\xc4\x6e\x46\x74\x47\x33\x89\x38\xc9\x69\xbb\x04\x73\x3c\x55\x7b\x54\x66\xe5\xe3\x20\x96\x0a\x19\x52\xef\xbd\xa0\x6b\x9e\xe2\x22\xd2\x17\xfb\x84\x85\x0c\x53\x76\x8a\xe9\x4c\x0e\x51\x47\xb7\xc0\xbb\x70\xa5\xde\xaf\x87\x17\x2f\xb9\xce\x42\x25\x79\x75\x8c\xa1\x42\x20\xee\x61\xf5\x5a\x92\xf8\x0b\xc1\x30\x51\x11\x3c\xb4\x21\x7e\xd8\x56\xbb\x42\xa0\x6e\xe0\x18\xd0\xf4\xef\xac\xfa\x28\x1d\x0c\x33\xb5\x13\x8b\xe0\x38\x63\x55\xd0\x4c\xe9\xfb\x36\x3c\xc3\xbf\x83\xe8\x1c\xd8\xd8\x89\xcf\x9c\x4b\xe7\xa9\xbb\x16\xf8\xa0\xd5\x62\x74\x14\x27\x91\x30\xaa\x4a\x23\x09\xd2\xc1\x63\xe1\x65\xf4\x9e\x92\x9d\x9e\xdc\x22\xad\xb7\xda\x7e\x51\x49\x06\xc7\x07\x55\x85\x7f\x12\xde\xf4\x65\x08\x3d\x4b\x9e\x03\x81\x29\xad\xf3\xc4\x25\x5d\x70\x55\x7c\x0e\x9e\x51\xd6\x31\x5f\x6d\xb8\xe3\xf8\xea\x1c\xbc\xd9\xa7\xf5\x99\xd8\xcd\x3d\xaa\x81\xfa\x69\xbe\x9a\x1a\x4c\x41\x2c\x40\x28\x69\x3a\xa9\x88\xf1\xd7\x06\x33\x90\x86\xc6\x61\x93\xb1\x68\x92\x0a\xde\xb1\xea\xfa\x8e\xf8\x47\x66\xdb\x24\x63\x0d\x84\x25\x26\xea\x5d\x17\x6e\x99\xa4\x94\xc0\xb5\x62\xcb\xea\x6e\xc5\xe3\x59\x4a\x9b\x66\xd2\x6a\xee\x9a\xa9\x18\xb3\x9e\xb0\x95\x5e\xf0\x90\xf3\x48\x64\x65\x5d\xbf\x38\x08\xfa\x30\xfc\xd2\xe8\x74\xa6\xba\x79\x3a\x95\xf2\xea\x72\x69\xc7\xf0\x42\x1b\x3d\xd2\x91\x6d\x8f\x6b\xb3\xc3\x52\xe7\x69\x78\x40\x53\x6f\xdb\x1f\xa8\xd2\xe2\x7e\x41\xc5\x6d\x9f\xb0\x3f\x83\x77\x3a\x23\xf8\xdb\x59\x8b\x3c\x9b\xe2\x0d\x37\x74\x43\x10\x43\x08\x20\x58\x89\x2f\x28\x15\xeb\xab\x95\x72\x2e\x34\x52\x76\x77\xe6\x23\x40\xb1\xbf\x00\x03\xc3\xe5\xdc\x77\x94\xf0\xc1\xd9\x9c\xa8\xe4\xed\x74\xec\x2b\xd2\xae\x7b\x52\x02\xad\x7b\x8c\x13\x6b\x2e\x8d\x09\x3b\xe9\x01\x72\x18\x14\x28\xb6\xeb\xc8\x56\xef\x81\xd8\x17\x71\x28\x22\x1f\x92\x59\x71\x33\x87\x5e\x90\xf5\xe6\xd5\x52\xd9\xc6\xf8\x54\x2d\xb9\x2f\xe8\x0f\x65\xce\xc0\x14\xc3\xdb\x7e\x64\x6f\xef\x61\xf6\xaf\x30\x54\xac\xf1\xae\xd0\x2a\xde\x95\x78\x4d\xcd\xff\x53\x79\x8a\x51\x4e\xf4\xcb\x5a\xa9\x42\xb3\xc4\xed\x79\xa1\x6b\x67\xd7\xc4\xec\xf5\x69\x49\xac\xcd\x65\x53\xaf\xc8\x49\x51\xe6\xb9\x10\x13\x58\x1a\x2b\xb7\x4a\x71\x69\xd5\x56\x1f\x0f\x1f\xf8\xc4\x3a\x0b\xe6\x78\x21\xa0\x00\xf9\xb0\x26\xef\xa4\x70\x39\x7c\xf9\x37\xa4\xec\xc7\xa5\xec\x99\xd8\x76\x0a\xef\x44\x10\xdd\x4d\x16\x31\xbc\x7a\xa8\xbd\x79\x45\x2d\xd9\x0d\x78\xc0\xb0\xf6\x79\x48\xac\x49\x89\x85\xcc\x03\x47\x95\x65\x2c\xe2\x60\xdd\xca\x3e\x18\xf6\xcd\x7c\x4c\x2e\xb8\xf9\xc4\xf6\xaf\x62\x7d\x57\x3c\xaf\x8d\x08\x8b\xec\x8f\xae\x82\xf3\xd9\x72\x85\x49\xbd\x09\x02\xdd\x7a\xf4\xa5\xa6\x3e\x57\xb4\xa4\x1a\xb3\x55\xe4\xa2\xcc\x11\x70\x85\xeb\x1a\x3b\x38\x86\xe8\x1e\x39\x68\x2b\x0e\x54\x3f\x2c\xc5\xad\xff\x76\x47\x97\xe1\x73\x3c\x6b\x04\xd9\xcd\xa5\xcf\x23\xbf\x0a\xdc\xa1\x50\x0d\x5a\x34\xa7\xd2\x8b\xc7\x1e\x0c\x42\x3d\x0f\xb3\x05\x82\x40\x03\x0a\x42\x88\x38\x51\x43\x16\x41\x27\xc1\x29\xba\x47\x2f\x91\xe0\x8a\xb7\xc7\xa0\xe2\xdf\xc3\x7c\x3d\x1a\xf2\x7d\x6a\x97\x82\xaa\x97\x52\x98\x4a\x8a\xf5\xea\xce\x52\x47\xb0\x8e\xa0\x28\x1e\x14\xbc\x43\xf5\x8a\x9f\x07\xbd\x2f\x28\x4d\x3b\x37\x48\x69\x72\x6c\xb9\xa8\x00\x5a\xe3\xc4\xc5\xbd\x8b\x99\x50\x06\x5b\x2e\xa0\xf3\x2d\x14\x20\xed\xaf\x53\x20\x64\x22\x86\x65\xa7\xbc\xf9\x67\x60\x27\xb2\x39\x64\x33\x1b\x06\x5f\x94\x77\x8e\x29\x20\x89\xcd\x69\xd0\x51\x02\x51\x9e\x1f\x4f\xb3\x2d\x1b\xfd\x78\xdb\xb0\xbd\xf5\x0b\x45\x03\x16\xf2\x48\xf9\x44\xef\xc2\xf3\x62\x10\xfa\x3c\xc6\x91\xb0\xe6\x97\x32\x36\x57\x9e\x27\xd1\xf4\xa8\xb7\x08\x55\x7f\x95\x11\x7f\x98\x48\x2c\x90\xa6\xd5\xf7\x51\xed\x0d\x8f\x33\x99\x74\x2c\x50\xa4\x73\xb1\x95\xca\xa7\x17\xec\x0a\x4d\xcb\x98\x5a\xf6\xdc\x2d\x69\x66\x27\x8d\x93\x3a\x9c\x64\x71\xd8\xbc\x8b\x0c\xa9\xf8\x6a\xba\x3e\x6e\x1b\x55\x47\x67\xae\x0e\x5a\x07\xf6\x75\x0a\x57\x42\x82\x26\x69\x7a\x1a\x4c\x82\xf1\x86\x15\x8e\xb5\xb7\xf1\xaa\xc9\x71\x2f\xbd\xbd\xde\x8b\x19\x55\x21\x9e\x3a\x29\xe2\x31\xad\x27\xfa\x1d\x69\x38\x4d\x68\x0b\x47\xcf\x1f\x5e\x71\x33\xeb\x4b\xc3\x91\x3a\xd1\x29\x23\x3b\xd9\xa3\xcb\xff\x29\x5a\xc4\xad\xd4\xef\x2f\xe6\x47\x9f\x50\xf5\x0f\xcc\x2c\xb9\x14\x0f\x19\x49\xb1\x60\xb1\xcf\x27\x9b\x2e\x3d\x48\xe4\x23\xe7\xb4\xf5\x17\x02\xf7\xe5\x8a\xab\x44\xd0\x60\x94\x82\x34\xdb\x69\x61\x24\x81\x8e\x19\x3c\xb0\xe0\x80\x47\x33\x75\x4c\xf3\x99\x20\xaf\xc4\x45\xc6\xf8\xc8\x6a\xed\xca\x74\xe0\xec\x66\xd0\x8c\x04\x3d\x54\x32\x12\xce\x9b\x13\xd4\x79\x45\xb8\x0e\x04\xd4\x8f\x25\x91\x13\x4e\xa6\xa2\x34\x95\x39\xf4\x54\x8a\x60\x49\x54\xc0\x50\x30\xf9\x1e\xda\x45\x35\xc5\x38\x5f\x10\xa0\x8e\x05\x4c\x42\x36\x38\x51\x40\xa5\x55\xc0\xf4\xd2\xb6\xed\x92\x37\xf3\x68\xc5\x33\x92\x04\x05\x8f\xd6\x67\x13\x6f\xca\xd8\x2a\xe2\x44\x70\x2d\xd4\x99\xde\x27\xf9\xcd\x4b\x06\xe3\xe6\x00\xdf\x8a\xfe\x32\xb9\x48\x7c\x79\xa0\xfd\x66\x6a\xc3\x97\xcd\x43\x2b\x05\xd3\xf1\x53\xc1\x17\xba\x3b\x87\xf4\xab\x59\x51\xd6\x10\x00\x07\x87\x12\x73\x9a\xcf\x20\x94\x2d\x03\xe1\x93\x89\xa6\x1a\x79\x4e\xe6\x3c\xc3\xe1\xb3\x53\xbd\xd0\x34\xac\xa5\xf3\x69\x35\x9d\x05\xab\x89\x12\x17\x83\x5f\x54\x69\x69\x40\xba\xa4\x94\x9a\x7f\x57\xa5\xed\xc4\x57\xee\x51\xfa\x76\xed\x7c\xc2\xc8\x8a\x03\x00\xd4\xc8\x8c\x75\xaf\xfb\x80\x1a\xe8\xd5\xbe\xb0\x32\x4e\xc6\x98\x28\xa3\x0a\x1d\x1e\x3b\x59\x27\xdf\x80\xb8\xf4\xeb\xb1\xe7\x49\x82\x02\xba\x6d\x3a\xc0\x53\x1d\x64\x34\x09\x63\x5b\xed\xc0\x90\xf3\x2c\x9f\x36\x17\x1b\x2c\x54\xd3\xd0\x78\x6f\x7d\x5a\x44\x21\x33\xc4\x3c\xf3\x44\x99\x02\x0b\xac\xb3\xc4\xd1\xe4\x4e\x1c\xc3\xb7\xd2\xa4\xb3\xce\xbb\x18\xc4\xdf\x3f\xbe\x80\xa9\x0d\x53\xe1\xb1\x44\x84\x5c\x07\x02\xa4\xd4\xa4\x76\x7a\xb1\xb7\xad\xa6\x0d\x26\x21\x7d\x3f\x3f\x55\xf5\xf3\x36\xb9\x0c\x95\x43\x64\x8b\xc5\x0e\x66\x3f\xf1\x20\x91\xc2\xcd\x69\x91\x94\xc8\x6d\xe1\xdd\xa7\x54\xbc\x3a\xb2\x5d\xac\x7b\x4d\x2a\x6d\x74\xa9\x31\x9f\x34\xc5\xc2\x1f\xed\x65\x44\x15\xeb\xe6\x52\x17\x28\x39\x33\x11\x20\x02\x20\x49\x44\xcf\x79\x9f\x22\x71\x92\x5e\x31\x10\x74\x60\x60\x3f\xb5\xb7\xc6\xb3\xf0\xe9\x31\xdf\x85\xd8\x49\xf7\x18\x89\x6a\xf0\x5c\x3f\x91\x78\xf5\x8b\x93\x16\xc9\x11\xb8\xff\x5e\x63\x18\x62\x50\x38\x6c\x51\x11\xd3\x28\xf9\xf9\x64\x8b\xca\xfd\x2f\x4d\x62\x8a\x47\xa4\xc8\x16\xaf\xdd\xd2\x89\x79\x54\x76\x73\x91\xfc\x81\xba\xa0\xc1\x3b\x38\x03\x1d\xd2\x45\xc4\x18\x3b\xe3\x8c\x7c\x0d\x94\x01\x57\xae\x13\xb2\x25\x4e\x0c\xc1\xf0\x28\x2e\x60\xad\x13\x24\xd0\x2c\xde\xf1\x83\x30\xac\x76\x2f\x8e\x83\xab\x46\x11\xae\x79\x93\x50\x24\x2a\x06\xf4\xf1\xcc\xbf\x7e\x7c\x02\xfe\xd0\x38\x8c\x86\xdd\xd3\x0e\x99\x54\x1b\x86\x0a\x39\x6c\xbe\x73\xa8\x08\xb2\x9e\x76\x20\x60\x31\xc2\x10\x2e\x85\xe8\xa3\x42\x36\xb3\x16\xab\x6e\x1e\x0a\x79\xa1\xdc\x3f\xd3\xef\x45\x29\x90\xf8\x0a\x48\x54\x2a\x10\x27\x25\x14\xf5\xb2\x03\x0e\x77\xf1\xe7\x99\x06\xc5\xdb\x3e\xbd\xd1\xbd\x87\x36\xc9\x6c\x99\x72\xb5\xc2\x7a\x49\x29\x11\x9b\x32\x62\xfe\x32\x74\x0c\x2a\xc7\x70\x27\x46\xc9\x4b\xe0\xb9\x15\xc0\x7c\xf1\xaa\x80\xa0\xa4\xde\x58\x8c\xb0\x8a\xe4\xec\xc8\x07\x78\x76\x9a\x89\x40\x07\x52\xac\x45\x21\x28\xa3\xbf\x64\x5a\x23\xbb\x91\x07\x8b\x9b\xc5\x0d\x72\xe4\x38\x71\xba\x40\x16\x12\x32\x38\x38\xb1\x95\x98\x22\x92\xfa\x27\xeb\xbd\xbd\xc5\x54\x78\x0c\x85\x23\xb3\x93\x91\x08\xcb\x89\x77\x4f\x63\xc7\xa9\x21\x1d\x88\x93\x11\xe0\x7e\x25\x3c\x87\xdf\x2f\x60\xe7\x37\x95\x42\x9d\x24\xa3\x57\x01\x44\xce\xd4\x0c\x9a\x5d\xd1\xef\x10\x9f\xc6\x75\x99\xd9\xa6\x6a\xaa\x54\xcc\xdb\xde\xfa\xab\xb2\xf5\x5f\x78\x64\x2f\x11\x51\xa7\x05\x4a\x27\x55\x2d\x0a\x27\xa8\x2d\x5a\x23\x72\x4a\x0b\xa4\x73\x57\x78\x2a\x99\x0a\x2f\xe4\x76\x80\x88\x7c\x80\x90\xd5\x8b\x8b\x85\x19\x00\x81\xde\xff\x81\xc1\x4e\xf5\xd7\x5e\xbb\xc6\x31\xb7\xed\x8a\x16\x52\x87\x94\x1d\x8a\x4a\xa8\x54\x7f\x62\x72\xd7\xd9\x37\x68\xe3\xe0\x7c\xb7\x95\x0a\x76\xca\x0f\x2c\x4a\x38\xba\xce\x50\x23\x73\xb3\xed\x5a\x80\x38\x17\xed\x90\xc8\xaa\xb2\x39\xd5\x1a\x73\x0b\x16\x3c\x05\xff\x4f\xe7\x82\xbc\xdd\x43\xda\x44\x49\x20\x7e\xca\xa5\x50\x04\x86\xd7\x89\x71\x66\x49\x9e\x27\xaf\x27\x88\xad\xdc\x3c\xbd\x32\xc9\x61\xc9\x8f\x80\xa0\x0f\x14\x1a\x64\x4e\x4e\x92\x89\xbf\xfe\x99\x31\x38\x4f\x2a\x93\x1b\xe6\x24\x62\x6f\xbc\xc5\x43\xa5\xd1\x29\x5f\x92\xdc\x5e\x76\xbd\xd5\xcb\xe7\x87\x2f\x99\xd3\x76\x8f\xa5\x39\x61\x64\x72\x05\x65\x3b\x92\xc7\x9b\x01\x76\x2d\xa8\x2e\xe6\xf7\x4f\xff\x86\x12\x08\x44\xb3\xa9\x5b\x1e\x39\x55\x16\xe8\x6d\xb9\x58\x79\xdd\x0a\x35\xf1\x50\x33\x66\x31\x03\x05\xba\x18\xd7\xb2\x82\xae\xa2\x19\x19\x6a\xbd\x03\xbc\x51\x65\x07\xd6\x75\xfd\xe6\x70\x69\x39\x90\xbc\x6d\x40\x53\xaf\x20\xae\x83\xc9\x8b\x12\xb4\xaf\x22\xa7\x43\xcb\xc4\x44\x65\xcb\xcb\x3e\x40\x8f\x64\xe0\xa4\x4e\x25\xe6\x04\xc7\x02\xcf\x09\xbd\x92\xff\x53\x09\x69\x8c\x33\x32\x8a\x93\x2b\x99\xfe\xc6\x26\xaa\x54\xef\x20\x13\x01\x4d\xea\x97\xeb\xbf\x15\x27\xfd\xe3\xf3\x8b\x24\x62\x9b\xa3\xda\x52\x91\x93\x48\x0e\x63\xb3\x7f\x64\x9d\x38\xbc\x81\xd7\xc0\xc2\x37\x8d\x62\xb0\xfd\x1e\x90\xb2\x01\x0e\xfb\x43\xfa\x83\xa5\xb6\x6b\x2c\x5c\x26\x4b\x7b\x62\x82\xd3\x1d\x59\xae\x51\x78\x8c\xf4\x80\x2c\x72\x20\xd7\x43\xa1\x0a\x87\x15\x25\x4f\xae\x7b\x18\xf0\xa9\x0b\xfa\x0e\x6e\x24\xe4\xa0\x13\x32\x69\x60\xa7\x50\x2b\x84\xf4\xc5\x5c\xc5\x4b\x00\x9a\xcb\x1d\x62\x86\x06\x29\x6e\x13\xfc\xae\x2b\x05\x9c\xfd\x2f\xb8\x8e\x37\x05\xe1\x45\x31\x00\x5f\xab\x66\x53\x72\xc6\x96\x18\x3c\x29\x0e\x74\xa7\x81\xf0\x39\xb3\x3f\xbe\xb0\xe6\xee\xf9\x09\xe3\xad\x33\x8f\xba\x2b\x39\xb7\x3a\xab\x28\x83\xbb\xc9\x91\xfe\xa4\x59\xa6\xb5\x58\x02\x7b\x2d\xf6\xe9\x32\x31\x4f\x12\x6a\x13\xc7\x9d\xde\x82\x8f\x58\xa1\x97\x20\x63\x59\x21\xff\x73\x2b\x31\x81\x2e\xf2\xf0\xf3\xf1\xfe\xf5\xc9\x76\x1c\xf2\x07\x3c\xef\x8d\xfd\x73\x61\x7f\x7b\x67\x07\x8b\x93\x39\x68\x92\xcc\x62\xd1\x99\xf8\x41\x57\x2f\x9c\x14\x37\x76\x54\xd7\x79\x2c\x58\x80\xc3\xc7\x2f\x50\x8a\x53\x47\xfe\x8c\x5c\x18\x16\x38\x85\x83\xd2\x9f\x17\x46\x43\xce\xae\x41\x37\xd3\xb9\x34\x99\x4a\x30\x83\xdb\xd3\x3b\xb4\xd0\x5f\x9c\xf1\x43\xde\x04\x21\x5d\xa6\xec\x81\x22\xcb\x90\xb6\x10\xab\x00\x2c\x4b\xbb\x0b\x3f\x74\x8d\xe2\xe2\x59\x58\xca\xa6\x53\x59\x89\x1c\x09\x81\xaf\x39\x2a\x6a\xdb\x30\xbf\x40\x0d\xb0\xb1\xf4\xe5\x9b\xf4\xaf\x42\x4e\xb3\x85\x22\x69\x44\x45\x81\xbb\x6c\xe1\x31\xb0\x15\xe4\xe3\xe3\x40\x7a\x57\xd5\x9d\xdd\x9d\x82\x5e\x46\xf2\x71\x22\x31\xa2\x27\xce\x99\xd6\x50\xc5\xc2\x77\x5d\x1c\xbb\x64\xdb\xc5\x93\x60\xb5\x47\x3f\x81\x17\xdf\x54\x3e\xca\x43\x71\x33\x55\x48\x30\x99\x1f\x64\x24\xba\x5e\x54\x91\x73\x68\xe9\x0f\xce\xae\x39\xf9\xe7\x16\x4f\x61\xbb\xcd\x07\x28\x78\x64\x68\xd5\x02\x17\x15\x46\xb4\x19\x0a\x97\x51\x6d\x8b\xcd\x42\x48\x9f\xfd\xbb\x62\x9d\x49\x0d\xf2\xa6\xc5\x37\x32\x9e\xc5\xd2\x91\xce\x1c\x38\x21\x39\x77\x2d\xe2\x39\xde\x62\xb9\x67\xf7\x6c\x61\xf6\x79\xd3\x4b\x4f\x8e\x83\xba\x05\xac\xd2\x53\xdf\x39\xab\x45\x2d\xfd\x87\x7a\x13\x67\xca\x81\x49\x4a\x25\x2e\x79\xdf\x22\x61\xf4\x11\x16\xce\xfe\xff\x12\x34\xd7\xc8\x7c\x1c\x36\xb5\x99\x6f\x41\x90\xf4\x30\xbc\xa0\xe8\xdb\x2d\x15\x42\xd4\x66\x49\x82\xaf\x34\xfb\x2c\xfc\x30\xb0\xf2\xf0\x4d\x3d\xb3\x48\xb4\x80\x00\xf4\x43\x21\x15\x32\x9f\x81\x49\xdd\x34\x79\x97\x9c\xdf\xe2\x3d\x2e\x77\x15\xd3\x12\x51\xf5\x22\x62\x98\xf5\xd3\xe1\xd6\x81\x34\x4a\x63\x2c\x3d\x57\xa6\xb0\x82\x28\x3c\xb6\xc4\x6e\x81\x60\xc6\x41\xa0\x50\x2d\x06\x36\x9c\x86\xe3\xf3\xf3\xb3\x0c\x1f\xb2\xe5\x6b\x79\xc8\xdb\xac\x7c\xe1\x74\xcb\x1f\xa5\x69\xb9\x64\x4e\x47\xe2\x10\xa9\xa5\xdb\xbf\x36\x0e\xa5\x19\x3d\x36\x06\xd9\x8f\xcb\xce\x94\x27\xd6\x9f\x0b\x5d\x18\x79\x97\x95\x7d\x64\xaa\xe0\x97\x26\x72\xb8\x70\x67\xaf\x57\x05\x62\x6a\x1e\x44\x02\x9b\xb9\x3a\x8b\xc7\x48\xdf\xa5\xca\xc0\xf6\x72\x59\xcf\x7b\xd7\x91\xb5\xdd\x25\x1f\x2c\x9f\xe6\x38\x46\xf1\xf8\x7c\xbe\x01\x09\x43\x25\x51\xa0\x3c\x1e\x11\x39\x6b\xe8\x55\xb0\xcb\xbd\x16\x9d\xb7\x39\xae\xc4\x56\x17\x1a\xed\xda\x51\x50\x15\xa2\xc0\x07\xcc\xc8\x7f\xf0\xe0\xdb\x63\x80\xba\x78\x3f\x1e\xc8\xcc\xe9\x05\xdc\x89\x81\xe5\x0a\x42\xce\x0a\x19\xba\x20\xc8\x4a\x50\x0e\x5c\xd3\x8b\x7c\x37\x7b\x8b\xeb\x58\x49\x47\x81\xf4\xdf\x2e\xa7\x58\x4d\x9e\xde\x1b\xeb\xe7\x11\xec\x71\x70\xd4\xeb\xe5\x0b\x31\x85\xa9\x02\xd3\x89\x81\x85\x9d\xd2\x72\xed\x8d\x74\x5b\x81\x9a\x83\x0f\xa2\x5d\x34\x1d\x29\xd7\xe7\xd8\x6c\x2f\x2f\xb3\x2d\x42\x5c\xfd\xe5\x60\x95\xa5\x6a\x5f\x67\xb6\x30\x10\x90\x25\xd2\xc2\x32\x01\xa4\x9c\x6a\x91\x8e\xb0\x73\xae\x21\x71\xe8\x5d\x03\x51\x8c\x9d\xa0\x8f\xe6\x38\x9f\x03\x77\x4e\x6e\x4f\x4d\xf6\xc8\x67\x6a\x89\xf9\xdf\x0a\x27\xaa\xa3\x81\x04\xec\x5b\x89\x12\xf3\x26\x08\x0f\xe1\x2a\x80\xc8\x76\x3a\xf6\x9b\x2a\x5d\x8e\xc7\xa3\xd7\x85\x15\x4d\x15\x55\x98\x1a\x01\x0a\x1a\x4f\x6d\x96\xa7\x5d\x48\x0c\xac\x49\xf5\x82\x56\x54\x40\x37\x2d\x72\xf7\x3a\x11\x2c\xce\x0e\x39\xa2\x2b\x24\x62\x23\x68\xbb\x28\x5b\x3f\xd2\x4e\x6c\x5e\x52\x27\x03\x88\x97\x1f\x05\xd9\x9f\x23\xb9\x19\xa7\xbc\x30\x2c\x36\xdb\xcf\xf3\x82\x26\xc7\x85\x19\x12\x1d\x8e\x73\xe9\xbc\x7b\xbf\x7f\xcf\x77\x08\x0a\xc6\x97\x41\x76\x7c\x52\x40\xd6\x7c\x2c\x55\x49\x59\xf6\x73\x82\x2b\x4a\x88\x47\x86\x22\x52\x9d\xda\x45\x74\x6a\x1e\x1c\xbf\xa0\x4f\xc2\x9a\x1f\xd8\xc3\x72\xf8\x78\xb7\x7f\xbe\x64\x6b\x60\xaf\xb8\xbb\x89\x3c\x5b\x3f\xbf\xfe\x5d\xfd\x4f\x99\xd0\x04\x2c\x36\xe7\x5b\x21\x51\xec\xa9\xd3\xe2\x38\xb6\x27\x97\x45\x3c\x7b\xbb\x48\xea\x96\x2e\x3f\x48\x87\x02\x01\xa4\x43\x56\xb8\x7c\x84\x9d\x36\x4b\x23\x34\x05\xa2\xca\x17\xe4\x6a\x16\xb1\xbb\x17\xe2\x45\xcd\x91\x4a\x25\x32\xde\xc0\xf2\x07\xf1\x5a\x52\x83\x6e\x75\x10\x18\x13\xcd\x70\x27\x18\x2e\x6f\x8b\x02\xd6\x46\x54\x6b\xe6\xff\x08\x65\x3d\x7a\x57\x10\xc6\xe7\xe5\x65\xeb\x5e\x2c\xd4\x1b\xeb\xd4\x3e\x39\x4c\x5d\x8e\xd9\xdb\xc2\x59\x3b\x1d\x84\x45\xc0\xb9\x63\x13\x04\x5c\x26\xd3\x5f\x2c\x00\x85\xd7\x9c\x89\xab\x98\x9b\xfa\xb0\xa8\x6c\xe7\x84\x76\x58\xe5\x4b\x62\x16\x5c\xfc\x35\xcc\x0e\x6f\x35\x7c\xfe\xbe\x60\xe5\xfb\x7c\x03\x7a\xc9\x91\xf9\xfd\x40\x9e\xb3\x8b\x85\x06\xdc\x16\x77\xa5\x8a\x23\xf7\xfb\x43\x75\x68\x8e\x7e\x9d\x14\x6c\x0b\x6e\x61\xc6\x92\xe8\x38\x5a\x4d\xc4\x56\x2c\xff\x30\x87\x1c\x33\x87\xb5\xcd\x05\x61\xe0\xa4\x05\xf9\x55\x8d\x53\xdf\x83\xe3\x0f\xb0\x10\xd3\x39\xeb\x01\xa9\xbb\x5c\xaa\x3c\x53\x8e\xd3\xb6\x60\x31\xc3\xf3\x29\x8b\x1c\xbc\x48\x86\xd0\x29\x45\x41\xed\xda\xbc\x35\x08\x0c\xcc\x73\x0f\x72\xd6\x4c\xae\xc8\xd3\x6b\x7b\x3b\x05\x71\x7a\x79\x3a\x5d\x85\xf3\xfd\xae\x73\x53\x10\xf9\x75\xe9\xa9\x72\x1c\x11\xca\xfb\x63\xa9\x7c\x5e\xbd\x2f\xd6\x7f\xc5\xd1\x37\x64\x54\x35\x33\xc1\x8d\xbc\xbd\x48\x3f\x9e\x3e\xa6\x84\xe9\x8a\x87\x79\x30\x4a\x44\x99\xf7\x4a\x80\xed\x68\x3e\x2b\x81\x2f\x99\x74\xe0\xe1\x36\x3d\x1a\x7a\x43\x4a\x89\x8b\x8d\x18\x98\x83\xff\x6d\x3e\xd7\xff\xfe\xef\x41\x48\xcb\x3a\x48\xa9\x6c\xe4\xd6\xb0\xa7\x4e\x9e\x0a\x20\xf1\x65\x63\x9b\x92\x65\x82\x5f\x63\x24\xc1\x3e\x55\x0f\xb8\xfd\x42\xea\xdd\x3c\x4a\x13\xca\x3e\x67\xd4\x7a\xcd\x88\x35\x61\x2e\xf0\x20\x85\x4d\x1c\x4d\x07\xe9\x1e\x58\xa8\x33\xa7\xbc\xc0\x29\x2d\x88\x74\xf1\x20\xcb\x0b\x41\xcb\xbd\x59\x71\x92\x2d\xba\x6c\x36\x0f\x6d\x76\x26\x33\x45\x4b\x05\xa5\x49\x64\x6c\x5c\x0a\x4d\x99\x56\xb1\x3b\x2c\x06\x75\xe7\x6e\xc9\x84\x87\x99\xc7\x90\x7b\xe6\x67\xbe\x7f\xfc\xbb\x12\x5b\x42\x85\xf2\xc9\x18\xef\x84\x6c\xc9\xcd\x43\x5f\x38\x74\x47\x2a\xcd\xe9\xa7\x9d\x19\x37\x13\x1a\x46\x51\x7f\xfd\x3c\x0e\xc6\x47\x5d\x70\xc7\x97\x3d\xf8\x3d\x1c\x7e\x0f\xac\x37\x80\xdf\x9c\xdd\x1e\xa1\x50\xbe\x4f\x25\x11\xf0\x9f\xa2\xb7\x87\xd4\xac\xcf\x5d\xd3\xb2\x31\x85\x71\x36\xff\x2e\x52\xdb\x82\x4f\xa0\x52\xee\x9b\x05\x26\xb5\x40\x1e\x55\x6a\x1c\x04\x8c\x74\x36\x1c\xa5\xb1\xe6\xfe\xc1\x20\x34\x11\xb8\x8e\xee\x56\x68\x68\x6f\x5b\x98\x89\x2c\x01\x28\x80\xf1\x78\x57\x1a\xf1\xe3\xe5\x22\x78\x86\x66\x0c\x7a\x6d\xee\xf2\x9f\x52\xbb\x80\x02\x9d\xfb\x66\xcc\xe9\xe2\x22\x38\xa3\x84\x99\x3c\x56\x83\x5f\x38\x48\xc1\x44\x11\x0e\xfb\xd5\x7d\x7f\x7f\xff\xbe\x63\x8d\x40\xcc\xc6\x8c\xf9\xe4\x48\xc6\xca\xb9\x7d\xb7\xd2\x0d\x47\xc6\xea\x83\x16\x5c\x29\xf3\x4e\x41\x9f\x99\x6f\x35\x4c\x84\xa5\x10\xca\xfa\xd8\xac\x0a\x8e\x6b\x54\xf7\x5c\xde\x27\x8d\x18\x10\x8e\x85\x33\x3e\x0f\x3a\x9f\x15\x0c\x9c\x39\x39\x89\xeb\xcb\x69\x08\xc7\x37\x24\xcb\x5f\x03\x48\x6f\xb3\x3f\x73\x03\xda\x6a\xaf\x29\x55\x7f\x15\x74\x10\x78\xd3\xdf\x2d\xac\x3a\x4a\xbd\x20\x9a\xe4\x89\x17\x87\xe0\x68\x3a\x8b\xbb\x5f\x78\xff\x2c\xaa\xab\x33\x33\x20\x88\x94\x4c\x9d\x9a\xa9\xa6\xb7\xbf\x2c\x84\x81\x84\x53\xf3\x4b\xc3\xb6\x09\x43\x9c\xed\x06\x61\x42\x73\x7e\x35\x1c\x8f\x25\x3f\x29\xbc\x27\x48\x3c\x88\xfa\x92\x64\xbe\xf9\x77\xa5\xd1\x37\x45\x44\x45\x58\xd8\x17\xfa\x35\x33\x1a\x0f\x11\x1c\xc4\x57\xa7\x8a\x66\xe8\xf9\x6b\xfe\x1f\x2c\xb3\xfa\x8f\xff\x0f\xef\xfe\xd5\x91\xac\xa9\x99\xa8\x52\x13\xba\xd1\x65\x35\xe7\x7f\x7c\xfb\x77\xc5\xa4\xf6\xa5\xf8\x72\xca\xa3\xcf\x41\xcc\x00\xf9\x92\x49\x0b\x36\x9b\x07\x93\x5a\xc1\x33\xfd\xbb\x62\xe3\x5e\xaf\x10\xa5\x76\xa8\x51\x45\xd0\xa6\x2f\xb2\x49\x2a\x1c\xa4\x11\x79\x25\x98\x96\x3e\x6c\x2c\xd9\x15\xbf\x3c\x15\x36\xe0\x57\xc1\x12\x12\xe2\xcd\x1a\x03\xdd\x65\x52\x65\x01\x02\xe3\x77\xfa\x56\x1a\x31\xb0\xc3\x3c\x3b\xfe\xb6\x15\x32\x9f\xbb\x22\xca\xa8\x64\xa8\x89\x2a\x15\x68\x1f\x1e\xa1\xe6\x2e\x8b\xb1\x9c\xe9\xde\xbc\xf0\x74\xfc\x0b\x4f\xc6\x70\xf6\x37\x24\xd3\xb4\x38\x6c\x22\x25\x38\x32\xba\x9a\xf9\xe3\xce\x5b\xab\xbd\xb9\x16\x7f\x81\xbe\xab\x45\xc4\x19\x90\x18\xcf\x25\x73\x52\xdc\x25\x9f\xc1\x3f\x09\x1e\x11\xd6\xfb\xe4\xc4\x1e\xca\x3c\xb0\x9b\x09\x04\x72\xdb\xcf\xc8\xa1\x21\xc5\xde\xbc\x10\xd3\x69\x54\x04\x80\x86\x7e\xfa\x73\xa5\xf1\x05\x05\x5d\xe6\x38\xd9\x39\x5b\x43\x5b\x08\xaa\x44\x3e\x6b\x4e\x41\xb5\x87\x41\xd8\x34\x11\xfc\x9a\x99\x0f\xa4\xf9\x33\xb7\xb9\xe7\xca\xbc\xba\xc5\x1a\x4f\x9d\x2d\xa2\x12\x1d\x63\x53\x38\xd9\x6a\xd1\xa2\x7b\xe2\x83\xca\xb6\xb5\x6b\x51\x9f\x91\x64\x9e\xdc\xad\xaf\xdc\x39\x17\xd8\x29\xb0\x39\x9e\xcf\xdb\x5f\x4a\xe2\xc1\xf3\x22\xac\xaa\x2c\x8f\x75\x28\x3c\x1f\x9b\x88\x6e\xbc\xc6\x7e\x26\xf8\x54\x33\xce\xec\xb6\xa9\xba\xdb\x2e\xf6\xda\x06\x54\x57\xb9\x39\x1a\x7e\xd4\x93\x67\xa7\x8f\x0f\x76\xf3\x21\x55\x26\x22\x42\xdb\x34\xa6\x18\xbc\x86\x26\xd6\xbd\xe4\x03\x5e\xd9\x6a\xbc\xee\x13\x46\x4b\x56\x64\x69\xf0\x67\xe2\x54\x26\x2e\xfa\x3c\x08\x6c\x84\xb0\x57\x79\x22\xba\xca\xbb\xd3\x2e\x05\xd5\xd4\xf4\xca\x25\x2e\xa3\xc6\x48\x78\x4e\xf1\xc4\xac\x13\x0a\xc7\x28\x4f\x1c\x68\x33\x0e\x1f\xc7\xcf\x77\x82\x53\x93\x1d\x51\x98\x4b\x8e\x59\x60\xa6\xb9\x8c\x19\x0b\x02\xff\x76\x9c\x7b\xa3\x92\x85\x0a\x52\xb2\x63\x60\x40\x3c\xe8\x14\xab\xc9\x23\x2f\xb8\x84\xe5\xd8\x1e\x9b\xf7\x99\x75\xe9\x2b\x47\x7f\x99\x3e\x26\xee\xed\x71\x37\xb5\x88\xb2\x5f\xa1\x1a\x74\x6a\xc4\xbc\x2f\x8c\xbb\xd6\x5e\x69\x1d\x51\xf0\xa3\x60\x17\x8e\xf5\xbb\xbf\xcb\xe1\x35\xb7\xfa\x96\x21\x7f\xec\x09\xec\xf3\x99\xcb\x89\x71\xc1\x42\x98\x74\xaa\x95\x98\x5b\xb2\x0b\xb3\x6a\xde\xc5\x4e\x2e\xc9\x49\x8c\x67\x67\x01\x51\x0e\x47\xc8\x6d\xed\x03\x53\xe1\xc1\x79\x6e\x13\x9e\xc3\x7a\x5f\xbe\x45\x49\x2b\x0a\x7a\x8d\x5c\xa5\x57\x30\x0c\x62\xa5\xea\x4a\xab\x60\xcb\xf2\xad\xf7\xac\xd3\x71\x65\x5d\x77\x2e\x14\xc1\x4b\x10\x41\x47\x5d\x66\x23\x79\x58\x44\x4f\xfc\x51\xa8\x86\xa3\x18\x0f\x2f\x79\x7a\x30\x7f\x9f\x34\x99\xea\xf8\xe3\xdf\xf6\xe0\xfe\x90\x0e\xf9\x38\x7e\x79\x34\xed\x8f\xde\xfc\x1b\x52\xe4\x3d\x6e\x03\x79\x34\xa6\x6e\x66\x2b\xe4\x10\x9e\x61\x51\x30\xba\x48\x95\x43\xbf\xc1\xd5\x2f\xa3\x52\x5c\x75\xab\xcf\xdb\xeb\xb2\x7c\xe0\x11\xa0\x2b\x50\x8d\x5b\x69\x9a\xbf\xba\x7e\x47\x78\xfc\x89\x4d\x71\x9d\x53\x16\xb3\x0d\xac\x2d\x95\x29\xd3\x60\x27\x06\x02\x9a\x74\x7a\xd0\x09\x55\xd3\xb6\x0f\xcc\x62\x2e\x60\x63\x31\xad\x19\x70\x7d\xaa\xeb\x4e\x4a\xc7\x5c\xe9\xc0\x99\x78\xb0\xf8\x7f\x31\x9b\x3d\x26\x42\x55\x91\x36\xf1\x28\x29\x15\xe2\x6a\x27\x06\x9a\x84\x7e\x10\x19\xcc\xd5\xaf\x8d\xaf\xa0\xfe\xaf\xe0\x7b\xfa\x1a\x3e\xef\x4d\x99\x68\x37\x0b\x2d\x2f\x24\x04\x4a\xe2\x15\x0b\xe1\x1c\x03\x66\x02\x45\x57\x57\xcb\x3a\x96\xc1\x21\x8b\x2a\x36\x66\x4d\x61\xf9\x9c\xc3\x38\x30\xb8\x09\xbb\xad\x8a\x9f\xef\xcf\xcf\xba\x13\x65\x4a\xf3\xb7\x8a\xde\x5b\xc5\x79\x8b\x9e\x7f\x27\x09\xb4\xc6\x4e\xb6\xd3\x1a\x5a\xb6\xcb\xcf\xb2\xc9\x1c\x31\xd6\x01\x7e\xb9\xbd\x06\x81\x9b\xdb\x11\xca\x2c\x54\xbb\x40\xc2\x4e\x33\xd3\xd1\x4d\xde\x1b\x72\x1b\x38\x12\x57\x74\xf5\xf9\x35\xb6\xa3\x07\xbe\x1b\xe1\x65\x9f\x9e\x29\x30\x1e\xb5\x95\x84\x9b\x57\x06\x8b\x80\x58\xf9\x51\x91\x59\x05\xa7\xcd\xa9\x29\xa9\x90\xc0\x8b\x58\x01\xeb\x34\xc8\xaf\x0c\x65\x78\xf5\x2c\x5c\x1b\x26\xb4\xf8\x0b\x1d\xea\x04\x67\x36\x3e\xd5\x6e\x0e\xcc\x17\x6d\xc8\x13\x4e\x3c\x08\x3e\x8e\xd4\x37\xa5\x69\x6f\x59\x5e\xad\xcc\xad\x5b\x1f\x64\x32\x4b\x73\xfb\x5f\x8f\xcb\x56\x48\x4d\x83\x29\xb9\x07\xf9\x65\x5a\x67\x8c\x42\x55\xd0\x19\x39\x14\xb6\x95\x41\xca\x16\xe3\xaa\xd0\xef\xf7\xcc\x55\x47\xef\x2c\x5e\x71\x71\xa8\x36\xba\x63\x92\xf8\x6f\x3c\xd7\x5c\xf8\x20\x87\x91\x3d\x09\x9e\xdf\xa3\xbb\x83\x91\xa4\x38\x4f\x51\xe7\x29\xe6\xdb\x8e\xa2\x9d\xb3\x73\xd3\x77\x7b\xbc\xba\x42\x3d\x42\xc6\x21\x71\x20\xaf\x1f\xbd\xaa\x38\x1d\x28\x16\x15\x4a\xa7\xc7\xf3\x41\x6c\xa0\x8f\x39\x66\xb2\x3f\x09\x3f\xe0\xa3\xd8\xd9\x79\xe6\x33\x18\x09\xca\xb6\x37\xf8\xfc\x91\x46\x2b\x83\x51\xff\x7a\x24\xeb\x02\xbb\x31\x85\xaf\xc6\x2c\xaf\x8c\xd1\xf9\xf0\x66\x6d\x32\x8f\x9e\x5e\xcc\x31\xad\x73\x9f\x8c\x85\x9f\x53\x52\xe8\x0e\x89\xc0\x0c\x1e\xa8\x92\x66\xd3\x4e\xee\x63\x64\xe5\xaa\x8d\xf0\xad\xcd\x68\xf1\xff\xff\x82\x41\x10\x3a\xa0\xfa\x1e\xc6\x0e\x82\x8a\x14\x2b\x4e\x1d\xa7\x72\xb1\x38\x1d\x5e\x93\xe5\x50\x85\x54\x79\xe7\xa1\x55\x72\x18\xb7\x88\xa8\x38\x83\x88\x3c\x0b\xb3\xb9\x85\x38\x72\xc7\x42\x43\xed\x59\x53\x62\x4a\x9e\xa9\x7b\xc2\xa6\x3e\xfe\x36\x00\x41\x11\x83\x2b\x0b\x62\x18\xc7\xb8\x14\x17\xe8\xde\xed\x65\x6c\x4d\x7c\x45\x24\x59\x66\xfc\x73\x1a\x44\xa5\x49\x35\x75\x99\x5d\xcf\xfa\x10\x5c\x60\x5e\x2a\xc0\x5d\xd4\xa3\x0f\xba\x71\xaa\xce\x40\x0d\x78\xce\x9f\x44\xb8\x1c\x7b\x8c\xc5\xf7\xc9\xc1\xf5\x50\x40\xfc\xaf\xe1\x02\xfb\x82\x5e\x8f\x1d\x83\xbb\xb3\x38\x53\x42\x1b\x46\x0e\x12\x06\x3d\xf4\x58\xba\xa7\x46\x02\x34\xc5\x38\x4f\x7a\x60\x78\x2e\x69\x66\x1d\x80\x49\x6c\x7f\xea\xf8\xeb\xdf\x94\x47\x56\x22\x6f\x7f\xb9\x88\x75\x13\xfb\xbc\x13\xc8\xcd\x3c\xdc\x8b\xf0\xa9\xa2\x95\x9c\x77\x4e\xc1\xd2\x60\xc8\xd9\x01\x45\x43\xe1\x12\xff\x60\x19\xcb\xdb\xe3\xee\x84\x05\xd5\xb1\xa1\xcb\xf1\x27\x63\xee\xe2\x31\xac\xef\x82\xba\x80\xcb\x69\x5f\x0b\x5f\x80\x85\xad\xaa\x15\x8f\xc5\xec\x30\x06\xac\xd0\xc2\xc5\x33\x63\x2e\x1a\xea\xb9\xe3\x43\xa3\xe4\xdd\xf9\xd5\x08\x28\x9f\x0b\x0a\x49\x70\x0b\x1e\xff\xd2\x96\xd0\x78\x0e\x4e\xa4\xf2\x1a\x64\x0a\x7d\x4a\x11\x10\x4d\xf2\xfd\x39\xca\x0f\x7d\xd8\x47\xec\x3b\xc7\x49\x82\x13\x11\xd9\x25\x24\x75\x87\x5d\xb2\xe8\xf3\xbc\xc8\x5b\x6a\xeb\x46\x7e\xa9\x70\xe2\xd4\x7d\x4f\x0a\xe0\x1d\x40\xeb\x4c\x2f\x6a\xa0\x7b\xe7\x2e\x8e\x86\x13\x7b\x79\x56\x0c\xa3\xd7\xd8\x25\xc2\x1f\x39\xdc\x17\xdb\x9e\x39\x8f\x96\xbc\xd9\x30\x92\x9c\x1f\x7e\xd0\xbe\x0b\x28\x0c\x13\x81\x8d\x37\xb7\x20\x32\xb4\xf7\xcf\x90\xa5\x34\xdd\xff\xc4\x4d\x0e\xc3\x8d\x9b\x76\x4d\x6b\xc9\x40\x3c\xd4\x1e\x73\xf8\xfd\x79\xe7\x59\xda\xb7\x04\x5c\xe3\xd3\x47\x91\x81\x8a\xc2\x3b\xe7\x27\xe1\xc8\x5e\x14\xf4\x43\xa1\xe9\x58\xc7\x50\x46\xd4\x83\x7d\x9b\xc1\x85\x99\x4e\xfa\xad\x7e\x95\xa0\x45\xc7\xe4\x24\xaa\xc7\x73\xa6\x06\x37\xaf\x0c\xc9\x9d\x79\x4b\x80\xb9\x01\xa6\x25\x9e\x1f\x87\x2e\x10\x08\xbc\x9b\xed\x62\x1b\x6f\x30\x67\x89\x05\xd3\x8e\x10\xa2\x13\x86\x4c\x12\x43\x84\xa9\xba\x7c\x38\x65\xcf\x9d\x57\xe2\x2f\xf7\x9f\x6f\x47\x6c\x22\x10\xf5\xcc\x66\xd5\xb4\x12\x91\x58\x56\x1f\x4e\x85\xc6\x45\x73\xa0\xc8\x53\x94\xef\x9a\x17\xd0\xc4\x52\x62\xe4\x7c\x8f\xf5\xa5\xc5\xd8\x6c\x22\x94\xab\x2d\xe0\x17\xb5\x12\x9a\xaa\xcd\x58\xc8\x16\x80\x03\xd6\xaf\xeb\x7f\xf9\x17\xd6\xd3\x0c\x39\xd1\x13\x16\x30\xa9\xe4\x92\x97\x91\xb5\x54\xf6\xc0\x7f\x1c\x09\xcd\x32\xc5\x39\xd1\x45\xf3\xfa\xa2\xdc\x61\x4d\x06\x05\xcf\x4f\xe4\x71\x05\x49\x8b\x1d\xfb\x2c\x39\x7f\xf1\x85\x09\x1a\x71\x78\x13\x62\xa9\xb1\xf0\x13\x52\xfc\xdc\x38\xed\xff\x8e\x9e\x5a\x9f\xc0\x86\x68\xab\x0f\x17\xea\x2f\xb3\xe1\xf0\x5d\xc3\x6b\xee\x99\x33\x59\x57\xff\xa3\x79\xfd\xac\xbe\x62\x86\x39\xa5\xbb\x25\x74\xce\x49\x6b\xc8\x93\x7a\x13\x9d\xd6\xfc\xd0\x28\x4c\x30\xc7\x20\xff\xf4\xe2\x31\x98\x32\x55\x42\xed\x04\x04\x5a\x77\xf4\x19\xfb\x64\x0f\x91\xb5\x62\xde\x9d\x5f\x6a\x6c\x05\x06\x70\xe7\x99\x65\xa3\xcb\xe5\xc5\x67\xfe\xf7\x08\x4d\xbc\x39\x31\xf3\x88\xe0\xde\x9c\x40\xb8\xd6\x1f\x5f\x60\xbd\xd4\x1c\x1c\xb8\xc7\xaf\x59\x06\x22\x2a\x86\xa2\x08\x00\x60\xac\x7b\xfd\x64\x4c\x03\x1f\x11\x4b\x7f\xc9\xc3\x05\xcf\x5c\x4a\x03\x06\xa8\x33\x28\xf3\xfb\x36\x25\xd2\xbd\xaf\x9b\x36\xe0\xec\x72\xa5\x2d\x38\x02\xfe\xe2\x35\x38\x92\x64\x61\x18\x9c\xef\xca\x47\xbc\x16\xa0\x37\x3d\x5f\x0d\x49\x87\x53\xb4\x7d\x3d\x04\xa8\x19\x7d\xee\x2c\x95\xc9\x90\xe1\x10\xbb\x5d\x56\x77\x86\x5f\xba\xd0\x29\x8d\x1d\x84\x56\x23\x6f\x26\x8d\x3f\x1a\x1d\x81\x36\x31\x67\x80\xd3\x4a\x91\xfd\x25\x1f\xf5\xc0\x76\xfa\x47\x78\xb0\x0f\x7e\x56\xe4\xef\x4c\x01\x14\xcf\x42\x7f\x25\xce\x4a\x4c\xad\x42\x5d\x30\x9d\x4e\x61\xd2\x48\x5d\x71\x8f\x0d\x25\xa9\x75\xce\x6b\x9c\x7b\xfa\x30\xde\x33\x4a\x74\x77\xb4\xd3\xce\xd2\x4b\x78\x66\x61\x62\x54\xf0\x57\x33\x7b\xf7\x98\x57\x7a\x2d\x65\x18\x74\x18\x0b\x2f\xba\x60\xd8\xa6\xe5\xa9\x5f\xed\x99\x51\xe0\xf8\x14\x59\x5d\xec\x44\xf9\xde\x9a\xbe\xe5\xb4\xf0\xa4\x79\x35\x1c\x42\xa4\xce\x1b\xa7\xc4\x77\x11\x7c\x80\x6e\xf3\x55\x7a\xcc\x4b\xeb\x7b\xe2\xdd\xd7\x50\x9b\xf3\x52\x88\xe5\xec\xd1\xdc\x73\x04\x9f\x53\xfc\xf8\x2b\xf6\xa1\xf4\x72\x37\x65\xc0\x9c\xb9\x57\x0a\xf6\x90\x5c\x85\xde\xda\x91\x03\x9e\x5e\xed\xc7\x28\x0e\x51\x61\x3f\x88\xf7\x34\x2d\x63\xc6\x1b\xad\x24\xde\x96\xc7\x7e\x78\x9f\x0a\x59\x83\xc0\x93\x63\x93\xa1\xf6\x63\xf1\xd4\xd6\x79\x28\xfc\x2b\x28\x15\xa9\x78\x82\xd9\x6f\x34\xfe\xa5\xe0\x34\xfa\x4b\xd2\x0b\x01\x8d\x67\x9c\x9f\x1d\x9f\xec\xad\x9b\xea\x90\x0c\xa4\x1c\x40\xb3\xf7\x4a\x79\xb4\x10\x07\x08\xa4\xa5\xb0\xbf\xa0\xaa\xc4\xbe\x6f\x55\x08\xdb\x32\x17\xb2\x5d\xd2\x49\x24\xa4\x3e\x52\x33\x70\x54\xe9\x6b\xd4\xe0\x1f\x19\x98\xf7\xc3\x7d\xbc\xbf\x7d\x13\xc5\xe3\x6c\x4e\xc0\x3a\xc3\x02\x72\x35\x9d\xb7\x89\xab\xb9\x06\xc4\x73\x6d\x68\xd9\x1a\x3e\x3e\x54\xf3\xaf\xf3\xed\x86\x1b\xf0\x0a\x1b\x07\xa5\xb8\x43\xa9\x8a\x94\x07\x85\x1e\x00\x54\x0c\x15\x39\x68\x60\x18\x0a\x91\x45\x7a\x61\x85\xd5\x49\x05\x6d\xcc\x71\x26\x4c\xcd\x94\x0d\x5d\xcd\xe5\x42\x32\xd4\x74\x00\x7d\x59\xaf\x98\x0f\x8a\x13\x41\x32\x97\x4a\xa3\xd3\x96\x23\x07\xdb\x72\x48\x20\x3d\x0c\x0d\xce\x03\xe5\x17\x1e\xc4\x93\x39\x60\x20\xfe\xd4\x70\x44\x17\xb7\x25\x13\x99\x89\xde\x42\x9c\x09\xfa\x9d\xd3\xc4\x97\xd7\x72\xb7\x00\x0f\xa1\x2b\x58\x02\x05\x80\x4c\xf9\x08\x6c\x65\x0c\x33\xcb\x80\x7d\x1f\xf1\xa2\xd7\x76\x41\xa6\xca\x3b\x84\x54\xfe\x34\x13\xaf\x46\xac\xb4\x6c\x35\xeb\xe0\x19\x23\x56\xa9\xd5\x1b\xb5\x32\xfe\x15\x44\x09\x54\x2d\x18\xaf\xbc\x2a\xa3\xf4\xd7\xbf\x16\x9a\xfd\x3f\xfc\x06\x90\x7f\x53\x43\x10\x90\x10\x39\xac\x65\x8a\xa3\xed\x3b\x8a\x42\xe5\x48\x4c\xf1\xbe\x11\x88\x92\xeb\xf6\x41\x98\x6b\xdc\x97\x78\x21\xc3\xec\x38\x92\xbd\xab\x39\xff\xde\xee\x9f\xc8\x0e\xd8\x76\x2a\x3c\x40\x8f\x3c\x60\xf2\xa6\x9d\xd7\x1b\x22\x80\x1b\xc3\x5d\xc7\x31\x8d\x0a\x22\xa2\x26\x73\x4f\x0a\x85\x93\x26\xad\x01\x28\xba\x11\x6a\xf8\x94\x0d\x7d\x3f\x1c\x58\xbd\xf0\x80\x4c\x82\x84\xee\x1e\x66\x9f\x26\x75\x58\xad\x79\x1f\x34\x43\xc2\x99\x28\x60\x96\x2f\x8b\xda\x6d\xe0\x1a\xb3\x24\x50\x98\x1c\x40\xbf\x06\xbb\xa3\xb8\x62\x07\xcd\xe1\x29\x29\x1f\x1a\x68\x0e\xf1\x0e\xc7\x4a\x59\x02\x6a\x13\xf3\xdb\xf7\xff\x54\x03\xfc\x51\xed\xc8\x30\x65\x02\xbd\x7c\xc3\x99\x40\x3d\x25\xef\x0f\x02\x34\x17\xfe\xf0\x59\x55\xc6\x7d\xe0\xb4\xc9\xab\x85\x3e\x8f\x85\xf9\xc5\x7d\xd6\x54\xdc\x51\x96\xcb\x87\x1a\x99\x2e\x24\x88\x60\x57\xf3\x89\x99\x95\xa0\x6e\x01\x2f\xc0\x30\x26\x9c\xb2\x73\xda\xb2\x5b\x2c\xd7\x1a\x22\x99\x0b\x28\xc0\x3b\x16\x10\x30\x3b\x21\xcf\x8d\xcc\x76\x7d\x34\x95\xca\xa4\x6a\xde\xc9\xc5\x6e\x31\xdc\xa4\x12\x6d\xfc\xab\x49\x38\xfe\x89\x09\x2d\x67\x67\xe4\x2a\x61\x28\x15\x2e\xc1\x3b\x45\x89\x73\xf6\x66\x95\x54\x3a\x46\xc8\xc7\xfd\x41\x76\x6f\x80\x5c\x5f\xec\xe7\x68\x07\x87\x78\x14\xed\xb1\x2a\x6b\x87\xfc\x7f\xd1\xa5\x7a\x34\xec\x1d\xab\x2d\x83\xa7\x0d\x71\x78\xd7\x9a\xa0\xc6\xf3\x4e\xf0\xe1\x18\x5b\x62\xf0\x1c\x97\xc2\xb1\x20\x62\xa4\x83\xfb\x81\x38\x5f\x24\x76\x70\x44\xde\x90\x73\xf2\xf4\x2b\x7b\x4e\x46\xc4\x5d\xdf\x9f\xfe\x6d\x0f\x3e\x7f\xfc\x1b\xc7\x1b\x5e\x4c\x45\x17\x97\x30\xd7\x36\xe5\x1e\x9e\xf4\x3e\x3b\x2b\x0a\xcc\xaf\x1d\x90\x8a\x7e\x80\x8a\xc9\x9a\xbd\xcc\xa8\xc4\xd3\xc7\x3c\x70\xe9\x72\x01\x58\xc2\x01\x44\x74\xb3\x1e\x1b\x13\x21\xf7\x46\xf5\xda\xb4\x68\x0a\x9a\xad\x39\xb1\xe7\x5e\x82\xd6\x9d\xbc\x26\x72\x1d\x5e\xa4\x79\xb5\xf7\x3b\x09\xb1\x50\xcb\xe4\x7a\xbb\x1c\x51\xa9\xc8\x7d\x02\x3e\x85\x91\xc2\x50\x8f\x1e\x54\x16\xa8\x9c\x3a\xac\xcc\xc1\x9d\x34\xab\xa4\x0c\x6d\x9a\x17\x36\xf5\xdb\xaa\x6f\x8f\x99\x55\x42\x1f\x89\x43\x18\x92\xc5\x07\x1c\xba\x32\xb8\xb5\x3a\xe8\x01\x89\x03\x96\x02\xcb\x3d\x90\x9f\xfc\x70\x7c\x11\xb1\x9a\x73\x51\xf0\x97\x66\x3f\x40\x7f\xe4\xee\xb9\x52\xc8\xa7\xcc\xb6\xe9\x36\xb7\xec\xa5\x54\x7b\xba\x27\xe2\x46\x32\x91\x82\xca\x33\xeb\x34\x0b\xa2\x5e\xca\xc1\xce\x2c\x47\x86\x2c\xa9\x40\xb0\x3f\xb0\xb2\x30\x94\xa1\xcd\x73\x3c\x81\xc8\x28\xb6\xbb\x90\x08\x85\x55\xdb\x8c\x7d\xaf\x46\x7c\x73\x4e\x38\xa2\x8d\x93\x12\x28\xf9\x53\x49\x90\xb1\x3f\xbf\x26\x82\x7f\x6a\xc5\xd1\x7a\x7d\xa1\xd2\xae\xa6\x0e\x90\x23\x99\x30\x88\x8b\xf2\x8f\xb2\xc0\xcf\xb7\xfd\xe3\xff\xb3\x5c\x04\xbf\x73\xdd\x57\xfa\x84\x1c\x9f\xc4\xfe\x7e\x2f\xf5\x95\x56\x21\xf6\x04\xf8\x70\x7c\xc6\x19\xe6\xab\x98\xb5\xb9\xe8\x48\x68\x92\xa1\x3f\x0c\xfa\x29\x85\xbf\xe5\x22\x24\xe7\x28\x5f\xd0\x55\xa0\x62\x6c\xf9\xb0\x23\x26\x0e\x2b\x9f\xaa\x0c\x60\x0e\x6d\x19\x56\x89\x14\x17\x1f\x10\x00\xe0\xc3\xbe\x59\xc5\xc0\x4c\xed\x8a\x58\x5a\x69\xa3\xef\x9f\x5f\x92\x73\xfc\x8d\x7b\x6a\x2c\xac\x0c\xfc\x00\x33\xb8\x9d\x46\x26\xaf\x1a\x26\xf3\x97\x6a\xe4\xa6\x5a\xa8\x4d\xb1\xca\x6a\x60\xfe\x63\x2c\x45\x25\x6c\xc3\x6d\xef\xfb\x0b\x03\xf0\xf7\xc8\xdc\x15\xfa\x99\x0e\x0d\x92\xc1\xcb\x52\x97\x6b\x43\xd1\x9c\xcc\xfc\xe3\x0a\xbc\xc6\x83\x49\xec\x41\x49\x21\x87\x63\x31\xa1\xe5\x09\x1c\xf1\x69\x4a\x03\x79\xe8\x83\xfa\xe6\x25\xdd\x84\x5a\x9b\xfe\x66\xa4\xcd\xf4\x14\x50\x3b\xf9\x40\x0c\xff\x0d\x96\x1b\xcf\x87\x31\x21\x6e\x27\xf3\xc5\xc6\xb7\xb4\xa8\xff\x39\xa5\x71\xc5\xa2\x13\x69\xb7\xc0\xfe\x09\xe3\xee\x95\x6d\x01\xf7\x5f\xe8\x1b\xdd\x88\x6d\x63\x24\x01\x46\x28\xed\x6b\x2a\x2f\xf9\x1e\xd0\x42\x15\xf8\x7a\xd8\x6e\xb9\x70\x44\x4e\x6a\x08\x39\x85\x65\x64\xf0\xea\x24\x9a\x82\x8f\xf8\x40\xfb\x95\xde\xe1\xea\xc9\x11\xad\xff\x2a\x59\x38\xc2\x0f\x77\xe3\x75\x49\xa2\x22\xf4\x12\x4b\x05\x7f\xba\xc1\x79\xc5\xe0\xa5\xb5\x3c\xf8\x2b\xfd\xe3\xdc\xbc\x40\x00\x69\x75\x42\x37\x8a\xa3\x5a\x0b\x79\x4a\xe8\x70\xf8\x68\x81\x32\x5e\x80\x1c\x17\x35\x26\xc4\x32\xd9\xeb\x9c\xd7\x78\xea\xf2\x22\x9b\x61\xf0\xbd\x13\x50\xe0\xc9\x52\x55\x53\x00\xe4\x54\x5b\x80\x39\x79\x9c\x28\x65\xb1\x16\x8a\x44\x83\x27\x60\xe9\x53\xed\xec\x99\x07\x4d\xa0\x58\xda\x6a\x21\xfd\xc6\x70\xbf\x59\x34\x86\xe3\xa1\x49\x49\x8e\x95\x53\x5b\xe5\x32\xae\x5b\x69\x60\x34\x4f\x93\x93\x37\x2c\xc0\x23\x0a\xa3\x2e\x94\xee\x41\x3c\x59\xc1\x6b\xbd\x28\xea\x7c\xbe\x33\x00\xfe\x10\x01\x72\x99\xfa\xe4\xad\x97\x87\x9f\x77\x34\x3b\x0e\x8f\x32\xef\x98\x9d\x9c\x08\xa9\xbc\x6f\xa1\x30\x79\xfb\xa8\x73\x6c\x74\x66\x93\x58\xee\xcb\x8c\x84\xd0\xd4\x51\x33\x8b\xdb\xbf\x09\x74\x8f\x92\xec\xd2\x78\x4f\x8b\x50\xa7\xd0\xb1\xa1\x3b\xf3\x14\xfa\xc9\xe1\x64\xb8\xc5\xb5\x09\xb3\x37\xa1\xa0\x60\x27\x0b\x8b\x37\xed\x6e\x4c\x85\x62\xcd\xdd\x12\x02\x8d\xe6\x35\x0d\x62\x13\xf4\x1e\x57\x26\x8a\x27\x5f\x54\xc6\xb9\x20\xf2\x84\x00\xfc\xb9\xfb\xc5\xe7\x83\x29\x63\x77\xbe\xb9\xa4\xf4\x4a\xd7\xd2\x5d\xed\x98\x99\x64\xbe\x11\xb6\xc6\xb7\xb4\x26\x04\xcd\x49\x4a\x61\x80\x89\xf0\xac\x48\xcd\x92\xef\xac\xb3\xa1\x7b\xe0\xa0\xc1\xca\x8b\xcf\x02\xe6\x31\xe9\x3a\xec\x86\x29\xa5\x82\x47\x2a\x45\xf1\x7a\xf9\x7d\x7b\x5b\x08\x48\xaa\x4d\x3d\xd2\x4b\xf7\xc9\xc6\x37\x0e\xf9\x21\xbd\x1d\x8b\x8e\xe4\x28\x00\xa2\x42\x0b\x5c\xfa\x11\x9b\x51\x33\x99\x9c\x2d\xa3\x02\xeb\x4f\x27\x1b\xb3\xf9\x0c\x7a\x5a\x7c\x8b\xa3\x44\xfa\x1d\x42\xe0\x94\x00\x8b\x5a\x03\xb7\xb4\xd1\xdb\xb7\x0e\xa8\x40\x84\xba\xa8\x27\xb2\x2e\xce\x63\x1c\x7c\x0a\x37\xac\xe3\x25\x15\xee\x81\x5b\x7a\x0a\xca\xc8\xa9\x9c\xd8\x37\xcf\xd6\x2b\x0c\x33\x11\xef\x55\x25\x3a\x7e\xfe\xbc\xf9\x7f\x54\x4b\x65\x54\x8d\xf7\x02\x91\x6d\xd1\x2f\x6e\x56\xbe\x71\x09\x37\x56\x7d\x5e\x1d\x18\xb1\x26\xe1\x5f\xba\xcf\x4c\x10\x7b\x77\x09\xcf\x53\xff\x90\xbf\x43\x80\x93\x2f\xff\x46\xee\x1d\xc7\x82\xc8\xd4\x30\xd4\x15\x9a\xbe\x74\xfd\xba\x0a\xc1\x0c\x16\xff\x9b\xaf\x1f\xff\x86\x1e\x63\x63\xb3\xd9\x74\xb5\x69\x64\x44\x50\x07\x3d\x3e\x83\xb9\xd9\x8c\x39\xa9\xea\xd6\x18\x3a\x52\x1f\x65\xce\x24\x1c\x34\x56\xcc\x51\x63\x70\xa8\x6c\x3f\xcc\x83\x46\xf7\xc1\x35\xec\xf7\x9e\x07\x2a\x34\xa9\xd5\xd8\x1b\x93\x25\x10\x70\x3c\x50\x54\x83\x8d\xcb\xf9\xa9\x5e\x25\x07\x68\x36\x1c\x06\x07\xfc\x8c\x63\x74\xd4\x71\x37\x8a\x77\xf0\xc0\xbc\x06\x56\xd6\x8c\x17\xae\xa2\xb6\x33\x51\xef\x82\xa6\x7b\xbc\x06\x61\x74\x80\x26\x51\x68\xe6\xb1\xdd\x4a\x82\x72\xbc\xbd\xc3\x3b\xc5\x8c\xdf\x9a\x3b\x40\x37\xc4\xc7\x56\xac\x65\x34\x1b\x51\xe5\x6e\x0d\xe9\xe8\xfe\x87\x86\xef\x52\xe6\xe8\xed\x1b\xec\x15\xc6\x51\x95\xa1\x7a\xde\x7e\x48\xa0\xc9\xe0\xd8\x9a\x49\x55\xeb\x8b\x5c\x05\x81\x4d\x9d\x4c\x8c\xf8\xcd\xf3\xee\xd4\xd6\x38\x72\x49\x30\xe6\xd1\xd9\x90\xee\x74\x1f\x3c\x67\x88\xc4\xb6\x0f\x29\x45\xf9\x4f\x59\xf4\x8d\x07\xb2\x0e\x8b\xda\x72\xd5\xd4\xe9\x9a\xcb\x8c\x3c\xb0\x8e\x4e\xc6\x8b\x85\x72\xd0\x08\xbd\x89\x56\x31\x3f\xf3\xcc\x42\x65\x71\x8c\x9d\x1b\xb7\xb6\xc4\x66\x76\x05\xd0\x03\x5f\xbf\xc8\xce\x7f\x3b\x41\x05\x10\xfc\xb7\xe5\x98\xbe\x7b\x40\x0e\xdf\x3f\x8f\x1f\x44\x51\x48\xdb\xbb\xf6\xe4\x9f\x9d\x92\x32\xa4\xe6\x20\x6b\xe2\x29\x58\x7e\x57\x54\xd9\x9d\x1a\x16\x8e\xf0\xc9\xce\xe9\xc0\x62\xd2\xc9\x01\x06\xc8\x87\x05\xed\xc1\x49\x70\x99\x35\xf8\x25\xe2\x81\x50\x03\x66\x2c\x80\x04\xe7\x43\x4d\xb5\x6f\xd3\xb5\xac\x19\xc7\xc4\x38\x40\x46\xfd\x45\x0e\xfb\x67\x10\x18\x27\xe0\x61\xcd\x2f\xa0\x6b\xa0\x41\xea\xd5\xff\x14\x9a\x16\x62\x67\xa4\xb3\x4a\x70\x3b\x05\x6f\xf1\x40\x48\xf1\x9f\xbc\xd6\xb2\x13\x80\x53\xef\x6d\x98\xe3\x8b\xa0\x9f\x70\x2d\x53\x0f\x79\xc7\x09\x27\xbd\x1d\xb5\xb4\xa9\x95\xa2\x3f\x0a\xed\x5b\x6f\x2e\x44\xaf\x0c\x98\x1b\x6e\x3c\xeb\x50\xb1\xed\x32\x91\x38\x0d\xf5\x69\xfb\x41\x6b\xdd\x69\x2c\x93\x4b\x3a\x93\x35\xcf\xf0\x8f\x2c\x49\x98\xef\x0d\x17\xf7\xed\xed\x0d\x49\x4f\x0c\x4b\x81\xd0\xc6\x65\xa6\xd0\xac\x23\x3d\x69\x53\xae\xb7\x42\xd5\x9c\xcc\x33\x21\x57\x7b\xee\xe5\xa4\xd6\x59\x63\x03\x4c\xc8\xd8\x29\x83\x70\xde\x4f\xc5\xe1\x8d\x85\x0c\x0b\x59\x70\x6e\x30\xd2\x1d\xea\x33\xc8\x59\x9a\x9e\x41\x2e\xeb\x95\xeb\x82\x90\xcf\xd7\xfb\xf3\x1d\x85\xb9\x53\x20\x2b\x1d\x99\xae\x58\x23\xf4\x34\xe3\x11\xfb\x3e\x09\xdb\xcd\xa8\xb3\x5d\x5e\x2c\xd9\xb6\xdb\x34\xb9\xd9\xe2\x14\x46\x4b\x79\xe5\x87\xce\x4b\x7e\xd2\x32\x2c\xe9\x6a\x07\x94\x51\xe4\x28\x1e\x06\xc5\xf7\x15\xdc\xd6\xc8\x9a\xa2\x89\x86\x2a\x44\x16\x7c\x88\x5e\xaf\x49\x4d\x93\x48\x30\xa2\x16\x41\xfb\x33\x33\xcc\xc0\x89\xb4\x21\xd2\x6d\xab\x5f\xac\x1c\x35\xe8\x78\xfd\x56\xd9\xf4\x1e\xbb\xee\x35\xde\x69\x11\x15\x98\x7b\x61\x88\x2a\x9d\x06\x2e\x4f\x48\x18\xf8\xa8\x5f\xca\xd8\x33\xef\x4f\xf8\x29\xc0\x32\xfe\x62\x79\x31\xc6\x0c\x39\x7a\xf8\x31\x05\x05\x73\x87\xdd\xf6\xae\x65\x66\xe0\x23\x81\xee\x68\xf3\x67\xa2\x6a\x20\xff\xbb\xcf\x18\xea\x59\x1c\x01\x90\x0a\x92\xb9\x3c\x44\xab\x34\x38\x20\x76\xd1\x66\x2b\x3c\x61\xf3\x56\x55\x1c\x30\x6c\xea\x9c\xd4\xb3\xa9\x9a\xbe\xd7\xfd\x74\xce\xe3\xc4\xd4\x8d\xeb\x54\x26\xde\x92\x50\x7b\x7e\x68\xf3\x09\x14\x35\xde\xe7\x4b\xea\xd1\x9c\x47\x91\xe7\xfb\x79\x2c\x6d\x11\x8e\x3d\x8f\xcc\x8a\xfa\xe0\x4f\x46\xf8\x4e\x3f\x8a\xbc\x9a\x7f\xd1\x38\x3c\x38\xee\x2d\x5f\x4c\x5c\x81\x0a\xce\x1a\x33\xb8\x7b\xbe\x90\x66\xbb\x61\x37\x8b\x17\x52\xcc\xcc\xb0\x4c\x38\x31\x16\x8b\xa1\x0c\x84\xb4\xa0\x18\x83\xae\xb1\x3b\x04\x0c\x8f\xa8\xf1\x2d\x44\x44\x28\x3a\x77\x8b\x2e\x3a\x20\x8c\x81\xdf\x68\x61\x82\x48\xe5\x39\x1c\x09\x15\x84\xdc\x25\xf1\x52\xa0\xb0\xe2\xcf\xbd\xfd\xb0\xaf\x72\x1f\x7c\x4f\x3f\x8e\xa5\xe0\xe2\x55\x2c\x22\x49\xa4\x48\xdd\x03\x64\xd7\x34\x28\xa9\xd4\x67\xde\x4d\x00\x9e\x38\x33\xba\x28\x27\xc8\xfc\xb3\x78\x47\x2d\xac\x84\x45\x8a\xfc\xa7\xc7\x95\xfa\x2e\xa9\xde\x95\x46\xb1\xd3\x45\x1d\xe8\x98\xa7\x96\xd5\x85\x1d\xa7\x1f\xa8\x55\x5a\x7c\x53\x08\xda\x58\x04\xfe\x40\xd0\xe7\xfb\xc3\x87\x64\x55\x42\x8d\x93\x3e\xe7\xb4\x6f\x75\x16\xdd\xeb\xaa\xca\x6f\x7a\x30\xc9\x69\x67\x13\x1a\x33\x0b\x98\xe1\x7e\x3c\x75\x74\x49\x32\xec\x2d\xc4\x7b\xda\x37\xf3\x50\x2a\xb4\x29\xd6\x60\x59\xbc\x9a\x36\x8c\x64\xce\xdb\xb2\x9a\x6f\x37\xcf\x04\x54\x6c\x6e\x13\xd6\x07\xf7\xe1\xe4\x2a\x33\x73\x3e\xb5\x23\x9a\xfc\x57\x7d\xde\x0a\x8f\xe8\xe6\x94\xb7\xd8\xec\xf5\xc2\xd1\xd1\x76\x10\x35\x9b\x21\x5f\xe8\xc5\xc5\x45\xb3\x1a\xb6\x45\xf8\xd2\xa5\x55\xf4\x71\xc9\x1a\x0d\x34\xe6\xe2\x6a\x30\x48\xbd\xfe\xa5\x1b\xc4\xc9\xe9\x9b\xfb\x37\xd7\xd0\xab\x18\x17\xc2\x87\xc1\x51\x82\x03\xed\xdc\x1d\xa4\xed\x76\x39\x11\x0e\x4b\xb8\xaf\xf7\x6f\xff\xae\x50\x51\x7e\xbc\x1a\x8c\x38\x89\xcb\x8d\xb4\x5a\x03\x1a\xa6\xfc\x06\x50\x83\x33\x8f\x6e\xb2\x79\xae\x44\xca\x86\xea\xbf\x79\xb5\xbe\x8f\xa5\x8d\xbc\xf7\xe2\x05\xb7\x3c\x10\x88\xdd\x84\xa1\x63\xa7\xad\x9d\xdc\xd2\x9d\x70\x1a\x5e\x61\x9b\x45\xa1\x33\xb3\xe2\xcb\xa6\x2d\x63\x06\xdc\x11\x6e\x1a\x8d\xb2\x5f\x8f\x91\x7a\xd6\xb1\xd7\x75\xbe\xb9\x0d\x22\x6c\x51\x90\xdf\x51\x6a\xc2\x93\xa2\x60\x58\xbe\xd6\x13\x3b\x4e\x1a\x4d\x2a\xf5\xb1\x1f\xd8\x49\x37\x6e\xe4\x7b\x00\x07\x17\xf2\xaa\x51\x33\x85\x1b\x26\xee\xba\x7e\xbb\x69\x6e\x52\x21\x7b\xae\x3d\xf6\xc4\xee\x68\x9f\xfd\x3c\x01\x62\xc3\x62\x92\x4f\x7e\xe5\x91\xba\x58\x80\x47\x0f\x78\xaa\x99\x21\x8a\x37\xb5\x51\x5f\x3d\x65\x88\xd6\x04\xf8\xf0\xac\x96\xfe\xb2\xd1\x7d\xb9\xc4\x42\x7f\x95\x5b\x67\x77\xac\x90\xbd\x23\x21\x82\xab\xb5\x5c\x97\x19\x95\x65\xbc\x0d\xed\xb5\x77\x3d\xb2\x89\x08\x85\x0f\x76\xea\xf4\xda\xe9\x73\x8e\x9a\x7a\x92\xda\x32\x8d\xe4\xc4\x53\x7d\x38\xbe\x7d\x21\x77\xe1\x59\x1f\x9e\xdf\xc8\xe6\x45\xef\x0f\x58\x90\xaf\x73\xba\xf9\xb5\x52\x55\x10\x56\x16\x58\x26\x3e\xf0\xbe\x04\x24\x7e\xbf\x3e\x3f\x35\xae\x1c\x5c\x39\xd8\x6a\xe7\xc1\xd6\x70\x53\xd3\x06\x2c\x43\x3a\xcd\x83\x6c\x1d\xd8\xc4\xb8\x65\x16\x05\xab\xa6\x52\x86\x78\x74\x66\x72\x35\xa2\xc5\x79\xd6\x98\xac\x18\x25\xc3\x8d\xda\x59\xca\x90\x8b\xd9\xe7\x34\x96\x30\x6d\x64\x7f\x2e\xa8\xba\xde\x21\x2e\xca\x0e\xd9\x7e\x0a\x30\xb7\x14\x0d\x6a\xfe\x76\x14\x9f\x86\x3b\x9c\x50\xf7\xed\xc8\xe4\xd5\xef\xd7\xbb\x46\xde\x34\x91\x32\xd8\xa4\x85\x30\x4f\xaf\x95\x90\xca\x15\xac\xf0\xd7\x44\x31\xd9\x56\x72\xc7\x08\xc8\x1b\x07\x33\x4d\xdf\x90\x8b\x42\xe2\xea\x4d\xc7\xb4\x4e\xce\xf9\xa5\x82\xc9\x83\xc6\x15\xad\x2a\xd8\xaf\xc0\x96\x98\x73\xb8\xc4\x33\xdb\x85\x4d\x42\x3e\xf8\x03\xf5\x74\x02\x55\xdd\x74\x9f\x03\x69\xea\xe3\x20\x12\xb1\xd5\x7c\x3e\x06\xb1\xea\x45\x61\xd0\x56\x9a\x27\xdc\x7f\x25\xd1\x4a\x57\xf4\xdd\x18\x54\x51\x77\xe6\x21\x82\xc1\x2d\x0a\x68\xd7\x7d\x6b\x2b\x4e\x85\x2f\x39\xc5\x34\x9e\xd1\x75\xcc\xfa\x32\x6f\xc3\x79\x58\x88\x78\xd8\xcc\x79\x23\x41\x80\x79\x6c\x0d\x16\xf5\xc0\x66\x8f\xc3\x1b\x3a\x6a\x1c\x1c\xac\x83\x1e\x9e\xeb\xbd\x65\x0b\xcb\xc2\x03\x15\xc4\x1f\xe6\x52\xc6\x8a\xa3\x9a\x0f\xbf\x7f\x70\xeb\xde\x75\x12\x58\xac\xb7\x73\x42\xa8\x83\x63\x18\x45\x34\xee\xc5\x4c\xa2\xfc\xcb\x6e\x7b\xee\x31\x11\x56\xec\x98\x44\xa0\xae\x93\x85\x8a\x78\x44\x02\xd7\x40\xb7\xdd\x2d\x2f\xd9\xa2\xc3\x8d\xf3\x60\xb6\xe5\x35\x7f\xab\xb1\xc0\x85\x40\x17\x67\x0e\x25\xf0\xce\xb3\x41\xa3\xb2\xf9\x6a\x43\xce\xb9\x64\xe7\x45\xae\x6e\xce\x48\x1e\x68\x7a\x23\x66\x65\x16\x1c\xb2\xf8\x14\x31\x73\x53\xcd\x69\xde\xe2\x7f\x5b\xe9\x96\x9f\x4e\x1a\xd4\x1b\x06\x71\xe3\x79\xcf\xd8\x46\xb9\xa8\x6b\x65\xd3\x3c\xcf\xc0\x74\xa4\x8f\x9a\x44\x25\xc6\x79\x0e\x68\x67\x92\x0f\x67\xc3\xf8\xb6\xd4\xa9\x49\xca\x45\x05\xbe\x7b\x0d\xa5\xdb\xea\xa9\x77\xa6\xd8\x7c\xdc\x2a\x6b\xdc\x00\xf4\xf9\x1b\x3f\x3c\xc8\x83\x6e\x7e\x0c\xee\x38\x23\xca\xdc\x27\x1d\xd7\x4d\x95\x6b\xf7\x57\xa8\xc2\xdf\xd3\xfc\xfd\x75\x81\xb3\xe8\xa0\x25\x16\x0f\x86\x6e\x81\xbc\x6c\xde\x89\xe8\x32\xb9\x25\x55\x2d\x21\x60\x15\xcc\x4a\x2f\xe8\x78\xd2\xa4\x23\x4f\x58\x9f\xf7\x50\x1e\xd2\x96\x3b\xf9\x93\x90\x75\xed\xc4\x05\xf4\xca\x8f\x05\xa4\xee\xa3\x1c\x0e\xf0\xe4\xed\xb8\x73\x2a\x60\x71\x4c\x2a\x32\x8e\x51\x53\x7a\xc7\x3b\xe1\xab\x40\x17\xe2\xc1\x2c\x7a\xbc\xa5\x2d\xa5\xda\xec\xcc\xd7\xd8\xf8\xef\x6f\xf4\x0d\x7c\xfc\x52\x65\x9a\x67\x32\x15\x5a\x25\x31\x87\xf8\xfc\x1d\xa6\xc4\x4e\xa5\xc1\xff\xe4\x2a\xf2\xc5\x42\x4a\x45\x64\x9a\x6c\x54\xf3\xf5\x48\xc2\x4c\x32\x45\x16\x27\x45\x29\x9b\xf6\xac\x17\x12\xc9\x43\x68\x7b\x1c\xb9\x3a\xbf\xbf\x85\x25\x3c\xd4\x8d\x3a\x7b\x1c\x93\x26\x9e\xc1\x17\xe1\xb8\x85\xa2\x9b\x32\xd9\x37\x91\x7b\x0f\xb9\x9b\x42\xd1\x46\x15\x33\xb5\x67\x08\xed\xc5\xf9\xa8\x58\x7a\x06\x15\xf1\x42\x6d\xc4\xa8\x6f\xb4\x0f\x7f\xaa\xa3\x27\x8f\x54\xb7\x8e\xe3\xd1\x24\x58\x65\x94\x8e\x1c\x06\xc9\x12\xdf\xab\x2e\x0c\x60\x0b\xcc\x28\xa2\x0b\x09\x20\xb1\x1e\x5b\x2c\x8c\xbd\xa7\xb2\xb4\xab\xf7\xe0\x90\x13\xcd\xe4\x81\x7d\xa7\x28\x0b\x12\xf1\x38\xce\x7e\xf4\x20\x3d\xa3\x5a\xf9\x36\xf3\xeb\x09\x53\x8e\x27\x96\x7c\xcd\xd8\xb5\x98\x05\x84\x47\x51\xb4\x07\x9d\xda\xc1\x0a\x35\xaa\xa4\xcf\x14\x94\x48\xb3\x0e\xb8\xf4\x03\x41\x6a\xa6\xa6\x50\xf8\x38\x32\x19\x1d\xea\xd7\xac\xff\xb0\xd4\xa1\xcd\x32\x82\xdc\xcd\xaf\x0f\xff\xae\xe4\xbd\x6a\xa2\x97\xcf\xbe\xa7\x3c\xbc\xba\x2d\xfc\xc4\xf8\x90\xe3\x8a\x60\x8e\x95\xdb\x5f\x7a\x02\xc0\x47\x0b\xed\xa2\x0c\x83\x3b\xad\x1a\xe9\xa3\x99\x6a\xb9\x5e\xcb\xa4\x34\x27\x1c\xc1\xdd\x7b\x64\xcf\x2c\x58\x48\xea\xbe\xf7\xa1\xa8\x13\x1b\xcd\x1b\x1f\x06\x0b\x5f\xb5\x31\x97\x98\xc4\x2c\x8d\x29\x2a\xc0\x5c\xea\x5c\x12\xb5\xbd\xf9\xc3\x24\x40\xf7\x86\x74\xfc\x15\xc6\x55\xa1\xee\x11\x2f\x3e\x59\xa6\xa2\x9d\x62\xcf\x53\x94\x8c\xdf\xc2\xa6\x1e\xf2\x9b\x85\x9e\x2c\x45\x1f\xa8\xab\x0f\xcc\x64\xf8\x98\x62\x8d\x2a\xae\x53\x60\xf0\x5a\x97\xf1\xa1\xde\xa1\xbc\x33\x46\x77\x16\x07\x9e\x3b\xb4\x57\xc2\xf1\x79\x64\x51\x26\x3e\x5c\x51\x45\x70\xe1\xaa\x83\x99\x19\xfe\x7d\x4e\x48\x7c\xae\xae\x21\x99\x2d\xf3\x2c\xd4\x85\xe9\xa2\xd5\x39\xc8\xd8\x4f\x36\x62\x04\x11\x6a\xcd\x0e\x9f\x15\x52\x72\x16\x60\x1d\x54\xa9\xb4\x89\x03\xdb\x2a\x9c\x4c\x93\xce\x94\x7d\x1a\xb3\x99\x79\xdc\x59\x75\x56\x2f\xc0\xd9\xc7\xb1\x31\x2f\x76\x4f\x63\xf9\x89\x27\xbc\x7d\x95\xb0\x1e\xbf\x7e\x22\xae\x0a\xe4\xd7\xa4\xec\xed\x1d\xa2\xf5\xc6\xd9\xd7\x47\xba\xcd\x47\x98\x45\x14\xab\xd9\x9e\xf8\x1a\xd8\xee\x61\x10\xe7\x05\x96\x81\x79\x85\xf3\x8c\x59\x0d\x2f\x06\x21\xa4\xb7\x90\xb8\xcb\x54\x37\x99\x3a\xd6\x7c\x16\xe2\x75\x3f\xbe\x99\x6c\x7e\xcd\x25\x01\x8b\x2b\xb3\xa9\x4b\x21\x0b\x75\x49\x2d\xf5\x07\xb8\x63\x1d\xd9\x16\xb5\x59\x8b\x73\x6b\x91\x3e\xd3\xbc\xaf\x9d\x18\x0a\x0b\xb9\xba\x02\x97\xcb\x24\x73\x6d\x85\x3f\x6d\xc9\x11\xa5\x94\x11\x3a\xec\xc1\x8d\x22\x4c\xe4\x89\x5e\x37\x66\x68\xa3\x90\x3b\x21\x13\x81\x44\xc1\x2e\x4e\xd3\xb1\xb0\xdc\xd5\x3e\x6b\x9a\xf0\xcf\xe1\xd1\x08\x72\xa4\x21\x49\x71\xb2\x7b\x68\x8a\x38\x96\x7e\x25\x73\x8f\x7c\xdf\x8e\xef\x2f\x76\xca\x5a\x73\xa1\x51\x4f\x82\x1e\x32\xc3\x45\xab\xfb\xb4\xd8\xfa\xcc\x73\x05\xc2\x21\x38\x96\x2c\x3b\xe0\x91\x43\x6d\x5a\xa2\xb3\x1d\x01\x4a\x8a\x48\x0d\x30\xc4\x7a\x0c\x65\x50\xb7\x89\xd7\xdf\x00\x48\xe6\xc6\x4d\xe1\x68\x16\xb9\xa9\xf9\x53\x6c\x36\xa6\x5c\x3d\xce\x45\x8f\xb3\xbd\x89\x80\xe7\x18\xa0\xb2\x52\xb6\x54\x36\x31\x07\xd6\xd6\x7a\x62\x88\xcd\xc8\x6a\x5e\x18\x54\x3a\xc7\x35\x24\xf2\xfb\xeb\x9b\x8e\xbb\xa0\x8c\xbe\xc5\x0a\xbf\x1c\xab\x67\x2f\x07\x3e\xc1\xb7\xf1\x20\xb7\xdc\x82\xa2\x6b\xe0\x0c\xc2\x39\x36\x99\xf3\x6f\x54\x9f\x73\xc2\x5a\x21\x0e\x9c\x04\x0c\x92\x61\x87\x74\xdb\x01\x21\xef\x9c\x8a\x06\x1b\x6e\x7e\x73\x26\x92\xc0\xd6\x03\x0b\x82\x24\x2f\x64\xa1\x77\x40\x3f\x9e\xb2\x78\x81\x01\x60\x9b\x56\xf5\xf2\xb9\x7e\x13\x96\xc9\xd4\x14\x9d\xda\x19\xdd\x62\x22\xbe\x1e\x92\x26\x60\x5e\x35\xec\x96\x38\xd6\x32\xdc\xaa\x4c\xfc\x89\x05\x6f\xd2\xdc\xf2\x8e\x7e\xe4\xe0\xc3\x86\x88\xf0\xcc\x85\xe1\x38\xfa\x78\x40\xfe\x9d\x37\xe1\xad\x0c\xff\x62\xeb\x63\x73\x2b\x06\xe2\x0c\xc5\xf3\xa5\xd0\x08\xe4\x55\x84\xbb\x2a\x83\x0b\x23\x46\xa9\x82\x13\xfb\xfb\xfd\xa3\x09\x93\x47\x22\x48\x39\xbd\x39\x15\x08\x7f\x61\x66\xbb\xa4\x9a\x5c\xf0\x0e\xea\xd7\x0c\xb4\x78\xa7\xe1\x9f\x87\xc4\x49\x32\x2f\x22\x6e\x74\x21\xe2\x75\x73\xe9\x28\x01\xcf\x07\x1d\xac\xcd\x1b\x5b\x39\xc9\xd6\xd1\xc5\x5a\x8e\xe8\xe4\x46\x6b\x94\x20\x11\x03\x77\x76\x86\x56\x9a\xbb\x67\x1b\x96\xfb\x37\x74\x51\xa3\x39\xb1\x57\xd0\xbb\x43\x03\x11\x0f\xc3\x89\x69\xa6\x54\xb4\x3f\x6e\xed\xb4\x2d\xde\x9b\x08\xb5\xda\x79\x98\x44\x02\x63\xcf\xa6\xdf\xb0\xe1\xe0\xd6\xf6\x57\xf8\xe4\x07\x52\xce\x04\x60\xc0\x9c\x4c\x34\xd4\x82\xe5\x3b\x88\xc6\x65\xa8\xc5\xd9\xee\xcc\x9d\x61\x2e\xde\xa4\x00\x0b\x81\x94\x8e\x2a\xd0\xe2\x03\xd9\x47\x21\xe3\x2c\xb0\x92\x8f\xdc\x66\x44\x2f\xde\x9a\x2a\x67\xa9\x2d\x90\x3f\xc0\x06\xe0\x41\x16\x38\xa4\xcf\x9e\xce\x1a\x6d\xde\xa5\x06\xae\xad\x3a\x3c\xb7\x1b\x29\x15\xf2\xb5\xb4\xff\x35\x5e\x9c\x8b\xc4\x0e\x5c\x4d\x40\x08\xea\x65\x0b\x97\x8a\xa6\xa5\x03\x14\xc8\xac\x7f\x48\xb8\xfb\xbc\x3b\xe6\x01\xc4\x74\x61\xfe\xd6\x8b\x0f\x72\xbb\x30\x34\xdc\x55\x3a\xe9\x73\x67\xea\x4b\x94\x99\x48\x40\x56\x68\x14\x68\x81\x07\x8a\x5d\x07\xae\xcc\xea\x7f\xca\xa8\xfb\xaf\xaa\x00\x4d\x60\x77\x6f\x61\xc6\xb7\x3f\x8c\x0a\x69\xc8\x8e\x8d\xf2\xff\x35\xd5\x0b\x6b\x3f\xb5\x08\x42\x4c\x62\xb6\xbe\x0d\x0f\x3f\x09\xaf\xbc\x20\xe6\x61\xa9\x87\x60\xaf\x9d\x38\x6d\x92\x64\xd6\x6a\x33\x59\x44\x5c\x80\x01\xc0\x6f\x7a\xce\x9b\xce\xb6\xbf\xa7\xb1\x94\x98\x3d\x0e\xe5\x36\x80\x7f\x00\x2e\x7e\xf4\x11\xb7\x84\x0a\x39\xd4\xb7\x4e\x6c\x94\xdd\xd6\x3d\x4b\x7a\xa7\x2c\x89\x55\xc0\xed\x69\xe0\x8d\xae\xdb\xa8\xc4\x9a\x0b\xb1\x9c\xe0\xf3\xfe\x4a\x5a\xc7\x61\xe1\xfc\x74\x54\x13\xe5\xf1\xd3\xa7\x42\x96\x02\x7a\xc3\x33\xc2\x2f\x12\xc7\xe9\x99\xf9\x9c\xed\xc9\xc4\x47\xdb\x23\x33\x31\x87\x61\x7c\x2e\xf9\x98\xa7\x01\x8d\xe9\x4a\xb5\xd1\x04\x48\x75\x2a\x9b\x6b\xaf\xf9\x78\x26\xb2\x85\xb6\xb5\x2b\x61\xd7\xb2\x4f\xc2\x09\xba\x8a\xe3\x38\x09\xdb\x6d\xaa\x46\xe7\x4b\x11\x67\x4a\x16\x78\x2a\x94\xea\xa0\x9d\xec\xd2\x33\x1b\x7c\x3e\x2e\x74\xa3\x05\xc2\x93\x26\x50\xe6\xf6\xa1\x31\x8b\x18\x72\x36\x88\xa5\x34\x4d\x85\xdf\xc7\xb5\xbe\x10\xfc\x26\x2c\x70\x38\xc4\xa1\xe5\xbd\xd4\xe2\x54\x64\x15\xea\x12\xd8\xab\xee\x6e\xbe\xba\xc8\x46\x76\x33\x11\xc4\x02\x39\x4a\x77\xc8\x3e\x32\x0e\x34\x9d\x30\xc3\xd0\xc0\xd7\xfc\x08\x82\x05\x39\xac\xa6\x62\xbe\xf1\xcc\xea\xaf\x73\xb9\xd2\xc3\x67\xdf\x0d\x9d\x39\x48\xa1\x66\x99\xba\xa5\xfd\x55\x4b\x10\x24\xeb\x61\x1f\x2a\xfa\xfd\x57\x81\xeb\xfd\xdd\xb9\x9e\x2b\xd4\x95\xb7\x07\x1e\xf8\x1c\x05\x56\x9a\x47\x95\x9c\x9d\xa0\x5c\x3e\x9b\x37\xb5\xd4\x64\x9b\xa6\x61\x5b\x7d\x49\xe8\x4c\x0f\x9a\x74\x36\xf7\x09\xdd\x62\xd5\x1f\x9e\xdc\xdf\x18\x88\x79\xda\xe4\xcc\x88\x82\xfd\x30\x6c\xdc\x8d\x3e\x47\x00\x6e\xf6\x10\x6e\xa2\x0d\xcb\x32\x40\x68\x4e\x62\x06\x29\x5b\xe0\x71\xa0\x04\xfa\x46\xc2\x43\xf3\x96\x19\x61\x2e\x9d\x7d\x47\x92\x79\x4d\xc5\x40\x81\x7b\x59\x58\x79\x87\xb2\x92\x94\xad\x7e\xc4\xfa\xa1\x4c\x77\xa1\x28\x6f\xc2\xc8\x5e\x24\x9f\xff\x47\x78\x88\xc5\xbb\x9c\x86\x71\x0a\x57\xef\x23\x8a\xa0\xae\x72\xb4\x1c\x98\x32\x3a\x13\xd7\x86\x3c\x66\xa7\x65\xa7\x8e\xf6\x11\x22\xe6\xaa\xc1\xd8\x7a\xa1\x58\xd3\xdf\x7d\x4a\x18\x51\x85\x6e\x6e\x13\x71\xc6\x3a\x47\x85\xc2\x0e\x9c\xc2\xfb\xc8\x71\x5a\xca\xae\x62\xc9\xec\x22\x68\xa5\x4c\x39\x2f\x91\x31\x85\xc9\x97\xe7\x16\x7e\x3f\x0f\xdf\xe8\xf0\x0d\x4d\xbf\x89\x2a\x87\xa1\x29\x30\x60\xae\x34\x1b\x2a\xdd\x45\x5d\xc2\x1e\x95\xf5\x4c\xfd\x3b\x69\x98\xd8\xdf\x5b\x8e\x23\x9c\xd2\xc8\x6e\xa9\xfa\x95\xae\xeb\xe3\x56\x78\xac\x9d\x6c\x89\xe7\xb2\xff\x8b\x32\xfb\xdd\x0e\x29\x8b\x35\x6e\xdf\xf6\x0d\x99\x9d\x4b\x54\x92\xd4\x84\xbb\x0c\xa9\xbb\x75\x3f\xf1\xfd\x76\x76\xc3\x9b\x5c\xd7\xd6\x00\x04\xa6\xe9\xaa\x5e\x95\x5f\x95\x33\xd5\x36\x8d\xb8\x44\x3d\xd1\xa5\x29\xbf\x8e\xd3\x39\x55\xaf\x9c\x5b\x85\x36\xf1\xa7\xc4\xfa\xa2\x5a\xf5\x16\x12\x7d\x70\x53\xbb\x83\xda\x75\xfb\x50\x68\x0a\xc7\x62\xf0\x87\x7d\xe1\xec\xc4\x7f\x7b\x0c\xc2\x54\xd0\x3c\x00\xca\x57\x40\xee\xf9\xa2\xee\x7a\x35\xd1\x9a\x60\xca\xc4\x33\xb5\xfb\x09\x7d\xe1\x51\xc1\xc0\xb4\xc1\xdd\x3f\xda\x96\xd8\xc3\x55\x6c\xe4\xc6\xb3\x6d\x3b\x47\x5c\x86\x19\x7f\x56\xf5\xde\x89\xd2\x64\x84\x56\x97\x91\x74\x01\x53\xdb\xe0\x02\x2c\x0f\xa1\x3d\x3f\xbf\xd1\x95\x50\x79\x22\xe4\x83\xa0\x5e\x9f\x1d\xb0\xbc\x4a\x6d\xff\xed\x4d\x87\x27\x09\x0b\xca\xc2\xed\x7a\xe3\x2a\xba\x10\xb2\x61\xbd\x0c\x81\x6e\xd9\x77\x66\x72\xa8\x54\xcf\xf4\x18\xe7\x9e\x41\xba\x98\xd6\x90\x83\xa3\xce\x0b\xa3\xb8\x7b\x8b\x17\xe8\x6f\xb3\xa9\x52\xce\x99\x9a\x76\x80\x34\x52\xb4\xd9\xe3\x72\x65\x9e\x4e\x9c\xde\x93\xb7\x37\x20\xf5\x33\xc5\x5d\x40\xae\xda\x19\xc0\x68\xcb\x4f\x18\x4b\xeb\xe3\xd1\x05\xfe\xf3\x05\x75\x0b\xd1\x3f\xe8\xda\xfa\x8c\xe2\x0b\x11\x70\x68\x12\x11\x3a\x74\x8b\x6c\x54\xf3\x3e\x07\xc4\x82\xf6\x27\xfe\xaf\x42\x33\xda\xe1\xc8\x2a\x9c\xe7\xe0\x14\x1c\x99\x0c\x9d\x88\x97\x7f\x04\xf3\x55\x69\x9f\x97\x44\xb1\xd8\x42\x1d\x56\xb5\x3f\xcd\xc0\x18\xbc\xff\xf8\x77\x05\x8a\x5b\xf1\x08\xc6\x29\x36\xa4\x71\xda\xc5\x99\x60\x46\xc4\x27\xc5\xe0\xb4\x86\xad\x3f\x11\x8c\x0e\xa6\x64\x19\x63\x3b\x46\x3d\x61\x54\x1b\x8b\xda\xa3\x58\xc9\x46\x69\xdc\xd1\xbc\x33\x35\x08\xed\xe6\x4c\x70\xd2\x92\xaa\x77\x4e\x33\x12\x45\x1e\x2b\x15\xe7\xd0\x2b\x66\xea\x9c\x72\xbc\xfa\x9f\x32\xe6\x1e\x11\xec\xb0\x65\xce\xc0\xa8\x31\xca\xbd\x02\x55\xda\x2d\xcd\xcc\xa2\xec\x7d\xa0\x8f\x84\x2f\x5a\xe8\x9e\x30\x50\x27\xe4\x21\x89\x9e\x93\x1a\xcd\x22\xc9\x70\x43\x8e\x77\xf9\x71\xe2\x47\x7f\xc1\xd7\x57\xa1\x97\x92\xf7\xf9\xb9\xdc\x1f\x33\x94\x27\xda\xe3\x0a\x97\x46\x71\xe3\x9c\x8f\x63\x79\x41\xea\x58\xb7\x3c\x05\xd5\xad\x4f\xed\xf8\x0d\x0f\xcd\x5c\x88\x70\x42\x77\x4b\xf7\xe2\x4f\x3b\xb9\x85\xc1\x31\x7d\x75\x41\x2d\x4b\x81\x81\x79\x0a\xe7\x46\x50\x5f\x8b\x8c\x03\x0d\x7e\x43\x77\xc7\x53\xfb\x4b\x2a\xf5\x08\x81\x78\xbd\xd5\x9b\x59\x66\x27\x47\xa5\x45\xb2\x28\xf3\x2a\x32\x78\x1f\x9e\xa8\x7c\xf0\x5c\xfc\x5d\x56\xb7\xbe\x71\x06\x12\xa9\x46\xbd\x25\x19\x1e\xbc\xd8\xc3\x38\xd9\x7b\x18\x0a\x53\x79\xf6\xf9\x65\x95\x86\x91\xc0\x4f\x08\x65\xa6\x08\x24\x7d\xa0\xd0\xfb\x54\x0f\x94\x8b\xea\xfd\x72\x09\x9a\xec\xb5\xa8\xa1\xdd\xab\x91\x61\xe7\x6f\x39\x83\xda\xd4\x36\xb3\x8f\x28\x76\x51\xfe\x55\x34\xb8\xca\xfd\x32\xa5\x48\x23\x76\x10\x5e\xfd\x17\x60\x8f\xa3\xb7\x00\xbc\xf3\x1c\xb0\x78\xe0\x07\xa2\x72\xb0\x01\x8b\x60\xf6\x61\x40\x2e\x61\x48\xcf\xa1\x9c\x8d\xcc\x5f\xc9\xa1\x7f\x38\x17\x1b\x0a\xde\x64\x20\x26\xd5\x26\x9d\xda\x45\x0c\x58\x7e\x92\x4e\xca\x52\x17\x06\x82\xad\x4c\x88\x58\x2f\xff\x71\x1b\xa8\xd0\x67\xce\x04\xc0\x3e\x38\x25\x06\x45\x63\x66\x66\xd7\x93\x8e\x9a\x52\xd6\x47\x64\x1a\x2a\xc1\x72\x59\x32\x29\x0c\x72\x43\x50\x0f\xb8\x57\xce\x7d\x11\xf6\x39\x15\xcc\xb8\x60\x25\x76\x5c\xe4\xc7\x1e\xd8\x5a\xea\x4a\x18\xc7\xda\xe1\x9e\xe4\x39\x22\x27\xf9\xbb\x1c\x5a\x02\x1b\x50\x9d\xf5\x85\xf3\xfa\x87\x4f\xb3\xe5\x43\x26\xd8\x5e\xa9\x47\x27\xac\xe3\x14\x9a\x02\xfc\x6e\x3c\xab\xcd\xae\x5d\x2f\x4e\xab\x4c\x82\x01\xe7\xa5\x64\xb2\xaa\xd4\xce\x11\xa9\xc4\xdb\x41\xe2\xdd\x68\xd1\x8a\x9e\xde\xde\xfe\xba\x97\x30\x44\xf2\x58\x89\x42\x68\xaf\x19\xae\x75\xcc\xfc\x78\x6f\x69\x62\x30\xda\xda\x6a\xb7\x54\xf3\x77\x62\xce\xf3\xe9\xb4\xf6\x64\x29\xf0\xe6\xed\x95\x0b\xd3\x84\xa5\x30\x4a\x4f\x1d\x01\x33\xc0\x9b\xad\x92\x7d\xc8\x7b\x36\x5d\x84\xf7\xd0\xb0\x01\x5f\x71\x61\xd8\x7c\x58\xc6\xc4\x19\x2b\xf6\x50\xfe\xc4\xd6\x5f\xc9\xe0\x0f\xde\xbc\x3b\xe3\x35\x07\x36\x94\xfe\x6d\x5a\x87\x3e\xc9\xda\x61\xfa\x1c\x7c\x87\xa1\x71\xba\x5f\xa6\x03\xf2\xc0\x7e\xbd\x0b\xea\xbf\xb8\xdc\x7d\x99\xfb\x12\x7d\x35\xec\x90\x48\xe6\xf6\xe3\xc1\x91\x44\xda\x2e\xe3\x55\xf1\x1b\x16\x25\x39\x99\xe3\x7c\x04\x2f\xaf\x61\x3f\x9e\x25\xe7\x8f\x01\xe3\x40\x68\x90\xcc\xee\xfd\xed\x8d\x1d\x00\xf7\x15\x65\x1b\x5b\xb2\xd7\xb8\xf1\x3b\xbb\x45\x0a\xf5\x27\xc9\x00\x62\x14\x51\xdf\x2c\x97\x56\x2d\x00\x48\x5a\x92\xd9\xc7\xe7\xca\x89\x01\xcb\x42\x95\xba\xa5\xdb\x10\xcb\xa4\x97\x7d\x92\xd9\x31\xeb\x59\x26\xd0\x38\xb9\x09\xf9\xd3\xe2\x76\x24\xf0\x67\xb1\x30\x35\x60\xbb\x3d\x19\x8d\x8c\xf9\xf1\x9d\xe5\xe2\xa3\xf2\x99\x24\x3d\x1a\x3e\x04\x53\xf1\xe2\x1c\x47\xf7\x87\xb5\xe3\xf5\x7e\xfc\xf8\x77\xe5\x7d\xcc\x68\x75\xf7\x39\x2f\x90\xbb\x8d\x55\x7a\xef\xa8\x4b\x6c\xe1\xb2\x98\x6c\x55\x47\x4b\xe3\x24\x34\x65\x8c\xa9\x22\xe5\x13\x28\x2d\xe1\x71\xf8\x64\x37\x56\x85\x5d\xff\x30\xf1\x45\xa5\x5c\xc1\xdf\x30\xe1\x81\x77\x99\xca\xc0\xcb\x2d\x7e\xec\xee\x0c\x10\xb2\x79\x82\x69\xf4\xcc\x3c\x4e\xb6\x73\x84\x11\x0c\xb9\xe4\x59\x94\x39\xf6\x66\xa5\x89\xc0\xa7\x42\x08\xa6\xeb\xbd\x02\x78\x40\xe6\x2e\xf3\x5e\xdb\x13\x87\xca\xa8\x7b\x86\xf8\x3c\x55\x63\xa6\xd2\x6d\x3a\xb0\x8c\xe3\xae\x05\x34\x58\x5c\x31\x83\x86\xde\x05\xfd\x6a\xe7\xda\x19\x33\x7b\xdb\x3f\xba\x1f\x64\x2c\xd2\x60\x31\x08\x40\x48\x18\x97\xab\x7e\x77\x74\x54\x39\x9c\xe7\x28\x1e\x0e\x45\xfe\x2a\xe1\x6d\xc3\xab\xe4\x12\xff\xe3\x81\x30\x9b\x6c\xce\x80\x6a\x1a\x0e\x49\x1d\x30\x10\x17\xcc\x2a\x1c\xe4\x5e\x0a\xd5\x1e\x8e\xdf\x98\x7d\x31\xe1\xf4\xed\xd2\x8c\xfd\x4d\x37\x2e\xd3\x63\xa2\xda\x2a\xab\x77\x1d\x80\x79\x77\xca\xba\xd0\xc8\x37\xb1\xc0\x20\x91\x82\x80\x19\x76\x8b\x88\x92\x62\x7f\x13\xcf\x96\x19\xac\xa1\x64\x54\x07\x8b\xf1\x6e\x24\x6a\xf6\x67\xfd\x1b\x0f\x0b\xdd\xc2\xb9\x54\xb1\xcf\xf9\xc1\x0a\xd6\xe8\x10\xdd\xd2\xe7\x32\x6d\x82\xac\x4e\x2f\xf8\xd8\xb4\x40\xdc\x17\x48\x41\x52\x69\x90\xe3\xf1\x0f\x8e\x18\x27\x74\xc6\x39\xaa\x90\x66\x35\xd5\x0c\x19\x27\x95\x80\xfd\xfe\x8d\xc2\xcd\x6c\x42\x28\x34\x1f\x80\x31\xc3\x18\x7b\xd2\xf2\xa0\xbf\x79\x10\x0e\xe8\x0f\x3b\x02\xbf\x2d\x66\xca\xc4\xf3\x77\x2b\x7b\x46\x3c\x5d\xc1\x0a\x7b\xef\xe3\xc3\x52\x19\x29\xa7\x3c\x15\x18\x34\x7d\x59\x7f\xd2\xa4\x81\x35\x1f\xb7\xdb\x95\xb5\x25\xf3\x24\xd4\x79\x00\x2e\x99\xa4\xe0\xd3\xd4\xf3\x8a\x04\xa4\x77\x75\x2c\xa4\x85\x34\xb3\x82\x23\x48\x96\x06\x14\x65\xc3\x28\xcc\xb4\x12\x92\x5e\x14\x18\x99\xb7\xbd\x87\xcb\x15\x4f\x99\x3d\x3a\x51\x7d\x4b\xfd\x98\xf5\xe5\x3f\x2c\x6b\xcb\x06\x1a\x2f\x1a\xd2\xcd\xfa\x57\x77\xc7\x2f\xf0\x35\xb9\x8e\x56\x6e\xf2\x39\x5f\x31\x8d\xe5\x4a\x2c\x92\x07\x82\xf8\x71\x93\x9f\xe0\xfd\xf2\xae\xae\x70\x78\x6e\x08\xe1\xa7\xed\xb3\x45\x25\xc4\x9c\x92\xe4\x1d\x2b\x78\xe8\xf4\xbd\x48\x43\x9a\xee\x56\xaf\xfd\xf8\xb8\xc8\xbb\x5c\x1e\x65\x76\xb1\x73\x50\xc2\x6b\x4f\xfe\x5d\xa9\x46\xc0\xe4\x74\x02\x53\x12\x6b\x5d\x5b\x99\xc7\xea\x25\x78\x9c\x3b\x4d\xbe\xbc\x84\x7e\x00\x85\xf0\x28\x36\xbe\x31\x3d\x09\x83\xbc\x21\xa3\xc9\x6a\x7c\x6b\x97\xc0\x11\xd9\xb6\x73\x70\x58\x50\x77\x38\x05\xd1\xe4\x0c\xe5\xf4\x89\xdb\xda\xce\x74\xad\x11\x8a\xbb\x2a\x21\x64\xc6\xa1\x25\xf0\x2d\xc4\xc3\xb7\x3f\x37\xee\xed\xfb\xed\x03\x99\xa9\xe7\xbe\x10\xf3\x55\x06\x16\xb2\x20\x91\x06\xcd\x69\x03\x8f\x85\xcb\xc6\xf1\xfb\xf7\x0f\xd2\xa7\xc8\xd3\x55\x0c\x94\xa1\x8f\x04\x24\x5a\x66\x4c\xaa\x88\xe5\xb9\xa7\x39\xb4\xf7\x7c\x08\xfb\xe7\xd8\x26\x32\xb2\xf9\xae\x94\x9e\x5a\xd3\x87\xa7\x21\x3f\x90\xb2\xea\x35\x64\x70\x2e\x33\xca\x7c\x56\x27\x0b\xcf\xde\x16\x78\x52\x57\xa0\xc7\xe2\x10\xf6\xcb\x7a\xab\xdb\x1d\xe7\x95\xa3\x31\xcd\x9e\x2c\x0c\x30\x18\xa6\xf3\xc8\xd1\x8c\xbc\xd1\xa8\xf0\xc0\xe9\x38\x1e\x80\x5b\x74\x02\x85\x40\x0f\xbc\x2e\xc4\x06\xee\x00\xc8\x2d\x41\xfd\x43\xa4\x97\x37\xa7\xd7\x80\xbc\x2f\xaf\x3a\xbe\x88\x46\x9c\x48\x4e\xd4\x36\xa5\x91\xde\xe1\x47\x70\x1a\x00\xfc\xf8\x47\x1f\x5e\x8d\xd7\x6d\x9f\x66\xf4\x8d\x22\x09\x5d\xa8\x3c\xcc\x66\x5c\xa4\x5a\x48\xb0\x35\xfb\x3c\xcb\x38\x48\xf4\x57\x62\x8a\x92\x85\x01\x40\x6c\x84\x2e\xa8\xd5\xa9\x31\x9d\x88\x1c\x43\x0b\x5c\x80\x3f\xb3\x9e\xea\xe5\x13\x04\x49\x0e\x24\x5c\x49\x23\x36\x79\xbb\x2d\xb2\x2f\x53\xd3\x7c\x7f\x90\xa9\xbc\x7e\x0d\x34\xa9\x67\xd9\x63\x13\x77\x31\x55\xd4\x25\x5d\xde\xc7\x07\xe3\x10\xcf\xc3\x96\xca\x6e\x1c\x65\x45\x7b\xb5\x55\x9b\x13\x36\x45\x4d\xfb\xb4\xed\xe6\x4a\xc4\x7b\x23\x36\xc5\xbb\x23\xc5\xcb\x19\x60\x34\x79\x4d\x4b\x97\xa8\xad\x2d\x0a\x69\xd9\xc8\xff\x9f\xba\x9e\x27\x04\xb1\x77\x28\xdd\x56\x18\xe3\x31\xdd\xcf\x23\x7a\x1c\x3c\xb3\xc9\xac\x5c\x3d\xde\xec\x5f\xa5\x09\xba\x2e\x8e\xb7\x7b\x73\xad\xa7\x22\xdd\x13\x8c\xc6\x66\x3e\x3f\xfb\x18\xc2\x65\x97\xe3\xf3\x10\x43\x57\xbc\xa6\x07\x24\x7b\x2c\xb9\x6a\xf7\x7f\x20\x90\xb1\xa0\xbe\x4c\x2e\xb6\x3c\x2a\x39\xfd\x70\xaf\x13\xc2\x29\xa9\xd9\x62\x89\x2d\x41\xa0\xef\x4f\x89\x2b\xd9\x59\xe4\x52\xc9\xa8\x74\x14\x8b\x73\x9c\xce\x1c\x3f\x6b\xb7\xbb\xd0\x4d\x5d\x9d\x02\x8e\x0f\xb7\x2d\x92\x42\xc0\x9c\x46\x64\x39\xd2\xe9\xe4\xc1\x63\x55\xe6\x91\x51\xa0\x59\xe7\x7d\x3b\x0a\x5b\x47\xb7\xdd\x4c\xa8\x8a\x2f\x48\x9c\x59\x18\x4e\x62\x65\x9f\x7f\xca\x71\xdf\xe0\x58\xa6\xc9\xc8\x9b\xcf\x3f\xa8\x10\xd8\xd6\x4b\x6a\x89\xa3\x93\xbb\x2f\xf8\x9e\x39\x05\x51\xca\xd4\x6b\x2c\x2c\xd6\x99\x61\x57\x24\x3d\x64\x8d\x62\x74\xe4\x01\x33\x30\x5d\x49\xd2\x2f\xaf\xea\x25\x78\xcb\xc1\x09\xe7\xd0\x59\xc4\x4b\x3e\x91\x95\xce\x5b\x7e\x28\xae\x98\xc3\x30\x96\x20\x29\x9c\x45\x39\xf9\x79\xbb\xfc\x03\x86\x39\x98\xf5\xd9\x5e\x54\xe7\xdc\xb9\x0d\x11\x37\x09\x02\x43\xe9\xfd\xdf\x57\x82\x7a\xfc\xf7\x8f\xeb\xde\xfd\xf3\xe7\xe6\xad\xcc\x91\xb1\xd8\x00\xd3\xab\x5e\x98\x6b\x90\xb6\xe2\x64\xa2\x3a\x4e\x00\x0e\x87\xa4\xc2\x74\x84\x6b\x38\x33\x0f\x5e\xd7\x81\x02\x96\xcc\xac\x00\x89\xd4\x2f\xa7\x27\xba\x04\xc0\x6b\x80\xaa\xcb\xb4\x10\xde\x49\x16\x6e\x7f\x80\x39\xdd\x6c\x90\xdd\x37\x15\x64\xd2\x73\x87\x2f\xa7\xca\xcc\xb1\xd2\x34\x0e\x9e\x8b\xc8\xb6\xba\x9b\x49\x21\x47\x93\x9a\x49\x18\x44\x22\xed\xb8\x2c\x08\xc0\x2f\xc8\x80\x0f\x9f\xbf\x07\x0c\x31\x3d\x14\x24\x89\xb7\xd8\xc9\x29\x43\x82\xab\x12\xb4\x9b\x8c\xca\x03\x73\xa0\xf7\x7f\x1d\x21\xf0\xce\x5d\xa7\x41\xd4\xcf\x08\x15\xe4\x28\xb9\xcc\x29\x13\xa9\x54\x54\xdf\x7f\x58\x8a\xc4\x90\x7a\x9c\x22\x66\xd7\x56\x4e\xdb\x61\x56\xdd\xc4\x7b\x66\xe9\x96\xb8\x40\xe0\x22\xf2\x44\x87\xd3\x01\x6a\x08\x2d\x2c\x56\x68\x15\x2a\x0f\x05\xed\x37\xbb\x40\xd1\x12\x64\xc2\xf6\xfd\x19\xe6\xe3\x91\xb9\xe4\x19\xf3\xc9\x7d\x15\x8c\x83\x7b\x5e\x78\xce\x09\x3a\xb8\x27\x9e\xbe\x0d\x1a\x66\x58\x86\xb5\xc4\xb9\x8c\xa3\x8d\x35\xc7\x24\x7b\xc6\x9d\x09\xf7\xd8\x32\xb7\x86\xb9\x2d\xc0\x14\x9e\x6f\xdf\x77\x7a\x65\xd0\x84\x3e\xbe\xe0\xeb\xe3\x9b\xe8\xe3\x23\xe9\xac\xba\xdb\x79\x7f\xd7\xb8\xe1\x87\x7a\xee\xbe\xeb\x2e\xfd\xf3\xfb\x11\x39\x39\x06\x69\xf9\x47\x7c\xac\xd3\xf3\x97\x67\x6a\x6a\x1f\xa2\x5e\xc0\x17\x53\xf2\xdb\xa9\x4c\x6f\x21\xe5\xf9\xa9\x10\x70\x9d\x80\xf4\x23\x76\x62\x52\x0f\x9d\x77\x14\x89\x29\xcc\x22\x93\xe7\x48\xf4\xc7\xc3\x14\x0a\x59\x25\x3a\x1a\x6c\x35\xb9\xe7\x38\xb6\x83\x7f\xb4\xed\xc4\xfb\x9d\x0d\x30\x8c\xc5\xbd\x26\x44\xf5\x8a\x74\x10\x9c\xac\xf0\xbc\xad\xf7\xd8\x6a\xe0\x10\x87\xf2\xfb\x74\xf7\x3b\x99\x5a\xa6\x8f\xe3\xbf\x33\xce\x47\xe9\xf6\x02\x03\x35\x73\x64\xd3\xde\xb2\x38\x30\xa5\xb1\x0d\x47\x48\xdb\x9e\xc4\x52\x89\x39\x71\xb5\x93\xc8\x70\x60\x93\x1f\x0e\x92\x35\xe6\x21\x75\xb4\x10\xa6\xc4\x07\xa2\xd8\x2e\x61\x91\x8b\x01\x36\x50\xe5\x40\x85\xec\x30\xb9\x68\x38\x6c\xe2\x56\x26\x04\xb9\x4f\xc4\x15\x49\x93\x83\x6e\x48\x12\x21\x7d\x24\x4e\x3c\x10\x18\xd0\x38\xdf\x1f\xdb\x69\x77\x1d\xf9\xb0\xff\x27\xee\xda\x2d\xc6\x7d\xbd\xf9\x6e\x3f\x1e\x9f\x4b\x7d\x42\xc7\x96\xcf\x98\x84\xd3\xf3\xf6\xf5\x85\xd9\x74\xa1\x57\xc4\x6b\x36\xba\x27\xec\xe0\xfd\x5d\x12\xf1\x9a\x9a\x26\xb6\x5e\xf3\x7f\x25\x17\x9a\x1d\xac\x84\x3c\x07\x79\xad\x2a\x17\xac\xf3\x99\x35\x35\xf5\xa3\x1e\x74\x1c\x3c\xbd\x81\x53\x03\xa6\x04\xd6\xec\x25\xea\xb6\x6f\xac\x6f\xce\x40\xdb\xb0\xd4\x69\xce\xd6\xb2\xc8\x61\xda\xc4\xd4\xb6\xf9\xe8\x43\x74\xea\xa6\x71\x16\xc4\xdf\x3e\xf5\xe3\xed\xfb\x1b\x0f\xed\xd5\xc4\x71\x93\xee\x61\xc6\xa3\x3b\x9d\xf6\x25\x79\x73\x4a\xa5\xce\x18\xa5\x67\x09\x59\x32\x9f\x09\x18\x85\x8f\xef\x9f\xdf\xaf\x77\x1e\x90\x77\x45\x26\x1a\x2c\xeb\x39\x7a\x28\x59\x6f\xe8\xc7\x33\xe6\x97\xf5\x0f\xec\x47\x6d\x16\xae\xb4\x5a\x86\x4d\x29\x59\xcc\x55\x3f\x54\xaa\x64\xf1\xd4\xfa\x73\x2f\x46\x9c\x9f\xd3\x63\xe6\x73\x2d\x3f\xe3\xfb\xfb\xe7\x07\x69\x42\xb7\x1e\x05\x03\x5e\x78\xa3\x4c\x7c\x82\x80\x94\x2d\x41\x10\x8d\xa3\xb6\xc9\x0f\x8e\x51\x95\x54\xf8\xe1\xac\x49\xc5\x05\x52\xb9\x14\x1e\xec\x52\x0b\x3b\xe2\x14\x92\xd6\xf2\xe4\x4c\x45\x64\xde\x3b\xc5\x38\x74\x2c\x23\x77\xa7\xfb\xbf\xfb\x17\x78\xe1\xd6\xb0\x72\x02\x9f\xd9\xb9\x33\x13\x71\xab\x7d\x26\xd1\x29\x43\x2d\xae\xb4\x76\xbf\x44\xff\x0f\x87\xf4\x36\xf5\xac\x30\x39\x77\x52\x4f\x1e\x24\xf3\xa7\x76\x72\xc7\xb9\x67\xa5\x91\x48\xa3\x2d\xaa\xce\x44\x30\x07\x3c\xd1\x02\xda\xe9\xe1\x18\x40\xaf\xa4\xc9\x65\x56\x37\x3d\x24\x64\x17\xc4\x88\xd5\x35\x14\xc9\x30\x52\xed\x50\xbd\x8a\x6f\xfe\x39\xff\x76\x3a\x9d\x6c\x25\xa6\x23\xe3\x53\x7b\x94\xdc\xb3\x0f\x2b\x48\x18\x27\x21\xa1\x7e\x89\x27\x51\x81\xb7\x26\x8f\xa4\xbb\xfd\x75\x3c\x42\x25\xf8\x32\x4d\xe6\xae\xa9\x9d\x93\x77\x6d\x71\x06\xd5\xa5\x04\xde\x35\xe6\xb3\xd0\x44\xe5\x8e\x43\x0a\x6a\x0e\xe4\xe8\xf7\x81\x2e\xe5\xa6\x9b\x8e\x02\x0f\xc5\xfb\x2c\x3e\xfe\x24\xc2\xe0\x4b\x83\xee\x26\x54\x4c\x38\x37\x09\x4a\x83\xbe\x96\x97\x4e\x4a\x69\x5f\xfd\x53\xb7\xf0\xef\xf6\x8e\xa0\x2a\x95\x39\xd2\xb7\xbe\xad\x37\x3c\xd5\x5f\x9e\x0f\x9c\xfc\xcf\x8f\xbd\x8b\xa0\x7e\x3a\x9c\x8a\xe9\x64\x7f\x9e\x29\x92\x85\x3e\x61\x3d\xec\xaa\xd6\xd7\x51\x29\x2b\x07\xc9\x2a\x51\x47\x72\x6b\xb0\x2c\xde\x17\x8d\x59\x56\xb7\xd4\xe6\x0d\x7a\xa4\x81\x58\xf7\xe5\xca\x4a\xb1\x45\xcd\x4c\x72\x6e\x25\x25\xff\x3e\xce\xcf\x0f\x3c\x60\xee\xe5\x5d\xdc\x24\x4e\x5e\x4e\x28\x93\x03\x81\x66\xf6\xb5\xdb\xe9\x42\xb6\xca\x67\xf3\x69\x78\x96\x3b\x14\x42\x95\x81\xeb\x53\x94\xf0\x7e\xa2\xa3\x7a\xb1\x26\xf1\x2f\xce\x85\xbb\x77\x03\xcc\x1d\x4a\x03\xcc\xc7\x88\xa8\x87\x92\xa0\x84\x4f\x4b\xb3\x70\x8e\x6d\xf2\xcc\x65\xa5\x69\x12\xcc\x8b\x3c\xdb\x40\x7a\x85\x11\x68\x0d\x8e\x76\x5a\x3a\x66\xf8\xc1\xa3\x03\xc9\x73\x4b\xab\x60\x4c\x60\xea\x0f\x36\x74\x98\xa3\xcb\xa8\x87\x80\x09\xd8\x9f\xb5\x3d\x75\x3d\x23\xb2\xb4\xbc\x14\x82\x4e\xac\xa3\xbe\x89\x25\xf8\xbe\x8f\x9f\x8b\xbb\x78\x5f\x24\x09\xf1\xa2\xb7\xe0\x4e\x76\xf8\xd9\x06\xe3\x89\xbe\x13\xed\xbf\x0f\x5c\xcf\x04\x9f\xf9\x14\xb3\xa4\x0e\xdd\x11\xc2\xcd\x3c\x1f\x8e\xef\x49\x84\xa6\xe8\x0e\x62\xc7\x6d\xd6\x94\x3c\x33\xa9\x0e\xac\x23\xaa\x02\xfa\x2e\xcf\x89\x41\xed\xe0\x23\xee\x78\xac\xaf\x24\x97\x30\xe9\x1f\x44\x61\x66\x2a\x9d\xdc\xd2\x76\x8f\x23\x46\x12\x1d\x79\x58\xbb\x95\x75\xac\xe5\xf8\xdb\x83\x95\xe4\x8a\x64\xcf\x0d\x8e\x7b\x12\x25\x5c\xa8\x1b\x3b\x7b\x5d\xf1\x53\xa9\xd7\x9b\x42\x43\x3e\xb9\xa4\x91\x54\xc2\x19\x15\xb4\x5c\x26\x89\x8f\xe1\x93\xbf\x36\x93\x81\x11\x69\xf1\xc6\x97\x4e\x7e\xd3\x04\x5f\x38\xdd\x93\xaa\xdc\x60\x1e\x15\xe4\x60\xd7\x69\x76\x5d\xad\x12\x0d\x39\xa4\xed\xcf\xe5\x94\xf4\xcb\xfb\x63\x43\xd6\xd1\x44\x45\xe4\x6d\xbd\x80\xc1\x65\xb2\x10\x4e\xaf\x48\xfa\xa2\x93\xc7\xa9\x91\x29\x8d\x17\xf8\x7e\x97\xa3\xf7\x7f\x57\xe8\x21\x9e\x0a\xb5\x61\xd4\x45\x78\x37\x0b\xef\xdf\x33\x0c\x4c\xee\xef\xa7\xc0\x40\xd2\x01\xe5\x00\xf4\x62\xa6\x29\xce\xf8\x02\xa6\xc1\x8a\xb1\xa3\x0a\x69\xc7\xe3\x37\x11\xc3\xaf\x69\x6c\xe6\x0b\x12\x51\x57\x0f\xaf\xd3\xad\x04\x21\x9c\x85\x82\x44\x71\xa6\x5b\x1e\x78\xfa\x8c\xe2\x31\xba\x39\x11\x30\x40\x9d\x3f\x9f\xdb\xf3\xf9\xcf\xd5\xd1\xf3\xee\xdf\xfe\x60\x1d\xcf\x47\x24\xbb\xf6\x88\xec\xe3\x76\xfc\xea\x26\x94\x56\x0b\xd3\x96\xc7\x00\xf4\x89\x6f\x39\xc3\x1d\xf8\x20\x1e\xfc\xe3\x08\xba\x02\x3b\x13\xbc\xfb\xf7\x9f\xf7\xb9\x3d\x5f\x07\x1e\x79\xb6\xf0\x78\xf6\x45\x65\x11\x73\xe9\x98\x94\x66\xcf\xb5\x0e\xbc\x8a\x66\x3e\xd0\x4c\xa0\x15\x73\x9d\xe8\x40\x88\x18\xce\x3c\x6a\x2a\x9f\xd9\xc7\x90\x32\xff\xbc\xb1\x47\xdb\xb7\xc1\xcc\x2a\xce\xe2\x60\xb6\x8b\x2a\x21\x4d\x3a\xc8\x43\x98\x0a\xd3\xcf\x52\x33\x20\xc1\x94\x08\xba\xb1\x76\xac\xc9\xea\x23\x20\x32\xfe\x2f\x0c\x3e\x2f\x0e\xce\x40\x1e\x56\x95\x81\x2c\x98\xb9\x07\xc6\x97\xde\xbc\xd9\xb0\x1d\xcc\x3d\x49\xb8\x0a\xe6\xba\xc5\xe7\x13\x28\x61\x33\xb6\xea\x40\xe8\x8a\xd6\xfd\xf9\x7a\x0f\x75\xb7\xa2\x81\x82\xdd\x9d\xdf\xbf\xfe\xed\x0b\x08\xc8\x7c\xe5\x44\x0f\xef\x04\xdc\x7f\x3c\xff\x05\x4c\x23\x2a\xc8\x82\xfe\x73\x1a\x19\xf2\x02\x30\x53\x31\xbb\x13\xe5\x40\x94\xac\x13\xca\xbb\x54\x0a\xf6\xd0\x7c\x0f\x25\x45\x69\x95\x98\x28\xc7\xda\xd8\x43\xc9\x3d\xa9\x26\xe1\xcc\xe8\x77\x16\x9a\x28\xc4\xb5\xb8\xdf\xc4\x17\x05\xe7\xf7\xfd\x7c\xe3\x50\xdc\xe9\x0c\x2c\xcc\x7e\x62\x3b\xab\x8f\x47\x29\xf4\xdb\x69\xe5\x92\x38\xda\x4b\x13\x33\x86\xc7\x58\x5a\xc0\x1b\x8a\x51\xf6\x04\x3f\x11\x5d\x2d\xb1\xcb\xee\x41\xac\xe4\x68\x79\x88\x51\xc2\x8e\x03\xe7\x40\x98\xfe\x67\x64\xc5\xfe\x63\x08\xc4\x76\x8a\xef\xf7\x3b\xda\x31\x6f\xf7\xf6\x13\x64\x36\xfb\x22\x70\xbb\x3b\x11\xa1\xcc\xea\x9e\x6d\x3d\xfc\xa3\xf6\xc7\x7d\x42\xca\x6e\x7b\xa8\x97\xda\x14\x54\x81\xf2\x91\x5d\xa0\xb4\x90\xd8\xbf\x8a\xd5\x33\xe8\xe2\x74\x4d\x03\xc9\x1d\x9a\x01\x8c\xfa\x70\x31\x7c\x12\x3c\xb2\x31\x1c\xe7\x88\xe7\x1e\x33\x85\xb9\x0d\xf3\x73\xff\x00\xdf\x13\x06\xc3\xd3\x43\x9d\x72\x99\xaf\x52\xd0\x93\xbd\xc6\xe5\xc5\xc1\xde\xb5\x1e\x58\xf0\x98\x3a\x25\x38\xc7\xbd\xbd\x7a\xfb\x5b\xc5\x18\x82\x4e\xd5\xfc\x93\xbf\x80\x12\xf7\x12\x55\xc7\x69\xe2\x5e\xc8\x0b\x2a\xb9\x7d\xb2\xe4\x46\x38\xf7\x90\x2f\xaa\x66\xb4\x91\xd5\xe3\x91\x68\xfe\x67\xce\x9a\xe3\xf2\xf8\x37\x74\xcb\x17\x53\xac\x3e\xc7\x54\xc3\x66\xbd\x39\x14\xc9\xd8\xdb\xd7\xfa\x38\x57\x04\xf2\x68\x40\x0a\xc6\x91\xe3\x18\xdf\x02\x27\x74\x7f\x7c\x38\x8d\x4c\x05\xf2\x0d\xc6\x56\xef\x3f\x6f\xcf\x81\xee\xce\xea\x1e\x10\x9b\xef\x5e\x4d\xcb\x40\xb6\x4d\x9c\x55\x9a\x1c\x1f\x46\x9b\x5f\x26\x46\x81\xce\xff\x22\xad\xa0\xa9\x34\xb3\x33\x24\x72\x12\x42\xbf\x10\x19\xb4\x95\x26\x05\xb3\x48\x1b\x7b\xa9\x5c\x9b\x43\x03\x98\x55\x61\xaf\x9e\x8f\xe8\xa4\x2e\xf0\xfe\x6d\xfc\x6a\x6a\x85\x86\x19\x5e\x0e\xd5\xe8\x67\x4a\xad\x7a\x4b\xd0\x6c\x76\x33\x75\x8c\x6f\x4c\x90\xdd\x2b\xfa\x1b\x76\x6f\x5a\x8e\x88\x0e\x52\x6c\x05\xb9\x98\x70\x06\xaa\x57\xc4\x00\x21\x7b\x3a\x4a\x01\x60\xec\xf0\x5c\x88\x99\xee\x0b\x64\x02\x23\x45\x35\x65\x73\x38\x75\x1b\xb9\x18\x6e\x1e\xe2\xc1\x46\x1d\xd7\xa1\x51\xab\x30\x4b\x29\x5f\x26\x38\xad\xeb\x26\x8f\x64\x44\x6c\x35\x89\x2c\x27\xac\x24\x44\x08\x4f\x70\x15\x93\xc7\xa7\x62\xcb\xa9\x7e\x33\x3c\xe6\x95\x8f\xe6\x28\x81\x3a\x15\x62\xd6\xd3\x10\xca\x9c\x77\x8c\x73\x26\x0c\xe6\x64\xee\xba\x43\x78\x2a\x40\xde\x35\x36\xf8\xf7\x39\xad\x1f\x55\x81\x83\x54\x2f\xa2\x20\x84\x21\x9e\x91\x62\x66\x3d\x9c\x4e\x9a\x14\x99\xbb\x91\x63\x29\x9d\x2d\x6d\x64\xa4\x83\x6e\x66\x61\xdf\xf2\xce\xde\x1c\x9f\x95\x4b\x9c\x84\xd7\xe4\x84\x1b\x6b\x31\xd8\x9c\x4e\x9f\xe2\xa5\x1c\x2e\xca\xb6\x0d\xfb\x69\xfb\xc0\x91\xdf\x08\xcf\x53\xd6\x70\x5b\x9c\x21\x08\xba\xe2\x6a\x87\xbc\x75\xdf\x04\x4d\x14\x15\x01\xf3\x0f\x98\xab\xed\xd1\xb0\xb6\x14\xfe\x93\x53\xcb\x53\x19\xd0\xeb\x89\x47\xae\x52\xb3\xbc\x12\x32\x0e\xd9\xeb\xd9\xde\xda\x16\x1e\x6b\xb1\xc0\xda\xa5\xaf\x9a\x72\xf8\x1b\xeb\x0b\xa9\x28\x16\xe8\x30\x0b\x38\xbc\xed\x9b\xd5\x76\x99\xab\x7a\x89\x1a\xa6\x50\x3b\x15\x29\xfa\xc9\x7c\x5c\xfe\x0c\xb5\xd2\xef\xa7\xf1\xdf\xad\x7a\xcd\x26\xa8\xc8\x9e\xce\x86\xf3\xe8\xa3\xdc\xc8\xfc\x1f\xb7\xeb\xed\xe6\x4b\x10\x6f\x8f\x1d\xef\xe1\x85\x2e\x7f\x57\x0b\xfc\x18\xfb\x5d\xd2\xca\x91\x9a\x97\x21\x84\x8d\xd3\xaa\x86\x32\x75\xee\x26\x34\xba\xbd\x61\xb3\x1e\xa0\x3e\x12\x49\xb6\x0f\x4e\x56\x26\xfe\x4a\x3b\x47\xc2\x23\xdf\xdf\x3f\xaf\x3f\x1c\x10\xd8\xf9\xeb\x1e\xb7\xeb\x7d\x46\x5e\x6e\xea\x6e\xd9\x55\x85\xb3\x95\xb2\x7c\x83\x46\xa7\x8a\x1c\xe3\x2e\x11\x0e\xa0\xbb\x05\x38\x05\x05\x6b\x6e\x4a\x81\xff\x2a\x64\xdc\x5c\x37\xb3\x59\x24\x2d\x13\x53\xb6\x5e\xe2\x81\x43\xba\xe6\x41\x94\x66\x62\x5e\x9f\x2f\xf7\x88\x9a\xd0\x9c\x86\x2c\xd0\x90\xf9\x50\x44\x1b\xed\x83\xff\x07\xe5\xa0\x29\x2f\xa9\xd9\x40\x3c\x02\xa3\x4f\x7e\xcf\x21\x8a\x8d\xe7\xb2\xd7\x2a\x38\xea\x4e\x51\x6c\xc1\xe3\x95\xa4\x3f\x8f\xf5\xeb\xe6\xb7\x89\x19\x8f\x28\xb8\xbe\xa2\x88\xb3\x68\xda\x1d\xfc\xb5\x91\xfb\x62\x29\x3c\xf1\x07\x72\xbd\xa8\x64\x2a\x3c\x40\x21\xcc\xae\x43\x2b\x6e\xc2\xb0\x6e\x3d\x0e\x5c\xd8\x95\x8b\x06\x8d\xa0\x02\x76\xd1\x7a\x7e\x1d\xbe\x7e\x91\xc9\xf8\xfc\x9e\x66\xf0\xa3\x7d\x7e\xfd\xeb\xef\xa8\x84\x8e\xd3\x35\x92\x27\x6d\x1b\xf6\xeb\x82\xaa\xf4\xe9\xdf\xe5\xf6\x39\x56\xa5\xc9\x57\x44\x2e\x7e\xcc\x99\xa1\xb3\xd3\x36\x11\x4a\x26\xc4\x61\x67\xae\x03\x5b\x81\x6b\x5d\x61\x97\xbb\x32\x18\x0a\x25\x54\xe5\x7b\x0a\x05\xf7\x92\x6f\x65\x24\xba\x1a\x75\x56\x8b\x81\x36\x3d\x20\x22\x1e\xa3\x53\x99\x63\x18\x73\x4f\x2d\xe0\x28\x03\x5c\x62\xab\x86\xe0\xc2\x81\x4d\x44\xe4\x92\x4a\xf7\xd9\xfb\xed\x1f\x92\xb1\xde\xc3\x3e\x90\x24\x29\x4f\xa2\xb2\xf6\x7c\x20\x67\x82\xf8\xe0\xbe\x24\xf7\x61\xea\x34\x66\xd7\x87\xa2\x8b\x60\x76\x5d\x81\xfe\x58\x1c\x02\x2d\x62\xd9\x3b\x7b\x8d\xc8\xa2\xc8\xf8\xca\xdf\x8f\xc3\xaf\x9c\x6f\xa2\x25\x3a\xb3\xd9\xbd\xc5\x6b\x61\x49\x6a\xe0\x14\xee\xf1\xa1\xa9\xac\xd3\xff\xcd\xd4\x95\x6c\xa9\xae\x04\xc7\xbd\xff\xc2\x2c\xbd\x6a\x66\x58\xf9\x4b\xbc\xd0\x50\x12\x42\x13\x68\x44\x9c\xe3\x7f\x77\x46\x44\x16\xd7\xef\xbe\x3e\x57\x07\xba\x6f\x83\xa8\xca\xca\x8c\x8c\x8c\xb0\x7d\xeb\x17\x11\x16\x88\x23\x12\x69\xff\xf3\xf5\xb7\x85\xcc\x6e\x22\x38\x87\x8d\xd2\xfd\x47\xf5\x78\x06\xcb\x06\x79\xe9\x85\x61\x50\x51\x11\x90\xeb\xab\x0a\xb1\xc5\xc7\x9b\x14\x6c\x29\x33\x6e\xdb\x49\x3a\x38\x49\x5c\x62\xb4\xfb\xf8\x7d\xdc\xef\x98\x5e\x57\x2b\x4e\xd0\x3c\x8b\xfa\x00\xb2\x22\x35\x86\xb0\xd3\xc9\xc5\x64\x73\x56\x88\xc6\x1a\x2c\xdd\xe1\xd4\x3a\x04\x30\x99\x4d\xc8\x00\x8b\x1d\x62\x97\xa5\xfb\x4f\x3e\x5f\xbb\xfb\x46\x6a\xb9\x74\x74\x53\xcd\x25\xe3\x18\xdc\x46\x65\xeb\x25\x3f\xb8\x59\xbc\x96\x45\xc7\xe7\x70\xaa\x6a\xbc\xcd\xbf\xcb\x31\xdf\x9e\x1c\x87\xa4\x06\x0b\x85\x7a\xbe\x53\x5b\x64\x6f\x45\x86\x97\xcc\x0d\x27\x28\x40\x72\xfd\x6c\x6d\xbf\xde\x76\xde\xd0\x65\x72\x63\x9f\xeb\x89\x86\x5b\x2e\xbd\x48\xfa\xb0\xb7\x73\xb9\xd2\xba\xc4\x95\xa8\xfa\x62\xf2\x64\x01\xd0\x64\xc8\x75\x22\x91\xed\xee\xba\x61\x40\xdf\x33\x57\x87\xe8\x5c\x6f\x27\xf1\x59\x99\xca\x15\x06\xe6\x27\x1b\xb5\x90\x5a\xe2\xcf\x3f\x31\x57\xa4\x0d\x1f\x19\x59\xb4\x5f\xfa\x8d\x63\x0b\xa5\xea\xed\x54\xcf\x23\x14\xe9\x69\xb4\x85\x86\x35\x3a\xd2\xbd\xe7\x2a\x28\x46\x2c\x80\x45\x1c\xa1\xf4\x16\x98\x5a\xbd\x4c\xc3\x12\x0d\x31\x22\xa9\x60\x64\x68\x5e\xe2\xa0\x27\x76\xf6\x55\xaa\x9f\x68\xf1\xe2\xfa\xa3\x18\xb1\x12\x8d\xa2\x71\xaf\x3a\xc0\x8b\x95\x5a\x41\x57\x3b\x27\x37\xc4\x58\x94\x17\x3b\x21\xfd\x3b\xb9\x60\xee\xe4\x91\xb8\xa3\xaa\x4c\x54\x9c\x28\x96\xfc\xa9\x0a\x05\x5d\x34\xa7\xb4\x96\x89\x73\x4d\x64\x06\xcd\xf8\x60\xeb\xdf\x9b\x99\x65\xf3\x9b\xf3\x8e\x2a\x2a\x1a\x81\xd4\xb0\xa1\xc5\x8c\xde\x69\xd3\x10\xa6\x90\x8f\x2b\xfc\x31\x24\xd5\xd4\x53\x04\xde\xe7\x41\x74\x2a\x42\xf2\xf4\x23\xb4\x37\xb3\xe4\x4f\x95\xdd\xec\xb2\x01\xc0\x2b\xb6\x88\x24\x3a\xb6\x6f\xe7\xb6\xc8\x28\xa4\x86\x7e\x99\x74\xcd\xaf\xae\x68\xa9\x14\x02\x0e\x12\x3f\xef\xc1\x03\xd3\x7d\xb4\xf0\x48\x6a\x7e\xf4\x8c\x4a\xb2\x66\x3c\x90\x9e\x95\x58\xa9\xc1\x5e\x9b\xa5\x4a\x73\xc3\xae\x58\xe2\x81\x39\xeb\x91\xc1\x30\x3f\x80\x1b\x2f\xcb\xaf\xf7\xa1\x7e\xe1\xe7\xf2\x4b\x7f\x7b\x11\xb7\xd9\x40\x87\x91\x77\xa0\x95\xaa\x59\x4c\x18\xdc\x89\x31\xc3\x40\xd7\xe8\x4f\xe2\x8b\x97\xa3\x6c\xb9\xdb\x6f\x78\xb1\xd1\xd7\x6e\x2e\x8b\xd6\x61\x3c\x91\x7b\xaf\x8f\xa2\xb4\x68\x4d\x44\x51\x33\xbd\xae\x74\xea\x9e\x2c\xaa\x88\x68\x44\x6d\x51\xdb\x33\xa1\xa1\x41\x8d\xfd\x46\x4a\x33\x86\xd5\x6e\x25\x71\x48\xd8\xf6\x08\x76\xad\x7b\x32\x39\xea\xee\x67\x02\x09\x66\xd5\x43\x51\x05\x74\xdd\x2e\xf6\xbf\x15\x5d\x62\xaf\xc3\x52\x72\x2d\x3f\x1c\x03\x70\x3d\xe7\xa5\x67\x85\x20\x83\x88\x5d\xbd\x60\x3a\x9a\xb9\x58\x4f\x40\x7b\xa9\x06\x69\x6e\xda\xc7\xfa\x3c\xb2\x79\x0e\x79\x06\x99\x72\xa1\x52\xa5\x50\x43\x03\x11\x73\xc2\x5c\xfb\x38\xdf\x7f\x90\xeb\x8d\x15\xf0\xfe\xf6\x52\x2a\x75\xf8\x30\x70\xe7\xe3\x37\x94\x47\xa5\x0a\xc0\x37\x79\x7f\x46\x04\xf7\xcf\xa0\xb1\x84\x7f\xa2\x50\xb4\xa2\x14\x09\x51\x29\xf8\x04\xe5\x22\x39\x41\x93\x77\x8e\xc7\x5c\x04\xc8\xb5\xd9\x8e\x57\xf2\xfa\x4e\xa7\xe8\x87\x72\xbc\xdc\xc2\xd3\x62\xf9\x4e\xc9\x89\x1a\x88\x9d\x3a\xf3\x5d\xe5\xa0\xa8\x3d\x92\x4c\xb1\x8f\x38\x08\x4f\x73\x9d\x62\x25\x57\xaf\x7a\x6a\x3f\x62\xdd\x5a\x81\xec\x66\x6a\xe1\x23\x8d\x00\x78\x96\x6b\xe5\xdf\x96\xf3\x91\x1a\x36\xfd\xbd\x3e\x3c\xd9\xf9\x81\x7c\xbf\x86\xbc\xed\x8a\xbe\x01\xa2\xd8\xf2\xb9\x79\xa0\xe6\xf6\x2e\x2a\x45\xb8\x31\x75\x1c\x0e\xd8\x9f\xae\x87\xf3\xcd\xf9\x8a\x64\xd9\x08\xd8\xdc\x3b\xbe\xf9\x77\xd7\x30\x36\xc9\x9b\x68\xe1\x8e\x02\xce\xa0\xbc\xa1\xb8\x24\x0f\x0f\x8e\x15\xc5\x51\x1f\x97\xfc\x4f\x13\xe8\x60\x05\x35\x4f\x9a\xb4\xe7\xd2\x8d\xac\x76\x4b\x7a\x92\x54\x59\x43\xd9\xbb\x6e\x26\x62\x96\xe6\x70\xe0\x7c\xe8\xa4\x6f\xb9\xbd\x30\x90\x5c\x2f\x97\xa1\x6c\xde\x24\xbb\x9f\xd9\x56\xbe\x9e\x8f\x6a\x1e\xdf\xf2\xea\x91\xe1\x5d\x5c\xee\x9a\x0c\xda\x91\x44\x79\xbd\x46\xcf\x57\xce\xf2\xd1\xee\xca\x1f\xa8\x7d\x8a\xc8\x0b\x16\x5b\x7a\x3e\xdb\x59\xfc\xe0\x71\x20\x22\xb2\xc8\xef\xf8\x9e\xf8\xf6\x60\x66\x2e\xea\x14\x6d\x99\xf7\x7e\x91\x46\x29\xda\x25\xec\x8f\x13\x45\xc0\x2c\xe1\x70\xc5\x2a\xb2\xd2\x84\x7c\x5b\x78\x9b\x34\xfa\x9a\xd9\x56\x94\xc9\xa6\xd5\x4d\x02\x6d\x5b\xaf\x84\xe0\x41\xe3\x4e\x16\xcc\x88\x98\xf8\xe2\xd2\xfb\xab\xfd\xe0\x53\x23\x30\x11\x71\x28\xb3\x75\xb9\xd4\x77\x77\x39\x1e\xd8\x77\xee\x81\x7a\xf0\x68\xfe\x49\x69\x20\x92\x9c\x1c\xef\xb1\x07\xe7\x4e\x0c\x9d\x25\x34\xfd\x3f\x41\x50\x7c\xc8\x6a\xa5\xcc\xc1\x8d\xe5\xc0\x54\xb3\x33\x81\x39\x6a\x9a\x08\xdb\xa1\x6f\x11\x4b\x4b\xbb\x23\x6a\x60\x11\xd3\xc0\x4b\xbd\xac\xdd\xe0\x64\xd0\x59\x5c\xab\x3c\x3c\x5e\x9b\xc8\xf6\xcb\x36\xca\x80\xa3\x7b\xbe\x33\x16\x2d\x9d\xd5\x57\x3e\x86\x12\x7d\xa0\x49\x2e\xee\x57\x7e\x9b\x25\x7a\x9d\x83\xbe\x78\x54\xd2\x6c\xe9\x1c\x0b\x28\xe0\xbc\x62\xfe\x54\x51\x6a\xce\x1b\xe8\xe0\x0c\xb8\x77\xea\x06\x7e\xc8\x4e\xc3\x51\x3e\x56\x8e\x4b\x09\x1b\x81\xfa\x16\xc8\xb3\x7b\x7c\xbf\xe1\x7e\xb8\x23\xee\xd2\x31\x4e\x5d\x5f\xcb\x39\x1f\xbc\x51\x18\x1a\xd3\x2b\x81\x2d\x2b\xb4\x1d\x70\x79\x7e\x15\xac\xa7\x42\xce\x6e\x49\xb0\xcf\xb5\x69\xbd\xed\xc3\xe9\x8a\x59\xf0\x4e\x28\x74\xf6\x58\x3d\xf6\x95\x65\x04\x38\x70\xb8\x61\x35\xda\xab\x3c\x27\x08\x0a\xab\x61\x3c\x5b\x5c\xdd\x4b\x07\xc9\x93\x6f\x3b\xda\x85\xb4\x23\x06\xa3\x37\xbb\x93\xb0\xba\x0f\xec\xac\x7f\x7f\x13\xcd\xee\x99\xb2\x49\x21\x32\x19\x9e\xb2\x8a\x82\x9c\x27\xf3\xcf\x2e\xdf\x44\x1c\xd8\x4b\x5f\x96\x29\xc7\x85\x64\xf9\xfd\xf5\x6f\x8f\xaf\x1d\x87\x12\xb4\x79\x0e\x17\x26\xa8\xb6\xe4\x1b\x17\xa9\xe8\xa4\x9c\xb6\x55\x93\x62\xd2\x3f\xce\xde\x6f\xe4\x60\x72\x05\xef\x89\xba\xcf\x0c\xe4\x53\xf2\xb5\xff\xf9\x24\x88\xe6\x2a\x0a\x08\xff\x6b\xec\x1b\x24\x9a\x56\x0f\xa2\xb5\xd4\x3b\xa1\x6f\xf0\x31\xc4\xe3\x7b\x79\xb3\x0c\x3a\xaa\xaf\x61\xa1\x4a\xad\x97\xd1\xf2\x34\xc5\xeb\xaa\x7d\xb0\x91\xc2\xae\x11\xcb\xc7\xf1\x35\x7d\x4e\x92\x93\x07\x26\x27\xec\x78\x18\x75\xfa\xbe\xa2\xa4\xf2\xab\x3b\x3f\x97\x55\x3b\xc6\xe1\x53\xfa\xfc\x7b\x8c\xf6\x3d\x87\xb6\x3c\xd3\xdb\x49\x9d\xd9\xe9\xf1\xab\x4f\xd4\x87\xe6\x26\x1d\xa2\x09\xf5\xfe\xe0\x7a\x3b\xba\xbf\xa7\xab\x43\xca\x04\x17\xe1\xb4\x9a\xf0\xf4\x85\xaa\xe2\x20\x82\x13\xe8\x41\x8e\x23\xa5\x0a\x53\xc9\x37\xd1\xfe\x84\xa4\x81\x4e\xba\xcb\xdc\xe4\x0b\xfe\xa9\xdb\x71\xbb\xbc\x00\xd3\xdf\xf4\x1f\x6e\xc9\xd4\x2c\x5c\x80\x18\x3b\x3f\xab\x51\x3c\xd8\x2b\x23\xc0\x03\xf1\xb0\x91\xdf\x26\xd7\x3b\x05\xbd\x21\x38\xda\x8e\x4b\x05\x1f\x5a\xb6\x78\x27\xfb\x97\xdf\xf5\x39\x19\x65\x3b\x22\xc1\xee\x94\x57\x61\x89\x91\xe6\x69\x99\x1e\x4a\x21\x21\x58\x0f\xfd\x68\xb5\xc8\xc9\xd4\x3e\xfe\x8d\xe1\x46\xc4\x74\xef\x4e\x79\x5d\x30\xcc\xb9\xcf\xd6\x22\x42\xaa\xcd\x8d\x41\xb8\x44\xf5\x5f\x52\xfe\x31\x51\x2c\x93\xbb\xcb\x0a\x8e\xb5\x36\x6c\xdf\x35\xce\xa0\xea\xa7\xc8\xbd\x72\x5f\xc7\x36\x29\xaa\x1f\xcb\x4a\xcd\x68\xe8\x3f\x15\x4e\x4e\x74\x75\xb7\xf7\xfb\x71\x3f\x70\x7e\x28\x6b\x8b\x5c\xea\xf0\x83\x1d\x49\x83\x23\xc7\xca\xc1\x5e\x53\x9a\x3f\xb0\x32\xa6\x79\x98\x94\x11\x45\xc1\x7d\xad\x09\xbb\xa5\x05\x3e\xdf\xb9\x0c\xcf\x85\x12\x69\x29\x0f\x9a\xfb\x7e\x3f\x81\x86\x88\x47\x32\xf2\x52\xd0\xfe\xf2\x49\x57\x3b\x91\x1f\xc2\x98\x1a\xc1\x1c\x56\x52\xba\xdf\x6a\x02\x29\x2b\x4a\x36\xf4\x98\x3a\x96\x08\x3f\xb6\x37\x27\x8d\xfa\x21\x49\x45\x46\x4a\x7b\xd7\x6c\x4d\x71\x1a\x69\xf4\x1b\x96\x64\x3e\x4b\xdf\xcb\x7a\xd4\x87\xea\xb1\xe9\x2f\x87\x32\x7d\xef\x9c\xda\xc8\xa0\xf6\xaa\x0f\x6f\xbc\xb0\xf0\x5a\x9e\x29\x5b\x9f\x5d\xba\x48\x00\xd7\x3b\xba\xed\xdc\xf9\xda\x5f\xab\x4c\x3a\xfc\x07\x79\x54\xa6\x96\xc9\x6d\xf2\x64\x4b\xc1\x75\x56\x07\x6a\x74\x3c\xd5\xf6\x50\xa7\x93\x2d\x85\x56\xa6\x46\x42\xed\x84\x97\x7a\xc5\xb6\xd8\x27\x76\xe6\x54\xdc\xd6\xb1\x44\xdf\xc4\xb0\xfc\x36\xdf\x62\xe0\x28\x6a\xdf\x2c\x5c\x27\x56\x1e\x3a\x49\xf4\xbf\xa2\x3f\x1d\xea\xb9\x52\xbd\x4a\xcc\x2b\xea\x4c\xfd\x3c\xde\x9c\x5b\xa7\x34\x89\x84\x1b\x2d\x97\x39\x71\x43\x1e\xeb\xea\x74\x20\xac\x84\xd8\xad\x40\xf1\x88\x5e\x1c\x63\x14\x11\x45\xef\xd8\xfb\xc7\x23\x65\xfa\xc5\xfb\xe5\x70\x02\x7f\x05\xf2\xba\x4a\xbd\x2a\x14\xc0\x6a\x2b\x70\x6c\x89\x17\x56\xe9\xac\x7c\xfa\x15\x29\xc1\x13\x4b\x1e\x1f\x8f\x9a\x7c\xde\x83\x48\xd2\xfe\x57\x27\x12\x23\x6f\x5d\xc3\x08\x91\x43\xf8\x44\x58\xdf\xfc\xab\x8a\x22\x4d\xfb\xbd\x8b\x2e\xc9\x47\x7b\x2f\x26\xb0\x4a\x38\xca\x9e\x54\xaa\x0c\x21\xe3\xa5\x31\x36\x8c\xc8\xab\x32\x8c\x52\x49\xe0\x07\x8b\x5e\x58\xce\x03\x0e\xab\xeb\x21\x3f\x4f\x78\x29\x97\x3f\xfc\x41\xfc\x58\xb3\xf7\xd3\x19\x29\x3e\x4b\x0f\xfd\x49\xfe\x50\xf1\xb3\xe7\x2e\x03\x2b\xea\x32\x7d\x64\x05\x59\x26\x96\xe6\x78\xf2\x53\xcc\xc9\xfb\x4b\x48\x38\x89\x5e\xb6\x80\x8b\xec\xc3\x5c\xf8\x06\xa7\xc4\xc1\xbe\xa8\xa6\x37\x26\xac\x70\x46\xe2\xb5\x52\x26\x0d\x4b\x43\x28\x37\x77\xc7\xc9\x7c\x70\x45\x6f\x28\xfc\xfb\x60\x6c\x98\x33\xe7\xe0\x93\xe1\x87\x28\x90\x4d\xae\x28\x60\xf1\x20\x59\xc5\x31\x19\xa9\x81\xe0\x11\x60\x88\x2e\x51\xe2\x5b\xbf\xef\x73\x4b\x8e\xa0\x65\x41\xee\xd8\x43\x80\x48\x9e\x48\x22\x2a\x63\xd5\xcc\xe1\x56\xbc\x3c\x02\xe8\xb4\xb3\xa2\xf0\x48\x85\x5f\x2b\x74\x40\x4a\xd5\x1c\x4c\xf2\x8d\xc2\xf9\xf3\x54\xb9\x4d\xe4\xaf\x23\x94\x87\x67\xb2\xd0\xdc\x60\xfe\x58\xf8\xc6\x9e\x4e\x97\x2a\x9d\xb8\xb9\x6b\x97\xd4\xac\x35\x19\x83\xe6\x98\x0a\x3a\x8b\x24\xca\x6a\xe2\xa1\xa4\xb2\x4f\x5d\xee\xa6\x59\x5d\xd2\x62\x06\x7b\x69\x2d\xe3\xde\x96\xd8\x2a\x4a\x88\x46\xc3\x23\x74\x7e\x67\xfe\x48\x61\x3d\x6e\xf9\x62\x1b\x38\xb1\xda\x42\xee\x60\x94\x81\x6f\x5f\xae\x8c\x28\xed\xd8\x7d\x38\x1c\xde\xae\xef\xcb\xbb\x61\x17\x01\xec\x66\xde\x7a\xbb\x8f\x9b\xf3\x87\x16\xfb\x4b\x03\xba\x32\x30\x60\x35\x71\xbe\xcb\xcc\x61\x7f\x91\x68\x98\xc5\xc1\x44\xd9\x84\x2c\x8e\x30\xdb\x23\x75\xc1\x34\xe4\x0d\x6b\x16\x7b\x4c\xb8\x02\x70\x31\x7c\xef\xc7\xca\x23\xd2\xf0\xfe\x9b\xff\x61\x7d\xcc\xb6\x51\x79\xb2\xcf\x9d\xd3\x8a\xc6\xb9\x0e\x52\x1b\x5a\x2b\xc9\x9b\x1d\x20\x25\x27\x60\x28\x7c\xb4\xcd\x07\xcd\x4f\x82\xd1\xa6\xc3\x6b\xac\x43\x98\xa2\x8e\x6b\x9c\xb3\x66\x57\xdd\x1b\xd2\x8a\xb8\x56\xca\xd8\xd6\x76\x77\x9f\x46\x6c\x0b\xdb\xec\xb9\xb7\x99\x1e\xb4\x1d\x60\x86\x0c\xfc\x88\xb3\xa7\xed\xf3\xd3\x09\x45\xa1\xa9\xc0\x44\x52\x74\x73\x28\xaf\xf5\x71\xf7\x43\x93\xc5\xe9\x2c\x0a\x7c\xed\x04\x29\xb9\xf3\x4f\x1b\x3b\xea\xa0\x77\x32\xc4\x8a\x93\x82\x05\x5a\xbd\x26\xe5\xab\x54\xf9\x1e\x15\x01\x14\x08\x34\xa3\x7e\x3a\xdc\xce\x1e\x18\xc0\xfb\xdb\xeb\x29\x6a\x22\x0d\x68\xc8\xaa\x5e\x6b\x3a\xef\x72\xa3\xfb\x37\xfb\x3a\x02\xd7\x04\xef\x98\xa6\x4f\xac\x9a\xed\x84\x11\x79\x1e\xe1\x44\x85\xda\x38\xea\xa1\x47\x66\x59\x2a\x33\x63\x34\x60\x3c\x1a\x0c\x89\xc3\x84\x76\x15\x09\xa5\xa8\xe3\x94\x36\xb4\x22\xd4\xdf\x96\xe7\x97\xb7\xf3\x7a\x23\xe7\xd7\xfe\xd2\x59\x78\x9b\xab\xe4\x8b\x73\xd3\xf5\xc6\x4f\xd7\xd3\x33\x5f\x78\x77\xce\xe7\xfd\x98\x29\x49\x3a\xff\xc5\x21\x33\x96\x76\x3c\x3b\x1f\x91\xb9\x8e\xee\xbc\x50\x5f\xe4\x30\xb2\xf3\x42\x35\x37\x49\x34\x81\xd6\xbe\xd5\xcf\xbd\xc2\x92\x0c\x25\x23\x7d\xe9\xbc\x6b\x08\xa7\x88\xd2\x98\x55\x16\x83\x35\xc3\x86\x98\x13\x3d\xa7\xfb\x5c\x27\x7f\x6f\xcb\x54\xa1\x85\xbd\x6c\xee\xa4\x7e\xb0\xbc\x52\x71\xe7\xd1\x6e\xa5\xfb\xcc\x57\xce\x87\x79\x25\x00\x2f\x5c\x3a\xa2\xfb\xc7\x5a\xec\x00\x89\xa8\xbb\xfd\x48\x5c\x98\xa0\x03\x2a\xc4\xd1\xe7\x15\x7f\x70\x51\xce\xcb\xc6\xa1\x93\xcf\xe7\x18\x8a\x49\x20\x57\x54\x7c\x85\x6d\x82\x08\x6f\xf3\x50\xef\x6f\xe4\x5f\xe7\xcd\x67\x26\xc8\x35\x97\x10\x58\xdd\x91\x88\x53\xa9\xe6\x98\xd7\xa1\xb9\xb2\xa1\x0d\xa7\x1a\xcf\x44\xda\xa2\x7b\x71\xb6\x23\x64\x95\x68\x6e\x96\x8f\xa5\x95\x6b\x79\xea\x5c\xcf\x6d\x2f\x24\xd2\xbb\x05\x82\xe1\xd3\xc2\x5d\x35\xba\x3f\x93\x14\x7f\xf8\xef\xc1\x14\x05\x0a\xe6\x7c\xd4\xde\xbc\x4f\x26\x01\x27\x8b\x42\xb0\xa5\x0e\xd9\x2a\xfd\x74\x23\x79\x37\xff\xaa\xac\xbe\x11\xf0\x1a\xf2\x36\x62\xb1\x00\x49\x3b\xde\xb4\x7c\x71\x57\x13\xd8\xed\xe1\x65\xd5\xdd\x2c\x9a\x0e\x51\xee\xc2\x49\x73\xbe\x52\xb1\x20\xb4\x9e\xe5\x2d\xea\xcf\x56\xf2\x7d\x6e\xfb\xa7\xb0\x36\x0a\x14\x38\x05\x61\x70\xc5\x8c\xa5\x4e\x3e\x99\xd0\x29\x3b\x53\x5c\x0a\xa6\x6f\x1c\x90\x59\x8a\xfc\x51\x61\x75\xda\x92\x1a\xa3\x97\xcb\xf2\xfa\x3a\xb0\x9e\xfb\x20\xd2\xca\x09\x6a\x62\x55\xd5\xfb\xfb\x9d\x24\x04\x09\xd5\x16\x37\x85\x16\xc0\x7b\xbf\x9e\xf0\x85\x4b\xa9\x1a\xe1\xea\x7d\x58\x8f\xe1\x34\x9c\xc9\x01\x3e\xb3\xc0\x3e\x1c\xce\x6e\x81\x61\xd5\xec\xaa\xab\xd4\x99\x28\xcc\xac\x32\xaa\x20\x7f\x29\xc2\x8c\x5f\x3f\x65\x09\x01\xf5\xb5\x77\xc6\xcc\x47\xc7\xc2\xe7\xf9\xed\xde\xcc\xbc\x82\x5c\x46\x70\xf9\x58\x3b\x26\x82\x56\xbb\xc9\x22\xfb\x78\xc7\x1f\xfc\xde\xc2\xd6\x2c\x11\x0a\x5b\xfa\x0e\x25\x28\x3d\xe2\xd5\x03\x72\x7e\xea\xc9\x85\xc4\x6b\xea\xb1\xea\x64\x25\x36\x5a\x56\x22\x65\xad\xb1\xad\xaf\x47\xa6\x3a\xb0\x26\xf4\xb6\xcc\xc8\xe1\x5a\xa5\x56\xd4\x4f\xe2\xa5\xd5\xb7\xb2\xf0\xfe\xf5\x59\x5f\x70\x93\x45\x3b\xf1\x95\x57\xe2\x7f\x47\xb1\x4b\x91\x86\x07\xf1\x45\x30\xbe\x22\x44\xbf\x7f\xb1\xc8\x9c\x7a\x1f\xf6\x44\xeb\xf2\xa1\xf3\x53\xfa\xdc\xad\x06\x26\x67\x17\x9f\xb6\xf2\x12\xe6\x3f\xbc\x2c\xbb\xf9\x2e\x85\xa5\x2e\x24\x6c\x90\x62\x14\x94\x24\xa1\xbe\xd4\xa0\xe8\xd0\xb7\x73\xe3\x76\x89\xb9\x65\x8c\x85\xf3\x86\x48\x27\x3e\xb9\x64\x21\xe8\xaf\x8a\xba\xf4\x00\xe4\xa2\x4b\x1a\x4b\xa1\xc4\x83\x4c\x9a\x7b\xc2\xf9\xfe\xa4\x6f\xa2\x85\xbb\x8f\xb6\xbc\xc0\xbf\xe3\xb7\x0f\xa3\x12\x39\xe7\x37\xa6\x69\x2a\x74\x3e\xf9\x44\x94\x1a\x0a\xbb\xdc\x38\xc9\x0a\x2c\xce\xa9\xc7\x79\x11\x9c\x69\xb8\xd6\x22\xf3\x00\xc7\x64\xb5\x05\xcf\x00\x46\xb2\xdb\xf9\xe4\xb2\xcd\xf4\x95\x21\x73\xab\x2b\x2f\x07\xbc\x97\xf3\xf9\x34\x7f\x5f\xfc\xa8\xcf\x27\x9e\x25\xb0\x56\x66\xd4\x3e\x1f\x98\x71\x82\xf7\xdf\xbb\x34\xde\xe0\x59\x62\x85\xbc\x97\xa5\xe0\xaf\xb6\xec\xbf\xc2\x38\x8a\x46\x78\x71\xf1\xf5\x61\x42\xba\x74\xf8\x88\x25\x28\xcf\xca\x00\x55\xfa\x0e\x73\x1c\xb8\x69\x47\xd7\x33\x50\xe3\x1f\x17\x24\xc7\x08\x09\xa3\x36\xa8\x9e\x9d\x20\x63\x87\x9c\x2a\xef\xdf\xcb\xfb\xc8\xa7\x37\x57\xcf\x7e\x89\xd1\xed\xa4\x81\xc4\xf3\xa8\x1e\x8c\x04\x97\x9a\xea\xd0\xf0\x62\x28\xef\x36\xa9\x69\x62\x21\xcc\x61\xa2\x89\xdb\x3b\x2b\x5a\x19\xed\x6e\xc5\x8d\x25\x15\x2c\xdf\xe3\x14\xbe\xa5\x8b\xe2\x33\xb0\xa3\xc8\x5f\x42\x11\x2a\xcd\xf1\x0e\xd5\xa2\xb9\x5e\xcf\xe7\xed\x81\x73\xc2\x0f\x3b\x5f\x74\x9a\xdd\x6f\x04\x57\x93\x72\x5b\xfa\x81\xa1\xb9\x89\x12\xbe\x59\xef\x16\x30\x59\x3f\xfb\x5c\x96\xfc\xf5\xdd\xa2\x6a\x55\x30\xcc\xb6\x6f\xcd\xfa\x94\x52\x16\x1a\xba\xce\x0f\x96\x21\x31\xa8\x27\xf0\x02\xa1\xee\x76\x1e\xae\x2d\x4d\xdd\xbb\xe4\x5b\xce\x12\x8e\xb4\x64\x22\xea\x5c\x7c\x05\x9a\x4d\xfa\x95\x60\x49\x7a\xd9\x43\xa7\x03\x11\x12\x86\xce\x4f\x7c\x2b\x32\x6b\xe5\x2a\xa1\x2b\x81\x3d\xb2\xfb\xd8\xb8\xeb\x44\x4d\xed\x32\x75\x0c\x52\xa5\x5f\xa0\x35\x6b\x58\xcc\x9d\xb5\x2c\xd6\xf9\xe6\x44\x74\x16\xbb\xcb\x12\x34\x69\xe7\xad\x71\xfe\xd9\xee\x89\x3a\xbd\x6b\x22\x9f\x48\x82\x5a\x3a\x62\xab\x2e\x12\x58\x9f\xd1\xb0\x6a\x2f\x9d\x80\xbd\x9d\x55\x1a\x1f\xdf\x8b\xf7\xb2\x1f\xa2\xf5\xd8\xe1\x6f\xff\xb4\xa4\x13\x1f\xa7\xc5\x55\x7e\xf3\x9b\xb1\xc2\xa2\xa9\x33\x8f\x11\x57\x63\x2f\x53\x18\x2f\x4e\x05\x71\xcd\x2d\x4f\xad\x98\x5c\xac\xcb\xf3\xdc\x91\x75\x3d\x9f\x02\xf5\xbf\x25\x60\xc0\xc3\x00\x45\x4a\x13\x48\x9f\x42\x67\x61\xbf\x8b\x22\xad\xc4\xc7\xec\x86\xb8\xa6\xc7\x1f\xdd\xdf\xd9\x4f\xf8\x93\x99\xeb\x2f\xd9\x9d\x9e\x49\x2a\xc0\x0c\xa7\x08\x21\xaf\xa9\xed\x02\xe9\x57\x35\xba\x8a\xdc\x20\x75\x68\xfc\x8a\x26\xb0\x12\x9f\x7e\xf9\xac\xb5\x3d\x96\xb9\x1b\x2c\xfc\x47\x24\x83\xd0\x34\x24\x41\x52\x84\xae\xeb\x45\x48\xa1\x79\x25\xff\x1e\x7d\x6c\xa9\x57\xc6\x16\x29\xc8\x16\x4f\x7d\xfe\xb2\x9e\xcb\xf6\x8a\x25\xd6\x04\x2b\xea\xc8\x76\xc7\x7c\x12\xbe\x76\x1c\x37\x8f\xb5\x18\x04\x60\x5b\xb5\x5d\x9f\xbd\xfe\xf0\xb2\x53\x45\xd8\x56\xf9\x0f\xb1\xde\x0a\xf5\x90\x41\x75\x73\x32\xe6\xb7\xe3\x41\x8b\x6a\xd8\x7d\xbc\x06\x00\x21\xdc\x66\x56\x4b\x7a\x10\x4e\x5c\xdc\x81\xfe\x0a\xd2\x68\xda\x9f\xf6\xde\xd0\xc0\x78\xc7\x8e\x6d\x54\x82\x6d\x03\x72\x45\xf2\x37\x31\xc4\xe4\x60\x85\x6d\x34\xaf\x8f\xb1\x8f\xf1\x24\x7a\x5e\x7a\x5d\xd4\x17\x89\xbd\xd3\xaf\x33\xab\xe7\x8c\xb8\x0c\xb5\x8d\xd9\x5e\x4b\x7e\x5a\x34\xd7\x3a\x0d\x3c\x37\x5c\x6e\xf4\x92\x3e\x17\xaa\xf9\x9c\x9b\x2d\xe4\x54\x88\x92\x71\xea\xf9\x70\x57\xc6\xca\xd9\x74\xc6\xd2\x6b\x33\xac\xac\x0c\xf1\xc2\x46\x3d\x39\xe9\xf0\xf9\x7f\x83\x56\x83\x05\x31\xa1\x63\x45\xf5\xc8\x0b\x44\x3b\xb9\x32\x89\xa3\x5d\xf6\xae\x48\x5e\x26\x41\xe2\x44\xc5\x3a\x26\xb9\x4e\x84\xdc\x0b\xf1\x26\x6f\x49\xe0\x2c\x3e\xc7\x69\x96\xbe\x7b\xaa\x52\xd3\x29\x1d\xfc\x07\xa2\x90\xcb\xf0\x69\xa7\x9a\x19\xe7\xcc\x1d\x03\xab\x6b\x96\x6b\xf9\x1c\x27\x3f\x40\xd7\x26\x61\xbb\xff\x36\x56\x29\xae\x78\xb6\x5f\x8e\xc9\x93\x82\x1a\x7d\xf6\x53\x9a\xac\x93\xcd\xb9\x9c\x59\xb9\x2d\x8e\x98\xda\xb6\x1a\x32\x17\x36\x91\x23\xd0\xf2\x0c\x25\xde\xf7\xfb\x61\xf5\x27\x8f\xfc\x21\x34\xb3\x28\x8b\x13\x10\x70\x86\xd5\x19\x8c\x80\x9d\xfa\xb7\xa3\xab\x60\xcd\x6e\x4a\x25\x94\x4e\xad\x8b\x44\x32\x94\x49\x18\x7a\xec\x81\x1d\xa1\x39\xed\x89\xac\xc1\x98\x85\xc8\x9d\xbf\x59\x91\x58\xaa\xe4\xa1\x01\x61\x84\x71\x76\x7b\xa9\x08\xcc\x21\xc2\xaa\x9c\x78\x91\x54\x4a\x3f\x77\xee\x72\xdb\x85\xcf\x3c\x72\x8e\xac\x77\x2d\x0f\x5b\xc0\x45\xcf\x31\x10\x50\xbb\x26\xc5\x58\x47\xe4\xb0\x92\x25\x16\xc5\xbe\x88\xf3\xd4\x63\xa5\xc5\x57\xb3\x93\x1b\xb1\x5a\x9e\xb6\x9f\x5d\x4c\x06\x4d\x88\x4e\x63\xca\xb3\x76\x1f\x87\xf8\xf3\x20\xcd\x5f\x84\x05\x85\xec\x5e\xd4\x92\xb0\x74\x2d\x32\xcb\xc7\x5c\xf6\xf8\xda\xd1\x94\x50\x59\xf5\x42\x60\x84\xe3\x29\x3f\xfa\x08\x48\xab\xf9\xee\x7f\xfe\xf7\x3f\xfe\x2f\x00\x00\xff\xff\x9c\x84\xb0\xba\xce\x07\x01\x00")
-
-func dataPasswordsJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataPasswordsJson,
- "data/Passwords.json",
- )
-}
-
-func dataPasswordsJson() (*asset, error) {
- bytes, err := dataPasswordsJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/Passwords.json", size: 67534, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataQwertyJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x98\xd7\x52\x23\x3d\x10\x85\xef\x79\x0a\x18\x72\xce\x39\xe7\x9c\x33\x98\x9c\xc1\xe4\x8c\x31\xcf\xfe\x6b\xf8\xb7\x56\xdf\xa9\xb2\xc6\xbe\xd8\xbe\xd9\x6a\x2f\x33\x5f\xb7\x5a\xad\xa3\x63\x67\x8a\x8a\x8b\xa3\xc9\xa7\xa3\x87\xcb\xa8\xa7\x38\xfe\xe0\x3e\x96\xb8\x70\xf7\x37\x74\x1f\x0e\x7f\xa2\xba\x3f\xf1\xdd\x6b\x3a\x9d\x2b\x8e\x5a\x86\xfe\x3e\x13\x3d\x2e\xcb\xf3\xbf\xe1\xde\xff\xff\x13\xa5\x22\x92\x7b\x7b\xfc\x5b\xbb\x19\x1f\xef\x65\xf3\x67\x6c\x1c\x8c\x84\x5c\x4a\x30\xca\x09\x02\xda\xca\x7c\xc2\xb3\x71\x1f\xbf\x6f\x2a\xb8\x8c\xe0\xd6\xd2\xfc\xe0\xf6\x72\x0f\x7b\x5a\x91\x24\x02\x2e\x27\x18\xd5\x04\xc1\x1d\xfb\x1e\xf6\xb2\x26\x49\x04\x5c\x41\x30\x5e\x0a\x82\xbb\x6a\x3c\xec\x75\xdd\xc7\x9f\xdb\x0a\xae\xb4\xda\xbc\x2a\x82\x51\x4d\x10\xd0\x54\xed\x13\xde\x2f\xfa\xf8\x6a\x5a\xc1\xd5\x04\x77\x57\xe5\x07\xd7\x1f\x78\xd8\xc3\x92\x24\x11\x70\x0d\xc1\x9d\x15\xf9\xc1\x48\x1e\x57\xc9\x7e\x0b\xb8\x96\x60\x54\x13\x02\x4b\x12\xf4\x3e\xde\x13\x01\xd7\x11\x7c\x3b\xef\x1f\xbc\x99\xf5\x71\x7a\xce\xc7\x0d\x03\xc1\xe4\x02\xae\x27\x18\x1b\x13\xac\xb2\xbf\x36\xf7\xe4\xb8\x7e\x0b\xb8\x81\xe0\xba\xbe\xdc\x55\x72\x0c\xdd\x58\x15\x54\x71\x23\xc1\x58\xa6\xc0\x2a\x9d\x56\x15\xd2\x7c\x21\x37\x59\xcd\x5b\xb3\x95\x22\xb7\x10\xdc\x5c\x92\x1f\x0c\x09\x8c\xb5\x92\x49\x04\xdc\x6a\x25\xc8\x6d\x56\x82\xdc\x6e\x25\xc8\x1d\x04\xa3\x9a\x20\x18\x82\x12\x8b\x30\x93\x08\xb8\xd3\x4a\xe9\xbb\xac\xe4\xad\xdb\x4a\xe9\x7b\x08\xa6\x40\xf0\x54\x51\x6d\x78\xbe\xa9\x1c\xb1\x20\x08\xb9\xd7\x8c\xdc\x67\x25\xc9\xfd\x56\x97\xc8\x80\x95\x24\x0f\x9a\x49\xf2\x90\x95\xc0\x0d\x03\x2c\x00\xc8\xad\x00\x9e\x57\x7d\xfc\xb5\x13\x96\xe4\x11\x56\xfc\xb6\xe1\x5f\xba\x98\xf4\xf1\xe5\x94\x8f\xef\x16\x0a\x6b\xf2\x28\xc1\x1f\x5b\x1e\x70\x3a\xe6\xe3\xf3\x09\x1f\x23\x79\x22\x78\x8c\x60\x2e\x93\x3a\x4e\xe9\x65\x92\x93\x51\x1f\xbb\xa2\x04\x3c\x4e\x30\x7b\xc9\x4d\xe2\xc5\xc1\x24\x5c\x95\x2b\x4a\xc0\x13\x04\xf3\x41\x02\xa8\xe9\xec\x3d\xf7\xc4\x55\x2f\xe0\x49\x82\xb9\x4c\xc2\xa8\xe9\xdc\xc8\xe3\x11\x49\x22\xe0\x29\x82\x59\x0d\x61\xd4\xf4\xeb\x99\x9c\x13\x12\x27\x11\xf0\x34\xc1\x04\xf0\xb2\xa0\xbe\x53\x86\xa9\x54\x2e\xa1\x80\x67\x08\xe6\x32\x99\x84\x97\x05\x61\x94\x43\x57\xbd\x80\x67\x09\xe6\x32\x09\x63\x95\x54\x27\xaa\x96\x4b\x22\xe0\x39\x82\x59\x0d\x61\x94\x7d\xaa\x13\x55\xcb\x25\x11\xf0\x3c\xc1\xdc\x0c\x56\xcf\x84\xa8\x32\xf1\xe4\x2d\x10\xcc\xf1\x61\xbf\x99\x04\x7d\x4d\x04\x2f\x12\xcc\xbe\x72\x12\x78\x39\xb3\x2d\xec\xb7\x5b\x95\x80\x97\x08\x66\x5f\x09\xa3\x2d\xe6\xd5\xca\x7e\xbb\x24\x02\x5e\x0e\xe9\x31\x44\x5f\x6c\x31\xf5\xe4\x68\x38\xac\xc7\x2b\xac\x98\x8a\x46\xe1\xa1\xc9\xe4\x51\xa7\x04\x38\x9d\x11\xf0\x2a\xc1\xa8\x40\x2a\x63\x42\x0a\x15\xf5\xdb\xdd\x26\x02\x5e\x23\x98\x8a\xc6\x2a\xe9\x5e\xa9\x21\xd4\x16\x57\xbd\x80\xd7\x09\xe6\x4b\x74\xac\xd4\x0d\x4e\x0e\xc7\xd0\x8d\xa7\x80\x37\x08\xe6\x8d\xc0\xfe\xb1\x32\xcc\x7a\xe2\x1c\x6f\x12\xcc\x9b\x99\x93\xc0\xdb\x84\xfd\xe6\x55\xe6\xf6\x47\xc0\x5b\x04\xe3\x3a\x97\x97\xb8\x61\x58\x55\x62\xc5\xdb\x04\x73\x94\xb8\x61\xec\x37\xe5\x94\xc7\xde\xb5\x4b\xc0\x3b\xa1\x03\xc2\xd1\x63\xf5\x18\xb1\xc4\x8a\x77\x59\x31\x75\x80\xc7\x98\xdf\xfa\x69\x31\xc5\x2d\xbb\xf3\x2d\xe4\x54\x8a\xe8\x02\x7e\x5a\x2a\xd8\x16\xee\x11\x4c\x89\x41\x9d\xd2\xa4\x54\xea\x3b\xf7\x1f\xe2\x05\x08\x7a\xdf\xea\xeb\xde\x81\xd5\x2f\x2d\x87\x81\xc9\x08\x82\x13\x7c\xb4\x80\x8f\xac\x3c\xf2\xb1\x95\x47\x3e\xb1\xf2\xc8\xa7\x56\x1e\xf9\xcc\xca\x23\x9f\x5b\x79\xe4\x0b\x2b\x8f\x7c\x69\xe5\x91\xaf\xac\x3c\xf2\xb5\x95\x47\xbe\xb1\xf2\xc8\x69\x2b\x8f\x7c\x6b\xe5\x91\xef\xac\x3c\xf2\xbd\x95\x47\x7e\xb0\xf2\xc8\x8f\x56\x1e\xf9\xc9\xca\x23\x3f\x5b\x79\xe4\x17\x2b\x8f\xfc\x6a\xe5\x91\xdf\xac\x3c\xf2\xbb\x95\x47\xfe\xb0\xf2\xc8\x9f\x56\x1e\xf9\xcb\xca\x23\x67\xcc\x3c\xf2\xb7\x95\x45\xce\xda\x59\xe4\x9f\x7f\x6e\x38\xdd\xbf\xd9\xa2\x6c\xd1\x7f\x01\x00\x00\xff\xff\x4c\xae\x50\xc0\xce\x20\x00\x00")
-
-func dataQwertyJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataQwertyJson,
- "data/Qwerty.json",
- )
-}
-
-func dataQwertyJson() (*asset, error) {
- bytes, err := dataQwertyJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/Qwerty.json", size: 8398, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-var _dataSurnamesJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\x7d\x5b\x62\xf3\x3a\xcc\xdc\x5e\xfc\xdc\x15\x74\x0d\xdd\x41\x9f\x28\x89\x96\x18\x51\xa2\x0e\x29\xda\x9f\xd3\xcd\x17\xc0\x0c\xe8\xfc\x4f\x27\x27\x5f\x12\x4b\xbc\xe0\x32\x18\x0c\xfe\xdf\xe3\xff\xa4\x76\x3f\xfe\xf7\xff\x7d\xb4\x23\xdd\xdb\xe3\x7f\x3d\x7e\xca\x76\xb6\x72\xca\x57\xef\x94\x73\x0a\x47\xb3\x6f\x9e\x51\xff\x3b\xd5\xf2\xd6\x7f\x5a\xc2\x2b\xe9\xff\x1f\xf2\x23\xb1\xe2\x67\xf1\x4b\x47\x29\x35\xca\x7f\xef\xf0\xc9\x45\xff\x25\x9c\x4b\xac\xf8\xb7\x9f\x30\xef\xfc\xd3\x5b\xba\xf5\xa7\xb6\x50\x2b\xfe\x50\xa8\x77\xd2\x7f\xb9\xb7\x72\x5c\xf8\xa1\x35\xd4\x39\x85\xf1\x8f\xf1\x57\xbe\xac\x65\x4a\x7c\xbc\x39\x87\xba\xdb\xb7\x96\x9a\xd6\x6e\xff\x9c\xe3\xdb\xfe\x5c\x8e\xfa\xd7\xdf\x21\xef\xf6\x74\x5b\xc8\x59\x1f\x45\x1e\x56\x7f\xf3\x53\xfa\xb9\xea\xb7\x63\x3d\xf5\xf1\xf4\x37\xf7\x64\xdf\x7a\xcb\x9f\xda\x6e\xfd\x0b\xe5\xb2\xef\x6f\xc9\x7e\x75\xad\xd1\x7e\x35\x2c\x58\x90\x29\xe0\x2f\xaf\xe5\xfc\x0d\xd9\x7e\xf2\x8c\x5c\x82\x59\x1e\xd7\xfe\x51\x56\x74\xde\xa2\xfd\xfe\x15\xab\x3f\x7f\xac\xb7\xfe\x85\xbb\xd7\xd3\x7e\xea\xd2\x8f\x48\x57\xb3\xdf\x3c\xae\x89\xbf\x20\x2f\x67\xff\x1c\x5f\xe1\xd4\x7f\x8b\xcb\x3b\xd4\xc5\x7e\xaa\xc8\xcf\xdb\xf7\xda\x1d\xe5\x9b\xfa\xb8\x2d\x9c\xf2\x51\xbf\xb6\x01\x5c\xd2\x5a\x56\x59\x78\xfd\x22\xc6\xc5\x7e\xad\xec\xf8\xf7\x35\xe8\x63\xf2\x83\x8e\x5e\xaf\xed\x63\xaf\x94\x72\xd4\x2f\x6a\x7a\xc5\x1a\xf0\x1b\x97\x3d\x43\x4d\xf3\xa6\x1f\x8e\xd7\x2b\xff\x74\x5d\x8a\x3e\x8e\x2d\xb2\xfd\xe7\x96\x8f\xb5\x23\x72\xc5\xdb\xf7\x7b\xad\xc1\xfe\x5e\x38\x12\xde\xfe\x1d\x6e\xfc\x8b\x9c\xa3\xb2\x37\x3c\xf7\x82\xa7\xbc\xe4\x43\xa2\x3d\xd6\x79\xc6\x5b\xdf\xe9\x5d\xca\x62\xcf\x55\x71\xf8\x6a\x69\xcd\x76\xed\x7b\xa2\x64\x29\xe2\x61\x6f\xf3\x13\xcf\x1d\x8b\x22\x8f\x5c\xf5\x63\xaf\xf2\xc6\x1b\xe6\x62\x5b\x7b\x85\x7b\x3c\xd9\xd6\xd7\xcd\xfe\xe6\x53\x0e\xa9\x7d\xf1\x0e\x6d\x93\x23\x70\xe3\xf1\xfa\x8d\x63\xdd\xd2\x71\x14\xfb\xab\xcf\xd2\xee\xbf\x3b\x8e\xdb\xf0\x09\xe7\x6d\x07\x2b\xfe\xb3\x17\xb1\x97\x4e\xcf\xa7\x1d\xe5\x25\x05\x3b\x41\xe1\x63\x3f\x7d\x7c\xf0\xa2\xcf\x62\x0b\xb6\xc9\xaa\xe4\xdb\xd7\x49\xfe\x4f\x3f\xae\xcb\xce\xbe\xec\x7d\xe4\xec\xe6\x60\x0b\xa2\xcb\xc0\x6d\xb7\xff\x8d\x4d\x3f\x52\x5e\xee\xc4\xe6\x7e\xce\x92\xed\x07\x9e\xa9\x6d\x38\x32\xf2\x57\xda\xb8\x5d\xf8\x88\x34\xf1\x7e\xce\x4b\x39\x43\xb6\x03\x51\xfb\x2f\x6e\x57\xe3\x05\x29\x72\xcf\x7e\xed\x1d\x0f\x9c\xa5\x5e\xb1\x85\x4f\x39\x43\x58\x67\x5d\x53\x5b\xaf\x38\x4d\x58\x20\xde\x56\x59\x9e\x17\x1e\xe9\xee\x33\x8e\xee\x55\x78\x11\xb6\x34\xdb\x6e\xcf\x35\xbc\xf9\xfa\x53\xf9\x2c\xf6\xe1\x6e\x36\x2a\x17\x75\xd7\xfd\x5f\x3e\x38\x59\x35\x62\x21\xff\xd9\x0f\xc9\x41\x2a\x7c\x67\xac\xbf\x5c\xa1\x66\x8f\x5b\x17\x3c\xc3\x16\xde\x76\x36\xf3\x81\x13\x83\x23\xc5\x4b\xc7\x9d\xb7\x1d\x5b\xc2\x99\xa2\xbd\xc8\x15\xe4\x87\x71\x5b\xf1\x66\xa7\x1c\xf6\x62\x5f\xc9\xbe\xd8\x0f\x3f\x63\x5d\xbb\xbf\xa5\x58\x42\x5b\xda\x37\x8f\xdb\xd2\xcf\x13\xa7\x8e\xdf\xd8\x3a\x2f\x4a\xbb\xe2\x39\xe3\x4c\xc8\x1d\xc1\x65\x97\x55\xba\x36\x2c\xd3\x15\x3e\xf6\xa7\xae\x14\x2b\x4f\x3e\x0e\xee\x21\x07\x75\x8b\x6f\xfd\x19\x39\xfa\x25\xe3\x96\xad\xa7\x1b\x5a\x6c\xae\xdc\x25\x7e\x60\xf9\xda\x9d\x5a\x6c\x1f\xe5\x99\x66\xdb\xad\x76\x7e\x16\x5a\x40\x33\x13\xb3\x3c\xac\x9c\x72\x9c\xb6\x1c\xec\xf3\xe5\xe0\x56\x7c\x5a\xed\x09\x07\xb6\xe2\xda\x3f\xed\xa6\x57\x9a\x85\x50\x8f\x76\x57\xdc\xa5\x59\x7f\xe4\xc4\xe6\xbe\x63\x78\xf1\xe4\x8b\x8d\x8c\x3c\x7f\xc5\xae\xb0\x98\x8d\x97\x9d\x24\x39\x27\x5f\xe3\x60\xbb\x9c\xf1\x57\x9f\xb2\xc6\x7b\xb6\xfb\x92\xc3\x1b\x2f\xf2\x94\xad\xb1\x13\xbd\xf6\x5b\x16\x07\xb6\xa3\xcd\xdb\x91\x96\x9b\xef\x29\xff\x79\x85\xf6\x1f\xac\xfe\x1c\xda\x2d\xcb\x52\xf4\x61\xb6\x18\x71\x75\xe5\xa3\x2f\x1c\xd9\x92\x13\x1e\x50\xae\xf2\xad\x47\xbb\xc2\xca\xc1\xa6\x3d\xbe\x8e\x0e\x4e\x4a\xfd\x1f\xcd\x80\x3c\x9a\xdd\x5c\x39\x6f\xfa\xfb\x93\x5c\xb0\x72\xd9\x25\x9a\xcb\xc7\x0e\x1a\x4d\x4c\xc8\xaf\x50\xff\x98\x5f\x1c\x35\x31\xdc\x76\x7e\x9f\x7f\xfc\x8c\x1c\x85\xdf\x80\xb3\x8b\x0f\x39\xd7\xfe\x89\xf4\x8e\x65\xc2\xf1\x4e\xba\xe5\xcf\x4e\xdf\x9a\x3f\x62\xdb\xf1\xab\x15\x96\xb1\xea\x4b\x14\xdc\x46\xfb\x27\x71\x85\x5c\xba\x1a\x7e\x13\x1e\xb6\x8b\x03\xe1\x53\xe0\x8a\x89\xdd\x2c\xf6\xd9\xf2\x8c\xf1\x2c\x76\x09\xdf\x58\xa2\x23\x2e\xe9\x0c\xb6\xe5\x6f\x7c\xe8\x24\x67\x02\x27\xa7\x3c\x9f\xf8\x21\x59\x77\x9e\xb4\x96\xe4\x7d\x6d\x3b\xfd\x73\xe5\xc6\xc8\x71\xb2\xc7\x16\x8b\x0c\x5f\x2a\x26\x19\xef\x2f\x6b\xb3\x06\xbb\xb0\x1f\xbb\xfb\x1a\x3d\x2c\xfe\x7b\x17\x4f\xf1\x61\x86\x66\xd3\xed\x36\xe7\xf3\x0e\x8b\x3e\x7e\x2b\xb7\xbd\x68\xc8\x3c\x39\x67\x0c\xd9\x1e\x26\x2f\xc3\xbe\xbf\x23\x3e\x4e\xcf\x36\xbc\x73\xa5\x0f\x91\x2b\xfc\x32\x53\xf0\x93\xe4\xfd\xe1\xd1\x0b\x57\x5e\xac\x65\xf6\x8d\xf6\x95\x2d\x53\x4d\xf1\xe4\x99\xb2\x25\x6e\xfd\xbe\x69\x39\xe5\x49\x4f\x3b\xb4\xb9\xcf\x81\xe1\x0f\x3d\x93\x84\x20\x7e\x18\xe5\x72\x4d\x78\x54\x59\x14\x0b\x25\xec\x1b\x37\xd6\x46\x23\x82\x8a\xeb\x7b\xe3\x51\xef\x08\x5b\x6d\xd6\xbd\x6e\x65\xa1\x1b\xb5\xfd\x98\xe2\xbc\xdb\x4b\x73\xa3\x36\x35\x1a\xf6\xd1\x33\x4c\x18\x37\xd6\x3e\x7a\xea\x6d\xb3\xe5\x16\xef\x66\x36\x49\x62\x08\x33\x51\x7e\xb1\xc4\xdb\xde\x29\xac\xfa\x5a\xa7\x87\x09\x7a\x09\xf4\x9d\xc4\x32\x45\x7b\x84\xb9\x7f\xfd\xa7\xbd\x86\xdc\xbc\x9e\xef\x5f\xac\x13\xc3\x9e\xfe\x8b\xe7\xb9\xc2\xaa\xbf\x73\xf4\xb3\xe0\x07\x6c\x47\xec\x76\xf3\x12\x9e\x0b\x23\xc4\x38\xf1\xc5\xb3\x3d\x65\xfe\xc0\xb1\x8a\x51\x6f\xb6\xa8\xef\x92\x9f\x11\x1f\x77\xca\x0d\xc0\x8d\xed\x1e\xea\x48\x58\xd0\xdc\xc6\xd7\x0b\x67\x37\x72\xef\xf0\x87\xe7\x7e\x1c\xdc\x7f\xf1\xe4\x70\x10\x7a\x48\x12\x5c\xac\x7a\xe5\x1b\xcb\x93\xb1\x5c\x5b\x9f\x26\x04\x2f\x2d\xe4\xf0\x1b\x2c\xd2\x89\xf1\xc5\x78\xa0\x0e\x8b\xfd\xf2\xcf\x96\x3b\xb5\xc6\xc6\xb8\xe5\x36\x5f\x74\x07\x0b\x64\x67\x06\x27\xab\xff\x9a\x2c\x8f\x1d\x9a\x30\x23\xe8\xb2\x7f\x95\xe0\xb6\x9e\x7e\x9a\x56\x8b\x51\x9f\x62\x56\xed\x17\x96\x98\xd7\xb0\xe8\xd6\x84\xb5\xa7\x6c\x4f\xf3\x8a\xab\x1e\x82\x35\x97\xd7\xf8\xa3\xb8\x5b\x73\xd9\x22\xce\x43\x3d\xe0\x1b\xcb\xe2\xe1\x5e\x99\x26\xac\x99\x9c\x1a\x9e\xef\x1c\x12\xfc\xf0\xba\xe2\x9f\xe4\xaf\x54\x73\x02\xf2\xc2\xcd\x5e\x40\xfe\x34\x3d\x9c\x58\xc6\x9d\x97\xf9\x96\x70\x5f\xee\xf0\x62\xc7\xe1\xf6\x00\xa8\x70\x51\xf5\x52\xf2\xc3\xdf\x30\x35\xc7\x85\x6f\xa8\xe3\xb7\x47\xd7\xa0\x0b\x7f\xf6\xed\x76\x48\x7f\x9f\x56\x47\x76\x42\x82\x11\x7b\xe9\x0f\xef\x81\x1e\x78\x04\x31\xfa\x18\x6e\x24\xe4\xdd\xe0\xcf\x0b\x22\xa1\x13\x8b\x1c\x16\x1a\x0f\x39\x5c\x0c\xcf\xe4\x6f\xba\x87\xd6\xd0\x0d\x16\xc9\x4f\xb2\x18\xd8\xc9\x76\xa3\xd8\x91\xff\xaf\x27\xf8\x6e\x09\x73\xf5\xa1\xdb\x24\xdb\x63\xc7\x79\xd6\x18\xde\xa2\x62\x49\x2c\xd4\x22\xe9\x23\x4a\xe0\x55\x25\xfe\xc7\xee\x2f\xe5\x65\x76\x48\x02\xab\x09\xb1\x02\xb6\x58\x0e\xd9\xaf\x6c\x04\x22\x2c\xf1\x23\xbb\x3d\xf8\x52\x3e\x76\xb7\x5a\xe8\x1e\xef\x4a\xa2\x62\xeb\x5e\x32\x03\xb4\xaf\x23\xc1\x8a\xa8\x3b\xb5\x28\x2a\x2c\xf2\x6f\x30\x89\x6e\x03\x3b\x4c\x99\x5e\x37\x9e\xe0\x79\xd3\x4c\xc0\x3c\xd0\x2c\x36\xcc\x6c\xe7\x56\x3a\x3d\xd9\xbc\xc9\x65\xbf\xdd\x1e\xef\x39\xda\xfe\x5d\x35\x98\xd1\x93\x9f\x5f\x57\x84\x24\x6a\xce\x61\x5e\xb2\x5a\x11\x38\xe6\x5f\x89\x82\x63\xc5\x9e\x49\x24\x08\x6f\x34\x75\xbd\xdc\xc1\x83\x37\x44\xe3\x57\xe4\xc1\xb9\xd2\x7d\xe3\x17\x26\x79\x9d\x0f\xd6\xb4\xd4\x23\xd9\x75\x50\x6f\x21\xf9\x83\x65\x1d\xb5\xd8\xb7\xae\x82\xf0\x36\x17\x66\x27\xa1\x31\x2f\x34\x6b\xb1\xd4\xb0\x23\x18\xa6\x6b\x79\x3e\x3d\x96\xbf\x90\x06\x1e\x6e\xd6\xc3\x34\x21\xf8\x68\x6e\xff\x4e\xff\xa7\xad\x3f\x9f\xf6\x47\x1b\x4c\xce\x53\xf3\xc6\x5a\x2c\xd7\x71\x4f\x36\xf9\x61\xb1\xa8\xb1\xb9\x7f\xc0\x1f\xb8\xf1\xa2\x6a\xd1\x1f\x8c\xaf\x47\xce\x50\x70\xee\x66\x3d\xfb\xe6\x08\x34\x3f\xb5\xd3\x14\xee\xcd\x4c\x6d\x93\x1f\x16\x0f\xe0\xc9\x35\xcf\xee\x1c\x6c\x91\xed\x60\x30\xe5\xd9\xb8\x08\xe2\x72\xe2\x29\xfe\xfc\xc1\xa4\x0f\xe1\x40\x37\xcf\x20\x61\x64\xbe\xb0\x55\x62\x2f\x2c\xe7\xd6\x7d\xc7\x45\xd1\xbf\xee\x0f\x7f\x06\x5b\xc1\xd6\x75\x13\x2d\xa8\xf4\xc0\x51\x7e\x0a\xc9\x9c\xee\x16\x2f\x16\xa2\x32\x59\x76\xba\x33\x8d\xb1\xe1\x1a\xe7\x22\xa7\x08\xfb\xbc\x05\x3b\xbb\xe2\xc7\xe3\xa9\x41\xbe\x3d\xb2\x3d\xf9\xca\x6b\x1c\x3e\x21\xe3\xa6\xbc\x11\x3b\xbd\xc2\x2f\xff\xe2\x92\xe6\xf1\x6c\x76\xb3\xf5\xc7\x67\x49\xaf\x2c\xfe\x90\x60\xe7\xb4\xbb\x76\xa5\x13\xd1\x0a\xe3\x71\xa6\x09\x67\x2d\x11\xbb\x2d\x46\xe7\x01\x24\x81\xb9\x78\x51\xbb\x60\x98\x43\x33\x4f\x0d\x6f\x53\xf1\xe3\x19\xf1\xcd\x9e\xea\xf4\xe1\x49\xc0\xf9\x94\x8b\x77\x00\xb2\x58\x8a\xfa\x0f\x3c\x64\x61\x98\x21\xc7\x19\xe6\xf6\xb0\x5b\xbe\x8b\xd1\x64\x3c\x7d\xce\x38\xb8\xab\xde\xc1\x75\x63\x9c\x4f\xc7\x23\x4e\x4a\x0f\xa8\x7d\x85\xf5\x79\x0f\xd3\xab\xc7\x01\xf1\xb6\x5c\x89\x8c\xcd\x97\xd4\x6d\xc4\x05\x66\x07\xda\x81\xff\x1e\x1e\xa2\x68\xd2\x80\xbd\x99\x60\xd5\x96\x8f\xa7\x9b\xc8\x75\xe4\xe5\x6f\x0d\x9d\x6c\x63\x3f\xbc\xd8\xe1\x1f\xac\x62\x3b\x6d\xb1\xc4\x0d\xe1\x6f\x48\xe8\x23\xe7\xc7\x2c\x87\x86\x8e\x70\x25\x85\x5e\x66\x8a\x81\x3f\x86\x70\x3d\x0e\xc4\x66\x8b\xc1\x92\xb6\xc8\x54\x76\xfd\x26\x98\x92\x3d\x33\x68\x57\x1f\x67\x3b\xff\x42\x6c\x20\x7b\x67\x7f\x41\xde\x50\xf6\xee\x9b\x8e\x30\x9f\x94\x73\x03\x13\x76\x74\x8f\x1a\xf6\x78\xa8\x87\x17\x8f\x18\xfd\x6a\x99\xe7\x16\x67\x12\x19\xfb\x89\x69\xe3\x2d\xb2\x07\x8d\x81\x76\x4e\xb6\x39\xda\x99\x7f\x69\x32\xc4\x3b\x8a\x30\x71\xeb\xc7\xb5\x55\xbc\x97\x3d\xb7\xd9\x95\x8e\x23\xbd\x75\x09\xcc\x1c\x59\xda\xe0\xe3\x97\x52\x61\x26\x26\x89\x42\xb0\xd9\x62\x13\x98\xfa\xc7\xc0\x50\x96\xfb\x23\x21\xad\x1d\x78\x4d\x2b\x1e\xe6\x71\xe7\x9d\xf1\xe9\xa7\x98\x81\xb2\xc4\x02\xff\x74\xca\xb5\x96\x05\xbb\xcc\xa2\xc4\x57\xb2\x60\x5c\x82\x10\x39\xa3\x0e\x03\x15\x60\x22\x3d\xe1\xee\xe9\x21\xdb\x68\x6c\x25\x82\xf8\x04\xbc\xda\x82\xe0\x46\x7d\x94\x05\xf6\x92\xdc\xf3\x43\xe5\x3a\x3d\x99\x6a\xeb\x09\x8d\x6b\x21\x76\xd2\xfe\x9a\x1f\x5f\x5e\x5c\x20\x39\xda\x15\x9f\x07\x13\x41\x57\x8e\xe8\x84\x6e\x79\x2b\xf0\x77\x77\xe0\x0d\xdb\x4f\x98\x90\x20\x07\x78\xb6\xf7\x60\x8a\x0b\xb7\x96\x61\xc7\x6b\xf9\xb1\x57\x6b\xfa\xa4\xf6\xba\x07\x8d\xb3\x62\x03\x38\x0a\x51\xac\x23\x76\xa5\xbd\x35\x93\x44\x54\xca\x8c\x53\xef\x4a\xaf\xb0\x84\x27\x5c\x47\xc5\xa9\x90\xc4\xe1\xc4\x66\x3c\xc7\x5e\x9b\xc7\xc7\x3d\xaf\x06\x97\x9c\x84\x10\xde\x31\x21\x12\xab\xfd\x87\x29\xa3\xa1\x25\x38\xc3\xb9\x00\x4b\xea\x4c\xe6\x24\xcc\xa1\xc7\x15\x7f\x18\xe1\x97\x0a\xed\x99\xfa\x64\xf9\x38\xb3\x12\x1a\x2f\x00\x26\x94\xa4\xd8\x3e\x57\x73\x54\xfe\xfd\xc0\xcb\x22\x3f\x6e\x16\x31\xfe\xbb\xe9\xb7\x2c\xeb\x97\xd8\xda\x9e\x38\xea\xb9\x98\x1f\xc4\x58\x11\xe5\xbd\xc4\x9d\x7a\x92\x2b\x9f\x6f\x27\x4b\xbd\xee\x6a\x7f\x47\x6f\x0b\x36\xd5\xdc\x90\xbe\xa5\x1e\x4f\x5d\x88\x42\x53\x21\xd7\x2c\xc3\x7a\xcb\xde\xce\x88\x2b\xd4\x43\xdb\x33\xca\xd9\x07\x10\xa0\x36\x87\x69\x93\x1d\x03\xd9\x6a\x73\x27\xa1\x13\xfd\x7b\xe1\x83\xd4\x95\x13\x62\xb9\x24\x38\xc0\x03\x02\xd6\x44\xe6\x21\x11\x12\xc3\x9d\x65\xc0\x3a\xe6\x29\xd4\xde\x5c\xc4\x0b\x63\xdc\x79\xc8\xe5\x85\x0a\xee\x92\x27\x61\xf6\x4b\x92\xae\x6b\x1c\xcf\x38\x39\x2d\x8b\xfb\xcc\x66\xf9\x26\x1e\x84\x41\x48\xd6\xdb\x63\x7f\x0e\xf1\xb0\x1c\x52\xbc\x82\xc5\x88\xb8\xf7\xe1\x36\x40\x61\xdc\x18\x5b\xbd\x02\x14\xe5\x29\x61\x9b\xe5\x89\xcc\xe4\xec\xde\xaa\xcf\x7b\x58\x0a\x76\x0e\xf7\xae\x76\x8a\x50\xe7\x33\xb9\x97\x9c\x93\x66\x01\xfa\x20\x7b\xb1\xe7\x91\xcf\x55\x5b\x81\xc5\xb1\x0d\xdd\xf0\x3b\xb2\x86\xc8\x80\x25\x7c\x62\xd0\x14\x7f\x0c\xdc\xde\x81\xc2\x48\x7e\xe3\xd8\xa3\x44\xdf\xf6\xe7\x25\xc0\x94\x6f\xc2\xa0\x1d\x61\x59\x80\xc6\xf4\xd6\x0a\x36\xe9\x24\x54\xad\xbf\x61\x6b\xcd\xc4\x42\x81\x2c\xf8\x69\x79\x39\xf3\x76\x12\xc8\xac\xb6\x2d\x04\xc1\xe4\xca\xe0\x52\xfa\x91\xea\x75\x9c\xad\x07\x6c\x18\x63\xe7\x43\x2c\x7e\x31\x67\xf5\x0c\x3d\xef\xb8\xf2\xe2\x1c\x11\xad\xee\x67\xb8\xd4\x88\xed\x34\xbb\xb2\x08\x16\x4c\x01\xca\x20\x88\x8f\xb4\x5e\xce\x1c\x41\xc0\x8d\x41\xb6\x9e\x09\x2c\xce\x16\x99\x1f\xcb\xad\x59\x22\x6c\xa0\xad\xed\xa7\x12\xc6\xcf\xb4\x3d\x19\x96\x02\x10\xa6\xa3\x5e\xe7\xdd\x71\xd4\x92\x07\xd2\x1a\x3d\xd8\x3d\xe8\x0a\x52\xd9\x7d\x97\xef\x32\x1e\x95\x6f\xb9\x77\xb3\x75\xdb\x61\x68\x24\x5e\xc1\x9a\x78\xc6\xb9\x4a\x90\x67\xb7\x69\x19\x89\x88\x24\xeb\x37\xe3\xf8\x53\x0c\x20\xe2\xc6\x89\x80\xc5\x1c\xeb\x2b\xf0\xe3\x36\x26\x44\xe9\xf4\xc0\xb3\xd2\xf1\x1a\x26\x28\x5f\xfc\x06\x8d\x9a\x1f\x9a\xf8\xd0\xbe\xe9\xa2\xea\x4f\xb8\xf1\x11\xe7\x7b\x5b\x06\x52\xba\x1d\xde\x63\x16\xfb\xc6\xf0\xba\x05\x87\x5d\x65\xc9\xe8\xb5\x81\xd4\xca\xa5\x1a\x00\xaf\x5c\xa1\x6e\xb1\x59\xf4\xe4\x48\xae\x2b\xb1\x02\xcd\x29\x80\x18\x05\x3e\xda\x56\xae\x8b\x51\xcc\x88\xce\x35\xe9\x33\xf4\xa4\x7c\x46\x36\x6c\xab\xac\x39\x6a\xad\xdf\xac\x89\x16\x86\xf1\x03\xa1\x70\xc5\xf6\xcc\x25\x88\x45\xf3\x07\xff\x20\x21\xba\x34\x08\x44\x94\xce\x3b\x2d\x67\xb2\x98\x51\x3a\x73\xb8\xec\xae\x7e\x96\x48\x57\x45\x30\x60\xde\xed\xa1\xe6\x22\xb1\x15\x53\x0a\x31\x70\xe6\xff\xdf\x9e\x16\x17\xbf\x3b\x72\x07\x69\xb0\xe9\xa8\xe6\xc2\x54\x54\x8e\xd1\xc2\x97\x41\xea\xf0\x8c\xee\x37\xf4\x30\xf1\xcb\x67\xa7\x67\xcf\xc5\x5d\xb0\xfc\x16\x2c\x77\xf1\xb4\x6b\xf3\x0a\xc9\xc4\x1b\xa4\x80\x05\x30\x3f\x82\x8c\x6a\xbd\xf4\x8f\xc4\x97\xfe\x7f\x59\x86\x59\x9a\xe8\x6a\x17\x7d\xd2\x88\xd7\xd0\x7b\x0a\x30\x20\xf9\x27\x84\x4c\x43\x28\x7f\xd0\x00\x22\xa6\x6a\x7a\x55\x23\xff\xe4\x61\xeb\xf6\x7c\x22\xa5\xb9\x7f\x25\x4e\xaa\x48\xb4\xcc\x84\xfc\x4a\x60\x85\x32\x1a\x5c\x57\xc8\x0c\x0c\x8e\x59\x83\x40\x9c\x23\x71\x46\xaf\x68\xfe\xc1\xc0\x30\xd6\x7f\x0c\xdb\xa8\x7a\xdb\xb1\xf0\x9e\xdf\xab\xad\xe1\x16\xac\x72\x54\x60\x6c\xc2\xd3\xd6\x29\x47\x96\x4c\xde\x08\xe5\x0d\x68\x27\x54\x93\x90\xac\xde\x81\xf7\xa2\x9d\x04\x7a\xc4\x52\x8d\xa2\x0a\xcd\xda\x1b\xeb\xb3\xc1\x56\xd9\xa6\x99\x71\xd2\xda\x0c\xb2\x86\x81\xc7\xe9\x67\xca\xb5\x86\x5b\xd1\xbf\x1e\x91\xa6\xe7\xc0\xfa\x43\xd8\x08\xdf\x00\x0f\xd3\x2c\x95\x81\xa0\xbd\xa1\x1a\xea\xc0\x3b\x62\xf8\x92\x99\x1d\x89\x78\xdd\x71\xdc\x21\x7b\x62\x34\xa7\xc0\xda\x03\xcb\x6c\xe1\xce\x09\x69\xe5\x3c\xfb\x1d\x5c\xf0\xac\x7b\xe8\x9e\x65\x14\xfb\x91\x19\xb9\xd8\x54\xb2\xa3\x40\x4f\xff\x59\xf3\x64\xe6\x09\x18\x2f\x48\xaa\xe2\x30\xcc\x2e\xc7\x48\x9f\x48\x02\xc9\x01\xc5\xfa\xfa\x4b\x8c\x8c\x93\x98\x35\x49\x79\x20\x8c\x22\x14\x9b\xe0\x25\x9b\x2c\xae\xad\xc2\xf9\x85\xdc\x01\x62\x55\x0d\x58\xb0\x47\x2f\x7a\xee\x37\x51\xb9\x76\x88\xa7\xc1\xb6\x25\x5a\x69\xee\x88\x9c\x1e\x16\x83\xec\x78\xa1\x46\x5b\x68\xbe\x74\x6d\x59\x58\x7a\x79\x08\xb9\xc4\x9f\xd8\xba\xed\xe2\x67\x41\x7c\x52\x27\xfb\xb8\x15\xc8\xfb\xc3\xa0\xfe\xad\x26\xd6\xbb\x6e\x24\x24\x1d\xc0\x9e\x1c\xc8\x6c\xe9\xcb\x44\x14\x45\x5c\x5c\xd8\x86\xb3\x3c\x79\x80\xe4\x46\xe8\x8e\x76\x37\x2c\x9a\xba\x61\xd3\x24\x44\x7d\x67\x26\x49\xc5\x52\x72\x0d\xac\x3c\x1f\xd5\x7d\x76\xa3\x81\xd8\x40\xd2\x1c\xfb\x8b\xbd\xb1\x46\x7d\xfb\xe6\x7f\xfc\x40\x44\x9a\x10\x5d\xca\x04\x20\xee\x84\x3f\xe0\x75\xc8\x7d\x06\x6a\xa4\x51\x8d\x59\xb6\x66\x88\x8a\x1f\x48\x3b\x44\xe5\x1b\xa5\x48\xea\x69\xa9\xeb\x54\x3a\x33\xc1\x50\xf9\xc5\x54\x70\xe5\x97\xf2\xb5\x14\x28\x9b\xda\x32\x9d\x91\x21\xff\x4c\x18\xee\x8d\xd7\x78\xca\x72\x12\x68\x9b\xdc\xfa\xbe\x91\x6e\x2a\xfe\x42\x17\x18\x50\x7b\x92\xe4\x07\xd9\xdb\x27\x54\x09\x40\x11\xc0\xac\x8a\x46\x01\x28\x2a\xf3\x5d\xe0\x41\x10\xbd\x65\xc9\xcd\x11\xc6\xc3\x8b\xc9\x3a\xac\x96\x9b\x4d\xe2\xfa\xed\x68\x58\x10\xd2\xa3\xd5\x09\x24\xf5\x0b\xf1\x39\x2e\xba\x99\x99\x2d\x66\x54\xd2\xcb\xc7\x9e\x60\x05\x7e\xd6\x6e\x3f\x35\x19\x88\x4f\x52\x7b\x64\xc7\x97\x29\x9a\x2d\xf2\x6b\x04\x66\xfa\xd6\x74\x60\xc1\xc1\x75\x45\x5d\x99\xb9\xe1\x06\xbc\x0b\x81\x58\x31\xdd\xbb\x2d\xa5\x5d\x28\x7b\xeb\x8a\x6c\xcf\xbe\x26\x4c\x18\x2c\xff\x7c\x11\x76\x5b\xcc\xf0\xb6\x4b\x83\x6c\xfe\xf9\x8d\xe6\x6f\xf1\x9a\xf9\xa4\x85\x18\xc0\x33\x92\x29\xb2\xda\xb6\x0e\x63\x4d\x74\x43\xe3\x56\x2b\x61\xbd\x03\xad\x99\x64\xe4\xf6\x5b\x77\xb8\xfb\x01\x1b\x02\xe0\x58\x31\x0d\x5b\xe8\x6e\xa0\xde\x55\x3f\xb6\xfe\xa5\x96\xdf\x19\xf1\x5f\xd0\xbc\xe5\x26\x24\x64\x98\xbe\xd6\x55\x08\x3f\x14\xb9\xa1\x48\xd8\xc4\x5e\xca\x83\xd1\xe2\xcb\x59\x69\xe5\x40\x40\x09\xfc\x99\xe5\x0a\xe2\x10\x7a\x50\x68\x99\xd3\x61\xdb\xb3\x96\xe5\x89\xa4\xf9\x29\xff\x16\x56\xda\x7a\x7b\xd8\x59\xeb\xae\xb6\xc1\xb1\x49\xc0\x67\x90\xf5\x32\x92\x97\x26\xd6\x87\xb8\xb3\x46\x24\x5b\x37\x93\x5d\x7b\xe4\x22\xce\xab\x98\xef\x84\xcf\xa8\x84\xc2\x61\x52\xb5\xb6\x4c\x97\x2d\x76\x02\x09\xa9\xc4\x8f\x2c\x08\xdd\xc8\x52\xb4\x7e\xa0\xe7\xb5\x38\xa2\xa0\x27\x67\x25\x20\x26\x46\xd9\x0c\xdf\x25\xa9\x8b\x59\x80\x1a\xc6\x65\xc6\xc2\x8b\xa9\x9e\xc4\xd5\xc3\x8d\xd4\xfd\xeb\x32\xff\x62\x7a\xea\xa2\xfd\x61\x37\xe4\x44\xee\x86\x80\x33\x5b\x7c\x16\x56\x20\xe7\x12\xba\x60\x0d\xae\x82\x18\xef\x4a\xc4\xff\x3e\x8e\x19\x20\xa2\x3b\x34\x4d\xb3\xc7\x4a\x07\x2b\x26\x53\x47\xa0\xa5\xd9\xbd\xfd\xb0\x18\x18\x43\xf3\x70\x6a\x3a\x4c\xcc\x61\x96\x32\x4d\x13\x41\x5a\xe6\xa2\x72\xc9\x79\x03\x22\x53\xa8\x2b\x1b\xda\x67\x7f\x87\xe8\xd6\xec\xd0\x55\x1d\xe5\xf9\xe4\xce\xff\xa9\x9f\x7a\x16\x33\xee\x34\x70\xb5\x4f\xc9\x50\x68\x25\x17\x30\xe8\x8b\xf9\x0b\x1c\xa2\x54\x2e\xbb\x6f\x78\x6e\xe2\x7d\x13\x0f\x85\x27\x91\x2d\x85\xe9\xd9\xc3\xed\xa0\xdf\xc0\x1b\xd4\xb2\x36\x66\x83\x92\x56\x55\xa0\xb2\x33\x00\x3d\x8b\x8b\x08\x5c\x62\x19\x73\xdc\x68\xc6\x46\xe9\xfa\xb7\x4b\xf2\x63\x90\xb8\xd6\xcd\x80\x68\x85\x27\xcf\x8c\x23\x7b\x60\xc7\x18\x4a\x23\xe6\xbe\xc2\x09\x9e\xe9\x9f\xdd\x83\x98\x59\x6a\x0f\xbc\x38\x08\x91\xe4\xfa\x4d\x76\x26\xc4\x28\x30\xe9\x48\xe7\x4e\xe2\x05\x0a\x57\x17\x2f\x81\xae\x0c\x13\xab\xb5\xd0\x2e\x55\xb5\xde\xfa\x85\x1a\x3e\xfd\x8e\x96\x18\xca\xa8\xd8\xc5\x7a\x20\x98\x1c\xf9\x10\xcb\x72\x8a\x7d\x21\x32\xf1\x2c\xd0\x22\x41\xda\x41\x7d\x63\x1e\x64\xb5\x2e\x38\xc7\x8e\x34\x7a\x96\x5b\x1a\x37\x67\xfa\x20\xbf\x0a\x35\x31\xa3\x21\x2c\x3d\xe1\x8a\xc7\x7c\x0f\x18\x57\x22\x7e\x10\x06\xe4\xd6\xc2\xa0\x79\x00\x7d\x77\xa6\x3a\x33\x5f\xe9\x0a\x1f\x8f\x59\x62\xae\x56\xfe\x9e\x15\xbb\xf7\x3a\x6b\x41\x00\xa1\x11\xf9\x20\x51\x2d\x7e\x2e\xf4\xb2\x93\x99\x30\x15\x10\xbe\x64\x07\xf5\x60\xdc\x25\x33\xf9\x5b\xa2\xe4\x34\x08\xe7\x92\xbc\x55\x2d\xc0\x8b\xbc\xc8\x2b\x37\xda\x16\xe2\x95\x56\x0b\x34\xee\x70\x25\x78\x9e\x84\x47\x17\xff\x49\xf8\x5c\x41\xa3\xee\xd9\xab\x91\xd1\x12\xe3\xd6\xbd\x5b\x20\x68\x8c\xab\x40\x1e\xca\x49\x33\x7f\x47\x49\x6a\xcc\x13\x81\xd1\x61\x74\x06\xfe\xc5\x59\xd9\x4d\xf6\x69\x31\xe2\x6a\x17\x5c\x70\x46\x9a\xd7\x96\xae\x0b\x78\x02\x2e\x76\x48\xb0\xeb\x01\xe0\xac\xfc\x49\x46\x97\xca\x62\x00\x20\xa3\xcf\x80\x93\x04\xb0\xdb\x8e\xe7\x54\xde\xb0\x2f\x2f\xa0\xe4\xb6\xe5\x6f\xd4\x63\xab\xd2\xc9\xf0\xd4\xea\x50\x22\xe0\xa5\x2b\x5d\x34\x51\x12\x0a\x32\xf1\xd7\x7a\x21\x50\x40\xb1\x5a\x1b\x0b\xc7\xb7\x6d\xe3\xe2\x89\xb9\x16\x23\x8c\xef\x17\x9f\x1a\x29\x30\xc6\xce\x6a\x43\xe5\x16\xc3\x7c\x2a\x4f\x00\x41\xc6\x11\x0d\x8b\x97\x88\x12\xee\xd3\xc2\x16\x78\x58\xcf\x9d\xee\x72\xe4\xc1\xcd\x1b\xbb\x3a\x25\xfc\xcd\x87\x59\x53\x71\xb2\x76\x7a\x1d\xd5\x6e\xe6\x9c\xbc\x66\x14\xcb\x95\x79\x55\x24\x36\xb3\xcf\x55\x3a\x60\x70\x0a\x13\xf9\x45\x38\x76\x06\xc2\x15\x04\x1d\xca\x0a\x6c\x6e\x83\x71\x4c\x66\x62\x9a\xcd\xcb\x62\x72\x10\x81\xc2\x91\x89\xa3\x20\x87\x07\x63\xd5\x8e\xaf\xee\xc4\xa2\xb8\x87\x43\x4c\x0c\xfb\x42\x1e\x39\xc9\xd1\xc5\xe3\x99\x9b\x98\x4a\x7b\x3b\x81\x8e\xf0\x84\xde\xf5\x1b\x41\xdf\x15\xc4\x74\xdb\x36\x1b\x9d\x09\xa1\x02\x73\xa8\xf3\x2c\x58\xba\x74\xc2\x4e\xd9\xef\x01\x4d\xc8\xfd\x74\xca\x1b\x36\x5a\x63\x90\x08\xf2\x84\x78\x64\x98\x7d\x2e\xd7\xd6\xbd\xa2\x70\x27\xa7\x42\xb4\x3f\x6c\x4b\x45\xad\x89\xac\xeb\xd1\x38\x17\x2e\x90\xb2\x13\x1f\x56\x51\xe3\xc1\x09\x5e\xe0\x5c\x58\xab\x09\x53\x05\xcb\x51\x52\xcf\xd7\xa8\xf9\x9a\x8b\x96\xbc\x00\x56\x96\x94\xa1\x49\xa9\x2d\x86\x7c\x7a\x51\x58\x5e\x90\x7c\x1e\x85\x34\x02\x63\x42\x04\x09\x17\xc9\x2f\x6a\xea\x17\xc6\xb6\xef\x41\x37\x71\x90\x62\x76\x78\xc9\x99\x9d\xf6\xd2\xa4\x7d\x14\x16\x98\xaa\x1b\x40\x35\xd9\xfc\xb8\x99\x69\x6d\x3a\x1d\x2e\x32\x9e\xa1\x9d\x82\x64\xc9\xe9\xd2\x77\xb7\x52\x12\x3c\x99\x7d\x0b\x5f\x47\xab\x51\x63\x75\xdf\x41\x78\xfa\x8b\x5a\xc9\x39\x5e\x40\x86\x8b\x83\x3a\x91\x6a\x1b\x5c\x92\xa7\xbb\x4e\x4d\x3c\x90\xe5\xc8\xad\xc7\xb3\x2d\x08\x6e\x35\x98\xb1\xd4\x2e\x5c\xd9\xf3\xb8\x43\x79\x48\x08\x9d\x73\xb1\x54\x5e\xfd\x61\x72\x00\xd2\x8e\x50\x05\x90\xc1\x24\xa6\xa5\xdf\x48\xa7\xae\x25\x46\x7c\x40\xbf\x10\xcc\x34\x59\x27\x5b\x96\x78\x4b\x84\xf8\x7c\x78\xdc\xec\x95\x0d\x46\x0a\x4f\x87\x7a\xe7\xd0\x3d\x7a\x76\x02\xe5\xda\xb5\x78\xc0\x8b\xac\x0c\x40\x8b\x47\xcd\xf7\xbd\x35\x5b\xc5\xde\x88\x65\x03\xd0\x8d\xfd\x50\x4c\x04\x37\x03\x3c\x0c\x3c\x43\xc3\x69\xd9\xbc\xb2\x83\x83\xf1\xec\x66\x45\xe6\xe2\xa5\xc5\x2b\x48\xd2\x88\xda\xfe\xaa\x55\x10\x4b\x10\x66\x24\x18\x9b\x1a\x7e\xa0\x51\xcd\x03\xf0\x0b\x77\x3c\x9e\x83\x75\xd3\x82\xb3\x27\xd4\xa3\xc5\x3b\xb1\x74\x9e\x9c\xa4\x26\xf6\xd8\x73\xa1\xd2\xc9\xea\xcb\x49\x72\x57\xfb\x90\x5b\x7c\x4f\xf6\x92\x39\x10\x98\xe2\xa9\xd6\xc1\xa2\x97\x46\x95\x6f\x58\x14\x6c\x1d\x2c\xbe\xa1\xbc\xe5\x41\xe8\x18\x64\x0c\xb5\x5a\x4e\xb7\x94\x4f\xed\x04\x0c\xe8\x2b\x2f\x42\xce\x72\xa4\x59\x62\xb9\x87\xb3\x64\x7a\x23\xa7\x82\x06\x0e\xd5\x93\x6e\xe4\x54\xbb\x12\x62\x8f\x19\x75\x6c\x1d\xc1\x4d\x3f\x80\x48\xc4\x33\xa1\xf2\x1c\xaa\x39\x02\x56\x59\x70\x2b\x43\x5f\x12\x71\xa7\xb0\x5a\x09\x3d\x28\x2f\x17\x3e\x44\x62\xf3\x6a\x81\xd0\x9a\xae\x61\xc0\x5f\x08\x17\x98\xc2\xbc\x80\x21\xc9\xb9\x25\x1a\xd6\x5a\xb2\xba\xbe\x98\xfd\x41\xe1\x9a\xb5\x4a\x6d\xa9\xc1\x52\x70\xc0\x17\x86\x67\x9a\x31\x68\x4e\x25\x8e\x3d\x02\xd1\xc8\x8c\xfa\xdd\xf4\x6a\x21\xd3\x7e\x53\xa9\xe5\x8c\x13\x3b\xdd\x89\x12\x15\xdc\x56\xcd\xf8\xfb\x8e\x96\x28\x27\xe3\x76\x16\x4a\x43\xf9\x6c\x2b\x49\x1f\xac\x26\x03\xa7\x73\x5c\xf4\xde\x31\x98\x13\x3b\x4e\x93\x23\xfb\xcf\xf4\x38\x62\x27\x3f\x12\x00\x90\xb7\x8a\x38\xa4\xc9\x53\x7b\x02\x77\xe1\xc3\x3a\xaa\x5f\xea\x3c\x80\xbe\x89\x7d\x74\x6a\x80\x13\x64\x24\x53\x64\x24\xa1\x06\x09\xa6\x75\xea\x9e\x9b\x2a\x55\xd1\xd9\xab\x28\xca\x19\xc1\x97\xc8\x24\xd9\x43\xca\x7e\xe0\x61\xe9\x92\xa0\xb3\x8e\xe1\x11\x5e\xe0\x7f\x7f\x53\x5c\xc9\x53\xbe\xe4\x1a\xb3\xb4\xb1\x85\x85\x31\x78\xe5\xd3\xb6\x7e\x90\x94\xd4\xbd\x28\xf5\x1b\x5e\x2c\xd0\x6f\xb0\x90\x7a\x79\x19\xec\x88\x3d\x6c\x33\x89\xa4\x61\xcb\x38\xcf\xc0\xc4\x2a\x1c\xa4\x3d\xd7\x7d\x06\x64\xac\x7f\xfa\x04\x0e\xc9\x32\xc0\xb8\x3d\x70\xfe\x7e\x0a\x8d\x71\x0b\xe4\x81\x6d\x71\x61\xa6\xb5\x71\xb9\xf5\xbf\x66\x16\x12\x42\x14\x89\x38\x33\x56\x52\x6e\x3e\x3d\xbd\xfc\xb9\xf6\xd7\xbe\xd2\xec\xae\x3d\xa1\x96\x65\x10\x6e\x22\x6a\xc9\x1c\x44\x5d\x2d\x8e\x45\x4b\xf6\x6b\x0e\x0a\x04\x9a\x8c\x78\x82\x2f\x23\x2f\x12\x58\x3f\x1d\xf8\xad\x51\x2f\x4e\x2f\xaa\x9e\x44\x44\x32\xe2\x9f\xe8\x60\x87\x96\xea\xf0\xbe\xf0\xa5\x57\x0c\xa4\x05\xc4\xee\xec\x51\xc9\x6f\x9c\x89\xa4\xdc\x2a\x37\x61\x16\x0d\xb9\xf9\x63\x21\xee\x00\x4b\x36\x0f\x52\x3c\xbe\xad\x3c\x7a\x06\x6d\xb3\xa7\x39\x11\xa1\xe3\x3d\x08\xea\x65\xc3\x3b\xec\x91\xc4\xb0\x83\xc6\x16\x1c\x27\xa3\xa5\x34\xbe\xae\x25\xe5\xa7\xc4\xc6\x01\x95\x93\x16\x09\x70\xa9\x2f\xb2\xc8\xd9\xec\x8c\xfe\xd5\x00\x87\xb9\x77\x44\x51\x24\xde\x3c\x50\x92\x76\x0e\x8f\xbb\xf9\x7e\x27\x00\x1d\x6f\x7c\x68\xe3\xf5\x51\xcf\x4e\xaf\x7a\x79\x31\x2f\x7f\x70\x0d\x32\x41\x61\xcd\x7c\x71\x66\x96\xc1\xad\xde\xfe\xa4\x5a\xce\x26\xfa\x0c\x4a\x4e\x40\x49\x59\x83\x5d\x56\x12\xd6\x8e\x6d\x8c\xf6\xac\xb9\xfc\x85\x02\x9d\x76\xef\x21\xaa\x18\x5f\x52\x10\x36\xef\x45\x90\x9c\x3e\x7b\x0a\x21\xb9\x51\xb2\x9b\x6b\xa8\x9a\x5d\x06\xcb\x35\x4f\x5a\x16\x96\x55\x65\xbd\xf8\x57\x2c\x8e\xc0\xf9\x0d\x6c\x1a\xb1\x3e\x13\xf5\xea\xfa\x17\x3f\x8e\x63\x35\x05\x93\x19\x12\x6b\x7c\x6e\x11\x81\xf6\x68\x30\x7d\xfd\x86\xd6\x62\xf4\xf8\xb7\x2d\xcc\x02\x21\xed\x6d\xf9\x28\x7c\x5a\xc6\xe6\x1c\x86\x5d\x63\xc1\xbe\x09\x59\xe0\x49\x5b\x9d\x31\x8e\xdc\x03\x47\xdf\x2c\xe3\x19\x2e\xb8\x99\x56\xba\xc5\x65\x59\x29\xa5\x88\xf7\x90\xb7\xbc\xa3\x1d\x95\xc2\xb0\x56\x4c\xa9\xd3\xf7\x25\x2e\xd0\x3b\x61\x86\x2c\x4c\x3c\xf4\x12\xa0\xdf\xd8\x82\x26\xa6\x29\x22\xe1\x23\x9f\x4b\x7e\xb7\x59\xd2\x14\x6e\xae\xf1\x1b\x68\xf9\x6b\x30\x2d\x2f\x43\x6c\x2d\x02\x3d\xc3\xc7\xd7\xca\x01\x9c\x27\xb0\xe7\x5e\xf9\x8c\x53\xcc\xfe\x8a\x4a\x1d\x7d\x3e\xc8\xaf\x04\x86\x7e\x9a\x9b\x20\x7b\x09\xc8\xcd\x07\xa1\x52\x7b\x3b\x39\x41\x6c\x2b\xda\x98\x2e\x92\x83\x90\x2a\x2d\xfd\x15\x68\xfd\x40\x16\xfa\x97\xc0\x41\x50\x38\x9f\xd8\xc2\x16\x11\xce\x2b\xd8\xce\xf2\x6d\x49\xb7\xbd\x4d\x46\x85\x50\x31\x13\xbe\x56\x9a\xbd\xb2\xf0\x72\xd0\x98\x55\x21\x09\xf7\x91\x75\xbf\xed\x2c\xd1\x55\xe7\x17\x72\x27\x79\x7b\x22\x21\xd1\x5e\x6f\x8f\x0e\xfb\x2f\x0e\x63\xc9\xfd\xe4\xd5\x95\xf3\x93\x90\x33\x5b\x1d\x42\xcd\x97\x9d\x5e\x65\x9a\x58\xdc\x32\x31\x3e\x13\x4b\xb5\x74\xd4\x35\x79\xac\x25\x21\x25\x58\x78\x97\x89\xcc\xce\xb6\xb1\x0a\xbe\x15\x66\xc5\x8a\xd4\xe0\x80\x0f\x7e\x90\xc4\x12\x2f\xbb\xb1\x5a\x29\x1f\x3c\xa0\x8b\x5b\x16\xd1\x9d\xf1\x53\xb4\xca\xd0\x1c\x75\x4b\x03\x1d\xce\x65\xc2\xf3\x86\x5e\x09\x9d\x9e\x12\x14\x24\xb7\x62\xf0\xa0\xa4\xab\x68\x9e\xd8\xae\x52\xbe\x66\xc4\x36\x4e\x36\xd7\x96\x5d\xb6\x56\xd2\x80\x05\x0f\xc7\x1a\xb7\xc6\xf5\xfa\x0d\x6f\xe7\xc8\xbd\xed\xf8\x6d\x73\x6a\x1a\xda\x5a\x36\x7a\x6f\x2c\x8c\x35\xe7\x39\xab\x8d\xc4\x1d\x94\x70\x9a\xd8\x02\xb9\x26\x4e\xf4\x5a\x71\xce\x02\x69\x68\x4a\x38\x7a\x18\x1a\xee\x0c\x48\x83\x88\xe7\x4e\xb8\x27\xd8\x5a\x2e\x8e\x07\x07\x40\x3b\xb6\xf4\x28\x72\xc6\x76\x8f\x64\xe5\x2e\x3c\x80\x12\x47\xf0\xaf\x1d\x7d\xb0\xf8\xc9\x02\xf4\x0a\x9c\x62\x88\x76\x98\x7e\x98\x56\x6e\xa3\xf4\x5e\x16\x52\xab\xe6\x9e\x5f\x5e\xa6\x84\xf3\x89\xdc\xc1\x33\xae\x95\x01\x9f\x57\x22\xf4\xd3\xcd\x2d\x77\xad\x5d\xd2\xd1\xea\x79\x60\x99\xfc\x26\x8e\x6f\x70\xa1\xa4\x28\x83\x9e\x51\x24\xa0\x35\x67\x7c\xfe\x61\xf8\x1d\x1f\x7a\xfb\x9f\x6e\x90\x3b\xa8\x01\x5e\x0e\xb4\x3f\xbd\xc0\x1f\x69\xca\xc5\x94\x2e\x80\x5b\x3d\x75\xd0\x17\xb4\x4f\x6f\xf1\x96\x8a\x81\xb7\xe7\x70\xe0\xee\xdc\x5f\xaa\x8b\x7e\xf5\x09\xbf\xa0\x4c\x0e\xc3\x7d\x39\xb7\x73\x4d\xce\x89\x9a\xdd\xcf\x83\x19\x9b\xbc\x55\x43\xee\xb1\x36\x27\x90\x3d\x5e\x4f\x22\xf9\x62\x86\x26\x7b\xdf\x83\x39\x8e\x5e\x61\xec\x11\x48\x87\xa8\x64\x00\x3a\xb0\x5d\xc5\x21\x61\x5b\xcf\x4a\x33\x2e\x31\x8a\xbc\x07\x48\xde\xcb\xc2\x1b\x93\xfb\x0f\x49\x0d\x6f\x33\x06\x3f\xf2\xb6\x04\x86\xb6\xfe\x39\x51\x2f\xec\x8e\xfc\x2c\xde\x8e\x50\xb7\x12\xf0\x9c\xc5\x88\x73\xb0\x72\x7b\xf2\x8c\xeb\x0f\x8c\xbd\x81\x04\x89\x04\x85\x5c\x1b\x23\x42\xcb\x1b\xd4\x08\xb4\xd7\x36\x47\xa3\x48\xa6\x24\x2b\x2b\x98\x45\xb2\x0a\x83\x38\x63\x5a\x69\x76\x41\xe9\xb8\xe8\xce\x94\xe0\x95\x1c\x48\x79\x5b\xe8\x23\xf7\x54\xbe\x65\xce\x73\x63\xf3\xc6\x82\x53\x56\x95\x04\x7e\x3c\x10\xd1\xe3\x2a\xc9\x8b\x79\xc5\xc8\x96\x56\x21\x0c\xc0\x96\x28\xce\x5f\xcc\x54\xc3\xc7\xfb\xa3\x0c\x98\x63\x0e\x34\x3b\xd3\x49\x72\x05\xb8\x02\x59\x7c\xa6\xf0\x7b\x60\xf4\x21\x26\x09\xdf\xf2\x03\xba\x8d\x45\x2c\x87\x65\x49\x12\x93\x22\xf6\xc8\xc1\x16\x62\xaf\x28\x17\x48\xc8\x1d\x2d\xe7\xd3\x16\x08\x4b\xad\xb2\x64\xce\x96\x31\x86\x09\x05\xb1\xb2\x0d\xce\x04\x36\xfb\xe8\x0b\xf9\x1b\x1e\x91\x4e\x19\xa4\xb3\x1a\xd9\x8c\xf2\x14\xff\x0f\x4a\xed\x41\xff\x55\x78\x9a\xce\xa0\x68\xd0\xc3\x38\x7d\x2f\x04\x74\x92\x70\x8f\xa6\xab\xca\xbc\x76\xa4\x8a\x56\x51\x7a\x80\xdf\xc2\x9c\x65\x50\x4f\x73\xd2\x95\xde\xcf\x4e\xd6\xcf\xd3\xc1\xe5\xc5\xf9\xda\x9b\x86\x7f\xaf\xb2\xc2\x71\x81\x0b\x5f\xb5\x96\x03\x84\xd2\xd9\xa9\x6a\x83\x12\x13\xd3\x99\xbf\xfb\x1b\x2e\x60\xe7\x1b\xb9\xa6\x9b\xa4\xd0\x8c\x7b\x8c\x2a\x64\x9f\xf3\x82\xe7\xed\x8b\xbc\x7a\xff\x67\x57\x20\xac\xc3\xf4\xd1\x21\xdd\x35\xfe\x60\x49\x07\x27\x44\x0d\x26\xd3\x86\xbc\x00\x1a\xdb\xbc\x19\xcb\xda\x70\x0a\x0f\xe7\xc6\x6e\xa5\xa2\x9d\x19\x40\x96\x77\x76\x07\xae\x23\xad\x7a\x16\x10\x19\xc4\xdd\x36\xe7\x44\x6a\x59\x83\x1d\xcf\x4f\x46\x68\x12\x59\x35\x14\x9a\x1b\xb2\x19\x79\x68\xe7\x61\xcf\x19\x88\xf2\xc6\x44\x20\x36\xd9\xa7\x57\xc4\x96\xb1\xd3\x59\xe1\x1b\x5f\x26\x6f\x6b\xc8\x7d\x79\xdb\xfd\x91\x8d\x72\xc0\xd0\xb8\xa3\xc8\x78\xf8\xf7\xe3\x2f\xfe\x85\xf0\x23\x0c\xf2\x07\x38\x5b\x39\x6d\x0f\x4e\x80\xd2\x46\xae\xb0\xe3\xa1\x89\x1c\xaf\x03\x0e\x85\x42\xeb\x76\x68\x25\x23\xe6\x13\x55\x76\xff\x2d\xa3\x25\x64\x66\x09\x3d\x5c\x5a\xf2\xf1\xfb\x82\x4c\xdc\xe2\x5f\x5c\xbd\xb7\xf7\x67\xe4\x42\x36\xa3\x96\xf0\xf0\x1a\xff\x9c\xef\xce\x97\x00\xaf\x36\x39\xae\x26\xef\x09\xce\x0f\xb9\xf6\xd1\xfa\x21\xec\xe7\x1c\x50\x95\x38\xa7\xfc\x00\xef\x7e\x3a\x85\x43\xdc\x35\x69\xc8\xac\x2d\x69\xf4\x60\xb0\x48\xf9\xd3\xd0\x46\x73\x3c\x95\x77\x63\xbe\x55\xc5\x21\xa1\x84\x93\x10\x89\x99\xf5\x1d\xa6\x0f\x10\x36\xab\x2c\x7d\x06\xc3\x45\xb9\x02\xcc\x66\x99\x33\x3f\xfb\x0a\x26\x88\xa6\xc5\x48\xca\x03\x3a\xd4\x15\x8d\xb2\x87\x6f\x6e\x4b\x01\x96\xbd\x47\xac\xa9\x05\x54\xf0\xb2\x99\xd1\x4c\x85\x5d\x61\xcc\xd1\xe4\x3a\xd8\x9b\xcc\xf4\xef\xb2\xff\x16\x9b\x06\x92\x7d\x64\x39\x16\x42\x5f\x0a\xd8\x9a\xc5\x4c\x60\x11\x4e\x1f\xfe\xcf\xa8\x7c\x19\x0f\x17\xac\xbf\x66\xc1\xd8\x6f\xbc\x50\x83\x30\xd4\x7e\xbc\xb8\x96\xd1\x9d\xd7\x65\x1b\x21\x8f\xcc\xb4\xd8\x5a\x86\x82\x5d\xf9\x0a\x54\xa7\x46\x96\xf7\xcf\xf8\x26\x8b\x44\x33\x30\x84\x9a\x7d\xc2\xb2\x06\xee\x9e\xdc\xe0\xb6\x04\x46\xbd\xba\x49\x91\x75\xa5\x99\x2c\xe4\x0f\xf0\x2d\x6d\x63\x75\xc3\x43\xb6\x84\x2c\x7b\x44\xe6\x8f\xb8\xd7\x9a\x66\x48\x90\x91\xe4\x71\xc3\x46\x5b\x31\x99\x5c\x24\x2d\xfa\xf2\xaf\xd3\x75\x79\x05\x6d\x10\xfa\x9e\x39\x38\x54\xb7\x7c\xbc\xdd\x06\x21\xb8\xd8\x17\x1e\x83\x5b\x23\x30\x64\x8b\x4f\xf2\x06\x4a\x20\x61\xe8\x15\x7e\x0b\xeb\xb3\x4e\x74\x55\x4b\x0b\x06\x76\x20\x51\x5c\x92\x64\xfa\x2b\xd9\x22\x27\x5c\x94\x81\xe4\xb0\xea\xf0\x1e\x40\xa7\x93\xa0\xa6\x18\x6d\xfd\xac\xa9\x0b\xb4\xaa\x4b\xe3\x1c\x42\x3a\x84\x9b\xe7\xd2\x6f\xb0\x9b\xc3\xd7\x8e\x77\x25\xc8\x22\xd8\x8a\xe6\x95\x16\x72\xaf\x27\x60\x6c\x93\x86\xd0\xa0\x7e\xc6\xaa\x7c\x30\x5d\x97\xc8\x9a\xfa\x12\x47\x29\xe6\x76\x4a\x9b\x3a\x8b\x93\xd9\x33\xa9\x31\x5a\xf8\x64\xbf\x1b\x2c\x6f\xe9\x0d\xe4\x17\xb9\x8d\x12\x18\x03\x86\x77\xb6\x43\x42\x62\x6d\x0c\x76\x7b\x91\xff\x3a\xe3\x8e\x51\x7d\x42\x8c\x62\x27\xce\xd8\xcb\x33\xf2\xc6\xd3\x7e\xd1\x10\xa9\x07\xb3\xc7\x37\x57\x5a\x6d\xb7\x7c\xd5\x33\xb3\x8b\xb6\x15\x67\xc0\xea\xee\x23\xe6\x60\xa1\x9b\x2c\xee\xec\xb5\x48\xb9\xfc\xde\x96\x6e\xf1\x04\x8b\x16\x4c\xbc\xfe\xd3\xbe\x18\x8f\x00\x34\xe1\xbd\xd4\x4c\x19\x20\x90\xae\xc6\x83\x3e\x7b\xaf\xff\x1c\x26\x23\x9a\x1a\x3c\x96\x58\x3e\xd7\xbb\x07\x9f\x74\x1b\x95\x9c\xa7\xa9\x54\x4f\xba\xd8\x7f\xa0\xd4\xc9\xd1\x9f\x08\x26\xb0\x15\xf8\x18\x6d\xad\xac\x06\x99\x4a\x82\x61\x13\xc1\x5e\x7f\x4b\x15\xb7\x78\x01\x0f\xeb\x2a\xc9\x5d\xbc\xd2\xbd\x07\x54\x1f\x58\x73\x89\x60\x3d\x07\x64\x23\x77\xf5\xd8\xdf\xe0\xff\x07\x4a\x55\xf2\x33\x50\x84\x20\xa4\x9d\x03\x5b\x7a\x67\x39\xca\x97\x9d\x88\x13\xf5\xdb\xb7\x6c\x27\x5c\x58\x6c\x13\xab\x92\x6c\xfe\xfc\xd1\xc2\xa5\x77\x0a\x28\x55\xe7\x41\x01\x05\xbb\x82\x4e\x6b\x3d\x5c\xcf\x41\x93\x10\x67\x0d\x19\x5b\xdc\x9d\x14\xb0\xa7\x5a\x9e\x78\x7b\xb4\x71\x74\x27\x7d\x9d\xdd\xf9\x67\xf1\x6d\xa6\x2e\x27\xad\x3a\x6b\xa7\x84\x1d\x37\x76\x43\x9c\x4e\x0d\x8c\x23\xf7\x67\x02\xc5\x8e\x2a\x44\x75\xd5\x3a\xd2\x2d\x7d\xbc\x6a\x27\xed\x7d\xde\xf0\x54\x47\x98\xec\x87\x8c\xfd\x8e\xeb\x53\x09\x04\xcb\x76\x8e\x44\x29\xac\xcc\xde\xf9\x0c\x6d\x76\x59\x82\xb2\x79\x73\x8a\x98\x66\x43\xd0\xb7\x32\x84\x4a\x4e\x9c\x10\x74\xa6\xae\x88\xa4\x7e\x63\x22\x9a\x61\xcc\xa1\x4c\x5f\xe1\x7a\x12\x92\xf4\x18\xe5\xc8\x36\xdf\xdb\x57\x36\xea\xaa\xcc\x5f\xcd\x8b\xb7\x73\xcf\x3c\x5c\xda\xdd\x94\xc9\x51\xf9\x0d\xf5\xdb\x6e\x30\x7c\x9e\xd6\xae\xc8\x16\xb8\xd0\xfc\x3c\x1a\x23\x66\xed\x87\xc6\x99\xb4\x45\x68\x17\x43\x3c\x5b\xf8\x81\xb0\x62\xdf\xbc\x63\xc6\xdc\xb1\x5e\x2f\xd6\xc9\x66\x4d\x38\x02\x83\xf7\xc6\x12\xd7\x44\x2c\xa3\x5d\x68\x5b\x94\xc8\x99\x45\x5e\xbd\x86\xd6\x1d\x7c\x21\xf6\xd0\x8e\x31\xc2\xd0\x12\x85\x90\xdb\x5b\x9c\x6e\xab\x46\x8f\xb1\x53\xea\x76\xb4\xfc\x1a\x6d\x1e\xc8\x6e\x0a\x9d\x12\x72\x92\xac\x29\x93\xfb\xcb\x10\x4d\x8c\xcb\xc2\x54\xe2\x62\x4c\x1b\x07\x59\xce\x58\x96\xf6\x5f\xbf\x92\xe2\xd0\xc9\x12\x19\x60\xb3\xda\x39\xef\xe3\x91\xb8\x35\xa7\xd8\x71\xe6\x76\x77\x7c\xef\xb0\x8f\xc5\xd2\xde\x2a\x3a\x29\x03\xce\x11\xf2\xbe\x13\x1d\x24\x35\x08\x56\x32\x17\x25\x79\x59\x11\x2d\x7e\xfb\x2b\x79\xbf\xf4\xc1\xd9\x6b\x15\xdd\xd9\x6a\xd3\x54\x4c\x53\xf4\xac\xdd\x1b\xb3\x9c\x2a\x15\x14\xb2\xb3\xc4\x04\x74\xae\x5e\x27\x24\x3f\x6f\xbc\xba\x3c\xdc\xb2\x56\xf4\xe0\xa8\x4b\x61\x8d\x55\x0c\xab\x73\x80\x8b\x99\x72\x75\xd6\x7a\x48\x11\xdc\xe0\x18\x4b\xf2\x82\x4b\xb1\xb1\x19\xe7\xa3\x84\x1c\x33\x1c\x1a\xc4\xb3\x8a\x4e\x0b\x98\xc5\x9a\x32\x78\xc9\x86\x2a\x6f\x7d\x59\x9d\x48\xdf\x86\x56\x86\x16\x19\x60\xbc\x66\xd2\x52\x08\x33\xbd\x3d\x81\xb9\xd8\xfe\xaa\x26\x61\x08\x62\xac\x9e\x03\x1c\x5e\x9f\x8f\xa0\xc5\xbc\xd5\xb2\xe3\xca\x66\xf2\xc3\x14\x2a\xd5\x15\xff\x41\x58\x94\xe9\xe0\x16\x67\x24\xc9\xee\x1a\xfe\xd3\xc9\x09\xa9\x31\x50\x3e\x84\xa5\x58\x24\x0f\x70\x75\xee\xcf\xf5\xba\xd0\x96\xc3\xbf\x53\xbc\x63\x53\x9e\x15\x7c\x6b\xf4\xa6\xe4\x03\xd8\xa5\x49\x05\x21\x99\x56\x7f\x1f\xf0\x10\x1e\x3a\xc8\x61\x65\x91\xd2\x98\xc7\x56\xaf\x33\x3f\x4c\x1d\xa2\xe8\xe1\x4d\xf3\x60\x5e\x92\x0a\x4a\x3a\x1c\xe8\xff\x32\xc4\x3c\x1b\x00\x27\x97\xe4\xcb\x60\x5b\x3a\xa9\x3e\x8d\xe2\x43\x92\xeb\xb0\x90\x10\x2a\x8e\xff\x93\xf5\x68\x09\x08\x36\x0f\x46\x25\xa0\x95\x4d\xb4\x74\x17\xe5\x50\xbf\x8f\xde\x5e\xba\x39\x6b\xb9\x7a\x77\xbe\xd2\xfa\x3c\x41\xd2\xe5\x9d\x19\xde\xfe\xa1\xa8\x9a\x3d\x12\xc7\x85\x73\x27\xe6\xdb\x70\x01\xe3\x84\x93\x49\x2e\xd9\xaa\x83\xf4\x3b\x0f\xa5\x98\xb8\x9b\xc5\xac\xc8\x26\xcb\x1b\x57\x45\x99\x5c\xe6\x44\x1f\xa8\x40\xb0\x32\x1c\x16\x9a\x83\x77\x71\x4b\xd7\x89\x0d\x9b\x62\x14\xa3\x14\xb9\xa9\xc6\x57\xfb\xe1\xe3\x28\x6a\x30\xfa\x1a\xec\xea\xe9\xc5\x42\x80\xa9\x95\x3d\x3c\xf9\x83\x8d\x55\xcd\xd7\xfc\x64\x7f\xaf\x0a\x03\x10\x14\xa9\x86\xca\x5b\x3d\xb4\x72\x4d\xfe\xeb\xda\x59\x01\x78\x59\x0d\x0b\x5e\x08\xb6\xc8\x5e\xfd\xc7\x41\x27\xd3\x99\xe1\x0e\xa5\x0c\x44\xea\x61\xfe\xbe\x5d\x86\x15\xa5\xdd\x3b\x28\x49\xf3\x30\x3e\x2d\xb3\x7c\xcd\x70\xd0\x20\xf6\x79\xb1\x2d\xd0\xb2\xd7\x85\x95\x92\x77\x20\xfe\x2f\x21\x45\x03\x9f\x4e\xbc\x0c\xab\xb8\x92\xf5\x07\x76\x2b\x51\x90\xe2\xed\xc9\x69\x93\x34\x05\xed\x40\x65\xb4\x32\x6a\xb5\x1d\x2d\xf0\x97\xe7\x81\x9a\x20\x91\x6e\x81\x3e\x24\x25\x13\x06\x14\x67\xad\xbb\x92\x8d\x3d\xbd\x01\xf6\xa2\x4b\x54\x39\x0e\x74\x73\x1e\xe9\xd7\x9e\xea\x43\xbe\x99\x83\x34\x73\xf0\xce\x04\x67\xf2\x24\x09\x57\xf4\xab\xd4\x42\x98\x11\x3e\x29\x05\x66\x2a\x5c\xbc\x8d\xca\x49\xb7\x5b\xdd\x97\xe6\x19\x3b\x59\xa3\x07\x4a\x74\x2d\x01\x05\xde\x7a\x76\x0b\x46\x77\x61\xb4\x72\xe2\x44\x2f\x4d\xf0\xe1\xb1\x09\x15\x49\xb8\x30\xfa\x25\x2d\x1f\xc3\x65\x77\x0a\x43\xd9\x63\x34\xf9\x0a\xf9\xfe\x44\x8c\x98\xc1\xf6\x53\xfd\xb5\x9b\xbd\x49\x97\x9b\x37\x3b\x29\x2a\xeb\xb7\x5c\x8b\xc7\xee\x52\x0c\xc1\xb7\x45\xd8\x8b\xea\x65\xec\xe9\x01\x36\x31\xf0\x50\xf1\x21\x33\x18\x12\x72\x81\x0d\xb2\xad\x68\xf4\x91\x33\x16\x99\x22\x3b\x43\x3e\x7b\xac\x66\x14\x1e\x0b\x32\xbc\x17\x69\xe2\xce\xbf\x3f\x1e\x43\x7b\xc5\x42\xc5\x04\xa6\x07\x61\x2f\x5e\x75\x75\x38\x8d\xa1\x08\x3b\x6b\x00\x49\xdc\x9b\xf8\x17\xd6\xb6\x95\x4f\x6e\x5b\xb0\xba\x83\x90\x5b\x80\x7c\xfe\xea\x95\x3a\x00\xef\xcd\x75\xa1\x0e\x54\xad\x71\xee\x29\x28\xa2\x36\x1f\x5f\x82\xac\xac\x3f\x16\xc9\x86\x82\x10\x1c\xc4\x11\x82\xa6\x18\xce\x2e\x73\x85\xa2\x9b\x7d\xf6\x83\x92\xa0\x4d\xb5\x4d\x5c\xcc\xe7\x31\x78\x56\xa4\xfb\x59\x59\xcc\x1b\x25\x2a\xcb\x4c\xcf\x32\x52\x75\x00\x80\x12\xff\x49\x82\xe2\xa1\xed\xb9\xe2\xb3\x65\x25\xec\xc1\x9e\x5e\x2f\xf0\x0e\x05\x6d\x6a\x65\x29\x57\xcb\x0f\x6b\x00\x75\xf1\x3d\x64\x66\x7c\x87\x15\xa5\x60\x8f\xa7\xd7\x74\x20\xe1\x00\xf9\x2d\x74\x13\x92\x9b\x6f\xe1\x80\xed\x72\xa7\x92\x99\x04\x4b\x08\x1c\x7a\xbd\xe1\x2d\x5b\xcc\x38\x1a\x21\x11\x57\x15\x53\x7a\xb3\xf1\xa9\xe7\x2b\xb2\xb7\x6b\x2e\x23\xea\x50\x9b\xe5\x07\x1a\x00\x1d\x1e\x71\xf7\xd3\x41\xb6\xd1\x1d\x2d\x77\xd2\xe6\xbb\x87\xf5\xfd\xe2\x59\xb1\xf2\x3c\x1a\xb0\x0e\x3b\xda\x6c\x36\x0f\x67\xd7\x70\x50\x9f\xa9\x37\x92\x4a\xeb\x45\xcf\xe4\x2d\x28\xaa\x29\x40\x6f\x02\x6c\x20\x61\x69\xad\x55\xf3\xab\x6b\x15\xce\x5f\x36\xcb\x51\x0c\xaa\x16\x67\xbf\xc9\x9f\x28\x5f\xd6\xf2\xf9\x21\xd0\x7c\xcf\xde\x96\x33\x18\x8a\x47\x71\x77\x4e\x15\x00\x94\x80\x00\x2e\xfd\xbd\x7f\x1f\x8b\xa5\xea\xe8\xbd\xba\xbc\x5a\x70\x8d\xea\xb1\x2e\x0b\x9e\x6d\xfa\x2a\x82\x21\x30\xc9\xdf\xde\x84\xd0\xf4\xb4\xd9\x53\xca\xf9\x67\x00\xdf\x12\xcb\xb6\xc5\xfb\x4a\xac\x8f\x8d\xe5\x9c\xda\x57\x1a\xb9\xc9\x99\xbd\x1d\x60\x4b\x37\x3c\x1c\x34\x4b\x1c\xe7\xd5\x8b\x38\x9d\x72\x33\x46\xfc\x44\x5f\xf1\x33\x7a\x41\x67\xd6\x0d\xa1\x9b\x57\x6a\xd7\x11\x00\xfd\x89\x59\x59\x08\xfd\x6d\x49\x02\x5b\x3b\xdc\x4f\x0f\x93\xf4\xd4\x3c\x40\xd0\x23\x90\x71\x2b\xd1\xa9\x9b\x75\x31\x94\x1a\x50\x9a\x25\xf4\x20\xc7\x4a\xc6\xeb\xe2\x37\x15\xb6\x5d\x2c\x55\x23\x32\xe2\x52\x49\x68\xfc\x63\x30\x04\x2e\xab\x2c\xd1\x2f\xe4\xa8\xda\x9d\xac\x05\x5a\x7b\x3f\x50\x7f\x33\x4a\x3b\x62\x02\x6e\xed\x4a\xf0\x28\x0e\xde\x70\x66\x1f\xeb\x57\x0d\xc5\x3b\x97\xcb\xe4\x12\x69\x49\xc1\xae\xc6\x7b\xcf\x70\x60\xd6\xc6\xc8\xb3\x03\x51\xec\x15\x06\xff\xa2\xef\x1a\x0a\x95\x4e\x08\x8b\xaf\x41\xa4\x77\x24\x6d\x0b\x97\x31\x87\x83\xb3\x5d\x25\x7f\x17\x6f\xf8\xcf\xbb\x2d\xe5\x6e\xda\x17\xb3\x22\x22\x09\xbd\x00\xe2\x4e\xfe\x3d\xd8\x91\x80\x73\xee\x3a\x20\x5b\x01\x06\xf9\x86\xea\x5d\xf3\x36\xb7\x16\x4e\xb6\x58\xee\xee\x6b\x57\xf7\x91\xf2\x7d\x47\x95\xc5\x5a\x64\x04\x43\x13\x0d\x8a\xd3\xdf\xad\x54\x64\x1f\x36\xfa\x30\xd5\x3a\x78\x19\x9d\x21\xd0\x8b\x84\x4a\xe7\x38\x99\x53\x61\x04\x00\xbe\x80\x76\x37\xc3\x88\xcb\x9a\x77\xe3\x74\x6a\xdd\xf2\x6f\xd1\x33\x90\xa3\xbb\xf6\xf0\xc3\x74\x00\x1b\xa9\x6a\x28\x2c\xa8\x42\xd7\xc2\x79\xc9\xb1\xfe\x16\x2b\x30\x29\xa2\x0d\x8d\xcd\xb6\x79\x33\xe1\x9b\x2e\x6a\x04\xd7\x72\xc4\x00\x83\x66\x9c\x0a\xb4\x2e\x3b\xb3\x8d\x45\x86\xa9\xe0\x86\xb8\x5b\x92\x98\x9a\x01\xf0\x9d\xaa\xb3\x04\x4d\x93\x0b\xd5\xf5\x82\xcf\x3d\x8b\xb7\xdb\x9d\x08\x01\xa3\x27\xeb\xba\xcc\x80\x01\x87\x90\x8e\xc7\x04\xef\x33\xb3\x59\x5e\xdc\x3e\x52\x43\x2d\x76\x19\xda\x84\x20\xab\x64\xca\x69\x32\x45\x82\x2f\xef\x1e\x24\x3c\x9f\xd8\x2d\x49\x48\x47\xb5\x75\xd2\xea\xe2\x03\x2d\x60\x5d\xf1\x0d\x3b\x0e\xb0\x33\x92\x05\xb2\x0f\xef\x7a\xc6\xc4\x20\x50\x83\x10\x06\xa8\x91\xa4\x25\x57\x2a\xdd\xa2\x6b\x46\xad\xd6\xfd\x4e\x28\xa8\x1c\x9e\x89\x6c\xaa\x6a\xe7\x09\x68\x26\xea\xf3\xa2\xca\xa4\x3e\xd3\xf4\xb5\x51\x88\x38\xbb\xb9\x57\x5c\x6f\x4b\x07\x8b\x97\x55\x25\xe0\xa2\xfc\xc7\xed\xff\x8d\x66\x08\x24\x1f\xf5\x9f\x69\xb7\xb7\x05\x69\xa7\xa6\x9b\xdc\x62\xa2\x17\x38\x10\x95\xd6\x6c\xf3\x08\xca\x24\x4a\x24\x56\x80\xf6\x1d\xb4\x06\xb4\x01\xca\xfb\x9f\xb6\x04\xf4\x72\xed\x5f\xfa\xb3\x7c\x5a\xfb\xdc\x1b\xc2\xd0\x15\x48\xbc\x1c\x5b\xe7\x67\x68\x7b\x79\x75\x80\x6b\x27\xd7\x65\x80\xd9\xbd\x26\x43\x6d\x6b\xfa\xfd\x85\x5a\x1a\x35\x3c\xbf\x44\xea\x75\x84\x51\x0a\x8d\x90\xf4\xa4\x38\x33\x02\x15\x12\x14\xd6\x4e\xa4\x72\x4d\xf2\xf6\xa8\x31\x5a\x23\xf1\x68\xa0\x5c\x9c\x3e\x4b\x1a\xe9\x25\x77\x0d\xbc\x26\xad\x2f\x11\x25\x27\x0d\x8a\x22\x66\x96\xf8\xd7\xa8\xa5\x8a\x07\x42\x09\x42\x8f\x9e\x5d\x56\x7f\x48\x57\x1e\x04\xe2\x44\xae\x82\xd7\xb8\x0d\x36\xf8\xc0\x2a\xca\x5a\xce\x11\x8c\x1b\x12\x35\x8f\x81\x44\x47\x92\x86\x4c\x06\xce\x42\x5c\xcf\xd5\xad\x62\xc1\x00\x7f\xec\xa4\x92\x71\xb0\xd3\x65\xfc\x8d\x63\x3e\x3b\xf1\xb8\x53\xfe\x08\xbe\xb5\x6a\x8a\x85\x7d\xae\x8b\xcb\xdb\x31\x75\xd5\x36\xca\xea\x0a\x92\x0a\x76\xa0\xf8\x04\xfa\x9d\x69\x84\x51\xe0\x66\x75\x05\x46\x55\xa7\xc4\xe2\x2b\x8b\x08\xf7\x5f\x2c\x42\x7f\x50\x23\xd5\xd2\x8f\xbd\x46\xb3\x6d\x3f\xc4\x7e\xd0\x2b\xc4\xa3\x1c\xc7\x2b\xa8\x75\xa4\xcb\x3d\x59\x5e\x2e\x68\x9b\x6b\x1a\xfa\xd9\xb9\xae\x41\x33\x7f\xd2\x0b\x6e\x87\xc6\x0e\x38\x5f\xb9\xea\x41\x2d\x91\x6a\x21\x46\xb3\x49\xda\xde\x88\x0f\xd5\xf6\x5b\x5b\xd0\x27\x41\xa1\xd9\xf1\x75\x40\xa8\x0c\x39\xa8\x13\x60\x25\x79\xa0\xae\xfd\x9c\xb1\x70\x9a\xab\x77\xa4\x5c\x5f\x79\xbc\xa0\x14\x01\xdb\x3a\x92\x65\x74\x03\x5a\xa9\xd6\xc5\x65\x3a\x7a\xe4\x14\xb0\x02\xf8\x2c\x60\x4f\x68\x76\x05\x57\x32\xef\x5e\x27\x88\x5e\x1d\x38\xe8\xc1\xc4\x91\x02\x8f\xc7\xa7\x69\xce\x27\x11\x00\x68\xcc\xaa\x51\x61\x7f\x51\x92\xa6\x3a\x0a\x74\xe3\xee\xbe\x3f\xd9\x3c\x9f\x84\x75\xd4\x9f\xba\xba\xd7\x3f\xcc\x0b\xd9\xc5\xec\x6e\xa4\x26\x63\xc2\xe1\x6e\x58\x9f\x8f\xea\x5c\x21\x33\x20\xd4\x10\xea\x3f\x7b\x5c\xd8\x25\xed\x34\xe9\xe4\xc7\x33\x20\x9d\xbe\x4d\xf7\x72\xf2\x0f\x0b\xf6\x8d\x6e\xf1\x00\x53\x89\xbe\x1b\x77\xa1\x53\x09\x33\x7a\xc5\xe7\x9d\x66\xe7\x42\x65\x17\x0e\xbd\xb7\x34\x95\x85\xde\xe5\x24\x46\x9c\xc3\xab\x40\x65\x02\x19\xe5\xcc\xb4\xdd\x4a\x1a\x8d\xcd\x42\x48\x79\x02\xc4\x01\xb2\x15\x36\x2c\x43\xda\xe5\xb1\xcd\x70\x1d\x44\xb6\xb7\xea\x61\x96\x24\xdb\xa8\x4b\xbf\x63\x3c\x90\x91\x6f\xe8\xe5\xf1\xb4\xa9\x19\x52\xe9\xb7\x4c\x15\xfc\x6c\x8b\xa1\x27\x17\xeb\x82\xda\x9e\xe2\x61\xbf\x7f\x1f\x5e\x7f\x33\x88\x83\x5e\xd0\xb1\xab\x27\x96\x42\x3a\x31\x79\xeb\x85\x78\x0b\x42\x6e\x3f\x85\xaa\x35\x5a\x59\xb2\xa3\xb8\x7b\x5c\xaf\x64\x5b\x70\x13\xd0\x78\x8f\x9a\x94\x37\xe5\x04\x05\xe4\x58\x4e\xbd\x02\x94\xb1\x23\xfd\xef\x51\x7e\x92\xc5\x0d\x7b\x97\xbc\xdc\x29\x34\xf2\x6f\xe6\x24\xa2\x64\x5b\x87\x37\xdd\xda\x55\xf8\xe0\x12\x3a\x51\x56\x8f\x9f\x27\xd2\x2f\x0d\x59\x1f\x0a\xe3\x0d\xf9\x12\x79\xd3\xf5\x42\xec\x74\x6b\x78\x85\xb8\xbb\x76\x84\x07\x6d\x08\xbb\x0d\x29\xae\xea\x7b\xad\xf8\x15\x14\xbe\xb6\xd1\x6c\x6e\x5d\x18\xa3\x8c\x2c\xf1\xac\x9e\x13\x0b\x24\xdb\x03\xc4\xa9\x88\xd2\x97\x17\x83\xc8\x63\xc9\x65\x6d\x0b\xcb\x54\x1a\x0f\xc2\x92\xa4\x35\xf2\xef\xb2\x6f\x4b\x23\xa7\x27\xc5\xbe\x34\xe4\xfa\xa2\xef\x92\x44\xef\xbc\x64\xde\xd6\xc9\x16\xf3\xf7\x30\xe4\x5f\xd9\x39\x0a\x93\x4f\x09\x6b\x60\x6a\x19\x0f\x00\x5a\xe6\x6d\xe3\xa5\xe4\xaf\x05\xe7\x31\x29\xa1\xc9\x3a\x90\xaf\x5a\xd4\x97\xa0\x13\xed\xf4\x80\xb5\xb5\xc4\xf0\xe1\x04\x43\xe8\x08\x89\x55\x0f\xca\xea\xaa\x2a\x4a\xc1\x06\x9d\x05\x3d\xbd\x53\x60\x8c\xaf\x4d\x0a\x66\xbc\x5d\xdd\x7b\x2e\x68\x7b\x36\x1a\xbc\x9d\x92\xe4\x4a\x43\x33\x41\x10\xc9\xd8\x89\xa9\xdf\xc1\x43\x74\x48\xfd\x3e\x00\x9c\x21\x84\x5d\xbb\xeb\x05\x4b\x44\x16\x67\xe7\xc5\xb4\xa1\xc3\x39\x17\xba\xbc\x29\x7c\x49\xc8\x68\xdd\x79\x4b\xf0\xfb\x1e\x04\x3e\xcd\x4c\x2c\x2b\xb7\x8a\x07\x16\x71\x08\xf6\x06\x23\x03\xa8\xda\x1c\x2a\x44\xfd\xf0\x4d\x11\xdb\xfc\x19\x02\x15\x86\x61\xaa\xa8\xb9\xb7\xab\x7d\x65\x3d\x72\xf4\xe8\x46\x79\x01\xf0\x43\x2b\xe1\x83\xe7\x90\xef\x9c\x3c\x90\x97\x98\xe1\x2f\x24\xf0\xa7\xf3\x8e\x9d\x29\x57\x90\x70\x6b\x22\x20\xae\x9d\xca\xf6\x12\xe7\x6a\xd5\x9b\x0d\x5d\x05\x5e\xe8\x3d\xac\xe2\xfd\x60\x7b\x93\x2d\x46\x64\x7b\x31\x1e\x49\x52\x39\xb6\x9f\xdf\x24\x0c\xbf\x83\xa7\xf1\x97\x07\xfb\xe5\xa6\x14\xe3\xe1\x44\xfa\x83\xfb\x22\x97\xbd\x83\x61\x13\x4f\xa7\x74\xf0\x88\x2e\x29\x80\x31\x7b\x24\x34\xc3\xc8\x46\xf7\x8b\xe8\x6f\x21\x24\xe1\x0a\x36\xb0\x9e\xd6\xed\xe1\x8c\xa8\xb9\x8e\x06\x09\x79\x78\xab\xc4\xb2\x07\x08\x58\xf2\x4d\x37\x7f\x23\x2f\x68\x89\xe0\x1d\xe0\x1a\xcd\xc8\x1a\xff\x4b\x66\xb5\x96\x7a\xb1\x4d\xf3\x68\xf6\x9d\xc3\x33\x02\xb4\xcf\x8d\x3d\x4f\x2a\x1f\xc1\x48\x06\x42\xd5\x6a\x83\x32\x13\x64\x05\x9b\xd7\xd1\xb2\x96\x9c\xc3\x20\xef\xf0\x0d\xd3\x49\xd0\x70\xb2\x7f\xbb\xa1\xc1\x60\x81\x24\x39\x6a\x62\xd9\x9f\x15\xcd\x38\x6d\x28\xd0\xab\x06\x65\xc2\x42\x9c\x8e\x5e\x6a\xc9\x8c\xf6\x90\x50\xfe\xb3\x30\xc5\x75\xbf\xaa\x25\x22\xf2\x99\x6b\xf8\xc2\x37\x64\x3d\x07\x04\x4f\xc1\x45\xf1\xed\x38\x19\xf0\x42\x95\xd2\x76\x80\xb6\xd9\x32\xe5\x10\x54\x6c\x94\xfd\xb8\x38\xbe\x1d\xa2\x64\xdf\x40\x44\x8b\x9b\x16\xb6\x74\xaf\x9f\xb8\xf2\xdb\x97\x3a\x89\xc7\x50\x0a\xd6\xc3\xb2\x2e\x7a\xa6\x50\x71\xdc\x54\x61\x3d\x2d\x83\xfb\x3e\x0e\xf9\xe6\x15\x1b\xf1\x8f\x20\x97\x02\xfa\x38\x25\x20\x62\x59\x21\x7b\xa7\x9b\xe9\x41\xa1\x0e\x21\xa1\x15\x4a\x4e\x12\xc5\x82\x86\xfb\x53\x26\x40\x1e\x15\xac\x31\xb1\xab\x68\x30\x63\x23\x9d\xb5\x44\x23\x6a\xf6\xcc\xea\x2a\x0b\xba\x12\x0d\x19\x46\xa9\xb5\xa3\xb4\x74\x01\x88\x92\x9c\xc8\x23\xca\x2c\x8e\xf2\x54\x1d\x2c\x03\x62\xf7\xa0\xfd\x6d\xf6\xa5\xc4\x2d\xc1\x75\x4c\xbb\x13\xf2\x3c\x38\x0d\xca\x63\xb5\xfd\x4f\x2e\x0e\x96\x31\x78\x42\x25\x52\x8a\x35\xa2\xef\xf2\xaa\x16\x0c\x1a\x61\x93\x6d\x31\xb2\xc7\xcd\x8e\xfd\xf3\xdb\x09\x32\x4b\xda\xe3\x7a\xa1\xa0\x56\x62\xf1\xd0\x27\x0c\xa8\x04\xac\x0c\x89\x4f\xc8\xbc\xbf\x3a\x8a\xc9\x72\x01\xe1\xfe\x67\x6f\x51\x9a\xc3\xc4\x3a\x77\x67\x53\x4c\xa3\xd0\x18\x34\xfb\x87\x2b\xf2\xee\xc0\xf3\x03\x8b\xe0\x3e\x63\x3f\xbb\xf3\xb5\x94\x0f\x83\x27\x5f\xcb\x93\x5b\x2b\x9f\x5d\x2c\x2f\x98\x32\x9a\xed\x40\x94\x26\xe3\xe3\x64\xc2\xde\xa8\x7d\x57\xd1\x5c\xa8\xd4\x1c\x4e\xef\x80\x18\xf8\x6e\x2d\x32\xe8\x04\x29\xf5\x05\x4d\x07\x71\xbb\x24\x01\x3c\x25\xe2\xf5\x52\xba\xdf\xbf\xb9\xe7\xaf\xd6\xbf\xdc\x64\xef\x89\xd7\x49\x01\x10\xc5\x35\x15\x86\xc4\x83\xea\x47\x31\xfc\xf9\x2d\x89\x12\x6c\x47\x4c\x42\x6a\x50\xfa\xc1\x50\x24\x04\x87\x42\xc7\x9d\x7e\xb4\xaa\x13\x78\x72\x1f\xd4\xcb\x74\x6d\x63\x79\x61\x72\x39\x0f\x2a\x56\x30\xee\xdf\x0a\x04\x5a\x96\xa8\x81\x21\x3a\x5e\x92\x37\x07\xb3\x6a\x0c\xd2\x15\x75\xcc\xc9\xbf\x72\xd9\xf2\x3b\xf9\x84\x8c\x26\x41\x17\xca\xf8\x62\x28\x33\x59\x6e\xf4\x2c\x97\x02\xff\xf6\xe1\xe7\x8c\xda\x4b\x4e\x16\x0b\xab\x88\xa7\xb3\x56\x3c\xdf\x9d\xb5\x27\xd2\xd6\x4f\x3b\x4a\x07\xec\xea\xe5\xbd\xa9\x00\x92\x52\xe7\x19\x56\x2f\x6e\xea\x63\xfd\x82\xd2\x66\xa4\xbb\x41\xbf\x8b\xae\xba\x28\xfe\x06\x04\x93\xe6\xd5\x22\xa3\xdc\xc1\xf4\x98\x36\xdb\x03\x64\x30\x6f\x41\x5d\x57\x32\xb9\xa2\xab\x92\x2d\xf1\x05\x57\x66\xbc\x56\x36\x48\x98\xd5\x0d\x33\x84\x70\x5b\x61\xaf\x63\x1b\x7c\x0b\x45\x14\xd9\xeb\xa0\xab\xe1\x05\xf0\xa2\x61\x21\x97\xe7\x27\xc0\x22\x40\xa3\x2c\x7d\x7d\x90\x1f\x7d\x17\x46\x21\x56\xde\x7d\xe2\xcb\x14\x2e\x0d\x30\xec\x5d\x35\x9a\xe1\x6b\x25\x04\x85\xde\x48\x65\xba\xe5\x0f\x30\xb3\x48\xd8\x4f\xa4\x4b\xb3\xba\xa1\x11\x15\x6b\x9c\x69\x5d\x08\x2a\x6b\x23\x0a\x40\x99\x70\xb1\x11\x63\xdc\x45\xc9\x47\x40\x8a\x93\x80\x2e\x11\xc4\x8a\x2c\x4b\xca\x9d\xb7\x8f\xd5\xd2\x1b\xda\x35\x0e\x86\x99\xcc\x37\x7e\x02\x65\x57\x36\x70\x57\xb4\x7e\xf2\xb4\x3b\x64\x47\x53\xe5\x10\x8d\xa1\xc1\xe9\x3d\x26\x29\x7f\x72\x2a\x88\x69\x41\x57\x9e\x64\xb1\x4c\x01\x45\x7d\x58\x10\xeb\x6a\x32\x0f\x69\x14\x64\x58\xa2\x13\x66\xf3\x42\xd7\x9b\xb7\x73\x53\x1c\xd1\x6d\x61\xa9\xd0\xd5\xc8\xda\x93\xf9\x84\x5f\xa2\xc6\x0f\x44\xdc\xb5\xa3\x78\xc0\x02\xe7\xd0\x64\xf5\xf3\x3a\x5b\x7a\x38\x21\xe2\xf9\x4d\xba\x9a\x30\xca\xb7\x23\x33\x77\x95\xe7\x18\x7a\xa8\x97\x8d\x92\x78\x80\x1f\x93\x5d\x06\xf2\xf0\x4c\xf9\x0d\xcd\xbc\x63\xd8\xe1\x68\xde\x7a\xe4\x94\x3e\xdc\xc4\x25\x59\xb5\x8b\x17\x99\x3a\x39\x38\xb2\xf6\x9a\x2e\x96\x3f\x78\x33\x07\x42\xb0\xcd\x2e\x2e\x9c\x73\x81\x7a\xad\xa9\x52\x31\xa1\x12\x0b\xe6\x3d\x8b\x70\xd4\xd6\xb1\x0d\x50\x4e\x83\x46\xe2\x5c\x26\x42\x49\x93\xa5\xc7\xc1\x68\x01\x5a\x64\xa0\xa2\x7f\x82\xe8\x3a\xea\x01\xf6\xd9\x30\xdb\xc9\x73\x64\x53\x1c\xf6\x5b\x9d\x1d\xc6\xd9\xfc\x2e\x64\x73\xed\x04\x78\x47\x8d\x93\xb3\x52\xbc\x4d\xe4\xd6\x35\x96\x74\xcf\x15\x0e\xa6\xc8\x50\x12\x14\xbc\x81\xf2\xb1\xd5\x67\x87\xf1\x63\x4f\x84\x9d\x2a\xd3\x67\x70\x2a\xca\x4c\xcd\xd2\xd9\x65\x33\x8d\x0f\x01\x4e\x45\xc9\x4b\xb7\x7a\x80\x29\x3b\x71\x9e\x94\x83\xb2\x60\x90\x1b\x5d\x41\x76\xd6\xe5\x62\x03\x28\x6a\x2d\x4d\x03\xbd\x7a\xb2\x9b\x6a\x36\x41\x31\x70\xe3\x32\xa9\xc0\xc6\x7b\x71\xbd\xa9\x73\x58\x21\x26\x1d\x8a\xfa\xd8\xa9\x33\x5f\xbd\x44\x86\xaa\x64\xed\xcf\x23\xcb\x19\x03\x58\x9c\xe2\xfd\x1b\x2a\x12\xe0\xf6\xf6\xa1\x3c\x0d\xdd\x5d\x95\x94\xef\xcb\xf2\x6f\xec\xc9\xcb\x19\x5e\xe2\xec\x10\xd8\x3c\x73\x34\x80\x47\xad\x93\x41\x45\x96\x71\x43\x1f\x71\x5d\x47\xa3\x43\xa4\x4f\x1b\x95\x61\x6d\x60\xe5\xc8\x1e\xa8\xe6\x9c\x0f\xb6\xdc\x80\x77\x2d\xb9\xa1\x77\x0c\xb8\x04\xcd\x03\x1e\xa1\xba\x0b\x0f\x43\x39\x0e\x9b\x5f\x51\x3c\x9d\xb4\x8b\x0b\x21\x94\x9c\xcd\x09\x97\xc5\xdc\x66\xe3\xc1\x9c\x9d\xcd\x8f\x62\x41\x2b\x9e\xcd\x39\x6c\x70\x78\x01\x3d\x7f\x35\xda\x24\x0f\x62\x94\xbc\x17\x48\x89\x46\xe6\x64\x5b\xeb\x78\x34\x87\x1a\xeb\x8b\x5f\x2c\x0b\x68\x91\xa4\x9d\xd5\xaf\xcd\x16\x7f\xf3\x4d\xa1\x6e\xbe\x68\xbb\x03\xd9\x60\xc5\x89\xa1\xa1\xd3\x28\xbb\xe8\xa0\xbc\xfd\xac\xc7\xfa\x92\x70\xc5\xbb\xf4\x83\xa7\x74\x34\x3d\x79\x58\x50\xfb\x78\x05\x4d\xcc\x12\x3e\x51\x94\x15\xfb\xf3\xcb\xde\x1e\x6b\x20\x7c\x00\x94\x5b\x0a\x01\xe5\x09\x91\x42\x1d\x29\xed\xe5\x23\xcf\x8e\x32\xa8\x61\x6f\xde\x51\xf5\xdd\xf6\xd0\x6a\xf2\x0d\x75\x22\x9c\x8d\x17\x77\x59\xbd\x17\x69\xf7\x7a\xac\xf9\xb6\xef\xe0\x00\xa5\x4f\x97\xb2\x12\xb6\x57\xb0\xe5\x5c\xd9\xd3\xa6\xca\xfe\xf9\xd5\xc7\x67\x2c\xf1\x3b\x5b\xa2\x82\x56\x30\xbb\x4c\x9c\x5e\xc9\x1c\x9d\x8e\x35\x19\xe5\xce\xbe\xf0\x49\x62\xa4\x83\xbb\x26\xc7\xed\x83\x97\xc2\xc7\xb5\x74\x51\xe6\xa2\xc1\xb4\x30\xb5\xbb\x7e\xc7\xe1\x85\x1f\xf1\x55\x1b\xe2\x3e\x92\xaa\x36\xf6\xcb\x3d\x3b\x67\x34\xcd\x4e\x4e\x99\x46\x27\xea\x6d\xd7\xd5\x6e\xb5\xb2\x0f\x58\xb0\x8a\xab\xdb\xcc\x8b\x83\x7e\x1e\x24\x31\xa0\x52\x5d\x28\xd1\xa5\xd0\x0a\xc2\x6f\x2a\xe7\xaf\x1a\x96\xb0\xc9\x8f\x6f\xf1\x1c\x40\xcc\x42\x39\x94\x59\x36\xdf\xf3\x23\x13\x27\xc7\xdb\x53\x3d\x45\xbc\x4c\x31\x0c\xeb\x95\x6e\x2c\x8c\x45\x90\x48\x50\x29\xda\xd9\x56\x2a\xfd\x7b\xdc\x36\x8d\x72\x82\xa7\x21\x6f\x6f\xb0\xa0\x61\xb5\x08\xf1\xe5\x4a\x06\x2a\x18\xb3\x23\x7f\x91\x8d\x3e\x59\x05\xfa\x3a\x1d\xda\x83\xe2\x8a\x34\x47\xb4\x02\x03\xbd\xa9\xf7\x6b\x61\x55\x57\x9a\xe0\x35\xbb\x18\xe5\x4a\x6c\x37\x51\x8b\x0e\x63\x20\xac\x79\x07\xbe\x9e\x32\x91\xb7\xab\xcf\xb6\x61\x96\x6b\xf9\x70\xe5\xcb\x10\x0e\x3d\x7a\x22\x89\xc4\x25\xe4\xb3\x9b\xff\xfd\x4b\xdf\xd8\xd5\xc9\x60\xdd\x09\x28\xad\x9c\x06\x00\xf6\x1d\x52\x5b\xe0\x05\x1f\x8a\x78\x68\x35\xfb\x03\x9c\x64\xa4\xd6\x2e\x11\xa3\x03\x7f\xa8\x76\x6b\x9d\xa5\x78\xf5\x35\x8d\x2a\x30\x2e\x91\x0d\xc5\x41\xea\x16\xc5\x45\xa3\x67\xa9\xf5\xe3\x1a\x8a\x4d\xb1\x12\x6c\x30\x0b\x65\xe9\x1c\xfc\x88\xfe\xcb\x92\x00\x0f\xc0\x65\xcd\xa0\x0d\x6b\xde\xea\xb5\xc3\x00\x55\x8a\x49\x2e\xbe\x37\x4f\x7f\xe7\x0e\x39\x66\x97\x13\xff\x4d\xcd\x3a\x99\xe9\xb7\x49\x45\xdb\xc9\xee\x2e\x2d\x71\x23\x63\x6a\x8a\xd4\xf9\xa4\x0e\xe5\xc1\x75\x0e\xf4\x5a\xb3\x37\x41\x45\x0c\xe2\x61\x0f\xca\x62\xfa\x8c\xc8\x35\x50\x46\x90\x00\x9e\x9d\x9f\x19\x06\x7b\x1e\xda\x7f\x96\x4c\x79\x4f\xa7\xc4\x34\x88\x5c\x15\x26\x44\x73\xac\xeb\xf6\x19\x98\xc6\x99\x06\x13\xb0\x0c\xee\xea\x8f\x5b\x0e\x08\x2c\x9a\xdd\xda\xe2\x13\xc7\x54\x35\xe1\xd9\xb1\xe4\x7e\x40\x52\x21\x97\x18\x2f\xa3\x47\x31\x07\x52\x5c\x67\x04\x7d\xda\x73\x6b\xee\x7e\x0c\xf4\xba\x71\x41\x9b\x87\xdd\x67\xf8\x41\xa9\xd5\xb4\x4b\x1d\x72\xa2\x7e\xd8\xe5\xb0\x8e\x62\x3d\x60\x41\x8e\x1a\xf5\x52\xd8\x86\xf1\x61\xd7\x31\x7b\x98\xe7\x31\x93\x4c\xb6\x1c\x96\xd3\xa8\xe7\x16\xfd\xcb\xd9\xb4\xff\xca\x4d\x1e\xf1\xe6\x31\xa1\x06\xdf\x6e\x08\x68\xb4\xcb\xab\x6e\x36\x8d\xe4\x70\xf6\xcc\x3b\x3a\x99\xad\x05\x3e\x2a\x08\xfb\xb8\x42\x1c\x33\x15\xc1\x33\x8f\xd6\xc8\xf7\x74\x41\x37\x31\xcb\xa3\x76\xab\x08\xcc\x98\xb3\x32\x66\x4b\x99\xf7\xe6\x56\xf4\x8b\xfd\xdf\xad\xfc\x15\xdb\x6a\x83\xb5\xd3\x38\xd1\xef\xe0\x95\xb2\x66\xb7\xb6\x3b\xf2\x27\x3e\x8a\x00\x6d\xee\xa3\x93\xc4\x78\x26\x74\x8b\xf2\xe5\x8f\xb9\x44\x1d\x5f\x40\xa0\x30\xdc\x89\xf2\x83\xc7\xc4\xea\x12\xf1\xf5\x69\xc8\xb5\x80\xed\x41\xd9\x00\x66\x13\x77\x5f\x51\x5c\xb9\x0b\x86\x6f\xdd\xde\xc3\xa9\x49\xa2\x6d\x1a\x14\x28\x28\x58\x36\xba\x82\x50\x1a\x45\x78\xe6\xcd\x21\x7a\x09\x71\xa4\x28\x36\x75\x7f\x47\x7f\x49\x8e\x40\x45\xba\x76\x39\xd7\xab\x52\x4e\xd1\xe4\x09\x11\xb3\x2b\xe8\x77\xa2\x3f\xe5\x62\x1f\xbc\xb5\x9c\xb1\xf9\x3c\xba\x5e\x59\xbc\x7f\xb3\x43\xe8\xd4\x11\x34\x3c\x13\x71\xcf\x0c\x66\x80\x56\xc4\xbd\xa1\xf9\xf9\x74\x51\xea\x5a\x59\x98\x53\x29\x28\x43\x19\x5e\xf8\x1c\x3f\xae\x57\xfc\x8c\x44\x23\x2e\x6c\x90\x9e\x77\x67\x80\x91\x94\xa7\x93\x54\xc6\xd4\x4d\x6d\x3e\x44\x72\x4b\xb1\xe2\x38\x9f\x54\x67\x65\x0b\x47\x50\xba\x1d\x4c\xb9\xd7\x38\x6f\x30\x33\x6c\x69\xf8\xe0\x31\x7a\x79\xe4\x3b\x2f\x31\x27\x74\x20\xee\x3e\xa2\x61\x27\xa6\x7a\x1b\xdc\x20\x59\xdb\xca\x0e\xd6\x42\x55\x13\x9d\x4b\xc9\x56\x2d\x4d\xc1\xa8\x95\x74\x5a\x51\x07\xeb\x0e\x99\xaf\x07\xe0\x01\xf8\x47\xc6\x0d\xc5\xc5\x91\xeb\xc1\xf1\x2d\xae\x52\x63\x7c\x4b\x78\xb1\xbe\xba\xe4\xc9\x31\x54\x39\xf2\x30\x28\xe9\x1c\x4d\xcf\xfd\x58\x83\xb3\xe2\x54\xbb\x18\xc5\x51\x2d\x08\x80\x55\x76\xeb\xd9\xb2\xf3\xa1\xcd\x57\x08\xe0\xb5\xfe\x6a\x27\x61\xc8\x1a\x90\x48\x6a\xd3\x6c\xf5\x3d\x3b\xe5\xc8\x23\xbb\xc7\xe4\x04\x2e\xcb\x00\xe2\x5f\x3a\xac\x04\xaf\xfc\x21\x01\x6c\x52\x61\x5c\xb4\x19\x4e\x46\x06\x08\x1e\x43\x7f\xe9\xff\x88\xe1\x64\x11\xa6\xee\x58\x19\x09\x92\x65\x94\x6b\x4a\x4b\x5e\xbd\xea\xcc\xa4\xd9\x17\xfb\x9b\x1d\xac\xfc\x29\x63\x0c\xe1\x68\x42\xc1\x8c\x04\x59\x99\xe2\x1a\x92\xe9\x1a\xe4\x2c\x7e\x4a\x22\xc5\xe3\x52\xa7\xf0\x63\x84\x7a\x49\x6d\x21\x3d\x5b\xd0\x72\x60\x8d\x45\x66\x03\x76\x8d\x9a\x11\xb0\xf9\x48\x35\x31\xb2\x44\xce\xe3\xe9\xcd\xfc\xae\xaa\xb4\x71\x3e\x93\x58\x76\x07\x32\x54\x5e\x11\xfc\x0e\x2d\xa6\x74\x10\x27\x15\x24\x28\x00\xc4\xa9\xbf\xb7\x7a\xdf\xc3\x93\xb1\xa8\x26\xe9\x9e\x98\x7e\x7c\xbc\xd1\xe6\xcc\x9e\x77\x32\x08\x47\x7f\xb0\xdf\x43\x80\x7f\x30\xeb\xb5\xff\xd7\x27\x7f\xb0\xa8\x0b\x55\x1e\xd4\xba\x29\x4a\x08\x81\x89\xf2\x67\x36\x6b\x09\x18\x2b\xe5\x94\x86\x57\x20\x43\xa6\x92\x96\x25\x31\xc9\x66\xae\x6a\x3f\xe1\x06\x7e\xe2\xdb\xbb\x4d\x5c\xa4\xd2\x7a\x6a\x6d\x81\x94\xa6\xf4\x80\xf0\x2c\xc0\xb5\xdf\x38\xa6\x2a\x23\x97\xb1\x26\xdd\xe4\xe0\x45\x7f\xba\x94\x72\x3f\x29\x61\xab\xf7\x86\xc9\xe4\x1c\x9e\xcf\x3a\x8c\x37\xf6\xa9\xa2\x31\x58\xe3\x03\xea\x28\x74\xea\x52\x5a\x6b\x86\xae\x67\xf0\x2c\xe0\xc5\xce\x7d\x40\x66\x72\x8f\x00\xe2\x68\x5f\xc2\x48\xb3\xe4\x6b\xdc\x0e\x4c\x41\x81\xe1\xb8\x7d\x44\xc0\x51\x46\x2b\x5e\x1c\xbd\x60\x9c\x38\x79\x0d\x56\xe2\x11\xfa\x45\x38\x64\xc4\xd2\xca\x88\x77\x54\xb9\x35\x2f\x86\xf8\x7e\x6d\xc1\x25\xce\xb5\x42\x87\xc8\xfc\xfe\xfd\x33\xa2\x37\x6c\xd4\x1a\x0b\xe7\x98\x32\x9b\xd9\xed\xe4\xfc\x28\xfd\x4a\xf6\x3a\xa1\x63\xb6\x7c\xc5\xff\x24\x81\x6a\x18\xf1\x43\x7f\xac\xed\xbb\x19\x6c\xb1\x63\x8e\x6f\x8e\x17\x01\xc9\xfb\xd9\xff\xeb\x76\xb6\xe5\xb0\x0c\x7a\xca\x8c\x0c\x7d\x92\x20\x82\xdd\x89\xda\x6a\xd6\x6c\x99\x10\x96\xc8\xf1\x39\xa2\xc7\xef\x13\x29\xd3\x62\x2d\x60\xcb\x9b\x35\xfa\xb0\x38\xfb\x42\x13\xed\xa5\x4d\x6d\x88\x72\x24\xea\xb9\xd8\xe4\xa9\x85\x65\x30\x54\x36\x8a\x7d\x43\xfb\x9a\x47\x0c\x93\x08\xab\xd3\xb9\x75\x78\xef\xe2\x7d\xa6\x94\x96\x51\xce\x1c\xdd\xf0\x27\x70\x1e\x1d\x06\x01\x8a\x33\x76\xc1\xc9\x37\x0a\x0a\x6d\x50\x74\x6d\x24\x1a\x07\x3e\xb2\xa9\x40\xc7\xae\x0d\x91\x50\xb1\x43\x9c\x56\x52\x39\x94\x73\xd7\xb2\x34\x07\x05\xa1\x95\x03\xe4\x7d\x9c\x42\x55\x31\x65\xf7\xe5\x66\xaa\x37\xde\x37\xf8\x27\x05\x6b\x6f\x4c\xc0\x7d\x3a\x05\x70\xf1\x36\x29\xcc\x58\xc2\x6d\x0a\xce\x9f\xc0\xc0\x31\x7c\xf5\x2a\x08\x0a\xa7\xc2\x19\x3e\xae\x7f\xae\xfe\x13\x20\x49\x61\x21\xc9\x47\x56\x64\x96\x22\xc2\x64\x01\xed\x8f\xd8\xb7\x7e\x3d\x7c\x18\xab\x2b\x8e\x93\x6a\x61\xf2\xd0\x27\x59\xf5\x1a\x4f\xe1\x18\x44\x13\x53\xb6\x03\xd1\x41\x44\xd1\x16\xc6\x05\x89\x74\xce\xfe\x51\x6a\x20\x91\x90\x69\xff\x32\xcc\xd5\xc9\xab\x2b\x09\xf4\xe4\x15\x1a\x96\x9d\x9b\x73\xa9\x2a\xdd\x84\xc4\xb8\xae\x9d\x77\x68\x44\x3e\x0a\x86\x26\x8e\xf1\x6d\x0b\x64\x7a\x79\x92\x6f\x8e\xfa\xf8\x80\xea\x75\xf1\x8c\x35\xe7\x35\x19\x85\x71\x9d\x46\x16\x28\xfd\x9b\xae\x8b\x82\x94\x95\x38\xb0\x2a\x3b\x0e\x35\xf4\x53\x32\x02\x53\x58\x4b\xdf\xa4\xce\x5b\xea\x6c\xce\x97\x59\x98\x8c\xfd\x97\x70\x2c\x2c\xa8\x99\x49\xde\x03\x5e\x7b\xf4\xef\x18\x6b\xd0\x9f\xe4\x0a\x2e\x69\x57\x4d\xd2\xc2\x0a\x03\x57\xba\x2b\x98\x25\xec\x04\xb0\xd9\xcf\x48\xf2\xc4\xd3\x17\x16\xa8\x65\xad\x36\xa2\x35\xde\x5f\x9e\x25\xf4\xa4\xe0\x83\x87\x2e\x73\x27\x04\x33\xfb\x34\x73\x9d\x4a\xe4\x1a\x79\x13\x18\x24\xda\xe6\x40\x5e\x14\xe6\xb9\x4e\xce\x85\x08\x1d\xc3\x9e\xc4\x2e\x41\x4c\x4f\x89\x99\xb6\xb2\xec\x77\x96\xc5\x5c\x06\x35\x82\x6c\xbe\xb3\xfb\xf4\x20\xed\xf0\x65\xaf\x80\x3e\x06\x2b\x5f\x3b\x98\x4b\xcf\x38\xbd\x40\xcd\xe6\xc0\x57\x59\x99\xf2\x4e\x2c\x20\x5d\x17\x02\x4a\x33\x88\xa0\x38\x22\x19\x59\xe0\xdb\x39\xab\x0f\x75\x62\x95\x77\x22\x1b\x80\x6d\xae\x0a\x4c\xa9\x79\xfb\x4e\x6e\x07\x1a\xd2\xee\x0a\x69\xce\x46\x19\x26\x68\xce\x96\x11\x12\xb1\x13\x67\x1e\xe4\xfb\x32\x66\x71\xea\xfc\x1d\x4e\x63\x91\x70\xc0\x9e\x33\x21\x57\x07\x4b\x61\x28\x1c\xba\x2d\xa7\x03\xe2\xfc\xd2\x27\x47\x10\x4e\x48\xa0\xc3\x57\xb3\xf4\x9d\x24\x3e\x89\x0c\x67\xc4\x82\xbe\x5d\x90\x5b\x23\xd5\xc3\x6f\x06\xa8\xb1\x6e\xbb\x8f\x82\xb0\xb1\x7f\xe1\xc5\x0e\xd0\xbd\x6c\xc8\x8b\x03\x0b\xc7\xa6\x4d\x45\xe7\xc3\x95\x7e\xda\x7d\x20\xdd\xfe\xc9\xe9\xf9\x0b\x0a\x25\xea\xe2\x1d\xfd\x1d\xd7\x6f\xf2\x36\x68\xa3\xbf\x52\x84\x43\x25\x40\xa1\x16\xe7\xcd\x6f\xed\x00\x80\x07\x11\x45\x3b\xba\xd6\xf7\x87\xd9\x2c\x44\x19\x25\x35\x18\xa4\x91\x1c\xc1\x17\x1c\x57\x9b\x34\x41\x8d\xb6\xec\xfc\x79\x67\x8b\xb6\xe8\x05\x78\x95\xec\xc3\x2f\x35\xdb\x73\xd8\x8b\xc3\xd0\x0e\x8e\xda\x01\x38\xa1\xcb\xa0\x15\x03\x32\x68\x5d\x8c\x3c\x7a\xd3\xc3\xc2\x6e\x13\x0c\xa6\xe5\x9d\x58\x3c\xb9\x5a\x82\x0f\x81\x96\x13\xc0\x1a\xf8\x1c\x48\xa9\x9d\x6a\x77\x76\x52\x58\xa6\x01\x20\x9b\x92\xcd\xc3\x8a\x29\x2c\xcb\xca\xa6\x53\xf0\x52\x76\x49\x99\x22\x07\x4e\xa7\x85\xdc\x61\x72\xdd\x3d\x32\x00\xef\xf8\xc3\xe6\x33\x67\x03\x5d\xb0\x01\x67\xa9\x62\x5e\xd0\xa9\x47\x61\x36\xad\x54\x3d\xd0\x01\x0d\xda\xd2\x1d\xe9\x2a\x54\xed\x7a\x4c\xcb\x8e\xdd\x27\xa5\x9c\x44\x4a\x66\xa0\x3c\xea\x29\xf9\x4e\x81\xf5\xc5\xa9\xc4\x0d\x15\x19\x18\xf0\x4f\xf1\xfe\x3a\xae\xd8\xed\xe4\xc2\xe6\xf1\xb4\xf1\x51\x90\x21\x2e\xae\xd5\x20\x11\x5a\xdb\x47\x45\xec\xcf\x14\x07\xab\x06\x53\x4e\x21\xf8\xbc\x39\x6d\x5f\x27\x09\xec\xa4\xf2\x7b\xa5\x79\x5e\x4d\xcb\xda\x30\xf1\x94\x1d\x12\xa6\x90\x5c\xb3\x1a\x4b\x60\x1a\x6f\x98\xbf\xb8\x85\x5e\xe1\x01\xd8\x51\x6a\xd1\x9b\x1c\x52\xfc\x0f\xa3\xb8\xef\x14\x8d\xa6\x33\x7c\xb3\x53\x0f\x59\xdf\x86\x64\xda\xe9\x10\x30\x06\x2d\x92\x08\xd7\x35\x03\x03\xbc\x07\xaa\xfb\x83\x45\x7d\x84\x79\x87\xa3\x43\x3b\xc7\xd4\xef\xe5\x05\x00\xcc\xe4\x03\xd8\x43\x34\xb4\xac\x35\x86\xdc\xc6\x44\x24\x71\xc0\x7c\xac\x48\x31\xa4\xd3\x39\x41\xda\xd4\x82\x14\xc3\x09\xfc\x93\xea\xdd\xa0\x38\x35\xfa\x32\xdf\x0e\x88\xbc\x51\xab\x95\x68\x03\xad\x67\xa8\x5b\xda\xae\x21\xbf\xd1\x09\x40\x24\x45\xc4\x0f\xe9\x27\xd0\xdd\x45\xcf\x7c\x85\xe4\x13\xa5\xfd\x7f\x71\x0c\x1d\x30\x3b\xc5\x2f\x91\xe0\x93\xbd\x33\x1a\xb9\xad\xe6\x4a\x5c\x93\x48\xc5\xc3\x1c\xa7\xca\x8b\x48\xba\xe2\x3e\xaa\x6e\x9b\x1e\x2b\x80\xa5\x9b\x0f\x40\x5b\xa9\xbf\xd1\x89\x29\x85\xbc\xb2\xb6\x54\x00\xbc\x58\x4b\x00\x60\x6f\x1f\x05\x71\x72\xce\xca\x81\x6e\x3d\x6d\x72\x1c\x42\xdb\x43\x9c\x5c\x7d\xb4\x7d\xbc\xd2\x3a\x98\x21\x7c\xb9\x17\x9d\xc7\x68\x2d\x71\xb2\x34\xef\x99\xa1\x21\x3c\x77\xcf\xec\xe7\x9c\x98\xf0\x7a\x33\xf3\x83\x68\xbd\xdd\x6e\x4b\xbc\x7d\x22\xab\xc2\x5c\x08\x7d\x13\x48\x1b\xd5\x15\xeb\x4e\xa0\x96\xc7\x6c\x8c\x6d\x0c\xa4\xb1\xe9\xb9\x18\x09\x17\xa8\xf7\x89\x60\x7a\x0f\x8d\x89\xb8\x5b\xf0\xa7\xf6\xc2\x5a\xc3\x59\xa1\xf8\x4a\x57\xb1\x28\x2a\xe7\x4c\x75\x94\x2b\x46\x8b\xe1\x5b\x87\xbf\xde\xc4\x60\xd9\xf1\x83\x7e\x46\x5b\xd5\x78\xd1\x84\x36\x1d\x48\xce\xce\xdb\x9e\x7f\x71\x22\x54\x99\xea\x41\x0d\x42\xf3\x85\x53\xfd\x90\xfb\x61\xbe\x4a\xa3\x4c\xc8\xdd\x7b\x37\xbf\x4e\xe7\xc7\x69\x4e\xec\x25\xda\x5c\x22\x7b\xea\x56\x56\xd5\x19\x65\x18\x8b\xe3\x44\xf3\x49\x62\x15\x4f\xbc\x46\x2a\x64\xd2\x9f\x0f\xab\x46\x93\xd9\x7b\x43\x3d\x59\xe2\x8c\xe7\x93\x8a\x25\x15\x65\x67\xea\x32\x98\x1c\xc9\xce\xd9\x25\x3e\x92\x32\x62\xc6\xce\x0e\xa7\xbb\x21\x48\xf4\x29\x69\xb5\x8d\xa9\x22\x4e\x92\xef\x11\xf1\x9f\x0e\x23\x43\x6a\x91\x7e\x7f\x07\x97\x1b\xee\x4a\xbd\x0b\x55\x95\xd2\x93\x71\xb2\xd7\x45\xb5\x14\x15\x7e\x02\x82\xa9\x5f\x57\xe4\x2e\xa9\x31\x2d\x51\x62\x63\xa6\x64\x1c\xb5\x56\x59\x4d\xb4\x5e\x59\xd8\xd4\xa3\x05\x60\x44\x68\xbb\x28\x90\xae\x3e\x0a\x4d\xea\xae\x23\xdc\x71\xbe\xd7\x88\xa9\x2d\x72\xa9\x4c\x48\xdf\xec\x0b\x61\xa3\x5d\x47\xf1\x83\x45\xa9\xfe\x91\x64\xb7\x5a\x30\x8c\x08\x39\xd4\xb3\xc3\x22\xd8\xf0\x0c\x16\xbb\x7d\x10\xfe\x0d\x38\xcc\xa4\x83\xad\x01\x21\x91\x71\x21\x6e\xc1\xac\x0c\x49\xe8\xed\x62\x30\x2e\x67\xc8\x49\x8b\xe7\x87\x6d\x55\x79\x88\x48\x4f\x78\x25\xb6\xa1\xfb\xd9\x97\x97\x29\x6f\x6c\x19\xfb\x03\x33\x5b\xdb\x54\x87\x3b\x8d\xee\xbd\xf3\xdb\x3f\xe1\x56\x51\x7c\xdb\x9f\x11\x23\xfa\x7f\xd1\xb5\xec\x31\x6f\xc2\x6e\x2d\x10\x66\x1d\x7e\x3d\x76\xe8\x98\xdc\xac\xd6\x7d\x8c\xca\x53\xdf\x49\x47\x2e\x3f\xe8\x04\x79\x82\x89\x16\xb5\xd3\xb9\x98\x4c\x08\xa1\x1c\x09\x7f\x6f\xea\x98\xe2\x70\x6a\x25\x76\x1b\x9d\xb5\x1b\x21\xf2\x00\x51\x9f\x8a\xd3\x52\xd1\x0b\xa8\xd6\x95\xbc\xff\xa4\xe1\xce\xb7\x1c\x01\x2e\xac\x8b\xb7\x9d\xe4\xa8\x28\xaa\x0c\xe8\x79\xa4\x0a\x3f\xe2\x17\x3a\x8a\x3d\x30\x85\x6b\xe4\xe5\x73\x3d\xaa\x65\x60\xc5\x8b\x9c\x22\x8a\x4f\x6b\x3c\x0b\x98\xdd\x9b\xfb\x4b\xf8\x8e\x34\xb1\x8e\xe3\x42\x4a\xdb\x42\x56\x94\xf6\xb2\x83\x02\x33\xb9\xc4\xbf\xd9\x6e\xe2\x4c\xd9\xe8\xb6\x96\xbb\x29\xbf\xc7\x3a\xc0\xe4\x93\xe1\x77\xe5\xf5\x9c\x84\x6a\x96\xc4\xab\xc0\xda\x4b\xc9\x17\xf3\xd8\x39\x90\xb6\xba\x8a\x75\xf3\x42\xd8\x53\x4f\x9d\x11\xeb\xac\xd9\x1e\x72\x32\x16\xb6\xa3\x90\xe1\xad\x8a\x3e\x3c\x60\x62\x05\x74\x72\xcd\xe9\xc9\x45\xc0\xb4\x6f\x81\x70\x14\xcf\x95\xf6\x21\xc0\xd1\x70\x14\xe9\xc3\x62\x30\x0e\xd7\xbb\x7c\xba\x55\x0b\x98\xd3\xa9\xc5\xf4\x4a\x94\x27\xbb\x02\x3f\x2d\xba\x26\x8e\x4e\x8c\xbb\x3d\x19\x90\x07\xa7\x2e\xa3\x2a\xa0\x31\xfa\xdb\x3e\x74\xe2\xba\x6b\x56\xfa\x56\x2e\x18\x5e\x10\xb8\xc4\xe2\x0d\x8e\xd6\x39\x4a\x9d\xb0\xd4\xd8\xc8\x11\xfe\xd1\xdf\x6f\x1f\xcf\xc5\x56\x02\xbe\x27\xcb\xb7\xf2\x95\x9c\x56\x1e\xdd\xe4\x76\xdd\xaa\xbc\xac\xf8\x79\x48\x20\xaf\x68\x17\xf3\x52\xca\x87\x61\x05\x97\x58\x06\xa7\xa4\xca\x82\x81\x28\x1d\xce\x5f\x90\x49\x4c\x7b\x91\xb5\x90\x65\xc5\x47\x28\x9b\x43\x91\x69\x33\x2f\x5a\xca\xe5\x05\x78\xc2\xdd\x68\xea\x28\xc1\x4f\x63\x09\xd9\xb6\xed\x23\x56\x45\xfc\x12\x94\xe0\xc0\xaa\x50\xa1\x71\xab\xb8\x6e\x1c\x29\x43\x32\xff\xcd\x45\x46\x01\x58\xf9\xad\x3f\xc4\x68\x31\x0b\x40\xa1\xfb\x05\x0f\x49\x55\x36\x6f\xf0\xb6\xae\x14\x2c\xb5\xc4\xce\x17\x8d\x22\x4b\x89\xaa\xde\x42\xef\xaf\x31\x82\x17\x19\x46\x7d\xd8\x87\xee\xcc\x92\x8a\xa2\xd8\x3d\x69\x1a\xb9\x22\x4e\x76\x4e\xf9\xc4\x34\xcb\xed\x41\x26\xae\x7d\x79\xa0\x76\x05\x4b\x64\xcf\xee\x93\x54\xa8\x5b\xa4\x97\x8d\x21\x92\x6b\x3c\x6f\x63\x24\xa6\xd6\x0f\x57\x3b\x96\x51\x67\x06\x02\xbe\xd3\x59\x10\x1c\x3a\x14\x39\xea\x69\x72\x70\xf3\xfd\xe5\x62\xdf\xce\x62\x36\xe6\x97\x3b\x85\x8b\x65\x40\xa2\xb5\x0a\x02\x61\x8d\xe4\x35\x54\xce\xe3\xe0\xe7\xe3\x41\x46\x07\x60\x0e\xbf\xb8\x64\xb7\x0f\xc6\x57\x46\x10\xd7\xe5\xe4\xee\x2a\x9d\xcc\xba\xfe\xa6\xd3\x2d\x29\x91\xe8\x37\x87\x0a\xd8\xa8\x2e\x42\x80\x56\x97\x6a\xfc\x6a\x51\xbc\x19\x06\x94\x49\xdd\x35\x6a\x33\x62\xc2\x07\x8e\x7d\x45\xbe\x3a\x2a\x57\xd6\x35\x05\x36\xcd\xd9\xef\x6f\xac\xc7\xb0\xf4\xf7\x17\x09\xe7\x7a\xf6\x41\x7c\x22\xf3\x63\x2f\xbf\xd0\x47\x09\xe7\xee\x05\x04\xc9\x3e\x7c\xee\xb1\x44\x04\xce\xd9\xaa\x6f\xd7\xaa\xd6\xe1\xf7\x2c\xaf\x7c\x48\x5b\x60\xb3\x79\x27\xf3\xc9\x5c\x02\x68\xe7\x61\x60\x73\x13\xe4\x9f\x78\x50\x32\x14\x6d\x72\x8a\x43\x31\x49\x51\x6b\xc8\x34\x66\x4b\x04\x01\x78\xa0\x03\x66\x03\xa7\x4c\x62\x4a\x0c\x64\x29\xab\xcf\x81\x1d\x18\xa2\x58\x43\x4e\x46\xd1\xa9\xfe\x9c\x12\xa2\xcd\x84\xe0\x70\xa1\x39\xa3\x01\xf8\xf4\x84\xe7\x95\x58\xea\x56\xdd\x10\x2f\x31\x47\xe7\x8c\xc8\x26\x38\xfc\xb1\x0d\x6c\xf5\x28\xde\x2f\x9f\x93\x8f\x46\xc9\x66\xc0\x73\x78\xb3\x05\x56\x5b\xfa\xf5\x2c\x55\x04\xa5\x62\xe0\xc6\x1c\xda\xac\x58\x1d\x39\x58\x84\xd6\x36\x2d\x99\x5a\xd4\xb2\xca\x49\xa1\xe0\x87\x78\xdf\x21\x93\x01\x1f\x56\x32\xe7\xaa\xf9\xd4\x16\x9b\x23\xeb\xc3\xc7\x27\x96\x84\x13\x02\x5f\x1f\x52\x98\xb2\x37\x82\xbd\x3f\x38\x59\xf2\x92\x2b\x5a\xb9\x6c\xc4\x29\x4e\xdb\x3b\x06\x9b\x53\x80\x13\x29\x87\xca\x22\x30\x09\xe3\x26\xd7\xf4\x48\x43\x0f\xe1\x76\xa6\xe1\x19\x38\x97\x50\x33\x33\x84\xeb\xff\x86\x9e\x09\x00\x2e\x7f\x6b\x74\x3f\x66\x6d\x5b\x28\x48\x4f\xe5\xde\x10\x11\xa8\xc5\xa2\x55\xd6\xea\x16\x57\xe7\x91\x58\xd6\x04\x49\x92\x2b\x94\x7e\xa6\x00\x6d\x42\x09\x6f\x59\x04\x31\x0e\x27\x2a\x32\x56\x0e\x7e\x7c\x8b\x49\x4c\xb6\xf3\xa8\xcf\x7c\x29\x7e\xc8\x64\xb0\xc2\xf8\x4a\x9b\xa4\x6d\x6d\x65\xfd\x9d\xd6\xac\xf2\xa7\xa8\x8b\x0c\x05\xa7\x51\xa1\x98\x86\xda\xba\xcd\x53\x7b\xd8\x70\xe7\x89\x82\xc2\x35\xf6\xdb\x13\x32\x0b\x57\x95\xb6\x73\x70\x4e\x81\xfc\x51\x5e\x9e\x63\x28\xfa\x3a\xfd\x8b\x80\x7a\xf6\x27\xae\x94\x9f\x43\x1f\xfa\x4f\x5f\x7c\x5a\x4f\x52\xcd\x3f\x70\xe3\x15\xac\x82\x6f\x51\x59\x30\xaa\x8f\x8a\x2f\xb6\xa0\xcf\x7a\x6c\x71\x23\x96\x05\x97\x20\x62\xe0\x9e\xfa\x16\x02\x9c\x2a\x22\xc5\x40\xc7\xf2\x7a\xcb\x87\x87\xdc\xa2\x56\xe1\x69\x48\x9b\xc6\x31\x10\x0a\xd7\xb0\x05\x00\x50\x59\xcc\x79\x9c\x5a\xf5\x24\x0f\x49\x2c\x3f\x20\x03\xf3\x48\x4a\xd6\x41\x99\x7c\x4c\xea\x07\xa9\x52\xa7\x73\x11\xaf\x75\x94\x63\x21\xaa\x64\x93\x55\x79\xf8\xbf\x2c\xfd\x27\x78\xcc\xf2\x81\x68\x34\x58\x06\x3d\xed\x0b\x4e\x4e\xfd\xdf\x98\xa9\xce\x51\xaa\x0a\x3e\x9f\xd6\x9a\x3b\x45\x46\x21\x72\xfc\xbb\xf9\x4c\x6b\x5c\x64\xe5\x46\xb3\x26\xfe\xf3\xda\xc1\x30\x0a\xae\x4a\xf9\x21\xe9\x5e\x2c\x5d\xfb\x83\xee\xd2\xb0\x19\xf5\xc2\xbe\x9a\x39\xfb\x7a\x02\x6c\xbf\x11\xb7\xbf\xbc\x00\x50\xd0\xbe\x60\xaa\x0a\xdc\xe4\x85\x4a\x01\x84\xde\x4c\x88\x40\x7f\xe6\x67\x28\x77\x2b\x61\x8d\xda\x74\x36\xb7\x2c\x60\x78\x0e\x3d\xac\x0a\x4a\xa3\x4b\x75\xb6\x6e\x32\xaf\x34\x7a\x93\x4a\x91\xad\xf2\xa5\x88\x75\x34\x03\x9a\xde\x69\x64\x27\xdd\x2f\x9a\xac\x35\xf0\xd8\x5c\x63\xcd\x07\x51\xd8\x20\x98\x07\xab\x04\xf4\x3e\x43\x7a\x40\x23\xfa\xe2\x31\x96\x36\x3f\xa0\xa0\xea\x66\xf1\x4a\x8e\xe0\x5c\x1b\x41\x0a\xf9\xe1\x72\x9f\x78\xf5\x31\xc8\x58\xc3\x6a\x1c\x01\xc8\x55\xad\xde\x79\x25\x57\x79\x76\xe5\x8e\xac\xb2\x1c\x48\x8f\x5f\xa3\x03\xfa\x20\x7b\xc9\xc1\xca\xdb\x59\x48\xe0\xb0\xa0\x09\x14\x62\x2a\xed\xa4\xd6\x3e\xa9\x8b\xd7\x70\x02\x9a\x6e\x78\x38\xae\xb3\xd7\xaa\x43\x8c\x6f\x67\x83\x1e\xe0\x33\x69\x61\xd4\xd5\xac\x95\x22\x8f\xb6\xb6\x3e\xe2\x3e\x2d\x92\xc2\x5a\x49\x30\x25\x3e\x1a\x24\xa8\xf4\x8f\x35\xae\x18\xbc\x59\xfa\xa9\xca\x30\x80\x5a\x3d\xca\x5b\xbc\xfc\xb3\x44\x1b\x22\x62\x5b\x5b\x4f\x74\xa1\xcc\x3e\xae\xc6\xec\xa6\x9c\x3d\xa8\xbb\x97\x8f\xb7\x8a\x68\x59\x00\xf1\x82\x92\x81\x39\x1b\x45\xa3\x27\xd4\x64\x51\x5c\x97\x0b\x4c\xba\x8b\xe6\xcb\x0f\x83\x0b\xa0\x45\x2a\xfe\xb6\x78\x6b\x86\x55\x34\x57\x9f\x98\xa4\x24\x37\xea\x87\x84\xf7\x0c\x94\x21\x42\x5a\x44\x29\x1c\x2b\xee\x80\xd8\xca\x3c\xe2\x73\x72\xc4\x25\xb6\x77\x7a\xa3\x0f\x4c\x99\xc2\x97\x62\x3e\xfd\x99\xc2\xf6\x2a\xa6\xb4\xae\xe9\x80\x73\xb8\xef\x82\x89\x6a\xda\xe2\x44\xf2\x7a\x55\xe3\x03\x71\x13\xc4\xcc\x97\xa4\xbb\x85\xa1\xcd\x0d\xc0\xe8\x27\x1c\xc9\x73\x27\xe5\x77\xfa\x1e\x18\x07\x04\x0f\x2f\x01\x8d\xf7\xfd\xed\xfe\x00\x72\x4d\x09\x6a\x6d\xa6\x40\x39\x7b\x5b\xab\xc2\x38\xd4\x4d\x1b\x62\x77\x9d\x3a\x8f\x3a\x4c\x70\x88\x7b\xfb\x78\x0c\x56\x5b\xb4\x99\x51\xff\x90\xb3\x58\x1b\x67\xf4\x54\xe5\x5d\x42\x91\x3a\x91\x9b\x59\x29\xb6\x70\x25\x8f\xd3\x5c\xc7\xee\xe0\x54\x6c\xe5\xcb\xfa\xc4\x38\x05\x57\x3b\x80\x9c\xc5\xc0\x17\x1d\xbb\x80\x14\xb1\x42\xf5\xf9\x29\x79\x1f\xd4\x86\x9e\x98\x7c\x6c\x83\xb8\x9c\x1f\xc5\x4c\x64\x72\x04\xcb\x00\x61\x9d\xfd\x62\x1b\x60\x1a\xb8\x3e\x0e\x0f\xc9\x99\xb5\xdb\x56\x98\x35\x30\x75\xc4\x9a\x41\x89\xc5\x28\x77\xd9\x73\xbc\x3f\x93\xe5\x73\x14\xb3\xd3\x21\x41\x5d\x49\x18\xd1\x44\x22\xa0\xaf\x17\x0c\x10\xd5\x63\x77\x29\xee\x3c\x86\x47\xa0\x61\x56\xb7\xa4\x3b\x3b\x5f\x45\x83\x5c\x7d\xd9\x27\x94\xc6\x1f\x94\xdf\x39\xe7\xc5\x57\x3f\xe2\xd0\xd8\xf8\x46\x72\xce\x5e\x25\xad\x28\x39\x96\xf7\xe4\xfb\xdd\x8a\xc4\x47\x68\x8f\x67\xa7\x68\x2d\xdb\x82\x33\x25\x77\x26\x50\xe4\x01\x9a\xf6\x64\x97\x9f\x3e\x65\x04\x1d\xce\x18\x1c\xe5\xcd\x5e\xaa\xfc\xb7\x20\xd9\x5a\x86\xea\x82\xb5\x16\x2b\xe7\xac\x43\x89\xd1\x89\x32\xcf\x78\x32\xc7\x43\x20\xb8\x18\x79\x01\x12\x99\x63\xec\xdb\xec\x43\xaa\x59\x8d\x9a\xc3\x2f\xa9\x76\x4a\x2f\x3d\x31\x84\x79\x72\x39\x12\x39\x28\x2e\xd4\x34\xa1\x57\x9c\x97\x8c\x94\x83\x3b\x9c\xcd\xbd\xa5\x09\x70\x1d\x18\x3b\xc8\x5c\xa1\x5a\x1b\x8b\xbe\xab\x98\xf0\x93\x62\x9c\xb3\x4e\x34\xb5\x17\xee\x83\xcd\x7f\x47\x1b\x1f\xf2\x30\xb4\x82\x3a\x1f\xde\xeb\x7c\x70\x3c\x84\x1c\x05\x6b\xe9\x47\x48\x8f\x06\x25\x94\xde\x94\xa8\xfe\x00\xce\x08\x2e\xed\x3d\xda\x11\x5c\x0c\x6e\x95\xc0\xc3\xab\xb7\xae\x17\xe1\x52\xd4\x24\x33\x2d\xb1\xfd\x98\xae\x0d\x91\x01\x90\x0c\x4d\x06\x15\xd5\xe6\x34\xe0\x5f\xb7\x5d\x93\x0b\x1b\x5a\x75\x3c\x43\x57\xec\x8f\xca\x1b\x7a\xa2\xf5\x94\x94\xc6\x21\x84\xd6\xd6\x5b\x99\x76\xdb\x4e\x5c\x60\x95\xa3\x02\xcd\x15\x51\x5e\x30\xa8\x94\x3a\x52\xcc\x9c\x98\x92\x82\x20\xd3\x9f\xc1\xe2\xf6\xe6\x2f\x14\x3b\xe2\x50\xb0\x51\x85\x21\x32\x39\x2a\x1b\x6b\x34\xf0\x78\x80\xea\x64\xa5\x37\xbd\x47\xe6\x07\xe5\x8a\x36\x56\xbf\xc5\x12\x21\x73\x37\x4d\x6e\xfa\xc1\x8e\x99\x68\xb7\x62\x3e\x0f\xeb\x99\x2e\x9c\xa6\xa4\x2b\xec\x99\xa6\x93\x3a\x1a\x4b\x64\x72\xa0\xd9\x58\xd9\xd2\x7a\xb0\x75\x40\xab\x4e\x76\xef\x17\x17\x6e\x8c\x72\xa4\x41\x28\xa7\xae\x4c\xe6\x64\x02\x54\x45\x72\xd8\xc8\x00\x58\xbd\x3a\xf9\xe3\xac\x7c\x65\x1d\x3d\x90\xf7\x24\x1f\xbd\xf5\x1c\x5a\x3f\xde\xb8\xb1\x99\x58\xb1\x43\x5e\x12\x48\xb3\xfc\xc9\x0a\x43\x5c\x0e\x12\xe4\x97\xe0\x73\xd5\xe7\xaf\x8e\xbc\x36\xe3\x0c\x31\xe5\x8b\xad\x83\x43\xfe\x78\xc2\x9c\x93\xb7\x43\xb1\xaa\xf2\x6f\x86\x0f\xf8\x16\x66\x41\x7e\xd5\x38\x39\x6a\xbc\x95\x4c\x1d\x95\x5a\xe2\xd4\x39\x48\xfe\xed\x2c\x4d\x34\x1a\xde\xb0\xc4\x57\xa0\x56\xf6\xca\x01\x8c\x88\xa6\x72\xdf\x59\xf1\x19\x3a\xe5\x3f\x62\xa8\x92\x83\xb6\x04\xd1\x55\x5d\x81\x8f\xba\x48\xe2\x00\x7f\x3c\xbb\xc2\xff\xcc\x2c\x77\x0e\x57\xbf\x01\x7b\xc5\xf7\x57\x09\x22\x2e\xae\x04\x96\x91\x82\x5a\x40\xfb\x66\x59\x43\x92\xf8\x93\x1a\xa9\xc1\x1c\xac\x22\x60\x20\x80\x52\xe3\x05\x50\xdd\x95\x2c\xb0\xbe\xc2\xf7\x54\xef\x43\xac\x35\x4a\xbe\x42\x3c\x61\x0c\x1b\x46\x5b\x9f\x97\x91\x50\x26\xc9\x54\x2a\xcf\xe1\xe5\xc5\xf9\xbd\x86\x08\xf7\xb7\x33\xe9\xdf\x13\x3b\x7e\xb6\x82\x63\x21\xf1\xf0\x1f\x3e\xd0\x40\x0c\x4d\x32\x39\x71\x58\x64\x98\x1c\x98\x30\x45\x1d\xd6\xca\x03\x0b\xda\xcf\xe0\x7d\x4b\x2a\x22\xd3\x60\x1f\x82\x55\x56\xaa\xa7\x11\x06\xd7\x2e\x92\xe1\xea\x22\x28\x1a\xd3\x88\x17\x6a\xe3\x2a\x3d\xe2\x5b\xac\x91\xe9\xc8\xeb\x3a\x69\x85\x86\xf7\xc9\xbe\x71\x47\x9c\xba\x7b\x94\x63\x9a\xac\xe1\x48\x54\x13\x10\x1b\x89\xd3\x39\x87\x8e\x54\x6b\x24\x05\x3a\x83\x02\x02\xfb\xf9\x09\xe8\xc9\xb9\xa2\x87\x85\xa0\x18\xa9\xc8\xc6\x0b\x50\x0a\xed\x72\xbd\x90\x7e\x6e\xe1\x97\x0d\x1a\xf9\xe2\xab\x13\x47\x7e\x62\xd8\xbc\xca\xd4\xe1\xbf\x19\x47\x56\x92\x0b\x40\x9c\x9c\x9f\x81\x80\x1f\xe3\x7c\x27\x09\x62\x3a\x63\x7e\x03\xca\x82\xb6\x95\x60\xde\x43\xf0\xf1\xc8\xaf\x70\x2a\x9e\xfb\x00\x1d\x35\x8c\x40\x6c\x60\x21\x9c\xc0\xdf\xd8\xed\x0e\xa1\xab\x87\xc1\x04\x07\xd1\x53\x0a\x73\x9e\x81\x0d\x31\xc7\xbc\x17\x72\x26\x51\xdf\xd8\x1d\xd8\xd8\x8a\xac\xc2\x9e\xc8\x85\x68\x1c\xda\xef\xfa\x7a\x2b\x07\x0b\x4a\x92\xce\xe9\x14\xd1\xe7\xf8\x1a\x17\x9e\x36\x20\x90\x21\xab\x56\x7d\x05\xee\x69\xfd\x0f\x56\xa7\x99\x81\x16\x7c\xd8\x07\xa1\x27\x60\x54\x88\xbd\x03\x3c\xfc\x1d\x37\x66\x9d\x8c\x05\xdb\x3b\xba\x13\x0c\x7f\xa3\xb5\xc4\x68\x4c\x76\x03\xea\x90\x1f\xc8\xed\xd6\x72\x81\xc3\xa7\xfd\x54\xf6\xfa\xd1\xeb\xf4\x18\x33\x89\x6a\x66\x47\x51\x46\xef\xac\x0e\xfe\xb3\xd5\xe8\x07\x55\x82\xbc\x68\x8d\xba\xf0\xe9\x55\x8f\xdd\xe7\x06\xec\x71\x38\x90\x93\xec\x9c\x6d\x4c\x13\x05\x72\x8b\x12\x5e\x3e\xd8\xe0\xa7\xf7\xca\xac\x88\x7c\x95\x26\x7a\x18\x3b\x31\x6c\xd8\xd4\x88\x82\x65\x54\x57\x0e\x9e\x8a\x4f\x1b\x0f\x1f\xb6\xf9\x05\x42\x93\xc6\x05\x45\xe7\x8a\x77\x36\x6b\x8f\x0a\xc8\x5c\x31\x21\x49\x6b\xbf\xfa\x4f\xb8\xb6\x88\x3e\x3a\x4b\x62\x6b\x79\x8d\x29\xee\xef\xe0\x1d\x5b\x3e\x64\x3d\xd5\x9b\xf8\x2c\xe7\x47\x89\x35\x9d\x19\x68\x88\x51\xfa\xd3\x37\x89\xd2\x8f\xac\x33\xa8\xf6\xbb\x26\x4b\x98\x53\xb5\x67\xa0\x6f\x1a\x04\xb5\x42\x66\x01\x46\x24\xac\xea\x8e\xed\x9d\xe3\xc8\x5d\x3e\xbb\xde\x61\x3b\x59\x2e\xd9\xbc\xc4\xd9\x05\x14\x16\x9f\x2e\xb7\x00\x22\xd3\x45\x1a\xe2\xa3\x86\xf5\xb2\xc4\x5c\x86\xae\xf6\x06\xa6\xd8\x8c\x3e\x40\x33\xc9\x13\x48\x63\x07\xb3\xac\x4f\xf0\x29\x86\x9c\xe6\xf0\x1e\xd3\x27\x22\xdb\x28\x5e\xd6\xb6\x7e\x81\x0d\xad\x2b\x88\xe6\x67\xad\xc1\x90\x0c\x55\x15\xe6\xb4\x2f\xe2\x31\x5c\xc2\xf5\x44\x97\xf7\x15\x3d\x97\x47\xeb\x0c\x86\x64\xd6\x00\xed\x5a\xc8\x2f\x07\xad\xf5\x5c\x38\x74\xa8\x06\xcb\x3f\x38\x52\xa9\x32\xe3\x75\x54\xa1\xc8\x64\xd9\x86\xe9\x5a\x6c\x3c\xd9\x01\xbb\xb3\x71\xc2\x80\x6a\x3e\xbb\xaf\x13\x47\x05\xea\x4c\xf9\x0a\x21\x83\xe0\x3a\x79\x87\x82\x17\x83\x95\x57\x04\xdb\x84\xd2\x41\x22\x2e\x46\x1a\xa8\x42\x7c\x9b\x33\x68\x0d\x12\xec\xd3\x30\xbd\xef\xd3\x2f\x29\x69\x11\xa9\x3a\xe5\x3c\x0f\x5a\x6f\x8a\xf0\x51\x15\x12\x90\xf6\x15\x97\xf9\xfa\x8c\xce\x0e\x98\x29\x05\x65\x69\x0d\x74\x8d\xe2\x6d\x52\x2b\x76\x14\xb4\xa8\x87\x96\x84\x85\xfa\xd7\x1c\x4e\xb2\xf9\xbc\xcd\x8d\x48\x9a\xfc\xf2\xc4\x10\xf7\x3b\xb0\x7a\x0b\x9f\xd1\x02\x78\x24\x3a\x7f\xb2\x2b\x2a\xb9\x70\x98\x21\xab\x8b\x4a\xe5\xa7\x79\x34\xed\xc8\x7a\x3f\x8c\xf9\xb2\x91\x12\x36\x6f\x1b\xf2\xe6\x09\x72\x3b\xde\x63\x43\x56\x5d\x18\x3a\xa1\x81\xfa\xb2\x4a\xf3\xf9\x32\x63\x2e\x8c\x7a\x79\x69\xc7\x1e\x04\xeb\xb4\x55\x9f\x82\x80\xf7\x2f\x6d\xde\x56\x89\x8a\xd7\x0f\x28\x5a\x97\x5a\x7b\xbb\xa9\xaa\xb4\xb1\x7a\x66\x40\x94\x5f\x73\x00\xfc\xf7\x5c\x31\x73\x43\x12\xa2\xc5\xfe\xba\x1e\x21\x92\x61\x02\xa3\x81\xbe\x81\xee\x5d\xbd\x0d\xfb\x38\xfc\x9c\x1d\xcc\xbb\x9f\x5e\x7a\x5e\x0a\x78\x8e\x4b\x1c\x23\x5d\x30\x7a\xca\xa0\x69\x06\xc6\x83\x86\x3e\x51\x68\x6f\x4a\xa6\x15\x6c\xc2\xd1\xca\x2b\xb2\x0b\xa9\xd2\x3d\x00\x4d\xdf\x1f\xf1\x4a\x9c\x5c\x53\x8d\x2e\xe1\xa4\xbe\xa6\x61\x33\xb8\x21\x62\x32\x01\xb5\x49\xa4\x32\x7a\x16\xac\x91\x89\xd4\x2f\x09\x66\x0e\xb0\x2a\x74\x78\x74\x42\x26\x55\xbd\x8d\xac\x86\x99\x3a\x2b\x72\x4c\x2e\x8c\x50\x0c\x2a\xe7\x0e\x84\x3a\xe6\x2d\x9c\xc3\xaa\x79\x63\x7a\x5c\x59\xd9\xcd\x61\x88\x18\xec\x18\xd1\xb5\x57\x06\x55\x3f\xd4\xd7\xdd\xd2\xf0\x95\x1c\x9a\x63\x93\x46\x32\x58\x2e\x36\x2f\xcd\x8e\xd6\x3a\xd4\x73\x5b\xb5\x3e\x12\x44\xd4\xb9\x7e\x38\x36\x66\xf6\xea\xfe\x1c\x06\xc9\x47\x87\x31\x01\x78\x92\x34\x94\x25\xbe\x32\xc4\x1b\x95\x06\x0b\x9b\x02\x1d\xe8\xb7\x8f\x7e\xbc\xad\xb8\x41\x3a\x87\x16\xf3\x9b\xe3\x3a\x96\x8f\xe0\xea\x89\x47\x80\x54\xc5\xa5\x85\x01\xa4\xdf\xdf\xe6\x7c\xad\xd0\x41\xd7\x42\x63\x23\x0a\x48\xc6\x17\xe9\xdb\xa7\xf7\x18\xca\x21\x02\x8f\xa9\xd0\x03\xb2\xed\x62\xd5\x4b\x6a\xff\xa2\xcb\xe5\xfa\x0e\xc8\x5f\xc4\x94\x6b\x6c\xc0\xc9\x6d\xed\x00\xa4\x60\xa0\x0d\x88\x38\x55\xfd\x29\xca\x99\x6e\xd5\x23\x06\xbd\x29\x79\xd5\x9a\xc3\x94\xb7\x42\xc1\x2e\xb9\x66\x54\xeb\xbd\x5b\x81\xc4\x93\xce\x0b\x32\x52\x8f\x1c\x0e\xd4\x52\x34\xd2\xc0\x77\x34\x15\x4d\xa8\x9b\x56\xd8\x83\x5a\x0c\xe5\xab\xdb\x57\xcc\x5d\xdc\x9a\x51\x87\xd5\x74\x72\xa4\xe8\xc1\x89\x48\xdd\x3e\xd9\x6e\x5d\x1d\xe1\xeb\x31\x5b\x1f\x07\x20\x08\xc7\xe0\x72\xa1\x74\xbf\x6a\x2a\xe1\x10\xee\xdd\x4d\xbd\xff\xd0\x8a\x92\xd1\xfa\x2d\xb6\x3a\x59\x70\xf5\x2c\xce\x44\x3f\xa9\x31\x1e\x9d\x4b\xa6\xcd\x89\x38\x41\xa4\xa6\x29\xd3\x18\x23\x62\xd8\xcc\x68\x49\x98\x93\x42\x25\x8a\xf1\x01\x6b\x3a\x36\x8d\x3e\xf3\x43\xb0\x30\xfd\xe3\xd0\x8d\x91\xbb\xc7\xd1\xd0\xa1\xb7\x9c\x3e\x56\x2c\x85\x19\x95\x5f\x7a\x00\xb9\xbf\x5b\xa4\x3d\x23\x00\xfa\x4a\xcc\xaa\xb5\x1f\xf3\xfe\x7d\x5a\xb0\x6b\xec\x88\x05\xfb\xd1\x51\x82\xa5\x70\x56\xed\x93\x77\x01\xc9\xd9\xf7\xd5\x54\xb8\xfd\x2b\x4e\x8f\xa4\x40\x02\x38\x4d\x63\x39\x9c\x75\x00\x1c\xe5\x90\x83\xf4\x30\xe5\x22\xc3\x38\xf4\x9c\x90\x4e\x97\x5d\x72\xd4\xcb\xc8\x7f\x86\xa4\xca\x6a\xc2\xbb\x99\xcf\x25\x6c\x6f\x35\x2c\x56\xdb\xc9\x18\x28\xb8\x17\x16\x56\xb1\x0e\xb3\xa4\xa1\xa7\xa5\x3e\xb8\x7a\xea\x3b\xe8\x63\x12\x9e\x03\xa2\xd4\x56\x51\x28\x10\x2a\xeb\xd5\x87\x12\xce\xd8\x83\x3e\xc8\x94\xa4\xae\x8b\x2b\x42\xab\xda\x87\x90\x1d\x35\x38\x48\xe8\x0b\xd5\xa7\xa1\x18\x4a\xf9\xeb\x58\xe1\xdf\xf0\xd9\xce\xec\x0b\xb0\xa3\x6b\xca\x59\x4c\xa8\xff\xd5\x4e\x46\xb0\x2d\x4d\xea\xe7\x41\xb0\x81\x23\x40\x15\x89\xf2\xc4\xb5\x76\x0e\x4f\x91\x8f\x64\xcd\xcb\xa4\x13\x16\x48\x9d\xe8\xe4\x2a\x1e\x7f\x30\x4d\x4e\x9d\x28\x8a\x73\xfe\xd2\x1a\x9d\x5d\xd0\xdd\x8f\xb1\xce\x75\xf2\xcc\xce\x74\xe0\xb8\x27\x18\x79\xeb\xf0\xe9\xf6\x0d\xe5\x4c\x92\xd6\xfb\x52\x70\xe9\x56\xd4\xe0\x56\x76\xcc\xac\xda\x54\x6b\xd1\xf8\x1a\x07\x51\x53\xb3\x12\x5c\x8c\x4c\x55\xa7\xe8\x6d\x15\xa8\x63\x3c\x20\x28\x12\x79\x69\xec\xa6\xd4\x21\x31\xe7\xba\x65\xbc\x08\x7d\xd4\x1a\x21\x00\x87\xbd\x63\x7d\x7d\x02\x14\x31\xc5\xbf\x78\xba\x09\xb3\xf1\x96\xc0\xdf\x6b\x96\x83\x86\xe5\xe4\x16\x4a\x71\x10\xfb\xcf\xea\xdc\x4c\x38\x91\x5b\x89\xdc\x0f\x4b\x72\xbc\x4b\xf9\x18\xa2\xb2\xea\x43\x01\x5f\xcb\xd3\xb3\xbf\xde\xc6\xe4\xe9\xc1\x2f\x63\xa2\x45\x99\x2a\x9e\xe0\x00\xe6\x72\x30\xe1\xd3\x7e\x31\xe0\xa4\xe2\x1d\x21\x4b\x75\x2e\xce\xf5\xc8\x3a\x0f\xca\xbe\xb2\xf2\xea\x03\xc5\x08\x0b\xe3\x87\x3f\xde\x21\x87\xfa\x13\xd9\x2a\xa6\xa3\xca\xfc\x1e\x95\x0e\x00\xd1\x67\x5e\xaf\xbd\xdd\x54\xaa\xf6\x06\x37\x4a\x53\x89\x37\x39\xc9\x26\x22\xd1\xbb\x9f\x0b\x8a\xc6\xb2\x5f\x99\x3d\x85\xaa\xd7\x06\x8e\xbb\xcf\xd9\x56\x6e\x10\x81\xd7\x8b\xd1\x45\xf7\x32\xb0\xab\x89\x82\xbb\x39\x06\x8f\xa7\x7a\x7c\x49\xa8\xec\xc9\x9b\x02\x88\x45\xbf\xe1\x63\x4f\x21\xd7\xc4\x2c\xd1\xed\xb9\xcf\xed\x0d\xd3\xda\x48\xf0\x00\x0f\x21\xfc\xb2\x2f\xcb\x87\x66\x2a\x8f\x1c\xa5\x37\xa5\x47\x82\xbb\xd0\x06\xc1\x2e\x9e\x88\x38\x0e\xe4\xec\xa7\x57\x64\x21\x43\xe5\x4f\xb4\x33\xe6\xdd\x06\x70\xa6\x58\xb5\xeb\xb9\x47\x62\xd4\x3c\xd7\xe2\x44\xff\x0e\x65\x60\x55\xb1\xbb\xe8\xcf\x64\x58\x91\x1e\x36\x85\xed\x2c\x12\x90\x55\x57\xc1\x9c\x29\x39\xaf\x09\xb3\x2a\x63\x5a\xfc\xc8\x91\x27\xa9\x7c\xec\xfe\x6b\x26\x41\xd5\x8d\xd9\x76\xa8\xef\xba\xb8\x79\xa8\xc5\x27\x04\x87\x09\xfd\x29\xa0\x65\x3b\x47\xfc\x52\x22\x31\x08\x51\x72\x6a\xd0\x48\x3c\xae\xc4\xa9\x90\x79\x72\x8a\xc2\x20\x09\x1e\xb3\x69\x3b\xdb\x57\x4c\x1e\x25\x23\x32\x9b\x61\x89\x65\x25\x0b\xef\xa2\x02\xa6\x3c\x26\xee\xdf\xce\xd1\x23\x03\xb6\x1c\x57\x5e\x07\xb2\x62\x50\x48\x69\x2e\x74\xac\xb6\x2b\x7e\xbf\x7a\x50\xd2\x07\x09\xe0\x13\x3b\x15\xb7\x9a\x51\xd9\x45\x5f\x7f\x41\x0d\x05\x06\x01\xb7\x01\x5a\xbc\x19\xa6\x6c\x0e\xde\x64\xd1\x4f\x12\x64\x26\x4b\xbc\x27\x9d\x44\x3b\x84\x4b\x83\x73\xe1\xc5\xb7\xbc\x50\x6e\xd2\xb9\x31\x9c\x4d\x15\xa8\x20\x26\xef\xfe\xb9\x31\xbd\x53\x1b\x8d\x91\x71\xfd\x9e\x29\x00\x31\x94\xec\xdc\x89\x01\x86\x85\xa3\x98\x0a\xa3\xe0\x13\x6c\x8e\xee\x38\x61\xed\x28\xbd\x68\x08\xee\x33\x84\x64\xa3\x9e\x5f\x7d\x5b\xe3\x6b\xbc\xa9\xf4\x55\x24\x15\xb6\x3c\xa1\x9f\xa8\x26\x14\x9f\x9c\x4c\xb8\x94\x1e\x31\x8f\x59\x09\xbb\x6b\x68\x5b\x0b\x81\x7d\x27\xfd\x92\x1f\xa1\xc1\xa0\x35\x88\xfb\x0c\xbd\x1f\xdd\x6d\xdd\xa1\x3e\x8d\x91\x1a\x6e\xe6\x3b\x55\x8f\x0a\xb1\xd3\xe8\xc1\xec\x22\x09\x6f\xc0\x80\x39\x24\xa2\x73\xaf\xd1\x5b\x8d\x9f\xb4\xca\x63\xfc\x70\xf2\x55\xd0\xaa\x3a\x4b\xea\xa0\x84\x86\x69\xe9\x1a\x2f\xd9\x2a\x56\x56\x7a\x34\x89\xb5\x12\x5b\x1f\x1d\x1f\xd6\x85\x85\xa0\x18\x10\x4f\x63\x67\x4e\x0b\xa0\x09\x48\xde\xd8\xd8\xfd\xe2\xe2\xb1\x98\xea\x02\x87\xd8\xe6\x1e\xf2\x63\x64\x13\xf8\xb2\xee\xae\xc4\x57\x7e\x21\x96\x57\x9a\x0f\xe2\x32\xfa\xad\x9d\xe9\x4d\x5c\x24\x72\x3e\xc2\xb5\xb0\xb7\x24\xa9\xfc\xc8\x09\x29\xc4\x6e\x64\xbd\x80\xbe\xb9\x58\x8d\x0d\xd1\x71\x6d\x7d\xce\x54\x01\x4f\x52\xdf\x8b\x79\x18\x85\x16\xc4\x4c\x8c\x86\x0d\x2f\x71\x28\x98\xee\x24\xf0\x02\x6f\xa6\x8a\xe3\x08\xa4\x2b\xae\x05\x86\xe4\x93\x73\xd9\xa9\x68\xd0\x7e\xc1\x20\x6b\x61\xb4\x47\x9a\xbd\xa9\xfd\xa6\xe9\xaa\x28\x91\x5e\xe4\x8a\x5d\x91\xdc\xc2\x22\xae\xc0\x4c\x83\x4d\xa9\x27\xef\xb0\x71\x02\x14\x67\xc2\x1e\x9e\xf1\xab\x4a\x2b\x75\x07\xda\xe8\x63\x4d\x3e\x7a\x6b\x8f\x23\x6e\x30\x99\xce\xcd\xf2\xb9\x15\xa1\xe7\x5a\x96\x02\x98\xcd\xa7\x50\x8f\x61\x3d\x72\x35\x59\x4d\x91\x5f\xda\x7d\x54\x96\x13\x10\x16\xd2\xd7\x97\x31\x35\xd4\x9a\x8c\x33\xc7\x75\x54\x5c\x1e\x03\xf9\x75\x33\xed\xe6\x7c\x5d\xa0\xde\x29\x12\xe8\x17\xa2\x97\xe4\x02\x24\xe2\x65\x6d\xf3\x5a\x96\xc2\x22\x11\x62\xa1\x95\x64\x0d\x14\x9f\xa3\xb7\x7b\x66\x17\xd7\xa9\x63\xf0\xa0\x4a\x31\xe0\x92\x7e\xd5\x7c\x0e\x3d\x72\xe6\xad\x69\x1b\x0b\xdf\x65\x1f\xca\x73\xaa\xcd\xd8\xb0\x77\x5b\x27\xce\xb5\x75\xcf\x55\x37\x39\x07\x81\x1a\x65\xff\xec\xa0\xbd\x5c\x5c\xf4\xa6\x6f\xb1\x81\x40\xcc\x40\x5c\xb2\x42\x47\x62\x51\xcd\x10\xc5\xc4\xb5\xd0\xa4\x3c\x95\x9f\x82\x23\xf3\xfc\x2a\x5c\x5d\x11\xa9\x89\x9a\x08\xc3\xf8\x20\x62\xa9\x9c\x2e\x5c\x6c\x6d\x66\xea\x0e\x49\xf5\x8a\xee\x6d\x8d\x92\x0d\xb1\xab\x14\xf3\x52\x97\x3c\x06\x4c\xdd\x43\xbe\x52\xce\x95\xcd\x1c\xb2\xd4\x15\x7d\x86\x7a\x3d\x43\xa7\xda\x97\xf6\x05\x1b\x74\x74\x29\xc1\xe2\xc1\x01\x57\xfc\xc2\xbd\xf6\x19\x94\x14\x79\xb3\x78\xd4\x25\xa5\xde\x00\x07\x64\x30\x7d\x76\x88\xc1\x6c\x85\x74\x80\xed\xcf\x84\x87\xcd\x0e\xe6\x49\x9e\x50\x80\xeb\xb2\xc1\x06\x62\x47\x35\xb2\x59\x59\x43\x7b\xf6\x8d\xf6\xea\xe9\x7a\x52\xa6\x2e\xa3\x4b\x32\xc4\x3a\x16\x50\xd2\xd8\xf2\x9c\x6e\x8a\xdf\x01\x9a\x37\xd1\x20\x06\xab\x63\x34\x87\x36\xff\xd0\x33\x35\xd4\xa7\xfa\x0a\x8c\x80\x73\xe0\x19\xb6\x20\xb3\x34\x48\xd3\xc7\xf8\x66\x82\x61\x26\x87\xc1\x93\x2c\xdf\x61\xb7\x4b\x70\x4d\x46\x8d\x8a\xc0\xe8\x71\x16\xed\x6d\xc3\xa1\x40\x76\x39\xfe\x50\x7a\xe5\x6a\xf8\xcc\xf3\x56\x76\xe0\xa6\xd1\x07\xf2\x69\x17\xcf\x98\x69\xc1\xac\x45\xd3\x0f\xf2\x61\x8e\x91\xfd\xd6\x70\x79\x64\xd1\xf3\x3f\x9c\x7f\x67\x7f\xfb\x14\x5d\x53\x4d\x87\xb5\x80\xc2\x92\x49\x6d\x0d\x95\xe7\xcd\xa5\x17\x55\x6f\xc5\x76\x35\x77\xff\x85\x9f\x88\x9a\xed\x26\x0e\xfc\xc3\xc4\xde\x5a\x38\x12\x4e\x75\x3a\x78\xed\x9e\x20\x1f\x98\x4f\xf7\xde\x1a\x37\x21\xe7\x68\x9c\x8c\x99\xae\x6f\x51\xef\xe8\x43\x7f\xad\x26\x07\xc6\xa2\x67\x6f\xb5\x3b\x1b\xc7\x7d\x9a\x95\xc7\xf0\x5f\x07\xdb\x24\xee\x76\x52\x66\xe2\x6c\x12\x71\x6a\x3e\xcb\x57\x05\x64\x08\xf6\x64\xad\xb7\x60\xee\x9b\xea\x54\x44\xff\x8a\x22\xe1\x6f\x47\x91\x55\x71\xee\xe3\xeb\xba\x01\xd5\x71\x85\xdc\xc4\x02\x28\xc7\x26\xa3\xf8\xb5\x47\x97\xd2\x6d\x63\x36\x2c\x6a\x59\x4a\xb3\xf2\x01\x14\x79\xc8\xf9\xe7\xe0\x83\x69\x76\xea\x26\xee\x85\x92\xcd\xc9\xe7\xb2\xfd\xa4\x83\xf4\xce\x4d\x19\x36\x6e\x5a\x2a\x53\xee\xf0\x4b\x18\x67\xb5\xf9\x1e\xc8\xe5\x4e\x56\x1f\xac\x76\x02\x0b\x2e\x36\x89\xf3\xd8\x95\x87\x00\x24\x4d\xa7\xed\xc3\x13\x1e\x18\xaf\xa9\x53\x92\x4e\xd4\xa7\x81\x55\x83\x9e\xc7\x1d\xa0\x56\x8d\x0e\xf3\x46\xfa\xa6\xad\x2c\x5e\x87\xb2\xb7\xb4\x3e\x85\x46\xd1\x77\xa5\xde\xb1\x13\x5b\x47\xb4\x3c\x1f\x44\xba\xc7\xc8\x17\x8c\xfb\x11\x23\x74\x03\x7d\x1c\x7c\xc5\xcb\x37\xe0\x4c\x72\xb4\x61\x6e\xe8\x24\x25\x6e\xa4\x74\x03\xe7\xfb\xb1\xfd\x54\xa2\x2f\xab\x4e\x80\xcc\x20\xcb\x3b\x06\x95\xe5\xfe\x95\x86\xf2\x99\xe3\xb9\xc7\x17\x8f\xb6\x4e\x59\xb4\xff\x26\xe4\x68\xcf\xa7\xce\x59\x7f\x68\xfd\xe5\xc9\x68\x77\x4b\xa7\x03\x49\x18\x43\x2f\x81\xc3\xc3\xe0\x38\x14\xf4\x9a\x1e\x2c\x0e\xeb\xf0\x02\xff\x12\xa8\x9c\x34\xa3\x56\xac\x53\xae\x77\x45\xd3\xc1\xe0\xd1\x5a\x02\x43\x2b\xd5\xa9\xf4\x23\xbb\xa5\xc7\x90\x76\x7e\xa0\x69\x2e\xa1\xba\xeb\x94\x0d\xb1\xf7\xe6\x2d\x6f\x56\x6d\x25\x33\xff\x7c\xcd\x82\x7c\x25\x56\xd9\x15\x7d\x0f\x3a\x22\x6a\xad\x25\xb5\x7f\xf6\xf6\x24\xdf\xaa\x81\xae\x2b\xc5\xed\xb3\x49\x79\x44\x1e\xbd\x46\xe5\x20\xb6\xca\x1b\x06\x01\x8e\x20\xc6\x0b\x79\x4e\x69\x53\x0e\x88\xc3\x89\xd5\xf6\x3e\xdf\xa0\xda\x61\x0f\x6a\x18\xf0\xd3\x74\xd0\x9f\x3d\xa1\xc2\x99\x5e\x93\x12\xa3\x6c\x57\x72\x66\x4a\xa3\x41\xd8\x48\x3d\xd5\x37\x21\xe6\x6a\x9b\xf3\x7d\xa1\x2c\x32\x79\x55\xcb\xc0\x3b\x18\xe2\xb7\xd7\xb7\x5e\xe2\xe7\xb7\x48\x59\xc7\x6e\xd4\xd9\xb6\x55\x50\x06\x6d\x54\xbb\x57\x58\x02\x2c\xaa\x52\xe7\xa9\x4f\x23\x9e\x94\x43\xe2\x7e\x13\x49\xa1\x6d\xd0\x74\xaf\xc4\x9e\x93\x8b\xf3\x5e\x4e\x2f\x65\x9e\xf0\x74\x12\x7f\x5e\x1b\x8f\x9a\x58\x04\x2f\xfb\x8b\x0d\xf8\x33\x43\xd9\xe4\x9b\x01\x65\xb2\x10\xa6\xeb\x4d\x72\x09\xf8\x05\x3a\xa2\xda\x9b\x57\x2c\xb8\x90\xb8\xfa\x85\x03\x26\x5f\x2d\x94\x21\xb0\x59\xfb\x76\xb3\xfb\x8d\x00\xe2\xfe\xf5\x82\xe4\x82\x54\x0f\xcb\xb8\xc4\xc3\xcb\x82\xd4\x92\x9f\xf5\x05\x38\xad\x80\x3a\x1f\x62\xf3\x87\x36\x3f\x27\x5c\xea\x30\xc7\x93\xe4\x5c\x5d\xe3\x2f\xd5\x20\x79\x88\xf3\x56\x48\xcc\xb6\x5f\x6d\x26\x4c\x41\x42\x7c\x76\xab\x50\x01\xff\x26\x3b\x44\x5b\x67\x5c\xd3\x4c\xaf\xc0\x75\xdd\x6e\x6f\x2e\x6e\x91\xd8\x8d\x64\xbd\x3f\x16\xd1\x5c\x9c\xe7\x6d\x5f\xae\x28\x02\xa2\x3e\x24\x77\x9c\x2a\xc6\xc6\xdf\x5f\x88\xf9\x1d\x81\xb1\x7b\xee\x36\x9b\x0b\xe3\x05\x51\x8a\x90\xab\x8e\x76\xdc\x38\x8b\x01\x54\x95\xde\x9d\x5d\xb7\x0a\xd0\x00\xe2\x44\x4f\xb3\x24\x1a\x1e\xe6\x45\x6a\x08\x4a\x22\x71\x39\xdc\x4c\x3b\xb8\x8e\xae\x78\xe0\x58\xcd\xfb\xf2\xb0\x03\x92\x50\xd2\xa6\xbe\x1d\x35\x8b\x43\x81\x40\xe9\x3f\x4e\x39\x95\x1d\x4d\x15\x4c\xfd\x53\x49\xd9\x08\xf0\x00\x2b\xc1\x03\x82\x4a\x93\xaa\x2b\xc3\x1f\x83\x85\x05\x8a\x44\xf6\xe1\xc0\xe1\x4d\x71\x02\x6c\x8a\x31\x71\x41\x93\x8c\x95\x7d\x22\xda\x80\xe6\x3a\xb7\x1b\x6a\x5c\x4d\xeb\xa8\xce\xca\x6d\xf1\xc5\x81\x36\x12\x4b\x42\x5e\x68\x09\x95\xba\x6e\x0b\x95\xb3\x4f\x5c\x13\xad\x4c\xe0\x8b\xf9\x20\xff\x23\x50\x23\xfb\x40\x17\x6c\x0e\x3f\x18\x39\xb4\x17\xdf\xe5\x3d\x0d\x51\xbe\x9d\x14\x91\x8f\xcf\xe3\x55\x55\x49\xa2\x00\x56\x8a\x07\xaf\xe6\xf7\x7f\x98\x18\x08\xf9\x3e\x61\xc8\x11\x40\x80\x04\x5b\xa3\xa7\x23\x72\xcb\x5c\xab\x1d\xe3\xe3\x19\x00\x7e\x58\x8f\x9e\x94\xec\x43\xbe\x85\xab\x85\xd8\x5c\x72\x80\x08\x55\x65\x8d\xed\xab\x9f\x39\x81\x59\x7e\x7e\x25\x8c\x95\x8e\x81\x03\xff\x1d\x9b\xf9\x32\x2d\x20\x8c\x37\xb0\x36\x03\x8b\x4c\xad\x11\x05\x18\xf2\x98\xdc\xaf\xe8\x10\xb1\x88\x3e\x68\xe8\x9d\xf2\xbf\x65\x30\x35\xb8\x41\x99\x92\x6e\x1b\x35\x22\xda\x57\xbd\x94\x3a\x30\x92\x61\xbb\x9d\xa9\x7a\x66\x20\x02\x58\x32\x6b\x77\x0d\x24\x5d\xd5\x6e\x06\xf9\x55\x87\xc3\x93\x1e\x9e\xa9\x81\x20\x51\x21\xc2\xc3\x9c\x89\x78\xb2\x66\x9a\x3d\x9c\xca\xa3\x41\x21\x8b\xdd\x48\xa0\x77\x14\xc0\x19\x11\x9e\x7d\xeb\x3e\x73\x35\x3b\xd8\xc2\x72\x03\x37\xf1\x73\xb2\xb3\xbc\xee\x2e\x1c\xa2\xa2\x05\xe6\x25\x94\x17\x9b\xa2\xe9\x64\x55\x60\x09\x2a\xba\x0f\x36\x94\x38\xf9\xdd\x51\x68\x4f\x2f\xb5\x32\x76\x78\x3f\x7a\xa8\x4e\xb1\xd7\xd4\x17\xc6\xec\x83\x83\x6d\x52\xcb\x1c\x23\x8a\xce\xcf\xe9\x6f\x86\x4e\xaf\x51\xff\x6c\xe3\xb9\x90\xa5\xaf\xb3\xbc\xf2\x77\x7c\xa8\x2a\x4b\x90\x3b\xe3\x53\x3c\xdb\x97\x47\x21\x81\x5d\xc5\x84\x80\x8a\x33\x7b\xe9\x08\x9c\x87\x12\x2d\x19\x23\x9f\x72\xcb\x3d\xe8\x95\x58\x8b\xe3\x5d\x94\x91\xc9\x59\xc9\xc7\x2c\x79\x7f\x42\x40\xb9\xe8\xb0\x3b\x58\xb6\x1a\x38\xa4\x57\x7b\x34\x70\xaf\x4e\x5e\x3e\x55\xdc\x81\xe0\x4e\x56\x02\x26\x65\xb6\x20\x91\xb8\x93\x7d\xeb\xb2\xb4\x12\xae\xb7\x41\xb6\x41\x2b\xc6\x50\xd6\x26\x71\xb3\xfa\x98\xe2\xf4\x13\x60\xa4\x56\x15\x43\xa6\x81\xe3\x96\x46\xde\xbe\xd9\xf1\x87\x79\x04\xe6\xb3\xab\xcb\xcf\xe2\xee\x67\x8e\xc2\xd3\xe4\x74\xd4\xb4\xfb\x9f\x0b\x33\xb1\x2f\x4e\x25\x53\x4f\xfc\xf7\x2b\x36\xab\x24\x28\x0c\xcf\x4d\x36\x18\x0f\xe3\xe5\x7d\xf4\xb1\x46\x40\x50\xfa\xb1\x06\x7b\xce\x83\x90\x7d\xf1\x86\x96\xcd\x95\x7a\x55\x00\x88\xf3\xc2\x4c\x11\xc9\xa2\xcd\x7e\x20\xb6\xc1\x8c\x1b\x33\x6b\x2a\x8a\xe3\x2c\xbc\xcb\xb9\x55\x47\xa1\x4f\x38\x6c\x38\xdb\xe4\x6c\xa9\xbd\x13\xc6\xe3\x87\xac\x15\x85\xea\xd5\xda\xe9\x2c\x43\x95\x90\x1c\xf4\x57\xe4\xe8\xe2\xd5\x9d\x9d\x1f\xb5\x29\xc3\x4b\x5f\x87\x93\x3d\xe3\xf2\xa5\x00\x54\x94\xdf\x95\xaf\xcf\xbe\xb2\xae\x51\x31\xb2\x7a\x54\xa4\xb5\xf6\x45\x35\x6b\x50\xaa\xe4\x40\xee\xae\xb4\x24\xbe\x20\x68\x30\x0c\x40\x2a\x65\x6a\x7d\xbf\x55\x68\x9f\x72\xdb\x4c\x8c\x25\x36\x8a\x63\x92\x95\xb6\x61\xca\x4e\x18\x4d\x80\xed\x3f\x77\x5c\x9c\x22\x18\x9d\x26\xdf\xc4\x51\x25\xe6\xa3\x8c\xc8\x74\x62\xad\xbc\x8c\x41\x06\x5a\x77\x64\x57\xbd\xde\x00\x57\xbc\xf9\x0d\xe0\x03\x2b\x15\xc0\xa2\x55\x95\xfc\xb2\x28\xb6\xb0\x26\x28\x61\xc6\x4c\xfa\x0a\x15\x7b\x21\x9c\x7b\x90\xb2\x92\xdd\x9b\xc0\xf6\xa8\x54\x3e\xce\xf2\xfb\x4f\x91\xf2\xcb\x4c\x76\x99\x4d\xf2\x01\xb6\xb0\x8e\xd2\xd6\xca\x79\xd9\x4a\xb5\xcf\x4e\x2e\xd4\x2b\xcd\xa6\xb9\x43\x9b\xcb\x38\x2a\x27\x0d\x2b\xb3\x84\x0f\x2d\x0c\x5d\xa7\xdc\x9c\xce\x4e\x09\x0c\xf2\xed\x37\x27\x8b\x46\x12\x4a\xef\xcf\xe8\xe0\xb9\xb5\xa3\x8a\x0d\x99\x80\x51\x55\xce\x40\xfd\x87\x7e\xa9\x9e\x19\x3c\xc4\xf2\xd5\xc0\xad\x11\x91\x92\xfc\xd3\xc6\x71\xcd\x92\xc8\x2b\x63\xca\x6c\x37\x18\xae\xb6\x40\x1f\xba\x5b\xbf\x66\x47\xe0\xe4\xbe\xa8\xb2\x1a\x66\xc6\xbf\x0e\x37\x5b\xef\x11\x39\x1a\x38\x19\x3a\xf0\x11\x56\x24\xfe\xc4\xce\x64\xe0\x17\xa9\x91\xcb\x5c\x7b\x05\x58\xf3\x01\x26\xa0\x45\x3e\x9f\x57\x66\x1b\x21\xd2\xea\xa0\xb2\xb6\x8d\xb3\xdb\x1f\x0b\x18\x3b\x26\x20\x9f\xdc\x09\x28\xb6\x3b\x45\x68\xe1\x9a\xca\xc7\xa3\x9c\xbe\x7c\x6b\xbb\xf8\xd6\xfd\x71\x1e\x91\x6a\x44\xa1\x04\xfe\xf6\xa6\x43\x65\x65\x4c\x63\x3e\x86\x18\x9c\xa1\xa8\x9f\xda\x49\xbc\xb1\xf9\xec\xc3\x16\x5c\xf6\x5b\x35\xef\xb5\xf1\xd4\x0e\x2e\xd5\x8f\x90\x40\x17\xb6\x2b\x89\xa5\xfe\xaf\x83\xfd\x0a\x84\xc5\x8e\x26\xa7\xdd\xe9\xf4\xbc\x03\xbb\x94\x7d\x26\x51\xf6\xb6\x8d\x1c\xc9\x2d\x7f\x51\xf4\x16\x34\xff\xad\x70\xf9\x38\xdd\x6a\x53\x66\x80\x2d\x53\xf7\x2d\x8a\xff\xcc\x75\xc5\xd7\x40\xb2\x3a\x57\xdf\xa4\x48\x7c\xe2\x04\xdb\x59\x51\x53\xb5\x07\xb3\x1a\x0a\xa2\x3f\x1d\x46\x4d\xe5\x2d\x9f\x30\xa3\xa9\x84\x1b\x5f\x0d\xe6\x69\x6b\xc5\xf9\x77\x9f\xcd\xe1\x74\xf2\xd6\x8f\xea\x27\xf7\x4b\x38\x6c\xe4\x36\xb5\x21\x2e\x1e\x28\x9f\xa9\x41\x15\x96\x4d\xb1\x11\x24\x46\xa8\x8a\xcc\xab\xb2\x78\x38\x43\x24\x51\x77\x50\x4c\x55\x40\x2b\xc1\xa8\x58\x27\x79\x8d\x2d\x71\x88\xfa\xcb\x55\x34\xcf\xca\xce\x29\x45\xda\xf0\x40\x5a\xa5\x46\x03\x9a\x97\x97\x9f\xe8\x35\x93\x1b\x1f\x51\x0b\xa3\xb0\xb6\xf1\x23\x2d\x56\x28\x95\x63\x4c\x75\x01\x08\x14\xea\x35\x7b\x52\xf2\xa7\xc8\xee\xd9\x28\x05\x93\x40\xf7\xa8\xda\xf3\x4d\xf1\x17\xbe\xe8\x53\x59\x48\x4c\xd0\x84\x90\x9a\x7f\x41\xf3\x0b\x54\xab\x01\x2a\x71\xae\xee\x18\x96\xa7\x14\x04\x42\x23\xcb\xe0\x40\x28\xc4\xed\xfd\x89\x9e\x14\x29\x53\xeb\x4b\xcf\xca\xa5\xb3\xab\x3e\x79\x15\x5e\x75\x59\xfc\x94\xab\x6d\xeb\xac\x2d\xd6\xc3\x3a\x21\x1f\xd0\x7b\x27\x41\x50\x13\x27\xb3\x23\x27\x4d\xb3\xa6\x7e\xc8\xdd\xb5\x8d\xc2\x92\x47\xfd\x54\xa5\x9f\x91\x41\xe8\x74\x19\x33\x34\x0c\xef\x95\x8b\x8d\x3c\xea\x5d\x87\x4c\x44\xf4\x7e\xf7\x77\x66\x52\x4b\xfd\x82\x11\xee\x99\x40\xc4\x8c\x7e\xca\xad\x80\x5d\x2c\x26\xfa\x4f\x70\x6f\x0d\xfc\x34\xd3\xef\xdd\x7b\xe4\xef\xf1\x03\xde\x63\x01\x25\x2a\x09\x6f\xc4\x47\x83\xbb\x30\xa0\xd5\x67\x47\xe0\xff\xe4\x90\x5d\x8b\x19\x2d\xca\x93\xff\xda\x2d\xa9\xbc\x66\xb3\xea\xa7\xbb\x44\xa2\x4b\xc6\x2b\x0b\xbc\x23\x59\x72\x88\x52\x5b\x52\xf8\xa5\x75\xac\xe8\x2f\xfc\x92\x1a\x96\x08\x0e\x8a\xdb\xf4\xb3\x77\x43\xdc\x9d\x44\x63\x09\x44\xfe\x79\x45\xfb\x8a\xbc\x2b\x01\x2a\xd0\x36\xe9\xcc\x35\x53\x19\xca\xeb\x00\x2c\xd6\x21\xcf\xdb\x44\x1c\x51\x1f\xa6\xfa\x91\xfb\xd5\x7f\x66\x9e\xb8\x56\x55\xc7\xc7\x99\x53\xad\xd1\xf5\x56\x7d\x96\xcb\x59\xa8\x9d\xf7\xcf\xd5\x1a\xfd\x92\x9b\x80\x9b\x43\x94\x62\x80\xe8\x31\xbe\x53\x79\x73\x84\x38\x42\x76\x82\x86\x49\x0d\xa1\xd8\x3e\xd2\xb0\xc8\x29\xf3\x26\x61\x5a\x39\xd9\xac\x78\xc3\xeb\xef\x2f\x06\x32\x8c\x2e\xdb\xaf\x6e\xb5\x69\x48\xd9\x46\xe9\x8c\x18\xbb\x9c\x2c\x30\x99\xac\xa0\x43\x41\xec\x85\x96\x2c\x06\x93\xf0\x38\x49\x40\x8b\x1a\xe4\xf3\xa8\xd2\x04\xb7\x8e\xd3\x2e\xcb\xbc\xff\x09\x29\xb3\x03\x6a\xa4\x94\xa4\x3f\x83\x56\xa6\xf4\x37\xfa\xe4\xf4\xb2\x29\x6c\xa0\x07\xca\x36\x4d\xd5\xc3\x46\x87\xc2\x3f\x65\x63\x10\xc5\xbb\x72\x3b\x8b\xe1\x86\x4a\x33\xea\x5a\x5a\x5b\x09\x0f\x0a\xb3\x80\x3c\xde\xef\x6b\x73\x75\x0c\x3a\xfc\xb4\x17\x1c\x0d\x26\xe2\x26\xcb\x35\xc4\xf5\x87\xaf\xb6\xd1\x0e\xe4\x66\x51\x9c\x44\xb6\x7a\x4e\x9c\x01\x2f\x07\x9d\x02\x9c\xce\xef\xcc\xdd\xa8\xbd\x85\xd0\x46\xfa\x65\x75\x96\xca\x08\xa6\x2b\x3a\x5a\xb8\x00\x71\x9a\xbe\x76\x19\xa5\x98\x85\xd8\x72\xbd\xdb\xf7\xf6\x71\xd6\x7b\xa9\x08\x85\x9e\x92\xaa\xd9\x07\x68\x58\xe2\x51\xd3\xd2\xe5\x82\xdf\x63\xee\x24\xac\x69\x2d\x5e\x65\x91\x10\x1e\x49\x80\x91\x9b\x89\xe8\x99\x8a\x45\x44\x2c\x55\x6f\x09\x18\x80\x36\x87\xad\xb0\xed\xdd\xc5\xb9\x8c\xfc\x45\x54\x23\xbe\xb9\x6d\x9a\x24\x0c\x77\xf7\x1d\x7e\xed\x8a\xda\xdf\xd2\x85\xe6\x1d\xa4\x6d\xdc\x2e\x0d\x14\xd1\x0e\xf8\x0a\x33\x65\x8f\x6f\xda\xfd\xd6\x97\xa5\xdf\x23\x05\x77\xb9\x80\xbb\x94\x8b\x14\xc8\xb7\x23\x2c\xf6\xe1\x08\x1e\x4e\x70\x7b\x4c\xaa\x7f\xf0\x05\x26\x40\xad\xd5\x24\xcd\x1e\x9e\x64\xa8\x95\x50\x31\x05\x63\x0e\x98\xe4\x1a\x50\xd8\xa7\x42\xc0\x00\x62\x2d\x7d\x84\xf9\x2c\x20\x07\xb4\xdb\xe5\x13\xb2\xcf\x99\xda\x23\x8b\xd8\xb2\x17\xbc\x5b\x3a\x1c\xed\x2b\x5c\x0b\x5f\xa8\x9a\x67\xe4\x10\x95\x17\xef\xe2\x9d\x7d\xa2\x7e\x1a\xf5\x19\x17\xe6\xe8\x3e\x97\xf9\x99\x03\x7b\x8c\xc5\x2b\x20\x62\x95\x68\x36\x11\xe1\x93\xcb\x9a\xb8\xd0\xca\x47\xf7\xc4\x6b\xe9\x4f\x79\xb3\x93\x08\x4c\x23\xa3\x64\x19\xba\xec\x33\x04\xcd\x8c\x10\xf6\x60\x49\x8d\xc2\x64\x95\x65\x35\xb6\x75\x7d\x4a\xdb\xc0\x91\x33\x9f\x0a\x34\x25\x22\x9c\x35\x9d\xd2\x7e\x33\x35\x9f\x37\xc2\x8a\xd9\xf1\x45\x5e\x25\xd5\xb3\xfc\x78\xcd\x81\x79\x4e\x63\x74\xd2\x36\xa4\xe2\xd5\x26\x36\xd8\x26\x6e\x8c\xac\xa3\x2c\x99\x6d\xce\x89\x64\x84\xa9\x76\x27\xb7\xe3\x14\x47\x12\x4d\x9c\x43\xee\xa9\x9b\xd4\x6b\x63\xbb\x24\x0a\x11\xf6\x65\x34\xaf\x0a\x3b\x3b\x67\x24\x42\x4a\x4d\x29\x64\xe7\xd0\x39\xc6\xf4\x03\xaa\x88\x04\x90\x17\x6e\x6b\x78\xaa\x34\x7a\xa0\x15\x9e\x20\x40\xf1\x13\x9c\x7a\x1f\x03\xef\x65\xf3\x76\x70\x58\xdb\x30\x04\xb3\x13\xaa\x0d\x5a\x14\x45\x89\x22\x0d\x1b\xbb\x7a\xd1\x72\xf9\xa0\xe1\x4a\x2d\x2a\x22\xa2\xbe\x31\xc4\x84\xc3\x9f\xcb\x84\xd1\xc4\x8a\x37\x53\x8e\x69\xfa\x20\xae\x32\x63\xeb\xa2\x0c\x23\x47\x9a\x12\xef\x81\xce\x54\x43\xa5\x74\xed\xde\x79\x73\xe0\x9e\x85\x19\x1f\xff\xe9\x40\xd5\x3c\x6c\x7f\xa7\x95\xa3\x4e\xde\x31\xb2\xf2\xf3\x4a\x4b\x85\x9f\x79\xe9\x38\x76\xd6\x4b\x49\x73\x93\x9b\x68\xfd\x1e\x6d\x4b\xae\xd7\xa4\xca\x57\x0c\x83\x7c\x6b\x54\x80\x5c\x47\x28\x06\x12\xab\xd4\x00\xda\xba\x96\x86\xda\xd6\x99\xc8\xc3\x3b\xc7\xb0\x7f\x4f\x70\xb4\x32\x7a\x8e\xaf\x48\xb1\xd0\x38\x75\xe8\xc2\xcc\x3a\x2b\xe2\x74\xb0\x79\x4c\x39\x52\x84\x86\x15\xf0\xc0\x53\xa5\xa4\x65\x40\x66\x9a\xd8\xd8\x76\x9a\xe5\x57\x3e\x3f\x3d\x6a\xad\xac\x88\x93\x86\x27\xa1\x10\x02\x21\x6b\x00\x5a\xdf\xbc\xc4\x34\xc6\xfa\xd2\xec\xc0\x56\x6d\x3c\x58\xde\xa7\x05\xa0\x0f\x0a\xbb\x47\x0a\xbb\x9b\x2c\x83\xdd\xc3\x72\x96\x67\x25\x1c\xd1\x2c\xc3\xe4\xc4\x07\xaf\x70\xcc\x5e\xa4\x33\x45\x00\x90\x7a\x6d\x13\x41\x06\x52\x9e\xe4\x9c\x10\x08\x1d\x7d\x49\x20\x8c\x8b\x1d\x78\xb1\x54\xda\xc6\x00\x51\xef\xc6\xbe\x7d\x2c\x89\x7a\x44\x90\x33\x39\x89\xa2\x79\x3e\xa4\x60\x33\x89\x71\x2c\x0a\x57\x6c\xad\x24\x15\x07\xb3\x0b\x50\x13\x74\xdf\x98\xc6\x1b\x7f\x03\x88\x4c\x86\xd0\xf0\x21\xee\x7f\x9a\x86\x92\xbb\xe9\x7f\xda\xd7\x14\x52\x97\x2f\x96\x82\x4d\xf9\x14\xa0\x46\x2a\x2a\xe6\x5d\xef\x3a\x40\x16\x8a\x93\x62\x82\x90\xd2\x2d\x85\xb9\xb0\x29\x73\x3e\x4c\xf9\x95\xc8\x9f\x26\xbf\xb6\x50\x3f\xe9\x0f\x7d\x53\xfb\x3f\xbf\x0d\xd1\x53\x60\x3f\xf8\x77\x40\x28\x8a\x3d\x0a\xb0\x2d\x70\xe2\x9c\x76\xf2\x80\x4a\xc5\x37\xbf\x41\x84\x94\x5c\x7a\x3c\xba\x18\xca\x13\xc0\x8e\xca\x43\xa1\xeb\xad\x5f\x95\x1d\xe5\x57\x8a\xa0\xbd\x2e\x3e\x18\x71\xce\x3e\xbf\x4c\x8b\x01\x2e\x2b\xe0\x75\x55\xe5\x40\xc3\x2b\xda\xc9\x75\xba\x33\x1d\xc1\x4b\xbb\x44\x2d\xae\x1d\xfa\xe1\x37\xe9\x2a\xb7\x37\xaf\xdf\x61\x0f\x6a\x85\xcc\x6f\xea\x9f\x21\xbf\x0e\x1b\xd3\x4e\x6a\x5f\x6e\xde\x75\x53\xa8\x40\x65\x38\x86\xdd\x82\xab\x38\xd1\x1b\xda\xec\xd1\xbf\x7a\x18\x15\x0c\x74\x8c\x4b\x7b\xb3\xf8\xc5\x0e\xf0\x83\x1a\xea\x59\x92\x1d\xfb\xd9\xf3\x6f\xa5\xf0\x48\xcb\x4e\xfd\xa4\xe8\x12\xe5\x3a\x20\x1f\x2a\xac\x12\xfe\x5f\xf8\x20\x94\x83\x16\x24\x32\x4e\x99\xc8\xac\x62\xef\x27\x07\xfa\x25\x96\xe5\x3c\x3f\xc1\xff\xaf\xfd\xb2\x2b\xa1\xc2\x0f\x43\x8c\x40\x2e\xe5\x90\x32\xea\xd9\x00\x42\x55\x6b\x86\x7d\xb1\x59\x88\xf8\x8a\xd3\x5d\x6d\x30\x9b\xf7\xc8\x13\xcf\x14\xaf\xf9\xe1\x5d\x05\xd6\x34\x40\x96\x25\x7a\xcb\x91\x76\xd2\xbb\x82\x3f\xca\xa4\x5d\x05\x8b\x51\x29\xb2\x9b\x04\x9e\x25\xda\x16\x4e\x2c\xa2\xa2\xbb\x0c\x9c\xd2\x60\x63\x87\x4a\xa6\x64\xe1\xdb\xab\x64\x22\x44\x73\x6c\xac\xd3\xa8\x40\x90\x66\xd5\xd4\x5c\x8d\xce\x59\x34\x6c\x55\x88\xec\x7f\x5b\xd8\x55\x65\x99\x5c\xab\x00\x63\x71\x41\x4d\xe9\x74\xf9\x2a\xcc\x5c\x60\x47\x64\xce\x2d\x5c\xf6\x95\x37\xad\x81\x60\xaa\xd7\x99\xbc\x56\x67\x16\xf0\x96\xc2\xda\xa2\xa5\x55\xec\x2a\x65\x8a\xa1\xb7\x46\x95\x54\xd5\xd7\xc1\x7f\x41\xe8\x0a\xdd\x1b\xf5\x77\x1c\x4a\xed\x28\xa5\xdd\x45\xde\x68\x7d\x81\xe8\x0a\x58\xb3\x1f\x4a\x31\xad\x63\xcc\xcf\x53\xb5\x1f\xe0\x4d\xd9\xc1\xb1\xa4\x2f\x70\xb0\x04\x17\x8d\xa9\xe2\xbe\xfe\x94\x23\x28\x24\x69\xe3\x7f\x3d\xd4\x1d\xd9\x27\x6a\xfd\x5f\x92\xaf\x62\xb7\x43\xfd\x03\x3c\x6b\x10\xc3\x26\xf8\x7a\x08\x1d\xe9\x4f\xfe\x2a\xb7\x8d\x43\x40\x16\x96\xba\x65\xf3\x86\xec\x1d\x94\x81\x1f\x94\xda\xc5\x2e\x27\x2f\x7e\x1a\x57\xd9\xd2\x89\x5e\xff\xeb\x6c\xd2\xb9\xd1\x68\xae\xb2\x29\x64\x69\xb3\xc6\xf1\x0e\xb6\x0f\xad\x8f\x0d\x66\x41\x4a\x1c\xe5\x49\x14\x2c\xdc\x10\xaa\xf5\x51\x55\xb9\xc0\xdb\x25\x4a\xbd\x67\xe7\x78\xed\xf6\xaa\x66\x0c\xbb\xfb\xe8\x2d\x99\x31\xb6\x89\x9e\x63\x12\x52\xf0\xde\x39\x4a\xf7\xea\x05\xb5\xd6\x9e\x6f\xca\xa1\x81\x27\x9e\x08\x2d\xa9\x0b\x7a\x3e\xb4\xb0\x6d\x5e\xad\x57\xe8\xac\x9c\x4a\x72\xe3\x7c\x70\xd5\x50\xe3\x10\xc4\x1c\xd0\xe0\x13\x5a\x1a\x7a\xcf\x15\xa1\xbf\x7c\x95\x01\xa5\x4a\xa0\x73\x6d\x08\x73\x34\xa9\x01\x9d\x88\x2a\x1d\x71\x10\x4e\xa6\xc8\x82\x92\x82\x43\xd8\x49\x53\xd8\x7d\x18\x24\x44\x01\x3e\xa3\xed\xc1\x16\xe8\x04\xf6\x07\xa7\x50\xa3\x22\xcb\x72\x2c\xeb\x94\x36\x38\x09\xb3\x61\x9b\xa3\x9b\xe6\x21\xb5\xc1\x87\x56\xb6\x16\x26\x29\x3a\xd9\xc6\x54\x54\x1f\x26\x57\xb5\x22\x2c\xbb\xba\x1c\x63\x84\xae\x97\xb6\xff\x1a\x8b\x76\x83\xe1\x3c\xb5\x33\x13\x3a\xbc\x87\x16\xc5\x92\xdf\x45\x70\x2f\xbf\xc3\xff\x24\xb7\x47\xae\xc8\xc5\x27\xa3\xe9\xc7\xa7\x1e\x6c\xa4\x0c\x6d\x92\x5f\xd9\x76\x95\x6f\x0f\x87\x09\xbe\xa3\x5d\x59\xff\xb0\x8b\xa1\x35\x6f\xc3\x3d\x41\x12\x1a\xf5\x6a\xb1\xac\xd0\x48\x48\xa6\xee\xe2\x72\x33\x49\xad\x8f\x5d\xbf\x95\xda\xdd\xd0\x23\x71\x47\xab\x37\x9e\x12\x9a\x9e\x64\x68\x97\x33\xf6\x1f\xa1\xde\x5c\xc3\xd3\xa9\xcf\x63\xf6\x2d\x3f\x55\x4e\xc1\x10\x59\xfb\x16\xce\xbd\x31\x58\xf6\xe0\x43\xf4\xe0\xa4\x4a\x97\xcb\xd5\xaa\x3a\xe7\x97\xae\x67\xf3\xe1\x8d\xc9\x7a\x12\x26\x57\x9b\xfa\xb4\x5b\x07\xda\xb9\xd6\xca\x9c\x0e\xe8\xf3\xf6\x3a\xdd\x2a\xff\x1b\x51\xc0\x11\xaf\xe7\x23\x92\xe4\xe0\xba\xa8\x2b\xe7\xf2\x7d\x67\x00\x8f\x3a\x91\x21\x46\x73\xed\x66\x8c\x63\x82\xf5\xbc\x74\x8a\x0f\xe8\x28\xf4\x90\x54\x0a\x3b\xca\xdb\x8d\x70\xc8\x6c\xa9\x70\x89\xa6\xe4\x92\xd2\xc7\x57\x62\x5c\xfb\xfb\x9c\xbc\xf6\x15\x23\xcc\xe0\x5b\xa7\x3f\x03\xc7\x69\x86\xbd\x71\x2f\xc7\x0b\x7d\x1b\x39\xa8\x04\x91\x59\x65\x49\xda\x2a\x32\x56\x89\xe7\x03\xb2\x58\xba\xa0\xf4\x42\x41\xb8\xc7\xc9\x73\xd9\x65\x65\xc1\x79\x0b\x43\x2c\x42\xc2\x4f\xb3\xc0\xa6\x93\x89\x22\x4d\x67\xbf\xbb\x84\xf3\x34\xcb\x3e\xd0\x6c\x19\xf0\xd3\x32\xba\x6f\x96\xe8\x5b\xa6\x2d\xf0\xec\x23\x92\x6b\xe8\xea\x88\x4e\x7c\x51\x9f\xca\x48\x58\x85\x4c\x31\x8a\xa4\x74\xad\x00\x80\x5c\x08\x61\xa7\x09\xad\x54\x3a\xb5\x79\x1e\xd1\xf0\xa8\x0e\xbe\x03\x86\xb2\xbe\xd0\xd0\x75\x7f\x50\x5d\x23\x74\xe8\x7d\xd6\xed\x3d\xae\x74\xf7\xa1\x39\xe1\x7c\x52\xb5\x53\xb5\x5b\x48\xbc\x6c\xd9\x25\x49\x5b\xba\xd0\xe5\xda\x60\x9a\x95\x48\xc2\x6a\x27\xd4\x12\x15\x45\xfa\x77\x86\x8f\x4b\x5b\xd8\x46\x2b\x77\x03\x85\x0d\xf6\x9b\xf4\xfc\x62\x81\x1a\x44\x8e\x2b\x9e\x3e\xaa\xef\x4c\x2a\x1c\x68\x47\x41\xdb\x8b\x11\x39\x3d\x43\x1d\xc0\x61\x77\xc9\x14\x94\xe8\x02\xd9\x02\x61\xad\xdd\x5d\xc0\xe6\xc8\x30\x78\x46\x39\xf8\xb4\x97\x1f\xf1\x28\x6c\xda\x01\x19\x38\xff\x3a\xe5\x83\x8d\xe6\x09\xa6\xc1\xbb\x6b\xe5\x8f\x02\x07\x5d\x13\x69\xf0\xf2\x28\x6c\x66\x95\x50\x98\x02\x10\x0e\xe6\xca\x17\x63\x06\xc8\x02\x2d\x84\x37\xd2\x1c\x37\xfd\x9a\xa4\xbf\x10\xed\x8b\x7b\x70\x45\xcc\x62\x9a\x30\x8f\x01\x4c\x01\x67\xf4\x0e\x65\x2d\xb4\xb2\xe3\xb3\x57\xf2\xea\x6d\xc6\xe7\x90\xad\x19\xbd\x00\xda\x8e\x49\xaa\x54\xe8\x9e\x9b\xe9\x25\x20\x2e\xe1\xf9\xd8\xad\xcf\x13\x90\x14\x49\xe8\xb1\xa2\xde\x92\x39\x73\xa3\xf5\xe4\x53\x53\x83\x47\xa7\xcd\xb8\x48\xcc\x75\x73\xe7\x64\x96\x4b\x03\x40\x83\xed\x93\x49\x79\xeb\xe3\x88\x95\xa2\x3a\xbb\xa1\x7e\xd6\x31\x60\xb3\x1d\xe0\xb9\x9f\x4f\x44\x46\x47\xbc\x25\x20\x7e\x22\xf0\x8a\xfb\x98\xf6\x11\x07\x8b\xd5\x87\xd8\x9a\xd6\x89\x13\x5a\x55\x10\x17\xed\xb9\x95\xa3\x2f\xb3\x26\x44\x68\xc2\xd0\xa6\x62\x34\x64\xec\x20\x92\xee\xcc\x2e\xe4\xb2\x6b\xec\xf5\xa7\xfd\x73\x2b\xef\x5f\x94\x05\x94\x0f\xe9\x71\xb4\x2a\x0f\xb8\x54\x88\xf6\x2f\x02\x31\xc1\x24\x35\x8b\x6f\xd7\xde\x46\x69\x31\x7a\x2b\xc7\x00\xfc\x57\x5b\xf4\x07\x5a\x7d\x31\xfe\x4a\x32\x28\xc4\x8b\x18\x7e\xab\x5f\x7c\x2b\x60\xca\xcb\x67\x33\x9f\x0e\x72\xa5\x1e\xe7\x41\xe0\x42\xe2\xee\xd0\x90\x58\x4d\x63\x5e\x84\x26\xf1\x0b\xec\xdb\x34\xd2\x1a\x7d\x4e\x16\x0e\xe6\xbd\x71\x02\xb6\xbe\x28\x63\x98\xc9\xe7\x22\x4e\x61\x8c\xc4\x27\x81\x53\x75\x35\x18\xc4\x95\x7a\xbb\x9f\xb8\xc7\x4c\x60\x63\x61\x65\xb9\x96\x96\x2a\xaa\xe9\x28\xb7\xcf\xc9\x5e\x8d\xf8\xd7\xbe\xb3\x82\x8c\x43\x37\xbe\x0e\x07\xdb\x26\xa0\xf3\xd2\xa2\x73\x57\x66\x6b\x2c\x80\x90\x89\xcd\x97\x83\xa9\x40\x27\x71\xb9\x37\xc7\xf4\x34\x7c\xb0\xe5\xbc\x86\xe0\xb9\x29\xbd\x3b\xc2\x12\xcf\xa1\x86\x5d\x09\x5a\x5d\xda\x24\x66\x87\x8f\x1d\xa0\xaa\x60\xe0\x32\xb7\xab\x33\xca\x0b\x59\xd1\x12\xf4\x92\x15\xcd\xb1\xe6\x8a\xa5\xdb\x79\xa9\xb0\x2e\x7a\x2c\x99\x75\x57\x76\x46\xfe\x48\x06\x74\x71\xfa\x61\x3a\xa8\x8a\x60\x11\x24\xc2\x0c\x17\x54\x52\x28\x2c\xb1\x2e\x64\x03\x05\xa0\x33\xeb\xd9\xf0\xb3\x62\x64\xa1\x16\xa6\xb9\x23\x51\xfc\xba\x89\x73\x6b\xf9\x0f\xc4\xe8\x48\xe9\xa5\xa5\x7c\x70\x60\x34\x94\x23\x77\x77\xf6\x3f\x65\xb3\x32\x39\x1b\x42\xfb\x92\x11\xc5\xbb\xbc\xcf\x24\x2e\xc2\x92\x6e\x76\xe1\xbc\x3f\x4d\xcb\x15\x0f\x42\xd1\xc8\xb8\x73\x82\x70\xa1\xd3\x4f\x9a\x41\xf3\xa8\x53\x73\x41\x15\x23\x71\xea\x90\x0e\x72\x61\x21\x88\x38\x95\x32\xbb\xbc\xd5\xe8\x7a\x7a\x9f\x8f\x76\x71\x78\x54\x76\x11\x99\x2b\x7d\x42\x28\x58\x94\x78\x6c\x9c\x23\x9d\xc7\x36\xa8\xab\x0b\x88\x41\x90\x05\x34\xd6\xac\xd6\x8d\x28\xf3\xaa\x50\x8e\x15\x1a\xc4\x88\x9e\xec\x7c\xd8\x29\x80\xab\x85\xad\xdd\xf6\xec\xa0\x32\x6e\xce\xa4\xfa\x99\xd7\x27\x78\xad\x8d\xf7\xd8\x3b\x3a\x02\x00\x24\xc9\x3b\x5f\x37\x94\x53\xd6\x5e\x21\x78\x2a\x1e\x60\x62\x71\x09\xd7\x72\xa5\xed\x5b\x03\x1a\xb5\x56\x27\xc3\xad\x26\xfc\xeb\x02\x8c\xde\xb3\x35\x08\x43\xe2\x1c\x78\x70\xf5\x62\x57\x30\x6d\x0a\xfb\x14\x1d\x39\x36\x65\x7e\x0c\x54\xcb\x71\xa5\x0e\xb6\x76\x31\x72\xbe\xc5\xfc\x9d\xb8\xa7\x7f\x23\x71\x4a\x5e\xb6\xe1\x0e\xd3\x87\x30\xa0\x4e\x6c\x59\xbc\xbc\xa8\x23\xe2\x46\x09\x83\x85\x5d\x89\x22\x0a\x4d\x04\x07\x9c\x6d\xc8\x1d\xb4\x9e\x4f\x99\x13\xea\x1e\xe9\x35\xe6\x48\xb6\x51\x1d\xba\x3d\xd8\xc3\x0c\xc9\x87\x57\x16\xed\x5b\xf3\x98\xba\xd3\x4c\xaa\x07\xb4\x07\x1f\x58\xdd\x42\x00\x45\x67\x89\xe2\xd6\x1e\x06\xc9\x8c\xe6\x9f\x1a\x50\x18\xf6\x79\xf7\x12\xc1\xcd\x1a\xdf\x04\xde\xfc\x31\xa8\x3c\xb7\x5f\x1f\x6c\x26\xa9\x20\x2e\xbc\x8f\xcf\x3d\x53\x6e\xde\x1d\xf4\x22\x3d\xc5\x06\x86\xd9\x59\x93\x5c\x1a\x9d\x10\x07\xa5\x51\x29\x0a\xea\x3a\x6d\x63\x30\xf7\xac\x2c\x18\x4a\x8a\xcc\x1e\x07\x1a\xd4\xfa\xf6\x21\x0c\x1a\x6f\x1c\xc9\x52\x3f\x39\x7b\x83\xa0\xad\x7d\x15\xde\xea\x2a\x16\xca\xc6\x99\x32\x16\xff\x29\x0c\x33\x6a\xfc\xd3\x9d\x15\xc7\x98\xce\x0b\xb0\xbd\xae\x60\x5a\x98\xb7\x3c\x79\xb8\x3a\x25\x6e\xd8\x0d\x1b\xd3\x6d\xca\x98\x2a\x2e\x4f\x93\xab\xcd\x04\x26\xc8\x01\xea\x7f\x19\x3a\x4c\xc9\xcf\x9b\x24\x4d\x6c\x16\xc8\x97\xfd\x67\xed\x94\xa8\xd1\x84\x90\x1a\x08\x3a\xdb\x0f\xbd\x4a\x85\x83\x82\x24\xe8\x22\x17\x75\x0e\x90\xcf\x0b\x8b\xbf\xed\xe4\xba\x96\x56\x52\x21\x3b\xfe\xdf\x04\xd6\x07\xe9\x43\x93\x86\xcd\xde\x72\x10\x07\xab\x26\x54\xd7\xb0\x9c\x02\x41\xcd\x49\x89\x63\xbf\xa8\xac\x05\xd8\xe4\xf0\x61\x2d\x51\x49\x58\x48\xe6\xac\x54\x63\x49\xcf\xc4\xea\xe4\x77\xf6\xf2\xad\x31\x58\x70\x8e\x0e\x53\x2c\xf9\x0a\x33\x38\x4e\xea\x11\xda\x60\x00\x10\x1b\xb6\x94\x99\x00\x4a\x8c\xbb\x60\x68\x51\xe0\xc4\xc2\xa6\x21\x0a\x4e\x32\xa5\x79\x2a\xd4\x76\xea\xa0\x7c\x69\x81\x9c\xa5\xa4\xeb\xe9\xce\x55\x29\x12\xce\x62\x70\x56\xfd\xd9\x4f\x87\x93\xe4\x29\x48\x2f\x39\xbd\x1b\xec\x28\xcb\xb7\x7b\x67\x70\x7c\x7c\x98\xd9\x11\xd4\x69\xf2\xa5\x73\x4c\x93\xf3\xec\x54\xbf\xf6\x17\x13\x9e\xe5\xc1\x58\x60\x2d\x93\x36\xc7\x1b\x38\xba\xf9\xd0\x44\x89\x70\x0f\x6f\xfc\xd9\xc6\x6c\x2f\x2b\xb7\xb2\x59\x62\x4c\xce\x34\x63\x6c\xcf\xf9\x1c\x05\x07\x39\x55\x2e\xe0\x55\x02\x18\x97\x4a\x1d\x87\x65\xd3\xd3\x35\xda\xa1\x74\x9b\xbd\x33\xf5\xa7\x54\x96\x8e\x26\x25\xcd\x62\x30\x2e\xcb\x67\x92\xa6\x7a\xc2\xaa\x2d\x4f\xae\xa8\x44\x05\x93\xfb\xed\xfd\x6a\x3e\x2f\x55\x63\x57\x57\xbf\xf9\xe3\x05\x4d\x58\xf7\x03\xd6\x09\x05\x02\x53\x1c\x04\xe4\xc8\x65\xbe\x18\x53\x03\xac\x45\x76\x9a\xa0\xc0\x7a\x26\x27\x36\x1e\xdd\x85\xd1\x74\x72\x14\xcb\x6a\x26\xd8\x67\x5f\x59\xf9\x73\xec\x51\x3a\x7f\xa1\xce\xee\x23\xcf\x54\x98\xc9\x1f\x2a\xa7\x8b\x9d\x2b\x67\x72\xf2\xda\x19\xb9\xd3\x3b\x45\xaa\x76\xdc\xe4\x1f\xce\xf2\xda\x94\xaf\x5a\xd8\x55\xcd\xa1\x05\x6a\x48\x57\x34\xbe\x52\x8b\x38\xce\x6c\x85\x54\x90\xdc\x02\xc0\x87\xf3\xfe\x01\xde\xca\x7e\x5b\x05\x43\x12\x90\x08\x02\x83\xce\x3a\xfe\x78\x11\x34\x74\x54\x3e\xb4\xeb\xc4\x29\xc9\x1e\xf6\x9b\x9e\xfd\x20\x2a\xe8\xdb\x7a\xbd\x5b\x1c\xed\x50\x1f\x4b\xd6\x90\x35\xa9\x30\x1b\x75\x19\x26\x42\xe1\xa1\x4f\x6c\xd8\x38\xd4\x36\x21\xf5\xd0\xfa\x95\x5d\x54\x26\x90\x2a\xdf\x6b\xb7\xf9\x17\xe3\x92\x6d\xaa\x07\xc6\x23\x71\x2a\xce\x3b\xb0\x0c\x75\x73\xac\xa4\xa9\x91\x3f\xc0\x70\x61\x21\xa7\xde\x8e\x10\x7a\xef\x77\x85\x30\xa3\x05\xbf\xac\x62\xa8\x19\x70\x6d\x3f\x65\x3a\x92\xef\xc0\x22\x5e\x08\xf6\xd0\xd5\x37\xc8\x48\x77\x68\x85\x0e\x3b\xa9\x48\xc3\xe0\x5c\xde\x81\xa4\xc4\x75\x97\x2b\xcd\x61\xe1\x24\x55\x9d\x0f\xc9\xb9\x04\xb7\x8e\x6a\xa4\xce\x6b\x3e\xbd\x74\xb7\x51\xec\x78\x0d\xde\x2b\x42\x42\xb7\x7e\x35\x0a\xeb\xe0\x57\xdf\x37\xba\x75\xb4\xeb\x91\x34\x4f\x09\x7f\x87\x92\x5a\x7a\x21\xa5\x55\xe7\xc3\x17\xd5\xb2\xad\x55\x6d\x0d\xeb\x50\x9a\xc0\xfc\xfb\xd9\x71\xfc\xc6\x84\xe8\xe2\xf8\xcd\x8f\x0a\xc6\xc2\x77\xa6\x05\xd0\x07\xf2\x9d\x4e\x4a\xce\x36\x7a\xb7\xb6\x91\x59\xae\x9d\xac\x96\x55\xdc\x16\xf3\x61\x15\x8e\xd3\xa3\xb6\x4a\xf0\x80\x98\x29\x4e\x84\x74\xd7\x6f\xf6\xf9\x2c\xff\xfc\xec\x28\x6c\x69\x73\x89\x0c\x8f\xc4\x69\x45\xd0\x30\xa7\xc3\x65\x79\x5d\xf5\x5e\xa9\xad\x8e\x8a\xb9\x02\xba\xc3\x21\x9a\xe6\x30\xd8\x9c\x54\x59\x07\x9e\x83\xc7\x26\x7c\x48\x9f\x59\x48\xd8\x79\x7b\x90\xfa\xe2\x74\x00\xed\x3e\x91\x33\x6b\x67\xea\xcd\xca\x52\x43\x37\xdb\x8b\x0a\x8e\xfa\x6e\x1b\x25\x4a\xc5\xdc\xe2\x34\x61\x92\x86\x23\xcd\x98\x3a\x8d\x33\x85\x92\xbe\x86\x3e\xf5\xc9\x2f\x6c\x69\x6d\x42\xff\x7f\x9d\x33\xe2\x47\x2c\x5c\x87\xce\x8a\x7c\x0a\xfd\x84\xb1\x17\xa8\xf7\x8f\x0c\x59\xbb\x0e\x03\xe3\x18\xa6\xc7\x73\xca\x3e\x89\x59\xce\xd2\x86\x43\x35\x53\x36\xd2\x4a\x4d\x93\x9d\x1d\x1b\x32\x1c\x9c\x60\x05\xed\x0a\xb9\x3b\xce\xaa\x0a\xe8\xee\xf9\xb1\x61\xb6\x1d\x7e\xa2\xa1\x11\x61\xeb\xcb\x19\xbc\x6f\xc2\x49\x28\x2a\x8b\x47\xcc\xb4\x82\x7b\xa8\x34\xf3\x38\x06\xa6\x85\x0e\x92\xda\x33\x34\x27\x39\xda\xcd\xd7\x3d\x40\x8d\x62\xcb\x14\xf7\x97\x88\xb7\xa3\x74\xe4\xe0\x38\x5b\x8e\x48\x42\x2f\x59\xbc\x14\x9a\xf7\x8b\xd6\x96\xec\x5f\xb3\xaa\x67\xda\xab\xcd\x81\xc3\x27\x27\xa7\xa3\x4e\x94\xc9\x9a\xca\x1c\x54\x55\xdb\xd0\x91\x21\xa9\xaf\x43\x00\xf5\x24\x5a\xaa\x5b\x43\xc2\xdc\xf8\x93\x17\x37\x64\x58\xac\x5f\x57\xf5\xe1\xd4\xf8\xe8\x82\xa8\x6f\x2f\xcd\xbf\x82\x0f\xf7\x96\x8b\x60\xc5\x10\x33\x4c\x6f\xd8\x25\x67\xb8\x89\x6d\x76\x85\xb6\x4e\x8d\x75\x2d\xd4\x3c\x39\x61\xfb\x9e\x3f\x76\x5e\xb4\x4f\x03\xd1\xb3\x96\x33\xed\xc7\x13\x3a\x85\x08\xa5\x81\x4a\x60\x02\xe3\x66\xaa\x1a\xce\x4f\x74\xf6\xdd\x62\x1a\x5b\xf8\x5a\x4f\xfd\x8d\xaf\x86\x72\xbc\x76\x4c\xe0\x95\x2a\x44\x69\x6b\x08\x13\xcc\xd8\xe2\x72\x04\x56\x2d\x7d\xd8\x18\x68\xd8\xb8\xa3\x7c\xce\xc4\xa1\x2a\x8a\x40\xdc\x5e\xda\x1e\x0c\x04\x39\x72\x7f\xd4\x75\x31\x1c\x31\x74\x97\xdd\xab\xb5\x3f\x71\xce\x7c\xbc\x56\x66\x24\x27\xf6\xc9\x7b\xf0\x51\x69\xdb\x03\xba\x17\x20\x40\x8e\xa3\xb8\x21\xa3\xf8\x09\xca\xfe\xb0\xe3\x37\xe2\x63\x85\x41\x60\x99\x82\xc7\x16\x6b\x92\x13\x58\x68\x7c\xd8\xd8\x5d\x7c\xc4\x89\x31\xc2\xec\xbf\xe6\xf7\xd1\x12\x9b\x38\x6a\xc6\xa8\x4d\x88\x2c\x17\xce\x0c\xc0\x61\x85\xe8\x2f\x96\x1c\x9f\x38\x44\x71\x95\x57\x46\x51\x60\x53\x76\x65\x83\xc9\x4c\x32\xd5\x64\x1c\x33\x78\x47\xf6\x48\x44\x65\x59\x9c\x5e\x40\xb3\xab\xae\x9c\x03\x92\xfc\x64\xab\x2b\xb2\x1f\x6b\xd8\x32\x8b\x13\x66\xf6\x32\x6a\xb2\xe6\x3d\x8e\xfa\x8f\x24\x1b\x9d\x24\x85\x72\x44\xd4\x46\x4a\x7f\x78\x37\xd2\x8a\x8a\x2b\x91\x35\x8d\xb6\x59\xf0\x97\xe0\xce\x85\xa8\x6c\xc8\xc8\x77\x12\xf5\x56\xfc\x94\xd1\xae\x59\xa1\xf0\x64\xbd\x3c\xfa\xdc\x7a\x1d\x4f\x01\x0c\xd7\x73\xb4\x8d\x72\xa9\x61\x54\x9f\xeb\xb7\x41\xa9\x3a\xb1\xeb\xbf\x0e\x0b\xa8\xbd\x48\x3c\x72\xfa\xca\x70\xa6\x92\xe4\x1b\xd1\xc7\x39\xa2\xe5\xcb\xde\x38\xbf\xf3\x7c\xb4\x8d\x15\xc8\xcd\xa1\x41\x0c\xf0\xc1\x0a\x6a\xd6\x81\x32\xab\x0d\xf9\xa3\x4a\x40\x63\x63\x92\x55\x6a\x99\xed\x49\x3e\x04\x24\xb8\xdf\x94\x5c\x5f\xd8\xee\x9c\xcb\x18\x0b\x29\x67\x99\x3d\xd8\x8d\x89\x32\xfc\x26\x68\xe2\x7a\xfc\x69\xb6\xf7\x74\x78\x43\xf2\xf7\x9b\x4a\xb3\x01\x9f\x06\xdd\x97\x54\xf6\x30\x5c\x11\x3d\x21\xac\xab\x6f\xcc\xaf\x56\x1d\x42\x9b\x51\xc2\xc7\x0c\x1a\xf9\xe0\xe6\xa1\x5f\x1a\x8d\xcc\x21\x53\x68\x02\x3d\x15\x94\x5e\x33\x41\x5a\x27\x3e\xd6\x81\x3a\x13\x1d\xa2\x85\x17\x8f\x30\x51\xd8\x71\x76\x62\xa0\x61\xa8\x96\xd5\xb1\x01\x11\x75\x62\xad\xc2\xbd\x87\x34\xea\x54\xd0\x2f\xa5\x8a\x03\x48\x01\xb9\x22\x73\x18\x6d\x55\xa4\x85\x4e\x9f\x2f\x8f\xb5\x33\x06\x9e\x38\xa9\x47\xa9\x1e\x34\x89\xe1\x76\xf4\xc1\xda\xde\x0f\x57\x01\x0d\x8c\xb5\x43\x6e\x06\x94\x4a\x12\x20\x3e\x8b\xd2\xc8\x64\xbe\xbd\x0a\x35\x6a\x94\x50\x14\x59\x2a\xb6\xbb\x7e\x0f\xe9\x88\xf6\x8e\x43\x6a\x4d\x05\x8f\xc8\xeb\x51\xb4\xc7\x35\x9c\x25\x0b\x30\x13\x50\xe3\x81\x73\xf8\x3f\x84\x44\x29\x7b\xf5\x82\x55\xf4\xda\xd5\x85\x5b\x0a\x08\xf1\xc5\x32\x52\x79\x3e\xd9\x46\xa7\xc7\x23\xb9\x87\x55\x55\x00\xce\x74\xde\x49\xbe\xfa\x10\xe3\xee\x1c\x78\x43\xb3\x6a\x1a\x0d\x85\x26\x34\xd4\xa1\x0d\x20\x7f\x07\x7e\xfb\x9f\xab\x5f\xd4\x3f\x67\x98\xf5\x2d\x67\x3d\xca\xf9\xb0\x00\x4a\xcf\x61\x60\x5b\x87\xdc\x0e\x6f\xdd\xe6\x50\x08\xad\xb4\x40\xad\xba\x8f\x3a\x25\x1b\x57\xed\xbb\x35\x70\x1c\xe5\xea\x2d\xfd\x2a\x01\x83\x9e\x6e\x13\x71\x04\x87\xc4\x87\x9f\x12\xd4\xf2\x87\x1a\xa3\xd6\x0c\xd5\xce\x43\x48\x4c\x03\x3a\xd0\x31\x7d\x5c\x8f\xd5\x0a\x4d\x3c\x46\x52\xaa\x8c\xb6\x79\xad\xf5\x31\xa4\x53\x3d\xa4\xc4\xb6\x86\xba\xff\xa1\xf3\x0d\x0d\x38\xf3\xe4\x77\x18\xe2\xb3\xb9\x73\x16\x05\xfd\xbf\x43\xee\x92\x87\x74\x92\x91\xf5\x88\x22\x13\xc9\x24\x49\x58\x07\xb2\x4f\x00\xbe\x1d\xe6\xd6\xa6\x6a\xce\x47\x7b\x59\xb8\x6d\xca\x97\x01\x67\xf8\xd6\x1f\x44\x6e\xc1\x9b\xfd\x60\xea\xc9\x2e\xfd\xc6\xe5\x12\xcb\x0b\x7c\x5b\xb6\x11\xdc\xde\x16\xc6\x7c\xc4\x32\xa4\xa7\x1a\x9e\x84\x58\xc6\x59\x14\xdb\xb2\xfc\xd3\x74\x6b\x1e\x46\x43\xa9\x30\x71\xbb\xd3\x51\x16\x4e\xd9\x10\x7f\x4c\x60\xf6\x88\x3f\x9c\xe9\x3c\x1f\xfd\xdb\x78\x8e\xea\x91\xe6\xa2\x0e\x0c\x1c\x6c\x23\x3e\xa0\x50\xca\x48\x50\xeb\x68\x9c\xb7\xc4\x9c\x43\x72\xbb\x6b\x10\x25\x20\x01\xe2\xa3\xdb\x0c\xfc\xc6\x5f\x96\x2f\x47\xc7\xd5\x14\xd8\x92\x5e\xc9\x06\x75\x2e\x84\x72\x60\xbe\xd3\x74\x9b\x6b\x10\xe7\x81\x74\xe1\x10\xba\xca\xbd\x99\x3d\x62\x5b\x1c\x93\xb6\x06\xce\xd3\x59\x6d\x1a\x36\x07\xbe\xa8\x88\x03\xe8\x86\x09\x75\x6a\xa5\xa2\x6d\x78\xfc\xa8\xf5\x0e\x54\x0b\xac\x7b\xce\xc0\x2d\x37\x79\x4b\x94\x5f\x65\x21\xbe\xfb\xf0\xec\x59\x65\x9d\x0c\x36\x57\xa9\xf3\xe1\xcc\xc5\xe3\x26\xbe\xa2\x9a\xa9\xaf\xf9\xf3\x49\x18\x28\xa4\xfc\x1d\xae\xa7\x33\x31\x50\x87\x09\xd0\x53\x55\x58\x6c\xe4\xcf\x5a\xcb\x27\x4b\x95\x7a\xdd\xf5\x0b\x7c\xfd\xb2\x5c\x07\x40\x67\x82\xab\x1c\x95\xb8\x60\x1a\x44\x0f\x74\x4b\xe9\x0f\xfc\x6a\x03\xa9\x99\xcd\x77\xaf\x3e\x75\x1b\x1d\xe1\x8b\x8b\xc5\x84\xd5\x6f\x89\xca\x2f\xdd\xe8\xfc\x56\x83\xa8\x42\x63\x2c\xfa\x79\x0f\xb1\x0b\x89\xc8\x6f\x40\xb7\xab\x65\x88\x8d\x68\x71\x12\xb1\xe6\xba\x92\x39\x4e\x08\xb5\x46\xcc\x6d\x79\x98\x01\x75\xdf\x76\xa1\xfc\x31\xd4\x2e\x2f\x12\x01\x2f\xa2\x5b\x9a\xf8\x55\xb3\xef\x27\x47\x28\x1f\xca\x39\x02\xee\x1a\x31\x8a\xfb\xf0\x41\x0c\x7a\x54\x69\xfe\x56\xae\x7f\x76\xc2\x5f\x1e\xfd\xea\xec\xd0\x16\xc7\xb0\x23\xda\x9c\x5c\x56\x5c\xcb\x26\xf6\x4b\x9a\x0e\x5b\x65\x20\xb9\xa8\xd3\xae\xcf\x65\x69\x70\xaf\x20\x3d\x6a\x76\xf3\xff\xb9\x7a\xb3\x05\xd5\x75\xdf\x69\xf4\x5d\xb8\xfe\x5e\xca\x49\x4c\xe2\xce\xe0\xfc\x32\xc0\x86\xa7\x3f\x2a\x55\xc9\xac\xff\xb9\xd8\x1b\x77\xaf\x9e\x80\xc4\x96\x4a\x35\xa8\x25\x99\x9a\xd7\xd6\xf4\xc3\xcd\xf0\xa8\x24\xd9\xe9\x27\x78\x1b\xdd\x25\x9b\xc7\xb3\xae\xc9\x9a\x27\x99\x0f\x3e\x7f\x69\xa9\x6e\x5e\xfa\x70\x46\x00\xeb\xf4\xe1\xa0\x13\xc8\x50\x23\x86\x27\x13\x80\x5d\x12\x1b\x24\xbe\xee\x03\xb5\xd7\x3d\x88\xcd\x62\x03\x08\x89\xdd\x04\xe8\xf7\x61\x4b\xea\x61\x66\x72\x95\x76\xca\x6b\x43\x68\x6e\x97\x67\xd1\xa1\xab\x03\xa3\x43\x69\x5a\x0b\x27\x2b\x56\xa3\x7e\x7c\x88\x82\x1b\x99\x71\xaf\xb3\x9c\xd1\x9c\x8b\x28\x1c\x15\x83\x06\xdf\x57\x21\xcd\xa2\xb4\xcc\xbf\x2a\xb9\x1a\xe5\xeb\xd8\xb2\x57\xd9\x9f\xb0\x09\x7b\xd7\xe5\xa9\xa1\x61\x95\xdc\xef\x55\x5b\xe6\xf5\x41\x4f\x0b\x7b\x1f\xfe\x0b\x05\xe5\x41\x5f\x15\x4f\xca\xe4\xc6\xb9\x97\x9f\xc4\x17\xac\x04\x72\x8f\xec\xfc\x1e\x3d\xec\xce\xd5\x2a\x2d\x6b\x38\xb9\x35\x97\x75\x1d\xad\x6a\xe5\x71\x0b\x09\x84\xcc\x13\x4b\xdf\x83\xab\xec\xa4\xce\x7c\x04\xd7\x60\x64\x91\x0f\xee\xf0\x75\x7b\xc3\x5e\x9b\x64\xac\x0e\xb0\x95\xf6\x8b\xd7\x5f\x24\x9c\xd8\x41\xc5\xb6\x4d\x58\x17\xea\x51\xa3\xeb\xb1\xbf\xa8\x57\x5c\x53\x5a\x6e\x47\x11\x30\x9c\x62\xd2\xba\x55\x5a\x8d\xa4\x92\xce\x76\xbc\xcd\x6f\xeb\xf0\x7f\x1f\xd9\xe5\x47\x84\x96\x15\x11\x72\x63\xc3\xe0\xfe\x13\xfb\xe9\xab\xa9\x2b\xe2\x68\x99\x12\xcf\x4d\xdb\x56\x9b\xed\x71\xf6\x8b\xce\x37\x56\xb5\x49\x8e\xc8\x78\xb5\xf8\xb4\x83\x36\xa4\xb2\x4f\xee\x66\x31\xf5\xc8\xc0\x99\x49\x5c\xda\x26\xfa\x82\xd0\x37\x00\x0a\xce\x5f\x22\x5b\xf8\xe0\x77\xe1\xd1\xe1\x6e\x2c\x24\x6d\xea\x2c\x84\xfd\x8a\xb6\x23\x8e\x97\xed\xef\x16\xcb\xf8\x62\xe9\x74\xb5\xfc\xee\xf3\x2d\xc7\xf6\xf3\x65\x1d\xdf\xf0\xcb\x59\xd2\x8c\x09\xfc\x74\xa5\x36\x34\xed\xe3\xd9\x6c\xcf\x4f\x72\x34\x74\xb6\xb4\x00\xb5\x33\x48\x76\x3e\xc1\x54\xf2\xda\x5a\x20\x06\xf0\x2b\xe3\xa3\x22\xca\xae\x15\x62\x56\x47\xab\xd3\xad\xc1\x73\xea\xc0\x7e\x2f\x99\x2a\x27\x70\x8c\xf8\xf3\x37\x5d\x44\x80\x88\xc3\x67\xbe\x0c\x43\x0a\xdc\x6e\x71\xac\xd5\xbe\x8f\xfb\xcf\xc5\x7a\x6f\xbe\xff\xd2\x9b\xc7\x27\xf4\xdc\x7c\xaf\xc1\xc3\xf7\x31\xaf\x9d\x38\x8b\xfa\xed\x09\x51\xe6\x82\xdc\x32\x1d\xb5\xa6\xbc\x47\x9e\xcf\xba\xc5\x62\x0d\xe2\x5a\x33\xb7\x60\xa2\xb9\x37\x68\xa3\x77\x24\xdc\x8a\x10\x87\x54\x42\x98\xca\xe4\x78\x7f\xdf\xfd\xe5\xf5\xad\x2a\xb0\x9b\xb4\xcc\xfc\xf1\x56\x6d\xa8\x51\x1b\x6e\x9e\x79\x3e\x7e\xd6\x41\x9a\xc2\x5a\x11\x4f\x44\xad\xf2\x94\x86\x5f\xa4\x2b\x8c\xf7\x5a\x2f\x40\x34\x99\x2a\x6e\x28\xa8\xe8\x81\x76\x04\x27\xb3\xab\xef\x58\x2c\x83\x34\x38\x3a\x52\x6d\x2f\x57\x2e\xa9\x2d\x8b\x7c\x18\xbe\x31\x59\xee\x9a\xe8\xd2\xd3\x07\xa2\xb2\xa3\x49\x15\xcd\x7c\xf8\xfc\x61\x93\xcb\x0b\x02\xfa\x0d\x9e\x25\x57\x64\x67\x5b\x3b\x55\x3b\xd6\x2e\x9e\x3f\xf0\x1b\x6a\x8e\xc1\x7a\x51\x6f\x87\xfd\xc8\x8f\xc7\x3d\xf7\x24\x33\x9f\xb5\xc5\x41\xae\x59\x58\x8a\x03\x81\x7e\xa5\xf6\xb5\xb9\xe8\x25\xc2\xdb\x87\x33\xaf\xdc\xb4\xac\x8d\x8d\x4e\x5e\x7f\x4b\x98\xa4\x54\x7e\x62\x94\xdf\xab\x58\x3f\xf0\x25\x7b\x38\x94\xe3\x9b\x56\xb4\x58\x8c\x6d\x88\x21\x53\xd8\xbd\xee\x59\x50\x33\x8d\x55\x1e\x9c\x3b\x11\x34\xc4\x36\xd7\x93\xc5\x6b\x4d\xdf\x6f\x32\xaa\x91\xc7\x40\x61\xd8\x1a\xd5\xcf\x8a\x19\x06\xbb\x17\xf7\x05\xa1\xc8\x3c\x2f\xa3\x46\x52\xd0\x67\xd3\xc7\x0f\x54\x2c\x81\x02\xab\xac\x79\x96\x0f\x4f\x29\x1c\xd7\x38\x61\xfd\xa6\xf8\x74\x61\x9c\x9c\x5f\x52\x16\x8d\xcd\xa4\xfa\x99\x22\x7d\xd3\x2e\x9b\x90\xf7\xcb\x76\x6d\xf6\xb3\x71\x06\x67\xf5\x9c\xf1\xe4\xff\x52\xe0\x7a\xb0\xc2\xfc\x39\x60\xfa\xdd\xf4\x16\x06\x33\x31\xe7\xd5\xbf\xaa\x08\x5f\x03\x69\x5e\xcd\x77\x91\x41\x32\xa6\x5c\x34\x91\x18\xb1\x3d\xd0\xf1\xd2\xba\xcc\xb8\x31\xc2\xc5\xed\x19\x3c\x9f\x67\x8a\x30\x5c\x94\x42\x1a\xcd\x87\x64\x26\x93\x60\x34\x88\x1a\xd8\xc6\x31\x40\x48\x02\x26\xc1\x9c\x97\x69\x11\x0c\x0c\xeb\xad\xf2\xde\xa6\xc6\x0c\xf3\x31\x4c\xb3\xa4\xaf\xfe\x7a\x91\x24\xb0\xd4\x0f\x19\x01\xa9\x00\xd6\xe3\xc8\xff\x5e\xfe\x89\xcf\x91\x19\x9d\x1d\x41\x8a\x2a\xe8\x23\x4f\xdf\x09\x00\x72\xe3\xc4\xed\x1c\xa3\x39\xc5\x6f\xd6\x61\x93\x6a\x5f\xdb\x1a\x16\xbd\xdf\x7e\x8b\xec\xec\xa7\xc8\xa4\xb7\xfa\x74\xaa\x92\xc8\xc9\x68\xe0\x1d\x29\x3a\x90\x9a\x57\x9e\x04\x52\x71\xa0\x96\x50\xe4\xe5\x75\xb4\xb1\x5e\x26\xd1\xfd\xb2\x56\x29\x45\x3e\xdf\xf9\x19\xe2\x44\x08\x57\x08\x87\xc2\x25\xad\x5a\xaf\xc2\xad\x1f\x1b\x03\xff\x15\x4b\xd1\xdc\x62\xfd\x60\xff\x2f\x01\x48\x96\x37\xb9\x7b\x53\xd2\xa6\xf5\xd4\x20\xe4\xa0\x17\xd2\x71\x2b\x66\xba\xec\x3b\x41\x02\x69\xd8\x6c\xe1\x35\xed\x01\x2e\x5d\x74\x53\xff\xbb\xa9\xff\x03\xe5\x88\x88\x15\x47\x25\x5b\x24\x90\x6d\x1b\x37\x1e\xe4\x73\xbd\x5b\x83\xcf\xb7\x16\x3a\x82\x81\x7b\x3e\x66\x43\xa1\x1a\xb8\x83\xb3\x76\x29\xac\xdd\xae\xbe\x4d\x63\x89\xf9\x90\x06\x44\xdb\xdd\x9c\x78\x31\xfe\xe5\x3d\x62\x11\xc8\x5a\xb5\x22\x42\x8f\xfc\x58\x41\x39\x1c\x28\xea\x66\x74\x30\x24\x1c\x32\xbf\x55\x59\x89\x73\x18\xc1\xae\x30\xbc\x7d\xb8\xe9\xb6\x2e\x6a\x6b\xd1\xd4\x9f\x8f\xcb\x1d\xb0\x14\x3d\x3b\x1d\x9f\x6a\x81\x53\xa3\xbd\x54\x7e\x47\x3f\x23\xa6\xef\x29\xe0\x30\x7f\xe8\xb7\x71\xb6\xee\x30\xa7\xc8\x5b\xb7\x7b\xac\x84\x2b\xfa\x02\xc9\xbe\x84\x61\x88\xff\x0a\x68\xf5\x12\xfa\xd5\xb7\x88\x7d\xbb\xb6\x9b\xe3\x66\xf8\x23\x20\x5d\xcb\xcb\x51\x14\x2a\x5b\x14\x2a\x57\x0e\x4b\x04\xe9\x0b\x61\x90\xe6\xbf\x5a\xe0\x27\xb3\xfa\xed\x56\xeb\x63\x2b\x7d\x37\xfb\x4d\x51\xa2\x70\x61\xc7\x5f\x6e\x4d\xd6\xcf\x9b\x53\xaa\x0a\xa2\x4e\x2e\x1a\x04\x81\x83\xf2\xc1\xa4\xcd\xe9\x8e\x3e\xf8\xba\x35\xf3\xbd\x1a\xd2\x7f\x95\x65\xd4\xc8\xe7\x8a\x67\x64\xd7\xb0\x48\x96\x84\x64\x4e\xca\x49\x44\xa1\xa1\x07\x5a\xb4\x3f\x07\x19\x24\x47\xe5\xa8\xbb\x93\x67\x1b\xae\x56\x0d\xbd\x77\x58\xc3\x3d\x5c\xa5\x2d\x7d\x13\xfb\xbe\x1a\xec\x2d\x09\xf9\xb6\x4f\x7c\x62\xb3\xd2\x1c\xb9\xf1\x58\xa6\x36\xf6\x05\xbe\x80\x07\xb7\x31\xa4\x5b\x31\xc8\x33\x7a\xd4\xef\x5d\x7f\xcc\x99\xd2\x34\x8b\x7d\x63\x70\x06\x25\x17\x15\x33\x2d\x74\xd6\x34\xff\x0c\x09\xff\x72\x5b\xb6\x69\xd2\x72\xcb\x1a\x53\x30\xb0\x95\xad\xcd\xa3\x01\xcd\x9e\x7f\x4d\x92\x5b\x69\x14\x49\x2e\x51\xe5\xb9\x80\x3b\x51\x86\xb0\x9e\x00\x1c\xe8\x03\x70\x0e\xff\x0a\x79\xfb\xc0\x48\x40\x1c\xef\xa5\x58\xd5\xa2\xf3\x01\xb4\x06\xc9\xe3\xc4\x27\x47\x39\xbd\x0b\xa7\xf8\xb9\x0a\xd8\xee\x46\x24\x0d\x05\x96\x9f\x1d\xc0\x5c\x45\xf3\xa1\xc1\xcf\x15\x57\x3d\x2e\x6e\x04\x8f\xfa\xd1\x50\xd5\x80\xda\x13\xfe\x1d\x0c\x32\x30\xb0\x3f\xfc\x94\x07\x39\x06\x11\x11\x37\x0c\x2f\xcf\xed\x2b\x9e\xd8\xa2\x01\xb1\x9d\x0a\xed\x75\xe9\x3d\x68\xde\x57\x53\x49\xba\x5d\x80\x5e\x2a\x2e\xce\x7a\xc5\xdd\x7a\x6a\xf6\x8a\x2c\xaa\x8e\x3a\x27\x85\xd8\x23\x5a\x4a\x07\x04\xb7\x7c\x64\xca\xa9\x67\x2c\x2d\x3f\xc6\xd3\xf2\x89\xd8\xca\xdc\xc3\x4a\x1c\xa5\xf7\x47\x38\xd2\x37\xfd\xa5\xfe\x21\x09\x42\x15\x42\x21\xd9\x64\xcb\x23\xb0\x97\x2d\x0a\x31\xcc\xdc\xbd\x15\x0c\xc8\xe9\x72\xb7\x66\x3a\x13\xdc\xc1\x41\x8e\xf9\x2f\xaa\x30\x1a\xe9\xd7\xff\x63\x58\x8c\x39\x21\x8b\x7f\xc4\x43\x7b\x6d\x56\xc6\xe8\x22\x43\xb4\xe0\xe7\xac\x08\xea\x6d\xbe\xb6\xd2\xbc\xb4\xb1\x47\x4f\xf0\x7e\x1e\x4d\x44\x9f\x44\xf0\x21\xef\x0f\x16\x37\x85\x1e\x26\x4e\x81\x80\x5f\x57\xe1\x94\x65\x6f\x11\x10\xdb\x27\xac\xa4\x1c\xfa\x70\x2a\xc6\x86\xee\x8d\xfc\x00\x2b\xb7\xaa\x14\x2f\x56\xee\x84\x73\x2f\xd5\x0d\xd4\xf5\x76\x61\xd1\x0d\x0c\x18\x90\xa2\xdf\x0b\x78\xc3\x97\x90\xca\x92\xec\xf1\x64\xb4\x24\x7c\xc8\xe5\xbe\x76\x11\x6a\xb0\xea\xea\x16\x51\x28\xf5\xfc\xd4\x2c\xd4\xc8\xdb\x0f\x62\x7c\x24\xf8\xcc\x29\xc8\x93\x78\x0f\x1f\x60\x48\xab\x0d\x81\x78\x9f\xa6\xe3\xb2\x0c\xb4\xb2\x4a\x06\x94\x42\x42\x56\xa2\x73\x56\x71\x17\x11\x59\x2f\xfb\xbd\x9c\x03\xcb\x93\x02\x6c\x14\x41\xeb\xc3\x1d\xde\x7d\x43\xa5\x66\xaa\x8c\x05\xbe\x00\x9b\x7b\x5c\xe5\x68\xab\x06\x14\x7f\xf4\x1e\x3b\x8a\xbc\x7f\x8f\xdd\x25\x26\xb6\xb0\xa3\x9e\x95\x93\x2c\xcd\x40\xd1\xde\x74\xfc\xf7\x22\x40\xb8\xdb\x5e\xc0\xc7\x41\xe8\xf5\x45\xa3\x0c\x1c\x63\x50\xa1\x3a\xbb\x62\xf8\xb9\x1f\x63\xa1\x0b\x6b\xfc\xce\x67\x1d\x74\x7a\x05\x46\xe2\x67\x4e\xd2\x88\xef\x37\xfe\x4a\x11\xb3\xf0\xbd\x55\x0d\xbe\x9b\xfe\xc3\xb9\x4d\x67\x9c\x0f\x11\xc4\x17\x21\x4b\xf6\xc3\x5d\x15\xe6\xf7\xc2\xbd\xee\xba\xdc\x05\x8b\xe2\x58\x20\xc0\x5c\xe2\x82\x5d\x1a\x8b\xdc\xf1\x0f\x6f\x3a\xec\xee\x20\xea\x71\x51\x87\x73\xaa\x15\x38\x42\x95\x0f\x76\x34\x09\xd0\xa2\x52\x85\xcc\xbc\x92\x62\x88\x58\x60\x4d\x80\x7d\xeb\x70\x23\xe9\x5e\x83\x60\x4d\x54\x56\x98\xf6\x08\x64\xde\xe2\xc2\x4d\xbe\x0d\xb2\xf3\xff\x2d\x7c\x23\xcf\x9c\x54\xec\x52\x2f\x07\x03\x63\xc6\x64\xc7\xc7\xbc\x39\x6d\xe1\x2d\xd4\x86\x9a\x2e\x5d\xce\x82\x8d\xdf\x01\x24\xcb\x16\xa4\x53\x13\x1c\x68\xcf\xf8\xdb\x2b\xc7\x5b\x36\x30\x76\x35\x3f\x5c\xcf\xcc\xc9\x19\xd8\x97\xa4\xb1\xe1\x30\x6f\x38\xf1\x27\xfc\xbf\x97\xaa\x8b\x34\x54\x95\xde\x47\x0f\xcd\x81\xa8\xbf\xb5\x15\xd7\xa8\x4b\xec\x8e\x6e\x04\x7a\xf8\x3c\x96\x2b\xb6\xd7\xd2\xa6\x63\xea\xe9\xbb\x5b\x9b\x69\xb6\xfe\x35\x29\x64\xe4\xc6\x50\x89\x99\x75\x50\x5c\xaa\x62\x21\x1e\x8d\x47\x22\x6f\xb6\xb5\x7d\x71\x45\xbb\xe9\x6a\x96\x86\x63\xa0\x04\x14\x8d\x2f\xef\xc0\xe4\x5d\xf3\xe5\x1a\xc1\x77\xa8\xca\xde\xda\x14\xad\x8d\x71\x3a\x87\x73\xa7\x84\xca\xb9\x43\x8c\x9e\xc9\x25\x12\xf3\xf5\x8f\x70\xfe\x74\xb3\x76\x5f\xa4\xf0\xac\x80\x8b\x99\xae\xbe\x7a\xcf\xcc\x60\x03\x3f\x91\x7d\xaf\x06\x64\xf0\x12\x12\x47\x3c\x38\xdd\x27\x70\x44\x0e\x54\xf0\xea\x49\x4f\xe2\xc8\x1c\xdb\xaf\x23\x7b\x81\xbb\x6b\x98\x82\x9c\x37\x46\xb5\xfd\x93\x9a\x6c\xc5\x88\x04\x0c\xd0\x8c\x75\xec\xa8\xed\xfb\xbf\xff\x0a\x78\x4f\x2d\x25\xb9\xb7\x8a\x92\x3a\x68\x90\xa9\x08\xe8\xac\xa0\x08\x56\x7d\x72\x88\x09\x5b\xbf\x51\xeb\x03\xbd\x67\x11\xfb\xd4\xae\x48\x32\x07\x96\xe6\x6c\x0b\x63\x6e\x31\xf8\xdc\xfe\xd9\xaf\xe2\xc0\x2b\xe7\x72\xf0\x52\xf3\x4c\x25\xd2\x17\xd4\xc1\xfc\xd1\xaf\xc9\xce\x43\x31\x20\x6d\x67\x55\x88\x43\x73\x0a\x4c\xa2\xf8\xda\x5f\x1f\x23\xe2\x3d\x90\xe8\xdc\x54\x8a\x87\x22\xce\x80\xef\x04\xbc\x93\x35\x25\xe1\x56\xf4\x94\xf6\xea\x59\x82\x81\xfb\x94\x92\xfd\x9f\xe1\x31\xae\x78\x3d\x13\x4c\x4a\x24\x62\xcb\xd2\x81\x0e\x08\x36\xe3\x5d\x40\xc8\x62\x28\xe7\x7a\x47\x30\xb2\x4f\x53\x7d\x09\x3b\x02\x96\x22\x83\xb5\xe5\x61\x5d\xb6\x3d\x5b\x0f\x4b\x72\xcf\xa2\x43\xa3\xe7\xec\xaf\x87\x2a\x5a\x2d\xaa\x24\xe8\x7d\xe4\x8a\xf5\xe9\x7d\xc9\xfe\x23\x29\xe7\xc2\xfd\x27\x49\x9e\x58\x6e\xc6\x9f\x3a\xa0\xad\xa0\x98\xe6\x27\xc0\xb0\x6e\xec\x18\x4a\xea\xba\x69\x1b\xb1\x4a\x07\xb9\x3c\xed\x14\x4f\x1a\x4d\xbe\x43\xc0\x85\x4b\x54\x43\x44\x0c\x55\x04\x13\xb9\xcc\xa5\x0b\x31\xec\x41\xec\xd2\x4e\x6b\x3b\xe2\x1d\x9f\xa1\xa7\x8d\x6d\x08\x7a\x0b\xae\x8f\xd7\x4c\xd7\x3b\xb2\x7b\x55\x98\xd3\x26\xc4\x17\x9b\x72\xe8\x81\x6a\x86\xc8\xc6\x37\xa1\x8e\xcd\x24\x7c\x41\x55\x4a\x9d\xe9\x4c\xba\x6f\xf6\xbd\xcd\xd5\x4f\xf7\x81\x9d\xa3\x3d\x9d\x78\x1d\xb0\x53\xc5\x77\xd9\x21\xf6\xc7\xb7\x60\xf7\xf7\x6c\xb7\xd7\xb6\xd1\xe5\x6d\xcf\xd3\xb8\x66\x0a\xbf\x28\x4f\xe1\x63\x19\x0e\xa2\x79\x8e\xb0\x1b\xb5\x49\xf5\x3f\x4c\x1c\xfd\x38\x84\x23\x04\xef\xc7\x7a\x34\xf6\x32\xef\xbe\x83\x36\xb1\xf0\x92\x3c\x64\x81\xdd\x9c\x6a\xfa\x59\xaf\x3d\x49\x69\x4a\x2e\x95\xc8\x06\x3d\x8e\x46\x92\x42\x8b\x97\x9b\x9b\xfd\x22\xe2\x28\xec\x2e\x54\xe7\x37\xd3\x48\x34\x87\xac\x65\x3a\x3f\x03\x1c\x4e\x85\x18\x27\x1c\xe1\xc9\xc8\xc0\x79\xd2\xa5\xfd\xc2\x6d\x8b\x9b\xed\x6b\x45\x50\x61\xe0\x27\x82\x96\xea\x29\xf1\xc6\x84\xd1\xac\x22\xba\x30\xa4\x54\xc7\x6b\xc7\x8a\x4e\x95\xa2\x3d\x0d\x18\x98\x9f\x1d\x20\xb7\xd0\x33\xe1\x54\x4d\x83\x3e\x9d\xa5\x3c\xad\x51\xd1\xb8\xfa\xc7\x0e\x1b\x06\x2a\x03\xce\x9b\x6a\x41\x2b\xeb\x27\x7f\xb5\x78\x99\x2b\x09\xb1\x77\x80\xdb\xf9\x16\x56\x57\x46\x27\x0a\xd5\x41\x34\xc1\x77\xe8\x7b\xee\x16\x44\x11\xd6\x7e\x38\x72\xc8\x47\xd2\x6b\xd9\x05\x4f\xba\x93\x9d\x14\x8c\x72\x26\x1f\xf3\xd4\x31\xfd\x42\xc6\xfe\x99\xa5\x47\x67\x9d\x0e\x1d\xed\xee\xd3\xa0\x09\x7f\x1a\xe6\x00\x63\xbe\xde\x8c\x12\x63\xa5\xb2\xb8\x1e\xff\x68\x8d\x83\xf4\xec\xdd\x31\x1d\x75\xfc\xc9\xc4\x0b\xe1\x74\x54\xef\xb8\x91\x2a\x98\x34\x0c\xca\x9a\x06\xdc\xd9\xe9\xc5\xbe\x4e\xef\x08\x2b\x79\x87\x98\xf9\xaa\x7e\x3f\xf8\xaa\xe3\xf7\xe6\x18\x28\xdb\x2f\x79\xe5\x16\xed\x90\x9c\xc7\x79\xc6\xdf\x70\x4a\xc5\x9a\xc3\x93\x98\xe9\x7b\x4a\xd2\x3a\xa1\x1e\xa4\xd1\xdd\xfd\x9b\xc4\x40\xe9\xb3\x45\x99\x60\xbd\x1c\xe1\x13\x18\xf9\x48\x10\xb1\x43\xc4\x2d\xdc\x96\xce\xb2\x41\x24\xe9\x04\xd4\xec\x59\x25\xd7\xb5\x91\x90\x5c\xff\xa1\x8d\x57\x57\x2b\xf0\x6e\x3a\x7f\xba\x94\x07\xdb\x01\x2e\x64\x45\x81\xb0\xdb\x68\x04\xe0\xf5\x33\x8a\x40\x62\xbd\x19\x8f\x0a\x59\x1e\x46\x00\xe3\x22\xce\x32\x82\x49\xdd\xd5\xd2\xaa\x75\x15\xf6\x5e\x56\xfe\x55\xb9\xfc\x3a\xbf\xce\x27\x9c\x3e\x42\x60\x85\xdf\x6a\x23\x08\x20\x64\x84\x10\x16\x5a\xb8\x4d\xc8\x05\x5e\xa4\x0e\xc8\x0c\x59\xb1\xe7\xc5\x79\x7e\x1d\x48\xe9\xa4\x41\x82\xb7\xcc\xb9\xe8\x26\x1a\x22\x26\x80\x7e\x99\x48\x3e\xe2\xdd\x87\x13\x8a\x6e\x7c\x8d\x93\x88\xbb\x41\xb3\x88\xe6\x77\x6a\xdb\x19\x26\x48\x3d\xcb\x2b\x54\xbf\x2a\xde\x46\xee\xea\x79\x40\xf5\xaa\x31\x56\xba\x56\x49\x14\xdc\x6b\x12\xa6\x43\x4c\xbd\xc0\xd4\x75\x69\x7c\x94\xdf\x11\x66\x2d\x08\xa4\xc1\x5a\x47\x7f\x92\x5b\xa7\x35\xe4\x3f\x96\xc4\x76\x6b\xeb\xa2\xeb\x01\x18\x8a\x50\xb5\x4b\x68\xde\xd7\xf1\x8c\x49\x08\xd4\x5b\x7e\xd3\x16\xbb\xbd\xbd\x4f\x27\x03\x93\xae\xb2\xec\x2f\x50\xa3\x8b\x5d\x0c\x30\xab\x53\x71\x58\x9b\x40\x23\x74\x9c\x6c\x4d\x22\x2f\xbf\x13\x8f\xa9\xcb\x2f\x9d\x84\xd7\xa4\x19\x4b\x96\x69\x83\xd5\x90\x2c\x25\xcf\x5f\xa0\xe5\x42\xa2\x7e\xf8\x60\xe8\x18\x85\xa3\x25\x6d\xb1\x86\x39\x60\xb7\x4f\x4b\xbc\xb1\xc3\xd2\x73\x5e\xc9\xca\x9a\x6e\xd1\xb2\x4a\x98\x37\x67\x45\x4f\xbc\xaa\x10\x8f\x57\xf8\xd2\x7a\x6a\x56\x11\xe8\x15\x5c\xb6\xf3\xa6\x95\xef\x99\x2f\xb5\x36\xbd\xc8\x2b\xe8\xc6\x27\x3e\x1e\xf9\x47\x48\x14\xf6\xb5\xd2\xac\xf0\x50\x92\x5c\x1b\x20\x31\x77\xdc\xc7\x26\xe9\x37\xa4\xdb\xeb\x6e\xc7\x35\x71\x5a\x9f\x7e\x3c\x5c\x79\x9c\x74\x5f\x05\x5e\x80\x9b\xe8\x33\x70\x6a\x31\x82\xfa\x49\xf2\x5f\x95\x55\x6e\x0d\xca\xfb\xd2\x4c\x29\x86\xbb\x7f\xc8\xe7\x85\xf9\xa8\x89\x74\xc1\x35\x3a\xef\x3e\x1c\xa1\x0f\x36\x24\x73\x55\x84\x89\x2c\x20\xff\xd2\x2f\xaf\x6b\x8c\xc9\x04\xfd\xcc\xa6\x50\xbe\x4f\x39\x45\x7e\x37\xf5\xc7\x23\x1b\x42\x90\xb6\x94\xa2\x6a\x77\x1a\x5b\x96\xf1\x97\x39\x39\xfe\xc0\xa9\x71\x89\x59\xf7\x13\xfb\xcc\x49\x46\xb6\x75\xfe\xe2\xc7\xc2\xcf\x8d\x96\xe0\xf0\xc0\xf1\xbb\x67\x39\xb5\xe5\xe6\x85\x42\xc0\x1c\xa5\x51\x16\x7d\x65\x38\xea\x2d\x04\x2b\xec\xdb\xca\x57\x86\x06\xf6\x4f\x1a\x0f\x12\x79\x67\xe0\x0c\xdb\x7d\xb4\x44\xc1\x45\x54\x51\x78\x87\x39\x54\x7d\x2b\x1d\x03\x6c\x6e\xfe\x9d\xe4\x75\xa7\x70\x3e\x19\x58\xf5\x38\x38\xd5\x71\xff\xee\x8e\x08\xf7\xc7\x5e\xab\xf2\x10\x52\xc1\x9e\xdc\x9b\xba\x28\x22\xa9\xab\xcd\xc8\x66\xfb\x51\x14\x73\x1a\x24\x87\xbd\x75\x5b\xd0\x69\xd8\x9b\xab\xef\xed\x6f\x24\xa8\x89\xba\x3b\x0e\xdb\x80\xe1\x55\xce\x3b\xa5\xf0\x78\xec\x35\x35\xfb\xe4\xdd\x4b\xfa\x8f\xcb\x1f\xde\x6d\x03\x84\xa7\xfa\xcf\xdd\x18\x80\xa8\x8a\x4b\xec\x28\x0f\x72\x20\xfc\xfe\xf4\x44\x86\x07\x01\x30\x21\x60\xe9\x08\x73\xb2\xab\x04\x52\x75\xe9\x8e\xd8\xc1\xe7\x0e\xc1\xb4\x7d\x10\x3b\x15\x52\x66\x97\x36\xa8\xe4\xf7\x54\x2f\xd4\xad\x23\x73\x15\x97\x00\xaf\xf2\x7c\x8a\x10\x71\x0f\x81\x0e\x14\x9a\xf0\x82\x21\xe1\x0b\xbc\x5a\x78\x11\x30\xea\x80\x22\xfe\xf6\x89\xe1\x7e\xbb\xb8\x6c\x5f\x1a\x51\x92\xd6\xe9\x76\x83\x89\xd8\xc6\xf8\xc0\xb5\x89\x5b\xad\xd6\xfa\x91\xd0\x72\x52\x61\xb8\x35\xe1\x0b\x62\x90\x78\xa3\x7d\xab\x8f\x36\x31\x13\x09\xef\xef\x2a\x27\x12\xb0\x25\xd8\x73\xb9\xa8\xcd\x21\x2b\xf0\xdf\xfd\x9e\xb2\x6b\x98\x37\x19\x52\x77\x83\x44\x51\xb7\x23\x91\xf3\x23\x98\xf1\x2f\xc2\xfa\xfe\xea\xef\xe4\xf3\x3b\x90\x6c\xdd\x63\x8c\xd1\xbb\xdf\x86\x25\xe8\xde\xd6\x83\x69\xde\x2e\xa7\xce\x49\x54\x77\x18\x04\x47\x49\x04\x5f\xe0\x16\x73\xdc\x35\xbb\xf1\xbb\x44\x6d\xa2\xb9\x4a\x79\xd0\x81\x56\xb7\x2a\xee\x50\xbf\x70\x9f\x07\x0f\xcf\x67\x8d\x2d\xd2\xca\xcb\xfe\xe6\xbc\xd1\xeb\x71\x67\x59\xca\x91\x84\x61\xe1\x6c\x16\xb3\x60\x96\x01\xe9\x48\x0f\x5a\x08\x1c\xe4\x1a\x65\xd8\x92\xd1\x75\x82\xaa\xf2\x87\x33\x39\x48\xb9\x3c\x40\x17\x21\x8c\xcf\x90\xd4\x60\x11\x85\xf3\x5d\xdf\xa6\xf9\x04\xd0\xb4\xb4\x3f\x65\x8b\xbb\xae\x59\x16\xa7\x6f\xcb\x54\x14\x43\x00\xe7\x18\x07\x8a\x2e\x4f\xea\x60\x5d\xfe\x10\xec\x76\xb2\x4c\x42\x30\xf6\xe6\x77\x4c\x97\x36\x99\x16\xc9\x7e\x03\x4d\x2a\x91\x34\x76\xa3\xf0\x49\xd6\x63\x14\x78\x08\x83\x38\x1c\x38\xff\x64\xf6\x62\x6f\x8c\xf6\x38\x7f\x43\xc1\x19\x2d\x9d\x67\x80\x39\x69\xb8\x2e\x73\x98\x5b\x43\xae\xa0\x3d\xc7\x7e\xd5\xa2\x44\x7d\xf2\x97\xce\x4f\x88\x94\xdf\x0d\xed\x3e\xaf\xdb\x76\xf0\x97\xf2\xf1\xec\x36\x9d\x49\x4f\x29\x41\x10\x18\x23\x2a\x68\x14\xb4\x6b\x77\x5c\x0b\x7a\xb5\x9a\x52\xb3\xfc\x66\x9b\x2c\x77\xc1\x12\x36\x74\x6b\x98\x77\xd8\xed\x06\xec\x5b\xe3\x97\xfd\x3e\xca\xd3\x07\x6d\x7b\xb3\x81\xb1\xed\xbd\x51\x91\x77\x7b\xc6\x4a\x7e\xdb\x53\x4b\x96\xa4\x3f\x51\x3d\x23\x3f\x3a\xc4\xb4\xdb\x67\x4c\xdc\x13\xb7\xfc\xee\x65\x40\x64\x77\x2a\x33\x63\x63\x20\x93\xe1\x36\xc8\x46\xce\xeb\x0f\xf1\x93\xc5\x82\x5a\xfb\xf5\x27\xfa\x48\xc1\xd7\xe3\x63\x58\xfc\x8e\xe2\x74\x2f\xb9\x45\x7d\xda\x55\xc7\x56\xed\xe0\x86\xe4\x86\x0a\xfc\xa7\x5a\x95\x43\xf1\x97\xd9\x51\xd9\xbd\x08\x16\x0e\x4b\x51\xa2\x7f\x2e\x45\xe5\x4d\x78\x36\x8f\xe0\x30\x1d\x95\x97\x3d\x44\xef\x07\x41\x85\xf1\x10\xd4\x89\x05\x6f\xff\x71\x49\x43\x54\x50\xf6\x1e\xd5\x67\x5a\x78\xe3\xb5\xb1\x8a\xbd\xd5\x9d\x5f\x65\x79\xf8\xd7\x91\x43\x02\x61\x7c\xea\x66\x39\xf8\x4e\xac\x05\x4f\xc9\xec\xad\x76\xe9\x25\x16\xb1\x3b\x53\x54\xd2\x2b\x2b\x30\xc9\x2e\x52\x87\x11\xfa\xda\xe4\xbe\xfd\x72\x33\x1f\x3b\x9d\xfa\xc6\xb4\xdf\xe1\xfc\xb5\x09\x05\xea\x13\x0c\x57\x65\xf6\x71\xea\x28\x3b\x82\x19\xdb\xd5\xe3\x4f\xca\xa6\xf0\x50\xdc\xf8\xe4\xe4\x74\xca\xfb\xa6\xe7\x2f\xfa\x26\x77\x4a\xd9\x65\xd3\x16\x3e\xa7\x91\x1c\x5d\x42\x71\xee\x37\x06\x1b\xb1\x49\x26\x78\x57\x8e\x3c\x10\x78\x6f\xe8\x50\xf9\x88\x1c\xe7\x59\x07\x7c\xe4\xc9\xe4\xb2\x6b\x9e\x55\x35\x6e\x89\x2b\x0f\x0d\x4f\x94\x31\xa3\xed\xdc\xee\x82\xf1\xf0\x21\x7d\x9c\x59\x82\x57\xc1\x96\xa6\xcb\x50\x84\xc7\xc2\x03\x24\xd2\xf9\xa8\x70\x55\xcb\x7c\xd0\xec\xd6\x9a\x03\xe5\x31\xef\x20\xac\x8a\x89\x7a\x2f\xa5\x72\xc5\x40\xb2\x3d\x32\xb5\x41\x4a\x55\xfb\xef\x36\xac\xb8\x48\xc8\x08\x4c\xda\x9a\x80\x90\x13\xa9\xaa\x34\xcb\x80\x56\x3b\x87\x5b\x55\xec\x32\xec\xd6\x38\xf5\xbc\xb7\x60\x6b\xff\x94\x20\xd0\x4a\xf1\xb4\xeb\xef\xae\xd3\x08\x14\x58\x96\x68\xfb\x87\x8e\xb6\x97\x4c\x20\x31\x91\xba\xc8\x05\x38\xe0\x42\xa5\x62\x72\xd5\x6c\xf3\xd6\xa6\x61\xb7\x10\x3b\x3a\x85\x1b\xce\x59\xd8\x2d\xd2\x1c\x48\x05\xb4\x67\xea\x0e\x38\x53\xd6\x50\x7a\x8a\x50\x84\x29\x8d\x3c\xbb\x06\x3d\x89\x91\xee\x6d\xc8\x3a\x72\xa7\x86\x48\x71\x3e\x5b\x64\xde\xa9\xc1\xa6\xef\x6c\x3c\xcc\x52\x0b\x2b\x7e\x3a\xd0\xf4\x2c\x9c\x27\x3d\x19\xdf\xcb\xdb\x09\xf3\xd4\x80\xd8\x6d\xa3\xdc\x28\x57\xc1\xd6\x27\x02\xc0\x7a\x44\xad\xb9\x84\x87\x05\x68\x11\x9c\x09\x15\x69\x59\x40\xce\xa4\x5c\x20\x0b\x8f\x94\x7d\xf7\xd1\xca\xa9\xbe\x2a\xf5\xbf\xce\x41\x92\x25\x6b\x76\x89\xb4\x0f\x4f\x63\xe2\xf9\x37\x25\x19\x56\x61\xa5\x00\x18\xd1\xd5\x7c\x75\xec\x25\xac\x33\xfc\xd6\x0b\x6b\x40\x0a\xd9\x7f\xce\x19\xf8\x88\x8a\xc2\x23\x3a\xa9\xae\x46\x4c\x4e\x07\x97\x78\x2a\x0a\x69\x16\x82\x0c\x45\x39\xd7\x76\xb0\xe4\xe5\x02\x3f\xf7\xe3\xbe\x59\x10\xbf\x07\x60\xbf\xaa\xd4\x02\x74\x8f\x69\x91\x96\x4c\xa5\x7c\xc7\xfd\x8e\x72\x52\x70\x12\x18\x07\xb4\x95\x78\x15\x1e\x61\x6e\x4b\xed\x37\xca\xbd\xcd\x1b\xed\xfb\x2a\xd1\xaf\x2b\xa9\xde\xba\x30\x2b\x73\xc6\x8c\x1d\x67\xbd\xb4\xad\x8b\xfc\x73\x4f\xf7\x9d\x52\x30\xc0\xba\x87\x91\xc7\xfd\x69\x64\x5b\x44\xaa\x86\x37\xcc\x27\xa8\x09\xdf\xa8\x2a\xd1\x65\xa6\x17\x29\x09\x22\xb8\xe5\x2d\x34\xf8\x2e\x11\x79\x38\x95\x2d\x30\xa1\x43\x41\xbe\xbb\x84\x32\x7b\xdb\xb7\xf7\x2a\xa4\x65\x21\xdc\xbf\xff\x3c\x01\x77\x2b\x0e\xfd\x4b\xe0\x5d\xcf\x13\x07\x76\xe6\x1f\x3f\x68\x9c\xdd\xa0\x62\x10\x0e\x20\x74\x56\x2e\x79\x95\xfa\xca\x8e\x3d\x22\x85\x6b\xa3\x52\xc0\x51\x3b\x29\x55\xa5\xcf\xd4\x60\x64\x99\x63\xe3\xd8\x3b\xb5\xfd\xc1\x91\x21\x4b\xc1\x93\xae\xf3\x16\x2d\x7c\x8d\x3b\x1b\xc0\x26\xe7\x5d\x1e\x31\x44\x5f\x1f\x1f\xd2\x02\x6e\xd2\x18\x21\xbf\x23\x2b\x65\x69\xa2\x34\xb7\x98\xf4\x53\x12\x61\xec\x0f\x2a\x2e\x82\x03\xb7\x0b\x4b\x99\x33\x09\x45\x33\x55\xa0\xb3\x93\x5f\xd8\x55\xe6\xa7\x35\x7a\x3e\xf2\x9a\x3e\x67\x84\x9d\xdd\x67\x06\x50\xcc\xbb\xdf\x6a\x82\x00\x71\x06\x99\x54\xa0\x74\xd5\x00\x2d\x98\x77\xae\x0b\x92\x31\xfb\x92\xbe\x01\x84\xf2\x67\x3c\x8f\xea\x93\xde\xe7\x72\xc7\x5c\xef\x19\xac\xaf\xa7\x70\x9b\xc0\x8a\x20\xf9\xa5\x47\xa2\x95\xce\x32\xc9\x23\xc7\x7e\x80\xea\x86\x75\xa6\xbb\xa5\x52\xe0\x7b\xe6\x9f\x00\x78\xd4\xbd\x2d\x46\x4f\x2f\x8b\x66\xec\x9f\xf6\xb2\x8a\x9f\x6c\x87\xf7\x2d\x4f\x3a\x3b\x2b\x23\x0f\xc5\x27\x49\x9d\xdd\x00\x9a\x10\x2c\x6a\x59\xad\xc3\x3e\x97\x36\x63\x93\x2d\x4a\x07\xdd\x0d\x9d\x0b\xe6\x59\xca\xf1\x60\x3c\x7a\xf0\x3d\xcb\x4d\x8c\x5f\x56\x8a\x31\xac\x05\x1a\xc2\xf0\x54\x3d\x26\xe7\x6d\xbc\x41\x8f\x1c\x34\xa1\x26\x0d\x7d\xc7\x04\x11\x23\x5f\xea\x1f\x5e\xc1\xd8\x45\x51\x99\x5a\x4e\xad\x86\x75\xd5\xee\x3e\xc2\x9d\xaa\xd2\xe0\x20\x5f\x62\x54\x97\x1d\x67\xb7\x73\x15\xdd\x11\x2d\x8f\xe3\x4d\xb4\x13\x98\xc1\x0e\x57\x0c\xe5\xec\x88\x9c\x82\xfa\x06\xf7\x62\x21\xdc\xa0\x12\x78\x9d\x0a\x99\x4f\x58\x67\xc4\x93\x38\x93\xfc\x1c\xe1\x5a\xec\xdd\x20\xf2\x46\x39\x86\x3f\xe4\xbe\xf0\x33\xd5\x3f\xe8\x10\xab\x94\xf9\xa3\xa9\x9f\x8f\xb4\x33\x7f\x05\x93\x67\x19\xa8\xd8\x81\xfb\x24\x6d\xc4\xfe\x0c\xab\x33\xe9\xa4\x4d\xa0\x63\x53\x63\xb6\x95\xb8\xc3\xf5\x79\x14\xfa\x2c\x31\x3f\x93\x22\xa3\xf5\x7a\x5a\x21\xfc\x57\x5e\x62\xa2\x8e\x8b\xbe\xca\x0e\x59\xd9\x10\xad\xe9\xbf\xb8\x25\xfb\x12\x46\xe8\x9b\xd7\x71\x88\x8e\xd1\x30\x9f\x08\x20\x6f\x46\x78\x22\xea\x76\x8c\xf1\xf8\x52\x22\x11\x11\x34\xd6\x34\x2d\xba\x57\x45\xa9\x70\x22\x45\x84\x74\x58\x5d\xfb\x6e\x66\x0b\x1c\x43\xcf\x9b\x68\x2a\x08\x54\xcd\x91\xbe\x35\x67\xb2\x89\x6c\x2b\x79\x09\x98\x95\x3f\xf2\x1f\x36\x66\xd6\xc1\x1f\x3e\x80\x67\xba\x09\x99\x0d\x53\xef\xe5\x27\x38\xc5\x69\x4f\x7b\xef\x85\x79\xd7\xb6\x18\x73\x34\xa6\xa1\xc0\x9f\x42\x28\xe2\x9e\xb6\xfc\x37\x59\x5e\xfd\x54\x4a\x63\x25\x08\x0b\x33\x69\xc4\xbd\x3f\xdc\xba\x61\x54\xde\x51\xba\x11\xf7\x7e\xfb\x92\xd9\x5a\x5e\x09\xc8\xdf\x8c\x5d\xf1\xb3\x7a\xab\xfa\x6c\xee\x02\x3e\x7a\xf4\xaf\x08\xda\xa1\xd5\x00\x14\x5c\xe0\x5d\xd5\xa1\x6e\x7f\xee\xfd\x65\xaf\x6a\x15\x09\x55\xa7\xf7\x15\x0d\x14\xf4\x2f\x9c\xbc\xab\xae\xef\x2b\x77\x07\x58\x7c\xe1\x4a\xd6\x29\x9f\xdf\x41\x0e\xc4\x5c\x47\x83\x91\xab\x9f\xa4\xd6\x73\xd7\x23\x7a\xe1\xdd\x8b\xe0\xd0\x3b\x6f\x47\x0d\x57\x3d\x82\xaf\x8c\x81\x38\x92\x8c\x57\xef\xe5\x4d\xb3\x5a\xec\x28\x64\x71\x75\x25\x9a\xe0\x72\xd0\xae\x08\xe2\xee\x10\x2b\xba\x13\xa3\x6f\x1a\xb7\xb5\x0c\x97\x94\x87\x0b\xaf\x48\xa8\x14\xfc\x33\x9f\x9a\x66\xa2\x44\x65\x81\x5f\x9f\x6f\x0f\x53\xd1\x3d\xf5\x96\x76\x88\x1f\x84\x8e\xf7\x95\x4e\xf1\xda\xa8\x4f\x1c\xc4\x1a\x51\x1c\x1d\xb4\x34\xe2\xd5\x56\xbe\xb5\x57\x1c\xa3\x57\xf1\xf2\x01\x14\x24\xb7\xca\x68\x36\x48\x32\x7a\xdd\x73\xb0\xab\x5c\x00\xad\x3e\x37\xbc\xb1\xad\x72\x27\xd6\x44\x18\xe7\x0c\x9f\xd6\x73\x0b\x67\xa0\x53\x9b\x4d\x78\xec\x63\x90\x76\x35\x4f\x1e\x38\xf0\xe2\x31\xbf\x4a\x10\x04\xc2\xab\xe6\xb4\xf7\xf4\xb5\x45\x01\x71\x45\x05\x51\xcf\x9f\x09\xa3\x27\x3c\x70\x26\x84\x29\xa3\x2c\x0d\x78\x05\x1c\xe1\x59\x77\x20\x5e\x50\x69\x69\xa4\x86\xd8\xe6\x13\x41\x60\x3b\xf9\x24\x56\xda\xfd\x8a\x82\x3d\x38\x6d\xfe\xd4\x59\x63\xef\xc8\xde\xf3\xaf\x04\xe9\x57\x1d\x76\xe2\x1e\x24\x58\x64\xbd\xc9\x07\x5c\x1b\x98\xbd\xc2\x7a\x87\x75\x41\x38\xe7\xdb\x76\xa3\xf7\x09\xb6\x94\x94\x3b\xd8\x13\x73\x2a\xae\xc4\x98\x55\x93\x4f\x2f\x06\xca\xbe\x8b\xda\x38\x6b\x17\x21\x9b\xca\x6a\x37\x2f\x6d\xbd\x0e\xf0\x32\x6e\xce\xad\xea\x87\xe7\x11\xbb\x64\x30\x53\xed\x81\x05\x52\x51\x55\x8d\x6e\x87\xfc\x82\x03\x72\x36\x72\x0c\x28\xf0\x9a\x6a\x9e\x4f\x9a\xd5\x4e\xf9\x56\x5f\xbd\x48\x9c\x3c\xe5\x5f\x7c\x04\xc2\x20\x63\x1f\x21\xdf\x7f\x62\x35\xe3\x15\x02\x6b\x4e\xbb\x97\x7d\x47\xa8\x43\x27\xfb\x4b\xdc\xde\xe4\xd1\xc3\x56\x85\xab\x8e\x5b\x89\x5c\x9a\xc7\xb0\x1d\x1a\x3d\x28\xfb\x11\x9e\xe6\xfe\xe2\xc0\x57\xb9\xd0\xe4\x48\x4c\xca\x24\xad\x6c\x8e\x14\x9e\x2c\x28\x2f\xb7\x14\x65\xa6\x98\x73\xc4\x36\xdc\x3d\x4d\x48\x07\xbd\x8c\x83\x1d\x28\x7c\x51\x3c\x10\xa8\x17\xb1\xac\x05\x62\x82\xc8\xa7\x71\xcd\x7d\x8a\x8e\x70\x34\x8b\x9d\xfe\x28\x1a\x2e\xf5\x07\x3b\xf3\x6a\x07\x95\x3c\x17\x91\xd1\x25\x9b\xb4\x25\xfe\x16\xb4\x51\xca\x01\xee\xe3\x64\xef\x93\x20\xcd\x3e\xb9\x7f\x0d\x3b\x07\x3b\xdd\x7f\xfa\xd0\xf2\x4f\x70\x00\x44\x32\x67\x18\x68\x89\x5b\x4f\x98\x4d\x56\x38\x2d\x8e\x28\x85\xb1\x9f\xed\x53\x21\x53\x61\x5a\x4a\x57\x83\xdb\x8f\x12\x4f\x13\xa2\x2c\x8f\x26\xc9\x67\x7c\x40\x8e\x5d\x89\xc6\x1c\x48\x2a\x0a\x36\xd1\x81\x58\x1d\x02\x84\x80\x11\xa9\x50\x85\x4f\x38\x6f\x9f\x2f\x5a\x36\xa6\x61\xbf\x6d\xab\xd2\xfe\x85\x3e\xa5\xa8\x51\xb1\xba\xad\x70\x4c\x74\x5e\x71\x2b\xdb\xed\x11\x34\x69\x8c\xf9\x14\x8c\x5e\x44\x70\x7b\x01\xbd\x77\xb4\xcb\x56\x4a\xeb\x77\xad\x7d\x63\x30\x79\x4d\x44\x5a\x98\xe0\x6f\xfb\xec\x16\x38\x78\xfc\xc0\x73\x97\x4d\x31\xd8\xc8\xda\x8e\x68\x4f\x9c\x89\x75\x3e\xfe\x9f\x6c\x09\x7d\x91\x0a\x8d\x2c\x6e\x9f\x18\x03\x6c\x38\x78\x4a\x1c\x35\x24\x28\x47\xe1\x18\xd5\x76\x34\x9d\x25\x47\xb4\xac\x18\x39\x04\x17\x3b\x0d\xb4\xbc\x2e\x4a\x1a\xdc\xc3\x6a\x74\xff\xff\x65\xbf\x50\x18\xb8\x67\x6b\x5d\x19\x46\xb3\x63\x97\x20\xf4\xb0\xb9\x76\x0c\xa1\x43\xf4\x23\x73\xb6\x68\x48\xb6\xef\x63\xbc\x0b\xad\xa5\x6a\x78\xdf\xab\x0d\x94\x71\xa1\x32\x7f\xec\x28\x91\x29\xd6\xda\xfb\x8b\xa4\xd9\x71\xf8\x70\xa0\x48\x22\xad\xf4\x66\xc4\xc8\x61\xf5\x11\xa9\xd7\x47\x1f\xf1\x23\xdb\xcf\xa4\x7a\x4d\x1c\xc0\x02\x56\xf5\x9a\xe9\x1e\xb8\x23\x2d\x95\xfa\xdb\x42\x47\x58\x17\xe6\xaa\x3a\x5b\xec\xfe\xd4\xb7\xdb\xd6\xa6\x6c\x7f\xbd\xb6\x0b\x94\x63\x51\x18\xdd\x0b\x03\x2e\x62\xca\x3f\x33\xc8\x4c\x9c\xee\xf3\xfa\xe5\x9a\x7c\x2a\x39\xdb\xcb\x53\xbc\x1b\xf8\x4c\xb2\x67\x51\xd4\xd0\x58\x5b\x1b\x53\x6f\xfb\xfd\xbe\x5d\x2d\x81\x50\x8f\x0a\xcd\xc8\x92\xca\xc2\x1e\x91\xe4\x58\x7b\x73\x7e\x0c\x6e\xb0\x2e\x7c\xf5\x17\xa2\xdf\xe7\xf2\xf1\x3b\x1a\xde\x3d\x92\xcc\x05\x0b\xe2\xc9\x49\x61\x3e\x9b\xeb\x5a\xf6\x9a\xe4\xd0\xc0\xba\x9c\x94\xfe\x4a\x4d\xd7\xfc\x06\xc0\xad\x51\x33\xb4\x84\xfe\xe1\xa5\x46\x76\x48\x41\xef\x8e\xda\x65\x51\x02\x0d\xb9\x54\x42\x35\x5e\x6d\x75\x34\xef\x3d\x37\xf2\x51\x7e\xd9\x19\x29\x80\xae\x0e\x1e\x89\x26\x8a\xc1\x7a\x47\x56\xa7\xbd\x60\x82\x2f\x22\x86\xc7\x97\xd2\x89\x5a\x89\xb3\x09\x8d\x86\x64\xfd\x4c\xb2\x74\x0c\x46\x6b\x67\xad\xe2\x25\x7a\xec\x36\x6b\xa4\x90\xe8\xa5\xe9\xbd\xa9\x26\x68\x18\x2b\x0b\x77\x44\xd5\x47\xac\x23\x66\xab\x88\xbb\xe6\x03\xdf\x4d\xbf\xea\xb6\x7c\x3b\x15\xf6\x85\xa9\x11\x77\x85\x13\xbf\x9e\x5c\xac\x2d\xaa\x9e\x57\x1a\xb6\x44\x4b\xc0\x77\xe4\xcd\xc0\x89\xe9\xe0\x22\x70\x8c\x0b\x73\x7a\x61\x9b\x99\xf4\x8d\x2b\x2d\xbf\x9c\x3e\x50\xcd\xc1\x0c\x24\x7c\xf9\x96\x36\xfe\xdd\xa4\x7f\x17\x1c\x36\x7d\x11\x3e\x0f\x57\xea\x62\xda\x76\xb7\x04\xcc\x88\xd4\x25\xa6\x77\x96\x10\xa1\xc3\xf5\x78\x67\x8d\x54\x9e\x31\x06\x87\xae\x5f\x44\xf3\x60\xb7\x27\xaa\x16\x09\xa3\x70\xf8\x75\x84\x2b\xda\x71\xc7\xeb\x75\x54\x46\x71\x1d\x31\x20\xa3\xdb\x93\x0f\x1b\xf2\x44\x9d\xa0\x02\x7f\xed\x84\xf0\x9f\x86\x82\xe4\x57\x53\xed\xcd\x5e\x6a\x5f\x04\xea\x60\xa6\xa7\x32\x48\x67\x40\xfd\xbf\xbe\x29\xf5\x9f\x64\x12\x2b\x4c\xa8\x4d\x23\x47\x33\x6b\x28\xb0\x05\x5c\x82\xdd\xa9\x85\x53\x55\x34\x78\x8a\xbf\xa9\x03\x8d\xf3\xd7\xf2\x49\x01\x9c\x04\x30\xbb\xe6\x2e\xcc\x15\x41\xc1\x94\x9f\x22\x86\xb1\xdc\xa2\xec\x56\xa2\xfd\xc4\x72\x33\xf6\x6f\xa9\xaf\x48\x82\x6f\xa4\x1a\x05\xc0\x63\x1f\x3a\xc3\x29\x65\x18\xb4\x09\xbd\xb4\x2f\xfd\xb3\x45\xf5\xe1\xf6\xe9\xf6\x13\x41\xf2\xdc\x6b\x51\x72\x39\x50\xde\xd0\x66\x69\x3c\xe7\xa3\xfc\xbb\x2b\x89\xf6\xc2\x48\x3d\xf3\x5d\x2b\x6c\x8e\xe7\xd4\x7f\x23\xbb\x09\x00\x4c\x58\xb1\x48\xaa\x88\x6c\xa8\xb0\xcc\x08\x71\xef\xd8\x58\x35\x57\x88\xae\x50\x62\x4d\x51\x62\x3d\xc3\x93\xe5\xe5\xe6\x42\x4f\x84\x4a\xf9\x23\xcd\x24\xc0\x4a\x73\xfb\x03\x6b\xbd\x65\x5d\xfd\xd4\x3b\xf5\x84\x51\x5f\x6c\x4c\x4f\x7b\xae\xcd\xc2\x93\x43\x6e\x87\x61\xdd\x3a\x63\x95\xa0\x23\x0f\x63\xbb\x2b\x72\xe3\x46\xfe\x42\x7f\x6e\x04\xf8\x90\x09\xfa\xe1\xa0\x71\x79\xe5\xde\xba\x2c\x16\x53\x7e\x3c\x80\xcf\x11\x29\x34\x8d\x0b\x53\xaf\xeb\x88\x41\xff\x99\x5e\x51\x22\xb5\x64\x1a\xdb\xa1\xc2\xc0\x78\x8f\xaa\x69\x0d\x7a\xe8\xf2\x54\x60\x1f\xbd\xea\x90\xbf\x79\xcb\x17\x9f\xd1\xd9\x00\x80\xec\x1d\xf4\xa3\x0b\xf8\xec\xbb\x95\x48\xe9\xd2\x46\x77\xcc\x0d\x0a\xf3\x58\xe2\xc6\xaf\xf9\x63\x5a\x11\xc5\x62\x44\x7e\x76\xdf\xbf\x90\x8c\xe3\xcf\xe3\xa3\xc8\xa0\x8f\x6f\xcc\x4e\xe3\x8f\x17\xd2\xae\x41\xc1\x40\xf6\x94\xac\x5e\xf1\x69\x39\xf3\x74\xdf\xd0\x8c\xcb\xde\x00\x45\xe8\xc6\x6d\x47\x2a\x30\x46\xa6\xf0\xc6\xb0\xdd\xe4\x08\x2a\xff\x1e\x5e\xb4\x4b\x93\xb9\x03\x10\x61\x88\xe7\x14\x57\xd9\x99\xed\x96\x2e\x22\xc4\x9c\xc9\xdb\xee\x63\xfa\xac\x82\x5b\xbd\x9b\xc6\x6c\x90\x33\x90\x85\xc2\x5d\x6b\x6c\x0e\x82\xa6\xe9\x8a\x19\x08\x08\x99\x3a\x60\xf7\x44\x3b\x49\x20\xa6\x21\x0c\x16\x6f\xc6\xae\x2b\x6a\x74\x37\x36\x2d\x6b\x30\xeb\x3c\x88\x2e\x29\xac\xa3\xf7\xa1\xce\xea\x94\x54\x61\xa5\xe1\x4f\x88\xab\x44\xa4\xec\x2e\x07\x25\x5b\x9d\xf2\x2a\x9b\xc5\x55\xa7\xf9\x9a\xac\x6d\x91\xd0\x40\x57\xe5\x72\xef\xd1\x1b\x09\x40\xf1\x27\x2a\x78\x79\xba\xb7\x33\xac\x02\xbc\x3e\x0c\xef\x1f\x40\x26\xdf\x9e\xad\xca\xc4\x6e\x1d\xfc\x57\x5e\x7b\xc8\x35\x8f\x69\x22\xf7\xef\x09\xb6\xfb\x4a\x88\xc9\x63\xf8\x2e\x64\x65\x83\x30\x22\xa6\x0d\xf7\x2f\x8c\xe6\x1d\x06\xb1\xa2\x91\x45\x88\xd5\x50\x72\x05\x07\xe8\xc5\x9b\x6e\x0c\x6b\x1f\xbb\xba\x07\x71\x73\x14\xb1\x37\x36\x44\x62\x94\x73\xe9\xf3\xf8\x24\xc2\xac\xb9\xf5\x77\x4f\x18\x15\xea\xa6\xfe\xef\x3f\x7f\x38\x27\x91\xe5\x90\x3f\xfe\x20\x57\xce\xef\x5d\x18\x2b\x33\x17\xf3\x45\xcc\x28\xab\xb8\xce\xcb\xdc\x6c\x71\x04\x25\x0f\xf7\xa1\xd2\x44\xcc\x64\xfb\x8d\xe7\xcc\x3b\x74\x88\x81\xc4\xe0\x48\xb5\x2f\x14\x54\x31\xe4\x75\xe7\x24\xd4\xfa\x57\x6d\x00\xb6\x47\xf2\x6b\xe8\x95\x30\xb0\xd1\x18\x00\x7f\xbb\x7c\xd9\xe5\xd9\x5d\xe2\xae\x05\x3b\xb2\xb8\xe2\xac\xa7\xda\x22\x09\x47\x7e\xa3\x56\xf5\x08\xfc\x9d\x02\xaf\xc5\x30\x21\x0a\x19\xd6\x34\xdb\x6f\x4d\x56\x9d\x13\x8e\x84\xf2\x6c\x41\x8f\x3d\x22\x44\xbb\xab\xb0\x76\x52\x7b\xb4\xdc\x61\x64\xd9\x2d\xce\x8c\x13\x57\x21\x2b\x11\x32\x7d\xa4\xbb\x00\x51\xfb\xe1\x54\xb9\xfb\x4f\x69\xda\x33\x0f\x8b\xa4\x77\x52\x49\x2f\xdf\xbb\x91\x46\x29\xfa\xe1\x35\xf2\x65\x65\xf8\x3e\x6a\xd7\x98\x29\x60\x05\x34\xb2\xec\x70\xd2\x72\xf5\xed\x6c\xc3\x1f\x5b\x36\x0c\xa9\xce\x6b\xa4\x3b\xee\x5b\xe4\x6a\x40\x41\x8a\x45\x3b\x54\x80\xdb\xdb\x23\x8d\x6a\x2a\xc2\x6f\xaf\x36\xde\x53\x2a\x93\x76\x2a\xab\x5d\xa2\xa1\x97\xd3\x01\x19\x46\xc0\x80\x7d\xe6\xa4\x4a\xc6\x57\x25\x98\x20\xe7\xde\xd4\xa7\x7b\xe2\x9d\x7b\xda\xc9\xed\xe1\x85\xbe\xf6\x5f\xb4\x48\xda\x79\x4e\xc7\xa7\x45\xb2\xc3\xa9\x49\xbf\xcf\x4e\x36\xfd\x3a\x68\x78\xe5\x4c\x08\xc3\xcf\xf3\xd2\xb1\x7c\x04\x60\x73\x4c\x6c\xe4\x31\xb3\x23\x17\xa9\x6c\xf2\x1a\x62\x60\x9f\x1f\x90\x7b\x18\x49\x38\x35\xc2\x6f\xa7\xbd\x31\xdb\x27\x39\xe5\xc2\xa8\xb7\xca\x09\x01\x90\x87\xd7\xc5\x56\x35\x70\x5c\x5c\x23\xcd\x76\x63\x25\x42\x81\xc9\xc3\x85\x79\x8d\xbe\x44\xd6\x8f\xb7\x59\xb4\x55\xb5\x3d\xb7\x4b\xac\x57\x2e\xc1\x5d\xb6\x9a\xd8\x87\xae\xde\xe1\xf2\x73\x8b\x78\x60\x60\xef\xc2\x58\xc6\x83\x00\x6d\x1f\xfc\x64\x1a\xb5\x42\xe7\xa7\xe6\x0a\x83\x12\x6f\x9f\xee\x75\x9f\xa3\xa6\x79\x65\x52\x01\x96\xfa\x94\x35\x11\xe9\x7e\x4b\x89\x7e\xd0\x36\xbf\xbd\x79\x3b\x2e\xf9\x39\xff\xe3\x03\x2e\x89\x6c\xba\x49\xcf\x5b\x22\xc5\x15\x83\xcf\x48\xa7\xbb\x0f\x4f\xb5\xf0\xd2\x87\xcd\x56\xcb\xf4\x0d\x5a\xc4\x8c\x9e\x12\x8b\x3f\xa6\xcc\x72\xb7\x75\x84\x76\x3a\x8b\x4b\xcd\x26\xbd\x0a\xb6\xf1\xea\xd7\x4f\x9c\xc1\x4c\x35\x3f\xb9\xcf\x82\x1e\xf5\x70\x38\x7a\x56\x7a\x68\x0b\x33\x1a\xeb\x02\x98\x77\x21\x78\x64\x87\xb8\x9c\x94\xee\x45\x47\xa3\xb5\x7a\x97\x8c\xbe\x8e\xac\x19\x54\x20\xa2\x4f\x7b\xef\xc9\xc6\xf7\x8b\x65\xe3\x34\xba\x1e\x6d\x90\xf4\xb4\x77\xda\xb7\xbf\xe8\x2d\x7d\x02\xad\x0d\x30\x8b\xf1\x2c\x19\xf1\x70\x6f\x8c\x58\x1b\xea\x96\xc4\x14\x2e\xda\xd0\xca\xbf\xce\xb1\x03\xe0\x4b\xdd\xcf\xbd\xf0\xb6\xde\xaa\x5c\x56\x73\x7d\x8d\x44\x86\xfa\x0f\x93\xa4\x87\x14\xd9\x1f\x1d\xe1\xc0\xbb\xe0\x58\x72\x0f\x4f\xaa\xd8\xc1\x8a\xe6\xd1\xcb\x8f\x0e\xac\x3c\x37\xbc\x5e\x02\x7a\x5a\xe7\x15\x2a\xd9\x8e\x25\x7f\x97\x74\x0b\x76\x1c\xa2\x76\xbf\x3d\x31\xdd\x76\x20\x4e\x9a\x64\x7d\x93\x06\x25\x40\x73\x64\xde\xd4\x71\x17\xf2\x57\x05\x5d\x54\xef\xa3\x61\x41\x37\x3e\x64\x06\x36\x49\xd5\xe2\x47\x50\xd6\xeb\xa8\x21\x96\xd9\x7c\x93\x75\xac\xe6\xcf\x3b\x74\x10\xf9\x03\x16\x71\x6f\x53\xb2\xfb\xc5\x31\x72\x07\xbd\x96\x91\x2c\xa4\x1a\x43\x0e\x6e\x28\x20\x60\xf9\x75\x76\xc2\x0e\x90\xbd\x56\xf0\xdc\x6d\x47\xcc\xf5\x20\xac\x0c\xcd\xb2\x6f\x40\xc7\xef\xfd\x3e\x11\x20\xc9\xef\x69\x1c\x6f\xa4\x52\x65\xec\x84\xbe\x9e\xc3\xed\x1a\x3e\xac\xaf\x98\x67\xdf\xff\x3a\xa1\x1e\xb1\xa8\x6d\xcb\x52\x5f\xe8\xfe\xa2\x04\xa4\xce\xd4\x6a\x3b\x80\x86\x5e\x75\x45\x4a\x6c\x3d\x75\x2e\x21\x0d\xe0\x4a\x02\x41\x8e\x48\xaf\x3c\xf2\x28\x07\x4a\x8d\x60\xa0\x1d\xce\x9b\x26\x99\xb4\x74\x11\x99\x0b\xb9\x4e\xba\xbf\x3d\xf1\x82\x0c\x2f\x28\x9c\x15\xdc\x2d\x39\x4e\x7d\xff\x84\xf4\x5b\xea\xb9\x65\x05\xc3\x7c\x6d\x15\xea\xda\x03\x78\xf1\xc5\xf4\x9b\x96\x41\x52\xb6\x68\x1f\x0a\xc7\x35\xe9\x92\x45\xfb\x45\x13\xa0\xf6\xea\xcb\x71\x36\x3c\x19\x7c\xa3\xa9\x5b\x40\x05\x60\x76\x3c\xe8\x1c\xf8\xe6\xc9\x37\x97\x28\x6a\x67\x64\xc9\x3c\x98\xbc\x04\xfb\x16\xfc\x9d\x1e\xf9\xae\xba\x76\x02\xc9\x89\x44\x2e\x77\x9a\x4f\x6a\xa8\xa7\x7a\xfe\x58\x96\xb5\xa9\xec\x6d\x19\xfc\xcc\xda\xc9\xf0\x6a\x2a\x0b\xcb\xbb\xac\xfe\x6a\x64\x12\xde\x58\x47\xb6\xc0\x90\xc9\x09\xd0\x1b\xd3\xd0\xc9\xed\x05\x9b\x39\x6f\x2d\x1f\x5a\xad\xea\x9a\x7e\x8c\x4e\x34\x4d\xa2\xac\xf8\xae\x96\x8b\x80\x9f\xe1\x43\x8a\xa6\xed\x1b\xba\x25\x90\xf8\x16\x7a\x1f\x58\xfb\xb0\x80\x82\x99\x9e\x3f\xf9\xc1\x36\x1e\xcd\xbb\x72\xa0\x39\xcd\x9a\x99\xd0\xa4\xa7\x30\x93\x02\x3d\x45\x11\xfe\x4b\x1e\x81\x4d\xff\x3f\x36\x2f\x42\x9e\x53\x23\x4a\x87\xce\xdd\x89\xd0\x2d\x02\xb8\xab\x11\x72\x7e\xb4\x68\x8e\xa0\x63\x7a\xb7\x24\x08\x9b\xd9\x81\x3e\xe4\xb6\x3f\xc5\x6d\x51\xbe\x38\x2e\x0e\xca\xf0\xbe\x89\xdb\xe4\x27\xc9\x78\x9a\xb2\x7e\x0e\xc0\x1b\xd5\xe8\x9d\xc3\x23\xcc\xca\xc5\x2b\x52\xd2\x87\x7c\xf3\x7d\xbe\xee\x27\xa7\xd7\xee\xfb\xc6\x05\xf9\x59\x57\x84\xa2\xb9\xdc\x87\xff\x56\xbd\x2a\x01\x34\x63\xbb\xac\xdf\xde\x0d\xe2\x39\xaf\x1c\x42\x35\x0c\xaa\xc2\xa0\xc9\x7e\xbb\xd8\x66\x30\x00\xe2\x2e\x82\x2c\x3d\x3e\x0e\xf9\x9f\x15\x77\x0b\x09\x5b\x3b\xfd\xcb\x56\x79\xc1\x7b\xea\x17\xbf\xa6\x44\xa2\xdd\xc5\x61\x56\x4d\x4c\xfd\x0e\x43\x78\xdb\x3c\x68\x94\x60\xdb\x04\x77\x6b\xaf\x6b\x36\xde\xff\x67\xcc\xab\x16\xe5\xf1\x77\x65\x10\x0f\x14\x09\x69\xdc\x06\x94\x4e\x5b\xfe\x0b\x0a\xe7\x7b\x69\x73\x2a\x5b\xa7\xb0\x72\x72\x5e\xe7\x0b\xdb\x35\x47\xe8\xd9\xdf\xc6\x0a\x87\xb9\x83\xe1\x37\x43\x6b\x3e\xb7\xdb\x07\x0a\x0f\x9a\x78\x28\x72\x91\xdb\x41\x4b\xc8\x05\x4e\xe3\xfb\x43\x58\x75\x94\x05\xc2\xee\x07\xd1\xe4\xe6\xe5\x01\x93\xa7\x1c\x54\xb6\x5f\x18\x89\xcc\x98\x81\x75\xf2\xbb\xf1\xbd\xe2\x82\x36\x52\x4d\x0a\x69\xcb\x9a\xc2\x43\x3c\x61\xef\xcf\x5a\x22\xed\xc0\xd1\x95\xf0\x80\xc5\x60\xbe\x70\x2c\x7f\x37\x16\x5c\x69\x9b\x86\x03\xcc\x82\x9b\x16\xcf\xd0\xe0\xd6\x53\xf7\xaa\xf4\xc7\x74\xde\x02\x74\x5c\xec\xf9\x20\x58\xa3\xfc\x83\x53\x46\x07\x1b\xef\x65\xeb\xd5\x1b\x8c\x85\x24\x6d\xb1\x26\x66\x78\xfb\x71\xb7\x72\x8e\x79\x12\xdf\x76\x8a\x42\xe7\xc6\x50\x99\xdb\x53\xe4\xa9\x84\x3e\xaa\xaa\x3b\xc1\xa2\x71\xc8\xcb\x15\x2b\x9f\x84\x4d\x8d\xb3\x3f\x42\x73\xba\xc9\x94\x2a\x4a\xa3\x65\x10\xfb\xa6\x8a\x49\x64\x57\x77\xf2\x23\x96\x87\x1f\xf7\xad\x4b\x68\x2d\x7c\x50\x45\xb9\x13\xd6\xe7\x76\x93\x21\x9d\xda\xc9\x56\x81\x41\x86\xff\x50\xbb\x52\xc4\x93\xcb\x2e\xe6\x91\xba\x26\x8c\x7a\x90\x14\x46\x8d\xd3\xad\x30\x28\xf8\xa7\x86\x8d\xd5\x1b\xe1\x76\xc4\x7e\x16\xb4\x5f\x25\xa2\xe9\x86\x28\x83\x8e\x86\x73\xf4\xf5\x15\xc0\x8f\x55\xec\xaa\x11\xad\xcb\x2b\xa4\xc3\x4e\x32\xf4\xb9\xe4\x37\x04\xee\x1d\x8e\x71\x61\x41\x5b\x0a\x86\x8f\xb3\x74\x34\xdb\xeb\xbc\xf2\xa3\x6d\x16\x9a\x37\x4d\xe1\xa1\xf8\x5d\x42\x45\xef\x0f\xe1\x63\x95\x0e\x71\x53\x15\x1d\xe5\xbb\xdb\x72\x29\xa7\x0d\x81\x54\x43\x7d\xa9\xb7\x53\x35\x54\x64\xb8\xfb\xc5\xc9\x40\xa2\x0f\x78\xe7\x57\x43\xaf\xe9\x9c\xc5\x31\x3d\xde\x04\x69\xa4\x70\x68\xd3\xe7\xe2\x6d\x1b\x64\x7c\xc1\x3f\x25\xe0\x8b\xe2\xb1\x4b\x89\x37\x90\x08\x87\x52\xe8\xfa\xd1\x69\xf0\x13\x79\x4b\x5c\x22\x44\x83\x66\x1b\x25\xeb\x09\x25\x2e\x91\x20\x3b\x92\x03\xc0\x72\x61\xbe\xe6\x59\xb6\x9d\x7a\x55\x24\xc8\xc0\x8b\x9f\x23\x42\xf8\x30\x02\x26\xf4\x5c\x56\x9a\x0a\xb8\x4b\x96\xec\x86\xa6\xd4\xc0\x25\xbb\xfb\xdd\xdc\xc4\x1d\xb3\xb8\xbb\x25\x58\xe0\x88\x33\xa4\x46\x0d\x42\xdd\x26\x90\xac\xdf\xe0\xe8\xaa\x0a\x9a\xe0\xde\xc7\x46\xee\x9f\xac\x0b\x57\x18\x78\xd1\x13\x4a\x20\x1f\x93\x11\xd9\xdd\xd3\x27\x11\x88\xf2\xdb\xd3\x0a\x42\x96\x1d\xb6\x70\xdb\x85\x87\x3b\x02\xd4\x30\xbd\x81\xcb\x96\xb6\xf0\x2d\xbf\x3b\xee\x00\xb0\xdd\x1e\x69\xb4\xb8\x1e\x49\xc1\xb2\x97\x06\x50\x2b\x72\x4a\x64\x5f\x84\xf9\x74\xf3\xf2\x0c\xc3\x00\x28\x8f\x88\x16\xdf\xde\xbb\xd8\xd6\x73\x25\x46\x7a\xf9\x9f\x84\x49\x96\x88\xbb\xd6\x4d\x2b\x97\x1f\xa4\x34\xa5\x80\x21\x63\x94\xfe\xb3\x1d\xee\xde\x07\xd9\x7c\x78\x5d\xca\xd7\xde\xae\x4c\xd1\x02\x70\x3a\xf2\xf3\xd4\x10\x39\xb5\xe7\xc1\x96\x49\x34\x9d\x4f\x98\xbf\xd9\x2d\x7a\x36\x23\x65\x21\xa8\x58\xb5\x08\x0e\x2f\x76\x94\xfa\x01\xfa\x8c\xf2\xe7\x8e\xa6\xff\x77\x30\x19\x63\xd1\x07\x9d\x8c\xf4\xef\x69\x6b\xb1\x5d\x23\x8a\x68\x59\x48\xfa\x21\xa2\xe0\xe3\x3a\x52\xd3\xe5\x46\x5f\x9a\x31\x8d\x9c\xd6\x3c\x6f\x6d\x3b\xe4\x29\x41\x4a\xab\x7d\x19\x28\x14\xad\x97\x3f\xf4\x5a\x1c\x3e\x49\x0d\x56\xb3\x15\xb0\x43\x5e\x06\x48\x8b\x32\xb3\x7d\x43\x0b\x05\xe5\xa9\x7a\x27\xe8\x51\x7d\xc4\x8c\xf7\x61\x90\x87\xa9\xbd\xea\x9f\xbd\x4d\xde\xfa\x14\x8c\xc9\xee\x73\x28\x15\x33\xba\xa2\x23\x47\x80\x8c\x8f\xea\x1e\x31\x48\x8f\x9a\x48\xd3\x8f\x9f\x83\x8c\xad\x08\x76\x3f\x34\x45\xd7\x3c\x9d\x24\xdb\xae\x6a\x6c\x16\xf6\xcf\x56\xe5\x69\x25\xa7\xa0\xae\x41\x2c\x70\x27\x8f\x9c\xd7\x2e\x97\xd0\x6f\x4a\x35\x43\xd3\xea\x44\x73\xcb\x7e\xd2\x8b\x98\xf4\xf7\xd8\x6e\xa5\x5b\xd9\x7d\x3e\x19\x78\xb6\xc4\xd4\x22\x2d\x14\x09\xa0\x23\x25\xe4\xb4\x28\x4f\xfe\x13\xe5\xdf\x27\xff\xbb\x7d\x2d\x57\xb3\x6b\x2d\x8a\x63\x9f\x8a\x54\xbe\xe0\x4c\xad\x61\x74\x68\x55\x9b\x5d\x80\xa2\x1f\x82\xe0\xa4\x0e\xeb\x4a\xdb\xdc\x52\x4d\x56\xa1\x45\xf0\x4d\x17\x95\xe8\x48\x72\x36\xa0\xb9\xbb\x5d\x75\x94\xa0\x81\x42\xc8\xc6\xa9\x8c\xe2\x1e\x4e\x4a\xbd\x38\x73\x52\x6c\xa0\x15\xc1\xbe\x25\x9c\x50\x8e\x34\xfd\x27\xc9\x66\xf6\x46\x0e\xe4\x03\xad\x85\x93\x7a\x0d\xe5\x29\xec\x13\x17\x51\x47\xe7\x4e\x51\x8a\x15\x05\x2c\x9e\xea\xd4\x02\xd8\x20\x05\xf7\xc3\x05\x24\x37\x15\xd3\xb6\x54\xff\x87\xf7\x99\x07\x78\xb5\x6b\x9e\x4a\x7e\xdb\x7d\x9a\x8d\x53\x0c\x80\xb6\xa2\x6d\xe7\x96\x86\xdc\x95\xf2\x8e\x79\xdf\x11\xd8\x09\x7b\xd8\x32\xf1\x86\x45\x80\x65\x58\xc5\x7a\x2c\x54\x56\xa9\x94\xb7\x01\xc4\x63\x5f\xb6\x3a\xac\xe7\x97\x73\x47\x5a\x5a\xa6\x8a\xec\xd0\x15\xe8\x53\xa2\xc2\x02\x58\xec\xb5\xd1\x9d\x87\x6b\x56\xed\xb4\x9d\x72\xfb\x5a\x60\x7a\x95\x14\xef\x62\xa5\x9a\xc6\xef\xfb\x14\x0a\x83\x67\x8d\x32\xc9\xfd\x35\x2b\xfe\xff\x07\xc0\xc1\xff\x00\x64\xdf\x38\x9f\x3e\xa4\x30\x56\xd9\x8e\xf2\x30\x99\x49\x0a\x98\xee\x90\xe7\xd4\x41\x7c\x14\x28\x77\x02\x52\x4f\x7d\x78\xbf\x9f\x4c\x6f\xb7\x3d\x2b\x2d\xbf\xf8\xf5\x08\xda\xdc\x68\x9b\x8e\x83\x4c\x5f\x16\x74\xa1\x43\x49\x04\xe0\x26\x70\xb1\xae\xb2\x8f\x87\xb3\xed\xd6\xe8\x42\xf4\xb0\xbd\x7b\x89\xe8\x92\x17\x76\xd6\x8b\xb6\xa4\xfe\x71\xe4\xc8\xdd\xda\x11\x27\x04\xdd\x87\x6e\xf0\xe1\xee\x92\xb0\x1f\x0a\xea\xc4\x12\xda\xc1\xb9\x4b\x0a\xea\x46\x30\x6c\xb0\x14\x69\x9b\x80\xec\x4e\xd7\xe5\x0e\x80\xa8\xbd\xdf\xec\x5b\x82\x5a\x5f\xc3\x42\x7e\x09\xcb\x5d\xd8\xb4\xf9\xd5\xdc\xff\x13\xf1\xe3\xaa\x04\x4e\xbc\x60\x68\xa4\x6f\x16\x97\xa3\x47\x09\xc3\xfe\xee\x73\x88\x1d\x74\x8f\x2d\x54\xef\x57\x38\x74\x00\x47\x1d\x04\xe6\x07\xe7\xbf\xde\xf3\x02\x4d\xbb\x5a\xd5\x0a\x6a\xd3\x63\x35\xd7\x2d\x55\x63\x82\x8e\xb7\x46\x47\xd4\xd3\x5d\x2a\xe8\x12\x0e\x98\x8a\x6a\x62\x5f\x52\xc4\x6e\x17\xa1\x5c\x2c\xba\x1f\x49\xc5\x19\x08\x94\xca\x2e\x83\xb6\x2b\xde\xf9\xe0\x3e\x4d\x69\x0d\x75\x79\xe0\xf4\xbe\x29\x71\x47\x92\x79\x68\x26\x1e\x05\x45\x9e\xed\x1f\x7d\x98\x45\xf8\x5f\x78\x8b\xcd\x77\xd1\x52\xf2\xd2\x78\xd8\xf6\x9d\x46\x7e\x3c\x88\x24\x00\xa3\xfe\x05\x83\x5e\x18\x29\x6f\x5c\xf0\xeb\x9a\x87\xfc\x45\x73\xa4\xd3\x7e\x64\xb8\x47\xc4\x76\x01\x4b\x7c\x8f\xc3\x99\x4b\xc7\x3d\x8b\xee\xa3\x53\x46\x6c\x8d\xef\x5d\x65\xa0\xb3\x44\x5f\x03\x4b\xe2\xeb\x70\x7a\x76\xba\x55\x0d\x95\x9b\x97\xa0\xa1\x8d\x37\x08\x7a\x37\x79\x44\x58\x07\x2c\x39\x1f\x7a\xe1\x74\xce\x2d\xdf\x34\xee\x71\xf4\x7e\x3e\x69\xcf\x4d\xca\x20\x2d\xd9\x7a\x6b\x97\x5f\x9d\xcf\xc1\x80\xdc\xaa\xac\x21\xc8\x17\x38\x85\xfb\xd7\xc7\x11\x49\x11\x97\xe4\xb7\xab\xcc\x91\x7a\x0f\x77\x88\x4d\x66\xca\xbf\x5d\x46\xdd\xe4\x0a\x86\x09\x9b\xbc\x03\x88\x2d\xbf\x40\xc6\x8e\x6e\xfc\x15\x3e\x4a\xb3\x70\xa2\x57\x60\xd4\xc0\x73\x0e\x51\xaa\x35\x66\x83\xc6\x17\x8c\x0a\x6f\x02\x17\x40\xec\x41\x13\x8a\xc8\xa9\x85\x39\x1c\xf3\xbd\x7d\xb9\x35\x49\x48\x9f\x77\xdf\xdf\xe6\x30\x22\x9b\xf1\x37\x34\xeb\x74\x8d\x63\xf0\x4e\x9f\x7c\xcc\xc1\x9b\xfe\xb6\x56\x6c\x8b\xf6\xd1\x36\x85\xc0\x7b\xa6\x54\x24\x91\x48\xbc\xdc\x46\x0e\x97\x47\xbc\x5f\x6c\xcb\x40\xc9\x53\x14\x0f\xaa\xa9\xa4\x04\x06\xa6\x63\x3e\xbc\x6f\x63\x12\x1e\x64\xf9\xfa\x42\x3b\x56\x42\x97\x5f\x65\xb0\x0a\x71\x88\x33\x8f\x60\x6d\x58\x48\xa2\x0e\x91\xd1\x08\x49\x7e\x74\xdd\xcf\xfb\xe0\x80\x07\xf8\x37\xe1\x6f\x64\xed\xf9\xa1\xfa\xac\xe2\x2f\x23\xa9\x19\xb3\x28\x2c\x61\x85\xe1\x7b\x5c\x3f\xab\xbd\xa1\x91\xbb\x26\xf9\x29\xdc\xbc\x3b\x25\xb2\x08\x82\x72\x15\x41\x8a\x91\xde\x92\x76\x92\x87\x6c\x63\x2b\xbd\x84\xc4\x22\xef\x0f\xa9\x09\xf7\x0b\x6b\xa1\xfe\x70\x3b\xc7\x21\x46\x79\xd2\x3c\x9e\xaa\xde\xaa\x5d\xfb\x01\x8e\x5f\xdc\x10\xe5\x6c\xd5\xcb\x48\xd6\x23\x80\x72\x90\x97\x60\x16\x2e\x06\x51\x77\xaf\x3b\x5d\x28\x6f\x89\x93\xba\x20\xfd\x77\x1a\xd6\x3b\x40\xdf\x15\x1f\xea\xd3\x9a\xf8\x68\x3b\x14\x83\xfe\xbb\xac\x14\xb1\x2e\x12\x22\xd5\xec\x22\xc3\x18\xb9\x72\xec\xee\x2e\x5d\x95\xc0\xbf\xbf\xfe\x88\x6a\x82\x50\x78\xd6\x89\x4c\xe3\xbe\x32\xc8\xd6\xfe\xa3\x64\x22\xdb\x68\xce\x70\xef\xb3\x96\xef\x5b\xc8\x48\x8a\x9d\xed\xba\xf5\x52\x5c\x53\xbc\x9b\x17\x50\x09\x81\xda\x45\xf0\xb3\x1c\x6a\xc1\x01\x60\xc3\x77\x41\xc0\xb5\xc7\xd2\xf7\xb7\x33\xa8\xe1\x27\xdc\xc9\xa4\xa3\xec\x4b\x28\xc8\x6d\x43\x12\x1c\x95\x97\xdd\x77\xa8\x9c\x22\x5e\xfd\x8e\x21\xf3\x89\x69\x6b\xf3\x92\xba\x34\x1b\xc5\xb2\x99\x4b\x83\x84\x7d\x86\x8c\x4b\x1e\xe5\xde\xf7\x1c\x48\x6c\xf5\x7d\xcb\x8a\x10\x2f\xbf\xf2\xa6\xd6\xda\xda\x3b\x16\x66\x59\x37\x11\x34\x20\x3a\x7b\xec\xec\xf4\x16\xef\xc8\x2b\x29\x8f\x0c\x70\x47\x54\xc5\x45\x1e\x42\x8d\x19\x2d\xe4\xea\xd1\xd0\xa2\xf0\xc4\xc3\x14\xa9\xed\x5e\x7c\x79\xb7\x1d\x6e\xb4\x57\x78\xbf\xc0\x83\x8a\xd2\x65\x64\x44\x64\xc9\x98\x63\x0f\x58\xbd\xb8\x85\xd4\xe4\xe1\xc5\xd6\x57\x54\x23\xfb\xd4\x99\xb4\xfa\x99\xd6\x92\xe9\xb3\xf6\x40\x4d\x44\x4d\x00\x65\xb2\x10\x3b\xdf\x14\xe3\x94\xd0\xc5\x90\xa8\xb7\x46\x4d\xa7\x57\x1b\x3e\xb5\x9c\xde\x21\xc1\xf1\x22\x62\x75\xe8\x4d\x42\x2f\x29\xf1\xa7\x8e\x4d\x48\xa4\x6f\x0a\xc4\xac\x15\xd9\x3a\xca\x3f\x6f\x62\x24\x40\x3d\xd5\x61\xce\x6f\x9f\xb2\xce\x6f\x72\x8e\x8e\x5b\x76\xd0\xf7\x4e\x55\xb5\xdf\x98\xb3\x5d\x32\x92\x8d\xf5\x93\x7c\x3d\xc5\x48\x0a\xf3\xa0\x39\x9c\xf5\xe7\x9f\xa0\x68\xce\x1a\x48\xcf\xf4\x4b\x9c\x1b\x13\xe5\x0f\xf2\x05\x7c\xea\xaf\x2a\xe1\xfe\x2f\xb7\xc9\xcd\x9f\xb8\x1a\xd3\x1d\x76\xca\xb8\x0f\x83\xeb\xb4\xd5\x3f\x51\x35\x9f\x91\x1d\x7a\xc5\x88\x65\x92\x3b\xfc\xf4\x6b\x68\xdc\x4d\x28\xcc\x1e\xb1\x83\xbe\x3f\xbe\x6b\xc2\x6b\x97\x01\x93\x72\x5f\x78\xda\xe6\x23\x5a\xc6\x33\x62\x6c\x9f\x34\xd3\x7e\x46\x50\x2b\xf8\x12\xf4\x6f\x4f\x32\x00\x87\xb7\xa3\x47\xe9\x6f\x2c\xff\xec\x59\x7c\x39\x0d\x8c\xb0\xdf\x9c\x8e\x58\xb0\x73\xbd\x23\x13\x79\x38\x9a\x75\xda\x60\x57\x78\xa0\x63\x47\xa0\xe0\x83\x0b\x09\x38\x24\xe4\x38\xd1\x36\x09\x07\xb5\xb5\x46\xe7\x94\x46\x29\xc5\x39\x3b\xf2\x40\x0d\x51\x1b\x7c\x77\x97\x2f\x5e\x95\x3f\x2f\xd2\xf3\x9a\xf8\xa5\xb6\x99\x42\xaf\xea\x1d\x98\xfc\xbf\x58\x59\xe8\xa3\xd0\x09\x4b\x18\xb7\x5d\x8a\xc5\x6c\x0b\x19\xcc\x28\x76\x41\x27\x84\xcb\x5c\xd4\xf6\xde\x6d\x1b\xae\xde\x57\x59\xa3\x3b\x48\x40\x97\xce\x7f\x69\x12\x98\x09\x70\xe0\xd8\x2c\xc3\x5c\xe9\xe2\x25\x1e\xac\xcd\x13\x6b\x94\x14\x9d\x6c\x68\x5f\x30\x1d\xc4\xe3\x10\x56\xda\xa9\xd3\xe9\xf4\xa5\x81\xcb\xa7\x49\x5e\x34\x49\xc3\x5b\xdd\xc8\xe3\x25\x9c\xa1\x7c\x33\xd6\xc5\x04\xd8\xad\x59\x8b\x45\xf2\x42\xd3\xc3\xb9\xe0\xce\xa3\x75\xdc\x91\x68\xe3\x98\x72\x03\xf1\x88\x35\xbd\x97\x4f\x1d\xcf\xfc\x7b\x1f\xca\xcc\x51\x84\xb2\x87\xaf\xba\xd3\x6f\x13\x61\x11\xac\x19\x25\x6b\x87\x79\x26\xa9\x16\x77\x17\x2d\x32\xa9\x52\x97\x2a\x33\x47\xed\xc4\x51\x4f\x57\x54\x93\x56\x06\x76\x31\x69\x84\xa8\x2f\x26\x18\xe9\x37\xcc\x48\x91\xad\x85\xc0\x62\xf9\xd6\x03\x93\x08\x4c\x86\xa3\x09\xff\x74\x04\xaa\x9f\x2d\xb4\xda\xea\xd3\x4d\x5b\x93\x9b\x51\x68\x1c\xa1\xa3\x20\x2d\x91\xea\x7e\xc8\x66\xfe\x28\xdf\x2f\x73\x8f\x65\xa9\xd4\x8b\x68\x81\x81\x69\x66\xe9\x9a\x78\x59\x1f\x56\x8e\x9f\x62\x95\x21\x9e\xe2\xe1\x7a\x5b\xee\xea\xbe\x3f\xef\xe9\xb5\x14\x8e\x2a\xec\xea\x7c\xb2\x82\xaa\x76\x7e\x90\x8c\x56\x67\xb2\x3b\x37\x4e\x0b\x36\x4e\x0f\x6e\x2a\x29\xd6\xfa\x95\xbf\x92\x27\x42\x91\x0d\xb1\xf6\xaf\x20\x75\x79\x56\xb2\xe2\xb8\xfb\xa7\xfe\x22\xf7\xa0\x68\xbd\xb1\x12\x20\xa5\xcb\xc6\xbb\x4d\xa7\x40\x9c\xb2\x01\xd4\x95\x88\x91\xd2\x69\x89\x9c\xf2\x07\x41\xbd\x4d\x7c\x89\xcf\x2a\x20\xef\xad\x5a\xd5\x5d\x93\x4f\xed\xc2\x1b\x3d\x67\x34\x04\x99\xed\x49\xe8\xa6\x99\x9d\x27\x30\xb7\xb7\x14\x06\x6e\x5a\x41\xe0\xeb\xbb\x68\x92\xca\x70\x8a\xa2\x7d\xa2\x6f\xe8\x74\xff\xa6\x9d\xdc\x48\x27\xf6\xd0\xcf\xb5\x19\x8f\x4e\xf9\x1d\x7e\xe5\xaa\x5d\xff\x68\x60\xd8\x79\x1c\xf1\x48\x12\xe4\x78\x13\x75\x19\xc1\x92\x63\xe1\x79\x64\x5e\xcb\x63\x8c\xd0\x9d\xa5\x16\x2b\x45\xbc\xd7\xb7\x52\x9c\xfd\x96\xe6\xa4\xa1\x8d\xb7\x41\x4e\x0d\x9f\xf3\x63\x23\x7f\x77\xd4\xeb\xee\x0a\x40\xbd\xba\x4f\xea\x63\x9e\x0e\x3c\x91\x19\x8f\xdb\x39\xc2\x02\xa3\x9c\x85\x1f\x35\xeb\xa8\xac\x79\x57\x76\xeb\x3e\xff\xcc\xa6\x11\x1d\x0c\xc5\x1a\x53\xd5\xa5\xd7\xda\xf5\x07\xec\xf2\xaa\x97\x87\xf2\x7f\xba\xf3\xb3\xf2\xfa\xb4\x15\x04\x3d\x03\xf7\xdf\x1c\x3c\xb6\x41\x6e\x70\x50\xb2\xd2\x91\x11\x3d\x11\x79\xe2\xb0\x88\x67\x81\x0a\xa3\x97\xd5\xf5\xfa\xfa\xf0\x57\xcb\x8a\x9d\x26\x6d\x5d\x1f\xfa\xd0\xbe\x6a\xca\x31\xaa\xc9\xb6\x1e\x3f\xac\xda\xa7\xfa\xbf\x5b\x7d\x50\xef\x3d\x86\xb7\xfe\xa0\x22\xc1\x4a\xce\xd7\xcb\xa4\x5e\xfc\x3e\x64\x04\x0a\x6a\xbe\xb2\xb9\xee\x7e\x8a\x3e\xff\x9e\xb8\x4d\x93\xc6\xd1\x45\x60\x5f\x57\x24\x5a\x56\x3a\xba\x55\x97\xb6\xa7\xe2\x85\xfe\x0a\x22\xf8\x7a\x12\x36\xc9\xab\x87\x76\xd0\x0f\xf4\xab\x93\x0a\xe0\x7b\xf1\xb3\xc0\x1d\x51\x05\x12\x96\xb0\x1b\x70\x8b\xc8\x08\x75\xe2\xc5\x62\xbb\xef\x2e\xeb\x54\xb0\x8c\x02\xa5\xb6\xad\x76\x0d\x1b\xc8\xb4\xd0\x1b\xf8\x75\xb4\xfb\x03\x99\x9d\x65\x09\x95\xb3\xd3\x56\x41\xb6\xa2\x6e\x51\x91\xb3\xef\x88\x77\x3b\x01\xa1\x71\xca\x0b\x6b\x2c\x16\xc2\xf0\x84\xb9\x64\xe3\xe8\x29\xca\x1a\x03\x3f\x93\x46\x83\xb6\x5f\x86\x97\xc8\xc5\xf9\xc1\xb9\x23\x4d\x92\x64\x5a\xec\xe0\xfe\x55\x75\xf8\x67\x1e\xa2\x48\xb1\xa9\x2a\x38\xde\x6e\xb3\xc6\x04\xb1\x5e\x91\x17\x11\x2d\xb3\x62\x30\x92\xb6\xc0\x25\x95\x1c\xaf\x1d\x07\x67\x3e\xf7\xd6\xd0\x24\xb6\x5c\xbc\x43\x8e\xcf\x07\x2c\x9f\x1c\x85\xd4\x38\x78\x5f\x48\xa3\x40\xb8\x94\x78\x6a\xf9\xe8\x0b\x07\x06\x7b\xd2\x17\x51\x73\x0c\xbb\x73\xdf\x47\xd1\x30\x11\x96\x94\xab\x0e\x34\x42\x0e\x46\x46\x51\x7a\x37\xdd\xc8\x5a\xe5\xee\x63\xe5\xb6\xcc\x61\x6d\x2d\xba\xa6\x15\xc9\x8a\x72\x76\x8a\x7c\x68\x32\xd7\x9c\x49\x20\xf1\x7c\xd2\x22\xd4\xa0\x0f\xc1\xc8\x9a\xd8\xbb\x81\xbe\x1b\x64\x3c\x1f\xe4\x6a\xa4\x3b\xfd\x4a\x62\xa1\x99\x49\x09\x10\x56\xe9\x8b\x91\x8f\x1d\xc2\xff\x04\xe0\x23\x56\xae\xb2\xa1\xc1\x36\x4c\x18\x80\xc2\x6b\x3b\xe3\xfd\xd1\xed\x6b\x38\x4a\xf1\x5d\xee\x0f\xac\x6c\x2f\x39\xff\x72\xc4\x1a\xfd\xa9\x00\xb7\x46\x2b\x48\x68\xd0\x04\x68\x38\xfb\x0f\x9f\xe4\x08\x7a\xa5\xed\xb2\xb1\x08\xe6\x70\x91\x9c\x75\x92\x22\x73\x22\x20\x35\x35\x8c\x6d\x72\x6a\x67\x58\x10\xed\x6d\x42\x43\xed\x3b\xf6\x4b\x99\xc9\xe6\x41\xbc\x79\x44\xab\x2c\x9c\x82\x20\xa2\x4d\xf4\x93\x1b\xb5\x9b\xb8\xc3\x50\x2a\xc8\x84\xd5\xea\x5d\x09\xab\x0b\x0d\xf0\x1e\x3e\xfb\x9d\x05\x83\x0e\xa2\x4b\xbb\xb1\x33\x05\x03\x02\x9f\x6d\x77\x25\x78\x8a\x19\x27\x47\xa7\x43\x94\xc3\x43\x58\xb9\xd9\x26\xb7\x38\xa1\xd5\xea\xd0\xab\x0d\xe4\x6c\x8f\xbb\x28\x36\x42\x52\x32\xa7\xae\xf5\xe8\x38\x7e\x29\xa9\xb9\xcf\x1e\xa2\xe6\x1f\x9d\xa8\xb8\x5d\x33\xe9\xe8\x14\xe2\xde\x29\x4a\xc4\x0a\x46\x2f\x08\xba\xa2\x69\x2c\x4c\x07\x35\x0b\xb4\xf2\x51\x6c\xb5\x4b\x69\xd9\xe9\xdc\x54\xea\x7a\x66\xbf\xf3\xd5\xfe\x8b\xd0\x16\x1e\x6b\x4e\xbb\x6a\xfe\xfa\xb0\xfe\x92\x2f\x98\xff\xa3\x5b\xf8\x30\x87\x08\xfb\xde\xa7\x84\x0d\x9f\xe0\xc5\xfa\xd7\x17\xeb\xb3\x02\x25\x82\xad\x17\xa9\x0b\xae\x5c\x94\xd9\x0a\xfd\x61\xde\xad\xdf\x4f\xbf\xcd\x6c\xce\xe1\xdb\xa7\xe6\x09\xec\x36\x1f\xd0\x36\x61\xc6\x55\xc3\x41\x29\x3c\xa8\xac\xbc\xa2\x23\x34\x3a\x26\x55\x88\xb8\x3a\xbc\x32\xfb\xb2\xec\xc0\xee\xa6\xcd\x4d\xad\xc3\x59\xb9\x2f\x95\x55\x97\xb5\xed\x50\xda\x98\xd2\x2d\x03\xdb\x97\x7c\x59\x88\xc6\xdb\x63\x7a\x4a\x44\xb4\x84\x89\xe7\x99\x1c\xac\x3c\x3e\x2d\x01\x1e\xd9\xa4\x1c\xd9\xa6\x83\xda\xc6\x66\xae\x34\xb5\x38\x4b\xae\x7b\x2d\x45\xca\x6d\x27\xb8\x6d\x6b\xfa\x96\x42\xa5\x24\x6c\x9e\x09\x5b\x12\x95\xda\x8f\x3a\x7b\xc2\x05\xec\x5b\x48\x6b\x13\x92\x6b\xbd\x30\x1c\x99\x1f\x4e\xd1\x9d\x44\x73\xf4\x70\xd0\x4d\xcc\xb6\x83\x0e\x4c\x5b\x78\x9c\xd9\xe5\x16\xf3\x9a\xa3\xcc\xf8\x8b\x90\x25\x41\x53\x96\x1b\xfe\x6b\xab\xf2\xf7\xac\xe2\x24\x08\xc9\xf9\xca\x83\x2c\x17\xee\x79\x07\xda\x13\xd4\xd6\xfe\xd1\xc6\xc0\xd1\xfe\xa5\x84\x61\xe4\xd1\x28\xb5\xbe\x77\x97\x83\x66\x55\x1d\x49\xcc\xe9\x0c\x45\x64\x50\x58\x24\xfe\x5b\x93\xdf\xbb\xcb\x4d\xcd\xa1\x73\x52\xfc\x51\xe1\xa4\x91\x55\x53\xfa\xf0\x7a\x12\xc9\x05\x94\x79\xcd\x61\xc6\xc0\x47\x13\xc5\x45\xe7\xac\x20\x28\x28\x59\xf9\x0f\xbb\xae\x97\x59\xdd\x07\xa2\x78\x0f\x85\x37\xdb\xb3\x0e\xd9\x91\xb2\x10\xac\xce\xa4\xbb\xd3\x5f\x96\x34\xc3\x36\x7c\xaf\xc7\x81\x41\xcb\x3f\xc7\x1a\xf3\x9b\xb6\x12\x50\x4c\xb4\xcc\xf2\x77\x6c\x94\xd2\xcd\x4d\x6d\x1c\x0c\xec\x74\x62\xba\xfa\x24\xe0\xbc\x11\xd3\x26\x17\x34\xb8\x03\xd2\xc3\xc7\x3b\x31\xa4\xbe\xbe\xcd\x2c\x78\x2b\xe1\xd3\x46\x1e\x0a\x06\x3e\x2d\x01\xb8\xf9\x48\x21\x0c\x78\x90\xf0\xc9\x5a\x7f\x7f\xbc\x07\x0e\x76\x38\xbc\x16\xcb\x00\x1f\x24\xd5\xae\x3c\x4c\x80\xbb\xca\x95\x82\xb3\x0d\xc0\x07\xcd\xbd\xfb\x14\x7e\x0d\x40\x8f\x56\xf9\xba\x87\x9f\x9f\x27\xf1\x84\xbf\x42\x8b\x54\xc9\xa6\x60\x54\xc4\x37\xe6\x59\x17\xba\x16\x7a\x54\xa6\xf8\xc6\x4c\xcd\x54\x63\xfb\xcc\xe2\x7a\x3b\x93\x26\x72\xad\x7e\xf2\x8a\xfd\x0e\x28\xe1\xdf\x4c\xec\x96\x7e\x36\x38\x01\x21\x50\x84\x45\xe8\x87\x0b\x2e\xbc\x3e\xcd\xab\x26\xe3\x51\xee\x92\x5d\xd2\x1f\x4a\x36\x91\x55\xb1\xd3\x03\x6f\xc9\xcd\x79\x41\xf7\x28\x02\x79\x0d\xf6\x2d\x23\xb1\x87\xd8\x50\x4c\x1b\x6b\x63\x45\xbf\xd9\xc0\xa0\xe0\x60\x9d\x7b\xb9\x6d\x88\xec\x72\xec\x95\x53\xed\x79\xd7\xb0\xd8\x79\x0b\x48\x81\x13\x2b\x2b\xd4\x23\x02\x7d\x5c\xa9\x3e\x29\x09\xa1\xab\x92\xfa\x43\x97\xde\x2c\xeb\x36\x1d\x16\x3f\x9c\xe1\xd0\x79\x71\xc7\x16\xd4\x69\xde\x8f\x97\x4b\xa4\x77\x30\xaf\x5f\x42\x5e\x93\x17\x59\xbe\xc8\xe4\x08\x03\xca\xed\x6f\x4e\x9b\x80\xe5\x49\x49\xf4\xfd\x79\x81\xbe\x5b\x34\x57\xd9\xe6\x06\x15\x50\x9f\x8e\x3f\xe8\x45\x0b\xf5\x17\x0c\xfa\xb7\x81\x42\xd3\xcd\xde\xe8\x2c\x77\x8d\xac\x27\xe8\x34\xc6\xc3\x8e\x1a\xa5\x2a\x77\x51\x77\xda\x36\x26\x80\xcf\x8e\x39\x44\x97\xde\xe1\xab\x75\x13\xe7\xb5\x5d\x6e\x0e\xbf\x7f\xed\x83\xbe\xe3\xff\x93\x22\x4e\x46\xf3\xfe\xcb\x73\xd9\x73\x56\x2d\x5c\x9d\xca\x02\x31\x7b\x04\xdb\x5b\x6f\x1a\xcc\xe6\xb5\x71\xa5\xd1\x54\x2e\xad\x1a\xb7\x9d\x79\xa7\x0f\x65\xf4\xfe\x2d\x02\xf3\x44\xc2\x7f\x64\x5b\x02\x7a\x3a\xa3\xc6\x95\xf9\x2c\x38\x3f\xfd\x14\x82\xd4\xf0\xfc\x62\xca\x11\x4e\x96\xc6\x6d\xdc\x74\x44\x0c\x31\x10\x66\x4e\x74\x0b\xdb\x9d\x78\x0c\xd8\x2d\xeb\x08\x32\xd8\xce\x3c\x2f\xee\xcd\x8b\x97\xbd\x2a\x9c\x63\x5f\x58\x87\xef\x61\xc6\x4f\x0f\x75\x96\xa3\x98\x84\x15\xd9\xcd\x92\x2b\x0f\xcd\x03\x43\x4e\xa1\x9b\xe7\x75\xbb\xa7\xe1\x5e\x58\x1e\xd7\x0f\xcb\xe3\x22\x09\x14\x8a\xdc\x4a\xc0\xe0\x3e\x1c\x1c\x87\xe9\xd7\xa5\x47\xd6\xb4\x88\x32\xfb\x23\xe6\xd0\xa2\xd2\x71\x3e\x04\x47\xfa\x28\xcd\x52\x68\xfb\xf2\x54\xd8\x46\xf2\x8d\x30\x06\x53\x41\x3c\x69\x44\x36\x0c\x52\xb9\x8b\xc7\xb2\xc4\x4d\x12\x84\x23\x24\x1a\xf8\x03\x3d\x0d\xdc\xa9\x8e\x71\x67\xf6\x34\x7c\x7b\x3f\x48\x9b\x98\x17\x3a\xc3\xfe\xdd\xf2\xba\x76\x37\x60\xff\x59\x65\x5d\xa2\xe2\x55\xbe\x59\xa1\x8d\x03\x8c\x00\xa5\x30\xad\xef\xc6\x3e\x73\x62\xe2\x1a\xcb\x41\x59\xd7\xd5\x99\x59\xfa\x8a\x30\xb8\x2d\x61\xfa\xce\xdf\x8d\xfd\x4c\xfb\x34\x0a\xd7\x26\x7a\x43\xda\x1f\xc1\x06\x48\x55\x8b\x98\x46\x11\x5b\x83\x17\x8f\xcd\x0d\xcc\x05\xc3\xef\x71\x54\xdc\x9a\x1d\xb8\x57\x08\x6b\x9f\x32\xff\xb6\x47\x6a\xe0\x3c\xba\x55\x1b\xf7\x73\x09\x83\x75\xc4\xbc\xc3\x49\x84\x5d\x3c\x65\x72\xc3\x11\x19\x4b\x70\x77\x1f\x27\x7f\xed\x6c\x2f\xa5\x57\x75\x96\x3e\x1e\x11\x83\xb9\x65\x0c\x9e\xfb\x11\x75\xb1\xf6\xd7\x26\x29\xe8\x6f\x16\x66\xbd\xf3\xa7\x65\x26\x78\xb7\x68\xb1\x1e\xe8\xbe\xef\xaf\x25\x1c\x24\xd5\xf2\xf5\x53\xb8\x34\x23\x9d\x21\xfe\x4d\x34\x20\x68\xbb\x99\xb5\xb6\x68\xec\xd5\xb9\x92\xfb\x0c\x33\xc1\x74\xb7\xf3\x0d\x80\x2c\x39\x38\x0f\xa9\x3e\x1a\x17\xa9\xf9\xc5\xd7\x2e\x0d\x52\x42\x77\xd5\x09\x6e\x6e\x10\xbf\xa8\x32\xe8\xf2\x8f\x22\x69\x37\x8c\x94\x53\x7e\xfe\xc4\xac\x5e\x7b\x2c\xcc\xc0\xe9\x28\x92\x96\x93\xec\xc7\xce\x07\x0c\xe9\xeb\x93\xc9\xf4\xa6\x9a\xff\xbe\x5c\x17\xc9\x62\xfb\xa2\x7d\xfc\x82\x0e\xc6\x93\x21\x3a\xfa\xeb\x7e\xa3\xb9\xf9\x7a\xcc\x04\x82\x78\x67\xf1\x8f\x50\x1c\x9f\x0f\x8a\x68\x05\xe3\xbc\xa1\x5c\x66\xa5\x8d\x23\xd0\x6b\xef\xa9\x5c\x9a\xb0\xbe\x6d\xff\x69\x4e\x48\xce\x0b\x7b\x7b\x95\xf4\xc6\xda\x21\x0a\x9c\x6a\x51\xa9\x6f\x29\x5a\x76\x3b\x39\x31\x8e\xf5\xdd\x5a\xec\x26\xdf\xb5\xd7\x24\x33\x91\x4d\x6c\x0d\xf0\x77\x07\x62\x0f\x45\x20\x84\x9d\x8d\x3e\xee\xb4\xbf\x6a\x97\x3b\xce\x15\x94\x9e\x4b\x3a\x7d\xf2\xa0\xc8\x82\x9a\x53\xcf\xcd\xdb\x4a\xeb\xc0\x6b\x8f\x3b\x48\xb9\x0e\x5c\xc8\x2f\xe0\xa7\x9e\xbb\x88\x6b\x3a\x04\xd1\xb8\x9b\x91\xc7\x7f\xa2\x04\x88\xec\x25\xdc\xd4\xda\x24\xce\x60\x60\xc6\x1c\x18\x91\xa4\x0f\xf7\x4f\xe4\xbd\x00\x2f\xdd\x25\x29\xa5\x54\x00\xcf\x4e\xc9\x8d\x3d\x48\x11\x57\xe2\xf2\xd9\x23\x06\x0c\x45\x77\x54\xd8\x7e\xe3\xd7\xd3\x8d\xa8\x7c\xef\xfc\x84\xae\xe4\xf8\xc7\xc3\x7c\xab\xdd\xc2\x9d\x18\x55\x5d\x41\x21\x8e\x75\xe6\x91\xb5\x09\x95\xdd\x12\x48\x94\x4c\x7e\x5b\x6f\xb2\x51\xd7\x2a\xdb\x89\x55\x5a\x03\x47\x16\x7c\x97\x0d\x9f\x7b\x58\x0c\xa3\x16\xe1\xd6\x3b\xb7\xf9\x5d\x8f\xad\x4f\x1a\x62\xe8\x2b\x58\x99\xd3\x4c\x89\xcb\xad\xc4\xce\x3c\xde\x89\x94\xa8\xe5\x15\xa3\xbc\x24\x35\xdd\xbd\xaa\x79\x5e\x6a\x94\x6f\xb6\xb3\xb0\x5c\x07\x44\xc4\x7d\x3a\xff\x6c\x1e\x3d\xf3\xe9\xe1\xf5\xb9\x86\x76\xc9\x31\xac\x5f\xbc\xde\x11\x0e\xad\x74\xab\x9b\x89\x68\x58\x0b\x84\x77\x62\xde\x34\x6b\x9e\x65\xf4\xc6\xfe\x6d\x4e\x54\x64\xcd\x9a\xb8\xff\xdd\x27\x8b\xb2\x12\xdc\xa8\xfb\x57\x14\x4e\xf7\x28\xfe\x82\x75\xf7\x84\x2f\x04\x2d\xd9\xfd\x48\xc2\x10\x48\xfa\xe2\x81\xfe\x9c\x67\xed\x96\x6f\x76\xef\x1e\x13\xce\xc5\x12\x01\x34\xb6\x8b\x87\x88\x79\xed\x88\x0d\xdf\x8d\x13\x3a\x88\xc5\xe0\x41\xe2\x27\x97\x3d\x5e\x50\x5f\x2f\x59\x66\xd2\xe3\xcf\xdb\x3c\xcb\xc3\xdc\xf6\x1d\xe6\x0b\x3e\x83\xf5\xf2\xd4\xfc\xf1\x99\x1a\x08\x7c\xb0\x1f\x00\x84\x4f\x3d\xf2\x5b\xac\x05\x7b\xdd\x29\xaf\x39\x7b\x70\x65\xdc\xf0\x69\x3b\xd7\xe6\xa9\xe2\x01\xcf\xa4\x32\x2c\x0e\x4e\xba\x2a\xd5\xdb\xcb\x4c\x15\xed\xf0\x39\x55\x79\x23\x40\xd1\x4f\x89\xe2\xf8\x90\x0f\xec\x8a\xc4\x3a\xf9\x3a\xc2\x0c\x2a\xa4\x27\x43\xde\x79\x70\x60\xa3\x10\xcd\x11\xb2\x9d\xd3\xce\x23\x1e\x15\x50\xf5\x3f\xa8\x5c\x86\x45\xb2\xab\x98\x51\x0d\x8b\x6a\x0b\x37\x5a\xd9\xa6\x1f\xf4\xe5\xec\xeb\xe1\xcd\xa3\x5d\xfe\x23\x5f\x30\x17\x51\xe8\x88\xc0\x08\xca\xcb\xdd\xfe\x1f\x7c\xa5\xc6\xa9\x31\x40\x71\x2d\x27\x0d\xe0\x6b\xe2\x90\xc2\x66\x9a\xf6\x5b\xee\xc8\x1e\x96\xd0\x35\x0d\xc1\x99\x10\x87\xb8\x83\xbb\x0d\xb7\xff\x9f\x4b\x0b\x26\x16\x64\x98\x1e\xce\xe6\x73\x22\x80\x26\xef\x88\xc6\x92\x27\x9f\x47\x2e\x73\x5b\x5e\xbb\x12\xd8\x88\xf6\x56\xb9\x1d\xbe\x70\xd6\x39\xac\xf8\xca\xdc\x0d\x5f\x49\x2d\x33\x2c\x9c\x96\x0f\x3d\x5c\x50\x20\x1d\x83\x28\x59\xb6\x0f\x84\x3e\xd3\x0e\x10\xf7\xaa\xb8\x9a\x6d\x08\x1c\x97\x1c\x38\xb8\x92\xf6\x94\x0b\x9e\x53\x72\x8f\x7b\xa7\xcf\x97\x20\x09\x4e\xc3\x7f\x4c\xd8\x45\xa9\xb3\x9f\xbb\xc8\xf3\xb2\x8d\xc8\xae\x30\xca\x3e\x77\x25\x20\xec\x25\xfc\x7a\x7c\xc9\xc2\xee\x5c\x38\xa4\x3a\x71\x6f\x2b\x2a\x94\xb2\x39\x0a\x04\xab\x62\xa0\x4e\xbd\xc2\x56\x78\xe5\x3e\x11\x87\xd1\xdd\xe1\xf2\x9f\x66\x8b\x1b\x7a\x41\x18\xeb\xf9\x9f\x99\xe8\x61\x73\xc2\x9f\xdb\x1f\x97\xa0\x65\x02\x81\x41\xd1\x4d\x03\xdc\x7a\x16\x61\x2b\x9b\x0c\x1c\xac\x20\xd4\x8a\xf4\xfa\xcc\x54\x56\x70\x2b\x38\x02\x52\x40\x8a\x7b\xee\xfb\x0f\x94\xfa\x68\xd7\xc9\xb3\x0b\x6f\xb7\x72\x87\xc0\xfd\x1e\x0a\x78\x98\xe8\xca\x43\xb7\x70\x4a\xb4\x23\xf7\xe1\xe7\x8a\xfd\x8e\x7a\xfb\x2c\x2a\xb8\x7b\x46\xaf\xd4\x8b\x33\x54\x5c\xdd\x5c\xf8\x9c\x90\x0e\x22\x95\xcc\xa6\xda\xe3\x4a\x91\x69\xa4\x1f\x20\x3e\x0b\xd8\x4a\x16\x8e\xb0\x79\xd4\x2d\x95\x49\x22\xf5\x6d\xcd\x3c\x17\x94\x49\x99\x41\xd8\xe5\x27\x86\x47\xef\x2a\x05\x9e\x12\xee\x20\x7a\xd2\x3f\xe2\xa3\x8d\xff\x16\xce\x7c\x89\x74\x4c\x2f\x5e\xad\xd6\xaa\xb9\x33\x4c\xae\xe4\x71\xb5\x30\x8a\x4c\x34\x89\x05\x87\x93\x76\xb3\xa5\xe6\xb7\x4a\xf5\x57\x73\x89\x29\x17\xd9\x66\xcb\x8f\xee\xb3\xe4\xf0\x9e\xb1\xed\x8f\xd8\x0e\xb2\x57\x9c\xf0\x91\x73\xb8\xcb\x30\xfd\x64\x09\x07\xfe\x25\xc8\x8f\x50\x61\x4a\x50\x99\xc2\x8e\x6d\xde\x22\x46\x10\x1e\xc7\x7c\xc4\xef\x9b\xd6\xe2\xcd\x0a\x1c\xd1\xc2\x13\x8b\x25\xd7\xdf\x1d\xf4\x1f\x0f\xfe\x26\x94\xa3\x0b\x69\xaa\x7b\xd8\x57\xd4\xa5\x19\x2d\x4f\xb5\xf9\xfe\x16\x19\xe8\xe7\x12\x74\xb8\x2c\x1f\x9e\x29\x32\xf2\xec\xec\x28\xfc\xc4\x5f\x26\x29\x0e\xde\xa8\xfe\x1e\x8e\x77\xcc\xfe\x51\xe7\x2b\xf9\x09\xd2\x62\x9a\x69\xd5\xa6\x6f\xca\x34\xf8\x83\xf7\x1f\xd5\x98\xb6\x0d\x31\x3b\xce\x7e\xd4\x12\x33\x44\xd6\xfd\x61\x51\xea\x1a\x6d\xdf\xe2\x95\x0e\x99\x45\xa8\x76\x99\x86\x1a\x83\x3c\x68\x1b\xbf\xb3\x1c\x2b\x8e\x30\xf4\x8b\x4c\x7f\xdb\xfe\x6d\xff\x29\xd2\x5e\x0a\x8d\x81\x7b\x45\x8c\x04\xdd\xf6\xcc\x57\x61\x2d\x86\xb4\xcf\x8b\x5f\xaf\xfc\xbf\xfe\x9b\x7b\xed\xf7\xa4\xb7\xd9\xd5\xb7\xd3\x8b\xb8\x8e\x83\xfc\x6c\x96\x70\x93\xec\xcb\x1e\x6c\x1f\x44\x18\x5d\x9c\xce\x41\xe4\xed\x7d\x43\xb6\x1a\x47\x7b\x67\x8f\xfb\xfb\x92\xa9\xb1\x66\x8b\x89\xe0\x06\xcc\x6d\x8a\x02\x37\x26\x9e\x02\x56\xde\x0b\x34\x41\x5b\x45\xb0\xfd\x73\x0a\x62\x79\x91\xd9\x51\xe5\xfb\x27\x3a\xf0\x42\x5b\x63\x20\x8b\xfe\x43\xe1\x7c\xad\x53\x81\x74\xb9\xa5\xf5\x19\x2e\x97\xe2\x27\xdd\x62\x8a\x47\x06\x3a\x19\xf6\x0b\x5f\x11\x90\x11\xb9\xc7\x76\x24\xfd\x13\x97\x23\x56\xef\x03\x3d\x40\xe6\x41\xf9\xf9\x15\xff\x92\x4e\xc3\x04\x43\x28\xcc\xac\x29\xe2\x29\x1b\x96\x77\xdc\xdc\xef\x38\x2b\x5f\xb2\x7f\xc6\x71\xc2\xaf\x81\xe1\x17\x21\xfa\x70\x02\xc1\x38\x4a\x1e\x5f\x6f\x69\xc8\xc3\x53\xf9\x52\x33\x7a\xa5\x7a\xac\xdc\xc1\xc0\xaa\xc8\xed\xd3\x01\xc6\x58\x09\xc7\x62\xfd\xc7\x9f\xb8\x5a\x1e\x81\xd5\xc5\xcd\xd5\x8b\x84\x8a\x22\x5d\xbc\xf7\x57\x52\x4c\x71\x02\x72\xea\x8e\x77\x22\xeb\x2f\x9d\x57\x09\x45\x67\x80\x3a\x69\xe7\xf5\x00\xa9\xb3\x57\xf4\x94\xce\x40\x48\xaf\x90\xb9\xef\xf7\x96\xe7\x85\x8c\xbd\xb2\xc4\x0f\x49\x1f\xfb\xec\xde\xc1\xf2\x3b\x92\xed\xf7\x16\x85\xb4\xdb\x6e\xab\xbb\x7e\x07\xa2\xe1\xb7\xea\xae\xad\x7e\xf1\x89\xbe\xf6\x7f\xd9\x43\xec\x21\x76\xc3\x99\x18\x27\x13\xa8\x45\xb9\xe7\xa8\x6d\x4f\xff\x71\xc7\x42\xa4\x05\xfe\x10\xc9\xad\x9c\x6e\x4c\x36\xdc\x5d\x7e\x81\xf0\x32\x9b\x58\x49\xd1\x5c\x5b\x9c\xcd\xca\x53\x78\x45\x07\x23\xaf\xa0\xa5\x44\x78\xc2\x30\x84\x59\xd0\x1a\xbd\x12\x54\x0f\x39\x47\x46\xd0\x0f\x9c\x4f\xc4\x59\xfa\x92\xff\xc9\x8a\x47\x32\x22\x8d\x32\x28\xd1\xb5\xea\x33\xf6\xdf\x77\x18\x7a\x59\xa9\xa7\x28\xd7\x14\xdd\xcc\x1c\x1d\xe4\xbc\x51\xda\xe5\x71\xd8\xe4\xcd\xa5\x83\x0f\x0b\x4b\x20\x38\x7a\xd1\x9c\xb9\x46\x9e\xab\xc6\x77\x7f\x2d\x15\xe1\x2f\x91\x74\x1a\x16\x4c\x53\x33\x6a\x70\xdd\xfa\x36\x9c\x6d\x5a\x58\x85\xac\x77\x0c\x12\xca\x0a\xcd\x99\xe2\x7a\x99\xd2\x18\x61\xf4\xc3\xe0\x57\x1c\xdc\x86\x4a\xb3\x1b\xb2\xe3\x4e\x6c\x6d\xab\xb0\x4e\x0a\x6f\x3c\x03\x8c\x95\xb9\x1d\x48\x2f\x72\x34\xbe\x2d\xbb\xe1\xe6\x2c\x31\x85\xb5\x36\x26\x60\x7e\x86\x3c\xeb\x16\xf0\x06\x89\x1b\xe2\xd4\xd1\xbe\xff\x09\x27\x5b\xa2\x5a\xcf\xd4\x4a\x77\xbb\x91\x5d\x52\x8a\xb3\xd0\xeb\xf4\xc2\x9d\x68\xa8\x41\x91\x1e\xc0\xc9\xa4\x9c\xe2\x50\xd6\xd4\x10\xcf\xce\x36\x5b\xff\x38\x69\xe8\x30\x28\xb5\xdb\x97\xa2\x92\xd8\xc2\xa9\xc6\x47\xe8\x6b\x7b\x69\xdd\xed\x56\x09\x6e\x05\x36\xf6\xc0\x68\x22\xbe\xa8\xca\x25\xc3\xe5\xaf\x0c\x5b\xa9\x9e\x14\xf4\xf8\x7f\x4c\x9d\x0d\x41\x7d\x8e\x3b\x96\xd6\x42\xa9\x05\x41\x04\xd4\x83\x27\xb9\x68\x33\x1e\x05\x83\x3f\x9f\xb7\xf4\x17\x72\x1e\xb3\xf2\xa5\x89\x2c\x30\x3a\x09\x82\x72\xcb\x2b\xe9\x00\x2c\xf1\x73\x5b\xda\xc5\x7b\xec\xea\xda\x45\x36\x59\x79\x89\x7d\xe7\x86\xaf\x10\x9e\x2d\x94\x9b\x8d\xa1\x2a\x1b\x02\x48\x6f\xa6\x1f\x2d\xcb\x0f\x80\x3b\xcf\x82\x3c\x54\x01\x42\x42\xf1\x61\xb9\x1e\xfe\xcb\xe9\xc3\xa8\x4c\xd4\xb8\x03\xcf\xa6\x64\xa5\x15\x21\x4a\x3b\xe2\x07\xb1\xf3\x00\x6d\xf2\x0b\xe7\xf6\xad\x32\x33\xc2\x17\x7c\x53\xc8\xfe\xed\x92\x97\x70\x63\x23\xb0\xf3\x86\x2c\x81\x1c\x3d\xeb\xa5\x7f\xee\x45\xea\xb4\xde\x4d\x2f\x9b\x08\x2f\xd8\xa3\xca\xad\xd7\x2f\xb8\xdf\x6e\x5e\x16\xcd\xb7\x3c\x8a\x2e\x86\x8d\x5d\xc0\xb0\x1f\x0e\xb3\x6f\x3d\xfd\x09\xae\xa3\xfe\xba\xe4\xcb\xd5\x59\x6e\x30\x92\x6e\x29\x4d\x4e\x67\x58\xfd\x7c\x8f\x44\x96\xc1\x8e\x2f\x99\x5a\x85\x8e\xb7\x31\xf1\x64\x6a\x8f\xb7\xbf\xf9\x23\xe5\x67\x16\xd7\xc4\xae\xb8\xac\xd5\x16\xac\x93\x88\xc0\xb9\x5a\x3e\x06\x22\x47\xa3\xc3\xb8\x0f\xcd\x93\xce\xe6\x49\x74\xee\x39\x72\x9f\x4e\xb4\x99\x7e\xa2\xcc\xb5\x72\xde\xab\x84\xab\x93\xa1\x66\xe7\x74\x47\xf2\x94\x5b\x9d\xaa\x13\xca\x92\x88\x9f\xb6\x7d\x47\xe4\x8e\x22\xd5\xbc\x2c\xf5\xa6\x05\xa1\xe4\xbf\x76\x64\x6b\xae\x26\x25\xd2\x75\x30\x3c\x67\x4f\x82\xd3\xe8\x2b\x45\xef\x19\xb4\xf0\x21\x3f\x6f\x1e\x56\x8e\x6c\xf8\xf9\x74\xdb\x51\xed\xbd\x86\x55\x04\x4a\x52\xe5\x00\x79\x15\x45\xdc\x39\x61\xf8\xb9\xdb\x50\x18\x06\xb0\x94\x16\x03\x40\x9b\xa6\x23\xc5\x67\x80\x7c\xfd\xac\x28\x3d\xb5\x98\xd9\x71\x4d\x38\xb5\xdf\x8a\xa1\xdb\x6b\x90\xe3\xf7\xba\xef\x82\xaf\x24\x96\x29\xca\xf5\xb1\x86\x3e\x18\xe4\x11\xe7\xc3\x75\xd2\x88\xe0\x92\xb7\x9d\xec\xa2\x40\xb2\xf7\x5f\x22\x79\xd9\x0e\x16\xea\x03\x27\xdb\x8a\xb0\xa2\x87\x37\x28\x92\xb3\x7c\x82\xf2\xad\x00\xeb\xb5\xb6\xc6\x42\x56\xf9\x6b\x7d\x3e\x93\x7f\x49\xd1\x49\xb9\x96\xad\xb9\x29\x84\x5a\x70\x45\x21\x5a\x35\x55\x08\x43\x84\xbe\xff\xed\xbd\x6b\xb3\xd9\x5f\x09\xe4\x84\xb8\x2f\xa4\x3c\xa9\xf7\x53\xdf\x13\x5a\xd8\x8a\x60\x44\xd3\x70\x63\x97\x13\xf2\x0a\x58\xf2\x14\x5c\x46\xed\xb0\xb6\xbd\xd9\x6d\xae\x99\xf2\xae\xb6\x63\xe2\x17\x93\x99\x6c\x9d\x7d\x72\x33\xc7\xf9\x8e\xe4\x61\xb0\xc8\x39\x88\xfe\xbb\x9d\x7f\xf4\x27\xe8\x0e\xe1\xe6\xde\xad\xdb\xd9\x57\x4f\x1e\x82\xd4\x30\x2b\x77\x7c\xaa\x1c\x1b\xd4\x21\x8e\x31\x64\x90\x3d\x7c\x80\x3c\xb7\xc9\x71\xe4\x33\xda\x55\xf4\x55\x6c\x81\x08\x9e\x76\x20\xc2\xa3\x40\x33\x88\x77\x90\xc6\xc5\x95\x04\xed\x5c\x8c\x04\x70\x1b\x23\x0b\xd3\x2e\x1d\x8a\xcd\xec\x95\xf3\x20\x2e\x6f\x49\xec\x4f\xd5\x28\x18\x0e\x0a\xfe\xa9\x06\x41\x83\x1d\xeb\x9c\xc9\x54\x02\x1c\x79\x2e\xa0\xce\xfb\x26\xff\xc4\xc8\x77\xd1\x42\x04\xe1\x67\x59\x44\xcb\x78\x5a\x89\x74\x90\xd5\x83\x1c\x4d\x07\xa1\x90\x99\xa5\x61\xb0\xda\x98\x29\x46\xc1\xf9\x59\x82\x40\xae\x4e\x70\xa8\x30\xe5\x89\xc5\xa8\xb9\x05\xd4\x10\xec\x60\x36\xe1\x57\xff\x02\x52\xc1\xb3\x1f\xda\x46\x62\xf7\x2a\x6c\x69\xc9\xf7\xc9\x9e\x4d\x4d\x7f\x2a\x99\xa1\xf6\xf7\x25\x75\x65\x64\x4e\x3f\xfc\x0c\xe5\x80\xac\xe7\x3d\xec\xcd\x88\x63\xcb\x8d\x67\x5e\xdf\x24\x0c\xd5\x96\x0b\x88\xbb\x2f\x3c\xcf\x77\xf2\x1f\x21\x0f\x12\xed\xfc\xfe\x99\xd2\x28\x86\x7a\xed\xc2\x9c\x66\x6d\xe7\x50\x27\xc0\x06\x98\x96\x42\xaa\x49\x34\xbf\xb1\x6d\xd0\xe6\xa1\x71\xbc\x9b\x3b\x34\x30\xe9\xb1\xf2\x94\xf4\x1c\x5c\xc9\x97\xbb\x22\x81\xf7\x3f\xf2\xdf\x0e\x26\xa6\x14\x5c\x17\xda\x41\x58\xdf\xa9\xce\xe5\x68\x0d\x4b\x17\x22\x98\x2e\x49\x2b\x6d\xc7\xa5\x57\x2b\x00\x12\x44\x80\xf1\x28\x08\x3f\x0c\x97\xfc\x9f\xb3\xda\x1f\x3a\x0e\x95\x82\x7d\x87\x4a\x42\xb6\x07\xef\xcf\x36\x13\xc5\x02\x52\xa6\x83\x8f\xca\x91\x17\xc1\xb2\xf2\x45\x3c\xb7\xe3\x65\x71\x93\xbd\x44\x0c\xe4\x6c\xf9\x37\xa6\xb0\x0f\xb4\x59\x5e\x77\xeb\x66\x18\x6e\xe6\x10\x9a\x5d\x6a\xb2\x6c\xbb\xf2\x7b\x8e\xc2\xfd\x4a\x1c\x4d\xe8\xb5\x3f\xdf\x32\x4e\x86\x8d\xb1\x06\x78\x3c\x0a\x85\x8d\xd9\x7a\xd0\x8c\x62\x8d\x63\x2f\xf7\x8d\x9d\x4e\xc8\x6b\x27\xa5\xc0\x2d\x26\x74\x7a\x55\x3f\x0c\xce\x99\xac\x94\xb3\xac\x6a\x8b\x9a\xe9\xaa\xfd\x5a\x5d\x6c\x67\xe6\xae\x7b\x06\x26\xe2\xd3\xe7\x60\x50\xae\x61\x36\x02\x6f\x87\x62\xcd\x1f\x4f\x93\xae\xdd\x90\x58\xf7\x93\xb0\xfc\xc3\x6d\x6e\x98\x2a\x65\x97\xa3\x48\x49\x83\xd4\x2b\xc8\xdd\x89\xd5\x44\x1e\xd2\x01\xf7\x8d\x93\x6d\xd3\x1d\x4d\x18\xd8\xeb\x1c\x18\xec\x37\x5f\x9e\x1d\xe2\x4c\xff\xc4\x4f\x4c\xbb\xd7\xeb\x25\xa6\xa6\x1d\xe1\x67\x21\x1f\xf3\x48\x03\xdd\xbc\x77\xeb\x22\xc2\x87\x10\x85\xd3\x45\x4e\x7b\x7d\x73\xa4\x58\x2f\xbd\x10\xee\xa2\x29\xb0\xab\x9e\x82\x25\xac\x50\x57\x4f\x25\xe9\x1b\x21\xb0\xfb\x94\xcf\x36\xca\x77\xbf\x7c\xb6\xca\x93\x0a\x9c\x6b\x65\x94\x58\x13\xab\x21\x0b\x49\x3f\xd6\x87\x89\x11\x8e\x00\xc7\x38\xa3\x38\x2f\x5a\x5d\x1d\xf6\xf8\x7f\x4c\xac\xf2\xe3\xa4\xef\xd9\x29\xb9\xcf\x05\xe9\x9a\xd7\x79\x33\xf4\xca\x3e\xa1\x73\x74\xf5\xf4\x59\x2e\x66\x21\x67\x08\xc0\x55\xf7\xb5\x49\x1e\xba\x51\x0c\x8d\xa3\xc9\x93\x20\x97\x4f\x17\xc8\xd1\x22\xfb\x64\xb8\xa5\x04\xf1\xc5\x11\xb3\xf1\x0c\x05\x14\xb6\xa1\x87\x0f\x52\xae\xb2\xea\xbc\x0a\x03\xe6\xf9\xd6\x0d\x34\xab\x8c\x42\x98\x8e\x2c\x0a\x17\xb7\x16\xc5\x7c\x48\x34\xa8\x99\xa7\xd4\xfc\x4f\xf7\xe2\xb9\xf6\xe1\x7f\xc0\x0f\xd4\xd6\x79\xb9\xfc\x07\x77\x7d\x3c\x72\xa6\xf9\x97\x9f\x7d\x4d\x04\xc5\x82\xac\x87\x55\x90\x59\xa6\xfc\xab\xb9\x91\xcf\x2c\x87\x66\x5b\x2e\x4a\x8b\xcd\x0a\x2e\x85\xd1\xcf\xff\x4f\x68\xea\xcb\xbc\x89\xe5\xd4\xee\x3d\xb8\x6a\xb1\xc3\x8b\xe2\x75\x52\x12\x37\xea\x97\xb8\xf9\xec\x80\xfb\x51\x70\x47\xb1\x32\xc7\x72\xc8\x32\x67\x2c\xb5\x88\x22\x2a\xe5\x23\x56\xf6\x2b\xa2\xe7\xe3\xf1\x26\xad\xd9\x98\x64\xa6\x32\xb2\x68\x47\x33\xc8\x9d\xc5\x87\xf3\xed\x42\xb4\x63\xc4\x19\x9a\xcf\xd6\xcd\xd9\x4a\x60\x1b\x42\x32\xc9\x98\xb4\xbe\x51\x1c\x82\xe7\xe2\xe9\x1b\x51\x89\x3c\xdd\xf3\x58\x21\xb6\xbc\x99\x9e\x90\xa9\xfa\x23\x47\x6a\x59\xf6\xea\x39\x66\x6d\xd6\x8a\xea\xc8\x1c\x94\x3b\xed\x63\x38\x29\xb1\xce\x33\x5c\xf1\xef\x83\xc1\xe1\x3e\xd9\xd7\xae\x00\xb6\x7f\xbd\x68\xe0\xe8\x9b\x17\xa5\xaa\x47\x04\x88\x1d\x5b\xc4\x04\xca\x46\x1d\xfe\x8c\x6e\xe5\x8e\x86\x90\xae\x74\x3d\x50\x58\xb6\x08\xde\x1b\xae\xe1\x3f\xeb\x00\xa0\x47\x27\x91\x56\x75\xca\xa7\x06\xe3\x1a\x9d\x7d\x68\x5e\xc3\x6f\x76\xe3\x44\xd1\x5d\x8b\xe4\xea\xb8\x84\x22\xab\xcb\xdf\x14\x2b\x61\x7b\xd7\x25\x41\xff\x4d\x27\x25\x9e\x89\xa7\xa2\x2f\xc0\x63\x09\xa2\xd4\x4d\x61\xa8\xe7\xe7\x86\xa5\xc8\x71\xaf\xe2\x47\x45\xb3\xd1\xc9\x75\xb0\xb3\xca\x23\x93\xe1\x82\x2d\x25\x64\x05\xa9\x89\xf9\x35\x72\xc5\xed\xd0\x91\x35\x63\x7f\xe7\x10\xd4\x42\x0c\x0a\x8f\xb0\x77\xfe\x16\x3b\x53\xf1\x15\xdf\x14\xda\x0c\x8c\xf6\xc7\x18\x5f\x7f\x70\x2f\xd1\x88\xf1\x53\xbd\x20\x7f\xdf\xba\x90\x50\x67\x91\x9a\xfa\xae\x7f\x97\xd5\x14\xbd\xd4\xb5\x72\x92\x2c\x8b\xba\x7d\x98\xba\x21\x3d\xc0\x5b\xc9\x7c\xd6\x66\x7e\xe6\x29\x21\xca\x98\x4f\x8b\x6f\x45\xaf\x7a\x31\xeb\x50\xba\x58\x68\x25\xd9\x56\x3b\x23\xcb\x0f\x40\xdb\x98\xcb\x7e\x52\xd4\x7f\x1d\xa5\xf9\xcb\xc5\xd8\xf3\x0a\x6f\xbe\xcb\xfe\x70\xc7\x3d\xd9\xc5\x91\xaf\xfb\x74\xdf\x9f\x0b\x81\x93\xb2\xdf\x3a\x3f\xf4\x07\xb0\xee\x56\x2e\x4c\xde\x30\xf2\x98\x04\x76\xab\xd5\xd6\xd0\x00\x68\xb4\x1e\x24\x6d\x69\x24\x14\xc2\x2a\x6b\xed\xc2\x5a\x60\x72\xd9\xa2\x83\x89\x7a\x94\x84\x17\xf2\x3e\x1d\xd1\xc8\xa9\x57\xf7\x87\x76\xae\x8d\x78\xcf\x20\x0c\xa1\x63\x8b\x5e\x91\xdc\x2c\x6f\xb6\x3c\x40\x09\x1e\xe7\xfe\x81\x54\xf3\x02\x70\x8e\x48\xfe\x3a\xd0\x1e\x72\x94\x34\xea\x6c\x74\xa1\xb4\x98\xb7\xb7\x97\xe5\xfb\x01\x56\xe1\xc3\x3b\x30\x1e\xf8\x7b\x09\xa7\xca\x32\x2a\x07\x7c\xa2\x8d\xd5\xde\x86\xab\xbb\x82\x1c\xad\xe9\xba\x69\xec\x74\x04\xb6\xb3\x27\x50\x10\x1c\x46\x86\x73\x9d\xe0\xcc\x2a\xb6\xdf\x16\x9e\x67\x1b\x25\x66\x1b\x72\x2e\xc5\xd5\x52\xea\xaa\x46\x80\x2b\x03\xe9\xd6\xba\x28\x40\xce\x4e\x11\xa6\x8c\x2f\x3f\x0b\xde\x86\x12\xac\x34\x8b\x59\xfb\x4d\x0a\x4f\x1c\x8a\xc7\xa6\xf3\xb1\x69\x16\x5c\x31\x3f\x6b\xed\x65\xdf\x9b\x87\x9d\xe6\x89\xab\xbb\xa5\xf3\xe4\x04\x46\xcb\x03\x30\x74\x0e\x6e\x14\xad\x7e\x6d\xd9\x39\x09\x06\x5a\xb9\xc9\xac\x62\xf9\xe8\xae\xb2\xe6\x87\x74\xaf\x7b\x5d\x15\x47\x67\x47\xe3\x24\x95\x9a\xad\x11\x2f\xa2\x7c\x15\xf1\x82\xab\xea\x97\xc5\xf7\xbe\xf0\xff\x25\x83\x21\x3f\x45\x9b\x5c\x72\x0e\x61\xf1\xa0\x58\x48\x58\xbd\xc8\x24\x2f\x8d\xda\xb5\xe6\x26\xd5\x9e\x85\x49\xce\x9b\x68\x0b\x41\x7b\xb0\x7b\xf4\x0a\xa9\xf0\xa2\x2a\x6d\x4e\x00\xc5\x7d\xb1\xeb\xaa\xb7\xa3\x34\xef\x93\x9f\x64\x77\xff\xd3\x01\xbb\x9e\x67\xaa\xcf\xdf\x29\x3c\x55\xc2\x7e\x93\x5b\x5d\x87\x82\xc2\x4b\x77\xff\x1e\xda\x8d\x4d\x32\x53\x08\x57\x3a\x6c\xbd\x41\x46\x3b\xec\x0a\x69\xa4\x86\xf0\x56\xbf\x39\x3f\xb5\x47\x9e\x7f\x47\x6a\x4e\xec\xe4\x31\x60\xd1\xe4\x15\x34\x2f\x05\x41\x38\x7a\x12\xac\xdb\x6b\x8d\xb1\x95\xce\xc6\xaa\x36\x64\x2c\x37\x55\xdc\xd6\x56\xaa\x61\x1d\x73\x1d\x27\x05\xd7\x8d\x76\x2d\xe9\x70\x65\xbe\xeb\xf3\x66\x75\x84\x40\xab\x07\x7d\x44\x19\x1c\xf0\xd4\xbc\x98\x15\x9f\x0c\xf8\x02\x1e\x77\xd7\x22\x76\x74\xb6\xdf\xda\x7f\x90\x71\x0f\xf6\x12\xf8\xa7\x0e\x4f\xe1\x78\x90\xe3\x36\x69\xc2\x05\x49\x84\x8e\x42\x0d\xae\xfe\xf9\x94\xd8\xbd\x03\x27\x18\x8a\xb2\x16\xad\x11\xcd\x21\x8a\xc9\x55\x6b\x12\x1b\xbe\xe9\xaf\xf9\xc7\xc2\xad\xbd\x04\xdd\xa1\xf5\x8c\x9a\x2b\xf6\x87\x4c\x71\x11\xbb\xeb\x8f\x3f\xf3\x2d\xe4\x07\x73\x85\xb8\x52\x1e\x76\x1f\x75\xdb\xc8\x74\x50\x37\xdc\xb7\xf8\x4e\x82\x45\x08\xb8\x16\xad\xc6\x27\x5f\x04\x57\xed\xc8\xe3\x97\x77\xc7\xdd\x32\x2a\xd1\xd9\xfc\x43\x95\xe3\x11\x57\x3f\xe1\xb2\xd1\xd5\x78\x66\x5d\xa5\x3d\x1a\xec\x92\xd9\x6b\xb2\xf0\xf5\x16\xd2\x8a\x73\xb1\x2b\x9a\xa7\x47\x17\x5c\xc1\x2e\x5a\xb3\x70\xbc\x21\xf5\x39\x6f\x9e\xf7\xe0\xcb\xa5\x6a\x6a\x96\x25\x7f\x69\x2a\xf2\x2e\x7d\xda\x0e\xdd\xa5\x66\xcc\x83\x4d\x55\x5d\x68\xc4\x0b\xa2\x3e\xe1\x77\xfc\x82\x52\x94\xc7\xe5\xc7\x31\xb6\x61\x35\x18\x08\x0f\x75\xa6\x33\xcc\x2e\x15\x47\x8a\xbd\x8f\x4e\xad\x40\x96\xf0\xb3\xbf\x37\xe1\x6a\x74\xa3\x9b\x46\x6f\x4b\x33\xfd\xb2\xa2\x59\x38\x2d\xa9\x54\x34\x9c\xf7\xc5\x10\x70\xed\x42\xa8\x16\x42\xef\xe3\x12\xcb\x8e\xd5\xce\x4b\xd1\x25\x2f\x22\x1e\xf6\x4a\xf9\xcd\x66\xcd\xeb\x37\x58\x1f\x1b\x5f\x93\xeb\x56\x19\x73\xa1\xa7\x0a\xfb\x67\x62\x67\xf0\x3b\xdc\xb5\x2a\x0e\xef\x5f\x14\xee\x5b\x1b\x7a\x3a\x21\xdd\xcf\x5d\xda\x4d\x5c\x95\xe6\x23\x28\xb6\x73\x04\x9f\x1e\xd3\x4d\x06\x49\x22\x09\xf1\xbc\xd1\xd6\xfa\x62\x8d\xfc\xc2\x2c\x25\xa9\x1f\xc7\x3a\x22\xeb\x42\x1b\x83\x33\xb8\xce\x8b\x48\x82\x67\x0b\x5c\x3c\xa7\x98\x46\x43\x61\xd3\x72\x80\xfc\x42\xe1\x6a\x54\x84\xf4\x99\x05\x9f\xe6\x10\x5f\x43\xd9\x49\x86\x05\xd0\x55\xc5\xaa\x1e\x4c\xf3\x3c\xc8\xc3\x83\xde\x3f\x44\x36\x37\xbd\x9f\xeb\x25\x43\xd8\x5f\x90\x6a\xb1\x4f\x91\x41\x75\x48\x3b\xee\x1e\x12\x2f\x0e\x04\xb7\xb0\xc0\x47\x24\x16\x53\xb1\x0f\x2a\x02\x5c\x90\x4d\xdc\x54\xac\x2a\xb4\xb4\x53\x5d\x57\xd2\x3e\x4a\x18\x5b\xb8\x27\x45\x6c\x7d\xde\xed\xfe\x33\x2d\xf4\xcf\xd5\xe5\xab\xb6\x37\x11\x29\xdf\x9d\xba\x1c\xd3\xc2\x31\x0e\x7c\xcf\xec\xf1\xa6\x18\x47\xe7\x8d\xdd\x75\x0f\x05\xbc\x2d\xd6\x30\xb2\x05\xc0\xe2\xc7\xfb\x57\x04\xd2\x7a\x44\x17\x7c\x0c\xce\x5d\xa5\xb6\xc0\x36\x15\x92\xb7\x93\xd8\x7c\x35\x8c\x7c\xad\x1b\x66\x49\x01\x1a\x37\xe9\x05\xd6\x58\xb9\xd1\xc5\x06\x34\xf3\x41\x1a\xf7\xc3\x0b\x02\x96\x9b\x2b\xf9\xb6\x76\xfc\x6b\xc7\xb7\x55\x27\xa1\x0f\xa8\xcf\xa2\x6b\xf7\x79\x79\x47\x3a\x09\xdd\x97\xa3\x5d\xee\xfd\xd5\xf5\x18\xc7\x68\x93\x8f\x25\xcc\x3f\xac\x25\x7e\x91\x53\xb0\x26\x9f\xce\x2f\x77\xd8\x7a\xdc\xbd\x0e\xf3\x43\x31\x91\xcb\x2f\x68\x68\x08\xa6\x77\xe3\x86\x84\xb6\x77\xf1\x11\x14\xe1\xd9\xe1\xa6\xbf\xd1\xad\x61\xd9\x2c\x4b\x88\xd9\x5e\xa6\xdd\xab\xec\xd9\x03\xdb\xe1\x84\xe4\x33\x4b\x5d\xd2\xb3\xc6\x39\xb3\xed\xc1\x85\xf9\x28\x2a\x6e\xe6\xf0\x16\xfb\x93\x1e\x10\x12\x20\xef\x5a\xd1\x52\x6b\x12\xf9\x56\x58\xca\xc6\x0a\x04\x8a\xc8\x9f\x36\x32\x11\x58\x85\xbf\xb6\xeb\x2a\xdd\x86\xe5\xc7\x1a\x8f\x84\x11\x40\x89\xa1\xa8\x44\x14\xb5\xfe\x35\xc5\xf9\x7d\xce\x2d\x89\xf6\x8a\xc6\x19\x9d\x95\xce\x6f\xec\x51\x91\xdc\x76\x8f\xd6\x86\x33\x6f\x19\xc3\x4e\xce\x02\x9c\x66\x2e\x88\xc4\x7a\x61\xba\x77\x2f\xe2\x4b\x8d\x68\x26\xfc\xd6\xf1\xaa\x9d\xfb\xd6\x98\x06\xd9\x2a\x85\xeb\x77\x10\xe3\x9f\xd6\xd9\x2f\x4d\xf1\x73\xff\x5c\x93\xad\xf9\x1d\xb9\xb3\x3e\x43\xdf\x6d\xfd\xed\xaa\x2a\x05\x31\x2b\x9a\x8f\xe6\xee\x26\xfa\xab\x28\x17\x27\x34\xfa\x01\xff\x12\x57\x65\x8e\xb3\x08\xcd\x6c\xdc\x74\xc3\x47\xa4\x95\x67\xeb\x69\x61\x4c\xe9\x6f\x99\x1d\xf4\xbb\x22\x56\x04\x0a\xfb\x79\x6d\xb7\xc6\x37\xf9\xbf\x47\xe7\x34\x60\x64\x47\x82\x2d\x12\xfa\x38\x71\xcd\x2b\x6f\x4d\xca\xda\x0f\x8d\x56\xef\x2e\x1a\x62\xc2\xbc\x39\xb5\xdc\x15\x59\x8d\x78\xeb\xc9\x3e\x57\xaa\x57\xf4\xbd\x57\x3b\xb6\x8f\x35\x87\x54\x48\xd3\xd6\xf4\x54\x86\x33\x5e\xb3\x49\x90\x2e\x0f\x7e\x9c\xd5\xde\xbb\x1e\xf0\xed\x20\xd7\x1d\x94\xe9\x18\x66\x2e\x4a\x6b\xee\x6a\xe8\xb0\xba\x3a\xc8\x80\x24\x8e\xd7\x4d\xba\x26\xef\x66\x75\xfa\xfe\xe3\x9e\x99\xee\x17\xe3\xde\xb0\xdc\x15\x64\xf9\xe1\x6b\xdf\xb5\x8b\x0c\x31\xfb\xf4\x8f\x4a\xbc\x6a\xad\x89\x61\xcb\x1b\xad\x6f\x7f\x93\xbe\xbe\xcd\xfa\xcc\x88\x97\xc2\xf9\x61\xe2\xc0\x7e\xdf\x25\x2a\xdf\x2f\xe2\xbe\xf0\xf8\xcf\xdc\xf1\x9b\xa9\x33\xfe\x08\x10\x03\x75\x72\xa2\xf6\xd4\xad\xe6\xc6\x90\xcd\x7b\xe4\xaf\xf7\xb9\x99\xa3\x82\x77\xfa\x3f\xae\xc0\xae\x51\x73\x62\x65\xb3\x34\x7f\x85\x9e\xd7\xb1\xe0\x57\xd6\xcc\xeb\x05\x6a\xb5\x3d\xde\x67\x30\x5f\xf4\x78\x2b\x43\xfd\xaa\x82\x0c\xed\x67\xcf\x72\xbb\x0b\xb6\x65\x87\xd9\xb1\xff\xdb\xd4\x32\xba\x2f\xaf\x48\x78\xbc\x26\x46\x08\xb5\x20\x3c\xef\x8b\x3d\xf3\x8c\x47\xec\x48\xce\xcc\xf1\x0f\x42\xfc\x7c\xb2\x61\xdd\x19\x1b\x75\xc2\x3d\xec\xe1\x87\x69\x48\x95\x72\xc8\x87\x7c\xdf\x13\x61\x72\xd5\x7b\x72\xfa\x25\xa7\x7e\x96\x1b\x26\x9c\x8d\x48\x89\x81\x53\x0a\xa1\xa6\x23\xac\xca\xd0\xca\xa7\x50\xa3\x7a\x34\x25\xc7\x8e\x9e\x1d\x11\xc2\xd5\xc8\x99\x39\x52\x59\x4e\x0d\x6e\x6c\x1b\xe7\xc8\x03\x3d\xac\xce\xb7\xb0\x13\xc3\xd1\x47\x38\x18\xef\x2d\x4f\xb7\x5a\x2e\xd2\xb4\xf7\x72\xf6\x25\x42\x86\x76\x2b\xcd\x0f\xd2\x21\xdf\xfe\xff\x23\xeb\xc3\x4d\x70\xef\xce\xf4\x30\x8c\x18\xa7\x70\xee\xb3\x3d\x9d\x57\x31\xb7\xd6\x4a\xc8\xa7\x72\x77\xa3\x75\xbb\xdc\x48\x71\x6f\x10\xdf\xae\x63\xfc\x75\x70\x42\xf1\x33\xe9\xde\x7a\x06\xe2\xd5\x77\x47\x9f\x0d\xd4\x80\x5b\x28\x5d\x35\xfb\xb3\xb3\x95\x23\x48\xbe\xd3\x6b\x91\xe8\x15\xf4\xb4\x42\xa5\xff\xba\xf2\x33\xf6\x9c\xfe\xa1\xe2\xc7\xd5\xb8\xfe\x83\x7b\xae\xbe\xb3\xbb\xdd\xcc\x83\x9d\x33\x4f\x40\xef\xf3\xc2\x41\xb0\x69\x67\xd6\x5e\x64\xb8\xb5\x0f\x38\x1c\x86\xf0\x99\xdd\x70\xc3\x04\xed\xcc\xe4\xce\xb2\x02\xc1\x26\x6b\x27\x7c\x18\x97\x7a\x07\x47\xff\xac\x1f\xe6\x4c\x9c\xae\xa3\xb2\x1d\x90\xd9\x12\xd9\xdd\x4e\x96\xdc\x71\x6a\xa9\xa3\xcc\x16\x41\xdf\x84\x9b\xe9\xc5\x32\xd1\x0e\x51\xba\x64\xb5\xa6\xd7\xb7\xb7\x99\xfb\xa4\xbb\x65\xcd\x3c\x5b\x97\x8a\xbe\xeb\xef\xe1\x78\xb2\x20\xe4\x96\x42\x3f\x2b\x5b\x6b\x0e\xc1\x8e\xf5\x25\x62\x09\xcc\x56\xad\xe0\xcf\xfa\xab\x34\x38\xfe\x0b\xa2\xc3\x1f\x72\xa5\x94\x72\x41\x4b\x24\x6c\x5e\xee\xb7\xce\x53\xca\x2a\xd9\xaf\xd2\x9e\xa7\x5b\x6e\x2f\xf7\xc0\xb3\xf7\x0e\xe1\x1c\xb4\xb7\x71\x0c\xd3\x36\x3a\x7f\xe2\x80\xdd\x2e\x69\x03\xf2\xa0\xf9\xc2\x94\x3e\x3a\x54\x3f\x3d\x84\xe9\xbe\x84\x45\xc3\x8f\xce\x79\x34\xaf\xd5\x68\xb3\x80\x43\x53\x59\xd0\xca\xe5\xa9\xbd\x98\x53\x8a\x0c\xa8\xc9\xc7\x61\xde\xe8\xde\x3f\x53\x69\x82\xe6\x08\x8d\xef\xfd\xa9\x8e\xd5\x43\x5c\x78\x0c\x37\x28\x02\x5e\xe8\x1c\xb4\x46\x58\xb7\x67\xfb\xdc\xca\xf6\x61\x35\x0d\x92\x83\x58\xa0\x76\xcc\x2b\x12\x03\x46\x5e\xfa\xa4\x47\xe1\xf1\x9b\x0b\x4b\xec\x7f\x40\x79\xba\xb0\xf3\x80\x05\x39\xf3\x2a\x74\xbc\x8f\x21\x32\xea\xd7\xa5\x0d\x14\xf1\x91\x7d\x70\x45\x0f\xee\xb7\x55\x2e\x3f\xd7\xc4\x61\x53\x0e\x62\xe6\x53\x56\x64\x5a\x58\xd1\x08\xa0\x96\xb9\x42\x58\x45\x0d\x32\xdc\xc7\xc9\x3c\x32\x45\xa8\x9c\x69\x79\x69\x74\x2b\x4d\xad\x35\xdc\x6b\x34\xe1\x81\xa0\x7a\x56\x22\xcf\x64\xc1\xc7\x87\x4c\xc2\xc2\xc2\xcf\x5a\xed\x40\xae\xd3\x25\x1f\xd9\x1a\x97\x67\x1f\xf1\x26\x7d\x8d\xd8\xa1\xf4\x1f\x8d\x1a\x97\x48\x9f\xb0\x15\x50\x0e\x5e\xbe\x7d\x8b\x7b\xb2\xeb\xcc\xed\x1b\xf9\x81\xc8\x4f\x7f\xc4\xad\xcf\x14\x7e\x0f\xec\x5d\x5d\x47\x9c\x95\x61\xbd\x39\xa3\x1b\x78\xf7\x37\xc2\xac\x31\xa4\x95\x8f\x4d\x34\xc0\xf7\x28\xd9\x14\x3d\x1c\xf9\xaf\x56\x20\xf0\x82\xeb\x0e\x69\xe1\x8e\x38\xb3\x5c\xcb\xd0\x62\x1b\x05\x69\x1f\x79\x26\xf4\x7d\xa8\xef\x82\x42\x8e\xf2\x90\x2e\x64\xeb\xce\xbd\x3a\x7d\x06\xd9\x85\xbf\xed\xd8\x12\x4e\x9a\xb1\xad\xce\x2d\x4f\x7b\x94\x3b\x07\xca\xc9\xe8\xd6\xa3\x59\x2f\x5f\xd6\x14\x11\xe2\x2f\xab\x32\x34\x19\xe1\x6b\x56\xe5\xbd\x0d\x2e\xcd\x46\xab\xdb\x21\xad\xfd\xf7\x83\x27\xf4\xc9\x22\x98\xd8\xc2\xbb\x0e\x98\xed\x8c\xb8\xa9\x1f\x4e\x9e\x92\x79\xd7\xbb\xb2\xe1\x2e\xff\x55\x96\x09\xd8\x6a\x13\x57\x60\x1b\x3a\xba\xed\xde\xdc\x6c\xe2\x33\xdd\x9b\xde\xff\xb7\xfa\x7e\x13\x0b\x79\x63\x83\x6d\x59\xba\xee\xe6\x93\x22\xf1\xca\xfa\x61\xba\x9a\x20\x2d\xfd\xdb\x53\xaf\x61\x0d\xbb\x4e\x18\x74\xac\xa7\x82\xe9\x6f\x3f\x96\x15\x0b\x78\xdd\x47\xaf\xc7\xae\xe5\x40\x6b\x08\xfd\xf0\x52\xe3\x9a\x44\xa0\xb2\xf5\xa4\xe0\xdd\xb6\xd9\x21\x90\x80\x47\xfb\xc7\x5e\x27\xf2\x96\xde\xbf\x50\xb9\x77\x91\xc7\xa6\xad\x82\x4a\x25\x3e\xa6\xbb\x41\xb5\x0a\x23\xba\x79\x00\xf4\xe4\x5e\x11\x6b\x3e\x45\x8b\xb7\x8a\x8f\x1e\x6d\x11\xf3\xc4\x0a\x44\x86\x4e\x40\xd5\xa3\xaf\x0f\x81\x22\x05\xd0\xdf\x58\xdf\x0b\x7f\x4e\x3f\x39\xa7\x46\x94\x5f\xa0\xad\x2c\x4c\x6e\x2b\x23\x22\x6e\x5c\x48\x2f\xd0\x30\x36\xef\x27\xcb\xf0\xa3\xb6\x41\xb6\x6f\xe6\x47\xe1\xc0\x5a\x27\xc6\x91\xd7\x36\xa4\x0e\xcf\xcc\xbe\xd0\x9f\xec\x20\xd5\xf1\x48\xf4\x54\xde\xe1\x38\x25\xc6\xd3\xe7\x9a\x44\x32\xd9\x69\x7d\xb1\xd7\xb9\x92\x49\x0e\x51\xb4\xc8\xba\xaa\xf5\x6d\x11\xaa\x8d\x2d\xac\x33\x3e\x11\xeb\x09\x17\x2a\x5f\xec\x28\x48\x68\x57\x58\xef\x4b\xb3\x15\xe4\xa5\x05\xaa\x86\xd8\x18\x62\xd3\xdb\x1d\xb2\x69\xf9\x8d\x6e\x38\x12\x1f\xa8\x45\x8e\x8b\xf2\xa5\xf5\x17\xb9\xba\x22\xb6\x44\xf3\x67\xe6\xfd\x7a\x39\x41\xaa\xc0\xaa\xf4\xa7\xb5\x44\x67\x1e\xe5\xf7\x0a\x33\x0e\x75\xdd\x91\xbe\x62\x45\x05\x72\x94\xd4\x8a\x1f\x3f\x1e\x70\x33\xc9\x00\x5d\xba\xb2\xf5\xae\x74\x8d\xc3\xfd\x1c\xfd\x96\x5b\x63\xa9\xb5\xae\x9d\xd2\xc9\x85\x3d\x2e\x0d\x28\xf7\x90\x06\x18\x0e\xf1\xc3\x29\x1c\x3a\x26\xb6\xe4\xd4\x08\x5b\x41\xab\x16\xdd\xca\x79\x19\x18\x2c\x29\x1c\xe2\x86\x77\xa1\x43\x9c\xf0\xdc\xf9\xfe\xae\xf4\xe3\x44\x6b\xa0\xc1\x75\x65\xce\x0c\x45\x04\xb3\xa3\x1c\x33\x58\xe3\x00\x30\xfe\xa6\xc6\x27\x96\xf1\x0f\x1c\xb0\x38\x18\xbe\xbd\xf2\xc1\xb4\x48\x55\x81\x74\x7e\xf5\x19\x1e\x9b\x41\x80\xa7\x60\x3b\x54\x38\x76\xc1\xd3\xbb\x08\x3b\x5a\x6b\xb8\xe3\x90\x3f\x2e\x05\xf1\x85\x78\x3c\x2d\x31\x90\x56\x1a\x07\xbd\x89\xf8\xf4\x01\xab\x7b\x23\x7d\xb7\x19\xe3\xe8\x54\x0d\x5f\x64\x59\x24\x7b\x50\xf1\xe2\x17\x04\xdd\x90\xc3\x53\xce\xff\xaf\xac\x85\xb1\x6e\xcc\x3d\x1c\x79\xc8\x81\x2a\xa9\xb6\x70\x0c\x15\xd0\xd8\xb2\xe7\x47\x98\x20\x06\x77\x79\x95\x5f\xf2\xe2\x2f\xe5\x98\x7e\x55\xc4\x52\xc0\x87\x7b\x78\x0e\xa0\xbf\x7c\x98\x59\xb3\xb0\x80\xe6\x26\x45\x80\x97\xfd\xf1\x7e\xb9\xa0\x49\x67\xc5\xe0\xd9\xaa\x2a\x0e\xec\x06\x52\x36\xea\x66\x05\x8c\xf7\xf0\xf6\x2e\x28\xf6\x98\xbe\xa4\xaa\xa0\x70\xfc\xeb\x9e\xf9\x49\x99\x87\xdb\x9a\x6b\x97\x8c\x1c\xf5\x4b\xe3\x8e\xb3\xaa\x39\xa7\x17\xef\x80\x33\xcc\x8b\x83\xfc\xc7\xfd\x61\xc0\x70\x71\xe5\xd7\x3c\x05\xda\x7b\x6a\x8f\xaf\xba\xa5\x0a\xaa\x67\x0f\xdb\xdf\x8e\x63\x78\x02\x8a\x2a\x85\x4a\xfb\xc9\x3e\x4c\x18\xbc\x8f\xe7\xe2\x18\xd8\x1f\xf4\xc8\x61\x51\x25\x87\xc8\x94\xf1\xe0\x6b\x65\xeb\x38\x65\xed\x8e\xfa\xd5\x02\xc8\x3b\xfd\x85\xc8\xdb\x66\x59\xda\x88\xfb\xd2\xe3\xf0\x1b\x7f\xc7\x96\xd8\xd3\x69\x0d\xc4\x2f\x6b\x91\xc9\x3f\xeb\x69\x27\xec\x97\x49\x77\xcb\x27\xe4\x8e\x88\x9e\x26\xd9\xb7\xf3\x3e\x0c\xd2\xec\xb8\xff\x82\x04\x46\x7e\xd6\xd1\x22\xe2\xbb\x43\xdc\x90\x4e\xe6\xd2\x76\xbe\xff\x4f\xf1\x1b\x04\x1a\xc2\x09\xdb\x03\x3a\x34\x04\x98\xc2\xb6\xf4\x9b\xe5\x3f\x15\x35\x47\x0e\x2e\x77\xfe\xc9\xe9\x33\xa2\x2b\x00\xf1\xe0\x03\x8f\x58\xb8\x82\x32\x26\x46\x75\xf5\x6b\x9b\x19\xb4\x94\xbc\xdc\xa4\x99\xd9\xfb\x6e\xef\x80\x97\xda\xf0\x3c\x55\xbc\xd0\x11\x4a\x7c\x37\x57\xd9\x7c\xb3\x45\x25\xe8\xef\x04\x34\x67\x62\x90\xa1\x74\xf2\xba\xf9\x53\x45\xd3\x7d\x7f\xfc\x96\x7a\x7f\x7a\x96\xa2\x6e\x7f\xca\x29\x80\x1d\x9d\x51\xee\xe2\x14\x25\x2a\x0d\x80\x62\x15\xc6\x9f\x9b\x2d\xcd\xbb\xc5\x07\x4a\x3c\x3f\x51\xbf\xf2\x76\xf7\x46\xf2\xd2\x14\x72\x63\x0b\xfb\xf9\x01\x44\x2c\x1a\x6d\xd2\x2b\xf5\x95\xbd\xa9\x7f\x31\xf7\xfe\xc5\x69\x26\x94\xab\xf2\x81\xbb\x28\x49\xbe\xea\x51\x3a\x7f\xe2\x5e\x11\x68\xc2\x1e\x06\xaa\xd8\x34\xdb\xf1\x09\xd3\x54\x2f\x22\xb2\xba\x7e\x2b\x2d\x49\x34\xba\xd8\xd0\x5d\x2e\x87\x25\xc4\xef\x4f\xe5\xbc\xee\x86\x36\xd4\x66\xee\x57\x83\x59\x63\xef\xd4\x14\xe4\xeb\x4d\xbd\x3e\x5c\x53\x97\xfe\xa6\xfd\xdf\xcd\x33\x7c\xcf\x41\xcc\x26\xd3\xf8\xac\xdc\xeb\xce\x55\x3e\x7c\x30\xd5\x7e\xa8\x84\x38\x36\xe6\x5d\x9c\x11\x2d\x74\xc2\xdc\x81\x0b\xd5\x31\xb9\x6f\xc3\x80\x24\x97\x16\x4f\x81\xbb\xb4\xa4\x7b\x23\x42\x4c\x5c\x81\x26\xd8\x83\xa3\x4a\x2c\xd2\x8b\xcf\x52\x6b\xae\xd2\x21\x3f\x41\x85\xad\x9d\x2d\x44\x2d\xfa\x08\xb1\xde\xbd\x6a\x80\xb9\x89\x30\xcb\xa3\x91\x8e\x0e\x76\x14\x56\x10\x6c\x74\xb7\xb6\x36\x87\x44\x94\x23\x8f\x32\xfd\x3c\x22\x77\x00\x1e\x17\x7c\x3f\x44\xe7\xdf\x0f\x51\x3b\xf7\xf8\x44\xfd\xc8\x2b\x40\x26\x33\x04\x46\xb0\x70\xdb\x3e\x22\x24\x02\xec\x77\xb7\x7d\xb0\xf7\xb5\xa9\x48\x37\x29\xe6\xf6\x4c\xe3\x1c\xf6\xa4\x3b\xb2\xd5\x12\xab\x11\x6b\x3e\x12\xbb\xde\x5d\xf4\x0e\xeb\x73\x7d\x63\xab\x83\xdf\x36\x5b\x7d\x55\x67\x01\xd4\x2a\xef\xd8\xb7\xee\x87\x0d\x44\x6f\x3c\xea\xe0\x5c\x23\xc1\x62\x05\x21\x45\xab\x25\x18\x71\xae\xcf\x23\x40\x22\x81\x51\x09\x75\xce\x8a\x20\x7c\x32\x04\xf0\x7a\x63\xd1\x0b\x60\x91\x23\x41\x22\x6f\x7b\x0b\x13\x6d\x00\x20\x0b\x9d\xf4\xd6\xbe\x44\x71\xbb\xf6\x69\xa8\xac\x54\x5c\x73\xca\x85\xed\x64\x0a\x36\xff\x06\x47\x40\x66\x06\x10\x59\x90\x1f\xf0\x97\x43\xc9\x64\xd5\x2e\x73\x5c\x2a\xd1\x0e\xf5\x1e\xcb\x9d\x3b\xc6\xba\xdc\xf4\x1b\x83\x8f\x4b\xf2\xad\x76\xa9\xbe\x4f\x2e\x4e\xdf\x15\x04\x52\xf8\x8a\x78\x35\xfb\x60\xc9\xb3\x05\x2b\x80\x26\xee\x4b\xe3\x83\xce\x2c\x99\xe6\x60\x80\x88\xc2\x3a\xcb\xc9\x6f\x5e\x0a\x2b\x9a\xf2\x0f\xb9\x0e\x30\xb4\x33\x42\xe6\xb2\x8a\xcb\x34\x07\xd5\x70\x2e\x5d\x47\x36\x9e\xed\xe6\xce\x19\x08\xd9\xcf\xcc\x43\xf2\x2f\xeb\x05\x70\x83\x07\x56\x3a\xc7\xd2\xdd\x74\xb0\xd9\xce\xb8\xdf\x41\x27\x48\x14\x73\x4c\xf5\xbf\xc2\xc7\x38\x95\xdd\xb1\x71\x0b\x64\x6a\xaa\xe1\x7a\x31\x05\x42\x3e\xc1\x91\xc8\xaf\x54\x94\xf1\xff\x30\xf2\x58\xf3\x78\x9e\x16\xab\x9e\xbb\x93\x40\x74\x8a\x93\x10\x93\xc0\x12\x25\x51\x09\xe6\x5e\xfb\xd5\x69\x6c\x2e\x0a\x8a\x7a\xbf\x1b\x43\xef\x10\x08\xe0\x35\x51\x04\x44\xd4\x88\x23\x85\xd9\xb9\x80\x92\xe5\x47\x4c\xff\x0d\x30\xb0\x53\x2c\x98\x5f\xc6\x87\xcd\xfe\xd1\x1f\x3b\x61\x10\x63\x73\xd8\xb1\xfb\x67\x91\x80\x56\xf0\xe9\xf3\x08\x33\xa2\xa7\x40\xbc\xe7\x02\xfd\x16\xbd\x22\x19\x8c\xe3\x9f\xb5\x1e\xea\xe9\x96\x2a\x10\xd4\x0b\xf7\x58\x22\x29\x5e\xe4\x5b\x5c\x12\x72\x5c\xe8\x39\xcd\xb4\xca\x24\xc2\x01\x63\x14\x71\x87\xdb\xd9\xf1\x09\x4f\x6d\x64\xc7\x27\x49\x72\x39\x86\xa8\xaa\x83\xb4\xa1\x0e\xe5\x5c\xe5\x93\x6f\x17\x89\x5d\x7a\x4a\x16\xb2\x0f\xe4\xc8\xf3\xce\xb2\xe8\xb1\xee\x48\xb6\x0d\xb8\x5c\xc4\x64\x68\x26\xcb\x30\x69\xd8\x14\xd4\xb3\xc8\xce\xf7\x81\x7a\x69\xf3\x9a\x8a\xb1\xf3\x2a\xd8\xc0\x76\xbf\x54\x33\x9d\xa7\x5b\x88\xfb\x07\x19\xf3\x8d\x36\x1c\x11\xb5\xe1\xba\x82\x34\x78\x89\x5e\xdb\xfb\x93\x92\xf3\xef\xd9\xe4\x66\x0c\xa9\x70\x2f\xe0\x20\x1c\x76\x5d\x98\x05\x89\xfa\x62\x47\x03\x6b\xa4\xc9\xde\x5b\x37\x00\x86\x19\xbe\x94\x68\xf0\x03\x24\x19\x62\x5f\x52\x8c\x57\x84\xb8\x74\xdc\xbb\x41\x8a\x08\xb7\x5f\xc4\x66\xcb\x55\x08\xa4\x83\x98\xb9\x9c\x92\x03\x59\x49\x75\x37\xf2\xb4\xe3\x29\xc2\x47\x38\xff\x84\x1b\x9b\x10\x93\x23\xa2\x62\x2b\xb1\xf8\x4e\xc1\xa7\xe4\xd8\x8b\x4e\x51\x8e\xe1\x8c\x60\xc5\x41\x31\xbb\x5d\x8a\xf2\xe8\xaa\x62\x30\x1c\x9c\xc2\xdb\x6a\xd3\x63\x9f\x37\xd1\x1b\xb6\x20\x1f\xf6\xac\x65\xed\x1a\x54\xe6\x61\x8a\x69\x61\x0b\xe7\x08\xd2\x62\x83\x22\xbd\x27\x39\xb9\x08\xc5\x15\xc2\x84\xf4\x88\x0a\xcd\x7f\x40\x4b\x70\xf8\x56\x71\xf1\xcf\xaa\x48\x8f\xf0\xd9\x7f\xe3\x86\xf2\x9a\xc9\xde\xf9\x12\x8b\x90\x04\xdb\xba\x0f\x3f\xf9\xcf\x0a\xaa\xbb\x2f\xe9\x23\xf5\x26\x2d\xdf\x1e\x72\x84\xef\xf3\xb5\x82\x11\x86\x26\xef\x2f\x9a\x82\x60\x5c\x53\x8f\x7f\xec\xe2\xa6\x5a\xdd\x2d\x6e\x93\x8d\xc3\x1d\xd3\x93\x8b\x66\x89\x30\x59\x0f\x3b\x6e\x5b\x8f\xcc\x34\xaa\x76\xcf\x2f\x11\x90\xad\xe1\x25\xd0\x11\x0e\x72\x42\x55\xfc\xd6\x71\x6d\x8b\x48\x90\x39\xdf\x00\x43\x88\xb5\x80\xee\xf9\xf8\x7f\xf4\x52\xfe\x49\xe1\xee\x35\xaa\xa8\x9b\xe8\x37\xba\xe6\x6f\x09\x04\x66\x54\x8a\xe4\x55\x64\x06\xe0\x2e\xf5\x64\x4f\x5c\x41\x73\x06\xcb\x82\x1e\xf7\x4b\x92\xcf\xdf\xe9\xe2\x59\xbf\x53\xdc\xbb\xc8\xc7\x3b\x93\xdd\x9e\x87\x16\x68\xa3\x02\x88\x06\xd9\x42\xf2\xe9\x2e\x7d\xfd\x4b\x33\x8b\x20\xa4\x8c\xa8\x5a\x7a\xa7\x2d\x70\x99\x23\xdb\xf5\x34\x52\x90\x8c\xea\x0a\x95\x45\x88\xac\x8b\x22\xea\x50\x2d\xc5\x90\xf5\xb8\xbf\xf6\xe7\x7b\xd9\x53\xd9\x02\x1c\x76\x07\x24\xd6\x30\x28\x4a\x84\xe1\x40\x0e\xc9\x08\x39\x38\x54\x05\xfd\xc9\xaa\x2c\x5d\xff\xc0\x76\x0b\xc9\x17\x25\xe0\xb5\x23\x0f\x2a\xe9\x6d\xbb\xe0\x9c\xe9\xbd\x04\xa1\xed\x88\x7c\xfb\xb0\x68\xfc\xdf\xad\x67\x61\x95\xe8\x4e\x6b\x13\xb8\xdf\x31\x36\x6d\x3f\x6c\xf3\x95\x29\x13\x06\x38\xc2\xf6\xc1\x8e\x1c\x48\xaf\xb4\xb3\x8b\x0b\x7b\x5e\x2a\xb2\xbc\xf2\x70\xd6\xc3\xfe\xa4\xc8\xc5\xca\x2b\x47\x9b\xf6\x9c\xce\xa0\x5d\xf8\xb7\x41\xb9\x40\xc7\x68\xbb\xc1\x46\xb2\x2a\x46\x5a\xb2\x01\x1e\x65\x5d\x85\xc3\xb1\x65\x6c\x8a\x0b\xb4\x15\xbf\xe9\xe0\xce\x21\xef\x54\x95\x58\x87\x32\xe9\x6a\x04\x39\xad\x21\x07\xaf\x85\x55\xd5\xf7\x48\x8e\x73\x2a\x10\x1b\x83\xa7\x0f\xf3\x58\x5a\x6e\xc7\x5a\x66\x72\x8e\x31\x5f\x5a\x55\x7a\x15\x72\xb3\xd7\x1e\x2a\x4a\x71\x2e\xfa\x11\x58\xba\x3e\x9f\xdf\x8d\x9b\x71\x6a\x47\xc7\xba\x65\x98\xc3\x9f\x5b\xac\x4d\x0a\x76\x54\x6e\x5d\xee\x1b\xce\x25\x9c\x2a\x42\xea\xd0\xec\x41\xc2\x58\x61\xf5\x7c\x53\xf6\xb7\xa8\x0e\x38\xb7\xda\xe4\x5f\x95\x02\x6c\x81\xab\x35\x0b\xaf\x90\xe6\x83\x79\x21\x7f\xeb\x12\x0a\x07\x2f\xb2\xca\xfe\xab\xc8\xa2\x77\x5b\xb2\x60\x4c\x92\x0a\xb8\xc8\xfa\x76\xab\xaa\xba\xe0\x4b\x2e\xe9\x3d\x09\x66\xba\xae\x12\x18\x54\x0b\x2b\x06\xab\x33\xd8\x23\x76\xc8\x5d\x4c\x24\x5d\x99\xcc\xb9\x24\xa2\xb1\xf3\x91\x9a\x4c\x7e\x5e\xaa\x44\xee\xff\x04\xbf\x9c\xd7\x2f\x0d\x46\x85\x1c\x32\x67\x1e\x98\x68\x7d\xdf\xd4\x7b\xfc\xa5\xf9\xee\xe2\xde\xc0\xb4\x12\x3f\xd9\xca\x3d\xaf\x19\x8a\x0f\xb2\x59\xc5\x0d\x8d\xfe\x79\x9f\x2d\x9c\xdd\xad\x26\xe0\x37\x18\xd5\xa3\xf3\x40\xbd\x9a\x2b\xe3\xf4\x54\x98\x69\x11\x50\x95\x1b\x47\x24\x13\x94\x9d\xf2\x10\x01\x5d\x9f\x1f\x9c\xd5\x92\x09\xbc\x66\xf3\x47\x19\x1b\xda\x2b\x20\x97\xd9\x99\x53\x22\x3b\x5f\x4f\x96\xea\xb0\x6b\x57\x12\x4d\x3f\x77\x72\xf9\x18\xef\x56\xc1\xf5\x92\x26\x3a\xd6\x15\x44\x14\xa7\x9c\x88\xf9\x03\xa3\xd9\x23\x9c\x66\xe1\x6d\x44\x2e\xe9\xd0\xd1\x6e\x67\x5c\xd4\xca\x8c\xf2\x72\x1e\x4b\xcb\xca\x19\x1d\x4d\xe1\x88\x76\x74\x69\x02\x0d\x50\x96\xc8\x3e\xf2\x18\x05\x3e\x26\x32\xb1\xac\x92\x53\x8e\xf5\xd3\x7a\x22\x0e\xbe\xbe\x1a\x80\x35\xdb\x75\x64\x1e\x76\x51\xd6\xda\x07\xac\xfc\x34\x35\x02\x91\xd1\xe7\x58\xb6\x0d\x58\x8b\x88\xbf\x3b\xa3\x6b\xd3\xbf\xa2\x05\xf7\x4d\x3c\x33\x4e\x33\xf7\x2d\xf0\x46\x41\x88\x07\xd5\x02\x83\xa0\x7f\xa7\x9a\x28\x5f\xc1\x33\x8a\xc2\x5c\x71\xe5\x35\x81\x62\x8c\xb1\x4d\xb6\x6a\x38\xcd\x90\xee\x9d\x59\xd9\x83\x13\x48\x0a\x0b\x33\xa2\x52\x07\x3d\xc1\xfb\xfa\x4d\x44\xa9\x9c\x8e\xc9\x4f\xad\x32\x43\xe9\x17\x41\x40\x76\x27\x0e\xcd\xa0\xae\xb7\x67\x95\x07\x55\x4e\x9f\x20\xa6\x9c\xff\x86\x49\x37\xb3\xdb\x45\xf5\x55\x65\xd4\x09\x36\x0d\x6a\xe5\xef\xaf\x0a\xa5\xfb\x54\xf9\x64\xad\x88\xde\x32\xcf\xc9\x09\x2b\x14\x3f\x58\x9e\xa2\x4a\xe3\x6f\x08\x1b\x14\xa0\x1b\x41\x47\xad\xdb\xd3\xdf\x66\x5f\xd3\x87\x08\x19\xb1\xfe\x58\xa0\x39\xf1\xc5\xc2\x1b\xa9\x0b\x8f\xe6\x2e\x47\x42\x35\x4b\x55\x56\x52\x8a\x27\xe9\x72\x4c\x72\xbd\xca\xca\x62\x65\x58\x55\xc5\x9a\x6a\x51\xba\x19\x6e\xaf\x83\x38\x69\x97\x26\x7e\xae\xd7\x21\x9b\x74\x40\xa2\x28\x23\x12\x55\x94\x7d\xdd\x2c\xec\xbe\x10\x72\x33\x80\x27\x7c\xfa\x68\xda\xf8\x50\x52\x44\xa2\x1a\x23\x38\x8b\x0e\x4b\xb1\xa8\x92\xae\x1f\x97\xfa\x25\x44\xaa\xaf\xff\x69\x34\x35\xad\x31\xb4\x4a\xa4\xb3\xb2\x9a\x22\xc6\x25\xac\x0a\x46\x59\x5e\x68\xb8\x3c\x92\x90\xdb\x2b\x32\x96\x59\x43\xd9\x8b\xd6\x8c\x5f\xfc\xcd\x7f\xb5\xdd\xd8\xee\x10\x4a\x3e\x3e\xaa\x91\xc8\x60\xba\x00\xbb\x84\x23\x3b\x15\x68\x58\xe6\xff\xac\x5c\xa3\x1b\x8c\x13\xd4\xaf\xb4\x87\x9d\x93\x95\x43\x1a\x18\x5d\x52\x31\xdb\x82\x2d\x0a\x4e\x51\x2f\x36\x70\x03\x13\xec\x41\xe3\x19\x02\xfc\xb0\x12\xb3\xab\x54\xa0\x0e\xe7\x50\xac\x4a\x0a\x60\x0a\x16\x2e\xbf\x0c\x89\x49\xb6\xaf\x18\x4e\xc5\xe7\x30\x97\x10\xb8\x14\xc8\x84\xff\x6d\x02\x87\xd8\x41\xd0\x6c\xac\x4d\xb1\x0e\x25\x08\xa3\x26\xaa\x4b\x5c\x2a\xac\x90\x1a\x66\x0d\x14\x2a\xd1\x7a\x07\x41\x40\xf1\x87\xa5\xb5\xa9\x46\x96\x22\xb7\x78\x19\x8e\x7d\xd8\x0f\x1d\xbc\x1b\x59\x12\x61\xce\x7d\xd3\x84\x52\x46\x34\xa4\x6b\x1d\x19\xb8\xad\xd4\x24\x6d\xda\xb5\x49\xab\xd0\xb8\x42\xf0\xf9\xfd\x93\xc6\xb2\x3e\x83\x65\x73\x69\x72\x87\xe9\x16\xef\xcd\x1d\x73\x86\x91\x0a\xcb\xc6\x99\xab\x74\x59\xaf\x07\x3d\x12\x20\x45\xd6\x61\x82\x25\xfc\xe4\x9d\x51\xb3\x55\x99\x4e\x56\x6f\x05\x79\xa6\xd6\x49\x43\x80\x2a\x4b\xa9\x9a\x23\x53\xae\xfb\xc8\xeb\xf2\xfe\xba\xa8\xcc\xf9\xa5\x04\x99\x88\x35\x6f\x01\xee\x6d\x6e\x9a\xa0\xdc\xdf\xa4\x12\xca\xfa\x52\x5a\x5c\xd6\xc8\xfe\x5e\x6b\x40\x51\x63\x84\xb4\xaf\xda\xb3\xad\x1c\x42\xf4\x07\x2b\x21\x6c\x12\xac\x8e\x40\x45\xf0\xda\x04\x0a\x04\xff\x3a\xc8\x53\xb4\xf0\xdc\xd1\x15\xd1\xb1\x2c\x76\xc0\x42\x12\xfd\x16\xd6\x01\x0b\xfd\x9d\xd6\x08\x7e\x71\xb6\x6a\xd8\x0d\x80\xa4\xda\xfc\x71\x8e\xfe\xb7\xf3\xae\xc8\x64\xdd\xd2\x20\x4f\x81\xdc\x08\x38\xe2\xdd\x6c\x63\x51\x54\xdd\x29\x2f\xfb\xed\xb2\xde\xc8\xd1\xd2\xc5\xbd\xf1\x7c\x2c\x96\x75\x36\xd9\x22\x09\x51\x92\x83\x24\x82\x3b\x53\x04\xa4\x8b\x6e\xb2\x90\x6b\xb8\x24\x45\xb7\x22\x52\xe9\x94\xf9\xbd\xae\x94\xf9\x0e\x73\xa2\x79\xf3\x56\xac\x8b\x50\x8e\x99\x84\x72\x94\x58\x9a\xdf\x42\xa3\x12\x50\x14\x3c\xaf\x55\xcd\x58\xab\x47\xce\x3f\x21\x27\x15\x36\xc1\xd4\x11\x7b\x60\x4e\x0a\x7f\x56\x86\x88\x3f\x6d\x3a\x8c\xf2\xb3\xb9\x45\x8b\xa0\xa7\xf7\x9d\xf2\x2f\x2f\x5e\x41\xc2\x4e\xbf\x0f\x4e\x0f\x8e\xcc\x12\x3e\x65\xd3\x3d\xaa\xb1\xb6\xd5\x28\x5f\x83\xfa\x0e\xe3\x65\xd6\x3b\x35\x0c\x33\x81\x63\xb1\x02\x52\xa6\x10\xae\x60\xbd\x68\x53\x08\x73\x7c\xc1\x1a\x07\xc9\x92\xc4\xad\xae\x2b\x45\x5e\x9e\xed\x94\x44\xad\xe0\x48\xc7\xb4\x64\x7f\x12\x51\x07\x0d\x21\x26\x0d\x21\x0b\x5a\x7f\x55\x35\xb6\x64\x89\xed\x4a\x18\xce\xe9\xca\x4f\x42\x2a\xd9\x28\x0d\x9a\x7d\x09\x5b\x75\xf9\x07\x75\x1a\xe7\x25\xb8\xa7\xfa\x3f\x3f\x3f\x4f\x59\xe9\x1f\xfc\x59\xcf\x7b\xc1\x66\xf5\xf4\x19\xdb\x83\xa5\x8c\x4a\x9a\xa0\x50\x3c\x59\x33\xd9\x03\x5f\xda\xa7\x33\x18\x7d\xa1\x11\xaf\x87\x52\x73\xc1\xea\xa7\x76\x6e\x55\x8a\x92\x87\x5c\x71\xd4\x3b\xbc\x9e\x9e\x40\xfb\xca\xc1\xae\xe9\x99\x29\xa1\x78\xb6\x91\xe5\xb3\xed\xa8\x08\x7e\xf7\x5d\xdb\xdd\xa0\xf5\xb9\x5e\x3a\x93\x1c\xe1\x3c\xc3\xbd\x11\x81\x19\xee\x30\x92\x3b\x32\x99\x96\x83\x50\xb5\xa1\x68\x8e\x3f\x14\xbd\x39\x43\x69\xda\xd3\x5c\x22\x42\xba\x5f\x54\x03\xbd\xfd\xff\x38\x3f\xe8\xcf\xb0\xcd\x2c\x83\x6c\x0b\x19\x54\x11\xf5\x54\x53\xf7\x62\xd0\xc2\x52\x34\x6c\xe6\x8e\x9d\x0f\x94\xa3\xd6\x3d\x3e\xbf\x9d\x65\x88\x28\x80\x2d\x6a\x0f\x5b\x76\x95\x28\x56\xaf\x60\xc8\x5e\xc6\x58\xfd\x92\xdf\x8c\xac\x0a\xb6\x3b\x7d\xea\x52\x54\xff\x3d\xca\x08\x3a\x60\x5b\xcb\x2d\xb2\x0f\xcd\x6f\x44\x0f\x6a\x85\x56\x09\x7a\x10\xf2\x35\xf6\x49\x14\xa2\x63\x8d\x37\x12\x7a\x1f\xa1\x87\x30\xc0\x66\xb9\x74\x43\x8a\x46\xaa\x8f\x4c\x1e\xd2\x97\x51\x44\xee\xa5\x14\xb0\x95\x5c\x4e\x8f\x34\xc8\xde\x08\x16\x10\x99\x5a\x1f\xcf\xa5\x28\x5c\x76\xb4\xc0\xae\xd7\x24\x74\x6b\xd2\x24\x90\xdf\x84\xfa\xc3\x17\xb2\xb1\x13\x55\xbe\x6b\x52\xba\xce\x4e\x1d\xc1\x5b\x25\x6b\x26\x99\xdd\x13\xbb\x52\x13\x24\x05\x90\x52\xaf\x95\x38\xd0\x85\x12\xa3\x0b\xc4\xb4\x4b\xdf\x80\xc4\x84\x8f\xb6\x72\x2d\x10\xb2\x10\xfb\xf0\x4d\xee\x52\x0b\x37\xb3\x42\x3a\xea\xb4\x2b\xe0\x30\xf1\x2d\x1c\x0f\x7b\x38\xdf\xc8\x3f\xbf\x80\x46\x24\xec\x8b\x39\x92\x8e\x81\x25\x0d\x18\x21\x05\x72\x2a\x52\xe7\x9f\xf8\xde\x59\xe2\xae\x6f\x8d\x9a\xe1\x53\xe7\xfa\x61\x9d\xf8\xa9\xdc\x36\xde\x9f\x85\x0c\x38\x2b\xea\x38\x14\x7b\x53\xbb\x6f\x0f\x21\xbd\x2d\x4b\x2b\xf3\xd6\x86\xa1\x2d\x89\x35\xda\xdb\x8f\xfd\x57\xd6\x88\x11\x69\x21\x84\xd4\x30\xd1\x51\x0f\x69\x6b\x75\x2c\x2f\x6b\x91\x79\xd9\x05\x3e\xe6\x5b\xec\x4b\x7e\xfe\xf7\xa8\x34\xe3\x0b\x8a\x19\x86\x3e\xdb\x2d\x42\x3c\xe3\x6a\x96\xc3\x57\x19\xf8\x00\x4e\xb3\x17\x7c\xb8\x70\x65\x7b\x46\x2d\xaf\xaa\xbf\xe4\xc1\x89\x14\x0d\xb8\xa9\x2c\x2b\x41\x0f\xe1\x75\xe0\xe9\x9d\x9d\xc3\x55\x1a\x66\x26\x94\xe2\x84\x59\x16\x37\x2b\xf8\x7a\xaf\x7c\x8c\x11\xa3\x9d\xf9\x1c\x3b\x42\x1e\x21\xf3\x6f\xbb\xed\x45\x79\xc7\x2d\xb1\x89\xb6\xc4\x3b\xdd\x17\x25\x4b\x02\x6d\x1f\x71\x67\xc4\xc2\x27\x85\xfb\x11\xb3\x46\x64\xe0\xb0\x42\x5b\xe9\xb0\xc4\x52\x10\x46\xb5\xaa\x28\x37\x47\x24\xe8\x16\xee\x8b\xfc\x14\x93\x0a\xdd\xf8\xff\x6e\x5a\xd7\xde\xe1\x1d\xee\x32\x32\xff\x63\xed\x82\x93\xa8\x58\x9c\xb2\x96\x04\x11\x38\x5b\x95\xff\x02\x38\xda\x6d\xf0\x8a\x78\x6a\x9a\xd4\x92\x63\x01\x39\x1e\xd3\xcc\x6a\x23\xb9\x3a\x98\xe6\x9b\x3f\x92\x21\xd5\xe3\xd8\xd9\xc3\x6d\xfe\x98\x14\xe7\x79\xe4\x7d\xd1\xe1\x67\x4d\xa6\xc4\x39\xb6\xe3\x88\x55\x05\x87\x26\xfe\x9b\xdf\xc1\xff\xbb\x13\x3d\x08\x0f\x9f\x96\x84\x99\xed\x10\x3a\xe2\xea\x03\x47\xeb\xca\xbc\x5e\xb4\x43\x01\xa3\x53\xce\x24\x47\x5d\x28\x7b\x4c\x5a\xad\x9c\xfc\x8d\x1a\x8f\x7f\xb5\xc8\x76\xfb\xd8\x4f\x62\x91\x41\x2f\x0f\x9e\x1a\xf5\xfe\xfa\x0f\xab\xbf\x30\x41\x24\x64\x91\xaa\xad\x5b\x0d\xb8\x86\x17\x97\xb3\xfd\xc0\x8b\x03\x4b\x72\xfe\x36\x6a\x03\xb6\x92\x65\xe1\x89\x0c\x13\xb9\xdf\xaa\x78\xb1\x05\x47\x64\x5b\xe4\xad\xd9\x56\x10\x45\xdb\x51\x59\x49\x7e\x02\x71\xb3\xae\x84\xf8\x13\x1d\xb1\x34\xd7\x6c\x30\x1c\x30\x05\x31\xc0\x99\xe1\x66\xf7\x15\x65\xd3\xf9\xd2\xdc\xdc\xde\x02\x19\x2e\x82\x9d\xf1\xf8\x7f\x2d\xfa\x98\xd6\x8c\x99\xe1\x4a\x98\xce\x16\xd5\xa2\x31\x19\x41\xe2\xe6\x30\x04\x21\xeb\x0e\x23\x65\x56\xa1\xc1\x71\x03\x3f\xab\x36\xa2\x56\x11\xbc\x76\x0b\x34\xd3\x6c\x36\x1d\x41\xa6\x87\xc4\x20\x4c\x1d\x97\x18\x89\xaa\x44\x1d\x03\x29\x84\x0f\xa2\x6c\xe0\x53\x27\x89\x55\x48\xad\x94\xc8\xb3\xdc\x9a\x72\xd6\x2e\x29\xcb\xf3\xa5\xf4\xb8\x5f\xf4\x16\xd2\x96\x64\xe1\xb3\x84\x1d\xc6\x82\xc3\x4a\x0b\x79\x60\xb9\xa3\x05\x8f\x2a\x7c\x80\x89\xf5\x43\x00\xdb\x11\x0c\xaf\x18\x27\xcd\x76\x51\x32\x88\x29\x88\x94\x33\x62\xf7\x7d\xeb\x9d\x97\x24\x82\x83\x15\xa8\x51\x9d\x6e\x9f\x58\x00\xbd\xaa\x2c\x46\xdf\x71\xdd\x60\xa9\x50\x2b\x27\x91\x7f\x7c\x91\x36\xc7\x80\xf1\xb5\x91\x2f\x51\x4e\x1f\xec\x17\xb6\xe9\xb0\x92\x0c\xbf\x5f\x8c\x7d\x88\xbf\x85\xb6\x06\x0e\x5c\xbf\x9a\xb0\x54\x19\xff\x36\x21\x88\xbd\x82\x4b\x99\x48\x21\xdb\xa2\x5a\xb3\x9e\xf4\x15\xf5\xe6\x67\xba\xe9\x91\x35\x25\xb7\xe9\xe3\x2a\x87\xb1\xb0\xcf\x69\x02\x9f\x6b\x7e\xc0\x56\xd4\xa4\x57\x18\x74\xd9\x09\xab\xa9\x25\xe2\x0a\x78\xd6\x83\x24\x16\x45\xa9\x46\xea\x23\xe7\x36\xa3\x9d\xd9\xba\xa4\x47\x9c\xda\xf2\x9f\x97\x9b\xd3\x88\xe2\x4d\x26\x29\xa5\x59\x1f\x8f\x3e\x84\x7e\x38\xbd\xdc\x93\x50\xed\xaf\x56\x75\x9b\x02\x71\x93\x17\x71\x6a\x59\xc2\xb0\xcd\x7a\x90\x60\x7e\x8a\x3f\x16\x11\xfb\xe7\xa5\x47\x09\xbd\xe2\x1e\x7f\xd6\x16\x6d\x03\xa3\x4c\xff\x29\x1a\x83\xc0\x02\xcc\x91\x34\x5e\xed\x39\x62\x2a\xf3\xae\x72\x20\xdb\x35\x44\x86\x99\x15\x5b\x4d\xe5\x31\xdc\x17\x75\x5f\xf6\x6d\x99\x9f\x58\x29\x6d\x1a\x0e\xda\xb2\x0d\xf5\xad\x5a\x03\x3b\xe9\xe4\x44\x9c\xa1\x56\x95\xa9\xb5\xab\x9a\xa6\x72\x2c\x5a\xd4\x4d\x5a\x4d\xda\x55\x45\x48\xd9\x31\x91\x2f\x16\xa3\xd6\x8c\xc9\x3c\x65\x77\xe1\x25\x72\x4f\x36\x25\xed\x0e\x3c\xb3\xfb\xcf\xde\x0c\xc1\x14\xd4\x7f\xd4\x9e\x73\xd2\x12\xae\x28\x87\x64\xcf\x3d\x0e\x41\x45\x9f\x72\xbe\x59\xd7\xbd\x6a\x1c\xba\xa2\x2c\x66\x39\x4a\x26\x57\x0f\xe5\xd5\x2b\x48\xe5\xf0\x47\x69\x5c\x32\xe9\xc9\x1d\xc5\xe2\x6e\x0d\x4e\x92\x68\x63\xf5\x7e\x6b\xca\x89\x72\x2e\xa8\x60\x31\x95\x3c\x52\x4c\xbe\x50\x23\xfe\xef\x6e\x51\xd6\x7c\x84\x11\x9e\x57\x72\x56\xf8\x8a\x68\xb6\x24\x15\x81\x22\xf0\x77\x53\x9a\x2f\x62\x6e\x3a\x61\x03\x2e\xea\x22\xfd\xa3\x4b\x56\x77\xb8\xa8\x01\x09\x10\x5e\x62\xed\x92\x11\xa5\x35\x6a\x33\x5a\xe2\x61\x42\x2c\x7f\xb2\x34\xd3\x75\xf3\x1b\x56\x21\xdf\x70\xff\x7d\x7f\xc2\xf7\xe4\xa3\x44\xd5\xda\x92\x57\x3d\xe5\x04\x77\xa2\xb8\xac\xef\xa9\xaa\x56\x7e\x03\x30\xe7\xf8\xd1\x2b\x2e\xf1\x11\xde\xb6\x83\xab\x0e\x2b\x7a\x02\xef\xe6\x40\x07\x76\xb8\xd7\x28\xbe\x9e\xc2\x84\xf3\xfa\xe9\x7d\x90\x6e\xd8\x1c\x56\x08\x45\xbd\x0a\xa6\xfd\x61\x54\xb6\x30\x9a\x0f\x90\x1c\x7e\xcb\x2d\xb6\xc4\x1d\xe9\xf6\x3e\x62\x97\x11\xe7\x3b\x3b\x68\x7f\xdd\xd5\x37\x15\xb8\xcd\x44\xca\x8a\xe7\x9d\x3f\x94\x95\xf5\x90\x04\x9c\xdf\x55\x85\xd9\x51\xba\x84\xd3\x77\x13\x72\x77\x30\x83\xcb\x16\x49\xbe\xce\xf9\x8a\x0a\xd0\xae\x2f\x4a\x29\xad\xd6\xba\x02\x5b\xc1\xab\x36\x71\x6a\x89\x98\x06\x0d\x2b\x61\xfe\x15\xea\x6b\x7c\x34\x04\x91\xdc\x2e\xb6\xbe\xec\x53\xcc\x34\xa3\xdd\x90\x74\x9c\xab\xa0\x92\x59\xc9\x28\xf0\x6f\x3f\x5a\xa6\xd6\xfe\xfb\x61\x7b\x60\x71\xb8\x51\xa3\x86\xf4\x6e\xc5\xcb\x3a\x28\x98\x68\x9a\xe6\x55\xd2\x59\x8e\x90\xc3\x15\x08\xa3\x93\xff\xb6\xd2\xc6\xb8\x25\x54\xa4\xe7\xa4\x88\x09\xcc\x50\xc5\x63\x8f\x29\x6c\xef\x24\xb0\x07\xeb\xb8\xd2\xa6\xa5\xef\xf0\x59\x83\xbd\x1f\x56\xe9\xb3\x54\x05\x81\xbb\xba\x55\x8e\x9f\xfe\xe5\xd6\x36\xf0\x39\x27\x58\x36\xf8\xe8\xb2\x4a\xb2\x5e\x65\x8f\xc6\x01\xb7\x15\xa8\xa4\xe2\x1f\x68\x95\xf8\xa8\x48\xc9\xd2\x28\x8d\xc7\xcf\xc8\xe2\x40\xac\xa7\x78\x66\x7b\x14\x7a\xab\xa8\x30\x21\x7d\xd9\x3f\x87\x9c\xd8\xa2\x43\xdf\x8f\xef\xa7\xfb\xa8\x80\xdc\xad\x82\x6c\xc5\x9e\x6c\x27\x76\x9d\x0a\x3b\x93\x5f\xf9\xed\x59\xf1\xe5\x3b\x84\x3a\xab\x2f\x7a\xaf\x61\xf6\x8c\xa3\xc6\x57\x24\x41\x87\x17\xa8\x34\x7f\xd4\xdf\x15\xa1\x86\xb4\x61\x8c\x58\xd8\x0a\x63\x1e\x0e\x46\x3f\x8c\xc8\xb3\x27\x64\x0b\x67\x9d\x65\x9e\x39\xa0\xc2\x2b\xe0\xe6\xcd\xdb\x94\xaa\x3c\xad\x46\xe7\xd5\xcb\x9e\xed\x08\xdb\x1a\xfb\xab\x6f\x96\x6f\xcf\xa7\x6f\xe9\x6b\xf9\x13\xdf\x1c\x6a\x79\x2a\x3c\x1e\xac\xcf\x0a\x6d\x45\x56\x48\x91\x06\xe5\x22\xe4\xbf\xaa\xa6\x0f\x4c\xb4\xeb\x6a\x7a\xf6\xf0\xad\xc1\x38\x2f\x56\xcb\x8b\xab\xfc\xe3\xa9\xf5\x55\xe5\x16\xce\xe6\x1c\x13\x4f\x39\x77\x63\xb0\xc3\xc5\xe5\x2e\x83\xbe\x3c\xc3\xfc\x26\xe2\x2f\x8f\x6f\xd8\xdc\x1c\x11\x8b\xe6\x81\x5d\xc1\x71\x1b\x15\xc6\x1e\x70\xa2\xcf\x4f\xbd\x4c\xbb\x39\x3c\x3d\x39\xa7\x5b\x30\x4b\xd7\x3c\xb5\x0b\x15\x60\xd9\x83\xad\x76\xca\x73\x6e\xf1\x18\x67\x8e\x4d\xe9\x5a\x8a\x11\x80\x1c\x4d\x8f\xa8\xd8\x76\xe5\x22\x4b\x85\xea\x52\xc0\x5e\x2b\x8e\xfe\xe6\x3b\x36\xc1\x19\xc3\x5e\x2f\xd1\xed\x86\x44\xc3\x42\x21\xe0\xc4\xa2\x6d\x3b\xc3\x47\x2e\x7c\x6e\x7c\x42\x2a\x22\x5b\x2e\x2a\xee\x24\x70\xf9\xbb\x1d\x44\xc4\x14\x37\x73\x62\x6a\x3b\x18\x3b\xca\x72\xa6\x70\x3c\xfd\xec\x82\x0a\x5b\x38\xe6\xbd\xb0\x5c\x3b\xfc\x39\x4e\x4a\x2d\xe6\xe4\x08\xb4\x35\xcd\x38\x33\x84\x3c\x82\x09\x25\xc0\x17\x71\x2e\x3a\x89\xc9\x55\x69\x41\xf0\xd7\x60\x62\x8a\xc1\xcf\xe4\x87\xd4\x45\x51\xd9\xa4\x63\x6f\x24\x8e\xe5\xba\xfb\x1a\xc3\x4e\x98\x30\x38\xe0\x77\x88\x84\x86\xf1\xa7\x98\x47\xa3\x4c\x7d\xc6\x66\x33\x6e\x25\xc6\x2f\x9c\x62\xac\x52\x7f\xf8\x40\x94\xc4\xb7\xb2\xd0\xbd\xd4\xd7\x22\xb9\x75\xb4\xb0\xcb\xe4\xc8\x00\x6b\x9c\xc2\xa0\xb5\x29\x87\xc6\x1c\xc6\x74\x63\xa4\xf1\xc3\x67\x27\x87\xe3\x4e\x4e\x0a\x1c\x2a\x34\x26\x27\x6f\xd9\xc1\xc1\x16\xbd\xf1\x0b\x8b\xf3\xcf\x3b\x3c\xe0\xe7\xd5\x33\x2f\x4d\x14\x20\x26\xbf\xe8\x6f\x31\x18\x45\x77\xe4\x15\x93\x75\xc0\xcd\xb3\x7d\x20\xf3\x72\xb0\x83\x6c\x8a\xf6\x4b\x35\x19\x8b\x32\x99\xeb\x94\xff\x8a\x8a\x31\xbf\x2f\x39\x3f\x4d\x8b\x2a\xb0\xbe\x5e\xcd\xb5\x6e\x67\x20\xd4\x10\x16\xcd\x43\x5e\x6f\x25\x4f\xd8\xdd\x2e\xf9\x00\xa4\x6e\x03\x67\xae\x4f\xe9\x6c\xe1\xe0\xed\x3f\x2e\x2d\xe1\x9f\x5e\xc6\x66\x1c\xde\x7f\xba\x5b\xbb\x27\xb8\x6b\x12\x16\xd6\x43\x52\xc1\x43\x49\xf0\x56\xb1\xd1\x10\xc0\xde\xd4\xce\x1f\xb9\xcd\xba\x22\xf0\xc3\x05\x76\xf5\x20\xb0\xd1\x3b\xb7\x4f\x97\x5b\x84\x73\xae\x8a\x4d\x61\xbc\x29\x35\x60\x45\x26\x69\x40\xc4\x4c\x59\x99\x07\x52\xc5\xd5\x8c\xf0\xfc\xf1\xaf\xc8\xf9\xe6\xc3\x87\xfb\x4b\x96\x67\xa7\xe3\xc6\x67\xb0\x0a\x20\x7d\xca\x1a\xe0\xf8\xe6\x6f\x40\x0d\xa0\xbb\xf9\x83\x5d\xe6\x5b\x14\x84\x5d\x00\x85\x7a\x6b\xba\x66\x60\x61\x65\x07\xdf\x06\xaf\xf8\xf4\x39\x78\x8a\x71\x2e\xab\x8a\xef\x1b\x06\xd8\xae\x74\x4b\xfd\xff\x6e\x95\x84\x8e\xdc\xba\xc3\x9e\x06\xb2\x6d\xc6\x82\x11\x70\xd4\x9e\xe9\x5e\x9b\x69\x8e\x7d\x30\xd4\x10\x13\x14\xe2\x82\x76\xcc\x0e\xb7\xa8\x71\x91\xa9\xb1\x09\x77\xe9\x52\x04\xf7\xf7\xa1\x4a\xc4\xd6\x54\x64\x03\xe4\xde\x05\xb0\x9a\x75\xbd\x01\x9d\x3c\xac\x99\xe8\x03\xf3\x7b\x38\xfd\x0d\x3f\xf2\x8b\x00\xf7\x77\x28\x0a\xe6\xca\x70\xff\x1a\x5e\x2c\x56\x93\x68\xe4\xfc\xc6\x6c\xfd\xe1\x70\xde\x45\x47\xbe\xf1\x57\x0f\x3a\x29\x8e\xf2\x5b\x44\x74\x84\x39\x50\xb1\x66\x57\x39\xc3\x6f\x17\xd2\xf9\x22\xd8\x19\x56\x52\xca\x57\x28\xa1\xe1\x08\xf7\x3e\x2b\x8e\xfe\x29\x34\x83\x1f\xe2\xf1\x51\x7a\x11\x5f\x56\x1f\xc2\xf2\x49\x4b\x62\x60\x2f\xbc\xd9\x3e\x07\x86\x27\x0f\x6b\xd2\xb4\x4d\x0e\x2e\x78\x4a\x6b\xd1\x5e\x63\x1f\xe0\x6a\xc0\xab\x78\xef\xd6\xce\x1c\xb4\xf9\xba\x3e\x1c\xa6\x21\xdf\x8e\x13\x3d\x19\x24\xd0\xa2\x28\x2c\xde\xaf\xa2\x9a\x03\xfe\x36\x42\x0b\x3d\x2d\x4c\xd6\x7b\x77\x98\x31\x80\x41\x27\xa6\x9c\x15\xa4\xa1\x3c\x38\x7e\x7c\x53\xf0\xe1\x0e\xd5\x86\x4a\xa3\x71\xa5\x81\xc2\xfe\xc2\x02\x70\x4d\x2d\x1d\xd0\x75\x06\x84\xf1\xe8\xcc\x74\xda\xad\xfa\x7c\x86\x17\x91\xf2\x9e\xdd\x7e\x48\xc5\x5c\x0a\x9f\x04\xa4\x1e\x79\x35\x75\xc3\x6e\x9e\xe0\xdb\x5b\x56\x42\xf2\x50\x70\xf3\x3f\x66\x1c\x1d\x95\x1c\x7c\x2b\x4a\xfe\x77\x8b\x99\x7f\xd4\xb1\x71\xdd\xf2\x7f\x61\xd3\x9e\xe5\x57\x67\x5b\xc6\x97\xff\x14\xf5\x5b\x9e\x74\x43\xc3\x5f\x9a\x15\xdd\xf3\xc9\x82\xce\xfd\x90\x7d\x95\x3c\xf8\x1b\xc6\x2d\xa7\x4a\x37\x4f\x38\xd9\xeb\x1d\x62\x95\x5d\x2e\x0b\xab\x07\xd3\xee\x0b\x15\x33\x52\x13\xe8\xda\xf0\x4c\x70\x1e\xc6\x7b\x58\x27\x62\xa3\x3c\xf5\xe8\x3f\x1a\xef\x52\x08\x1b\xad\x2d\x2d\x72\x71\xdf\x46\x05\xc1\x6e\x7d\x15\x70\x68\x37\xc8\xf7\x4b\x4b\x6d\xbc\x46\x1c\x23\xbf\xe0\xf1\xcc\x81\x32\x19\xf8\xf5\x68\x86\x93\x4a\x02\x61\x42\x15\x41\xba\x81\x8e\xf0\x89\xa3\x8f\x2d\xfd\x71\x3e\xfb\x39\x97\x02\xd1\x8d\xaf\x55\xbc\xdd\x92\x5b\xaf\x6e\xff\xaf\x29\x71\x70\x59\x57\xbb\x8a\xf8\x99\x05\x6d\xbd\x4a\x44\xda\x52\xac\x7a\x07\x51\xec\xfe\x69\x96\x5c\x07\xf9\x3d\x88\x1d\xba\x96\x19\xd3\x4c\x8d\x95\x85\xc0\xe5\xeb\xfb\x33\x38\x5c\x54\xdf\xfd\xef\x96\x7c\x61\xcf\x99\x85\xe1\x96\xd5\x3c\xac\xfd\x68\xc7\xfd\xa4\x2f\x1c\x27\xfe\x8a\x7e\x08\x0b\x53\xc0\x7b\x6b\x17\x78\x9e\x87\xcd\xf8\xb2\xcb\xf2\xa6\xff\x4c\x2c\x07\x56\xb1\x4b\xe1\x82\x48\xd1\x17\x8a\x3d\x0e\x87\x3f\x0c\x28\x5a\x6e\xf5\xbb\x0b\xb1\x68\xa8\x18\x54\xff\x2f\xee\x61\xb4\xd4\xa7\x88\x6f\xb5\xaf\x52\x33\x70\x72\x4c\x00\x0f\x64\x7e\x7f\xb4\xfb\x8c\x85\x5d\x86\x6e\xed\xc3\xda\xb0\x04\x7d\x18\x66\x10\x6f\x3d\xde\x99\xb1\xba\x3a\x23\xed\xa8\xff\xf2\x81\xe6\x4b\x18\x64\xc2\xbd\x4c\xa3\xe7\xe6\xbc\x36\xcb\xa5\xc4\xea\x43\xb1\x6d\xe7\x43\x7e\x88\x47\xcd\x31\x87\xbe\xb3\xda\xea\x59\x20\x82\xeb\x1f\xe2\xb4\x9a\xcb\x12\x75\xf7\x2c\x67\x87\xf9\x67\x41\x0c\x96\x1f\x2b\xca\x10\x9a\x3b\xf8\x47\x4a\xe8\x2c\x27\x7a\x8c\x12\xfc\xef\x26\x05\x62\xfa\xf1\xe8\x6c\xd5\x71\xbc\x7c\x84\x25\xdf\x74\xc7\x9c\xf9\x1f\x77\x62\xdb\xb8\x5b\x3b\x3e\xa9\xb1\x06\xfb\xee\x97\x3d\x13\x33\x6f\x2b\x1e\x17\xd9\xee\x0b\xf4\x87\xeb\x68\xe5\x3c\x3a\x25\xc6\x7d\x5d\x71\x5f\xd0\xf5\xc1\x4b\xb8\xd6\xb8\x03\xc6\x13\x33\xee\xa0\x37\xac\xea\xc2\x98\xe4\x8f\x4b\xf8\x35\x5a\x71\x97\xc8\x78\x83\x43\x17\x89\xc5\xcf\xc3\xa3\xb9\x34\xfd\x05\x27\xe6\x41\xd9\x26\x2b\x94\x27\x90\x5f\xff\x94\xa8\x80\x4f\x95\xd4\x59\xba\x0a\x6c\x0f\x4f\x79\x38\xc8\x67\x38\x23\x0f\x45\xb3\x5c\x84\x75\x3c\x5c\x52\x50\xac\xae\x65\xb8\x2d\x7c\x93\x56\x6c\x6b\x72\x4e\xe2\x16\x8c\x32\xeb\x95\x47\x55\x59\x25\xb2\x2b\xdd\x7e\xc6\x47\xbc\x24\x0b\x0d\x76\xea\x32\xfc\xae\xbf\x77\x99\xc5\x42\xfc\x57\x7d\x56\x88\x98\x60\x15\x4b\x04\x74\x5d\x90\xf9\xf3\x20\xe6\x35\xd2\x07\x56\xec\x8e\x0e\x17\xbf\xb1\x36\x3a\x0b\xe1\x74\x8e\x58\xeb\x38\x2d\x4d\x50\x50\x54\xbe\x29\xdd\xbd\x36\xeb\xb0\xde\xef\x66\xfe\xde\xb2\xd7\x30\x72\xb2\xfd\xa1\x9d\xc2\x80\xf3\x07\xcd\x79\x71\x39\x5e\x21\x3c\xd8\x77\x29\x75\x29\x42\x70\x61\x42\x0e\xd7\xfe\xb3\x79\x0d\xf6\x71\xc1\x7a\xba\x3c\xf1\xbd\xa4\x49\x7f\xef\x06\x93\xa2\xd9\x15\x69\x3f\x8f\x5f\xfe\x71\x8d\x62\xa9\x57\x6c\xae\x3d\x22\xfc\xd2\x57\x6b\x47\x7d\xe5\x27\x48\x78\xe0\x88\x45\x0c\xbc\x62\xe4\xef\x9e\x25\x61\x3f\xe3\x5d\x67\xb1\xc6\x8a\xb5\x3b\x3e\x1c\x16\x97\xc6\x19\x44\x90\x32\xd3\x73\x8e\x9f\x8f\x44\xfd\x85\x21\x57\x77\xec\x17\x0a\xb8\x85\xf1\x63\x11\x9d\xdb\x6a\x41\xa6\x11\x00\x07\xf4\xdf\x9a\xc3\x3a\xd2\xb6\xd1\x78\x8c\x38\x4d\xaf\xfd\x58\xbe\xc1\x7b\x4a\xd3\xdd\x41\x04\xec\x46\x24\x4e\x88\x07\xd6\xcb\x81\x17\xc6\x5f\x04\x7b\x2d\x6e\xca\xc2\xd2\xd0\xc4\x99\x49\xba\x8a\x4f\x84\x98\x7d\xfc\x6a\x47\x64\x32\xa9\x76\x42\xe2\x31\xa6\x7d\xc5\xbb\x88\x0f\xec\x15\x18\x27\x0e\x6c\x9d\x65\x2b\xed\x02\xad\x3d\xa4\x10\xf4\xaa\x6e\xa1\x22\x14\x35\x08\xab\x5f\x3b\x73\xbc\xfc\x03\xce\xf9\x52\x69\x17\x86\x57\x6f\xf9\x84\xbd\xf1\x0e\xfb\xa1\xff\xaa\xf5\x10\x20\xf0\x72\xd7\xde\x07\x85\xa2\xc2\x63\x62\x5b\x7d\x65\x8a\x41\x5e\x09\xde\x60\x27\xe9\x7a\xdb\xfb\xa3\x60\x03\x4f\x7b\x96\xc3\xaf\x17\x75\x9c\x4d\xde\x6b\x58\x9e\x5f\xef\x90\x8e\x22\x19\x97\xb9\x3f\x79\xa4\xbc\x74\x8d\x60\xa0\x56\xd7\x4d\x35\x58\x7e\xdc\xb9\xae\x14\x16\xcf\x91\xb0\x43\x73\x7b\xbc\x0d\x81\xfa\x85\x76\x00\x1e\x8a\x2d\x9b\xc2\x9a\x99\x59\x9a\x86\xcb\x0f\x75\x40\x7f\xaa\xee\xf6\xa0\xe2\x58\x51\xd7\x10\x3a\xeb\xa8\x13\xb3\xe1\xe6\x9f\x5f\xb5\xab\x20\x54\x20\xce\xcd\xfa\x79\x8e\x81\xe8\x59\x22\xb6\x5f\x96\x7c\xf6\x0c\xad\x9f\x68\xda\x8c\x12\x91\xff\x82\x24\xa7\xb8\xcf\xec\x5a\x15\x17\xe9\x6c\xf6\x9e\x30\xb0\xf3\x3f\x20\x17\xa1\xfd\xa7\x9c\x12\x00\x0c\x36\x6b\x4a\xce\xd0\x81\x06\x36\x0a\xa1\x7b\x6e\x11\x0f\xbc\x5b\xe8\xdb\xe9\x1b\x34\x60\x41\x5d\xae\xb6\x94\x83\xa5\x95\x92\xd0\x22\x3d\x58\x4d\xf2\x71\xa3\xaa\x82\x9c\x9c\x03\x1b\x92\x30\x41\x57\xff\x41\xec\x42\x17\x3d\x41\xf2\xfb\x91\x6f\x19\x59\x58\x13\x42\xa1\xab\x27\xd4\x71\xb5\xd4\x9b\x1c\xa2\xdd\x36\x91\x9b\x8f\xb0\x54\x15\xf3\x17\x66\x17\x1f\x29\xe7\x77\x51\x12\x77\x3b\x52\x16\xe2\x8a\xf0\x9b\xcc\x84\x48\x76\x68\xd4\xb9\xf0\xd2\xef\xc1\x7a\x4f\xf7\x58\x1d\xed\xcc\xc5\xa3\xbb\xf6\xd1\xe4\x02\xde\xa0\x7e\x99\x6d\x75\x10\xc6\x27\xc4\x66\x0b\x6b\x3d\x5b\xb8\x5b\x84\xd3\x00\x0f\x4d\x6a\xf9\xc6\x58\x79\xe7\x90\x1c\xa4\x80\x2c\xe8\x36\xff\xa5\xee\xa9\x15\xfa\xd2\x2b\x6e\x97\x35\xc7\x76\x89\xda\xec\x8a\x29\xea\x8c\x99\x5e\x83\xf0\xb2\x6a\xb3\x9b\x11\x7a\x3d\xa9\x48\x18\xc1\xca\x26\xc8\x7d\x2b\xf5\x49\x98\x48\x46\x36\x76\x55\xa6\xb0\x67\x3b\xfc\x72\x85\x3e\xe2\x63\xb8\x14\x22\xb0\xba\x4b\xe1\x66\x20\x07\x56\x65\xa2\x06\x41\xd7\xb5\xaa\x81\x0a\x2e\x9a\xd0\xb2\xd0\x4d\xe5\x6a\x6a\x89\xc9\x5f\x13\xeb\x24\x11\x09\xcd\x42\xec\x23\x91\x2a\xcf\xd5\x05\x45\x6d\xcb\x27\xaa\x27\x4b\x3e\x24\xcd\xb2\x22\x07\xd9\x30\xf5\x72\xbc\x0e\xbb\x8e\xf0\xff\x4a\xe5\x4b\xff\x2f\x99\xac\x2e\xd0\x95\x12\x00\xf4\x44\x7b\x0a\x5b\x9f\x32\xd4\x5b\x12\x0f\x0f\xf1\x0e\xef\xa3\x28\x2d\x42\x85\x9a\xe7\xff\xb1\xc2\x4c\x47\x4b\x9b\xd8\xce\x66\x1a\xb6\xf5\x8b\x0a\xc6\x95\x49\x82\xc9\x89\x84\xd6\x70\x34\x1e\xe5\xec\x17\xb7\x7f\xfa\xc7\x7b\xf0\x88\x56\x61\x85\x4b\x10\xf1\x67\x04\x22\x68\x59\x9a\xc4\xa2\x84\xe2\x13\x2b\x89\x2d\x72\xd8\xcf\xda\xdb\xce\xf9\xc8\x1c\x71\xe8\x33\x47\x65\x7f\xd5\xdf\x81\xbf\xb2\x6a\xef\x28\xfa\xc9\x98\xcc\x92\x71\x78\x58\x99\xe2\x52\x07\xda\x3b\x4c\x7e\x03\x4d\xf5\x54\xf0\xf5\xa4\x0e\x70\x52\xc6\xd9\x04\xe7\x50\xfd\x0c\xa7\x4f\x72\x01\xe7\x2e\xaf\x16\x8b\x0a\x45\x3c\x99\x70\x1a\xa1\x2c\x13\x87\xe7\xb7\xb2\x66\xdc\x84\x44\x6e\x7a\x02\x93\xc6\x1f\x53\x1e\x89\x43\x9e\x11\x4b\x7e\xec\x2c\x29\x0f\xc9\x31\x08\x58\x8e\x76\x21\x04\x43\x71\x15\x4d\x74\x14\xaa\x6d\xdd\xa9\x2c\x43\xde\xe1\xc6\x5d\x9b\x59\x77\x38\x75\xe7\x98\x13\x5b\x91\x29\x39\x6c\xa3\x3a\x16\xcf\xdb\xf5\xef\x00\xa5\x84\xb0\xe1\xb1\x05\x9b\x31\x78\xa2\x10\x5b\xb8\x69\xc8\x1d\xc4\xfa\x27\xda\x49\x87\x1e\x90\x31\x2c\x53\x24\xe4\x61\x88\x47\x78\x7b\x94\x08\x63\x2e\x60\xa7\xe5\xc5\x67\x8b\x09\xce\x07\x99\xec\x59\x29\x15\xf6\xe2\x94\xd1\xff\x81\x15\x86\xe3\x86\xfa\x52\x08\xcb\xbd\xc1\x84\x55\x04\x87\xc5\x4a\xed\xc9\xf2\x54\x1a\xac\x71\x66\xb0\xd3\xbd\xf5\x01\x4f\x0d\xc0\x31\x18\x95\x78\xf7\xf4\xf8\xae\x88\x5a\xe2\xd5\x38\xe8\x36\x02\x17\x31\x86\xc2\x3e\xac\x0f\x79\xc6\xaf\xe0\x85\x48\xe7\x64\x36\xd2\x90\xff\xd8\xdd\x01\x41\xa1\xa5\xdb\x90\x7b\xcd\x85\x73\x0a\xbf\x5e\x98\x9c\x88\xea\x98\x5a\xf5\x1b\xf6\xd9\xf0\x43\x08\xed\xec\xbb\x99\x96\x6d\x4d\xcc\x71\x74\xac\x89\x35\x36\xb5\xa2\x57\xc1\xe9\xd0\x45\xf0\x4b\xa4\x3e\xe9\xb3\xb8\x22\x3d\x0c\x5c\x06\xc1\x8b\xf0\xa3\x50\xd9\x28\xcf\xed\x96\xe7\xd3\x35\xf9\xb5\x4b\x62\x05\x18\xda\x5b\xfa\x8f\xcd\x58\xe0\x84\x35\x1c\xc4\xf8\xc3\xbc\x4e\xa4\x2d\x78\xbd\xce\x36\x48\x3e\x24\x88\xfd\x31\x0d\x23\x5a\xcd\x0e\x5a\x89\x66\xa3\xc9\xf2\x8c\x05\xc1\x23\x56\xa6\x87\xa8\xb6\x84\x2b\x49\x3e\x94\xc4\x7e\xfc\x32\xaa\x8e\xa8\x2a\x2f\x3d\x0e\x81\x27\x0e\x24\x39\x62\x57\x67\xd2\x64\x38\xbf\x83\xdb\xe2\xdf\x0c\xa4\x5f\x30\x63\x5c\x9f\x9e\x6d\x55\xe8\x88\x06\x6d\x11\x1f\xc1\x15\xf6\x55\xe3\x28\x16\x4d\x4c\x52\x40\x3e\x68\x07\xe4\xc1\x68\x5f\x3f\x53\xe4\x61\xaf\x3a\xac\x09\x89\xda\x82\x11\xf3\xfd\x45\xad\x26\x79\x38\xe3\x71\xe0\x48\x2c\x0d\xcc\x7e\x4a\x1d\x63\xe5\xbf\x99\x26\x2c\x30\x47\x8d\xb1\xf7\xea\x2f\xb8\x2d\x3f\xc0\x3a\x69\x99\x3a\x2a\x77\x9e\xf4\x40\x17\x8d\x9c\x3f\x00\x92\x7b\x07\xb1\x48\x8a\x85\xdf\xf9\xa3\x29\x75\xf6\xf0\xc5\x4a\x93\x33\xc5\x0d\xbf\xb9\x0b\x13\xaa\xcc\x6d\xf8\x9d\x39\xeb\x78\x67\x96\x6f\x72\x43\x09\x7a\x22\x88\x9e\x5e\x86\xf2\xaa\xf0\x92\x7d\xf1\xa7\xfd\x2a\x7a\xb9\x5f\xbe\x3f\xbc\xec\xd3\xa0\xe1\xe0\x9f\x3c\x64\xc4\x51\x15\x58\x9d\xd3\xf3\xec\xa8\x7f\x3f\xf5\xa8\x55\x95\x3b\xdb\xc4\xab\xde\x1a\x6c\xdb\x16\xe8\x5f\x58\x57\x0a\xa8\xac\xe2\xb0\x7b\xc8\x17\xc1\x53\x14\x69\xe9\xca\xe2\x63\x5f\x9c\x0e\x5c\x34\x4d\xb8\x1c\x49\xf7\xaa\x0c\x66\x6a\x78\x74\xd7\x34\x95\x95\x10\xfd\xca\xb6\x8c\x00\x32\xd4\x2c\x21\xf3\x2d\x0a\xbc\xcc\x41\x49\xcc\x63\xd8\xac\x25\xe1\xa8\xe7\xbe\xa4\xb7\x17\xa6\x56\xea\xb2\x32\xf4\x29\xf6\xcf\x3e\xfd\xe3\x9f\x5c\x15\x09\xb6\xf8\xbe\x61\xbf\x7c\x0f\x58\xc1\x2a\xda\xaa\x69\xf6\xda\x38\x8b\x65\x70\x4b\x10\xe7\x22\x06\xb2\xe9\x94\x79\x01\xac\x13\x0c\xb4\x94\x62\x79\xc8\xcd\xd0\x6a\xd8\x68\xf8\x4f\xeb\x68\x8b\xe4\x2f\xef\x44\x2c\xc8\x45\x2f\xed\xa7\x41\xfd\xab\x2f\xc8\x51\xf1\x82\x82\xe5\x1c\xcb\xb4\xf2\x2a\x3a\xee\x41\x83\xc5\x03\x89\xd9\xfe\x78\xff\x13\x30\x76\xa9\xd6\x81\x97\x1b\x49\xa8\x47\x5d\x83\xd9\x72\x48\xbf\x11\x51\xc1\x18\x3a\xa0\xcd\xc3\x72\xaa\x52\x09\x4f\x9e\x48\x75\xb8\xa2\xce\x27\xe7\xd6\x12\xfa\xc3\xdd\x84\xc4\x69\x67\x39\x0c\x5d\x70\x94\x66\x47\xe2\x65\x89\x12\x99\x67\xfe\x0e\x75\x3f\xcb\x60\xd6\xae\x7b\xd9\xa8\x9a\xf7\x90\x4b\x2e\xc0\xd9\xd3\x14\x1b\xfa\x65\x89\x62\xe0\x3c\xeb\x78\x6b\x06\x45\x98\xfe\x2b\x12\xd7\x40\x48\xa3\x34\xcd\x9f\x0d\x2b\x48\x90\x2c\x45\xf7\xc4\x70\x18\x54\xcc\x4f\xbf\x97\xeb\x25\xfb\xa0\x7a\x5e\x52\xde\x70\xf0\xa8\x54\xee\x0a\xf7\x2a\xbe\x7c\x35\xfa\xad\xad\xaa\x9e\xc6\x88\xdc\x17\xf9\xad\xc2\x13\x60\x6a\xd1\x4a\xae\x68\x9b\x93\x12\x2f\x95\xd9\x5d\x4b\x92\x3e\x84\x52\xde\x34\x75\x43\xb8\x99\x8a\xd7\xaa\xa8\x95\xfa\x4f\xbf\x0f\xbf\x77\xee\x64\xb8\x78\x04\x8c\xda\x6f\xf0\x6f\x28\xa7\x0c\xea\xd7\x12\x5a\xe0\xdc\x24\xa0\xc0\x48\x8b\x6c\x8c\xd6\x5f\x01\x6b\x55\xf7\x41\xef\x1f\xf7\x9d\x53\x5f\x6d\x15\xe1\x3f\xd5\x34\xfc\x89\xf8\xd9\xfb\xe4\xa3\x8f\xc9\x63\x3e\xee\x1a\xe3\xac\xda\xba\xfd\x09\x84\x21\xad\x8c\x8e\xa3\x62\x75\xda\x8d\x2f\x86\xe3\x1e\x59\x2e\x93\x94\x87\xb2\x78\x0b\xdd\xd4\x52\x5b\x60\x1a\xfa\x79\xcd\xc7\x59\xef\x2d\xd8\x45\x6e\x55\xc7\xb6\xb7\xb7\x5e\x76\xc9\xaf\x43\x03\x74\x7b\xbf\xe3\x16\x05\x33\xc9\x1f\x9e\xcc\xb5\x5d\x32\x0f\x57\x38\xd2\x8b\xdb\x48\x65\x8c\xd4\xd9\xf3\xed\x66\xcb\xaa\x7d\xeb\x1a\x63\xf3\xa4\xa9\xf9\x06\x9b\x4a\xc2\x9d\x95\xf9\xd5\xb3\x95\x1f\x2c\x70\x65\x11\x39\x17\x82\xc4\x1e\xd6\xc6\x7f\x82\x47\xbc\x3f\x96\x6b\xe2\x9b\x6d\xcb\xa7\xc6\xe8\x83\x4b\x5a\xfe\xc0\x88\xf1\x8d\xfb\x0f\xb7\x94\x24\x3a\x56\x01\x69\x90\x7e\x6f\x57\x73\x94\x9a\x64\xca\x72\xb3\x53\x9b\xdc\x37\x90\x55\xee\xd9\xd4\x36\xc8\x75\x25\x9b\xca\x6b\x60\xff\x21\x55\x41\x63\xb6\x83\x9c\x01\xa6\xc1\xe0\x3e\x0a\x63\x7b\x3d\xe5\x43\x53\x3a\x7d\x2e\x7c\x10\x26\x52\xdd\x29\xd0\x09\xef\xdd\x1c\xf1\x70\x01\xa5\xda\x4f\x0a\x83\xdd\x08\x1c\xc0\xb5\xac\x8a\x66\xe4\x6b\xec\xe3\xf7\x44\x11\x6c\x78\xec\x79\x05\x0c\x8f\x80\x77\x62\xb4\x8d\x57\x59\xbe\x80\x80\x90\xb2\xe5\x83\xd0\xcd\x08\x2a\x9c\x72\x6f\xb6\xa1\x89\x8d\x37\x11\x48\x46\x7f\x25\xfd\x0b\xe9\xf1\xcc\x29\x29\x3e\xd0\x4a\x16\x7e\xc1\xe2\x1c\xed\x5d\x02\x5c\x46\xf6\x64\x5c\xbe\xb0\x71\xcd\xbb\xff\xd9\xa0\x31\x86\x74\x99\x75\x08\xe6\xf1\x11\xac\xf9\xbc\x35\x7a\x78\x1e\xaa\x44\x6d\x91\x17\x9e\x40\x1e\x32\x47\xe4\xb7\x56\xa2\xbe\x6b\x47\x81\x0f\x19\xbc\xcf\xe5\x73\x51\x03\x54\xfe\x87\x3d\x8c\x1a\x1f\x0d\xeb\x1c\x97\xf5\x47\x78\x22\x70\xa6\xcf\x8c\x39\xb7\xe9\xc5\x02\x09\xf9\x3c\x05\x9f\xe1\xf2\xfe\x14\xb5\xd7\xd9\x54\xf8\xa6\xac\xed\x01\x1c\x2a\xa7\x6a\xda\xdf\xa6\xe4\xb9\x70\xf8\xd3\x86\x36\x04\xff\xdd\x4b\xee\x93\x35\x37\xfc\x77\x55\x68\xdb\x0b\xdb\xcb\xd3\x66\x09\x8a\xe6\x70\x70\x9f\x43\x7c\xab\x1c\x3b\xe1\x55\xe3\x0f\xcb\x33\x62\x5c\x97\xbe\x90\x9b\x89\xf8\xb9\xac\x15\x77\xb4\x21\x67\xd9\x03\x2f\x2e\xb6\xec\x63\xa2\x04\xd2\x75\x20\xc3\xb7\x6d\x19\x6c\x94\xa0\x9f\x16\xf3\xc9\x96\x00\x2e\x20\x02\x7b\xb0\x32\xff\xd9\xde\x90\xa3\x69\xbb\x83\x78\x9b\x76\x52\xb1\x15\xea\xed\x94\xd7\x63\x44\xfa\x10\x92\xfe\xc9\xc4\xfb\x96\x62\x0f\x39\x91\x44\x1c\x3d\xf3\x9e\x91\x25\xd9\x09\xc0\xb3\xb5\x86\x39\x7d\x6b\x6f\xad\xc5\x79\x5b\x09\x70\x04\x9f\xa0\xea\x4f\xb5\x3b\x49\x90\x35\x88\x79\x2c\xf0\xc3\x3c\x14\x4c\x02\xc9\x92\x52\xb8\xec\x00\x38\xcd\xb2\x0e\x8c\xe4\xd6\x23\x6c\x05\xeb\xff\x47\xd6\x9b\xa5\x3b\xcb\xf3\x4c\xa3\x73\xc9\xf1\x3f\x29\x03\x0e\xb0\x68\xcc\x0b\x38\x79\x92\xd1\x6f\x95\xaa\xe4\xdc\xdf\xb5\x8f\xf0\x4a\xb7\xd2\x80\x6d\x95\xaa\xf9\x2f\x6e\xb1\xaa\x9c\x8e\xff\x30\x14\x8e\xcd\xbf\x1c\x09\x61\x1a\xcc\x01\xa4\x44\x2d\x64\x1d\x84\xc9\xb0\xc1\xd9\x25\x30\x22\xd5\xdf\x77\xfa\x0a\x09\x0a\x42\x98\xed\xfa\x03\x83\x5e\xa5\x31\xa2\x12\xad\x5b\x45\x23\xee\x20\x8e\x75\xc3\x97\x2e\xf3\xbd\xa0\xe6\x73\x0a\x01\xb4\xe9\xa7\x60\xb2\x8e\xed\x49\xb7\xd0\x59\x69\xc1\x06\x69\x90\x5d\x0f\x31\xf2\xa3\xfb\x03\x77\x69\x95\x76\x68\xf1\xd3\x3e\x31\x23\x39\xdd\xbb\x5f\x0f\xb6\x3f\xf4\xcf\xfb\xa0\x6e\xc8\x0f\x9d\xc8\xaa\x88\x85\x21\x15\xd5\xa1\x7e\x0c\xd6\x21\x89\x39\xc0\x44\xe6\x7f\xb2\xa0\x52\x97\xb8\xf9\xf8\x7e\x70\x1b\x3e\xd7\x97\xf3\xd6\xa7\x68\x3e\x79\x73\xff\xf4\xae\xbb\x28\xa7\xc1\x16\x79\x2b\x34\xec\x05\x5f\x4a\xba\x0a\xfb\x6e\x9a\xbe\x82\xf3\x40\x86\xdd\x2b\xbd\x28\xef\x4e\x57\x17\x8b\xf2\x2b\xed\x30\xe6\x10\x4c\x3c\xb0\x26\xae\xa3\x2c\x27\xdd\x7a\xb8\x61\x59\x77\xf5\xb3\xc0\xde\xef\x38\xc8\x1b\xa7\x52\x0a\x77\xcb\x1e\xce\x63\xf9\x7e\x18\x31\x27\xb9\x5b\xe6\xb3\xa1\x77\xb3\xf2\x42\x89\x07\x9c\xac\xef\xa4\x6e\x2c\xa2\xfc\xf8\x72\x8a\x22\x42\x93\xc0\xb1\xd1\xb7\xac\xd5\xaf\x7a\xf7\x00\x62\x39\xde\x9b\xa9\x05\xbe\xc3\xd6\xdb\xc7\xf7\x29\x9f\x40\x18\xf9\x3c\xc4\x34\x75\x19\x0e\xf7\xdd\xf0\xa5\xd3\x80\xdc\x52\xd0\xde\x7d\xe0\xdb\x63\xa1\xd0\x63\xbc\x36\x3a\xdb\x18\x80\xfa\xa8\x30\x86\xa3\x91\x4d\x25\x1b\x2a\xff\xc7\xe4\x87\x5d\x6c\xc0\xa7\xfe\xef\xe7\xf0\x20\xb4\xf5\x91\x8b\x97\x8d\x08\x34\xcb\x9f\x47\x26\x54\x61\xd4\xd3\xb4\xe3\x53\x18\xfd\x30\x68\xee\xca\x49\x0b\x1e\x29\xa7\x3f\xa7\x64\x6d\xc8\xd3\xfa\x25\x76\x7c\x29\x62\x5e\xdb\x53\xe0\xca\x34\xcc\x40\xd4\x7c\x83\x9c\x69\x94\x81\x7d\x37\xb7\xd0\x11\x78\x79\x7e\x3a\x29\x6d\xc1\x72\x98\x83\xe6\x80\x82\x2d\xa8\x08\xe0\x38\x04\x16\x73\x16\x5b\x30\x44\x14\x3d\x7f\x3d\xb4\xb3\x0c\x84\x13\xdd\xb3\xda\x8f\xc3\x2a\x63\x9f\xc0\xab\xfb\x5e\xb2\xd7\x33\xcf\x61\xd1\xac\xfa\xe8\xcc\x0a\x94\xf8\x70\xe7\xee\x50\xb5\xcd\xbc\x2d\x2a\xf4\x7f\xd5\x5f\xcc\xb7\x92\x0f\xa7\x3c\x44\x3e\xf3\xe1\xbb\xc0\x07\x71\xec\x33\xb2\x21\x62\xc3\x9d\x43\x2a\x61\x85\xa2\x6d\xa8\xb8\xb5\x76\x5d\x89\x53\x10\x3e\xc1\x8e\xdd\xcb\x0f\xa5\x56\x38\x62\x52\xe3\x71\x4f\x12\xa6\xc3\x55\x6f\x16\xaf\x00\xf3\x6e\xf8\x9a\x39\x05\x61\xe7\x80\xd6\xcb\x1e\x0d\xe5\xfc\x72\x1f\x12\x3d\xc2\x50\x02\xa3\xc0\xc7\x00\xf7\x50\xff\x43\xd7\xc4\x87\x6f\xa1\x1b\x41\x35\x5e\xc3\x65\x2c\x0e\x81\xff\x08\x3f\xa2\x28\x70\x2f\x6c\x97\xc9\x1a\x69\x4c\xc2\x76\xb6\x4c\x2d\x4f\x96\xa3\xe2\x29\xbd\xd0\xe1\x2d\x3a\x3e\xcd\xb9\x0a\x3e\xb0\x2a\x80\xb7\x78\xe8\xbe\xff\xab\x7e\x88\x06\x2a\x36\xe8\xa5\x05\x35\xaa\xe6\x80\xf2\xa8\x92\x3d\xe2\x22\xa4\xb3\x59\x06\x6d\x47\x17\x5b\x71\x90\x5e\xe7\x06\x7f\xd7\x2f\x01\xee\xaa\x40\x27\xc5\x2c\x93\xb8\x48\xf6\x84\xbd\xb5\xa4\xbd\xba\x2b\xe9\xf9\xf6\x12\x8d\x47\xd7\xda\xab\x2b\x0c\x26\x1d\x2f\xb3\xb5\x10\x27\x5e\x35\xf1\xac\xb3\x58\x69\xee\xc1\x4b\x98\x59\xb6\x59\xab\x67\x61\x3e\x88\x46\xc7\xa6\x76\x0d\x49\xfd\xb3\xc8\x66\x74\x05\xbc\x42\xc0\x65\x61\x2c\xe6\xb2\x57\xe5\x3f\xe9\x22\x07\x11\x38\x16\x6d\xdb\x77\xf7\x12\x56\xda\x42\xc8\x1d\xcf\x32\xff\x92\x6b\x6c\xdc\x8c\x54\x96\xdc\x3c\x80\x8e\xd8\x90\x6f\x81\x45\xf3\xfa\x5c\xb4\x77\xa7\x93\x93\x93\x15\x14\xa7\xbc\xbb\xda\x81\xfa\xa5\x8d\xb6\x41\x6a\x07\xfe\xa1\x25\x44\x27\x21\x5b\x71\x98\x95\xa4\x2e\xbd\x6d\xc2\x47\xf6\x3a\x27\x9a\x57\x4e\xb3\x90\x6c\x86\xe4\x4f\x2d\x69\x71\xca\x32\x8f\xb6\x19\xe6\xdb\x76\xda\x7b\x78\x57\xda\xa6\x5b\xf3\x85\x47\x4a\xf9\x31\x94\x4b\xb2\xf2\x1c\x2b\xb1\x1b\x19\x56\xe7\x9d\x7e\x89\x67\x73\x9c\x2e\x59\x99\xb8\xe4\xad\xfa\x86\xdb\xdd\x6f\x39\x52\x14\xc4\x88\x22\x20\xa0\xe5\x9e\x3f\xc4\xf8\x4f\x00\x85\xad\x57\xdf\xe0\xa9\xd2\xfc\x3a\xad\xcd\xe4\x47\xbe\xd9\x29\x9f\xfa\xa6\x9f\x55\x0b\x10\xa2\x2e\xb8\x21\x3e\xa9\x14\x7e\xce\x25\xec\x53\x9f\x6a\x83\x3e\x49\x21\xdf\xc2\x28\xe1\x99\xe5\xa0\xff\x04\x37\xd4\x8f\x9d\x16\x36\xe4\x6b\xfb\x26\xb7\x8a\x0e\x01\x84\xd0\x07\xb0\xde\x26\x2f\x82\xe9\xd9\xa2\x44\x02\x7b\x8e\x90\xe5\x33\x44\xd1\x43\x95\x47\xf2\x10\x26\xec\x03\x88\xc1\xf4\x78\xcc\x6f\x65\x52\xb1\x56\x1d\xca\xe5\x33\x3b\xc7\x91\xff\x39\xcc\xa7\xbc\xb5\x87\xf9\x29\xab\x0b\xdb\x5a\x9c\x0b\xef\xc4\xbe\x5a\x7b\xec\x30\x0e\xda\x23\x0c\x2b\x83\x4f\xa4\x3d\xf1\xa6\x4c\x3a\xec\x98\x1d\xb3\x7f\x38\x17\x63\x8d\x38\x4b\xf6\xc3\x07\x5d\x88\xbd\x9d\xcf\x14\x2e\x60\xaf\xfc\xd1\x31\x18\x18\x95\x5e\xc6\x8e\x58\x6b\x9b\xda\xa6\x8f\x1e\xeb\xf5\x49\xaa\xa6\xbb\x39\x93\x6b\xf1\x12\x52\x5d\x95\x7f\x61\x9b\x62\xca\xef\x4b\xb0\x3a\x40\x58\xe6\xb6\x19\x00\xfd\x1e\xbc\x0d\x6e\x5a\x01\xb6\xfb\xd1\x49\x17\x1d\xb3\x2e\xfa\x19\xd6\x49\x3e\x9a\x6a\x38\x13\xf6\x48\x7e\xf9\x6d\x93\x3d\x28\x97\x9f\x1c\x05\x38\x36\xa6\xdc\xac\x7b\x07\xc3\xf7\xd5\xdc\xcf\x71\x93\xbc\x1d\x24\xdc\x01\x23\x9f\x15\x63\xee\x61\x1c\x1f\x29\xa9\x7a\x99\x70\x75\x9e\x41\x18\x2e\x91\x57\x20\xe0\xb6\x97\xca\x1a\x69\xbb\x0b\xd5\x39\x31\xf6\x53\xc2\xd4\xae\xbc\xb9\xff\xa5\xe7\x91\x00\xe5\xb2\xcb\x5c\x72\x8d\xc4\x4c\xce\xc2\xdd\xda\x78\xb1\xb8\x8e\xe4\x24\x29\x69\x2f\x93\x24\x7c\x40\x05\x63\x17\xf6\x66\x5d\x22\x5e\xd7\xb9\x0f\x39\xd1\xef\x73\x4f\x54\xf6\xa3\x0b\xa1\xa8\xaf\xb5\xab\x59\x36\x93\x11\xfd\xdf\xa5\x9f\x60\x2a\xd5\x4f\xa6\x31\x75\x0a\x57\x49\xd7\x38\x68\x6f\xcc\x9d\x9d\x4d\xb6\xb4\x03\x4e\xc1\x77\x48\x08\x3e\x91\x44\x14\x3e\xec\xfe\x3d\xd9\xb4\x3f\x3b\x71\x28\x59\xa1\xbe\xcb\x5a\x2a\x21\x91\x09\xa7\xc8\x17\x6d\x46\xdf\x26\xbb\x86\x1a\x83\x14\x06\xaf\x9f\x7a\xfb\xc2\xf2\x09\xcb\xc3\xf7\x67\xe4\xbf\x7e\xd7\xd3\x35\x5c\x95\x33\xfb\x7b\xf6\xec\x1a\x42\xd2\x90\x6d\x89\x3a\x6b\xcb\x38\x69\x1f\x13\x04\xb9\x82\xaf\xe7\xeb\xab\x63\xb3\x02\x07\x0d\x2e\x25\x0e\x7d\x0f\xf9\x4e\xff\x05\x27\xf7\x5f\x7e\xbe\xfd\x25\xe7\xef\x71\x94\x63\x85\x82\xc7\x1e\xdc\xac\x13\x8e\xb2\x3a\x59\xd3\x00\x33\xc7\x9c\xd9\x01\x8b\x91\x4f\xe9\x39\x1c\x3e\x61\xc1\x94\x77\x6f\xd1\xf2\xa2\xab\xc2\x38\xea\x4e\xb9\x5f\x75\xf6\xe9\x5d\x37\xed\xa8\x49\x2f\xb8\x4f\x8a\x60\x99\x0e\xea\x83\x00\x6e\x6f\x39\x0e\xdf\xf3\x11\x7e\x97\x6b\x23\xea\xd2\xcd\xc9\xc7\x68\x9b\x09\x77\xcf\x77\x10\x7e\xee\xcc\xa8\xcb\xdb\x49\xfd\x3d\x87\xae\x8d\x79\x00\x32\x5f\xb4\xf5\x7c\xff\xe8\xbb\x6f\x24\x94\x11\xde\xae\x8d\x5b\x51\xb5\x0b\x0f\xff\x4a\x7b\x9b\x1d\x8f\xe9\xa3\x76\x1d\xb6\xf4\x5b\x90\x7e\x5f\xaa\x35\xae\x3b\x24\xd5\xbe\x23\x6d\x00\xf6\x21\x78\xfa\x08\x77\x89\xeb\x20\x7e\x03\x76\x15\xb9\xc1\xfe\x15\x62\x1b\xaf\x6c\x1d\x1b\x32\xe7\xcb\x4e\x85\x21\x9e\xb5\x0a\x21\xbb\xb4\x88\x13\x69\xf7\xd2\xdd\xce\x84\x59\x06\x04\x6e\x40\xe5\x83\x71\x6f\xbd\x2b\xfb\x63\x6c\x9b\xff\x88\x41\x9d\x90\x6a\x1d\x9b\x70\xa7\x83\xb0\x18\x98\x3d\x2f\xcb\x36\xfd\x47\x0b\x45\x3d\xb1\xe1\xe4\x93\x52\xe0\x58\x57\x13\xa7\x45\x68\xee\x95\x37\x39\x0b\x6c\x9b\x82\x53\x15\xac\x71\xe5\xf8\xf7\x40\x08\xb8\x53\xba\xfa\x19\x4a\xfa\x5d\xd0\xbd\xed\x02\x03\xce\x0f\x7f\x85\xe6\x60\xa5\x3f\x1a\x9b\x25\xcf\xa1\x72\xcb\x59\x89\xab\x77\x18\x5a\x21\x71\x75\xe6\xe8\x24\x2f\xf1\x42\x42\x8f\x2c\x3c\xaf\x5f\x10\xdb\x95\x9a\x5c\xff\x92\x50\xfd\x94\xf7\xe6\x59\x23\xa8\x85\xec\x6a\xdf\xf9\x57\x0a\xa3\xdd\x83\x57\x78\x7e\xe9\xa2\x0b\x30\x33\x91\xef\xcc\xff\xc1\x6d\xd7\x47\x11\xe7\x9a\x77\xd6\x13\xfb\xed\xd9\xed\xbc\x2d\xbe\x44\x48\xe5\x34\x48\xcd\x11\x61\x63\xa5\x11\x9e\x59\xe1\xd6\x7c\x7c\x04\xbc\x1c\xa7\xac\xb3\xd0\x6e\x65\x0f\x00\xa3\x08\xb2\x63\x59\x62\x0b\x02\xbf\xe7\x83\x79\xe8\xf0\xd4\x4a\xea\x11\x7c\xc5\xa7\x19\x4e\x12\x79\x8e\xf4\x33\x3e\x98\x05\xbc\x1c\x49\xf5\xb6\x9d\x44\x6e\xac\x75\x76\x2a\xa8\xa8\x96\xf3\x27\x20\xe5\x8b\x26\x59\x36\xd5\xb7\x82\xc5\xdd\xd9\x3f\x3e\x6a\x6b\xef\x9e\xde\x60\x5c\x79\x7d\x20\x9a\xed\x56\x37\x06\xac\x96\xf3\x98\x58\x12\xb8\xca\x3a\x52\xbf\xb7\xf9\x93\x62\x63\xb9\xe1\x6c\xa6\x99\x80\x5b\xd2\x06\xce\x8f\xb0\x69\x92\x52\xe4\xf7\xb3\x29\x36\x0b\xd8\x7e\x4e\xf2\x02\xdd\x23\x78\xc6\xca\x8a\x39\xd2\x65\xd6\xbc\x36\x07\x51\xb7\xd9\x3c\x03\xfc\xcf\xf9\x15\x05\xc5\x1e\x49\x33\xf7\x1d\x22\xb8\xe6\x5c\x20\xa5\x07\xea\x01\xf9\x37\x42\xcc\xa9\xf2\x29\xa1\x56\x92\x52\xcf\x16\xab\x70\x6e\xde\x1a\x53\x27\x31\x5c\x7b\xfd\xec\xe4\x21\x7f\xd8\xa5\x74\xda\x0c\xcb\x87\x65\x11\x0b\x46\x47\xdb\xc3\x7b\x5d\x30\xaf\xc1\x8c\x06\xf8\x0a\xa3\x95\x87\xa3\xfd\x22\xc6\x8c\x51\x65\xe4\x81\x39\x38\x20\x46\xb3\x73\xb3\x7a\xd9\x23\x02\x8c\x6c\xd5\xbd\xf6\xe0\x72\x03\xdf\xc1\x3d\x58\x31\xb6\x3e\x3c\x89\x23\xc0\x64\x54\x7b\x3a\x30\x68\x95\x39\x8f\xbd\x98\x5a\x23\x56\xa9\xa4\x60\x53\x0f\x36\x73\xe5\xca\xd7\xb0\x9d\xc2\x4e\xb9\x5e\xc2\x1e\xa0\xe7\x48\xba\xea\xe5\xe3\xaf\xb3\x9c\x64\x23\x2d\xa7\x0e\x3a\xed\x97\x52\x9d\x6b\x66\x45\x0c\x69\x20\x70\x4c\x50\xd9\xb2\x05\x3b\x3b\x3e\xeb\x92\xc9\xf9\x59\x52\x44\x20\x2c\x11\x3d\xb9\x24\x01\x97\x7f\xde\x93\x54\xcc\x4e\xab\xbd\x6d\xb5\x67\x51\x62\xe5\xc9\x4b\xbf\xec\xc4\x96\x8e\x1d\xd4\x69\xb8\x44\xba\xde\x20\x12\xe6\xf0\xb9\xa7\x51\x41\x3c\x3b\xf9\xd3\xb6\xff\x61\xf9\x52\x82\xc6\x34\x51\x84\x3c\x15\xba\xed\x4f\x0e\x76\xad\x9a\x11\x11\x03\x91\x3b\x6d\x44\xa6\xbc\x89\x5a\xb3\x86\x13\xd8\x8e\x85\xa9\x39\xd6\xb7\xde\x41\x56\x10\xe4\x94\xec\x6e\x19\x9a\x56\x76\x15\x2e\x9c\x64\xa1\xf9\x8b\x34\x1f\x09\xef\x30\x83\x5f\xc1\xef\x8e\x44\xb0\x09\xb6\xb6\x61\xa6\xea\xcb\xf5\x58\xef\xa9\x45\xe2\xd7\xb5\x3b\x83\x70\x32\x0a\xdc\xa0\x2b\x2a\x4d\xc0\x4e\x36\x5d\x50\xcb\xda\x2e\xc1\xb1\x82\x30\x39\x1c\xcf\xc8\x06\x64\xcd\x88\xbe\x44\x94\xb5\x63\x91\xb3\xcd\x38\xdb\xd9\x91\x1e\xcd\xc5\x41\xf1\xfa\xab\xba\x17\x88\x34\xf1\xb5\x90\x85\xd8\x83\xb2\x41\xde\x09\x22\xa0\x3a\x16\xf4\x7a\xf8\x75\x23\x54\x1e\x55\x75\x78\x40\xe0\xf1\xb6\x80\xad\x05\x4a\xe4\xff\x4f\x0d\xed\xe7\x3f\xe2\x01\x28\x06\xc3\x3e\x35\xd4\x36\xcf\xf6\x51\x9f\xaa\x80\x9f\xc0\xe5\x6f\x95\x5b\xf6\xe6\xed\xe4\x73\xe8\x22\x8b\x00\x9f\x2f\x6f\x8f\xd0\x8b\xd2\xdd\xe7\xa2\xc0\x52\x25\x96\xae\x9b\x60\xe4\x50\x9d\x00\xed\x95\x4b\xf5\x95\xc3\x7e\x61\xd5\x0e\x43\x79\xb3\xcb\x10\x05\xd8\x3f\x61\xb3\xc3\xec\xde\x34\x3e\x7a\x06\xaa\x0d\x75\xb0\xce\x0f\x7b\xe7\x3c\xed\x59\x42\xb1\x34\x12\x29\x12\xfd\x85\x93\x09\xad\x18\xee\xac\xb9\xfa\x6c\x0b\x25\xef\x6e\x4e\x07\x03\x08\xfb\x72\x75\x85\x16\x81\x44\xcd\x21\xf1\x7d\x25\x2d\x1a\x43\x3a\x43\x79\xb8\x6a\x13\xe5\x55\x18\x2b\x2d\xda\xf1\x80\x23\xef\x75\x54\xb5\x0b\xce\x5f\xa5\xa7\xfb\x8e\x8b\xd6\x55\xbc\x9c\x11\x38\xec\x49\xe4\xe1\x25\x51\x69\x3a\x0d\xf3\x4b\x16\x5c\x9b\xf3\xf1\xfb\xf5\x13\x9d\x06\xc5\x9a\xf5\x39\xde\x88\x0b\x13\x67\xc9\x0f\xe9\xd7\xe5\x48\x0d\x49\x31\xb6\x43\x8d\xbc\xe2\xf0\xc2\xb1\x65\xea\x90\xea\x70\x15\x38\xd5\xd5\xf9\x3e\xc5\x23\x1a\x68\x0f\xdb\xad\x9c\x3d\x3b\x99\x61\x80\x73\x1e\xc5\x92\xf7\x8f\x83\x77\x5e\x14\x62\x54\x4a\x10\xc4\xc5\x90\xb5\x12\xea\xc7\x3f\x3f\xa1\x21\xe6\xbd\x60\xd9\x6c\x1a\x0d\x72\xb2\x88\x67\xda\xb2\xdf\xc8\xeb\x9f\xa8\xac\x7e\x2e\x0b\x1d\xdc\x25\xfd\xe8\x62\xfb\x87\x97\x59\x55\xfe\x5b\x5e\x71\x45\xf5\x35\x7b\x9d\xcd\xf2\x2b\xaf\xca\xe8\xec\x24\xc1\x75\xa3\x33\x02\x1e\x36\x6c\xbc\xf6\x95\x65\x2f\xce\x88\xb2\x89\x05\xcf\xb5\xb2\x93\x6f\x73\x87\x28\x33\xd6\x67\x39\x28\x58\x9e\x24\x61\x05\xdc\x35\x45\xe1\x76\xb2\x9b\x22\x6f\x8f\x54\xff\x23\x0a\x02\x9d\x20\x7f\xbc\x24\xde\x51\xa1\xc1\x76\x02\xda\x4a\xe6\xb8\x4d\x3d\x07\x67\x75\x80\x28\x44\x31\x51\x92\xd1\x13\xcd\xe5\x2f\xfe\x54\x7e\x1d\x29\x84\x9e\xa9\x1b\xd0\x5f\xc5\xf3\xbe\xa2\x95\x7c\x23\x38\xf8\xeb\xb8\xde\xdb\x47\x7f\x73\x9f\xd9\xd5\x58\xfc\x27\xf8\x04\xf3\xec\x0d\xc9\xae\xbc\x32\x6c\x57\xd8\xdc\xea\xdf\x10\xf6\x68\x20\x03\x0e\xab\xce\xc2\x8a\x23\xd4\xdc\x1e\xba\x24\xee\xbc\x0d\xc3\xec\x36\x47\xe0\x21\x7e\x52\xc5\x9a\xbe\x73\x0b\xec\x79\x4b\xd2\x6d\xe5\x59\x78\xac\x59\xd9\x66\x67\x17\x26\xf8\xd7\x29\xdf\xd6\x17\x34\x01\x5e\x8a\x15\xbd\x15\x08\x44\x75\x15\xbd\x50\x5a\x53\xdb\xec\x74\xfc\x9e\x5c\xab\xd7\x1c\x62\x2b\xe4\x3f\x4a\x3a\xb9\xc7\x6e\x19\x32\xca\x7f\x54\x94\x36\x78\xb1\xf7\xe7\x7f\xa0\xd3\xac\x3f\x92\x15\xf7\x9f\x9f\xe9\x6e\x2f\x74\xaa\x5e\xbc\xa2\xec\x3e\xf2\x97\x70\x3d\x71\x20\xac\xd3\x26\x26\xed\x83\xef\xf2\xde\x9b\xe2\x52\x71\x55\x50\x26\xdb\x47\xf1\xd3\xcf\x4b\x3a\x9e\xf0\xb0\x71\x63\x94\x54\x8a\x4e\x1f\x4a\x3a\x36\x67\x4e\x7a\xe6\xbe\x4b\x47\xa6\xf6\xf5\x9e\xa5\xf6\xb9\x60\x39\xc4\x5a\xfc\x12\x13\xc0\x8a\x38\x15\x0d\xb7\x3a\xa4\x97\x67\x63\xb3\xb7\xd2\x74\xe9\xd0\xe8\x04\x19\x6a\xde\xa3\x93\x76\x15\xc2\x64\xb6\xb1\x66\x12\x14\x24\x68\x0f\xef\xab\xb0\xe8\x00\x13\xd8\x9f\x6e\x5b\x83\x44\x62\xd2\x14\x14\xa1\x6b\x2a\x6f\x15\x99\x53\xd6\xa3\x72\x64\x75\x5c\xf4\xaa\x45\x80\x94\x5c\x81\x5b\x7c\xab\x73\xf5\xef\x89\x10\x39\x43\xb2\x95\x91\x1d\xb9\x44\x50\x81\xea\x8a\xbb\x40\x45\xa7\x7b\x6f\x0d\x99\x02\xa9\xfb\x52\x13\x83\x07\x35\x37\x87\x5f\xee\x34\xaf\x14\xce\x21\xa8\x8b\x54\xff\x28\x89\xdb\x4a\x22\xef\x82\x7c\xe2\x72\x82\x0b\xb0\xf7\x4c\xb8\xb3\x38\x29\x27\xd1\x52\x8e\x37\xef\xbb\x5d\x26\x72\xcb\xe3\x6d\x97\x0d\xf0\x47\xa5\x4e\x25\x6a\x88\x85\x58\xb5\x4f\x13\xd7\xda\xf8\xdf\x3f\x3a\x9d\xcb\x1e\x4f\xcf\xda\xe7\x79\x73\xc7\x65\xd7\x00\xbd\x90\xce\x94\x88\xd4\x82\x2f\x85\x54\x2b\xaf\x64\xd0\x31\xf2\x8a\xa8\xfe\x32\x51\x0f\x04\xdd\xed\x7d\x52\x53\x26\x5c\x0d\x50\x2a\x85\xbb\xdf\xd1\x64\x53\x47\xa1\x1c\xb5\xa1\x58\x68\xdc\xab\xec\x82\x87\xda\xaf\x19\x76\xcc\x0a\x77\x3e\xb0\xec\xd2\xce\xc5\xd5\x08\xfe\xd8\xbc\xa7\xe7\x2a\xcf\x91\x95\xfe\x91\x18\xc8\x8e\x24\x49\x92\x6c\x03\xee\x91\x61\x3c\xc7\xc2\xcb\x63\xb9\xc3\x61\xa4\x5c\x61\x5e\x54\xce\x6f\x46\x03\x9d\x1b\xf4\x66\x74\xec\x6f\x00\x5e\x81\xf4\x9d\xf3\xb0\x5e\xee\x36\x19\xd7\xa9\xbc\xce\x33\x42\xa1\x11\x9c\xb5\x84\x8e\x7f\xe7\x7c\xbf\xcf\x5c\x59\xf7\x39\x98\x57\x7b\xae\x08\x45\xf2\x91\xae\xda\x3d\x89\x94\xb6\x7d\xe8\x75\xb8\x55\x5a\x32\x6d\xee\xec\x7e\x8a\x8d\x45\x28\x0e\x80\x25\x82\x24\x63\x38\xf2\xd6\xf9\xab\x6d\x2d\xba\x45\xfe\x5a\xce\xab\x61\x57\x06\xe7\xaa\x6e\x53\xd1\xb7\xc6\x67\xdf\xe6\x85\xf3\xdd\x06\x63\x57\x0e\x82\xd5\x89\xad\x3c\x83\x11\xb6\x1c\x6d\xa1\x3c\x8f\xea\x2b\x85\xca\xf5\x4c\x11\xd5\xd5\x2e\x75\xd4\x7a\xbd\x34\x75\x88\x2d\xcf\x11\x3b\xea\xdb\x3d\x0e\x87\xa2\xb4\x09\x10\x12\xe2\xb5\xac\x50\x60\x00\xf8\x96\xbe\x73\x3a\x59\xd8\x55\x49\x2a\x22\xe8\x1c\xff\xe4\x8a\xaa\x30\xd8\x60\x67\x78\xfe\x63\x19\x66\x07\x89\xe0\x14\x0a\x43\x3d\x66\xdc\x9b\x6a\x38\xfd\xfb\x0e\x13\x57\xa9\xb5\xf2\xdb\x5f\xab\x17\x51\x04\x62\xd7\xe2\xfd\x45\xaf\xb5\xca\x2e\x7a\xd8\x25\x7d\x33\xc2\x48\x22\x62\x62\xa7\x79\x0a\x1c\x84\x59\xc4\x01\xb2\xfc\xaa\xf3\x74\x93\xb7\xb8\xfe\x43\x21\xc0\x52\xdf\x52\x25\xdc\x75\x40\xc3\x9d\x7e\x04\x6e\x91\x73\x4a\x72\x31\x46\x93\x73\x11\x22\xee\x16\xcd\xf2\x6a\x5b\x38\xbd\x59\xc9\x76\xa8\xfd\xe4\x00\xdd\x32\xab\x6c\x3b\xa5\x9b\x84\x64\x36\x85\xaf\x8a\x7d\xe5\x4e\x7f\x41\x33\x49\x35\x1c\x55\xb3\x7f\xf9\x08\x1a\xd8\x19\xdd\x9f\x58\x5e\x66\x49\x47\x27\xf7\xd5\x98\x00\x40\xb2\xb9\x84\xdc\x1b\x3a\xa8\xd8\xef\x37\xf2\x27\x06\x41\x4c\x75\xe6\x74\xd2\xd2\x03\xab\x8f\x6a\xac\x22\x68\x7b\x0a\xb3\x21\x54\x70\xa2\x86\x9d\x2c\x35\x3c\x75\x95\xcd\x2a\xb1\xa9\xa6\xac\x84\xe9\xf0\xd0\x63\x01\x96\x23\xc2\x12\xa5\xdd\x5b\x4a\xdb\x88\x29\x4b\x57\x96\x14\x69\x92\x4e\x6d\xfa\xa7\xaa\xb6\xba\xfe\x29\x61\xcc\x64\x93\x0a\x1b\x4f\x75\x8e\x7a\x6c\x97\x6e\xa2\xee\x3f\x86\x18\x89\x53\xe3\x29\x9b\x95\x33\x54\x24\xce\x0b\x63\xd1\x96\x44\xc2\x1c\x11\xdb\x4c\x4b\xbe\x12\xd0\xd1\x58\x5a\x3f\x2c\x5c\x78\x6d\xe4\x1b\x33\x18\xbb\xc8\xa1\xa5\x74\xf2\x72\xd9\xd5\x9f\x1b\xb1\x33\xba\x38\x18\x64\xe8\x12\x2a\x60\xd8\x49\x91\x47\x96\xc3\xb7\x1b\x96\xd2\xd1\x0c\x0b\xe1\xc0\xa8\xb2\xd6\x4a\xb8\xaa\x7f\x88\x5d\x5c\xb4\xd5\xd6\xc1\xce\x00\x6a\x34\xa2\x2a\x7c\x42\xdc\x13\x66\xd1\xef\x55\xb5\x9d\x26\x27\x9c\x55\x51\xd8\x31\x34\x55\x36\xd0\xe9\x11\x75\x5d\x69\x23\xda\xc1\xec\x73\xbc\x70\x56\x3b\xc1\x06\xb2\xf9\xa3\xff\xd3\x33\x35\x27\xe9\x14\x7a\x97\x27\x5d\xff\x9f\x20\x3c\x68\x34\x9f\x22\x98\x3f\x94\x48\xaf\xec\xb4\x5f\x7c\xf4\xf0\x81\x03\x09\x06\xa8\x8e\xee\x34\xb0\x0c\xdc\xf7\x28\x0d\x97\x30\xa0\x66\xbb\xad\x46\xec\xcf\x50\x3b\xbf\xfe\x87\xf2\x9f\x02\xd5\xf6\x4d\xa8\xe9\x50\x86\x51\xbd\xb6\x4b\x22\xdb\xa1\x39\xa5\x0f\x33\xf0\x2b\x9a\x0d\xda\x4f\xc4\x5c\x8f\xf9\x1f\xdb\xbf\xd9\xf1\x48\xba\xce\xfc\xd4\x1c\x43\xf6\xde\x32\x4a\xc9\x8b\x24\x36\xb7\xd6\xf0\x8c\x61\x52\xd7\x52\xb4\xfa\x32\x25\xc9\x43\x7a\x29\xe3\x63\x1e\xd5\xa8\x1b\x86\xc4\xbd\x5c\xff\x45\xc4\x85\x90\x26\x77\x0f\xa5\x9a\xb9\x76\x1d\x1b\xdd\x36\x5b\x47\x76\x01\x38\x50\x2c\x5e\x91\x58\xcb\xc9\x13\x52\xe8\x39\xe2\x6a\x3f\x3e\x55\xf9\xf3\xdd\xc3\x1a\x4b\x34\x81\xc8\x1e\x34\x5c\xca\x9f\xa5\x5d\x45\x99\x52\x98\xa0\xd4\xc3\x3f\xeb\x0e\x62\xd9\x27\x78\x65\x25\x22\xd7\x6c\x03\x3a\xb2\x01\x98\x90\xa3\x1d\xcd\xb5\x30\xd7\x44\xb4\xa3\xba\x7e\x14\x42\x76\x1f\x76\x9b\x90\x21\xe0\xb5\x9d\x0b\x02\x23\x09\x7f\xc9\xea\xc2\x11\x50\xe9\x20\x1a\x18\xa3\x1b\x37\x45\xe0\x9a\x9c\x4b\x70\x1c\xa5\x68\xf3\x94\x5c\x49\x4d\xd0\xae\xcb\x54\x3b\x75\x44\xa3\x7d\x54\xd2\x10\xa6\x9c\x98\x30\xb4\xa0\x78\x1d\xc9\xc7\x96\xba\xec\x9a\x48\xba\x9f\xd8\xd2\x87\x5b\x84\xbf\x5d\x49\x16\x87\xa5\x15\x95\x9b\x5b\xd3\x44\x85\xa9\x94\xdc\x35\xd2\xf1\xd7\xcc\x32\xad\x9b\xc5\xac\xb4\xc1\xd2\x0a\xc3\x1b\xef\x42\x32\x97\xa8\x23\xa3\x8c\xf4\x44\x68\x1f\xa6\x08\xd8\x17\x75\xcf\x21\xde\x87\x68\x70\xe4\xc8\x85\x88\x65\x9f\xe4\xb3\x6e\x63\xba\xee\x59\x25\xb9\xbe\x33\xad\xb5\xe7\x2b\xda\x7e\x3c\x09\xbb\xc4\xd6\x17\x08\x6c\xe4\x47\x41\x09\x48\xfe\x5d\x6a\x25\x2a\xba\x68\x4a\x90\xab\x5f\x54\xe2\x0f\x6f\x11\x7a\xe9\x78\x51\x06\x97\x04\x83\x00\xd5\xb4\xb9\x15\xa3\x41\x55\x26\xe6\x21\x96\x94\x65\x6d\x92\xc0\xaf\x1c\x2a\xbe\xe9\x5b\x69\xf7\xf1\x4d\xee\xf3\x86\x8f\x81\x28\x15\x99\xe2\x80\x9a\xc1\x34\x3a\x4d\x4e\xb8\x1c\x78\xa9\xbd\x5d\xca\xec\x2a\x95\xb9\xb9\xe9\x58\x79\xa9\x62\x90\xc2\x3c\xd6\x8f\x2e\xdc\x66\x51\x29\x7e\x1e\x06\xe2\x79\xa0\xfb\xa7\x44\xdf\x51\x48\xc2\xab\xd0\xde\xe4\x05\xa3\x24\xaa\x68\x5e\x2d\x22\xec\x25\x0e\x93\x12\x56\xd4\x07\x74\x97\x36\x4a\x54\xaa\xb6\x7f\x6e\xdd\xc8\xde\x5d\x5d\x59\x0b\xd8\x28\x64\x2b\x5a\x43\xd1\x7b\xed\x56\x6a\x5c\xea\x8f\xaf\x87\xc8\x44\xef\x99\xde\xf6\x31\xc8\x6e\xbc\xe7\x9f\x88\x7b\x24\x76\x78\x43\xc1\x38\x71\x90\x25\x7d\xc6\xee\x9c\x3e\xe0\xf9\xed\xba\x18\xc4\xff\x8b\x9b\x47\x8f\x9f\x14\xf6\xd4\x9f\x57\xac\x39\xd0\xc6\xe0\xab\x21\x3b\x0f\x5b\x88\x08\xb3\x43\xe7\xbb\xf9\x3f\x2a\xdd\x0f\xdf\x61\x44\x0b\x9f\x29\x40\x13\xe8\xc0\x1b\x03\x6f\xde\xf5\xed\xca\xdc\x3b\x58\x71\xc7\x1c\x12\x1a\x4f\x98\xf5\x42\x6a\x07\xac\xe5\xcf\x73\x58\x88\x8d\xb8\x3d\xca\x3e\x0f\xb4\xa6\xe2\x7b\x2b\x2c\xd0\x82\x14\x74\xcd\x6a\x1d\xca\x37\x14\x1a\x99\x25\x64\xe0\x4d\x4d\xde\x4c\xc7\x00\x27\xdd\x6a\xc8\x89\x75\x07\x6b\x3f\x8a\xd8\x6d\x83\x91\xd4\x40\x3b\x25\xe9\x07\x29\x7a\x0b\xed\x0c\x04\x8c\x91\x2d\x33\x51\x94\x60\x95\x64\x11\x1b\xcf\x2b\x49\xe9\xc2\x63\xe0\x67\xd0\x09\x29\xbe\x1f\x37\xf1\x07\xcf\x3a\x05\x55\xaf\x7c\x7d\x9b\x73\xa2\x74\x89\x66\x87\xad\xe9\x82\xd9\x4f\x45\x7f\xda\x91\x5f\xe5\x59\xd8\xfe\x08\x19\xee\x39\x2b\xc2\x19\x9d\x34\xaf\xf3\x26\x91\xfa\x00\xad\x88\x74\x97\xc3\x88\xea\x74\xcb\x3b\x1f\xd9\x2c\xee\xef\x8d\xee\x1c\x27\x98\xe9\xbe\x53\xb0\xe2\xe4\x9a\x5b\xa5\x7a\xb8\xed\x96\x55\x84\x7d\xa1\x98\xc8\x0b\x42\x0d\x28\x62\x3d\xce\x30\x87\x3d\x4e\x32\xd3\x8e\x93\xb1\x80\x07\x64\x8a\xfe\x2a\x2b\x63\x1c\x8f\x95\x6c\xbd\x03\x84\xdf\x3b\x7b\x25\x39\xef\xa4\xfe\x80\xc8\x35\x2b\xae\x0f\x8a\x43\x7f\x1e\xec\x8c\x5e\x5c\x60\xe1\x4e\xe8\x87\xe9\x0c\xd7\x4a\x0a\x00\xdd\xa3\xdc\x8f\xf4\x57\xb7\xc2\xb0\x6f\xbe\x8c\x47\x52\xef\x2e\x81\x8d\x47\xfb\xa3\xf0\x20\xd0\x0e\xc0\xdb\x17\x82\x22\xe1\xdd\xc9\xca\xb0\xea\x78\x02\x71\xc6\x60\x40\x72\x0f\x19\x1a\x85\xae\x35\x0f\x54\x84\x57\xa2\x6c\x87\x4e\xa2\x3b\x9c\xd1\x9a\xe8\xfd\x24\xd5\xf0\x9e\xa2\x1b\xb0\x55\xc2\x04\x5b\xf9\xb2\xd7\x66\x6b\x1e\x45\xec\xe5\xfe\x2c\xad\x24\x64\xad\x67\x85\x60\x93\xe7\x38\x2e\xf5\x88\x3e\xdf\xc3\x85\x3a\x6a\xa2\x29\xcd\x7f\x9b\x7f\x11\x9f\x1b\x3a\x11\xd2\xf8\xb8\x2b\x2f\x1b\x77\xee\x81\x19\x3c\x42\x39\x98\xcf\xc3\xcf\xff\x28\xed\xd1\xf4\x53\x48\x0e\x62\xc2\xfd\x2e\xab\x02\x97\xf0\x3c\xd2\x44\x80\x1a\x8f\x25\x59\xfd\x97\x0e\x38\xac\xe1\x7e\xf9\x95\xd5\xa5\xf6\x4f\x36\xb0\x39\x85\x7e\x3d\xb6\x2d\x22\x44\xec\x9e\x47\xac\x54\x93\x4e\x11\x1b\xcc\x5f\x3d\x63\xda\x94\xdd\x93\x5a\x98\xfe\x06\x23\x75\x14\x2a\x48\x7e\x9b\xb2\x6f\xaf\xe0\x7a\xa4\xee\x1b\xfc\x20\x58\x39\xd9\xce\x83\x9d\x3b\xa4\x37\xb7\x56\x1f\xfa\x8c\xec\xd8\x65\x7d\x6f\xab\x2c\xd6\x91\xbb\xa3\x1b\xdc\x65\xd5\xbb\x62\xf4\x5c\x70\x19\xbb\x1f\xc3\xb8\xf2\xa4\x2f\xff\x52\xc2\x9f\x88\xe0\xdf\x52\xa6\x75\x93\x90\x7b\x29\x21\xb3\x5b\x5a\x7c\x84\x6d\x2c\x9c\x06\x6c\xcb\x89\x5e\x79\x0d\xfa\x86\x8b\xda\x59\xe1\xc9\xcb\x68\x26\xef\x74\x99\x57\x87\x6f\x96\x38\xe5\x96\xdc\x08\xba\x0b\x1d\x57\x96\xe4\xcd\x9c\xbf\x22\x5f\x90\x3f\x44\x7a\xfb\xc8\x6a\x1d\xab\x39\x7c\x37\x35\x2b\x67\x61\xaa\x57\x78\x22\x39\x63\x52\xba\x9b\x4a\xfb\xdb\x49\xbd\x7a\xdb\x3f\x50\xa0\x8e\x7d\xc4\x02\xa9\x86\xdf\x6b\xd5\x01\xef\x1d\xb5\xfc\x4e\xd8\xd6\xf9\x4d\xde\x77\x7b\x38\xe7\xf0\x9a\xa3\x84\x13\xbd\x64\x82\x21\x25\xc5\xf4\xf6\x6b\xab\x86\x83\xda\x9f\x0f\x03\x4d\x4e\xd0\x93\x87\x8d\xad\xf1\xd8\xd4\xfa\x6d\xdf\x36\xc8\xab\xc4\x32\x53\xc4\xd6\x21\xda\x90\x37\xbc\x17\x1e\xaf\xd6\xc4\x7b\xeb\x43\x87\x11\x88\x47\xb5\x84\xe9\x67\xcc\x03\x53\x1a\x76\x2f\xa6\xbd\x38\xa7\x7e\x88\x09\x0a\xae\xa4\xf7\x02\xad\x34\x57\x9e\xb1\x28\x4f\x6b\x8c\x5c\x43\x20\xc5\x7c\xd4\xa4\xec\x1f\x30\x06\x58\xe1\xb5\x16\xc2\xc8\x84\xfe\x31\x5c\x38\xe3\x53\x7a\x03\x78\xd7\xda\x35\xc2\x44\x42\x75\xdd\x18\x64\xc7\x73\x54\x3f\xf5\x59\xd1\x76\xf4\x13\xe7\x59\xff\xe6\x37\x2d\x01\x30\x64\x60\xcf\x29\x06\xf6\x53\x11\x60\x30\x61\x97\x2d\x54\x51\xa1\xf9\x8c\x55\xf3\x09\x97\xe8\x55\x05\x5e\xa7\x9b\xec\x1d\x11\xe1\x7a\x12\x9f\x91\xcd\x07\x95\x40\x33\x94\xbb\xcc\x47\xd4\x2e\x11\x11\x82\xde\xb6\xbb\xa6\x70\x76\xcf\xe4\x91\xc2\x46\x98\x7c\xc9\x33\xcc\x26\xf0\x5f\x1e\x0c\xc9\xf6\xe7\x12\x69\xfb\x25\x0b\x01\x7f\x89\x27\x4d\xfa\xce\x50\x3f\xc6\xf3\xad\xe4\x03\x54\xc9\x36\x5b\x5d\xdd\x80\x71\xa8\x30\x04\xc5\xe0\x94\x51\xd6\x50\xae\x50\x15\xf5\xa4\x4d\xbe\x66\xd5\x74\x98\xa8\x28\x20\x3a\x9b\x96\x1c\x56\xa1\xbc\x8d\x08\x14\x8b\x35\x65\xb6\x0f\xe1\x75\xeb\x46\xef\x7e\xf4\xce\x21\x96\x01\xfe\xc5\x64\xa5\xc1\x76\x5a\x61\x4a\xda\xb1\x14\xed\x3f\x92\xb2\xf6\x08\x81\xf2\x0a\xa8\x5e\x08\xa3\x67\x6b\xef\xe2\xc7\xe8\xcf\xc2\x0d\x94\x9b\x5f\x15\xde\x86\x3d\xdf\x2e\x72\x8f\xdb\x5d\x91\xf8\x58\x4e\x01\x43\xb6\x0e\x4f\x7a\xd2\x1e\x06\x57\x5e\xf7\xd2\x1f\x6b\x94\x56\xb7\x0f\x9c\x05\x46\x55\xe8\x5a\x4a\x3b\x84\x25\xe2\x8f\xd6\xa5\x90\xc2\xcb\xf7\xbb\x47\x2d\xa1\x4a\x0e\x64\xac\x4b\x71\x44\x87\x2a\x50\x6f\x1f\xb1\xbc\x5b\x95\xa0\xd5\x7d\x42\x2d\x61\x67\xac\xfc\x01\x6c\x1b\xaa\x3b\xc1\x9e\x8f\x9e\xde\xbb\xb9\x07\x74\x51\x76\xc5\x2d\xf3\x10\x65\xd9\x1c\xe9\x99\x4e\x9f\x94\x5a\x29\x69\x8d\xeb\xc4\x47\xea\x3c\x16\x38\x42\x8e\x9a\x43\x29\xfe\x83\x1f\xb9\xbd\xb6\x6d\x54\x25\x68\x63\x23\x61\x2f\x60\x81\xee\x4f\x42\xdd\x5d\xd1\x4d\xcd\x10\xbf\x34\xa8\xbf\x13\xd6\x8d\x3e\x20\x4a\xf4\xc9\x99\x02\x9d\x32\x0a\xed\xa8\x2a\xee\x96\x5e\xbc\x9b\x2f\x17\xb4\xb2\x8f\x29\x9f\x8f\x6e\x8e\x78\x4b\xd8\x49\x0d\x51\xd9\x31\x6b\x12\x33\x6e\xf4\x08\xcf\x06\xf7\x74\xed\x43\xa3\x83\xc8\xed\x3f\xda\x83\x11\x94\x94\x68\xc4\x6c\x83\x41\x9e\x5a\xdc\x48\x79\x64\x92\xcf\x6c\xc9\xea\x25\xac\x02\xe8\x8e\x7b\x0d\x56\xb7\xb8\xd6\x5d\x44\x42\xfa\x26\xe5\x3e\x76\x59\xbd\x79\x3e\xa4\x73\x13\xa2\x0f\x1f\xc2\x9b\x47\x5d\x86\xce\xd6\xf7\xbb\x76\x95\x77\xee\x94\xc1\x53\x33\x79\xd4\x9d\x0f\x9c\x35\x6a\x97\x73\xd4\x9c\x29\x9e\x3f\x52\xdf\xf1\x9d\x73\xc4\xc5\xda\xec\x9d\x49\x68\xfd\xa6\xe5\xfc\x86\xee\xe1\x53\x27\x3f\x25\x3f\x9e\xfe\x8b\x01\x5a\x1d\xb4\x36\x28\x9b\x2e\x81\xf7\x1c\xa9\xf5\xef\x86\xcf\xd0\xf8\x20\x47\xd1\x07\xe8\xd8\x75\x55\xb6\x34\x3c\x68\xd4\xcf\xce\x64\xb2\x2f\x7f\x27\x8c\xfd\xe2\x16\xee\x55\xb0\xf1\x60\x0c\xdd\xab\xd8\x05\xee\x9f\xf0\x35\xbf\x44\x0d\xb0\x9f\xe8\x96\xfa\x6a\x75\xe2\x1d\xef\x0e\x83\x55\x16\x83\xbb\x1a\x7b\xbb\x15\x8d\x65\x8f\x66\xa0\xfd\x91\xf7\x30\xe8\x5a\x73\x7d\xc5\x38\x55\xf2\x91\xec\x6b\x12\x09\xbb\x12\x55\xf5\x1a\x51\xdc\xad\x5b\x17\x0e\x0c\xf8\x07\x5d\x6b\x77\x04\x8c\xdf\xe5\x60\x61\xb8\xf5\xec\x9f\xdc\x65\x6b\x7b\x51\x1b\xa7\x6b\x96\x75\xc2\xaa\xce\xc4\x1d\x8e\xbe\x56\x42\x36\x13\xc3\x7b\x0e\x61\xcc\x2d\x52\xd7\x1d\xc9\x0c\x48\x5e\x6a\x56\x0c\x36\x5f\x55\x5a\x15\xb8\xdb\x03\x37\x3d\x17\xac\x82\xd8\x2a\x0c\x17\xda\x0b\xf1\xa1\x57\x0c\xfc\xc8\x8d\x8e\xc7\xa0\xab\xd0\xb1\x79\x65\xfb\xc7\x2e\x4c\xd8\x20\x54\x7d\x8a\x09\xbd\x7f\x54\x17\x1b\x4f\xaa\x14\x77\x31\x40\xa3\x71\x77\xc4\x72\x65\x23\xb2\xab\xed\x0a\x0a\x2f\xb1\xbd\x55\x79\x5b\x63\x26\x5f\x76\x7d\xcc\x4c\x1a\x2d\x30\xe7\xf4\x11\xd9\x1c\xb6\xbd\x20\x63\x73\x65\xa6\xd7\xc5\x66\xf2\x35\x33\x99\xd2\x8e\xa1\x8a\xba\x40\x41\x92\xa9\xac\xcd\x09\x61\xc0\xf0\x0f\x9d\x74\x0a\x8b\x50\xd4\x95\x7a\x87\x53\x6c\x56\x9d\xe8\x29\x7f\x86\x57\xe8\x98\x20\xc0\x6a\x5a\xa8\x4b\x61\x00\xb6\x3a\x86\x6d\x84\xeb\xca\xd5\xcc\x04\xdd\x49\xdd\x4c\x60\xeb\x2a\x4c\x73\x84\x9f\x82\xce\xf9\x93\x90\x31\xca\x81\x99\x5d\xde\xd5\x0c\xdb\x10\x11\x14\xed\xf0\x57\x59\xc5\x02\x16\xe0\xbb\x4e\x6a\x23\x5d\xe8\x99\x53\x24\x97\x00\x30\xb2\xf8\xfc\x24\x39\x40\xdc\x42\x60\x3c\x3a\xa1\x63\xb0\xff\x19\x7b\x4b\xcc\xe2\x59\x81\x3d\x67\x04\xe0\xdb\x49\xd2\xa2\xdf\xe7\x95\x8c\x4e\x85\x21\x79\xbb\xb2\x65\x57\xd1\xfa\x61\x4f\xdc\x66\xb1\x4b\xe9\x15\x1f\xe9\xe8\x87\xa8\x82\x56\x8b\x32\xb0\xca\xe6\x22\x68\xc2\xbc\x7b\xc8\xd0\x6d\xba\xa4\xb1\xc7\x08\x1a\x29\x5b\x9c\x00\xb9\xbd\x98\x2c\x68\x5c\x3f\xd8\x88\x64\xe2\xbb\x36\x32\x68\x48\x72\xdf\x70\xb8\xba\xc2\xdf\xf7\xc1\x8a\x0b\x30\xfc\x29\x8b\x88\x9b\x97\xe3\x0f\xe1\x3c\x94\x39\x6b\x47\x45\xd2\xc3\xc1\xf4\x08\x6c\x05\x7f\xd9\xdc\x17\x7f\x04\x17\xed\x48\x9c\x8a\x8e\x5f\x10\x37\x12\xe7\x07\x99\xf3\x8a\x8d\x9a\x02\x6f\x3d\x12\xbd\xaf\xed\xa8\x58\xfa\x1b\x8e\x6c\x7e\x31\x16\x69\x22\xc1\x2c\xf5\x4f\x6b\x15\x88\xb8\xa6\xc8\x05\x18\x29\x53\x2c\xbd\xbb\x5a\x78\x19\x1b\x97\xd8\x5e\x82\x46\x64\x0f\xd3\x9d\x7b\x7e\xff\x43\x45\x75\x2c\xd9\x87\xb3\x60\x9c\xbd\xa5\x0b\xed\x99\x32\x3a\xdb\xae\xf3\xd3\x6d\x95\x1e\x4d\x9b\xe3\xd3\x94\xb8\xb9\x3f\xf0\x2f\xd4\xe1\x0e\x03\x0a\x15\x8b\x76\x65\xc5\x16\x62\xc3\x62\x12\x37\x87\xc5\xdb\x4c\x34\x1e\xc5\xac\x5a\x89\x73\x2f\xc3\x5d\x58\x2c\x2b\xef\x61\x78\x39\x8c\xb0\xd9\x62\xa9\x0b\x1e\x6d\x4c\x16\xb2\x57\xb4\x28\xff\x57\x93\x03\x88\xae\x8e\xa3\x76\xce\x76\xef\x03\x7b\x95\xe0\xc8\xb0\x3f\x69\x43\x45\x6a\xf5\x03\x3d\x77\xb7\xf4\xf9\x35\x25\xa8\x6e\xf3\xee\xb5\xfc\x29\x1a\x8f\x55\x9d\x03\xfb\xe9\xe6\xcb\x77\x4b\xfe\xc7\xfc\x65\xc9\x3a\x6d\x91\xc7\x35\x0c\x2d\x4d\x9f\xdd\x04\xd0\x5a\x59\xec\xfa\x0c\xb6\xd6\xa0\xae\x7a\x07\x61\x0d\xef\x6b\xf7\x6f\x22\x75\x95\x55\xad\xcb\x1e\x34\xb3\xc2\xc8\xa2\xd1\xbd\xad\xee\xf5\x34\x87\x1c\xc0\x27\xed\x05\x58\xf3\x6e\xea\x27\xaf\x0c\x86\x59\x73\x5f\x3f\x7a\x50\xd7\xaa\xe1\x70\x7e\x3b\x75\xba\xfa\xb6\x7b\xac\xec\x5f\xee\xc8\xf8\x24\xaa\xb5\x2a\x73\xdd\x96\xc7\x1c\xd9\xb5\x5d\x92\xdc\x4e\x5a\x68\xab\x94\xc7\x48\xf7\x9a\x58\x33\xef\xcc\xd8\x87\xf0\x8e\x76\x19\xab\x4c\x2f\xe0\xcf\x11\x61\x5f\x30\x95\x50\xea\xe0\x42\x46\x27\x47\x4d\x27\xb4\xcc\xd1\x9d\x04\xa7\x7f\xe4\x2c\x0d\xbf\xe0\x10\xe3\x29\xd5\x67\x49\x84\x75\x97\x74\x70\xb7\xfe\x57\xa6\x66\x85\xf1\x97\x7f\x91\xaf\x7f\xd1\xaf\x9f\x61\x57\xe6\xe7\x6a\x6b\x04\x4f\x1f\x5b\x3b\x9c\x32\x8a\xf2\x98\xc6\xb8\x6e\x85\x71\x8a\xae\x9a\xfd\x23\x4d\xd0\x0a\xf2\x68\xeb\xff\x92\x7c\x6d\x99\xc2\xca\x6a\x9a\xc7\xb0\xcc\x08\x9b\x2d\xfb\x81\x0a\xbb\xae\x59\x90\xa5\x4d\x07\x4f\x35\x43\xe7\x65\x69\x15\x32\xfe\x6b\x52\x9a\x45\x50\x61\xa6\xfc\x4f\xb0\xed\xe7\x97\x75\x1b\xd5\x6d\x0d\x9f\x63\xd4\xbe\xe4\xbb\xda\xd2\x4e\x07\x0e\xd7\xef\x28\x82\x4c\x4e\x62\x48\xb9\x90\x09\x08\x02\xad\x6b\x23\xc2\xe6\x67\xfc\x93\x41\xbe\x04\xb0\x37\xce\x8d\xdf\xfa\xd9\xd5\x57\xfd\x8a\xb1\xaa\x38\x7f\x9b\x9e\xdd\x39\x43\xce\x27\xa3\xcc\x75\x47\x45\x9f\x8f\xf2\x96\xc6\xb1\xa7\x34\xf0\x25\xb2\xaa\xc8\x19\xd8\x1c\xb3\x14\x96\xb8\x60\x84\x30\x81\x53\xf0\x98\xba\xa2\xea\x58\x3e\x21\xb0\x9e\xf3\xea\xf4\x84\x96\xc2\x9d\x2d\x4e\x72\xe4\x9e\x45\x41\x15\x4f\x60\x61\xfb\x8f\xa3\x0a\x00\xfd\xc1\x36\x25\xeb\xeb\xf4\x52\x82\x06\xea\x5f\xe6\xea\x82\x68\xf0\x80\x69\x32\xbd\xea\x22\xbe\x09\x57\x97\x40\x18\x86\x49\x91\xbe\x7a\xbf\x67\xb5\x42\x68\x04\xdb\x76\x5c\x5e\xde\xc6\x2e\x38\x0f\x71\xa2\x67\xad\x91\xd8\x0c\xc9\xc4\x0f\xed\xcc\x2c\x9d\xd9\x80\x75\xd7\x8f\x1e\x30\x1b\xa4\x56\x76\x0a\xe7\x6e\x66\x2c\x30\x72\x31\xa6\x1c\x91\xb9\xe7\x16\x76\x75\x23\x7c\x5f\x59\xc0\x0d\x50\x82\x89\x68\x4a\xee\x2c\xf8\xf6\xfa\xb0\xc8\xb3\x96\x74\x11\x36\x59\xf4\xdb\x48\xd4\xa1\xd8\x36\xf3\xdc\xc5\x7c\xb4\xb9\x62\x8d\x5a\xf6\xe6\xe9\x63\xfb\xa9\xad\xd9\xa2\xf4\xd0\x3b\x66\x0d\xa8\xf9\xab\xd2\x7f\xd2\x73\xe3\xe1\x94\x55\x6d\xdd\xfb\x33\x87\x43\x46\xfd\x59\x35\x9f\xa1\x1a\x3c\xef\xe8\xe6\xf7\xb0\x1d\x96\x5f\x07\xbe\x07\xe5\x6f\xec\x10\x7d\xb2\xbd\xb9\x0f\x72\x5d\x2e\x6b\xb9\x28\x38\xb3\x21\x82\xbf\x7d\xf7\xd2\x17\x82\x20\x7d\xb0\x49\xb0\x8a\xa8\xbf\xd9\x33\x47\x38\x7b\x36\x3e\xab\x62\x99\x96\x62\xb0\x47\x9d\x2c\x42\x0e\xca\xe4\xa0\xd9\xe2\xaa\xfa\x7e\x45\x99\x3d\x09\xc5\xa0\x60\xe6\x71\x53\x3c\x48\xa4\x65\xf7\x29\xdc\x47\xa0\xa7\xe1\xba\xde\x7d\x76\x4a\xfa\x6a\x70\x77\xc1\xaa\x25\xe3\xf6\x24\x8e\xe0\x91\x40\x6c\x8a\x36\xfa\x6a\x8d\xa6\x66\xcd\x72\xc3\xb0\x72\x37\x3a\x9e\x5b\xab\xba\x61\x59\xa0\xe2\x79\xce\xb2\xed\xcb\xb3\xaa\xe8\x25\x8b\xcc\xd0\x85\x1f\x51\x57\xb4\x85\xef\xf0\xad\x45\xd1\x6c\x9f\x51\x83\xf0\xca\x73\xa3\x7b\x5a\xf9\xc5\xa3\x56\x6d\x70\x6c\x60\x25\x39\x87\xff\x98\x4a\xcf\x61\xbf\xdd\x4d\xaa\xe2\xed\xc8\x14\x5f\xbb\x1e\xd5\xd3\xb4\x4f\x37\xf1\x98\x9b\x8f\x60\xc0\x10\x1d\x35\x07\x0d\x6e\xf0\x2b\xe1\x2e\x4a\x15\x9e\xe2\x15\x7e\xa3\x40\x0b\x51\x85\x37\xef\x99\x4e\x56\x36\x1d\xe6\xf9\x30\x2d\x81\x45\x31\xab\xe9\xb5\xb0\x37\xea\xaf\x4d\xc2\x66\xfa\x2f\x2e\xd3\x74\x90\x8a\x92\x8a\x2c\xfe\xec\x92\x17\x9b\x36\xff\xd1\x55\x04\x92\x47\x16\xdb\xab\xa8\xab\x09\x25\x0b\xeb\xe6\x5e\x2d\xca\x2f\x16\x0c\x86\x64\x7d\x03\x5c\xfa\x12\x54\xfb\x26\x30\xaf\x59\x05\x97\x0a\x1a\x90\xaf\xe6\x9f\x42\xd8\xe0\x63\x35\x85\x6f\x3a\xde\x1f\x5e\x48\x3e\xb1\x44\x30\x49\x58\xda\xa3\x51\xba\xa9\x30\xc6\xfe\xe0\x17\x1e\x02\x95\xe3\xf9\xeb\x97\x46\x17\xd5\x7e\x4a\x2b\x7d\x2e\x8d\xf5\x4c\x8a\x05\x1f\xb2\x27\x69\x97\xb7\x4b\x2a\x99\xcf\xfb\xb6\x05\x32\x2c\x06\xb3\xf4\x6d\x0c\xd5\xd3\xdb\x7e\xbb\xe8\x92\x6d\xd7\xb1\x45\x9c\xfc\x0c\x36\x10\x73\x12\x0a\xcc\x74\xd2\x4f\xeb\x0d\x8e\xd7\xa6\x73\x09\x81\xc7\x22\xfb\x32\xe8\xca\xea\x75\x2f\xdb\xe7\xaf\x5f\x79\xdc\x6c\xbe\xe0\xca\x4d\xb2\xee\xba\x72\x03\xfe\x92\x08\xc8\x96\xc6\x4a\x4e\x6f\xe6\x14\x54\x57\x32\x6e\xeb\x44\xdb\xe7\xbb\x9e\x36\x21\x78\x6f\xd4\x56\x8c\x43\xe5\xb5\x62\x6a\x6e\xc0\x6d\xac\x9f\x27\x38\x9a\x2d\x73\xa3\xd7\x2a\xc1\xff\x86\x40\x6f\x8d\x60\x64\xd9\x0e\xd9\x74\xcf\x02\xfd\x42\x6a\x05\xc5\x74\x77\xbd\x55\xde\xba\xd9\x36\x87\x27\xed\x6f\x30\xa0\x55\x00\x58\xb6\x39\x24\x90\x67\x6e\xd5\xee\x5d\xe4\x13\x79\xb9\x0b\x8b\x9a\xc0\x94\x4e\x72\x70\xa8\xd0\x6e\x95\xef\x9d\x2a\x35\x7e\x28\xe5\xe3\xa6\x4d\x71\x75\x77\x04\xf4\xf5\x8b\xb2\x0a\x90\xc1\x17\xfd\xd2\x23\xf7\x73\xd2\x50\x05\x78\x79\x87\xf7\x09\xc3\xa1\xaf\x02\x46\x9d\x0f\x86\x96\xa1\x08\x49\x78\xc4\x38\xff\x15\x51\xc5\xae\x19\x5f\x26\x05\x8b\xb3\xad\x9f\x8a\x58\xee\x45\x4d\xbc\x58\x5e\x5d\x93\x9b\xd5\xf8\x08\x19\xbd\xac\xa5\xe7\x97\x3a\xb9\x92\x8a\x8a\x6b\x4a\x65\x25\x8b\xec\xac\xcd\xd7\x25\x34\xcd\xe6\x1b\x16\xd5\xa3\x2a\x11\x6f\xe6\x92\x04\x78\x41\x3b\xc1\x77\xdd\x4f\xf5\xd7\xc1\xad\xb2\xbf\x44\x55\x2d\x37\x5a\x28\x0d\x53\x0b\x71\x0e\x8e\x1c\x86\xf0\x55\xec\x72\x50\x8d\x69\x2e\x84\x82\x9a\x75\x74\x47\x8b\x8b\xb3\x32\x90\xc4\x8e\x76\x8b\x0f\xb2\xb7\x57\xcb\xbb\x85\x01\x16\x56\xd2\x3e\x3b\x88\x04\x7c\x51\xa1\x0c\x3d\x07\x1f\x65\x57\x87\xa0\xf8\x73\xd6\x6f\x7d\xfe\x5a\x75\xa7\x73\x19\x5a\xf0\xcc\xe6\xa7\xc0\xa9\x84\x49\x52\x7f\x1f\x4a\x99\xe1\x0c\xe4\xc5\xb4\xd7\x92\x6a\x91\xd6\x93\x12\xb7\x43\xd1\x30\xb0\xae\x53\x64\x20\x2b\x0f\x74\x77\xfb\xf9\x48\x2a\xb5\x95\x98\x86\xbc\x46\xb1\x7d\xd1\x48\x63\x55\xcd\xc2\x19\x7c\x48\x1c\xc1\x8d\x3d\xd5\xd8\xdd\xa9\x06\x38\x9e\xdc\xf2\xdb\x11\x1b\x63\x38\xb0\xb2\x93\x6b\x67\x47\x14\xbb\x75\x0d\x4b\x17\x77\x52\x7e\xb0\x8d\x3b\xc9\x59\xf1\x5c\x94\x64\xc3\x9f\xb6\x54\x3b\x31\xbc\xfc\x0d\x38\xc2\x6a\x62\x9d\x8b\xe5\xdc\x66\xf5\x7f\x4a\x0f\xaf\xf6\x99\xdc\xfe\xbd\x84\xb6\xdc\x6d\x61\x9c\xc7\x5b\xb8\xcd\xb2\x9a\x4d\x39\x9b\xfb\xac\xc8\x02\xd8\x30\x22\x50\x8c\x45\xae\x7f\xb2\xbd\xb1\x63\x3f\x11\xf5\xbb\x55\x92\x83\xe0\xb7\xc8\x96\x65\xb9\xdb\xc4\xe6\x96\x8b\xa2\xf4\x46\xdc\x20\xda\xfa\xba\x13\x6a\x9c\xca\x32\x79\xf8\xe6\x7f\x2c\x60\xd4\x22\xb5\x92\x8d\x74\xe1\x19\xc2\x37\xd5\xc6\xb3\x2b\xcb\xfc\xf2\xa6\x82\xd3\x81\xad\x0d\x04\xf1\x97\x0a\x63\x74\x3c\xd8\xda\x5d\xb9\x29\x41\x3f\xf7\x62\xc7\x36\xaf\x53\xd4\x4f\xee\xff\x22\xad\xe6\x49\x0e\x1a\xac\x5d\x9a\x6f\x79\x5d\xa3\x7b\x2b\xaa\x32\x8a\x60\x71\x70\xef\x24\x41\x67\x2f\x76\x18\x98\xba\xfb\xcf\x11\x7d\xac\x52\x6f\xee\xef\x14\x01\xdb\x29\x9a\x3b\x68\xf9\x46\xf6\xe1\xe8\x08\xf2\xaa\x8c\xba\xb5\xf2\xbc\x5d\x09\x23\x5b\x29\x6c\xab\x04\x39\xbc\xb3\xd7\xbc\x75\x60\xc0\xfe\x5a\x85\x7e\xba\x43\x7a\xf4\x76\x1b\xfb\x0e\x51\x6c\xd1\x00\xc5\xd8\xbf\x7a\xc0\xd5\xcd\xc9\x11\x32\x43\x66\x5d\xd3\xfb\x61\xe5\x17\x84\xe0\xc4\x45\x14\x60\x56\xbe\xb6\x16\xde\xf4\x64\x27\x6c\xe7\x05\x76\x13\x0c\xaf\x59\xd6\xce\x36\xf0\x2a\xc1\xc1\x6d\xda\xd1\x00\x34\x60\x8a\x4f\xaa\x4f\x15\xc7\xbb\xfb\xf4\x3c\x54\x46\x47\x11\xbd\xfd\x6e\xf5\xc6\x33\xbf\x8b\xf4\xd4\x31\xb2\x76\xc0\x2e\x7c\x40\xfc\xf9\x8d\x16\xb4\xb7\xa4\xf5\xa6\xc2\x24\x69\x41\xd8\x14\x2f\x2f\x38\x23\xd9\xb5\xc9\xb3\x61\x39\xa5\xf3\x2c\x84\x89\x16\xbb\x60\x16\xf9\xe0\x0c\x11\xb1\xbd\x27\x5e\x0f\x0b\x5d\xe3\xbd\x5a\x5f\xd3\xa4\x8a\x5c\xfd\x19\x2b\xbc\xbf\xb2\xb9\x09\x80\xc0\xb3\x1d\x23\xe0\x3b\xe7\x96\xcf\x23\x5c\x1a\xe6\xbe\xe8\x22\xdb\xd0\x2e\x5b\xbc\x9b\xb9\xcf\x60\xa8\x79\x55\xf9\x89\x30\xc7\xa1\x88\x44\x5c\x0f\x76\x96\x57\x65\x1f\xd8\x28\x72\x1a\x0b\x1a\x30\x1c\x0d\xe9\x50\x79\x2d\x47\x4a\x64\x5b\xab\x87\x6c\xef\x85\xcc\xe2\x5d\xe5\x9a\x4d\xaf\xaf\xe8\x3a\xb3\xcf\x0d\xf3\xc9\x10\x89\x0e\xcd\xde\x32\x0f\xaa\xcb\xbb\x10\x8b\x7e\x5a\xb6\x8f\x3a\xca\x03\xa9\x42\x13\x84\x3d\x99\x25\xf4\xa4\x7e\xf4\x18\x26\x0b\x63\xfd\xce\x0c\x00\xa2\x89\xce\x59\xf2\xa5\xad\xd3\x08\x78\x9f\x95\xb3\x62\x39\xc6\x13\xb4\xf8\x5d\x2e\x94\xd7\x1d\xb4\x63\xe5\x7a\x57\x59\xb9\x5f\x57\x92\x87\x7b\x98\xe2\x8e\x45\xfa\x18\x8f\xfa\xf6\xda\x5a\xa7\xcb\x38\x97\x73\xa4\x2a\xd4\x7b\x36\xb4\x72\xc7\xef\xc5\x57\xc7\xc8\xcf\xf8\x51\x76\x99\xf9\xd7\x8d\xae\x5c\x12\xc7\x96\x5b\x32\xa6\x96\x14\x9e\x24\xc1\x1d\xed\x57\x18\x55\x92\x8f\x9a\xd1\x9e\xcd\x1f\xd1\x2a\x70\xac\xb6\xbd\x3c\x6c\xd0\x33\xb5\x5f\xf2\xe1\x5d\x68\xda\x34\xb1\x25\xed\x5e\xf0\xfe\xd4\xb5\x2a\xb2\x08\xb2\x2e\x94\xd8\xfe\x00\x78\xf9\xf8\xd7\xf2\x9c\xf7\xa6\x59\xb4\x1d\x64\xbf\xf0\xee\x3e\x5a\xda\xbd\x62\xe4\x9e\xbe\x3d\x7b\x44\xdf\xda\x07\x81\x96\x64\x61\x08\x19\xdc\xa0\x9e\x69\x45\x7e\x02\x7b\x75\x7f\xea\x41\xe4\x07\xe6\xb0\x21\x77\x57\x8a\xe8\x45\xaf\x17\xb3\x10\x9c\x7e\x21\x6a\x32\x3e\xb1\x1e\x2a\xc0\x6b\xa8\xa2\xde\xc3\x21\xc0\x2b\x6d\xcc\x91\x2c\x44\x31\x14\xdf\x14\x21\xe4\x2a\xe7\x21\x11\x93\x7c\xf5\x97\xad\x34\xdf\xee\xca\xce\xe1\x4d\x16\xce\x30\x4b\xb8\x31\xcc\x48\xcb\xd4\xbd\x0b\x21\x80\x57\x78\x20\x23\xb2\x9c\x5d\x69\xec\x52\x36\xf2\x90\xcf\x1f\xb1\x1e\x6d\x8c\xad\xc8\xc7\x7e\xbe\xc5\x5d\x06\x9b\x4d\xb8\x40\x66\x66\xd3\xb4\x85\x1e\xb5\x67\xf1\x3f\xfc\x15\x92\x8d\xc3\x31\xb2\x07\x7c\x1f\x99\xe6\x3a\x5f\xb1\x96\xa8\xaa\x7f\xb7\x9e\x74\xb3\x71\xee\xdd\xb6\x82\xa2\xd4\x93\xbe\x8e\x18\xf8\xe1\x08\xbf\xcd\xb2\xbf\xa2\xc6\x9f\x18\xa5\xbe\xd6\x10\xae\x46\xa4\x8d\xed\x4c\xce\x08\x93\x82\xa3\x94\x28\x69\xb6\xa3\x63\x1a\x27\x0a\x17\x5f\x2a\xb0\x97\x10\x54\x31\x01\x09\x6c\x80\x0c\xff\xec\xd4\x74\xc7\x17\x15\xe6\x9a\x69\xa3\xea\xb7\x47\xc8\xc2\x47\x65\x7f\xcb\xe9\x87\xdd\x5d\xf3\x0e\x42\xe2\x1f\x47\xfb\x3f\x69\xec\xf6\x05\xa8\xa7\xda\x7d\xa2\x96\xad\xd8\x15\xb1\x90\x17\x25\x03\x2d\xf2\x20\x35\xc3\x2a\x86\xaf\xd9\x9d\xdf\xf2\x8d\xfe\x5b\x77\x7e\xa2\x51\x5e\xb7\xb9\x29\x64\x05\xd8\xe1\xba\x6e\x9d\xf5\x66\xa1\x7f\xce\xff\xa9\x8d\x3e\xef\xaa\xfe\x47\x25\xb7\x5a\xfd\xbf\xb5\xc0\xcf\xb7\xfa\xea\xbb\x2d\xe2\x5b\x30\xa0\x43\x1a\x02\x5f\x7f\x11\x49\xbb\xf2\xcd\x6c\xaa\xd7\x55\x4e\xff\x4d\x14\x0b\xd0\xbe\xd0\x34\xb3\x73\xa9\xb5\x0f\xa2\x0c\x2f\x91\xcf\x59\xdc\x99\x22\x88\xd0\x8a\x10\x98\x5f\x85\x26\x44\xa8\x41\x5d\xc4\xdc\xcd\x5d\x14\xf0\xfb\x33\x06\x36\x93\x88\xce\x9d\xd7\xca\x0e\xf8\xba\xa6\x96\x04\xb0\x36\xac\x40\x2e\xff\x3f\xbe\x08\x6a\x7b\x89\xab\xbb\xd6\x0b\xec\x90\x23\xca\x36\x12\xc8\xcf\x12\x07\x3b\x47\x8a\x0d\x7b\x1b\x8a\x5c\xcd\x99\xd4\xf6\x3f\xd1\x1f\xbf\xb8\x1b\x4c\x17\x59\xd6\xe0\x8b\x24\xea\x6d\x91\x66\xa6\x4a\x10\xaa\x41\xfa\x21\xf1\x9a\x6d\x05\x2d\x1a\xe4\x95\x09\xf7\x56\x7f\xea\x25\x57\x96\x56\x0a\x66\x4b\x02\x19\x70\xce\x2a\x8a\x25\x41\xd6\x1c\x1e\x14\x68\xc7\xf9\xc3\xd3\xa5\xbc\xd2\x49\x7c\xbf\x0f\xf7\xec\x1f\xa1\xfb\x1f\x10\xb5\xe9\x88\xf4\xd1\x67\xc4\x87\x70\x8f\x8d\xac\x3f\xa4\xb4\x2d\x32\x4e\xda\xc3\x87\x16\x38\xc0\x25\x39\x2f\x02\xe2\xf8\xfd\xbe\x83\xa8\xe1\xf6\x88\x81\x0d\xa0\x96\x92\x8f\x69\x92\x70\xd7\xca\x84\x7f\xac\x95\xf6\x26\xd2\x05\x43\xff\x6e\x99\xfa\x21\xe9\x4d\x08\xc7\x3f\x1e\x24\x5d\xf3\x96\xe0\x64\x59\x69\xef\xa1\xf4\x4c\xd1\x77\x33\xd4\x17\x53\x41\xfc\x0f\xcc\x24\x2c\xfc\x47\xa9\x75\xe1\x13\xf9\xe1\x88\xab\x06\x68\x7f\xf3\x16\x0c\x17\xe7\x69\xdb\xa7\x64\x57\xe0\x65\xaf\x56\x78\x4c\x5f\x41\x5b\xf5\xe6\xe7\xf6\x84\x02\xc6\x66\xd7\x3d\x78\xe9\x4e\xd0\x0e\x6a\xf7\x69\xb3\xed\x97\x94\xee\x1c\x26\x64\x18\x8a\x63\x73\x9f\x6e\x02\xe0\x0f\x28\x74\x7d\xbc\x35\xdb\xdf\x73\xe3\xee\x59\x11\x74\xff\xb1\xfb\x0f\x0f\x0e\x82\xe6\x37\x50\x7b\x3f\x6a\xf7\x78\x83\xc2\xc6\x9f\xf0\x46\x5b\x99\x9d\xe1\x0f\xa5\x0a\xd7\x7b\x16\xec\xa0\x49\x17\x28\x82\x68\xde\x34\x49\x6d\x1e\x40\xce\xc5\x16\xc3\x00\x7f\x84\xd7\x92\xfd\x54\x12\x41\x79\x23\xfe\xd7\xeb\xf2\x7e\x83\x0a\x65\x5b\xbd\xd5\x71\x87\x03\x6f\x74\xe4\xad\x12\x7c\xca\x17\x6a\x9a\x9f\x94\xaa\xda\xa8\x63\xf2\x85\x4d\x1f\x2f\xbd\x93\xa9\x6d\x14\x2f\xdb\x3a\x57\xbe\x65\x2b\x58\xb8\x01\xbe\x9a\x4f\x96\x9d\x9c\xcd\x0e\x29\x2b\x22\xc1\x76\xc6\x4f\x6e\x7c\x61\x9d\x1a\xd2\x15\xf0\x70\xb3\x3a\xe3\x6f\x69\x9d\xdc\x08\x69\xe3\x60\x83\x99\xff\xbf\x4d\x72\xff\xb8\x89\x76\x28\x57\x00\x51\x3e\x3e\xb5\x75\xb2\x4a\x3e\x3c\xb7\x5d\xfa\xcb\x81\x4b\xf7\x88\x53\xd0\xfe\xc8\x47\xdd\xcc\x52\xff\xba\xc5\xea\x16\x79\xea\xac\xe1\x7d\xa4\x44\xc8\x33\xf8\xa1\xee\xb6\xfa\x45\xf0\xaf\xff\x41\xef\xd4\x12\xf1\xff\x7a\xcc\xcc\x3a\x13\x36\xdf\x7e\x18\x74\x3f\xca\x64\x39\x1d\xb9\x11\x0b\x47\xba\x0f\xb1\xde\x0f\xb6\xd6\xc3\x7e\x75\x88\x86\xba\x2d\x34\xfe\x4a\xa9\x09\x2e\x20\x62\xc3\x3b\xb5\x53\x5e\xad\xa3\x03\xfd\x3e\x0a\x7d\x23\x38\xcf\x4d\x92\x58\xed\xc7\x5e\x1e\x29\xb4\x3d\xab\x7d\x89\x1a\x31\xe0\x44\x78\x34\x87\x6b\x9b\x06\xc9\xb5\x8e\x66\xe5\xe1\x60\xe3\x87\x23\xc9\xf9\x8e\xe8\x87\x1d\x53\x78\x93\x53\x04\xcc\x16\xfb\x89\x3e\x38\x6f\xc4\xe4\x36\x9e\x91\x44\x7b\x27\xf6\xc2\x3d\x88\x83\xda\x61\x58\x5d\x87\x4f\x97\xfd\xb1\xf0\x01\xe7\xa5\xcc\x83\x43\x21\xa6\x76\x6c\x64\x70\x2b\xfd\x3a\xf5\xd4\xd5\x6f\xb6\x25\xde\x49\x01\x58\x55\x57\x96\x20\x9e\x70\xcb\xed\xba\xff\x80\x6a\xa8\x07\x67\x86\x6a\x7b\xff\x80\xe5\x50\xb0\xc3\x22\x9a\x64\xe9\x04\x51\xec\x65\xa4\x2b\x15\x76\x74\xd7\xcc\xee\xfa\xed\x45\xe7\x0e\x7f\x00\xbc\xe2\x6e\x1f\xca\xdf\x3c\x6c\x68\xf5\x36\x76\x9b\x09\xfd\x41\x0a\xb7\xb0\x45\x67\x4e\x1c\x9c\x72\x47\xc7\x28\xd1\x92\x56\x3e\xd2\x5b\xb8\x28\x9d\x5a\xad\x21\x6e\x23\xad\xfc\x7d\x0a\x6f\x38\xe5\x13\x75\x26\x0d\xca\x19\x84\x2d\x44\xe4\xf6\xc2\x27\x06\x51\xcf\x7b\xba\xf6\x6e\x73\xcc\x22\x7c\x19\xfb\xc9\x3c\xa8\xd8\x06\x61\x2a\x05\x45\x32\x39\xdf\x33\x8c\xdc\xf9\x2c\x3b\x49\x92\x14\xc8\x54\x25\x6c\x50\xb5\x5f\xa1\x3b\x9e\xfb\x35\xe0\x0a\xd9\xca\xfa\xfc\xc4\x95\x7b\x6b\xf1\x3d\xb0\x9a\x0a\x94\xc2\xce\x04\x0d\xe0\x1b\xc4\xaf\x04\xf4\x62\x72\x71\xb7\x44\x4a\x25\x61\x8a\x70\x9e\xc2\x46\xb7\xf0\xe6\x06\x54\xf4\x44\x47\x30\xd0\x8b\x90\x59\x83\x4d\x8d\xb8\x3c\x9b\xad\x4b\x7a\xd5\x15\x12\x72\x1f\xcd\xa1\x4b\xda\x58\x11\xc3\xc0\x96\x6f\xd2\xc9\xe9\x3e\x68\x06\xb4\x98\x1a\xd8\xce\xcf\x2a\x4f\x1d\x7f\x50\xfe\x44\x81\x45\xd4\x2f\xa1\xe2\x19\x6d\xfc\x62\x1b\x4d\x06\x8d\xac\xb1\x9b\xf7\x81\xd0\x06\xf4\xc3\x28\x4b\x7e\xe9\x85\xf2\x4b\x09\x14\xbb\xca\xe2\x48\xc9\x5d\xf3\x44\x7c\x03\xcc\x3b\x01\x09\x7b\x7f\x17\x36\xe7\x37\xf2\xdd\xa5\xf7\x80\x46\xa4\xe8\x31\x92\xb1\x3d\xc0\x75\xff\x4b\x2d\xb8\x4d\x9e\x9c\xb6\xc2\xd6\x30\x87\xc2\xd9\x13\xa9\x15\x3c\xe3\x97\x36\x0f\x2c\x65\xd2\x71\x8c\x96\xbf\x6f\x9d\x96\xf9\xe5\xaf\xe7\x9d\xfe\x87\x62\x2d\xd8\xfb\xb7\x19\x77\xd4\x40\x77\x29\xc3\x68\x91\xdd\xca\xa2\x2d\xc6\x92\xc3\x82\x86\xe1\xc0\x1a\x1e\xad\xed\x1f\x46\x46\x08\x02\x24\x7f\xc0\x7e\xb6\x81\x14\x00\xff\xe9\xff\x40\x36\xc4\x07\xff\x2b\x92\xad\xfc\x15\x38\x7f\xd2\x57\xe0\x8f\x82\x51\x89\x03\xec\x84\xf0\x84\x08\x67\x03\x6c\x89\x1e\x57\xb6\xef\x09\xb9\xa5\x9d\xa6\x51\x0b\x4e\x35\xa8\x60\x53\x55\xbb\x60\xaa\xf3\x17\xd1\xe8\x3e\x1c\x43\x11\x7d\xee\x9f\x44\xa0\x43\x13\xbc\xa3\xcc\x8f\x80\x32\x3a\x35\xab\x27\xb1\x40\xa7\x79\xac\x56\xcf\x3c\xfe\x1f\xe3\xe3\xa2\xf7\x7f\x0e\xc2\x3a\x5a\x16\x1d\x35\xa7\x53\x76\x8d\x1c\xef\x43\xd6\x0e\x3b\xfa\xf6\x3c\xed\x63\xa7\xf4\xe1\xda\x69\x83\x4c\xcf\xab\xf7\x22\xab\xab\xfa\xf3\x03\x8e\x58\xba\x14\xd6\xab\xcc\xbb\x7d\x50\x69\xbd\x7e\x62\x90\x83\x26\x10\xaa\xb9\xb1\x7e\xbf\x4c\x3c\x6e\xa2\x1a\x68\xae\x43\xf1\x6c\xe7\x92\xe3\x0c\xe7\xfc\xcb\xe4\x10\xf4\x40\x5a\xd7\x58\xae\x80\x3e\xd6\x38\x0e\x5d\x50\xed\xd7\x3c\x48\xcb\x3a\xce\x67\xc4\xd6\x45\xea\x88\x53\x88\x88\x59\x84\xd3\x8c\x0d\x9e\xff\xb8\x60\x71\x47\x62\x57\x5f\x3c\xc3\x9b\x86\xb7\x46\x0f\x87\x3d\x6e\xc5\x72\x48\xa8\x09\x20\x84\x91\x79\xe9\x0c\xc9\xb5\x40\x62\x44\x77\xd0\x2c\xe6\x59\x6d\xd3\xe7\x80\x03\x2d\x30\x3d\xab\x43\xdf\xe5\xb3\x79\x81\xf9\x88\x98\x88\x55\x53\x6e\x7f\x08\x48\x84\x4b\xf9\xb3\xc4\xe3\x57\x77\x03\xb2\x03\x1b\x1b\xcf\xf9\x94\x58\x18\x9f\x64\x16\x0a\x02\xca\x16\x91\x4d\x67\x32\xd0\x97\x8b\x56\xc7\x1c\x49\x0a\x00\x67\x23\xbf\xc5\x36\x52\x04\x2a\x30\x37\x39\x06\x91\x0f\xd9\x54\x06\xcc\x11\x43\x87\x14\xb2\x70\x8c\xbc\xba\x77\x1e\x44\xf8\x3c\x81\xbc\xd1\x44\x0c\x27\x93\x24\x91\x27\xba\x15\xb5\x78\xf2\x21\x56\xa8\xa1\x1e\xa7\x32\xf8\xba\xfa\xbf\x2a\xaa\xbe\x95\x3f\x0f\x47\x3e\x56\xe1\x1e\xab\xb4\x6d\xc3\x1c\xdc\xc3\xa1\x61\x33\x43\xde\x96\x46\xd1\x7f\x38\x95\xe1\xd7\xd7\xec\xbf\xe9\x60\xd9\x8d\xad\x61\xf0\x0a\x48\x5a\x04\x26\x51\x4e\x0d\x74\x57\x68\xf8\x7b\x49\xbf\xfa\xb0\x9a\xb1\xc1\x44\x62\x39\x7c\x92\xb8\xb4\x79\x02\xb5\x4a\xfd\x72\x45\x38\xf5\x45\xf4\xbb\xf7\x1d\x9d\xa0\x8c\x60\xf1\xa3\xcc\x8c\xf8\xe9\x00\x09\xd6\x16\x6a\xd7\xd3\x8c\x2c\xfe\x48\x6a\x70\xda\x76\x95\x90\x7f\x0f\x0b\x11\x49\xb1\x53\x1d\xa6\x33\xe8\xfb\x91\x06\x22\xa2\x4c\xcf\x2e\xe4\xc3\x39\x0a\xa2\x9e\xc0\x6f\x63\x09\xbe\x02\x5f\x36\x6d\x47\xb4\x5b\x9d\x8f\x10\x8d\x7b\xe7\x24\x88\xb1\x91\x86\x12\x1c\xde\xae\xde\x4b\x48\xed\x10\xdc\x1d\x18\x85\x24\xcd\xf5\x6c\x36\x5f\x7b\x0b\x9c\x46\x2f\x8f\xe9\x1c\xd0\x65\x07\xbb\xa0\x84\x11\x57\xb6\xd5\xcc\x6b\xfc\x33\xac\x89\xcb\xa7\x59\x1d\x93\xfa\x50\xf6\xb2\x11\x3f\xa0\x79\x3f\x58\x05\xca\x72\xed\xd6\x1f\xaa\x61\x97\x46\x33\xe5\x02\xbe\x12\x3e\xcc\x4e\xa9\x22\xbd\x7e\xbf\x57\xf6\xfc\x27\x08\x08\x78\x9b\xe2\x80\xbb\x3c\x10\xc8\x01\xa3\xfe\x2e\xa4\xd9\x5b\xa5\x15\x41\x80\x1f\x2a\x0b\x51\xc2\xab\x17\x89\x21\x22\x39\x84\x0f\x84\x1f\x6a\xe7\x73\x81\xd8\x04\xa1\x3e\x48\x10\xa7\x8b\xb4\x0a\x7c\x81\x2e\x9a\x9d\x8a\x41\xbb\x6f\x24\xc3\x40\x0a\x0a\x9b\x7e\x25\x4a\xb2\x0d\xba\x84\xe8\x20\xe8\x0f\x61\xeb\x75\xe3\x56\x1f\xa1\x22\xa0\xb7\x17\x4b\x5b\x1c\xc7\x2a\x06\x7f\x38\x31\xab\xc7\x9b\xce\xf9\xeb\xdd\x1f\x8c\x77\x61\x0e\x1b\xd5\xd8\xb8\x1d\xc7\xf5\x98\x64\x06\xf6\x0b\xbd\x4e\xda\xbc\x7d\xeb\x91\x78\xfc\x99\xe6\x7c\xb3\x38\x5b\x5f\xf7\x3b\xfc\xfa\x68\x3a\xd3\xb0\xcf\xa4\x2c\x08\xea\x01\x61\xc1\x9f\x6c\xb5\x08\xbf\x32\xb7\x4b\xc7\x33\x3f\xff\x5e\xad\x9f\xd0\xef\xd8\x4c\x22\x9a\x42\x0b\xff\xb1\xd1\xb3\x21\x07\x25\xeb\x53\xbd\xad\x36\x22\xf7\x5f\xd0\xe7\x1b\x3c\x2a\xdd\x85\x47\x0b\xdd\x70\x2f\x39\x0e\x02\xd9\xf8\xc7\xf3\xf8\x1d\x72\x47\x04\x19\x2e\x91\xcf\xfd\xf9\x05\x7f\xdb\x5b\xd0\xde\xcc\x8a\x61\x5d\x46\x28\x8b\x19\x92\xf8\x2a\x5e\x97\xbd\x8a\x9f\xdf\xaf\x39\xd2\xb7\x6d\x0b\x7c\xce\xc1\x3e\x70\x37\x97\x87\x67\xb3\x10\x98\x48\x7a\xc7\xaf\x14\x6e\x3f\xb0\x2d\x4c\x91\xed\x43\xdd\x38\x99\x9b\xed\xcf\x7f\x7c\xc3\x7a\x49\x03\xdc\x27\xda\x5f\xd1\xe3\x52\x06\x0a\x6b\xef\x8f\x4e\xd4\xdb\xbe\x06\xa5\x7c\xbf\x43\xc3\x72\x57\x47\xf3\x65\xff\x05\x1c\xd9\x77\x5f\x77\xed\x42\x74\x1e\x95\x1e\x48\x07\xd5\x8f\xb6\x30\x55\x2a\x0b\xea\xa5\xf0\x16\xb7\x36\xe0\x72\x75\xc7\xe4\x7a\x13\x2b\x84\xd2\xc0\x0f\x2c\x3b\xee\x19\x79\x47\xfe\x3f\x62\x47\x77\xcf\x61\x5c\x1d\xc1\x59\x7e\xa2\xdf\xf3\x20\x42\xfd\x9d\x1d\xd6\xbb\x1b\x29\xfa\x4e\x7d\x64\xc5\x34\xd4\xa2\xca\x77\xab\xf1\x9a\xa8\x4a\x0f\xa9\xb9\xfd\x41\x6a\xc4\x19\xa1\x53\x1e\x1f\x37\x34\xd0\xc3\x6a\x54\xc5\xc7\x74\x0d\xf9\x90\x33\x75\xfa\x34\xb6\x44\xdc\x97\xc2\xca\xec\x28\x3b\xb6\x42\xe4\x41\x94\x96\x58\x0e\xf4\x23\xb0\x8f\x71\x17\x2d\xc3\xd3\xcb\x15\x23\xb9\x27\xea\xd7\x05\xf7\x5b\x41\xfa\x86\xd5\xb9\xa2\xcb\x59\x50\x82\xd3\xb0\x54\x29\x06\xa8\xa3\xb7\x85\x87\xf7\xa4\xb0\x32\xb0\xe1\x34\x33\x91\xdc\xfd\x74\xaf\xdc\xe4\xef\xe8\x5b\xed\x31\x08\x9d\xc0\xb9\x0a\x21\x89\x33\xda\x71\x91\x55\x68\x48\x95\x0b\xf4\xdc\xc8\x0e\x73\xc3\x46\xf8\x9e\xd2\xfb\x16\x74\xc8\x9c\x19\x8d\x88\xb5\xd8\x17\x1a\xa4\x70\x37\x42\x13\x32\x22\x71\x45\x4a\xe1\xa0\x70\x7e\x22\x5a\x06\xf4\x40\x07\x1e\x6a\xec\xed\xce\x3a\xec\x2d\x90\x86\x5a\x1a\xb0\xe7\x98\x4a\xf3\x56\xa8\xe4\x05\xbd\xe8\x83\xc0\x08\x09\x0f\xe2\xf2\x9f\xc1\x9c\x05\x93\xed\xd2\xd1\x9f\x33\x15\xee\xd6\x90\x97\xae\xbe\x10\x62\x07\x57\x0d\x1a\x25\xdc\xb6\x4a\x91\x49\xd3\x31\x5c\xf0\x4c\x61\xb7\x06\x8b\x7a\xce\x9b\x20\xfe\x3e\x18\x51\xf3\x70\x8c\x84\xd5\xdc\xff\xea\x4f\x1f\x0e\xbe\x84\xcc\xc4\xa1\x89\x9f\x76\xdf\x1a\x1e\xa7\x78\x12\x25\xd2\x15\x6c\x34\x9c\x61\x90\x06\xed\xb6\x72\x51\xec\x8f\x49\xb4\x02\x70\x28\xd8\x15\x3d\xca\x7c\xe9\xaa\x3b\xa0\x20\xe6\xac\x75\xac\xe5\x0e\xbf\xb4\x9b\x93\xf4\x41\xa1\x27\x60\x15\x09\xee\xe7\xbc\x44\xc6\x20\x24\x32\xfc\xdf\x4f\xda\xb5\x81\xa6\xce\x78\xf8\x7c\x37\x19\xea\x91\x01\x10\xea\x19\xc1\x19\x02\xef\x67\x2f\x2f\x11\x3a\x60\xb7\x49\xda\xc5\xdd\x74\x0e\x56\x4b\x93\xb7\x76\xa0\x2f\xc8\x27\xb9\x62\x4c\x9a\x85\x88\x00\x3c\xf8\xe3\x1e\xf4\x1d\x28\x81\xf9\x96\x30\xbd\x16\x48\xb5\x97\xb4\x88\x67\xe1\x97\x8a\xa7\x5e\x16\xef\xc5\xfb\xd0\x2f\xa4\x3d\xbf\xc9\x82\x74\x7d\x1d\x5e\x66\x67\x07\xce\xc3\xe1\x14\xe3\xb3\x10\x6e\xdc\x7f\x96\xe4\x36\xc1\xa8\x0a\x00\xd8\x31\x86\xbd\x9a\xa4\x1e\x50\x1a\x44\x4e\xcf\x3a\xdf\x0a\xea\x99\x04\x19\x30\xc6\x9b\x50\x07\x00\x0b\x9d\xda\x9b\x82\xf7\x40\xa5\xe0\x0d\xfd\x86\xb4\x78\x99\x9d\x8d\xb2\x15\xc3\xc8\x63\x7d\x42\x4c\x70\x36\x61\x41\x1f\x57\x26\xac\xb1\xcf\x57\x8b\xdd\x41\xdf\x88\x43\xd1\x13\x9d\x84\x41\xcb\xb3\xbb\x8a\x8b\x81\x73\x27\xa8\x54\x5b\x72\x84\x3d\x89\x9e\xd1\xe8\x15\x0d\x52\xa1\xfa\x6f\x6b\x3c\x8f\x24\xad\xcb\xd6\xfc\xe8\x20\xb1\xe1\xbf\x8a\x83\x1c\xd3\xec\xf4\xe1\x03\x86\x53\x20\x49\x6f\x53\x18\xa1\xf0\x4d\x54\xd9\x0d\x00\xf0\xad\x30\xfa\x1a\x70\x47\xff\xfd\x84\xae\xbe\xf6\x0a\xb1\xef\x1b\x36\x87\x9e\x8f\xdf\xe6\xde\x06\x1c\xc1\x36\x7a\x27\x31\x63\x22\xdd\x43\x70\xe8\x3a\x1f\x8c\x96\x58\xff\xf5\x10\xf5\xac\x4e\xa9\x28\xd6\xb9\xb9\x91\xe0\xb2\x74\x16\x85\xed\x43\x9d\x4c\xb3\x66\x27\xe7\xc3\xc2\x9b\xcf\xcb\x49\x09\xf5\x8a\x47\x5e\xd3\x5b\x72\x7f\xdb\x3a\x0f\x0a\x0d\x58\x53\x73\xa6\x5f\x93\xbc\x61\x16\x5b\x80\xc5\xb0\x20\xf1\x02\x2d\x73\x6e\x73\x96\xd3\xe5\x42\x91\xe8\x99\xbb\xab\x0b\x76\x85\xb2\x5c\x96\x5d\x11\x46\x80\x3e\x3c\x46\x48\xcd\xf4\xc5\xed\x08\x7c\x90\xc0\xd6\x14\xfc\x71\xcb\xdb\x1c\x34\x0b\x8f\x86\x16\x3c\xb2\x04\x4e\x32\x9e\x22\x5f\x34\x8f\x3f\x30\xf0\x5b\x1e\x91\x13\x30\x7c\xff\xbb\xc0\xc7\xe3\x01\x94\x03\xe8\xb4\xfa\x27\x7f\xfa\x2c\x7f\xe1\xa8\xf3\x57\x09\x1f\xc0\x32\x80\x3b\x0a\x44\x98\x33\x78\x88\x9a\x6f\x0c\xe7\x77\x5c\x53\x8d\x20\xe5\xaa\x0b\x3f\xd2\x43\x8e\xd6\x23\xd3\x87\x66\x6b\x7c\x67\x13\x73\xa7\xe0\x1a\x17\x4e\x03\xcf\x27\x18\xb3\xc1\xf4\x90\x6a\x6d\xaa\x91\x0c\x6a\xfb\x11\x62\x23\x4a\x04\x06\x1b\xef\xe2\x31\x52\xca\x6d\xa8\xe0\xd1\x71\xe4\x66\xdc\xd6\xb3\x44\xd5\xfc\x44\x9f\xfe\x49\x7a\x4c\x78\x0c\x34\x42\x07\x8c\x33\x9a\xa5\xdc\x6c\x55\xf1\xdc\xa0\x91\x5b\xc6\xf5\xc4\x49\x98\x97\x04\x79\x2d\xc9\x1c\xf5\xb8\x9b\x92\x62\x9c\xe4\x3e\x70\x87\xa0\x42\x0e\x05\xe9\x6c\x16\x02\xdb\x26\xd0\xc7\xb6\xdb\xbc\x65\x0d\x75\xd8\x44\xf1\xd1\x94\xc6\x86\xc1\x8c\xf1\x0e\xc7\xea\xad\xe3\x8b\x43\x30\x16\x9d\x97\x51\xd1\x98\x50\x4e\x12\x62\x97\x4a\x0c\x22\x59\xa9\xf0\x42\x02\x38\x22\x37\x02\x9d\x71\x23\x29\x4d\x0c\x2c\xbd\x62\x24\x02\x88\x14\xe8\x23\x5c\x27\x08\x77\xd4\x16\xc0\xe4\x66\x8b\x1c\xc2\x35\x4a\x8c\x8f\x96\x5d\xfe\xb4\x3d\x3e\x1d\xdf\xea\x3f\xe5\xc3\xb3\xca\x12\x1c\xbe\x88\x72\x16\x80\x09\x51\x34\xad\x9e\x72\x84\x79\xb6\xc0\x0a\x1b\x31\xcd\xea\x69\x57\x3e\xd9\x1f\x79\x8b\x52\xeb\x39\x13\xd0\xb6\x6d\x03\xe5\x17\x11\xde\xb4\x08\xd6\xb0\x4f\xab\xcc\xba\x67\x3a\x27\x17\x1b\x3d\x13\x82\x0a\xe5\x21\xf8\x4c\x23\x03\x4c\x79\xf9\xe7\xff\x56\x96\x61\xf6\x2f\x7c\xc2\x40\xfd\xe4\xd4\x0f\x59\x45\x35\x35\x0d\x1c\xc6\x15\x12\x31\xd4\x5d\x9b\x54\xa0\x16\xb3\xb4\x42\x36\x9e\x45\x79\x1c\xce\x14\xde\x71\x68\x58\x1d\xe2\x60\x94\xda\x45\x26\xf0\xa0\x7d\xc9\x10\xfa\x3c\xbb\xa4\x83\xe4\x31\xc5\x52\x3c\xcc\x17\xb1\x8e\x19\x69\xb4\x64\x73\xc0\xa6\x86\xb7\x49\xcf\x31\x5b\xed\x2b\x0f\x39\x94\x48\x3e\xb8\xd4\xd0\x47\x36\x6a\x9e\x48\xfa\x08\x83\x8d\x21\xcb\xe1\x78\xc8\xca\xd9\x82\xb5\x9c\x40\x15\x9f\xe6\x42\x82\xeb\xd1\xd7\xdc\xf5\xc1\x90\x9c\xe7\xd5\x90\x18\x95\x00\x96\x93\x64\x5e\x7d\x5d\xc3\x49\xfc\xac\xdf\x16\x9c\x3a\x78\x37\x1b\xb4\xb4\x66\x3c\x8e\x19\x95\x0b\xd3\x2f\x12\x00\xf9\x4f\xc4\x4b\xa2\x7b\x49\xaa\x87\x0f\xca\x1a\x13\xb9\x2d\x06\x81\xc8\xec\xa2\x5f\x00\xe6\x5f\x67\xf6\x98\xfa\xe2\x79\xd4\x64\x85\x74\x81\x79\xb8\xdf\x8d\xca\x9f\x1e\x93\x81\x84\x3f\xbd\x15\xf6\x76\x62\x8e\x14\x74\x4c\xe5\x6f\x17\xf3\x13\x7b\xe0\x30\x32\x00\xe5\x43\x9c\x15\xef\x23\x89\xe8\x91\x42\xd3\x71\xe9\x93\xda\x2a\xf6\xe6\xb1\x0b\x87\x84\xd4\xa5\xbf\x44\x11\xc8\xda\x83\x00\xe5\xc3\x99\x0a\x0e\xd1\x9b\x20\xa0\x22\xdf\xe3\x6c\xa2\xe7\xae\xee\x71\x54\x76\x49\x57\x83\x2d\xe1\x31\x53\xe1\x6b\x17\x1e\xe9\xb2\xa6\x9b\xe5\x92\x8e\x5e\x77\xcf\x91\xbe\x02\x7f\xe9\xe6\x7b\x2e\xf3\x70\xdb\xbf\x92\xdd\xd5\x95\x4f\xab\x03\xbb\x72\xd2\xf6\xa1\x2b\x41\xde\x98\x0a\x43\x7f\x9c\xb2\xc1\xdb\x60\x46\x42\xdf\xb7\x02\x6c\x47\xaf\xac\xb5\xcb\xf5\x1d\xa2\x48\x75\xb3\x14\xe9\x1d\x2d\x9b\xba\x68\x58\x38\x83\x51\x4e\x4b\x18\x87\xd3\x81\x48\x1c\xa4\x5d\x76\x9c\xd0\xe0\x6e\xa7\xf8\x0b\x1b\x86\x19\x7b\x68\xa2\x6c\xe0\xc8\x26\x86\xe9\x0b\xe2\x06\x9d\xe9\x3e\x52\x6c\x04\x0a\x65\x33\x97\xac\xea\xa4\xd3\x45\xcb\x43\x47\x3e\x63\x95\x60\xc6\x66\x91\x10\xda\x80\x72\x21\x92\x8d\xed\xf6\x57\x40\x24\x7c\x87\xf6\x11\xe5\xe4\x8b\xcb\xc6\x31\x8f\x54\xc9\xa1\x04\x17\x36\x3a\x3c\x49\xf8\xbb\x5d\x2e\xf1\xce\x52\x30\x60\xd3\x26\xf0\x5c\x7e\x09\xb4\x4b\xb8\x9b\x3d\x82\xd0\x63\x3a\xb1\xcf\x31\x12\xfc\x33\xff\x84\x65\x0c\xcd\xf2\x0d\x2c\x8c\xd8\x39\x69\x20\x52\x16\xc6\x23\x17\x45\x24\xce\xab\xfe\xb2\x8c\xfb\xa6\x53\x4b\xd6\x97\xee\x35\x5f\xa4\x1e\xda\xa7\x74\x4e\x48\x99\x88\xd0\xe0\xcb\x98\xe8\x66\x07\xb8\x46\xc0\x4c\xc8\xc3\x3e\x89\x0e\xdd\x36\xd7\x28\x48\x6b\xfe\x4f\xc0\x4b\x33\x58\x87\x09\xb9\x23\x24\xd3\x7c\x5f\xac\xcb\xdf\x50\xbf\xbf\x1b\x9e\x92\x3f\x22\x29\xbf\x43\x1b\x82\x8d\x8a\xc3\x3c\x24\x18\xc4\xb9\xfe\x76\x87\x8f\x9f\x53\x7c\x5a\x4f\xd2\xc8\x6d\x24\x7d\x82\xfb\xb9\x3b\x49\x04\x96\x0d\x2e\xed\x98\xed\x4b\xdf\x89\xc5\x90\x54\xf5\xca\xa7\x7c\x19\xf6\xfc\x0d\xce\x48\x8e\x44\x8c\x17\xca\xdb\xf3\x21\xcf\x3e\x5f\x13\xdd\xa5\x21\xfc\xda\x0b\x51\x03\xff\xc3\x73\x61\x32\x87\x83\xa4\x24\x75\x3a\xa5\x18\xd9\x83\xbb\x51\xd1\x68\x70\x27\x05\xb0\xfc\x68\xd6\x87\x95\x4e\x4c\x0d\x5b\x1f\xe4\xa0\x7f\x97\x8f\x00\x13\x3d\xb3\x30\x07\xa7\xb4\xb1\x3f\x0a\x00\x0a\xf1\x91\xdd\x56\x5c\xbf\xa2\x6e\x42\x41\xb7\xbd\x21\xdf\x79\x61\xb7\xf2\x43\x75\x26\x38\xf3\x73\x20\xaf\x91\x7b\x4a\xcb\xe2\x08\xf9\x1d\x67\xf9\x1d\x62\x52\x0f\xee\xba\x82\x22\x92\xee\xe6\xd5\x87\xac\x84\x16\xaa\x4b\x74\xe0\x9e\x7f\x7e\x80\x77\x6e\x26\x0a\x07\x65\x62\x82\x3e\x28\x00\xa1\x07\xa6\x9d\xec\x52\x60\xac\x3f\x37\x83\x59\x9f\xf7\x9a\x18\xb3\x49\x71\xc7\x97\xa3\x3b\x54\x1e\x27\x71\x24\x20\x21\x4d\xd6\x21\xa3\xa6\xcb\x79\x1b\xf2\x53\x78\x7b\x69\x84\x70\x04\x17\xc4\xf9\xfb\x0d\x4f\xee\x2b\x8f\x61\xfe\x03\xda\xc8\x4c\xb0\x63\xf6\xd4\x3f\xb7\x5e\x00\x14\x72\xde\xdf\xa5\x1c\xcf\xf8\xb3\x6b\xa2\x8f\x60\x91\x04\xf7\xdc\x83\xa6\xfa\xc0\x50\x9c\x69\x34\xc7\x58\x3e\xb1\x8e\x9f\xfc\x02\xb5\xde\x7a\xad\xdc\xc7\x2b\xa4\xf3\x88\xf0\xb0\xfe\x67\x5c\x76\xa5\x7a\xff\x8c\xe6\xe3\x01\x88\x8d\x7a\x50\x3f\xe2\xcb\x8d\x82\x32\xce\x4f\x80\x58\xe7\xa7\x13\xd9\x64\x0a\xbd\x47\x75\xc1\x98\xad\xc0\x11\x80\x85\x5d\x33\x9f\xcd\xb5\xcd\xa1\x94\xc0\xfe\xc1\x3d\x16\xf6\xe1\x7a\x08\x7f\xdc\xac\x36\xae\x0b\x4e\xa8\x3c\xd9\x84\xb9\x88\x2d\x03\xe2\x74\xc4\x00\xcf\x5d\x27\x44\xe5\x23\x07\x74\x6c\xf1\xfc\xe0\x93\x0a\xd0\x71\xe2\x27\x61\x3e\x7f\xed\x74\xf5\x3f\xd3\x71\xe8\x19\xe2\x45\x40\x09\x01\xc9\x0e\x45\x23\x75\x65\x2b\xea\xf0\x40\x61\x79\x08\xc6\xbf\x3b\xca\x87\x0d\x9c\x63\x85\x0a\x49\x00\xc8\x37\x06\xf7\x15\xd4\x12\x7d\xaf\x87\x07\x9f\xbe\x35\x52\x34\xca\x81\x74\xab\x9d\xd6\x0c\xe4\x00\x20\x3a\x8e\x20\x05\x61\xd9\x83\x6c\xa8\x03\xdc\x7d\x62\x17\x6f\x38\x86\xf4\xb4\x12\xbc\x99\x5e\x79\x44\x5f\xf0\x08\x56\x3b\xaa\x54\x45\x56\x01\x09\x19\x32\x1f\x4f\x40\xc7\xce\x9a\x27\xdb\x57\x3a\xd9\x4b\xe4\x67\x94\x0b\x76\xd9\xb4\x71\x68\x8a\x15\xe7\x8a\x15\xed\x19\xe1\x37\xcf\x23\x39\x4a\x85\x45\xe7\x2f\x96\x19\x16\x0f\x59\x83\xa8\x00\xcb\x60\x5f\xd1\x03\xe8\x89\xed\x74\x3d\xd6\x6b\xcf\x21\x00\xdf\xf3\xd6\xc9\x48\x68\xcf\xba\x54\x76\xce\xc3\x0e\xb3\x20\x03\x59\x64\x8e\x1f\x47\xa3\x12\x4b\xa9\x22\x47\x54\x72\x05\xb6\xca\x2d\x03\x8e\x7e\xf8\x93\x2d\x61\x65\x3b\x77\xb3\xad\x8b\x4c\xee\x4f\xd5\xcd\x5b\x09\x34\x06\x18\x3e\x29\x23\x21\x82\xc9\xf7\x97\xa4\xa0\x8d\x73\xde\x16\xa6\x7c\x5b\x26\xc0\xb7\xf5\x98\xba\x88\xad\x20\x8d\x3d\xc7\x48\xc9\xc6\x87\xad\x3b\x62\x8f\x6d\xfd\x12\x70\xd6\xd6\xcf\xb1\x8e\x80\x2e\x22\x6c\x06\xfb\x60\x3e\xb0\xaf\x7a\x49\xec\x20\x6f\xc1\x24\xff\x71\xf7\xe4\x36\x85\x4a\x29\x0b\x9f\xaa\x0d\x54\x61\xd9\x29\x02\x28\xe7\x6d\xbb\x98\x70\x8e\x9f\xd0\xdd\xe1\x8f\x16\x8e\x49\x55\xcc\x96\x26\x49\x7c\xd2\x70\x36\x64\x85\x64\x93\xb0\xbb\xc2\xc8\x21\x88\x8f\xae\xe6\xd5\xa7\x09\x51\x3e\xea\x21\x03\x1c\x9c\x2a\x2c\xd4\x57\x04\xab\x8a\x40\xba\x16\xd5\xf1\xa0\x94\xa8\x66\x59\x21\x54\x23\xf4\xf1\xca\x6c\xb9\xae\x4e\x7a\xd7\x3a\xb1\x46\x63\x77\xf5\xf4\x5a\x55\xa4\x6b\x7a\x87\x85\xc3\x5b\x86\xf9\x38\xf5\xe9\xf9\x40\x66\xd5\x9a\x84\xf1\x2d\x75\x3d\x88\x90\x34\x5e\x99\x0d\x19\xae\x5c\xbb\x72\x6b\x40\x41\xdc\x62\x1f\x58\xa0\x89\x7f\x72\x3b\x2c\xa1\xb2\x5c\x30\x71\xdf\xbc\x95\x4c\x75\x7b\x41\x2b\x20\xf4\x9a\x7b\xe9\xb4\xca\x2e\x6b\xb9\xda\x97\xa2\x3f\x7c\x04\xf5\x23\x11\x94\x53\xb0\xca\xec\x22\xd2\x36\x64\x22\x32\xf8\x18\x89\x5e\x12\x9e\x88\x4c\x22\xc9\x15\x9c\x91\xdc\x52\xd1\x04\xe9\x2d\x42\xd4\x17\x24\xbc\x11\xd0\x49\x41\x19\x58\x68\x60\xfd\x67\x9b\x81\xe2\xfb\xc4\x3f\x77\xe1\xf9\x10\x3b\x41\x76\x9e\xbb\x2d\x12\xdc\x06\x6e\xe2\xc7\x93\x7d\xfb\xf9\x29\x90\xa0\x48\x24\x37\x45\x1e\xf7\x84\x84\x0a\x62\x1e\x87\xe8\x18\x65\x09\xe2\xc0\xc4\xc0\x96\xa9\xf4\x55\xae\x8b\x58\x57\xfc\x9e\x99\xea\x52\xf8\xeb\x3b\x47\x64\x56\xf6\xec\xa4\xe0\x3e\x9b\x09\x1d\x82\xc4\xfa\xe5\x07\x51\x4e\x7a\xf9\x4d\x04\xe9\x5a\x5a\x19\x7f\xad\xbc\x21\xf2\x2c\x11\x11\x59\x45\x39\x04\x94\x12\x28\x09\x69\xa7\x53\x23\xf2\xda\x0a\x1d\x2e\x37\x36\xd1\xa0\xa2\x66\x94\xa3\xfd\x41\xcc\x60\x0a\xf0\x11\x83\xf4\xc3\x4c\x66\x21\x25\x37\xd1\x1a\xdb\x83\xea\x3e\x8f\x4d\x9b\x29\x4d\x76\xaa\x83\x98\x24\x08\x90\x72\xbc\x02\x6b\x5c\x2f\x32\x39\xf4\x35\xbb\x1f\x67\x39\x74\x3b\x54\x12\x71\x6c\xae\x83\xa4\x9b\x63\x15\x9a\x84\xeb\xc7\x6a\x10\x6e\x56\x88\xa1\x34\xef\xdd\xb1\x9d\x5f\x23\x75\xe6\x1c\xa9\x3f\x8b\x91\x2a\x95\x91\x44\xfe\xd1\xc5\x98\xfe\x46\x5d\xd1\x22\x8a\x89\x42\x83\x46\x78\x1d\xf9\xc3\x84\x19\x8c\xe9\xa5\xa3\xcd\xad\xc2\x5b\xee\x40\x75\x30\xe7\xf8\x86\x1f\xb6\xfe\x95\x9f\xf9\xa9\x28\x2c\x87\x58\x78\x43\x56\x26\xf9\x13\x32\x1f\xd9\xe7\xaf\x0a\xee\x79\x3a\x04\x1d\x1b\xb1\xa7\x00\x25\x17\xd3\xf8\x94\xfe\x54\xfe\x01\x8e\x61\xdc\x3f\x23\x1d\x3a\x18\x26\xb2\xff\x47\x33\xac\x38\xb7\xa5\xd9\x95\x3c\x73\x8b\xd0\x6e\xee\x02\x4f\x2f\x72\x1e\x61\x10\x39\x3b\x82\x22\xc5\x2a\xa6\x9d\x95\x34\xff\x2c\x52\xb9\xfb\x60\xc4\x97\xe4\xad\x7a\xed\x73\xb2\xd5\x00\xab\xf8\x21\x3b\xe1\x14\x85\xb8\x85\x2f\x34\x01\x10\xbf\x2b\x87\xec\x13\x62\x97\x41\x31\xa3\x2e\x78\x79\x08\x15\xe1\x9d\x3b\x93\xdd\x80\x8e\x3b\x98\x62\xef\x82\xd9\xae\xfe\x07\xb2\x30\x74\x5e\x0d\x39\xeb\x46\xe1\x42\x43\x72\xdb\xec\x21\x55\xf4\xcc\x09\x84\x0c\x34\x2c\x19\x92\x9c\xe4\x06\x57\xb3\xea\xfd\x5b\x11\xd9\xd1\xe9\xe2\x0c\x90\xbb\xaf\x6b\x40\x23\x55\x19\x9b\x80\x4b\x42\x3c\x53\xae\x8b\x26\x8f\x67\xf8\xca\x23\xd3\x88\x62\x9b\x33\x49\x1b\xf3\x09\xcc\x64\x97\x7f\x46\x59\x0f\xb1\x73\x01\xef\x50\x1e\x33\xfb\xe7\xec\x7d\x1f\x1e\xe9\xd9\xf9\x07\x86\x20\x86\x97\x8f\xb0\x69\x48\x3a\x99\x59\xec\x1a\xcf\xcb\x0e\xaa\x4a\x3e\x68\xfa\xde\x5b\xe5\x2d\xbf\x0b\xaf\x88\x4e\x72\x4d\x02\x06\xed\x93\x6d\xef\xbd\x80\xb4\x55\xe5\x67\x87\xb1\xca\xdf\x02\x89\xdb\x42\x6d\x12\x26\x78\x09\x64\xee\x48\x9a\x5b\xd7\x66\x40\x39\x06\x00\x63\x97\x88\x2f\x94\x48\x07\xd8\xb9\x6f\x80\x50\x26\x78\x26\x67\xb0\x4c\x58\x90\x75\x75\xf8\xb6\xf2\xbd\x62\x26\x93\xc9\x7f\xa8\x38\xce\x10\x61\x01\x4b\x19\x9b\x2c\x0f\x39\x73\xdf\x96\x2f\xc7\xff\x02\xae\xf3\xac\x9b\xe6\x4d\x82\x9c\x53\x3e\x7f\x6e\x4b\xd9\xd8\x2c\x41\xc4\x74\x1f\x8d\xdf\x59\xec\x84\xbd\x30\xac\x8c\x08\xf7\xae\x7c\x86\xcb\x0a\x46\x1f\x12\x3d\xeb\x90\x97\x4e\x41\x8c\xf0\x09\xbb\x7a\x9b\x94\xe6\x1c\xf4\xde\x6d\xdb\xf7\x4c\x64\x81\x76\x21\x4a\x77\xab\xca\x48\x14\x08\xca\xac\x2d\x8e\x65\xb8\xfc\x44\xe9\xfe\xc2\x5d\x72\x86\xe9\xb0\x0f\x7a\xb5\x08\x7d\x44\xe9\x51\xfe\x39\x4b\x9e\x12\xe9\x3b\xb3\x97\xb8\xcd\xfe\x0d\x00\x66\x8d\xd0\xf9\x2e\xcf\xa7\x32\xeb\xf0\x22\xfe\x72\xb9\xa3\x54\xc1\x29\x32\x22\xcb\xd8\x45\xe4\xaf\x61\xd3\x57\x43\x62\xb2\xe2\xc6\xcf\x3e\x8b\x1a\x43\x03\x58\x17\xe3\x28\xdc\x2e\xd2\xee\xe8\x0b\x6a\x05\x12\x71\x8f\x8b\x8b\x7a\xba\x84\x18\xa6\xf3\xcb\x48\x1a\xe0\x04\x44\x90\x12\xf5\x7d\x76\x82\xd1\x91\x83\xab\x5f\x3b\xcb\x6c\x66\x1b\x32\xb1\x18\x7d\xc3\xc9\x63\x33\x42\xfd\x85\x5c\x14\x17\xcd\x27\x82\x8a\x56\x11\x2a\x8a\xfc\x9d\x67\x16\x40\xdf\x2c\x43\x3c\x8f\x24\xf0\x23\x5e\x81\x7e\x95\x5f\x60\x33\xcc\xf1\xf9\x00\xd6\x41\x65\xf9\x89\x6c\xec\xf7\x47\x2c\x96\xb2\xca\x65\xf3\x6d\x3b\x75\x3b\x0b\xe9\x9b\xff\x76\x85\x94\xc3\x22\x91\x09\x46\xc2\xca\x3e\x22\x77\xcb\x87\xdb\x95\xe4\x74\xb9\x86\x4d\x96\xa7\xe8\x69\x3f\x00\x9a\x4b\x68\x74\x86\xd8\x17\xc1\x0b\xb3\xb5\xe1\xde\x73\x38\x7f\x4c\x45\x19\x8f\xb8\x52\xe9\x27\xf8\x56\xb3\xdf\x3e\xab\xf4\xb1\xef\x9f\x1c\xd6\x87\x7e\x24\x65\xe3\x0d\xe1\xd3\x4e\xd3\x8e\x53\x1e\x45\xef\x90\x2c\x02\x9c\x69\xb1\x7b\xbd\x80\x9b\xf8\x40\x29\x82\xd2\xdf\x54\xc6\x3e\x90\xc8\x37\x67\x5f\xc3\x5e\x50\x6b\xfb\x2d\x85\xce\xa6\x2f\xf0\xd1\x19\xb7\x50\x40\x74\x99\xf4\x36\x5e\xf3\xc9\x1d\x95\x95\x8c\xdc\x4b\xc0\x49\xd1\xef\xc9\x36\xff\xfd\x8f\xf1\x56\x2f\x9c\x3b\x95\x18\xcf\xe9\x51\x96\x04\x7e\x4e\xae\x3e\x2f\x30\xa2\x1a\xa1\x06\xea\x8e\xfc\x08\xce\xcd\xc6\x04\x2a\xc8\x20\x7c\x8f\x4e\x9a\x0d\x8b\x06\x20\x3f\xfe\xa9\xea\xa4\x65\xf1\xb6\x33\x88\x90\x8d\x7e\xda\xfb\xdd\x2c\x8c\x6d\x98\xb9\xd6\xdf\x55\xcd\x8e\xbb\x9e\x61\xb9\x76\x53\x9a\x78\xc3\x38\xd1\xd9\x06\xf7\x29\xa4\x0a\x7a\x22\xf7\x88\xe7\x98\x95\x0f\xe0\x24\xc5\x3b\xd8\xa8\xa7\xc4\x28\x51\xab\x72\x97\x43\xea\x20\xdb\xf7\xfc\x51\x60\x84\x42\x9e\xeb\xc2\x2d\x4e\xcf\x54\xb6\x4a\xaa\xcd\x94\x28\xf3\xbc\x7f\x89\x00\xb7\xb7\xd4\x05\x26\x65\x89\xf3\x6e\xab\xd6\xf9\x2e\x5a\x5c\xe4\xcd\x7e\xca\xf5\xed\xbf\xf9\x08\xef\xf4\xeb\xa3\xfe\x97\x95\x42\x89\x16\x9c\x35\x92\xf1\xea\x78\x56\xde\x32\x86\x93\xe1\x55\x95\x80\x7e\x7f\xe4\x67\x79\x0b\x7c\xb3\x19\xf2\x58\x44\xe1\x51\x66\xc4\x29\x05\x94\xe3\x54\x1c\x14\x24\xe1\xf0\xe1\x56\x49\xfe\x63\x21\xfa\x27\x93\x2a\xcc\xc4\x9b\x6c\x54\xf2\x3f\x9a\x27\x14\x02\x92\x36\xfd\xcc\x51\x26\x86\x4c\xdc\x21\x1b\x3a\xea\xa9\xfc\xc0\x43\xc8\xd3\x51\x22\xa4\xc8\x26\x22\x1a\xb6\x1c\x69\x0e\xc1\xfa\x25\x03\x98\x6b\x9b\x09\x63\xd9\x0f\x4c\xe7\x9f\xcb\x4a\x33\xa6\x47\xac\xa9\x05\x58\xd8\xa6\xe6\x0e\x53\x53\x5b\x35\x75\xf3\x90\x99\x27\xe3\x7f\x74\x2a\x87\x3c\xa3\x62\x8a\xe8\x2e\xfc\x85\x86\x94\x7f\x2c\x20\x5f\xf4\x34\x39\x68\x73\x73\xe5\x48\xbd\xe8\x4b\xc4\x1f\xce\x0a\x49\x43\x6b\x9a\x1d\x64\x4a\xa1\x7e\x4a\xa8\xca\x63\x0a\xc1\xf4\x15\x51\xba\x17\xfa\x67\x7c\xe1\x74\xb7\x88\xc4\x7d\x28\x1c\x58\x3d\xc0\x99\xf8\x54\x3c\x45\x7d\xe6\xc0\x94\xfe\x4d\x35\xb4\x8b\xda\xbf\x42\x0c\xd4\x12\x3f\x9b\x2a\xe0\x44\x82\x02\x0b\x52\x0c\xb3\x5c\x22\x6c\xbc\xc8\x19\xc5\xdf\x80\x34\xdf\xe0\xfc\xc8\x68\x14\xf9\xef\x1c\x78\xd2\xab\x4d\x13\x11\x94\x48\x32\x10\xa2\x45\x02\x64\x0a\xcb\x90\xd3\x85\x5d\x3e\xe8\x6d\xa7\x83\xcf\xf8\x3f\x2f\x29\x1c\xba\x69\x5b\x0b\xf8\x86\x9e\x2c\x22\x0e\x65\x7f\x79\x20\x3c\x81\xa5\x33\xbb\x31\xf7\x83\x04\x1f\x4a\xa2\x50\x1b\x38\x5c\x84\x7a\x8d\x32\xa3\x08\xf9\x39\xbc\x4d\xef\xaf\x35\x03\x63\x72\x6a\x8c\xed\xcb\xdd\xd6\x24\x33\x56\x05\x47\xf8\x2a\x3f\xc4\xca\x59\x84\x4c\x2d\x61\x23\x3a\x2a\x6b\x12\xe0\x14\x71\x22\xd8\xa4\x50\xbc\x54\x57\xee\xcf\x0e\xcc\x7b\xa9\xa5\x2e\x1c\x29\xf2\xe9\xed\x8a\x43\x1f\x43\xf4\x9c\x48\x7c\x29\xaf\x99\xab\x49\x18\x87\x0e\xf1\xc7\x2e\x86\x63\xc1\x14\xff\x70\xbe\x8e\xec\x54\x4e\x31\xb2\x0b\xc4\x90\x38\xee\xe5\xc9\x6d\x76\x59\x5f\x3c\x53\x4a\xb4\xf7\x8b\x55\xd0\x4f\xdf\x98\x17\x65\xa7\xee\x15\x7b\x25\x16\x84\x7b\x79\x91\xf1\xf3\x7c\x36\xbe\x82\x0c\x49\xac\x42\x13\xd1\xa7\x61\x51\x79\x23\x41\x6f\xc7\xf4\x4f\xf4\x0a\xfd\x19\x3f\x12\x45\xaa\x57\x5b\xe4\xa0\x7f\x6a\xb0\xc0\x66\xdf\x8e\xfa\xed\x1b\x9a\xcd\xaa\x6d\x30\x26\x88\x63\xdb\xe1\x2c\xf3\x6a\xc6\x2d\xd2\x6e\x90\xe3\x4e\xda\x9e\x42\x0b\x89\x4d\x1c\xe6\x4d\x45\xc8\x36\xef\xa4\xd5\xd8\x29\x24\xf6\xee\x36\x07\x36\xee\x6a\xa7\xc8\xd5\xcf\x6f\xd1\xba\xb7\x1c\x1c\x43\xfb\x4d\x84\x07\xd9\x4e\xc8\x31\x9f\x3c\x46\xde\xe2\x10\xe0\xd5\x15\xcb\xf4\xd6\xdb\xe3\x45\xe2\x80\xfe\xc9\x0b\x69\x64\x2f\x56\x67\xb3\xf9\x1f\x63\x15\x36\x8e\x61\xdf\x92\x39\x9c\xc6\x12\x8f\x69\x66\x08\x9b\x6d\xe6\xef\x8f\xa0\xb3\xfe\x94\xb0\xaa\x4f\xef\xf8\x7f\xa0\x2a\x63\x90\x3e\x74\x8b\x45\x76\x87\x7c\x4d\xef\x40\xc7\x4e\x32\x78\x08\x8a\x71\xd0\x50\xaf\x73\x91\x0e\xea\x47\xb2\x4a\xfb\x93\xff\x30\x2d\x55\x50\xd8\x10\x30\x60\x02\x57\x9d\xe2\xa6\xaa\x26\xe2\x6a\x3b\x23\xde\xf0\xe4\x87\x59\xab\x2a\x10\x20\x5c\xbc\xa5\xdc\x13\x6d\x2c\xd7\x42\xd1\xf1\x5a\xa4\xa6\x4a\x03\xda\x49\x0f\xa7\x0e\x09\x6d\x5e\xe1\x09\x11\xb2\x29\x6f\x49\xfa\x28\x2d\x85\x6c\xa1\xb7\xc8\x88\xc0\xc8\xe8\x19\xe3\x26\xa9\x04\xcb\x3c\x13\x74\xcd\xba\x96\xd7\xf4\x9e\xf8\x23\xac\x0a\x10\xb0\xa3\xc8\x45\x69\x8f\xb0\xc7\x5d\x46\xa9\xb2\x88\x49\x4c\x2b\x5d\xce\xd2\xf9\x61\x0e\x01\x55\x98\x7c\x2d\x67\xfe\xeb\x29\xae\x0a\x72\xf2\x52\xe4\x72\x5a\x82\xf6\x03\xa7\x0f\xff\xcf\x4b\xc9\xa1\xb5\xea\xaf\x39\x08\x46\xfa\x42\x17\x98\xf0\xfa\xe3\xd7\x72\x3c\x03\x18\x73\x18\x2b\x22\xeb\x3c\xc0\xd4\x9f\x9f\xcf\xce\x9f\x9e\xb7\x63\x09\xcc\x2b\x7c\xe4\x96\xc4\x50\x9a\x25\x55\x02\x5d\x2d\x43\x32\xd1\x2a\xc6\xf7\xd0\x9a\xd7\xff\x94\x3a\xf4\x97\x3e\x7d\xf9\xcf\x07\x9a\x71\xff\x12\x7b\x6c\xf3\x2b\x5a\x34\xd3\xe7\xf0\x50\x58\x52\x85\xa8\x1f\x45\x5f\x48\xfe\xa4\x55\x50\x56\xed\x9a\x44\xea\x6a\x5a\x29\x49\xa5\xd6\xef\x5b\xe6\x99\x36\xde\x82\x24\xf4\x6b\x38\xc1\x19\x86\xce\xa0\x93\xd8\xa3\x53\xe1\x53\x67\x4f\x64\x15\x04\x16\x41\x92\xa8\x83\x7e\x42\xab\x71\x8a\x66\xc9\x94\xc3\xe8\x15\x09\x1e\x04\xdd\x6c\x96\x3c\x3f\x34\x69\x5d\xd7\x1a\xc8\x97\x4c\x64\x22\x06\x1f\xdc\xa2\xb0\x60\xfd\x5c\xeb\x4c\xbf\xd5\x4f\x43\xba\x2e\xa6\xdc\xc2\x03\x29\x76\xf9\xb6\xe1\xf3\xd9\x7c\xb2\x12\x86\xe8\x17\x4b\x47\xa6\x91\x38\x32\xe4\x7b\x51\x99\xa1\x56\xd9\x22\x5b\xe1\x31\x9c\xc5\x9d\x53\x6b\xb8\xf4\x8c\xbe\x66\xf1\x39\x67\xfa\x0c\xf2\x97\x49\x5b\xb8\xba\x9c\xd4\x2c\x8e\xa5\x1e\xde\xec\x80\x5f\x6e\xd8\xbb\x14\x2c\xc6\x5e\x7b\x62\xf8\x0f\x28\x46\xa3\xd5\x22\x6c\x4b\xc9\x4d\xe3\x4f\xef\xe9\x46\xad\x34\x8b\x99\x51\x67\x05\x67\x28\xea\x20\xdb\xfe\x5f\x11\x5c\xf9\x1d\x84\x6a\xcd\x90\x48\x38\x41\x49\x92\xc5\x67\x55\x80\x1a\x5d\x5d\xea\xc2\x64\xa0\x67\x1d\x85\x67\x55\xd9\xc0\x3e\xdb\xea\x84\x5c\x13\xd5\xaf\x4f\xd8\x7d\xf9\x72\xfa\x14\x0c\xf2\x0c\x7f\x1d\x24\x6d\x79\xf2\xa5\xbd\x47\x02\x69\xfc\xd5\x9e\x84\x9d\x84\x8b\xa5\x33\xe2\x27\xed\xed\x93\xaa\x94\xb4\x13\x78\x26\x36\xfc\x32\x75\xe3\x19\x3a\xf8\x55\x43\x9a\xc0\x3a\x85\x1f\xcf\xf6\xce\xc3\x27\x06\x8e\x7d\x2d\x01\x6c\x8d\xde\xe9\x63\xc8\x0d\x99\x39\x1f\xd9\x46\x0d\x55\xf4\x1b\x12\x3d\x87\x3a\xf1\x2f\x99\xa6\x0e\x9e\xce\x79\x71\x24\x16\xd1\x89\x94\x2e\xde\xc9\x88\xc9\x52\xf4\x1b\x0f\x92\x54\x80\xfb\xa1\x81\x5f\xae\xe4\x06\x0c\x40\x9e\x31\x3d\x3e\xa8\xb2\x3a\x77\x49\x75\xad\x8e\x2c\x44\xbe\x3c\xfc\x5c\xd4\x21\xa9\xc7\x86\xc8\xae\x1f\xf2\x73\x8e\x4b\x6d\xc8\xee\x68\x87\x2d\xac\xfb\xd5\xca\x55\x60\x48\x84\x39\x06\x8f\x8d\x18\x59\xf4\x0f\xc9\xaa\x63\xfa\xca\xd8\xe2\x27\x2b\x5a\xe7\x26\xa0\x9b\x21\x25\x54\x55\x47\xad\xaf\x6c\x82\xf7\x41\xa2\x46\x9f\xa6\x17\x6c\x76\x88\x6d\xe4\x67\x49\x1f\xfa\xf7\x5e\xf5\x47\x2f\x9a\x45\x5f\xce\xaf\x7c\x5c\x8a\xdc\xcb\xfb\x12\x0a\xaf\x35\x64\x5d\x2b\xdb\xce\xd4\x6b\x05\x27\x0f\x7e\x6f\xac\xe8\xfb\xc2\x96\x4c\x5f\x84\x8d\xb7\xd8\x4c\x8c\xe7\xbd\x0f\x3a\xd4\x0c\xd2\x15\x51\x34\x45\x69\xfa\x78\xbe\x64\x3d\x83\x1f\x60\x23\xef\x08\xce\x06\xfe\x9a\x4c\x20\xf7\x21\x32\xe3\x15\xca\x02\x86\x9b\x0f\x9e\x69\xc5\x95\x68\x4b\x24\x7b\xa0\x7d\xf8\x31\xf4\x49\x4e\x33\x67\x88\xbc\xfa\xb4\xe9\x96\x4e\x6e\x34\x90\x63\x10\xb6\x3b\x7e\x16\x35\x81\xcf\xed\x7a\xab\x09\x0a\x5f\x9a\x21\xf6\xb6\x07\xe2\x11\x06\x28\x0d\x75\x6b\x5e\xb4\xc4\x8f\x6a\x03\xb5\x29\x02\xf3\x41\x38\xcf\xd8\xc5\x2b\x20\x09\x6e\xb4\xe2\x32\x21\xfa\x9c\x19\x2d\xf5\xa2\xa9\x0d\x12\xec\x1b\x5c\x16\xd1\x94\xb6\xe1\xa7\x60\x6c\xbe\x3a\xdd\x05\x02\xc9\x3f\x78\x1b\x31\x38\x47\xdb\x74\xbd\xda\xa4\xfd\x0d\x57\x97\x53\xeb\x15\x3c\x52\xde\xed\xb6\x4d\xea\x7f\xf7\xb0\x41\x39\x4d\xc8\xed\x13\x34\xa8\x77\xa4\x6e\x96\x08\x7e\xef\x3c\xbc\x97\x0f\xdb\x29\xc5\x83\xcd\xad\xdb\xe4\x72\x9c\x64\x19\x53\xb2\x88\x50\x9f\x4b\x1a\xc1\x0e\x29\x5d\x29\x94\x69\xc9\xff\xf1\x3c\x0c\xa4\x48\x89\x09\x96\x95\xc8\xd2\xd9\x36\x37\x32\x60\xee\xd8\x30\xe2\x52\x0c\xe2\xd4\xf8\x0c\x87\x5b\xb0\x53\xf8\x48\x71\x58\x5c\x17\x49\x63\x9a\x5f\xe1\xee\x90\x1a\x77\xe5\x9d\x7b\xc7\xf9\x60\x1c\x74\x67\xa4\x12\xa1\xe1\xc0\xb9\xd4\xae\xe0\xab\x31\x28\x12\x3b\x47\x60\x01\x12\x5b\xb3\x3d\x7e\x38\xcd\x9c\xcc\xb3\x4a\xb6\x98\x90\xda\x84\xeb\xd9\x6f\x01\x0e\xed\x13\x74\x92\xfd\xba\x5b\x8b\xfa\x0b\xac\xae\x2b\xb7\x43\xc8\x45\x12\x79\xad\x69\x46\x91\xed\x68\x9c\xb7\x75\x82\xdc\x34\x70\x8e\xb0\x2b\x98\x90\x1e\x4c\x78\xf1\xf8\xaf\xcd\x3f\x59\x84\xa6\xbc\x75\x14\xa0\xf5\x6e\x8f\xfb\x20\xde\x46\xc0\xed\x2d\x74\xe7\x7d\x32\xea\xf2\x5d\x34\xf3\x03\x79\xbb\x62\xb8\x6a\x9b\xf1\x6e\x85\xa8\x4d\xe7\xbd\x60\x36\x50\x09\x9b\xd9\x8d\x2a\x06\x8a\xc9\x6e\x62\x6e\x8b\xd2\x41\x67\xf1\xc9\xdf\x73\x00\xa1\x74\xc2\x51\x34\x4d\x8e\x08\x6c\x3b\x0f\x6f\xa2\x67\xca\xe9\x7b\xd3\xf9\x3b\x0c\x14\xde\x79\x0e\x98\xec\xa7\xd1\x7a\x27\x05\xab\x02\x15\x5b\x35\x3a\x89\x7e\x8d\xb4\xbc\x69\x06\x6d\xaf\xb9\x87\x4b\xad\x10\x30\x84\x13\xfa\x60\xef\x67\xc9\xca\xbe\xaa\xab\x5f\x2e\x35\xf3\xc1\xfe\x65\x06\xac\x8d\x5e\xc2\x5e\x51\xf7\x83\xb0\xa4\x9b\xff\x0f\x07\x0a\xab\xda\x2b\x8b\x31\xa5\x3f\x84\x9c\xd1\x3c\xa1\x7e\x58\x01\xd6\xed\x98\x9a\xa9\x2e\x51\x34\x9e\x84\x77\xbd\x83\x28\x75\x9e\x6d\x67\xed\x52\x34\xdd\x3f\x36\x05\x5a\xa5\xe5\x04\x9c\x6b\x98\x80\x71\x6b\x21\x63\x9c\xcd\xe3\xc7\x99\xe2\xb8\xe9\x5d\xee\x58\xe8\x6e\xe4\xaf\x11\xfa\x9a\xc0\x2f\xa3\x6d\xef\xbf\xc2\x43\x3b\xd3\xc5\x8c\x42\x2b\xdc\x31\x37\xfb\xec\x03\xb9\xaa\xb7\x5d\x08\xb4\xda\xd9\x9b\xd4\xfe\xf2\x4c\x43\x1f\x0c\x81\x1c\xd9\x67\x0a\x91\x59\xb3\x90\xbd\xc5\xcd\xc4\x44\x43\x92\xa1\xbb\xf7\x4a\x84\x65\x5f\xe9\xbb\x19\xf3\x84\x5f\x2a\x86\x13\xed\x77\x4a\x55\x68\x4e\x21\x9a\x76\xbb\xe2\x21\x72\x56\x61\xc4\x14\x34\xac\x10\xab\x85\x4a\xeb\x46\xc1\xbd\x5f\x91\x35\x78\x35\xbf\x20\xdf\xa3\xac\xba\x22\xaf\x43\x7a\x29\x48\xd7\x48\xa1\x42\x76\xab\x0a\xd8\x2b\x92\x81\xe0\xe4\xeb\xff\x67\xaf\xac\x4b\x3d\x46\x27\xb6\xa9\xd7\x16\xd9\x3e\x9b\x26\xb6\x0b\x3d\x3d\x25\xbf\x2e\x32\x13\x90\xd6\x0d\x23\xf8\x8f\xfa\x4d\x00\x7b\x66\xb6\x3a\xae\x59\xaf\x61\x2f\xa1\x4c\xd9\xa9\x28\xd1\x66\x6a\x69\x4e\xc8\xd3\x11\xe5\x6b\xee\x7e\x84\x30\xbd\x5d\x5b\x97\x76\xb6\xbf\x6d\x18\xaa\xc1\x0b\x5b\xeb\x2c\x45\xdc\x99\x95\xab\x13\x42\xb7\x42\xe2\xe6\x25\x26\xb4\x3b\xfe\xde\x77\x8c\xae\x9f\xb9\xef\x89\xfe\xc6\x3e\xd2\xb1\x8f\x71\x3b\x91\xb6\x43\x5b\x85\x0b\x09\x93\xf3\xf0\x4f\xfa\x6b\x73\x21\x73\x3e\x18\x7f\x96\x16\x10\xab\xc7\xc0\xb0\x41\xa3\x68\x95\xd3\x90\x88\x03\xc9\xd2\xdd\xa7\xaf\x6b\xe4\xb1\x66\x48\xf4\xca\xec\xf9\x21\x58\x56\x8c\x99\x2b\xac\x89\xe5\x67\x72\xa1\xfb\x1a\xa1\x3e\x2b\xc0\x0b\x7f\x1f\x09\x22\x11\x59\x12\x55\x72\xc6\x94\xa4\x46\x49\x9e\x13\xb1\xea\x20\xc7\x4d\x57\xe0\x11\xcc\xab\x21\x4f\x75\x0a\x59\x33\x43\x38\xcb\xd6\xac\x87\xff\x11\xb9\xc3\xc5\x5a\xd0\x5e\x8e\x57\xf8\x05\x91\x9c\x20\x6a\x0f\x44\xee\x86\x51\x2f\x6b\xd5\x59\x25\x68\xf7\x11\xb5\xf5\xcc\xff\x9d\xf4\xe7\x38\xdd\xd7\x84\xa3\x4d\xb4\x34\xf0\xf6\x49\x59\xb3\x79\x34\xb4\x7c\x73\x53\xf5\x91\x3d\x62\xab\x94\x9f\x65\xe8\x36\xee\x97\x6d\x12\x9d\x39\xe9\x7f\xe9\xdf\x02\x71\x10\xb3\xe9\x74\x23\xb7\x36\x5e\x78\x20\x66\x38\xfa\xad\xe8\x29\x50\x96\xf5\xbf\x8a\x5c\x3c\x87\xe3\xaa\x13\xf4\x0f\xd0\x04\xe3\x12\x3d\x6e\xda\x10\xc9\xe8\xf1\xc0\x3e\xe6\x14\x72\xe8\xe6\xc9\x82\x15\x89\x0e\x3b\x84\xe8\xb7\xc0\x4b\x49\x81\x44\x51\xd1\x1c\x10\xa8\x15\xc9\x02\x91\xbb\xbc\x47\x4c\x2e\x8d\x68\x0f\x6f\xfe\x48\x5a\x08\x9b\x1d\x09\xf8\xa6\x88\xdc\xc7\x22\x57\x7d\xf7\x7c\x48\x2e\x6c\x5f\x60\xef\x07\xa9\x6d\x8e\xac\x14\xdd\xa4\xab\xed\xb0\xef\x67\x25\xfe\x98\x5e\x32\x57\x8a\xb7\x93\xae\x10\x18\x26\x37\x97\xe0\xa3\x70\x6a\x52\xef\x77\xb8\x65\xa9\x0f\x65\x30\x77\xa4\xa0\xc5\xe9\x0d\x25\xfb\x6d\x08\xc6\x78\x1c\x92\x5e\xcd\xce\x7e\x72\xdf\xe0\x97\xf6\x70\xee\x9b\xf0\x32\x2b\xeb\xe9\x67\x61\x33\xbc\x0c\x11\x8a\x3a\x70\xc5\xde\xb1\x68\xf5\x45\x3e\x3f\x7b\x0d\x4f\xfd\x3d\x3c\xb6\x76\xab\xb5\x3f\x7e\xe1\x7b\xa0\xd1\xcc\x44\xa3\x19\x7a\xe2\x41\xa8\x63\x23\xc4\x51\x32\x63\x3f\x72\xf1\x7a\x7e\x4f\xa2\x74\xec\x29\xa1\xb6\xd9\xaa\xe0\xbe\x0a\xce\xcb\xa2\x08\xa3\x2a\x6f\x24\x9a\x5d\xb8\x97\x33\x31\x42\xad\xde\x9b\xad\x5f\x91\x7a\xb0\x95\xfe\xfb\x19\xb5\x7b\xb1\x3f\xee\xfc\xad\x5e\x74\x6c\x73\x40\xd4\x1b\x99\xf3\x5b\x98\x0e\xcd\x6b\xa1\xaf\xf3\xea\xcc\x2c\x0e\x25\x51\xda\xf0\x4d\xf0\xe9\x99\x1f\x7b\x6b\x81\x89\x36\xa2\xe7\x53\xc6\xf2\x50\x09\x2c\x9e\x81\x38\x9e\x9c\xfa\x6c\xd0\xb3\x1b\xb4\x81\x9d\x40\x58\x52\x70\xf8\xf6\xb3\x60\xe2\x1b\xeb\xb5\x88\xf8\xd8\x7e\x8b\x9b\x8c\xb0\xad\x07\x8f\xca\xe1\x11\x0c\x51\x43\xf2\x21\x90\xac\x69\x3e\xb6\x3f\xd2\xa6\x47\xcf\xeb\x4b\x26\x08\x44\x2c\x75\xb3\xfb\x37\x85\x72\x32\x85\x95\x55\xff\xcc\x4d\x99\x02\xc4\x52\x7e\xa2\x5b\x4f\xab\x3b\x90\xf6\xee\x3e\xe2\x9c\xfa\x24\x49\xd3\xd6\x23\x58\xfe\xe1\xe0\x65\x1f\xf8\xe2\xa7\x13\x56\x69\x3f\x45\x93\x4c\xea\x28\x3e\xdf\xf5\x4b\x2c\x3e\xa3\xe0\xb1\xe1\xa6\x9b\x96\x2b\x5a\x1a\xf8\xa3\xdd\xdd\xd3\x69\x7a\x83\x55\x1c\xb9\x8d\xee\x65\x9d\x64\x2d\x45\x07\xb0\x2d\xe4\x06\x5b\xc2\xcf\x47\xcb\xeb\xf1\x43\x9a\x23\xf0\x5e\x3e\x38\x48\x44\x18\xa1\xb1\x4c\xd8\xb4\x7f\x36\x5c\x75\x95\x3e\x79\xad\xa4\x48\x42\x58\x49\x62\x5e\xed\x7b\x42\xa3\x4a\x2a\x59\x21\xbc\xd1\x57\xb7\x32\x4f\x68\x2d\x32\xba\xbe\x28\xb1\x04\x63\x28\x09\x50\x0d\x0b\x5a\xc0\x87\xc2\x61\x0b\x7e\x35\xda\x4d\x85\xbb\xd2\x3a\x37\xfc\x54\x0e\xd8\xb3\x60\x46\xc7\x56\xff\xd9\xd2\x82\xc2\x4b\xc4\x14\x6f\xa3\x97\x2c\x13\x4b\x87\x8f\x2e\xe5\x6f\xac\x5c\x9c\x57\xcc\x58\x72\xbc\x5b\x31\x37\xe1\xab\x02\xb2\x4a\x94\x37\xd5\x9d\x6e\x05\x6b\x0a\x5d\xd1\x9a\xae\x48\xa4\xba\xc8\x29\x84\xb1\x39\xc1\x3e\x8c\x82\xf7\x88\xd2\x84\x0e\xf8\x98\x35\xc3\xf4\x2a\x8c\xb1\x3c\x8d\xe3\x41\x63\x6d\x29\x42\xb1\x3e\xb7\xb4\x66\xb4\x12\xfc\x28\x7c\x96\xa6\x47\x40\xaf\x83\xcf\xe8\xd0\x68\xa1\xd6\x64\x09\xb6\xde\x82\xec\x0d\x3f\x46\x2c\xe1\x52\x74\x9a\x2e\x7b\xf3\xb9\x52\xee\xbf\x8b\x3f\x79\xe4\x75\xb1\xc8\x7f\x77\x09\x2f\x23\xd7\x7f\x92\xd0\xc8\x15\x00\xd2\x4f\xcd\x01\xf4\xc6\xa2\x1e\x74\x6b\x72\x50\xe5\x94\xd9\xa8\x8f\xfd\xfc\xe2\x84\xad\x71\x0a\x71\xa9\xe8\xd4\xf6\xc2\x2f\x05\x48\x1f\xeb\x4f\x39\x5a\x7c\x2d\xc3\x49\x5e\x48\x8b\xa4\x2b\xc1\x12\x6e\xf7\x4b\xfa\xda\x05\x7d\xca\x71\x7d\x09\xbf\x11\xa0\xc3\xfe\x5e\x30\xef\x13\x1d\xfe\xb1\x0f\xfe\xe8\x7b\xfd\x17\xdb\xa5\x3f\xdb\x44\x45\xca\xd6\xdb\x11\xed\x3f\x59\xbb\xff\xa5\xff\xb9\x78\xe6\x0f\x60\xe8\x97\x03\xdf\xa0\x83\xdf\x43\x2d\xaf\xa4\x80\x2d\x9b\x78\xfa\xec\x22\x69\x4d\x1f\x56\x0a\x53\xe5\x7e\x77\x72\x79\xab\x63\xa8\x55\x1b\x2a\x4a\x4f\xeb\x3f\xd2\x53\x35\x0f\x27\x31\x67\xed\xe8\x74\xe9\xa9\xbc\xc2\xfb\xaa\x54\xa6\x78\x91\xe7\x62\x87\xe6\x8a\x45\x09\x01\x54\xa9\xee\xf9\xca\xb1\x90\x13\xcf\x03\x0b\x98\x02\xba\xf1\x9f\x81\xcc\x44\x7d\xef\x18\x44\x4d\x3f\xa3\x9a\x88\x60\x8a\xa0\x44\x68\x09\x1c\xa7\x86\xec\x29\x60\xe5\x73\x0b\xcf\x28\xec\x84\x77\xd2\xcc\xa7\xac\xa0\x31\xf7\xb6\x6c\xc0\xe2\x84\x75\x43\xd3\x20\x2c\xbf\x22\xce\xeb\x9b\x57\xb4\x53\x7d\xfc\x69\xf7\x9f\x04\x6e\xe0\x6c\x1e\x96\xe6\x2d\x79\xdb\xe6\xba\x5f\x5e\xb6\xbe\xf6\xb4\xaf\x11\xbc\xbd\x0b\xe9\x6e\x9d\x5f\x76\xad\x5b\x5a\xf7\x86\x7a\x98\xff\xe5\x6f\xa8\x1c\xd8\xa5\xd9\xfe\xb5\x9f\xb2\x53\x8b\x37\x9d\x92\x9c\xc3\xd6\xb0\xf9\xb2\xf5\xa7\x53\x76\x38\xf0\x6e\xe5\x36\x8d\x60\x78\x91\xfd\x19\xaa\xcc\xb1\xc5\x63\xc0\x7f\x85\x2e\x0c\x36\x0a\x5c\x5c\x56\xc9\x63\x61\xa3\x75\x5c\xab\x5c\xd8\xe7\xd6\x20\x06\x8a\x2d\x94\xda\xe9\x9b\x44\xae\x45\x70\x18\xb3\xd0\xef\xc4\x4c\xb3\xa4\x5e\xc5\x68\x1b\x24\x32\x96\xa1\x96\xfd\xd9\x82\x45\x84\x99\xc7\x08\x91\xd1\xc9\xcb\xe9\xe9\xb1\x88\x7a\x0e\xfe\xf0\x55\xcb\x6d\xc2\x82\x76\xfb\xb4\x8d\x2d\xe9\x98\x20\xaf\x2a\xc8\x3b\x63\x3f\x5d\x7d\x3f\xfd\x84\x98\x42\x5e\xeb\xe5\x2d\xef\xf3\xc2\x26\xd5\x73\xcd\x55\x86\x40\x36\xf4\x1e\x87\x1d\xc5\x66\x86\xad\x3a\x62\xb1\xe4\x21\x76\xb9\xd2\x82\xbe\xea\x5c\x18\x7c\x08\x44\x4f\xcc\x4f\x00\xc5\xbc\xdf\x83\x21\xfd\x69\xf1\x25\x3d\xa1\x59\xf3\xd7\xcf\xf2\x2e\x00\xce\xae\x92\xc7\x86\x07\x1f\xbd\xca\x44\xfb\x19\x3e\x04\xcf\x84\x20\x0b\xff\x57\xc9\xbe\x7c\x8a\x86\x6d\xed\x23\xc2\x7e\x5d\x6d\x46\x82\x72\x25\x86\x6e\xb9\xae\xe1\xd6\xba\xd5\xcc\xbf\xf7\x5b\xc1\xca\x20\xe3\x74\xd2\x54\x93\x15\x9b\x9e\x07\x17\x15\xfb\x4d\x83\x84\x16\xb9\xfb\x07\x82\x67\xda\x31\x76\x8c\x62\x7c\xd6\x38\xfb\x07\xac\x05\xba\xcd\x6a\xec\x90\x02\xd3\x80\x65\x10\xda\x7d\xe6\x50\xa6\x0f\xe5\xe3\xdf\xc3\x50\xc4\x1b\x80\x8e\x24\xcc\xdd\x3d\xb8\x6f\xd0\xe3\xba\x8f\xff\x04\x48\xe8\xe0\x91\xf6\x69\xc3\x3c\x04\xee\x7e\x41\x2f\x18\x63\x65\x54\x0c\x8a\xf8\x01\x5c\x76\x11\x80\xf7\xda\xd3\x47\xb0\x94\x23\xc9\xb5\x23\xb8\x2e\x04\x06\x8c\x99\x4c\xb6\x2a\x36\x73\x04\xe6\x77\x41\x57\x03\xbb\x41\xfd\x67\x14\x00\x7f\xcd\xbd\x1f\xcf\x67\xd8\xb9\xdb\xaa\x10\x23\xa2\xda\xd1\xc2\xec\x61\x7e\xdc\x38\xac\xc9\x69\xef\x3d\x4a\x2d\x12\x58\x93\xe8\xe7\xfd\x49\x3d\x6c\x8f\xa2\x4a\x47\xb5\x51\xfb\x02\x17\x77\x76\x9c\x7a\x30\xb2\x03\x9f\x47\x83\x97\xa3\x33\xcc\xd4\x6d\xab\x18\x98\xbd\xa0\xf8\x12\xf4\xb2\xbe\xa8\xf4\xe9\xad\x26\xd8\x63\xc4\x7f\x1e\xc2\xe0\x07\xb1\xfb\xe0\xa8\xae\x2a\xf0\xfa\xf9\xa9\x26\x94\xd5\xf7\x2e\x46\x21\x34\xef\xd8\x9e\xe4\xc4\x13\xbb\x4a\xb0\x03\xd9\x35\x13\xd9\xba\xfe\x4a\xdc\xa7\xf4\xb0\x02\x88\x91\xf6\x5c\x18\xad\x54\x4c\x03\x6e\x52\x70\x3a\x30\xcc\xef\x43\xf4\xd9\xb0\x90\xbf\x63\x87\xdf\xdb\x8a\xdd\xb1\x79\xdd\x47\x66\x81\xc7\xc9\x3d\x44\xa9\xa5\xf4\xf8\x88\xf0\xf5\x5d\xaf\xb5\x85\x2f\x9d\x0b\x16\x25\x54\x8e\x14\xb0\xee\xb3\x5e\x5e\x6b\xb8\x8d\x1b\x3d\xdb\xae\xf8\x9a\x81\xe1\xff\x78\xb5\x63\x73\x4b\xb7\x71\xdc\x5a\xf6\xd2\x8b\xff\x59\xf7\x9f\xeb\x5b\xbb\xbf\x6d\xf6\xbb\xba\xa9\xe0\xed\x2a\x75\x5c\x9d\x2d\xb0\x8b\xb0\x7c\x88\x9c\x45\xa7\xb5\xcb\xa0\x01\xf4\x14\x42\x38\xe7\x89\xe8\xbf\x4d\x71\xca\x40\x07\x46\x16\x36\x6f\x70\xa3\xe7\x72\xe1\x38\x7c\x0b\x7f\x03\xc5\x96\xe0\x74\x07\x1d\xb6\x02\xdd\xdf\x43\x91\xfb\xbc\xf2\x4c\x3b\x3b\x9b\x08\xde\x2b\xc0\x6e\x47\xae\x1f\xa1\xfd\x95\x22\xc1\x6e\x8d\x8c\x4b\x90\x6a\x25\x70\x66\x05\xd4\x45\xdd\xdd\x85\xd9\x57\x37\x7b\xdd\xef\x74\x55\xa7\x59\xeb\x99\x39\xb6\x16\x9d\x13\xea\x04\xf3\x07\x85\xaa\x63\xd1\xe6\x78\xbe\x48\xb6\xe3\x15\xcf\xdc\xa9\xa1\xeb\x10\xb7\xee\xc7\xe1\x2a\x91\xfb\x1e\x6a\x64\x38\xe1\x92\x59\xeb\xaf\x4e\xe9\xb5\x1c\xc6\x90\x26\xb9\xa9\x6b\x03\x09\x41\xd6\xa0\x59\xb6\x74\x80\x09\x82\x97\xab\x2e\x81\x0b\x99\xf4\xec\x67\x29\xa4\xe1\xc2\x5c\x8a\x2f\xb3\x22\x8e\xc2\x4f\xa7\xf4\xed\x89\xae\x3b\x45\xcc\x61\xfc\xea\xf8\xa3\x8f\x14\xd3\x9e\x18\xcc\x60\xdf\x8b\x48\xb6\x75\xf0\x29\xde\xdf\x6d\xc4\xe0\x01\x52\xa2\xed\x9c\x03\x2f\x99\xc3\x49\x9b\x89\x74\xc9\x92\x11\x7d\x88\x2f\xa9\xbd\x7b\xa1\xb3\x9d\x0c\x30\xec\xbc\x93\xff\x1d\xfe\x6d\xf2\xf3\x15\x06\xd3\x77\x92\xb6\x7a\xbb\xf8\x23\x61\xdf\xc1\xb3\x3c\xad\x4c\x78\xfa\x17\x65\x4f\xa0\x7d\xf0\x7f\xae\x3d\xf7\xac\x7e\xc9\x90\x08\x9f\xa6\x55\x2d\xe5\x34\x56\xda\xec\x8f\xa8\x32\xfc\xad\x01\x18\xf4\xc7\x0f\x65\x3d\x26\x7d\x84\x5e\xcc\xe1\x7a\xaa\x7d\x21\xba\xf0\x3b\x0a\xa5\x2f\xa1\xc3\x6f\xe6\x56\xfe\xd3\xa9\x53\xf7\xf1\xb6\x8d\x7f\x39\x30\x7d\x16\xe4\x8c\xa1\x4b\x62\x6d\xfc\xae\x04\x0e\x7f\xf6\x61\xef\x12\x61\x29\xef\x52\x84\xe5\xbd\xcb\x3e\x7a\x35\xf2\x0e\x35\x35\x53\xb9\xc8\xff\xbd\xbf\x0b\xbb\x19\xf7\xa4\x0e\xc7\x95\x6d\x4a\x79\xa9\x8d\xd1\x52\xfd\xec\x2b\x69\xbe\x7b\x34\xe9\x56\xe3\xc2\xca\x0d\xf0\x2e\x7c\xb8\xea\x1f\x45\x34\xeb\x5b\x6e\x66\xef\x39\xe6\x82\xb7\x17\x1d\xa4\x81\x79\x6e\xe0\x8f\xd8\x9c\x2f\xba\x29\xbf\x5b\xb3\xc5\xe5\xe0\xd4\x87\xc7\xa2\xfe\xce\x33\xfd\x3d\xd1\x21\x61\x27\x05\xb3\xb1\x97\xd4\xef\x74\x9f\x04\xc7\xde\x49\x3f\xb5\xfd\x30\x11\x4d\x90\xe6\xfd\x67\xe4\x37\x35\xeb\x97\x37\x18\x47\x98\x3e\x5f\xa7\x83\x30\xaf\x02\x00\xf1\xe1\x19\xff\x92\x91\xbf\x98\x14\xd8\xe2\xb5\x9c\x1e\x7f\xf5\xba\x75\x85\x01\x6b\x8f\xce\x4a\xdc\x87\xac\x5c\xfa\xfd\xa5\x35\xa2\xc8\x5e\x20\xf4\x49\x70\xbe\x47\xc3\xe5\x67\xf2\x17\xf7\x25\x7b\x8f\x47\xb4\x54\x40\xcf\xf1\xcf\x88\xf6\x4a\xfd\xfc\x43\x46\x3e\x8a\x3a\x36\x76\xcd\xd9\xd7\xe5\xaa\x77\xa0\x03\x5f\x32\x04\xaa\x0a\xc0\xbb\x9e\x7b\x34\xd9\x6e\x16\x80\xf7\xd9\x18\xff\xf6\x86\x36\x96\x7c\x08\x6f\x64\x3a\x81\xb7\xba\xc4\x0e\xf6\x73\xc5\x15\xe4\x0f\x8f\x34\xec\x25\x38\xcf\xe1\xdd\x97\xf7\xa4\xd4\x84\xfb\xa7\x69\xb7\xa9\x43\xcd\x94\x34\x8b\x1a\xdc\x11\xf0\x8f\x7e\xc2\x3b\xf9\xcf\x7c\xd5\x0f\x31\x19\x34\x51\x98\x05\x50\x83\x08\x6c\xfb\x3d\x7a\xde\xdd\x55\x84\xd6\xdb\xa6\x8c\x20\xa1\x7a\x1a\xe2\xe3\xff\x45\x02\xa2\x8f\x4a\x19\xd4\x09\xb8\x4b\x58\x66\x7b\x6f\xe4\xad\xc5\x1c\x6e\xb6\x4b\x74\x45\xd0\xe2\x6b\xd1\x89\xd9\x36\x9f\x0c\xfe\xbf\x73\x6e\xaf\x02\x1f\x0f\xa9\xdf\xed\xcc\x91\x91\xa8\x07\x22\x06\xe5\x77\xe6\x91\x02\xd2\xab\xb8\xe3\x20\x57\x1f\x9b\xa0\x6f\xa6\xce\xd8\xc8\xc1\x98\xab\x50\xf3\x79\x15\x09\x1f\x6d\x30\x4b\xc0\x68\x43\x55\xcd\x17\x53\xd1\x31\x5a\x55\x5f\x5f\x2b\x52\x8d\xa3\x8b\x62\x55\xa4\xfa\x19\x8b\x6d\x6b\x14\xaa\x38\x53\x93\x75\xfd\xfa\x23\x54\x03\xf8\xeb\x4c\x67\x51\x03\xa4\xa8\x27\x32\x13\x49\xf3\xd0\x44\xde\xe3\xea\x48\xf5\x4e\xa0\x0b\x61\x8f\x25\xe7\x18\xa1\x89\x10\x5d\x94\x68\x6c\xd8\x26\x26\xf9\xba\x64\x7b\xd9\xa7\xa2\x08\x6c\x28\x82\xed\xe5\x84\x10\x3e\x3d\x3b\xc9\xc9\x0e\xbf\x87\x89\x2f\x9c\x83\xeb\x67\x9b\x1b\x09\x9f\xae\xcc\x7d\xe0\x25\x05\xe3\xd5\x83\x07\x4f\x36\x78\x3f\x27\x22\x5a\xe8\xca\xac\xd4\xb8\x79\xe7\xa5\x7d\x3f\x60\x16\xc8\x75\xcf\x3b\x2f\x41\x7d\x9e\xd6\x1f\x95\xb9\x87\x6c\x51\xad\x1a\xef\xd4\x3c\xd8\x4e\x81\xda\x06\x43\x79\xe6\x80\xd5\x3c\x39\x0f\xda\xb6\x4e\x7e\x96\x26\xa6\x39\x7c\xda\x27\x3b\x3f\x32\x02\x3a\xeb\x3d\xb7\x0c\x92\xb3\x16\x3a\xd9\x9f\x55\xb5\xdd\x59\x07\xb1\x64\x4f\xfe\x06\xde\x34\x51\xb5\xc6\x71\x56\x83\x65\x6b\x68\x99\xbb\xe3\xaa\x99\x79\x96\xa9\xbd\xc0\xb4\x86\x55\x22\xe8\xee\x3a\x3e\x5c\xaa\x9f\xf4\x7f\x67\x65\x0c\x9c\x9a\x7c\xcf\x39\x30\x70\xbf\xf6\xfd\x5c\xe6\xff\xc8\xd7\x91\x82\x1b\x1d\xe2\x7f\x3a\x24\x72\x34\x6a\x07\x88\xb0\x38\xb2\x32\xce\xac\x66\xcc\x30\xb8\x5b\xdc\x09\x7a\x68\xf4\x54\xfc\xf9\x29\x90\xc1\xf3\xb7\x7d\x85\xc8\x5a\x1d\x20\x5b\x84\xe3\x93\xa7\x39\x6c\x00\x86\x30\x14\x86\x25\x0d\x8b\x0d\x24\xf1\x3b\x6b\xda\xf6\xa6\xcc\x83\xb0\xb5\x2e\xab\x53\x62\x27\xcb\x2a\xe6\xb5\x5d\xd6\xfc\x1f\x1c\x6b\x70\xf1\xee\xc2\x66\x4c\xf1\x74\x5a\xb6\x1f\x40\xf9\x6d\xa3\xc4\x63\x1f\xd9\x10\x70\x1c\x92\x52\xf9\x50\x7c\xf6\x81\xc6\x5e\x38\xdc\x1c\x45\xd0\x04\xb8\xdc\x9e\x7e\xb9\xfe\x3a\x30\x44\xd7\x0f\xae\xcc\x08\xb5\x14\xed\x7b\xde\x9b\xfc\xf9\xd0\xa4\x7a\xd8\x5e\x82\x1e\x02\xd3\xbc\xea\xc7\x07\x03\xdc\x93\x36\x41\x35\x95\xff\x00\x3b\x08\x87\x36\x06\x87\x78\xc2\x36\xe3\xac\x6a\xaa\x20\xe3\x82\x1d\x99\xc3\x4e\x76\x19\x6d\x00\xcc\xd8\xf8\x50\x0f\xab\xe0\x59\x18\x05\x63\x39\xc9\x6d\x2c\x64\xf8\x16\xc5\xaf\x17\x85\xe8\x95\xc3\xe7\xab\xd2\x4f\x3a\x21\x0a\xfc\xcf\x1c\xd5\xd8\x3f\xda\xda\xef\xa5\x39\x42\xed\x10\x4a\x71\xd3\xba\xcf\x2f\xb5\x4f\xfa\x30\xb1\xda\xf3\x5b\x69\x8e\x3b\x0c\x55\x33\xf9\xd9\x4c\xc9\x4c\xe1\x14\x80\xf6\x00\x5b\x21\x60\xbb\xac\x42\xc9\x91\xa2\x21\xf3\xc2\x72\x06\x1b\xdb\x8a\x81\x70\x4a\xb4\xcf\x1a\x59\x99\x56\x83\xfc\x93\x50\x31\x36\xc8\xbe\x68\x21\xda\xe6\xf3\xcb\x9e\x48\x58\x1c\xa2\x65\x7e\xa8\x3b\x87\xac\x4c\xb6\x47\x82\xa8\x3c\x47\x2e\x65\xbb\x6e\x3c\x43\x93\x0a\x7d\xe9\xca\xb6\xbc\xd6\x31\xba\x22\xb3\x6e\x6a\xde\xa2\x5b\x9e\xd8\x39\x49\x9c\x9a\xb7\x7e\xb7\x95\x5c\xbd\x91\x14\xad\x0e\x00\xd6\x62\x5e\xc3\xa4\x5e\x83\x55\xa9\x66\xe8\x64\x34\x9f\x82\xbe\xbc\xc3\x8a\x80\xf4\x32\x78\x12\x20\xb0\xb4\x7f\x44\x9f\x43\x04\xec\xef\x57\xac\x33\x1b\xf2\xf0\xe1\x37\x93\x44\xc6\xd8\xd2\x1d\x29\x8b\x5b\xba\xc3\x5c\xe0\xbc\x3f\x7c\xfe\x19\xe6\x8f\xe7\xde\xfa\x19\x6b\xcb\xe6\xac\xed\xc3\x42\x8b\xcd\xd6\x86\x7e\xeb\x2d\x4d\x6c\x9e\x3c\x9f\x91\x32\xe2\x25\x98\x0f\x38\xcb\xac\x9f\x9b\xe5\xc7\xfa\x51\xeb\x82\x9b\x34\x26\x78\x66\x79\x69\xac\xd5\xfd\xe1\xfd\x09\xe5\x97\xa6\x69\xc3\xd4\x62\x31\x6e\x71\xbd\x3b\xfa\x16\x14\x6d\x21\xd7\x99\x32\x21\x47\xb5\x3b\xe6\xdb\x7b\x1b\xc2\x07\xe8\x3b\x90\xc3\x8d\x18\x19\x7a\x47\xe6\x5f\x0e\xeb\x9a\x0f\x86\x85\xe6\xed\x9f\xb8\x4e\xa5\x7a\x92\xef\xb4\x2a\xc7\x0d\x56\x6b\x77\x50\xbb\x47\xde\xb2\x0f\x91\xf6\x69\x55\xf7\x29\x75\x06\x0c\xa3\xd8\x7f\x10\xe8\x5f\xd5\x25\xb0\xf3\xea\x4b\xdb\x83\xbc\xd3\xd8\x20\xcb\x44\xc2\x47\x3a\x06\x1b\x3c\x41\x88\xa2\x3c\xce\x9b\x6d\x96\xa5\x5c\x6a\x23\x9c\x7b\xec\x82\x96\x72\xfc\xb0\xf5\xc5\x66\x98\xde\x7d\x3a\xc5\x4d\x5a\x0a\xa3\x0b\x96\xd2\xcb\x56\x61\x4f\xd5\x69\xe7\x9b\xcc\x15\xec\x9b\xd7\xd2\xb6\x00\x84\x54\x0b\x22\x87\x4d\xc2\xfd\xdd\x22\xfc\x7b\x99\xcf\x8b\x0d\x89\x88\xf2\x98\x57\x36\xe0\x96\x19\x69\xd7\x97\x7f\xb6\xdc\xd8\x6b\x4b\xfe\xc7\x83\x72\xe2\xc1\xb9\x59\x4b\xaa\xdf\x35\xa9\x1d\x84\x14\x0a\x35\x0d\x26\xc7\x15\xfe\x0a\x09\x7f\x7f\x73\x00\xf6\x7f\x82\xe5\x61\xa6\x20\x5d\x0f\x5a\x03\xec\xe7\xfc\xa5\xf0\xf7\xfe\xb3\x2a\x0b\x34\x35\x7e\x15\x70\x57\x58\xac\x46\xc3\x90\x15\xa2\xbf\x19\x9e\xb7\xde\x2d\x99\x95\xc0\x8b\x0e\xc1\xb7\xc1\xe4\xb6\x73\x0e\x63\xca\x2c\x3f\x85\x77\x18\x2d\x54\x42\xe1\x45\x26\xf4\x13\x13\xae\xa6\x12\x5c\x50\x77\xae\x92\x13\xe5\x7a\x5f\xfd\xea\x82\xc8\x29\xa8\xa4\x8d\xa3\x2e\x4e\x7b\x9c\xc1\x36\x08\xa6\xfa\x2c\x83\xbe\x09\x41\x48\x20\x35\xfb\x78\x1c\x91\x4e\x26\x16\x8f\x55\x6c\x82\xfc\x7f\x81\x1f\x62\x73\xb9\xc9\xe5\x45\x35\x86\x53\xd3\xc9\x2b\xa7\x08\x91\xcf\x61\x32\x49\x16\x49\x79\x4a\x41\x37\xe6\x88\x03\xe2\xf8\xaf\x55\x28\x3d\x01\xc9\x29\xfd\x96\x15\x99\xa0\xd9\x34\x2f\x0d\x82\x13\xaa\x22\xeb\x24\x9d\x7f\x95\xc7\x21\x74\x12\xde\x02\x08\x07\xcc\x66\x06\xb1\x06\x6f\x76\x6a\xba\xd0\xb1\x1e\xb7\x22\x3c\xec\x57\xe1\x6a\x45\xa6\x7b\x04\x88\xe8\x64\x1d\x6d\xa3\x75\x2a\x40\xc4\xa6\x2d\x5d\xda\xe3\x49\xdd\xc7\x78\x8a\xce\x8c\xff\xbf\xd2\xf4\x01\x84\x77\xfa\x67\x16\xf5\x52\x6c\xf0\xfb\xe1\xc7\x88\xbd\x03\xfc\xef\xbc\x98\x31\xcc\x52\xc6\xb9\x59\xb0\x8d\x40\xfc\x14\x8b\x1a\x1f\x69\xcc\xe1\xb4\x3b\x46\x7c\xca\x98\xa4\x4c\x19\x45\x8c\x97\x42\x6c\x4c\x57\x2f\xae\x3b\xef\xb5\x4f\xe3\x9f\x21\xc9\x3a\x15\x79\xaa\xea\xe3\xd8\x30\xb1\xb3\xe1\x05\x17\x19\xd9\xcf\xca\x1e\x3b\xa8\xf0\xd8\xcc\x3b\x66\x8e\x2d\xb6\xa3\xfb\x27\xaf\xe9\xa7\xe6\x17\xf4\x0a\xf4\xbd\x3e\xb1\x55\xa3\x2b\x84\x7d\xaf\xea\xbc\xdb\xf9\xc5\x68\x55\x59\xa1\x3f\x23\x33\xf2\xe9\x20\xbf\x23\xf3\xab\xfb\x85\xf1\xe3\x3d\x3d\xa0\x55\x0d\x07\x32\xc6\xf9\x3a\x98\x5b\x05\xfb\xaf\x8d\x5e\xaf\x8e\x40\x58\xe6\x3f\xc3\x99\xf3\x95\x65\x09\x51\xd7\x3e\x02\x59\x5b\x0c\x89\x38\xed\x4f\xc4\xe6\xba\xa2\xd3\xff\xe8\xf3\xa6\xee\x47\xf2\xfa\x5b\x94\xb7\xd0\xe7\xe0\x94\xf7\x9b\xb1\xa5\x67\x27\x19\xe5\xb6\x53\xee\xed\xe7\x72\xc2\x19\xb3\x4b\xf8\x39\x40\x20\x12\x1f\x7f\x86\x73\x9a\x23\xe8\xad\x08\xb2\x02\x45\x0f\x1b\x04\x22\x23\xb1\x84\x3f\xf5\x50\x01\x93\xcb\xac\x13\x8e\xe0\x5e\x25\x0c\x60\x40\x25\x0e\xe0\x1d\x40\x1f\xd0\xf2\x4f\x13\xa0\xe3\x94\x36\x44\x59\x03\x1a\xd7\xcd\x9d\xce\x30\x87\xd8\x71\x98\x49\x55\x05\xdb\xfe\x55\x34\x58\x3b\x3a\x1e\xd8\xd8\xbe\x30\x1f\x34\x55\xdb\x90\xaf\x26\xac\xb1\xf1\x94\x28\x4d\xb0\xa9\x4d\x9b\x60\x74\x05\xce\x20\xeb\xc7\x73\x56\x66\x23\x7b\xd4\xab\x18\x63\x43\x0e\xf6\x0b\xae\x58\xc5\xad\x00\xa8\x4a\x8c\x7b\x75\x81\x0e\x5b\x08\x3b\x0f\x70\xfb\xe4\x20\xd1\xd8\xbe\x07\x37\xbc\xb5\xfc\x70\x37\x91\xfe\x72\x75\x33\x47\x59\x0d\x05\x47\xf8\xc5\xc7\x3f\x93\x06\x81\xd1\x97\xa5\x81\x4f\x76\x72\x28\xe9\xd5\xcf\xbf\x5f\x38\x6b\x59\x45\x2b\xef\x6d\xa5\xd0\x6b\x52\x0e\xec\x21\xb0\x0e\xb2\x3b\xe7\xfe\x9f\xf7\x33\x6d\xa4\x6c\x62\x4b\x47\x98\x7c\xf2\x75\x87\x0f\x4e\x94\x16\x00\x99\xf7\x97\x69\x71\xad\x91\xf0\x0a\xd4\x63\xd0\x98\x01\xf4\xbd\x73\x64\x57\xf1\xf0\x85\xfd\x20\x4a\x65\x8e\xf4\x95\x75\xfe\x4f\xc0\xfc\xdc\x93\xbc\xd4\x7d\x02\xe4\xea\xdc\xc7\x89\xa3\x73\x20\x1c\x7f\xf6\x0a\x2f\xea\xaa\x52\x7f\x30\x10\x2e\x9f\xc5\x6f\xeb\x6a\xaf\xc8\xd5\xda\x2f\x42\xe0\x60\x0f\x1a\x8c\xfb\x46\xb3\xaf\x9d\x98\xf2\x44\x90\x80\xb8\x2f\xd0\x4e\x11\x56\xaf\xdb\xa5\x20\xd8\x1a\x5e\x18\x60\xe1\x0b\x69\x2f\xc3\xee\x29\x43\xdd\x99\x7f\x56\x1a\x08\xa2\x26\x8c\xec\x55\x5f\xf3\x15\xdd\x25\x6b\xeb\x68\x66\x08\xe6\xbc\x50\x71\x89\x85\xc0\xa0\x57\x77\xc0\x16\x4e\xc6\xc5\xf2\x97\x74\x8f\x8b\x1c\x98\x3c\xeb\x98\x0e\x19\x2a\x84\xca\xd7\x26\xd8\x05\xe4\xbe\x3f\x02\x83\xdf\xc3\x4e\xc8\x2e\x8d\x3e\x0b\x8c\xea\xa8\xb8\xbc\xd6\xcc\xbf\xec\xe2\xf2\x7f\x85\xfd\x9f\xc2\x67\xf3\x15\x18\x91\x9d\x16\x81\x90\x75\x79\x87\xeb\x0b\x47\x20\x05\xd2\x4e\xd5\x76\x07\x5f\x19\x48\x77\xad\x4c\xee\x5a\x23\x11\x76\x59\x00\xe4\x65\x40\xfa\x11\x0f\x1f\xd3\xbf\x50\xf8\x8b\x86\xa1\xd7\x2e\xa3\x0d\xdb\x3c\xae\x82\xd9\x85\x52\x76\x89\x6c\x63\x40\xec\xe7\x9f\x72\x61\x58\x93\x76\x30\x3f\x91\x17\xa9\xef\x67\xf1\x8d\x8b\x3c\x96\xce\x6f\xf5\x03\x89\xa1\x6a\x3f\x01\xca\x58\xb9\xd7\x4f\x8d\x83\x98\xc4\x26\xc0\xa9\xea\x13\x55\xda\x60\x9d\x10\x68\x78\xe0\xdd\x87\x82\x66\xd7\xa7\x90\x74\xcd\xcb\xb6\x28\xd3\xeb\x94\x5e\xa4\x0e\x6d\xb9\xed\x28\x5d\x88\x12\xe5\x83\x70\xb5\x4a\x80\x4b\x7d\xec\x14\x55\x1b\x7d\x3f\xa3\x2c\x66\xbe\x1f\x5f\x74\xbf\x25\x2c\x42\xbf\xf2\xa2\xfe\x2a\x47\xff\x0b\x76\x22\xf9\x37\xdf\x84\x8e\xe0\x45\x52\xff\xca\x5b\x56\x40\x80\x78\xde\x27\x27\xb2\x32\xde\x9f\x20\xde\x97\xfa\x6f\x42\x0c\x77\x0b\x70\xd0\x68\xc1\xb4\x57\xcb\x85\x59\x7f\x38\xb7\x7b\x13\xbf\xdd\x8b\x3f\x28\x19\xef\xd9\xb6\x6b\x73\x83\xa7\x57\xf9\x33\x39\x8d\x9f\x40\xb1\x0f\xe3\x75\xb3\x80\xf2\x0c\x8e\xb7\x3c\x32\x82\xad\xf9\x0e\xa4\xf7\xdd\x02\xe6\x41\xf3\xc7\x55\xe5\x43\xab\x00\xdd\x90\xfc\xed\x3e\x49\x02\x93\xc2\xf9\x94\x4d\xd0\xb7\xb8\x3a\xef\xe6\x25\x0e\xbc\x3a\xd3\xa4\xfa\x25\x3c\xff\x45\x53\x3d\x41\xcf\x8f\xf0\xc0\x20\xd8\x7c\x6e\xb9\xae\xe2\xe5\x7f\x9b\x0d\x06\xad\xda\xec\xdb\x84\x59\x4f\xb0\xfb\x41\x71\x90\x13\xea\xfe\x6c\xc6\x1b\x76\x4e\xd2\x22\x51\xd0\xf3\x5a\xf2\xc8\xbf\x7a\xf1\x94\x00\x3d\x9f\xa4\x63\xd5\x0f\xda\x54\x8e\x41\xff\x5c\x54\x00\x51\x73\x25\xbc\xdb\xf2\x79\x8b\xa2\x21\x17\x3d\xf0\xfb\x15\x95\x6b\x8b\xc2\x90\xc2\x2a\x75\x8f\x7c\xdb\x13\x27\xb2\x54\x03\x05\x01\x38\xcd\x28\x55\xdb\x13\x67\xfc\xfb\x91\xb1\xab\xee\x74\xa1\xb0\x19\x46\x52\xdc\xd3\xec\xf3\xac\xbd\x24\xda\xed\x62\xfc\x9f\xaa\xac\x00\x6b\xfb\xbd\x1e\x9c\xe0\x03\x5a\xc3\x5c\x88\x63\x95\xb1\x44\xc5\x4f\xa3\xb8\xda\xba\xe9\xa3\x5c\xb4\x09\xbc\x6e\x66\xba\xd9\x89\xf0\xb5\x73\x8c\xc2\x61\x60\xd5\xd7\x3e\x37\x76\x7f\x66\x2e\x84\xfd\x77\x9c\x5a\x5b\xf0\xf5\xcb\x29\x9e\x01\x86\x42\x8c\xa1\x1c\x8a\x0c\x11\xfb\x63\xbc\x06\xae\x09\x58\x81\x08\xa5\xd8\x68\xd3\xbf\x86\x23\x04\x19\x0e\xd0\x4f\x0d\xba\xb7\x5f\xe4\x63\x0f\xe2\xff\x2d\x18\x3c\xed\x11\x59\x03\x84\x2e\x6c\x5b\xd9\xff\xbc\x8e\xd0\x24\x34\xcc\xcb\x46\xb4\xee\x88\x98\x54\x24\xfa\x16\x81\xdb\x35\x2c\xcd\xae\x88\xb9\xe9\xbc\x33\x71\x6d\x14\x92\x03\xbd\xfe\x79\xbd\xda\xbb\x96\x56\xc0\x2d\xb8\x09\x5a\x6f\xad\xf1\x76\x39\xf6\x01\xbf\x0c\x3e\xdc\x7e\x35\x92\x4e\x80\x5c\xf1\x73\x4e\xed\x5d\xd9\x59\x76\xb4\x10\x9c\x73\xf6\x2f\xf5\xc7\xd4\x87\x2a\x57\x78\xb2\xc0\x23\x1b\xa4\x27\x27\xae\x2b\x87\xbf\x46\x5e\xc9\x47\xb0\x32\x49\xed\x25\xac\x0b\xfa\x0f\x39\x49\xf1\x67\x73\x33\x1b\x16\xfd\x0c\x63\xd4\x5b\x3c\xfa\x3e\xbe\xf0\xde\x0d\xb2\x05\x2e\xef\xf3\x2f\x51\x78\xcd\xf5\xda\x7f\x68\xb4\x26\x18\xea\x00\x38\xc8\x9a\x70\x41\xed\x6f\xcc\x7e\xa2\xb7\xf0\x81\xdd\x83\xc4\x7f\xab\x2d\xee\x96\xb0\x67\xe4\xee\x0c\xe4\x63\x5d\x90\xe7\x25\x0d\x44\xd9\xb1\x61\xa8\x50\x82\x6d\x00\x52\xa4\x06\x59\x8a\x04\x7b\x4b\x74\xf5\xf0\x2b\xe0\xac\xd2\x10\x9e\xe0\xbd\x6f\x3e\x10\xec\x8c\xad\x81\x43\xca\xb5\xf9\x91\x20\x42\x56\x2c\xfc\xf2\xbe\xc5\xf3\xaf\x31\xb8\x19\xb4\x0f\xca\x3b\x23\x7e\x0a\x08\x0c\x61\x9d\x77\x96\x33\x2c\x69\xc9\xe2\x43\xd4\x31\x51\x6f\x34\x5a\xf9\xa2\x1d\x77\x60\x11\x32\x7c\x36\x97\x59\xd2\x5c\x4e\xb1\x90\xcf\x9f\x34\xf3\x6c\x64\x46\x0f\xfe\xe1\x20\xd4\x6d\x27\xfd\xad\xf8\x1a\x19\xbe\x03\xee\x40\x92\x5b\x76\x39\x70\x17\x96\xc2\x67\x56\xf7\x04\x97\xab\x5f\x46\x1c\x0f\x9a\x94\xcf\x3c\x3c\x33\xcb\x36\x00\xe1\x44\x47\xcf\xf8\x3f\x29\xfc\x6b\x9b\x46\x07\xd0\xaa\x9f\x41\x36\x70\x7a\xdd\x71\x16\xdf\xd5\xe3\xa8\x73\x9c\xc3\x30\xb9\x1d\x46\xc6\x8b\xda\x25\xfa\xe1\xa2\x73\x20\x8b\xcb\x8f\x21\x47\x3c\x5a\x6a\x0e\x54\x01\x4e\x94\x70\x16\x7d\x99\xcf\x96\x28\x34\x33\xf7\xf4\x80\xd1\x8c\x70\xe9\xff\xc4\xea\x47\x3a\x0b\x07\x32\x86\x07\x67\xec\x52\x22\x32\x4f\xd0\x83\x66\xbb\x04\xaa\x8b\x3b\xd8\x4e\xb2\xc8\xb3\x01\x17\x95\xc3\x23\x4e\xfc\x21\xb9\xfd\xdf\x9f\xab\xf0\x91\x15\xd7\x73\xe4\x2e\x14\x08\x89\x14\xff\x77\xe4\x61\x61\x38\xd3\x0e\xf7\x25\xb1\xf9\xa1\x12\x55\x6e\xd2\x07\x30\x4b\x3e\xeb\xea\x85\x2e\x62\xe8\x42\x05\xfa\xaf\x36\x8b\x93\xbc\xf0\x56\xb8\x75\x64\xde\x06\x6a\x59\xe6\x68\xe1\x97\x69\x73\xa0\xe4\x04\x47\x1a\x93\xc4\x0a\xd1\x06\xb0\xad\x31\x0f\x52\x19\x15\xa8\xe7\x5c\x71\x80\xeb\xdc\x41\xf2\x75\x56\xe9\x6a\x8b\x0e\x4d\x4e\xb8\x4f\x2a\x70\xf8\xb8\x09\x74\xe0\x54\xe6\x37\xbb\x7f\x04\x96\xec\xa4\x83\xef\x25\x20\xd5\x3d\x30\xea\xdd\x56\x2d\xc5\x40\xf3\x02\x86\xf5\xc9\xac\x54\x15\x2b\x83\xd8\x84\xdd\xb3\x56\x4d\x9a\xf6\xca\x24\xc5\x5b\x5e\x04\xd9\xd9\x7e\xdf\x43\xba\xe1\xba\x04\xd1\xcd\xdb\x66\x1c\xd0\x3a\xd5\x06\xb6\xf3\xcd\x36\x79\xf9\xb8\xdc\x04\xba\x43\x35\x6b\x55\x36\x97\x6c\x80\x99\x9d\x40\xdf\x79\xd7\x9e\xce\x15\x07\x6b\x03\xcc\x19\x54\xb6\xcd\x7f\x40\x43\x03\x30\x8f\x7c\x24\x60\xe7\x6b\x28\x0f\xa6\x97\x40\x73\x44\x1e\x3d\x88\xa7\xf3\x61\xf6\x70\xc2\x33\x4e\xb5\xa6\x3a\x61\x8a\xd8\xa2\x2c\x18\xdd\xb6\x5e\x02\xca\xdf\x32\x23\xe9\x8f\x29\x49\xd8\x81\xd4\x25\x78\x75\x73\xe8\x19\x16\x3e\x04\x3a\x44\x44\xdd\x6a\x69\x3e\x70\x9c\x77\xd1\x71\xa1\x2d\xb0\x47\xf2\x7e\x8f\x48\xe5\xcb\x3e\x59\x46\xd2\xfb\x77\x17\x20\xaf\x1d\x26\x00\x77\x31\xa6\xa4\x31\x10\x8c\xaf\x20\x45\x84\x4b\xcf\xf2\x79\x49\xe7\xcf\x1a\x45\xe1\xd9\xd8\xaf\x13\x1f\x57\x52\xd3\x1e\xe6\x9c\xf0\x3c\x39\x53\x66\x22\xf4\xc1\x98\xa4\x9d\x7b\xeb\xf5\x67\xa2\xbb\xd6\x5e\x1a\xa0\xb5\xf4\xb3\xba\xf2\x6b\xe1\xea\x42\x66\x7e\xb8\xf5\x8a\xf8\x3f\xcb\x07\x6c\x9d\x25\xd8\x07\xb2\x44\xe6\x3b\xa6\xcc\x60\xba\xc7\xa4\xb9\x02\x56\x1c\x5a\xf0\xb4\x20\xb2\x15\x4c\x43\x31\xf4\xbf\x04\xcf\xf7\x24\x40\x7d\xfe\x07\x45\x8f\xc2\xc8\x26\xd6\xdc\x55\x71\xee\xbf\x11\xaf\x14\xbc\xe2\x35\x85\x8f\xb0\x4e\x69\x06\x2a\x91\x2d\x8f\x71\x7b\x41\x7c\xd5\x1c\x48\x61\x03\xe8\x29\xc0\xf7\x63\xca\x8d\xd5\xaf\x3b\xb7\x23\x12\x9a\x20\xca\x78\x00\x6d\x77\x13\xea\xa5\xb6\xdc\x69\xdb\xa0\x6d\x51\xcd\x2e\x70\x21\x0f\x28\x9d\x77\x17\xd5\xb1\x0b\x1c\xb4\x79\x94\xab\x4a\x84\x35\x81\xc0\x42\x08\x7d\x0e\x6f\x15\xef\x72\x2f\x3b\xd2\x8f\x7f\x9a\x87\x05\x7d\x42\xbf\x03\x70\x44\x84\x58\xdf\x21\x5c\x5a\xe6\xe6\x32\x0c\x40\xbd\x85\x5c\x87\x9d\x71\x8b\x84\x5d\x66\x2d\xc0\x70\x68\x09\x13\x62\x51\x05\x90\xad\xda\xa2\xac\x27\xde\x92\xce\x20\xe5\xdb\x2e\x2f\x18\xf9\xdb\x41\xc4\x7d\x8b\x34\xec\xc4\x8d\xc1\x22\xed\xc3\x92\xec\xc5\x83\xb5\xaf\x78\xed\xc4\x4f\xfc\xa7\x44\x92\xbf\x1a\xe4\x91\xbf\xf2\xd9\x79\x0c\xe0\xf7\x2f\xd2\xd7\xfe\xb2\xd2\xdb\xe8\x78\x3c\x13\xaf\x77\x8f\x62\x3f\x7f\x6c\x96\xc8\x6c\x96\xfe\x25\x7b\x00\x6e\xb2\x69\x87\x27\x08\x4c\x48\xfd\x06\x08\x3a\x75\x16\xcf\x07\x4f\x19\xf8\x96\x29\x34\x7a\xfa\xfc\x8c\x62\xea\x26\xd6\xc5\x54\x7c\xb1\x98\x6c\xab\x21\x50\x7d\x4f\x93\x5f\x62\xee\x0b\xf3\xc3\xdc\x87\x50\xc1\x60\xdc\xec\x60\x56\x55\xb1\x30\x51\xa6\x23\xcc\x1d\x64\xc8\x69\x8e\x08\xe4\xa9\xe5\xb6\x4d\xe1\x12\x36\xcd\x71\x57\x17\x59\xdb\x2f\xf1\xf3\xf9\x0f\xb3\xdc\x76\x1c\x92\x0f\xbe\xfe\x16\x24\x78\x26\xf2\x5c\xbf\xa1\x1e\x1b\x2c\x4d\x8e\xbc\x37\x60\x1f\x4b\x74\x7e\xed\x87\xa7\x90\x06\xe8\x62\x9a\x52\x15\x65\x3e\x44\x31\x13\xe8\x72\x57\x80\xf1\x77\x1b\x5d\x53\x3b\x47\x01\xd8\x7f\x22\xc2\xea\x94\xa7\xc9\x94\x44\xe1\xdf\x24\x9e\x9e\xd2\x38\xaa\x09\x02\x97\x46\xc9\x61\xa6\x14\xb3\xc4\x94\x06\x7d\x7a\x6c\x64\x17\x2e\xae\x63\x0d\x03\x5e\x8c\x66\xec\x5c\x69\x48\x73\x4f\xad\x95\xe4\x52\xff\xdc\xd8\xfc\x22\xe4\xa3\xb9\x4a\xd0\xbe\x82\xa3\x44\xe2\xbe\x5d\x75\xc4\xef\x73\xeb\xde\x38\x9b\x1f\x47\x06\xf7\x8e\xa5\x85\x68\x8f\x56\x60\x94\xa0\xe1\x17\xa4\xc1\x73\x40\xc6\xdc\x08\xba\x90\xe6\x53\x97\x6d\xf0\x39\xf3\x7a\xa9\x10\xf0\x8c\xf0\x91\xfd\x82\x79\x5d\xf4\x1d\x8e\xb3\xe2\xc9\x67\x24\x25\x73\x8f\x0b\x7b\x67\xf6\x03\x9c\x66\xe0\x6f\x35\x5f\xd1\x0f\x38\x15\xef\x3a\x26\xc1\x6b\x28\x25\x55\x38\x8e\x58\x13\x06\x82\xfe\x6e\xe8\xcc\x07\x62\xfe\xfc\x70\xb4\xce\xea\x19\xfc\x93\xd4\x3a\xda\x05\x4c\xc3\x9b\x33\x12\x44\x9f\x60\xa2\x13\x40\xaf\xea\x49\x3c\x4f\x6f\x75\x3f\x4f\xb5\x19\x40\x00\x8f\xec\x7a\xf8\xe2\xf0\x24\x8e\x80\x98\xe7\x1a\xad\x60\x1b\x69\xf3\xf0\xa4\x3c\xfb\x39\x87\x55\xcd\xb3\x31\xc7\x9e\x12\x2b\x38\xb5\xdf\xbf\x23\x1b\xf6\x22\xf9\xd3\x2f\xa7\x29\xaf\x6d\x11\x90\x67\x74\xfa\xe6\x25\x9c\x73\xe4\x2d\x9d\xe6\x80\xf9\xf3\x9b\xb4\x7c\x4f\x8a\x21\x5c\x7f\x7b\xa9\xed\x80\xfc\xda\xb0\x04\xec\xd1\x9e\x64\xf7\xe7\x8e\xc8\xfd\x70\xf2\xed\xb8\x37\xe9\xc3\xc1\xfa\xdc\x97\xad\xf3\xa1\x0b\x8b\x91\x0f\xe8\x5e\x34\xf6\x2a\xa4\x1d\x0f\xf5\xfa\x41\xc2\x1e\x43\xce\xbd\xb7\x0d\xcb\x11\x3c\xff\xa7\x20\xff\x7d\xd4\x71\x50\xc2\xd7\x2f\xcf\x7e\xa8\x5d\x1c\x23\x6e\x4a\xae\x4b\x03\x0a\x94\x88\x37\x1b\xce\xe8\xcb\x0d\xf8\xc9\x68\xf2\x34\x94\x4b\x36\xeb\x43\x69\x5d\x85\x42\xbd\xd0\x50\x14\xe7\xe0\x44\x5b\x1a\xe2\xfc\x92\x1d\x86\xe2\x3d\x96\xa1\x65\xa9\xc1\xcc\x67\x8f\x51\xb4\x1a\xac\x88\xe1\x13\x63\x87\x3f\x80\xcf\xde\x47\x3b\x61\xd7\x40\x6d\x88\x0c\x49\x81\x77\x2e\x40\x78\x61\x7f\xa0\xa5\x8c\xe5\xdd\x4d\xf9\x87\xfc\xb3\x03\xda\x0a\x9f\xb6\x25\x35\x15\xc6\xb9\x0e\x64\x77\x23\x41\xc1\x0f\x48\xa6\xe0\x3e\x68\xd0\x36\x74\x08\x8b\x6c\xa5\x22\xf6\xf5\x06\x95\x9b\x68\x7e\xbd\x66\x05\xcf\xf5\xf5\x9f\xec\x76\x68\xb4\xd8\x37\xf8\x48\x6b\x50\xaf\xa2\x96\x82\xf2\x3e\xfa\x93\xd6\x4d\x3d\xbe\xe7\xd0\x26\xa4\x83\x1d\x85\x37\x3f\x61\x5f\xea\x41\x8d\x40\x0d\x17\x8c\xbe\xdc\x6c\x2b\xdc\x7b\xa1\x51\x35\x7e\x88\x59\x0e\xda\x87\x3a\x0b\xfb\x05\x76\x17\x5f\xcb\xde\x0a\x5f\x4b\x6a\x69\xec\x66\xce\x78\x31\xca\x16\x6c\xda\x08\xdd\x03\x82\x5b\x7d\x30\xe5\x4b\x9e\x04\x3d\xe7\xd8\x93\xc3\x41\xa0\x5f\x0f\x21\x94\xe0\xeb\xde\x76\x4d\x6b\x34\x1b\xce\x4a\x6a\x24\xc6\xf3\xda\x6e\x0e\x59\x02\x64\x01\x74\xe0\x40\x10\xd9\x18\xb4\x83\x5e\xa9\xda\x2e\x11\xe0\xec\x09\x43\xa0\x70\xd6\x56\x26\x55\x9f\x0e\xf9\xf4\xda\xe8\x8c\x9b\x8e\xf9\xe7\x09\xc4\x6d\x7f\x1f\xa6\xfc\xbd\x1b\x58\xab\xbb\x31\x5b\xa5\x22\x73\x20\x3b\xad\xe4\x19\xb4\x22\x49\x8a\x0f\x98\x41\x45\xf1\x51\x18\xed\xd4\xab\xa7\xcd\x11\xa8\xd0\xd1\xa5\x38\x47\x4d\xb8\xe8\x7e\x38\x06\x6e\x4b\x58\x5a\x99\xfa\x5e\x3d\x9e\x98\x7c\xfe\xb7\x3a\x12\x55\xd4\x7b\x78\x77\x97\xb0\x0f\xda\x18\x68\x56\x42\x46\xa0\xfd\x31\x86\x6c\xec\x33\xe0\x2a\x06\xea\x73\x60\xef\xdb\xf4\x06\x59\xc6\x68\x5d\x63\x62\xb8\x71\x90\x8c\xc2\x13\x13\xd7\xd2\xe7\xd7\xec\x18\x66\xa9\x0b\xa2\x6d\x62\x7b\x26\x75\x3b\x3e\x8e\xae\xa2\xdb\x41\x3b\xa0\x4b\x2c\x28\x74\x3b\xd8\x38\xf1\xd0\x16\xfa\x5d\x17\x84\xc9\xcb\x1d\xb9\x53\x1b\xa7\xb8\x44\x30\x9a\x26\x91\x4e\x8c\x51\x98\x12\x79\x7d\x45\x31\x02\x9d\xb3\xba\xb5\x28\x9a\xa4\x8b\xec\xf9\x55\xf1\x6e\xc8\x63\x8b\x99\xa8\xc3\xee\x4c\x2f\x22\xd3\x8d\xce\x4d\x6b\xf4\xc1\x82\x24\x8b\xb6\x49\xba\xbe\xb1\x46\xba\x27\xb8\x1f\xa3\x4b\x94\x7f\xa4\xba\x0e\x93\x9b\x1f\xcf\xe8\x71\x00\x76\xfe\x63\x2b\x45\xc8\xa6\xdb\x85\x87\x6f\x51\xa4\x29\x76\xe9\x3f\xc4\x56\x49\x93\x70\xc7\xa9\xe0\xdb\x7f\x0e\x26\x29\x4c\xd0\x21\xd9\xba\xd0\x2e\xac\x0d\x5b\x81\x78\x81\x47\xb7\x33\x89\x30\xfd\x49\x1d\x13\x76\x2f\xea\x2d\x61\x41\x1c\xe5\xe6\x1d\x53\xa5\xaf\xbe\xd4\x14\x74\x21\x3a\x06\xd2\xe6\x2d\x0f\xa7\x8a\x3c\x3c\xa5\x8d\x17\x2b\xea\x8a\xe6\x65\xf4\x9a\x07\x6e\x6a\x90\xdc\xa6\x40\x38\x58\x04\x29\x49\xff\x29\x36\x42\xf2\xd8\x3a\xbe\xf0\x12\xad\xbf\xb4\x70\xf3\xe2\xd9\xfa\xfe\x4c\xe2\xc4\xc9\xa6\x00\xb6\x09\xd9\x45\xa1\x6c\x80\xea\xac\xd4\xc9\x4a\x0e\x3b\x73\x1e\xbb\xe2\x1c\x85\xaf\x67\xe4\xe3\x65\xbe\x48\x5f\xe5\x1e\x9f\x81\x70\x0f\x6f\xad\xf8\x72\xf9\x0d\x04\xf5\x9b\xe3\xe1\x1f\xac\x43\xaa\x48\x3e\x85\x22\x0e\x44\xbe\xf9\x91\x94\x6b\x88\x0e\x76\xba\x3b\xbe\x03\xcc\x78\x57\xf7\x2b\xf5\xee\x44\xa4\x93\xd8\x60\x20\xd3\x05\xbd\x97\x87\xf7\x56\xae\x35\xcb\xa3\xfc\x67\x61\xbe\x6e\x5c\xb2\xe1\xa1\x24\xa6\xef\x7b\x0e\xb3\x73\x79\xb6\x41\x29\xf0\x9e\x65\xb5\x14\x3b\x71\xef\xc9\xa8\x11\x32\xcd\x03\x17\x86\xb7\x1b\x48\x8a\x9c\xf8\x8e\xdc\x1a\x5c\xd9\xf2\x15\x87\xff\x22\x82\x5a\x39\xde\x43\x53\x90\xd5\x44\x4a\x9f\x70\x65\x72\xc1\x7f\x9c\xf3\xf0\xd6\xe2\xfd\x6b\xec\x3e\x64\xc7\xd4\x24\x05\x34\x90\x79\xa7\x1c\xf4\xe2\xd7\xfc\x9a\x59\xd6\xbf\x04\xe4\xb4\xd0\x7f\x2a\x02\xd8\x53\x41\xd6\xec\x83\x39\x74\xce\xdb\x78\x81\x6e\x77\x69\x60\x67\x2d\xbb\x2a\x67\xcb\xfc\xf7\x7c\x29\x8d\xcb\xef\x66\x3b\x5d\x68\x6d\xe6\xe3\xa0\x14\xfb\x1f\xdc\xdf\xbd\x64\xad\x85\xa3\xd6\x04\x06\xd6\xd9\xac\xa5\x3f\x92\xaf\x18\xe1\x54\x54\xe5\x4f\x78\x57\x6f\xbd\xdd\x95\xe1\x72\x30\x5d\x5a\x65\x46\xbe\x1d\xec\xcd\x60\x37\xe8\x0f\xb5\xef\x86\xec\xa7\x1b\xab\x27\x5b\x2e\xf0\x5e\x65\x1b\x86\x26\x2b\xf7\x5f\xe2\xbb\xbe\x23\x1a\x2f\x7c\x30\xef\xa9\x9e\x9b\xc2\xea\xe8\xef\x82\xc8\x9b\xca\x46\xec\x6d\xdb\xb2\x53\x36\xe8\x76\xdd\xf8\x07\xb8\x53\x78\x83\xdd\x12\xae\x5e\x9f\x9b\x42\xb6\xeb\x23\xa3\x6f\x88\x52\xe4\x1f\x64\xe7\x4e\x56\x0c\x12\x14\x08\x02\x12\x2f\xdb\xcc\x85\x02\xe4\xaa\xdb\x2e\x18\x3e\x1c\x05\x21\x37\xb8\xee\xe8\xb7\x9c\xc5\x89\x36\xde\x91\x09\x26\xfc\x0d\x1f\x4b\xf6\x69\x10\x85\x24\xe8\x16\x1d\x99\x8d\xc7\x79\x6f\x61\xb3\xfe\x57\x96\x35\x39\x1d\x99\xa2\x6d\x03\xe9\x41\x92\xb2\xe0\x0c\x89\x41\x38\x71\x1f\xf3\xa0\x4e\x0d\x1d\xe6\xae\xf2\x0e\xd4\xe2\x2a\x57\xa3\xb7\x5d\x45\x96\x02\xd0\x20\xb0\x0b\xb3\xca\x31\xd9\x46\x5a\x59\xae\xf2\xc7\xbb\xe0\x14\x1a\x1f\x5c\x51\xda\xd7\x4f\x77\x77\x15\x36\x7a\xaf\x55\x9f\xd9\x36\xb1\x31\x6d\x5f\x00\x21\xd8\x9b\x80\xd0\x87\xb8\xd3\x45\x44\xfb\xf2\xab\x96\x1d\x9d\x3c\x2a\x08\xe0\x9a\xbc\x0d\x7b\x81\x01\xc7\xce\xc3\xb4\xc0\x4f\xd4\x47\x79\x5e\x28\x43\x70\xc2\x78\x34\x72\x64\x8e\x85\x7e\x76\xb4\x8d\xa6\xa4\x47\x66\x71\x44\xd4\xca\x91\x85\x93\xf4\x1a\xe1\x78\x95\xd9\x5a\xc9\x43\x6c\xee\x2f\xab\x05\x28\x6e\xe8\x27\xca\xf7\x30\x88\x4e\x4c\x51\x77\xc6\xd6\xdd\xcc\xd1\x9e\x35\xd8\xc2\xcb\x8d\xb2\x82\xd6\xbb\xd9\x22\x1f\x30\xb3\x63\x44\xa3\x3d\xdb\xa8\xc8\xe2\x2b\x58\xbd\x57\xb2\x5a\xe3\x92\x65\xbb\xbb\x86\xca\xaf\x69\xff\x86\xfd\xd2\x4a\x65\x11\x2c\x99\xe2\x96\x79\xa0\x0a\x61\xe6\x4f\x9b\x26\x35\x64\x5a\x67\x26\x33\xd4\x2f\xf2\xf8\x2a\x01\x9a\xb3\xdc\xd3\x93\x84\x17\x0c\xff\x81\xa0\x60\x41\xf2\x8f\x57\x53\x90\x1d\xbc\x21\x23\xce\x1d\x6c\x9b\xee\xa2\x81\x3c\xd3\xcb\x2a\xc7\x26\x49\x05\x4a\x56\xba\x25\x2e\x80\x49\x36\xea\x85\x7a\x8c\xb3\x74\x55\x4a\x03\xbe\x03\xfb\xac\x2b\xbb\x20\xe4\x2b\xca\xe2\x3d\x43\xe2\x26\x4b\xf6\xd6\x6b\xca\xf0\x0d\xe0\x6d\xbb\x1e\xb6\xc9\xfa\x69\xe3\x65\x72\x46\x5e\x9b\x0d\xbc\x1b\xd5\xb8\xe4\x36\x8a\x57\x99\xa4\xc9\xb0\xdf\x4c\xef\x38\x29\x2c\x0e\x79\xb7\x4e\x79\x80\xb8\xc0\xaf\x52\xfb\x0e\x98\x2c\xf3\xbf\x1a\x2e\x44\x90\xb5\x5e\x6a\xb9\x90\x86\x7f\xda\xaa\x2a\xe5\xe3\xa1\x8b\xfe\xf0\xf6\x94\x3c\x9c\xf6\xdb\xc9\x03\x70\x86\x67\xd3\x03\x5e\x0c\x2f\x45\x05\xda\x67\x49\x4a\x29\x4c\x37\x61\x5f\x4c\xa0\x6c\x58\x94\x61\x29\x6f\x1a\x2a\xc1\x83\x98\x2a\x04\x38\x1a\xec\xd1\xac\xe1\x76\xca\x06\xd8\x47\xc8\xcc\xe9\xbe\x37\x8d\x50\x9e\x8d\xd1\xc4\x61\x8b\x63\x86\x24\x6c\xa7\x58\xa0\xd9\x29\x49\x6b\x80\x8d\x1a\x31\xae\xa3\x69\x4f\x61\x2f\x1f\xdd\x17\xf8\xe9\xf8\xa7\xcb\x6a\xe2\xa2\x27\xa9\x3d\xbb\x0d\xd7\x2d\xf2\x28\xed\xdf\xe6\x23\xeb\xbf\xe4\x17\x5f\x11\x46\xa5\x14\x3e\x64\xcd\xf0\x47\xfa\xfa\xb6\xf2\x48\xec\x4a\xa2\x51\xd3\x22\xfe\x61\x3d\xcf\xc3\xdc\x3a\x36\x4f\x72\xae\x50\x6c\xaa\x7b\x79\xc0\xa3\xac\xe3\x93\x57\x28\xeb\x38\x1c\xd3\x50\xe9\x24\xff\x9f\xb4\x09\xf6\x7d\xc7\xec\x84\x71\xcf\x28\x12\x70\x41\xd4\xb7\xf2\x3c\x45\x3a\xd4\x5f\x6e\xf2\x53\xb0\x79\xc3\xcf\x80\x2d\x36\x57\xfd\x42\xc7\xcc\x42\xf4\x60\xff\x48\xdf\xb9\x23\x7b\xcd\xdb\x2f\x58\xfc\x95\x73\xb1\x17\x85\x82\xec\x60\xe5\x7a\xb3\x25\xab\x26\xd8\x49\x86\xd8\x73\x6d\x62\xc5\xdd\x36\x1e\xab\x9a\x34\x62\xe7\x58\x01\xdd\xcf\x4e\x22\xdf\x69\x6f\x61\x27\x3b\xbf\x1e\xf5\x64\xce\x7f\xbc\xa1\xce\x63\xf2\x2e\x25\xbc\x05\xe4\x21\xb5\xdf\x21\xbd\xc0\xb8\x3e\xe9\x17\x14\x9e\xf5\x57\xfc\x71\x9e\xb4\xf4\x81\x20\x82\xa7\xc3\x66\x0b\xc0\x29\x6d\x85\x5d\xed\xbc\x17\xf6\x16\x6a\x46\xcc\x91\xbc\x09\xaf\x5a\x12\x26\xe0\xc4\x40\x26\x3f\x69\x3e\xdb\x3c\x7c\xb8\x97\x43\x53\x87\x56\x44\xb9\x46\x12\xe3\x75\x25\xdd\xb4\x7f\x69\xba\x44\xea\x29\x0c\x19\xe6\xc8\x40\xcc\x9a\xe9\xdc\x54\xea\x92\xd9\xbd\x9a\x55\x9a\xc2\xa1\xa3\x60\x33\x2a\x43\xab\xe5\x83\x14\x42\x88\x37\xe3\xde\x1e\x6a\x06\xa9\x47\xe3\x7d\xd5\x14\xfd\x20\x3c\xe4\x60\x6f\xe7\xf8\x65\xa6\x41\x83\xa1\x4e\xf8\xd6\x6f\xa9\xb9\xe1\xbb\x19\xbe\xc6\x88\x02\x64\x57\x67\xb1\x39\x26\x5c\xa4\x10\xe1\x43\xcd\x85\x9b\x5a\xbf\xce\xc4\xc7\x00\xb4\xd3\x80\x09\x6f\xe8\x1a\xd5\x55\x83\x41\xaf\x99\x5b\x88\x64\x95\x35\x2b\x44\x1c\xbb\x7a\x41\xde\x53\x8a\x07\xc4\x93\x3d\xfb\xaa\x75\x97\xc2\x1d\x66\x4b\x5f\x1d\x3f\xa1\xb8\xf8\xe8\x2d\x7a\x3a\xff\xdc\x46\x3e\xb0\x2b\xe9\x3f\x0d\xf2\x9b\x5d\x29\x5b\xd4\xb5\x65\x88\x40\x61\xb4\xa7\x66\x3e\x3e\x9c\xc0\x12\xba\x82\x72\xad\x3a\xa3\x75\x15\xdb\x03\x0c\x65\x5a\x85\x49\xfe\x8c\x7e\xd6\xbc\xeb\xe5\x1c\x10\xa4\xcc\x44\xed\x89\x2d\xfd\xe5\xcc\x00\x80\x49\xbe\x61\x36\x21\x77\xfa\xaf\x23\xb5\x37\x89\x4e\x28\x3e\x1c\xb2\x22\x01\x40\xa6\xf0\x56\xd1\x27\x2c\xd8\xd7\xaa\xa0\xca\xea\x9a\x63\x6f\x69\xd5\xac\x6c\x04\xb4\xc5\xd8\x78\x62\x02\xbf\xb7\xa8\xca\xdb\x9b\x42\x85\xf6\x51\x36\x75\xaa\x0f\x15\xd6\x84\x68\x84\x59\x7d\xcc\xdb\xc6\xe9\xee\x93\x47\x07\x58\xb5\x7b\xb3\xfd\xb9\x06\x40\xb6\xe6\x12\xdd\xcf\x96\x06\x6a\x83\x91\xa6\x1e\x6b\x5b\x93\x7c\xab\xc0\xae\xd8\xaf\xc5\xd5\x45\xa5\x09\xd1\x64\x95\x37\x55\x0d\x31\x09\x6c\x7c\x9a\x39\xd5\x2f\xd4\x13\x7c\x4a\x1e\xa9\xa7\xc0\x72\x50\x83\x66\xb0\x26\xe7\x17\x6b\x44\xb8\x7d\x75\x7b\xc8\x9b\x4f\x92\x27\xd6\xb3\x8a\xc7\x68\xc3\xdc\xe2\xb6\xd6\xd4\x17\xde\xbc\x7c\xd4\xa9\xaa\x07\xf3\x60\x97\xba\x7f\x23\xbf\x33\x4f\xb4\x9f\x52\x8e\x01\xc2\x3a\xdd\xfc\xea\x94\x19\xd4\xd9\xec\x2a\x97\x33\xbd\xf5\xfc\x33\x31\xbf\xca\x06\xf7\x42\xfd\xc9\x7d\xcb\x30\x78\x29\x8e\xc3\x2e\xc5\x67\x83\xa5\x44\x43\x0e\x01\xcb\xd2\xb7\x64\xed\x6c\xd8\x4a\x63\x13\x0d\xa5\x73\x14\x8f\xcb\x1f\x83\x36\xdb\xe3\xc0\xeb\x56\x1f\x8c\xff\xc3\x66\x8b\x32\xd1\x6a\x4a\x89\x09\xa1\x6a\x5a\x12\x3b\x50\x4b\xda\xce\x16\x49\x6a\xe7\x9e\x4b\x43\xfe\xca\x64\x13\x28\x5e\xe9\x6f\x5e\xd5\x9e\x92\xe7\x31\x66\x4e\xe9\x4a\xe4\xce\xca\x04\xcf\x4d\x41\x06\x91\x6c\xd0\x17\x4f\xbd\x9d\xa1\x53\xf3\x6f\x17\xdc\x94\x70\xe6\x9f\xed\x67\xe2\x0a\x09\x5b\x3b\x62\xad\x53\xfd\x70\xfa\x9c\xe0\x9e\x2d\xa3\x29\x02\x1a\x90\xa2\x94\xb0\x9e\x8a\xec\xcf\x8f\x7c\x97\xca\x19\xca\x94\xd2\x1a\x07\xa0\x23\xb5\x74\xcd\x72\xce\xf2\x0b\x98\xca\x11\x39\xdf\xce\x53\xd2\x40\x5c\x5b\x6c\x7c\x5b\xcf\xa9\x88\x6c\x3c\xd9\xf4\x39\xfd\xda\x5d\xd1\x03\x5b\x7d\x56\x86\x04\x05\x41\x3a\xa2\x01\xc1\x9e\xea\xe1\x4a\x14\x36\x8c\x64\xd1\xc3\x61\x68\x52\x00\xd8\xb0\x57\x66\xeb\xb5\xa2\x0e\x64\x18\xc4\x3c\xd1\x25\xac\xab\xd8\x21\xd3\x98\xa5\xe8\xe4\xa2\xa4\xd0\x2f\xa3\x73\x16\x6e\xdd\x68\x88\xa9\x89\x16\x6e\xcb\x53\x8e\x46\x86\xdb\x59\xb1\x05\xf6\x55\x73\xeb\x03\xe3\x04\x86\x35\x58\x69\x16\x91\xa4\xe8\x8a\x65\x8d\x28\x84\x81\x0b\x86\x5a\x5d\x67\xf8\xd9\x80\x6f\x36\xab\x47\x36\xd8\x94\xfc\xd1\x50\x8e\x58\x2d\x4d\xd6\x87\x8c\x47\xa5\x89\x93\x2c\xaf\xc4\x6a\x43\x96\x69\x68\x63\xd6\x2b\xde\xe0\x2f\x9c\xcd\xdb\x6c\x0f\x76\xd1\x28\x7d\x09\xd3\x29\x68\x3c\x16\x45\x3c\x9c\xbc\x45\x40\x07\xfc\xb0\x94\xd1\x00\x33\x15\x45\x9c\x16\xce\xe7\x9e\x70\x2a\x60\xc0\xc6\x1d\x0f\x91\x2d\x7a\x4a\x93\x72\xa6\x3f\xe1\xc4\xa3\x4d\x31\x91\xe8\x70\xd3\x26\x2b\x12\x67\x50\x45\xdb\x66\xee\x66\x4f\x7f\x2c\x83\x7a\x61\xab\x9d\x6c\xdc\x4f\xd8\xd0\x0b\x2a\x48\x1b\xd5\xe7\x1f\x95\x70\x3b\xce\x27\x21\xf6\x71\x6e\x4c\x65\xd8\x64\x85\x36\xa6\xb6\xe6\x98\x6e\x40\x47\x84\x3a\x19\x59\xb4\x61\x89\x88\x8e\x1c\x41\x0b\x2b\x78\x5a\xb3\xcb\xbb\xec\x60\x2d\xb3\x77\x75\xba\x8c\x41\x72\x17\x14\x5c\x33\x87\x23\xb1\xc6\x67\xc4\x6b\xa2\xf7\x30\xf3\x28\x42\xc8\xb3\xf0\x3c\xb7\x23\x70\x54\x1a\x50\x15\x7e\xd4\xe7\xea\xe7\xfc\x53\x88\x16\x2c\xb4\x6e\x76\xb4\x6c\xea\xf5\x7b\xb8\xcd\x71\x97\xac\x9d\x83\x9e\x45\x30\x45\x32\xda\x05\x3f\xc3\xca\xed\x99\x2b\x17\x8b\x67\xa4\x08\x3e\x33\x12\x23\xbd\x8a\x78\xe6\x34\x4a\x30\x93\x42\x15\x53\xe1\xef\x1a\xa5\xad\x6d\xfe\x5a\xb0\xc9\x33\xc2\x25\x9f\xda\x2b\xd9\xae\xfa\x25\xa1\x8c\x44\x6f\x4f\x59\x91\x64\xed\x9e\x7d\x65\xa3\xf3\x95\xdc\x76\xe0\x4d\xe8\xc7\x43\x18\x5b\x06\xb9\x96\x83\xe9\x64\x15\x65\x4b\x5e\x24\x56\xa8\xb7\x93\xff\x8d\x47\x70\x1b\x73\x5d\xc2\xb9\xc1\x76\x0a\x81\xc9\x83\x08\x66\x43\x3d\x63\xa0\xc6\x3a\xe5\x34\x3e\xd8\x56\x2f\xf3\x87\xaa\xa9\x62\x08\x4f\xd0\xa1\x86\x1b\xe6\xa0\x36\xf5\x50\xaa\x42\x2d\xce\xc0\x6b\xd1\x30\x9b\x0a\x1b\x66\x5b\x6c\xf1\x07\xba\x11\xfb\x48\xed\xe4\x61\x3e\xd0\xa2\xf0\xf6\x96\x95\x70\x6c\x94\x65\x66\x4e\xcc\x60\x7a\xb6\xf6\xd8\x51\xa4\x87\xb9\x40\xd3\xe5\xf2\x0b\x08\x8d\xb1\x16\x39\xfa\xc0\x68\x85\x85\xe6\xe6\x9c\x23\x3c\x76\x2d\xee\xcf\xc5\x3b\x18\x37\xcc\x8e\x9a\xad\x68\x61\xaa\x44\x7b\xae\x5e\x96\xe3\xf6\xd7\x0f\xfc\x1f\x32\x1d\xcb\xe1\xdb\xb5\x2b\x9c\x36\xb1\x69\x69\xf3\x1b\x8f\xe7\xc8\x6f\x87\x3b\x02\xbe\x7c\x62\xc6\xc0\xa0\x68\x12\x25\x99\xf7\x27\x59\x45\x1e\x2a\xab\x2e\x99\xfd\x46\xb2\x8f\x3a\x15\x03\xde\x23\x51\x58\x1d\x33\x25\xd4\xda\xd7\x2b\x1d\x0e\xf8\xc3\x6c\xb5\x15\x39\xb6\xb9\xe7\x16\x3b\x46\x85\xe2\x99\x12\x41\xc0\x9e\x8c\x41\xf1\xba\x0d\xc3\x7b\xeb\x64\x9b\x2c\xfe\x09\x4e\x9e\xa4\x76\xd9\x76\x90\xb1\x64\xc3\x4c\xcb\xb0\xb9\xaa\xeb\x05\xa2\xb0\xbf\x77\x6f\xbd\x3f\x42\xd8\xc3\xb7\x30\x95\xc4\xe6\xda\xec\x34\x45\x34\x47\xe4\x2b\x36\xa5\x17\x7b\x41\x7d\xba\xd5\xcd\xba\xd3\xfa\x8c\x4c\x8c\xeb\xd7\x64\xee\x9d\xf8\xad\x2b\xb4\xf7\x70\x51\x35\xce\xec\x97\x4e\xea\x9c\xad\x52\xfc\xc0\x41\x34\xee\xd7\x46\xc4\xb6\xea\x6a\x82\x85\x1d\x57\x18\x8f\x81\xe5\x42\x0a\x5a\xf7\x61\xd4\xeb\x87\x8d\x9a\x7a\xb7\x3e\x18\x55\x30\xf0\x38\xd8\xd5\x94\xf3\x00\x06\x79\x6e\xb5\xce\x89\xcd\xbd\x6c\x77\x54\x36\x55\x6a\x84\xab\xd9\xa8\xf0\x59\x72\x22\xed\xe8\x98\x16\x4d\xb3\x68\x6e\xd5\xfc\xff\x8b\xbc\xf5\x3f\xe6\x3b\xfa\x64\x8a\x99\xb0\x3d\x69\x4b\xc8\x98\xe1\x55\xe2\x50\x0f\xfa\x64\x6b\xeb\x8e\x45\x2f\x2c\xfa\xd8\x36\xd4\x01\xe8\x6a\xf0\x81\xba\xf2\x65\xcf\xab\xc4\xcc\xd6\x45\x08\x75\x67\x13\x6a\x24\xcc\xfe\x10\x10\xc8\x7d\x66\x1e\xc3\x55\xeb\x97\x75\xdf\x49\xaf\x0f\xa7\x2d\x7a\x89\xb5\x4e\x1a\xfe\xa1\x37\xb4\x3c\xf8\x42\x1d\xa9\x33\x52\x33\xf6\xa4\xce\x54\x17\xf6\xb3\x1d\xbe\xeb\x52\x9e\x1c\x22\x57\xff\x6a\x21\x1a\x76\x11\xd6\x96\x82\x3b\xec\xe1\xa4\xdd\x65\x9f\x82\xfe\xed\x64\xe5\x9f\x10\x28\x3c\xbb\xe0\xff\x46\x3d\x0f\x12\x25\x69\xa3\x75\x7d\xd4\xc7\x8a\xe4\x5f\x60\xd1\x6b\x69\x2e\x5b\x77\xe3\xf7\xc1\x86\x4b\xee\xa6\x1d\x38\x6f\x52\x0d\x59\x15\xf0\x95\x5f\xd7\xc6\x97\xfa\xb9\x85\x74\xb6\x99\x08\xbd\xd1\xba\x86\x49\x97\xc2\xcb\xba\x34\xb0\xb9\xd3\x14\xbe\x20\x15\x9f\x3c\xe6\x5f\xd6\xed\x7f\xea\x4a\xfd\x97\x57\x2a\x54\xdc\x24\x90\x92\xa2\x78\x22\x52\xfa\x71\x3c\xe6\x50\xc6\xd9\x8e\x58\x5d\xb7\xb4\x2f\xc4\x95\xd1\x32\x7b\xc5\x6d\xc3\x99\x65\xcb\x09\xcb\x00\x3f\x34\xef\x05\xd8\x23\xc5\x68\x53\x5c\xc8\xea\xaa\x57\x7f\x77\x6b\x96\x29\x05\xf3\x40\x38\x71\xa4\xf1\x54\x30\x08\xcd\x90\x93\xad\x7c\x89\x86\x32\xee\x6b\xa2\x0f\x61\x27\xea\xcb\x8f\x83\x7e\x81\x84\x6a\x96\xbf\xef\xf7\xb3\xfb\xff\xfa\x56\xce\xf2\xdf\x59\x06\x5c\x37\xb5\x9b\x5f\x02\x17\x5f\xf8\x91\x29\xc8\x17\xeb\x0c\xcf\xd3\x4f\xd1\x8a\xfe\xb1\x89\x58\x5f\xfa\x07\x5a\x34\x57\x09\xd9\x22\x68\xab\x96\xf7\x92\xca\xb4\xc2\xb6\xca\x87\x79\x65\x58\xf0\x1b\xc5\x3c\x8f\xd1\xe4\xda\xbf\x31\x58\x34\x68\x6c\xa3\x37\xd0\x53\xde\x06\xc2\x97\x63\x30\x6f\x70\xd1\xbc\x4f\x06\xc5\x91\x4f\x4b\x6f\x29\xb8\xdf\x3c\x27\xdf\x79\xee\x14\xdb\x2b\x1b\x28\xd7\x17\x71\x94\xde\xa7\x7d\x7a\xb6\x1c\xde\x52\x01\xbd\x71\xfd\xee\x11\x31\xc2\xe9\xfa\x9d\xb8\x0b\x7a\xd3\xa1\x94\xef\x82\x94\x5b\x98\x67\xa9\x2f\x66\xf3\xae\x3c\xe4\x5e\x25\xec\xb1\x61\x93\xc5\xfc\xdd\x59\xd1\x24\xab\x57\xa1\x2c\x88\xac\x9e\xfa\x9c\xf2\xc6\xc2\x4c\xfd\xb2\xf7\x1e\x42\x25\xd1\x22\x5e\x10\x3f\xb1\x79\x55\xaf\xd6\xdc\xb2\x33\x70\xfd\xa7\xed\x15\xfa\xc5\x97\x4d\xba\x73\xeb\x70\xf1\x18\x61\x9c\x2f\x21\x93\xf5\xfb\xf5\xef\x03\x1b\x0b\xff\x3d\x42\x4b\x59\xa3\x13\x6e\x5b\x5a\x52\xf6\x6e\x25\x0e\xde\x1e\x28\x43\xf1\x52\x73\x89\xbd\x91\x7f\xc0\xc7\x17\xcd\xba\x77\x21\xb6\x72\xcf\xfc\x09\xec\xe8\x93\xd3\x1d\x93\xd3\x3d\xcd\x08\x65\xf1\x3d\xfd\x8d\x70\x3e\x99\x03\xde\x61\xba\x7a\x2b\xb3\x37\x6c\xe1\xd0\x72\xef\xbf\x1f\xef\x53\xbc\x21\x32\x50\x6a\x6b\xe5\xb7\x89\xdd\x77\x6b\x41\x81\x73\xf4\x60\x83\x6a\x4f\xe1\x83\x55\x23\x0d\xd7\x8a\xf6\x2d\x9e\x84\x98\xa2\x48\xbb\xcd\xf4\x39\xb3\xc1\xdf\xb5\x24\x29\x85\x22\x1f\x24\x4b\xc2\x94\xb5\x41\xb5\x51\xb3\x7c\xb2\xe1\xd2\xdc\xb1\xf6\x60\xed\x60\x2c\x3a\xcd\x75\x2a\xfa\x16\x09\xb9\x7e\xc3\x91\x95\x74\x5b\xac\xc4\x27\x0e\xeb\x4d\x27\xbd\xe2\x2e\xdf\xdd\xab\xb9\x4c\x5c\x00\x4b\x9a\x60\x28\x52\xd8\xd1\x79\x8a\xde\x12\xdf\x31\xbc\x7e\x67\x0e\xc2\xf3\x6a\x68\xc7\x3d\x46\xc3\xfc\x3f\x36\x9b\xec\x7b\x08\xdd\x10\x85\xf2\xa8\x6f\x4b\x28\x89\x86\xa1\xfe\x7f\x54\x5d\xe9\x92\xb3\x3c\xaf\xbc\x97\xf9\x7d\x6e\xca\x80\x03\x0c\x8b\x79\x01\x27\x4f\x72\xf5\x47\xad\x6e\x39\xf3\x55\x4d\x15\x0a\x01\x86\xb0\x78\x91\x7a\x91\x0c\xd5\x9b\x47\x47\xca\x64\x55\xa4\x9e\xd3\xa2\x45\x15\xa7\x80\x53\x41\xd9\x4a\xd5\xa6\xac\x46\xfd\xca\x6d\x40\x7e\x61\x18\xc5\x32\x5f\x3f\xa1\xea\x7c\xc5\x1d\x00\xa8\xe5\xbc\x3f\xdf\x8f\x9c\xcf\x51\xd5\x8a\x41\xb8\x96\x40\xdd\x4a\x60\x64\xaf\x48\xdd\x31\x6f\x47\x4d\x6a\x0e\x05\x33\x4a\x5d\x29\x4c\xb1\x27\x49\x3d\xd6\x6d\x3f\x2b\x91\x38\xc8\x33\x1f\x2c\x41\x61\xf4\xd7\xd4\xae\x46\x45\x83\x0d\x95\x48\x32\x72\x1f\x5f\x46\x1b\x0b\x54\x84\x1c\xda\xe8\xfd\xd3\x5c\x44\xde\x89\xae\x1d\x5e\xc6\xf2\xe5\x3c\xb0\x66\xc5\xe4\xde\x95\x12\x39\x44\xfb\x4c\xae\x17\x26\xa7\xdf\xf2\x13\x2d\x44\xb2\xc7\x77\xdd\x77\xd1\x85\x64\x06\xbc\xed\xf2\xfa\x9d\xc2\x3f\x58\xfa\x57\xfd\x22\x6a\x34\xa0\x3d\x1b\xeb\xce\xe7\x2c\x4a\x1b\xca\x4d\x64\x0f\x39\x8c\xe5\xc1\x32\xd2\xbf\x93\xa3\xc3\x53\x0a\xd0\x67\x56\xa1\x2c\x53\x2d\x06\x2c\xc3\x07\x4b\x45\x48\x28\x90\x55\x94\x25\x6d\x6a\x01\xa6\xe7\x1e\x85\xfd\xc7\x2b\x7c\x45\x40\x12\xee\xcf\xd4\x6c\x44\xc8\x79\x82\x3b\xb6\x2f\xf7\xc1\xaf\x27\x34\xaf\xe6\x6f\x4d\x8a\x6e\xc6\xc9\x1e\xc4\x39\x02\x5f\xca\xcd\xef\xd4\x2c\xcd\x9a\x1d\x66\xf5\x30\xc7\x13\x73\xeb\x3f\x38\x39\x06\xa1\xe9\xa8\xbf\x85\x0a\x59\x20\x58\xa8\x98\x73\xba\x3a\x2e\x23\x9b\x35\xa9\x56\x35\x4a\x21\xab\x91\xa1\x0e\xbb\x16\x2c\x4a\x9d\xb7\x26\xfe\xd0\xc1\xe2\xaa\x03\x6a\x5c\x8c\x58\xd9\xb1\xe5\xaf\x1b\xd2\x1e\x65\x3b\xbc\x8a\x72\xac\x75\x50\x89\x2a\xaa\x56\x36\xcf\xaf\xd4\xad\x9a\x3f\x5a\x13\xe6\x67\x47\x60\x7d\x51\xa7\x3a\x25\x84\x35\x89\x61\xa4\xc4\x8d\x4d\xc6\x2e\x71\x26\x8f\x89\x3e\x47\xc8\xe4\xb3\x67\x3e\xb2\x9c\x54\xe0\xad\x28\x7c\x1e\xe5\xb1\x58\x8c\x3a\x1f\x51\x38\xca\x2e\xe6\xe5\xd1\x3e\x15\x8d\xc4\xed\x2d\x95\xa2\xd6\xba\x86\xc1\xc8\x93\x82\x06\x30\x4b\x66\x19\x0a\xcc\xcb\x59\xb6\xc9\xa7\x32\x33\xc7\x17\x3f\x07\x66\xd1\x2f\xcb\x50\xed\x5f\x84\x0d\xfa\x91\x7e\xfd\x60\xe5\x55\x2f\x74\x6a\x61\xb8\x80\xdc\x1c\x2b\x4c\x8e\xf6\x42\x10\xe8\x55\x97\x27\xd6\x64\xb6\x64\xcd\x42\xfc\xc3\xf0\x92\x74\x57\x0f\x31\x08\x92\x8b\x00\xa7\x8a\x6b\xb8\x7f\x05\xe8\xf6\xba\x1e\xae\xa5\x85\x51\xa4\xdf\x62\x2f\x55\xf9\x6b\xb7\x97\xb3\xa9\x75\x0d\xde\xaa\xed\x24\x75\x51\x9e\xeb\x27\xc4\xb9\x7c\x0b\x37\x2c\xf5\x40\x6e\x28\x98\x18\xb3\xf6\x85\x49\x91\x97\xb2\x00\xca\x20\xf3\x6a\x77\x1b\xe4\x81\xc9\xf6\xad\x5e\x3e\xd1\xda\x50\x41\xe5\x32\x95\x85\xd1\xc6\xfc\xed\x56\x6d\x3c\x29\x0e\xd2\x7e\xff\x2a\x94\x08\xb6\xdb\xa4\xb0\xcc\x60\x11\x6b\x60\x60\xa6\xa9\x78\x65\x03\xfa\x21\x97\x3e\xd6\xa3\x10\x34\x9e\x51\xfd\x4a\xfb\xfb\x1b\x0e\x3a\xc8\xcc\x89\xed\x46\xfc\xd1\xe6\x15\x56\x16\xb3\x6e\x39\xa3\x68\x14\x68\xc1\xaf\x44\x97\xa1\x01\x56\xe4\xa1\xee\x7c\xa5\xaf\x4d\x33\x6a\xe9\x3c\xd1\x2c\x6a\xc2\xd6\xc4\x3c\x36\x38\x25\xb0\x52\x85\x7c\x0f\x7f\x7f\x5e\x47\x3c\x2a\x52\x04\x6b\xbc\x18\x54\xb5\x5a\xdc\x3b\x1a\x8f\xa5\x28\x7b\xfe\x55\x7c\x82\x4a\x8f\xea\x48\x76\x63\x54\x82\xeb\x47\x78\x74\xa8\x94\xd2\x8f\x73\xd7\x85\x64\x98\xb5\xd6\xb2\x52\x41\x82\x44\x3b\xda\xb4\xfa\x8c\xca\x56\x8f\x24\x67\x14\xbf\x80\x23\x53\x0d\xa7\x87\xb7\x63\xf3\x50\x01\x4c\x53\x3c\xa4\xb7\x0a\x36\xff\x82\xb2\xf4\x8a\x42\x93\xfd\x03\x55\xbd\x5c\xcf\x3a\x56\x5b\xac\x62\xcf\x7d\x55\xf9\x34\x6d\xe9\x62\xbd\xd6\xcd\xa0\xb9\x24\x31\x03\x81\xf8\x51\x71\x8e\x98\xde\x68\x9b\x7e\x66\x07\xcb\xd0\x83\xbd\x95\x3a\xad\x9b\x7a\x87\x63\x74\x78\xb3\xec\x32\x5e\xf1\xec\xb0\x6b\x39\xfe\xb0\xec\x94\x54\x0a\x5b\x51\x9c\x66\x24\x38\x38\x6a\x51\x34\xe6\xd8\x52\x0f\x35\x38\x86\xcc\x4c\xac\xe1\xc2\xbb\x72\x32\xbe\x56\xb4\x26\x3e\x38\x5d\xab\xf2\x58\xa8\x36\x51\x11\x0c\x6d\xa4\x17\xa7\x00\xf2\x94\x42\x99\x3d\xf7\xd1\xfb\x43\xa4\x4c\xd6\x23\x45\xbe\xcd\x6b\xf9\x22\xa4\x31\x16\x3a\x09\xf1\x5b\x9b\xe2\x13\x74\x26\x58\x81\x77\x7a\xa1\xd7\x76\x9c\xcd\x75\xf0\xe5\x5e\x23\xab\xb8\xce\x9a\xc3\xc3\x6b\xe5\x12\xed\x2b\x77\x41\xbb\x0a\x55\x35\x14\xb1\x52\x44\x2a\x77\xe5\xa7\x9c\xb4\x91\xd8\xe2\x32\x8a\x8d\x2b\x11\x9d\xfe\xff\x9d\x49\x2d\xd2\xd7\xe5\xb0\x0f\x3b\x8b\xf0\xbd\x16\x45\x7c\x95\x00\xaf\xbd\x91\xb4\xde\x5a\xe9\x5d\x1b\x76\x2c\x4e\xfe\xe1\x86\x8f\x1c\xbf\x27\x4b\x6c\x77\xcd\x29\x4a\x68\xd1\x9a\x59\xb4\x85\x2d\xf6\x47\x95\xad\xe7\x5c\xa2\x92\xbf\xe2\x21\x54\x0d\x2d\xc4\xd8\x6c\x12\xc0\xc2\x98\x2e\x42\x0a\x77\x98\x10\x77\x5c\xc3\x76\x6a\xa5\x26\xb4\xb7\xbd\x78\x27\x58\x23\x93\x25\x30\xea\x66\x57\x69\x15\xb4\x1f\x71\xc7\xe2\xbb\x50\x75\x4b\x23\x9d\x71\xec\x21\xaa\xbb\x20\xaf\xb0\x89\x41\xeb\x73\x33\x96\x27\x4e\xea\x08\x22\x59\x53\x5a\x3c\x31\x0e\x85\x26\x5f\x64\xc1\x5e\x60\x18\xc3\x82\xd7\xe9\xbe\x17\x0b\xec\x85\xf9\xb9\xb0\x78\xf6\xad\xac\xe5\xca\x0e\x75\x29\x4f\x82\x32\x97\x72\x7c\xcb\x57\x45\xea\x8c\xa0\xa2\x91\x40\xb9\x48\x30\x64\x89\x14\x1b\x1c\x61\xd4\x13\x2d\xf2\xe6\x5b\xbc\x4e\xf1\xe3\x22\x6d\x7d\xb0\xc7\xce\x2b\xd4\x63\x16\xc7\x55\xb0\xaa\x26\xf9\xa4\x25\xcc\x7e\x97\x1c\xf5\xb6\xed\x58\x65\x14\x83\xbe\x29\x34\x18\xed\x8d\x6e\xac\xb6\x9c\x48\x30\x8b\x0d\x31\x55\x67\x21\x6e\x23\xba\xfe\xb7\xde\xac\x03\x39\xc3\xec\x24\x55\x2c\xb4\x5e\x7e\x53\xc3\xb8\xfd\x26\x9a\x2e\xcf\xd7\xe2\xad\x38\x50\x88\x27\xa1\xdd\xf3\x42\xf1\x5a\x1b\xc7\x7a\xe5\xe4\xdd\x48\x56\x6f\x56\xa5\xa7\x7a\x25\x39\x87\x07\xcd\x02\x23\xed\x18\x8a\x4e\x35\x46\x05\x93\x84\x32\x26\xcf\x7b\x90\x0b\xf6\x26\xc9\x0c\xf9\xd2\x39\xaa\x6c\x61\x51\x8b\x2a\x9b\x2f\xc4\x38\x44\x01\xed\xe2\xb2\xa9\xac\x95\xb5\x15\xef\xd6\x21\xb7\xb0\x93\x34\x5c\xbc\x23\x10\xe3\xf5\x13\x83\x34\x65\xf3\x74\x19\x44\x00\x5b\x55\xac\xfb\x3a\xc5\x64\xa1\x8e\x5c\xc2\x36\x28\x58\x79\x18\x8f\xe0\x9c\x59\xeb\x2e\x65\xe2\x49\x32\xe3\x28\x8d\xbd\xa8\x1c\x3f\x49\x49\x74\x6a\xa4\xc4\x09\x98\x68\x1a\xb9\x5c\x61\x49\x8a\x82\x98\x0d\x62\x1f\xaa\x84\x85\x4c\xdc\x79\x8a\x21\x76\x1e\x5a\x0e\x73\xe8\xc5\xad\x34\x28\x5f\x57\x49\xbd\x01\xf1\xa0\xba\x56\x98\x48\x4d\xae\x0a\x19\x94\xb6\x14\x6c\xba\x94\x0e\x9a\x36\x8d\x55\x86\x56\xa3\x9b\x07\x8b\x77\x55\x49\xa0\x1f\x6b\x64\xcc\xc6\x3a\x48\xac\xed\x94\x71\xf3\x78\x42\xbd\x47\x91\x7e\x33\xa8\x62\x45\x72\x70\x59\xcf\xed\x78\x46\xb1\xc9\xba\x7c\x2f\x60\x95\x53\x2c\xb1\x73\xe4\x80\x75\x2c\xe5\x0a\xe6\x18\xd1\x33\xa3\xa4\x56\x00\xa6\x69\x59\x37\x74\xcd\x90\x37\xf3\x33\x03\x6a\x4b\x1d\x88\xc5\xc3\x4b\xa6\x31\xe8\x39\xfd\x90\xf3\x6a\xf7\x43\x6f\xe1\x88\x5b\x4b\xa2\x98\x3a\x07\x97\x8b\x63\x95\x4b\x39\x77\x15\xc7\xa8\x25\x77\x4b\xb4\x66\x4c\x41\x6f\x01\x77\xac\x44\xa5\x2c\x82\xf0\x92\xb1\x57\x49\xa4\xcc\x31\xb2\xd1\x16\xb8\x90\xf6\x08\x86\x46\x94\xa1\xea\x1f\xd9\xfb\x50\xed\x94\x76\x8e\x2b\xc9\xb1\x86\x75\xfe\x29\xa5\xb1\x44\xa1\x72\x05\x2b\x69\x2f\x55\xd4\xaa\xda\x91\x07\xf0\x87\xe7\x38\xab\x72\x76\xaa\x24\x6d\xed\xe4\xa0\x60\xbe\xc8\x3d\xe3\x5c\xfe\x61\x43\x16\x96\xb3\xc0\xb4\x56\x8d\x13\x5e\x34\x28\x0d\xfb\xfa\xf9\x0a\xf9\xe1\x47\xe4\xa9\x1e\x73\xd8\xf0\xa2\xb0\xe6\x17\xec\x91\xd9\x79\x3e\x9c\x30\xa9\x3c\xcb\x03\x4f\x78\x50\xc1\x1f\x3e\x34\x61\x85\x0e\x30\x97\x29\xae\xa1\x97\xc8\x9c\x28\x76\x35\x73\xb9\x46\x24\x42\x81\x5a\xba\x39\x20\x68\xfa\x0d\xcc\x0b\x7f\x54\x5e\x06\x52\x0d\x72\x48\x45\x5a\x67\x18\xdc\x30\xa6\x8a\xb9\x5d\x22\xab\x22\x27\x9a\xb4\x0d\x95\xf2\x3c\x43\xdd\x91\x32\x24\xbd\x0c\x30\x45\x96\xb9\x64\x69\x3d\x54\xde\x01\x5b\xb2\xb2\x84\xe4\x3f\x8b\x64\xa0\xab\x88\x4e\xe6\x4d\x97\x8d\x7e\xd7\xc6\x17\x13\x72\x69\x28\x9b\x37\xa3\x43\x81\xa4\x57\xd1\x14\xd1\xcf\xc9\x57\xc3\x96\x9c\x3b\x07\xbb\x78\x98\xd7\xba\xae\x51\xf8\x8a\x4a\x97\x8f\x10\x3c\xba\x38\xa0\xb7\x60\x2f\x72\x7b\x85\xff\x4c\xbd\x59\xaa\x05\x87\xac\x4a\x82\xee\xec\xde\x9e\x76\xf1\x0f\x3b\xdb\x07\x6b\xff\x74\x0e\x39\xcc\xe9\x50\x2c\x0b\x26\xda\x2a\x99\xa8\x21\x10\x61\x43\xfe\xad\x32\x83\xf7\x9c\x26\xd7\x11\x93\x32\x40\x67\x88\x5f\xc9\xc9\x67\x80\x90\x07\xbf\xfa\xaa\xe2\xf5\x75\xe6\x77\x21\xeb\x62\x33\xe0\xeb\xad\x25\x37\x96\xbb\xea\x90\x5e\xbc\x0f\x78\x5a\x06\x71\xba\x86\xc6\x0c\x19\x42\x79\x78\x80\x06\x16\x03\x96\xf0\xfc\x94\x6d\x64\x21\x06\x55\x25\xc8\xce\x96\x60\x7c\x65\x86\x49\x7a\x28\xfd\x59\xe7\xe5\x9a\xe8\xc5\xe3\x55\xb8\xf0\x9c\x39\xa3\xc5\xe9\x31\x12\x78\x33\x78\x84\x7f\xce\x4c\x51\x91\xfe\xcc\xd6\xc7\x73\x96\xda\x17\x8d\xb3\x51\x88\xe3\xa4\xd2\x46\xb9\x36\xdf\x29\x32\xa7\x07\x1f\xc5\x9d\x01\xdc\xd1\x7e\xe7\xa6\xd1\x95\x48\x49\x4f\xc7\x2f\x5d\xd7\x3c\x72\xc8\xe8\xe8\x57\x11\x41\x7a\x52\xb1\x7a\xf8\x41\xb3\x32\x87\x4e\xcc\xbf\x41\xfd\xcd\x8f\x3f\x41\x96\x99\xc5\x39\x74\x32\x2c\x15\x42\x2b\x85\x92\x78\x13\x9b\x25\xd0\xdd\x7c\x09\xa3\x68\x52\xec\x6c\x30\xae\x72\x1b\xd2\x22\xfe\x0b\xf3\x10\x5c\xb2\x77\xbe\x23\x7c\x41\x9a\x51\x45\xba\x27\xac\x6c\x64\x4b\x6f\x5d\x01\x01\xb0\x20\xbc\xad\x73\x78\xe5\x9c\x7f\xab\x73\x5f\x42\xdf\xb7\xac\x62\xe1\x18\x72\x7d\xf8\x7f\x1f\x71\xda\x82\x8d\x97\xd6\x10\xc2\xf5\xe4\x8f\xbc\x7c\x6c\x1a\x91\x46\x9d\x11\x8d\x91\xc2\x97\xaa\x7b\x4f\xad\xa0\x17\x52\x7e\x6d\x49\x8f\x3b\xf8\xe9\xcc\x61\x94\xcf\xf1\xb2\x17\xf8\xa2\xfe\xd7\x26\x95\x80\x52\xc3\x82\x04\xe1\xf9\x6e\xb5\xba\xad\x15\xf0\xec\x14\xa8\x0c\x67\x61\x54\xef\xca\x15\x06\x86\x16\xeb\xd4\x41\x87\x53\x16\x17\x8a\x63\xd1\x95\xba\x8d\x7e\x44\xfb\xf5\x35\xcc\x91\x7f\x9e\x33\xe1\x32\x83\xf1\x8f\xb4\x5f\x14\xf8\x36\x11\x91\x3a\x38\x37\x35\x1b\x9e\x02\x99\x76\x0f\xae\x28\xfa\x9d\x55\xe5\xa7\xa6\x53\x23\x01\xa0\x8b\xe1\x18\x76\x3e\x45\xa6\xc5\x9d\x30\xbf\xce\x7e\xd3\x6f\x28\xaa\x6d\x58\x20\xf9\xbf\xf2\xf6\x7f\xa8\x6a\x57\xa3\xa0\xcd\x50\x90\xfd\x61\x59\x90\xdf\xc0\xad\x59\xba\x7e\x1f\x5e\xef\x4c\x51\x99\xae\x65\x8e\x9c\xa6\xc6\xaf\xc0\x43\x5c\xf5\x6d\xaf\xf3\x09\x9d\x2d\x0b\x9a\x7b\xcf\xba\x3b\x42\xb0\x73\xd0\x03\x2b\x82\x84\xb6\x41\x11\x90\xd5\x01\xd6\x0b\x95\xc4\xef\xb2\xa6\xc1\xac\xf7\x69\x1f\x8f\x19\x9c\x5f\xa3\x9d\x2e\xab\x6a\x68\xbd\x97\xa2\xfd\x29\x43\xfd\x0e\x25\x26\xd5\xf5\x00\x3b\x0c\x91\xc0\x60\xb8\x5d\x04\xcd\x27\xcc\xc8\xfd\x19\xb5\x48\xd2\x42\x4e\x73\xdb\xed\x76\xea\x26\xda\xb1\x59\x0e\x3c\xb7\xb0\x14\x77\xf3\x2f\xb6\xc3\xee\x58\x18\x08\x13\x7d\xf0\x4a\x9e\x2b\xe2\x7b\xef\x15\x80\x06\x2f\xee\x09\x77\xee\x56\x9a\x7e\xd4\x0d\x49\x3a\xb2\x56\x41\x8f\xe3\x41\x21\x81\x8c\xe1\x35\xeb\x7a\xf2\xf9\x59\xd9\x3f\x24\x70\xc4\x3c\x6d\x9b\x5c\xca\x17\x41\xf6\x04\xb7\x4c\x7a\xfa\x5e\xd7\x28\x75\x83\xe0\x00\x89\xa5\x8f\xcf\x8b\xed\xef\xa7\x62\x1c\x86\x60\x3e\x9b\xa4\xe0\xc8\x8b\xf8\x99\xdd\x34\xc3\xa5\x08\x91\xd8\xf7\x13\xfa\x10\xc7\xfe\xc9\xec\x22\x3f\xe9\x9d\x7a\x5f\x9e\x01\xc5\x26\x2b\x8e\x02\x3c\x28\xf5\x71\x96\xf5\x92\xe9\x3c\xac\x74\x82\xf2\xc6\x5f\x83\xa1\xf5\xc9\x1a\xe0\x3a\x90\xd0\xc6\xd9\x17\x96\xe2\xa1\x79\xb3\x44\x0d\xc1\x79\x97\x1d\x8a\x45\xb1\x2a\xa0\x6f\xa2\xbb\x79\x38\xcd\x41\x51\xa5\x02\x21\xc9\x75\x6e\xce\xe1\x49\xec\xd7\x14\xf3\xf7\x97\xad\x08\xbe\xdb\xfe\x91\xec\x20\xeb\x80\xae\x28\x28\xae\x1c\x35\x9d\x5f\x8d\x75\xf3\x92\x97\x95\x93\xd9\x54\xf2\x1b\x64\x3b\x53\xf6\x53\x43\x10\xba\xe2\x78\x35\xae\x50\x64\x08\x39\x4e\x1b\xe8\xb4\x12\xdf\x2a\xcb\x1b\x0b\xfb\x59\xe4\xb6\xbb\xaa\x5f\x50\xcc\xa8\x69\x0c\xae\xac\xc0\x58\x34\x15\xc9\x99\xbb\xd3\xcd\xa7\x85\x52\x57\x64\xcd\x8f\x26\x4b\xaa\xff\x45\x96\xe3\x09\x73\xc9\xbc\x44\xd4\x75\xda\x01\xa5\xbd\x9e\xd5\xc3\x55\xcc\x3a\x62\x90\xaa\xbd\x5c\x7e\xc3\xea\x71\x4d\x5e\xae\xaa\xdb\x63\x25\xa0\xf0\xbe\xea\x2f\x59\x6e\x6f\xd2\xa0\x6e\x78\x4b\x15\x06\x4d\xb7\xe7\xb6\xbe\xca\x5f\x2c\xe8\x13\x0a\x86\x7c\x17\x15\x10\x61\xa8\x3e\xee\xe2\xc5\x9d\xb1\x4c\x92\x28\x6c\x8d\xde\x5d\x36\x19\xee\x5c\xa1\xd3\x7a\xcf\xfb\xd2\xa2\x41\x41\xbf\xec\x85\x51\x27\xdc\x12\x22\xea\x18\xbb\x0f\x5e\x7b\x55\xd1\x45\x6e\x51\x9a\xbd\xa7\x50\xf1\xf5\x88\x23\x39\x7b\x08\x2a\x59\xa1\x37\xa6\xee\xfc\xc5\x79\x94\xcd\xcb\x0d\x8c\x99\x5a\xe2\x3b\x55\x65\x93\xee\x3f\x6e\x53\x77\x6a\xbc\x3b\x4f\xb2\xf5\x5c\xd9\x15\x56\xee\xaf\xf7\xa1\x7a\xd4\x5b\xff\xfb\x7a\x69\x90\x78\xd9\x93\x1f\x25\x0a\x1b\xf1\x0c\x51\xfa\x0a\x12\xd0\x55\x4f\xa7\xcc\x50\x02\xb1\x79\xe0\x54\xca\x82\x5d\x75\x1c\xb4\x42\x35\xbe\x2a\xeb\x5c\xf0\xe3\x5b\x09\xb4\x1c\x8a\x40\x95\x09\x4d\x28\x62\x45\xc9\xbc\x73\x09\x49\xed\x96\x42\xbc\xfa\xba\x09\xe5\xf5\xd3\xbc\xed\x26\x53\x52\x0f\x51\xcf\xe0\x11\x47\xb2\x2b\x25\x01\x3d\xb2\xfb\x82\xd0\x37\xad\xe1\x1e\xe4\xd4\x3e\x11\x08\xb3\x38\x58\xfc\xe4\x16\xa8\x2a\x9d\xae\xc1\xf6\x3a\xce\x34\xba\x5e\xc8\x75\xb0\x9d\xb9\x8e\xf9\xab\xba\xc8\x3a\xdb\x91\x50\x32\xe6\x19\x1c\xaa\x71\x5b\x80\x41\x80\x7f\x5f\x9a\xd3\x8f\x18\x5b\x2e\xc1\xc8\x13\xda\xf3\x3a\x9e\x52\x5c\xdc\xb3\xc6\x2a\xd7\x46\x08\xe4\xb5\x8a\xe8\x8c\x1c\xf1\x22\x6b\xa6\xf9\xf4\x6a\xb4\xbd\x18\x71\xfd\xec\x15\xb9\x55\xb3\xd0\xeb\x82\xc7\x81\x68\x07\x9b\x8c\xbc\x36\x51\x13\xa1\x14\xc3\x65\x38\x28\xb9\x22\x0c\x9e\xbb\x6b\x3c\x45\xdb\x7b\xd0\x07\xe2\xca\x87\x26\xfb\x57\x16\xf8\x1a\x81\x7e\x5c\x4e\x8d\xba\x67\xc3\x65\xf1\x31\xad\x49\x71\x2a\x21\x4b\xa9\x3f\xdf\x2a\xaa\x7e\x3c\x3e\x09\x00\xe8\x7a\x8c\x51\x0d\x2d\x50\xcb\x0f\x99\x46\xe4\x0e\xd4\xae\x82\xc8\xd7\xd4\x22\xfb\xf6\x62\xb8\x24\xe3\xac\xa3\x20\xb5\x32\x86\x52\x62\xd5\xab\x61\x91\xf8\x06\x57\x9b\x8b\x5f\x40\xea\xdb\x88\x5a\x64\x3e\xbc\xbc\x0f\x5e\x2a\x60\x7c\x19\x70\xde\x77\x25\xe5\x30\xaf\x44\x52\xc4\x95\xbe\x44\xc5\x44\x9d\xe6\xf3\xed\xed\x96\x35\x41\x89\x54\x3f\x4d\x74\xa1\x72\x20\x22\x1f\xe6\x83\x51\x05\xd5\x15\x38\x69\x2b\x75\x16\xa9\x97\x82\xdf\xd7\x58\x7f\x5c\x6e\x7a\xed\xce\xf2\x2b\x66\x5c\xe9\x27\x6d\xdc\x79\x69\xf0\x47\xba\x8b\x34\xed\x29\xcc\x1f\x41\x30\x81\x5c\xbe\x9d\x7e\x4a\x08\x34\xed\x05\x64\x83\x15\xd8\xe8\xbb\xce\xb9\x4b\x2c\xae\x3e\xc3\x3b\xc8\xcd\xe2\x7e\x58\x5d\x95\x9c\xc3\x99\xc3\x0f\x28\x13\xb5\x0a\x87\x50\x99\x01\xdd\x4c\xfe\x41\xbe\xe3\xc3\x7a\x6a\x28\x7a\x9d\xcd\x30\xe0\x4c\xa4\xa1\x9c\x32\x65\x12\xdb\xe6\x4c\x54\x93\x4c\xfd\xc2\x01\xf9\x29\xc7\xa8\x13\xe2\xe4\xe1\xa6\x94\x3a\x07\xe1\xfd\x57\x9d\xc6\xef\x35\x3d\xe0\x3f\xbc\xca\x57\xf7\x41\x8c\xbf\x5b\x37\xf7\x80\xf2\x35\xe1\xcd\x70\x16\xaa\x77\x33\x19\x1a\x51\xf2\x65\xe9\xf4\x3d\x30\x8b\xe9\x9a\x8c\x2a\x95\xa2\xb2\x9a\x6e\x99\x08\xe9\xd9\x3c\xe0\xc1\xc1\x52\x28\xa0\x91\x94\x56\x64\x75\x1a\x96\x42\x49\x93\x37\x6b\x9c\xe7\x10\x65\x94\x1f\xbb\x3d\x95\x7d\x39\x58\x5f\x45\x77\xc2\x28\x7e\x13\x2a\xac\x89\x81\x3c\x57\xa0\xdd\xc8\xfd\xfa\x9e\xf3\x05\x94\x53\x43\xb2\xf1\xce\x8d\x11\x48\x12\xc9\x01\x2f\x32\x7e\x79\x42\x7b\x49\xc5\xd4\x18\x0c\x1d\xe8\x1a\x28\x4e\x99\x99\x03\x80\xb6\x6e\x33\x55\xca\x5f\x41\x9c\xa3\xbd\x15\x87\x3b\x47\xb3\xda\xba\x6b\x00\x77\x04\x3a\xcd\x02\x32\x20\xd9\xa2\x1e\x61\x24\x77\xa4\x41\x8f\x3b\xdc\x0b\x59\x84\xd3\xd0\xa0\x9c\xf1\xf2\xba\xda\x80\x73\xfe\xd0\x3d\x73\x29\x26\x1f\xb7\x5c\x60\xde\x8e\x60\x4a\x3e\xfd\x0f\xda\x26\x96\x34\xe6\xf0\xf2\x69\x79\x7d\x75\x19\x7d\x08\xe1\xdc\x7a\x91\xff\x9c\x6a\xba\x97\x51\x36\x47\x50\x0b\xf1\xd2\xe8\xdc\xb3\x7d\xb3\xa0\x57\xd1\xf4\xeb\x92\xb8\x43\x1e\x23\x92\xb4\xf6\x61\xcc\xd1\x78\xef\x9e\xf9\x8f\xff\x97\x45\x48\x01\x41\xf0\xd2\x92\x0b\x55\x76\x33\x67\x65\x40\xb1\x52\xb2\xb0\xba\x0d\x1d\x23\x5d\x60\x8b\x84\xc5\xdd\xc2\xa1\xd4\x02\x89\x3c\xd6\xfd\xad\x35\xd0\x47\x22\x89\xf0\x8e\x42\xab\x3d\x4a\x62\x07\xa2\x99\x6b\xd4\x43\xd7\x2d\xc2\xe5\x5f\x45\x24\x04\x16\xc1\x03\x91\xf6\xfc\x31\x4e\x7b\xab\xcd\x6e\xf5\x6c\x85\xda\x14\xdc\x43\x25\x1a\xb7\xd2\xea\xd4\xdb\x9a\xfb\x0f\x8b\x7b\xf3\x9b\xfd\xc5\x36\xdf\x91\xe5\x6f\x9a\x67\x5b\x7b\x9c\x11\x91\xd8\x88\x02\x60\xe8\x48\x4e\x59\x0c\x5a\x67\x66\x6f\x2c\xe6\x92\x51\x97\x75\x4b\x95\xc7\x72\x79\x49\x11\x02\x33\x69\xf5\x5b\xfe\x52\xd3\x32\xec\x68\x83\x8f\x98\x59\xe2\xdb\x90\xf5\xe6\x21\x42\x6e\x65\x8b\x77\x75\xcb\x83\x4d\xfe\x9d\xac\x99\x99\x1e\x01\x23\x51\x1b\x61\xf0\x10\x25\x62\x88\x51\x8a\xc3\xb7\x85\x90\x8a\x85\x59\xd5\xdb\x2d\x11\x25\xb4\xd9\x23\x24\x41\xcb\xb1\xbc\x9a\xe0\xa4\x3d\x1d\x8a\xe1\xfc\x4c\x9e\x65\x0f\xde\xa9\x8a\xc6\x48\xf4\x30\x08\xb3\xc5\xad\xef\xc4\x45\x14\x58\x6d\x4b\x6f\xbb\x69\x64\xea\xbd\x73\x15\x01\xf0\xaa\x2c\xac\x5e\x95\x95\xd3\xf6\x00\xa5\xf3\x13\x5c\xd3\xe4\xc8\xe3\xd0\xac\x54\x41\x04\xf5\x59\x6b\xe5\x1e\x3f\xdf\x0a\x6d\x23\x10\xda\x60\x18\x73\x52\x56\x50\xad\x2d\x50\x51\x96\x86\x25\x9b\x63\xc2\x3c\x08\x33\x65\x2f\x9f\xa9\xd0\x0c\xfd\x68\x56\x66\xa5\x69\x8d\x80\x2b\x6c\xa2\x16\x46\x50\xf6\xe1\x7f\x08\x97\xa9\x1f\x4a\xe3\x21\x72\x36\x03\x22\x60\xd0\xf7\xca\xf3\x29\x1a\x5c\x79\x4a\x87\x6d\x75\x70\xc1\x8f\x97\x4e\x3f\x3f\xaa\xa0\xb2\x3a\x69\x4f\xd8\xb7\xee\xea\x68\xe5\xe1\xfe\x09\x3e\x60\x29\x54\xcb\xdc\x9a\xaf\x54\xee\x58\x05\xb5\xbb\x7a\xe7\x08\xa7\xaf\x79\xe9\xea\x8a\xeb\x08\xf2\xeb\x5b\x6b\x95\x08\xbb\x47\xbe\x14\xa3\x0d\x0a\x9a\x2a\xbf\x7e\xfd\x6c\x90\x58\x3b\xf9\xed\xac\x3a\x6f\x34\x07\x00\x3d\x84\xa3\x54\x58\x01\xad\x10\xd4\xad\x1e\xa4\x8b\x75\xd8\xd4\xb4\x35\x85\xd2\x5a\x61\x4c\xab\x92\xa8\xea\xbd\x09\x4e\x75\x51\x1a\xfd\x51\x61\x94\xe2\xa0\x10\x6f\x65\x89\xd7\x27\xf6\xb4\xec\x4a\x22\x14\xad\x5f\x47\xab\x72\xaa\x20\x3b\x9f\x97\x34\x37\x67\xa9\xbe\xac\x09\x25\x60\x0f\x6c\xe6\xa2\x62\x68\x9f\x3e\xdc\xbe\xab\x03\xff\x73\x47\x9c\x03\x5c\xb1\xf8\x4a\x42\x1c\xdb\xeb\x8e\x6f\x55\x47\xdf\xa2\xfe\xd5\x06\xc1\x45\xe8\x35\xc5\x3a\x49\x4b\x63\xf1\x8a\x83\x17\x31\x6b\x37\x13\xeb\xb9\x20\xeb\x14\x58\x47\x7c\x98\x88\xc1\x43\x3d\x55\x45\xd4\x5b\x5e\x59\xe7\x2e\xdd\xc8\xa5\x9c\x92\xf7\x2c\x92\xbe\x5b\x98\x0a\x5a\x58\x2d\x5b\x8a\x88\xab\xd0\x03\x65\xcd\xf5\x51\x32\xf7\x6c\x86\x38\x8b\x50\x03\x8b\x9c\x01\x97\xb5\x1c\x98\x0d\xa8\x54\xb8\x90\xfd\xf3\x13\x6c\x46\x0f\xf8\x92\xd9\x52\x7b\xb0\x13\x58\xe4\x70\xb1\x34\xf8\x23\x68\xc9\x11\x8c\x57\x8c\x17\xe1\xbd\x55\xb8\x76\x5d\x8f\xa4\xf2\x2e\xa0\x39\x7e\xf4\xf9\xb7\x95\x88\xc9\x95\x59\x20\xb0\x73\x53\xc1\x7a\x71\x6c\x7e\x14\x69\x81\xc4\xd3\x7f\xca\xee\xe1\xc1\x7e\xc2\x3e\x04\xc1\x02\xa6\x5d\x2a\x0c\x5b\xe3\xc0\xe5\x2a\x8a\xe5\xa5\x65\x92\xf0\xff\x22\x08\xf1\x92\xa2\xe8\x4b\x54\xf5\x6f\x25\x81\xee\xb7\xee\x10\xff\x67\x28\x83\x3c\xa8\x89\x2a\x60\x8e\xee\xb7\x78\x17\xf4\x3b\xbb\xea\x24\xcb\xc2\x02\xdb\x58\x60\xcf\x8d\xf3\x33\x71\xb6\x7c\xd9\x7e\x93\x77\x68\xbf\xc9\xdf\x73\x1b\x34\xf9\xa5\x85\x86\x32\x34\xa4\x70\x15\xa0\x1e\x2a\x20\xfa\xf4\x26\x53\x67\xaa\x42\xfb\x21\x33\xe5\x55\x4e\xd8\x7a\xed\x1e\x9c\xcf\xc4\x35\xe7\x75\xb7\x5a\xee\x41\x71\x3e\x0c\x21\x16\xb1\xfb\xca\x7a\xdd\xda\x65\xca\x7f\x2a\xc3\xf9\xa1\x4d\xe5\x1c\x3b\x05\x55\x71\x76\x02\xa3\x93\x10\xb3\xac\x18\x41\x90\x54\x05\xf7\x4b\x3d\xb4\x66\x21\x48\x91\xe7\xf0\xad\x08\xc7\x76\x9d\xf6\x5c\x1b\xdb\x72\x8d\x55\x73\x3b\xb9\x3c\xbb\xef\xc4\xa5\x58\xee\x84\x13\xb8\x66\x71\x44\x58\x1d\x91\x42\x99\x9e\xa7\x38\x9a\xa9\xd9\x77\xbd\xbf\x0e\x5d\xf5\xcf\xaf\x73\x56\xbd\x78\x8a\x54\x05\x71\x87\xaf\xfd\x6b\xe2\xb5\x2f\xda\x72\xd3\x2c\x13\xaa\xa1\xfb\xa5\x80\xa5\xd9\xa6\x35\x3d\xba\xa3\x67\x04\x5e\xfc\x3c\x83\xd5\x3b\x9e\xe2\x80\x8c\x85\x88\x8b\xb1\xe8\x22\xa0\x14\xab\x1a\x6d\x70\x3e\x47\x37\x66\x3e\xc8\x37\x5c\x81\x71\x62\xe9\x95\xff\x70\x0a\xd2\x9f\xab\x72\xaa\x8c\xfa\x07\xa2\x35\x52\x6f\x5a\xf1\x90\xb5\x6d\x48\x92\xa6\x7f\xf2\x19\xb7\x29\x6b\xf3\xdb\x1e\xad\xdf\x0d\x57\x69\x8b\xfb\xa9\x29\x7b\x8e\x33\x91\x85\x08\x7f\x68\xe1\xa5\x62\xee\xa0\x67\xf6\xf1\x96\xa9\x55\xb5\xc1\x35\xb9\x87\x95\x22\x5d\x8f\x1a\xfd\xd4\xe3\x9c\x3f\x11\xc1\x92\x4f\x51\x0e\xeb\x2d\xeb\x16\x16\x07\x5e\x9c\xfa\xc4\x14\xd5\xa3\xd4\x75\x54\xb5\xf5\xdc\x78\xcc\xa2\x59\xfb\x43\xcc\xef\x47\xb8\x74\x82\xe9\xa8\x61\xc0\x03\xfd\x04\xff\x9d\x7b\x7c\xfb\xd7\x33\x2d\xc0\xfc\xb8\xe0\x21\x78\xe7\xcc\x88\x75\x57\x3a\xcd\xf9\xb1\x81\x05\x92\xc7\x57\x9e\xa4\xf1\xf9\xf9\x88\x15\x69\xfd\x40\x63\x28\x3f\xa2\xce\xfd\x40\x59\xe6\x97\x41\xfc\x68\x0c\x40\xb8\xd1\xa9\x8e\xfe\x61\xf3\x85\x68\xcf\x1e\x89\x43\xb6\x66\x7a\x67\x43\xeb\xd6\x68\xe5\x3f\x8c\xae\xa8\x57\x66\x29\xfe\xe5\xf3\x1f\xb2\xd9\xbe\xd9\xee\x5d\x7f\xde\xc2\xe0\x6b\x6d\x75\x5f\x8c\x38\x83\xcc\xb8\x3e\x50\x16\x41\xb4\x4c\x44\x20\xa3\x60\xef\xcf\x43\x53\x5d\xcf\xae\x75\xbe\xd2\x4b\x31\x8f\xcc\xd7\x21\x71\x60\xbd\x1c\xc9\x9d\x6e\x23\xe6\xcb\x60\x4e\x92\xa0\x21\xf5\x5e\x7b\xdf\x82\x03\xf9\x62\xfd\x97\x93\x25\x5b\x9e\x59\x0e\xdd\x03\xe0\xd2\xa2\xcd\x0e\x55\xb3\x07\xaf\x1e\x13\x85\x3f\x54\x61\xfd\x87\xba\xe8\xdd\x1e\xea\x43\x95\xcd\xaa\xad\x75\x28\x7b\x7c\x58\xfa\x2c\x9f\xa4\x1a\x72\x00\xed\x86\xf9\xd6\xf4\x0b\x1c\x67\x19\x95\x6d\xf5\x23\x1d\xd1\x55\xe2\x27\xc3\x0c\xe7\x31\x0e\xc6\x87\xf9\x5b\x5b\x9d\x07\x15\x1a\x87\x29\x34\xba\x6c\x3c\x48\x80\xa3\xe7\x72\xf3\x9f\x92\xb2\x07\xd4\x7a\xb5\x65\x8a\xff\x9b\x4f\x91\xc1\xa1\x03\xb1\xa9\xb2\x7b\x8a\x59\xb9\x5f\xab\x58\x97\xaa\x19\x33\xef\xc2\xb0\xd3\x57\x14\xc1\x02\xfb\x21\xea\xd6\x2b\x2b\x80\x10\xaf\x7c\x0d\x3a\xe4\x9a\xda\xba\x09\xf0\x42\x8f\x7f\x0b\xfb\xe6\xe1\x0f\x5a\x73\xc8\xc3\x2c\xfe\x26\x4a\x81\xe4\x93\xa2\x0e\x2b\x1e\x69\x66\xaa\xd8\x96\x67\x7d\xf3\xc4\x3b\xb4\x51\x1e\xc9\x35\xad\xa2\x52\x5c\x55\x67\xd6\xa8\x69\xc0\xa8\xd9\xb7\x4a\x61\xc8\x96\x24\x4e\xdb\x98\x83\x9f\xe4\x98\xe3\xfe\xdd\x31\xdb\xd8\xd7\x5b\x29\x1b\xd4\x99\xff\x48\xa4\xa2\xea\xc1\x0a\x71\xc3\x61\xf4\x78\x74\x39\x2c\xeb\x4f\x49\x15\xf4\xb0\x67\x66\x71\x39\x35\x8f\x06\x20\xd8\x55\xc7\xeb\xcb\x4b\x3b\xf3\x99\x98\x55\x1f\xae\xc8\xde\xeb\x0b\xf5\x55\x7d\xf9\x8a\xa1\xaa\x1e\x04\x7a\x68\x94\xb8\x30\x59\x71\xdc\x85\x8e\xb0\x13\x9b\x86\xba\x73\x21\x95\x34\xc4\x84\xfb\x36\x2c\xee\x5d\x32\x43\x97\xbd\x97\x13\x30\x96\xbc\x2c\x3d\x74\x15\x58\xbf\xb5\x6e\x42\xac\xd0\x9e\xf2\xca\xc0\x75\xb0\x55\x60\x84\x60\x7a\xdb\x0c\x9f\x78\xa8\x7e\x3a\x3f\x5f\x30\x19\x99\xa3\x73\x50\x47\x6d\xc8\x4e\x3e\xe9\x7c\xe8\xb2\xdb\xd3\x2b\xbd\x9f\x3e\x84\x0d\x20\xe1\x2a\xb7\x72\x97\xde\x94\x97\x6c\xef\x9a\x65\x8a\xc6\x22\xae\xea\x94\xba\x08\x91\xc3\x88\x5a\xf7\x2d\xc1\x54\x19\xc4\x55\xb2\x46\x21\x17\x96\x7f\x82\x7f\xaa\x80\x6f\x28\x44\x5d\x45\x5e\x85\x34\xd8\x8f\x0a\xdd\xb9\x15\xba\x07\x28\x44\x29\x16\x1a\x00\xf6\x5f\xfb\xce\x64\x1e\x3f\x68\x3f\x1f\x6c\xb3\x7a\x7d\x94\xcf\xa7\xe8\x78\x47\x73\xb8\xdb\xf7\x24\xd5\xd8\xed\x00\x31\x47\x52\xb2\xdb\x11\x07\xc3\xb4\x59\x41\x66\xda\xa8\x4f\x61\x57\x6c\x11\x3b\x6c\x0b\x36\x29\xce\xae\xc1\x7f\x5d\xd7\xb6\xd1\xac\x1f\xd6\xf7\x73\x89\xeb\x61\x71\xba\xa5\xf3\xe9\x89\xe7\x26\xee\x69\xbd\x5c\x54\xca\xd3\xa6\x82\xba\x04\x5b\x2b\xe7\x23\x5d\xdd\xba\x14\x3a\xd8\x5d\xd4\xda\xf3\x5f\x1b\xbc\x24\xa2\x32\x68\xb0\x5c\x16\x79\xdf\x95\x14\x12\x5f\x4e\x80\x55\xb1\x3b\x32\x97\x16\x0d\xaa\x74\xab\x0e\x6c\x13\xd1\xae\x90\x1d\x9b\xae\x28\x5a\xbf\x69\x33\x57\xfe\xb9\x4f\x1e\x13\x2b\xb6\x60\xc9\xb9\x9c\x54\x64\x47\x8b\xc0\xcd\x60\xf6\xf0\x94\xb4\x0b\x2a\xdd\xe7\x2f\x07\x88\x5d\x69\xd2\x65\xdd\x4a\xae\xa8\x4d\x25\x62\xc8\x85\x38\xc7\x84\xa5\xc3\x3c\xd6\x97\x8d\x91\xe5\xec\x59\xed\xcc\x9f\xf1\x0b\xa0\x22\x7f\xb7\x0d\x71\x30\xf7\x66\x79\x3c\xb4\x22\xba\xd9\x1a\x4f\x2a\xc8\x42\x82\x4f\x22\xaf\x6e\xe1\xf6\xc3\x1a\xb9\x96\x8d\xb3\xd6\xfd\x49\xf9\x75\xe8\xf4\xbf\x2c\x58\xd4\x79\xc9\xbc\x5d\xbf\x14\x5a\x59\xed\xd9\xe8\x48\xe7\x98\xb3\x63\x5a\x3c\x4c\x75\x38\x25\xae\x9b\xde\xbb\x2e\x78\xaa\x9c\x9c\x59\xa0\xb2\x7f\x8a\x25\x1e\x7b\x1d\x1a\x3a\x1d\x19\xe6\x59\xfc\x20\x4e\x6c\x30\x93\x3a\x57\x4c\x3a\x09\x11\xe9\xd2\x1c\x42\xb3\x76\x05\x64\xa3\xe7\x82\x85\xf6\x1f\x6e\x95\xce\x47\x0b\xbd\xe1\x4e\x8e\x5b\x65\x8d\x1a\x0a\x68\xd0\x78\xeb\x3a\xa7\xae\x9e\xbf\xaa\x6e\x9f\xb9\x23\xcf\xdb\x69\xdf\xba\x32\xae\x11\x7b\x2b\x58\x05\xa4\xc3\x24\xfa\xcd\xa5\x8d\x37\x79\xee\xe8\xe5\x64\xbf\x07\x2f\xdd\x9e\x45\x72\x55\x82\xf1\x2e\xf1\xd0\x16\xb0\x0c\xbe\xd6\xa6\x83\x08\x9f\xed\x18\x5f\xdb\x2f\x19\x45\xd9\x73\x34\x80\xbf\x09\xc9\x85\xd0\x3d\x5a\xe6\x37\xf5\x3d\xd3\xb4\x06\xcc\x35\x0d\x65\x3d\x26\x9d\xc6\x30\x28\x35\x91\x7a\x0e\x6b\x52\xbb\x73\x09\xea\xbb\x64\xc7\x02\x72\xfd\xe3\x35\x75\x20\x88\x11\x65\xb6\x1a\x1f\x8c\x9b\x7a\x4f\xe0\x7e\xd2\x6b\xbe\xc8\xa5\xf9\x40\x3c\x9a\xeb\x22\xd5\xf6\xf6\x27\x43\xbd\x14\x34\x65\xd9\xd1\xbd\xf5\xfc\xbf\x4e\xde\x0c\x3b\x84\x40\xf4\x2f\xd4\x43\xc3\x5d\xe0\x35\x13\xc5\x0d\x15\xd8\xfd\x87\xba\xb1\xa5\x36\xe1\xd8\x39\x0a\xe8\x68\x5e\x6e\x45\xa9\x85\x2c\xc2\xdb\x93\x72\x44\x7d\xdc\x21\x01\x94\x7e\x05\x4b\x30\x0c\xff\x5c\x37\x5e\xe5\x76\x96\xca\xc3\xbe\x2f\x2d\xa1\x75\x0b\xe8\x6c\x51\xa4\xc9\x06\x39\x1c\x62\xcd\x6e\x71\xb0\x10\xef\x44\xa1\x83\x65\xfd\x94\x5c\x94\xb5\x9c\x07\x6b\x26\xcf\xb2\x2e\xfa\x77\xcf\x59\xb8\x30\x7b\x16\xe6\x1b\xc3\x5a\xae\xb5\x91\x71\x8c\xc8\x9f\xa0\xb4\x85\xab\x1f\x3b\xb3\xe7\x3c\x48\x4d\x96\xbf\xf5\x89\x32\x23\x2b\xee\xe7\x40\xe6\x09\x5c\xa5\x78\x2c\x8c\x73\x1c\xed\x8e\x64\x94\xca\xed\xa7\x2a\xf8\xe4\xd5\x7e\xed\x01\xf7\xc1\x13\x41\x4f\x60\xad\x83\x79\x2b\xf8\x7b\xfd\xba\x23\x03\xba\x68\xcd\xd2\xe8\xbe\x7d\xf5\x68\xaf\xcc\xfd\xe2\x24\xe6\xae\x5b\x93\xd7\x42\x92\x97\x53\x72\x18\xfc\x69\x78\x0f\x8b\x3f\xbf\xd9\x08\xac\x0d\x8b\x66\xc4\x3e\xfe\x8a\xb2\x0b\x87\x84\x42\x5b\x3e\x1b\xa8\x70\x14\x78\x63\x64\x23\xd7\x3e\x58\x34\xa9\x37\x03\x6d\xcb\xaf\xc6\x6d\x2d\x39\x29\xb5\xc5\x7b\xf9\xbb\x84\xf1\x06\xac\x00\x7d\xa4\xe5\x15\xf3\x2b\xc4\x66\xd9\x4d\xdd\x50\xa5\xf4\x03\xe5\x7f\x2c\x64\xdf\x00\xcf\xfa\xf3\x79\x03\x04\xaa\x8a\x39\x6a\x21\x0c\x56\x49\xda\xa0\x8a\xae\x75\x1b\x92\x90\x2c\xd4\x07\x90\xf7\xb6\x17\xc3\xbf\x54\x13\x76\x27\xfd\xbf\xb4\x6a\x43\x98\x26\xfa\x70\xc6\xe5\x6a\x1b\x29\xf6\x95\x73\x68\xd6\x5d\xaf\xe0\x75\xd6\x28\x24\x7a\x71\xdc\xeb\x8c\x95\x3e\x87\x60\x04\x8f\x62\xab\xda\xa5\x3f\xe4\x2f\x58\x31\xb1\xb7\x66\x96\x6a\xb4\xf5\xeb\x46\x38\x35\x0a\xa9\x5d\xe4\x4e\x24\x5f\x2f\x8d\x47\x49\xdd\xfa\xa3\x2e\x6c\x03\x1b\x39\x05\x72\x0e\x1f\x2e\xd7\x28\x88\xdb\x46\x51\x4e\x45\xac\xde\x09\xe4\x61\x95\xf5\xed\x32\x86\x87\x1e\xae\xa8\xb5\x13\x21\x59\x7b\x47\x6d\xc0\xa6\x68\x9f\x59\x15\xe9\x42\x67\xb7\x2b\xdc\x05\xbb\x72\x7b\x1b\x73\x6d\x44\x95\x5e\x84\x95\x63\x36\x27\x00\xd7\xf5\x1b\xc6\xe9\xb0\x8d\x98\x19\x60\x48\xc4\x3a\x02\x62\x5f\x60\x94\x32\xff\x09\x13\x43\x92\xb5\x51\x4a\x0d\x9e\xb1\xcd\xb1\x5b\xfe\xf9\xb2\x47\xa4\x70\xa9\xfa\x77\x09\x6a\x31\xd2\x4a\xbe\xcc\x32\x89\xb0\x48\x96\x29\x57\xfe\x27\x08\x40\x0e\xcb\x45\xa0\xa1\x7d\xb9\xba\x68\xe6\xe5\x69\x5d\x16\xc2\xf3\xd8\x88\x7d\xd0\x63\xe5\xef\xcb\xc9\x86\x39\x2a\x80\x97\x51\x04\x70\x1b\x42\xbf\x9b\x59\xa0\xb5\x2e\x1d\xa3\xda\x48\xc4\x6b\x4b\x46\xfb\x27\x49\xde\x9e\x02\x34\x80\xaa\xaf\x25\x0f\x37\xed\x55\x15\xef\x3d\xf0\xb6\x4e\x31\x1e\xee\x45\x3b\xb4\x21\x85\x3b\x16\x46\xe1\x1a\xa3\xdf\xa5\xf9\x17\xe6\xb6\x67\xb2\xc9\xab\x88\x08\x97\x3b\x2a\x7f\x14\xe1\x61\xd0\xea\xf4\xf0\x43\xa7\x77\xe6\x33\x65\x7d\xe0\x20\x0b\x43\xd5\xcb\x4f\x49\x01\xbb\x76\xee\x57\x3c\x77\x91\x71\xe1\xd9\x87\x50\xee\x58\x39\xdc\xf7\x8a\xba\xbc\x11\x63\xea\x70\x25\x3d\x80\xe7\x9b\x4f\xcc\x59\x9f\xf2\x23\x8c\x5e\xff\xac\x4c\xe5\x9d\x35\x3c\x35\x4e\x3a\xfa\x63\xbc\xc6\x2d\xc9\x50\xb5\x65\x50\x54\xcf\xd0\x61\xb3\x80\x2c\xe3\xd0\xc7\x80\x17\x62\x57\x64\x8b\xf8\x96\xa9\xaf\x45\x81\x41\x02\x2b\x17\x93\x0a\x39\x21\x92\x46\x5c\xae\x8c\x59\x98\x17\xcb\x8b\x37\xd1\x60\x37\x47\xb1\xbf\x74\x22\x9e\x53\x73\xd6\xbf\x9e\x65\x72\x7e\x36\xfd\xdb\xb9\x39\x1a\xce\xbd\x88\x11\x67\x54\x80\xcf\xfc\x71\x08\x0b\x50\x89\x82\x02\xe4\xf9\x6e\xc6\x86\xfb\xc0\x55\x2e\x09\x06\x1b\xc3\xb9\x57\x10\x1b\x87\xa8\x6f\x4e\xaa\x9b\x5f\x2a\xc7\xdf\x93\x17\xd0\xc1\x6b\xd6\x4f\x4d\x9b\xd0\x03\x09\x63\x0c\x0f\x46\x55\xe2\xf1\x18\x40\xc6\xe3\xd6\x94\x41\xb1\x22\x76\xa5\xae\xdf\xe9\xf7\x03\x95\x78\x49\x10\x1f\x00\x8f\xa9\xa8\x5c\xcf\x81\xaa\xbc\x75\xdb\x58\x31\x3a\x6a\x54\x8c\xab\x28\xbd\x77\x08\xd1\x9e\x9f\x77\x47\xb6\xa0\xd3\xa4\xfc\xb0\x80\x82\xbe\xa4\xbf\x6b\x27\xe5\x69\x99\xa3\x54\x32\x3a\x8f\x36\x67\x3e\x7c\x76\xeb\xbb\x16\xaf\x3c\xb0\x94\xcf\x77\xc8\x35\x7a\xfd\xcc\x66\xcd\xaf\x0e\xf8\x16\x73\x14\x72\xcc\x1a\x3f\x1d\x73\xa4\x64\x8f\x39\x0c\xef\x2d\x62\x71\x9e\x08\xbb\x63\x1e\xa9\xa7\x64\xbd\x92\x18\x94\xa8\xdb\x13\x40\x2e\xd6\x73\x54\xec\x27\x78\x60\x23\x7e\xac\x55\xb6\x9d\xc7\xc3\x06\x19\x2a\xcb\xb9\xba\x6f\x27\x9a\x75\xd0\xa1\x51\xd3\x17\x42\xc0\x9e\x0f\x9d\x8c\x5b\xdb\x69\x5d\x69\x6c\x69\xe1\x37\x0e\x0e\x97\x6d\x41\x52\x22\xc8\x55\xc1\x99\xde\xf7\xf7\xab\x71\xaa\x77\xda\x32\xa2\xc5\x90\x1e\xca\xd1\x20\x02\x83\x34\x67\x9d\x53\x7d\x29\x10\x85\xe5\x48\x02\x40\x48\x78\xf4\xb0\x71\xfb\xc6\x8d\x8b\x80\xa7\x30\x65\xb4\x4e\xa2\x13\x78\x60\x67\xe5\xee\xb0\x31\xb0\xdf\xb6\xf2\x49\xde\x75\x94\xd7\x4e\xfc\xbd\x8b\xff\x12\xf5\x69\x37\x92\xcf\x75\x51\x26\xc1\x75\xaa\x1c\x21\xa0\x9e\xb4\x2c\xac\x3d\xc1\xff\xc9\x7f\x42\xc9\xd4\xee\xdf\x09\x26\xe0\xfd\x44\xfd\xdf\xbb\x04\x04\x1c\xad\xed\x25\x5a\xb5\xbd\x74\x9c\xd2\x58\x47\xf6\x2a\x6a\x6a\xdc\xa6\x91\x7c\x67\xbd\xaf\x7b\x56\xf2\x66\xcf\x71\xd4\xa4\x67\x0a\x22\x1d\xd2\x0a\x4e\x2c\x97\xd7\x4b\x15\xed\x2a\x9d\x0f\x57\xf8\x3c\x19\xec\xc1\x90\xb6\x7e\x44\x25\x7a\x87\xb5\x4f\x94\x53\x2d\x52\xef\xb0\xa0\x0b\x2a\x35\x73\x2f\x5e\xc2\xcf\xdf\x7a\x7c\x55\x8d\x3e\xbf\x8f\xf0\x32\x2c\x54\xc0\xd9\x8a\x44\xb7\xb7\xa2\x1b\xb4\xd1\xc5\x66\x43\xeb\x1b\xe9\x3e\xfb\xf0\x2d\xca\xce\x67\xab\xda\x41\x29\x58\x72\xc0\x3b\x0d\x0d\xec\xe5\xf4\xf7\x74\x03\x0a\x99\x95\xfc\x25\x26\x16\x20\x50\x8b\x77\xb6\xe1\x2e\x90\x38\x6d\x4f\xa5\x34\x8e\x6d\x60\x55\xb4\x4e\xc5\xef\xbc\xee\x6f\xd6\xee\x07\x11\xa0\xa5\xc8\xbe\xf5\x4f\x52\xc5\x31\x5b\x3d\xa9\xc3\xef\x71\x68\xfa\xd6\x3e\x45\xa1\xbd\x95\xca\x97\x39\xe8\x57\xce\xb5\xde\xc5\xa3\x76\x27\x48\x8f\xc6\xb3\x10\x3d\xd0\xbb\x5d\x43\x93\xff\x5d\x53\xc0\x0a\xfa\x71\x7e\x46\xa9\x7f\xb4\x91\x44\x28\x01\xf7\x35\x0a\x65\x1e\x2b\x38\xdf\x00\xfb\x31\x2e\x5f\x45\x5f\xeb\x31\x1b\x43\xdb\x7e\x56\xec\x96\x36\x6d\x60\x17\x4e\xf7\x04\xae\x89\x73\x96\xa3\xa6\xcd\x92\x55\x5a\xb7\x97\x97\xd3\xb0\x2d\x51\xfa\x45\x9e\x9c\xe9\x0a\x17\x49\x2f\xeb\x33\x6a\x0c\x70\x8c\xfa\x57\x56\x02\x11\x0b\xb5\xbc\x01\xa3\x24\x0d\x72\xc0\x13\x78\xad\xd2\x2c\xbc\xce\x06\xe7\x0a\x21\x0b\xb2\xd8\xdc\x83\x1a\x35\x28\xf5\xca\x41\x06\xda\x4d\xc4\xee\xa3\x80\x1f\xec\x70\x66\xda\xd7\x37\xe7\xf4\x28\xd5\x3b\x09\xcf\x63\xa7\x63\xaf\x75\x91\x69\x65\x15\x95\xd8\xda\xf2\x25\xc7\x00\x75\xad\x6e\xab\xa1\x61\xe5\x5a\x9d\x9e\x63\x0b\x15\xa4\xad\x77\x22\x95\x98\x72\xbf\xe4\x5a\xbf\x72\xd4\xfd\x43\xe0\x57\xa6\x8e\x6b\x71\xc7\x5b\x8f\x68\xe7\x0c\x14\x26\x39\xd6\x4f\x95\xb1\x67\xf9\xc2\xac\x52\xf1\x41\x02\x40\x45\x6c\xf8\x65\xbe\x7e\x1a\x3e\x40\xf0\x00\xd1\x95\x67\x9c\xa7\x28\xd4\xfe\x73\xf2\xb5\xcf\xe1\x22\x02\x99\x71\x12\xa8\xf1\xd2\x91\x04\x4d\x02\xdc\x1a\x45\xd5\x15\x9c\xa6\x9d\xc1\xb6\xd4\x89\xf4\xe9\x38\x56\x5e\xb8\x53\xe0\x84\x6d\x58\x7f\xfd\xf1\xd0\x64\x21\x1d\x52\x33\xd2\x81\xe1\xe7\x71\x8a\x82\xc6\xea\x88\x45\x95\x21\xfd\xc3\x7e\x85\x5e\xcc\xea\xd9\x47\x15\xf6\xcf\x22\x75\x65\xb4\xcd\x39\xa2\xfe\x2b\x20\x7c\xe4\xf7\x29\x92\x2f\xa4\xfa\xce\xa0\x4c\x8b\xdb\x2d\x54\x9a\x1d\x5b\x87\x79\x00\x73\x58\xe6\x20\x4a\x27\x51\xb2\x21\x2b\x48\xe8\x81\xeb\x47\x79\xb3\xb2\xbc\xa5\xff\x0b\x15\x61\x31\x8f\xc1\xf7\xf6\x5a\x73\xcd\x7c\x87\x9d\x24\xdd\x74\x80\x91\xc3\x0d\xc8\x0a\x3f\x10\x00\x20\xec\xc7\xe2\xb5\x44\xdf\x9f\x12\x70\xb6\xe8\x3a\x7e\x93\xe5\xd9\xb4\x9c\xe2\x11\x2c\x25\x30\x31\x16\xa5\xe5\x4b\xae\xbe\xe8\x9d\x59\x0e\x0e\x64\x96\xb2\x2f\x85\xd0\x80\x7c\x08\x60\xb9\x34\x89\x1e\x44\x3f\xce\xbf\x76\x1c\x07\x14\x8c\x1d\x88\xeb\x44\x6c\xdf\x1d\x19\x64\xd5\xfe\x77\x7e\x03\x39\x3e\x0f\x12\x7d\x42\xe7\x56\x43\x5c\xc8\xa1\xc0\x38\x38\x4a\xfa\xe7\x12\x35\x4d\x8b\xfb\x49\xf3\x92\x25\x06\x54\x78\x31\xf9\x8b\x71\x0d\xf4\xe2\x2f\x21\x16\x60\x81\xd0\x0d\xa8\xcd\xc8\xea\x34\x2c\x5f\x17\x48\xc8\x24\x05\x3e\xb2\x70\x88\x00\x4b\xfd\x67\xe6\xb8\x65\xc9\x8d\xf0\x1d\x2f\x06\x1a\x52\xcc\x5b\x5e\x3f\xc2\x0b\x08\x2e\xb0\x46\x4a\x76\xc9\x1a\x34\x81\x0b\x2e\x11\xe6\xca\xe1\xcd\x22\x09\x80\x25\xd8\x45\x8b\x94\x1d\x17\x66\xea\xac\x71\xf8\x94\x3f\x3a\xcd\xfd\x67\x0b\x19\x3e\x00\x07\xfc\xc6\xfd\x96\x33\xca\xa9\x36\x15\xf4\x44\xd7\xaf\x4d\x28\x73\x6c\x97\x01\x9f\x3e\x29\xdd\x7c\x4a\x4d\xee\xd7\xc6\xa6\xc3\x27\x70\x25\xb0\x06\x72\x77\x51\xf9\x7f\xd9\x3c\xd6\x7d\xa4\x9c\x5a\xbe\x39\x59\xcb\x09\xe7\x12\x39\x95\x46\xf0\xbb\x09\xfa\xbe\xd5\xd0\x4c\xef\xe0\xd8\x4f\x50\xd0\xf5\xe5\x1e\x92\xce\x91\xfa\x98\xaa\x2b\x74\x6b\x8f\x02\x00\x9f\x9c\x4b\x6f\xc1\x05\xc4\xb2\x26\xfc\x61\x2a\x02\x1e\x4c\x2b\xc1\x08\x83\xe4\x9b\x6d\x1c\xc1\x3c\xd8\x34\xff\xfb\x8a\x85\x4e\x36\xc3\x76\xd7\x16\x0b\xbc\xee\x03\x59\x37\x02\x8d\x26\xd8\x15\x84\x2d\x01\xca\x1b\x61\x62\x3a\x46\x59\x3e\x9f\x5f\xde\xf9\x99\x04\x50\x80\x6e\x80\xa6\xb3\xfc\xb0\x70\x5b\xc9\x01\xca\xb1\x54\x0e\xaa\xf9\xaf\x7b\xe9\x18\x0e\xa5\xf3\x25\x7c\xc1\xdc\x38\xf1\x74\xa9\x9d\x32\xf5\x14\x26\x9f\x5a\xfa\x9a\xf4\xb2\x19\x1b\xcd\x57\xd1\xb4\x49\x64\xb9\x86\x02\xb3\xcd\xff\xc9\x2f\x0f\x9b\xb1\x89\xb6\x8e\x13\xdf\x1d\x64\x9a\x88\x7c\xb7\x48\xe7\x94\xc8\x1b\xb7\xa5\x68\xe8\xdb\xe9\xf3\x1c\xa8\x32\x37\x68\x03\x21\xa9\x8e\x50\xe8\xaa\x58\xee\x1d\x29\x30\x76\xc7\x3f\x03\x3d\x4b\x09\x59\x1b\x6b\x02\x29\x94\xe9\xd5\xf1\x6c\x62\x65\xa3\xcd\xce\xfc\x30\x6e\x53\xaa\x4c\x9d\x13\xd1\x7d\x19\x12\xdc\x22\xa4\x4b\x9a\x39\x7d\x98\xe8\xb4\x48\xb5\x60\x8b\x82\xa2\x3c\x86\x71\x61\xe8\x2e\x0b\xf5\x60\xcd\xb5\x9f\x59\x99\xf8\xf9\xf1\xd8\x25\xcf\x2c\x3b\xac\x71\xbe\x45\x5e\x0f\xf7\x09\xe0\x22\xde\xe1\x5c\x6a\xaf\x66\x09\x5f\xd3\xc6\x91\x03\x5c\xc2\xff\xe9\x0c\x90\x2a\x4f\x6f\xce\x5d\xec\x2e\xe8\x02\x0a\xe9\xbe\x3c\xed\xb7\xfa\xf4\x1b\x79\xef\x3d\xd0\x13\x9a\xf7\x8c\x59\xed\xf5\xc8\xe2\xd5\x88\x11\x4b\x90\xd5\x6f\x4a\x6e\x00\x37\x11\x66\xa9\x1c\x60\x80\xda\xae\x23\x21\xfb\x28\xcc\x05\x06\x9b\x52\x1a\x1a\xd3\xa6\x63\x6c\x9a\x4a\x8e\x2e\x44\xe4\x01\xe4\x7b\x44\xa4\x4f\x0e\x21\xa8\x85\x4c\x75\xcf\x97\xbd\x04\xfe\x7a\xd8\x24\x80\x1c\x71\xeb\x2f\x58\x2f\x0b\xe5\xdd\x49\x00\x87\x72\x6a\x68\x4c\x5d\x0f\x79\x2e\x3e\x30\xa2\x78\x47\xe0\xcb\xcc\x09\xeb\x23\x54\x66\x1e\x71\xb1\x1f\x48\x61\x2b\x1d\xfc\x98\xed\x66\xdf\xfc\x7a\xa4\x08\xe7\x63\x6e\x10\x89\x39\xf0\x6b\x0f\x55\x5b\x1e\xe9\x25\x17\xd6\xf4\xea\x28\x19\x02\x02\xbb\xd4\xa6\xc3\x23\x0c\xa8\x88\x91\x80\x0a\xeb\x05\x9a\x07\x6c\x9a\x66\x22\x25\x3a\x39\x90\xe5\x67\x78\xe1\xe6\x7a\xf3\x2d\xcc\xd7\x14\x0f\x6c\x96\x15\x61\x3e\x94\x1f\xcf\x10\x51\x0b\x49\x62\xa4\x52\x56\xc9\x43\xe5\xed\x7a\xa9\x8c\xd2\xe0\x46\x8e\x96\xe5\x30\x36\xab\xa3\xc9\x0f\x6f\x73\x72\xf3\xd5\x42\x99\x92\xb7\x2c\xf7\x02\x67\xf4\xf0\x46\xa6\x04\x58\xee\x02\x37\x93\xd3\x39\x65\xf1\xa8\x05\x03\x1b\xde\x2a\xa8\x0c\x6f\x14\x5e\x11\x40\xb4\x91\xb5\xf9\x3a\x11\xde\x60\xef\x30\x39\xf0\xb5\x3b\x03\xe1\xc0\x11\x39\xdc\x58\x45\x98\x7f\x73\xf1\x12\xc1\xfd\xcc\xcd\x71\xf5\x99\x08\x7e\x38\x75\x01\xa1\x21\x4d\x85\xe5\xb2\xf3\xfd\x71\x2e\xbd\x52\x89\x43\xa1\x34\x74\xc9\x37\x9b\xe8\xa1\x10\x84\x66\xdd\x4f\x27\x29\xe8\x66\x8f\x0f\x54\x6b\x42\xf3\xff\xfe\xfb\xc1\x63\xb1\xe6\x75\x16\x73\x8e\x52\x00\x1e\xf2\x31\x8b\x7b\x2f\x2c\xfe\x80\xe7\x32\x09\x72\xe1\x3a\xd3\x24\xcf\xef\x41\x78\xdf\xde\xe2\xb4\x37\xe6\x3c\xdc\x6d\x08\x65\x58\xe7\x60\xf2\xdb\x10\xb2\x12\x19\x31\x33\xdf\x3b\x64\xb9\x62\x0e\xd9\xa5\x76\x15\x52\x90\xf6\xc7\xf1\x0a\xa8\xf5\x1d\x6c\x02\x07\x3c\x77\x42\x2e\xc8\x00\xd7\x1a\x5a\xc9\xe2\xc3\xe3\x95\x6c\x34\x9b\x01\x84\xed\xbc\xbd\x64\xd0\xd6\x66\xd4\xb0\x0d\x60\x28\xb0\x7e\x5c\x9d\xb0\xce\x70\x3b\xae\xaf\xcd\x2b\x89\xf3\xa2\xc1\xf6\x67\xfd\x48\xa3\xda\x46\x5d\xf2\x7a\xe9\xcf\x39\xee\x88\x85\x1b\x97\x59\x48\x25\x8b\xb4\x4c\xef\x90\xe5\x23\xd0\x41\x06\xad\x6f\xca\x53\xd7\xd3\x0d\x59\x33\x3f\x3c\x12\xbf\x3c\x9d\x45\x52\x18\x1f\x1c\xd2\xd8\xbc\x2d\xa0\x31\x7d\xa1\x58\x6c\xcf\xd9\x03\x64\xab\xfd\x39\xe8\x51\x09\xdb\x03\xb2\xf0\x54\xd9\xc6\xc2\xf0\xcb\x06\x6c\x01\xb9\xaa\x3d\x90\x0b\x30\xc5\xfd\x83\x43\xe0\xa4\x15\x67\x44\x06\x73\x3f\x85\x8d\x54\xaf\x17\xd0\xf1\xde\x3b\x8b\xd1\xee\xfe\xba\x33\x4b\xe3\x40\x01\xe1\x03\xce\xca\x9a\x50\xef\x77\x4b\x65\xfe\xa3\xa9\x59\x7b\x96\x86\xe5\x79\xdb\x99\xb5\xf8\xbd\xd7\x76\x4c\x41\x73\xc3\x35\x76\x66\xb9\xda\x86\x3f\xe1\x5d\x5a\xcf\x4e\x33\x8a\xae\xae\x0f\x55\xd7\xe9\x81\x5a\x87\xef\x7c\xc7\xc5\xa6\x59\x23\x57\x51\xde\xc5\xc6\x55\x51\x2f\x83\x35\xde\x8d\x94\xde\x2f\x4d\xa1\x7a\x1e\x9b\x9b\xab\x3c\x4a\xec\xa5\x6e\x52\xd5\x7c\x12\xbb\xb3\xd9\xb1\xd6\x7b\x1e\x49\xb9\x3f\xa3\x44\x7c\xd2\x03\xb1\x49\x22\x43\xec\xdf\x8f\x5d\x84\xa0\xeb\x6c\x28\x29\x8e\x7d\xa1\x88\x76\xd1\xe0\xae\x53\xeb\x8e\x1c\x6e\x24\xdc\x1c\x45\x11\x37\xdf\x3e\xf0\xbf\x95\x66\x9e\xaa\x79\x4d\x57\x68\xfb\xd4\xc1\x62\x5c\xff\xb9\xf8\x58\xca\x23\x6b\x3f\x68\xdd\x0a\x49\x2f\xd6\xec\xa3\xd3\xb7\x48\x06\x37\xac\xd5\x33\x61\x05\xa9\xeb\xa8\xda\xfb\xb5\x9d\x9b\x02\x34\x87\xa0\xd7\x4a\x7a\x7b\x1a\xe7\x22\x02\xba\x06\x8f\x18\x59\xaa\xf6\xec\x0a\xd8\xca\xab\x39\xc9\x5d\xb5\x7c\x49\x65\x50\x04\xfb\x87\x25\xfd\x28\xce\xef\x03\xc6\x92\x1e\xae\xb7\x0d\x70\x78\x9c\x20\x2b\x76\x5f\xdb\xd8\x3f\x30\xc9\x2e\x8f\x84\x06\xa4\x37\xeb\xe3\x9d\x75\xf0\xce\x86\x0f\x30\x0b\x04\xaf\xf5\x4e\xa8\x81\x11\xe3\xbe\xb5\x36\x5e\xcf\x2f\x52\x2f\x4f\xe7\x92\x54\xe4\x97\x79\x6d\x0a\xae\xbe\x8c\x50\x3b\x97\x69\xf0\x6b\xea\xb8\x92\x60\xd4\x87\xce\x36\x2d\x9e\xba\x06\x8c\x00\x83\x86\x47\xb4\x3e\x9e\x5d\x75\x87\x2e\xf2\x74\xd3\xd6\x37\x2d\x50\x43\xf2\x0e\xda\xd7\x58\xbc\x44\x8b\x87\x0c\xf2\x8f\x83\x05\x1a\x99\x25\xb9\x17\x9f\x98\xe9\x55\x7a\x30\x90\x5c\xf1\x05\xc6\x11\xaa\xa3\x87\xef\xa9\x5d\x00\x8e\x85\x5d\x48\x3e\xe6\x0d\x18\x43\xfa\x7f\x3e\x77\xb9\xe9\x41\x67\x77\x24\x32\x25\xf1\x71\x44\xb9\x83\xdb\xf4\x60\xf1\x72\x76\x9e\x1c\x3d\x4d\xfa\x7d\x58\x42\x03\x6a\xc0\xa3\x6d\xef\x7f\xbe\x98\x03\x6f\xc0\xd7\x19\xe8\x08\x19\xd6\x1e\x0d\x36\xc0\xe5\x4c\xea\x69\x9a\xf5\x6c\xa4\xf1\xb6\x3e\xe4\xf0\xc8\x6e\x2b\x87\x12\xc8\xef\xf8\x12\x8e\x89\x7e\x60\xf8\x5a\xc9\xa2\x56\x4b\x20\x72\xfc\xda\x27\x3e\x5b\x42\x6e\x42\x64\x3b\x88\xf8\x23\xd9\xfd\x7a\x01\x3e\xae\xd2\xb4\x2a\x22\x70\x60\xfb\xf8\x73\xf0\x61\xf2\xf5\x5d\x4f\xa7\x0d\xd9\x92\xd7\xd9\x9e\xb2\x85\x3d\xe8\x3b\xab\x9c\xfd\xce\x29\x40\x05\xe7\x17\x5d\xe0\x8b\x89\x0b\x76\x5a\xb6\x74\x5b\x09\xf4\x51\x4d\xfd\xd0\x55\x71\x14\x7c\xeb\x67\xaf\xf2\x7b\xf7\xd4\x5a\x7f\xed\x2e\xcf\x46\xe6\xfe\x2c\xed\xee\x5d\xb4\x65\x8b\xe4\x1b\x3b\x87\xbe\xb6\x17\x5f\x9c\x45\xef\x0f\x1b\x01\x0a\x28\x93\xf9\x95\x79\x21\x23\x41\x2c\x02\x26\x66\x12\xe7\xde\x6f\x3d\x01\x2f\xa7\x65\xff\xd0\xb0\x96\xae\x2d\xfc\x3f\x6d\x68\xfd\xca\xb1\x26\xf9\x4c\xec\xe5\xaf\x19\xc5\xbc\x1b\xd2\xe3\x95\x54\xa7\x7a\xa5\xc6\x14\x02\x0a\xc1\x2b\xfa\xd6\x2a\x90\xa8\xbf\xb2\x5a\x42\x79\xee\x70\xa7\x85\xcf\x79\xd8\xd6\xf2\x3f\x41\x2f\x50\xd6\xb4\x73\x62\xfe\xea\x89\x5f\xb1\x08\x80\x00\xa2\xf3\xc8\x90\xc0\x83\x73\x2a\xd2\x16\x7c\xa2\xf0\xa4\xa3\x39\x0c\xc1\x37\x88\xa2\xe2\x13\x5a\x52\x00\x3a\x30\xeb\x0b\xe3\x5b\x5f\xd8\xcc\x4d\x4f\xa2\xc5\xcf\x52\xce\x49\xfa\xde\xfb\x24\xfc\xba\x6b\x04\xbc\x03\xb2\x60\x73\x91\x52\xa4\xf7\xed\x48\x1b\xc9\x41\x3d\xc3\x54\x13\x58\x53\x29\x8b\x43\xb1\xc4\x96\x35\x14\x8d\xea\x79\x39\xda\xa9\xa2\x46\xe6\xc1\xa1\x9c\xca\x5d\x05\x7f\xbd\x83\x5a\x67\xc1\xde\x69\xa8\x68\xb1\xdf\xf7\x1b\xf2\x35\x8e\x1d\xe0\xb4\xf1\x46\xd5\x90\xdd\xa5\x8d\x81\x8f\x4c\x91\x80\x12\x39\x68\xd8\xe8\x36\xf3\xdc\x46\xa0\x77\xbc\x19\x64\x46\x7f\xa4\x3b\xee\x4f\x08\x64\xc7\x6b\xfe\x09\xfd\x71\x04\xe5\x22\xac\x21\x39\xac\x20\x6a\x67\xb7\x8b\x1f\x13\xe6\xb0\x95\xdb\x1b\xd7\x7b\x16\x0d\xc7\x66\x5b\xfc\x6a\x0a\x87\xe6\xdb\x39\x06\x42\x12\xdf\x53\x16\x80\x21\xd2\x5f\x77\x5e\xea\xea\x1d\xda\x9d\x7f\x39\x0a\xb9\x95\x36\x93\x40\x80\xaf\x4a\xe7\xc1\x7f\xee\xe3\x3b\xbe\x4b\x30\xe8\x95\x5e\xc6\xf5\x71\x50\xdd\xf5\xb6\x43\x5d\x54\x02\x40\x02\x55\x86\xbc\x39\xb5\xfe\xe3\x72\xd6\xf6\xa2\x28\x56\x59\x13\xaa\xca\x79\xf5\x9f\x7c\x55\xaf\xf7\x7b\xe1\xb7\x52\xfd\x84\x58\x88\x61\xc8\x12\x21\xaf\x40\x34\x29\x54\x5e\x18\xf8\x06\x91\xf9\xad\x71\xfc\xf2\xfd\x0b\x07\xfe\x16\x08\xd0\x60\x8f\xc9\x24\x9c\xc4\x1c\x76\xb2\xb7\x3a\xfe\x0b\x4a\xee\xea\x05\xae\xdb\x26\x7b\x55\xd0\x07\x29\x86\xc3\x96\x42\x58\x87\x3e\xc6\xb7\x97\x74\x8b\xae\x5b\x19\x06\x0b\x94\xbb\xbd\x5c\xe7\x9d\x05\x7d\xf4\x5c\xf6\x12\xb0\xc4\xfd\x9f\x1b\x1c\xd0\x43\xf8\x38\x9f\xd2\x53\x87\x09\x69\x44\x3e\xf2\xb9\x8e\xa2\x5a\xfa\xc1\x79\xe8\x75\xb8\x42\xa8\x90\x14\xb9\xa9\x07\x90\x49\x86\x25\x53\x77\xd0\x11\x18\xb9\x1c\xf7\x1a\xda\x01\xd7\xd7\x4e\xf8\xe4\x8d\x2b\x9a\xd4\x21\x2b\xec\xb8\xa5\x0b\x0d\x23\x61\x07\x85\x33\xe6\x6b\xd7\xc1\xb7\x33\x2f\x64\xb5\x6f\x85\xed\x81\x8d\x4d\x42\x53\x00\x1c\x3c\x26\xe5\xed\x85\x24\xc5\x1f\x72\x9e\x0b\x83\x00\x16\x2c\xb3\x04\xe0\x97\xec\xa9\x1d\x94\xb4\x88\xcd\xb0\xe6\xf1\x62\x10\x2c\xfd\x39\x7e\xa7\x84\x62\xaf\x79\x13\x26\x66\xce\xe3\x1f\x11\x78\x39\x0d\xdb\x00\xbe\x51\xa5\xe0\xf2\x71\x84\x00\x7c\x49\x42\x73\xa0\x04\x1e\x70\x8e\x8d\xf8\xe8\x4b\xe2\xe2\xd7\x17\xe4\x30\xe5\x2d\xbc\x91\xa7\xac\xde\xef\xca\x1a\xa1\x5f\x98\x79\xf1\x44\x51\xe6\x22\x8c\xc3\xde\x20\x5d\x55\x81\xa4\xae\xdc\xf2\x2c\x2e\x60\x70\x46\xa0\x2c\x81\xc3\x38\x7e\x84\xbf\xc8\x57\xd3\x7b\x5f\x9b\x0a\x7c\x13\x44\x02\xe6\xa2\xfb\xca\x16\xa4\x80\x5b\x1c\x94\xe8\x00\x8e\x42\xcb\xd8\x21\x55\x21\x40\xfc\xa2\xd3\xbe\xd9\x3a\xf8\x59\x9a\xed\xc8\x37\x49\xd1\xfd\xf0\xd6\x9c\xd7\x21\xed\x5b\x58\x71\x59\xbc\xd6\x39\xa4\x0d\x6e\x2d\xc3\x84\x00\xee\x66\x5c\x47\x5d\xfd\xb4\x72\xf5\xc2\x6c\x3f\x54\x33\xfd\x12\xa4\xbe\x51\xf0\x60\x7c\x58\x37\x05\xb3\x96\x9e\x3b\x38\x4b\x50\x82\x4e\x6a\x72\xc1\x47\x40\x6f\x3e\x30\x14\x4d\xc0\x20\xf4\xeb\xe5\x62\xdc\xcb\xc5\x38\xe9\x71\xf6\x70\x6e\x2b\xb9\x6a\x0e\x3f\x64\xd9\x18\xd3\xea\x00\xca\x58\x7f\xcd\x92\xc1\x07\xf8\xa1\x34\x82\x30\xf1\xee\x32\xf4\x62\x20\x17\x74\x69\xc2\xa1\xc2\x10\x81\x6c\x98\x21\xbb\x42\x14\x46\x97\x2a\x2d\x90\x69\x64\x04\x55\x2d\xbb\x25\x0c\x25\xa5\x7b\x5a\x37\xaf\x94\x2c\x42\xb9\x1f\x4b\x79\xc5\xda\x2c\xf9\x20\xa7\x4b\x82\x08\x3b\xaf\x9a\x80\x64\x2e\xc5\x25\xf4\x85\xf6\xf8\x8d\x49\x18\x10\xfd\x42\xd5\x9d\x54\x5c\x75\xf3\x63\xff\x07\x89\xf2\xb9\x48\x86\xef\x9e\x31\x3a\x44\xb6\x3c\xea\xad\xde\xef\x60\x42\xe3\xc0\x45\xf2\x7a\xbf\xfd\x9c\x37\x83\xdc\xf4\x0f\xee\x00\x56\x74\x04\x49\xbc\x85\xa0\x78\x45\xc1\xd7\xc1\x14\x34\x5f\x3a\x50\x5a\xba\x25\x77\x20\x3e\xff\x51\x34\x25\x3d\xa0\xa1\xec\x4b\x02\xf1\xc1\x50\x65\x95\xe3\x98\x05\xa9\xd8\x35\xd0\x3a\xe0\x2c\x2d\x0c\xc5\x4a\xdc\xfd\xa1\x96\xda\x96\x49\xfa\xf3\x23\xd5\xb1\x80\xae\x68\xe5\x03\x48\xcf\x6f\x21\x53\x07\xb4\x85\xee\x2e\xf4\x11\x84\xe0\xb0\x77\xde\x2d\x53\x8f\x4c\x2d\x9f\xe3\xef\xee\x70\x49\xc6\x50\x85\x40\x0b\x81\x18\x60\x02\x16\x50\x8a\x43\x46\x66\x88\x74\xc0\xbc\x3f\xc2\x8a\xd9\xc6\x09\xf7\xac\xef\x63\x22\x75\x64\x2f\x7f\xfd\x10\x3b\xd1\xac\x8f\x6b\x08\xce\x23\x0b\x4a\x08\xc4\x45\x29\x87\x44\x3d\x2f\x17\x51\x60\x4d\x0e\x32\x2a\x0e\x44\xb1\x9e\x86\x57\x21\xf5\xed\x40\xb0\x73\x70\xcc\x83\x20\xfa\x58\xf2\xce\x94\xaa\xb6\xb4\x5c\x5f\x91\xf9\x2f\x92\x13\x4a\xb5\xbb\x38\x84\x65\x62\x6e\xbe\x50\x1d\x1a\xd1\x50\x5d\xea\x05\xf2\x09\xd2\x4a\x78\xb1\xb8\x08\xd4\xc4\x5a\xa5\xa8\xd0\x69\xfa\x63\x91\x57\x6a\xf6\x39\x66\x4d\x3b\xf2\x9e\x7a\x46\xf6\xb9\x13\xab\x62\xcf\xaf\x2e\x52\x71\x7b\xde\x88\x36\xdc\x33\x4a\xff\x81\x99\x78\x12\x7e\x81\x0c\x88\xb7\x1b\x16\xc5\xbf\x73\x38\x89\xf7\x88\x7b\x5a\x88\x7f\xb2\x20\x39\x3c\xc3\xe3\x66\x7e\x6c\xd3\xb7\x93\xa9\xd5\xad\x52\x43\xa0\x2a\xe7\xb1\x41\x32\xbf\xb1\x62\x70\x38\xd1\xe4\x8b\xf4\x9b\xb6\xa2\x0a\x52\xb3\x58\x26\x86\x62\xbf\xac\x35\x9d\x85\xb7\x50\xfb\x62\xd1\x6f\xe6\x52\x84\xed\xcd\xde\x2d\x61\x2e\x24\xcb\xb7\x15\x8e\xac\x80\xaf\xf0\xd9\xc6\x26\x19\x52\x2c\x57\x29\xd3\x53\xe0\x70\x0b\xc8\xd1\x36\xaf\xc2\x2b\x00\x4c\x44\xa1\x7d\xbf\x9e\x3c\x31\x4c\x3a\xbe\x2e\xbf\xf9\x82\x8c\x3f\x41\x15\x6e\x6e\x46\xa5\x83\xb0\xea\x71\x18\x06\x71\x15\x02\x98\x84\xb1\x2d\x3c\x9b\x2f\x2d\xfd\x57\xe4\x6d\x2b\x01\xca\xa0\xfe\xe4\x96\x03\x20\xb1\xff\x91\x3a\x40\x16\x4d\x18\x8c\x2f\xc4\x02\x05\x6f\x1a\x1f\xaf\xca\x66\x4a\xed\xfe\xad\x50\xba\xf4\x0b\xb8\x02\xda\x7d\xbe\x92\xa3\xd7\x2c\xe2\x0e\x63\x9d\x25\x7f\xe0\xa2\x00\x84\x6c\x3c\x52\xd3\x6b\xa5\x82\x42\x88\x32\xe4\xf5\x4c\x4f\x1e\x1e\x59\x5c\x3a\xcc\xcb\x83\x99\x91\xf8\x49\xef\xff\xf9\x14\x18\x8d\xaf\xb5\xdc\xd6\x77\xb9\x69\x2b\x10\x1c\x71\xbf\x09\x2e\xb1\x0e\x75\x9a\x73\x68\x26\xdc\x57\x65\x82\x7f\x83\xe8\x4b\x40\x35\xa6\xb7\x36\xb5\x07\x94\x2e\x2c\x5b\x12\x1b\xd1\x02\x69\x75\x24\x79\x20\x79\x97\x2b\x80\x06\x40\xcd\xfc\xd2\x22\x65\x75\x80\xdb\xc8\x94\xe7\xdd\xe0\x1a\x3d\x72\x27\x4c\x47\x19\xb4\x23\xef\xa5\x8c\xf2\x67\x08\x6b\x2a\xf4\x83\xb1\xc3\x1c\x9b\x49\xe9\x65\xb3\x01\x6e\xc0\x3b\x56\xaa\x01\x6c\x89\xe9\xe3\x0d\x09\x95\x4f\x6e\xb2\x0f\x33\x94\x51\x18\x82\xef\xfd\xeb\xd1\x28\x5c\xfd\x26\x99\xa3\x0d\xa0\x4c\x21\x50\xfa\xad\xa9\x55\x58\x2b\xd1\x84\x1c\x9a\x10\xc3\x3b\xa4\xe1\x2b\x51\xd5\x6b\x60\xb9\x56\xd0\x64\x7c\xb9\x7f\x88\xdb\x40\xf3\x24\x48\xf3\x5a\x1e\x77\x08\x8e\xaf\x25\x6b\xfa\xb4\x12\x47\xb9\x12\xff\x81\x68\xfe\x70\x5c\xb2\xba\xde\x88\xb0\x1c\x57\xbc\x20\xf0\x09\x6f\x01\x4f\xd8\x22\x8e\x80\x21\x19\x21\x34\x48\x08\x8a\xaf\xd0\xc9\x15\x52\x65\x26\x85\x7c\x9d\x25\xcd\xdf\x54\x1c\x6c\x28\xc0\x46\x7f\x9d\x9b\x19\xb3\xb3\xc5\x42\x14\x22\x4b\x46\xff\xaa\x9c\x4c\x00\xcf\x2d\x60\x87\x2c\xc0\xd6\x2c\x21\xeb\x95\xc6\x90\x74\x4d\x58\xf3\x10\xd2\xfa\x36\x13\xeb\xa1\xba\xea\x71\x55\x39\x91\x51\x13\x54\xb0\x2e\x73\x94\x72\xfd\x4e\x68\xba\x63\x36\x44\x49\x75\x2f\xe9\x5d\xb9\xe7\x35\x35\xfb\x69\x64\x5c\xf5\x3d\x99\x4e\xae\x84\x1f\xb8\x10\xbb\x73\xed\xdf\x86\x6b\x80\xdd\x72\x5a\x1a\xa4\xbe\x09\x43\xc8\x6e\x61\x79\x7b\xf6\xd0\x6b\xfc\x6f\xfe\xb4\xa5\xba\xe2\x8c\x47\x42\xe7\x2f\x62\x72\x2d\xb5\xff\x6a\x3d\x00\xae\xe2\x91\x0d\x41\x24\xbe\x80\x53\xc7\xb2\x7c\xc8\xe7\x86\x1c\x7e\x3f\x6b\x1d\xb4\x6e\x67\x45\x5c\x10\x0d\x02\xa6\xc2\xca\xa1\xa0\xc5\xd6\x7f\xf3\xa8\x7b\x61\x27\xbb\xec\x89\xf8\x8f\x0d\xb0\x13\x22\x32\xac\x09\x11\x14\x04\x9a\xb7\xc8\xf5\x71\x53\x18\x1a\xc4\x17\x59\xab\xd2\xdc\x09\x52\x71\xdf\x81\xda\x68\x06\xc8\xcb\x97\x5a\xbe\x34\x24\xd1\x02\x97\xfe\x29\xa0\x1d\xc2\x93\x83\xc2\xcd\xd3\x8f\xc7\xc8\xda\xc4\x99\x2b\xe6\x93\x9f\xb3\x4c\x00\x52\x75\x9c\x48\x88\x3c\xc3\xe3\x9a\xeb\x4f\x79\x96\x2c\xe9\xa8\x5c\x13\x53\xee\x25\xc9\xf7\x79\x49\x13\x87\x09\xbf\xf5\x0a\x75\x25\x10\x9b\x02\x40\x31\xed\xd7\x59\x07\x0f\x9b\x21\xcd\x2f\x44\xc2\xf0\xca\xfd\x3a\x9d\x5a\x3b\x65\x26\x48\x7f\xc9\xfd\xf6\x68\x08\x4a\xd0\x6f\x5a\x0a\x6e\xff\x7c\x69\x60\x0a\x79\x24\x02\x5e\xdd\xc8\x7b\xa6\x6c\x3f\xea\xe8\xec\x76\xa6\x37\xd1\x04\xf5\x9f\x4f\x8f\x3d\x7c\x71\x71\x4a\xe6\x72\xaa\x9b\x8d\x75\x3c\x18\xa7\xe6\x94\x1d\xb5\x09\x8b\xc6\x90\xf0\x67\x0b\x34\x35\xa7\x05\x1b\x63\x0d\xef\xe8\xf1\xe0\x95\x00\x00\x3b\xc1\x15\xd6\x7c\x34\x40\x07\x9e\x0c\x22\x30\xd6\xab\x11\xea\xdd\x11\x9b\x08\x8c\x06\x99\x01\x18\x43\x5f\xe6\x47\x44\xc3\x35\x08\xd2\xd1\xec\xb2\x7f\x8b\x84\xfd\x01\x49\x6d\x91\x2f\xc3\x60\xdd\x49\xd2\x52\x87\x08\xcd\xfd\xfc\xd6\xa2\x7d\x96\x5b\xf6\x18\x06\xd7\x3b\x50\x18\x01\xc9\x00\xf2\xa8\x79\x67\x0b\x1d\x92\xd7\x51\xf6\xd8\xae\x59\xe4\xca\x10\xd2\x88\x00\x1e\x24\x50\x1e\xb2\xca\x9a\x98\x24\x99\x32\x4d\xcc\x27\x32\xa0\x1a\x69\x0b\x73\x4c\xff\x3e\x52\xe4\x5e\x9d\xb2\x3b\xd0\x37\x98\xc6\x4a\x84\xc5\x1d\x86\xda\x17\xec\x96\x76\x85\x3f\x94\x8b\xf8\x08\xc5\x37\x25\x0d\x39\x26\x64\x26\x14\x8c\x9c\x6e\xa0\x3f\xe1\x9a\xc0\xcd\x00\xa4\xc1\x63\x6e\x49\xa9\xa5\x29\x32\xd8\x13\x14\x01\x7c\xd9\xe3\x65\x28\x42\x90\x74\x70\x80\xf4\x88\x42\x53\x70\x11\x28\x0a\x16\x59\x6a\xaf\xec\xc0\x31\xa2\x20\x72\xa2\xce\x6b\xc7\xe1\x95\x85\x52\x97\xa8\xa8\xc9\x7b\x55\xd5\xad\x06\xb8\x27\xaa\x12\x9e\xb5\x1b\x1d\xc6\xbf\x47\xa4\x89\xa9\xc5\x8e\x44\xb1\x25\x9d\xe0\x47\xa0\xf7\x7d\x49\xa4\x8c\x30\x1e\x39\xbc\x34\xe0\x45\xf0\xb5\x13\x40\xa6\xaf\x89\x6c\x00\xfe\x71\x12\xfe\x61\x57\x5b\xc2\xe9\x16\x0b\x31\x52\x30\x6f\xa5\xb2\x3f\xfa\xc7\x30\xef\x5e\xe7\x41\xe6\xdd\x51\x15\xb2\x48\x28\x12\x21\x7c\xc7\xf5\xbd\xb9\x6d\xd4\xb8\x6a\x44\xed\xde\x05\xfc\x59\x6b\x1a\x1e\x41\xf0\x19\x21\xe2\x23\x20\xc9\xad\x97\x66\x9c\xcf\x71\x66\x20\xf2\x93\x0b\x6d\x08\xee\xf2\xbd\x8c\xa8\xef\x72\xcf\xaf\xec\xca\x68\x6f\x51\x22\x54\xc4\xf1\x23\x8c\x54\x4e\x1f\xdd\xa0\xd5\x2f\x77\x3e\x02\x85\x60\x8d\x05\x4f\x8b\x73\xf5\x11\x2c\x05\x02\x3f\x28\x05\x92\x7c\xfe\xa5\x48\xf3\xcb\x31\x1d\x73\x13\xe7\xd8\x03\x88\xa2\x2e\x16\xd6\x08\xfa\x66\xcc\x1b\x23\x54\xd5\x08\x49\x59\x07\xae\x99\x75\x35\x53\x28\x90\x8f\x69\x68\x77\xc0\x99\xcb\xde\x85\x3f\xbc\x2f\xa3\x6f\xee\xa3\x9e\xf7\x1c\x6a\x1e\x0f\xb9\x92\xd7\x28\x7e\x3f\xa0\x63\x79\x31\x00\xa4\xd5\x61\x22\xa0\xf6\xf8\x61\xce\xfc\xbe\x13\xd5\x3c\x32\xd0\x99\xd6\xb2\x4b\xe6\x83\x8e\x26\x72\x30\x8f\x70\x91\x3f\x03\x68\xee\xff\x8b\x60\xf9\x71\xfc\x8a\x8f\x38\x21\x85\xcf\x93\x28\xab\x2a\x26\x8f\xb5\xfa\x3f\x59\x67\x65\xdf\x1e\x0e\x49\x25\x12\x45\xfa\x69\x8f\xf9\x74\x8d\xc1\x87\x8d\x0b\x29\xfa\x00\xf5\x0f\x65\x8b\x81\x5c\xf9\x21\x6c\x45\x9d\xd9\xc3\x65\x84\x28\x95\xf7\x70\x82\x81\x44\x47\xf2\x4c\x1d\x0f\x72\xe7\x1f\x9a\x7b\x3d\x92\xee\x5f\xe6\x50\x38\x7f\xe4\x00\x68\x8d\x1e\xf1\x21\x92\x3d\x03\x5e\x45\x80\x93\xca\x86\x1b\xde\xd8\x4f\x16\x9a\x32\x95\xe0\x33\x9a\x41\xc1\x5b\xac\x49\xb4\xf7\x15\x43\xee\xbc\x1d\x5a\x07\xee\x45\x68\x82\xb8\x27\x79\xa4\x8d\xf3\x3c\x7c\x65\x3b\xda\xcb\x67\x4f\x58\xb8\x96\x0f\x73\x98\x36\x58\xd3\xf6\x92\x94\x48\xea\xcf\x4c\xf1\x8d\x8f\xd4\x35\xfe\x28\x25\x0d\xb5\x17\x63\x72\xa8\x1d\x47\x27\xc3\x59\xf8\x72\x0d\xa7\xb0\xb6\x83\xa8\x58\xd6\x53\x30\xdd\xec\xf0\x12\x5f\xb6\x99\xf7\x50\x34\x79\x1d\x4a\x3e\x64\xde\x10\xa3\xbe\xa1\x60\x00\x2b\x48\x89\x4f\x81\x29\xca\xc1\x6c\x9c\x87\xbb\xd7\x5e\x87\x39\x1e\xf3\x61\x1e\xe6\x50\xe1\xf8\x48\x7e\x60\xc8\x77\xa8\x6a\x5c\x93\xbe\x6c\x26\x07\x4d\xe8\x1c\x90\x92\x2a\x81\x8c\x4d\x70\x2e\x44\x82\xe6\x03\x68\xf2\x2e\x0a\xce\x25\x02\x21\x49\x56\x25\xf1\x2c\x12\x16\x61\x70\x25\xda\xeb\x62\xfc\xdb\x00\x7c\x43\x76\x63\x66\xa1\x66\xdc\x6a\x94\x58\x92\x6b\xda\x3d\x23\x08\x9e\x32\xd7\x50\x6a\x0e\xcb\x00\x9e\x28\xe9\x3b\xa0\x74\x19\xd2\x28\xe9\xe1\xaf\xcc\xc0\x31\x69\x5f\x79\xd3\x7a\x87\x5d\x36\xdd\x84\xba\x2e\x61\xb5\xf0\x12\x72\xe3\x74\x39\x0a\x8f\xd2\x4b\x06\xdc\x16\x56\x6e\x96\xf6\xef\x2a\x19\x07\xd8\xd5\x61\x93\xd2\xfb\x10\x93\x12\x0a\xd0\x14\xd3\x80\xa2\x47\x26\x5d\xb0\x93\x82\x71\x93\xea\xbe\x36\xd3\xfc\x58\xcb\x23\x0b\x87\x70\x17\xf5\x48\x02\x19\x30\xa2\xd6\xba\x21\x14\x1b\xca\x16\xfe\x0c\x53\x91\xa0\x06\xdb\xf9\xde\x5e\xea\x00\xd0\xac\xf8\x35\xc2\xa6\x44\x0e\x0a\x30\x15\xb7\xdb\xf9\x7e\xa4\x38\xc3\xda\xd2\x50\x36\x29\x3f\xf8\x40\xf6\xce\x57\xe3\x11\x52\xd4\xba\x30\xc4\x7e\x73\x89\xd4\x9b\xff\xf8\xa9\x4a\x30\xe3\x56\xa3\x07\x35\x5d\xca\x7a\x00\x83\x1a\x22\x1a\x10\x23\x0a\x45\x8c\x0c\x44\x81\xef\x8c\xa7\x4d\x7a\x21\x39\xf8\x7c\xbd\x44\x32\x92\x10\x44\x7d\x7a\x6a\x5c\x09\xbb\xf6\x1d\x3c\x08\xc2\x6a\xd2\x95\x04\x83\x39\x25\x54\x64\x91\x27\x40\x92\x3e\xc4\xca\x81\xea\xb1\x7d\x78\x4f\xf5\x6e\x59\xc8\x80\x08\x1e\x1b\x5d\xf0\xc2\xa1\x0b\xd0\x1c\xd5\xe3\x31\x84\x2c\xf4\x98\x24\x8c\xd3\xaa\xbc\xd8\x3d\x43\xed\x90\x03\x3a\xed\x76\xd5\x8b\x45\x92\xa9\x20\xcc\xce\x2b\xb7\x52\x2b\xa8\x3e\x22\xe8\x6a\x08\x23\xa8\x48\xdb\x01\xdd\xce\x6d\xa1\x8d\x19\xe0\x99\x0a\xee\x2d\x0f\xcb\x9c\x40\xe7\x04\xc4\x70\x5f\x70\x85\x4e\x57\x01\x08\x54\xce\xc9\x81\x38\xc1\x34\x22\x4e\x74\x67\xb0\x62\x5d\xd6\x22\xab\xbd\xa1\xf3\x03\xe1\x11\xc8\x9a\x6c\x52\xc5\x68\x7b\xe5\x41\xb8\x9b\xb4\x7c\x6d\x21\xec\x83\xe0\x3c\xf6\x36\x04\xb2\x26\xe6\x96\x04\xdd\xbc\xe6\xac\x98\xea\x98\x5d\x34\x79\x1d\xc4\xbb\x08\x89\x79\x06\x06\x07\x49\x66\x3f\xf3\x12\x83\x48\x8b\x84\x96\xb9\xc2\x8e\xde\x75\x49\x09\xab\xb1\xd7\xe9\x25\xc5\x0a\x78\x80\xc4\x06\xa7\x8e\x7b\x52\xc2\x02\xe3\xad\x13\x25\x1d\xa1\x75\xa8\xae\x81\xe1\x23\x67\x1b\x36\x27\x8f\x3d\x91\x65\x26\xc0\xc8\xae\x45\x60\x78\x26\xb2\xc1\xba\x42\xcf\x12\xc0\xe2\x26\x2d\x69\xc4\xbe\xda\x65\xb8\x9a\xd6\x46\xbf\x68\xe0\xce\x58\x5e\x14\xf1\x36\x00\xb3\x23\xec\x0e\x15\xca\x3a\xa0\xf5\x79\xc2\x10\xe8\xa3\x10\x87\x36\xa5\x99\xbd\xe7\x07\x02\xb9\xd3\x70\x3b\x77\x58\x4c\x84\x77\x07\x73\xb1\x1d\x20\x54\x76\x24\x81\x7e\x46\x54\x3a\xaf\x2b\x00\x3d\x82\xeb\x40\xa2\x86\x84\x97\x2e\x4b\x93\xc0\x81\x3d\x01\xe6\x21\xb7\xd9\xad\xee\x4f\xa6\xb5\x3b\xeb\xb5\x79\x15\x6c\x4a\x10\x9e\xf6\x7a\x1a\x73\x8a\x43\x48\x48\x12\x79\x98\x40\xe8\xbc\xf5\x24\x7d\xfd\xef\xed\x95\x18\xe4\x42\xcf\x76\xa1\x13\xf8\x5f\x42\x1e\x8c\x4a\x98\x61\x14\x3d\xeb\xde\x2f\x30\xb0\x96\x8a\x4a\x21\x5f\x17\xc8\x2e\xc1\xd2\xe6\xe3\xb9\x0c\xc7\xfe\x7c\x84\xf8\x59\x7a\xfd\x0f\xa5\x4f\x81\xf9\xe1\x23\x99\x88\xaf\x4a\xe3\x58\x04\x22\xa2\xbe\x1f\x0a\x6f\x7a\x98\x53\xd7\xba\xf1\x2e\xb1\x8a\x93\x2e\x4e\x3b\xbc\x8d\x71\x6c\x8b\x4d\x5a\x46\xca\x7f\x00\x29\x60\x0d\x73\xd1\x87\x14\xab\x51\x8c\xa1\x0c\xc7\xd9\x4a\x1d\xf8\x85\x92\xd7\x50\xb1\x1f\x09\xbc\xfd\x96\x7f\x4d\x42\xe5\x7f\x6d\x08\x1f\xa5\x8d\x6c\xf6\xce\xd1\x91\x0d\x5e\x05\x42\x41\x9f\xb7\x53\x4a\x64\xd4\x88\xc9\x23\x3e\x1d\x48\x59\xef\x5f\xb8\x8f\x2f\x12\x8a\x15\x44\x04\xad\x77\x08\x85\xdc\x84\x94\xfc\xc8\x82\xbf\xa7\xaa\x08\x93\xd8\x76\x39\xaf\xaf\xba\x48\xfe\x57\x8e\x22\x12\x67\x5a\x59\x9a\x75\x79\x11\xca\x94\x38\x85\x81\x90\xa6\x25\x1e\xcd\xa4\xde\x38\xe4\xdf\x21\x31\xe2\x65\x82\xd4\x17\xc7\xf6\x24\xef\x0c\xfc\xdc\xbb\xc3\x3a\x1a\x9b\xc7\xfd\x50\x77\x44\x86\x1e\x7c\x29\x3f\xaf\xd2\x24\x3f\x3f\x30\x29\xea\x8b\x98\xe7\x1f\xa2\xa6\x3f\x14\xa3\xff\x04\x0a\xf6\x13\xa5\xd1\x4f\x5e\x55\x25\xb2\x08\xf5\x0b\x8f\x04\x1f\xfe\xa4\x4a\xec\x97\x05\x2c\x31\x7f\x40\x37\xf5\xfb\xf0\x49\x63\x39\x9b\xcf\xbf\x90\xd2\xef\xc4\xd1\x0a\x60\xf3\x99\xcb\xe8\x11\xad\x8f\x5a\x65\x4c\x81\xee\x0a\x82\xfa\xeb\x4f\x78\xff\xaf\xf4\xfe\xa7\x16\xe3\x2b\xc8\x13\xf0\x00\x79\x09\x33\x74\x02\xbf\xc9\x95\x7b\x7c\x8b\xe1\x9f\xb4\x4c\x96\x60\x13\x59\x6c\x53\x77\xbf\x86\xf0\xff\xff\x74\x32\x31\x01\x43\x6a\x0a\x85\x92\xb7\xf2\x91\x2f\x17\xf1\x14\x9e\xa8\xad\xdb\xe3\x50\x99\xee\x75\x2f\x09\x42\x32\x94\xb4\x49\x16\x36\x19\xad\xa2\x36\xc7\x8b\xe6\x4b\x01\x86\x5f\x7f\x74\x64\x9e\x04\xfa\x3d\x9d\x40\xeb\x7a\x26\xf3\x2d\x24\xd1\x7e\x71\xc2\xec\x02\x26\xbb\xe4\x4b\x38\xe5\x7b\xce\xda\xb6\x27\xe0\xee\x89\xb4\x9a\x14\x4e\x90\xf3\xf2\xa5\xee\xe8\x33\x03\x22\x89\x20\xbd\xbd\xb3\x7f\x26\x0d\xbf\x9e\xe9\x94\x77\xc8\x19\x5e\x8a\x72\x09\xa1\x45\x37\x2c\x40\xd0\x11\xb2\xc7\x7f\x42\xfc\x3d\xbc\x3a\x2a\xd8\x3f\x14\x27\xae\x24\x8c\xc2\x08\xc4\x2f\x45\x65\x6e\xaa\x86\x61\x4c\xdd\x48\x78\xb7\x2e\x9b\x60\x9f\x3b\xe0\xef\x8e\x01\x4a\x81\x01\xda\x28\x58\x4d\xfc\x0f\xc7\x27\x77\x0d\x2d\x85\xfb\xb4\xf7\x87\x40\x9a\xb3\x4c\x04\x02\xcd\x72\xc3\xb1\xe8\x1a\xa8\x79\x41\x48\xd0\x4d\xc4\xd0\xdc\x75\x11\xe6\x83\x35\x67\x00\x82\x64\x1e\xe2\x06\xe3\x21\xe0\x0a\xc5\x8e\x5b\x56\x08\x1e\x6b\xf2\x72\xf3\xb7\xd8\x42\x48\xb1\xbb\x89\x61\x20\x89\xe0\xd5\x46\x0b\xf8\x0c\x58\x90\xae\x2a\x15\x15\x0b\x75\x76\x45\x2a\x2a\x03\x1e\x0c\x1d\x04\x50\xd9\x1f\xd9\x95\x08\x6c\x74\x1e\xde\x38\x59\xd0\x57\x37\x1a\xb7\xde\x8a\xd3\xb8\x7b\x16\x4f\xfc\xd6\x68\xf3\x9e\x37\x42\x88\x22\xcd\x75\xcf\x1c\x6b\xdc\x93\x5d\xc5\x1f\x0a\xb3\x8c\x10\x16\x0e\x6d\x96\xd3\x06\x6b\x4b\x8e\xd8\x61\xc8\xfa\x20\x7f\x93\x12\x3f\x78\xca\x61\xea\x69\x9d\x43\xe5\xc2\xfa\xfd\x27\xc7\x45\x77\x0e\xd2\x2f\x30\x4e\xb3\x54\xc6\x2c\x16\x94\xf8\xce\xe1\xa2\x6f\x17\x56\x25\xe1\xdb\xd5\xa7\xb8\x52\xa2\x7d\xf6\xca\x32\x51\x0c\x4d\x7f\xef\x38\x81\xed\xa9\xf2\x83\x49\xba\xf9\x09\x6c\x85\x9f\xff\xa3\x84\x0b\x01\x4c\x5f\x4d\x0c\x77\xab\xb0\xb7\x22\x1c\x4b\x5e\x01\xab\xbf\x9a\x2b\xe9\x55\x9b\xf2\xd9\x55\x69\x22\x7f\xd9\xcc\x85\x10\x96\xca\x61\xf8\x65\x8f\x63\x83\x25\xdb\x07\x02\x32\xc0\xb8\x10\xc0\xe8\x64\xe6\x09\x63\x82\x5d\x80\xa7\x3d\xd3\x06\x85\x9f\x62\xbc\x72\xdd\x2c\x1c\x7a\xa8\x1a\x25\x46\xc1\xa8\x99\x52\x58\x26\x47\x3a\x38\x0c\x4f\xf4\xcf\xec\x83\xe8\xa4\x17\xaf\x9f\xff\x54\x98\xc6\xe8\xac\x92\xea\x99\x16\x9d\xb4\xc1\x02\x26\x6a\x14\x28\xca\xfd\x31\x02\x0e\xe5\x14\x50\x6e\x7c\x38\x75\x53\x17\xee\x38\x93\x58\x4c\x08\x71\xce\x8c\x0b\x28\x8e\x01\x78\x42\x6b\xa9\x08\x3e\x36\xcd\x3a\x05\x50\xaa\x37\xc3\x59\x18\xa1\xc3\xda\x14\x22\x41\x2c\x0c\xe9\x99\x14\xca\x95\x57\x61\x59\xed\x2a\x07\x7f\x7b\x51\x89\xf1\x6a\xb8\x50\xee\xe2\xf0\x49\xee\xb1\xc2\x84\xd5\xa3\x05\x28\x52\xff\x7f\x4a\xe9\x5c\xdb\x5b\xff\x76\x9b\xa5\x16\x75\xad\x85\xf6\x20\x3e\x21\x23\xe6\x89\x36\x5c\xd6\xf3\x10\x90\xb4\xb0\x07\xbc\x80\x89\x1a\x14\xac\x04\x41\xb1\xd0\x6b\x33\xfe\x73\x90\x76\x0d\x0a\x35\x02\x0a\xcd\x5b\xe0\xa1\xb8\xbb\x64\xa1\xaf\x70\x02\x03\x3e\x2a\x80\x52\x1a\x64\x5c\x53\x5d\x08\xb4\x9a\x6c\x10\x42\x00\xd3\x54\x7c\xb6\x6b\x4b\x31\x83\x90\x1e\x58\xa2\xe9\x03\x6e\x8a\x27\x03\xb0\x94\xa0\x51\x73\x5b\xfa\x33\x0b\x59\x62\x1b\x1b\x49\x0f\x67\x8f\x6b\x3b\x09\x53\x84\x54\x72\x89\x88\x4b\x42\x51\x60\x88\x38\xc9\x60\xd5\xe2\xc7\x19\xdf\x0a\xa8\x95\x42\x2a\x12\x4e\x32\x04\x54\xbd\xd8\xe7\x3a\x10\x8b\x9a\x3a\xf7\xc4\x6f\xa8\x47\x7d\xe5\xff\xaa\x10\x5a\x47\x5d\x9f\xb4\x4f\xbc\xe4\x5d\x71\x35\x1b\x30\xc7\xe4\xfc\x32\xb2\x5f\x45\x61\xa5\x3c\xfb\x94\xed\x6a\xa8\xb2\x9c\xc7\xd0\xeb\x19\x34\x17\xb1\x48\x00\xbc\xc6\xcb\xbe\xb2\x8f\x7b\x75\xcd\x7b\x09\x59\x5f\x7d\xd8\x2e\xc0\xbf\x23\x74\x73\x5e\x74\x8a\x93\x89\x4d\x03\x7c\xd5\xaf\xe0\x8e\xe4\x36\x5d\xaf\xe7\x52\xb0\x36\x83\x9b\x3d\x0c\x0f\x42\xbe\x87\xe1\x56\x43\x75\x87\xea\xf4\x01\x13\x0b\xd6\x16\x90\x62\xdb\x15\x81\xff\xc8\x3e\x89\x0a\x70\xf5\x49\x78\x9c\xcb\x65\x1a\x67\x46\x8f\xc7\x3c\x10\xc0\xf5\x8f\x62\x49\xe9\x45\x70\xfa\x95\xea\xd3\x46\xd3\x84\x25\xa6\x70\x66\x4a\x4d\x99\x29\xb1\x6a\x8b\x21\xc1\xdc\x22\x0d\xf6\x10\x36\x01\xa8\xf0\x0c\xf0\x80\x42\x3e\x9a\x98\x5f\xb0\xcf\xe1\x9d\x4b\xab\x40\x6c\x23\x1f\xd2\xf4\xe0\x49\xc5\x31\x7a\xcf\xc4\x72\x9d\x14\x10\xaf\x94\xbc\x8f\x81\xf0\xd8\x2c\x89\x1f\x95\x00\x4e\x71\x8d\xce\x2a\x7b\x41\x0b\x3c\xb7\x09\xf5\x78\xe9\x02\xd9\xf5\x23\x36\xad\xe3\x63\x01\xaa\xa7\x30\x67\x9f\x77\x2f\x98\x59\x3d\x08\x4d\xab\x0f\xdf\x04\x35\x01\xa2\xd7\xae\x4d\x5e\xe4\x98\x5b\x9d\x01\x55\x6b\xf6\x37\x65\xa7\x2d\x8d\x4d\xc2\xb8\xe3\x2a\xd4\x59\x00\xbd\x11\x49\xec\xe2\x2c\x01\x89\xcb\x13\x15\x86\xec\xb7\xaa\xbd\x46\xec\x8b\x0e\x15\x50\xff\x16\x3c\x93\xe8\x2f\xcf\x59\x8f\x9c\x9b\xf9\x72\xca\xec\xc6\xe2\x7e\x66\x33\x8d\x7a\x26\x0a\x2b\xd8\x5d\xdd\xc3\xb1\x47\x8f\xe1\x89\x8a\xdf\x25\xc8\xda\x41\x7a\x8e\x45\x74\x03\xb2\xde\x65\xa6\x52\x92\xbd\xde\x8b\xce\xda\x7b\x03\xcf\xc4\x59\x7f\x43\x38\x1b\x34\x7a\x89\x63\x43\xe3\xb3\xf2\x7e\xda\x88\x85\x58\xb4\x3b\xfd\x6a\x92\x73\x26\xf1\x10\xa1\xbd\x11\x4e\x3d\x4c\x19\x9d\x89\x59\xc7\xd3\x26\x17\x9c\x4f\x9d\xf2\x16\x05\x7f\x9f\xdf\xfd\x57\x13\x95\x84\x38\x04\x3d\xea\x05\xd5\x15\x07\x42\x55\x80\xa1\x5b\x13\x7e\x58\x8f\x7e\x4b\x1c\xc8\x2e\x15\x67\x9e\x16\xf3\xe6\x1e\x18\xa4\x85\x04\xd0\x19\x29\xe3\x03\x1d\xf4\x8b\x3e\x8f\x36\x31\xba\x02\xdf\x16\x90\xae\x72\xea\x2b\x6b\x39\x99\x17\x38\x94\x06\x74\x0c\x1c\xf5\x71\x10\x11\x00\x77\xaa\x88\x7e\x94\x10\xe3\x3c\xbe\x93\x1e\x0b\x1f\x81\x8f\x4b\xdf\x75\x90\xb4\xf2\x2d\xd7\xca\xb3\x5f\xe5\x5e\x6d\x73\xa9\xca\xb4\xcb\x31\x2b\x2d\x0f\xd8\xdc\xbd\x7c\x91\x6f\xee\xd0\xff\x43\x0c\x5c\xe0\xd5\x38\x1f\x3d\xe6\x14\x23\xf5\x03\x0c\x58\x3a\x7f\xc2\xc5\x04\x8d\xc3\xf1\x20\x1d\xe5\x20\xf6\x4b\xf0\x35\xd8\xfe\xfd\x08\x11\x47\x41\x25\x29\xf5\x00\x7b\x2f\xe0\xdc\x79\x25\x22\xdc\xce\x35\xea\x59\x16\x2f\xda\x8c\x18\xba\x5d\x22\x68\x87\x2b\x69\x7b\xc0\x73\x0a\x12\xec\xc1\x1c\x0c\xb0\xcc\x1c\x6d\x40\x34\x68\xe0\x37\x74\x8f\x07\xa8\x19\xbe\x95\x21\x19\x34\xd8\xb5\xe3\x21\x84\xfd\x3f\x20\x46\x7b\xde\xd4\x55\x3b\xe4\x12\x05\x47\x95\xb7\x96\x78\x65\x0a\x06\x4d\xbc\x56\x7f\xcc\xdd\xcb\xb9\x49\x19\x03\x62\x42\x4c\x1f\xe0\xb5\xf5\xe7\xae\xac\x3e\x30\xf7\xe7\xab\x84\x56\xb0\x0c\xd8\x8a\x30\x67\x85\x32\x16\x65\x28\x82\xba\x14\x22\x91\x7e\xdc\x87\xc8\x27\x97\xb6\x9c\x59\xcd\x68\x12\xf6\x7b\x55\x26\x67\x2f\xcf\xc2\x85\xe6\x7d\xfb\xd7\x32\x07\xbe\x0c\xec\x74\xf6\x79\x61\x93\xb6\x4b\x39\x1f\xd8\x9e\x46\x64\xd9\x95\xc5\xb3\xe5\xf0\xc1\xbc\x51\x07\x02\xed\x53\x81\x76\x8e\x39\xd3\x9e\xdf\xca\x2c\xee\xf9\x75\xc9\xdf\xe8\x29\x97\x86\xdd\xda\xfb\xc2\x49\x9b\x85\xee\x37\xa5\x1e\x67\x83\xc5\x71\x52\x20\x61\xec\xcd\xfd\xdb\x57\xaf\x67\x6f\x75\x3b\xc4\xab\xdb\xd0\xd4\x3a\xd4\x28\xda\x5a\x0b\x26\x01\x50\xb6\x52\x57\xcc\x05\x0e\x8f\x6f\xc9\x1b\x2d\x61\x47\x14\xba\x88\x80\x99\x09\xe9\x65\xb7\x89\x89\x30\x57\x56\x65\x8d\x18\xe1\x42\x5f\xb9\xcd\x3d\xdd\x19\x80\xf6\x4a\x79\xa4\x1d\x36\x8d\x8a\xb8\x90\x59\x50\xdc\x2a\xf8\x14\x5d\x84\x93\x2a\xcb\x65\x73\xbd\x4b\x42\x45\x9a\xcc\x6c\xf3\x1a\xa0\xbb\xa6\x45\xba\xcd\x13\xe5\x8f\x06\xc0\x16\xc9\xe0\xdb\x34\x24\xd8\xf2\x25\xf9\x21\xf7\x81\xfa\x21\xba\xce\x1e\x2e\x21\xef\xa8\xf9\x93\xd7\x50\xa8\xdc\x5a\xb7\xbd\x65\xbc\xfd\x7e\xe0\xfe\x9e\x47\xa2\xbd\xfa\x3d\x07\x0a\x0e\xf6\x4f\x67\x0e\x30\x9d\x5a\x27\x87\xd8\xfd\x11\x3c\x5a\x9f\x02\xd2\xfd\xd6\x3d\x14\x7c\xfa\xb1\x29\x1e\xcd\x8e\xe9\xb7\x20\x2b\xb5\xb1\xf5\x0d\x09\xd9\xe7\x75\xc2\x94\x4e\xe0\xb8\x56\xfa\x06\x6e\x4e\x5d\x35\x04\x8c\x02\xef\x97\xd0\x3f\x7a\xf0\x92\xdc\x53\xaa\x72\xed\xb9\xab\xdc\x86\x1c\x39\xf7\x43\xec\xdb\xc4\x79\x27\x64\x8b\x02\xf2\x86\xc4\x27\x37\xf4\x0a\xaf\xc2\x6d\xd6\x3f\x38\x97\x10\x33\xf5\x6e\x36\x7d\xe1\x71\xe5\x8f\xc4\x51\x0e\x21\x22\x4a\x04\x63\x29\x93\x21\x6b\x4f\x56\x41\xe6\xde\xa8\x8b\x73\x8f\xbd\xa1\xe7\xb8\xf9\x2e\xc4\xf4\x46\x5e\x91\x0e\xc6\x61\xaa\x2d\xb7\xc8\x88\x58\x9c\xfa\x24\xec\xdf\x6f\x33\x54\x1a\x03\xc0\x07\x52\x15\x6d\xe8\x60\x73\xb4\x2b\x88\x1d\x7a\x4a\xd9\x6e\x3c\x07\xba\x49\x31\xc4\x80\xcc\xdf\xc0\xf5\x4d\x85\x9e\x37\x6b\x3e\xd6\x03\x04\x0a\xad\x3a\x8b\x71\x85\x7d\x1d\xbf\x81\x44\x37\xa9\x80\x6b\x9d\xce\x58\xfe\xb8\x34\x12\xde\x0f\xc2\xbc\xca\x4b\x50\x74\x74\x22\xaa\xb1\x43\x47\x80\xa2\x3f\x90\x40\x70\x8c\x57\xd9\x3d\xb5\x4c\x1d\xa2\x42\xdc\x58\x79\xc4\xcf\x5e\x4b\x7e\x7d\xe1\x0a\xab\x0d\x41\x02\x71\xc7\x72\x1e\xc4\xe3\x5b\xaf\xbb\xda\xff\x5e\xb9\x76\xfd\xcd\x7b\x3b\xc6\x3c\xd6\x42\xdf\x24\x34\x4a\xbe\xec\xd8\xaf\xad\xb9\x2e\x31\xe5\x5c\xb3\x8d\x21\x89\x3b\xcb\x8d\xb3\xb2\xc2\xa9\x91\x8a\x4e\x79\xff\x30\x17\xba\x7a\xa9\x57\x6d\x83\x7d\x38\x04\xc5\x13\xeb\xdf\x3b\x42\xc2\xfc\xe0\x49\x48\x1c\x1e\xaa\x5f\xc2\xbc\x7d\x84\x93\xfb\x30\xad\x0b\x9c\x1d\x31\x6e\xc2\xbf\x61\x94\x6b\x6f\xbb\x84\x94\x24\xa8\x64\x13\x0e\x0e\xc0\xd7\x14\x32\xcf\x70\x47\x8d\x48\xe0\x45\x98\xe2\xf0\x58\x68\x15\x2f\x46\x23\xdd\xc2\xd1\xaa\x29\xf7\x80\x0a\x1c\xdb\x26\x47\xe8\x29\xf8\x6a\xc6\xac\xd1\xb3\xb9\xfb\x92\x56\x35\x33\xd2\x35\x8d\x67\x96\xbb\x53\xcf\x27\x0d\x66\x4b\x51\x97\x81\xcb\xd2\x4d\xa8\x1d\x50\x38\x4a\x7f\x2d\x75\x3e\x78\x46\x4b\xf5\xc9\x8c\x47\x3e\x3e\x86\x98\x12\x67\xb6\xcb\x99\x84\x89\x5a\x5a\x6a\x69\x09\x21\xc5\x05\x0c\xeb\x39\x24\x93\x3e\x14\x72\x2a\xb0\x9e\x22\xee\xee\x0e\x57\xa5\x5b\x3d\x90\xa0\x78\x6f\x86\x42\xf3\x39\x66\x6c\x81\x8b\x66\x83\x01\x96\xf9\x53\x37\x46\x53\x38\x14\x95\x86\xc2\x83\xbf\xbe\x2f\xf9\x54\x2f\x3b\xe7\x8b\x8e\xe5\xfb\x71\x74\x9e\xe7\x96\x96\xc6\x90\x5a\xe6\x06\xc2\x43\x01\xc5\xff\xfd\x7c\x04\x2c\x6f\x68\xea\x48\x8d\xfa\xb2\x7c\x4d\x64\xac\x6d\x88\x92\xc1\xd2\x04\x35\x97\x3c\xf8\x78\x64\xf1\xaa\x48\x56\x18\xc3\x20\x87\xe4\x49\x10\xc9\xde\x76\xb6\xd6\x0b\x58\xf9\x0a\x64\x7a\xb6\x34\x91\x04\x44\x3e\x1e\xb5\x60\x26\x60\x8f\x73\x80\x5f\xb8\xc7\x87\x04\xdf\x2f\x34\xa2\xd2\x52\x3d\x5c\x55\x57\xfc\xcd\xd5\x9f\x0b\xe0\xdc\x89\xa3\xf9\x45\x51\xc1\x93\x88\xbf\x36\xa2\x76\x89\x23\xa9\xb4\x23\x85\xe1\xcb\x2b\xc7\x93\x63\x4d\x70\x1f\x83\x61\x8b\x5d\xf1\x68\x9b\x0a\xae\x27\x3c\x17\xbc\x81\x06\x4c\x8f\x58\x3c\xa7\x39\x8f\xdf\xd0\xa3\x35\xf4\x83\x2c\x9a\x39\x3b\x9d\x6c\x7e\x15\x58\x3d\xf4\x88\x82\xad\x9d\x54\xce\xb0\x93\xf3\xc7\xdf\xe1\x76\x0a\xf6\x2f\x52\x4f\xbd\xe5\x44\xdf\x47\x46\x0b\x37\x3b\x59\xe7\x9b\x4a\x69\x5f\xd9\xd5\x7f\xc5\x9e\x16\x83\x72\xe9\x03\x00\x1a\x34\x31\x98\x03\xcb\xe7\x95\x0e\x62\x00\xed\x69\x52\xfd\x73\x2a\x1c\x41\x41\xe5\x97\x9e\x46\xf6\x86\xf5\x53\x00\xd7\x3c\x75\xe9\xf5\x4e\xff\x34\xea\xb7\x80\x36\x4d\x25\xa5\x2e\x60\x7e\x9e\xc5\xf5\xa3\xe7\xd7\x2a\x4b\xa5\x2b\x5c\x96\xac\x3f\x5b\x85\xe8\xdb\x04\xb0\x3b\xa4\x43\xd4\x6c\x67\x80\xd8\x5b\xbf\x90\xbd\x86\xd8\x9b\x87\xbb\x93\x1f\xcd\x04\x2c\x03\x61\x70\x6c\xa3\x26\xc0\xf6\x42\xf4\xc8\x5a\x0b\xa4\x4d\x05\xbe\xe3\x14\x70\x4a\x2a\x06\x4c\x3e\xcf\xde\x42\x0f\x29\x39\x26\x3f\x3e\x10\xa3\x67\xef\xe0\xc7\x83\x79\x8c\x53\x02\xc6\x5b\xfe\x4d\xfd\xa2\x74\xfc\xa8\x4a\x95\xcd\xc9\x07\xe6\xcf\x02\x49\xb7\x12\x37\x67\x3d\x5f\x65\xfa\xdd\x63\xfb\xaf\x0e\xa1\x42\x33\x2a\x4d\x9f\xb3\x36\x61\xa4\x2a\x38\x9b\x05\xe2\x2f\x5b\x18\x10\xbb\xfb\xb3\x08\x4f\x77\x5d\x8d\x6f\x40\x98\xdd\xc5\x68\xd0\x1a\x3c\xf3\x82\x6a\x9d\x45\xe2\x4b\x04\xb1\xd9\xf2\xf1\x23\xf8\x9d\xf2\x47\x1e\x57\x42\xf6\xac\x21\xe7\x2a\x40\xa7\x2f\x45\x43\x0c\x82\xc6\xa0\x5d\x01\xa5\x17\xc7\x67\x4e\x78\xb4\x41\xeb\xd0\xb8\x86\xa3\x24\xbc\x80\xd0\x0b\x41\x24\x80\xf5\x4e\x90\x73\x7f\x08\xd7\x4b\x42\xe6\xad\xb9\x9b\xdb\xd9\xda\x73\x21\x91\x24\xdb\x91\xa5\x83\x71\xfd\x56\x3f\xc7\x18\x6e\x8e\x9e\xf5\xd4\xa6\x36\xda\x69\x1a\x4f\x90\x60\x5c\x7d\xd2\x30\xe2\x9d\xdd\xd8\x25\x7a\x4c\x0a\xce\x38\x85\x66\x13\xab\xa0\xa8\x45\x7e\xb8\x0c\x49\x2a\x1b\x7e\x9e\x1b\xc7\x63\x16\x4b\x93\x2a\xcf\x4d\xe3\x69\xde\x84\xa3\xab\x36\x4c\x97\xaf\xf8\x88\xfb\x2d\x24\x65\x3a\x39\xcc\x44\xef\x4a\x24\x60\x42\x99\xc5\xff\x4b\x12\x10\xd3\xfa\xbd\x57\xa0\xf1\x06\x56\x2a\xfd\xc3\xfa\xe6\x59\x91\x6d\x0b\x60\x5e\x3c\x5f\x29\xd8\xe3\xa3\x80\x05\x23\x90\x64\x3c\x98\xce\xd1\x96\x6a\xca\xc6\x94\xce\x90\x7b\xba\x66\x51\xbf\xe1\xb1\xc5\xe9\x1a\x3c\xb6\x68\x29\x55\xc7\x4a\xfc\x1c\xa5\xd4\x1e\xd0\x46\x17\x5c\x6f\x26\xe5\xce\x02\x92\xcc\x2c\x18\xe2\xbb\x7c\x51\x5c\xf4\x11\x5a\x42\x8f\x53\xb2\xa6\x0e\xd4\x63\x23\xe2\x40\x3d\x9f\x87\xf9\x43\xf1\x10\x83\xe8\x21\xf1\x67\xc0\xf3\xd4\x5c\x5a\xd8\x31\xc9\xf2\x58\x59\x7f\x7d\xc0\x18\x98\x2b\x72\x00\xf5\xb2\xbe\x08\xd5\x29\x9b\x94\x74\x95\x6f\x38\xf4\xa6\x92\x6a\xc1\x8f\xb9\xc1\xfe\x1f\xb1\x66\x9d\x0f\x26\xd8\x21\x41\x95\x67\x89\x50\x09\x1d\x28\xdb\xc4\xc7\x9c\xae\x96\x41\x03\x92\xcf\xef\x84\xcb\x52\xb1\xd6\xfd\x08\x60\xba\x05\x63\x24\x40\x1e\xd6\xe7\x51\xe6\x2a\xcf\x01\x08\xf4\x96\xf3\x01\xe1\x5f\xff\x05\x18\x08\x31\xa0\xea\x3d\x7c\xbc\x1c\x4f\xf7\x92\xfa\x17\x66\x1b\x6a\x1c\x11\x4a\x2e\x38\xdf\xa1\x33\xa5\xa9\x86\x0b\xfa\x79\xb0\x37\x79\xa9\xdd\x2d\xb6\x54\x89\xce\x33\xd5\x0a\x91\x81\xfa\x03\xea\x13\x8a\xf0\x6b\xdf\x35\x7c\xa1\xcd\x79\xd8\x4a\x30\xcd\x73\xc0\x61\x32\x07\xc6\xd9\xf1\x62\x04\xf0\xbd\x66\xcd\x0a\x87\x7a\x64\x82\xfc\xe0\xd4\xaf\x68\x0c\x2b\xae\x44\x05\xdf\xa1\x62\x12\xab\x70\x24\x1a\x7d\xb0\x76\xcc\x73\x9c\x43\x1d\x3e\x5e\x83\x1b\x00\xf4\x04\x82\x9c\xa9\x8f\xa1\xf6\x52\xaa\x2a\x4e\x04\xf7\xb1\x20\xc4\xaa\x3a\x80\xb7\x2f\x7e\x08\x18\x61\x8e\x47\x67\x70\xd9\x7e\x62\xf8\x80\xfd\x62\x80\xf7\xd7\x8f\x55\x36\x89\xd8\x0d\x01\x7e\x19\x4a\x90\x87\x07\x1b\x14\x01\x4d\xa2\x0f\x6a\xd0\x1d\x4c\x48\x94\xe0\xfc\x75\xd6\x9a\x03\xaf\x38\xab\x65\x18\x9a\xc4\xf5\x30\x07\xfa\x94\xeb\x7b\xd5\x43\x87\xe8\x0d\x01\x32\x14\x74\x64\x80\xd4\xa4\x10\x82\xc8\x8a\xb3\x7d\xb0\x37\xb5\xbe\x03\x5f\xa8\x81\xfb\x90\x43\xab\x75\x50\x72\x6a\xc8\x9b\x4c\xb6\xc0\xba\x2a\x11\x9e\x17\xd3\x58\xd6\x9f\x55\x19\x6e\x2d\x85\x68\xc4\x4e\xc0\x1f\x98\x71\xf1\x02\xe6\xe6\xae\xf5\x5e\x65\xc0\xf5\x0a\x27\xae\x4a\x4b\x80\x21\x69\x98\x0d\x31\x01\x7e\x63\x0d\xad\x70\x88\x67\xa2\x4c\x18\x98\x57\x17\xf4\xe6\xfc\x54\x31\xf6\x7f\x72\x5f\x6b\x2e\xfd\xd6\x5a\xdb\xf4\xf3\x7f\xb4\xea\x22\xa6\x8c\x6e\x17\x7d\x0d\x34\x5f\x4d\x83\xec\x93\xce\x2a\x55\x2b\x6c\x2c\xdc\x1c\x68\xc6\xd2\xa1\xb2\xd0\xde\x5e\x45\x54\x9f\x3a\xf3\x53\x46\x5c\xf6\x1c\x2c\x5b\x65\x28\x9d\xf9\x5e\x7e\x2a\x7d\x00\xb0\xfa\xf2\x21\xd6\xad\x50\x29\xac\x2f\xff\x04\x1f\x7c\xb2\x95\xed\xff\x3c\x6f\x40\x32\x06\xcc\x10\x98\xb6\x42\x05\x2c\x9b\xdf\xcc\xf4\xba\x2a\xe7\xb3\x09\x64\xfd\x91\xb4\x82\x56\xf6\xa9\xa8\x29\xab\x20\xd6\xbf\x2c\x3c\x13\xe5\xde\x7b\x08\x16\xf3\x9f\x40\x66\x88\x08\x3b\xd0\x2b\x0e\xad\x1c\x63\x55\xd6\x52\xde\xc6\x7d\x99\xf5\x5f\xc0\x6d\xf6\xa0\x9f\x38\xec\xf0\x0e\x4e\x66\x62\xa5\x99\x89\x61\x26\xe9\x87\x70\xf6\xfc\x2e\x90\xa4\x24\xe9\x10\x64\x3e\xeb\xbd\xcd\xe5\xbc\xdc\x01\xa5\x2e\xa9\x74\x11\x8e\x38\x41\x29\x8c\xaf\x8e\x7b\x82\xd5\xf0\x04\x93\x01\x1f\x40\x6a\xca\xbb\x03\x81\x78\x0b\x02\x09\xd1\xb8\x50\xf5\xb2\x96\xf9\xc1\x79\x9c\xbd\x25\x7e\xd0\x6c\x93\x75\xa2\x53\xe0\x09\xa6\x47\xc2\x1d\x2d\xb4\xae\x0b\x4c\x64\x1f\xaa\x84\x08\xd3\xd9\xc4\xbc\x5e\x41\x77\x80\x95\x58\x13\xec\xba\xd4\x49\x23\xd2\xb5\x43\x3d\x2a\xbc\xc5\xec\xe5\x8d\x0d\xad\x8d\x70\x02\x00\xcc\xc4\x24\xa7\xef\x61\x03\x54\x6a\x43\xc0\x82\x75\x48\x15\x0b\x90\xe6\x78\x36\xc3\xb0\xe3\xd0\xca\x43\xff\x6e\xbf\x65\xf8\xd5\x04\xca\xec\xb5\x55\x70\xd8\x24\x24\xf4\xc6\xba\x53\x48\xcc\xf5\x93\xb4\xa1\xbd\x46\xbf\x8a\xe6\x71\xae\x52\x23\x7b\xc4\x2e\x83\xb2\x40\x7d\xea\x09\xed\xed\xde\x62\x67\x74\x55\xf2\xe7\x76\xb7\xa5\x83\x85\x82\xfa\xc5\xa0\x19\x24\xa2\x24\x22\xcd\xfc\xae\x86\x1a\x72\x57\x77\x61\x38\xc9\x31\xeb\xaa\x90\x66\x95\xa2\xdb\x5d\x1d\x56\xe1\x2b\x6d\xb6\x3f\x25\x11\x23\xec\x83\xf3\xec\x6e\x01\x34\x25\x81\xd0\x85\xd7\x17\x6a\x46\x12\x2c\x2b\x55\x4b\xb2\x5e\xa0\x85\xb6\x10\x4d\x59\x02\x4c\x89\x77\x9c\xdf\xcd\x9b\x60\x9a\xeb\xda\xe0\x9d\xf6\x3a\x35\xf4\xe6\x10\xf2\x67\x40\xca\x50\x0b\x07\x96\x21\x02\x6f\x86\x0e\xa3\xe3\x38\x2f\xfd\x3b\xb7\x61\x7e\x47\xc8\xd4\x52\x47\x6d\x85\xae\xbc\xa9\xdd\x55\x5e\x64\xe2\x22\x10\xa4\xaf\x54\x69\x8f\x76\xf0\x01\x14\xd4\xb2\x92\x30\xd4\x15\xd5\x1b\x3a\xdc\x93\xc6\x97\x06\x9e\x73\x0e\xf4\xe6\xa5\x2d\x35\x36\x25\x9e\x93\xbf\xa8\x9c\x25\x1c\xd1\xd4\x1e\x76\x45\xec\x0c\x0b\xbe\x47\x93\xee\xda\x3a\x54\x06\x23\x47\x91\x5d\x91\x29\x64\xb7\x5a\x5b\xe6\xe7\xbf\x52\x74\xe9\xe6\xf4\xbf\x5b\x9d\xea\x2c\x00\xea\x9a\x21\xa2\x4e\xd3\x34\x16\x9b\x51\x1d\xc4\x50\xe7\x47\xe0\xcd\x90\x84\x03\x44\x53\x67\x3b\x07\x6e\xaa\xfb\xe3\x78\xde\xcd\xcc\xfc\x75\x18\x12\xfa\xab\x6a\x11\x94\x84\x89\xfd\x1c\x05\x94\x14\xb6\xcf\x96\xcc\xa4\x74\xb0\xc6\xe6\xc3\x00\x6d\x73\x62\x28\x5d\xc6\x3f\x22\xe2\x62\xf9\x16\x3b\x1a\xbe\x27\xac\x04\xba\x6d\x60\xce\xf1\xee\xc3\x16\x73\x9a\x85\xde\xdc\xad\x05\xa9\xc2\x76\xee\x57\x40\x35\x85\x35\xec\x30\x8f\x87\x8d\x22\x35\xdf\xe2\xdb\x55\x0a\x6b\x8e\xfb\x26\xe6\x74\x7d\xac\x21\x76\x97\x57\x8a\xe8\xe5\x25\xce\xf1\x37\x71\x39\x33\x3f\xd3\x61\x60\x15\xea\x71\x54\x10\xb4\x89\x1e\x7f\x44\xda\x3b\x48\x38\x08\x84\xf9\x22\x22\x97\xda\xaf\x9d\xdb\xab\x79\x60\x83\xcb\xac\xc0\x4d\x0c\xe4\xc6\x76\x37\x5b\xb7\x8b\x34\x53\x0b\x94\x0c\x73\x8d\x38\xc2\x59\xd1\x16\x85\x0c\xdc\x42\xac\x28\x85\x03\xd3\xd6\x36\x5e\x01\xa6\x62\xa4\x23\x42\xf8\xe9\xa5\x88\x97\x31\xd9\xf3\xe4\xa8\xc4\xb7\x46\x30\x68\xce\xd8\xe8\xa7\x6b\xd2\x5c\xd4\x22\xbd\x4b\xf0\xea\x14\xf1\x1e\xad\xe2\x5b\x60\x4d\x24\xee\x81\x2c\xf3\x0f\xe4\x72\xba\xa9\x16\xb5\xdb\xdc\x8b\xe7\xd6\xda\xde\xbb\x99\x1f\x87\x73\x96\xc8\x54\x83\xb2\x4d\xa9\xb4\x9d\x0e\x01\x49\x6e\xc7\xe9\xeb\x03\x95\x36\x41\xd2\x93\x35\xdc\xbe\xd3\x26\x25\x33\xf7\x5c\x74\x79\x4d\x78\x74\xa8\x0a\x65\xa1\x10\x51\x0e\xf4\xb4\xe1\x2e\x01\x9a\xa1\xde\x63\x01\x9f\x50\x5c\x0a\xe6\x09\xac\xeb\xf0\xdf\xbd\xf6\x52\xe4\x40\xc4\xda\x68\x5a\xa6\x9b\x10\xd8\xa9\xd2\xf7\x0e\xf3\x5f\x19\x07\x83\xe4\xed\x17\x67\xf8\xa2\x3f\xa1\x0b\xe7\xeb\x3a\xcf\xfd\x26\x60\x71\x7f\x20\xfe\xe6\xfd\xd4\x07\x25\x6c\xc1\x35\x67\xa7\x8b\x7c\x98\xca\xff\xa8\xaf\xf9\x40\xea\xce\x97\x2c\xcc\x7f\x92\x70\x3b\x1f\x89\xca\x7f\xec\x3f\x78\x23\xf5\x2e\x8e\x48\x82\xdc\x20\x0e\xf0\xde\x83\xf9\xf3\xce\xcc\xab\xbd\x73\x90\x2a\xdf\x6e\xe5\xfb\x43\xe3\xb9\x9b\xdf\x35\x89\x80\xb7\x0d\xf5\xa8\x2d\xe7\x75\x0b\xfc\xae\x97\x9c\xbb\x90\xf2\xf8\x23\x10\xf7\xe0\x74\xc3\xa2\x14\xa0\x4f\x98\x5b\xec\x1e\xfd\xee\x89\xab\x7e\x7b\x4e\xb2\x80\xf4\x0c\x33\x39\x07\x84\xd3\xad\xee\x7a\x85\x40\x9c\xca\x7b\x2f\x17\x6d\x87\x7a\x1a\x37\xdd\xa3\xf9\x46\x39\x40\x8f\xf4\xcb\x7a\x42\x51\x21\x2d\x8c\xa6\xf1\xd5\xb8\xe6\x2f\x2a\x9d\xbd\xe6\x24\x91\xb7\x69\xbe\xf9\xb6\x22\x02\x74\x5f\xf2\x73\x02\x4c\xbd\x90\x97\x52\xbe\xfe\xd5\x08\xbe\x2f\x8d\xb1\x5f\x4a\x7b\x41\x85\x8e\x9f\xd7\xc0\x8c\x36\x7d\x3a\x1b\x0f\xf8\xb0\xf1\x85\xd6\x20\x30\xa8\x43\x73\x6c\x78\xb9\x7b\x10\x82\xf4\xd6\x63\x6f\xd1\x1f\x11\x3a\x18\xae\x27\x8f\xee\x4f\x04\xfa\x81\xcd\xfd\xd9\x23\xf6\x6e\x2f\x10\x82\x88\x65\x8d\x39\xfd\x4b\x22\x74\x40\x52\x3c\xcb\xa8\xff\xb6\x7e\x6f\x58\x9a\xf8\x35\xf2\x55\xda\x63\x18\x38\xc8\x79\x92\xf7\xf9\x04\x8e\x97\x50\x56\xbe\xa5\xcf\x22\xc6\xdf\x73\x3e\x47\x0a\xe1\x09\x89\x8a\xdc\x0b\x47\x3b\xae\x93\x17\xa6\xa8\xfe\x41\x82\xac\x40\xb6\x72\x1d\x1c\x7c\xde\x8c\x22\x95\xfa\x04\x75\xca\xbf\xf5\xc2\x01\xad\x42\x41\x99\xf5\x3e\xd9\x02\x01\xb2\x01\xd5\xf7\xc4\x02\x63\xee\x2a\x38\x06\x82\x76\xb8\x35\xfd\xc7\xc7\xfd\x99\x7d\x26\x2c\x78\xac\x27\x8b\x9f\xc8\x3e\x64\x06\x2f\x01\x68\x77\x0d\x00\x9f\x42\xe6\x26\xb8\x44\x14\xd6\xe7\xdc\x85\x54\x5a\x79\x2e\xf7\x12\x36\x80\x4a\x0a\x84\x9e\x1e\x1d\x52\xf9\xe9\x28\x79\x6d\x1f\x60\x86\xc1\xdd\x5d\x61\xcf\x2f\x61\x0d\x05\xa7\x6a\x4b\x57\xf0\xa8\x67\x62\x5f\x54\x0f\xe9\x0d\xd4\x63\x78\xfb\xfd\xad\x1c\x5c\x55\x40\xe2\xbd\xd0\xe3\xf5\x2b\xee\xde\x8c\x2f\x11\x69\x3e\x5f\xd7\x37\xf3\x27\x64\x56\xee\x8c\x92\x50\xba\x0b\x91\xb8\xa7\xfd\x9d\x0a\x77\xb9\x62\x23\x94\x5c\x9e\x0d\xe9\x59\xae\xbf\x61\xb6\x2e\x69\xe0\x1b\x27\xc9\x7d\xfe\x82\x7a\x61\xbe\x1d\x46\x86\xc5\xe1\xa2\x67\xbd\x62\xf7\x33\x28\x3d\xb0\x31\xd4\xd8\x1b\x76\x2c\xfe\xff\xdc\x7b\x39\xe0\xb9\x59\x80\x39\x8b\x06\x36\xbd\x16\x91\xc2\x6a\x77\xf0\xad\xe9\xb5\x85\x8e\xf8\x2d\x74\x68\xbe\x0b\xc5\x23\x6c\x69\x53\x7f\x97\xbc\xe2\x27\x9f\xe0\x5a\xbb\xaf\x22\x2e\x7a\x00\x01\x77\xe5\xa6\x72\xcf\x67\x28\x03\x86\xaa\xdf\xcc\x57\xda\x2e\xb3\x75\x0b\x81\x69\xd5\x35\xbf\xe7\xa1\x4b\x02\xd0\xbe\x00\x65\xf5\xa3\x4e\xca\x61\xb8\x65\x62\xd8\xcd\x3b\xfe\x56\x9b\x96\x53\xd3\x2b\x94\x72\x1b\x18\x77\xce\x4d\x66\x50\x3a\x66\x9a\x1f\x41\x2f\x87\xf9\x77\x9b\x1c\x3d\xd8\x3b\xdc\xe9\xdd\x11\x11\x78\x27\xa5\x94\x6e\xc1\xee\x6f\x75\x0c\x8e\x95\x97\xcb\xea\x6d\x2f\x32\xe5\x0d\x53\xc7\xf9\x8f\x05\xb4\xe6\xbe\x3e\x79\x21\x7f\xee\xfa\xa4\x2f\xf4\xc5\x05\x08\xb1\x44\xfb\xaa\x46\x95\x40\xdc\x47\xfa\x23\x40\x28\xa8\x2e\x56\xdd\xc4\xda\x22\x01\x46\x04\x69\xd5\x83\xee\xf1\xf6\x0d\x39\x5e\x83\xee\xe0\x2c\xd9\xc1\x2e\x94\xca\xdc\x86\x51\x01\xc5\x81\xdd\x80\x31\x0b\x61\x7b\xbe\x03\x12\x6c\x8f\x90\xbe\x86\x02\x9a\x02\xa6\x6a\x91\xe4\x0a\xe3\x45\x28\x9f\x35\x9f\xc5\x33\x4d\x02\xd9\xb6\x87\xce\xc2\xb2\x5c\x61\x19\x88\x11\x53\x7b\x61\xec\xd3\x22\xb0\x6f\xd0\x28\x6c\x94\x1e\xf8\x4d\x3c\x0e\xbe\x04\xe3\x9a\x28\x43\xf7\xb4\xe4\x66\xa0\x81\xef\x47\x99\x56\x7d\xd2\x7c\xc7\x3b\x10\x9d\x42\xe3\x09\x59\xf8\x78\x84\xc4\x61\x0e\xd9\xc5\x66\x0c\x6f\x63\x73\x41\x1f\xed\x7e\x22\x53\xfe\x56\x9c\xc2\xe8\xd2\x15\x12\xb5\x76\xd4\x44\x51\xe8\x60\xdd\xca\xff\xea\xdc\xb9\xe7\xe1\x71\xd6\x10\x80\x74\x7d\xc4\xcc\x28\x4f\x11\x08\x29\x7c\x36\x1b\xca\xa3\x08\xcb\x71\x1d\x73\xe0\x45\xed\xea\x09\xd1\x7b\x68\xab\x02\x48\x2d\xaa\x3d\x7e\x9b\xda\xe5\xda\xcb\xeb\x0b\xff\xdd\x13\x6f\xec\xf6\x26\xc1\xc8\x02\x7e\xb1\xa6\x37\x07\x67\x2e\x6e\x18\x11\xbb\x19\x1b\x67\x3c\x67\x41\x7d\xb3\xae\xf3\x6f\x91\x72\x95\x45\x44\x25\x5d\xb6\x89\x0d\x21\x89\xee\x05\xbb\xe7\x0e\x14\x2f\x81\xc8\xc0\xea\xec\x29\xc0\xb8\xb5\xe9\xbb\x5d\x13\x25\x06\x30\x3b\x10\xca\x73\x9a\xb7\xd4\xd5\x45\x52\x80\x93\x4d\x5c\x08\xdc\x75\xd5\xe7\x9b\xa1\x80\xf8\x00\xe7\x4a\xdb\x70\xd0\xb0\xc9\x71\xba\xfc\x2e\xd5\x8e\x4b\xe4\x24\x78\xb0\x40\xe9\x01\xb3\x3b\xf0\xb0\x69\xd2\x25\x07\x60\x57\x8f\x24\x18\xfe\x36\xac\x70\x5c\xa7\xaa\x0c\x97\x2a\xa4\x97\xb4\xaa\xae\x3c\x7f\x4d\x65\xe9\x89\xe9\xc1\xc4\x05\xd1\xe2\x79\x0c\xa0\xaf\x83\x6b\xf9\x7f\xfa\x79\x63\x95\x9b\x48\xda\x10\x49\x84\x6a\xae\xc0\xad\x2f\x92\x92\xe5\x94\x99\x19\xd6\xaf\x3d\x25\x00\x98\x5a\x7b\x26\x21\x63\xf1\x44\xec\x0a\x65\x44\xda\x83\x66\xd0\x76\x0a\xdd\x4b\x57\x69\x14\x7c\x77\x4b\x4d\x97\xd1\x21\xb7\x0a\xe3\x98\x71\x8f\x00\xf8\x13\x2e\x78\x52\x93\x80\x87\xb3\x0b\xcd\x52\xd8\x67\x86\xac\x35\x3f\x04\x12\xf7\x3c\x42\x9e\x11\xb9\x37\x5f\x09\xc4\x81\xbe\x4f\x47\x51\x9e\xf3\xfa\x56\x8a\x2e\x0a\x43\xcf\x0a\x13\xc5\x7d\xaf\xb4\x7e\xa2\x15\x49\x01\x95\xc7\xb0\x5e\xf0\xef\x06\xbb\x4e\xbd\x48\xb9\x30\xac\x77\x40\x26\x20\x69\x04\x60\x56\xd1\x8a\x4f\xef\x1a\xf9\x25\xd0\x95\x04\xc8\xe2\x75\xfd\x71\x80\x6c\xde\x08\x67\xfd\x47\x88\x29\x58\x55\x44\xe0\x96\x7a\x52\x96\x51\x43\x30\x6b\xdb\x2a\xa5\x77\x91\x22\x39\x37\xbe\x14\x8e\x9f\xe5\xf6\xda\xbc\x50\x02\x51\xae\x65\x67\x11\x12\x36\x50\x01\x27\x9b\x29\x48\xed\x6a\xc3\xe0\x5d\x38\x15\x56\xcb\x3d\xbc\x32\x69\x64\x39\x93\x2a\x79\xce\xcc\xf6\x9d\xf3\x78\x71\x8a\x74\xba\x1b\xa5\x9f\xf9\x1c\xda\xbd\xa7\x6c\x0e\x4e\x70\x4c\x03\x97\xe2\x98\xd9\x4a\x58\xec\x5b\xdd\xe1\x99\x5f\x33\xe1\xae\x4e\x6c\xda\xb9\xae\x86\x63\x27\x75\xed\x4e\xe9\xaa\xb9\xee\x70\x78\x73\x4a\x01\xde\xbd\x39\x39\x69\x73\x3c\x6d\xfb\x5f\xd3\x49\xe5\xca\xb0\x0d\xb3\x06\x2e\x0b\x3b\x0d\x47\x2b\x62\x67\x2b\xcf\x92\xb9\x0e\x20\x01\xe8\x07\x71\xa6\xab\x63\x53\x7b\xda\x33\xc3\xdf\x2d\x2a\xfb\x99\xe4\x47\xe2\x12\x91\x52\x92\xec\x39\x3c\x07\xc2\x23\xeb\x88\xf1\xfb\x52\x77\xca\xf4\xb3\x2b\x7e\x37\x6c\x44\x7a\x69\xec\xee\x16\x7c\xb7\xb2\xd1\x07\x64\xcb\x82\x7d\x84\x56\x5b\x58\x5a\xc9\x76\x1d\x70\xa9\x8c\x48\xad\xed\x81\xfa\x6d\xe2\xff\xb6\xb8\x13\xfb\xf6\x40\xd6\x5b\xea\x91\xa7\x84\x96\x1c\x46\x2b\xa0\xec\x51\x7a\xe2\x69\x37\x8e\xc0\x2d\x10\xbe\x36\x1c\x3c\x57\x50\x07\x9e\x3c\xc2\x3a\x0b\xbb\x7f\xd8\x3c\x2f\x51\x52\x71\x7d\x6f\x2c\xca\x5a\xf3\x26\x67\x18\x8b\xa8\xad\xe8\x72\xb5\x08\xe4\xfb\x0c\xd7\xcf\x49\xc2\x94\xbd\x34\x28\x9b\x28\x88\x85\xc9\x8b\x96\xee\xe3\xa9\xf6\xd6\xba\x98\x8e\x3a\x98\x0f\x3e\xa8\x47\x8e\x5f\x91\x39\xde\xb1\x65\x48\x3a\x5a\xd3\x39\x13\x17\x0b\x90\xa3\xa2\x06\xac\x5d\x22\xb0\x06\xd3\xcf\x32\xef\x49\xfb\xad\xb2\xdf\xf4\xe9\xde\x2c\x4c\x2e\xba\x65\xee\x01\x87\x57\x69\x5e\x66\x25\xb8\x8f\xac\x1f\x9d\xde\xa1\xce\x99\xfe\x6d\x42\xd3\xbe\xd6\xf9\x8b\x21\xa6\x98\xde\x91\x08\x58\xb2\x25\xb3\xe8\x16\x78\xf7\x71\x68\x06\x6a\xcb\x44\xa4\xae\xf5\xd7\xd4\xaa\xbc\x04\x4e\x46\x45\x85\xf7\xd5\x7a\x77\xa1\x78\xcf\x90\x96\x38\x84\x30\x3d\x84\x1d\x3b\x12\x48\x4b\x97\x54\x2f\x0b\xcb\xc0\xc8\x20\x6f\x59\x5e\xa1\x91\x61\x39\x92\x73\xcf\xa0\x3e\xfa\x9c\x59\xbb\x6b\x5e\x6e\xc5\x7b\x42\x04\xe7\xbd\xd2\x89\xa9\x9c\x74\x74\x2b\x9a\x0e\xd8\xc4\xd6\x1e\x19\x3a\x84\xb2\x85\x2e\x13\x69\x39\x25\xae\x5c\x71\xf6\x54\xd0\xc4\x00\xe2\x95\x30\x5d\x19\x38\xb4\x2d\x43\x56\x46\x44\x0e\x64\x05\xf9\xed\x5d\x91\x04\xd7\x5c\xc3\x8f\x80\xde\x97\x26\xde\x16\x0d\x12\xd0\x7c\xea\x2d\xd9\x09\xb8\xde\xed\x34\x55\xe5\x84\xa6\xa6\xbc\xb4\xf6\x28\x6d\xec\x65\x0d\xf4\xef\xf5\xc7\x88\x74\x11\xaf\x74\xb7\x6e\x72\xa2\x62\x2f\x42\x55\xc8\xf7\x5c\xc1\x3d\xa5\xbc\x66\x8d\x19\xfb\x9e\x39\x03\xa4\xfa\xa1\xaf\x49\x73\xe8\x6d\x8e\x69\x93\x5c\x63\xa8\xa1\x6f\x15\xa3\xf8\x3b\xa0\xbe\x83\xa6\x68\xd6\x6c\x53\xf7\xaf\x4e\x6b\xa7\xe9\x85\xbd\x8a\x7f\x84\x0d\x36\xa8\x70\xf9\xd2\xad\x68\x36\xb4\x01\x44\xf7\xda\xe4\x8f\x15\x0b\xff\x64\xef\xbb\x70\xf6\x1e\xff\x10\xeb\xab\x65\xbe\x78\x28\xd9\x1f\x6d\xc5\x5e\x73\x1e\xcd\x66\xcf\xe5\xad\x88\x45\x09\x44\x72\xe1\x72\x13\x54\x8d\x29\x01\xf5\xd5\xb5\xde\x9c\xe3\x25\x70\xf0\x1a\x83\x77\x0b\x07\xdd\xdf\xad\x4c\xfc\x55\xf2\xe4\xf3\xaf\xe7\x6b\x22\x70\xd3\xc1\x53\x81\x87\x70\x74\x70\x12\x74\x18\xcf\xeb\xcc\xc8\xae\x7f\x43\xd1\xc2\xcb\x97\xca\x99\x5e\x3b\xd3\xe3\x60\x1f\xac\x07\xf0\xa0\x09\x61\xe2\xde\x04\xf2\x57\x6a\x09\x5b\xf3\x31\xcd\xca\xa9\x83\xff\xf5\xa2\x58\x97\x7f\xda\xaf\xd8\x65\xbf\x12\xa1\xc4\x3b\x71\xd6\x70\xf6\xe8\x84\xc9\xb6\x46\x82\xef\xe3\x16\xb2\x78\xa8\xfa\xf0\x8a\x79\x11\x9f\xff\x6c\x3a\x55\x2f\xdf\xf2\xa0\x2f\x81\xb9\xf1\xff\xd4\xdf\x32\x78\xdc\x7a\x1b\x4f\x9f\xfe\xfa\x59\x38\x35\x47\xd6\xf2\xda\x15\x85\xb5\x39\x84\x3f\xcf\xc0\x0f\x2f\x73\x8b\xf2\x77\xed\x58\xdf\x01\x3b\x4e\x01\x8f\xb6\x70\x78\x0b\x69\x4c\xa3\xa1\x08\xf9\xec\xf4\x7d\x0d\xc1\x4c\xa0\x92\x43\x3a\x14\x56\x3e\x82\x2a\xaf\x55\x72\xa3\x3d\xdf\x47\xc2\x94\x53\x44\xc3\x1a\xc2\xa4\x69\x2d\xc2\xf7\xbe\x75\x1b\x95\xec\xdb\x92\x0e\x61\x3d\xaa\xd4\x3d\xaf\x2a\x2b\x62\x8b\x25\x8a\x8a\xdb\x40\x69\xcb\x3b\xcb\x11\xf5\x2a\x61\xa6\x7a\x7d\xf1\xcd\x35\x44\x35\x4f\x82\x88\xcf\xab\xac\x59\xe0\x64\x58\xd9\xca\xa9\xd5\xa1\x18\x82\x2a\x07\x84\x64\x83\xe9\x52\x18\xbc\x42\xf2\x93\x67\xc0\x4a\x22\xa4\x3c\x4f\xe9\x76\xee\x63\x60\x9b\x99\x1d\x03\x7c\x59\x50\x76\xe4\x91\xe2\x6e\x43\x13\x90\xbf\x78\x0d\x4c\xf2\xda\xfe\xeb\x2a\xa0\xe6\x96\x7e\x97\x2a\x65\x4f\xe1\xaa\xbd\x35\xf4\xa8\xb7\x59\xe3\xcc\xff\xc0\x37\x35\xf5\xd6\x9c\xe8\xea\xc1\x40\x88\xd8\x65\x71\x41\x57\x6a\x41\xad\x55\x3a\x72\x2b\xd2\x41\x04\x31\x03\xef\x75\x32\xb4\xa1\x48\xc7\x43\x40\xfe\x93\x57\x6b\x85\x66\x88\xa4\x40\xa1\x5b\xe8\xbd\xf2\x2a\xee\xd5\x2a\x42\xcb\x5a\xdc\xe3\x9b\xdb\xef\x41\xaf\x76\x08\x73\x94\x00\xd7\x32\xc9\xf1\xb5\x8c\x4c\x26\x5b\x10\xa9\x8b\xb5\xa8\xd6\xb8\x16\x59\xf1\xd9\x9b\xe2\xfe\xba\x08\x81\x9c\x1c\x09\x6f\xfe\xce\x59\x20\xa4\xc5\x75\xca\x23\xa2\x5d\xe7\x3d\x84\xcc\x4e\x38\xae\xda\x68\x6e\x42\x7b\xee\x31\x7f\x1a\x21\xa5\xab\xb3\x2e\x6e\x1d\xab\x6b\x0a\xa2\xc0\xc6\x04\xc4\x19\x89\xb6\xa6\x56\x6a\xad\x8d\x30\xbb\x6b\x70\x66\x2c\x18\x40\x0c\x64\x48\xd7\xda\xb0\xf9\xf2\xc0\xff\x91\xbd\xcf\x8b\x82\x7d\xa2\x39\xe9\xca\x09\x16\x94\x2c\xf9\x8d\x0c\x68\x07\xae\xd5\x7f\xe9\x56\xb2\xbe\x6c\x28\x34\x09\x0a\xfd\xf9\xb0\xe0\xb0\xa6\x57\xc0\x0e\x56\x8c\x15\x08\x69\x7e\x05\xee\xd0\x42\x5e\x6b\x9b\xb7\x8c\x7b\xa0\xa9\x25\x5f\x5a\xe5\x00\xe3\xbe\xb5\x0a\xe2\x3e\xd8\xfb\x35\x71\x73\x90\x34\xd4\x2a\xe3\x83\x0e\x22\xa4\x99\x3d\xc5\x0b\x57\x08\xc4\x62\x41\x53\x31\xd5\xaf\x05\x52\x43\x27\x78\xc4\x3f\x74\x2d\x21\xfe\xa3\x6d\xd3\x91\x36\x6d\xbe\x81\x4a\x40\x50\x37\x44\x6b\xeb\xd5\x42\xed\xdc\xe7\xa6\xc0\xda\x71\x32\xb8\xa6\x44\x4f\xd9\x7a\x0b\x4c\x2d\x3c\x31\xcb\x26\x4b\x25\x7a\x67\x39\x21\xfa\x24\xab\xda\xda\x04\xea\x16\xf0\xea\xf8\x7d\xfe\x82\xaa\xf7\x08\xc2\xb8\x15\x7d\x24\xdd\x67\xa9\xf4\xbb\x14\x60\x3a\xfd\xf8\x28\xff\x30\x58\x65\x61\xb2\xa8\x45\x59\x8a\x4c\x85\x97\x12\xfa\x2f\x88\x2e\x09\xa6\x42\x1a\xcb\x37\xdb\x39\xb5\x5a\x6c\x04\x40\xf8\xb4\xf5\xfb\x34\xd0\xb5\x91\x03\x16\x6b\x65\x4b\xb8\x48\xfd\x7c\x11\x8e\x76\x59\x93\x4f\xd5\xe1\x53\x3b\x92\x6d\xe3\xe2\xa7\x42\x51\x37\x2f\x81\x25\x64\x01\x10\x34\xaf\x58\x8b\xe5\xe7\xb8\xb8\xf9\x82\xff\xc7\x79\x1d\x89\x95\xb0\xa8\x2f\x6f\xb9\xde\x46\xd7\x67\x91\x4f\xfb\x16\xd7\xba\x50\x0f\x09\x77\xda\xeb\x96\x3d\x2d\x80\x9b\xf2\x94\xcd\x7e\x7c\x02\xc3\xf3\x1f\x8b\xda\x75\xf8\x4a\xac\xce\x61\x70\xfb\x48\xf1\x1b\x13\x38\xfa\x2d\xdf\xb3\x10\x49\xbd\xa4\x4b\x0b\x61\xd5\x53\x5c\x75\x9b\x48\x07\x8a\x3e\xcd\x21\xd0\x3a\xbf\x66\x2e\x77\x47\x6b\xd7\xb3\x27\x07\xfe\xb7\xda\x0f\x8e\x49\xfa\x6f\x05\x67\x08\x01\x78\x7c\xcc\x8b\x43\x80\x75\xa0\x16\xe6\x2f\x7a\xb3\x3d\x14\x58\x11\x37\xb9\xd6\xc7\xe3\x9c\xc3\xf0\xd6\x7f\xf7\xaf\xaa\x12\xbf\x48\xb4\xf0\xfe\xfe\x42\x34\x77\xe7\x97\x52\x87\xfb\xf5\x69\x41\x80\xc5\x31\xdf\xf2\xf4\xcd\x6f\xaa\x7e\x91\x7e\x13\x38\x19\xbe\xaf\x3d\x80\xcc\x52\xff\x72\x9c\x35\xbf\xd2\x95\xc2\x2b\x57\x8a\xae\x17\xe7\x4d\xf3\xce\x7b\x38\xef\xac\x2e\xdb\xcc\x88\x7d\x37\xd0\xd2\x0f\x30\x99\x10\x67\x8e\x87\x20\x05\xc9\x25\xc8\xd1\xd4\x4d\x9c\xde\xab\x8c\xf6\xa7\xfa\x4f\x65\xa6\x29\xd4\x57\xeb\x86\xdc\xdc\x9b\x98\xf3\x48\x8f\x4c\x04\x17\x4f\x6e\x04\x33\x68\xc3\x15\xe0\x0f\x8f\xfa\xc5\x5e\x4d\xa2\xc4\x5f\x59\xd2\xae\x3e\x11\x97\xbf\xee\x53\x18\xf0\xda\x90\xe3\xf5\x14\x62\x72\x2a\x97\x70\xe9\xc7\x28\xd4\x73\xd9\x04\x8c\x75\x18\x79\xa0\xce\xed\x25\x5a\xe9\xaf\x5b\x16\xca\x4b\x63\xb4\x74\xa4\xea\x59\xed\xa9\x44\x16\x0c\x6a\xb0\xf1\x16\x30\x0e\xe3\x13\x7c\x12\x47\x6f\xb2\x1b\xe3\xae\xb6\x40\x78\xb9\x02\xeb\x1c\x9e\x6c\x53\x53\x9e\x46\xb4\xea\xdf\xcf\x7b\x48\xc6\x76\xce\x85\x9e\xbc\xbf\xf0\xe0\xfc\x04\x6a\xfc\xbc\x3f\x71\x7c\x17\x79\x6f\xa7\x01\xa0\x51\x62\xf0\x47\xe3\x75\x3f\xa5\x05\xbb\x07\xd6\x1c\xd4\x1f\x0f\x34\x4c\x80\x14\xcd\xc2\x6d\xd6\x31\x9e\x23\xa0\xd3\xaf\x22\x37\x5f\x1b\xd5\xfa\x72\x54\x1e\x03\x0a\xb3\xda\x75\x94\xc4\xec\xc3\xbb\x6a\x97\x98\xed\x43\x40\xf6\xbd\x86\x97\x6f\x0d\xa1\x5c\x6b\x89\x42\x4b\xf6\xa6\x58\x0f\xbc\x7f\x67\x7a\xfc\xba\x7e\xd4\xa5\xd0\x25\xf6\xa7\x90\x4d\x07\xd6\xbd\x84\xcc\xec\x76\x85\xbc\xac\xde\x50\xc8\xca\x6a\xd5\x57\xb9\x71\x8a\x61\x10\xcc\x44\x43\x04\x0e\x23\xf9\x98\x7f\xb9\xa2\xec\xc5\x89\x1e\xe2\x51\x00\xe4\x1a\x93\x4c\x80\xdf\x1d\xfa\x5c\x5d\x57\x33\xd3\x2c\xf8\x2b\xfd\x0c\x48\xfc\xa3\xbc\x03\xb0\x5e\x57\x87\x4c\x9f\xf3\x25\x24\x35\x52\x4c\x3a\x43\x1b\xc2\xbd\xb8\x59\xa0\xd3\xe5\xa1\xef\x08\x73\x45\xa7\x44\x8e\x46\xf2\xa6\xec\x49\x95\x46\xab\xe3\xca\x1d\x16\x60\x21\x07\xd3\x6e\x16\xcc\x60\x3d\x26\x6d\xa6\x31\xf9\x58\x1a\x0c\xdc\xc1\x1b\x8a\xfc\xab\x55\x4c\xd9\x71\x3e\x87\xaf\x83\xb0\xab\x5d\x78\x90\xa4\x05\x8b\xb1\xe4\x41\x1c\x36\x66\x37\xcd\x56\x78\x10\x38\xdd\x3a\xfe\xde\x83\x66\x24\xdc\x75\xb3\xf6\xc5\x4c\x7f\x17\x58\x7d\xa3\x55\x07\x3e\xe4\x5b\x2f\xe6\xf8\x47\x4f\x14\x31\x99\xb3\x23\x2a\x30\x82\xaa\xc3\xbd\xd1\xab\x72\x0c\x3d\x00\x5a\x25\xf6\x57\x5b\x05\xbc\xb9\x5f\xcd\x24\x03\x59\x97\x7c\xd5\x57\x42\x08\x20\x48\x9c\xe2\x5a\x98\x89\x47\xb7\xd3\xf3\x7f\xce\x6e\x0e\xb8\x71\x59\xf2\x86\xfd\xe5\xa3\x36\xd1\xd0\xc7\xd9\x54\x55\xcf\x79\x26\x3c\x7c\xce\xc3\x4a\xf0\xb7\xcb\xba\xb6\x5e\xc5\x3e\x0b\x84\xf8\x38\x13\x47\x19\xc8\xbd\xfa\xd2\x6e\x34\x91\xe7\x01\x9d\x7a\x14\xe8\x89\x31\xc2\x34\xd6\x83\x55\xc3\x90\x47\x89\xd2\xfe\xa3\xb0\xfc\xfd\x50\x9f\xe0\x3e\xc5\xc4\x8c\x0b\x80\xbd\x66\xd9\x2b\xc3\xba\xd8\xbb\x31\xa8\xbe\x8a\x4f\xff\x10\xdc\xe2\x31\x9f\x34\x42\x7a\x40\x4a\x4d\x0d\xde\x63\xde\x1f\xf2\xd8\x79\x60\x5c\xcb\x76\xe5\x31\xb7\xc3\x38\x79\xd8\xd7\xb9\x44\x78\x03\x8a\xef\x89\xd9\xc9\x47\x30\x09\x1e\x36\x82\xd5\x3b\xf6\x80\xa2\x1c\x45\x62\x9f\x74\x54\x46\x2e\xc1\x77\xb4\x6b\x42\xd3\x65\x9f\x43\xfd\x48\x3f\x96\x5f\xb5\x25\x9f\x9d\x07\xb0\x30\xef\x1f\xe1\xca\x83\xf6\x6c\x1f\x62\x65\x40\xda\x13\xfb\x82\x07\x6c\x88\x42\x51\xd6\xe7\x0f\xf9\x5a\x08\x73\xce\x51\xd8\xcd\xf4\x22\xca\xa7\x8f\xcc\x90\x71\x3b\x7d\x49\x14\xea\x17\xf0\x96\xb7\x47\x3c\x9f\x79\x53\xf5\x0d\xee\x6d\x92\xfe\x41\xcb\x5d\x09\x0d\xc8\xab\x3c\x0e\xa0\x22\x90\x62\x9f\x15\x43\x70\xef\x66\x90\x5c\x6a\x87\x62\x5b\x89\x6b\x2b\x5b\xe5\x41\xd2\xe6\x39\xfc\x04\x81\xe1\xf6\xff\x60\xc3\x12\x99\xa6\x0e\x35\xe0\xd4\xf0\x9e\xd7\x2a\xbf\xac\x43\xdd\x57\x26\xef\x1c\xab\xce\x55\xe1\xc8\x39\xd4\x31\xfc\x92\x65\x67\x6a\x11\x21\xd1\x57\xa9\xde\xc3\x0f\x27\x79\x8e\xc3\x29\x96\xe3\x50\xaa\x8c\x8f\x85\x15\x1a\x90\x88\xd5\x92\x1b\x48\x82\x77\x28\x2b\xc7\xea\x83\x3d\x3c\x82\x78\x37\xe2\xfa\x00\xdd\x2b\x07\xd5\xe3\xc7\x73\x38\x05\xfc\xf8\xd9\x11\xb5\x0d\xc3\x38\x02\xc8\x5f\x84\xae\xe7\x60\xd8\x0d\xe0\xa3\x8f\xd4\x89\x85\x50\xb0\x12\x73\x03\xa4\x82\x7d\x79\x07\x9c\xfc\xe2\x36\xe7\xb7\xa7\xb3\x0f\xc5\xc9\x94\x8c\xb9\xea\x28\x01\x32\xdf\x6d\x3e\xa8\xff\xf6\x15\xa5\x15\x0c\xc3\xf1\xe6\xef\x08\xe4\x14\x9d\xd7\xda\xeb\x4c\x56\x0a\xcf\x66\xa8\xef\x34\x54\x3a\x65\x54\x10\x68\x05\x94\x82\x3d\x9a\x27\x9e\xec\x14\x62\xbc\xae\x23\xcb\x68\x62\x0b\xef\x36\xcd\x95\xdf\x76\x76\x1b\xf8\xad\x14\x7c\x86\xf0\xce\x1c\x32\xf9\xcb\x43\x92\xc5\x34\x06\x72\xe1\x0f\x34\x00\x6b\x4b\xdf\xc0\x21\x85\xb6\xae\xc8\x09\x69\x0a\x67\xe6\x89\xbe\xfa\x43\x92\x6b\xe0\xe0\x34\x64\xc7\x02\xd7\x5b\xaf\x4b\x5f\x65\xb9\x85\x9c\x8b\x80\xc6\x5e\x26\xbf\x18\x91\xbc\xd5\xd7\x50\x33\xeb\x21\x8f\x76\x31\x5b\x0d\xd7\x15\xbe\x00\x16\x59\xef\x8b\x33\xeb\x4f\x72\xc2\x9d\x4d\x1e\x6a\xbc\xc7\x25\x08\x7c\x91\x56\x2c\x0a\x03\xcc\x59\x3b\x02\x5e\xc6\x75\x88\x13\xd4\xb5\x1d\x24\x7c\x72\x26\x0b\x3c\xfc\x20\xc8\xf8\xb3\xe9\xe6\x3e\x85\x39\x3f\x29\x5c\x0b\x2c\x05\xad\x95\xed\xa8\xfa\x15\xd0\x54\x52\x74\x04\xe6\xfc\xd0\xb8\xab\x47\x16\x91\x10\x6c\xb7\xfc\x21\xde\x19\x9c\x7d\x12\xad\xa0\xd1\xcb\x69\x53\x5f\x36\x15\x92\x01\x66\x97\xad\x5d\x2f\x49\x88\xbe\x4c\xa1\x05\x6c\x23\x2b\xc1\xc1\xcb\x1f\x04\x3d\x19\x03\xf6\x9a\x48\x31\xbb\x27\xf1\x1b\x92\xbe\xc4\x2b\x22\x81\xc6\x84\x3f\x45\x7a\x19\x58\xf7\x2c\x15\x60\xe1\xfe\xe7\x9b\x0d\xa4\x05\x81\x64\xb7\x6e\x48\x17\x03\x45\x8a\x2f\x8a\x7c\x3a\x21\xc0\xfa\xfa\xeb\x44\x1d\xc2\xbd\x8d\x6c\x10\xae\x75\x54\xf5\x3d\x19\xd9\xdc\x81\x5f\x4a\x88\x1b\xc1\xdc\xc7\xaa\x59\x68\xf9\x3c\xf3\x86\xdb\x60\x6e\xd2\x2a\x7b\x16\x25\xc5\x2b\xbb\xfb\x1e\x7a\x4c\x84\xbf\xaf\x6b\x20\xdd\x91\x82\xe0\x46\xbf\x04\xc9\xa7\x67\x43\x04\xf4\x98\xa3\xea\xce\x40\x17\x58\x72\xc4\x48\xd3\x48\x82\xd7\x63\x37\x2d\xe6\x87\x4b\xf6\x04\x3d\x6c\x32\xb2\x20\xec\x72\x8b\x81\x14\x21\xf7\x77\x6e\x07\x7f\x1f\xe8\x92\x4d\xa1\x13\xda\xc2\x65\x7f\x2b\x8a\x0d\x56\xe5\x77\x01\x86\x1f\x02\x5f\x7f\x1c\x25\x50\xf1\xb9\xd7\x2a\x09\xca\x23\xf7\x18\xff\x7b\x97\xf2\x71\x72\x55\x0d\x7d\x9b\x05\x6d\x5f\x7b\x94\x51\x78\x69\xd2\xd0\x64\x88\x3b\xbd\xe9\xdd\x9b\xea\xaf\xef\x3f\x72\xc1\x77\x3f\x11\x0e\x5b\x03\x6a\x5d\xc5\xe5\xe9\xaa\x97\xa7\x89\x92\xad\x9c\x55\x76\xc4\xd5\x63\x26\x25\x58\x70\x85\x9c\x5a\xd3\x0d\xae\x0d\xf8\xcc\x91\x8d\x47\x83\x06\x9c\x80\xc0\x87\x86\x31\xc0\xf0\x9a\xd5\xc3\xef\xfb\x97\x70\xfb\xb3\x6e\xab\xdc\xb0\xd1\x6b\xe8\x00\x36\xe6\x9d\x9a\xfd\x77\x6d\x68\xf6\x12\x23\x6c\x0b\x63\xcc\xe0\xe2\x8d\x3c\x94\x32\xf3\xe0\xbb\xea\x94\x2c\x1a\xd8\x9e\x42\xe3\x40\xbd\xac\x85\xb1\x9c\x83\x33\x06\x2c\xfc\xa0\xb5\x78\x02\xc8\x52\x04\x75\x37\xc5\xbf\x49\xa1\x7d\x9c\xa8\x92\x21\x5f\x73\xb1\x64\xba\xf2\x4f\x92\xbe\xa5\x86\x6a\x30\x72\xd9\x9c\x76\x03\xf6\xae\x7f\xa4\xdc\x23\x00\xef\x01\xd8\x2f\xa7\xd3\x49\x5d\xab\xf8\x64\x00\xd9\x97\x33\x80\xee\x36\x26\x2e\x52\x1f\x46\x2b\x42\x4d\xe4\xe0\x15\x94\x5f\xde\x4c\xa4\x6e\xb8\x0c\x98\x5b\x57\x46\xfd\xa4\x22\x0c\xbf\xb5\x75\x40\x0a\x10\x93\x6e\x97\x4d\x33\xdb\xae\x74\xba\xd7\x48\xdd\x91\x58\x80\x21\xa0\x4c\xb4\xe1\x57\xc4\x75\x48\x4b\xcf\x8c\x9c\xa9\x28\x4f\xed\xdf\x72\xc6\x8d\x43\x8b\x20\x41\x65\x3f\x80\x07\xf6\x6b\xfc\xe8\x33\x44\x70\xd7\x10\xbe\x6e\x96\xf6\x9d\xd0\x90\xdd\x3c\x0c\x6e\xa6\xe7\x41\xa0\xf1\x67\x40\xef\x43\xd3\xf8\x29\x86\x01\x5e\x04\xfa\x8a\xa3\x70\xec\x6d\x23\x60\xf0\x36\x2e\x8b\x9e\xdc\x89\x6a\xb7\x02\x00\x41\x3f\x8c\xd7\xb9\xd9\x99\x37\x6f\xf2\x73\x69\x45\x99\x0e\x4a\x38\xdc\x6d\x97\x47\xbc\x0d\x21\x22\x5a\x55\xde\xed\x32\xce\xaf\xf1\x0e\xb2\x3d\x80\xf1\x60\x22\x09\xae\x20\xa8\x01\x50\x62\x51\x98\x02\xe9\xd8\x25\x2f\x54\x3a\x5a\x1d\x40\x34\xc6\xfa\x3f\x29\xc4\x1d\x21\x6e\x2c\x49\x64\x0b\x3a\xed\x11\xe9\x78\x0b\x3b\xf1\x2c\x00\xea\x1e\xd8\x31\x74\x54\xef\x3d\xb9\x71\x53\x41\x9e\xf9\xab\xd4\xbc\x60\xd9\x04\xa2\x3d\x66\x4e\x02\xb1\xb5\x97\x8c\xfa\x44\x59\x06\x0b\xbd\xc7\xe8\x92\x6c\xda\x67\x32\xd1\xd2\xc7\x7f\xa9\x7b\xbb\x24\x06\x5f\x88\x6b\xaa\x97\x8a\xff\x09\x43\x0b\x5f\x02\xed\xee\xe8\x71\x88\xa3\x3a\x84\xdd\x26\xe1\x2c\x32\x41\x2d\xb9\x95\x2d\x92\x46\x06\xf8\xd1\x75\x50\xa0\x1d\xf2\x4e\x04\xfd\x50\xa5\x64\x0c\x61\x2c\x1e\xff\x4c\x12\xf0\x49\xf0\x55\x14\x22\x5e\x4a\xee\x8e\xd8\x0b\xed\xe3\x8b\x94\x23\xaf\x7a\xf0\x4b\x71\xeb\xd2\xf6\x72\x63\x6a\xe0\xe8\x29\x52\x94\x02\x2a\x0f\xd0\x0e\x91\xef\x92\x08\x4b\x6b\xe1\x62\x0d\x4b\x56\xcd\x20\xa0\xf6\xa9\x67\xdc\xae\x94\xde\x71\x9b\x0f\x66\x0e\x4e\x5d\x09\x43\x28\x7d\xd8\x3b\x10\x2a\x3f\x70\xa0\x05\xb4\x22\x3b\x1f\x46\x4d\x16\xd9\xb3\x44\x10\x3e\x26\xc2\xbe\xeb\xbe\xc8\xfa\x2e\xf9\x2d\xfd\x28\x39\xfb\xa9\x92\xc4\xfb\x40\xbb\xd6\xef\xea\xa7\x66\xce\x10\x3f\x1c\x97\x7f\x8a\xf7\xfc\x1f\x96\xd4\x3f\xd9\xc7\x82\x1f\xe6\xef\x3f\x99\xb2\x33\x1f\xa7\x89\xdd\x0c\x3d\x6d\xfd\x2e\xf5\x72\x32\xfc\xbb\x10\x34\x5f\x98\xe2\x7c\x67\x80\x42\x1c\x67\x9f\xf6\x58\xfa\x33\xf0\x4e\x32\x2d\x04\x4a\xde\x11\xd6\x6f\x19\xa7\x07\xb9\x14\x91\x98\x84\x40\xd0\xd3\xf0\xbc\x08\xdd\xf6\xf2\x4c\x04\xbd\xcf\xcb\xa6\x6a\xe4\xcb\x86\x73\xd7\xe7\xcd\xef\xc5\xd0\x78\xed\x39\x60\xf4\x3e\x04\x74\xe7\x75\x06\x91\x71\x79\xcd\xca\xc7\x00\x43\x4f\xbf\x74\x1b\xec\x2c\xde\x72\xbc\xa8\xde\x41\xd0\xfd\xba\x4e\x25\x3c\xdb\x57\x0d\xf7\x5e\xb3\x7e\x06\xf4\xb2\xb8\x42\x08\x7c\x41\xce\xe7\x74\xf3\xe2\x03\x43\x9f\x55\xd4\x7d\x4d\x76\x61\x35\x1d\x76\x3b\x77\x1f\x94\x41\x7e\x39\x55\xc9\x29\xbf\x39\xc2\x7d\x79\xb6\xfa\x0b\xad\x1f\x70\xbb\xfc\x1f\x64\x31\x20\x5c\x84\xd9\xc1\x08\x0e\xad\x8f\xd6\xca\x3e\xac\x78\xf8\xe2\x83\x67\xfa\x5f\x01\x8b\x6b\x3a\xb2\x2f\x81\xfa\xc3\x6e\xc9\x82\xa5\xe9\x48\x27\x25\x95\x2c\xf8\xca\x85\xd8\x87\x59\x10\x7a\xbb\xb6\x99\x11\xaf\xbf\xcf\x45\x79\x7f\x30\x38\xe3\x77\x71\xbe\x02\xbe\xbd\xdc\x5a\xd4\x6f\x9c\x4d\x14\x04\x45\x40\x18\x66\xf9\xa1\xfc\xfd\x02\xfc\x0b\x3f\xeb\x09\xcf\x76\xe2\xe9\xc1\xec\x42\xc6\x0c\xfb\xc0\xdb\x65\xa6\xaa\xf1\x93\x22\x16\x0e\xa3\x3f\xcf\x2a\x69\xe8\xd5\x5f\xb6\x16\x4a\x37\x7a\x85\xe4\xcd\x93\x1e\xf1\x20\xe1\x73\x6d\x7f\x87\xc1\xcd\xd3\x26\xf2\x42\xd5\x43\xe7\xed\x62\x68\x0f\xcb\xbc\x09\x32\xaf\x84\x12\x3d\xf3\xe4\x09\x9f\x89\xe6\x7a\x7a\x66\x21\x33\xa2\x0a\x75\xda\x9f\x39\x80\xf0\x37\x00\xef\x45\x80\xf7\x1c\xa0\xf9\xa1\xc1\xe7\x7b\x4e\x9a\x2d\xb2\x26\x92\x65\xfc\xa7\x2b\x9b\x4f\x3a\x82\xb5\xd0\xcf\x39\x3b\x7a\x25\x7c\xe4\x2b\xc1\xd9\xf5\x18\x72\x40\x92\xea\x7e\x7a\x41\xbd\x42\x6d\x86\x10\xee\x77\xcb\x1f\x5a\xfb\x4a\x91\x99\xbb\xee\x81\x37\xaf\x19\x18\x4d\xa2\xd0\x35\x66\xb9\x25\x18\x0a\x14\x39\xd5\x02\x6e\x98\x00\x4b\xd1\x58\x23\xd6\x1b\xa2\xee\x44\x5f\xdd\x85\xed\xf7\xad\x69\x27\xae\xe7\xc7\x97\xac\x07\xb5\x26\xf6\x2e\x84\x11\xdc\xa5\xa1\x9f\x6f\x7b\xe5\x67\xae\xa3\x28\x32\xe6\xf2\xfe\x85\x9d\x03\xa1\xe8\x32\x0d\xb9\x27\x02\x9b\xef\xe9\x14\x2c\x9c\x6a\xce\xfc\x4e\x58\xf9\x29\xd7\x7d\x16\xcf\x1f\x7c\xb8\x4d\x22\xd0\x59\xa8\xf4\xfc\xef\xf6\x44\xdc\x0d\xb0\x90\x1f\x2d\x53\x98\x5b\x9a\x69\x77\x5e\x12\x5b\x78\x7b\x5f\x4f\x8a\xfc\xde\xd9\xad\x75\x6e\xb9\x97\xc1\xbb\x5e\xea\xe2\xb7\x5d\x38\x97\xe4\xe2\x3f\x0f\x89\xc5\x3b\x51\xf4\x03\x3a\xc5\xf4\x85\xbd\xdd\x23\x8a\xa7\xad\xc6\xf0\x8e\x6c\xb1\x05\x60\x99\xce\x2d\x0c\xca\x40\x5a\x2f\xed\xbc\x12\x21\x0c\x9d\xe8\x81\x6b\x88\x01\xbe\xd3\x94\xb5\xa3\x35\xe9\x3c\xaa\xf5\x0f\x5c\x03\xdf\x4c\x0b\xac\x51\xdc\x24\x8b\x79\x7d\xfa\x4f\x3e\x00\x7e\xe0\x27\x87\x69\x0a\x12\xfd\x7a\xcb\x14\xee\x7a\xd1\x3d\xdd\xa1\xed\x6b\x53\x56\xad\xa1\x3d\x8c\xcc\x3a\xfd\x74\x1c\xcf\x2e\xb1\xe9\xd5\xb5\x8c\x7d\xff\xda\xaa\x62\x16\x06\x92\xbc\xaa\x99\x00\x8c\x5d\x1a\xb1\x18\x19\x35\x79\xe9\x50\xd3\xb5\x50\x62\xd0\xd6\xac\xf1\x4b\x58\xea\xeb\x41\xb3\x0f\x94\x2c\xbe\x0b\x91\xbd\x36\xba\x19\xc3\x66\x1d\x54\x85\xe6\xae\x1f\x66\xed\xf7\x57\xe3\x01\x31\x0f\x02\xcd\xe9\x2f\xa2\xfb\x96\xf3\xf9\x0d\x75\x51\x9e\x63\xda\x8f\x76\x54\xdc\xcb\xe6\x59\xea\x38\xf3\xb3\xa1\xcc\xa7\xca\xff\x46\xe5\x69\x6f\x21\xaf\x13\x46\xfc\xf6\x8c\xf8\x79\x1e\x45\x4e\xf9\x21\xa9\x0d\x04\x2e\x71\xd9\xc7\x1c\x12\xb5\x87\xfc\xdf\xcb\x4b\x87\xa6\xf1\xdb\x55\x4a\xc0\xca\x77\x76\x64\x57\x09\x88\x7b\x41\xa5\x4f\xf0\xe8\x22\x6d\xd7\xab\xb8\x1f\x89\x4e\x74\xa7\xe2\x9f\xff\x9e\x8d\xd3\x49\x6b\xd0\x6f\xe1\x77\x37\x5a\xdc\x40\x59\xd6\x77\x5d\x09\x72\xbc\xe0\x57\xe3\x2b\x16\x10\x85\x42\x96\x78\x49\xa1\x49\x3d\x8b\x99\x79\xcd\x67\xe8\x44\xcb\xe3\x7f\x46\x5e\x32\xb8\xe4\xd0\x8d\xe6\x13\x30\x2f\x0b\xdb\x67\x4e\x56\x28\xaf\x78\x59\x2b\x24\x7d\xe4\xa9\x6e\x3a\xf4\x14\x96\xee\x10\x8f\x5e\x69\xf8\x0e\xd1\x68\x2e\x1b\x74\xda\x9d\x0f\xb9\xc3\xbc\xd1\xbf\xc7\x8d\xf6\xed\xb7\x06\xe6\x79\x9a\x01\xb7\x23\x36\x7d\x96\xea\xf5\x94\x8f\x49\xbe\x45\x16\xab\xa3\x02\x50\xbd\x41\xd7\x81\x49\x12\x06\x1d\xb8\xb4\x90\x8b\x3e\xbf\x18\x75\x24\x19\x89\x6f\xc7\x2b\xfc\x20\x7b\x0d\xc3\x07\x59\xb0\x5b\x98\x05\xf4\x9f\xec\x35\x0c\x04\x3c\x25\x1c\xc0\x43\xf5\x24\xa8\xcb\x4c\x0b\xc2\x6c\x13\xa1\x4f\x08\x3e\x1f\x6c\xad\x2f\x99\xae\x5c\xc0\x62\x86\x2c\xb4\xab\x0b\x08\x85\x9d\x57\x16\x54\x2d\x28\x4f\xed\x1b\xd2\xaf\x57\x86\xc8\x92\x70\xe0\xf9\x21\xd4\x7f\x06\xa4\xd0\x7f\x5a\x86\xd4\x04\xd7\xa5\x90\xcd\xb3\x30\xc0\xfa\x19\x70\xdc\xfc\xf1\xff\xd9\x9f\xca\x3b\x5d\xbd\xf4\x33\x80\x7a\xd7\x53\x0c\x56\xea\xc2\xcd\xa6\xf3\x1d\xdb\x4d\xa7\xe6\x50\x8e\x84\xdf\xb2\x50\xf3\x45\x8a\xd5\xa8\xe9\x3c\xbe\x20\xf6\x3f\x82\x7e\xc0\xc3\xcf\x79\xf8\xc6\x7f\x70\xf0\x4d\x84\x3a\xd0\x69\xc0\xbf\x9f\x7f\xc0\xfe\x78\x8d\x03\xe1\x3e\x85\xeb\x2d\xc2\xef\xc9\xe4\xb9\x0b\x55\x6b\x32\x89\x11\x2c\xa1\x9f\x9d\x7c\x10\x74\xa5\x7f\xbe\x09\x26\x2b\x6f\x06\x4c\xd1\x5e\x5e\x5c\xa2\xde\x3a\x10\xf0\x91\xf4\xba\x9c\xfe\x96\x46\x3d\x4a\xd6\x64\x64\x16\xc7\xa1\x3d\xad\x07\x02\xd1\x18\xeb\x34\xdc\xb9\xa8\x59\x2f\x02\x11\x46\xc4\x64\xc5\xa4\xf5\x03\xfa\x63\xc4\x7c\x0d\xd3\xfa\x0c\xc8\xfe\xfa\x4c\x6d\xfe\x06\xd0\xbd\x84\xb6\x2c\x8c\x8e\xf2\x4a\x31\x8e\xba\xd2\xd4\xc4\xad\x33\xd5\x65\x2e\xf9\xd1\x9c\xef\x1d\xaa\x72\x04\xaf\xcb\x48\xf7\xac\x47\x33\xf3\x3d\x6b\x13\x54\x3c\xeb\x76\xb2\x15\x3c\xeb\xb4\x0b\x0b\x2f\xf6\x89\x2b\x69\x46\x8d\xc4\x26\x49\x92\x52\x2e\x17\xf3\x4f\x08\x9a\x03\x3b\x8c\x2c\x99\x6c\x3d\x61\x5f\xe6\xcb\x4d\x60\x7e\x01\xff\xad\x39\x17\xc4\x09\xe8\x7b\x09\x60\x8f\xcd\x89\xef\x2c\x92\xc2\x1e\xb0\x6a\xe6\x2a\x64\xf3\xa5\x80\x1d\xfb\xce\x14\x5d\x14\xbd\xdb\xed\x30\xfc\xdf\xcd\xfa\xf7\xf2\x2f\xd3\x63\x07\x68\xfe\xe5\x30\x27\x68\x53\x48\xda\x5a\x1c\x80\xd9\x75\x0f\xb8\x4e\x52\x09\xa7\x46\xf5\x8e\xda\xef\x88\x93\x3a\xa7\x10\x28\x83\xff\x8e\x9f\x43\x0e\xc6\x2d\xb0\xf7\xe1\xd4\x76\x8a\xe3\xea\xc7\xce\x23\x6b\x52\x67\x1e\x9a\x59\x1f\xa8\x7b\x85\x4b\x24\xaa\xa9\x50\x4d\xa9\xeb\x44\xd7\x2f\xd4\x8c\xe2\x08\x30\x47\x92\xed\xc1\x29\x33\x24\x87\xe2\x53\xe8\x7a\x17\x5e\x7f\xd7\x11\x09\x54\xb3\x37\x72\x4f\x54\xa7\x3a\xed\xf1\xf0\x9f\x86\x19\xa4\x6f\xfc\x5f\x05\xba\xbf\x48\x2d\x00\xc2\xd7\xb8\xaf\x47\x95\x73\x81\x05\x69\x17\x7a\x9e\xfa\xa1\x07\x20\x92\x97\xb0\xf5\x73\xc8\xd2\x1e\x1c\xf7\x01\x62\x4f\xb4\x0b\x1f\x2b\x42\xec\xe5\x21\x7a\x40\xbe\x82\x40\x79\xe0\xef\x2f\x06\x0d\x1c\x5e\x30\x47\xbf\xa5\x89\xbd\x87\x1b\x1a\x80\xf6\x92\xc5\xb6\x80\x1b\x4a\x87\x7a\x2d\x84\x2d\x1e\x40\x71\x31\x33\x65\x61\xcf\xdc\x09\x60\xf6\x55\x22\xd5\x00\x9b\xf9\xb1\x66\x58\xa4\x0b\xf1\xed\xa3\x4d\x3f\x87\x39\x94\x6c\x2d\x92\x8c\xd8\xc1\x51\xab\x2d\xc6\x70\xfb\x00\xf6\x8b\xf2\x4a\xc0\xe9\x17\x6d\xe6\x88\xfd\x39\x42\x5d\x0b\xeb\x95\xbc\xea\xe7\x81\x96\xf1\x85\x10\xef\xc0\x5d\x50\xd0\xfa\xb1\x86\xb1\xc2\x01\x7b\x45\xfd\xea\x0c\x32\x5f\x44\x99\x28\xfb\x7b\x96\xea\x36\xab\x90\x47\x86\xc0\xc0\x92\xb8\x2a\x0c\xb1\x21\xc2\x29\x55\x6e\x8f\x42\x8e\xcb\x4d\x97\x43\x24\xd7\x49\x01\xc1\x09\xf0\xb9\xd4\x11\xd9\x77\x0b\x46\xfd\xb8\x3f\x40\xa8\x23\xa3\x02\xe4\x2f\x01\xba\x42\x81\xfb\x33\xbc\x26\xfc\x62\xe7\x90\x11\x3d\x72\x8a\xab\x94\x45\x33\x3b\xd2\x73\x15\x17\xf8\x48\x97\x60\xac\x84\xf6\xc7\x80\xf7\x80\x0d\xa5\xef\x0e\xa7\x8f\x5e\x7a\xdd\x9f\x39\x78\x05\xe4\x53\x1f\xc8\x85\xcf\x11\x0d\x69\xe1\x4f\x48\x71\xc4\x9e\x37\xad\x10\xec\x0b\x29\x2b\xc7\xf1\xbf\x6c\x0c\x7c\x72\x18\x5c\x62\x2c\x5b\x50\x53\x65\xf5\x12\xc6\x0a\x9c\x35\xb4\x8c\xac\x4d\x66\x5e\xce\xbc\xf5\x58\x14\xf4\xe6\xb7\x6d\xa3\x38\x0a\x50\x15\x5d\x3b\x1b\xdc\x40\xbc\xc8\x0f\x71\xe6\x07\xa1\xf0\xf0\x79\xe6\x33\x2e\xc7\x67\x5b\x4c\x2c\xd4\x4a\x4d\xbf\xac\x07\x25\xc2\xbd\xce\xe3\xbf\xab\x2c\x7e\x15\xec\x42\x9f\x22\xf6\x95\x25\x09\x26\x5c\xa6\x5b\x84\x82\xe8\xf5\xf6\x37\x41\xf7\xf5\xe6\x14\x67\x47\xff\x4f\xf9\xef\x72\x92\x7d\xb2\x53\x36\xc9\xfa\x58\x21\xb1\xd9\xdb\x4e\x21\xc3\x8a\xa4\x7c\x11\x01\xd9\x66\x2c\xbe\x6f\x7e\xb3\xee\x01\xe9\xee\xa0\x0f\xb8\x57\x8c\x07\xfe\x2e\xee\xc4\xce\x95\x81\x12\xdf\x94\x34\xdc\x31\xd3\xf2\x23\xa4\xca\x5b\x60\x7d\x27\x48\x76\x1c\x44\x78\xca\x95\x6f\xd7\x2e\x08\xd7\xf6\x66\xc7\xb8\x41\x20\x29\xd2\x0f\x5b\xd8\x05\x81\xc5\xc5\x8e\xdd\x3f\xfc\x4a\xce\x9f\x82\xdf\x01\xd4\xaf\xa4\x77\x6c\x45\x1e\x9d\x5b\x91\x66\xdc\x56\x6e\xb9\x18\x6d\x21\xfd\x8c\xb2\xdd\x8f\x70\xfe\xb9\x12\x73\x5c\xc4\xdb\xf5\xdc\xd9\x2a\xab\x13\xfb\xb0\x47\xf3\x6c\xf1\x54\x84\xef\x70\xd8\x7f\x6c\x0e\x60\xc3\xa6\xe3\x61\x0e\xce\xc8\xfa\x8e\x59\xbb\xf5\x2a\x19\x68\x0c\xbe\x95\x91\x8b\x70\xe6\xda\x4a\xcf\x9b\x84\x0a\x67\xd1\x32\x73\xc9\xe2\x8b\xf5\xf4\x37\x47\x6d\x90\x70\x09\xd8\xf6\xdc\xc4\xf0\x37\xb5\x56\x10\x13\x26\x25\xa0\x9f\x44\x02\x98\x72\x80\x16\xf0\x81\x69\x0a\x48\x87\xfb\xe6\x4d\x86\x5a\xa5\x48\xbb\x45\xf3\xc3\xfb\xcb\x0d\x39\xa9\xf2\x23\x3c\x3f\x97\x21\x37\x1e\x2c\xb9\xcd\x61\x7f\x44\xf8\x0f\x14\x01\xda\x72\xef\x95\xc6\x2d\x6b\xb0\x6e\x01\xcf\xc4\x5a\xe3\xc4\xe0\x45\xc5\x16\x8f\xa1\x29\xe7\x9b\xf5\x28\x73\x0b\x69\xde\x2f\x4a\x51\x6c\x3d\x34\x33\x0b\x37\x18\x73\x0a\x71\x71\x5e\x93\x1e\x6e\xf7\x5c\xe3\x30\x4c\xc5\x43\x38\x61\x02\xcf\x6f\xcd\xd6\x1c\x82\xe2\x67\xd5\x48\x5f\x9a\xe3\xb3\xe2\x22\xcc\x3e\xb4\xc2\x02\xf2\xdf\x80\xfc\x10\xfb\x4a\x8d\x09\xc0\x9c\x22\xb0\xfe\xe7\x1d\xf8\xff\x48\xc8\x6f\x7d\x97\x04\xa7\x7f\x6b\xca\x8b\x48\xa0\xf8\x00\x5c\x59\xd4\x73\xbe\xbe\x25\x2a\x0c\x50\xbc\x5c\x41\x26\xfd\x00\x6e\xfc\xdc\xe6\xaa\x21\x46\x6e\x27\x4c\x1e\x06\xea\x02\x92\x17\x40\x4c\x25\x40\x6a\x0c\xdb\x7b\xd5\xd3\x88\x65\xf3\x8a\x01\x9f\xa2\x84\x21\x9b\xa4\xc7\xff\xe8\xfe\x36\xad\x73\x1d\x69\xca\x0f\x81\xff\xcf\x9e\x3a\x68\x5b\x90\xd9\x31\xe8\x08\x8c\x8c\xc5\x92\x13\x05\x25\x60\x0a\x96\x80\xa8\x75\x5b\x5a\x41\x59\x63\xb4\xa2\xd0\xc2\x2d\xd7\x50\x7e\xb6\x70\x2a\xb7\xc4\xca\x75\x95\x93\x44\x81\xa0\x3c\x10\x80\xd6\x2d\x61\x12\x26\x16\xc4\x38\x93\xc9\x90\x4f\xa9\xa5\x0f\xdc\x1f\x52\x6b\xe3\x24\xd9\xfc\x90\xa8\xb6\x80\xf2\xa8\x24\x1a\xfc\xb5\x63\x25\x8f\x60\x1f\x07\x0e\x6e\xb6\x24\x7c\xf6\x7b\xe7\x62\x70\x31\xc5\xb5\xbe\x25\x53\xb9\xd6\x9b\x58\x6e\x60\xac\x25\xb6\x63\xed\x31\x45\xd2\xad\x51\x22\x00\x70\xb5\x26\x69\xe7\xe6\x13\x3f\x4b\x6f\xc4\x02\xd2\xef\xd7\x3a\x00\x31\xe7\x51\x14\x32\xd7\xe0\x0f\x7b\xd0\x68\x0a\xfc\x20\x58\x7e\xed\x67\x9e\x47\x58\xf1\xae\x41\x67\x02\x9d\x61\x24\x0c\x04\xa2\xeb\x5a\x2e\x5c\x0c\x6f\x2d\x73\x0c\xa9\xd7\x12\x12\xef\x70\x3c\x0b\x75\x73\xc4\xec\xf1\x3c\xf4\xdf\x5e\xb6\x7a\xf5\x3a\x2e\xdc\xeb\xd9\x89\x61\x7a\xb8\x07\x8d\x61\x91\x3a\x38\xf4\xf2\x54\xea\xb4\x11\x99\x5e\x78\x70\xa0\x5e\x5c\x75\xd8\x6d\x3e\x3c\x82\x1c\x11\xd7\x41\x20\x9a\x40\xfe\xd9\x45\xca\x23\xcc\xfb\xc6\x81\xa9\x7d\x80\x62\x39\xe9\x0d\x0e\xb2\x06\xd5\xae\xfd\x6c\x94\xf9\x04\x73\x5a\x81\xb5\x7a\xba\x46\xe2\xaa\x32\xdc\x9a\x8b\x74\xdb\x77\xe5\x68\xd6\x3c\xea\xbc\xa1\x90\x11\x01\x17\x43\x93\xc3\x82\x44\xbb\x2c\x1b\xd7\xf4\x56\x86\x65\x85\x8c\x23\x19\x20\xf6\xfa\x56\x2e\xc7\x29\xe8\x01\x16\xea\x46\x92\xeb\x46\xec\x3f\xdd\xd8\x00\xfe\xb3\xc6\x5e\x24\x06\xa0\x06\xc4\x24\x90\x5a\x0f\xd2\xd4\x3e\x62\x58\x93\xf0\xb3\x6b\x3a\x84\xd2\x05\xd6\x86\xc2\x53\xab\xeb\x3a\x05\xd1\x60\x6c\x5c\x01\xf7\xea\x8c\xd5\x43\x5c\x77\xe4\x20\xb8\x14\xc7\xa2\xe1\x23\x10\xcd\xfc\xff\x1a\xdf\xda\xa9\x61\x8c\xed\x91\x4d\xb1\x38\x13\x5b\x3d\x17\xd8\x17\x9d\xf5\xe3\x31\x07\x59\x42\x3e\x01\xf6\x28\xf1\x6a\xf4\x4c\x6d\xad\xc9\x2b\xb0\x24\x26\xc8\x77\x7f\xa9\xec\xba\x96\x2a\xf2\xd7\x52\x3b\x1f\x0b\x2c\xd5\x4e\x0c\xbb\x2f\x2e\x70\xe7\xb8\xf7\x93\xf9\xee\xc5\x9e\x3d\x92\x07\xce\xf0\x57\x73\x7d\xf8\x0f\x03\x4e\x31\x2c\x68\x38\x85\x05\x3e\xc0\x7e\x84\xf2\x91\x26\xfc\x87\x5c\x85\x86\x40\x71\x49\x78\x87\xe8\x17\x19\x52\x2d\xe5\x97\xec\xcd\xa5\x68\x84\x0c\x46\xc2\x2f\x01\x26\xcb\x5a\x95\xe5\xb4\xc8\x67\xac\xc0\x20\x2e\x53\xe3\x4c\xe0\x59\x54\x94\x83\xbf\xa0\x2c\xe6\xb2\x8a\xcc\x64\x41\x22\xef\xe0\xf3\x21\x18\x7f\x21\xd5\xcf\x23\x24\xab\xe8\x27\xb2\xb8\x10\x78\x60\xa3\xe3\x93\x54\x49\xc0\x64\xe0\xab\x8a\x88\x0b\xd1\x15\xf6\x81\x24\x8d\x39\x48\xde\x16\xf5\x49\x7a\xf2\xb3\x06\x6f\x8b\x27\xc2\x78\x1a\xe3\x74\xb7\xd9\xa5\xb5\xfb\xfb\x87\x62\xfc\xec\x47\x96\x69\x26\xfb\xc1\x75\x45\xaf\x26\x4b\x4f\x0a\x83\x1d\x8d\x9f\x65\x89\xb7\xe4\xe0\x23\x64\x1f\xd6\xa0\x9c\xea\x6d\x9e\xea\xaa\xcb\x57\xb1\x3e\x5d\x87\x66\x03\x4b\x3a\x5a\x83\xb5\xe0\xb1\xfe\xfb\x81\x0b\x0e\x46\x97\x38\x16\x3a\x0a\xb2\x1d\x56\x6e\xa0\x3a\xa3\x05\x8d\x18\x81\xb7\x51\xdb\xa4\xf8\x92\xd7\x3d\xcd\xaa\x1d\x2d\x49\x97\xfd\xb7\x72\xcc\xfd\x5b\x5d\xec\xe3\xb7\x28\x39\xe4\x81\x2f\x31\xe6\xe6\x73\x6e\x31\xf9\x0f\x74\xd6\xfb\x9d\x41\x00\xf6\x9d\x6d\x9c\x53\x49\x7e\xb0\xf3\x26\x93\xe1\x7c\xce\x5c\x12\x46\xf1\x0b\xb9\x04\x1e\xd9\x7e\x0a\x47\x71\x8c\xb8\xd9\xdf\x04\xb2\x7f\x0a\x66\x84\xeb\xe8\xbf\x22\x05\x3f\xd7\xc0\x70\xcd\xa7\xdf\x2b\xbb\x7b\x92\x1c\x9a\x35\x52\x9a\x7f\x25\x1c\x3e\xcb\xe4\x63\x16\x8f\x1f\xb8\x47\xdd\x8c\xe9\xbd\xfb\xb3\x34\x85\x4c\x00\x9c\xe0\x48\x7b\x90\xec\xb1\x05\x3e\x0f\x9a\x6c\x54\x39\x48\x51\x7f\xbf\x5b\x91\x88\x8a\x73\xd9\xa3\xc0\x80\x4d\x75\xac\x79\xd7\xde\x23\xa9\x13\x04\x80\x4e\x15\x70\x0d\x8e\x3b\xa6\x2a\x7e\xc3\x4b\xc4\x08\xaf\x74\x79\x14\xd2\xfd\xa8\x10\x85\x85\x02\x98\x6c\x8f\x24\x9d\x7d\xf0\xb8\x79\x1d\x6c\xa0\xfd\x99\x44\xfc\xc5\xa0\x7b\x96\xb6\x7d\xf9\x43\xd2\xb0\x51\xf4\x29\x42\x86\x0d\xf8\x1a\xe8\x68\x9a\xdd\x12\x92\xd1\x95\x45\x85\xe0\x55\x98\xcf\xf4\x16\xc1\xc2\x5e\x2a\x70\xeb\x44\xac\x90\xf0\x94\x5b\xcc\xc3\x29\xfa\xc1\x4f\xeb\xfd\x15\xe8\x5f\xbf\x17\x67\xfe\x03\xe7\x9f\x83\x5a\xe1\xdd\x36\xa6\x90\x9b\x3e\x12\xe2\x3f\x77\xa1\xd4\xff\x0e\x2e\xc5\x2b\xc8\x0e\x61\x3f\x84\xd7\x8f\x57\x0d\x93\xf0\x60\x5c\x0c\xa4\x55\xec\xba\x83\xb9\x31\x82\xa1\xa0\xa0\x23\xac\x0f\x31\x22\xe6\x18\x32\x58\xb8\x2c\x04\x3d\x80\x27\x41\x1e\x07\x86\xe9\xda\xa3\x63\xb7\x28\xce\x04\x6f\x31\x54\xec\xb8\xec\xa2\x24\x37\x29\x4d\x34\xb9\x77\xe9\x2c\x12\x84\xf7\x7e\x6f\x86\xe2\x40\xd8\x0f\xf6\xd1\x2c\x18\x15\xfa\xea\xbc\x0f\xf1\xe4\x30\x82\xa3\x0b\x24\x7a\xfd\x38\xeb\x04\x06\x3a\x47\x90\x93\x4f\x05\x3d\xd8\xaf\x96\x2c\x74\x29\x98\xa9\x64\x85\x2b\x0f\x6b\xf3\x91\x85\xdc\x8d\x35\xd6\x84\xa9\x41\x5a\x1f\xaa\xd5\x20\x94\xea\xd2\x94\xac\x55\x89\x7f\xc9\x6c\xa6\x2d\xcf\xef\xbf\x56\x4f\x3e\x11\xeb\x38\xa5\x07\xa1\x46\x53\x0a\x15\xa1\xb1\x02\x34\x10\x14\x8c\x7b\xd9\x95\x1f\x1d\x2b\x46\x17\xa2\x38\xd4\x5d\xa9\xf3\x11\xdd\x1a\x84\x28\x43\xd3\x1e\x52\x62\x7c\x89\xc0\xe5\x10\xa7\x63\x0d\x9b\xe2\xb1\xfa\xbc\x08\xef\x54\x5b\xf3\xe5\x30\xd8\xfc\x64\xe2\x93\x30\x86\xe2\xc8\x78\xd2\x47\x72\x74\x6c\xe2\x1d\x91\xf3\x14\x6c\x16\x1b\x34\x06\x28\x82\x34\x9e\x83\xac\x09\x06\x6e\x2d\xab\x75\xb7\x26\x08\x47\x84\x14\x09\x5c\x0b\x85\x60\x40\xf4\x78\x44\xc0\x65\x27\x2f\x85\xd4\x51\x85\xbf\xdc\x2c\xc8\x8e\xe5\x7a\x05\x7f\xc4\xe7\xdf\x23\xe0\xaf\x3b\x45\x64\x2d\xee\x3f\xef\x9e\xab\xcb\x10\xcf\xd1\x58\x56\xb2\x4a\xec\xe4\x27\x2f\x54\xc3\xab\xe0\xc5\x66\x0e\x61\xd0\x57\x40\x4d\x23\x81\x74\xc4\xc8\x49\x98\x21\x8b\xe3\x44\xf1\xf3\x89\x88\x1d\x81\x6e\xe4\x55\x9c\xa9\x90\x37\x46\x32\xcd\xe6\x0e\x36\x27\x75\xe7\x86\x19\xe8\x00\x0a\x64\x8c\x60\x8f\x29\x8d\x3f\x66\xe5\x25\xad\x1b\xaf\x42\x41\x8d\x39\xa6\x4f\x76\x94\x97\x37\xb0\x23\x44\x88\x2e\xae\xfa\xb2\xe6\xdc\x80\x1d\x42\x97\x59\x1f\x58\xa2\x18\x95\x0b\xb1\x65\xd7\xf0\x1b\xee\xb6\xce\xb5\xb3\x9c\x12\xb2\xd4\x7a\xc7\x3c\xc8\xf2\x20\x87\xe2\x81\x4d\x73\xf9\xd6\x8e\xe9\x39\x93\x42\x52\x9b\x2f\x42\x15\x2b\x6a\x04\x46\x83\x1b\x9d\x54\x46\x85\xaf\x06\x4f\x3c\xa8\x01\x23\x4a\x08\xfc\x6a\x6d\xe3\x01\x8f\x7b\x39\x38\xa4\x35\xb8\xda\x63\xa2\x93\xf2\x98\x06\x9d\x58\xea\xf8\x1f\x3b\x20\x7f\x2f\xfd\xaf\xce\xde\x7a\x65\xbd\x1f\x55\xfc\x7a\x0b\x1a\x93\xeb\x51\x7f\xe7\xe2\xaf\xeb\xa3\x8a\x6f\xf0\xa8\x21\x34\x63\x97\x6e\x97\x0b\xc2\x28\xde\x8a\x17\xc4\x3c\x4a\x3e\x92\x9c\x19\x2f\xda\x3e\x0d\x7a\x47\x48\x68\x21\xb5\xe5\xbc\x94\x1a\x7b\x80\xc4\xf4\x43\x46\x4b\x7b\x9b\x1e\x65\xd7\x76\xfe\xb4\xd9\x82\xaf\xa5\x05\x6b\x38\x25\xac\x9a\x8a\x3d\x56\x2f\xa5\x3a\xc7\x03\x59\x8e\x46\x6c\x01\x93\x74\x14\xdd\x05\x56\xd5\x49\x53\xb6\x47\x2b\x8a\x5b\xa4\xb4\xa0\x0d\x97\xa7\x59\x56\x09\x4d\x8b\x58\xe1\xac\x30\x3d\xa5\x87\xff\x98\xb3\x08\x30\x9c\x29\x3e\x66\x90\xd3\x2f\x46\xbd\xcf\xa4\x1f\x59\x3c\x9d\xbf\x84\x03\xb0\x60\x26\xfd\x22\xa5\x0a\xdd\x41\x21\x2e\x7b\xe6\xcb\xf8\xc8\x82\x44\x3d\xd2\x73\x16\xf9\xc5\x2e\x5c\x9b\xef\x3c\x92\xe8\x2b\xe7\xae\xcf\x82\x8c\x3e\xd2\xe2\x0c\x46\x0f\xe7\xd3\x86\x07\xde\x70\x3e\xa8\x82\x99\x05\x86\xf6\x50\x7e\x3a\xd9\x25\xd2\x3c\xd0\xc4\x03\x9a\x49\x6a\xeb\xed\x25\xaa\xfc\x0e\x50\x64\xa7\xc9\x9c\xb9\xf3\xd3\xce\x47\x93\xa1\xc9\x87\x6c\x15\xf6\x37\x67\x96\x50\x9a\x58\xa5\x75\x93\xbf\x66\x69\x79\xf3\x76\x21\xbb\xcc\x86\xb7\x0b\xad\xd0\x92\x75\x27\xf5\xfb\xff\x94\x5a\x20\x73\xc4\xdd\x26\xd1\x5c\x06\xd4\xd8\x75\xc4\x41\x67\xd0\x20\x04\x2a\xbf\x81\x0b\x43\xe3\x06\x67\x6b\x37\x83\x1f\xc7\xb3\x69\xdf\x34\x8a\x36\x43\xab\x00\x52\xf2\x06\xeb\x27\x5a\x86\x65\x40\x47\xc1\x9c\x92\x85\xbd\x27\x1a\x87\x1a\x5e\x07\x36\x0f\x1a\x0b\x75\xa9\x07\xa0\x86\x9c\x0c\x72\xe6\x37\xc7\x9a\xc0\xff\xc9\x64\xe1\x45\xef\x80\xd2\xa8\x29\xf6\xbc\xeb\xab\x33\x8c\x0c\x4a\x89\xad\xf7\xe4\xaa\x59\x1e\x88\x2e\xb3\x75\x6d\xea\x34\x14\x09\xc1\x0d\x12\xc4\x1f\x4a\x27\x75\xa7\x01\xfe\xd0\xdc\x03\x33\x3f\xb1\x9d\x87\x59\x33\xbb\x61\x96\xa0\x32\x44\xbd\x39\x1e\x1b\xe6\xf8\x0a\xd9\x05\xb1\x74\xe6\xc3\x0b\x34\x7e\x0e\xf3\x16\x32\x35\xc3\xbc\xca\x6f\xc2\x35\x23\x9b\x65\xf7\xf0\xb5\x85\x70\x0c\x31\xb7\xed\xc2\xf7\x21\x3f\xc5\x9f\xb9\xef\x20\xb6\x5c\xa1\x1b\x6d\xa1\x4d\x6b\x77\x71\x6f\x2a\x69\xfe\x36\x62\xd7\x1c\x77\x00\x29\xae\xb3\x9e\x91\x07\xd8\x50\xef\xfd\x11\xc7\x86\x0d\x8c\x85\xf6\xec\x8a\x25\xb3\x16\x92\x71\x56\x2f\x2d\x0e\x41\x8f\xb5\xc0\x73\x18\x43\x9e\x83\x06\x34\xcb\x89\x6f\xc8\xf4\xc5\xe1\x89\x5a\xc3\x79\x73\xe8\x3e\xe4\x47\x95\x81\x45\xee\x4a\xb0\x7d\xec\xa9\x27\x23\x2a\xa7\x48\x71\x59\x38\x84\x48\xf0\x80\xa6\xc1\x81\x5d\x2e\x82\x73\x37\xdb\x08\x7d\x2b\x49\xf3\x01\x78\x54\x3d\x70\xca\x51\x0d\x50\x5a\xd5\x97\xeb\x87\x16\xda\x16\xf1\xe6\x26\x11\x70\xa8\xb0\x82\x8a\x58\x4c\x35\xfa\x7a\xbf\xce\x99\xaa\x69\x16\xaf\x34\x0d\xef\x2b\xe7\x1d\x7d\x95\x48\x52\x4f\x0c\x3f\xcf\xc7\x3f\xa8\x09\xe9\x6b\xb4\x8d\x3d\x2a\x77\xda\xe0\x9c\xd5\x95\xba\xed\x84\xa8\x3e\x00\xdf\xdb\x06\x9b\x68\x35\x3e\x33\xc6\xd2\x9f\x9d\xfe\x4c\xb3\xce\x0e\xee\xbb\x24\xc4\x88\x10\x51\x68\xf6\xd4\x17\xaf\xcb\xf7\xf6\x6f\xb2\x9c\x23\x9e\x8d\x85\x22\x58\x90\x2d\xc5\x88\xb9\xef\xa0\xdf\x5c\x04\x66\xad\x22\xe8\xfc\x3f\x55\x5f\x96\xe0\x2c\xcf\xf4\xba\x97\x77\x67\x06\x9c\xe0\x66\x30\xbf\x81\xe4\x4b\x56\x7f\x4a\x25\x95\xf3\x9c\x9b\xb6\xa0\x99\xc2\xe0\xa1\x5c\x92\x82\xa8\x73\x44\xdc\xdd\xf0\x46\xed\x72\x43\x62\x01\x1b\x5a\x98\x5f\xe8\x0c\x1d\x1a\x45\xec\xe2\x1d\x21\x03\x9e\x6c\x24\xfb\xb8\x2e\xae\x5a\xab\xf7\x2d\xc0\xd2\xb9\x75\x06\xb8\x12\xcb\xb4\x42\x43\x71\x0f\x2d\x5f\x5a\xa5\xfa\x03\x48\xde\x11\xd0\x86\x62\x97\x73\x8c\xa9\x80\x11\xfe\x89\xb3\xba\xb2\xe3\x1a\x42\x11\xe3\x9a\xc3\x6f\xdf\x20\x12\x15\xb4\x1f\x74\x2b\xc8\xca\xb1\xb7\xcb\x4f\x19\x0c\x96\xf2\x08\x8a\x4e\xb1\xce\x86\x87\x08\x49\xcf\x11\x25\x02\x79\x4b\x71\x43\x5c\xb4\xd0\x7b\x78\x80\x5a\x67\xbd\x36\xd1\x4d\xe6\x7f\x9b\x22\xc4\x2c\xd4\xd6\xc2\xb7\xe2\x15\x9b\xa4\xce\xd4\x89\xfc\x97\x11\xc9\x09\x7c\xd8\x39\x1c\x31\x92\x24\x3b\x5c\xcc\x79\xfd\x4f\xe4\x9a\x35\xd2\xbc\x9d\x5f\x43\x03\x8b\x24\x33\x4a\xf7\x8f\x10\xe3\x66\x63\xfc\x00\x3e\x12\xf1\x1e\x24\xb8\x86\x74\x4b\x8b\xd6\xed\x25\x50\xff\x68\x8b\xa3\xe8\x0b\x1d\x99\xf2\x2d\x94\x7c\x3c\x30\x86\x28\x32\x02\xe8\x9d\xfd\x83\xf1\x26\x8f\x84\x19\x06\xad\x4b\x9b\xec\x26\x98\x49\x3c\x6a\x7e\x00\xe5\x1a\x1c\x9b\x14\x13\xc8\xc0\x64\xdb\xbc\x25\x6a\x36\x7c\xd8\x33\x19\x3e\xf8\xc9\x38\xc2\x80\xa0\x59\x23\x98\xbd\xbb\x65\x20\x2c\x25\x44\x46\x47\x7e\x20\x5f\x65\xb0\x6f\x62\x73\xeb\xf8\x24\xfd\x57\xc3\x10\x43\xa2\xc4\xdc\xf4\x29\x85\x09\x05\x77\x13\x1d\x6f\xb8\x73\xa7\xe5\xa8\xd3\x39\xd8\x70\x2e\x34\xe3\x1d\x07\x83\xa4\x51\x0f\xd5\x4a\x45\x56\xac\x25\xfc\x5f\x50\x69\x38\xb4\x03\xf5\xc6\xa9\x09\x48\x92\x95\x37\x44\x61\x4e\x05\x38\x36\x4c\x3d\x71\x9f\xb9\xce\x0b\x6a\x65\x5b\x63\xcb\x50\xa9\x1a\x64\x0c\x3a\x84\x31\xd1\xa0\xec\x5b\x0c\xc1\x69\x7a\xa1\xee\x20\xfc\x26\x7c\x45\x7d\x73\x86\x6f\x80\xeb\xc0\xa9\x9f\x6f\xf5\x41\xe7\xd8\x9c\xb3\x7c\x23\xc4\x6a\x69\x93\x3e\xa3\xa1\xfe\x63\xc4\x80\xcc\xd4\x2c\xf0\x20\x9b\xc1\x27\xf5\x72\x16\x9b\x46\xb4\x97\x3a\x77\x02\x39\x98\x34\xd1\x03\x1c\xba\x36\xe4\x50\x47\x3a\x6e\x01\xe8\x6a\x06\xc9\x11\x0c\xdd\x52\x66\x60\x78\x09\x2d\x83\x2e\x74\xd5\x78\xc6\x1a\xc0\x6f\xfe\x8b\x30\xd1\x00\x1b\x19\xcd\xef\x39\xe6\x1d\x43\x16\x06\x9a\x05\xe2\xf2\x15\xe8\x5c\x2a\x40\xa9\xe0\x39\x16\x19\x46\x2d\xb5\xdb\x52\xe8\x3a\xf4\x82\x0e\xd0\xd6\xf0\xcd\x4b\x18\x38\xa1\x59\x85\x25\x04\x61\xb7\x12\xb7\x26\x4c\xec\x92\x02\x8d\x47\xd2\x6e\x3e\xa2\x6d\xe5\x8f\xdf\x2d\xb7\xf6\xe6\x7f\xc2\xaf\x68\x70\xd3\x2d\x12\x67\x90\x4d\x97\x88\xc4\x9b\x69\x41\xb4\xe9\xd2\x49\x8e\x45\xb2\xca\x9a\x4e\x1f\x82\xdc\xb3\xe7\x09\xc9\xda\xc4\x0a\x83\x5a\x6f\x41\x31\x2a\x47\x32\xb8\x58\xd7\x68\x67\x87\x1c\xbf\x3e\x2b\x7e\x31\xe4\x7f\x28\x38\xe3\x42\xdf\x12\x68\xb5\x34\x02\xde\x5e\x28\xc4\x4e\xa4\xbe\x38\xe1\x49\x2b\xf5\xea\x3a\x3d\x67\x0e\xb4\xfe\x8c\x25\x12\xeb\x6e\x2e\x05\xd9\x0d\x1a\x42\xe1\x37\x61\x5d\x2f\x31\x78\xfa\xfb\xe4\x55\x97\x38\x3c\x83\x6c\x4f\xa0\x34\x41\x3e\x58\xff\x34\xc3\x0b\x1b\x5c\x1c\x11\x7a\xd2\x79\x83\x7f\xc6\x34\xe5\x21\xf9\x48\x75\x48\x33\x37\xb7\x5e\x70\x0e\x1a\x90\x55\x37\xbc\x12\x11\x84\x98\x0f\x98\x3e\x9c\xe6\x85\x1c\x2c\xaf\xa5\x1b\xf2\x80\xa6\x13\xfd\x5e\x39\x2e\x5b\xd7\x44\xf5\x6d\xba\x16\xb5\x63\x40\x61\xdb\x80\xc1\xaf\x88\x29\x92\xd8\x82\xb8\xac\xd3\x74\xce\x3c\x70\x2c\xef\xd5\x38\x37\x97\x65\xa5\x95\x91\x14\x88\xf9\x49\xae\x72\x7e\xa7\xac\x32\x50\x5b\x67\xe5\x21\xd9\xa0\x56\x34\x39\xe8\xf1\x50\x42\x28\xc9\x9b\x10\x6e\x0f\xe4\x15\x6d\xac\xe8\xd3\x7a\x87\xaf\xc6\x6a\x2d\x30\x6f\x45\xfa\x31\xe5\xd5\x4d\x02\xb3\xc9\xc3\x82\x60\xc0\xa2\x98\x25\x7e\x97\x62\x14\x61\x1d\x28\x3a\x0b\xa5\x27\x7c\x69\xf6\x7f\xa0\xda\x9c\x14\x75\x4b\x9a\x4e\xd7\xb0\xc3\x14\x45\x7c\xbf\x69\x64\x25\x9e\xc6\x48\xd4\x43\x80\xda\x2f\x9d\x5d\x1e\x2b\xd8\xb3\xf8\xba\x6c\x38\x2b\x86\xef\x9d\x43\x93\xf4\x5b\x98\xc9\xf5\xed\x91\xd3\x2f\x63\x34\xce\xc5\xf9\x92\x8a\xc3\xa8\xec\xd7\x33\x67\xfc\x83\xfd\xa6\xe3\x50\xed\xff\xb5\x1b\xc2\xdb\x06\xeb\x0b\x1d\x3f\xe8\x21\x9f\x9b\xfc\xa3\xcf\xc9\xef\xfb\x63\x35\xbb\x78\x3c\x4c\x24\xfb\x60\xd4\xc3\x96\xe6\x23\x49\x5c\x78\x5f\xd0\x5a\xeb\x83\xb7\xc2\x0f\x83\xdb\x8e\xff\xfd\x8f\xd3\xab\xd6\xb7\x25\xaf\xa6\xa1\x1a\x64\x1d\xf2\xb6\xc1\xc6\x38\x87\x21\x05\x3c\x2d\xc9\xc6\xa9\x2b\xeb\x37\x18\x64\x20\x98\xa9\xfc\xbc\x77\xc5\xa8\x4d\x29\x9b\xef\xee\xbc\x0b\x94\x77\x89\x65\xdb\xc2\xe2\x0e\xef\xef\xae\x27\x04\x26\xcf\x97\xe5\x92\xd7\xee\x9f\xb1\x4f\x3a\xce\xae\xf7\xe4\x5d\x36\xae\x58\x5d\x74\x9f\x70\xd5\xd4\xb1\x1b\x69\x9f\xe1\x97\x11\x9d\x35\x43\x9e\x41\xeb\x57\x5d\xf2\xf4\x21\xbd\x68\xea\x27\xb1\xfe\x59\x38\x6f\x8c\x0c\x55\xbc\x4b\xb8\x15\xc9\x51\x83\x14\x20\x28\x3e\x6a\xcb\xb9\x4c\xde\x60\xbe\x99\x55\x03\xd2\xcf\xcf\x03\x03\xb9\x3c\x3e\x55\xf3\xf6\xfa\x99\x7e\x19\xec\xa6\xbf\xc9\x4f\x14\xf3\x28\xab\xa5\x72\xe1\xea\xdc\x7f\x63\xee\x32\x72\x80\xf2\x9f\x7d\x4b\x31\x00\x1e\x1c\xf3\x15\xd6\x1b\x45\xd3\x26\x6f\x28\x36\xc6\x49\x9f\x4d\x9c\xaa\xfc\x8c\x1f\x99\x4e\x36\xc1\x6f\x6b\x9a\xbd\xf2\x44\xd2\xfd\x4c\x22\xfa\xdb\x3b\x0f\x9a\xb5\xb0\x05\x05\xaa\xdc\x54\x43\x64\x9f\x18\xdb\x1b\x4a\xef\x08\xe8\x83\x03\xc4\x78\x0e\x50\x6c\x30\x8b\xe9\xff\xe6\x68\xe1\x65\xc3\xe8\x60\x0a\xbf\x60\x4c\xe5\x44\x53\xff\x0f\xf3\xc4\x5f\x1e\xde\x69\x8e\x20\x9a\xe3\x95\xee\x6b\xb5\x31\x31\x19\x3f\x90\xc0\xf6\x00\xdf\xab\x34\x79\x74\x1c\x5d\x63\xe4\x85\xc1\x02\xc3\x88\xaf\x32\x05\x1d\xe8\x94\xb9\xc6\x49\x7e\xc2\x4b\xb1\x74\x2b\x9f\x24\x00\xc2\x77\x43\x6c\x9e\x8c\x3c\x9d\x22\xc3\x8d\x15\x7d\xdb\xe7\xcd\x4d\x9e\x6c\x93\x5f\xea\x9a\xc2\x53\x83\xc7\x4d\xfb\x8b\xe6\x9e\x5a\xa0\xf2\xc8\xcd\x8d\xa1\xdc\x3a\x31\xf9\x0d\x0b\x5e\xd3\x00\x8c\xf3\xd5\xdd\x35\x74\xdc\x3d\x4b\x8b\xfe\x95\xc2\xa2\x63\x52\x72\x97\x9c\x37\xae\x4e\x44\x12\x67\x03\x28\x09\x29\xa6\xec\x60\x17\xa0\x33\x08\xc0\xca\x03\x43\xbd\xc2\x2b\xb2\x9b\xca\x71\x38\xbe\xb3\x8f\xe4\xc8\xb1\x2a\x56\x80\xe4\x45\xb7\x58\xf8\x6c\xd1\x79\xb8\xde\x55\x95\xae\xdd\x21\xa7\x5d\xc3\x24\x43\x44\x24\x0d\x8e\xae\x76\xff\x4f\x5d\x6f\xd8\x61\xb0\x0f\x65\x5f\xe6\x8b\x7a\x93\x86\x8a\x5c\x2e\x8a\xcf\x75\xbb\x2d\xc6\x49\x60\x55\xff\xaa\x75\x62\x16\x5e\x56\xf3\xc7\xf6\xf9\x41\x8e\x90\xd4\xfc\xc1\x2c\x41\xd0\x56\x27\xb0\xc6\x2f\xd3\x26\xc2\x2d\xc8\x7b\x52\xf3\x55\x6f\x86\x50\x0c\x50\x21\x04\x2e\x1a\x35\xda\x6a\x43\x9b\xfe\x1d\x23\x0f\x43\xf6\xd9\x71\x5f\x51\x94\x2a\xb3\xe0\xe1\xab\x71\xf2\x77\xd7\x9f\x72\x9a\x61\xce\x31\x82\xa3\xeb\xc5\xc0\xf5\x50\xf1\x8a\xc1\xdd\x55\x2e\x46\x79\x2e\x68\x74\xf1\x87\x94\x4c\xb1\xaa\x6b\x0e\x12\x88\x21\xbf\xe5\x73\x63\x82\x35\xb9\x51\x31\xa7\x72\xcd\x65\x80\xdf\xbc\x37\xa8\x17\x03\x99\xbc\xfb\xf6\xcb\x69\x8d\x81\xc1\xdd\x25\xc4\xea\xff\xca\xa2\x8f\xe5\x51\x97\x9b\x35\x86\x31\x80\x3a\x45\xe4\x25\x3d\xf5\x0b\xae\xe4\xe2\x2d\x1d\x4a\x39\xbe\xfa\x04\xc3\x45\xfb\x74\x78\x68\x90\x62\x63\x5f\xbe\xa7\x76\x19\x98\xc2\xbd\xe0\xbe\x1e\x32\xc4\x60\x92\xbb\x1a\x26\x94\xe1\x99\xd1\x93\xd6\x0c\xc3\xf6\xe7\x76\xe7\xf2\xd3\xde\xbd\x1c\x9d\x1d\x5b\x28\x2f\xd1\x8f\xc2\xa1\x1f\x16\x1b\xdd\xf5\xc2\xed\xcf\x85\x9e\x59\x5e\x19\x90\x87\x23\xc8\x94\x26\x83\x7d\xc6\x18\x4e\xaf\x98\xf1\x13\x01\x09\x79\xe7\x8d\xc8\xad\xa3\xf7\x8e\x09\x72\x19\x02\xb0\x84\xc3\x62\xec\x91\x2e\x11\x8c\x5a\x9a\x49\x49\xaa\x4c\x6a\x3a\xdd\x99\xa5\x09\x29\xe5\xff\xaa\x73\xd8\x60\x84\x73\x46\xd5\xeb\x8d\xbe\xc7\xde\x2d\x42\xc4\xaa\xb9\x4a\xa7\x56\x61\xd6\xcf\x5a\xce\xa7\x2e\x2f\x3f\xac\xda\x08\x82\xd2\x95\x95\xc4\x70\xfa\x83\x0c\x9a\xd3\x75\xf3\x8a\xba\x29\xc3\x15\x53\xd5\x3e\xa7\x5a\x82\xb1\x80\x05\x1d\xd6\x3a\x61\xe2\x4b\xcd\x6b\xee\x46\x24\x69\x52\x43\x7d\x1e\x2d\x05\x6b\xec\x88\x01\x1c\x0c\x34\x4a\x18\x68\xc4\x08\xc5\x6a\x57\xca\x23\x1b\x20\x09\x07\x19\xc4\x72\xa0\x38\x42\x85\xd6\xd0\xaa\xae\xf6\x59\xef\x35\xc8\x52\x22\x4f\x1d\x24\x24\xb1\x9a\x71\xca\x94\x5f\x64\xe5\x84\x21\xb4\x71\xa5\xc8\x6f\x50\x94\xf8\xb3\x52\xa0\xc8\x4a\xc9\x2a\x9e\x36\xc4\xc8\xa2\x40\x19\x94\x0d\xc7\x56\xfb\x30\xc8\xb1\x6f\x69\x55\x26\x29\x53\xe9\xa5\x87\xbf\x40\xaf\x41\x9b\x2d\x55\x92\xc8\xb6\x0c\xa7\x53\x47\x59\x64\x24\xc8\x39\x0a\xb0\xa3\x6c\x80\xe7\x2c\xd6\xab\x18\x1d\xbc\xc4\x70\x3e\x83\x86\x53\xc8\x2f\x38\xe9\x79\x76\x86\x99\xd7\x29\x65\x31\x2b\x47\xd1\x93\x60\x9b\xde\x15\x33\xcf\x92\x7b\x35\x8c\x3c\x8f\x3e\x07\x74\x5a\xe5\x21\xde\xcc\xec\x73\x9a\x9e\x18\xe2\xbe\x80\xfc\x77\x99\xc2\x20\xa4\x3b\xd5\xcc\x1e\xb8\xd7\x17\x38\x63\xcc\xa6\x03\xdb\xd3\xe3\xeb\x83\x19\x60\x4d\x9b\x83\x31\x15\x8c\xab\xb4\xa7\x7f\xf9\x52\x2c\x83\xee\xe5\x6c\xf0\xe0\x2a\xc9\x03\xc5\xda\xd9\x85\x6c\x29\x29\x1d\xc0\xef\x57\x16\x28\x59\x09\x90\xd6\xcd\x79\x42\xf8\xd7\xe1\xfa\x8f\xfb\x87\xf8\x4f\xfd\x07\xe4\x0c\x19\x48\x1e\x3f\xbb\x96\x1a\x20\xa5\x7d\x88\xda\x37\x58\x3d\x63\x45\xa3\x2a\x92\x10\x7a\x8d\x81\xa2\x6d\xd0\x72\x50\xc8\xdc\x35\x24\xb8\x50\x6f\xfc\xa6\xd8\xe4\x0e\xfd\x52\xe0\x10\x5f\x74\x12\x95\xb4\x09\x9d\x46\xe5\x69\x9f\x3a\x5d\xab\xba\x1e\x43\xf9\x78\xc4\xce\xad\x4a\x8c\xc8\x29\x56\xdb\xf1\x20\x64\xb8\xc1\x41\xac\xf9\xc7\xf6\xa3\xe6\xbd\xfb\xcf\xf8\x52\x1c\x4d\xc9\xe0\xee\x3c\x12\x6e\x27\x6b\x56\x00\x06\xb3\x6f\xe8\x20\xe8\xf7\x94\x7e\x00\x43\x7d\x0a\x1c\x53\x11\x61\xfb\x03\x1d\xb1\x47\x6f\x33\x4f\x8f\x24\xd5\x40\x3a\x4a\x8a\x53\x93\x68\x35\x3a\x39\xc0\x51\x9f\xf3\x3e\xd3\x9b\x8f\x3b\x75\xbd\xe2\x33\xbd\xe8\xc4\x00\x4a\x96\x98\x58\xb7\xdc\x67\x52\x3b\x44\xcd\x2a\x5a\x76\x63\x69\xc2\xf4\x08\x46\xd6\x22\x12\xd5\xfe\x77\xb7\xbf\xa0\x61\xc5\xe4\x83\x61\x78\xe4\x5c\xda\x78\xbb\xa7\xc2\x4d\x36\xa6\xd3\x6a\x41\xc4\x2f\x9f\x75\x03\xed\x2a\x48\x57\x8b\x88\x6c\x69\x95\xfe\xcb\x99\x16\x6b\xb7\x78\xe5\x0b\x1b\xf4\x33\x49\xf6\xff\x14\x51\xd1\x3a\x18\xde\x8c\x80\x44\xb3\x7b\x19\xcc\x25\xcc\x4c\xbf\x05\xe4\x85\xf2\x0f\x25\x6b\x63\xbe\x1e\xfd\x51\x9c\xe4\x03\xef\x6f\xdd\x28\xc3\x24\x2a\x45\x8a\x33\x92\x1c\x1a\xe9\x56\x60\x3a\x30\x1c\x0d\xa7\x8c\x53\x86\x27\x37\x8d\xcf\xdc\x3c\xa3\x11\x3c\xc5\x71\xb2\xca\x79\x24\xbf\x6b\x13\x33\x0b\xd1\x05\x8d\xfb\xed\xfd\x0c\x6a\x56\xf0\xbd\x9e\xb4\xff\x00\x31\xeb\xff\x6e\xf1\xb2\x5a\xfe\xbf\xa0\x6d\x4d\x3a\xe3\x28\xe7\x90\x2a\x0a\x15\x98\xec\x4d\x48\xcd\x58\xf8\xe4\x37\x17\xc3\xaf\xe2\x36\x42\xa8\x47\xf3\xaf\x5c\xb2\x7e\x0c\xa9\x5c\x1b\xeb\xee\x56\xfc\xb9\xa3\x72\xf0\x9b\x51\x94\xd6\x63\x40\x73\x6d\x4d\x99\x5c\x8d\xf9\x06\x2d\x7f\xea\x26\x60\x9d\x6a\x4d\x06\xb6\x7c\xeb\x14\x5d\xfc\xbe\x85\xd2\x8b\x5b\xe4\xd2\xb8\xc4\xc7\x2b\x95\xb0\x74\x76\x40\x73\xae\xa1\xd6\x8a\x49\x16\x62\x6c\x2d\x3f\x8b\x00\x6f\x59\xd6\xdc\x7a\x73\x09\x01\xf2\xc0\xd2\xad\x2b\x4a\x4f\x12\xd8\xa8\xdd\x09\xcb\x15\x29\x37\x45\x26\xa4\x95\x73\xa6\xf5\xca\x7e\x71\xc5\x2e\xb6\xd8\x3e\x29\xdc\xd8\xd2\x56\x78\xff\x53\x24\xf0\xb7\xa4\x08\x4a\x4b\x7f\x3a\x5e\x39\x35\x6e\x31\xb8\x69\x4a\xd5\xe0\x10\x3e\x2e\x61\xec\x02\x41\x46\xe6\x44\xfd\xdf\x1d\x9e\xd6\x44\x4f\x47\x7c\xd5\x60\xd6\xe2\x1b\x1d\x94\xf2\x38\xee\x06\xc3\x7a\x86\xae\x0e\x74\xfa\x1f\x8c\x22\x19\x0e\x96\xd6\xad\xfc\xb9\xe3\xe6\xec\xb7\x7b\xbc\x90\x51\x86\xcc\x31\xfa\xbe\xb4\x30\xaa\x38\x1a\xf3\xe3\xe1\xce\xe5\x7b\x35\x26\x00\x1e\x60\xc0\x2d\x04\x7a\x1e\x07\xb4\xb4\x88\xbc\xcb\x2e\x20\xf3\x92\xda\xe4\xfe\x72\x70\xbe\xcc\x00\xa6\xaa\x1d\x6d\x69\x15\x23\x6d\xad\x6f\x6e\xbd\xea\xae\x92\x79\x76\x06\x62\xa9\x23\xaa\x9f\xe6\x9c\x34\xd2\xd5\x26\x1b\x4c\xfa\x45\x55\xb7\x6f\x82\x27\x0c\x4f\xb6\xd6\xe0\x79\xad\xca\x27\x3c\xec\xc5\x67\x8f\xf7\x28\xa1\x20\xe1\x88\xa5\x8c\x58\x22\x85\xfe\x70\x3d\x3e\x07\xe8\x71\x71\xe2\x9a\x5c\xb4\xba\x05\x5f\x6d\xe4\x54\xfa\x51\x40\xbd\xf1\xcb\x98\xd9\xfb\x75\x46\xd9\x37\x1a\x3b\x5b\x62\xe2\x0e\x1a\xf5\x60\x6e\xc1\x3c\xfc\xd2\xca\x9f\x67\x4b\x8e\x74\x23\x43\x63\x89\x88\x1d\x98\xeb\x4c\x04\x39\xb2\x24\x18\x8f\xac\x5c\x45\x78\xc8\x5c\xe1\x26\x13\xee\x3a\xb9\xfc\xaf\xca\x4c\x46\xde\x35\x09\x5d\x6b\x92\xd0\x52\xeb\x31\xb3\x23\x47\x78\xea\x48\xaa\x2b\x0d\x90\xf4\xf5\xce\xab\x68\x64\x9c\x1b\x3a\xac\x4a\xe0\x7f\xae\x59\x86\x31\x2d\x24\xdc\x0e\xe8\x94\xf0\xf0\x76\x74\xef\xfe\x1d\x89\x63\xc5\x03\x39\x40\x83\x7a\xa5\xd6\xb3\xac\x8c\x1c\x00\xb1\xd8\xd4\xa8\x1d\x98\x8b\x8f\x3b\x96\x1e\x0f\x89\x77\x1e\xc9\xbd\x3d\xb8\xf1\x14\xd7\xe8\xce\x60\x4e\xd4\x7a\x69\x8a\x96\x86\x7b\x00\x67\xdc\xcd\xd0\x63\xb5\xca\xd6\x3f\x6a\x1b\xe7\x2b\xbf\xc9\xc9\x64\x7c\xd0\xb5\x49\x13\x15\x1f\x80\xdf\xe3\xaa\x2e\x41\x0d\xcb\xcb\x2a\xa7\x24\xe4\xb1\xfa\x17\x54\x97\x7b\xe3\xab\x54\x17\x0e\xec\x2a\x87\xae\x14\x6b\x5f\x93\xde\x3d\x8d\x61\xac\x7d\x65\xe7\x0a\x26\x33\xe4\x9c\x49\x8a\xbe\x52\xea\x62\xff\xcc\x3e\xf6\xdc\x3f\x3f\x17\x98\xdb\x53\xa7\x48\x30\xbb\xa1\x82\xc6\x3b\xb8\x83\xbb\xe0\x95\xe4\x4e\x0f\x1c\x78\xd3\x90\xa0\x66\xb7\x62\x09\x12\xca\x5e\xaf\x3c\xd4\x70\xa3\x79\xf1\x0b\xdc\x35\x0a\xda\x31\xa6\xde\x65\x5a\xa3\xf1\xef\x4e\xa2\x2d\xc2\x1f\x7e\x45\x45\x33\x50\x7b\xb9\xfc\xde\xed\x2e\x13\xff\x21\x9a\x8b\x52\x3c\xf7\x12\xbb\x23\x1f\xc3\x9e\xd4\xc6\x3b\x6f\x8b\x31\x4e\x44\xab\x16\xdb\x8c\x8b\x8e\x30\x42\x90\x9b\xac\xb5\x7c\x3f\x75\x2d\x99\xcc\x35\x7c\x19\xfc\x4f\x59\xd8\x09\xdf\x11\x3f\xf3\x52\x4a\xeb\x7b\xe6\x7c\xe2\x9e\xbe\x89\x31\xb0\x1d\x34\xf2\x2a\x40\x55\x03\xbb\xe5\xce\xd1\x27\x49\x8e\xd2\x49\xbb\xd5\x3b\x07\xff\xb9\xa4\xaa\xd2\x2f\x38\x41\xf9\xd4\x89\x30\x1f\x24\x9d\xd3\x17\x7a\xbb\xa5\x1e\x6f\x4f\x9b\x07\xc2\x63\x17\x45\xd5\xe1\x7f\x64\xce\x91\x5b\x74\x43\x9b\x41\x39\x2e\xdb\x6d\xa3\xc5\x50\x68\xdb\xee\xac\x24\x61\xeb\xfe\x90\x96\x73\x87\x44\xec\xd6\x6a\xef\x62\x80\x58\x47\xda\x9a\x93\x23\xfd\xfe\x6d\x35\xf8\x63\xb5\x49\x80\x1d\x68\x97\xb9\x4f\x70\x21\xb7\x8a\xf8\x08\x6f\xb4\x61\x71\xbf\xea\x7e\x45\x29\x3e\x9b\xa3\x49\xfc\x39\xcc\xe2\x0b\x16\xfd\x97\x3f\x09\xea\x77\xf4\x0e\xa9\x72\x3f\xf1\xfa\x99\x20\x91\x5e\xba\xd5\x85\x04\xac\xda\x15\x95\xe1\xbe\x33\x88\x91\xf7\x4c\xaf\x38\xb8\x8e\x14\x9c\xac\xf2\x01\xbb\xd3\xd1\xf5\x95\xe1\x4a\x39\xe5\xd0\xd3\xb8\xa8\x21\x31\xd2\x1f\x32\xcb\xee\x65\x53\x56\xd1\x11\x83\xc4\x54\x22\xee\xbd\xe1\x6d\x94\xe1\x50\x11\xc9\x6f\xf6\xde\xbb\x95\x89\xe3\x49\x6b\xb2\xff\xb5\x38\xca\xae\x36\x29\xb8\xe8\xd1\x41\xb6\xdf\x27\x53\x7d\x41\x1a\x40\x1b\x66\xcd\xff\x35\xef\x69\x0b\x37\x56\xd6\xc8\x16\x62\x35\x9b\x38\x94\x59\xe3\x77\x03\x36\x40\xf3\x56\xd6\xda\xa6\x1e\xd7\xde\xf2\x42\x67\x21\xab\x89\xbf\xda\x31\x18\x7b\x57\x09\xb7\x9e\xff\x83\x42\x39\x89\x76\x90\x2a\x15\xcd\x0e\x36\x4e\x7c\x60\x48\x50\x10\x27\x0f\x6c\x12\xe5\x32\xb8\x61\xcf\x37\xd0\x30\x88\x85\x67\x1d\x82\x60\xd9\xc1\xc9\x9a\x07\x78\xde\x8d\xcc\x3a\x34\x05\x4d\xff\x9e\xea\x5b\x96\x3a\x4e\xf3\x2a\x41\xc4\xbb\x39\xf7\x05\x72\x9f\x0c\xe5\x9d\xdb\xb7\x04\x17\xd0\x3a\x18\x4b\x40\x3b\x85\xc8\x8c\x20\xf8\x51\xf6\xd3\x1d\x7c\x94\x05\xb2\xa5\xef\xf7\x1e\x45\x68\xfb\x7e\x6b\x87\xf7\xff\xc7\x9f\x83\xf7\x07\xd5\x62\xb7\xf4\x91\xee\xc9\x96\xfe\x37\x92\xb4\xf6\x62\xd2\xef\x96\xee\xaf\x68\x6c\x37\x02\xf4\x24\x9e\x5d\xf7\x8f\x10\xb0\xc1\x4e\x5c\x1f\x92\x41\x91\xf6\xae\xf3\x0e\xa2\xb1\x2f\x88\x7c\x27\x9b\xf1\xcd\x75\xba\x08\x66\x0f\x16\xd3\x57\x44\xcc\xcc\x14\x0a\x8d\x40\xec\x09\x10\x89\x4b\x38\x93\x76\x9b\xdc\xfd\x4e\xa4\x3f\x51\x70\x53\x7b\xd6\xee\x16\xc4\x46\x02\x8c\x40\x06\xfc\x21\x55\xac\xad\xac\x7f\x95\x48\x64\x4d\xfb\xfb\xb7\x77\x70\x76\x93\xd3\x68\x79\x16\xfa\x36\x80\x2e\xd8\x0d\x87\x3c\xb3\x77\x2f\x22\x0a\x06\x37\xd2\x5e\xc1\xec\x12\x83\x1b\x32\x29\x74\xf4\x25\x75\xb6\xa0\xee\x51\x39\x83\xfe\xc8\x5c\x13\x2b\xd7\xb9\x54\x19\x0b\xe9\x37\x4e\x7a\x23\x51\x7b\xf2\xa4\xe3\x12\x5e\x4c\xa3\x54\x76\xc1\x07\x6c\xe1\x00\xf3\xa1\x01\xe9\x0a\x65\xe2\xec\x20\xc4\x61\xdd\x31\x88\xe5\x73\xde\xc2\x85\x8a\x19\x3a\xde\x13\xb7\x6e\xce\x79\x28\x58\x2a\x86\x9d\x23\x6b\xe5\x09\x58\x55\xa0\x74\xe1\x2f\xed\xbf\x67\x11\xf7\xe6\x98\xed\xb1\xae\xa1\x4f\xe6\xad\xb0\x7e\x63\x3f\xc8\x60\x30\xef\x64\x24\x54\x42\xd3\x1e\xac\x3b\xb9\xa7\xac\x85\x1e\xa3\x78\xb5\xc9\xa9\xeb\x89\x04\x10\xf4\xe1\xaa\xac\x79\x17\xa2\x70\xc8\x81\x55\x10\x27\x9a\xd7\xfc\x1d\xc5\x64\xcc\x2f\x3b\x10\x25\x22\xf0\x4d\x78\x07\x1a\x73\x80\xf9\x26\x0a\x65\xd7\x35\xcb\x16\x6a\xcd\xdb\x21\x53\x20\x0f\xee\x40\x65\x91\x9b\x5a\x4d\xaa\x7f\x94\xfd\x1d\x66\x48\x20\x4a\xf3\x2e\xd3\xdd\x77\x95\xf6\xcb\x9a\xde\x68\x8b\xc9\x64\xd3\x5d\x4f\x9e\x67\xe2\x34\xbb\x24\x9a\xdd\xd9\xc9\x72\xe7\xfc\x16\x3b\xad\x61\x20\x99\x09\x19\xf5\x5c\x93\x68\x77\x7b\xbd\xbb\xf3\x0f\x83\x13\x78\xbd\x54\x49\x3b\xa1\x8e\x9b\x87\x70\xe2\x9a\x82\x39\xa7\xc1\x90\x73\xe3\xe4\xca\x94\x1e\x1a\x3e\x58\x6b\x73\xe7\x53\x2b\x47\x5d\xfe\x10\xa6\x41\x43\x55\xc9\x61\xf5\xf2\x4e\x27\x7a\x22\xa2\xa7\x51\x28\x97\x04\xb0\x9b\xbe\x37\x77\xa4\x24\x2c\x36\x6e\xd2\xbf\x1a\xe9\xa0\xec\x85\x2e\xad\x2a\x45\xc1\x50\x16\x31\xad\x91\xda\x60\xe5\x33\x18\x64\x8d\xb2\x7c\xce\xa6\x8b\xe3\xe4\x50\x5c\x36\xf8\xe0\x0e\xe9\xa4\x94\xe6\xc2\x19\xa9\x85\xce\xb5\x4b\xbd\x3f\x9c\x8d\x59\x34\x75\xb0\x54\xb9\x05\x21\x5a\x4e\x02\x9d\xa6\x1c\x00\x06\x4a\x4b\x2f\x9e\xeb\x1f\x3e\x44\xd6\x5f\xe5\x86\x87\x82\xaa\x4b\xdd\x79\x8c\xed\xa7\xf3\xb1\x04\x9b\x7e\xa9\x3d\x99\x66\xa9\xf9\x08\xfa\x5b\xcd\x94\xad\x05\x5f\x8f\xae\x47\xca\x22\x5b\x76\x9f\xb3\xe3\xaa\x94\x29\x6a\xb3\xac\xa4\x47\x80\xb7\x07\x09\x56\xde\x95\xb5\x6c\x71\x05\xa2\x4c\x5a\x53\xad\x0e\xe6\xb2\xa6\x03\x1a\x40\xff\x39\x3b\x2f\x7c\x86\xec\xd3\xe5\x1a\xce\x5f\x38\xeb\x8e\xbc\xb6\xa2\x10\x0c\x0c\x86\x58\xe8\xcc\x25\x38\x72\x98\x1a\xf6\x46\x00\x0d\x1b\x77\x12\x8b\xc3\x59\x76\x3c\x30\x24\xe9\xe9\x1d\x64\x8d\xf2\xcf\x52\x08\x46\x08\xfc\xdd\xc0\xe2\xb8\x00\x4f\x02\x7d\xd3\x6d\x17\x89\x2e\x6f\xba\x68\xbc\x0b\xdc\x6a\xdd\xe7\xfa\xd0\xca\x1f\x4b\x69\x89\xe4\x09\x00\xb2\xc6\x96\xc8\x67\x05\x9f\x0f\xb3\x00\x93\xe3\xbc\xf3\x38\xf2\x54\x36\xf0\xf3\x32\xca\xda\x13\xe2\x78\x7a\xad\x38\x2f\xbf\xd8\x28\x5c\x9d\xee\x25\x8c\xd7\x01\xc8\x2f\x74\x3a\xa0\x58\x96\x4c\x81\xb5\x0a\xfd\x2d\x66\xdc\x92\x0e\xd0\x8d\xe3\xbd\x01\x21\x4e\x44\xc0\x4e\x9a\x00\x29\x70\x12\xcd\x6f\x09\xba\x9f\x5f\x90\xb5\x0c\xa3\x78\x86\xe3\xd7\xdb\x28\xf9\x22\x35\x06\xb0\xfe\x94\xc5\x40\xa1\x34\xaf\xfa\xff\x40\x3a\x61\x28\x03\xee\x48\x8c\xb3\xfd\x95\x9d\x3d\xdf\x3f\x68\x54\xb8\xc9\x52\x50\x02\x7d\xd2\x37\x4c\x8e\x1a\xc9\xd8\x7f\x79\x6f\xfd\xff\x3b\x05\xa6\xff\xa8\x90\xfa\x97\x3e\xcd\x3f\x7b\x03\xa4\x00\x4a\x95\xf8\x2f\x59\xb3\x7d\x39\x60\xec\x08\xfe\x48\x99\x2b\x30\x2d\xe3\x8d\xeb\x9f\x8f\xcd\xf8\x5f\x4d\xf2\x94\xef\xbd\x39\x31\xd0\x3b\xd0\x00\xfb\xf7\xa6\x74\x4e\xb0\x49\x0b\x15\xf4\x40\x7d\x94\xa0\x6c\xf1\x19\xf2\x2c\x94\x64\xbf\x3c\xdf\x4a\x35\x46\x54\x3a\x31\x4c\x30\xf7\xb4\x41\xa0\xe1\xa6\x73\xce\x7d\x84\x4b\x11\xa6\xc4\xfc\xcd\x9a\xef\xf5\xec\x1f\xa9\xf3\xfd\x64\xec\x83\xc0\xa3\x48\x56\x06\xf9\x38\x66\xaa\x4b\xcc\x2d\x7b\x5c\x6e\xae\xc1\xa8\x9e\xeb\x9b\x86\x48\xd6\xb3\xa9\x6b\xf0\xf8\xee\x73\x0a\x13\x25\x6f\x94\xe7\x2a\x57\x5a\xfb\x76\x64\xa4\xc4\x9f\x08\x63\xba\x6e\x43\x84\x49\x9d\x88\x41\x38\x45\x90\xc9\xc8\xa4\x08\x0e\x32\x12\xb5\x1e\x76\xb8\x34\xcf\xf5\x69\x35\x1f\x0f\xf3\xec\xd7\x43\xf2\x59\x9d\x9e\x4b\x77\x55\xea\xc9\x8f\xf3\x9f\x4c\x3a\x67\x18\xf3\xf1\x20\x6e\xa5\xdc\x3d\x94\x20\x4e\x16\x5c\x41\x5e\x61\x59\x83\x85\xb8\x0e\xe4\x05\x0e\x91\x93\x32\xe7\x8f\x47\xd2\xe7\xc8\xe5\x35\x10\x64\xbc\xeb\xf6\xa2\x33\x17\x61\xca\xe9\x6c\x4a\xcc\xc9\x4e\x72\x3b\x52\xa5\x0b\x90\xc4\x57\xf4\x6b\xa1\x7e\x35\xf1\xa8\xd5\x72\x75\x98\x73\x18\x32\x5d\x61\xa4\x67\xb8\xc4\x4a\x1f\x66\xce\x98\x1c\x22\xe7\x70\xdd\x82\xc5\x69\x57\xd8\xfd\x9e\x70\x01\x6d\x09\xa2\xa1\x32\x44\x66\x06\x6f\x66\x7b\x63\x99\x54\x03\xf5\xbc\xf4\xcf\x59\xc2\x63\x65\x4e\x1f\xb6\x54\x06\x94\x1e\x39\xff\x74\x80\x90\xd9\xb3\x26\x3d\x7f\xab\x1d\x74\xab\x12\xd4\xf1\xb4\xad\x8d\x71\xc8\xcf\x6b\x74\xa5\x4a\x3a\x43\x8a\x0e\x0c\xb8\x85\x2c\x31\xdc\x21\x53\x71\x57\x30\x16\x33\x10\xf1\x9b\xd2\xd6\xc8\x1f\xdc\x82\xa9\xb8\xe5\x60\x3b\xba\xcf\x8a\x23\xab\xd6\xc9\x67\x7c\x8a\x0d\xf8\xd4\x26\x0c\x39\x5a\x29\xa3\x29\x0c\xfa\xe2\x72\x13\x63\xda\x10\xf5\xda\xbd\x2c\x2d\x28\x84\x12\xb1\x7e\xde\xcf\x67\xe6\x5c\xa9\x8d\x9f\xa0\x2e\x48\xbb\x25\x60\xab\x81\xab\x30\x7d\xe8\x9f\xf7\xc4\xa8\xc8\xf3\xee\x46\xd0\xcf\x3b\x4c\x8f\xda\x4d\x52\x9f\x63\xf1\xc8\x5a\xe9\xe4\xbd\x2c\xcf\xa7\xcc\x2c\x99\xa7\xe7\xd3\x8a\xb7\xa5\x2f\xe0\xd9\x72\x90\x05\x39\xb2\x71\x6e\xa0\x58\x88\xcd\x95\x46\x88\xc0\x35\xda\x04\x75\x78\xcc\x03\x13\xcc\x41\x21\xec\x8e\x92\xc0\x22\xa8\xc1\xf2\xfb\x43\x5e\xe0\x1d\x22\x06\x18\x57\x60\x0a\x88\x66\x54\xb5\xc5\x5d\x83\xc8\xa5\xc0\xb4\xec\x9a\xe2\x7b\xba\xd4\x33\x57\xc3\x89\x8a\x26\x4a\xee\x9a\x21\xee\x62\x45\xc4\x84\x4c\x42\x6f\x90\x9f\x35\x1e\x08\x48\x84\x97\x1d\x75\x16\x3e\x15\x61\x00\xe6\xe5\xc9\x48\xe3\x59\xe5\x82\x95\x7f\x2e\x56\xbc\xb8\x1c\xd7\x36\x65\xfe\x0a\x6e\x2f\xf1\x8f\xe7\xca\x00\x97\x95\xbf\x1f\xdf\x27\x88\x9f\xab\x7c\xb7\xec\xb9\x4e\x2c\xd5\x87\x78\x16\xdd\xbd\xd2\x2b\xac\x67\x97\x92\x7e\x96\x20\x2c\xe6\xb3\xfb\x3c\x63\xe6\x80\x57\xa2\x7b\x58\x06\x51\x85\x9e\x05\xfa\x8d\x94\x54\x72\x36\x63\xb2\xee\x16\x04\x79\xb9\x4c\xb9\xe2\x67\x37\x06\x06\x4a\x9a\x3a\x7f\x66\xc5\x8e\xec\x84\x90\x49\x22\xf2\x20\x9b\x95\xb2\xcd\x33\x94\x98\x5f\xfd\x8c\x3a\xf4\x89\x29\xc4\xec\x99\xb9\xc8\x03\x4d\x17\x0d\xba\x62\xc2\xe3\x19\x96\xf2\x4f\x70\xad\xbc\x84\x95\x20\x0f\x21\x36\xd3\x13\xb1\xdb\xff\xc8\x69\xdc\x45\x6a\x3c\xc9\x4d\xbc\xde\x9c\xb8\x7f\xa6\xab\x5b\x6d\x49\xb7\x05\xe2\x95\xe2\x34\xb6\x46\x59\xb9\x27\x2c\xd9\x58\x96\xa0\x3d\x2a\xa4\xf5\x84\x6a\x03\x5f\x32\xfb\xb0\x99\x3d\xe5\xc8\x4b\x90\xc9\x49\xd6\x4c\x13\x87\x0e\x06\x2a\xd3\x6a\x1e\xb7\x52\x30\x1e\x91\xc5\x85\x29\x0b\xd6\xd2\x8f\x7b\xb9\x49\x4b\xfc\xb8\x4b\x18\x26\x91\xc3\x02\xcb\xbd\xb9\x4a\x47\x01\xc2\x3f\xaa\x61\x74\x27\x7d\x13\x5b\x90\x25\x16\xd2\xd7\x68\xbb\xd5\x92\xa7\x71\x3f\x7a\x1e\xd8\x83\xef\xee\xa3\x8a\xca\xd8\x94\x54\x0d\xa6\xa3\x7f\x08\x0f\xa7\xae\xd0\x91\xab\xca\x52\xca\xc0\xb3\x93\x1f\x45\xc9\xac\xa1\x7c\xf3\xa8\x24\xae\xf9\xf5\xac\xf2\xfc\x7b\x90\x57\xc2\x53\xda\xe3\x0c\x50\x68\xc8\x75\xf1\x15\x70\x7c\x86\x71\x3f\x2c\xbd\xc4\x72\xdc\x95\xda\xf7\x88\x2c\x4b\xe2\x7e\x4a\x3e\xe0\x87\xdb\x2e\x28\x8b\xc6\xc9\x8c\xe1\xd8\x45\x9f\xa7\x07\xfa\xbb\xe7\xe9\xb7\x3f\xaf\xf2\x2f\x33\x40\xfe\xa2\x8d\x19\x75\x60\xf0\x40\x58\xf2\x51\xe1\x4d\xe0\xed\x4b\x1c\xb9\x3c\x5c\x32\x33\x85\x91\x17\x7f\x61\x8f\x23\x88\xd9\xc8\x5d\x0b\x18\x7d\x8a\x96\x3d\x42\xa2\xde\xc0\x93\x49\x19\x8f\x34\x8a\x06\x23\xd1\x8f\xfc\x1e\x48\x42\xc8\x2f\xb9\x7b\xbd\x34\x9b\x9e\x31\x7d\x2c\x6e\xe4\x3b\x18\x91\xa2\x3a\x52\x91\x2c\xbb\xe0\x6f\x78\x82\xdd\x57\x11\xea\x04\x45\x98\xaf\x2a\x2e\x04\x9f\x8a\xae\x4d\xd9\x7b\xc0\x99\xc9\xac\x3e\xd2\x9e\x83\x21\x39\x50\xa1\x3f\x6b\x06\x3f\xff\xf4\x09\x5c\xf5\x57\xdf\x92\x14\x80\x49\x54\x04\xe1\x57\x9e\x64\xe0\x82\xd2\x2a\xec\xb7\x1b\x26\x5d\x91\x2a\xff\xe5\xc2\x48\xd1\xf1\xa0\xb3\x83\xf6\x26\x60\x7d\x24\x19\x10\xe7\x99\x99\x52\x19\x2f\x97\x7c\xca\x9e\xe1\x2f\x66\xdf\x50\x18\x8e\x85\x20\x6d\x8e\x09\x82\xcc\xe1\x51\xfe\x71\xa3\x9d\x59\x29\xda\xdb\xbb\xc4\x93\x98\xde\x6c\x6e\x27\xd2\xd0\x4e\xc1\x24\xa1\xe9\xe9\xd6\x10\x68\x92\xb1\xca\x74\x33\x3a\x39\x59\x5b\xba\xf0\x67\x4f\xe8\x97\xd2\x72\xcc\x7e\x95\xb8\xe5\xd6\xdf\xa7\x81\x3c\x40\xf4\x16\x0d\x8b\xf4\x67\x2f\xd4\xb3\x92\x45\xf9\x26\x6b\x4f\xce\x4f\x53\xfd\x91\xf3\xea\x3d\x91\x7a\x89\x04\x7c\x17\xc4\x81\x85\x19\x8b\x33\xee\x10\xb8\x9a\xac\xb9\xa7\xda\x19\x97\x7e\xfd\x8e\x10\x4d\x5e\x02\x3d\xbd\x35\x9b\xa2\x67\x3c\xc9\x99\xab\x0e\x54\xbf\x9f\x8a\xc4\x3b\xa6\x88\x7f\x4d\x45\x29\x78\x53\x81\xf2\x27\x57\xc5\xbc\xe1\x64\xf5\x1c\x7f\x77\x59\xc5\xef\x5c\x11\x95\xd0\x6f\x2d\x41\xf5\x5c\x74\xf0\xe7\x33\x40\x06\xd1\x88\xb4\xc6\xd2\x3d\xd5\xf4\xd9\x41\x0f\x8a\x7d\x86\xa9\x88\xf8\xb0\x65\x2e\x26\xb1\xb2\x60\xb6\x46\xea\xa8\x7d\x2d\x22\x51\x5a\x7b\xa3\xa8\x97\xfd\xb6\x3e\x7f\x80\x89\x74\x9f\xc6\x10\x1d\xb2\x91\xa0\x79\x24\x37\xf5\x07\x10\x0b\x14\x2e\xd3\xba\x29\x39\x42\x65\x40\x34\x79\x84\x95\x85\xec\x95\xad\x46\xa5\x0b\xc0\x7f\xe2\x74\x66\x81\xb3\x95\xaa\x0d\xd0\xeb\xe1\x6e\x1e\x28\x12\x52\x18\x6b\xca\x7f\x56\x49\xfa\x1d\xca\x9d\xf9\x9a\x9f\xc5\xcd\x21\x85\x27\x21\x18\x2f\x8a\xd3\xf9\x90\x5b\xdb\x08\x83\x34\xf2\x50\x9d\xab\xa2\x59\x11\x30\x3d\xb3\x12\x04\x27\x5a\xdd\x4e\xe9\xfe\xfa\x84\x86\xf3\x3d\x7f\x43\x16\x79\xab\x4f\x89\x6e\x73\x36\x54\xe6\x74\xc3\x64\x37\xf7\xae\x7c\xec\x21\xcb\x36\xb9\xe7\x34\xef\x06\x3c\x47\x78\xdc\x95\xcf\x83\xb2\x16\x53\x1a\xe5\x99\x46\x97\xba\xf1\x26\xe1\x11\x53\x78\x74\xad\xe2\xcc\x50\xd0\x28\xef\xd1\x19\x0d\xce\x5c\xbb\x07\x9f\xe3\x86\x18\xdc\xc6\x72\x22\x85\xb3\xbe\xbb\x8b\x1a\xb3\xe6\x47\xd7\x02\x26\x71\x10\x73\xb9\x31\x30\x1b\x9b\xe4\xff\x47\x06\x22\x46\xf5\x57\x41\x09\xbd\xc2\xce\x0a\xf7\x45\x4d\xb2\x61\xcd\x08\x8c\xd6\x4c\x66\x71\xef\x5a\xb8\x98\x41\xac\x96\x36\x25\x63\x45\x54\xa2\x33\x3d\xaf\x8b\x9c\x54\xa8\xfa\x91\x15\x2a\xe9\x38\xb8\xb1\x05\x3a\xe4\xe2\x55\x8f\x24\xaa\x27\xdf\x4e\x2b\x27\xd1\x3b\x2f\x8a\x5f\xc1\x91\x4d\xac\xd1\xdf\x4c\x27\x30\x7b\x02\x86\x7a\x5d\x05\x4e\x68\x13\x13\xf4\xd2\x76\xd0\x33\x13\x63\xb2\xae\xa1\x37\x62\xf0\xa1\xab\x05\x67\xa7\xf1\x56\xba\x14\x15\x79\xab\xf1\xc3\xd7\x5f\x87\x19\x73\x16\x27\x4b\x0d\x85\xc7\xb5\x7c\x5d\x61\x0c\xba\x84\xec\xe0\x8f\xab\xeb\x0d\x76\x58\x3b\xbe\xcf\x20\x8d\x26\xf2\xf1\xe0\xeb\x26\x3b\x3d\x28\x4d\x86\x59\x5b\x01\xab\x33\xc6\x19\xf6\xfc\x49\xf3\x1e\x3b\xb5\x65\x2c\x1b\x88\xb4\x7e\x43\x4a\x0a\xa3\x02\x91\x48\x49\x3c\xe2\x42\x30\x5b\x67\x0c\xe9\x48\x34\x2d\x5f\x86\x81\x91\x54\xb6\x97\x91\xdb\x96\x4e\x77\xb2\x9f\xff\x92\xd3\x04\x60\xa7\x99\xca\xfe\x0f\xe3\x57\x92\x50\x23\x3b\x70\x74\xb7\x5d\x82\x8d\xc5\x5a\x9e\xf5\x0f\x30\xaf\x39\xb8\x39\x63\xfa\xc8\x35\x2d\xc8\xa3\xaf\x14\x49\x0d\x23\xbe\x34\xf9\xda\xa5\x6b\x13\x6f\x38\x79\xce\x32\xf7\x95\xea\xe6\x98\xda\xdd\xd9\xa5\x37\x74\x0b\x09\xe1\x34\x21\xf4\x23\x9c\xb6\x7b\x10\x5d\xb5\x31\xad\xc9\x50\xa5\xaf\xcb\xe8\x59\x0d\xfa\x02\x12\x74\xbf\xb5\xe5\x8f\xbb\x3a\x24\xd1\x5e\x8f\x10\x5e\x1a\xa9\x4f\xf2\x9f\x98\xa9\x41\x26\xdd\x82\x54\xed\x39\x6a\x55\x3f\x68\x2b\x3a\xd0\x96\xff\x04\x92\x72\x63\xc6\x54\x4e\xd9\xd2\xd9\x23\x3e\x0e\xfe\x7b\x18\xa0\x59\x66\x9f\xe0\xc2\xc5\xe4\x11\x08\xe7\xad\x92\x1e\x26\x57\x9e\xe1\xfe\x9f\xa2\xca\xc3\x1d\x72\x45\xfe\x02\x04\x0b\x18\x6f\xde\x99\xb5\x7a\xef\x02\x13\xe0\xa3\xfe\xbb\xf0\x24\xcb\xb4\x5c\x8d\x1e\xe0\xc3\x9d\x49\x6d\x83\x28\x48\x27\xa3\x26\x71\x51\x17\xfd\x72\x50\x51\x87\x12\x3c\xcb\x7b\x14\x67\xf4\x3e\x3b\x3b\x75\x3f\xaf\x4e\x46\x2d\x9a\x06\x76\x87\xca\x7a\x93\x3b\x5a\xeb\x26\x16\xa9\x12\xd1\x00\x26\x1e\xa7\x8e\xdd\x48\x2e\xaa\x7a\xa0\xa0\x2d\xe2\xbd\x0c\x9a\x6a\xfe\xb2\x33\x6b\xe8\x0c\xcf\xb8\x1f\x27\xd0\x30\xc5\xe6\x86\x16\x33\xab\x30\x90\xd3\x61\x32\xb7\x8f\x38\x08\x4c\xe4\xee\xe0\xbc\x42\x40\x9e\x04\x72\x60\x5d\x60\x8a\x90\xb3\xc1\x60\x29\x3a\x31\x41\x80\xd3\x14\xe2\xc6\x0e\xe2\x7d\xca\xde\x7e\xa8\xff\x0b\x8a\xeb\x9b\x41\xe1\xa1\x86\x21\x1a\xc8\xdd\x62\x44\xd6\x2e\xf0\x45\xfb\x39\x12\x61\x2f\x49\x27\x0c\xd2\x41\xb6\x92\xd9\x58\x00\xa1\xff\x09\xe9\x17\xde\x2b\xa8\x4f\x88\x6a\x6b\xd5\xd9\x47\x20\xac\xee\xd0\x35\xe1\xf3\xa8\x0a\x75\x0e\x35\xec\xf8\xea\x1a\x6e\x76\x85\x3d\x7f\x03\x6b\x5c\xe5\xbc\xeb\xe4\x73\xf8\xd9\x75\xbe\x72\xb0\xe3\x01\x82\x30\x49\xcf\x98\x61\xfd\x90\x3e\x5c\x5e\x52\x50\x03\xa1\x8e\x25\xc7\xba\x70\x8a\xbe\x44\xcb\x55\x70\x1f\x14\x58\x8d\x46\x86\x22\x1d\x78\x03\xb3\xec\x3d\xc1\x7d\x4d\xc1\xc6\xfd\x35\x52\xe4\xb8\x0a\x90\x9c\xc6\x0b\xce\x8a\x7d\x1b\x08\x2f\x38\x4d\xd0\x83\xd6\x5e\xc9\x7b\x6d\xfb\x15\x5b\x85\x81\x1b\xec\x85\xd4\xa0\x0e\x68\x8a\xdf\x04\x4f\x5a\xbf\x58\x3f\xe2\x23\xbe\xeb\x27\x9c\xed\x38\x4b\x35\x60\x16\x4e\xc7\xda\xe9\xf4\x97\xe5\xd2\x01\xfa\x6b\x8a\x04\x3a\x58\x83\x51\x90\xc2\x4d\xc2\xc8\x1c\xed\xa9\xd1\xc3\xef\x0b\xcc\x4f\x99\xaa\x19\xe2\xa9\x1f\xec\xd1\x0e\xb4\x00\x02\x83\x53\xb7\x60\x9a\xe2\x5a\x7e\x5f\x2b\xcc\x35\x4e\xf1\xbd\x81\x83\x9d\xab\xa1\xff\x90\x3e\x2b\x99\xb3\xb4\x02\x1e\xe4\xb2\x63\x65\x50\xb6\x53\xf4\xe7\x07\x6a\x04\xcb\x84\x0e\xb7\xb9\x3b\xea\x59\xe3\x1d\x37\x2b\xb1\x66\x1b\x10\x38\xd4\x85\x59\x45\x1d\x46\x79\x56\x4d\xaf\xb4\xab\x0b\xa2\x75\x6a\x32\xab\x83\x8e\x15\x59\xb0\xa8\xa3\xf8\x13\x13\x85\x74\x87\xb4\x9e\xac\xb5\x9c\x6c\xab\xb7\x03\x7e\xde\xa2\xf4\xae\x52\x35\xb0\x1a\x54\x84\xac\xc1\xdd\x3e\x89\x46\xd6\x3b\x70\x83\x61\x39\xfa\xc1\x92\x52\x96\x90\x78\x12\xb6\x6f\x9c\x56\x01\xc9\x5b\x8e\x77\x77\x37\xb9\x43\x2e\x84\xd3\x42\xaf\x51\x39\x16\x98\x62\x41\x61\x75\x76\x63\x52\x00\x1e\xe9\xca\xfe\x27\x6c\x7a\x78\x30\x1b\x13\x87\xdf\x80\x4f\x82\x0e\x91\x31\x8f\x9c\x99\x91\xf4\xdb\xb4\x7b\x1b\xe1\x4e\x78\x7a\xa3\xe0\x6b\x02\xa1\x39\xde\xfc\x84\x04\x43\xb2\x5d\x3d\x37\x47\x74\xdb\x5d\x1c\xd6\x9d\xaf\x2d\x14\x49\xe5\x9f\x37\x35\xfd\x67\x6a\x1c\xaa\x00\x65\xa9\x78\x28\x07\x0e\x71\x43\xfd\xcb\xda\xc7\x27\xad\xf4\x3e\x3e\x27\x02\xfa\x6e\x7d\x39\xc8\x2b\x55\x27\x3c\x34\xeb\xbb\x6d\x49\x77\xce\x3a\xf6\x34\xb8\x73\x0d\xc0\xda\x1e\x8e\xed\x3c\x8c\x8f\xdb\x80\xbf\xbc\xb4\x01\xd3\x04\xad\x3c\x3c\x81\x2a\x95\x5f\x7b\x95\x58\x8f\xa7\x42\x6b\xfa\x34\x33\xaa\x0c\xa2\xaf\xf7\x46\xd3\xb3\x69\x4a\x17\x6e\x57\x9a\x09\x48\xd9\x7d\x48\x82\x0b\xac\x18\x27\xba\xf4\x8a\x95\x25\xeb\x66\x7b\xda\x50\x1a\x17\xa6\xf2\xcb\x69\x3f\x0d\x13\xc6\xec\x9b\xeb\x17\xdb\x4b\xe7\x47\xe3\x2c\xd8\xb7\x36\xb5\xea\xdf\x48\x94\xfa\x76\x6d\xaa\x2f\x67\x3a\xbf\xe5\x78\xd0\xb0\x0f\xb3\x3c\xe4\x7c\x7e\x0b\xfd\xfa\x38\x34\xfb\xb2\x8f\x6c\xcf\x8e\x93\x64\xdf\x14\xdc\x5e\xa9\xe4\x7c\xed\x49\x36\xfe\x67\x24\xc1\xe6\x8b\x39\xea\xe8\xfc\xd9\x42\x84\x2d\x3f\xdf\xff\xbb\xad\xcd\xf2\xa7\xe5\x69\x50\x5f\xaa\x49\x7e\xa8\xf0\xf7\x29\x3d\x4c\xf1\x89\x7a\xed\xc3\x59\x00\xe7\x02\x53\x6a\xc6\xe0\x12\x8e\x7f\x5b\x22\x81\xe3\xa3\x58\xfa\x27\xc1\x44\x54\x3c\xe0\x0f\x93\x3f\xde\x6c\xb6\xde\x61\x77\xd7\xbe\xf9\x8c\x0b\x7a\x37\x1f\xbe\xbd\x5b\x67\xe1\xda\x10\xfa\x26\x63\x37\x06\xd3\x4e\x21\xe6\x07\x49\x36\xb1\x03\xe5\x3d\xc1\x1a\xb0\x5b\xe0\xd9\xbd\xf5\xfc\xc7\x67\x5f\xd4\x01\x56\x65\xe8\xbf\xa3\x87\xfe\x56\x8f\xe9\x5d\x82\xab\x5b\x9a\x12\xc2\xdf\x1e\xf4\xda\xb5\x83\x2d\x74\x04\x41\xaf\x22\x18\x5a\xc2\x6f\xa5\x88\xbd\xd1\xde\x64\x91\x8a\x83\x7c\x09\x16\xb2\xbe\x77\x30\x8d\xf5\x25\x02\xe6\xed\x94\x87\xe0\xba\xd4\x93\x3c\x66\xe8\x90\x2c\xdc\x76\x91\x47\x61\x90\xa8\x8b\xc8\x27\x00\x39\xd0\xef\xdd\x7c\x97\xf0\xf8\x7e\x43\xcd\x99\x74\x65\x64\x15\x74\xed\x7f\xb0\x92\x65\xc8\x0f\x56\xf2\x1e\x2b\x25\xaf\xfe\xee\xa4\x7e\x43\x13\x09\x54\x86\x12\x33\xb7\xdf\xca\xc9\x78\x5b\xeb\xd7\x6d\x0a\x7d\x4c\xef\xcf\x29\xff\x04\xf4\xc1\xf4\x6d\x0c\x6c\x3a\xe9\xd7\xcb\x6e\xf1\x98\x8b\xc6\xc7\x20\x29\x2f\x34\x1a\x05\x0d\x39\xa8\xc9\x59\xbe\x88\x9e\xe4\x26\x1a\x17\x2c\x08\xc7\xb0\x20\x9c\x28\x9a\xec\x8c\x63\xf6\xb5\xe1\x3d\x18\xef\xb9\xe1\x91\xd3\x9b\xef\xa4\x2a\xf1\x9d\x94\x65\x61\x40\xc3\xa2\x77\x9a\x74\x57\x5f\xf5\xbd\xca\x73\xb0\x6d\x9a\x6d\x79\x61\xac\x47\xa2\x70\x9d\xc9\x1d\xf6\xbd\x5e\x48\xc3\x71\xca\xaf\x98\xd8\x2f\x99\x05\xb9\x00\x85\xd7\x37\x1e\x94\xd8\xf3\xfd\xea\x0b\xae\xb5\xfc\x5b\x62\x75\x04\xb1\x36\xff\x8c\x5e\xc5\x46\xae\xce\xb9\x2d\x49\x07\x90\xe9\x60\x0b\xf5\xaa\x97\x8c\x80\x5e\x56\x73\xfb\x3d\xc0\x54\xb3\xc0\x2a\xca\x32\x59\x81\xaf\xac\xe4\x9a\x57\xd2\x06\x68\x3b\x76\xb1\x7b\xe1\x7d\x2f\xc6\x6f\x1b\x82\x69\xfc\x66\xa2\x10\xc2\x6c\xe1\x57\x68\xbb\xd4\xe0\x30\xef\x08\xbd\x68\xd3\x2d\xa5\x3d\x78\xc5\x73\x37\x30\xb4\xe7\xa4\x83\xee\xa4\xc8\xbf\xd8\x3a\x04\xed\xb8\xb6\x43\x28\x87\x2e\x0e\x59\xca\xaf\xac\x6c\xb0\x4e\x5a\x5e\xaf\xbe\x34\x57\x17\xa4\xe4\xc2\xd0\x1d\x14\x07\xa4\x5b\xe8\x10\x78\xfc\x25\x08\xd0\x49\xba\x8c\x70\x4e\x64\x1c\xd6\x17\x8a\x38\xcf\x9a\x9b\x73\x25\x75\xf5\x8b\x40\x53\xf0\xde\xf0\x2d\x61\xee\x1b\x59\x45\x2c\x33\xf3\xa8\x7c\x52\x9c\x79\x82\x12\xe7\xbf\xc3\x4c\xf7\x92\x1a\x0a\x5c\x43\xfc\x82\x2e\x7b\xe7\xb8\x06\x13\xe5\xce\xf0\xbd\xd3\x97\x6b\xc0\x66\x16\x63\xd9\x0d\x6f\x2e\x62\xf2\x8c\xbd\xb9\xd6\xaa\x3e\xe9\x7a\x49\x0e\xf3\x6a\x91\x66\x77\xd5\xaf\xca\xff\x05\x13\x19\xe4\xd1\x51\x5c\x64\x0e\xa3\xaf\x7a\x54\xf9\x29\x1b\x2c\xe4\x19\x33\x55\xdf\x4a\x38\xa9\xf8\xf5\x54\xba\x8e\x21\x07\x97\x26\x87\x55\x2c\xe7\xcc\xc4\x2e\x6b\xfe\x55\x75\x5d\x4e\xa3\xcf\xb4\x66\x74\x9a\x71\x95\x9e\xb9\x2d\x6d\x4a\xd3\xbb\x66\x48\xbe\xf9\x8f\x99\xb3\x4c\x39\xf0\xed\x16\x19\x33\x26\x89\x12\x80\x8c\xcc\x2a\x1a\xce\x8c\x02\xed\x4b\x22\xf2\x0e\xef\x19\xd2\x94\x6d\xe4\xcb\x86\xf9\xca\x59\xee\x8c\xc9\xe7\x14\xae\xae\x58\x72\x61\x2e\xa9\x90\x6c\x1c\xf7\x3d\x29\xb3\xe7\xf2\x14\x45\xef\x0f\x5f\x49\x29\xaa\x20\x2c\xeb\x61\xa4\xee\x33\x74\x61\xe0\xfd\x21\x90\xa8\xce\x15\x19\x62\x34\x67\xe4\x56\x83\x68\xa8\x5f\xfb\x66\x9f\x1f\x27\x7d\x7d\x90\x07\x4b\x6e\x33\xe2\x5b\x0b\x11\x7c\x1e\xc2\x92\x0f\x72\x0b\xe1\xb1\x98\x3e\x7c\x76\x86\x68\xf6\xf7\xb2\xd6\x94\xac\xe7\x4b\x8e\x9f\x27\x0c\xd9\xbd\xa4\x61\xe0\x4d\x53\x51\x2b\xc9\x22\x75\xd1\xf2\x08\x01\xfa\x92\x76\x23\x3d\xe2\x44\xa0\xc3\x83\x39\x27\x0c\x08\x50\x5e\x37\xa7\xcd\x0c\x1c\xf2\x3c\x14\xe9\xb7\x1b\x13\xa0\xfa\x14\x9b\xb8\xd5\xb9\xaf\x63\xa6\x23\x4d\x19\x83\xe9\x8c\xfb\xcd\x73\x5f\x6e\x8d\xce\x53\x1c\xe9\x16\x55\x99\x31\x47\x67\x36\xb3\xdc\x36\x59\x40\x6e\x72\x56\xbb\xfe\x6e\x65\x30\xda\x67\x4b\xfe\xdf\x85\x50\x34\x6f\xe3\xd5\x2d\x18\x73\x30\x6c\xfb\xfc\xaf\xa1\x43\x53\x60\x06\xb7\xa0\x49\xc7\x44\x14\x51\xec\x83\x26\x85\x9c\x53\x77\x7e\x94\xd9\xdd\x35\xda\x37\xf8\x3f\xa2\x19\xe4\x10\x51\x99\xef\x6e\x31\xee\x8d\xbd\xa8\xd0\xd6\xa2\x75\x63\x3d\x2c\x91\xd6\xa7\x86\xf3\x3c\x10\xda\xe4\x3e\x07\x19\x53\x7e\x15\x56\xe7\xdc\xec\x07\x1b\x0c\xab\xcc\x23\x7f\x44\x11\x3d\x7a\x35\x66\xd0\x86\xfd\x8c\x15\x1a\xee\x0f\x03\x9e\x47\x37\xb7\xf5\xb7\x30\x68\x96\xd6\xb5\x25\xcb\xf9\xcd\x67\x55\x6f\x25\xb8\x9d\xd5\xd5\x88\xe8\x39\x07\x57\x7c\xfe\xbb\x89\xe6\xbc\xc7\x56\x5b\xd5\x5b\x0b\x5f\x4a\xf2\xa7\x29\x2a\x74\x56\x76\x1e\xfc\xb5\xd8\xad\xd2\x3f\x05\x16\x01\x52\x5d\xf7\xda\x0d\xa9\x4f\xba\x7c\xf8\xc8\x43\xa3\x9b\x13\x69\xb2\xe4\xd8\x6f\xf4\x2a\xdc\x52\x74\x6e\xad\x9f\xf0\xa3\x78\xae\x9a\xdd\x32\x40\x93\xc4\xe8\xa1\x9d\x4b\x15\x77\x7d\xf1\x04\x90\x13\x44\xf1\x44\x00\x91\x56\x32\xa3\xdf\x7c\x01\xca\x6f\xb8\x78\x22\x2a\xc9\x52\x2f\xa4\x55\xfb\x07\x47\x6a\x67\xb1\xcb\x0a\xd2\xf4\x46\x65\xd4\x13\x49\x5f\xb1\xab\x3b\x58\x2a\x73\xc0\x96\xc8\x6d\xef\xb3\x51\x27\xdc\xe8\xfd\xda\xca\x40\x8b\x8a\xb3\x68\xd8\x08\x2a\x75\xb8\x44\xde\x9c\x7f\x30\x90\xc7\x96\x1e\xa4\x3c\xb7\x90\xc8\x3b\x95\xa2\xd4\x9d\x0f\xe7\x2a\xff\x49\x90\x57\xf8\x04\xe0\x70\x79\x0a\x68\x27\xeb\x52\xc8\x79\x32\xb7\x6e\xa1\x38\x33\xd1\xc0\xfd\x2a\xd9\x80\x38\xfc\x51\xae\xe3\x2d\xb2\xe6\x8a\x9f\xb9\x35\xb0\xe2\x1a\x7b\x53\xbb\x92\x44\xdd\xe8\xf2\x71\x4a\x75\xfc\xec\x9f\x13\x72\x25\x65\x59\x29\xc3\xb2\x33\x26\x8c\x4f\xf5\x32\x40\xb2\x16\xb3\x58\xc2\x07\x79\x7e\x26\xbf\xd4\x9c\x43\xb5\xff\xcc\x53\x79\x71\xeb\x41\x1e\x88\xd6\x2b\xf5\x22\x6e\x60\x4e\x1e\x2a\x3f\x03\x6b\xab\x34\x30\x54\x4b\xc2\xf5\xd5\x39\xcc\x6f\x51\xa3\x9c\x72\xdd\xbe\xb1\xba\xdd\xbb\x08\xcd\x30\xf0\xec\x6b\x7f\xce\x92\x52\x93\x03\x21\x9a\xb5\x2e\x6c\x28\x1f\x3f\x4b\xca\x6c\x7d\x9f\xeb\x8a\xad\xe3\xa6\x03\xfd\x93\x89\xab\x65\xa2\xed\xee\x0e\x9e\x20\x54\xff\xd8\xdf\x36\xea\x7b\xf6\xfd\xd7\x5b\x67\x5b\x23\x75\x97\xde\x96\xc1\xa6\xee\xe2\x14\xc0\x0f\xb1\xb9\x73\xbc\x29\x5c\x4c\xc1\x37\x4f\x79\xea\x67\x94\xa9\xa3\xb5\xc8\x0a\x8e\x9d\xc9\x87\x4d\x67\xba\x29\x7d\x75\xba\xcc\xe0\x4e\xb4\xeb\x35\x01\xbf\x99\xa5\xdc\x24\xe5\x92\x01\x7f\xcb\xfa\x11\x80\xf5\xbf\x38\xd3\x56\xbf\x8c\x5a\x3d\x05\x8d\x5a\xf5\x25\x44\x64\x5c\x82\x43\x09\x56\x60\x4c\x8b\x88\xbd\x96\x6e\x62\xe9\x61\x10\xe4\x1d\x4a\x50\xc1\x9a\x7f\x35\x1d\x29\x5f\x59\x46\x95\xd3\x2d\x27\xd8\xd4\xeb\x3f\xc4\xa6\xb5\x1d\xfd\x22\xef\x6b\xa6\x8e\x79\xbb\xcf\x1f\x5b\xa6\x81\xbb\x9b\xff\x23\x53\xda\x49\xb6\xf7\xcc\xfd\x0c\xe4\xa8\xfd\xdb\xfd\x70\x8e\xeb\x2d\x42\xf4\x3d\x71\xc4\xd8\x50\x8b\x0a\x30\xc8\xdd\x7e\xb3\x30\x4e\x8d\xf6\x40\x45\x83\x71\xd1\x26\x1f\xca\x8b\x24\xda\x2a\x13\x20\x04\x9d\x83\x22\x5d\xa5\x69\x61\x68\xe2\x51\xf7\xa7\x72\x25\xc0\xef\x2f\x5c\x27\x8b\xd3\x56\x99\x42\xd8\xaa\x3d\x1a\x91\x89\xab\x06\x6a\x08\x51\x8b\x46\x6d\x0f\xda\x2f\xa1\xbc\x38\x09\x0c\x8f\x61\x44\x58\xe5\xc5\x19\x43\x64\x88\x30\x92\x1c\x8d\xae\x41\xe7\xeb\xb7\x42\xea\xaf\xdb\x5d\xca\x10\x33\xcb\xf9\xb3\x64\x0e\xcf\x91\xb1\x42\x3a\xb5\xab\x1e\x64\xc1\x4d\xc7\xb5\xb7\x8b\x36\x8a\x80\xea\x2d\x23\xd1\x36\xb4\x94\xdb\xec\x6e\x3d\x2d\xbf\x82\xec\xbc\x9d\x61\x0e\x9a\xb7\x7f\xfc\x2f\x6c\x49\x03\xd2\x98\x05\x02\x79\x9a\x89\x2f\x86\x34\xcb\xd0\x60\x55\x4f\x1a\xb5\xcf\x3e\xfb\xaf\xc8\xb3\x0c\x36\x95\xb9\x63\x60\xa7\xea\x94\xa1\x22\x37\xcc\x3c\x49\x4e\x88\xfa\x50\x9a\x57\xb5\x05\xcd\x92\x59\xbf\x7e\x92\xad\xe6\x67\xb8\xc5\x7f\xbe\x67\x26\x9f\x36\x31\x49\x9b\x44\x00\xc1\xf4\xfc\x23\x38\xa4\x8a\x82\xf8\x3c\x77\xdf\x42\xab\xc2\xe1\x1d\x68\x4a\x22\x50\x6f\x24\x54\xc3\x68\x8b\x5c\xec\x22\x5b\xce\xe0\xb2\xc3\xb1\x50\x1c\xeb\x99\x7b\xdb\x57\xc1\xd3\x3f\x92\xba\xec\xcd\xae\x76\xa7\x41\x67\x16\x1b\xcb\xd0\x5f\x62\x99\x45\xaf\xfe\xf8\x17\x74\x58\x55\x24\xd6\x33\xdc\x12\xc8\xa8\xfe\x67\xb6\xe6\xa0\xb4\xf7\x71\x93\x3e\x7c\x6b\xa6\xfc\x68\x9c\xfd\x3d\x14\x08\x86\x9d\x27\x23\xd8\xb0\xf1\xd4\x44\x81\xc1\x3b\x87\xa3\x27\xa4\x75\x7d\x25\x8c\xa9\xc8\x3f\x36\x94\x84\xae\x4b\xe9\x3e\x07\x3e\x18\x99\x76\x92\x31\xab\x21\xe4\x61\x9f\xcd\x4c\x5f\xf4\x43\x93\x0d\x47\x6d\x32\x6d\x3d\xea\xc1\x77\xfc\xa8\x55\x12\x81\x68\xbf\x27\xd2\x59\x0d\x8e\x1f\xae\x5b\x18\xd9\x3a\x2a\x8f\xb9\xde\xaf\x42\x8d\x9e\x43\x21\x21\x7b\x62\x3e\xe2\x3e\x56\xe5\x1a\x1e\x45\xcc\xdf\xf2\x9b\xc2\x3d\x90\xc8\x2b\x11\x06\x78\x7b\x86\x4f\x26\x08\xd5\x62\x62\xff\xd3\x85\x77\x57\x70\x92\x8e\xe7\x42\xf1\xbe\x63\x4e\x5c\x56\xa0\xfb\x78\x50\xcd\xe8\xd0\xdb\x71\x78\x83\xa2\x5f\x19\x8d\x8b\xd3\xb0\xc7\x1f\x0b\xbb\x31\x79\xef\xd4\x52\x12\xf0\xee\xe9\x11\x71\x68\xa7\x58\xb7\x30\xdd\x0c\xa3\x20\x43\x0c\xd7\x3a\xdf\x9a\xa5\x4c\x3d\xa5\x1a\x62\xfd\xc9\x59\xdc\xee\xe4\x8f\x28\x7d\xb7\x30\xcb\x04\x31\xc1\xff\x95\xac\x7b\xd3\x86\xff\x48\x9e\xe6\x29\x52\x84\x28\xa1\xe2\x42\xa2\x75\x1b\x15\xda\x39\x92\xbf\xad\x42\x93\x88\xd5\x87\x8e\xc5\xf9\x08\x74\x59\x6d\x88\x55\x02\x23\xdf\x56\x47\xde\x27\x71\xb9\xf7\x51\xc1\xf3\x43\x73\x8f\xe0\x5d\x6b\x56\x06\x6a\x3f\x62\x7b\x62\x9c\xba\x2f\xb1\x81\xd8\xdf\x3e\x6e\xe7\xc1\xc7\x85\x93\x8d\x70\xff\xe4\x03\xac\xfa\x14\x20\x23\x11\xb5\x80\x55\x16\x41\xbc\xbe\xcb\xf6\x33\xfe\xd4\xcc\xb5\xf5\x75\x6f\xd2\xb1\x35\xc7\x5b\x4f\x37\x9f\x24\x6e\xf5\xeb\xc5\x93\x83\x12\xce\x70\x51\xa8\xb4\x36\xf2\x1f\xac\x4f\xe1\xc4\xed\x43\xea\x79\xd5\x86\x90\xce\xdb\x5e\x41\xd9\xf2\x4e\x64\x0d\x45\x3c\xeb\xa5\x3f\x74\x64\x58\xe7\xeb\x62\xd7\xfc\x67\x8f\x55\x2e\xa5\x4b\x30\xb9\x6f\x0f\x02\xd5\xd9\xab\xc1\x3a\xab\xd5\xae\x70\x0f\x21\xc3\x5c\xe9\xa1\x61\x0a\xea\x47\x0d\x62\x6f\xb5\xa7\x7f\xd2\xc3\x74\xaa\xa1\x29\x6d\xbd\x77\xbf\x49\x48\xcb\x11\x39\x1d\x81\xa5\x0a\xeb\x11\x6f\x41\xea\xd0\x3e\x22\x84\xa3\x2a\x27\x77\xfa\x23\x01\xb5\xfd\x23\xc5\x2e\x03\x5a\xa1\x11\xc3\x7e\x93\x9b\x7d\x4b\x00\x6c\xc7\x67\xed\xaf\x29\xbc\xdf\xb5\x46\x03\x21\x43\xd2\x33\xdb\x91\x8b\xd1\x1c\x88\xbd\xbe\x73\x0c\xba\x87\x40\xda\x6e\x37\x2b\x46\x65\x7b\x1d\xa9\x1f\x05\x13\x53\x68\xa0\x12\xa2\xb5\x91\x01\x6a\xf1\x2c\x0c\xbf\xe4\x2c\x41\xec\x3d\xdf\xc3\xad\x3e\x37\x9c\x4a\xad\xdd\x65\x67\x03\x0b\xcc\x46\x07\x67\x5b\x61\x0d\x7b\x15\xaf\x56\x04\xbc\x78\x56\x45\x75\x61\x56\x8a\x02\x22\x0a\xe4\x5d\x5f\x67\x50\xb7\x90\xe4\x29\x60\x1d\xee\x4c\xeb\x46\x78\x50\x25\x5a\x2b\xde\x68\x14\x48\x94\x36\x38\xa9\xa4\x37\xe3\xed\xaf\x87\x15\xe4\x36\xde\xfb\x88\x2e\xac\x43\xfb\x88\xc8\x35\x0e\x67\xc1\x4d\x71\x9f\xad\x7e\x44\x7d\x56\xb8\xd2\x3d\x4e\x49\x44\xad\x9a\x55\x33\x30\x52\xed\x7a\x83\xae\x18\x77\x67\xe2\xd3\x06\x4b\x0a\x57\x9b\x02\x22\x3f\x7b\xd7\x71\xf6\x91\xb4\x52\xe7\x5b\x3b\xdf\xb5\xae\x5f\x0a\xcb\xda\xd0\x91\xe9\x20\xe0\x4f\xf3\xe2\x99\x42\x63\x45\x09\xe2\x69\xb9\x54\x3d\x61\x54\x28\x5d\xaa\xad\x78\x6d\xc3\x4b\xb7\x2e\x0b\xe9\xc1\x88\x9a\xca\x05\x60\xb3\xee\xcc\x50\xc4\x9d\xde\x5d\xe5\x5d\x98\x94\xe9\xbd\x33\xad\xf7\xae\x40\x01\x0c\x72\x95\xd8\xe0\x3d\xc0\xbe\x21\x0a\xcb\xd8\x16\x46\x7d\x59\x3b\xae\xeb\x9b\xf4\x62\xb7\x71\xfa\xf9\xa7\x32\x0a\xb1\x95\xa5\xdd\xbc\xfe\x39\xad\xbc\xbc\x18\xfe\xb9\x81\xaa\x77\xec\xb6\xec\xf1\x29\xab\x40\x82\x24\x9e\x4f\xd0\xa1\xfd\x27\x20\xc5\xd5\xc6\x10\x3f\x2e\x36\x0b\x8d\x31\x36\x88\x67\x68\x95\x9b\x51\xd2\x92\x16\x86\x85\x2c\x27\xeb\x33\x53\x32\x7c\x0b\x69\x4c\x37\x63\x25\x79\x39\xaf\x61\xcd\xee\xba\x2e\x64\xcb\x6b\x54\x8a\x72\x67\xbe\xf5\x96\x17\xca\x57\x6f\xb9\xd0\x05\x6a\xcb\xfe\x33\xc4\x17\x17\xf9\x19\xa1\x7d\xf1\x75\xc7\xb7\xb2\xac\xb6\x11\x31\x07\xd1\x79\x47\x06\x41\xb7\x71\xa7\x74\x0d\x40\x12\x5d\x7a\xf3\x9e\x85\xc3\x25\x27\x72\xaf\x67\xe4\xb2\xf9\xe9\xc6\xe7\x5d\xa4\xbb\x61\x38\x46\xdd\xb0\x6a\x6d\x99\xea\x19\xc0\xb3\x08\xc1\x80\x59\x71\x37\xb7\x73\x0d\xc3\x4b\x10\xbb\xdb\x95\xc2\xab\xf5\xe6\xa7\x47\x62\x77\x13\x6c\x41\xf6\x6e\x9b\xfb\x77\x92\xe1\xad\x0d\x57\xe9\x31\xb8\x7b\x2b\x72\x3b\xb4\x71\x6a\xfd\x04\xe0\x8d\x38\x4a\x61\xef\x9b\xbe\x5f\x59\xb2\x7e\x45\xb2\xfe\xca\xc6\x6c\xb3\xc1\x95\x5c\x84\x35\x7d\xbd\x91\x9e\x0a\xe6\x36\x3d\x74\x9d\x90\xdd\xb9\xd9\x20\x66\x10\xbb\xe9\x92\x60\xf0\xb0\x8b\x76\xc1\x5c\x6e\x15\x0a\xbb\x5e\x83\xe9\x19\x3c\xed\x2f\xe7\xb2\x0d\xc9\x06\x0b\xdc\x6d\xdd\x96\xd4\xce\xaf\x9a\x44\xe4\x04\xc5\x86\x9b\x8e\xdd\x38\xb7\x00\xef\x57\x65\x05\xbb\xf3\xab\x14\x10\x92\xd2\xaf\x00\xc2\x23\x76\xac\x9b\x40\x89\xf7\x13\x82\xcc\xc1\x2d\x6f\xb2\x0d\xda\x90\xb7\xa4\x7d\xf6\x6f\xa7\x76\x5f\x62\xbb\x63\xe6\x47\xfc\x70\x7c\x36\x64\x67\xef\xa9\xca\xe2\x76\xdd\x9e\xc1\x19\x77\x49\xbf\x2c\x58\x62\x9d\xc4\x03\xd2\xda\x6f\xf8\xd2\x5f\xe0\x30\xb2\x74\x76\xf8\x8f\x90\x5f\xc0\x44\x0f\x8a\x7d\x61\x52\x2e\x18\xe1\xbc\xda\x67\xbd\x3f\xfc\x1a\x23\x0d\x6e\x4b\x39\x18\xee\xd3\x47\x8f\x71\xba\xb3\x2e\x3b\x58\xe9\x93\x06\x59\x08\x27\xc6\x69\xc5\xcf\x73\xd3\x59\xd5\x98\x49\x26\xce\x69\x7c\x62\x14\xf9\x1f\x28\xe5\xcc\x6e\x01\x29\x6c\x25\x48\xec\x3c\xad\xb7\xba\x81\xeb\xad\xb7\x7e\xbd\x17\xef\xf9\xaf\xf7\x94\xbb\x41\x6c\xf1\x36\x7a\xd5\x34\xc3\x5a\xdf\x93\xdc\x5a\xd5\x5b\x70\x0a\x7a\xf7\x60\xad\x67\x10\xd0\x79\x97\xc8\x44\x17\xa1\xbb\xb6\xd8\x57\x23\xfd\xb5\x1e\x1a\xc5\x81\xa7\x1e\xc7\xab\x9b\x80\x8d\x58\x35\xc9\x0e\x8c\x6c\x3b\x8f\x48\xd9\xc2\x48\x5e\x77\x0d\x16\xfb\x53\x6f\xd5\x5a\x21\x39\xb9\xca\x9e\x08\x3d\xf0\x1f\x55\xbe\xbc\x2a\x19\xe6\x65\xd7\x04\x1b\xbe\xd0\x5f\x10\x0c\x29\x93\x2b\xc7\x0c\x74\x83\x55\xd6\x19\xc8\x1a\x4f\xf9\xc5\x8a\xf1\x8d\xd9\x3b\x85\x85\x1d\x77\xd5\x0a\xab\xc1\x4f\x11\xcd\xc9\xa1\xcf\x3e\xd1\x24\x12\x7c\xe6\x48\x6f\xcd\x07\xd3\xf3\x60\x15\xab\x61\xe5\x2a\xaa\x14\xfc\x9e\xb8\xa3\xc2\x5f\x2b\xd3\xe3\x89\x30\x52\xe3\x56\x33\x26\x98\x04\xf9\xa4\x72\xbe\xe4\x3f\x1b\x64\xba\xd5\xc6\xd2\xe1\x40\x3b\xbd\x99\x91\xb1\xe6\x7f\x1c\x67\xf3\xb8\xc6\x85\xe8\xc2\x82\x9c\x9f\x93\x52\x4a\xd7\xe4\x32\x4d\x8e\x3e\x24\xad\x7b\x64\x67\x4d\xff\x13\x5f\x3d\x74\x45\x41\x38\x6a\xca\xf6\x59\xd3\xab\x72\x6f\xc4\x32\xef\x40\x13\xff\x77\xd5\x9b\x71\x12\x83\xe1\x64\x7b\xcd\x3a\x9c\xf2\xcb\x41\xaa\x8f\x0e\x33\x32\x87\xd8\xc1\x72\xcf\x5a\xa6\x86\xae\x29\xdc\x84\xad\xe7\x5f\xf8\x4f\x1b\x7d\x6d\xfc\xdf\xfe\x2d\x6b\x0d\xae\xbc\x75\x66\x68\xb0\x8b\xd9\xbf\xa7\xfc\x72\xf7\x89\x8a\x3e\xce\x28\xf5\x26\x62\x4d\x5b\xb7\xa6\x5d\x75\xba\x95\x67\x58\xe2\x73\xb0\x4f\xfd\xaa\xdc\xc4\xe3\x8c\x6b\x9a\xc5\xfc\x77\xfa\x1a\x51\x6e\xd1\x3e\x82\xa7\xcf\x7f\x3f\xec\x16\xeb\x37\x87\xc8\xc0\xd0\xc4\x29\x86\xd8\x66\xa7\x1f\xdf\xba\x25\x60\xe7\x2b\xf8\xb3\xdc\xeb\x3f\xbe\xb3\xf7\x9f\xf7\xcb\x97\x3b\xcf\x3b\xb9\xe0\xf7\x60\xaf\x08\x57\xb6\xef\x4f\xed\x18\x14\x7e\xa7\xaa\x37\x56\x77\x8b\x0d\x6d\xcb\x52\x05\x69\xde\x8a\x99\x30\x9e\xa3\x85\x27\xe4\x02\xf7\x3e\xa7\x86\xb4\x58\x62\x79\x86\x51\x6e\xb0\xb6\x1b\x19\x1a\xc2\x22\xa2\x37\x66\x0d\x59\x19\xdc\xe9\x96\x90\x5a\x4e\xab\xc1\xa5\xb2\x87\xb9\x54\x65\xa0\x2d\x55\x8a\x83\x4b\x3d\x10\x4e\x72\xb4\x33\xbd\x60\x89\xdc\x17\x03\x64\xe3\xcb\x60\x70\xa9\x73\x90\xff\x31\x18\xe5\x71\xf2\x5e\x9e\x3c\xb4\xa8\xfb\x48\xd3\x0d\x96\xff\x40\x92\x38\xc4\xa0\x74\x55\xbb\x98\xbe\x06\xb2\x42\xb7\xe4\xf4\x93\xc8\x5f\x69\xfb\xe0\x3f\x7d\x75\x5d\x3d\xd1\xf5\xd5\x42\xb9\xcf\x2e\x5b\xd5\xa5\x9c\x29\x88\xf1\x45\xd4\xfb\xc6\x7e\xdb\xa2\x18\x7a\x6f\x34\xe0\xa7\x9b\xc3\x73\x37\x22\x22\x0b\x3b\x0a\x20\xf3\x6b\x76\x7a\x91\x2c\xc4\x52\x86\x3a\x69\x78\x87\xb1\xe5\x0b\x55\xa2\xdf\xa3\xfc\x61\x26\xf9\x12\x4e\xc0\xe2\x5e\x2e\xb2\x27\x5f\x5c\xb6\xff\x95\xfc\x68\x48\x7a\xf0\x41\x3c\x10\x0f\x9c\xb7\xe3\x52\xa9\x15\x99\x44\x74\xeb\x46\x49\xa1\x6e\xc1\x00\x3d\xb7\xa0\xc5\x7f\x45\x80\xff\xfe\x98\xf4\xef\x04\x43\x61\xae\x0e\xef\xe5\x74\xde\xfc\xe7\xa9\x24\x0e\xa0\x1c\x2c\xfc\xdf\xe1\xfa\x40\xca\xa0\x6c\xb1\x16\x37\xe8\x74\xb0\x6b\xe2\x77\x61\xe6\x01\xf8\xf7\xdc\x6d\x8d\xb0\xce\xa2\x6f\x14\x4c\xfc\x9d\xff\x9b\x29\xc7\x90\x66\x4d\xc9\x2d\x31\xa9\x0b\x07\x5e\x8a\xf3\xfd\xdd\x08\x00\x9c\x8e\x48\x3a\xf9\xbb\x33\xd5\x24\xff\x6e\xf9\x8c\xff\x31\xfa\xf6\x57\x31\x77\xe3\x51\x9e\xbf\xba\x2b\xad\xd2\x10\x69\xf2\x55\x9c\xfa\x3a\x04\x33\xff\x49\xd3\x42\xf8\xf3\xfe\xa5\xd1\x2a\x29\xff\x7f\x7a\xff\xf2\x9c\xfe\x78\x03\x1c\xed\x32\x3d\xff\x4b\x92\x45\xfa\x43\xb8\xa2\x93\xf0\x77\x15\xb1\x3c\x2e\xbf\x83\xc4\xbc\xde\x5f\x1a\x06\x06\x1e\x0b\x63\x3c\xe5\xa5\x10\x42\xe4\xcf\xd8\xa0\x44\x12\x98\x05\xd6\xdd\x6a\x92\x0d\xcb\xc6\xd7\xde\xb7\xfa\xa4\xd5\x2f\xdf\xb7\xb2\x64\x99\xa3\xfc\x63\x4d\x39\x7f\x82\x5c\xff\x3f\xb5\x9b\x90\xb1\xa5\x35\xeb\x2d\x42\x74\x58\x17\xfa\x0c\x14\xd7\x74\xb2\xd4\x7c\x6f\xdd\x4b\x61\x16\x3b\x19\x2a\x6e\x85\xa4\x38\xef\xae\x8b\xf4\xff\x64\x2b\x30\xdf\x53\xc8\x04\x0c\xbc\x03\x30\xd0\xf3\x68\xce\x8c\x48\x8a\xc2\xdd\x33\xc6\x99\x24\xcf\x9f\x1c\xdb\x22\x6b\x56\xde\xbf\x9d\x99\x6d\x97\x4c\xf2\x7a\xdd\xd5\x92\xfd\x04\x6a\xc1\xe6\xd7\xa1\xd6\xa0\xf7\x5b\x9f\x44\xde\x35\xa4\xf4\xf7\x09\x57\x5f\xfc\xb1\xfa\x3b\x39\xbd\xce\xfd\x54\xf6\x52\x28\xf1\x63\xae\x53\x9c\x6c\x92\xaf\xaf\x0e\x5a\x1a\x7f\x48\xd9\xbf\xb1\x5f\xd9\x51\xab\xf0\x85\x98\x7f\x16\xbf\xd2\x75\xb0\x8e\xc6\x97\x85\x94\x3d\x66\xeb\x72\x84\xe5\xef\x33\x51\x2b\xcc\x9a\x0a\x72\x52\xe9\x02\x0c\x90\x43\xbb\x79\xce\xdd\xda\x57\x16\x97\x48\x11\x98\x97\x70\xc2\x06\xc3\x3f\x33\xda\xa7\x39\x20\xc1\x27\xf9\xe8\xd9\x2e\xef\x79\x8b\xe1\x2f\xc6\xc7\x1c\x9a\x3b\x60\xec\x77\xd1\x63\x2c\x14\xf1\xf8\xa7\x90\x1c\x90\x69\x37\x0c\x82\xe3\x7c\xe5\x11\x3a\x02\x88\xa8\x72\xb3\xa7\x78\xf0\xd6\x81\xd3\xc3\xcf\x43\x6c\xd5\xd9\xb8\x06\xcf\xb5\x90\x4a\xff\x0d\xf0\xe1\x84\xbe\x01\x0e\x0b\xe7\xf4\x66\xa5\x38\xa3\xd3\xb1\x25\x91\xe8\x5f\xfc\x85\x9e\xe2\xea\xe0\xa4\xfb\x38\x38\xff\x7b\x18\x3d\x83\xe1\xb9\x12\x5c\x7b\x37\x13\x8e\x55\xf4\xf7\x33\x70\x94\x10\x00\x58\x9a\xe6\x50\xe6\xf0\x8d\x81\x16\x80\x56\xa0\x7f\xc5\xe9\x17\xab\x93\xbe\x59\x9e\xc1\x3b\x75\x2f\x52\x37\x66\x9c\x9d\x52\x41\xb0\xb9\x11\xf3\x56\xa8\xd3\x90\xd8\x0a\x23\x0b\x9d\x49\x87\x73\x8c\x4e\x30\x11\xb7\xc6\x55\x14\x2a\x0e\x3c\x9f\xec\x4c\xc2\x47\x98\xdb\xe8\x42\xa6\x22\x86\xb2\xc1\xc4\x6d\xc7\x25\x3e\xe6\x34\xe4\xec\xd6\xb4\xf7\x87\x81\xee\xa7\x0f\x0c\x9c\x95\x7c\xef\x9a\xac\x7b\x92\xda\x10\x56\xc2\x61\x11\x0e\x38\xa8\x81\x32\x2c\xdf\xd9\x1b\xf6\x84\x8d\xda\x03\x4a\x2f\x7c\xde\xb4\x74\xbd\x47\xd1\xaa\x6f\x5c\x94\x23\xeb\xb3\x0c\x3f\xf6\x3e\xb2\x48\x9d\xed\xee\x12\xc4\x91\x64\x6b\x4b\x9b\xbf\x8c\xae\x3c\x10\x8a\xf2\xcf\x7f\xf5\x87\x3d\x68\xa8\x2f\xca\x30\xf7\xd2\x4c\x14\x80\x5c\x4f\x0d\x3e\x1e\x85\x56\xe4\x2e\x59\xa0\x5e\xfe\x33\x26\x82\x20\x56\xa0\x89\x2c\xef\xd3\xe9\x26\xbb\xea\x80\x22\x20\x54\x20\x88\xa4\x64\x5b\x12\xf7\x5f\xa6\x6a\x36\xf4\x92\xd7\x6e\xbd\x99\xe4\xf3\x8c\x38\xd8\x93\xb9\xec\x88\xe3\xc5\x71\x6b\x8b\x59\x16\xc8\x0d\x44\x34\x08\x98\x32\x2e\x40\x6b\x5f\x07\x51\x8b\x90\x26\x98\x03\xe2\xd5\x92\x0a\xc1\xfe\x13\x3a\x58\xa7\x9f\xc0\x23\x96\x68\xd9\xf8\xc4\x14\x5f\x08\x0c\xb4\x55\xda\x0d\xd4\xf9\xe6\xd1\xb2\x3a\x57\xcf\x3a\x48\x99\x60\xc8\x6a\x1f\xec\x1b\xf5\xa6\xfc\xb9\x4a\x68\xcc\x4d\x91\x79\xaf\x3c\xbf\x9f\x1b\x75\x1f\xa2\x67\xb9\x4f\x89\x03\xb4\xae\x30\x70\xb0\xc7\xf1\x8c\x81\x19\xb4\x06\x74\xbf\x8a\xdd\xc9\x4a\x4a\x3e\x6a\x70\x09\x16\x64\x4d\xc0\x3c\x73\x37\xab\x7a\xa2\x72\x12\xf3\x1f\x63\x49\x5d\x4d\x3e\x74\x12\xb6\xce\x56\xe8\x66\x64\xaa\xb7\x3c\xff\xa1\x28\x43\x32\x40\x0a\x01\xc3\x20\x6f\xe3\x8f\x76\x4f\xca\xaa\x7c\x26\x37\x9b\xfd\x8f\x32\x00\x65\xe7\x84\xd4\x13\xb3\x14\xf1\xc2\xe2\x57\x17\xca\x4f\x43\x18\xa0\xb2\x94\x6d\xf1\x2e\xff\x6c\xf1\xbf\x9f\x69\x3d\xf4\x9f\x75\x95\x51\xf2\x5a\xbe\x3a\xf9\xdf\xc4\xd2\x2d\x19\x9e\xf1\x8a\x27\x7b\x5b\x9f\xe1\x6d\x2c\x39\x80\xc6\xbc\x65\x98\x1d\x2b\x6f\xf2\xd1\x6c\x4c\xcc\x80\xfd\xa3\x75\x0b\x22\x97\x07\x38\x05\xda\xc4\x9b\xe4\x8c\x51\x89\x51\x3c\x42\xbe\xd9\x69\xff\x21\x8e\x0a\x5b\x63\x16\x2d\x77\x80\xfb\x82\x0c\x51\x66\x87\x3c\x38\xb9\xf3\x08\x0d\x95\x87\x3c\x0a\xad\x64\xde\xc5\xa3\x87\x49\x9d\x99\xbf\x77\x0a\x95\x2d\xe6\x87\x12\x96\x1e\x65\x75\x2e\x98\x95\xe4\x90\x3c\x4a\xee\xcc\xfe\xde\x82\x80\xaf\x9f\x3f\x8d\x3c\x7e\xeb\x67\x48\x6c\x06\x9e\xc3\x39\x2c\x87\xf5\x5f\xf9\xdb\x3e\xa4\xbd\xff\xc8\x4a\xb3\x7d\x64\xa7\xbe\x96\x80\xbc\x12\xcc\x4b\x4b\x3c\x21\xf8\x21\x8f\x74\x9f\xbb\x9a\xf8\x87\xb7\x14\xbe\x3b\x69\x6c\x8f\x20\x71\x3c\x3c\x76\xb5\xca\xd4\xd8\xee\xa0\xd2\xab\x0c\xb3\xf7\x84\x89\x53\x49\x00\x40\xbf\xd0\xdf\x9a\x47\x82\x67\x2b\x37\x1b\xfc\x3d\xc9\xff\x53\x48\x3a\xbf\xc5\x5b\x27\x51\x10\x0d\x77\x66\x0d\x65\x3d\x78\xe6\xaf\x79\x2c\xb7\x8f\x18\xdc\x04\x59\x29\x53\xf9\x47\xfe\x4f\x3f\x8f\x60\xe5\x20\xe6\xf3\x60\xdd\x01\x11\x29\xe8\x88\xd3\x74\xc0\x6e\xe3\x97\xcc\xfa\x83\xb9\x3d\x56\xb2\xc2\xce\xfb\xf5\x2e\x9c\xa8\xc9\x91\x45\x49\xb3\x63\x07\xe8\x06\x28\x32\x9c\x43\xd2\x1d\x09\x36\xe2\xeb\xcb\x43\x59\x4a\xe7\xa8\x23\x82\xa4\xdf\xed\xa7\x34\xd1\x9f\x9f\x32\x73\x44\x48\x38\x54\x08\x28\x8c\x92\x7f\xd3\x41\x18\x33\xaf\x3f\x31\x02\x4e\x75\x66\xe8\x20\x00\x58\xdd\x4f\x3b\xdd\x0f\x87\xd6\x13\xf9\x96\x93\x24\xd4\xa7\x5b\x92\xce\x53\xa4\x45\x4d\x90\xa4\xe5\x26\xbf\x6e\xdd\x74\x53\x3f\x60\x52\xc2\xe2\xc4\x91\xea\x04\xd7\x96\xdd\xc1\x43\x2d\xe5\x74\xf7\x33\xde\x63\xcb\x87\xfe\x3d\xd0\x7b\xda\x01\xcb\xa2\xd2\x3b\x1c\x93\xa7\x67\x38\x28\xd4\xcd\x9c\x6c\xac\xad\x9e\xfd\x54\xff\x77\x25\x4a\x83\xc3\x63\x99\x47\xac\xef\xdd\x9b\x24\xb0\xfa\x33\x09\xfc\x72\xb4\x9d\x22\x48\x36\x49\x22\x76\xfa\x51\xfc\xcf\x1c\x5c\xff\x21\x6e\x00\x1a\x06\x96\x14\x23\x9b\x6a\xb7\xca\x00\x7c\x32\xa8\x32\xd5\x59\xfa\x02\x21\xef\x04\xa4\x4e\xd8\x54\x07\x9d\x79\x08\x4f\xe3\x42\xf7\x83\xa9\x58\xed\xbe\x8a\xf0\xff\x8f\xf3\x70\x89\x29\xbf\xa9\x28\xb3\x65\x0a\x37\x24\xfb\x70\x93\xf7\xf6\xc0\xca\xff\xa8\xe4\x23\xca\x2f\xcd\xf2\x4e\xfe\xf6\x3b\xb8\x38\x58\x9a\xf2\x09\x9f\x2b\xb6\xad\x13\xec\x1b\xb9\xeb\xc9\x18\xa9\x2b\xe1\xf3\x5f\x47\x9e\x44\xc6\x0f\x52\xc4\xe4\xa4\x2c\xde\xa2\xee\x26\x0d\xc0\x3d\xb7\xd2\xfe\x8a\x8c\x94\x31\x17\x32\x87\x7a\x00\x22\xe9\xd4\x79\x77\x9c\xc5\xd5\x7f\x2a\x5a\x69\xf0\x11\xfa\xbd\xc8\xa9\xbe\x5d\x70\xf8\xd4\xd2\x16\xd4\xff\x34\xf2\x1a\xca\xa5\x06\xca\xe0\x29\xff\xec\x0c\x79\x22\xb2\xe5\x01\xd3\xe3\x3f\xd2\xf9\xa5\xb3\x90\x51\x27\x1e\x87\x8e\x39\x62\xce\x58\x3f\x68\x68\x37\x5f\x13\xb7\x73\x2e\x44\x3a\x63\xd8\x21\x19\xf2\xc6\x71\x82\x24\xac\x0f\x97\x27\x68\xdd\x90\x93\x2f\x1f\x98\xc9\x4d\x10\x9d\x64\x6c\x70\xf8\xb8\xe5\x8a\x2f\x40\xd2\x87\x9b\x1e\x8d\xf3\x60\x53\xda\xc5\xff\x4f\x33\x8f\xbb\x7a\x92\x16\x21\x58\x7e\x92\x4f\x48\x52\x30\xb0\x6e\x26\xc5\x1b\x74\x0b\xd2\x78\xd3\x18\x63\xb2\xda\x83\x7d\xa2\xf1\xfb\x71\x1a\xfe\x7d\xf5\x26\x79\x8c\x61\xe4\x78\x23\xc7\x20\xb8\xc7\xf7\x1e\x12\x67\xa3\x0d\x25\xf9\x7f\x0c\xd3\x04\x30\x9d\xcf\x7f\xca\x10\x74\xbc\xa7\xe0\xf2\x73\x28\x3f\xde\xe3\x2d\x1b\xe7\x5b\x86\xcf\x71\xa0\x6e\x3e\xe1\xb6\xd1\xe4\x54\x3b\xff\x56\x84\xfb\x96\xd5\x21\x01\x0a\xd7\x68\x79\xed\x36\x69\x0b\x8f\x4d\xd4\x46\x03\x72\x9b\xb6\xa1\xb9\x9f\x1f\x0e\xd6\xab\xe8\xe0\x91\x0b\x30\x56\x75\x33\x20\x20\xe0\x93\x7e\x5a\xf8\xe9\x4a\xc1\x49\xfa\x9a\x83\xe9\x7f\x83\xb4\xe0\x8c\x79\xab\x07\xc8\xe0\xae\x4c\x4e\xb7\x72\xbf\xe5\x06\xdd\x96\xa6\x7d\x99\x40\x39\x22\xbd\x9e\x34\xf5\xce\xdc\xaf\xfb\x29\x23\xe2\xba\x33\x59\x1e\x20\xfe\xb7\x07\xa5\x0a\x6e\xd3\x3f\x63\x6e\xcf\xc5\xe7\xea\x6d\xa5\xba\x80\xb5\x0c\x8b\x74\x06\xc8\x3d\x0f\xf9\x6b\xd0\x01\xc3\x14\x7b\x55\x56\x31\xa6\x55\xdd\x58\xc4\x71\x89\xdf\x1e\xf4\x77\x64\xfa\xf2\x5e\x0d\x72\x9d\xe6\x04\xdb\xb8\xba\xd7\xb6\x23\xbc\x20\xfb\xc1\xd9\x44\x57\x1d\x08\xf7\xe9\x7d\x72\x5b\x10\x2e\xf4\x1c\x5a\xe8\x29\xeb\x18\x39\x74\xb1\x5d\x97\x40\x2d\x3b\xc4\x08\xb8\x61\xe9\xec\xfa\x02\x0b\x01\xa2\xca\x86\xc0\xbe\xce\xed\xf8\x09\x0b\x54\x4f\xac\xf7\xa3\xce\x50\xd5\xf7\xa9\x38\x64\x70\x92\x49\x3f\x7b\x6e\x3b\x1a\x58\x4a\x02\x58\xa5\x13\x8f\x66\xce\xbf\x8c\x71\x0a\x0b\xd0\xe7\xdc\x07\xdb\x94\x28\xc8\xeb\xcf\xc6\x1a\x3a\xd4\xd4\xc9\xf0\x81\x66\x12\xaa\x2a\x9f\xd2\x87\xc0\xa0\x31\x8e\x49\x3e\x22\x7f\xe7\x0c\xe3\x19\xdf\xc2\xfa\x4d\xb7\x7f\xa3\xd6\xcd\xa0\x42\x80\x35\xfa\xe1\x34\x6d\x9f\xac\x7a\x2d\x23\x34\x6e\xa5\x26\x70\x53\x85\x22\x75\x09\x83\xee\x56\x0d\xe1\xe6\x1f\x8a\x7f\xb7\x16\xff\x6f\x61\x94\x9e\xf4\x62\x25\xcc\x84\x32\x90\x0b\xf1\x81\x4f\xe8\x15\xac\x59\xff\x9e\x58\x7f\x8f\xe9\x60\x4e\xdf\x18\x96\x5f\x06\xa0\xc2\xec\x68\x3f\x29\x94\x32\xd2\x30\x30\x04\x08\xf4\x9e\x1a\xaa\x67\x5c\x01\x86\x13\x1e\xdd\x76\xf8\x97\x02\xc9\x21\x71\x44\xc6\xb6\x56\x62\x7a\x51\x48\x76\xde\xbf\xef\x30\xd1\x9f\x65\x4c\x2e\xf9\xe2\xa3\x65\xc7\x72\xf3\x1e\xd8\xeb\x1a\x6e\x7a\xd3\x0f\x1a\xe0\x58\x19\x83\xcf\x01\x5c\x6c\x78\xec\x3a\x6e\x5d\x91\x76\xf0\xbc\x9f\x8f\x50\xa8\x0b\x90\x50\x69\xe5\x42\xcd\x94\x81\xc6\x24\x5a\x29\x01\x3b\xf8\x67\xcb\x31\xf9\x2e\x98\x8c\x70\xe4\x0f\x73\x97\x20\xae\x2d\x3e\xb9\x53\x16\x53\x67\xb0\x7a\x43\x1c\xf0\x7b\x9a\x65\x49\x0c\x61\x03\x22\x12\x1b\xa1\x64\x30\x6b\xf2\x6c\x40\xad\x98\x42\x45\xe0\x0e\xdf\x0c\x6f\x70\x42\x6a\x01\x2e\x3f\xec\x3e\xd3\xd6\x2f\x60\x77\xcf\x35\xac\x0b\x69\x3e\x5a\xd5\x3a\xbc\x09\x61\xc8\x5d\xd5\x02\x0c\xad\x7c\x6f\x32\x92\x06\x89\xb2\x0c\x6e\xbb\x23\xd1\xbd\x21\x32\xbf\xc0\x20\x7e\x06\xcf\x1f\x43\x99\xb8\x18\xcc\x3a\x06\x11\xdb\xc6\x08\x2e\x30\x46\xfc\xa2\x09\x71\xcb\x77\xe7\xfe\x0d\x31\x85\x01\xf0\x93\x4d\x58\xcf\xdf\x11\xca\xa5\xc9\x64\x48\x25\x74\xfd\x03\x66\x19\x85\x50\x82\xa0\x86\xb3\x83\x2c\xf4\xa0\x82\x50\xb5\xfd\x30\x48\xe0\xe0\x1b\xd2\x04\x1f\xc9\x1c\x84\xeb\x7a\xfd\x2c\xd2\x17\xe8\x66\xe0\xef\x30\x0c\xbf\xa4\x53\xc0\x74\x48\xaa\x24\x04\xf0\xf2\xea\xea\x10\xf5\x54\x78\x17\xdc\xa7\x38\x50\x93\x3a\x81\x54\xef\x0c\x74\x89\x89\xba\x87\x50\xc3\x1e\x3a\x0a\xa2\xff\x5b\x69\x5f\x2b\x57\x45\x6e\x18\x90\xce\x23\xe9\xde\x21\x26\x60\x06\xb1\xda\xc3\x03\xbe\x5a\x37\x81\x6f\x5a\x9d\xd3\xe8\xe5\x53\x06\x24\x43\xd5\x14\xfb\x10\x8e\x33\x43\xb5\x6e\x74\xdd\x29\xb9\x40\x21\x80\xda\x15\x1b\x94\x03\xe9\x52\x0a\xdc\x7a\x05\xb5\x94\x28\x85\x02\xc6\xca\x40\x9f\x95\x5b\xfc\x0b\xef\x35\xef\x00\x30\x9c\x84\x80\xf5\x56\x89\x13\x39\xfc\xac\x57\x6d\x3c\xca\xff\x28\x29\x04\x32\x0c\xf1\xbe\x3b\x19\xf2\xce\x32\x38\x2f\xcf\x78\x3f\x3c\x49\x99\xc7\x11\xd7\x6f\x98\x91\x78\x4e\xda\x3d\x12\x2d\x63\xba\x7a\xc8\xaf\x50\xb9\x70\x7d\x86\xbe\x1a\x75\xa7\x34\x16\x2e\x25\x8b\x43\x83\x41\x65\x8f\xa3\xba\x1c\x83\xbc\xc9\x35\x99\x01\xc1\x85\x10\x6d\x30\x24\xb5\x87\x5d\xd3\xa5\x86\xf8\xf6\x59\xc9\xa9\x47\x43\xfa\xf1\x19\x93\xe7\x7c\x29\x40\xa0\x90\x78\x02\x75\x8c\x07\x28\xa3\xb3\xb6\x88\x69\x3d\x07\x5c\x23\x62\x3a\xda\x71\x6e\x0c\x56\x92\xae\x81\x5d\x1f\x94\x3c\x5e\x92\xc6\x49\x86\xbc\xd7\x25\xc4\x03\xa6\xaf\x12\x00\x06\x3c\x40\x59\x90\x5b\x97\x4c\x8e\xe7\x4d\x9a\x07\x67\x7c\x0b\xe9\xe4\x1c\xeb\x90\xba\x30\x09\x94\x14\xa8\xd7\xd0\xe2\xed\xa4\xbb\x4e\x98\xb4\x93\x7c\x52\x03\x52\x1f\xc5\x9a\xa2\x5d\x7b\x2d\xf3\xcd\x91\x92\xbb\xa0\xb3\x9c\x52\x38\x99\x87\xb5\x00\x90\x76\x48\xf2\x55\xdf\x1f\x45\x57\x85\x04\x11\x6e\xb4\x6e\xe1\x80\x4e\xc5\x0b\x1c\xe7\x0a\x39\x55\xa8\x33\xe8\xeb\x02\xe3\x73\x95\x3c\x83\x3e\xf8\x54\xa4\x3b\xa1\x20\xdb\x90\x74\xcc\x89\x53\x39\x06\xc2\xdb\x7d\xe2\x33\xe3\xdb\x4c\xa4\xaf\x0f\x8a\x0e\xff\xc1\x37\xfd\x1c\xbd\xad\x4a\xaa\x57\xd2\x7d\x46\x0a\x5a\xba\x7b\xac\x2c\x85\xfe\x6b\x02\x13\x4c\xc6\x15\xe9\x5c\xde\xa1\xd1\x00\x73\x2f\x07\xad\xae\x01\xa9\x48\xa0\x4e\x0b\xa5\x92\x74\x0e\x1b\xb6\xb0\xe1\x4e\xfb\xa5\x14\x7d\xc8\x82\x69\x15\x38\x3a\x54\x5c\x60\x7a\x82\x12\x6e\x6b\x87\x04\x48\x11\xe2\x0e\x53\x4b\x7e\x08\xa4\xed\x51\x6c\x21\xcb\x0f\x3d\x0e\x0e\x3e\x14\xff\xb5\x52\x6b\xcd\xca\x3a\xc4\xef\x84\xe5\xaa\x87\xd2\x12\xb2\xd2\x46\x66\xc9\xd8\x6f\x3c\x98\x51\x8c\x0e\xc0\xc6\x6c\x7e\x0c\x54\x5c\x07\x03\x66\x02\x3c\xe0\x72\xf0\xf7\xf5\x80\x43\x2a\x7c\x63\xd2\xf3\xa3\xf6\x06\x2c\x20\xf9\x74\x62\x50\xe3\x69\x73\x00\x7a\x63\xd2\x48\x52\x9b\xdd\x94\x97\xf4\x2a\xac\x1d\x51\x99\xe6\x24\x1a\x3d\x12\x0a\x71\x0d\x5f\xa7\xbd\x37\x47\xd9\x9b\xa8\xef\xad\xa8\xdb\xf7\xde\x24\xfe\xf4\xbd\xd7\x9b\xb6\x16\xdf\x7b\xf0\xd7\xe3\x5b\xe5\x86\xfb\xb5\x16\x4e\xdd\x8c\x6f\xe9\x33\xfd\x5f\x97\x81\x97\xe8\x02\x66\x3f\xa5\xca\xe0\x71\x85\x6f\xfe\x79\xad\xdf\xa1\xc7\xb0\x85\x34\xf2\x17\xf1\x45\x3f\xeb\xe7\x3e\x9d\xf0\xfe\xb9\xee\xc4\xaa\xef\xc3\x2e\xc7\x07\x06\x5c\xba\xc8\x4f\x96\x30\xe0\x27\x9d\x1c\x5b\x7d\x48\x1c\xfd\x28\x53\xe9\xe3\x9a\xc4\xd4\x5e\x18\xbb\x5e\xcf\xfb\xc3\xdc\x94\x37\xd3\x56\xdf\x61\x33\xe8\x31\x18\x11\xf6\xc1\x71\x67\x3f\x04\x30\x49\x4e\x21\xd2\x74\xdf\x1e\x0f\xf7\xa8\xfe\xdb\x55\x79\x9f\x5d\x8e\x61\x9a\x53\xe8\x31\x4c\x7d\xeb\x55\xea\x3e\xef\xfa\xf7\xcb\x9b\xb7\x85\x51\xc6\x0e\xef\xca\x80\xdf\x7b\xad\x53\x57\x6d\x7f\x97\xff\x5d\x99\x2a\x05\x7e\x59\xe1\xbb\x6e\x4d\x91\x73\xf9\x23\xc0\xf5\xee\x3a\x01\xf0\x89\x69\x5d\xad\xbb\x33\x0a\xdf\x65\x97\x39\xfb\x9e\x7b\x02\xd2\xdb\x93\xbd\x1d\xac\xd7\xa3\x4a\xcb\x01\x73\x8a\x2d\xcc\xda\xd7\x55\x66\xed\x2b\xf3\x34\xdc\xe8\x9d\xd7\xb0\x30\x4a\xf4\xee\xc4\x54\x20\x2f\x7e\x96\xe8\x85\x26\x79\x0e\x35\x3b\x09\x5d\x85\x30\xac\x9f\xdd\xb1\x5e\x3f\xca\x16\x42\x2a\x01\x50\xb1\x3c\x60\x0c\x73\x8e\xda\xb7\xd2\xd9\x80\x7c\xfc\xd9\xd7\x0f\x85\xaa\x09\x73\x0e\xf5\x05\x8f\x51\xf2\x01\x64\xa7\xd7\x2e\x82\x49\xce\xf2\xed\xfa\x27\xdf\xea\x6d\xd7\x12\x36\xf5\x98\x38\x95\x60\x42\x34\xf7\x5d\x15\xf6\x2d\x15\xab\x37\x9a\xdf\xa2\x88\xed\x3b\x4f\x59\xfa\xa1\x6f\x24\x1e\xf9\x35\x06\xfd\xf7\x6d\x15\x96\xd4\xd0\xdf\x64\xf0\x4b\xaa\x61\xbd\x64\xa0\xef\x4f\xec\xc4\xf4\x23\x97\x86\x48\x60\x7b\x5b\x5d\xe0\x83\x5c\x00\xa6\x49\xbd\x15\x99\x7f\xa7\x42\xc7\x71\x03\x30\xb0\xe5\x1b\x1d\xea\x58\x06\x7e\x6f\x4c\x7a\x8a\x2c\x01\x27\x56\xe7\xf9\xdf\x9f\xf8\x84\x5e\x37\x87\xe0\xaf\x7b\x8d\x15\xfd\xf3\x7a\x61\x1a\xba\x11\xac\x32\x78\x03\xec\x52\xcc\xaf\x6a\x75\xe8\x33\xdb\x98\xe7\xe9\x4b\x21\x97\xf3\x5a\xe5\x4d\x2f\xfd\x99\x57\xb9\x34\xb0\x85\x30\x04\xe9\x93\xaf\xa2\x7c\x55\x03\x89\xcd\xd2\xab\x50\x8d\xe8\x55\xc2\x4b\xe5\xe5\xd2\x21\xae\x34\x81\x6e\xd0\x21\xaa\x9d\x2f\x84\x41\xbd\x0e\xa2\x13\xc9\xbc\x1d\xb3\xf2\x0d\x34\x3a\x2e\xd8\x5b\xef\xdc\x0a\x64\x7d\x51\x84\x21\xef\x2c\x34\xe3\xfe\x12\x3f\x04\xde\x75\xaf\x10\x5b\xa8\x2d\x44\x22\xf6\xd5\x5b\x36\xe8\x39\xe4\x2e\xd8\x90\xdb\xbb\x72\x1e\x51\x52\x0c\x88\x34\xc7\x92\x6d\x78\xbf\x7e\x9b\xee\x43\x3d\x03\xeb\x5b\xa0\xd5\x3c\xc1\xb0\x46\x8a\x29\x24\x1a\xba\xf3\x7d\x52\xed\x8c\x80\x96\xd4\x2e\xd2\x1a\x52\x0e\x2b\x3d\x3b\x5e\x29\x56\x48\xda\x22\x69\x2c\x80\x69\x53\x5a\xcf\x43\xe8\xd3\xef\xc4\xdd\xac\x07\xe1\x6d\xc6\xbd\xeb\x79\x42\x3a\x56\x0e\xf5\x4e\x8f\xab\x8a\xb4\xde\x91\x7a\x71\x89\x98\x7d\x41\x52\x31\x8c\xeb\x93\x62\xa9\x36\xda\xdb\x95\x62\x60\x6d\xae\xdf\x41\x7f\xd2\x61\x53\xef\x95\x31\x64\x1d\xe4\x60\x1f\xa2\x72\x86\x24\xa5\x60\x63\x29\xfd\x6b\x70\x0d\x69\x00\xd6\xd8\x17\xdc\x77\xf3\x3b\xb0\x07\x55\x31\xff\xc5\xdd\x72\xa8\xde\xc3\xc9\x3e\x2b\x5f\xef\xf2\x71\x52\x23\xfa\x1f\x8b\x9b\x8a\x11\x6a\x86\xa0\xb6\x17\x1b\xa8\x9a\xbd\xac\x3e\x5e\x43\x2a\xc2\xde\x6c\xbc\x5b\x27\x97\xf6\x70\x8f\xb3\x82\x9b\xc2\xa3\xb5\x0a\xa9\xcd\xbf\x20\xbc\xc3\x1d\x38\xad\x07\xb2\xb9\xa7\x45\x5d\x52\xe4\xb9\x68\xd9\x7b\x39\x25\xbb\x7f\x96\x57\x39\x10\xf5\x77\xc1\x07\x9f\x9e\xea\xb6\xf0\x98\xc0\xfb\x10\x70\x96\xe2\x9a\x3f\xcf\xee\x8f\x3f\x93\xb3\x27\x8f\xab\xcb\xe7\x34\xd2\xf4\x5f\xe8\x4e\xe8\x18\x33\x02\xcd\xd2\x95\x80\xcf\xbe\xce\x39\xc7\x25\x79\x62\x86\x03\x48\xa2\xf0\x48\x79\x08\x33\x7c\xf5\x63\x61\x1d\xc9\xff\xe5\x37\x27\x8b\xae\x7c\x53\x7e\xc9\xc6\x85\xba\x69\x98\x0f\x1b\x42\x29\x23\x47\x08\xe6\x82\x88\xb3\xbe\xe2\x4b\x0f\x8d\x5d\x8c\xeb\x37\xfb\x72\xd9\x18\x2c\x32\xa8\xae\x4c\x83\xe5\x2b\x5d\xfe\x29\x5f\xd6\xe5\x55\x34\xfc\x52\x0f\xe0\x0a\x95\x57\x98\xb0\x8b\x34\x72\x59\x27\xc8\xbb\x78\x97\x5c\x89\xaf\xa4\xae\xc7\x95\xfc\xeb\x3a\xbf\x9f\x69\xed\x6a\x13\xdf\xda\x55\x28\xaa\x34\x22\xac\xba\x9e\x18\x65\x30\x18\x9e\xd2\x56\xa1\x3b\x5f\xf7\x9d\x64\x63\xfd\x0e\xab\x8f\xf3\x96\xb1\xcb\x79\x37\xa5\x1d\x9c\xe4\x10\x42\xc2\x94\x9c\x5e\xb8\x14\xef\x0c\xde\xbb\x04\x05\xc1\xd6\xdd\xe9\x4e\xda\x83\x42\x94\xa2\x88\xd4\x7b\x3f\x1e\x51\xe9\x9f\xf7\x40\x7d\x85\xcf\x28\xf7\xfd\x89\x26\x34\x70\xdf\x27\x43\xdb\x6d\xf8\xbb\x0e\x05\x39\x31\xee\xb7\x1f\x4d\x98\xcf\xc8\x8d\xe4\x1c\xe3\x63\xa1\x64\x44\x50\x75\x4f\x11\x9a\x2f\x1b\x1b\xd9\xfd\xa3\x1e\xc2\x05\x36\xd7\xbd\x08\x4e\x29\xcc\xf5\x8f\x30\xea\xaf\x21\xf0\x60\xe8\x51\x08\x72\x88\x42\x54\xb0\xcd\xc2\x4f\xdc\x25\x2c\x74\x75\x05\x42\x39\x55\x38\xec\xd9\x2f\x10\x0c\x3b\x67\xff\x2a\xcf\xd0\xaa\xc0\xa0\xb6\xc8\xfc\x1f\x33\xed\xaa\xdc\xac\xfa\xba\xb5\x45\xbe\xbb\x9d\xff\x2d\x61\x85\x2b\x1f\x57\xac\x3b\xf6\xfe\xac\x5d\x0d\x23\x2e\x23\x44\xbb\x69\xfb\x1f\xbe\xe6\x57\x24\xf5\xc0\xef\x47\x02\x1b\x99\x29\xa3\xf6\x9e\x7c\xe2\x7f\xe9\xa6\x12\xad\x21\x5d\x5b\x3a\xe9\x63\x7f\x71\x06\x09\x65\x1c\x1f\xc9\x65\xbc\x75\xc8\xfb\x95\x24\xca\xf5\xcf\x84\xb6\x2d\x6c\x1c\x5e\x19\xa2\x3e\xc0\x85\x86\x39\x9e\xa7\x1a\x69\x03\xe3\xcc\x68\xda\xf9\x7f\x77\x9a\x1a\x09\x5e\xa7\x53\x52\xc3\x9f\x08\xca\x1a\x4f\xaa\x5f\xc0\x72\x60\xd3\x3b\x7d\x74\x59\x86\x23\xf1\x4c\xf5\x55\xc7\x4a\xc1\x93\x7a\x23\x4a\x90\x08\xc9\x5a\x3a\x91\x7e\xda\xf4\xc6\x56\x19\x91\xd7\x9d\xa3\xf9\xd3\xfa\xb4\x94\xc5\x60\x24\xe9\xdc\x31\xff\xe1\xff\xd9\x14\x17\x82\xce\x05\xe7\x04\x5d\xf1\x42\xda\x17\x59\x9c\x6d\x48\x81\xfe\xd4\x2d\xea\x4b\x1e\x45\xa7\x7b\xf3\x6a\xb5\xf5\x8a\x9b\x46\xb4\x86\x17\xde\x8a\x45\xa3\x3c\xb7\xfb\xbf\x42\x91\x22\x44\x1f\x4f\xb0\x1f\x59\xc6\x0a\x58\x63\xee\x1d\x25\xc1\xcd\x9e\x02\x0f\xb3\x4a\x41\xe8\x2c\x91\x2f\x67\x43\xd4\x07\xdb\xdb\xb3\x4c\x22\xe2\xcf\x37\x7e\xcc\x4f\xda\x64\x8e\xc7\x6f\x40\xd2\x24\x33\x0d\x4a\x50\x26\x99\xfd\x17\x59\x32\xbb\x30\x05\x4b\x79\xfb\x43\x9f\xec\x24\x9a\xe2\xb9\xcc\xd1\xf5\x35\xb4\xbe\x24\x93\x81\xd7\x92\x0f\x79\x06\x6b\x80\xf1\x7d\x48\x5a\x8c\xad\x4a\x34\x23\x5d\xda\xc0\x9d\x48\x42\x5f\x65\x86\x00\xaa\x84\x02\xe6\xf0\xdd\x3d\xb3\xf4\x55\x0d\x3c\x92\x7e\x8b\x55\xdb\x92\x67\x41\x55\xcd\xc8\x06\xa0\x17\x87\x0d\xf5\x54\xf1\x59\xfd\x45\x71\x8a\xf0\xb4\xc7\x00\x94\x1b\xaf\x8c\x66\x9e\x90\xcc\x6f\x8b\x10\x8b\xf2\x3c\x43\x12\x83\xda\xb2\x67\x2e\xcc\xaf\x39\xd1\x6d\x56\xf5\x90\xbb\x0b\xf9\xe9\x93\xf3\xe7\x15\xc3\xd0\xae\x89\x7e\xe2\x73\x94\xca\x45\xe5\x2c\x27\x08\x41\x92\x46\x33\xf8\xe4\x80\xc9\x10\xc9\xfb\x90\x65\x95\x67\x15\xe0\x3a\xd5\x30\xda\x7f\xbb\x50\x60\xe0\xa8\xb0\x20\x97\xd1\x11\x33\xab\x0d\xdd\x76\x43\xbb\x5f\x18\x96\x31\x7b\x4c\xd8\x6a\xb8\xfe\x5b\x7d\xfb\x8a\x0d\x5a\x19\x3a\xa4\xcb\x9f\x23\xe8\x61\xd7\x33\xb6\x4f\x3f\xad\x8d\xfa\x8f\x76\x45\xa5\x08\xbd\xa3\x55\x67\x41\x3a\xd4\x0f\x7b\x72\xf6\xfe\x5b\x22\x82\xc9\x6f\x1c\x6f\x63\x7a\x80\xe7\xe8\xf1\x01\x43\x4e\x03\xfd\x8c\x78\x53\x31\x77\x88\xac\xf4\x90\x1d\xc1\xb2\x0e\x14\x13\xe1\x80\x43\x21\xc8\x21\xa8\xa1\xce\xac\xa3\xe1\x87\x08\xd2\xbd\xfd\xa3\xc1\x61\xdd\xe4\x2e\xc3\x81\xd6\xd7\xa1\x55\x26\x12\xfc\x71\x98\x45\x6b\x3d\xd1\x43\xf3\xd2\x6a\x0e\xe9\x66\xdc\xd2\x07\xf1\xe4\x2d\xfe\xb3\x61\x3a\x9a\x8d\x2b\x72\xdc\xbd\xe4\x43\x42\x82\x8b\xe6\xa1\x1c\x6b\x23\xa0\xe8\x91\x9d\xae\x61\x4a\x30\xbd\x58\x51\xbb\xc0\x5a\x5a\x03\x0e\x1d\x82\x68\x39\x6a\x13\xef\x5f\x14\x1e\xc2\xde\x72\x2a\x47\x1b\x3c\x43\x96\xf0\x84\xa6\xfc\x49\x90\xf4\xed\xc1\x14\x9e\x25\x7c\x23\x75\xfd\x6a\x02\x92\x64\x5f\x30\x12\x61\x43\x91\xb2\xc6\xda\x67\x9a\xca\xff\x79\x39\x50\x4d\x12\xba\x1e\x2b\xe9\xee\xed\xf3\xe4\x34\x22\xa6\x43\xd8\x37\x69\xf7\x3e\x52\xa8\x83\x4d\x17\x4a\x3f\x7f\xb3\x9a\x7b\x64\xd6\x6a\xbb\xd9\x4b\xb6\x72\xb8\x3d\x60\xd8\xee\x69\xe5\xe9\xda\xcd\x0f\xd2\x85\x3e\xe8\xca\x6f\xdd\x8a\x93\xe3\x63\x9f\x46\x61\xf3\xd3\x14\x28\x6f\x77\x27\x81\xb4\x5b\x8d\x64\x43\x3d\x28\x69\x0b\xa4\x42\xef\xd4\xf6\xf8\xf6\x26\xd7\x70\x64\x74\x20\xcd\x9c\x5b\x56\x1a\x86\x34\x70\x2d\xd2\x4b\xa9\x7b\xb6\x34\xa5\xb8\xc8\x6a\x63\x07\x8a\x67\xc0\x81\x64\x95\x98\x88\x75\x10\xaa\x34\x43\x4e\x85\x0c\x0d\x49\xee\xa2\x9e\x4a\x77\x04\xda\x31\xd7\x4c\x4d\x90\xa6\x73\xad\xeb\x27\x4e\x2f\xc1\xc8\x56\xff\x32\x77\x2d\xf2\x0a\x6d\x95\x29\xfa\xad\x3e\x25\x60\x42\xa3\x28\xfb\xd2\x6d\x54\xa2\x13\x4e\x55\x35\x92\xc1\xde\x07\x37\x9c\xa2\x94\x28\x09\x69\x40\x10\x25\x11\xdb\xab\xd5\x01\xfd\x5c\xef\x50\x37\x97\xb2\x8f\x7d\x93\x34\x45\xec\x17\x2a\xc6\xef\x72\x77\x11\x20\xc5\x42\xbe\x2a\xd7\xbb\x4a\x0a\x65\x38\xca\x3f\x5a\x57\x2d\x9a\xbc\x16\x5d\x27\x9f\x1f\x57\x57\xae\x05\xc3\x12\x8a\x26\x5e\x4c\xfa\x39\x76\x45\x7a\x94\x86\xfa\xb1\x34\xcb\x61\xdd\x59\xbf\x0d\xb3\xfa\x3d\x36\xa0\xe5\x5e\x9a\xa8\x6a\x99\x3c\xec\xe6\xb4\x0d\xdd\x43\xb9\xa3\x34\xf7\x4a\x51\xda\x32\xc4\x4b\x7e\x59\xc3\x58\x9a\xc9\x6e\x02\xd4\x75\xe7\xf2\x38\xf7\x8f\xf4\x5e\xf2\x2c\x2a\xb0\xfc\xf1\x60\xd0\xa5\x90\x85\x8d\xee\x1e\xcc\x7e\x6c\xa1\xf0\x03\x61\x13\xd2\xda\x9a\x4b\x2d\x37\xa1\x50\x44\xc1\x04\x51\xa5\xe4\x8b\xe3\xc4\x0d\x30\xc9\x5e\x5f\x39\x16\xf6\x8e\x02\xe8\xc7\x51\xd5\x18\xfe\x25\x7e\x37\x5c\x76\x59\x3f\x36\x5d\x4a\x7e\x6c\x52\xe0\x69\xe9\x74\x11\x1d\xf4\x53\x78\xaf\x9c\xc9\x45\xd9\x94\xad\xf0\x00\xdb\x44\x99\x9e\x14\x75\x66\x4b\xe0\x52\xe4\x8d\x5a\x26\x4f\xda\x68\x34\xd5\x19\x90\x90\xe0\x97\xca\x0c\x59\xd0\xb2\xf4\x06\x52\xae\x9e\x7b\x0d\x10\x08\x66\x7f\x12\x81\x66\xce\x6c\xff\x9f\x4f\x13\xb5\x8d\x52\xef\xb6\xe4\x3f\xe1\xff\xd0\x4f\x16\x61\xd2\xb0\xc6\x31\x86\x28\x4c\xa1\x68\x3d\x84\x52\xfc\x02\x0e\x5a\x4c\x5b\x5f\xa0\x70\x46\xfe\xb8\x5d\x54\x82\x5b\x59\x8d\xe4\xaf\xbc\x01\xf1\x12\x0e\x17\xfe\xa9\x44\x24\x18\x41\x2d\x45\xea\x21\x4d\xfe\xb8\x47\x88\x08\x1f\x78\x55\x62\xcf\xf4\x5e\x59\x6a\x30\x79\x54\xce\x63\x1f\x4e\xde\xf7\x43\xd5\x97\xfe\x63\x1d\x9f\x26\x05\x95\xfc\x1f\xf5\x52\x62\xa7\x26\x3d\x8d\x1a\x59\xf2\x47\xa5\xdf\xf0\x01\x03\x8b\x26\xdf\x74\x5f\x50\xc9\x62\x84\xdf\x54\xee\x72\x2a\x5b\xde\xb9\x13\xf4\x89\x6f\x9e\x9d\x04\x91\xc3\xda\x65\x3e\x84\x03\x41\x2e\xcd\x65\x1d\x56\x25\x44\x4c\xe4\x40\xab\xeb\xbb\xac\x32\xc0\x3e\xdc\x9e\x97\x3b\xad\xe0\x00\xc7\xc7\x6b\x4b\x45\x6b\x23\x56\x7a\xe0\x56\x8b\x64\x74\x94\x9f\x9d\xbc\x61\xe4\x46\x50\x58\x06\xf4\xb6\x90\x6c\xb1\xc3\x51\x9c\x65\xe7\x68\xd9\x00\x95\x2d\x01\x3c\xe0\x6f\x40\xb7\xa7\x88\x1b\x71\x78\x96\x28\xff\x07\xc3\x57\x9e\x2c\xfa\x54\x47\xd1\x0f\x2c\x5d\x6b\xa5\x30\x6d\xc5\xf5\x5d\xf8\x5c\x91\x50\xcb\xad\x1e\x1c\x1f\x1e\xf9\xfb\x65\xbe\x04\xd5\x5b\xfe\x95\x6f\x89\x93\x65\xc8\x53\x3a\xb0\xae\x80\x02\x2a\xd6\x55\x56\xbe\x07\x10\xeb\x17\x43\x22\x49\x02\xed\x02\x4c\xa2\x02\x45\x75\x0d\x95\x97\x36\x96\xc7\xcd\xb3\x1f\x52\x57\x81\xf2\xcb\xff\x02\xf0\x65\xb4\xea\x48\x71\x98\x23\x6f\x1c\xb9\x1c\xd9\xab\x66\x2b\xd4\x71\x36\x04\xe5\xd2\xcf\x7f\x52\x8a\xd1\x46\x34\xf0\x05\xc8\x50\x00\xe1\x31\xd6\xb2\xe8\xfc\x7a\xfa\x79\x88\x11\xc2\xa1\x98\xf3\x61\xef\xb3\x22\xfa\x87\xe7\xea\xfb\xf7\x79\x84\x67\x9b\x01\x7c\x8b\x39\x04\x64\xe4\xc4\x6e\x40\xdf\x48\x3a\x95\x2c\x71\x58\xef\x97\xed\x3e\x84\x07\x02\xf4\x35\xca\xbe\x70\xc4\x1d\x1b\x5f\x39\x65\x92\x1c\xe9\x40\x8e\x83\x24\x64\x90\x1a\x7a\x49\x6f\x06\x59\x7a\xbb\xb6\xd9\xa5\x5f\xb3\x4f\xba\x8c\x0d\x4f\x3a\x13\xda\x2e\xb7\x74\x69\x36\x9d\x63\xbd\x4f\xee\xc8\xd4\x90\x43\xd5\xd2\x11\xd4\xf1\x23\xfd\xe3\xd5\x5f\xbf\xd2\x96\xb2\x5a\x2a\x22\x5e\xa8\x7d\x43\x9a\xb3\xc2\xf0\xc1\x5f\x0b\xc4\x26\x9b\xb4\x53\xe0\x0e\xee\x5b\x9e\x19\x5c\x0d\x57\x74\x39\x39\xc0\x82\x9e\xaa\x57\x29\xb5\x6d\x12\xec\xaa\xcd\x9e\x49\x3f\x61\xb3\xaa\xb9\xb0\x8e\xb1\x77\x8c\xf5\xb4\x81\xae\x73\x63\x75\xa6\x78\xec\x15\xc9\xc7\x34\x34\xb1\x0f\x09\x63\x4b\xca\xd8\x48\x38\x66\xab\xf3\xbd\x33\x75\x13\x2d\xc9\xf6\xdf\x4f\x8e\xc6\xdf\x5d\xab\x29\x5e\xc8\xed\xf6\x43\xf1\x1b\xb3\x2f\x37\x12\x91\xeb\xc2\xf7\x0f\xba\x33\xbf\xd9\x85\xea\x33\x10\x14\xa1\x51\x87\xa2\x32\x4d\xb2\xda\x6d\x3c\x25\x10\xf3\xbd\xa9\x17\xc3\xf3\xec\xbf\x51\xb3\xd5\xf5\x95\x93\x09\x7b\xed\x74\x5e\xc4\xa7\xa9\x9c\xb6\xd7\xda\x18\x9f\xdb\xab\x33\x3a\x95\x92\xb1\x87\x71\xd6\xfe\x57\x17\x74\x44\xf6\xf2\x65\xfc\x77\x2f\x6f\x4a\xc4\x78\x25\xbb\xff\x78\xa0\x7b\xd9\xfc\xed\x46\xfb\xa4\x00\xe9\x5e\x34\x7e\x71\x0d\x99\x4a\x30\xb3\xa7\xba\x17\x4f\x70\x00\x42\xda\xf8\x7b\x27\x62\xb7\xd2\x00\x83\xda\x3b\x06\x4c\xfa\x91\xf9\x16\x51\xc4\x90\xe7\x80\xbf\x65\xdd\x6a\xcd\x90\xa6\x86\x76\x75\x34\xf6\xfc\xa7\x8b\xca\x88\x38\xf0\x5f\x1c\x3b\x6a\x41\xa2\x2b\xfb\x8f\x06\xba\xa7\x97\xcf\x4c\xed\xfc\x22\x91\x01\xff\xd1\x3f\x76\xa6\xe3\x40\x78\x66\xe3\x5e\xcc\x6a\xb0\x92\x52\x37\x53\x68\x02\x5b\xe5\x3f\xa6\xd0\xa4\x89\x0a\xc2\xa0\xe2\x19\x86\x64\x5d\x0d\xa9\x9a\x4b\xd4\x4f\xc8\xd4\x50\xc8\xc1\xde\x9e\x77\x4c\xb3\x41\xb4\x46\xbb\x93\x8c\x0e\x77\x9d\x3e\x1a\xb3\x05\xcc\x57\xed\x84\x63\x92\x16\xc7\xed\xcc\x2b\x6a\xe1\x8c\x74\xbf\xd8\x90\x90\xa9\x0e\xf1\x86\x1c\x4c\x8a\xcb\x30\x85\x7b\xab\xed\x95\xb8\x02\xd2\x42\xfe\x1e\x6e\x54\x98\x85\xbb\xf8\xc9\x32\xb4\x36\xaa\xbc\xe0\x91\x7c\x21\xe7\x86\x2d\xb4\x10\x00\x42\xab\x9d\x52\x38\xfa\xb7\x4c\x4e\x37\xbc\x69\xa2\x4a\xb9\xe7\xca\x5f\x0d\xf4\xa4\x48\x4c\xdd\xaf\xf8\x6f\x24\xe5\x1a\xec\x57\xbe\xd3\x0e\x62\x43\x1e\x6a\x12\xd2\x39\x66\x6e\x91\x67\x26\xa1\x39\x92\x72\x45\x9d\xc0\x29\x8a\xcb\x9a\x12\xde\x06\x62\x26\x8d\x6f\x95\xae\xe5\x5b\xf9\xa4\x59\xd2\x14\x98\x69\xf2\x6d\x4a\xd4\xaa\x6e\x28\x77\x12\xa8\x12\xde\xca\xa6\x35\x9a\xec\x34\x30\xb4\xd0\xeb\x89\x2c\x83\xad\xc0\x90\xfd\x4f\xdf\x83\x2d\x25\xef\xbb\x6d\x59\xbd\xaa\x2d\x5f\xa1\x37\x13\x52\x8c\x86\xa8\x27\x64\xdd\x18\x65\xb9\x00\xfe\x4b\xa7\xb3\x65\x0c\x12\x78\xb7\xb2\xab\x8f\x52\xd0\xa6\x9d\xec\xb8\x6d\x9a\x33\xdf\xa4\xc6\xb0\x41\x5c\x8b\x2b\x56\xc6\xb1\xb6\xb0\xe2\x32\xf0\xe0\x95\x94\xd0\x70\xd8\xf2\x13\x55\x1b\x77\x7c\x86\xc2\x4c\x8e\x8e\xf5\x96\xbb\x46\x8e\x2a\x4b\x7b\xe3\x18\x8a\xdf\xa2\xa7\xbd\xe5\x98\x3e\xdf\xfa\xfe\x4a\xc6\xd8\x6c\xc4\xc3\x29\xdf\x6d\x3c\x22\xe2\xb4\x45\xb6\x2c\xf4\x6f\xac\xca\x3c\x4e\xe1\xa2\x09\x9a\x6d\x7c\xba\xb8\x82\xf4\x69\x9e\x5d\x29\x64\x7c\x32\x8b\x79\x1b\x11\xb8\xf1\x1f\x3f\x7a\x5a\xf5\x46\xd8\x34\x29\xe6\x70\x5c\x42\xfc\xc6\x7a\x09\x64\x94\x41\xcb\xa6\x66\x01\x77\xb3\x8a\xb5\xe9\xb1\xc6\xd6\x3f\x0d\x9f\x91\x86\x9e\xdb\x98\xee\x95\x1f\xce\x88\x77\xca\x0f\x90\xac\x47\x33\x52\xb6\xe4\x73\xdd\xc3\x40\xc9\x15\x8d\x89\x0c\xf0\xd1\xdb\xb0\xa0\xeb\x2b\x19\x9e\x25\xe1\x72\x5d\x1a\x34\x39\x4c\xda\xd4\xba\x10\xa1\xd2\x82\x89\x65\xeb\xf0\xbf\xba\xee\xcd\x15\x93\xa6\x1b\x4c\xb6\x46\x49\xd6\xc4\x8b\x05\x3f\xc1\x96\xf6\x90\xb7\xb1\xce\xd0\x57\x50\xfb\xb8\xe1\x56\x0a\xe1\x9a\x7f\x8f\xd6\x9a\xae\x09\xea\xb7\x3a\x40\x0d\xf1\x1c\x10\xf0\x84\xe8\x5d\x08\xb1\x9b\x8b\x97\x64\x3d\x75\xa9\xde\x64\x0e\x55\xa5\x6f\x23\x35\x9b\x36\xf0\x43\x87\x6d\x4a\xc8\xdf\x24\xf2\xb6\xb7\xc4\xfe\xbf\xd5\x34\x76\x76\x65\x03\xba\xec\xcd\x19\x80\xe5\xb3\xeb\xe0\x3c\x7b\x30\xde\xbd\xba\x75\xa1\x9b\xee\xd6\x5a\x25\xa6\x63\x77\x9a\xdd\xc5\x2d\xf5\x1f\xf8\x37\xce\x8d\x69\x2f\x1b\x06\x54\xbc\x80\xdf\x97\x9d\x9c\xd2\xea\xc8\x67\xfa\x79\x09\x93\x8e\x3c\x7a\x04\x8b\xb0\x54\xd6\xcc\x88\xb7\x3f\x93\x50\xa8\xee\x20\x9d\x99\xeb\x68\x63\xb8\x7e\x86\x90\x25\xb9\x5f\x01\xd8\xf5\x47\xd9\x68\x9e\xb6\xde\x87\xff\xf8\xf5\x5e\xc2\x83\x1e\x32\x36\x6f\x7f\xed\x56\xab\xd4\x3b\xcb\x00\x02\xd7\xa3\xe4\x83\xd6\x6a\x4d\x3b\x14\x61\xaf\xff\xa4\x64\x23\x25\x9c\xea\xc2\xe3\x8e\x34\x85\x04\x5e\xb8\x54\x40\xa0\x5a\xc3\xbd\x77\x89\xd7\x6c\x4a\x0b\x5e\xad\x33\x92\x39\x52\x58\x6b\x59\xf8\xcf\xb9\xd1\xd1\xdf\x90\xf6\x7f\x5c\xa4\x79\x20\x32\xbc\x4a\xca\xc6\x86\xd3\x03\x4f\xdd\x7b\x8c\x48\xba\xf2\x12\xcc\x7e\x29\xcf\x5c\xaa\x4d\x56\x8d\xc8\xdd\xf1\x99\xff\xda\x25\x41\xb3\x4f\x0a\x45\x5a\x77\xf8\x56\x2e\xad\x55\x2a\xb7\x5f\x20\xa4\x51\xff\xa3\xf4\x8c\x5e\x03\x6b\x1c\x7d\x08\x88\x92\xff\xda\x79\x73\xad\x12\x49\xfc\x47\x99\x22\x4c\x6c\x58\xc2\xa9\x2b\x78\xa2\x5e\x4a\x52\x25\x3f\xa4\x80\x92\xb3\xd7\x10\x6b\x9e\xa8\xd4\x92\x9d\xdb\x40\x94\x79\x11\x91\xe5\x06\x79\x19\x7e\x2b\x86\x46\xfd\x5a\xeb\x5b\xac\x92\x8a\x79\x15\x16\x50\x68\x4c\x01\xbd\x94\xaa\x0c\x9d\x89\x56\xf6\x1d\x56\xcf\x47\x67\xea\xd4\x9a\x8e\x42\x89\x55\x43\x1a\x7b\xc1\x61\xb3\x2b\x15\x21\x1d\xed\xc5\x20\x48\x77\xde\x74\x59\x18\x75\x6f\x81\x95\xba\x0a\xe8\x66\xca\x8e\xbd\x26\xda\x79\xbc\xc8\x1a\xc7\x00\x53\x8d\x0e\x24\x61\x78\x8b\xed\x42\x78\x63\x53\x88\xce\xd0\xa2\x13\x35\xe4\xad\xdd\x1e\x48\x61\x25\xf2\x2e\x9b\xc3\x89\x07\x1f\xab\x74\x69\xc6\x78\x2b\x91\x5b\x26\xd1\x1b\x4f\x09\xe1\x9e\x83\x57\xa8\xcb\x3b\x9d\xec\x6a\x2e\x37\x9b\xcd\xe5\x0e\x69\xb8\xe5\x3e\xe7\xbd\x08\x51\x1b\xe3\x6e\x97\xd2\x93\x97\x3b\x04\x3d\xac\x6f\x14\xd2\x19\xf7\xb2\xfe\x24\x69\x38\x19\xba\xdc\x63\xcf\x65\x87\xe6\x8c\x74\x61\xee\x18\x24\x2f\x8d\x51\x10\x2b\x45\x67\x5f\x5a\x6c\x54\x42\x66\xc4\x23\x65\x0e\x42\x48\xd6\x65\x64\xbc\x4c\xd7\x57\x07\x22\xa1\x67\x91\xe2\xa0\x95\xa1\x2e\x53\xbf\xf7\xc0\x92\xb2\x23\x95\x13\xc1\x0b\xd2\x42\x98\xd1\xba\xd4\x48\x8f\x36\xe4\xfd\x9d\xa5\x62\xba\x83\x80\xea\x31\x27\xa5\x6d\xea\xe1\x1f\x28\x4a\xee\xe9\x73\xb4\x4b\x85\x90\x8c\x22\x07\x0b\x94\x07\x43\x44\x46\xb9\x39\x4b\x9d\xd7\x18\x54\x2d\x95\x44\x9f\xc5\x06\x04\x07\xcb\x68\xca\x0d\x72\xc2\xdf\x65\x65\xd6\x8e\x7a\x54\x62\x81\x36\x61\xcb\x9e\x3e\xbe\xec\x59\x16\x71\xcb\x4a\x2f\xf2\x05\xbe\x9b\x7a\x7a\x6b\x58\x30\x59\x65\xf1\x0e\xf5\x1d\xe4\x40\xfb\x53\xf3\x89\x40\xdf\x05\x55\x19\xc5\x6f\x4a\x8b\x79\x69\x83\x6e\xa3\xac\xbe\xa8\x2d\x8e\x8b\xa7\xd1\x2d\xe5\x50\x3d\x09\x62\x9f\xba\x53\x06\x8b\x34\x69\xd6\x10\xa7\x09\xc9\x7c\xab\xd9\xa8\xe1\xc3\xd9\xef\x85\x7d\x36\x1b\x4b\x85\xa4\x8e\xa4\xaf\x16\x17\xe8\xf0\xca\x7c\xc9\xf1\xcb\xa1\x12\xed\x33\xe9\x50\x9c\x91\x16\x4e\x8e\xd7\x44\xf7\x20\x2b\x95\x6a\xc9\x99\x9c\x24\x03\x13\x35\x69\xd4\x00\x2c\x99\x4a\x98\x56\xb6\x41\x22\x35\xef\xf4\xbc\xe9\x46\xb3\xa4\xfb\xb8\x59\x32\xfa\xb0\x24\xcc\x2e\xa9\xe7\xbf\xa4\xfe\x62\xa0\x0d\x3f\x09\x8e\x2a\xe1\x36\x60\xea\xca\x20\x65\xc7\xc1\x2e\x49\x75\x88\xd0\x34\x29\xca\x6c\x87\x56\xe9\x9e\x80\xe8\xfb\x26\x48\x0f\x6f\xa6\x97\x14\x52\x3c\xc9\x35\x78\x04\x2b\x0b\xb9\x57\xfd\xdd\x5d\x31\xee\xef\x5e\x43\x5b\xe6\x2b\xf7\xee\xbf\x10\xe8\xfe\xab\xf6\xd9\xb2\xf2\x30\xe8\xed\xdc\x9f\x35\xd0\x3e\x68\xfd\xcb\x6f\x29\xd8\xa0\x83\x29\xe0\x2f\xf2\x5f\x6e\x2e\xe8\xf0\x17\xea\xeb\x7f\xa9\xc9\x19\xca\x5a\x6d\x3a\xfa\xa1\xf9\xe6\x8c\xfa\x5f\xf7\x4e\xfb\x4b\x9b\x84\x65\x5c\x08\xfa\xcf\x2a\x20\xfc\x20\x8c\xbd\xf1\xef\x72\x85\xba\x0c\x66\xec\x38\xc7\x50\xaa\x68\x85\xe8\xac\x9c\x23\xee\xbe\xfd\xc0\xe6\x17\x58\x42\x6a\xa7\x6c\xcd\x7f\x4d\xd9\xd8\xf5\x2b\xf6\x9c\x43\xee\xbe\xcc\x5e\xd3\x97\xa7\xe7\x22\x15\x3d\xab\xf9\xfe\x84\x24\x8c\x7d\x30\x5e\xae\x57\xe8\xad\x60\x3e\x26\x74\x62\x9e\xae\xa4\x71\x67\x8f\x93\xa0\x94\x4c\xc8\x59\xbc\xe5\x9a\x63\x86\x7b\xae\x2f\xca\x70\x60\xfa\xbc\x53\xdb\x6c\x09\xb5\xf5\x4e\x28\x55\xb4\xd9\xd5\xc9\xb8\x2e\x3e\x8b\xb9\x9e\x21\x09\xa3\xd4\x3b\x64\xfe\x94\x45\x80\xf2\x23\x95\x59\xca\x73\xdd\x3f\xf7\x76\x20\x81\x87\x4b\xf9\xa3\x8b\x92\xbc\xec\x8c\xac\xa5\xa6\x17\x61\xae\xeb\xff\x27\x30\x53\xff\x11\x98\x41\x0d\x2c\x06\x0d\x96\x24\xf9\x4d\x48\x20\xcd\x58\xb8\x6c\x31\x54\x3b\xd7\x45\x17\x13\x1a\x16\x73\xb5\x0f\xd4\x75\x47\xea\xd4\x65\xa8\x0c\x3f\xe3\xa2\x26\x89\x25\xcc\xf6\x62\xd9\xaf\x0c\xe5\x1d\xcc\xab\x84\x39\xd7\x8c\xd9\x14\xde\x3e\xa6\xfb\xcf\x7b\xa2\xd6\x8c\x02\x6a\xb3\x57\x32\x44\xbb\x77\x9d\x3c\xe3\xd0\x16\x16\x16\xfe\x53\x51\x93\xf0\x78\x25\xb2\xeb\x5c\xc8\x5a\xc1\x7e\x1b\xe0\x5f\xec\xf9\x41\xc2\xc2\x3b\x58\xb3\x67\xb4\x6a\x6f\x0c\x42\x9e\x43\x50\x20\x6d\xe0\xee\x57\x02\x45\xdd\x90\xb7\x41\xfa\x27\xbd\x18\xfc\x9e\x41\x04\xb5\x4a\xee\x26\x54\x6b\x9a\x0d\x05\xd3\x7f\x21\x74\xe3\xbf\x1b\xdd\x1d\x8d\x57\x67\x5a\x85\x9d\x21\x71\x23\x2f\x33\x88\xf7\xb3\xf8\x47\xe8\xe6\x52\x0e\x9b\x0b\xe0\x64\x81\x22\x5e\x37\x30\x1f\x44\x8e\x4c\x64\x20\x48\xf3\x12\xea\xb8\xe5\x8a\x96\xc4\xb0\xae\xba\xec\x3a\x1c\x34\x65\x63\xbb\x3d\x49\xf6\x00\xa2\xce\x67\xd5\x61\xca\xa0\xcb\xa6\x8d\x8a\x95\x12\x94\xc9\x0f\xfd\xc3\x6a\xd2\x95\x19\x9a\x73\x9e\x7e\xa9\x70\xf6\x5a\x8d\x15\xe1\x5b\xc8\xe8\xe4\xf0\x87\xb6\x85\xac\x48\x27\x54\x75\xd8\x9f\x81\x88\xce\x2e\xb1\x43\x7b\x23\xe2\x11\xb9\x26\x9f\x64\x71\xd8\xa5\x44\x6b\xa2\xbc\x68\xc0\x78\x6e\xa9\x75\x39\x1c\x49\x43\xb9\x2b\x64\x4b\x21\x9b\x83\x97\xfc\x4d\x14\x02\x39\x8b\xce\xb1\x4b\xa4\x7e\x46\x87\x98\x97\xbb\x85\x68\x12\x26\x77\xd4\x46\xd9\x80\x21\x04\xa9\xd0\x23\x3b\xa5\xdb\xb3\x4a\xd6\x10\x48\xda\x3f\x25\x1e\x9a\xf5\xd7\x78\xf6\x12\x2a\x3f\x22\xa6\x1a\x58\xc3\xa3\x75\xf6\x71\x8c\xcb\x7f\xdc\x5f\xff\xd2\x9e\x51\x31\x3d\xc3\x00\xd8\x80\xb2\xc2\x9f\x77\x93\xa0\x92\x21\xaf\x88\x9f\x37\xf8\xb6\x14\xfa\xb8\x83\xa6\x6c\x88\x63\xf7\x27\x66\x79\xaa\x34\x64\xee\x4c\x56\x36\x80\x94\xb5\x3d\x1e\x2b\x15\x9d\x29\x15\xf2\xcb\xa1\x9b\x93\x6d\xa0\xe2\xb5\xe2\xd3\x13\x2c\xbc\x99\xb7\x3a\x97\xab\x9c\xc3\x47\x35\x14\x48\xe5\x50\x90\x06\x48\xd5\xe7\x93\x69\xd6\x56\x4c\x5d\x37\x47\xd7\xd3\xca\x97\x13\x52\xcf\xe6\x99\xe2\x44\xa7\x9c\xe7\x00\x67\x51\x7a\x9e\x98\x0e\x7d\xf2\x7c\x25\xd2\xf6\x01\x79\xb6\xf2\x78\x48\x3f\x07\x5a\x3b\xba\x04\x70\xa6\xb8\x12\x2e\x7d\x54\x76\x69\xb1\xc6\xf3\xbf\xb3\x14\x7e\x72\x5a\x19\x27\x74\xfd\x1d\xde\x6e\xa4\x4a\x7d\x05\x22\x8d\x0d\x38\x44\x6d\x42\x70\x06\x72\x82\x14\xe3\x69\xd2\xea\xa9\x2d\xc4\x78\xea\xc4\x19\x1b\x20\x74\xe7\x79\xe3\xe0\x8f\xb1\x71\x22\xe2\x59\xad\xfe\x65\xb9\x4a\x38\x1a\x30\xd1\x14\x1a\x1a\x3a\x6f\xd7\x83\x73\x6d\x9d\x81\x56\x00\x8e\x55\xb6\xd8\x67\xee\xe7\x9c\xb9\x3d\x18\xbd\x7c\x28\x15\x02\x7d\xd2\xd5\xe1\xe4\xc8\x13\x74\x86\x99\xc7\x62\x95\xf4\x5c\xef\xcd\x69\x74\x48\x78\x57\x27\xd0\x20\xf7\x5a\xbb\xb2\xde\x13\x3a\x97\x81\x38\xd6\x7a\xfe\xe5\x35\xc1\x88\xfc\x59\x5e\x6c\xd8\x9e\x85\x5a\xeb\x56\x32\x9e\x60\xe0\x99\xa5\x85\x54\x20\x24\xaf\x20\xc1\xb3\xac\x47\xba\x98\xfa\x01\x6d\x9e\x12\xfb\x6b\xd6\xc0\x00\xe3\xe7\x90\x79\xbf\x2f\x81\xd0\x20\x2a\xea\xa1\xe1\x70\xf1\x4e\xbb\x86\xdc\x25\xfd\x1f\xfb\x5c\x35\xaa\x85\xdb\xad\x6e\x4f\xbe\xa9\x6e\x82\xf9\x8c\x12\x80\xaf\x20\x45\x1b\x3c\x23\x91\x97\x87\x26\x93\x9b\x34\x8d\x3d\x9e\xee\x44\xc0\xcd\xba\xda\x9c\x4b\xfd\xf8\x65\x22\x6d\x6a\x27\x58\x63\x33\xf5\x30\x9f\x79\x9a\xfa\xf6\xa9\x49\x5d\x48\x9f\x8d\x0d\x3f\x43\xee\x28\x7d\xba\xde\x52\xba\xf9\xce\xa5\x9b\x29\x3c\x4f\xe7\xc2\x39\x08\x0a\xcb\x13\xb3\x4d\xdc\xcf\x7a\xc0\xac\x01\x92\xb8\x07\xd0\x06\xea\xca\x43\x76\xc6\x87\xf4\xb3\x52\x28\x06\xed\xac\xb5\x40\x56\x0e\xe5\x1f\x48\x1f\x9f\x44\x03\x8f\xb1\xd7\x3b\x04\x85\xfa\x47\x60\xdf\x00\x8d\x48\x9e\x98\x37\xe2\xd1\x56\x09\x34\x3f\xe1\x44\xa8\x73\xae\x6b\x4c\x52\x40\x74\x28\x44\xb3\x0c\x6e\x01\x16\x96\x39\x31\xf0\xf3\x4c\xf4\xe2\x42\x29\x76\x1f\x14\x43\xa2\x64\x88\xe9\x89\x24\x1c\x6e\x95\xe1\xc5\xc5\x7b\x35\xd9\x90\x1b\x57\xfc\xb8\xe3\x5d\x7d\xdc\xed\x5e\xe8\xe5\xfa\xb8\xdd\xb8\xb2\x33\x2c\x01\xce\xdf\x64\xed\xa3\x7d\x1a\x83\xae\x8f\x56\x39\x58\x7c\xf4\x5b\xe7\xfa\x18\x52\x3c\xf2\x9c\x8b\x99\x6a\xf0\x58\x5a\xfb\x16\x13\x77\xb2\x8e\x17\xdb\x5b\x87\x52\x44\xca\xc8\xed\xed\xa7\xca\x7d\xb5\x7f\xbc\x1c\x51\x3d\x5a\x96\x52\x92\x12\xf5\x3d\x51\xd3\xfb\xb4\xae\x93\x54\x76\x21\x0f\x5a\x3e\x64\x27\xff\x68\xdd\x8c\xf9\x51\x6f\xd9\x8d\x3f\xaa\x44\x42\x1f\x10\x0b\xbf\xb8\x4a\x2a\x2b\x0f\x18\x8b\xf8\x74\x29\x50\x11\x8f\xfd\x21\x05\x9f\x07\x33\x28\x1f\x21\x1f\xf1\x50\x00\xfa\xb1\x4a\xcd\x0f\x92\x4b\x3c\x0e\x34\x83\xb5\xf5\x8a\xf0\x07\xaf\x6f\x4d\x5b\xec\x99\xc4\x80\x7b\xb8\x3d\x1c\xab\xf3\x07\xd4\x8e\xf9\xde\x3e\xca\x4f\x15\xeb\xe1\x36\xb0\x6f\xa1\xdf\x5a\xf0\x4f\x08\x35\x27\xf7\x08\x62\x07\x3a\xf2\xb2\x36\x7a\xe0\xcd\xf1\x53\xa6\x17\x15\xaa\xec\xab\x19\xd5\xed\x7d\xa0\x63\xbb\x87\xca\x12\x3b\x2e\x8f\x14\x8d\xa7\x21\xee\xd8\x38\xf7\xf3\xf0\x20\x6a\x26\xda\xa3\x87\x6c\x58\xc3\xda\x07\x1a\x70\xaf\xcd\x1f\xf1\xb5\x3e\x52\xf8\x4a\x50\x6a\x89\xca\x4d\xc3\x2d\x99\xa6\x61\xf0\x50\x41\xfe\xac\x65\xf4\x8b\xc4\xb0\xc9\xbb\x3d\xc8\x93\x58\x29\xa5\x84\xe9\xef\xd1\x1e\x1d\x97\xc6\xf4\xc7\xe4\xcc\xfc\x7f\xb7\xff\x9e\xfc\x4f\x94\x35\xef\x55\x19\xf1\x36\xb8\xa6\x3c\xd2\xfe\x8c\xf4\x41\xaf\x84\x24\x9a\xa4\x7c\xce\x10\x74\xce\xc1\xaf\xce\x70\x01\xa0\x38\x13\x2a\xa8\xae\xb5\xc4\xe7\x6c\x20\x04\x66\xf3\xda\xc5\x93\x30\xf6\x1a\x18\x2f\x89\x80\x41\x2e\xf4\x04\xf3\xf8\x3b\x32\xfd\x95\x0e\x65\x83\x6a\x9e\xef\x97\x45\x85\x88\x91\x4b\x82\x02\x0f\xe1\xa8\xab\xf4\xeb\xe9\x5b\x6e\xaa\x29\x2d\xb3\x92\x8c\x27\xbb\xef\xd2\x3b\xf2\x6b\x9a\xee\x83\x92\x46\x37\x1b\x63\xc8\x28\xcd\x12\x3f\xda\x11\x61\xe7\x46\x7b\xd4\x48\x93\x67\xe0\xeb\x23\x9c\xee\xb8\x8c\xe9\xb6\x81\xa5\x04\x99\xe4\x09\x03\x90\x4f\xe9\xab\x4d\x8a\xc5\x4f\xf7\x10\xc2\x4b\xf1\xfb\x20\xaa\x44\x25\x1d\xeb\xe7\x80\xe4\xed\x97\x13\x92\x03\x93\x58\xd3\x53\xcb\xff\xa3\x0e\x4d\xd3\xc7\x02\xd0\xf7\xcc\x92\x5c\x9d\x1a\x4d\x49\x1c\x5b\x0f\xc2\x2f\xa4\x4a\x14\x7d\xaa\xa7\x02\x53\x86\xb4\xa6\x69\x64\x31\xd5\x26\xa5\x26\x1f\x74\x4d\x75\xcb\x21\xcb\xb4\xf6\x92\x35\x8b\xa1\xc1\x5f\x53\x00\xed\x34\x34\x9a\x29\x01\x25\x45\x6f\x27\x04\x92\x7a\xdc\x64\xb2\x1e\x1e\x85\x76\x4a\x3d\x27\xf2\x4a\xd1\x60\xe9\xed\x9a\x22\xc1\xd6\x40\x50\x2c\x09\x5d\x62\xc7\x1d\x7f\xa5\x70\x6a\x0b\x89\x29\xed\x13\xcc\xb6\xb8\x37\x99\x03\x0e\xa1\x55\x10\x48\xff\x4d\x9b\x04\xf7\x11\x3d\x67\x20\x16\x06\xb9\xfa\xe9\xf9\x15\x52\x46\xaf\xd0\x61\x31\x48\xf6\xca\x94\x7f\x89\x34\x93\xcf\xb5\x65\xb6\xef\x93\x93\xed\x36\x21\xed\x2f\x0f\x79\x57\x66\x93\xc9\xe9\x84\xcc\x09\xae\xd4\x68\xda\x00\xa2\xdf\x45\x82\x4d\x11\x92\x31\x74\xb9\x34\x0f\xe5\x9a\xf6\x50\xa9\xca\xdb\x39\x4b\x0b\x49\x12\x00\x10\x79\x0a\x51\x27\xf7\xb0\xd5\x76\x12\xa4\x5a\xbf\x3a\xde\xca\xec\x33\x74\xae\xd9\xda\x06\x75\xdb\xca\xce\x0e\x84\xa6\xd3\x2e\xe5\x2a\x43\x63\xa0\xb9\x7e\x78\x7d\x8b\x0e\x5f\x62\x24\x34\x85\x8a\xd4\x2c\x09\x69\x57\x7b\xd2\xed\x7d\x84\x5e\xfa\x24\x3b\x59\x2b\xfd\xa1\xe5\x31\x02\x0e\x06\x43\xe6\x0a\x84\x07\xfe\x12\x4f\x73\xba\x28\xac\xc4\x0f\x13\x39\x2b\x8c\x1b\x4c\xd1\x27\xa4\x32\x4e\xa4\xac\x4d\x50\xaf\x14\xcf\x74\x42\xcb\xa5\x2f\x9c\xa6\xd1\x56\x78\x57\x93\x5b\xc6\x20\xc9\x5e\x3c\x69\x2b\x1b\x9a\x98\x1f\x04\xc4\x07\x93\x46\xd1\x95\xc7\xcf\xa1\x00\xf2\x78\x87\x81\xed\x78\x37\x8a\x3b\x49\x6c\x6a\x24\x3f\xbc\xcf\x01\xf5\x99\xc6\xf1\x9e\xa2\x72\x1f\x25\x98\x36\xb6\x8f\x3e\x4a\x43\x3d\x4d\x16\x92\x4d\x9b\x34\x99\xec\x28\xab\xd4\x9b\xac\xb1\x9c\x25\x07\x37\xa2\xbb\xe0\xa5\x8d\x1a\x35\x79\x36\x36\x58\x2e\x0b\x8c\x02\x29\x14\x9f\x52\xc8\x1d\xbd\xa5\x93\xf4\x9e\xd8\xfa\x8c\xf5\x8e\x60\xe1\x58\xaf\x7f\x64\x99\x10\x61\xe8\xd8\x87\x37\x0e\xc3\x13\xd2\x90\xac\x9b\x0d\x1d\xb5\x0b\x32\x85\x46\x11\x90\x34\x91\xda\x44\x8d\x9f\xda\x49\x5b\x50\x60\x8a\xff\xee\x98\xde\x21\xca\x21\xb1\xb4\x91\xa9\x30\x86\x66\x31\x45\x97\xfc\x1b\x32\x38\x89\xf9\x69\x10\xf2\x46\xd2\x50\x42\x36\xdd\x75\x57\x09\x50\xad\x49\x09\x86\xc8\xe6\x87\x90\x1a\xd5\xaa\x6a\x30\x9b\x80\xa2\x5f\x39\x56\x37\x35\x10\x62\x61\x6f\x19\xb2\x90\xfd\xba\xad\x97\x40\x75\x23\xc8\x22\x7c\x04\x28\xae\xb5\x6a\x8a\xdf\xd5\x97\x74\x63\xd6\x2c\xf9\x20\xc8\x30\x85\x5b\xc2\x88\x09\x9e\x9d\x20\x3e\x31\xcc\x1f\x3f\x78\xc0\x42\xa7\xc4\xd1\x87\x40\x44\x47\x75\x9f\x0e\xc7\x08\x3c\x53\xa7\x29\xff\x79\x6f\x17\xf2\x08\x4a\xc2\x32\x38\xce\x4a\x58\x06\x4f\xe1\x11\x7b\xcd\x98\xaf\xd0\xd3\x70\x59\x27\x25\xee\xba\x6b\x26\x58\x33\x92\x75\x2a\x21\x71\xe4\xb1\x2a\xff\x35\xd6\xb0\xde\xdc\x34\x53\x4a\xd8\x80\x0d\x88\x1d\xa0\xbf\xa3\xed\xd3\x4b\xf5\xb0\x41\x09\x55\x23\x63\xdf\x09\x7b\x94\x83\x0a\xef\x7e\x97\x70\xaa\x5e\x73\x3a\xd4\x4e\x6b\x79\x68\xa5\x74\x0f\xc6\x6c\xad\x92\xd7\x4e\x23\x3b\xa6\x63\x0c\x8b\x01\xf6\x89\xdf\x2d\xf2\x67\x98\x8d\x3c\xfa\x9c\x37\x32\x98\xb4\x80\xfc\x3a\x36\xa9\x5a\x92\x42\x13\x48\x52\x7c\x3c\x49\xf2\x5c\xce\xa0\x3e\x85\xf4\x80\x5d\xf0\x89\x20\x64\xa2\x10\xe8\x91\x3a\x18\x6a\x9e\x53\x00\xbc\x62\xef\x1b\xf9\xc2\x53\x80\x19\x2b\x30\xbb\x29\x91\xac\xe8\xce\x37\x3a\x7a\x5b\x69\xd8\x6e\x48\x83\x49\x77\x76\x7c\x25\x21\x89\xc0\xf9\x8c\x38\x81\x87\x69\x47\xc8\xd4\x49\x93\x49\x3c\x20\x03\xf1\x7e\xa7\xa8\x9b\x30\x04\x95\xa6\x15\xcc\xbb\x79\xa2\x35\x5c\x67\x47\xb7\x7d\x11\x90\x6a\x96\xcf\xe9\x75\x24\xc3\x7e\x88\x47\xfd\x4f\xa5\xb6\xd7\xb7\x8f\xa9\xca\x16\xd2\x58\x6b\xd8\xb4\x8c\x29\x8c\xe6\x0d\x31\xb3\x15\x80\x5f\x19\x84\x11\x36\xfe\xe8\xc1\xa5\x96\x43\x94\xe5\xbe\x12\xe5\xa1\x40\x58\xcb\xbb\x44\xa0\x4e\xca\x3b\x59\xed\xaf\x36\x01\x12\x51\x92\x91\xb9\xdb\xcc\xde\x1b\x6d\xc5\xa8\x10\xa5\x83\x35\xf2\x0f\xa0\x1d\x25\x1d\xa2\x7b\xd5\x9a\xbc\xee\xd2\x8c\x0a\x19\x92\x3b\x36\xa6\x08\xd0\x8d\x2e\xc2\x2e\x95\xa5\x0f\x89\x7a\xd6\x6d\xb9\x42\x49\xe9\xd6\x8a\x8d\x99\xe2\x03\x23\xfe\x56\xc4\xff\x95\xcd\x35\xb4\xfa\x51\xec\x10\x90\xc5\x1b\x7a\xe2\x94\x67\xaa\x78\xb7\x78\x84\x8a\x3c\xbe\x27\x8f\xab\x88\x94\x74\xa3\xba\x74\x4b\xf3\x4c\x3e\xc2\x22\xdd\xad\x16\x31\xe8\xa1\x95\x3d\xe4\x9f\xf8\x00\x5d\xf0\x29\x54\xa3\xd2\xfe\xe9\x68\xe2\x7f\xd3\x26\x41\x1d\x08\x38\x4b\x7b\xa6\xf5\x29\xdd\xa1\x7e\x43\xec\xe8\xc3\x9e\xb6\x75\xe4\xc0\xf2\xf5\x38\xdb\xe0\xec\x39\x02\xde\xb9\x8a\xc6\x2f\x76\x95\x8b\x22\x80\xa4\x6d\x07\xb4\xcf\x7a\x7e\x08\x90\x40\x4a\x99\x7a\x31\xd5\x6a\x55\xff\xfa\x5c\xc5\x09\xaa\xa3\x3c\x81\xc4\x77\x6a\x5b\xe4\x1f\x63\x10\xce\x56\xfa\x2f\x42\x66\x59\xa7\x6e\x12\x8f\xaa\x57\xe8\x3b\x39\x61\x5f\xff\xdd\xd9\x24\x0d\x35\xb2\x91\x91\xa3\xcf\x63\x97\x6b\xe7\x70\xc3\x20\x65\x71\x60\xad\x71\x05\x08\xcf\x5a\x5b\x90\xd0\x52\xcd\x21\x21\x95\x15\x1c\x87\x43\x05\xb5\x9b\x90\x54\x21\x59\xa9\xa1\x9b\x1e\x0c\x60\x65\xa0\x5c\xef\xdc\x2f\x18\x1e\x3f\xf6\xb4\x26\x4a\xb3\xdb\x22\x5f\x87\xd5\x3a\x9c\xbc\x9a\xd5\x27\x2c\x89\x24\x08\x95\x4e\x69\xf4\xac\xc9\x05\x85\xb3\x52\xf0\x87\x55\x1a\x05\x00\x3f\x8e\xab\x2f\xe9\x25\x5c\xd3\x1a\xb2\x52\xc8\x6a\x02\x73\x90\x0b\xa3\xc6\xe4\x43\x81\x34\x8e\x5f\x43\x69\x6a\xb2\x06\xcc\x94\x86\x80\x59\x7f\xb5\x42\x03\x7a\x70\xc1\x38\x7f\x2b\x40\x1e\xf7\x29\xdb\x41\xaf\x5d\xd8\x2f\x0f\xb3\x12\x15\x5d\x1b\x6a\xd5\x6f\xcf\x57\x96\xb4\x93\x7a\x39\xd6\x23\xfa\x16\x09\x2d\x35\x8c\x44\xb9\x59\xfb\xa9\x3c\x31\xd7\xd8\xad\x05\x29\xe5\x30\x64\x65\xf8\x0c\xd1\x07\x1f\x5c\x36\x43\xc2\x4f\x7f\xa8\x3d\x08\x8b\xdd\x84\x53\xbb\x3c\xab\x52\xab\x87\xb0\x01\x19\x5c\x40\x51\xab\x46\xf1\xc2\x0d\xfa\xd7\xe8\x70\x3d\xd9\xeb\x00\x62\x02\xef\x90\x7b\xca\xc9\x20\xad\x76\x1b\x91\x46\xe5\x83\x6c\xd1\x50\x6a\xcb\xb3\xae\xe2\xc1\xea\x22\x4b\x56\x0a\x7a\xb4\x3c\xbb\xf5\xfb\x2f\x75\x4a\x07\xcf\x30\xd1\x55\xe9\xb9\x59\x3f\x57\x04\x2b\x9f\x15\xe3\x51\x41\x79\xe1\x66\x49\x41\x43\x03\x2a\x43\xd7\x7a\x40\x3b\xc6\xd6\x7f\x40\xab\xe5\xb7\x59\x8a\x55\xa0\x66\x84\x90\x53\x83\x60\x40\x6c\xc7\x29\x27\x2b\xf7\x28\xcb\xa8\x13\xb5\x95\xd1\x6e\x88\x47\xf1\xb7\x18\x98\x6e\x09\x43\xb9\x1d\xa9\x14\xab\xda\x10\x03\x32\x68\x48\x85\xf2\x1f\x20\xbb\x76\xd0\x2e\xd6\xad\xa2\xeb\x28\x37\x85\xf3\x8b\xfe\x1f\x9c\x15\x47\x5d\x71\xea\x9a\x9b\x27\x18\x40\x7c\x2a\x8d\x8c\x4a\x0c\xdd\xcd\x7e\x40\xc4\xfc\x5f\x05\xaa\xae\x9b\x05\xfd\x18\xad\x1b\x58\x3e\x43\x78\xea\xc9\xd1\xc4\x90\xa6\xc4\xae\xf1\xa0\x09\x5f\x0c\x94\xf9\x6b\x87\x12\xf7\x53\x1f\x31\xe2\xff\xfc\xa1\xd4\x62\x86\x50\x7a\x98\x25\x26\xe5\xaf\xa0\x4f\xe2\x1a\x4a\x2f\x8d\x6e\x6c\xac\xc1\x0e\x0f\x62\xa7\xcd\x4b\x12\x74\xd2\xcd\xcc\x36\x24\x28\x32\x27\xd7\xe7\xe8\x59\xc3\xe0\x61\xea\x56\xa6\xf3\x50\xba\x7a\x3a\xd7\x60\x98\x27\x98\xf1\xbb\x9c\xd4\x69\x95\x53\xe2\x7f\x3d\x83\xca\x5e\x78\x5f\x8f\x94\x3d\x91\x20\x61\x54\xb7\xb2\x23\x92\xda\xff\x29\xc0\xe3\x88\x8a\x52\xae\xd1\xfc\xbc\xb9\x9b\x74\x67\x31\xde\xa2\x5e\x55\x53\x96\x3b\x8c\x39\x39\x6b\x25\x9d\x30\x3c\x6e\xe9\x50\x1d\x74\x29\x74\x87\xe6\x3d\xc0\x53\x24\xe0\xa4\xfc\x0d\xa7\x3b\x86\x72\x15\x3c\x6e\xa8\x51\xb5\x5f\xdd\xfa\x05\x99\x7a\xa7\xca\x2a\x71\xad\x67\x57\xa7\x72\x05\xad\x55\x22\x5a\xd3\xcd\xdf\xb3\xc7\xbc\x83\x13\x8d\xf4\xf6\x58\x07\x83\x2c\x49\x1b\xcd\xaf\x8f\x22\xbe\x10\x38\x96\xa7\x80\x77\xd4\xec\xc5\xa2\xe9\x0d\x04\x71\xfc\xbc\xeb\x26\xab\x4d\xfb\x61\x6c\x4d\x60\x17\xd7\xd1\x53\xd3\x95\x2e\xac\x19\x36\xc5\xf6\xf6\x31\xe9\xca\x86\x91\x9c\x0b\x4a\xc1\xf6\x4e\x98\x34\xd0\xf1\xe0\x92\x3a\xe9\x21\x2c\xde\x49\x49\xe5\x62\x34\x15\x2a\x3a\x27\xcb\xd8\xf1\xd9\x6f\x14\xe4\xd4\x98\x6c\xeb\x0a\x5c\xbe\x1d\xda\x6c\xff\x36\xd2\x40\xa6\x9b\xbd\x85\x17\x89\x97\x5f\x1b\xe7\xaa\xf1\xf9\xde\x0f\x8e\x71\xbe\xf7\xe0\x8d\xd5\xb7\x90\xee\xf4\x75\xee\xb8\xff\x92\x6f\x51\x38\xc8\x80\x7f\x56\xdf\xc8\x24\xff\xb2\xe3\xf2\x85\x8d\x12\xbf\xef\x6f\xb6\x4e\xb1\x1f\x38\x4b\x40\xdd\xfe\x6a\xec\x07\x73\x99\x90\xe6\xfa\x55\x91\xdf\x41\x24\xd8\x2f\x98\x22\xfe\x40\xbf\x90\x37\xf5\xe9\x1d\xe4\xb9\xb1\xfa\xfd\x26\xce\xdb\x7f\x45\xf1\x80\xc9\xa9\x44\x0b\xbf\x1e\xb6\xe7\x21\x06\x46\xd0\x01\xf6\xec\x7a\x5c\x36\x94\xf2\x00\x9c\x01\xb6\x08\x9f\xca\x18\xe8\xa7\xf2\xe3\xfb\xf0\x0d\x87\x88\x17\x65\xb9\xd8\x9e\x7e\xec\x83\xe3\x5c\xf1\x27\x51\x13\xf9\x03\x3f\x14\x55\x58\x1f\xab\x7b\xb0\xd7\xdb\x3e\xc0\x9d\xa5\x75\x5e\xd4\x97\x7a\x47\x46\x24\x00\x3f\x6c\x43\xa1\xe4\x54\xeb\x1a\x03\x7a\xe0\x47\xd3\x06\x5d\x0c\xf4\x6d\xcf\xeb\xcf\x7f\x99\xa1\x07\x3e\x28\x1e\x6b\xed\x00\x55\xc0\xc2\xbd\xfe\xa4\xb3\x65\xdd\x0e\x4d\x24\xbc\x5d\xd3\xe5\x24\x0a\x65\xcb\x77\x39\xbb\x34\xd7\xb9\x97\x1c\x2a\x5c\xe7\xbf\x82\x5c\xec\xe0\x18\xfa\xe9\x81\xc1\x9a\x60\xe5\xb1\xc0\xf5\xec\x2a\x5e\x6a\xc1\x80\x20\xf9\x1d\x67\x5e\xbb\x4a\x54\x59\x15\x7b\x7a\x33\x95\xe1\xec\x50\x82\x6f\xb6\x30\x93\xcf\x0d\x94\xd7\x7f\x56\x4b\x21\x0f\xb1\xb5\x2e\x23\x16\x3f\x3e\x9c\xe7\xdf\xe2\x86\x41\xe4\xeb\x1f\x61\x04\x1b\x9e\x46\xb6\xc3\x1b\xe2\x09\x62\xfc\xbe\x4b\xd2\xc5\x48\xe8\x81\x52\x5f\x97\x50\x96\x00\x81\x63\x7f\x49\xde\xb3\x9c\x0c\x21\xce\x65\x0d\x4b\x16\x0c\x92\x19\xb0\x7f\x97\xef\xde\x83\x06\x8a\xd8\x9e\xe1\x08\x74\xbf\xa5\xea\x0a\x6d\xaf\x39\x24\x3f\xde\x9e\xf6\x45\x44\x35\x17\x2b\x9f\x7d\xcd\x24\xb0\x1e\x5e\x94\xc8\x52\x34\x78\x46\xe2\xdd\x9b\xa1\x6e\xd2\xac\x6d\x41\x13\x7d\xef\x90\x6f\x31\x30\xf5\x4b\x98\x1b\xdd\x0e\x80\xfa\xe4\xce\x3b\x67\x86\x21\x00\xb8\x4f\xe4\x94\xbf\x43\x9d\xc7\x80\x0c\x2c\xde\x49\xda\xae\x6f\x69\x79\xbf\x21\x7e\xc8\x9b\x6e\xb5\x7c\x17\x07\x87\x72\x58\x1c\x04\x61\xd6\xe8\xd2\x62\x92\xbc\x4a\x11\xcc\x3e\x6a\xaa\x90\xad\x92\x0d\xe3\x7b\x90\x7e\x3c\x1a\xc3\x12\xad\x7b\x85\x4c\x57\xad\x90\xb3\xf2\x55\x75\x77\xbf\xac\xdd\xb1\xb2\x47\xa0\x02\x86\xec\x9c\x4b\x58\x5a\x5c\x4c\xc5\x85\x2a\xd8\x7f\x2e\xf5\x75\x29\x6c\xfa\x2a\x55\x89\x1c\x2f\x25\x38\x58\x39\x16\xb7\xe3\xa1\x16\xd8\xee\xd7\xe8\xc3\x84\x2b\x05\x6a\x72\x3f\x7a\xe1\x3d\xe4\x10\xfc\x85\xee\x6d\xa2\x7c\x0e\xbc\x90\x37\xaa\x7a\x7d\x76\x96\x88\x17\xac\x12\xfa\xb2\xeb\xcb\x1e\x83\x74\xab\x47\x59\x7c\xbe\xc2\x83\xc5\x23\x15\x6c\x2f\x5e\x39\xcc\x19\x5f\xf9\x2f\x49\xbf\xe8\xd5\x99\x7f\x44\x00\x29\xec\xb4\x0c\xc9\x81\xea\xd5\xe9\x7c\xd6\xbd\xf0\xb6\x1d\x99\xfd\x69\x26\x98\x3f\xa1\x63\x66\x98\x89\x94\x40\xec\xd8\x3a\x52\xbc\x07\x5a\x60\xe5\x45\x37\x1e\xd7\x08\x7b\xc5\x7b\x49\x69\x31\x7a\x4b\x11\x2f\xb5\x96\x58\xc0\x28\x73\xe1\x82\x94\x4d\x5c\x2a\x4c\xc7\x54\x9e\x89\x83\xfd\x67\xb4\x09\x0d\x31\x74\x3a\x28\x8e\x86\x39\xd4\xcc\x63\x90\x7d\xf4\x4a\x4f\x1e\xea\x86\xe8\xe4\x75\x62\x7c\x41\xe1\x30\x07\xfe\xa4\x7b\x56\xc7\x45\x21\xed\xeb\xe3\x0f\xe2\x7a\x7f\x44\xf4\xb9\xde\x75\x0b\x1d\xaf\x77\x9d\x29\xfc\xe4\xd1\x05\x4e\x93\x41\x38\x8c\xa2\x59\x77\xfb\x59\x0f\x5e\xb7\xc2\x2a\xd6\x27\x5e\xf8\x5f\x06\x59\x2f\x9c\xd0\xdb\xf4\xeb\x46\x7a\x28\x95\xc9\xe0\x4c\x1f\x32\x50\xa7\x07\xd8\xfc\x96\x5d\x4e\x28\xa5\xda\xd7\x3d\x48\x3f\xac\xba\xb6\x3d\xcf\xd2\x98\xb0\x74\x79\x37\x8b\xdb\xe9\x1f\x52\x94\xb9\x64\x0a\x6e\x65\x6a\x2e\xde\x0a\x31\x32\x3f\x4f\x93\xc7\xb1\x0b\x89\x9d\x6c\x13\xaf\x5a\x25\x39\x65\x4d\x8c\x54\xba\xea\x2e\xc2\xc2\x55\xb7\xa5\x44\x76\xe5\x05\x29\x2e\xef\xf2\x44\x6f\xeb\xf2\x46\xc9\x4f\x56\x25\xd2\x6b\xc3\x07\x1f\x22\x5c\xa5\x51\x05\x6c\x3f\xa5\x58\x70\xf9\x4c\x8b\x2a\x1a\x88\xa6\xf0\x6b\xbc\x0a\xb4\xb9\xa9\x4b\x36\xdf\x3f\x09\xb0\x56\xf7\x2e\xfb\x85\x34\xd7\xed\x3f\xe9\x7d\x79\x29\x73\xeb\x8b\x46\x5d\xfe\xd0\x30\x3d\xa5\x43\x76\xcf\x8a\x0b\xf3\xba\x04\xf1\x9d\x5f\xdd\x67\xdb\x50\x76\x89\xb7\xac\x34\x81\x2b\xcb\x3f\xc4\x80\x77\x57\xae\xf4\x71\x23\xec\xcb\xfa\xe6\xfe\x44\x9d\x4f\x7f\xc6\x3f\xa1\xf8\x41\xf5\xae\x76\xce\xda\x40\x9c\x5e\x00\xbf\xc0\xd4\x2f\x25\x29\x6e\x6a\x20\xde\xb3\x54\xd4\x4e\x5e\xc9\x53\xf2\xaf\x9e\x7f\x0b\xf9\x24\xa6\x8a\xdb\x98\x80\x9a\x5f\xdf\x4f\x70\x1a\xcf\xef\x3b\xb9\x26\xfb\xf9\xad\x47\x17\x21\xfa\xb8\xcc\x90\x14\xc0\x10\x94\x6e\x8e\x4a\x44\xdf\x0d\x52\xd4\xc5\x5a\xbe\x36\x32\x07\x0b\x98\xca\x2a\x48\x97\x95\x3e\x8d\x35\x7d\x97\xfe\x9b\x69\x89\x6f\x40\x89\xc6\x50\x19\xfb\x72\x55\xa2\xa8\x03\x71\xd8\xaf\x19\x94\xdc\xc5\xf9\x66\x3e\xd1\xf9\xca\x1e\xd0\x3a\x5f\x4a\x2c\xe1\x2e\xb4\xa9\x3f\x6f\x30\x91\x1c\x1c\xd4\x28\xb9\x69\xef\x44\xc1\x31\x85\xbb\xb0\x20\x81\xab\x7b\x2d\x54\xcd\xfa\xf8\xa2\x7d\x95\x91\xa7\x6a\xf8\xe0\x8d\xb2\xef\xcd\xad\x90\xce\x2b\x64\x46\x0c\x65\xeb\x04\xfc\xdd\x99\x3e\xf9\xb6\x1c\xe1\x0a\xc2\x55\x68\x5e\xa5\x8c\x75\xeb\x5e\xd8\x47\x78\x85\xec\x17\x47\x8d\x2e\xae\x19\x22\x5d\xad\x2a\x9b\x9e\x3a\x65\x14\x62\xc3\x67\x46\xf1\xa3\x4b\xf5\xb1\x83\x90\x1f\x93\x84\xcc\x85\x94\x05\x82\x83\x8e\x4c\x86\xea\xc5\x9f\x55\xd9\x01\x85\x58\xd9\xd5\xe7\x1f\x6d\x29\x04\x7b\xae\x9a\x55\x4b\x58\xad\x1e\x3a\x4a\x57\x91\x80\x59\x89\x04\x03\xab\x21\xf8\x1d\x1b\x78\xe7\xae\x37\x16\x37\xc5\x9a\xdb\xa5\x71\xf6\x12\x43\xb6\xae\xd7\x63\x6d\xcf\xa1\x87\x68\xf0\x77\x7a\x90\xee\xf8\x23\x22\x80\x04\xb4\xf0\x57\xd8\x28\x3e\x94\xd2\xd2\xae\xe4\x6b\x57\x0e\xcb\x02\x45\xc2\x44\x57\x30\x44\x20\x20\x86\xe2\xff\xee\xc2\x5e\xa8\xeb\x81\x49\x77\x07\x90\x91\x1c\xc0\x2e\x61\x03\x05\x03\xd5\xa0\xe7\x51\xa8\xe6\x60\x80\x3e\x90\xe7\xa1\xf4\x05\x03\x92\x21\x3b\x72\x88\x8a\x65\xf1\xc7\xdc\xbc\xc9\xef\xc4\x91\xe8\xef\x0a\x10\x67\x4d\xae\x53\x41\xa8\xf7\xea\x48\xa5\xe7\x68\x9f\xf5\xd6\xa5\x7a\x66\x33\x15\xc7\x44\xe8\x3e\xd9\xc1\xb2\xa2\x48\x82\xac\x79\xc7\xff\xac\xff\xe7\x83\x61\xd8\x85\x70\x03\x29\xda\xc1\xad\x43\x69\x7b\x67\x65\x52\xf0\xb9\xdd\xa1\x21\xb5\x9d\xd2\x44\xda\x44\xd3\x76\x10\x3a\x59\xc2\x45\x58\x12\x4d\x9b\xcb\xc6\xfa\xf5\xad\x37\x67\x1a\xc0\xc4\xe7\xee\x6b\xed\x2a\x66\x3d\xc9\xe5\xb4\x1e\x8b\x74\xd2\x0c\x65\xad\xd2\xab\xba\xa6\xa7\x5e\xa3\x35\x51\x61\xfc\x84\xa5\x32\xbf\x10\xd8\x23\x1f\x52\x3c\x2b\x24\x6e\x9c\x7f\x35\x94\x67\x0d\x06\xd1\xfb\x2c\xaf\xc6\x1b\x65\x03\x54\xbf\x1f\x50\x8e\xf7\x32\x0c\x11\x4f\x44\x02\xf9\x63\x5d\xfa\x8c\x80\x97\x6f\x25\x77\xb2\x51\xf6\x49\xcd\x6a\xe8\xfe\xa8\x1b\x6a\x90\x5a\x49\x65\x55\x72\x24\xc5\xd1\x66\x3d\x0b\xeb\x7b\x71\xb2\xc6\x3a\xb5\x2d\xae\x27\xff\xc3\xf4\xe7\x12\x15\xcf\x18\xec\xb7\xd2\x73\x3e\xac\x44\xae\xa7\x23\x19\x4f\x9e\x73\x7d\xe9\x45\xb1\x13\x5c\x0c\x6d\x60\x22\x47\x07\x28\x1f\xcf\xbc\x77\x5d\xb5\x42\x53\x29\xc4\x47\xd5\x7b\x3c\xe7\xcc\xff\xe6\x50\xdb\x9b\xb3\x06\x2d\xc8\xfc\xf0\x2e\x03\x26\x60\xf9\x4e\xce\x69\x29\xdc\xc8\x7a\x36\xce\x96\x82\x36\x5a\xe5\xaf\x86\x0b\xa5\x56\x75\xef\x49\x24\x94\x7a\xc8\xe9\xcc\xb7\xe4\xc9\x6e\xf9\x10\x22\x7e\xf7\x51\xa9\xd7\x23\x37\xb6\x68\x50\x4f\xcb\x1d\xf0\x07\xe5\xc6\xd4\x14\xab\xa9\x4f\x38\x41\x13\x52\xc2\x0d\xc6\x30\xac\xb9\xf3\xa6\x8d\xb6\xc4\x8b\x82\x12\x1c\x3f\x4c\xb4\xb5\xf1\xdd\x61\xd0\xe7\x65\xc8\x8e\x59\x85\xc2\xd7\x2b\x43\x71\x2d\xd6\xc1\x66\x53\x30\xb4\xbe\xb2\xb2\x28\xce\x9c\x94\x2b\x72\x4a\xa9\x02\xe5\xaa\x92\x6a\x93\x98\x03\x96\xe2\xd6\x58\x63\x36\xe0\x74\xb7\x1c\xae\x84\x78\x9a\xd2\x2a\x99\xd5\xde\xa5\xd1\xde\x9a\xb7\x83\x60\xda\x1d\xe0\xf8\x09\x8e\x21\x7d\xb4\x2b\x96\xf1\x2b\xb0\x72\x0a\xed\xb1\x7b\x08\x7d\x31\x68\x23\xc5\x76\x5d\xab\xd2\xe5\xd1\xfa\xcd\x70\x21\xb4\x59\x82\x75\x58\x08\x7f\x56\x5f\xe8\x7b\x43\x43\x41\xa8\x76\x14\x23\x2f\x60\xf2\xc5\x1d\x95\x21\x14\xd7\x36\xd5\xe4\xa1\xa1\x46\x5c\xf6\xd8\x16\x52\x82\xfb\x33\x70\x96\xbe\x5a\x59\xaa\x74\xe7\xec\xf5\x64\xb8\xcd\x8d\xc8\x8f\xbe\x6d\x7f\x5d\x01\x25\xa1\x96\xb7\xae\x1c\x67\x0f\x7b\xa6\x85\x04\x16\xa6\xfe\x7b\xac\x53\xaf\x53\xa4\xc7\xa3\xd3\x1f\xb8\xd8\x1f\x44\xea\xdb\x87\x8a\x3d\xd0\xa3\x06\x78\x10\xec\x91\x01\x7f\x8e\xd4\x93\x3a\xd3\x27\xde\x09\x38\xd5\x7a\xf9\xbf\x2e\xd2\xf6\x92\x7e\xd9\xcb\x67\x65\xfd\x60\x1a\x75\x9d\xb0\x48\xf0\x12\xd3\x7e\x0e\x76\xef\x10\xee\xc4\x53\x64\x1f\x9d\xf0\x2b\x62\x35\x85\xf8\x9e\x3a\x2d\x08\xf1\xf1\x64\x36\xd2\xe4\xbb\xe0\x93\x9d\x94\x44\x5b\x59\xed\xdb\x98\xe4\x0a\xf5\x37\x0d\x08\x01\x36\x5e\x9b\x73\x22\x05\xd7\x38\xd7\x80\xb0\x3b\xeb\x3d\xeb\xed\x5d\x21\xf0\x99\x42\xe8\x0d\x96\x06\x38\x6f\xfb\x4c\xdf\x70\xcb\x6c\x9f\xc1\xab\x1d\x2b\xd5\x2d\xc4\x74\x3c\x6b\xcf\x66\xbd\x29\x4d\x2a\xb7\x5b\x9a\xf4\x90\x5a\x63\x86\x0a\xd4\xd4\xa4\xd6\x05\xc4\xd2\x0f\x75\x0f\x1f\xef\xff\xb6\xfa\xf1\x08\x6c\xab\xff\x8b\x96\xb7\xd5\x9b\xdd\x0c\x03\x9b\x67\xd6\xf9\x9d\xf8\xc7\x28\xb6\x49\xcf\xc1\x45\xcd\x72\x80\x61\x65\xca\x1a\x16\x14\x90\x31\xa8\xc0\x40\x0b\xc7\x21\x00\xaa\x98\x59\x5b\x2f\xd6\x8e\xb5\x24\x85\x87\xd9\xf8\x15\xb7\x6e\xa7\x02\x89\x34\x0a\xcb\x21\x3d\x7c\xe4\xd6\xcf\x99\xca\x44\x86\x18\x2d\xb0\xce\xd9\xc5\x6b\xa4\x9e\x58\xb5\x66\x2f\x36\x96\x51\xb9\x81\x10\x48\xb3\x57\x57\xa5\xf4\xd4\xa6\x3c\xe7\x24\xc9\x2d\xa8\xe1\xef\xbf\x5b\x81\xb9\x16\x5d\x88\x86\xd7\xd0\x42\x68\x13\x0f\xa9\x7a\xcb\x00\x26\x03\x6a\x48\xbd\x0d\x89\xf9\x58\xa0\x06\x54\xa6\x72\x03\x52\x3f\xab\xf7\xd2\x61\xb3\x2b\xc1\xae\x72\x4a\xd0\xb7\x95\x83\x3b\x52\x83\xcd\x06\x0d\x90\xb7\xde\x28\xc4\xb6\xbb\x3c\x3b\x77\xdd\x25\x85\xa6\x57\x12\x56\x67\x67\x90\xc1\x99\xe3\xdb\x65\xd3\xdc\xe1\x0b\xd5\x4a\xa1\x12\x5b\x7f\x38\xee\x79\xdd\x9f\x81\x96\x78\xd7\xe6\x4a\xf1\x37\x77\x64\xf1\xdf\x9a\xef\x2b\x94\xce\xce\x43\x32\xd7\x56\xb0\x8f\xd0\x22\x5d\xb3\xfd\xc3\xcd\x01\xee\xe2\x6b\xb1\x6f\xe9\xb1\x1f\xe0\xaa\x72\xc9\xff\xec\xf4\xd0\xc5\xc6\x72\x57\xb3\x43\x9a\x26\x55\xf9\x90\xa5\x59\xf4\xff\x99\xe7\xcd\x7c\x24\xcc\x62\x6e\x79\x94\x9a\xda\x90\xa9\x80\xda\x94\x40\xe3\xf0\x4d\x01\xb3\xfb\x92\xa2\xd9\x0d\x5e\x0a\x11\x1e\xbe\xe4\xfe\x30\xdf\x22\x3d\x3f\x1b\x0c\x4a\x4f\xed\xb8\xf5\x1a\xa7\xa3\x1e\x0c\x84\xb8\x1b\x2c\x7d\x3b\x30\x77\xd5\xb9\x56\x4d\xcd\x8d\x3d\x3f\x70\x4c\xe9\x0d\x00\x75\xb5\x2a\x36\xb1\x75\x1d\x78\xa8\x12\xba\x23\x2e\xa2\x16\xc9\x67\xe8\x0b\xef\x61\x05\x6a\x7d\x2c\x4d\x14\xa1\xb7\xe5\x03\x4e\x37\x1c\xcc\x5a\xb5\x96\xd0\x4d\xbb\x2e\x51\x16\x80\xf5\x6f\x4d\x29\x19\xa0\x6e\xd2\xdd\xc2\x36\xc6\xe0\xc1\x66\xe1\xb0\x36\x21\x80\xde\xd0\xc3\x13\x1a\x58\xff\xdb\xa0\x4d\xe5\xcd\x01\xb9\x01\x1f\xa0\x1d\x50\x65\xdc\xd9\x95\x3e\x30\x81\xcd\x32\x78\xd2\x87\x8b\x25\x36\xfd\xd7\x53\x85\x03\x26\x8a\xaa\x95\x17\xe3\x38\x07\x3f\x0d\x41\xcf\x7b\x3c\xe4\x42\x79\xa8\xc3\x62\xa5\x2e\x22\xf3\x12\xf2\x44\x71\xa8\xc6\xb9\xbd\x03\x72\x78\x92\x6f\x43\xb0\xd0\x2f\xa0\x5e\xa1\x31\x05\x4a\x33\xf7\x47\x44\xc5\x43\x41\x70\x42\xe3\xb4\x9a\xdd\x06\x6b\xeb\xb8\xce\x1a\x04\x0a\x38\x42\x83\x8d\xbb\x6e\x4d\x41\xd9\x03\x95\x14\x5d\x9f\x3c\xaf\x8a\x9b\xad\x88\x0e\xa9\x2f\x7a\x44\xf6\xf9\xc1\x08\xf2\xb1\x4a\x86\x4f\x4a\x6a\x40\x45\x72\xd5\xd6\xf8\x7e\xf9\xb8\x0e\x17\x57\xe7\x08\xf4\xf8\xd9\x86\x3b\xf4\x07\x6f\x28\x1d\x85\x0a\x69\xcf\x3d\x76\x7a\xee\xbd\x15\x39\xfc\x53\xe1\x06\xf9\x70\x6e\x8c\xfd\x90\x38\x22\x58\xd3\xfc\x5f\xc4\xff\x8f\xa2\x2a\xed\x88\x30\xc0\x21\xc7\xbc\x03\x9d\x53\xa4\xb2\xdc\x2f\xee\xcd\x14\x55\x8e\xd1\xb9\xc0\xc9\x66\xe8\xa7\xd9\xfb\x4a\x45\x39\x1b\x92\x30\x4e\x75\x64\xf9\x44\x50\x9e\x0c\x21\x13\xaf\xa5\x0e\xf4\x3c\xbf\x02\x89\xe5\x93\x89\x49\x98\x57\x92\x5c\x59\x93\x2e\x9d\xf3\x80\x79\xe0\xbd\x2b\xc2\x11\x72\xdf\x9d\xea\x42\x50\x50\x93\x5c\x9a\x18\x50\x47\x46\x47\x82\xff\x63\x3a\xfc\x91\x3e\x67\x95\x78\xd9\xab\xa7\x77\x1a\x66\xaf\xdc\x55\xd0\xbc\x49\x3b\xac\xfb\x72\x15\x29\x8a\x85\xfa\x9a\xdd\x1d\x3e\x0b\x7b\xb7\xe8\x2f\x64\xdd\xe6\xef\x2f\x5c\x76\xb0\x57\x04\x5d\x34\xc9\x9e\x02\x7a\x93\xf0\x9f\xa4\xd1\xf4\x30\xad\x32\xff\xe3\x1d\x4d\x52\xc3\x38\xdc\x2d\x82\xd3\xa0\x47\xd2\x53\x45\x8d\x12\x82\x7f\x29\x4c\x26\xa0\x12\x3e\x8e\x3a\xfd\x9e\xba\x6e\x1d\x8c\x95\x42\xb8\x4d\xfd\x9b\xc3\x1d\x94\xa9\x96\xd6\xab\xca\x23\x4d\x4f\x7e\x5d\x52\xee\xb6\x26\xbf\x2a\xce\x59\x5f\x9a\x3f\xae\xf7\xf5\xd6\xdb\x8a\x60\x33\x33\xd2\xeb\xc5\x6e\xa8\xa7\xd7\x76\x65\xb4\x73\x53\x19\x71\x29\xd8\xec\x8e\x12\x39\xab\x89\x1a\x68\xbb\xb4\x7a\xa0\x86\xe6\x05\xc7\xa0\xe8\xc4\xeb\xd8\x07\xb5\xca\x6d\x94\x2a\xde\x35\x22\x22\xfe\x5a\xd6\x18\x35\xd4\xe5\xf6\xf1\x75\x5d\xaa\xd3\x57\x21\x25\x20\x91\xb2\x70\x19\x36\xc0\xda\x16\x7a\x66\xa1\x0a\x5f\x3d\xf7\xcb\xab\xbc\xaa\x94\xf6\x3a\x21\xa3\xd0\xff\x39\x65\xae\xc8\x48\x5f\xd2\x2f\xe0\xd8\x1c\x19\xd8\x71\xd7\x80\xbb\x62\x3c\xbc\xdd\xcf\x99\x19\x42\xd5\x93\x3f\x88\xf7\xdb\x1f\xef\x6e\x5d\x4f\x57\xf3\xaa\xed\x47\x1a\xdd\xab\x42\x0e\x7b\x95\x5c\x5a\x0b\x0a\x09\xa0\xa2\xec\xdd\xc4\x03\x20\x69\xf3\xe4\x4d\xef\x8e\x5e\x4e\x26\x1a\x2a\xe5\xd0\xc2\x06\x6d\x2f\x3d\xce\x6a\x70\x57\x82\x3a\x94\xd0\x9a\xc7\xd1\xfb\xe2\x10\x3f\xd1\xc5\xd1\xf4\x09\x39\xa6\x97\xe3\xee\xda\x9c\xd1\xef\x41\xce\x61\x77\x12\xd8\xf3\x3b\xd2\x83\xf6\x7c\xa3\x1f\x46\x14\x77\x68\xf7\xb1\x66\x28\xe6\xee\x90\x85\x3a\x25\x72\x46\x59\xa7\x5d\x19\x99\x56\xfa\x18\x0e\xa5\x8c\x18\x76\x89\x14\xee\xff\x88\xa5\xec\x39\x85\x06\x9b\xf7\xbc\xf6\xf4\x82\xa2\xe9\x4a\xc8\x1b\x81\xee\xbe\x7f\x73\x86\xbc\x2b\x08\x77\x10\x8a\xa5\x29\x26\x0e\x10\xd3\x02\x12\x73\x95\xc8\x9a\x64\xd6\x0e\x8f\x1c\xee\x69\x73\xe5\x37\x4f\xf9\xe0\x7e\x8b\x01\xeb\x81\x50\x96\x2d\x12\x5c\xb6\x8f\x94\xac\xac\x8f\x1b\x8a\x69\x10\x5f\x0b\x6d\x25\x1b\xc7\x31\xb1\x69\xbb\xc9\x72\xd8\xee\x5a\xf8\x9f\x7d\xd2\x3f\xf6\xf4\xe0\x9a\xc5\xea\xfe\x3f\xaa\x38\xc1\x26\x7b\x15\xdd\x6f\xbb\xc3\x80\xdc\x63\x43\x94\x58\x53\x53\xbc\xb5\x9b\xea\x63\x1f\xaa\x8f\xa9\xf9\x36\xc0\x7c\xd3\xcd\x3e\xdc\x26\x6d\x35\x55\x5b\x5b\x64\xc3\x53\x49\x4d\xb3\x09\x58\xa0\x14\x19\x24\xe1\x3e\x84\xfb\x25\x37\x68\x57\x48\xfb\xde\x5b\xac\xc6\x3c\xc8\xb7\x2f\x6c\x31\xeb\xe4\x4b\xfa\xe5\x06\x07\x64\xb2\x4b\x37\xed\x4a\x6c\x32\x1c\x92\x34\x83\x40\xcf\x93\x73\x6e\x94\x58\xbb\xb8\x76\x55\x3c\x1f\x11\xae\xd0\x4c\x83\xe0\x10\x01\x1f\xfe\x56\xe3\xdd\xdb\x6a\x26\xc5\x60\x8b\xf1\xf3\x86\xcc\xac\xef\xcd\x3d\xcb\x27\x7d\x53\x87\x67\x40\x66\x00\xc3\x79\x97\xc7\x2d\x2e\x2c\xee\x7b\x63\x72\x5b\x3a\x65\x45\xa9\xd2\x5b\x59\x6d\xf0\xf2\xf2\xac\x9d\xcd\xa7\x97\x95\xed\x8d\x34\x67\x56\x20\x5b\x09\x11\x31\xe4\x4d\xab\xe6\x03\x16\x87\x1d\x30\xec\x63\x48\x9d\xd0\xb0\x80\x0b\x3f\xf4\x08\x53\x30\x2c\xea\xf6\x59\x3d\x4e\xe2\xb3\x55\xad\x0b\xc5\xd1\x9a\xf2\xf4\x88\xfc\x51\x64\x06\x8e\x10\x9f\x09\xd5\xb3\x5d\x19\x10\x5b\xd8\xc6\x6d\x88\xb3\x3c\xf8\x4f\x76\x91\xad\xe4\x45\x65\x1b\x44\xbe\x29\xd8\x36\xbe\x23\x46\xb3\xfd\x84\xa6\x46\xeb\x4c\x89\x06\xb2\x8d\x7b\xd6\xca\x5d\xfa\x63\x5b\x61\x02\xa1\xa1\xae\x75\xb6\xba\x6f\x5e\x0e\xfc\x0c\x25\xb3\x88\x2f\x6e\xe3\x72\xeb\xdf\x8b\xdf\xf5\x93\x38\x3d\xf9\x7e\x8c\x73\xd2\xe4\xc0\x36\x5a\x7f\xe0\xe0\x8b\x3a\x3e\xd7\xfa\xd3\x63\x93\xae\xdb\xf8\x08\x7b\x8f\x6d\x9c\xd2\xae\xa4\x23\x88\xb0\x31\x81\x03\x62\x6b\x94\x95\x1b\xc7\xf5\x13\x5c\x27\x2c\x14\x89\x75\x41\x6b\x6d\xd3\xa6\x3d\x3f\xce\x55\xd7\xae\x0e\xa3\xec\x7a\x71\x10\x09\xd5\x05\x02\x4a\x78\x6f\xf4\x2c\x5f\x47\x98\x4d\x5d\x57\x49\xb4\xad\xf9\xd5\x11\x33\x4f\xa1\xd1\x86\xe4\x53\x2a\x74\x7d\x64\x61\x61\x48\x63\x31\x43\xf2\xb2\xd9\x6c\x58\xc2\x5b\xee\x22\x6d\xef\x10\x64\xbb\xe6\xe2\x7c\x7f\xf8\xaa\xb7\x3d\x00\x8f\x27\x0d\xd6\xcd\x93\xf6\x78\xba\xf8\x00\x20\xd1\x56\x09\x70\x01\xbc\x5b\xc8\xf1\xda\x25\x7a\xd6\x1a\x13\xa2\x28\xc4\xa6\x93\x35\xe6\xec\xc3\x8b\x8c\xad\x34\x10\xf5\x19\x01\xa8\xbe\x67\x68\x0b\x61\xb5\x2e\x31\xd7\x86\xa6\xed\x07\xfd\xef\x08\xcd\xb9\xfd\x26\x8d\x68\x73\xbf\x43\x02\xca\xaa\x71\x57\xf4\x82\x74\x7d\xf6\xca\x7f\x25\xbc\xa6\x2a\x02\xd3\x4e\xdc\x6c\xbd\x06\xfe\x0b\x79\xe6\x8b\x90\xe4\xd5\x64\x3a\x05\xd0\xe3\xbe\x5b\xfa\x93\xd8\x1f\x94\xd8\x74\x6b\x8b\x9e\x0a\xbf\x0c\xb8\xf9\x5d\x02\x99\x67\x99\xee\x2c\xa5\x36\x64\x66\x12\x80\xa1\x10\xba\x6b\xaf\xa4\x33\x85\x53\xb6\x21\x37\x03\xd7\x2f\x50\xcf\x7a\x73\x3b\x3f\xb6\x2c\xeb\xc7\x1b\x7d\x2b\xa2\x03\xbe\xde\xd1\xb7\x33\xc4\x0c\x59\x64\xec\x51\x3d\xcb\xbe\x47\x4a\x7c\xf9\x87\x49\x65\x36\xca\x35\xac\xf7\xcf\xc9\x6f\xb5\x96\x82\x73\x9c\x20\x2b\xcc\x0c\x2d\xad\x48\x24\x67\x8d\xb6\xde\x49\x86\x70\x6b\xfd\xea\x14\x22\xed\x41\xd1\x4d\xf2\x6b\xaf\x48\x76\x59\xeb\xad\x12\x62\x80\xdc\xaa\x49\xf3\xad\x29\xf8\xb0\x56\x4e\xad\x59\xa9\x86\x0b\xda\xfd\xf6\xa1\x36\x0a\xb1\x51\x2f\x13\x06\x04\x71\xbe\xb9\x85\x04\x9c\x04\xc3\x30\x20\xf3\x43\xd8\xbd\xe3\x47\x01\xdd\xda\xfe\x9b\x8a\x34\x97\xad\x3b\xaf\x94\x4c\xb8\xfa\x67\xb6\x74\x6b\xf1\xd0\xfb\xea\x02\x92\x13\xd7\xa0\x89\x75\x79\x26\x97\x71\xf3\x4b\xb2\x8b\x0d\x42\xa6\x61\x26\xa2\xae\xe2\x59\x59\x29\xd5\x5f\xeb\x61\x3e\x39\x3f\xb2\x96\xa9\x6b\xc4\x4d\x12\x50\x95\x30\x32\xfc\x12\x9a\xb4\xd2\xf2\xe7\x64\x4d\xb4\x66\x34\xc1\x7a\x7a\x20\x61\x52\xbc\x8d\xb1\x4f\xb0\x8d\x25\xcb\x06\xc5\x38\x76\xfe\x57\x4a\xa6\x10\x15\x8a\xac\x61\x7a\x46\x65\x1c\x6a\xa3\x7a\xc9\x9a\x9f\xcf\xbe\x23\xb8\xa8\x94\x57\xcb\x6a\x33\xd7\x88\xb2\x1b\xd0\x46\xe4\x22\x40\x37\x6e\xd3\x9a\xb1\x8e\xff\xe7\x40\x79\x72\x06\xfc\x66\x42\x86\xd6\xa5\xf5\xd2\xa7\x4a\xec\xed\xdd\xa4\x95\xf6\xe6\x2c\xba\x55\xe3\x94\xb5\x53\x1e\x81\x8b\x55\xfa\x10\x57\xf7\x34\x5d\xb7\x3f\x14\xe2\x4b\x87\xb9\x68\x26\xe4\xb8\xdf\x82\xf0\x1c\x02\x5d\x89\x9b\x85\xc2\x93\x0d\x68\x5b\xd1\xf1\x38\x9b\x0e\xf3\xbc\x50\x9a\xe3\xce\x98\x47\xe6\x1d\x4f\xbb\x46\xcf\x40\xaa\x38\x5d\xdf\x47\x53\x51\x8e\x15\xf6\x72\xec\x99\xd7\xab\xfb\xad\xf0\xff\x50\x8e\xd6\x89\x37\xf8\x0b\xaf\x94\x8c\xf3\x0f\x8c\xbf\x1a\x04\x0e\xea\xd8\xfd\x85\xc2\xde\x93\x43\xa4\x3e\x76\x47\x3a\xa6\x04\x12\x53\x27\xda\xad\xd1\x56\xac\x69\xe4\x5c\x92\x01\xe8\xdb\x09\xce\x9e\xb2\x4b\x51\x3a\x5c\x00\x7c\x64\x51\xbc\x12\xcd\xd8\x00\xfe\x73\xf1\xb9\x33\xd4\xaf\x6e\x8e\x82\x96\x5b\x29\x87\xd6\x86\xf2\xf5\x59\xdc\x02\xcf\x77\xbf\xd7\x3f\xd7\xee\xba\x17\x06\x62\x97\xdb\xeb\x82\x45\x4e\x40\x56\x52\xb2\x0b\x54\x60\x09\xb2\xb5\xcf\x79\x59\xa7\xca\x6b\xcc\x05\x46\x5d\x89\x80\xd2\x73\x77\xaf\x37\x0d\xe7\xa7\x04\xe9\xec\x1d\xee\xda\x6d\x92\xb7\x5e\x9c\x4b\xe2\x27\xc1\xc8\x5d\xff\xa3\x5d\xe1\xd2\xa4\x8b\x60\xe0\xe1\xb3\x49\x0b\x9c\x00\x56\x89\xd1\x15\x89\xe9\xb9\xce\x36\x7f\x5a\x7d\x25\x7a\x9d\x02\x35\xee\x5b\xaf\xee\x87\x66\x6d\xcf\xc6\x48\x2f\x58\x1d\xd4\x9b\x63\xbf\x7f\xa1\x16\xc0\x52\xdb\xc1\x0d\x5b\x8f\x43\x2f\x15\xb2\x71\x0e\xe0\xee\xdc\xb8\xdd\xbc\xce\x99\x92\x6a\x55\x69\x7b\x8b\x0c\x6c\x08\x43\x32\x6f\xfc\xde\x3c\xfe\xc0\xfe\xfc\x82\x18\xef\x5c\x9e\xcc\x25\xc5\x12\x0a\x0c\xfc\xa4\xcb\xb6\xb3\x59\x5c\x82\x55\x4b\xd9\xba\x46\x64\x23\xa0\x2e\x58\xc7\xee\x0b\x14\xeb\x74\x52\xab\x0e\xbd\xb0\xa1\x90\x34\xe1\x56\xa4\x5b\x0a\x40\x94\x28\xc4\xeb\xec\x29\x48\x4e\x6c\x01\x31\xe2\xc8\x5d\xd5\x4e\x93\x2e\x0b\x3e\xc1\x4c\xc0\xf9\x66\x07\xff\x49\xe6\xce\xaf\xa1\xb4\xa5\x4b\xd8\xd9\x87\x18\xc3\x38\xeb\x99\x7d\x23\xd3\x0e\x1e\xa1\xd2\xb8\x73\xb6\x2e\x4a\x5e\x75\xf8\xd9\x2d\xd4\x39\x88\x14\x4b\x5b\x1c\x6f\x35\x34\x8b\xd7\xae\xdc\x3a\x77\xb9\x44\x1b\x9d\xf2\xb6\x60\x6c\xda\x9f\x6b\x99\x24\x5a\x08\x67\x28\x96\x56\x39\xfb\xbf\x7c\x54\xd9\x45\xf2\x10\x19\xa4\xdc\x1d\xe8\xfd\xac\x97\x17\xe6\xd1\xfd\x47\xc5\x3c\x2f\x76\x69\xe4\x45\xbb\x0a\x94\xa4\x86\xb7\xc3\x40\xdd\x7f\x5d\xde\x0e\x4c\xf5\xf3\x6a\xb3\xb4\xb4\xb8\x50\xc8\x1f\x5a\xe0\x36\xa8\x35\x92\xf4\x5e\x32\x05\x97\x96\x9c\x57\xe9\xec\x25\xf7\x61\x59\x22\x97\xc8\xc0\xca\x53\xe9\x94\xd6\x52\x84\xe0\x5d\x97\x0a\x24\x7d\xf0\x24\x3c\xbd\x3e\x86\x88\x1e\xdf\x31\xab\x72\x6e\x95\x08\xbf\xd9\xd8\x96\x1b\x1e\x2a\xd6\x9b\x9b\x1d\x49\x00\x7e\xd1\x21\x8c\x68\x15\x97\x57\xc7\x4b\x0c\xdc\x1d\xfc\x3f\xaa\xde\x2e\xd9\x59\x9e\x07\x16\xbd\x3f\xc3\x78\xe7\x75\x2e\x0c\x18\x70\x02\x98\x8f\x9f\xe4\x49\xaa\xf6\xdc\xb7\x5a\xdd\x72\xd6\xae\x5a\x55\x6e\x58\x04\x0c\x18\x5b\x96\xa5\xee\x85\x80\x9c\x8e\x9a\xfc\x3e\xd3\x4a\xce\xc1\xe4\x31\x27\xc1\xf4\xb7\x2c\x7f\x98\xe0\x9f\x21\xfc\xfc\x4c\xa3\xbe\x73\x2d\xdc\x3e\x53\x17\xf7\x92\xca\xec\x7d\xdd\xe3\x66\x7b\x79\x54\x17\x26\xe5\xeb\x79\xd4\x07\x3b\x58\xf0\xf1\x69\x15\xe5\x51\x07\xb1\xf6\xa5\x9e\x52\xd3\x8f\xb2\xc5\x02\xd6\x03\xd3\x5f\x52\xf9\x79\x08\x87\xb7\x88\x47\xa6\xa7\xe0\x61\x13\x30\x72\xf0\x65\xbb\x6b\xf9\xd3\x80\xa7\xa0\xc4\x7e\xa4\x77\xd0\x17\x3d\x40\x95\xe1\x4d\xdc\x7a\xf1\xe3\xa3\x52\xc3\xa9\x43\x7f\xce\x60\xf8\xbb\x78\xd4\x56\x79\x8a\x4d\xaa\xed\x86\xa4\x55\xfd\x48\x4b\x65\x4d\xcc\x02\x1d\xf8\xbf\x89\xf7\x95\x7a\x0f\x68\x71\xc8\xc9\x53\x79\xd3\xfd\x0c\x35\x41\xf6\x07\x66\x53\xfb\xc1\x88\x4b\x67\x63\x28\x27\x5d\x2e\x56\x9a\xf5\xe8\x68\x73\xde\x79\x47\x63\x7c\x83\xa5\xa3\xcf\x69\xfe\x88\x4e\xee\x23\x02\xbb\x8f\xc7\xb9\xfa\xae\xb7\x3b\x11\x66\x4f\xbb\x0e\x92\x3a\x6c\x84\x0e\xdb\xac\xd0\x90\xf9\x3e\x16\x28\x0c\x9c\x8e\x23\x4e\x6d\x76\xcb\x32\x7e\xb6\x9c\xfc\xc5\xa2\xed\x39\x38\xcb\x6e\xf9\x7d\x0d\xc0\x04\xe0\x39\xc6\x71\x0d\xb9\x88\x19\xce\x0a\xef\x0e\x67\xeb\xe5\xeb\x8b\xaf\x60\xae\xef\x41\x7c\x80\x8d\x54\xdf\x8c\x07\xf7\x14\xc3\x88\xb0\xcf\x88\xbd\x23\x36\x48\xdd\xa7\xbc\x5f\x9b\xc3\x50\xd8\xc3\x40\x4c\xd6\xe7\xba\x93\xd3\xad\x56\x95\x9b\xa8\xf5\x16\xeb\x10\x0b\xd1\x59\x57\x49\x04\xd9\x46\xe5\xc4\xc5\xd0\x1a\x22\x84\x33\x86\x81\xa2\x9a\xcc\x6d\x21\xca\x70\xb0\x82\xcc\x75\x22\x03\x8d\x01\xa6\xae\x19\x68\x4f\xd6\x5e\xa8\xfd\xe6\x0a\x4e\xc3\x58\xd1\x87\x0e\x9b\x17\x79\x0c\xf6\xb6\xaa\x99\xed\x5c\x38\x30\x92\xe9\x2f\x3c\x19\x10\xe5\x03\xbb\x3f\xa1\xf8\x82\x90\x04\x78\xf1\x37\x5b\x63\x21\x2c\x5b\x5a\x1b\xe3\x1f\x6f\xd8\x5b\xbb\x5c\xeb\x33\x5c\x14\x3f\x1e\x40\xf4\x2c\x24\xc3\x8b\x26\x93\x3d\x76\x0e\xb3\x48\x2f\x8e\x20\x66\x74\xf9\xd3\x60\xc6\x13\x57\x64\x0e\x02\x3d\xe4\x09\xfe\xe4\x06\xc1\x7d\x12\xf4\x78\x7f\xe8\xf4\x22\x0a\x90\xf1\x01\x41\xef\xa7\xaa\xd8\xa7\xaa\x1d\x8b\x96\x61\xe7\xfc\xa3\xc5\x81\xef\x23\x18\xef\xe0\x03\xd9\x42\xc9\x1b\x84\x7d\x75\xd3\x55\xcb\x26\x1a\x3a\x30\xb5\xb0\xfa\x25\x18\x73\xe6\x3c\x91\xff\x79\xce\xe3\x78\xe8\x07\xea\x95\x67\x30\xb7\x74\xe2\xb5\xcb\x9e\xa3\xbf\x09\xc6\xb3\x84\xb4\x3b\x6b\x02\xe6\xbe\xc8\x93\x9d\xd3\x5b\x77\x8c\xa5\xe0\xb8\x12\xd6\x93\x38\x7d\x83\x33\x55\xc2\x51\x73\x0a\x82\xbd\xe3\xfd\xa3\xee\x3b\x79\xd4\x11\x4a\x62\x4e\xdd\xc7\xd2\xd9\xe2\xb4\x6f\x50\xc3\x4c\x4e\x66\xd9\xf6\xe6\x55\xa4\x7c\xa1\x88\x37\xd3\x47\x60\x03\xa3\x08\x05\x23\xc5\x0d\x2e\xa9\x68\xe7\xa9\xc4\x47\x43\x02\x3e\xd5\x74\x26\xc5\xe0\x14\xe4\x7c\x41\x5b\x69\xa6\x75\x63\x4e\x4c\xb9\x71\xf0\x21\xb6\x48\x0e\xc5\x99\x74\xda\x73\xb2\x7e\xcc\x03\x4f\xa7\x17\x16\x6d\xc8\x90\x75\xdb\x15\xd4\xb9\x03\x93\xb8\x7a\xba\x49\x60\x6b\x25\x59\x6d\x9a\xd6\xd0\xd4\x3c\x25\xd3\x2d\x6e\x3e\x0a\x2d\x80\xe1\x2f\x18\x21\xc0\xe7\xe7\x95\x98\xee\x01\xbe\x52\x7e\x6b\x13\xa6\xb8\x24\xcd\xba\x91\x5a\x76\x90\x73\xcf\x3a\x2c\xce\xf0\x0d\x92\x48\x0b\x0b\x8d\x2c\xcf\xd3\x0c\xbe\x51\x58\xe7\x36\xd4\xb1\x83\x06\xf7\xde\x15\x68\x09\x22\xbd\x90\x59\x9c\x8e\xfc\x4e\xe4\xf0\xcb\x8d\x98\xb0\x51\x5e\x4c\x8a\x9c\xb4\xb2\x9d\xf8\xf7\xaf\x6d\x8b\x5d\x1b\x67\x86\x58\xd1\x8a\x7f\x76\x4a\x42\x9e\x2a\x17\x4d\x27\x08\x46\xf9\xff\x6c\x04\x0b\x8a\x40\x0c\x66\x71\x62\x28\xc7\x89\x80\x8f\x87\xf9\xf2\x1a\x09\xef\x18\xbe\x35\x55\x67\xc7\x12\x1c\x74\x7b\xc8\x14\x22\x8b\x5a\xdd\x5c\x83\x42\x30\x31\x05\x6b\xaa\x6d\xdd\x0c\x74\x7d\xab\xf8\xfa\x1a\x5b\x9f\x7d\xc5\x25\xc2\x4d\xa6\xca\x14\x65\x1b\xed\xbe\x64\x37\xab\x64\xb0\x03\xb7\x32\xaf\xb6\x78\x02\x92\x6c\x2c\x6d\xc5\x46\x52\x07\x39\x89\xf4\x8c\x32\x51\x01\xf9\xaf\x42\x2f\xef\xc4\xf9\xbd\x5f\xac\xac\x8b\xf6\x41\x5c\x54\x04\x7d\x25\x7c\x3c\x13\x13\x86\x06\x42\xaf\x7d\x28\xca\x4d\xe1\x90\x05\x9b\x9e\x0f\xeb\x93\xf3\xf3\xfc\x47\x2e\xbd\x5b\xf3\x51\xe7\xd5\xc3\xfc\xf4\xe4\xa6\x73\x54\xea\xa1\xe7\x83\xb3\x08\x00\xbe\x92\x1c\x99\x59\x86\x0a\x49\xf7\x40\x06\x9c\xff\x13\x93\x1e\x69\xe8\x48\x50\x6f\x05\x96\xcf\x48\xb7\xc7\x34\x70\x9b\x37\x1d\x37\x7f\x5e\xae\x89\x8d\x0d\x0a\x74\xc1\xa3\x37\x47\x5e\xb3\x4d\x27\x0e\xef\xa3\xa7\xf4\x6a\x32\x1e\xce\x9a\x17\x6c\x76\xd7\x0c\x05\xfd\xcc\x8d\xb5\x0a\x4c\xa2\x91\xe3\x67\x95\x22\xbc\x12\x7c\x75\x65\x6a\x7c\x75\xcb\x0f\xfc\xf6\x89\xba\x77\x6a\xb1\xe9\x13\xc9\xe0\x26\x65\x41\x4d\x49\xa6\xd3\x18\x64\x9d\x60\xa1\xfb\x90\x83\x8e\x52\xaf\xe3\xfd\x28\x92\x5d\x1f\xef\xf9\x28\x41\x07\x77\x67\xf2\xbe\x49\x60\x7c\x64\x1c\x0e\xd9\xd2\xc0\x38\x40\x27\x09\xb8\xe6\xc8\x31\x6e\x7d\x77\x09\xfe\xb9\x0c\xd6\x1d\xfe\x2a\x77\xb1\x4f\x84\x76\xa0\x36\x0d\x90\x1b\x87\xdf\x18\x91\xd6\x4e\x08\xe4\xef\x66\xac\xff\x7c\x46\xe2\x7b\x2b\x32\x51\x17\x31\xc5\x35\x4e\xb6\x7a\x70\x68\x1e\xf1\x45\x9c\xea\x6b\x47\xa4\xfd\x91\x97\x8e\x94\xc1\x8e\x06\xba\xc7\x46\x86\x84\x8e\xf0\x77\x71\x91\xc9\x06\xfe\xfb\x60\x1e\x30\x88\xe5\xe6\xc6\x28\xb7\x51\x4c\x65\x04\x2b\x10\x98\x80\xb5\xa2\x65\xdb\xea\x68\x0c\x69\x7a\x3f\xd2\xba\xb6\xc2\x87\xf2\xb1\xbc\x72\x5f\x9d\x1f\x78\x2c\x3f\x35\xa8\xb1\xd4\x48\x17\x35\xc3\xf0\xee\x39\x5b\x1a\xa3\x07\x1b\x8b\xf5\xac\xbe\x24\x38\x7a\x96\xd2\x40\x38\x0c\xa2\xca\x1d\x41\x15\x49\xf7\xe0\xc8\xf9\x94\xff\x2a\x22\xca\xc7\xbc\x92\x70\xce\x5e\x83\xdf\x72\x9e\x83\xdc\x2e\x4b\x2c\x6b\x04\x3f\xa1\x97\x8d\xca\x2e\xbd\x5f\x02\x60\xbe\xd7\xbb\xf2\x14\x64\xfe\x02\x4c\x9b\x66\xdd\x0b\x33\xfd\xdd\x80\xa8\xeb\x8e\xc3\xec\xc9\x24\x28\x5e\xbb\x43\x54\x00\x63\x23\x33\x19\x29\x7d\x34\xa6\x45\xe3\x92\x21\x27\x66\xb1\xf2\xf9\xcb\x1f\x1b\x45\x2c\x02\x36\xbb\xca\x7a\x14\x11\xf9\x99\x05\xc6\x85\x93\x51\xb6\x18\xe9\xed\x08\x90\x75\x45\x9f\xd1\x98\xf8\xa5\xe5\x8f\xdd\x80\xfc\xdf\xf9\xc3\xfe\x13\x1e\x36\x3a\xa3\xf2\x8b\x49\xc4\x6e\x28\x20\x38\x99\x04\x74\x88\xec\x77\x87\x70\x3e\xf7\xca\xc5\x19\x10\x27\x85\x63\x29\x87\x2b\x27\x6b\xb5\x16\xcd\xe7\x40\x9c\xac\xf0\xc6\xc9\x10\x14\x75\x58\x8a\xde\x3a\xef\xbc\xad\x4c\xb1\x38\x64\x01\x32\xc3\x22\x83\xfd\xc1\x07\xf7\xcc\x00\x30\xc4\x5d\x71\x56\xe3\x76\xd8\x27\x40\xd0\xe2\x5d\x5f\x2d\xfb\x99\x49\x96\x3e\x59\x04\x7a\x5a\x87\xcd\x9e\x8a\xe7\x40\x0e\x69\xac\x4a\x1d\xdc\x63\xa6\x11\x33\xbb\xb3\x66\x2e\x7e\x42\x7c\xae\xf2\x40\x80\x46\xd9\xcb\xf9\x88\x5f\xcf\x47\x8c\x63\x79\xa2\xba\x64\x36\x13\xe4\xed\xa5\x42\xfc\xf3\xc8\x1c\x26\xc4\xc3\xf2\x3b\xcb\xc3\xea\x41\x61\xfe\xa0\x20\x00\x7a\x89\x75\xef\x19\xef\x28\x23\x0a\x89\x57\x68\x31\xd0\x19\xe1\xb6\x7c\x4b\x9a\x27\x65\x17\xec\x59\xc8\xcd\x67\xd3\x6d\x0e\x1c\xc8\x90\x0f\x36\x52\x70\xf4\xdd\x85\x19\xc8\xc3\x47\x9c\x7c\x36\x0c\x47\x27\x64\x1b\x6e\x94\x0f\x58\xed\x97\x0b\x83\x38\x0b\x93\xc4\x71\xc0\x62\xd0\x22\xc0\xe6\x69\xa8\xe8\x5f\xec\x5e\x49\x1b\x56\x1d\x21\x9a\xe9\x14\xc9\xdf\x09\x65\x2a\xc1\x5c\x44\xf1\xb7\x6d\x1e\x61\x6a\x40\xf4\x77\xf7\xa6\x25\xa4\x81\x4b\xb1\xc3\x0d\x55\x16\x02\xa6\x6b\x0f\x77\x51\x73\x1e\x6e\xc6\x5d\x0f\xf7\x98\xc9\x3a\xd8\x57\xde\x9a\x47\x27\x64\xc1\xff\xc8\x0c\xe8\xa4\x7a\x20\x93\xc9\x04\xfe\xdd\x0d\x47\xfd\x99\xe7\xb6\xf1\xe4\x3f\x0b\x12\xae\xf8\xff\xf4\x56\x6c\x93\x41\xf1\x01\xda\x97\xef\x97\x93\x65\x33\xd4\xfb\xc9\x47\x5a\x11\x0b\x40\x20\x0e\xbf\x43\x56\x90\xa1\x8d\xcc\x88\x55\x2e\x61\x46\x63\x88\xc6\xce\xe6\x74\x2f\xd1\xff\xc1\x83\xe1\x0f\x0f\xa2\x18\x5e\x32\xba\x60\xa8\x72\x65\x0f\xc5\x17\x88\x86\xf2\x2a\x36\x18\x92\x4c\x75\x28\x52\x6d\x1c\x8a\x12\xe6\x0c\x60\xd9\x4f\xfb\x3a\x9e\xb2\xec\x12\xda\x1c\x1a\x69\xf9\x50\x96\xfb\xab\x73\x60\xb0\x24\x0f\x63\x21\xd3\x2f\x77\x8f\xb1\x10\x32\xc0\xa9\xa5\x06\xc3\xa8\x4b\x21\x45\x9a\xc0\x22\x63\xe3\x07\x7a\xea\x40\x50\xd3\x25\x2a\xc6\xd8\x46\x3e\xe9\x94\x1b\xf2\xbf\x96\xfe\x3b\x38\x8d\x4b\x16\xe2\x4b\xce\xaf\x7a\x91\x4d\x0f\x89\xa8\xe0\x1f\x3e\xb9\xc5\xe8\xf8\x21\xbb\xbb\x58\x8d\x06\x92\xdc\xf4\x39\x18\x2c\x72\x9b\x0c\x98\x15\x9e\x22\x05\x64\x23\xcc\xc8\x7d\x21\xc9\x1f\xd2\x48\x08\xc2\x6f\x68\xd0\xd9\x57\x79\x1d\x39\xe7\x07\xac\xd2\xb0\xee\x36\x5b\x14\x0d\x64\xde\x29\xb2\x07\x1e\xc1\x8f\x76\x6d\x55\x84\x84\x14\xc6\x1b\x5a\x25\xb6\x70\x16\x03\x3e\xb5\x4f\x17\x59\x83\x06\x70\x0d\xf2\x3f\x03\x3d\x7f\x6f\xf5\x3b\xb8\xde\x33\x60\x72\x19\x74\x82\x2f\xfe\x20\x56\xa2\x86\x90\x17\x1b\xd0\x47\xeb\x66\x97\xb9\x7e\x84\xa6\x43\xda\x7d\xc0\x52\xa6\x37\xd8\x33\x22\x0c\x54\x84\x85\xa0\xfc\xa1\x1b\xbc\x3f\x02\x9c\xe6\x18\xb2\x31\x42\xf7\xa9\x40\x6b\x03\xe3\x2f\x82\x76\xc8\x39\x1e\x4d\x4f\x22\x98\xc1\xe3\xd0\x1c\x74\x95\x27\x71\x82\x1d\x47\xa1\x25\xeb\x14\x85\x24\xf0\x31\x28\x26\x44\x1b\xb3\x0a\xbf\x6a\xc9\x02\x0e\xa2\x9e\x74\xc7\x96\x5e\x38\x03\xa7\x86\x24\x4e\x42\x36\x09\xeb\xea\xc4\x6d\x58\x29\xfe\x33\x90\xef\x63\x48\x4d\xfe\x1a\x4c\x86\xfc\x3c\xa8\x0f\x37\xa4\xc6\xc1\x60\x90\x62\xaa\x03\x88\x27\xbc\x7c\xea\x62\x6a\x0a\x29\x42\x8e\x07\x19\x92\x43\x8c\xab\x06\x26\xd6\x91\xae\x81\xfe\x8b\xb5\x62\x5d\xd3\x36\xf6\xc6\x9f\x0c\x7a\x30\x52\xbc\x99\x79\xc2\x14\xaa\xde\x0d\xaa\xaa\x9d\x9d\x93\x5e\xf5\x9c\x35\x7a\x4c\x5d\xfc\x0b\x29\x3f\xe2\x3d\xf4\xc4\x67\x1d\xd1\x75\x1a\xbb\xfb\x13\x09\x6b\x78\x72\xfd\xf1\xb9\x82\xb2\x30\x42\x62\x7a\x74\x78\xc1\xdb\xef\x1b\x6d\x37\xed\x94\x3e\x74\xc6\xfa\xa3\xb4\xdf\x20\x08\x5a\x64\x83\x98\x1e\x92\x43\x31\xbb\x4f\xd6\x4a\xd1\xa3\x21\x44\xa9\x27\x28\x53\x0d\xc0\xbb\x34\xd4\xb1\x74\x05\xad\x45\xff\xe6\x24\xa5\xaf\x1f\xf8\xa6\x83\x55\xf0\x1d\x64\x86\x11\x50\xd5\x23\x1c\x9f\x24\x6b\xce\xaf\x48\x70\xb6\x5d\x67\x12\x0d\xe3\x9f\x49\xb5\x6d\x78\x12\x04\x69\x18\xc5\x05\xc7\x00\x26\x2b\x98\x5e\x0d\xd6\xc5\x74\x73\x17\x82\x97\x44\x7d\x78\x40\x6c\xf1\x20\x14\xf5\x5e\x3d\x9e\xb7\x7e\x91\xc9\x1d\x67\x63\x30\x17\xe8\x7b\xd0\x7e\xea\xa0\x14\x19\x69\x7d\xdd\xa4\xac\xd9\x23\xb2\x28\x7e\xb3\x9d\x37\xbe\x26\xe1\x4b\xa4\x4c\x86\x2b\x03\x27\x40\xf4\x41\xd2\x39\xd0\x5c\xf1\x37\x2b\x13\xee\xa0\xe7\x79\x16\x01\x56\x65\x41\xd0\x0b\x67\xc4\xa0\x74\x0c\xdd\x05\xa7\x77\x0c\x06\xc9\x85\x61\xf8\x08\x72\x7b\xab\xbc\x8e\x5b\xd4\xdb\x64\x79\x3c\x7e\x50\x92\xfa\x3d\x42\x8f\xbc\x9c\xe2\x26\x86\xe0\xa9\x1c\x86\x20\x9d\xec\x9f\x22\xd4\xab\x58\xe5\x0c\x01\xe5\xbe\xca\x3f\xd1\x2f\x11\xc1\x05\x24\xee\xc7\xaa\x44\x16\x43\x4f\x1e\x04\x6d\x80\x95\x68\xc3\xca\xd3\x42\x3c\x8e\xfc\xb7\xcf\xab\xd9\x84\xac\x79\xc7\x97\x54\x8e\xe0\x03\x2c\x47\x52\x63\x2a\xd6\x6c\xbd\xd2\x90\xd0\xe5\x33\x36\x9b\x83\x2d\xb9\x74\x41\x34\x3a\xdf\xd4\x6c\x82\x7e\x9c\xdf\x86\x73\x39\xea\xd3\x37\x83\x6a\xe5\x3f\x11\x69\xae\xef\x8d\x8c\x8e\x27\xa1\xaa\x32\xbb\x2a\x73\x11\xe4\x4f\xf2\xfd\x3a\x48\xed\x81\x98\xdd\x45\x3b\x4f\x3d\x15\xd0\xaf\x71\xf0\x85\x41\xcc\x93\xd8\x8c\x94\xc4\xf8\x10\x9f\x27\x4d\xb8\x53\x3f\xea\xf9\xcd\x69\x0f\x5a\x4f\x83\xca\x38\x07\xdf\xa3\xb2\xf5\xfb\x7c\xf4\x2c\x17\x2e\xa5\xf7\x79\x09\xf2\x42\x66\xb4\xf4\x08\xee\x0d\xf6\xc3\xeb\x0a\x42\x44\x6b\x77\x49\x74\x90\x57\xb2\x8e\x48\xe4\x82\x8d\xee\xb1\xfe\x36\xb9\x12\x0c\x26\xc7\x70\x9a\xf5\x64\xc8\x4a\x82\x94\x1c\x33\xb4\xeb\xc0\x39\x5a\xa1\xf5\xc9\x72\x3c\x81\x48\x6c\x13\xe3\xe2\xc1\x58\xf8\xd8\x30\x13\x66\x09\xf8\xa2\xeb\xc2\x99\x1f\x15\xba\x01\x9c\x24\x44\x87\x20\x92\xe0\x8c\x70\x4e\xc8\xd8\xbb\x54\x55\xf2\x78\xc2\x29\x4f\x38\xe8\x63\x01\x62\x69\xcf\x61\x08\x1e\xc8\x1f\x8d\xe3\x11\xdf\x60\xf2\xd8\x32\x36\x6d\x7c\x14\xea\x8c\xd2\xb6\x8b\xa5\x92\xf4\xbd\x88\x72\x2a\x90\x9e\xe3\xcf\x25\x7a\x05\xa0\x07\xb1\xa9\x39\x63\xa4\x5e\x4b\x20\x96\xce\x62\xa9\x5e\x26\xc2\x7a\x7a\x9b\xe6\x1d\xfa\x2d\x72\x0a\xf5\x6e\x13\x02\x45\x82\x1c\x12\x5f\x81\x98\x34\xa5\xfa\x06\x9a\x48\xcd\x7a\xfa\x14\x6c\x60\xce\x0f\xf9\xe2\xf8\xd9\x43\xe7\x2d\x08\x36\xbb\x23\x0e\xe8\x24\x30\xd9\xc7\x02\x56\x77\xab\x8f\x77\x42\x49\x96\xc1\x28\x16\x92\x2d\xa0\x95\x2c\xa4\x29\xbb\x35\x5c\x18\x20\xaf\xd7\x7d\xca\x2a\x06\xd2\xbf\x8e\xb6\x2e\x02\xc2\x49\xcd\x71\x3a\x67\x8f\x38\x85\x1a\xe3\xe4\xa4\x20\x23\xc0\x83\xe9\x6e\xe0\xa1\x5c\x58\xaa\x1e\x9c\xab\x75\xf7\xaa\x99\x4f\x77\x2b\x56\xa7\xbb\x1f\x6d\x48\xef\xec\x83\x26\x3b\x5c\x48\x17\x76\x68\xcc\x22\x4a\xbb\xd5\x16\xbb\xe3\x5b\x29\x71\xd0\x1d\x9f\x61\x12\xdd\xe3\xbd\x32\x7c\xcc\x79\x25\xc5\xd3\x47\x8a\x60\xfd\xa8\x3e\x49\x59\xd8\x52\xa8\x9c\xd8\x85\xbc\x7c\xe8\x40\x82\x3e\x92\xdf\x5f\x0b\x06\x75\x7d\xda\xc8\xe5\xe1\xf6\xb9\x89\x4d\x12\xa1\x30\x35\xe0\x46\x06\x97\xae\xf1\x84\xd9\x8b\xfa\xea\xa4\xf6\x95\x15\x51\x4c\x9e\x2d\x40\xc8\x09\xc0\x35\x39\x04\x6e\x3b\xa3\x7a\x56\x01\x91\xc4\x3b\xd6\x3d\x25\x59\x89\x86\x4a\x43\x74\x0e\x74\x07\x27\xd8\x9d\xd8\x30\x6c\xa2\x24\xbe\xcb\xfa\x0e\x0e\xc7\xa0\x02\xe9\x68\x36\x76\x9e\x17\x4e\x0e\x47\x9a\x94\x56\x4a\x4e\xc1\xe3\xea\xc5\x7e\xc9\x4c\x87\xae\x4d\x82\xc0\x37\x39\x1f\x8c\xe3\x35\xcc\x77\x5a\xc9\x85\xd0\x55\xe5\x55\x00\x60\x6e\xc4\x9d\x4b\x7e\x88\x89\xb1\x2e\xa2\x43\xed\xaa\x88\xae\xba\x3a\x71\x8a\x62\x20\xf5\xba\x02\x02\xac\xf9\x74\x6a\x9e\xb7\xe0\x50\x44\x36\x3a\x6f\x72\x48\xa4\xe8\xec\xc8\x10\x5a\x45\x11\x79\x8b\xe0\xbb\x43\x0b\xe3\x7a\x44\xb7\x14\xda\x1c\x06\xb6\xde\x8d\x58\xfb\x78\xd4\x9c\x96\xf4\x19\xf8\x48\x16\x7b\x3b\xa4\xf8\x2b\x92\x22\xb1\x81\xf0\x94\x5a\x59\x57\xb4\x0e\xdd\x95\x08\x86\x75\x22\x48\x71\x68\xba\x92\xb1\x37\xc0\xe2\x8a\x76\x68\xac\x67\xb0\x49\x5a\xaf\xce\x83\x7e\x41\x03\x5d\x89\x98\x3b\xb0\x2a\xfb\x9e\x99\x0e\x97\x6e\xe6\xc1\x59\x46\x54\x97\x25\x1a\x63\xe0\x0a\x16\xaa\x2e\xa8\x0b\x63\xee\xe6\x94\x92\x24\x66\x3c\x83\x5a\x30\x8b\xfd\x11\x54\x87\x3c\xb8\xb1\xcc\x23\x46\xbe\xe4\x1f\x12\x10\x13\x2a\x12\x07\x04\xf2\x36\x89\xd8\x35\x44\x1b\x91\x3d\x20\xc2\x4c\x1b\xd7\x07\x77\xee\x74\x79\xe5\x15\x97\x22\x1a\xc7\xb2\x34\x26\xc8\x7b\xd3\x25\xe7\xf0\xc0\x74\xf6\x33\x31\x10\x66\xfa\xd8\xe0\xf4\x0e\x02\xc8\x1b\x89\x24\x34\xfd\x3a\x10\x9b\x68\xf7\xa4\xfb\x4b\x9f\x9b\xc4\x88\x1f\x31\x16\x7e\xc4\xc7\x8b\x29\x4c\x50\x46\x82\x1e\xf2\x0a\xfa\xc3\x4b\x14\xb5\xa9\x25\x79\x18\x9c\x52\x50\x38\x5e\x30\xc7\xb2\xc8\x1a\xc5\x17\x00\x14\xff\xf6\x20\x16\x00\x2c\xc8\xae\x29\x98\x24\x45\x9f\x01\x38\x89\x83\x12\x6f\xfc\x0c\x18\xf4\x8f\x91\x03\x05\x76\xc8\x60\xdb\x6e\x24\x4f\x5d\x92\x94\x06\xa8\x24\xdb\x7d\x1c\xdd\xcd\xd2\xe6\x2d\x97\x50\x9f\xb6\xe0\x93\xec\x74\x8e\x4d\xc4\x93\x9b\x6a\x18\x3c\x41\x5d\x62\x42\x17\xca\xe9\xe6\xb1\xb4\x4e\xad\x1c\x4a\x90\x42\x8a\x74\x72\xe9\xf9\x5a\xc1\x4d\xc4\x5f\x17\x3e\x2d\x79\x23\xbb\xc4\x06\x9d\xc8\xae\xdf\xa5\x29\xd8\x40\x13\x48\x5b\x74\xde\x81\x6d\xc8\x8c\x09\x3e\xb6\xfe\x79\xf3\xa3\x4a\x5a\x67\xc0\x57\x26\x1d\x93\xf4\xee\x18\xa8\xe7\xb4\x91\xa2\x27\x7c\x25\x34\x2b\x87\x37\x79\x8e\xd2\xad\xf5\xcb\x74\x3f\xfc\xcb\xc0\xfb\x6d\x5e\x53\x84\xa0\xd0\xd0\x01\x45\xa4\x76\xb1\xdf\x49\x71\xce\xe3\x2e\xdf\xfb\xbf\xa0\x80\x74\x10\x7c\x89\xd6\x0d\x86\x13\x9b\x64\x8f\x1b\x11\xfa\xf7\x2b\x76\x43\x86\xd5\x2b\x7c\x3c\x83\x17\x32\x66\xd2\x66\xb5\x9b\xe5\x43\xe6\x43\xf9\x10\xcc\x0e\xb9\x69\xcb\x03\x25\x8a\x3e\x9b\x21\xf2\x26\x67\xa3\xf3\xe3\x6f\x84\xd2\x1a\xf7\x65\x37\xe7\x4c\x44\x88\xbe\x5f\x69\x9b\x38\xaf\x73\x01\xfd\x55\x84\x8b\xee\x3a\xe5\xd9\x26\x0d\x50\xee\xca\x65\x03\xc7\xd8\xf0\xe1\x7f\x7b\xb6\x74\xc4\x19\xb3\x71\xa4\x75\x2d\x07\x79\x0b\xa1\xe3\xd3\xbb\x10\x30\x28\x47\xab\xba\xba\xd4\xe8\x02\x80\xe6\x40\xc1\xeb\xb9\xbc\x8a\xbb\x4c\xdc\xb0\x61\x86\x9a\x41\x5a\x20\x56\xe3\xda\xc9\x8a\x0f\x4c\xd8\xd2\xe7\x11\x9a\x13\x04\x96\x0b\x58\x89\x68\xfc\xa5\xe5\x74\x8e\x2d\x24\x7d\x7d\x78\x63\x2d\xfd\x2b\x2d\x71\x3c\x72\x15\x98\xee\xeb\x51\x3c\xda\x5b\x44\x1f\x96\x3c\xa0\x55\x1c\x94\x20\xdb\x1a\x08\xbb\xd2\x18\x2b\xbb\xe6\x8b\x46\x26\x59\xe1\x0d\xe9\xf1\x95\x20\x9d\x3c\x79\xde\xd9\x49\x95\x2b\x53\xf8\x93\x02\x36\x92\xdd\xb3\x9f\xb5\x0f\x1b\xc8\x1e\x11\xdf\x5c\x2f\xf6\xd0\x3e\x7b\xa4\x6e\xea\x4e\x05\x65\x9a\x81\x76\x93\x68\xd2\x90\x0f\x5f\xa9\x13\x31\x66\xc7\xa9\x28\x32\x62\xb9\x9d\x7d\x02\x03\x79\x1a\xfb\x09\xa7\xe0\x29\x69\x81\xfc\xfb\x71\x15\x80\xef\x2d\xa3\xff\x7b\xaf\xd1\xf4\xbf\x37\x03\x6e\xbf\xf7\xcc\x15\x92\xef\x6d\x83\xe2\x39\xa8\xf6\x5f\x3a\x4a\xad\x50\x7a\xfd\xb7\x1e\xe2\xb4\xfa\x52\x94\x0c\x21\x72\x22\xa4\x34\x34\xa9\xe4\x27\xf2\xe5\x6c\xe8\x8b\x0e\xda\x7d\xa3\x86\xfc\x88\x7c\x90\xfa\xfe\x1b\x91\x12\x5f\x4a\x23\x7e\xf3\xc2\xa0\xdd\x2f\x38\xfc\x58\x0e\x9c\x1f\x7c\xad\x9f\x0f\x52\xcb\x97\x4d\x40\x9d\x15\xd3\x1a\xcf\xd7\x9b\xe1\x17\xd9\x4b\x41\x8b\xb9\xd3\x50\x05\x41\x26\x05\x9b\xbf\xd6\xdf\x89\xc0\xf6\x0b\xba\x5c\x82\x75\x47\x52\x98\xc3\x60\xea\x4c\x36\x89\x7d\x30\x18\x13\x1f\x24\xf7\xd9\x40\xfb\xd5\xe5\xdc\x0e\x28\x82\xb8\xda\x87\x79\xd2\x9f\xdb\xab\x0f\xf6\xcc\x89\x79\x35\x9f\x08\xde\xf9\x38\xd9\xf8\x49\x34\x7b\x77\xe8\x24\x9a\x2c\x19\xeb\xfd\x51\xf7\xfb\xfe\xfc\xb8\x11\x83\x63\xf0\x88\xf8\xc8\xb7\xd5\xa2\xf0\xea\x58\xd2\xfb\xb2\x54\xbc\xdf\xdb\x6c\x28\xd1\x59\x56\x91\x6a\xd6\xa5\x17\x5f\xa3\x35\x19\xb2\x27\xc2\x7e\x92\xd7\xe3\x5d\x17\x8e\x4e\xf0\xb1\x86\x50\xe1\x9b\x4b\xd3\x44\xee\x3d\xb3\x32\x56\x17\xc1\xa6\x65\x36\x39\x09\x22\x1b\xf3\x01\x20\xa9\xec\x0c\x85\x62\xfa\x1b\xcb\xd8\xb7\xb8\x24\x0f\x45\xb0\xbc\x8b\x07\x23\xbc\x0b\x93\xa8\xde\x3c\xe7\xa6\x65\x35\xe8\x0f\x8a\x84\x32\x94\x08\x88\xfa\x80\x24\x61\x2c\xc8\x76\xd0\xf5\xe0\xa4\x0b\x42\xcb\xa0\xed\xb4\x96\xdf\xa0\x59\x86\xa5\xe1\x9f\xbd\xe2\x5b\xdb\x9c\x75\x2b\x39\x88\x1e\xed\xe1\xbe\xe9\x85\x06\x7c\xca\x9c\x04\xd6\x33\x06\x1b\xa6\xe6\xb3\xc0\xa2\xd6\x04\x1b\xe6\xc4\x85\x4a\xe0\xf6\x8c\x7c\xf1\x4c\x84\x9a\x86\x49\x6f\x39\x9b\x8d\x15\x67\xcb\xba\x61\x2c\x9f\x05\x89\xa6\x56\x3c\xdf\xe8\x2c\x82\x1a\x34\x37\x0a\x10\x90\x5e\xa2\xf3\xd0\xee\x9e\x1c\x9b\xe5\x74\x65\xb7\x83\x1b\xdb\x8f\x5d\x53\x89\x49\x06\x94\x6c\x06\xa4\xdf\xf4\x33\xe8\xf1\x79\xa2\xf9\xf0\x7e\xd7\x00\x0f\xa7\x0a\xd2\x5b\x99\xc2\xef\x14\x1a\xd0\xef\xf4\x7b\xed\xe9\xf8\x66\xba\x53\xdf\x18\x08\xff\x09\xe8\xde\x6c\x48\xa4\x7d\xfe\x4e\x62\xd3\x7a\x83\xc8\x24\x4e\xd3\xe8\x2b\x91\xe1\x52\x88\x78\xdf\x50\xb2\x60\xa5\x13\xe8\x5d\x37\x21\x57\xfb\x61\xff\x6d\x9b\x76\x3b\x07\xaf\xbc\xa8\x4f\x76\xa4\x9f\x89\x11\xe4\x9d\x34\xc1\x44\xb4\x40\x10\x77\x16\x5e\xb6\xd0\xb1\xf5\x4e\xf3\x6e\x13\x38\x2e\x45\xda\xc6\x12\x87\xc9\x3c\x7c\x83\xdb\xfa\xb9\xc9\xac\x04\xf1\x26\x0f\x1c\x86\x7a\xef\xa7\xa0\x78\x22\x25\x8e\xf2\xba\x9d\xa0\xc9\xad\xc9\xd7\x3d\x41\x19\x4c\x04\x9c\x27\xe5\x1b\x5e\x9e\xf0\xfb\x24\x62\xde\xd7\xab\x22\x1e\xdf\x01\x95\x1c\x5f\xb0\x9e\x9c\x2a\xb2\x44\x26\x3b\xf8\xb1\x05\xce\x3e\x35\xf2\xcd\x4c\x3a\x4d\xb5\x14\x77\x90\x4e\xe9\xbf\x60\xe1\x74\x4e\x4f\x64\xc6\x93\xe7\xb2\x64\xa9\xbe\xbf\xca\xa0\x3c\x95\x57\xe9\xdd\x8f\xf1\x6a\x81\xc3\x2f\x38\xc9\x5e\x64\xd7\x94\x24\x07\x46\xeb\xe0\xde\xb4\xf7\x3a\x2d\x62\xd7\x3c\xb8\xb0\xfc\x72\x05\xb7\x2c\xd4\x0e\xc4\xa4\x9f\xe4\x5f\x4e\xce\xf9\x9f\x93\x6f\xd2\x12\x78\x71\x92\xf2\x42\x2b\x19\xf8\x3d\xbd\xe0\xf5\xf0\x51\xf0\x05\x17\xcc\x76\x05\xbb\xe6\x79\xaf\xf9\x68\x1b\xfd\x7c\x7f\xb8\xd6\xfe\x82\xfa\x49\xbe\xdf\xf1\x2f\xb0\x94\x05\xaa\xdf\x38\x24\x07\x75\x27\x94\xa7\x96\x67\xec\xc6\x32\x12\xd2\x8b\xdb\x56\xfe\xfd\xe7\xf8\xbe\x53\x9a\xda\xd6\x5b\x73\x75\x6e\xcd\x9f\xdf\x86\x82\xbb\x0d\x9b\x0d\x44\x9a\x38\x60\x46\x8d\x3a\x9b\x27\xff\xbd\x90\xa3\x13\xb1\x10\x34\x97\x0d\xf7\x4e\xf6\xfe\x9f\x58\x3c\xfb\x2a\x34\x24\x22\xd9\x4e\xf7\x61\x0f\xd0\x73\xd1\x6e\xef\x33\xb3\xb4\x65\xef\x0d\x51\xc1\x01\x55\x32\x50\xda\x13\x21\xfa\x16\x89\x79\x8f\x63\x78\xc0\x6d\x2a\xcb\xd5\x83\x9b\xcc\x10\xd7\xe7\xfc\xba\xad\x6f\x80\xdc\x99\x9f\x55\x94\xa0\xbe\xfe\x70\x7d\x12\x43\x48\xcc\xe6\xdc\xdc\x89\x75\xdd\x0c\x52\xb9\xee\x53\x93\xb6\xeb\xd6\xe4\x0e\x64\xa0\x31\x1b\x05\x8e\x9d\x1e\x02\xe1\x27\xbf\x77\x1a\xcb\xd7\xfd\x14\x7d\xe8\xe8\x33\x99\x8b\xe2\x3c\xd7\x2d\xba\x50\xb6\x42\x27\x26\x94\xb1\x77\x9d\xb7\xfd\xb9\xf3\xcc\x4a\x1b\x42\xdd\x3e\xf5\xfc\xdc\xe0\x32\x3d\xca\x8b\xeb\x45\x86\xf6\xbd\x04\x00\x87\x57\xe6\xc6\xfa\x3b\x94\xbe\x3e\x07\xfe\x8c\x0c\x71\x2c\x07\xe8\x48\x3a\x9a\x5f\x85\xb6\xdc\x15\xca\x6f\xd7\x91\x3c\xc7\x97\xd0\x6d\x23\x2b\x9d\xc9\x12\x6b\x0f\xfe\xb3\x7a\xb1\x09\x5f\x2e\xc0\xa1\x10\x2a\x6c\x68\xe9\xe8\x92\x5f\x1f\xd9\x26\x0b\x4b\x4e\xc4\xcc\xde\x6d\x2a\x7d\x57\xa9\x93\x75\x90\xde\x26\xc4\xa5\x74\x81\x2d\xee\x24\x98\xc2\xcd\x73\x05\x03\xe5\xe5\xe1\x15\x0e\x98\x5a\x82\x92\xf7\x5d\xbc\x7f\xb8\x20\x68\xce\x43\x21\x5b\x14\xcc\xa2\x47\x8d\xd8\x42\xa8\x91\x6c\xa7\xd6\xf7\xaf\xa6\x44\x8e\x04\x4b\xed\x2a\xd1\x8a\x00\xff\x13\x19\xa9\x4e\x49\x82\x19\xb3\xd3\x2f\x95\xc1\x4e\xba\xc4\x6c\xc0\xf0\x20\x92\xd1\x3b\x22\x40\xd0\x9e\x6d\xce\xe5\xe6\x4f\x5b\x91\x41\xfe\x26\x1b\x67\xde\x47\x1d\x86\x5b\x67\x2d\xf3\xaa\x80\x3f\x43\x34\xb2\x2e\x0f\xdd\x28\xfc\x85\x72\xab\xc1\x5f\xaa\x9f\x26\xb9\xa3\x6c\xb2\x90\x9e\x74\x5b\x5c\x50\xb1\x3b\x09\xa2\x26\x98\xd1\x4d\xca\x12\xb6\x8d\x9d\x3f\xd9\x82\x3d\x55\xaf\x88\x3c\xcb\x56\x88\xfe\x35\x31\x4c\xef\x4a\xd2\x75\x82\x77\x34\x14\xef\x2e\x9b\x6b\x7f\x18\xb0\x03\xc8\xcf\x02\x74\x65\x5e\x72\x31\xe3\xb2\x67\x72\x9e\x81\xbc\xe8\x62\x55\x0d\xbc\xa7\xce\xab\xf5\xe5\xba\x88\x95\xce\x3b\xf7\xa5\x61\x6b\xa5\x2f\x0b\x9d\x1f\x91\x40\x7e\x16\x11\xcc\x7d\x44\x29\x66\x96\x5e\xe3\x40\x9d\x64\x61\x9d\xd6\x57\x9e\x8d\xc9\x94\x5c\x5e\x36\xd6\x1f\x01\xfc\xb5\x19\x48\xdb\x27\x40\x0e\xb6\xd3\xeb\x5d\x6f\x9e\x43\x5c\x5e\x6f\x11\x30\x9c\x91\xb3\x73\xde\x47\x80\x6d\xe8\x16\xff\x32\x48\x64\x7a\x92\x01\x91\xa4\xa6\x89\xdc\xa5\xe8\xd4\x93\xf8\x4d\xc9\xe1\x76\x4f\x91\x48\x73\xde\x20\xe5\x0f\x79\x86\xd3\x7b\x11\x82\x9d\x1c\xa4\x66\x6b\x07\x43\xe9\xbd\x6a\x9f\xcd\xce\x9f\xcc\x86\x20\x11\xf9\x29\xa4\x59\xaf\xc3\xc6\xca\x78\x89\x14\x09\x29\x50\xdf\xaf\x7e\x94\x6e\x27\x57\xbb\xa0\xad\xc6\x39\x38\xf0\xa3\xce\x41\x0c\x5a\x19\x93\xe2\xae\x20\x9d\x14\xbc\x08\x1f\xf1\xd6\xf8\x56\x8b\xfc\x06\x7b\x29\x23\xb2\x0d\x3d\xc5\x03\x5a\x9f\xba\xa5\x0a\x37\xdc\x22\xd8\x28\x58\x6b\xd0\x02\x3b\x0c\x33\xce\x37\x82\xbf\xd4\xe0\x20\x5e\xd8\xab\x8a\x7d\xcf\x49\x50\x83\x0e\x35\x2f\x24\x29\x2d\xc7\x24\x6e\x53\x30\x86\x10\x59\x33\x88\xf3\x23\x32\x22\x60\xf0\x7f\x42\xe5\x82\xf1\x9b\xa0\x02\xe2\x63\xc5\x12\xd0\x25\x12\xd5\xb2\x35\x2e\xbf\xeb\x8f\x99\xe9\x1b\x0a\x03\x3f\x9d\x4e\xf8\x78\xd3\xff\x80\x2d\xf1\xfa\xd9\x17\x78\x90\x1f\xd2\xbe\xbb\xf1\x4f\x52\x0d\x62\x31\x4e\x5e\xc0\xac\x7a\x55\xb9\x49\x11\x43\xbf\x6a\x8d\xe3\x9e\x99\x8f\x3f\x89\x60\xee\x32\x83\x6d\x0b\x8a\x0c\xdb\x9a\xb6\xc2\xb1\xc6\x70\x56\x1c\x97\xc1\xe4\x8f\xe6\x10\x8b\x1d\xc8\x97\x48\x80\x2a\xed\x28\x50\x77\x6d\x4f\x31\xa7\x3a\xa3\xd1\x22\xd8\xb8\x65\xf7\x43\x5d\x0b\xd0\x16\xe4\xaa\x62\xd9\xdc\xcb\xab\x11\xb1\x26\x96\x66\x6a\x68\x0f\x83\xee\x01\xa4\x54\xed\x54\xac\x6f\x02\xfe\x2b\xfb\x9b\x26\x14\x95\xe0\xce\xe4\x0c\x04\xa5\xe8\x21\x81\xe8\x26\x10\xdf\xfe\x8f\x93\xf5\x9a\x35\xa3\x3b\xeb\xe9\xbd\xe9\x29\x19\xa7\xb3\x56\x2d\xc9\x9e\x1e\x3d\xe4\xcf\xa3\x32\x31\xfc\x24\x67\x89\x15\x3c\x9b\x07\x92\xfa\x53\xad\x43\xcb\x31\x3b\xab\x1c\x14\x67\xed\xd8\x6d\xac\x4c\x7d\xb5\x32\x24\x07\xce\xb5\x5c\xf3\x83\xc0\x2b\xdd\x42\xa2\xa1\xaa\x27\x90\xb7\x86\x74\x43\x0b\x83\xea\xcf\x67\x15\x8f\xcc\xa9\xf4\x39\xc2\xae\x11\x3b\x3f\x33\x3f\xe5\x27\x47\x15\x2b\xc7\x42\x76\xaa\xb3\x90\x95\xe2\x2c\x7f\xb8\x9f\x83\x12\xec\x2c\xe2\xc9\xa5\xea\xd0\x69\xef\xa6\xa7\x00\x1a\x74\x15\x7b\xd1\x9f\xae\x7b\x1c\xbd\x8a\x66\xd6\xec\x04\x9a\xc8\xa4\x52\xd5\xcc\xf0\x2c\x41\xe0\x59\xf2\xf4\xd6\x94\xf3\x2c\x43\xf0\xb0\x0e\x9c\x18\x9c\xe0\x82\x15\xdd\xe9\xbd\xaa\x8b\x9a\x6f\x2e\x1d\x39\x96\xb6\x26\x16\xc9\x3a\x96\xfb\xe5\xee\xcf\x13\x69\x3b\x1f\x02\xe4\xd4\xe8\x2d\xfb\xc2\x73\xa3\x81\x01\x69\x54\xfb\xea\xb0\xd0\x2c\x4a\x03\xc3\xe3\x21\x6a\xd6\xd2\x58\x35\xe7\x88\x1b\x3c\x83\x74\x73\xce\x22\x79\xcd\x20\x81\x62\xed\xf2\xd2\x7a\xc5\x39\xc7\x2f\xd5\x15\xce\xae\x9d\x2c\xb4\x6b\x42\x87\xf5\x79\xdc\x31\xa7\x35\xe7\x6f\xfd\xd9\x65\x20\xff\x7e\xd9\x3f\x82\xcb\x59\x5e\xe6\x73\x14\xcb\xd5\xc9\x34\x9c\x33\xff\x8b\x8e\xc3\x1e\xf0\x47\x25\x59\x4b\xf3\xa5\x96\x4a\x8d\x9d\x33\x8b\x6b\x39\xc7\x97\x8c\x53\x29\xba\xcd\xf0\x40\x79\x66\xb0\x2f\x42\xfa\xd0\xe1\x32\xd4\x35\xd6\x38\xce\x0c\xb6\x5c\xf5\x25\x39\xe8\x98\xa1\x32\xc5\x5c\x82\xb3\x09\xab\x9e\x66\x1e\xfb\x47\x83\x05\x7a\x5e\x49\x7c\x9f\x99\xf1\x7d\x67\x0e\x85\x22\x27\xb7\x4a\x07\xa9\x3e\x8f\xaa\xfb\x66\xa0\x8a\xa3\x02\xc6\xab\x24\x78\x04\xd7\x68\x1b\x74\x9d\x8c\x35\xb8\x58\xef\xb5\x51\x8d\xde\x12\xd1\x01\xec\x23\xa7\xbf\x6d\x10\x1f\x25\x37\x1a\xd2\x83\xce\x33\x47\x76\x6b\x8b\x7e\x5b\x39\x73\xd6\x86\x9d\xf4\x2b\xf8\xe3\x5d\x1d\xa3\xa6\x22\x5d\x72\x02\x56\x09\xda\xf8\x42\x65\x1b\x27\x20\x6c\x79\x05\x9d\xea\x5a\xe8\x22\x70\xbe\x55\x32\x83\x3b\xd5\x62\x3c\x01\xa8\xf0\x9c\x8d\xb2\x75\x09\xba\x7d\x60\x9b\x52\xff\xf8\x59\x39\x3d\x73\x34\xb6\x9d\xa0\xcb\x21\x85\xad\x35\xd8\x6f\xec\xce\xe2\xba\x04\xb4\xf9\x78\x3b\x79\x70\x90\xe3\xd1\xec\x6d\x6f\x6a\x07\xa7\xc4\xea\xc1\x2b\x78\x15\x11\x22\xf7\xd6\x34\xe9\xf1\x3a\xed\x6a\xa1\x17\x71\x42\x45\x94\xe4\xa3\xf1\x82\xcd\x70\x9c\xb8\x00\x7c\xa6\xfb\xc5\xd0\xe7\x33\x18\xce\xd1\x76\xb5\xa8\x7a\x8a\x9c\x37\x41\xda\x59\x88\x5c\x52\x8e\x37\xe5\x21\x9d\x14\x6b\x12\x4a\xcb\xad\xd6\x81\x8d\xfe\xb8\xc5\xa1\xba\x81\x60\xbb\x08\x8b\x5b\xe4\x54\x26\xc4\xe9\x32\x4d\x02\x31\x43\x3a\x13\x38\xe2\x1b\xdd\x2b\x34\x65\x64\xe7\xc1\x15\xae\x3a\xc0\x80\xe7\x19\xac\xcd\x7e\x09\x44\xe8\xfa\x64\x4c\xad\x81\x46\x0d\x9d\x1e\x03\x3f\x3f\x2e\xd8\x9c\x69\x42\x14\x94\x23\xeb\x6b\x48\x27\xab\x78\x9e\x13\xf2\x5e\x2a\xc9\x04\xf9\x91\x96\x52\x38\xaf\x0f\x1b\xa4\x62\xda\x62\x38\x79\x71\x32\xe3\x05\x20\x89\xc1\x95\x14\xaa\xb7\x98\x89\x0c\x04\x7b\xda\xd1\xa6\x0d\xc7\xbd\x93\xc7\xf2\xfe\x65\xd9\x1d\xb7\x48\xde\x0c\x58\xff\x27\x6e\xcc\x3b\xdc\x39\x07\x0c\x0e\x85\xdf\x1f\xb7\x02\x67\xc0\xfe\x2a\x8f\x07\xa0\x17\x6c\x1c\xc7\x6d\x1d\x1a\x0f\xf1\xd5\x4e\x21\xb2\x8b\xda\xb0\xeb\x1d\x3c\xac\x88\x1f\x9d\xd8\x21\xbd\x44\x04\xb3\x4c\xb9\x0b\xa4\x4c\x00\x86\xb8\x34\xf6\xd5\x93\x9e\x70\x4c\x5f\xd9\xda\xb0\x0c\x1e\xe1\x9a\x58\x4a\x21\x7d\x29\x03\x56\x10\xe3\xa2\x78\x7f\x64\x6e\x89\xc0\x54\xc4\x99\x95\x6b\xa1\xf6\x5c\xf3\x29\x07\x04\xf0\xa2\x3a\xb5\x53\xfe\x54\xe1\x1d\x8f\x0d\xd3\x3f\x76\x54\x19\x4b\x47\x15\xad\xed\xcc\x0c\x1f\x80\x2e\x7c\x11\xb6\xd1\x28\x6c\x67\x71\xbc\x86\x60\xa1\x04\x93\xad\x38\xa2\xf6\x79\x96\x81\x00\x95\x00\xef\x36\x8e\x3a\xd8\xa4\xd8\x93\x25\x0d\xfe\x61\xba\x75\x03\x88\x61\x32\x47\x8d\x67\x5f\x3b\x31\xd1\xa6\xa1\xf7\x2f\xd8\x99\x63\x49\xe1\x6b\x03\x7f\x56\xc3\x2a\x2f\x86\xf0\x02\x1c\x62\x88\x3d\x45\x2f\x1b\x69\x6b\xf4\x04\x48\xc1\xc0\x36\xc8\x1c\x4c\x41\x2a\xd4\x37\x04\x55\x98\x11\x13\xec\xb1\x9b\x7c\x5a\x87\x2f\xd5\xfb\xed\x95\xac\xc4\xf7\xc3\x5d\xcb\x9b\x10\x8f\x52\x2e\x14\xba\x65\xb2\xf3\xba\x55\xd0\x12\x93\x8f\xb9\x7a\xa4\x0e\x78\x64\xfd\x21\xda\x74\x59\x59\xa4\xc7\xcc\x20\x9e\x03\xd6\xb5\x5f\x08\x71\xcf\x22\x1c\x86\x66\x18\x9f\x48\x6e\xbb\x7e\xe2\xe8\xee\x9c\xe0\x75\xf3\xff\x7c\x1d\xe4\x50\x0e\xf1\x91\xeb\xae\x76\x83\xb5\xf6\xf8\x14\x14\x7e\x7c\x84\x45\xa6\x91\xe3\x00\x81\x40\xdb\x33\x88\xab\x37\xcb\xd6\x3d\xf2\x4a\xd5\x3c\x92\xda\xf2\x04\xab\x8d\x6d\x5f\xa2\xf4\x54\x93\x03\xf4\xb2\x5c\x9c\x8b\x91\xfc\x36\x78\x69\xcb\x49\x92\x10\xa0\x59\xbf\x28\xca\x92\x3b\x98\xbf\x6b\xc5\xf0\xbb\x39\xb5\x20\x38\xab\x79\xd1\x89\x5d\xd8\x81\x17\xc1\xef\xd0\xcc\x43\xb2\x36\xe7\x4c\x02\x1d\xeb\xa6\x76\x66\x1d\x82\x0a\xb5\xe8\x28\xfb\xfa\xbf\x65\xd2\xdd\xa8\x2b\x80\x0d\x24\x8e\xda\xcf\x56\x3d\xd9\xfc\x48\xff\x44\xcb\x9b\xae\xd6\x17\x1e\xc9\xe6\xa8\xfc\xef\x09\x27\xee\xa9\x1f\x29\x65\x28\x12\x1f\x0f\x57\xea\x73\x36\xc6\x43\x02\x28\x98\x2d\x58\x87\x25\x14\xbc\xfd\x4d\x2f\xf6\xc0\x0a\x94\x7f\xa2\x69\xf8\x36\xea\x4c\xb3\xc7\x8e\x44\x42\x38\xf0\xd9\x5e\x1f\x51\xd7\x16\xcd\x13\x49\x68\xcb\xae\xc3\xf0\xb3\xd1\xf3\xda\x06\xdd\xab\xfb\x47\xa4\xa3\xb7\x16\xd7\x77\x69\x7d\x81\xe5\x96\x81\x06\xfb\xcd\xe8\xf5\xfd\x16\xa7\xc1\x7e\x4f\x2b\xa9\x59\xf6\x3b\x68\x34\x6d\xf0\x7d\xfa\x47\xb3\x1f\x94\x40\x02\xc1\x6d\x16\x33\x6d\x7d\xf1\x44\xf6\x59\xcd\xe2\x02\xb5\x4f\x19\x8a\x03\x1b\xe9\x6c\x69\x57\xed\x70\xb3\xa5\x20\xbe\xd5\x80\x6f\x93\xab\x4b\xf5\xc0\x0a\x39\x09\x3c\x0f\x08\x89\x0b\xf4\xbe\xc6\x09\x29\x44\x91\xdd\x3a\x59\x18\x11\xec\x4a\xa2\xa0\x94\x65\x80\xd2\x8e\xc8\x5e\x35\x1d\xc3\x8c\x3f\x00\x93\x2f\x79\x70\x2b\xde\x4e\x50\xfc\x56\xdd\x7d\x55\x06\xec\x5e\xd7\x35\x78\x70\x23\xdb\x0d\x9c\xb5\x43\x25\x37\xaf\x8d\xe3\xcc\xe1\xdf\x39\xa2\xef\xb5\x50\x0c\x68\x97\x54\xf6\x1e\xd4\x29\x7b\x1d\xea\x12\xc7\x4a\x73\x7a\x5f\x6e\xcd\x7b\xf6\x85\x5e\x6a\x2b\xf9\x74\xac\xe4\x2a\x9c\x21\xbe\x22\x08\xb6\xfb\x25\x96\x26\x55\xb7\x2f\x8c\x4a\x06\x6b\xee\x37\xf6\x90\x79\x17\x1c\xda\x7c\x0a\xc5\xba\x63\x2f\x9b\x40\x14\x18\x75\xf9\xaf\xca\xef\x67\x47\x28\xec\x49\x20\x8f\xc2\xae\x25\x84\xbd\xc0\x39\xde\xa8\x76\x59\x95\xb2\x90\x14\x89\x94\xba\x22\x67\x75\x7a\x4d\xbb\x00\x37\xfa\x78\xf8\x2d\x02\x09\xa8\x55\x20\xc8\x0a\xf6\xb9\x20\x80\x91\x54\xae\xb3\x08\x68\x67\x86\x57\xee\xa3\x0f\x24\x7e\xd8\xe8\xb4\xd8\xc4\xde\xcd\x05\x8f\x6f\xbe\x0e\x31\x60\x89\x5f\xb7\x17\x54\xe8\x92\xf3\xbe\x34\x5a\xd7\x1c\x79\xdf\xbb\xc7\x5f\xc4\x02\xe6\x9e\x65\x73\xec\xf2\xe9\x62\xfa\xc7\x57\x65\x93\x89\x9b\x9e\x20\x40\xb1\x2f\x23\x98\xa9\xa1\x76\x21\xe4\x7e\xeb\xc0\xaa\xf4\xa8\xa6\xaf\xb2\x6b\x10\x72\xee\x5e\x96\x83\x07\x72\x19\x48\x1c\xb2\x76\xb1\x0b\xec\x0c\x74\xdc\x7d\xc6\xc4\xfc\x4c\xd0\xf6\x4e\x7c\x41\xca\x57\x46\xa9\x9a\x96\x5d\xf7\x26\x6a\x90\xdd\x07\x23\x7d\x58\xe8\xe9\x78\x52\x50\x96\xef\x1a\x5a\x6d\x96\xe7\xff\x4d\x9f\xcc\xf2\xb5\x28\xe2\x0e\x90\x0c\xff\x76\xac\x16\x2a\x76\xbc\xd5\x53\x0c\xbb\xe7\x0f\xe4\x8f\x00\xfc\xb9\x1c\x64\x6c\x0b\x5d\x13\xcf\x74\xb2\x5b\x82\xa0\x8c\x28\x84\xed\xb1\xe9\x09\x72\x41\x30\x09\x92\x93\xd8\x23\x64\x78\xce\x83\xf1\x20\x3b\xc2\x99\x83\x61\x18\xcc\xc1\xc7\xc4\x53\x5b\x73\x7d\x7c\x03\xb1\x0c\x9a\xe2\x4d\xb3\xbc\x3d\x2d\x3e\x95\xdc\x53\x08\xfa\xef\xa9\x65\x55\xec\x49\xd4\xc3\x8b\x18\x2c\xc1\xa4\xb5\xf0\xf0\x1e\x79\xa4\x64\x3a\xee\xf9\x99\xa4\xbe\xd5\xd5\x4d\xcc\xfa\xed\x3c\xde\x09\x6c\x1d\x6f\x0f\x5b\x00\x02\xab\x86\xbf\x89\x8a\x25\x1e\x7f\x4b\x48\x42\xa0\xc7\xcb\x93\x0b\x3a\x4e\x09\x14\x5a\xe2\x94\xa3\x52\xba\xa9\x0a\x20\x35\x4b\x8e\xd4\xc2\xbe\x86\xea\x40\xf1\x79\xc8\x3b\x70\xcf\x7f\x75\x27\xa6\x9f\xe0\xa0\xfc\x60\x3d\x9a\x0e\x5a\x05\x13\xae\x37\x47\x24\x8b\xf9\x9e\x95\xd3\x8e\x1a\x0b\xa2\xf5\x19\x4c\x9c\xb5\x31\x14\x99\x05\xa7\x49\x54\x9d\x13\xc3\xa2\xea\x74\xb3\xb2\x5a\xf1\xac\xe3\x95\x83\x2a\x18\x99\x3c\x5e\x86\xb8\x7d\xcd\xb1\x24\x5b\x39\x45\x66\x4c\xe4\x40\x54\x28\xf8\x46\xa6\x60\x11\x22\x23\x68\xa6\x1e\xce\x76\xdc\x25\xc9\xa3\xd6\x4e\x61\x78\x95\x73\xd9\x9a\x9e\x1c\x86\xb7\x0f\xd3\x67\xb6\x0f\xcf\xbe\xdd\xab\x68\x7f\x79\xb6\xa0\xb8\xb1\x72\x8e\xa5\x7c\x30\x84\x44\x84\xbc\x8d\xe1\x3a\xce\x67\xe4\x1b\x94\x81\x50\x82\x3b\x59\xb9\xd9\xc1\xa3\x6c\x7d\x2e\x52\xfd\x1d\x29\x64\x61\xb3\x91\xed\xde\x83\x11\x58\xeb\x25\x06\x66\x11\x06\x0f\xc1\x7a\x84\x69\x9d\x04\xf0\x39\xc3\xfb\xc4\xb1\xd6\x05\xfa\xa0\xe6\x48\xa5\xbe\xa8\xad\xc9\x52\x01\x55\x1f\x16\xb6\xe9\xe3\xed\x6b\xcb\x6f\x25\x3d\x18\x0a\xea\xe2\xfc\xca\x4e\x7e\xb9\xe5\xfb\x4b\xa2\xdf\x7c\x83\x12\xd3\x4f\x91\x63\x25\x7d\xcb\xb2\x46\xb6\xc6\x80\x12\x5d\xe6\xa6\x84\xe7\x0d\x9c\x77\xcc\xdf\xd8\xc0\x72\xe7\xff\xb3\x49\x2f\x49\x7c\x0d\x49\x56\x17\xc8\xcf\x14\x6c\x05\x1b\xc9\x05\xb7\x14\x9b\xd4\x2e\xde\xd2\xf1\x4a\x85\xbf\x38\x86\xb8\x58\x72\x37\x3c\x28\x5c\xe2\x49\xa7\x42\xa6\xe3\xe4\x5e\xd6\x2d\x4d\x3a\xcb\xc4\x59\xea\x96\xc6\x6f\x89\x7d\xe3\x1f\x3c\x44\xf2\xe3\x8a\x0e\xff\x0f\x97\xb0\x4a\x91\x00\x1f\x4c\x99\x5e\x21\x9f\x47\x40\x72\xca\x5b\x8e\xd2\xf5\x5e\x6c\x20\x24\x57\xa9\xf7\x70\xc5\x5d\x70\x86\x15\x15\x60\xc8\x07\xde\xf5\x9e\xb9\x09\xc7\x19\xd9\x82\x3f\x9b\x12\xb9\x56\x84\xf3\xf0\x74\xf5\xba\xe2\xdf\x24\x5e\x5e\xeb\x29\x7b\x0e\xa8\xe3\xbf\xfe\xcc\xa0\xd7\x26\x92\xb4\xe2\xa3\x3e\x0f\x8f\x14\x06\x16\xb1\xae\x7d\xd7\x22\xa6\x6d\xa2\xb7\x4e\x4b\x7c\x04\x00\xdf\xfc\x12\x9b\xbc\x13\xe7\x2b\xd5\x79\xd2\xef\x42\x62\x7a\x06\xf2\x8f\xdf\x01\x4f\x58\xb9\x0d\x71\xe1\x8f\x90\x38\x52\x81\xb2\x80\xa8\x3b\x81\xa6\x80\x27\x8b\x1a\x8f\x22\x18\x15\x0c\x3d\x83\xf3\xd0\x70\x2f\x2a\xd1\xba\xee\x73\x23\x2f\xfe\x6c\xc1\xdd\x5a\xd5\x47\x3a\xd8\xc4\x47\xb2\xd6\x88\x63\x05\xbd\x31\x8b\x35\x6a\xac\x30\xb4\xf5\x27\xd5\x0b\x9e\x63\x1e\xd5\x73\x85\xc0\x00\xa3\x35\xb1\x16\x27\xbe\xe2\xef\x37\x1e\x4d\x09\x9f\x95\x21\x36\x1b\x04\x6c\xdf\x1a\xd2\x7c\x43\x74\xc5\xf0\x49\x5c\x42\xf1\x93\xe0\x29\x06\x79\x35\x1b\x9f\x19\x4b\x62\x4a\x6e\xde\x57\xa7\x47\x2e\x3a\x72\x8b\xa8\xa7\xb5\xfc\x5c\x32\x8e\x05\xa2\x35\x95\x60\x02\x5d\x23\x7a\x13\x60\x6e\x16\xe7\xea\x4c\x46\xed\x1f\xee\x7e\x6e\xff\xa0\xef\xc9\x10\x24\x44\xae\xc0\xd2\xca\x33\x38\xd7\xb8\xc8\xf0\xc7\x09\xbb\x36\xe6\xb9\x15\x5d\x5e\x7a\x88\xc2\x0b\x9c\xc5\x64\xaf\x2d\xcf\x27\x6d\xda\xf5\x8f\x40\xeb\x5a\xc6\xf3\xe6\x95\x33\x89\x2c\x0d\xc4\xea\x23\x98\x9f\xc3\x87\xbe\x96\x81\x27\x07\xf3\xb3\x40\xa9\xcf\x24\x48\xd7\x99\xd3\x39\x37\xa2\x67\x8e\xc9\xae\xd6\xc6\x52\xca\xe7\x6b\xe3\x99\x59\x65\x9e\xad\x5a\x2b\x41\xa9\xe6\x9b\xff\xdf\xef\x22\x73\x3d\x78\xcd\xdb\x1d\xb4\xcf\x21\x25\xb2\x36\x36\x96\x95\x14\x8c\x56\x4c\x62\x83\x05\xd3\x25\x7b\x8d\x2c\xa7\xeb\x8a\x70\x62\x96\x88\xd3\x20\x11\x9b\x93\x65\x88\x86\xba\x81\xf2\x4f\x8d\xd2\x85\x85\x5b\xae\xf2\x8a\xd8\x0c\x36\xdc\x5c\x62\xb5\x65\x75\x1d\x61\xa1\x85\x3c\xe6\x59\xc9\x76\x6b\x1e\xce\x60\xa8\x56\x6a\xb7\x03\x66\xd6\xac\x39\x75\x22\x67\x7e\x07\x19\xdc\xda\xff\x41\x39\xd8\x9f\x0f\x0e\xfc\x2b\x88\xd7\x0e\xf1\x24\xf7\xd0\xa3\x6f\xbb\xe3\x80\x7d\x16\x5f\xf3\x06\xee\x33\x9e\x7c\xcb\x8d\x3b\x7a\xcb\xfa\x6f\x2a\xfa\x01\x28\x86\xd7\x80\x41\x3b\xfd\x14\x57\x2e\x88\xab\x5f\xba\x9c\x7d\x1f\x8b\xc8\xb0\x9f\x39\x89\xed\xbd\x2f\xc7\x2b\xd0\x76\x1d\x1f\x9e\x1d\xea\x2d\x42\xe0\x18\x26\x9c\x0e\xb3\x05\x44\x56\x3d\x89\x4b\xb9\x9f\x70\x7a\xfe\x3e\x6f\x51\xa5\xbc\xcc\x25\x18\xb4\xed\x15\x1e\x5c\x74\x02\xd9\x35\x1c\xf1\xa7\x70\xd7\xa9\x8f\xef\xed\x91\x35\x92\x6b\x58\x6f\x41\x88\x1d\x1a\x80\xe0\xbe\x66\xf2\x8a\xf3\x5d\xcb\x67\xe5\x38\x07\x23\xf6\x12\x0f\xab\x53\x96\xc3\x0a\x66\xec\x99\xa4\xce\x9f\x2a\xd6\xe3\x0f\xf9\x45\xd7\xf4\x2f\x91\x1c\xf9\x3e\x92\x68\x9e\xcd\x1a\xe7\xbf\x2e\x0a\x8f\x62\xfe\xc4\xff\x5c\xfa\xcd\x35\x8b\x8f\xf9\xa2\x27\x1a\x4c\xd6\x59\xff\x4a\x2f\xee\xe1\x84\x13\x25\x7b\x3c\x00\x4e\xde\x56\x4f\x04\x4a\xa2\x92\x76\x39\x31\x47\xc7\xef\x43\x81\x43\x81\x97\x3c\x74\x9a\xe3\x9c\x1b\x57\x75\x78\x82\x57\x27\x20\xd1\xff\xe9\xc2\x75\x40\xbe\xe9\x48\xd8\x32\x34\xdd\xed\x07\x43\x81\xab\x32\xce\x04\x4f\x7a\x9c\x40\x82\x31\x4e\x91\x2f\xfe\x0f\xc7\x04\xdb\xad\x0a\xa9\x33\x43\xa4\x57\x50\xcd\x62\x43\xe5\xa6\x33\x37\xa1\x0f\xe4\xbc\x07\xa7\xb5\x22\x34\x30\x74\x14\x71\x61\x7b\x52\x9d\xa3\x95\x3b\x96\x70\x3c\x1b\xac\x37\x69\xba\xed\x85\x8e\xc1\x37\x8e\xee\x92\x7c\x30\x6b\x72\x62\x5c\x44\x3a\x2f\xb1\x2d\x12\x6d\xac\x5f\xa9\x22\x4f\x0d\xda\xc9\xa3\x3b\x5f\xac\x48\xd9\xaa\x48\xb9\xdb\x7f\x1b\x4d\x77\x8b\xc4\xb3\x6f\x68\xbd\x05\x06\xde\xde\x6c\xd3\x9d\x4b\x94\xe5\x78\x57\x1f\x21\xf1\xd4\xdb\x6c\xd0\x3e\x6a\xd6\x01\xfc\x6e\x1c\x3c\xcc\x84\xba\x54\x7a\x61\x9f\x11\xc1\x60\x33\xac\x1a\x28\xb8\xba\xe9\x86\x61\x60\xfe\x15\x48\xa1\x09\xc2\x44\xb3\xfe\xdb\x47\x13\xec\xff\x34\xf3\xe4\xc3\xf4\xf2\xa1\x78\xc0\x72\x33\xa1\x1c\x25\x17\xf8\x97\x5b\x33\x83\x25\x2c\x26\x03\xa4\x01\xe6\xda\xc2\x72\xab\xf5\x2c\xf7\x2c\x1b\x77\x91\x9c\xe8\x72\x0f\xaf\x22\x69\x5c\xc3\xf4\x47\x81\xdd\xa3\x1d\xf7\x87\xc5\x3b\xb3\xb9\x2c\x77\xa7\x5b\x5c\x44\xe1\xb1\xdc\x9d\xae\x2b\x5f\xbd\xd9\xe2\x22\x90\xae\x2f\xb1\x7b\xbb\x2b\xce\x0a\x91\x75\x33\xee\x6e\x31\x43\xed\x64\x29\x1b\x04\xb4\x46\xdb\x57\x13\x7e\xb0\x8b\x28\xcf\x10\x50\x94\xc6\x86\xac\x02\xa4\xa5\xae\x4f\xbb\xa3\xab\xbe\xfe\x23\x9d\xb7\x17\x39\x2e\x19\xf4\xd7\x95\x6c\xb1\x56\x36\x71\x22\x1b\xc9\x7d\xa0\x04\x89\x8e\xca\xba\x31\xbb\x7b\x71\xd1\xfa\x80\xc1\x1a\x5d\x0e\xf1\x65\x40\x05\x9c\x9e\xa9\xa5\xec\xb2\x61\x60\x0b\x44\x95\xed\x49\x37\x96\xf0\xad\xa9\x67\x2d\x6e\xbf\x04\xa1\xb8\xbd\x26\xd0\xe8\x12\x6b\xa1\x16\x88\x34\xce\x25\xd2\xef\x91\xe3\xe6\x96\x33\x2c\x2d\x25\x23\x3a\xf4\x32\xe2\x1e\x81\x8e\x60\x08\x8f\x50\x3b\x30\xce\xf3\x97\x36\x6a\xcd\x71\xba\x78\x96\xe0\x0c\xe1\xf3\xc3\x42\xe6\x7f\x41\x32\xce\xf0\xe7\xc5\xdd\x49\x1f\xa2\x39\x48\xc8\xd3\x4e\xb2\xec\xcc\x87\x00\x3d\x16\x2f\x45\x07\x67\x20\x9f\x4c\x5e\x04\xd4\x92\xc7\x92\x5f\xad\xde\xf9\xfe\x65\x93\x98\x05\xda\x05\x73\xa5\x59\x5d\x77\x80\xb5\x49\xb3\xd9\x86\xfb\x29\x16\x79\xa4\x96\xbc\xef\x52\x35\x33\x18\x3e\x86\xa5\x89\x5a\x82\x32\x2e\x1e\x02\xd2\x69\x32\x51\xf0\x11\x2e\xca\x68\x40\xee\x61\x94\x53\x12\xc5\x79\xf9\x99\x6c\xbe\xa1\x27\x98\xcb\x93\x5f\x03\xdc\xe2\x3c\x72\xbe\x6a\xd4\x21\x56\xac\x17\xf1\xf0\x2e\x79\x12\x97\x77\x1e\x21\x6e\xe9\xa8\xe7\x2d\xf4\x8a\x5d\x6c\x6c\x5b\x4b\xee\xc2\x13\xbe\xe4\x44\xe7\xd2\x92\xde\x57\x80\x83\xa1\x40\x4b\x7a\x91\x06\xfc\xe6\xfe\x1b\x82\xfc\xf2\x2f\xf9\xd6\x26\x20\x36\xf8\x14\x09\x04\x86\xb8\x9e\xb7\x84\xbc\xe3\x02\x67\x92\xd8\xbf\x0d\x15\xce\x34\x16\xe4\x8a\x93\xf0\x3e\x9d\x3c\xfe\x24\xb1\x27\x7c\xae\xf5\xad\x77\x9b\x48\xa9\x08\xc9\xfb\xad\x63\x8d\xce\x3e\xd8\xca\x61\x34\x09\xf5\x8c\xa5\x5b\xd2\x2e\x12\xf8\xe4\x7e\x3a\x31\xaa\x6f\xf7\x97\xc7\x6d\xad\x96\x6d\xca\x63\xf0\x1c\x38\x88\x1a\xfc\xd1\xa2\x83\x62\xbd\x88\x58\x7d\x92\x87\xc8\x79\xe9\x74\xa4\x8d\x18\xfe\x3a\xd3\xba\x33\x5c\xda\x99\xd4\x09\xca\xf7\xd6\x0d\x97\x4b\x64\x01\x06\x27\x5d\x64\x26\x05\xbb\x35\x59\x9f\x2b\x19\x0a\x65\x01\x43\x18\x96\x8b\x08\xdf\x27\x4d\xf0\x80\xf4\xa8\x46\x46\x7c\x1b\x90\x96\x41\x1a\x31\xa9\x17\x92\x1c\x41\x1a\xee\x5e\x77\x31\x6c\x71\x3f\xe0\xb8\xe1\x39\xfa\xea\x7e\x5d\xe2\x67\xa3\x8f\xef\xf3\xa1\x47\xd7\x31\x7f\xde\x40\x3d\xc4\x45\x2f\x36\x07\x8c\x88\xb7\x0f\x7e\x4f\xd1\x04\x3d\xef\xe6\xba\x35\x18\x44\xde\x37\xd7\x48\x9e\x77\xf0\xb4\x1f\x8c\x20\x32\x30\x7c\x48\x5f\x2e\x06\x86\xe7\xbd\x89\x43\x08\xac\xee\xf1\x73\x6f\x38\x90\x4a\xf9\xb0\x74\x5a\xf0\x5b\xa2\x66\x00\x13\x7f\xbb\x24\x81\x22\x26\xea\x9b\x16\x95\x95\xd4\xa8\x7b\xde\x6e\xea\x2f\xc2\x4f\x5d\x69\x50\x1d\x40\x0f\x47\xd4\x42\x8f\x00\xfb\x40\x89\xac\xef\xdf\xcf\xf7\x47\x1a\x03\xaa\xf8\x42\x6e\x64\x83\xeb\x5b\x4b\x81\xc0\x24\xb0\x3f\xea\x5e\x86\x1f\x63\xfb\x51\xd9\x1f\x3e\x91\x08\xcd\xf3\x95\x46\x13\x5f\x3a\xfe\x2b\x17\xad\x8c\x3c\x7d\x95\x4c\xff\x4d\x9f\x4d\xec\xf4\xe9\xe4\x71\xa9\x3d\x2d\xe8\x27\xa2\xac\xdf\x8f\x08\xdd\xbf\x51\x6f\xb8\x28\xc5\x1c\x8f\x98\xf3\xb9\xe1\x5e\xfe\xd0\x67\xbd\x6e\x91\xc8\x5f\x47\x27\x20\xdf\xb3\x55\xf6\x0f\xd9\xfc\x33\x07\xd9\x7c\xd1\x71\x67\xdf\x9e\x54\xd5\xdb\x85\x80\xa9\x97\x58\x6b\x11\x60\x25\x01\x96\x60\x94\x07\x76\xb0\xbd\x7f\xa7\x58\x1a\x8d\x7d\x38\xa9\x9f\xbe\x40\x1d\x3b\xff\x1c\xa9\x01\x1e\xf3\x56\x51\xdd\x67\x77\x2b\x3c\x49\x46\xfd\x84\xbf\xeb\x95\x8e\x80\x24\x76\xaf\x7c\xc0\x1b\xf3\xb5\xac\xcc\x51\x0d\x32\x39\x90\x92\x9e\x8c\xea\xfa\x56\x9e\x3e\x3b\x22\xc2\x8a\x1e\x4f\xa4\x80\x21\x10\xd1\x5f\x8d\xec\x1d\xe3\xec\x8f\x77\x7c\x91\x18\xa9\x53\xd2\x23\x3b\x99\xd7\x5c\xb2\xc7\x06\x58\xa9\xb5\xd6\xe7\xc3\x2e\x10\x3f\xc2\x9a\x69\x84\xa4\x3f\x0b\x57\x35\xad\xa4\x86\xd6\x93\x5c\x43\xcf\x42\x59\x75\x30\xd3\x8b\x3b\x7e\x9b\x4e\x0d\xa9\xc0\x22\x99\x5f\x77\x11\x94\x97\x55\x3f\x5f\x96\x55\x7b\x82\x40\xd4\xd0\x14\x9e\x5d\x90\xd5\xab\xad\x95\x99\x3b\x82\x9e\xee\x59\x5a\x6d\x75\x04\x0c\x55\x9e\x35\x7f\x4b\x22\xed\x7c\xb0\x89\x90\x96\xde\xcf\x90\xcf\x19\xde\x56\x11\xc3\x1f\xe7\x15\xfc\xf3\x87\x5a\x0b\xd6\xda\x4f\x82\xb8\x78\xde\xf2\xa8\xda\xe5\x75\x9f\x55\xfa\x4b\xcd\xcb\xd9\x26\xdb\x30\x5a\x37\x95\x7f\x09\xda\xf3\x33\xcd\xf7\xc6\xc3\xcb\xd9\x98\xf2\xcb\x21\x92\x77\xfb\x7d\xe1\x2e\xde\x64\xe6\x67\x9d\x18\x58\x6c\xe5\x38\x73\xb2\x03\x38\x06\x03\x3e\xa6\x6d\x3f\x4a\x79\x7b\xb0\x7e\x81\x74\x7e\x3f\xd1\x24\x0d\xdf\x9d\xf6\x9e\x60\xaa\x24\x4b\x3c\x1b\x27\x66\xb6\x59\xa0\x69\x5d\x24\x24\xa3\xf1\xee\x9d\xea\x5e\xcd\xbc\xad\x8d\x3c\xd3\x21\x9e\x7a\x2c\x2f\xfb\x03\x49\xfb\xa1\xea\xea\x9b\x82\x50\x10\x3b\x14\x1b\x14\x66\xae\xcb\x23\xc9\xb9\xd5\x7b\x15\xf9\xfd\xc2\xbb\x5b\xb8\x4a\xef\xac\xf6\x2f\x3e\x87\x98\xdb\x3e\x31\x01\x6c\xea\xca\x4f\x28\x2d\xce\x34\x3a\x9f\xe8\x37\xda\x3c\xf2\xe9\x31\xee\x02\xd6\x9d\xf0\x68\xc9\x13\xd8\xbc\xe5\x9d\x88\x48\xf0\xfa\x00\x51\x88\xf7\x57\x8f\x3f\xe9\x21\x86\x91\x79\x1d\x6b\x04\x0f\xeb\xb2\x5d\x8e\xf8\x51\x77\xbd\xb1\x07\x98\x23\x7d\x0d\xe2\x51\xb9\xf6\xf1\xa8\xe4\xc4\x62\x34\x76\x38\xbd\x1f\x2d\x76\xfa\x91\x5b\xe5\x01\x49\x98\x7f\x8a\x4d\xf8\x01\x36\x49\xaf\x8f\x7d\xf2\xfa\x25\x9c\x43\x64\xfb\x70\x36\x7d\x52\xde\x43\x7a\x46\x68\x64\x95\xcc\xea\x51\x0e\xd3\xc3\x66\xa0\x6c\xb7\x40\xa4\xe4\x17\x3d\xac\x95\xc9\x6c\x00\x3c\xad\xf2\x4e\xe1\x19\xfb\xb3\xea\x50\xce\x3f\x8d\xb4\x9c\x5d\x18\x98\x05\x7a\x22\x3e\xa7\x2b\xa2\x43\x28\xdb\x87\xae\x44\xb7\xe0\x7d\x04\x2b\xdb\x56\x7b\xb1\x0b\xd9\xe3\xd1\xd0\x57\x7c\x02\x1b\xaa\xaa\x08\x56\x79\xd1\x88\x2a\x10\xe8\x43\x89\x85\x19\xff\xcd\x6a\x1d\x90\x0f\x81\x25\x54\x93\x42\x1e\xa0\x80\x11\xcd\x63\x9e\xc0\x04\xac\xf0\xa7\xf9\xa6\x57\x67\xbe\xaf\xe0\xc4\x57\xf4\xde\x7c\x47\xf2\xdf\x7c\x7b\x7f\x6b\xdf\xda\x75\xfe\xb8\xce\x6f\x7b\x90\xc1\x99\x7d\x5b\x63\x73\x3e\x76\x2a\xe2\x5a\x41\x46\x7b\x33\x1c\x83\x5d\x5f\x74\xfc\x4e\x20\x2f\xd2\xed\x3b\xc7\x95\x06\xb1\x48\xce\xf5\x15\x9c\xf9\x0a\x14\xf6\x18\xda\xab\xd1\xca\x9f\x67\xf0\xdb\x2b\xd6\x01\x0e\x26\x75\x88\xa0\xcd\x27\xe3\xfd\xb1\xb5\x38\xa6\xd9\x35\x50\xec\xa2\x1e\x54\x09\x16\xfd\xd2\xd8\xec\xc9\xfd\x03\xd6\x27\xde\x66\x5d\xbe\xbf\xe9\x80\x6d\x7d\x7a\xd1\x43\x1a\xfe\x43\xe1\xbf\x5c\xdf\x25\xe6\x18\xb6\x25\x26\x13\xf0\xec\x2f\x8c\x9b\x41\xaf\x92\x83\xd2\x95\x1b\x8d\xf9\xbe\x2e\xaa\xff\x63\x13\x59\xc9\x5c\xe7\x65\x8c\xff\xce\x7f\x9a\xce\x8c\xc4\xa0\xb8\xa8\xc1\x5e\x8c\xec\x88\x18\x26\x21\x7c\xcd\x4a\x63\x98\x6b\x3c\xbf\x2c\xc1\xf9\xb9\x0e\x7c\x23\xc1\xbb\x5e\x5d\xdd\xfa\xd6\x13\xa2\x7b\xd9\x7a\xec\x33\x1c\xdb\x33\x7a\x50\x3f\x3f\x32\x78\xfd\xf4\x45\x8f\x8e\xca\x00\x45\x62\x32\x90\xd9\xff\xd1\xf3\x33\x4d\xd7\x40\x3f\x07\x07\x05\xd4\xf7\xf5\x13\x1f\xee\x78\xc9\xb2\x0c\x0a\xb6\x72\xa2\x7e\x56\xaa\xe4\x91\x0e\xfd\x19\xb1\xd4\x7c\x8b\x45\x9a\xe2\x73\xfe\x84\xfc\x29\x20\x0b\x11\xe1\xbf\xdc\x67\x31\x3b\xa9\x89\x48\xf2\x79\xd7\x90\xda\xe5\xbf\x30\x08\x0c\xa4\xea\x57\x7e\xda\x9c\x95\x35\x3b\xbb\x1c\x38\xd3\x4b\x67\x4f\x38\xfa\x10\x2d\x2a\x73\xe3\xfb\xcf\x54\x73\x9b\xa1\x74\xea\xe5\x2a\xf5\x2b\x43\x2b\x8b\x50\x09\x68\x3c\xfb\x8b\xf2\x33\x40\xf9\xef\x04\xeb\xdc\x78\x6c\x3c\x53\xd9\x16\x95\x14\x72\xf8\x13\x02\x35\xdb\xc1\x41\xd1\x8f\xe5\xc7\xc6\xe7\xcf\xf5\xc7\x39\x77\x4c\x21\x06\x9f\x6b\xc8\x04\x24\x89\x17\xa4\x89\xa7\x4f\x83\xc8\xc6\x01\xfd\x0e\xc1\xf1\xdf\x49\x1e\x71\xf6\x48\x00\x32\xe7\xc3\x48\xb7\xb7\x72\x71\x83\xf7\xe9\x59\x69\xa3\x82\x79\x66\x9f\x7d\x05\x19\xbf\x99\xf6\x5a\x79\x75\xae\xff\xd0\x8e\x30\xac\x9f\x1e\x57\x7c\xc5\x18\xee\x82\xcc\x7f\xaf\x55\xfb\x56\xf1\xf4\x1f\x43\xfb\xc6\xb0\xa4\xf8\x09\xe0\xde\x21\xd0\xff\xd3\x15\x09\xd4\xbe\x55\xeb\x59\x43\x35\x80\xb9\x19\x36\x30\xb4\xee\x29\x29\x29\x72\x4e\x5b\xc8\x12\x6c\x67\x6b\x78\x49\x39\x1e\x70\x36\xea\xbd\x62\x28\x8d\x5b\xe1\xa8\x09\xf5\x1d\x36\x7a\xcf\x40\xf9\x09\x09\xb4\x59\xc4\x2c\x9d\xaa\xd9\x83\x6f\xb5\xc2\x8f\x50\xbe\x25\x6e\xf5\x8f\x0e\x44\x6a\xc1\xfa\x36\x94\xee\x87\x9e\xd4\x12\x22\x04\x66\x93\xcd\x01\xa5\xff\x33\xa7\xa2\x05\x49\x68\x14\xb0\x26\x13\xb2\x65\x79\xd8\xf0\xd6\x39\xba\xc2\x49\xbc\xf3\x4e\xaf\x14\xb6\x9c\x44\xd7\x3c\xdd\x21\x36\x64\x28\x63\x5e\x75\xfd\x27\xa1\x82\x10\x15\x60\x78\x69\xfe\x8f\xda\x04\x0c\xf6\x70\x95\x02\xee\xda\x1a\xe5\xc6\x74\xaf\x1c\x61\x26\x2c\xa7\x72\x8c\x30\xe8\x6c\x52\x71\xb2\x82\x19\xa0\x13\xc0\xdf\x30\xee\x2a\x11\x35\xa9\xa7\xbb\x7f\xf3\xe7\x9e\xe9\x7b\xd0\x8e\xb0\x2d\xa4\x13\xeb\xd0\x04\xe6\x4c\x87\xc7\xcd\x55\xc0\xe9\xa8\xd4\x00\x01\xf0\xa5\xa6\x49\x42\x2e\x56\x66\x8c\x37\x13\x31\xa2\xdd\x1d\x49\x81\xcd\x40\x53\x39\x81\xaa\x01\x23\x40\x79\x70\xb6\x16\xcd\xfe\xd5\xb1\x1a\xd2\x74\xd0\x0f\x35\x1d\xc9\x66\xb4\x24\xaf\x3f\x12\x4f\x9a\x34\xba\x4e\xce\xbe\xa5\xa3\xb6\xaf\x2e\x69\x4f\xe0\x91\x9b\xe4\x41\xc7\x93\x81\x01\xc5\x51\xfd\x9a\xf1\x44\xb9\x02\x5a\x3c\x53\x65\xa0\xcc\x54\x4f\x71\xda\xdb\x4b\xe5\xa1\x87\x12\xb9\x21\x5e\x30\x31\xd6\x63\xaa\x9b\xe7\xbb\xba\x5e\x41\xbc\x0b\x70\x00\x1f\x3c\x50\x06\x01\xc0\xd4\xa4\x15\x9c\x13\x8b\x47\x16\x29\x17\x20\x7c\xd4\xc1\xa0\xa5\xd9\x09\xa2\x77\x2c\x15\xc9\x08\xe4\xc9\x8f\x53\x1b\xce\xa6\x82\x44\x16\x6a\x5d\x94\x9f\x3c\x00\x3c\x95\x6e\x5d\x18\x5a\x1b\x3c\x5e\xfa\xef\x71\x49\x7e\xe0\x10\x07\xb8\xdd\x0b\xe8\x7a\x79\x1a\x7d\x7e\x13\xe4\x39\x74\x11\x76\xb8\x53\x69\x37\x08\x5f\x20\x05\x1d\x8a\xab\x82\xf0\x02\xf6\xc1\xb2\x79\x30\x9e\x61\xca\x52\x16\x56\x82\xe3\x14\x52\x60\xd3\x4f\xa0\x23\x1f\x8a\x50\xc1\xba\x21\xaf\x92\xc9\x09\x32\xd1\xf0\xcb\x84\xcc\x13\x02\x38\x59\x0e\xa1\x4c\xc0\xb4\x89\x49\xde\x3b\x28\x15\x48\xd0\x60\xfa\xb3\xfc\x37\x79\xf7\xcc\xfd\x59\x33\x9d\x49\xa9\x09\x53\x7a\xc5\x75\x0c\xe9\x81\xd8\x1c\x41\xf5\x4a\xf7\x50\x18\x7d\x3a\x25\xb9\x44\x01\x78\xd4\x75\x9d\xf2\x9c\x4e\x89\xdd\xca\xe4\xbc\xf2\xdc\x83\x6c\xb2\x42\xf4\xe4\xf1\x67\xa9\x8d\x15\x6c\xc2\x7a\x56\x3c\x11\x60\x66\x04\x4e\x29\xb2\xf9\x1d\x51\x4c\x82\x0f\x39\xf6\x62\x49\x44\x87\xb2\x0d\x43\x7d\x8b\x15\xc3\x4a\xce\xc8\xb3\xfb\x78\x37\xa5\x55\x95\x59\xe3\x6e\x63\xaa\xe9\x2a\x0b\xa2\xcb\x70\x99\x85\x8b\xbf\x2b\x5b\x55\x45\x8a\x4b\x1f\x7b\xf3\x4d\xb3\x8c\x81\x09\xe9\xb1\xbc\x68\xee\x42\xae\x61\xf8\xc6\xf4\xdf\xb0\x6c\x96\x29\x75\xba\x79\x37\x78\xc7\x0f\xf9\xfd\x41\xef\xff\x26\xe0\x4d\x18\xe8\x19\x95\x37\xde\x9b\x0a\x4a\x1c\xdc\xcb\x9b\x64\x3a\x86\x5e\xee\xc4\x32\xb0\xa8\xc6\xe3\xfd\xbc\x15\x37\x35\xde\x0c\x32\xb7\xd2\xaf\x3c\x1e\x1f\xc5\xca\x8e\x07\x43\x6f\x47\x44\xc7\xd3\x6c\x82\xc4\x03\x53\x8e\x0c\x05\xa0\x8e\x9d\xdf\x8c\x0b\xfd\x08\xc1\xd4\x72\xe7\x3a\x64\x1f\x36\x95\x14\x72\x00\x3d\x3c\xd7\xf1\xc6\x43\xfc\xcc\xc8\xd1\xf3\x10\x48\x57\x77\xb0\xd9\xc8\xcd\x9f\xda\xdc\x0d\xdf\xf3\x58\xdf\x4c\x63\x1f\x3d\xdf\xa0\xc5\xd4\x8f\x15\xfe\xd4\x8d\x88\x4b\xc0\x23\x39\x7c\xb8\xef\x60\xa7\x6f\x40\xd9\xa7\xa3\x59\xc8\xea\x92\x47\xc6\x86\x30\x92\x6d\x44\x30\x48\xa6\x0a\x41\x95\xd4\xc8\x58\x23\xee\x73\x5c\x6e\x5f\xc1\xb5\x52\xdc\xfe\x86\xfc\x5e\x16\x2e\x55\xc0\x51\x59\xf9\xfc\x16\x8f\x98\x10\xcc\x7c\x02\x4b\xfa\x27\xd1\x0c\xef\x72\xfc\x2a\xf6\xd8\x18\x3c\xe3\x1b\x36\x65\xeb\x6f\x2a\x43\x6c\xcf\x50\x7b\xd8\x64\x14\x21\x91\x29\x94\x12\x6c\x3e\xea\x1c\x00\x63\x79\x24\x57\x4a\x80\xad\xcd\xef\x60\x2c\x41\x9e\x31\xba\xcd\xa9\x4b\xc2\x34\x68\x50\x4f\xc1\xc6\x6e\x8d\x92\x63\xa4\xa7\x8f\xe8\x32\x0e\xee\x52\xe0\x00\x06\x92\x88\x3b\x1d\xb3\xe6\x2f\x23\x46\x15\x1e\x36\x64\x19\xa4\x06\x13\xcb\xce\x5d\x38\x63\x86\x19\xe6\x67\x45\x64\x28\x55\x2c\x12\x75\x1a\x47\x2c\x52\x5c\x04\x07\xc7\x3f\x48\x4b\xa8\xd9\xa4\xbb\xe3\xd0\x30\xa6\x3f\xcd\x2a\x49\x28\xce\xe6\x85\x93\x13\x75\x8f\xce\xcc\x25\xd1\x8c\xb4\xf0\x29\x73\x5a\x3d\xa6\x54\xfc\x95\xe6\x7f\x7c\x79\xf9\x2d\xd9\x03\xe4\x41\xfb\x62\x68\xd6\xaa\x05\x4a\x01\x9b\x08\xbf\x7c\x20\xcb\xd6\xef\x3c\x78\xd0\x5a\xdc\x98\xf3\x75\x17\x3e\x57\x71\xec\x66\x12\x14\x99\xe5\xb4\x2b\xeb\xce\x1e\xdc\xc9\x45\x68\x90\xa8\x4b\x14\xa1\x09\x25\x1c\x1a\x95\xf2\xd1\x27\xc8\x5f\x51\xaa\xe0\xa0\x58\x67\x96\x3f\x11\x5d\xf8\x1a\x77\x8c\x01\xbd\xd0\xd6\xb6\xca\xd3\x69\xda\xe6\xf2\x79\x9b\x22\xaf\x11\x5a\x11\x59\x33\xdf\xbc\xfd\x86\x36\xc4\x8a\x6b\x66\xeb\x61\xe3\xfa\xbf\xec\xed\x4c\x96\x56\xf0\x97\x4b\xdc\x61\x55\x8a\x5c\x5e\xf9\x9f\x45\xdd\x3c\x7c\x51\x3c\x4b\x38\xa3\x7e\x58\x5f\x7a\x66\xc8\x87\x6b\x49\xf8\x65\x16\xb3\x39\xfc\x1f\x50\x74\x90\xe8\x43\x48\x6d\xf8\x88\x7a\x11\x49\x09\x2c\xb6\x54\x35\x38\x22\xf4\xbe\xe6\x63\xa2\xcb\x22\x2b\x80\x33\xc7\x9d\x20\xfb\x64\x0d\xdd\x88\x76\x13\x0e\x75\x64\xff\x8c\xca\xc2\x5f\x2a\xeb\xd8\x9f\x94\x9f\x1a\x8b\xbf\xba\x20\x14\x23\xf8\x6d\x61\x76\xc1\x5d\x3d\x03\x23\x87\x8f\x34\x0e\x6e\xb7\x98\x5c\x08\x42\x72\x0c\x66\xe6\x6d\x0e\x36\x79\x71\x0c\x85\xb8\x91\xcd\x45\x59\xc8\x01\xe5\x20\x11\x50\x6a\xe0\x8e\x14\x8f\xe1\xee\xf8\xe3\x4e\x1c\xfd\x87\xa8\xe4\x41\x99\x2a\xe1\x85\x99\xfa\x0e\x47\x12\x13\xd9\x50\xdf\xcc\x8d\x02\x60\x37\x68\x88\x52\x01\xf5\x3d\x2b\x79\x7a\x08\xfa\xe9\xc1\x1d\xe5\x6e\xe1\x0d\x75\xe7\x22\xfa\x10\x39\x74\x4e\x3a\x4a\xb0\xc6\x28\x34\x78\x72\xff\x4c\x66\x98\xa1\x46\x14\x9a\x21\x25\xac\x0d\xf0\x52\xf3\x9f\xcc\x94\x1c\x22\x76\x6d\xa8\xdd\x53\x55\x03\xe7\x07\x40\x79\x31\x20\x14\xd2\x0d\x5c\xe9\x18\x42\x17\x6a\x08\xea\xa2\xc1\x69\xb6\xa4\x47\xe1\x9f\x8f\x3f\xe4\x72\x70\xb9\x7c\x00\x43\x08\x9f\x24\x8d\x25\x4c\xfa\xde\x49\xa7\x75\x5d\xea\x4a\xb8\x86\x20\x44\x4b\xcb\x00\xad\x5a\xa0\xd2\x24\x1d\xa6\x59\xf2\x04\x25\x02\x23\x87\x92\x6f\x57\xa7\x20\x0e\x3d\x89\x7c\xfc\xea\x65\x5f\xef\x93\xb7\x94\xa3\xc5\xc0\xfb\x74\xa4\x76\xc0\x08\x91\xe1\x83\x5a\x10\xcc\x98\xb2\x32\xad\x0a\xf4\x1c\xc0\xcc\xad\x9a\x76\x74\xb4\x0e\xf9\x0b\x9a\x1f\x47\xef\x50\xa6\x73\xf5\x87\x33\x80\x44\x03\xee\xfd\xe0\x23\x47\x68\x99\x64\x6a\x06\x57\x9f\xa9\x44\xab\xd4\x45\xf2\xf9\x48\xf6\xdc\xa4\x1c\x11\x62\x45\x83\xf2\x4f\xac\xb4\xe1\x35\x74\x25\x8e\x23\x84\x27\xb0\x8a\x18\xda\x0f\xd5\xd9\x02\x75\x04\x92\xa1\x79\x02\x1b\xb5\x79\x29\x25\x16\x0d\x19\x4b\x82\xbb\xb4\x35\xb0\x31\x4a\x8a\xc1\x46\x58\x9d\xd6\xf3\x0d\x1c\x6d\x17\xef\x63\xab\x1b\x74\x18\x78\x9f\x1b\x16\xe6\xa4\xf6\x20\x89\x8d\xbc\x42\xa4\x56\x22\x08\xd9\x23\xee\xf8\x2a\xf2\xca\x88\x71\x00\x89\x69\xac\x49\x5c\xb8\x43\x46\x64\x86\x40\x68\x58\xa0\x31\xa4\x45\x30\x9d\x97\x2a\x02\x4c\x80\xf5\xb5\x4b\x7a\x1b\x92\x1b\xb1\xbe\xeb\xec\x7e\x32\x11\xc7\x1a\x7b\x8f\xe9\x23\x84\x59\x50\xa8\x50\xf8\x42\x65\x88\xae\xe4\xa2\xb7\x47\x5b\x7a\x40\x2e\x83\x6e\x63\x0e\x9d\x0e\x9f\x7e\xf1\x2e\xa6\x90\xf1\xf8\xa3\xbf\x31\x22\x80\x56\x67\xa1\xe5\x00\x6d\x09\x1f\x3a\xa0\x2d\x81\xa4\x46\xee\xec\xee\x99\x75\x54\x27\x37\x20\x17\xef\x08\xc0\x5b\x82\x7c\xd8\x26\x94\x55\x5a\xbf\xc5\x9a\xa4\x8f\x68\x2c\x06\x85\x5d\x0f\x58\x60\xe5\x7b\x4d\xce\xaa\x15\x90\xef\xc7\xc6\xee\x7c\x53\xe6\x05\x10\x19\x89\xc4\xdc\x75\x6c\xfa\x8a\x40\xc4\xfa\x20\xda\xe9\xd5\x1e\xe0\x7d\x95\x28\xdb\x00\x3f\xb3\xce\xbc\x45\x08\xea\x00\x52\x70\xfd\x7b\x51\xee\xd2\x10\xbc\x33\x58\xb3\xe6\xe2\x38\x50\x0c\x40\x03\x63\xb4\xad\xe0\x77\x82\x57\x40\x30\x69\xe9\x7a\x20\x87\x8c\x15\xa4\x18\xff\x7e\x9a\x0f\x1d\xd2\x14\x54\x3c\x80\x46\xc5\x9f\xbd\x0f\x92\xe5\x7f\x26\xd4\x4d\xf9\x6a\x90\xae\xe0\x27\x66\xe8\xe0\x47\xdb\x7b\x76\xef\x49\x94\x22\x24\xbd\xbf\xad\xb1\x93\x9a\xfe\xde\xa8\x6b\x70\xaf\xe5\x94\x2a\xc0\x1d\x12\x07\x77\xf9\x4a\xda\x42\x91\x4d\x00\x59\x25\x5f\x1d\xa4\x2e\xc4\xb9\x0e\x26\x6f\x94\xc7\x87\x5f\x61\x0f\x57\xbc\xff\xfc\x70\xfd\x07\xa2\x55\x3a\x0a\x47\x53\xad\xd0\xc1\x66\xa0\xdd\x42\x7e\xa9\x0a\x7e\x4b\x02\x31\xca\xd7\xb7\x04\x17\xde\x03\xcd\x7f\xd7\x9a\x38\x08\x8e\x8b\xce\x03\xc0\x16\x5c\xd3\xd7\x2b\x44\x27\x4e\xad\xe6\x02\x85\xe8\x44\x28\x09\x40\x6d\x42\x62\x0b\xae\x36\x51\x02\x4a\xee\x82\x5c\xf7\xda\x1b\x3f\xc9\x2a\x3b\xed\xa7\xb5\xd6\xd7\x9d\xcf\xd5\x9d\xdb\x93\x6a\x57\xed\x71\x6b\x86\x63\x1b\x9b\x1b\x64\x00\x94\x17\x71\x21\x8a\x10\x9f\xd8\x24\xd4\x0c\xc5\x09\x55\x73\xbd\x98\x0e\xdc\xbb\xb3\x81\x3f\x59\x7f\x32\x14\xab\xbc\x8a\x06\xf3\xf4\x21\x5a\x3e\xa4\xa5\x97\x04\x03\x24\x94\x34\xc5\x77\xac\xfb\xb2\x8e\x44\xb4\xfd\x22\x22\xb0\xb2\xa3\x5f\xab\xaf\x73\x28\x55\x4c\x5d\x68\x4d\x28\x0f\xa5\xaf\xbd\xd2\xc9\x7b\xc4\x97\xfb\x15\x97\x1a\xe7\x87\xf2\x3e\x4b\x84\x07\x4e\xd1\xd7\xf7\x10\x08\xd7\x0d\x9b\x61\xa1\xd7\xb2\x44\x7e\x53\xbf\x48\x88\x42\xe1\x9e\xfd\x22\xf6\xf3\xbe\x68\xcd\xbf\x47\x0c\x39\x5b\xb7\x99\xcc\x91\xcd\xd4\x3b\xa9\xa5\x03\xa7\x1d\xe5\xbb\x2b\x48\xcd\xa7\x92\x02\x95\x9a\xfb\x42\x5e\x59\x62\xb8\xa8\x42\xb0\xc2\x03\x4c\x25\x3a\x80\x90\x68\x3f\xe9\x2c\x75\x97\xf9\xee\xba\x5b\x4a\x0f\x87\x22\xbc\x29\x4c\x81\x58\x29\xdf\x28\x5c\xe4\xea\xc1\x48\x19\xce\x73\xdb\x30\x9b\x97\x17\xa3\x22\x85\xe0\x32\x70\x60\xf4\xe0\x4c\x89\xb3\x98\xc5\xd7\x14\x03\xe6\x4c\x59\x8c\xd9\x95\xb8\x29\x83\x81\x18\x4f\xab\xd6\xc8\x8d\x7d\x95\xf8\x05\xa4\x10\x3e\x44\xcc\xbf\x42\x18\x6f\x66\xcb\xca\x52\x99\xb1\x6f\x1c\x41\x9d\x27\x71\xf0\xad\xf5\x39\x62\x4b\x7b\xd0\x10\xe6\x21\x0e\xa0\xe2\x4e\x8f\xd8\xa5\x45\x8f\x27\x79\x6a\x95\x34\x0a\x98\x05\xe8\x0f\x06\x21\xaf\x21\x35\x41\x0f\x78\x1f\xf4\xcc\x00\x11\xba\x88\xe5\x38\xbe\x7d\xf8\xa2\x9b\x2e\x82\xbc\x52\xe8\x38\x7e\x1a\x12\xdb\x41\x07\x19\x60\x68\x3c\x20\x57\x5f\xaa\x09\xc7\x22\x35\x0c\x03\x5c\x1f\x33\xc8\x17\x62\x25\x83\x4e\x7a\x77\x9e\xe4\x40\xca\xea\x00\x0e\xb9\x8c\x03\xb6\x8c\x84\x16\xf6\x5b\xe5\x1e\x3a\x15\x88\x43\x68\x4a\x1d\x48\x58\xd5\xb5\x37\x2e\x4b\xbb\xfc\x44\x5e\x84\xd4\xec\xf0\x80\x8f\xf0\x68\x4b\x84\xa2\x0a\xaa\xc6\x58\x1d\x16\x60\xf3\x40\x94\x6c\xa8\x58\x0c\x6c\x10\x69\xdd\x3b\x9d\xda\x53\x1a\xf8\x83\x55\x32\x3c\x69\xa1\xc8\x25\x42\xa0\x4b\x88\xe5\x90\xce\xb0\x4f\x6a\x68\x11\xc4\xdd\x8b\xe1\xcd\x4a\x1b\x11\xa9\x64\x41\x39\x12\xcc\x14\x54\x56\xbd\xc6\xee\xc8\x0f\x21\x51\x27\x1b\x0a\xe9\x10\x58\xa5\x38\x75\xf7\x61\x57\xd0\x31\x53\xad\xbb\x3f\xd2\x78\x88\xe0\x22\x20\x29\x3c\x84\x0d\xd7\xdd\xb1\xd0\xd0\x61\x22\x72\x06\x0c\xa6\xf4\x1b\x42\xff\x9a\xb9\x77\xe2\xd7\xb6\xd2\x4d\x3f\x67\x21\xbf\xd7\x9d\x11\x36\xdd\xfd\xd3\x7f\x03\xe6\x62\x84\xa1\x89\x2e\xc7\xee\x9e\x48\xde\x7e\x73\x5a\x6f\x1f\x6c\x8b\x07\xc0\xc7\xdb\xcc\x5c\xa9\x4e\x70\x7f\x47\x62\x85\xee\xf8\x6c\x91\x6b\xd9\x1d\xb7\x07\xda\xa1\x0c\x47\x02\xf0\x53\x0a\x14\xf7\x26\xaa\x4e\x87\x1c\x48\xa1\x50\xa1\x95\x56\x83\x93\xec\x24\x83\x52\x3b\x40\x0c\xf3\xbd\xe8\xa2\x87\x0d\x69\x8a\x00\x35\xac\x98\x58\x43\x57\xfc\xaa\xf6\x21\x12\x51\xd3\x00\x6e\x34\x77\x3d\x74\xe4\x74\xed\x9a\x0b\xd1\x10\xfd\x66\x06\xd6\x95\xe6\x35\x22\xe2\xa9\x00\x68\x68\xc0\xda\xa0\xa4\x36\x8e\x0c\x85\x26\xd5\x06\x16\x3c\xc1\x8b\x7c\xf8\x87\x18\x6d\x75\x59\x6c\x49\x7c\x02\x84\x61\x11\xfd\xd8\x1d\xb1\xbc\xef\x91\x8a\x5e\xa6\x6f\x93\xc1\xb8\x63\x86\x02\x1c\xff\x6e\x22\x1c\xd0\xb5\x6d\x72\x17\x73\x0a\x14\x8a\x21\x10\x4a\x3d\x04\x9a\xc2\x06\xd9\xe7\x8f\x84\x15\xba\x10\x17\x80\xa8\x9f\x2b\x9b\xd4\xcf\xc5\x22\x74\x27\xde\x1c\x8b\x3b\x7b\xb8\xd2\x9f\xb8\x65\xcd\xba\xfa\x85\x80\x2e\x53\xcf\xff\x89\xc2\x1e\x39\x9f\x89\x80\x0f\x4e\x63\x3b\x46\x40\xac\x5d\xf3\x2a\x47\xa3\x79\xec\x6a\x0c\x3a\x1d\x42\x38\xd7\xbd\x12\x6e\x25\x5a\x40\xdd\x42\x85\x63\x53\x5f\x8b\xee\x86\xdf\x90\x8d\xb0\xac\xed\x5c\x79\xec\x9c\x7c\x96\xd1\xd9\xa8\xca\x73\x7a\xc0\x0e\xeb\xa8\xa4\x47\x03\xf2\xb7\x50\x1f\x43\xff\x6c\x34\x54\x1d\xc2\x2e\xbc\x6d\x54\x77\xfc\x77\x35\xf9\xb9\x17\x33\x35\xce\x88\x88\xf2\xad\x89\xc6\x47\xb7\x90\xfb\xc2\xc9\xb3\x39\xa9\xef\x96\xf2\x8f\x25\x32\x79\x63\x9f\x3d\xda\x98\xe1\xf9\x06\x49\xc2\xba\x07\xd6\xef\x69\xd6\x76\x11\x31\xe7\xaa\x1a\x5b\xd7\xf4\x51\xca\x15\x02\x18\xc8\x3b\xe0\x83\x71\x8f\xa1\xea\x0c\x6a\x72\xa6\x20\xc1\xae\xc8\x4d\x67\x43\x5d\x68\x57\x26\x29\x30\x94\x50\x21\xb0\xe1\xa8\x13\x98\x42\xc0\xe2\xeb\xe6\x42\xa7\x00\x49\x94\x58\xb0\x5a\x42\x10\xe3\x20\xdf\x1b\xd2\xb6\x34\xfb\x45\xb5\xa9\x17\x91\xff\x28\xbc\xd8\xfc\xf0\xc3\xd2\x86\xbd\xcc\x7e\xc4\x3f\x02\x01\x9b\x3a\x4c\x14\x3a\xf1\x64\x27\xfe\x1e\x11\x21\x92\xd1\xc9\x1b\x95\x73\xf2\xb6\x85\xac\xc7\xf6\xf0\x1e\x9c\x38\x7f\x03\xf0\x3e\xb3\x52\x93\xf0\xb8\x18\x90\x0a\x24\xb1\x8d\x6d\x68\xe7\x48\x77\x91\x7a\x49\x6e\x8a\x1b\x8a\x1a\x02\x90\x3a\x09\x66\x82\xae\xf7\xab\x0d\x3d\x93\xe5\x11\xbf\x98\xe8\x55\xe9\xa4\xe6\x89\x7c\x68\x39\xc7\x3b\x74\x70\xba\xcd\x99\x6d\x22\x67\x71\x2d\x19\xfa\x49\x7a\x64\x84\xfc\x53\x16\x64\x78\xc7\xe9\x86\x96\x69\x62\x58\x1f\x96\x35\x4b\xbd\xe1\xac\x65\x11\x03\x34\x6b\xa1\xfe\x81\x4e\x93\xf0\x18\xe4\xf9\x80\x0c\xc8\x9a\x25\x3f\xf1\x65\x1f\x91\xd4\xa8\xd2\xbd\x22\x86\x42\x70\x4a\xf2\x05\xdb\x46\x63\x81\x86\x1c\x88\x5e\x23\x7a\x1b\xce\x45\x3b\x50\x84\xb0\x97\x6e\x5a\x47\xa9\x7d\xf2\xe9\x54\x84\x3f\x50\x28\x3e\x75\xa2\x78\xee\xc0\x00\xf6\x11\x60\xc1\x8c\x3b\x07\xd4\x30\x03\xcc\x52\x12\xd1\xc2\x96\xa3\xf8\xe7\x56\x9b\x40\x08\x9d\x85\x06\x9e\x4d\x51\x24\x44\xc0\x0d\xfe\xd4\x43\x54\xb3\xc3\x49\x89\x63\x5f\x04\x06\x41\x34\x44\x95\x84\x91\xa1\x53\x77\x48\x9e\x4f\xba\x91\x43\xaa\x1d\xb1\x38\x01\xf4\xab\xc6\x7e\xd1\xc5\x00\xa6\xf6\x78\x58\xdb\x53\xb7\x19\xec\x9d\x86\x24\x8f\x82\x00\x1a\xfd\x53\xfe\xc0\x0e\x64\xcd\xda\x23\x19\x1d\x64\xea\xb4\xd1\x3d\x3d\x19\xb7\x6a\x20\x2d\x7a\x97\xe3\x78\xab\x2a\x99\x1a\xc4\x1d\x04\x83\x58\xa1\xfe\x59\x75\x16\xa4\x13\x2c\x42\x47\x48\x9c\xc0\x1c\xe7\x81\x5d\x3c\x0d\x28\xf3\x6c\x85\xa7\xf1\x0b\xa4\xaf\x66\x24\xe9\xeb\xab\xca\xe9\xd3\xd7\x7f\x5e\x26\x09\x51\xbc\x2a\xfd\xbc\xe9\x3e\xff\x58\x67\x3e\x50\x09\x8d\xa0\x90\x16\xa1\xb4\x06\x2d\x0c\x54\x9b\xf4\x48\x93\x7d\xec\x24\x98\x4e\xd1\x2b\xfb\xda\x2c\x35\x2a\xce\x10\x26\xa1\xcb\xcf\xda\x8f\x26\x77\x86\x0e\xb7\xd4\x0d\xb4\x38\xa7\x74\x76\xc1\x7d\x87\xd0\x03\x4e\x2d\xac\x89\x49\x66\xc4\xec\x72\x2e\xff\xa2\x1d\x7d\x55\xfe\xef\x96\x72\x89\xbd\x4b\x77\x02\xc3\x14\xe6\x28\xed\xd1\x1a\x97\x24\xc4\x5c\xda\xa4\x34\x69\x13\x0f\xf3\xc7\x84\x61\x25\x45\x18\x20\x69\xab\x21\x48\xa3\x18\xb5\xa4\x44\x6d\x04\x71\x50\xd1\xe2\x48\x2f\x1e\xc4\x78\x46\xd0\x7e\x2f\xfc\xfd\x76\xdd\x2c\xcc\x38\x67\x8d\xdc\xf0\xbd\x7c\xe8\xf2\xd8\xfd\x7a\xe8\xc0\xf9\xa7\x82\xa2\x00\x36\x08\x61\x71\xdd\xdf\x43\x05\xfd\x01\x6c\xcf\xd0\x32\x81\x1c\xd0\xa9\xdf\x0c\x9a\x3d\x43\xf3\xc4\x79\x16\x1d\xdb\x07\xcc\x9b\xdc\x24\xf1\x90\xd6\x73\xaf\x21\x6b\x72\xb0\x7d\x18\x90\x72\xcc\xaa\xd0\x78\xad\x83\x4a\x0e\x85\x4a\x1f\xcb\xd9\xc9\x59\x9d\x96\xed\xa6\x5c\x0d\x9c\x6b\xfc\x27\x08\x5e\xf8\xda\xb1\x36\x9a\xb3\xbf\x41\x7b\x02\x94\x52\x41\x6b\x27\x4f\x3c\x42\x42\xfc\x0d\x99\x15\xeb\x97\xd0\xf7\x93\x24\x01\x0a\x31\x7c\xff\x89\x07\x0d\x72\xc1\x27\x15\x7e\x3e\x2e\x45\xe2\xb2\x5d\x60\xb7\x47\xe1\x51\x16\x0e\xc8\xa5\x94\x86\x66\xec\xa4\x01\x8c\xc4\x5e\xa3\x41\x41\x11\x09\xae\xa7\x42\x57\x27\xc2\xd3\xf4\xe8\xba\x5b\x9a\x23\xf6\x0c\xa9\xa6\x9d\xba\xc1\x07\x04\x2b\x19\xdf\x63\x76\x3c\xe5\x05\xbe\x9f\x77\x71\x13\xea\xfb\x86\xfb\x77\x99\x2b\x79\x14\xbe\x20\xdc\xf7\x8f\xfd\x7b\x6b\x5d\xdf\xa5\x47\x50\xae\xb7\xd7\xf1\xbb\xca\x7e\xf9\x16\x92\xb3\x7c\x45\x8e\x83\xe5\x60\x9e\x04\xc9\xd9\x59\xe6\x6d\x5b\x0c\x73\x01\x92\xd0\x84\xfc\x16\x24\xf5\x70\x37\xd6\xec\x47\x72\x19\x7d\x41\xd4\xe5\x17\x73\x8e\xc3\x55\xc1\x19\xdf\x2c\xb5\x2e\x48\x94\x78\x3b\x80\x32\x49\xf6\x72\xed\xb4\x70\xf0\x75\x5a\x96\x98\xcd\x7f\xb3\x67\xaa\xfc\x47\xd1\x12\x1e\xca\x5a\x33\xde\xfb\x0b\xd9\x26\xaa\x99\x19\x94\xb6\x08\xc5\x07\xbf\x69\xde\xbc\x9b\x06\xe0\x55\x40\xa0\xe0\x8f\xfb\x9b\x7a\x2e\xba\x7f\x93\xdb\xe8\x3c\xde\xcc\xc1\x84\x87\xf9\xb9\x23\xbf\xf2\x73\x63\x55\x8b\xa3\x25\xf4\x47\x7c\x4a\xf4\x21\x73\xc1\x49\x48\x43\xf1\xc3\xf1\xfb\x83\x55\x60\x7f\xdc\x9f\x7a\x3c\x79\x04\xed\x11\xe8\x93\x64\xe9\x93\x90\x85\xe4\x93\xa5\x28\xf5\xc9\x52\xc3\xf8\xd8\xc8\xc9\x16\x0a\x44\xcb\xe1\x13\x4c\xd1\x9f\x4e\xb1\x22\x1f\x1b\x0f\x2f\xa6\xc7\x7d\x12\x39\x77\x3e\x69\xd3\xf6\xc6\x88\x95\x8f\xba\x7f\xf0\x64\x7f\x19\x1b\x05\xe8\x55\x84\xd7\xda\xca\x7f\xf0\x62\x78\xef\xf4\xfe\x7c\xd9\xe8\xdf\x1f\x59\x7c\xef\x8f\x9b\x69\xef\x8f\x34\x2e\x6e\xc5\x4e\xbc\x95\x19\xf7\xbe\xb5\x04\x69\xa0\x93\x52\x87\xe7\x4f\x33\xd6\xc5\xec\x54\x51\xcc\x19\x62\xbe\x91\x01\x4d\x0f\xde\xa2\x86\x81\x86\xca\x19\x6a\x2a\xc3\x41\x2b\x16\x90\x97\x06\x90\xfc\x44\xdd\xc8\x4f\xf5\x0e\x29\x87\x77\x5d\xcc\x58\x67\x68\xa0\xe1\x85\x2d\xf0\xfd\xcb\x63\x30\xa8\xd5\xc0\x77\x7d\x5c\x7a\x16\x0e\x09\xe6\x65\x0c\x6d\x93\x0a\x0f\x8f\x83\xce\x7a\xa4\x4b\x2a\x29\xbc\x39\x28\x92\x28\x92\xfa\xed\xcc\x06\x5e\x33\xfb\x4e\xf1\x38\x84\xb7\xf0\xe0\xbe\x63\xdd\xf5\x5d\x0e\xc9\xaa\x44\x5a\xc3\xbb\x6c\x3f\x1d\x94\x75\xf7\x09\xdb\xbb\x98\xed\xc7\xab\x2c\xd7\xa9\xb3\x2d\xcc\x63\x77\x90\x0e\x21\x29\xcf\x60\x4d\x69\x38\x25\xf6\xb2\x0c\xb3\x08\x10\x81\x13\x7f\xad\x98\x04\xeb\x09\xde\x7c\xf8\x25\x37\xc1\x99\x7c\x79\x3b\xff\x2f\x54\x5c\x02\xcc\xaa\x32\x98\x5f\x3d\xfa\xe0\x5d\x62\x95\xf3\x5d\x86\x4d\xf5\x1a\x56\x12\xb1\x82\x48\x47\xef\xac\x38\xb3\x20\x6b\x16\x32\xab\xef\xf9\xe2\xcb\x86\xe7\xac\xa1\x36\x19\xc5\x86\x38\x51\x5d\xd7\xc5\xcc\x20\x1f\x4a\x20\xe0\xb2\x37\xdd\x16\x69\x35\x1b\xca\x12\x0a\x71\x74\x36\xc4\xff\xda\x20\x2e\xad\x9d\xfc\x09\xe9\x13\x91\x9f\xba\xe6\x8b\xa7\xa3\x02\xed\x88\xaf\xdf\xb4\xc1\xb6\x05\x10\x3f\x09\x5e\x04\x43\x55\x5e\xd4\x77\xfe\xed\x93\x7c\x89\xcc\x8d\x37\xed\x43\x08\xc8\x88\x92\xd0\xe0\x73\x56\x0e\x2c\xe6\x8c\xe0\x97\x7e\x0a\xc7\xf3\xc9\x4b\x34\xfd\xdc\x16\xc8\xc1\x11\x7f\x4e\xf9\xa7\x2c\x83\x04\x0c\xde\x8e\x84\x55\xb2\x9e\x94\xe7\xf2\xf1\xa0\x26\xcb\xe7\xaa\x32\x7c\x38\x30\xf5\xa5\xc3\x13\xca\x32\x6a\x30\x8d\x49\xf7\x9d\xae\x23\x94\x5c\xce\xd3\xc7\x6a\x89\xcd\x08\xf9\xc2\xca\x3b\x39\x95\x30\x87\x38\xdb\x90\xa9\x13\x8c\xcc\x6f\x0f\x10\x95\x13\xfe\x8d\xf8\x68\x2f\xd7\x35\xa4\x68\x56\xa8\x45\xfa\x1d\xfc\xd1\x12\x83\x2e\xc8\x9f\x5f\x99\xdd\xd9\xe6\xe1\xef\x1f\x95\xd4\x3b\x3d\x9b\x26\x0c\xab\x29\x72\xb7\xd7\xdd\xb7\x0c\xdb\x57\xad\x93\x6b\xae\x54\xe5\xf1\xbc\xea\x53\x0a\x2f\xcc\xf9\xb3\x32\x2f\x41\xe3\xf9\xaa\x83\xd2\xc7\x5e\x0c\xbb\xa6\x90\x4c\xd9\x19\x18\x86\x80\xb9\x42\xb5\x16\xfb\xac\x16\x2e\xac\xbc\xca\x4f\x17\xe3\x15\x43\x95\x01\x2e\xef\xbe\x10\x99\xd1\xfe\x2b\x59\x91\xec\xd3\x88\x42\x78\xba\xd9\xfe\xca\x4c\xf6\x7a\x79\x0c\xc5\x49\x94\x7b\xc9\xba\x80\xf5\x51\x48\x01\x47\xaf\x6c\x1f\xf3\x5d\xa8\x1c\xf9\xb2\x17\xeb\x3f\xc1\x7b\x90\x02\x8a\xbd\x9e\xba\xd7\x9b\xe9\x28\x2f\x64\x66\xf6\xb7\xa3\xe3\x25\x95\x93\x83\xea\x38\xf0\xa3\x9e\x01\x78\x9b\x5a\xd9\x02\x0f\xd1\x49\x65\xae\x57\xda\xde\x1f\x6f\xd4\x40\xf6\x3d\x0d\x3f\xfd\x97\xd2\xd4\x5f\x36\x2d\x5f\x43\x08\xe6\x7e\xc5\x11\x4b\xad\x02\x08\x16\x54\x77\xf3\x02\x8d\xee\xfa\x53\x8a\x71\x36\xbd\x97\x6b\xf3\xee\x4b\x9c\x6f\xaa\xc7\xde\x50\xbb\xa2\x7c\x2f\x2f\xb7\x1c\x4f\xc9\xd8\x40\x96\x4a\x20\x7f\x94\x39\x4f\x8d\x19\x84\x96\xc7\x31\xf9\x75\xc6\x59\x06\xe7\xc4\x5f\xda\x86\xd4\xf0\xb9\x11\xcd\x21\x31\xd2\x9f\x3f\x59\x9e\xbc\x8f\x05\x71\x37\x3e\x04\x02\x87\xa2\xec\x2b\x85\xf6\x0c\xc8\xa2\x93\x10\xca\x9b\xbe\xb6\xbb\x09\x9f\xdf\x10\x55\x3e\x08\x2a\x77\x30\x9c\xfe\xde\xaf\x39\x87\xf2\x3b\x96\x1f\xff\x28\xca\x78\x55\x6f\x39\x17\xee\xb5\x05\xc7\x63\x8d\xce\x0b\x04\xbf\xfa\xc1\x74\x38\xdd\x8b\xb2\x5e\xee\x79\x71\x89\xa5\x7b\xa0\x8c\xdb\xf5\x91\x5f\xe6\xfa\xac\x21\xe3\xf1\x61\x57\x7b\xd9\x68\x34\xd0\xd7\x7d\xbd\xb3\xbe\x26\x20\x92\xa9\x5f\xc1\xf5\x74\xc9\x4f\x8b\x52\xda\x30\x9e\x11\x76\xdd\x92\x7c\x41\xe2\x7f\x48\xc3\xdb\x44\x8b\x3d\x11\x64\x3a\x77\x99\x6b\xc0\x1d\x27\xff\x88\x01\x96\x6e\xc9\x51\x25\xe2\x52\x9b\xc2\x4b\x79\xc1\xc0\xa5\x0e\x08\xa8\xff\x1a\xd0\x2f\xca\x15\x3a\x31\xc8\x04\xff\x10\x82\x79\xa3\x38\x44\xdc\x01\xcd\x66\xc3\xbc\xd7\x23\x3f\xfc\x9b\xb8\x10\x1a\xa0\xc8\x98\xeb\x68\xc1\xa2\xd7\x61\xb3\x48\x84\xf6\x13\xbf\xe2\x4c\x8a\x03\x03\x80\xf6\x12\x5b\x18\x22\x85\x4e\x17\x51\x00\xca\x2a\xfd\x51\xd8\x4b\xf4\xab\x54\xfa\x19\x2e\x36\x65\x48\x59\x44\x14\xd4\xd5\x44\x5d\x2a\x48\x3a\xfc\xce\xaa\xbf\xc2\x4b\xec\xf4\xd6\x01\xaa\x5c\xa1\x6c\xab\x97\x55\x57\x2e\x4e\x41\xce\xa2\x48\x39\xef\x0a\x52\xa7\xab\x3e\xd9\xf1\x5d\x55\x62\x3e\x55\xbc\xb8\xae\x49\xe1\xe5\x2a\x59\xbe\xcb\x75\xb1\xfc\x54\x05\x16\x35\x8f\xea\x16\x0e\x0c\xd7\xfc\xd1\x67\x70\xc1\x03\x48\x15\x9e\xf9\x0e\x3d\x31\x40\xd7\xbc\x99\x8f\x3b\x74\x68\xd0\x47\xe7\x41\x90\x7d\xf3\x05\x92\x5d\x9e\xae\x4a\x9c\xa6\x84\xaa\x4e\x0b\xd5\xc5\x1c\x9b\x7b\xd2\xb6\xa7\xcc\x57\xe2\x41\xfc\xaf\x6a\xa3\x61\xe2\x66\xc8\xdd\xe4\x7f\x85\xde\x24\xa0\x81\x0f\x2c\xbf\x7e\x39\xf0\x36\xf5\xa2\x78\x92\xbd\x27\x7d\x0c\x57\xde\x45\xae\x68\xc8\x6f\x9d\x54\x8f\x17\x06\x96\x85\x63\xeb\xe5\xac\xad\x7c\x76\x08\xf2\xe2\x4c\xcf\x2c\x46\xde\x79\x7e\xe4\xb8\x56\xb9\x9a\x4f\xf5\x02\x11\xae\x86\xd7\x4b\x66\xd1\x95\xa7\x66\x00\x5e\x59\xea\x38\x6e\xc4\x5f\x94\x5a\xb9\xd2\xad\xe0\x37\x43\xf2\xfb\x5c\xe9\x0c\x66\x4e\x17\xbf\x59\xd5\xcb\xd9\x86\xf3\x3a\x56\x62\x68\x80\xb3\x15\x60\x8d\x2a\x16\x34\x6c\xa3\x3c\x78\xf4\xc6\x61\x19\x5a\x39\x69\xa6\x2d\x70\x21\x6f\xc2\xe6\x0c\x54\xb1\x59\xd2\xfc\xb9\xf2\x9b\x47\x3f\xd3\x29\x75\xfc\x2b\x85\x2f\xf9\xf2\x09\x0d\x81\x64\x75\x3a\x55\xf7\xfc\x7e\xd6\x1f\x1f\xf9\x17\x6b\xb7\x6d\x0b\x1a\x60\x92\x01\xf8\x1c\x92\x5c\xf8\x6c\x9b\x74\x30\x3e\x83\xb8\xd2\xcd\x92\x75\xf2\xf2\x77\x0e\x25\x1b\x04\x7a\x4c\xa1\x74\x63\xb7\x2e\xe1\x94\xf7\x4f\x3d\xfb\x7c\x65\x76\x5d\xe7\x7d\x7c\x24\x68\xb3\xe3\x85\x66\xc2\x4d\x6a\x36\xb5\x63\xb6\xb1\xcb\xdd\xf8\xc9\xc1\xcf\x97\x04\xba\xc4\xa3\x16\x8e\x99\xe7\x8d\xac\x6b\x0a\x3c\xdc\x4f\x5f\x0f\x3b\xef\xa9\xd1\xb7\xdf\xd6\x85\xe8\xce\xee\xe1\xad\xb8\x16\x83\xa1\x45\xe1\xbc\xff\x3a\xe0\xba\x2f\x99\x61\x50\xbf\x19\xab\xc4\x60\x9c\xbe\xce\xd1\x71\xbb\xfc\x1d\x00\x09\xff\xbd\x2b\xa4\xb6\xcd\x51\xdf\xcd\x2b\xe4\xe4\x67\x8a\xf0\x03\x66\x3a\x12\xd0\xec\xfd\x7d\xec\x1f\xc7\x70\xe1\x9c\x2e\x90\x15\x97\xc9\x2f\x89\xce\x1c\x9a\x20\x03\x79\x58\x80\xf0\x1c\x47\x26\x26\xaf\x03\xad\x2a\xfb\x50\xc4\xb1\x89\xbe\x62\xa9\xa1\xb6\xc3\x1b\xbf\xaa\x44\x7d\x20\xa8\x63\x06\x78\x28\xbc\x54\xa9\xca\x54\x7e\x5d\x06\xc6\xf8\x4f\xff\x9c\x75\x6e\x83\xa3\x32\x35\xcf\x0b\x19\xa8\x3c\x77\x09\x21\x72\x83\x71\xcf\xe4\xd3\x3c\x03\xa7\x98\xde\xdb\x96\xbc\xd4\xae\x8e\x93\xfa\x80\xbc\x0b\x64\x91\x12\x6c\x3f\x45\xa1\xbc\x35\x69\x9d\x65\x89\x0b\x64\x05\xdd\x38\x8a\x1e\x43\x1b\x7d\xa8\x06\x99\x11\x1d\xcf\x0c\x9e\x41\x3e\xd3\x2c\x05\x2f\x08\xe7\x14\x70\xf0\x09\xeb\x37\xe9\xbc\xf4\xb6\xa0\x32\xce\x6a\x35\xf6\x2a\xc0\x45\x74\xb1\xc4\xac\x8d\x19\x44\x32\xf2\x81\xe3\xdf\xb0\x6b\x02\x85\x08\x03\x70\xfa\x61\x09\x2a\xba\x2a\x49\x04\x56\x9c\xd7\x2f\x71\x07\x7a\x3b\xf1\xb2\x5b\xd0\xbe\xc1\x41\x55\x1c\xae\x96\xd8\x6e\xc6\xcc\x87\x7d\xd0\xb9\xc3\x10\x61\x85\xf7\x83\xf2\xa9\xae\xaf\x13\x92\x37\xd5\x2c\x5e\xb9\xec\x4f\x50\x29\xfb\x4d\xec\x85\xa4\x9e\x66\xe7\x32\x5e\xca\xa3\xeb\x4e\x01\x18\x66\xda\xd9\x6b\x90\xc3\x64\x47\xda\x28\xbb\xe2\xb8\x5c\x43\x87\xd1\x9e\x06\xed\x46\xd5\xba\xcd\x8a\xf7\x53\x83\x01\x81\xfa\x4f\x08\xd5\x39\x04\xe2\x20\x5d\xcd\x4a\xea\x2a\xd4\xa3\x6b\x87\x47\x1b\x40\xd6\x8b\xdf\xbb\x02\x5f\x6d\xda\x56\x25\x68\x54\xa5\x4b\x54\x5b\xd8\xb0\x2b\xee\x60\x89\xcc\x31\x7b\xc1\x73\x2b\x4a\x63\xb6\xc9\xbb\x04\x25\x56\x3a\x3c\xa0\xc1\xb3\x85\xf6\x4e\xad\xee\xa6\x35\xc0\x79\x0d\xde\xce\x57\xa5\x3d\x66\xf6\x18\x6b\x38\xd5\x0d\x71\x79\xe7\x04\x39\x53\x48\xf2\xdc\x3e\x7e\x21\x80\x7a\x63\xf9\xd2\xd9\x97\x2a\x12\xa1\xf3\xa7\xec\xb1\x14\x8f\xc4\xb2\xc9\x67\xa8\x78\x2c\x29\xc4\x7d\x9e\xf7\xc8\xef\x12\xcc\x19\x7e\x99\x67\xf8\xad\xce\xa7\xd3\x23\x9d\xcf\x47\xe6\x66\x51\x92\x9c\x0d\x9e\x94\xc2\x35\x40\x06\x0e\x00\x76\x17\x4f\xaa\xec\x9d\xe5\xdf\xb3\x35\x1f\x99\x15\x67\xd1\xd5\x8b\x54\x61\x4a\x74\xa5\xe5\xa0\xfa\x49\x09\xb6\x58\x20\xfe\x67\x93\x1c\x2e\x50\x6e\x5f\xa3\x0d\x11\x75\xe5\x4f\x40\xa8\x28\x19\xa1\xe5\xc5\x55\x87\xb3\x55\x14\x4b\xab\x7a\x87\xe5\xf9\xa4\x25\x73\xc2\x36\x08\x31\xa1\x2c\x01\xa5\xa2\xb0\x6b\x00\x55\x32\x8f\xcf\x40\x3f\x45\xa1\x4e\x2d\x41\xf4\x47\x67\xe9\xef\x58\xe9\x3d\x9b\x72\x88\xf3\x20\x01\xcc\xf7\xaa\xda\x1b\xb2\xd9\x16\x1f\xcd\x7c\xff\x15\x0b\xba\xc1\xbf\xcf\x0b\xcd\x37\xd7\x1f\xcf\xf9\x88\x43\x0f\xac\xb4\x39\x82\x95\xc8\x53\x55\xd1\xc2\x01\xf1\x77\xe5\x15\x6a\x3e\x65\xb3\xa3\x6e\x41\x4a\x7f\xd8\xf0\x5d\x25\x22\x69\xb8\xb8\x8f\x0e\x1c\x25\x54\xb4\x42\x3a\xed\x4d\x51\xac\x39\xfa\xc8\xd9\x19\x1d\x98\x6c\x07\x81\xa1\x97\x64\x8a\x6c\x16\x7c\xa5\xd8\xb9\xb3\x2c\x71\x94\x26\x76\xd0\x21\x92\x42\xc9\xec\xeb\x5e\x42\x7b\xec\x92\xca\xdb\x6c\xd6\xc9\x47\x40\xe2\x41\x20\x2f\xd0\xe1\x0c\x34\x3c\xf3\x27\x9a\x50\x16\xad\xe0\x09\x5f\x37\x85\x7e\x14\x11\x7f\x62\x1e\xa1\x1e\xc4\x03\x7f\x09\xb8\x2d\x46\x0d\x00\x9d\xa7\xd9\x1b\x19\xa2\x8c\x7a\x3b\x79\xe3\xe3\xce\x5a\x7a\x38\xf3\xba\x8b\xac\xff\x44\xc3\xd0\x3e\x04\x28\x38\x5a\x9c\xdd\xef\x8c\x17\x9f\x97\xce\xdd\x6b\x67\x48\x7d\x42\xab\x88\x05\x3f\x70\x9b\x7c\xb3\x8c\xf4\x62\x43\xf6\x1b\xb9\x6c\xce\x3c\x30\x7c\xfe\x8c\x8c\x87\x33\x27\x24\xa2\x13\xf5\xea\xfe\x73\x12\x6f\xd7\xd9\xdf\x1b\xe3\x83\x5d\xbf\x68\x62\x07\xd8\x1f\xf0\x24\xb6\xd7\x06\x0e\xc5\x5d\x54\x34\xb6\x91\xa2\xd7\xb6\xb3\xf1\x7b\xef\x6b\xc7\xe7\x67\xb3\xf3\x44\x85\x4b\x48\x1b\xdd\x54\x42\x05\xa4\xd8\x86\x23\xcd\x02\x5d\x06\xe9\x88\x43\xc5\x89\x4e\x41\x24\xa7\xdb\xb8\x79\x35\xb3\xfb\x25\x5a\x74\xd3\x94\xc3\x7c\xd7\xff\x3d\x69\x2b\x64\x8b\x6e\xa7\xe6\xd6\xc1\x87\x7a\x7a\x2c\xf1\x35\x4d\xa2\x2a\xe2\x11\xc0\xed\x8f\xaa\x52\x65\x3a\x68\x3b\x2c\x6e\xcf\x50\x47\xb0\x95\xeb\xdb\x64\x90\xa2\xf3\x35\x94\xee\x90\x54\x22\xaf\x08\x40\xfe\x49\x2e\xad\x2e\x5c\xb1\x70\xc3\xba\xdc\xfc\x93\x47\x6a\x5a\x2e\xbe\xd1\xd5\x59\x37\xb7\x48\x80\x0f\x28\x78\xd4\x7c\xa3\xfc\x95\x53\x0a\xd1\x0c\x6e\xc4\x13\x58\x9a\xda\x1e\x16\xcf\x55\xc7\x12\x8f\xe4\x27\x0c\xe6\x12\x4b\x85\x28\xdf\xb1\x0f\x8d\x53\x52\x55\x73\xfe\xa9\x2b\x2d\x7a\x04\x0c\x63\x76\x60\x0f\xcb\x1d\x15\xda\x6e\x62\x51\xbf\x27\x9a\x8e\x5f\xd5\x53\x17\x2a\xa0\x67\x4f\x93\xa6\xc7\x44\x4b\x48\x52\x6a\x06\xc6\xb6\x6f\xd1\x97\x93\x3e\xd2\x4c\xfa\xf8\x34\x0f\xea\x4c\x7c\xdc\xce\x50\x2d\x6a\x05\x6c\x24\xac\x9e\x10\xb3\x27\x42\x28\x3b\x7f\xca\x5e\x2d\x1d\xc8\xcf\xbd\x08\x25\xa7\xe4\xdc\xd5\x7e\xbf\x58\x5c\xfc\x34\x24\x01\x28\x04\xad\x13\xfc\xd1\x44\xda\x46\x9e\xc3\xba\xc3\x77\x80\x2c\x20\x29\xa0\xf3\x8f\x19\x15\xf2\x1e\x0e\x24\xda\x84\x5c\x71\xf7\xcb\x19\x94\xf6\xd3\xca\x81\xde\x7a\x3d\x1d\x9c\x24\xea\x64\x7d\x83\xd4\x91\x0d\x5f\xa2\x8f\x30\x78\x4e\xf2\x82\x9d\xa1\x5b\x0f\x6e\x7e\x49\x3a\x85\x08\x94\x0d\xa3\x2a\xbd\xb0\xde\x7c\xa9\xb7\xf4\x9e\x28\x13\x72\x5a\xcf\x40\x6d\xb5\x34\x4d\xf1\xcc\xa7\x84\x69\x05\x71\x08\x4d\x85\x12\x94\x35\x07\x5e\x24\x2d\xae\x17\x28\xcc\x62\x70\x3d\xc3\xe3\x43\x59\x9d\x8f\xb4\x87\x3e\x54\x8b\xf9\xb8\xcf\xf4\xc0\xfa\x90\x8c\xc9\xe3\xfe\x4a\x10\xe9\xfe\x48\x72\xe5\x7e\x55\x2f\x48\xcb\x74\xdc\x9c\x05\x98\x69\x38\x28\x5e\x07\x30\xab\x4c\x92\x6e\x62\x48\xda\x61\x46\x8c\x52\xb4\x11\x0f\x27\xbb\xf4\xb8\x3d\x53\xf5\xb8\x7d\x69\xf5\xf0\xe8\x3b\xa9\x40\x31\x07\x0f\xd3\x21\xc4\x6a\x51\x7a\x48\xb1\x5a\x2d\x32\x0e\xd3\x23\xb8\xb8\x63\xef\x6c\x83\xd1\x4f\x73\x0a\x29\x09\x1e\x56\x41\xb4\x09\x25\x96\x3c\xbb\x8d\xed\x92\x7a\x62\x60\x2a\xd4\x9c\x36\x70\x77\x9d\xb1\x11\xe7\xca\x5b\x8f\x35\xf7\xef\xdf\xad\x38\x88\xd6\xe5\x51\x15\x4e\xe2\x6a\x82\x17\x17\x59\x91\x5f\xcd\x7f\x82\x5f\x80\x79\xcd\xc0\x52\x5e\x7a\x4a\x09\x6a\x86\x7f\x8d\x57\xca\xd7\x1c\x37\x64\xf3\xdc\xb8\x97\xa1\x69\x4c\x0d\x91\x26\x7c\xd4\xa1\x71\x3d\x00\x8f\x71\x68\x92\xe4\x33\x6c\xbb\x78\x50\x36\xfd\x92\xe2\x57\x24\xe2\x03\xa8\xba\xdd\x22\x99\xaa\x6e\x91\xfa\x13\xe7\x90\x9e\x45\xc3\x43\x7c\x30\x3c\xb4\xc8\x6b\xa5\x77\x4f\x56\xfa\xc5\xcb\x3f\x0a\xfb\x58\xa3\x2f\x3e\x18\x1f\xb4\xcd\x10\x99\x18\x82\x78\x86\x0f\xcc\xb0\xf9\x6f\x4a\x67\x61\xbd\xc2\x4b\x84\xda\x3a\xa0\x83\x0b\x2e\x3b\x35\x4f\x8f\x0a\x8b\xd8\x32\xcf\x63\x2a\x52\xf7\xc1\x24\x91\x8f\xb6\x84\x8e\x56\xa1\x2b\xef\x28\xf9\x19\xa5\x8e\xcd\xfd\x1c\x72\x50\xf0\x5e\xf2\x68\x0d\xb6\x98\x94\xfd\xc4\xae\x4a\xdf\xd6\x42\x80\xb3\x34\xd0\xf2\xc7\x0c\x78\x3f\x69\xfe\xc7\x9e\x13\xc1\x18\x59\x32\x4c\xfb\x1e\xd2\x64\x79\x27\xd1\x21\xc8\x19\x6f\x2e\x6f\x1f\x59\x1a\x36\x47\xf6\x4c\x7c\x4a\x8a\x21\xf4\x4a\x7b\xed\x69\x48\x60\x69\xb4\x69\xc5\x10\x7b\xc7\x00\xdd\x29\x65\xaa\x5c\x64\x33\xd8\xd4\x5d\x9a\x4a\xe1\x6d\x32\xdb\x71\x90\x60\xd3\xa0\x50\xd9\x23\xf7\x9c\xa1\x18\xb8\x65\x77\x19\xd4\x0f\x7b\xc5\x28\x1c\x41\x37\x69\xd3\xf8\xa5\x63\x7c\xce\xa1\x68\xab\x23\xe2\xf1\xe1\x04\x3d\x92\xf7\xad\x06\x7d\x7d\xe0\x48\x6f\xb6\x91\x04\xbd\xfb\xc2\x5e\xf9\xf0\x44\xfa\x2a\xb4\x85\x92\x9b\x9c\xa5\x56\x52\x69\xe9\xba\xc4\x3b\xe3\x50\x02\x4b\xd7\x3c\x4a\x73\xe9\x4a\x0f\x2f\xed\x61\xf4\x0e\x28\xdb\x94\x88\x11\x80\xcd\x8a\x6c\x41\x23\x74\xe8\x19\x78\x2f\x7e\x26\xee\x5a\x29\x95\x96\xc0\x63\x7d\xe8\x2e\xca\x36\x27\x81\xc8\x6b\x3f\x22\xcc\x02\x40\x72\x6b\x50\x30\xe5\xed\x20\xc5\x91\xd5\x1b\xee\x5e\xbf\x1d\x48\x05\x76\x84\x78\x26\xf4\x8b\xd8\x2f\xa4\xfe\xfb\x47\x93\xca\xa6\x0f\xe4\x2a\xfb\x9f\x13\x4d\xbb\x63\x16\xce\x3b\x85\x2f\x82\x01\x9c\x0b\x3a\x20\x00\x6f\xde\xad\x3d\xc8\x9c\xf6\x7b\xf7\x48\xd2\x3d\xb4\xf3\x76\xd9\xda\xfb\x3d\x49\x3c\x8a\xfa\x30\x07\x09\xd5\x76\xeb\x2b\x39\x84\x42\xfa\x49\x7e\x0d\x83\x3e\x0a\xc0\xc2\x7d\xc6\xca\x34\x36\xd4\x3d\xef\xf8\x8c\x78\xa0\x07\x61\xd0\x2a\xdb\xdd\x03\x25\x19\x29\x10\xe5\x52\xdb\xe5\xc8\x14\xd8\x39\x22\x2b\x17\x68\x8b\x13\x21\xb3\x9a\x2a\x36\x58\x86\x39\x03\x78\x19\x52\x30\x1e\xfe\x7b\x0a\x95\x10\xb1\x12\x37\x82\x01\xaf\xaa\xd2\x40\x77\x4f\xe7\xa1\x0e\x0d\xb2\x74\xf2\x3b\xb9\x53\x8d\x1b\x04\xbd\x14\xa4\xa0\x5a\x4e\x24\x09\x9b\xba\x37\x21\xa9\x9d\xd3\x2b\x03\x08\x02\xf1\x1b\x80\x1d\x75\x85\xd0\x4e\x0d\x57\x03\x10\xcf\xbb\xc8\x55\xba\xbb\x0a\x82\x8e\x6a\x3f\x7e\xc2\x51\xcf\x6a\xd9\x98\x3d\xe4\x7f\xa1\x50\x85\x90\x17\xe9\x2a\x99\xf9\xf8\xf5\x56\xbc\x2f\x12\x28\x5a\xb2\xf4\xa4\xf2\xa5\x6a\x23\xf1\x65\x21\xb0\xc9\x32\xff\x99\x3e\x6a\xd2\x06\xff\xb9\x15\x02\x49\x29\xaa\xe0\x2c\x29\xa4\x6f\x77\x68\x0d\x78\x53\x35\xd4\x17\xef\x05\xf7\x72\x86\x07\x72\x2f\xdb\x9d\xb9\x8a\xb7\x97\x46\xa1\xb1\x17\xd9\xc5\x7b\x51\x06\xd1\x8e\xf5\xcb\x10\x8d\xda\xf8\x86\x68\x8d\x5a\x71\xa9\x94\xa0\x0d\xe4\xa7\x20\x4e\x45\xfc\xbc\x79\x30\x48\x5b\x64\xe9\xdb\x86\x6c\x5e\x43\x21\x2a\x55\x32\x52\x7f\x99\xc9\xbe\xa3\x13\x96\xb7\x01\xac\x9c\xad\x12\x08\x21\x3f\xe5\xfa\xdf\xa5\x1e\x04\x12\x80\xc8\xad\xdb\xcd\xcc\x77\x0f\x1a\x34\xaa\x96\xb2\x4b\xf8\x68\xf6\xd8\x60\x7f\xb6\x20\x53\x98\x78\xa8\x58\x42\x77\xcc\x21\xa5\x7f\x94\xaf\x43\x52\x63\x40\x2b\x17\xb4\x1c\xc3\x3f\xe6\xd8\xa7\x39\xbb\xe7\x60\x73\xe4\xda\x99\x56\x7a\x85\x56\xd4\xa1\x06\x91\x0f\xc9\x3b\xa3\x3f\xbd\x58\x86\xc2\x93\x9d\xaf\x48\xd3\x6a\x8b\xd0\x00\x83\xdb\xa7\xe7\x14\x68\xa7\xde\x01\xef\xd3\x70\x92\x03\x0c\x8e\xfb\xd6\x88\x6c\x44\x91\x52\xbc\x19\x59\xf4\x7d\xef\x31\x61\x31\x40\x49\x36\xe6\x8d\xec\x59\xca\x5b\x45\xf4\xe8\x7b\xd6\xd0\xb6\x5b\x87\xcf\x8a\x88\xa2\x6e\x87\xe4\x2e\x4f\x91\x8a\x8f\xe8\x7b\x52\x86\x96\x01\xda\x62\x7b\xb2\x4f\x86\x72\x4b\x2f\x49\xaf\x52\x84\x8a\x72\x4e\xaf\x06\xa4\xc9\x74\x6b\xdd\x10\xfa\x54\x14\x48\x4b\x97\xbc\x81\xbb\x33\x68\x27\x21\xed\x09\xc3\x17\xe9\x1b\x4d\x99\xea\xa4\xd5\x4d\x8d\x2a\xbf\x59\xa7\x41\x91\xd2\x94\x3d\x5a\x5e\xc1\xf5\xff\x1c\xed\x2d\x6a\x0c\x92\x53\xe4\xf4\xdb\xc5\x50\xef\xe2\x53\xda\x31\xdc\x87\x50\x08\x76\x91\xce\x68\x87\xf6\x2a\xcb\x45\xfa\x4f\x2e\x47\x35\x11\x24\xe5\x06\xed\x52\x6f\x4b\x8f\x8b\xdf\x91\x59\xe4\x58\xc5\xa2\x30\x58\x8a\xf6\x8d\x6c\x76\x96\xe8\x43\xde\x29\x36\xa4\xc8\x35\x51\x62\x2c\xe9\xd3\x4f\xda\x8c\xb7\x94\xfa\xc5\xe7\xaf\xd0\xb7\xd2\x2b\x45\x0a\x53\x88\x64\x71\xca\x5e\x15\x78\x5b\xbf\x85\xd3\x90\xfa\x4d\xbe\x5c\x53\xdf\xec\x85\xea\x2d\xaf\xbd\x4d\x1e\x96\x50\x6d\xa9\xb7\x47\x5d\xfb\xf1\x18\x59\x38\x64\x79\x2e\x5e\xf3\xf4\x56\xd1\x6b\x6c\x81\x97\x3a\x07\x14\xfb\x52\x75\x6e\x31\x8e\xb7\x66\x32\x1f\xfe\xb9\x40\x23\xcb\xdf\x55\x0d\xfe\x63\x9f\xb7\x67\x27\xfc\x74\x32\x10\x49\x67\x55\x3a\x0e\x99\x1e\xa1\x03\xf3\xe3\x66\xec\x82\x75\x73\x95\xd3\xc7\xba\x9f\xd2\xb3\xda\xf5\xd5\xd4\xad\x8e\xde\x90\xea\xc6\x60\x58\x33\x98\xe7\xea\xfe\xf4\xba\x9c\xdf\xfa\xf6\x6f\xdc\x20\x57\xd8\xaa\x22\x9e\xaa\xac\x8a\x2a\x27\xa1\xf5\xde\xff\xf8\x9b\x21\x96\x54\x0c\x8e\x49\x86\x97\x75\xe9\x74\x55\x9b\x15\xbe\xb1\x08\x19\xae\x27\x1c\xf9\xbd\x23\x8a\x6f\x31\x14\xbe\x62\xce\x1f\xeb\x02\x20\xba\xcc\x8a\x76\xaf\xc3\x46\xa6\x52\xf0\xc9\xf8\xf7\x05\x97\xf1\x93\xca\x00\x75\xa0\x6b\xbc\xf6\xcc\x77\xa9\x1d\xa2\x5a\xf5\x3d\xd5\xc4\x20\xb0\xed\x96\x8e\x9b\xe7\x19\xd3\x4c\x36\x58\xbf\x2c\x37\x9b\x95\x90\x4b\xd0\x36\xa8\xac\xb3\xc1\x1b\xce\x1e\x72\x73\xc2\x60\x4a\x6a\x41\x79\x2b\xd4\xb6\xcc\xc2\xf1\x40\x9d\xad\x6a\x2d\x6e\xa3\x90\x91\xd7\x1f\x22\x5c\x54\xce\xaa\xc7\x94\x68\x0c\x6e\x48\x5f\x4d\x02\xdc\xd1\x41\xd3\x13\xa8\x7c\x8b\x62\x3d\x37\x0c\x2a\x21\x83\x55\xf2\xcb\xbf\x10\x70\x13\x41\x92\x93\xd0\xbf\xa7\x0d\x7c\xcb\x4d\x6a\x4c\x5b\xa9\x68\x0b\x69\xa6\xfe\xc3\xfc\x6e\xda\x5a\x3d\x0d\x5d\x43\x6d\x1a\xb7\x65\x44\x0e\xf0\xc0\x17\x07\xbd\x4d\x0b\x5b\x10\xdc\x8a\xc6\x1c\xcc\xfa\x5b\x8b\xc5\x42\xce\xa7\x57\xdc\x86\xd9\xcb\x4b\x32\xe9\x62\xdc\x69\x40\x47\x96\xd0\xe8\x2a\x74\x8e\x6d\x61\x7d\x6f\x8c\xaa\x40\x82\x1e\xfb\x08\x43\x21\xad\xb4\x31\x20\xd8\x8a\x21\xce\x83\x5a\x73\x7c\x40\x7b\x70\x33\x66\x03\x8f\x94\x37\x4b\x43\x63\x0b\x80\xdd\x12\xe3\x9d\xb7\x14\x32\x5f\x20\x5c\x63\xf7\x89\x4c\x44\xbd\xc2\x44\x2f\xed\x96\x1a\xa9\xe3\x06\xc3\x96\xcb\x75\x1e\x5f\xe3\x5f\x05\x8c\xb0\xc2\x1f\x3c\xb9\xce\xb3\x29\xfd\x6f\x6b\x91\xf3\x5b\xea\xd0\xd9\xac\x9f\x23\x31\x77\x72\x85\x9a\x9b\xab\x5d\xbc\xd3\xb3\x5c\x6f\xfa\x1c\x20\xea\xf5\xf1\x12\xec\xed\x12\xcb\xb8\x19\xa9\x84\x52\xf2\x0e\x80\x14\xb9\x00\xa0\x40\xc6\xfd\x4b\xf0\x5c\x29\xe5\xef\xb2\x60\x3e\xf6\x1a\x1a\x29\xa5\x62\xc6\x30\xcf\xbf\xe1\x05\x08\x4a\x58\xe3\xde\x44\x60\x03\x39\x5b\x69\x88\xdc\x41\x35\x6b\x28\x49\x64\x0c\xcb\x25\x5b\xfe\xd7\xb0\x9c\x30\xd0\x0e\x9b\x75\x26\x68\x29\xe8\x80\xd0\xfa\xb9\x75\x1a\x30\x43\x52\xb6\xe8\x6e\x6b\x3c\xeb\x3d\xb0\xb7\x76\xc0\x3d\xc8\x11\x54\x2c\xb2\x6d\xcc\xa1\xf4\xf5\xe5\x27\xb2\x56\xad\x40\xac\xf5\x5e\xb8\x20\x8d\xee\x83\x2a\x2a\x35\x46\xb6\x55\x1e\x87\xd5\xdd\x04\x5e\x49\x52\x2c\xad\xf8\x26\xff\xa8\x8f\xcd\x44\xa1\xc5\x75\x14\x1d\x3b\x29\x59\x1e\x6d\x43\x6f\xa1\x1e\xd4\xc0\x01\x0b\x14\xff\x55\xcf\x10\x3a\xb3\x31\xb1\xea\xc2\xb0\xd6\x6a\xa0\x09\x71\x17\x1f\x6d\x51\x19\xc6\x85\xc6\x4a\x6d\x90\x00\x4e\x2d\x5e\x7a\xfb\xfb\x9b\x29\xe9\xff\x43\x88\x6e\xd5\x0d\xce\xe4\x38\x55\x08\x8b\xb9\x7c\x9c\x23\x8a\xd3\xb8\xa8\xd8\x9c\x6e\x9d\x1e\x89\xce\xab\x50\x0d\x55\x97\xaa\xd1\x61\xad\xcf\x78\xc6\xe5\x94\xfa\x4b\x05\x5d\xbc\xa4\xd5\xe6\x50\xee\xaa\x60\x6b\xe4\xf5\x42\x8d\x8d\x53\xa2\x35\xf2\x86\x1d\xa8\xec\x59\xfa\xec\x6d\x45\x62\x3a\xe5\xb5\xdc\xa1\x08\x29\x32\x32\xd4\x03\x49\x9f\xcb\xe9\xdb\x2e\x66\x64\xdb\xc7\x86\xb1\xf0\x22\x94\x3b\xc8\xe9\x3d\xb0\x02\x4b\x2d\x9c\x72\x84\xce\xe4\x5a\x2a\x15\xf8\x0d\x70\xc8\x35\x7b\xe2\xca\x02\x3c\x62\x83\xfd\x13\x0a\x64\x92\x46\x5b\x43\x23\xac\x49\x8b\xd5\x8f\x40\x69\x72\x63\xfc\xa0\x0d\x68\x40\x86\x72\x98\x8d\x24\x84\x60\xda\x97\xda\xd9\x33\x64\xc3\x16\x49\x99\xd9\xdd\xf4\x7c\x0a\x05\xd2\x56\xf2\xbe\xc4\x86\xc3\xd0\xf3\x2a\x03\x17\x8f\x3c\xbf\x5a\x02\x70\xee\x22\xd7\x4e\x49\x18\xe5\xaf\xc4\xbc\xde\x27\x0b\x89\x7c\xc1\xed\xeb\xf5\xc9\x4d\x39\xeb\x54\xb5\x6c\x7a\xa8\x81\x73\x85\x9a\x2a\x9b\xb7\x7d\x98\x7a\xa5\x88\x16\x39\x24\x46\xe6\xaa\xae\x14\xcc\x70\xcc\x45\x9c\xb5\x31\xbd\x80\x3b\x85\x24\x7d\xab\x13\x93\xeb\x04\xc8\xe7\xae\x84\x24\xb2\x43\x3e\x0c\x4d\x68\x20\x3e\x62\x74\x5f\xda\x53\xaf\x38\x8a\xbf\xda\x26\xdd\x1c\x18\xf4\x24\x3e\x16\x9c\x08\xae\x3a\xa6\x6a\xe0\x41\xf3\xbd\x21\x55\x82\x02\x58\x88\x28\x1e\x42\xea\x0c\x3c\xfe\xca\x1d\x5d\x73\x5b\x98\x58\xf3\x7c\xa9\xc1\x60\x89\x28\x54\xc7\x42\xfe\xc7\x06\xc7\x22\xf9\x20\x84\xde\x38\xe8\x2f\x26\x86\x3b\xf0\x72\x6f\x51\x99\x6b\xef\xe4\x23\x44\x39\x94\x89\x5c\x11\xec\x2d\xa5\xaf\x25\x4b\x58\x2b\xa4\xbf\x96\xf4\x0a\xe9\xaf\xa7\x7d\xe5\x4d\x25\x6c\xd3\xeb\xec\x9f\xb1\x2b\xc7\x45\x9e\x7a\xe3\x7d\x59\xde\x36\x2a\x49\xd2\xac\x80\x42\xd9\xd1\x74\xd0\xf0\x81\x2c\xd8\xad\x4f\xbf\x87\xef\xa0\xb4\x8d\x26\xd4\x35\xfa\x92\x34\xef\xcc\x1e\x1d\xe3\xf3\xd6\x7e\x50\x3a\x85\xab\x7e\xfd\x50\xa7\x5b\xef\xb9\x38\xe6\x60\x69\xaa\x61\x55\x9a\xb8\x84\x29\x8e\xa0\x6b\xce\x35\xc3\x42\x49\x0c\x43\x45\x08\x8c\xb9\xe9\x17\xd8\x5a\x61\x53\x10\x13\xfb\x16\x25\xc6\xd8\x40\x00\xd5\xeb\xf5\xbd\x8b\x83\xeb\xd2\x18\x80\x75\x15\xad\xa5\x01\x51\xfc\xaf\x47\x34\x4c\x08\xa5\xa1\xe3\x0a\xf4\xd3\x28\x43\x36\x5c\x08\xa4\x21\x84\x83\x07\x4b\x7b\xd8\x4a\x6d\xde\x8d\x25\xd2\x36\x0a\x19\x74\x21\x66\x16\x12\x53\x1f\x89\x17\xa6\x7f\x91\xc6\xb6\xa6\x7b\x09\x31\x31\x9b\x19\x95\xd4\x94\xcc\x42\xa8\x2c\x6e\xd8\xec\xb4\x10\x0a\x83\x9c\x59\xfb\x3f\xf5\xfe\x92\xbc\x29\x50\x36\xe3\x6c\x7a\x45\xf2\xa4\x14\xb7\x6c\x38\xe3\x39\xce\x10\x0f\xc3\xc2\xa4\xbb\x06\xa1\x61\x56\x34\x2c\x3b\x97\x83\x1e\x2a\x74\x52\x34\xd5\x06\xd6\xd4\x10\xba\x65\xf7\xa0\xbb\x39\x14\x0b\xb0\x46\x42\x27\x72\x05\x42\x0f\x4d\x12\x6a\x47\x0e\xdd\xb2\xdc\xc4\xcc\x3c\xb9\x48\x34\x37\x2e\x68\xc6\x77\x07\x4e\xfe\x68\x80\x69\xfb\xde\xf9\x4a\x82\x09\x19\xd8\xda\x40\x44\xa0\x1a\x4c\xda\xa2\x6f\x49\x1b\x1c\x73\xbc\xd0\x56\x43\xec\x2c\xe4\xcc\x7e\xe2\xa1\x69\x7b\xa0\xa9\xb0\x8a\xdb\xa4\x47\xb8\x85\xf2\xd7\xf6\x1b\xde\x52\x48\x19\x82\x13\x52\xf7\x1b\x7e\xfb\x35\xad\x0c\x57\x59\x11\xef\xce\xbb\x58\xe2\x51\x35\x0d\xb0\xa8\xb1\x9a\x50\xfa\x29\xf2\x00\x4b\xbb\xd2\xd0\xa4\x9e\x1d\x3a\xd0\xf3\xaf\xa6\x5e\x69\xbe\xb4\xa7\x34\x6e\x10\x86\xb0\x67\xc6\x4d\xad\xe9\xf1\xe7\xb6\x1e\xd4\xeb\x4b\x0f\x78\x27\x79\x68\x39\xd5\x6c\x8a\x88\x0b\x5d\x32\xad\x34\xf9\xb4\x29\x94\xd7\xe6\x25\x04\xeb\x38\xd8\xa6\x09\x6b\x67\xdc\x33\xed\x66\x12\xf2\x79\x4c\x5b\x68\x9f\x4d\x21\xa8\x36\x65\x1b\x4c\x79\xfb\xbf\xbc\x30\x60\x44\x29\xf3\xd8\x88\xdf\x5a\xa1\x94\xa3\x87\x37\x0c\xea\x5b\x10\x24\x24\xe6\x21\x9b\xa0\x6d\x3f\xea\x01\xdb\x5a\x83\xc2\x0e\xab\x2e\x71\x2b\xfd\x73\x0b\xa9\x46\xc5\x87\x58\x69\x56\x87\xa7\x6e\x01\xe6\x87\xd6\xc1\xb0\x91\xd8\x34\x30\xd6\xe8\x53\xeb\x67\x91\x26\x1a\x9c\xee\x22\x71\xc0\x9e\x94\x50\xc4\x3d\xe4\xca\x54\x51\xeb\x20\x3a\x1e\xd2\x75\x1a\xce\x68\x8e\x9b\x3d\xc2\xed\xe5\xd3\x4b\x8d\xed\x22\x71\x34\x58\x3a\xc5\xc5\xb7\xc8\xfe\xb6\x12\xfc\x25\x8e\x38\xb9\x59\xee\xe0\xfe\xc4\x6a\x6b\xf8\xc3\xa1\xe8\x76\x7a\xc9\x06\xb1\xdc\x90\xd8\xa2\xf4\xd1\xed\x02\xe4\x22\xf3\x5a\xcc\xd8\x4d\x92\x6b\x1b\xf8\xcb\x7e\x0e\xc7\xd9\x72\x77\xce\xeb\xb7\xd4\x2f\x5b\x32\x74\x18\xa5\x9b\x04\xe2\xa6\xe8\x77\x20\xd7\x36\x1f\xb9\xc1\xa4\xbd\x0a\x4d\x5d\xea\x19\x0a\x6b\x48\x7e\x95\x30\x95\x99\xc3\xd2\x66\xc3\x7a\x32\xe5\xc2\x2a\xd3\xc1\x16\xb0\x22\xd1\xc6\x5e\x14\x3e\x65\xe5\x49\x49\xa6\x5a\xd9\xc4\xa0\xef\x76\x5e\x8c\x3f\x02\xae\x5d\x3c\x19\x08\xbf\xc5\x92\xe1\x52\xb9\x64\x8b\xf2\xdc\x54\xc5\x96\x00\x63\xb0\xcd\x1f\x97\x6a\x13\xb7\x8e\xd5\xc8\xaa\x06\x42\xfc\x16\x47\x83\xc4\xbf\x17\xae\xbe\xb1\x26\xfd\x93\xb6\x2c\xce\xe0\x95\x05\x47\x11\xab\x6d\xb6\x24\x47\x11\xa0\xb8\x5a\x89\xe7\x80\xd8\x74\x96\x9b\x76\xfc\xe6\xd3\x70\x45\x85\xbe\x5b\x5e\xb9\x6e\xe2\x98\x1a\x52\x91\xdc\xb5\x94\x10\xeb\x2b\xf9\x06\xd9\x6c\x26\x3e\xdb\x69\xb2\x2c\x2b\xf8\x42\xf8\xf6\x4a\x08\x0c\xc2\x80\x59\x4a\x48\xa8\x7d\x38\x7f\x37\x10\x22\x6a\x6f\x7f\x4e\xf9\xee\x54\x3d\x4c\xa9\xa9\xf7\x95\xcf\x2d\xe4\xd3\x90\xb1\x59\xc8\xf9\x66\xf7\x4f\x19\x2c\xa4\x27\x53\x4d\x0b\xa4\x79\x89\x80\xdd\xc4\x02\xb2\x11\xfe\x6b\xa3\x99\xb7\xe4\x95\xba\x52\x0b\x98\x5a\x37\x01\x16\x12\x21\xcb\x25\x58\x1a\x16\x04\x6a\x44\x75\x4a\x13\x48\x2b\x9d\x6e\x32\xcf\xab\xd6\x08\x97\x1c\xba\x38\xe0\x14\x1d\x78\x01\x2c\x46\x89\xea\xc2\x36\x34\x59\x01\xbb\xb6\x62\xaf\x16\x1c\x70\x85\x12\xd8\x2b\x49\xb9\xeb\x0e\x9d\x39\x9b\xc3\xfb\xf2\x13\x18\x92\xdd\xd1\x0c\x25\x34\xe9\x72\x9d\x73\xfc\xee\x14\xb5\x24\x84\xcf\xb0\xe4\xe3\x35\xc3\x98\xa8\x16\x83\x01\x8f\xa9\x60\x4b\x62\x38\x8d\x95\x76\x6e\x5d\x6d\x57\x1c\x2b\x44\xd0\xa8\x3b\xb6\x9d\x4a\xba\x70\xb9\x33\x55\x65\xab\xd2\x5e\x8b\x2c\x7d\xe4\xd1\xe8\x03\x45\x66\x8c\x7a\x72\x60\x59\xa7\x80\x11\x2b\xe4\x58\x13\x9a\x45\xc4\xa5\x74\x09\xe9\x49\x7a\xaa\x35\x09\x36\x21\x98\x16\xa5\xb4\xdd\xd6\x90\xa1\xd3\xcc\xd0\xd7\x24\x04\x10\x8d\xc0\x4b\x78\x1e\x81\xb4\xca\xca\xd9\x04\xd6\xf4\xe4\x26\x29\xf9\xa5\xe9\x77\xd1\x20\x75\x5d\xbc\xfb\xf7\xb7\x97\xfa\x7a\x4a\xc1\x0d\xfc\x56\xbb\xa6\xcf\x2e\x75\xb6\x09\x70\x5c\x86\xc0\x59\xf2\xd2\x7b\x52\x2b\x3c\xe8\xfd\x79\x1f\x1f\x37\x5a\x9e\x3f\x5b\xca\xa0\x96\xd4\x9f\xf7\x6e\x63\xa4\x83\x45\x12\x5f\xf7\xc2\xf5\x2a\x07\x5e\xce\x2a\x78\x99\x50\x46\x23\x43\x1e\xc4\xc5\x24\x2d\x56\x9b\xf8\xd0\x51\xd7\xd8\xc7\x78\x8d\xe7\x21\x22\x30\x03\x48\x56\x12\xdc\x38\x5f\x75\x09\x31\x9e\x2c\x5d\x75\x64\xb5\x0f\x4a\xb5\x5b\xd9\x06\xee\x67\xc4\x63\x3f\xeb\x57\xe2\x63\x55\xda\x39\xcf\xca\xe5\x02\x17\x10\xcb\xa1\xc0\x75\x99\x71\xc6\x06\xfa\xac\xe2\x09\x86\x44\x98\x46\x7f\x68\x84\x29\x19\xf7\x59\x19\x6e\x63\x65\x27\x41\x2e\xc4\xd2\xf3\xa8\x06\x28\x62\x54\xb7\x0f\x37\x37\x69\x54\x3f\xab\xbb\x24\xad\xf0\x07\x09\x46\x55\x9e\x62\xe1\x82\x0b\xc0\xf3\x27\x51\xe6\x21\x54\xcf\x3a\xa9\x0e\xf9\x54\x3c\x87\x41\x91\x55\x43\x1f\x8c\xea\x45\xb5\x97\x14\x5a\x3f\xcf\x91\xd9\xfc\xac\x5d\x1c\xd6\xd1\xe5\xf4\x04\x91\x8a\x3c\xa9\x4f\x38\xed\xfc\x01\x6e\xc9\x5e\x2d\xe9\xd9\x9e\xf2\x7a\x3d\x97\x5b\x1c\x4c\x50\xd5\xd6\x65\x97\xf6\x1a\x96\x62\xf3\x53\xc9\x84\xf9\x37\xa8\x54\xc2\xe7\xa2\xb8\x37\x03\xeb\x53\xa0\x6c\xa1\xdf\xc4\x0e\x8a\x22\x51\xa1\x10\x49\x3c\x8e\x71\x8d\xdc\xb7\x73\x25\x29\x84\x9d\x3e\x91\x7f\x82\x2f\x56\x3a\x5f\xa0\x90\xd0\x3a\xda\xb3\xc0\x99\xae\xba\x16\xc6\xdb\xa3\xd4\xf9\x0c\xf1\x6c\x70\x41\xc4\x51\x5b\x24\x57\x19\xdc\x6e\xbd\x63\x48\xba\x7c\x02\x48\x56\xaf\x80\x38\x8c\x3b\x97\x2b\x4a\x5e\x01\x09\xd0\x1f\x5d\xc3\x06\x19\x72\xfd\x02\x26\x1e\x47\x1a\x95\x27\x08\x64\x79\xaa\x1c\x72\x6b\xa5\xe9\xc6\xcd\x69\xf1\x1e\xe0\x99\xad\x71\x7a\x79\x86\x06\x5e\x16\x9f\xdf\x33\x1c\x02\xcf\xc6\x7c\x88\x75\x0a\xc5\xe1\x3c\x3d\x11\x96\x0d\x32\x4b\x48\x0d\x41\xe3\xd2\x2b\xab\xeb\x6d\xdd\x17\xe3\xbe\x9e\x11\x55\xf1\xcc\x5b\xd3\xc8\x7e\x86\x0e\x35\xd8\xbd\xbe\xc8\x47\x66\xd3\xb3\xa1\x46\xcf\x0f\xf9\x0f\x27\x41\x3e\x9a\xfe\xd8\xc2\x49\xcd\x13\x53\xf7\x38\x90\x6a\x7a\x08\xd3\xa0\xde\x57\x2e\x6c\x09\x79\xe2\x6f\x74\x58\xe2\x9c\xea\x99\x3e\x71\x3b\x89\x92\x37\x4f\x9b\x87\x4b\x5e\xea\x69\xf3\xa7\xae\x36\x29\xb2\x0b\x8c\x3e\x52\xc8\xf3\xc5\x30\x82\xfd\xa0\xc1\xf9\x84\x2b\x58\x82\x6e\xc8\xca\x1c\xe3\x87\xea\x2d\x9f\x29\xd4\xd4\xa4\x22\xf9\x6c\xac\x87\x4f\x10\xd9\x35\x8d\xb0\x7d\x9f\x19\x76\xf7\xc4\x04\xc6\x5f\x88\x4d\x37\x98\xf1\xfe\x24\x9d\x1c\x51\x6a\xea\x66\xcb\xcd\xd3\x70\xf9\xd7\xca\xdd\x3e\x60\xbe\x0f\x9b\x0b\x82\x08\x2c\x7e\xe4\x81\xc7\xcf\x54\xfc\xeb\x4a\xb1\xe2\xfb\x4c\xad\xb9\x2b\xb5\x1c\x09\x1e\xd5\x4b\xce\xf2\x51\x52\xa5\x8b\x2a\x63\xde\x2a\x0c\xfb\xe4\xe7\x71\x33\x2a\xf8\x71\xcb\x8c\x7e\x20\x7c\x4c\xe7\x99\x78\x1a\x2d\xfa\x3e\xaa\x56\xf8\x1f\x15\xb6\x2d\xd5\x12\x1f\x35\x7a\xbb\x87\x75\x52\x6e\xd7\x3c\xaa\x77\x28\x8f\x3a\x6f\xbe\x58\x48\x81\x32\xfe\x67\xa8\x85\xc7\x3a\xe9\xb6\x23\x7e\xcd\x8f\xb2\x35\x51\xf7\x07\x3a\x4d\xd6\xae\x44\x86\xe4\xc3\x99\xa4\x2e\x22\x2d\xc5\x3f\x82\x53\xd8\x41\xfe\x8f\x6a\x66\xc1\xeb\xfd\x80\x7f\x88\x15\x32\x03\xc4\xf5\x01\x48\xde\xf9\x48\x5f\x5f\xce\x7b\x24\x90\xe5\x39\x90\xd5\x61\xf3\xcb\x2f\x26\x00\x54\x30\xb3\x47\xcf\x75\x9f\x87\xdd\x2d\x43\x51\x1e\xe9\xe9\x6a\x8e\x8f\x04\x0d\x4b\x52\x78\x3c\x6c\xd8\xec\x28\x1f\xfa\xe0\xdc\xb6\x7c\x13\xcc\x32\x4a\x95\xbd\x13\xa5\xff\x6d\x2c\x62\xd0\x45\xb9\x90\xe4\x01\x70\x1e\x29\x8b\x4b\xa1\x9c\x92\x1f\x43\x44\x21\xbd\x03\x98\x1a\xa1\x22\x25\xfc\x4f\x2e\x88\xa6\x10\x0e\xe4\x22\x4e\x12\x37\x9b\xf2\x24\xb6\x4d\xcf\xbb\x3c\x79\x72\xd4\xdd\xbf\xb5\x02\x07\x31\xe5\xd7\x7a\x9b\xcf\xd3\xe5\x36\x7f\xf8\x30\xad\xa4\xa2\x90\x98\x04\xe7\x9b\x2e\x3a\x94\x14\xef\xb9\x2f\x2e\x7d\x40\xf2\x8c\x2a\x54\xf7\x21\xb1\x9f\x3b\xb8\x21\xe6\x9b\x44\x31\xf3\x2d\x6d\xcb\xf9\xde\xb8\x8c\x07\x90\x75\xb4\xa4\x9c\xee\x26\x98\x36\x5f\xc9\xee\xf1\xe0\xf5\xa4\x00\x75\x8f\xd2\x40\x0b\x49\xa8\xc3\x1e\xae\x7f\x2a\xb3\xd4\x84\xaa\x84\x7c\xe6\xfa\x3a\xf3\x4e\xbf\xae\xa7\xf2\xbb\x53\x79\x46\xc4\x5b\x88\x93\x61\x49\xd6\x01\x33\x24\xa0\x8c\x26\x55\x35\x43\x4d\x4e\x0c\xba\xbb\x3e\xfd\xf2\xd0\xff\x4d\x80\x05\x0f\x56\x06\xf2\x5c\xa3\x0a\x75\x2f\xfc\x81\x84\xc7\xea\xa4\x77\x34\x8b\x52\x76\x46\xca\xac\xce\xbf\x66\xf5\x53\x73\x5d\xa4\xcf\x54\x97\x6b\x3a\xf2\x3b\x0b\xeb\x1e\x9a\x2c\xbb\x43\xd2\x02\x18\xfc\xfd\xc8\xa9\x09\xe6\xac\x73\x2d\xce\x0a\xf8\xd4\x46\x92\xbc\x9b\x87\x68\xa8\x5a\x0a\x49\x9a\xe1\xab\x8f\xfa\x8d\x4a\x32\x98\x6d\xd2\x15\x12\x6a\xba\xab\x34\x85\x36\x5b\x39\x68\xca\x20\xe1\x01\xeb\x89\x4d\x8b\x0a\xf3\xa6\x8d\x20\xb4\xa8\x1c\xc5\x7f\xcd\xd8\xf6\x5a\x43\x63\x73\xb4\xae\x91\x58\x8a\x62\x45\x66\x9f\x07\x95\x48\xe5\x2c\x78\x32\x1c\x51\xf8\x0f\xe4\xac\x4d\xec\xab\x4c\xe1\x35\x30\xa8\xe1\x17\x32\xc4\x88\x6b\xe7\x11\x99\xec\x50\x60\xa0\x90\x48\x1b\x5c\xe1\xd2\x1f\x3b\xbe\xf1\x9a\x0d\xea\xf8\x03\x19\x18\x92\xcc\xc2\x86\x6c\x08\xa9\xa1\x55\x42\x90\xac\x4c\x65\x89\xcd\x76\x3e\x29\x3a\x00\x0d\x02\x9d\x74\xc7\x0e\x26\x33\x02\xf0\x5d\xe4\x9d\x47\xb8\x90\xda\x42\x88\xae\x58\xa2\x7d\x59\x1c\x85\x0e\x7e\xb2\x58\x1e\xd4\x23\xd3\x04\x1b\x2a\x87\x43\x35\xde\x86\x26\x91\x32\xe7\x95\xa4\x84\x00\x2a\x9d\x83\x38\xd4\xd6\xd4\xda\x91\x63\xc2\x7f\x2f\xab\xe4\xdb\x96\xb5\x49\x5d\xcf\x39\xde\x46\x0e\x09\xb5\x65\xa4\x77\x01\xb1\xee\xba\x80\xcd\x26\x0e\xa2\xf2\x0d\xf9\xb5\x98\x5f\x23\x33\xf2\xa3\x32\xfc\x0d\x4e\xe9\xd5\xe4\xde\x1c\x13\xfd\xb9\xd3\x50\x7d\xcb\x8c\x92\x37\xc0\x6a\x64\xd9\x72\x73\xfe\x31\x3b\x38\x8e\x7c\xdb\x39\xa7\x97\xaa\x9a\x86\x10\x0c\x43\x78\x4d\xa4\x05\xdb\x96\x22\x6a\x0c\xa5\x27\xe3\x37\xe6\xf4\x7e\x9e\xa1\x1f\xf6\x72\xf9\xd5\x50\x79\xbb\x58\xe8\xc1\xa5\x9b\x5d\x55\xba\x3b\x7d\xc4\x49\x4b\x55\x0e\xda\x2d\x9a\x29\x11\x9a\x89\x66\x7e\xbb\x6b\xc2\x25\xe0\x82\x2b\x03\x29\x3a\x25\xd0\x1e\x00\x61\xad\xa1\xf2\xb6\x96\xa6\xdd\xa6\xfc\x29\xa7\x3a\x8a\x7d\x85\x9d\x63\x3a\xa8\x6b\xe3\x60\x15\xc0\xbf\x59\xfb\xed\x1b\xda\x6d\x2f\xdd\x9c\x3a\x21\x97\x7a\xcb\x42\x7f\x84\xd7\x36\xb5\xaa\xa4\x9c\xf3\x39\xb5\xdc\x0f\x83\x23\x0b\xad\x20\x52\xb2\x6d\x09\x75\x36\x11\x0f\x1a\x3a\x93\x74\xec\x16\x56\x6d\x59\x22\xf3\x73\x6e\x72\x47\x33\x99\x71\xad\x50\xf2\x83\xa1\xc4\x43\x1e\x74\x44\xcf\x88\x00\xfd\xbd\x35\xdd\xd1\xcc\x9b\x9c\xa2\xc2\x13\x97\x05\xe6\x24\x9d\xc6\x34\xe8\x8e\x87\x21\x5e\xa1\x07\x5e\xf3\x9a\x29\x04\xee\x9c\x00\x6e\xba\xbf\x5f\x79\xec\x0c\x7e\xbc\xb8\xfe\x48\xb8\x85\xb7\xc8\x50\x9b\x39\x41\x0e\x8e\xcb\x9a\xd3\x7d\x70\xf8\x71\x01\xb8\xc3\x81\x75\x1e\xb2\x7e\xa7\xbb\x89\x8e\xdd\xb4\x07\xa7\xbb\x2c\x2b\x1d\x11\x80\x85\xeb\x4f\x06\xf5\x5b\xf6\x76\x28\x25\xc6\x75\x87\xe7\xcd\x90\xe6\x58\xa0\x23\x2b\x49\xe2\x6a\x77\xa8\x8e\x21\xda\x9e\x86\xa1\xc1\x53\xfd\x39\xe0\xcc\xd2\x67\x8c\x13\x32\x95\x55\xc6\x7d\x1d\x35\x6b\x58\x9e\x0e\xb2\x93\x4e\x1e\x56\x3e\x8e\xc2\x3f\x15\x0d\x97\x8a\xd3\x5e\xe6\x15\x18\x50\xda\xed\xe4\x5c\x0e\x3c\x2a\x6f\xbf\x5f\x64\x7a\x19\x26\xb0\x39\xc8\xfa\x07\x8e\xff\x4e\xbc\x8d\xfc\x47\xb3\x13\x72\x06\xdc\x1b\x9f\x95\x6b\xc8\xf1\x22\xd2\xbd\x83\x82\xf7\x87\x60\xd0\xfa\xc1\x54\xf9\xcd\x4f\x88\xbf\xca\x2b\x19\x4b\x6c\x83\x8b\xae\x93\x8d\x58\xfe\x83\x1a\x22\xc7\x56\x1d\xbe\x24\x33\x52\xf4\xea\x6a\x15\xf5\x01\x5c\x53\xef\x24\xa9\x35\x68\x9c\xb2\x9a\x36\xdf\xae\x2c\x25\x1e\x86\x65\xf8\x85\x44\x12\x53\x5d\x5b\x6c\xa6\xe1\x8e\xcf\xbb\x2e\x75\xd3\xa1\x91\xe3\x0c\xa9\xb9\xeb\x48\xbb\x60\x70\x2b\x4f\x35\x2a\xba\xb8\x0d\x39\x55\xdd\xd5\xa4\x5f\xb9\xba\xb2\x23\x4a\x61\xe8\x57\xc3\x53\x77\x3d\x84\x62\xda\x22\xfd\xb0\x85\xa9\xa8\x13\x1c\x5a\x3c\xd8\x65\xeb\x3e\x42\xda\x57\x5e\x45\x92\x7a\xc5\x8c\xab\xa3\x48\x7c\xee\x64\x80\x30\x54\xe8\x9a\x18\xc1\x54\xb6\xca\x37\x53\x36\x29\xcd\xf9\x2a\xdc\xde\xde\x5c\x41\x52\x0f\x1b\xbc\x73\x57\x10\xc4\x3f\x27\x6a\x1c\x4f\x25\x77\x71\xf1\xae\x93\xd8\x5a\x31\x33\xd9\x9d\x16\x8e\x16\x86\xdc\x01\xf7\x7f\xe0\xdc\xb4\xec\x78\x87\x1c\x4b\x25\x75\xa7\x0d\xc0\x31\x02\x89\xb0\xee\xe9\x15\xb5\xb9\x6d\x91\x28\xdd\xa1\x66\x82\x0e\x9e\x2a\x8e\x59\x91\x30\x06\x32\x33\x8c\x26\x2c\x5e\xbb\xca\x9b\x02\x0c\xac\xec\xdb\x32\x08\x04\xed\x24\x9a\xd7\x5c\xd7\x54\xb3\xe3\xb5\xe8\x89\x9b\x72\x34\xa0\xf4\x66\x3c\xa6\xeb\xd6\xf1\x0e\xb0\x02\x97\x08\x0e\xad\x17\x39\x04\xb9\xf2\xc5\x8d\x3a\x52\x13\xc0\x60\xf9\x09\x3e\xa6\x83\x52\x5e\xc4\x79\xf9\x89\xd1\x29\x92\x17\xc2\x73\xa3\xda\x4e\xa2\x5f\xdb\x5a\x90\x1c\x3b\x40\x73\xa0\xc9\x89\x05\xbd\xc7\x80\x58\x06\xfb\x96\x14\x59\xa6\x93\x96\x52\x51\xaa\xf6\xcb\x12\x72\x77\x8b\x19\x6d\x3a\x9c\xd7\x44\xcb\x22\x2a\x13\xeb\x36\x90\x91\x64\x4a\x1d\x0d\x20\x68\xce\xb9\xd8\xd6\x87\x03\x03\xc4\xe6\x28\x48\x76\x73\x32\x07\x6d\x39\xe5\x5a\x18\x94\x8c\xd8\xfd\xbc\x15\x71\x38\xde\x8f\xa2\x81\x7a\x04\x0f\x44\xfe\x8f\xea\x72\xcc\xc6\x1d\xc9\x7e\x38\x1e\x1f\xfd\x10\x04\x0e\x5e\x5a\xb7\xf8\xd3\x75\x3b\x82\x50\x06\xa8\xd7\x64\x89\x4a\x74\xb1\x5b\xe6\xde\x88\x0c\x1b\x3f\xb3\x67\x76\x4a\xe9\xec\x28\x21\xd4\x76\x20\x92\xba\x19\x6b\xbe\x19\xf2\x70\xae\x6e\xc3\x7b\x3c\x42\x9a\xee\x94\xd0\x5d\x0b\x80\x18\xb5\x78\x6a\x25\xfd\x87\xd0\xb1\xd3\xf2\x82\x4b\xda\xc5\x51\x22\x2d\x01\xf2\x07\xea\x80\x39\xc3\x06\x21\x30\x24\x64\x66\xdf\x33\x6a\x93\xb5\x3c\x31\x1e\x4d\x31\xed\x48\x1f\x29\xad\x1d\xa1\x99\x38\x92\xfc\xbb\xfc\x27\xa1\x3c\xed\xdb\x42\x95\x0f\xab\x18\x67\xaf\xe7\xa9\xd5\x35\x03\x53\x3c\x0c\xce\x2e\xc6\xfa\xcf\x7f\x58\xdf\x8b\xa8\x66\xc7\x96\xaa\x89\xc0\x18\x1f\xa8\x0c\x6c\xe9\x92\x3a\x5f\x70\x45\x8d\x5a\x4c\x1a\xa5\x53\x3a\xd6\xe9\x62\xc1\x05\xd7\x11\xc1\x44\x97\xfe\x13\x53\xe1\x71\xf9\x4c\x94\x9e\x19\xed\xc1\xb1\x2c\x72\x82\x8c\xec\x72\xc6\x85\x2e\x15\x94\xda\x9f\x60\xd1\xf1\xe7\xde\xba\xc7\x07\xed\xfe\xb1\x20\x04\x84\x29\xfe\x23\xd4\x22\x78\x7c\xf9\x2d\x8c\x8d\xee\xfe\x53\xf3\x28\xb2\xa5\x46\x84\xee\x27\x21\x1a\x1f\x63\x59\x98\x68\x04\x2d\xbd\x5e\xc1\x8f\x86\xf9\xd2\xe0\xf9\xba\x04\x24\xd4\x07\xbf\xcc\x46\xc4\x4f\x12\xfd\x47\x13\xd2\x43\x22\x1e\x1b\x08\x30\x73\x99\x46\xda\x04\x23\x9c\x87\x0c\xb7\x31\xf8\xd4\x2e\xef\xcf\x38\x3f\x1c\x95\x6a\x3a\x4a\x1f\x09\x25\x8b\xad\x84\x54\x63\xe6\x4a\xc3\x98\x49\x1f\x69\x3d\xa6\x0b\x02\x8d\xe1\x3a\xc4\xbc\x48\xf9\x99\x23\xe6\x77\xb3\xc8\x5a\x6d\xe3\x51\x79\xc9\xe2\x5c\xde\x0e\xe7\xa6\x0a\x48\xb1\xbc\x9c\xa3\xd9\x59\x63\x4d\x21\xe6\xa7\x00\x00\x43\xfa\xcc\x73\x38\xf7\x46\x31\x36\x8c\x29\xbe\x5f\x18\xe8\xfe\x1f\xd7\x08\xfa\x47\x74\x46\x6b\x4d\x5c\xc2\xb0\xb2\xd7\x36\xe7\x90\x23\x1a\xb4\x57\xc9\xfa\xb3\x5b\x3a\x4e\xc0\xf4\x08\x19\x4a\xfa\xc1\xd6\x4e\xb5\x91\xff\xde\x00\x9f\x77\xf2\xa4\x00\x1e\x2e\xa7\xd7\x88\x05\xff\x37\x41\x28\x0a\x3a\xe9\x5d\xe2\xcc\x7f\x4c\x0f\x95\x73\x48\x21\xa6\x4e\xbf\x6c\xb4\x25\xf9\x83\x30\x36\x89\xca\x7d\x34\x63\xce\xff\xe4\x23\xc9\xff\xfc\xf8\xfc\xd2\x88\xe5\xa1\xb5\xec\x89\xb3\x73\xb1\x01\x80\xd6\xcb\xdb\x55\xd6\xfd\xe6\xab\x2f\xa4\xf8\xcd\xd1\x76\xf3\xa9\x46\x94\x7f\x76\x9b\x0d\xd1\x0b\x8d\x4e\x0c\xd6\xdb\x09\x03\x99\x1b\x88\x1b\xf0\x06\x90\x91\xb3\xde\x71\x90\xc9\x9e\xa7\xee\x9f\xe0\xdf\xac\x8b\xe6\x62\x73\xa9\x58\xfe\x77\x09\xf2\x11\x98\xa9\xf2\x23\x1a\x14\x9d\x64\x10\x21\x3a\x63\x76\x48\x10\x36\x73\x3e\x07\x6b\x5a\xe6\x93\xcf\x72\x1e\x90\x9b\x95\x40\x24\x1f\x40\x4d\x90\xcf\x3a\xee\x8d\x61\x1b\x79\xe3\xe2\x84\xf2\x76\xf2\xf2\xf5\x79\x2c\xf8\x02\x19\x2c\x18\xad\x19\xf6\x00\x14\x12\x7d\x42\x8b\x8c\x14\xee\x1c\xe3\x8b\x01\xd1\x8d\xce\xbe\x64\xe5\xda\x01\xf1\x7f\x58\x62\xe6\xd9\x44\x87\x01\x32\xc7\x3d\xb9\x58\x56\xa6\x16\x8a\x75\xd8\x48\xa8\xf7\x33\x94\x48\xf2\x64\x2e\x7b\x0e\x84\x72\xa6\x46\x73\x9e\x6e\xf2\x82\xf9\xda\xa8\x9f\x72\xa8\xb7\x74\x1d\x07\x33\x2b\x98\xdd\x12\x71\x67\x59\xf9\xa0\xb9\xfb\x49\x0d\xbe\xc2\x49\x61\x9f\x0e\x2d\x1a\x10\xb6\x4b\xa7\x50\x69\x10\x59\x13\xa2\xe1\x7b\x73\xf0\x1d\x3e\xb4\x95\x87\x4f\xd4\x71\x78\x73\xde\x3e\x40\x88\xea\x4d\xc0\xb8\xe3\xe1\x3e\xdd\xd8\xb3\x32\x04\xf5\xee\xb3\x09\x15\x7e\xa8\x1b\x77\x1f\xf7\xae\xff\x1d\x97\xb8\x08\x05\xf5\x7f\xbe\xe2\xe1\x66\x5c\x34\x4a\x29\xc3\x0f\xb7\xa6\x97\x03\x79\x0a\x20\x63\xe8\x75\xbc\xf9\x89\xa1\x5c\x54\x25\x05\x58\x1a\x28\x8b\xaf\x11\xba\xd6\x21\xaf\x10\x92\x87\xf4\xdf\x0f\xf7\x4f\xf8\x76\x40\x34\x53\xe1\xde\xfe\x19\xd2\x7e\x58\xf1\x25\x27\xdf\x70\x77\x71\xcf\x64\x5f\x41\x29\x31\xc2\xdb\xed\x9b\xe1\xb8\x29\x9c\x06\x9d\x10\x3d\x84\x23\x9c\x5c\x03\x5c\x74\xbc\xf8\x21\x6e\xd6\xe1\xf8\x85\x17\x0e\x48\xe9\x8c\xdf\x24\xa6\x0e\x0e\x9e\xc0\xa8\x5d\x1d\x4d\xbd\xa1\x7e\xb8\xa7\xbe\x07\x3d\xde\x7a\x77\x5e\x1c\x21\xa7\x88\x21\x48\x92\x7b\xf5\xcf\x17\x39\x44\xe2\xdb\x50\x5b\x1c\xff\xa0\xf5\x43\x2b\x7b\xfe\x6b\xa3\x16\xfa\x50\x23\xbc\xdb\x91\x97\x88\x8f\xf2\xa5\xf0\xa1\x2e\x3c\xc6\xda\x07\x48\x5c\x89\xa5\x7a\x56\xe9\xe7\x1a\x6a\x91\x1e\x5b\x0b\xfc\x35\xa4\x82\x81\x75\x66\x84\x32\x25\x71\xa8\x14\xfd\x47\xf9\x53\x80\xec\x24\x8a\x08\x9e\xce\x2c\x4d\xb6\xc2\xd1\x95\x75\x2f\xf6\xbc\x4f\xee\x3e\x6a\xdf\x13\x85\xb2\xee\x50\xea\xee\xc5\x26\x9e\x41\x84\x16\x37\xc9\xc4\x35\x98\x11\x5d\x4e\x88\x3d\x91\x41\x24\x39\xf9\xe4\xde\xa7\x89\x2f\xe7\x02\x34\x18\x2a\x71\x65\x54\x24\x0f\x34\x1b\x55\x3b\xbc\xa1\x01\x19\x37\x47\x6c\xf2\xb4\x63\xd6\x5a\xa4\xc1\xd4\x49\xf3\x31\x87\x5c\xbc\xcb\x3b\x36\x88\x34\x3c\x31\xf3\xfa\xca\x92\x6c\x43\x17\x6e\xdc\xdd\x66\x1e\x4a\x68\xea\x95\xf4\x35\x6b\x2f\x4b\x3a\x32\xa9\x66\x59\x13\x16\x00\x69\x15\x86\xe6\x25\x00\x4b\x7f\x8e\x97\x30\xeb\x8b\x81\x23\xe4\x22\xf3\x8b\x0e\x96\x21\xe8\x77\x87\x3f\x49\x76\xd0\x7c\xac\x21\x5b\x78\x85\xab\x70\x08\x96\x5c\x17\xf8\x31\xa3\x2d\x24\x1f\x53\x68\x2d\xb6\x17\x03\x2f\x28\x8f\x3c\xa4\x2a\x18\x42\x94\xd0\xa8\x5d\xdb\x3f\x53\xa8\x4d\xfe\xef\xb6\xe1\x39\x84\x1d\x93\xf4\x0c\xf7\x34\xdc\xac\xce\xf6\x91\x60\xe1\x26\xf1\x40\x1f\x36\x78\xf8\xd6\xf8\x94\x86\xac\xcc\x9e\x21\x2b\x70\x1f\xa0\x31\xa9\x62\xc3\x7e\x36\x6d\x9f\xb6\xc1\xdb\x5a\x33\x7b\x33\xd8\x91\xfc\xf9\x02\xf2\x01\x9e\x7e\xd9\xcb\x25\x90\x76\x1d\x56\x7f\x9a\x8f\x52\x48\xcd\x7a\x33\x0b\x52\x20\x02\x4a\x1b\x14\xeb\x7d\x7b\xaa\x8a\x3c\xb2\x4d\x4e\x29\x1d\x34\xb9\x4a\xbc\x64\xcc\x51\x4f\x6d\x29\x76\xc7\x20\xd4\xb2\x6a\x40\x06\x79\x08\x12\xa5\x77\x3c\x13\x04\xad\xf4\xba\x46\x5a\xee\xaf\xd0\x7c\xab\x1d\x20\x9c\x03\xd7\xe0\x21\xcf\x2c\xab\xdf\x20\x45\x62\xf3\x23\xe5\x78\x92\x0f\x88\x3c\x48\x8d\x72\xd6\xbf\xe7\x78\x31\x13\xfb\x2a\xcc\x6c\xb8\xfd\xd3\x27\x8d\x1e\xdc\x85\x48\x08\x86\x23\xee\x05\xd9\xa3\x90\x02\xe1\xc6\x5c\xd4\x58\xfa\x1c\xcd\x06\xba\x63\xbc\x44\xfb\x44\x72\x53\x2e\x85\xf0\x86\xc4\x7c\x29\x3f\xa9\xb7\x6a\x66\x14\x0f\x80\x00\x65\x28\x4f\x62\x0a\x4b\x85\x58\x17\x28\xa1\xef\x62\x48\x5a\x4f\x19\xd2\x4b\x2d\xcf\xe6\xdd\x7e\x42\x30\x26\x7b\x79\x4e\xf7\xce\x5e\x21\x35\xb5\x52\xcc\x80\x45\x3e\x3d\x84\x47\x75\x48\xf5\xe6\xa9\xb6\x53\x1a\xea\x83\x2f\xdd\xf2\x9f\x5b\xd3\x5f\x33\x9c\x67\xfd\xbb\xd7\x45\x57\x49\x7e\x42\xdf\x80\xd7\x5a\xfa\xd8\x35\x2f\x8d\x5c\x73\x48\x43\x30\xd5\x0c\xa9\xbf\x99\xda\x6d\x28\x49\xd2\x7b\x60\xa0\x62\xff\x39\x94\xd6\xd9\x7f\x10\x7a\x84\x7a\xf6\x6f\xee\xb8\xe5\xb6\xea\x6f\xa5\xab\x18\xf0\x06\x6d\xa5\xcf\x3f\x50\x56\x2f\x29\xf0\x8e\xd2\x8d\x0d\x00\xa9\x9f\xd9\x84\x59\x2a\x8b\xb7\x35\x3c\x9f\xcd\xf7\x66\x5e\x6f\x4a\xca\x84\x7e\xa4\x9f\xe2\x94\x2d\xd1\x43\x31\xae\xf0\x2c\x3f\x71\x2d\xc0\x95\x19\xd6\x80\xa1\x21\x59\xef\x36\x83\x80\xb2\x3c\xd5\x05\x1b\xed\x86\x99\x9e\x67\x72\x77\x23\x88\x93\xa8\x52\x07\x53\xb7\x0a\xc4\x60\xd1\x3b\x61\x83\xe4\xf8\x40\xb0\x20\xd5\x4a\x48\xa6\x90\x62\xa1\xaf\xdf\x6f\x96\xde\xe2\xcb\xbb\x09\x2a\x4e\xc6\xda\x31\xb6\x7a\x05\x2e\x19\x8e\xfc\xc6\x1e\x22\x00\xb3\x64\x14\xef\x58\x2d\xb3\xd6\x70\x84\xb4\xe3\x39\x81\x40\xc1\xa1\x8d\xb9\x14\x2d\xe9\xab\xd2\x84\xc0\x5b\x51\x29\x52\x07\x99\x49\x5e\xc8\x97\x9a\x43\x53\xb1\xd6\x2d\x02\xbe\x6c\x42\x1d\xd1\x21\x14\x94\xd4\x15\xa0\xc7\xc1\x3b\xae\x5b\x88\x65\x6e\x87\xa4\x28\xb1\x5c\xa8\x5f\x04\xff\x30\x1c\x63\x12\xd7\xc4\x4a\x36\x91\x52\x95\x0d\x34\x3d\xcd\xc5\x66\xc5\xaa\xe5\x22\x82\x0d\x50\xa5\xbd\xa4\x46\x57\x17\x09\x50\x16\x5d\x60\x9a\xf4\xc3\xbc\x49\x44\x32\x28\xfb\x7b\xd2\x77\xc2\x08\x56\x80\xb9\x43\xbe\x55\x5f\xb2\x0f\xfd\x49\x6a\xf0\x80\xe4\x4a\x34\xb3\xfd\x82\xd5\xd6\x8d\xc8\x5f\xcf\xa2\x47\xb7\x80\x62\x44\x69\x2c\xfd\xd2\x84\x19\x97\x18\x40\x30\xc1\x49\x43\xd3\x93\x0c\x41\x44\xb3\x5a\xd9\x44\x8b\x34\x5d\x9b\x40\x24\xf7\x42\x23\xac\x49\x47\xaa\x73\x05\x18\x14\x37\x0f\x71\x48\xc5\xc3\xf6\x33\x69\x73\xac\xaf\x3a\xa4\xea\x58\xec\x49\xf9\xb4\x08\xa2\x8f\x89\xa9\x5f\x98\xbc\xd1\x42\x75\x62\x7c\x21\x3e\xf7\xd9\x17\x95\x1f\x92\x8c\x4c\x1a\x6d\x81\xd2\xb4\x71\x60\x76\xa9\xc8\xa2\xdd\xfb\x7e\x4b\xa2\x12\xbd\x89\x4e\xb1\xc6\x24\x0d\xe4\x0c\xf7\xce\x75\x05\xe0\x31\xf6\x8e\x63\x9c\x6a\x90\x96\x25\xf4\x47\x42\x1c\x35\x9f\x21\x75\xe8\x4f\xb1\x0a\x49\xfe\x35\xab\x2b\xed\x7d\xf1\x92\xff\xdc\x94\x1d\xd7\x43\x27\x4a\x2a\x89\xd0\xbe\x08\xf9\xc7\x97\x74\x11\x41\xb2\x1c\x4a\x87\x27\x73\x2d\x7b\x10\x46\x95\x3e\x7e\x05\x26\xd2\x1c\xaa\x92\x21\x1a\x09\x22\xcc\x90\x28\x3c\x29\xfb\xa5\x8d\xf3\x8a\xd4\x51\x17\xa8\x44\xba\x2c\xf1\xae\xda\x26\x91\xa7\x01\x24\xa9\x28\xd2\x50\xf3\xd1\xe3\xd4\xe1\x89\xaa\x89\x8d\xcb\x1a\x39\x24\xf1\x49\x23\xe1\x61\xe2\xda\x09\xd2\x49\xf8\x94\x93\xf2\x6e\x7b\xef\xf7\x6b\x20\xc9\x3e\x1e\xbb\x27\x87\xe9\x4e\x8f\x75\x89\x1f\x85\x67\xcb\xe1\x19\xb0\x0c\x43\x11\xea\xeb\xa8\xeb\x4b\x1b\x92\xf2\x20\x28\xef\x26\x82\xd9\x69\x97\x8f\x5b\xbc\xc6\xee\xc9\x54\x25\x70\x12\x10\xc1\xbb\xc1\xa6\x48\x79\xf3\xbc\xdb\x25\x31\xcc\x2d\x64\x72\x95\x71\x6a\xe5\x64\xc6\x63\xe5\x57\x61\xc3\xd1\xae\xe3\x86\xf6\x40\xcc\xae\xd0\xd9\xd6\x9d\x47\x21\xe7\x91\x20\x1e\xc6\xda\xba\x29\x74\xd7\xda\x97\x8e\xa6\x73\x99\xf2\x4c\xb4\xbc\x42\x7f\x93\x92\xb5\x84\xc3\x4f\xef\xd5\x46\xbb\x3b\xf4\x2f\xfb\x38\xb6\x48\x7f\xb2\x17\xc7\x5c\x8f\x40\x7c\x0a\xbf\xa6\xae\x5e\x4c\xda\x31\xc8\x65\xe5\xee\x13\x22\x94\x5f\xea\xca\xfd\x59\x83\x83\x94\xa5\xf4\xeb\xee\x93\x46\x06\x44\x2d\xeb\xab\xf0\xc3\xb1\x8d\x4e\xb2\x93\xa7\xc4\xb3\x6e\x70\x7d\xf5\x9c\xa4\xda\x68\x7e\x35\x85\x4b\xc9\xb3\x00\x29\x2d\x1d\x50\x27\x67\x28\x75\x77\x87\x88\xe5\x31\x85\x24\xd8\xed\x4e\x77\xa1\x12\x87\x83\x57\x57\xd7\xdb\xf8\x25\x18\x08\xe5\xcb\x6d\x90\x0a\xe4\xbd\xea\x8e\x5c\xf3\x84\xa8\x34\x31\xcc\x45\x35\xc3\xa9\xb8\x07\x9c\x38\xfa\xa7\x99\xdb\x7c\x3a\xb7\xce\x4e\xa7\x5b\x67\x33\xdf\xbf\x72\x9a\x12\xc1\x3b\x3c\x84\xcd\x8a\x21\xb4\x33\x3f\x52\x53\x3b\xee\xed\x7c\x71\x01\x1b\x38\x94\xef\x40\x2c\xcb\x7b\x31\x14\xad\x01\xf2\x99\x7a\x27\xc7\xcd\x02\x6a\xcf\x89\xa8\xc9\x8b\x82\x7b\xeb\x43\x50\x9f\xfc\xc0\x0d\x7a\x52\x21\x61\x98\x89\x6e\xf9\xfd\xb4\x3b\x9d\x0d\x8b\x1d\x0b\x54\xb2\xf8\x02\x9d\x21\x27\x50\x9f\x7f\x55\x29\x10\x51\xf0\x8f\xa6\x73\x6a\x8a\x4b\xbf\x63\x07\x04\x30\x68\x8f\x2b\x63\xd2\x8f\xdb\xe1\xca\x71\x8b\x52\xff\x46\xf8\x9c\x6a\x80\x14\xe4\x9f\xa2\xe6\x65\xa3\x1a\x63\x8b\x7d\xab\x93\x32\xe1\xd1\x22\x5d\x00\xb7\xd0\x05\x85\x26\x7b\x3b\x8f\x3c\xf7\x1d\x18\xa1\x36\x01\x4e\x8e\x3d\x13\x6d\x10\x78\x86\x16\x69\xfa\x96\x40\x9f\x96\xfc\x00\x7d\xce\x55\x25\x8b\x50\x5b\x75\x42\x7b\xfd\x6b\x6b\x4a\x61\xd8\xe8\xd3\x15\x50\x29\xbf\xdd\xc1\x74\x8c\xce\x55\xb1\x59\xd7\xd4\x94\x4b\x81\x36\x19\xb5\xee\x1b\x8b\xfd\x5a\x1f\xef\x10\x49\xb5\x11\x78\x27\x0e\x21\xcf\x2d\x54\x3a\xdf\xd2\x38\x84\xd3\xe2\xd2\xf1\xf7\xe5\x0c\x2c\x00\xf3\x8f\xf9\x02\xca\xf7\x67\xf9\xdf\x1d\xff\x3b\x1e\x95\x6e\x08\xe0\xac\x9d\xd0\x69\xe8\x75\x34\xeb\x81\xc8\xfc\x22\x62\x00\x6e\xf0\xdf\x21\x57\x5a\xc1\x02\xed\x7d\x11\x02\x39\x55\x86\xd0\xe8\xf1\x61\xe5\x0e\x15\x12\x03\xb5\x4b\xf3\xb7\xc7\xc4\x4e\xa0\x1e\x89\x55\xaf\xfa\x52\xab\x04\x0f\xeb\xe6\x33\xab\x08\x68\xef\x6a\x48\x43\x75\x10\x55\xe3\xd9\xb6\xa4\x29\xba\x6b\x87\x52\x35\x4f\x64\xfa\x5d\x0d\x51\xbe\x16\x7a\xe5\x88\x65\x61\x6d\x4b\xd0\xe1\x19\x94\x1a\xa9\xe2\x01\xa0\x3d\x7a\x48\xc3\xa2\xab\x13\x62\xd0\x42\x30\x35\x9f\xfb\xb8\xdc\x93\xb0\x2e\xa6\x0e\xa0\x86\xea\xe6\xef\x33\xf3\xe5\x61\x9e\xdb\xb5\x66\xb3\x1e\xde\x10\x42\xa8\x7d\x84\xab\x1b\xec\x79\x6d\x26\x19\x41\xa2\x54\xe5\xcc\xdf\xa4\x81\x91\x66\x1d\xb2\x99\x58\x86\x0a\x29\x65\x11\xe0\xac\x55\xeb\x5a\x62\x7c\x87\xfa\x12\x13\x82\x0d\x35\x39\xd4\x05\xd1\x38\x3c\x57\xd2\xa7\x88\x60\x6c\x8e\x84\x2e\x70\x4a\x85\x4c\x28\x9a\xea\xcb\x7a\xd4\xe3\x19\x11\x24\xdd\x83\x4c\x2a\x5d\xf9\xba\xa7\xac\x43\x48\x4c\x25\xa0\xb3\xcb\x40\x6a\xad\xa7\x78\x9c\x9e\x15\x14\xfa\xea\x8a\xa4\x1c\x6d\xf2\x72\x25\x0f\xf1\x07\x94\x8a\xa1\x3a\x35\xfc\x98\x8f\xb0\xfc\x51\x35\x8e\x6c\x1f\x0a\xa2\x3a\x98\x34\xdb\x34\x44\x67\x0b\x54\x50\xe5\x45\xec\x4a\x04\xa0\x74\x66\x9d\xf2\x8b\x2e\x69\x54\x1b\x9b\x13\x73\x13\x3b\x7a\x26\xba\xfc\x61\x63\x0c\x57\x4e\x07\x56\x0d\xaf\x9d\xf5\x45\xfe\x8b\x1c\x4a\xae\xf6\xa4\x3c\x1c\x49\x1b\xb3\xf4\x50\xaf\x18\x79\x9a\x38\x33\x32\xbb\x6d\x06\x20\xc8\x79\x2b\xd2\xc4\x62\x98\x43\xa2\xd0\x25\x90\x9a\x12\xab\xcd\x38\x0b\xe1\xb3\xc9\xaf\x42\xb1\x87\xad\x1d\x3c\x2a\x92\x26\x85\xe6\x6e\xd6\x01\x64\x6b\x80\x68\xeb\x97\xdd\x5d\x3e\x98\xf2\xdf\x65\x24\xa1\xa9\xae\x1b\x96\x63\x89\xe6\x54\x24\xd3\x6a\x56\x1a\xdf\xbc\xc1\x90\x44\x5d\x99\x87\xd1\x99\x11\x92\x74\xf7\xcb\x22\x5b\x4a\xca\xaa\x01\x43\xf6\xd4\x90\xbb\x65\x5c\x61\xb5\x1c\xf1\x23\x9b\x59\x86\x8c\x69\x7c\x0c\x59\x51\xa7\x5d\xe6\x2c\xa4\xcb\xb3\x9c\xd1\x90\x54\x65\xef\x94\x07\x9d\x0c\xc3\x46\x00\x2f\x43\x1c\x34\x43\x8f\x32\x85\x84\xac\x6d\x68\x6c\xcf\x69\x68\x75\x6a\xfd\x6a\xfa\x4a\x73\xf3\x73\xba\x03\xe3\xff\xff\x3f\xff\xdf\xff\x0d\x00\x00\xff\xff\x9b\xc6\xef\xe7\x7d\x0c\x06\x00")
-
-func dataSurnamesJsonBytes() ([]byte, error) {
- return bindataRead(
- _dataSurnamesJson,
- "data/Surnames.json",
- )
-}
-
-func dataSurnamesJson() (*asset, error) {
- bytes, err := dataSurnamesJsonBytes()
- if err != nil {
- return nil, err
- }
-
- info := bindataFileInfo{name: "data/Surnames.json", size: 396413, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
- a := &asset{bytes: bytes, info: info}
- return a, nil
-}
-
-// Asset loads and returns the asset for the given name.
-// It returns an error if the asset could not be found or
-// could not be loaded.
-func Asset(name string) ([]byte, error) {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- if f, ok := _bindata[cannonicalName]; ok {
- a, err := f()
- if err != nil {
- return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
- }
- return a.bytes, nil
- }
- return nil, fmt.Errorf("Asset %s not found", name)
-}
-
-// MustAsset is like Asset but panics when Asset would return an error.
-// It simplifies safe initialization of global variables.
-func MustAsset(name string) []byte {
- a, err := Asset(name)
- if err != nil {
- panic("asset: Asset(" + name + "): " + err.Error())
- }
-
- return a
-}
-
-// AssetInfo loads and returns the asset info for the given name.
-// It returns an error if the asset could not be found or
-// could not be loaded.
-func AssetInfo(name string) (os.FileInfo, error) {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- if f, ok := _bindata[cannonicalName]; ok {
- a, err := f()
- if err != nil {
- return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
- }
- return a.info, nil
- }
- return nil, fmt.Errorf("AssetInfo %s not found", name)
-}
-
-// AssetNames returns the names of the assets.
-func AssetNames() []string {
- names := make([]string, 0, len(_bindata))
- for name := range _bindata {
- names = append(names, name)
- }
- return names
-}
-
-// _bindata is a table, holding each asset generator, mapped to its name.
-var _bindata = map[string]func() (*asset, error){
- "data/Dvorak.json": dataDvorakJson,
- "data/English.json": dataEnglishJson,
- "data/FemaleNames.json": dataFemalenamesJson,
- "data/Keypad.json": dataKeypadJson,
- "data/L33t.json": dataL33tJson,
- "data/MacKeypad.json": dataMackeypadJson,
- "data/MaleNames.json": dataMalenamesJson,
- "data/Passwords.json": dataPasswordsJson,
- "data/Qwerty.json": dataQwertyJson,
- "data/Surnames.json": dataSurnamesJson,
-}
-
-// AssetDir returns the file names below a certain
-// directory embedded in the file by go-bindata.
-// For example if you run go-bindata on data/... and data contains the
-// following hierarchy:
-// data/
-// foo.txt
-// img/
-// a.png
-// b.png
-// then AssetDir("data") would return []string{"foo.txt", "img"}
-// AssetDir("data/img") would return []string{"a.png", "b.png"}
-// AssetDir("foo.txt") and AssetDir("notexist") would return an error
-// AssetDir("") will return []string{"data"}.
-func AssetDir(name string) ([]string, error) {
- node := _bintree
- if len(name) != 0 {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- pathList := strings.Split(cannonicalName, "/")
- for _, p := range pathList {
- node = node.Children[p]
- if node == nil {
- return nil, fmt.Errorf("Asset %s not found", name)
- }
- }
- }
- if node.Func != nil {
- return nil, fmt.Errorf("Asset %s not found", name)
- }
- rv := make([]string, 0, len(node.Children))
- for childName := range node.Children {
- rv = append(rv, childName)
- }
- return rv, nil
-}
-
-type bintree struct {
- Func func() (*asset, error)
- Children map[string]*bintree
-}
-
-var _bintree = &bintree{nil, map[string]*bintree{
- "data": &bintree{nil, map[string]*bintree{
- "Dvorak.json": &bintree{dataDvorakJson, map[string]*bintree{}},
- "English.json": &bintree{dataEnglishJson, map[string]*bintree{}},
- "FemaleNames.json": &bintree{dataFemalenamesJson, map[string]*bintree{}},
- "Keypad.json": &bintree{dataKeypadJson, map[string]*bintree{}},
- "L33t.json": &bintree{dataL33tJson, map[string]*bintree{}},
- "MacKeypad.json": &bintree{dataMackeypadJson, map[string]*bintree{}},
- "MaleNames.json": &bintree{dataMalenamesJson, map[string]*bintree{}},
- "Passwords.json": &bintree{dataPasswordsJson, map[string]*bintree{}},
- "Qwerty.json": &bintree{dataQwertyJson, map[string]*bintree{}},
- "Surnames.json": &bintree{dataSurnamesJson, map[string]*bintree{}},
- }},
-}}
-
-// RestoreAsset restores an asset under the given directory
-func RestoreAsset(dir, name string) error {
- data, err := Asset(name)
- if err != nil {
- return err
- }
- info, err := AssetInfo(name)
- if err != nil {
- return err
- }
- err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
- if err != nil {
- return err
- }
- err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
- if err != nil {
- return err
- }
- err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
- if err != nil {
- return err
- }
- return nil
-}
-
-// RestoreAssets restores an asset under the given directory recursively
-func RestoreAssets(dir, name string) error {
- children, err := AssetDir(name)
- // File
- if err != nil {
- return RestoreAsset(dir, name)
- }
- // Dir
- for _, child := range children {
- err = RestoreAssets(dir, filepath.Join(name, child))
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-func _filePath(dir, name string) string {
- cannonicalName := strings.Replace(name, "\\", "/", -1)
- return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go
deleted file mode 100644
index 028732d26..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go
+++ /dev/null
@@ -1,215 +0,0 @@
-package entropy
-
-import (
- "github.com/nbutton23/zxcvbn-go/adjacency"
- "github.com/nbutton23/zxcvbn-go/match"
- "github.com/nbutton23/zxcvbn-go/utils/math"
- "math"
- "regexp"
- "unicode"
-)
-
-const (
- START_UPPER string = `^[A-Z][^A-Z]+$`
- END_UPPER string = `^[^A-Z]+[A-Z]$'`
- ALL_UPPER string = `^[A-Z]+$`
- NUM_YEARS = float64(119) // years match against 1900 - 2019
- NUM_MONTHS = float64(12)
- NUM_DAYS = float64(31)
-)
-
-var (
- KEYPAD_STARTING_POSITIONS = len(adjacency.AdjacencyGph["keypad"].Graph)
- KEYPAD_AVG_DEGREE = adjacency.AdjacencyGph["keypad"].CalculateAvgDegree()
-)
-
-func DictionaryEntropy(match match.Match, rank float64) float64 {
- baseEntropy := math.Log2(rank)
- upperCaseEntropy := extraUpperCaseEntropy(match)
- //TODO: L33t
- return baseEntropy + upperCaseEntropy
-}
-
-func extraUpperCaseEntropy(match match.Match) float64 {
- word := match.Token
-
- allLower := true
-
- for _, char := range word {
- if unicode.IsUpper(char) {
- allLower = false
- break
- }
- }
- if allLower {
- return float64(0)
- }
-
- //a capitalized word is the most common capitalization scheme,
- //so it only doubles the search space (uncapitalized + capitalized): 1 extra bit of entropy.
- //allcaps and end-capitalized are common enough too, underestimate as 1 extra bit to be safe.
-
- for _, regex := range []string{START_UPPER, END_UPPER, ALL_UPPER} {
- matcher := regexp.MustCompile(regex)
-
- if matcher.MatchString(word) {
- return float64(1)
- }
- }
- //Otherwise calculate the number of ways to capitalize U+L uppercase+lowercase letters with U uppercase letters or
- //less. Or, if there's more uppercase than lower (for e.g. PASSwORD), the number of ways to lowercase U+L letters
- //with L lowercase letters or less.
-
- countUpper, countLower := float64(0), float64(0)
- for _, char := range word {
- if unicode.IsUpper(char) {
- countUpper++
- } else if unicode.IsLower(char) {
- countLower++
- }
- }
- totalLenght := countLower + countUpper
- var possibililities float64
-
- for i := float64(0); i <= math.Min(countUpper, countLower); i++ {
- possibililities += float64(zxcvbn_math.NChoseK(totalLenght, i))
- }
-
- if possibililities < 1 {
- return float64(1)
- }
-
- return float64(math.Log2(possibililities))
-}
-
-func SpatialEntropy(match match.Match, turns int, shiftCount int) float64 {
- var s, d float64
- if match.DictionaryName == "qwerty" || match.DictionaryName == "dvorak" {
- //todo: verify qwerty and dvorak have the same length and degree
- s = float64(len(adjacency.BuildQwerty().Graph))
- d = adjacency.BuildQwerty().CalculateAvgDegree()
- } else {
- s = float64(KEYPAD_STARTING_POSITIONS)
- d = KEYPAD_AVG_DEGREE
- }
-
- possibilities := float64(0)
-
- length := float64(len(match.Token))
-
- //TODO: Should this be <= or just < ?
- //Estimate the number of possible patterns w/ length L or less with t turns or less
- for i := float64(2); i <= length+1; i++ {
- possibleTurns := math.Min(float64(turns), i-1)
- for j := float64(1); j <= possibleTurns+1; j++ {
- x := zxcvbn_math.NChoseK(i-1, j-1) * s * math.Pow(d, j)
- possibilities += x
- }
- }
-
- entropy := math.Log2(possibilities)
- //add extra entropu for shifted keys. ( % instead of 5 A instead of a)
- //Math is similar to extra entropy for uppercase letters in dictionary matches.
-
- if S := float64(shiftCount); S > float64(0) {
- possibilities = float64(0)
- U := length - S
-
- for i := float64(0); i < math.Min(S, U)+1; i++ {
- possibilities += zxcvbn_math.NChoseK(S+U, i)
- }
-
- entropy += math.Log2(possibilities)
- }
-
- return entropy
-}
-
-func RepeatEntropy(match match.Match) float64 {
- cardinality := CalcBruteForceCardinality(match.Token)
- entropy := math.Log2(cardinality * float64(len(match.Token)))
-
- return entropy
-}
-
-//TODO: Validate against python
-func CalcBruteForceCardinality(password string) float64 {
- lower, upper, digits, symbols := float64(0), float64(0), float64(0), float64(0)
-
- for _, char := range password {
- if unicode.IsLower(char) {
- lower = float64(26)
- } else if unicode.IsDigit(char) {
- digits = float64(10)
- } else if unicode.IsUpper(char) {
- upper = float64(26)
- } else {
- symbols = float64(33)
- }
- }
-
- cardinality := lower + upper + digits + symbols
- return cardinality
-}
-
-func SequenceEntropy(match match.Match, dictionaryLength int, ascending bool) float64 {
- firstChar := match.Token[0]
- baseEntropy := float64(0)
- if string(firstChar) == "a" || string(firstChar) == "1" {
- baseEntropy = float64(0)
- } else {
- baseEntropy = math.Log2(float64(dictionaryLength))
- //TODO: should this be just the first or any char?
- if unicode.IsUpper(rune(firstChar)) {
- baseEntropy++
- }
- }
-
- if !ascending {
- baseEntropy++
- }
- return baseEntropy + math.Log2(float64(len(match.Token)))
-}
-
-func ExtraLeetEntropy(match match.Match, password string) float64 {
- var subsitutions float64
- var unsub float64
- subPassword := password[match.I:match.J]
- for index, char := range subPassword {
- if string(char) != string(match.Token[index]) {
- subsitutions++
- } else {
- //TODO: Make this only true for 1337 chars that are not subs?
- unsub++
- }
- }
-
- var possibilities float64
-
- for i := float64(0); i <= math.Min(subsitutions, unsub)+1; i++ {
- possibilities += zxcvbn_math.NChoseK(subsitutions+unsub, i)
- }
-
- if possibilities <= 1 {
- return float64(1)
- }
- return math.Log2(possibilities)
-}
-
-func YearEntropy(dateMatch match.DateMatch) float64 {
- return math.Log2(NUM_YEARS)
-}
-
-func DateEntropy(dateMatch match.DateMatch) float64 {
- var entropy float64
- if dateMatch.Year < 100 {
- entropy = math.Log2(NUM_DAYS * NUM_MONTHS * 100)
- } else {
- entropy = math.Log2(NUM_DAYS * NUM_MONTHS * NUM_YEARS)
- }
-
- if dateMatch.Separator != "" {
- entropy += 2 //add two bits for separator selection [/,-,.,etc]
- }
- return entropy
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go
deleted file mode 100644
index 5718830ad..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package frequency
-
-import (
- "encoding/json"
- "github.com/nbutton23/zxcvbn-go/data"
- "log"
-)
-
-type FrequencyList struct {
- Name string
- List []string
-}
-
-var FrequencyLists = make(map[string]FrequencyList)
-
-func init() {
- maleFilePath := getAsset("data/MaleNames.json")
- femaleFilePath := getAsset("data/FemaleNames.json")
- surnameFilePath := getAsset("data/Surnames.json")
- englishFilePath := getAsset("data/English.json")
- passwordsFilePath := getAsset("data/Passwords.json")
-
- FrequencyLists["MaleNames"] = GetStringListFromAsset(maleFilePath, "MaleNames")
- FrequencyLists["FemaleNames"] = GetStringListFromAsset(femaleFilePath, "FemaleNames")
- FrequencyLists["Surname"] = GetStringListFromAsset(surnameFilePath, "Surname")
- FrequencyLists["English"] = GetStringListFromAsset(englishFilePath, "English")
- FrequencyLists["Passwords"] = GetStringListFromAsset(passwordsFilePath, "Passwords")
-
-}
-func getAsset(name string) []byte {
- data, err := zxcvbn_data.Asset(name)
- if err != nil {
- panic("Error getting asset " + name)
- }
-
- return data
-}
-func GetStringListFromAsset(data []byte, name string) FrequencyList {
-
- var tempList FrequencyList
- err := json.Unmarshal(data, &tempList)
- if err != nil {
- log.Fatal(err)
- }
- tempList.Name = name
- return tempList
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/match/match.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/match/match.go
deleted file mode 100644
index b79129f41..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/match/match.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package match
-
-type Matches []Match
-
-func (s Matches) Len() int {
- return len(s)
-}
-func (s Matches) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
-func (s Matches) Less(i, j int) bool {
- if s[i].I < s[j].I {
- return true
- } else if s[i].I == s[j].I {
- return s[i].J < s[j].J
- } else {
- return false
- }
-}
-
-type Match struct {
- Pattern string
- I, J int
- Token string
- DictionaryName string
- Entropy float64
-}
-
-type DateMatch struct {
- Pattern string
- I, J int
- Token string
- Separator string
- Day, Month, Year int64
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go
deleted file mode 100644
index dc5c7ac49..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go
+++ /dev/null
@@ -1,189 +0,0 @@
-package matching
-
-import (
- "github.com/nbutton23/zxcvbn-go/entropy"
- "github.com/nbutton23/zxcvbn-go/match"
- "regexp"
- "strconv"
- "strings"
-)
-
-func checkDate(day, month, year int64) (bool, int64, int64, int64) {
- if (12 <= month && month <= 31) && day <= 12 {
- day, month = month, day
- }
-
- if day > 31 || month > 12 {
- return false, 0, 0, 0
- }
-
- if !((1900 <= year && year <= 2019) || (0 <= year && year <= 99)) {
- return false, 0, 0, 0
- }
-
- return true, day, month, year
-}
-func dateSepMatcher(password string) []match.Match {
- dateMatches := dateSepMatchHelper(password)
-
- var matches []match.Match
- for _, dateMatch := range dateMatches {
- match := match.Match{
- I: dateMatch.I,
- J: dateMatch.J,
- Entropy: entropy.DateEntropy(dateMatch),
- DictionaryName: "date_match",
- Token: dateMatch.Token,
- }
-
- matches = append(matches, match)
- }
-
- return matches
-}
-func dateSepMatchHelper(password string) []match.DateMatch {
-
- var matches []match.DateMatch
-
- matcher := regexp.MustCompile(DATE_RX_YEAR_SUFFIX)
- for _, v := range matcher.FindAllString(password, len(password)) {
- splitV := matcher.FindAllStringSubmatch(v, len(v))
- i := strings.Index(password, v)
- j := i + len(v)
- day, _ := strconv.ParseInt(splitV[0][4], 10, 16)
- month, _ := strconv.ParseInt(splitV[0][2], 10, 16)
- year, _ := strconv.ParseInt(splitV[0][6], 10, 16)
- match := match.DateMatch{Day: day, Month: month, Year: year, Separator: splitV[0][5], I: i, J: j, Token: password[i:j]}
- matches = append(matches, match)
- }
-
- matcher = regexp.MustCompile(DATE_RX_YEAR_PREFIX)
- for _, v := range matcher.FindAllString(password, len(password)) {
- splitV := matcher.FindAllStringSubmatch(v, len(v))
- i := strings.Index(password, v)
- j := i + len(v)
- day, _ := strconv.ParseInt(splitV[0][4], 10, 16)
- month, _ := strconv.ParseInt(splitV[0][6], 10, 16)
- year, _ := strconv.ParseInt(splitV[0][2], 10, 16)
- match := match.DateMatch{Day: day, Month: month, Year: year, Separator: splitV[0][5], I: i, J: j, Token: password[i:j]}
- matches = append(matches, match)
- }
-
- var out []match.DateMatch
- for _, match := range matches {
- if valid, day, month, year := checkDate(match.Day, match.Month, match.Year); valid {
- match.Pattern = "date"
- match.Day = day
- match.Month = month
- match.Year = year
- out = append(out, match)
- }
- }
- return out
-
-}
-
-type DateMatchCandidate struct {
- DayMonth string
- Year string
- I, J int
-}
-
-type DateMatchCandidateTwo struct {
- Day string
- Month string
- Year string
- I, J int
-}
-
-func dateWithoutSepMatch(password string) []match.Match {
- dateMatches := dateWithoutSepMatchHelper(password)
-
- var matches []match.Match
- for _, dateMatch := range dateMatches {
- match := match.Match{
- I: dateMatch.I,
- J: dateMatch.J,
- Entropy: entropy.DateEntropy(dateMatch),
- DictionaryName: "date_match",
- Token: dateMatch.Token,
- }
-
- matches = append(matches, match)
- }
-
- return matches
-}
-
-//TODO Has issues with 6 digit dates
-func dateWithoutSepMatchHelper(password string) (matches []match.DateMatch) {
- matcher := regexp.MustCompile(DATE_WITHOUT_SEP_MATCH)
- for _, v := range matcher.FindAllString(password, len(password)) {
- i := strings.Index(password, v)
- j := i + len(v)
- length := len(v)
- lastIndex := length - 1
- var candidatesRoundOne []DateMatchCandidate
-
- if length <= 6 {
- //2-digit year prefix
- candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[2:], v[0:2], i, j))
-
- //2-digityear suffix
- candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[0:lastIndex-2], v[lastIndex-2:], i, j))
- }
- if length >= 6 {
- //4-digit year prefix
- candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[4:], v[0:4], i, j))
-
- //4-digit year sufix
- candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[0:lastIndex-3], v[lastIndex-3:], i, j))
- }
-
- var candidatesRoundTwo []DateMatchCandidateTwo
- for _, c := range candidatesRoundOne {
- if len(c.DayMonth) == 2 {
- candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:0], c.DayMonth[1:1], c.Year, c.I, c.J))
- } else if len(c.DayMonth) == 3 {
- candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:2], c.DayMonth[2:2], c.Year, c.I, c.J))
- candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:0], c.DayMonth[1:3], c.Year, c.I, c.J))
- } else if len(c.DayMonth) == 4 {
- candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:2], c.DayMonth[2:4], c.Year, c.I, c.J))
- }
- }
-
- for _, candidate := range candidatesRoundTwo {
- intDay, err := strconv.ParseInt(candidate.Day, 10, 16)
- if err != nil {
- continue
- }
-
- intMonth, err := strconv.ParseInt(candidate.Month, 10, 16)
-
- if err != nil {
- continue
- }
-
- intYear, err := strconv.ParseInt(candidate.Year, 10, 16)
- if err != nil {
- continue
- }
-
- if ok, _, _, _ := checkDate(intDay, intMonth, intYear); ok {
- matches = append(matches, match.DateMatch{Token: password, Pattern: "date", Day: intDay, Month: intMonth, Year: intYear, I: i, J: j})
- }
-
- }
- }
-
- return matches
-}
-
-func buildDateMatchCandidate(dayMonth, year string, i, j int) DateMatchCandidate {
- return DateMatchCandidate{DayMonth: dayMonth, Year: year, I: i, J: j}
-}
-
-func buildDateMatchCandidateTwo(day, month string, year string, i, j int) DateMatchCandidateTwo {
-
- return DateMatchCandidateTwo{Day: day, Month: month, Year: year, I: i, J: j}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go
deleted file mode 100644
index b76921f0d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package matching
-
-import (
- "github.com/nbutton23/zxcvbn-go/entropy"
- "github.com/nbutton23/zxcvbn-go/match"
- "strings"
-)
-
-func buildDictMatcher(dictName string, rankedDict map[string]int) func(password string) []match.Match {
- return func(password string) []match.Match {
- matches := dictionaryMatch(password, dictName, rankedDict)
- for _, v := range matches {
- v.DictionaryName = dictName
- }
- return matches
- }
-
-}
-
-func dictionaryMatch(password string, dictionaryName string, rankedDict map[string]int) []match.Match {
- length := len(password)
- var results []match.Match
- pwLower := strings.ToLower(password)
-
- for i := 0; i < length; i++ {
- for j := i; j < length; j++ {
- word := pwLower[i : j+1]
- if val, ok := rankedDict[word]; ok {
- matchDic := match.Match{Pattern: "dictionary",
- DictionaryName: dictionaryName,
- I: i,
- J: j,
- Token: password[i : j+1],
- }
- matchDic.Entropy = entropy.DictionaryEntropy(matchDic, float64(val))
-
- results = append(results, matchDic)
- }
- }
- }
-
- return results
-}
-
-func buildRankedDict(unrankedList []string) map[string]int {
-
- result := make(map[string]int)
-
- for i, v := range unrankedList {
- result[strings.ToLower(v)] = i + 1
- }
-
- return result
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go
deleted file mode 100644
index 29700e8db..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package matching
-
-import (
- "github.com/nbutton23/zxcvbn-go/entropy"
- "github.com/nbutton23/zxcvbn-go/match"
- "strings"
-)
-
-func l33tMatch(password string) []match.Match {
-
- substitutions := relevantL33tSubtable(password)
-
- permutations := getAllPermutationsOfLeetSubstitutions(password, substitutions)
-
- var matches []match.Match
-
- for _, permutation := range permutations {
- for _, mather := range DICTIONARY_MATCHERS {
- matches = append(matches, mather(permutation)...)
- }
- }
-
- for _, match := range matches {
- match.Entropy += entropy.ExtraLeetEntropy(match, password)
- match.DictionaryName = match.DictionaryName + "_3117"
- }
-
- return matches
-}
-
-func getAllPermutationsOfLeetSubstitutions(password string, substitutionsMap map[string][]string) []string {
-
- var permutations []string
-
- for index, char := range password {
- for value, splice := range substitutionsMap {
- for _, sub := range splice {
- if string(char) == sub {
- var permutation string
- permutation = password[:index] + value + password[index+1:]
-
- permutations = append(permutations, permutation)
- if index < len(permutation) {
- tempPermutations := getAllPermutationsOfLeetSubstitutions(permutation[index+1:], substitutionsMap)
- for _, temp := range tempPermutations {
- permutations = append(permutations, permutation[:index+1]+temp)
- }
-
- }
- }
- }
- }
- }
-
- return permutations
-}
-
-func relevantL33tSubtable(password string) map[string][]string {
- relevantSubs := make(map[string][]string)
- for key, values := range L33T_TABLE.Graph {
- for _, value := range values {
- if strings.Contains(password, value) {
- relevantSubs[key] = append(relevantSubs[key], value)
- }
- }
- }
- return relevantSubs
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go
deleted file mode 100644
index 024a28424..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package matching
-
-import (
- "github.com/nbutton23/zxcvbn-go/adjacency"
- "github.com/nbutton23/zxcvbn-go/frequency"
- "github.com/nbutton23/zxcvbn-go/match"
- "sort"
-)
-
-var (
- DICTIONARY_MATCHERS []func(password string) []match.Match
- MATCHERS []func(password string) []match.Match
- ADJACENCY_GRAPHS []adjacency.AdjacencyGraph
- L33T_TABLE adjacency.AdjacencyGraph
-
- SEQUENCES map[string]string
-)
-
-const (
- DATE_RX_YEAR_SUFFIX string = `((\d{1,2})(\s|-|\/|\\|_|\.)(\d{1,2})(\s|-|\/|\\|_|\.)(19\d{2}|200\d|201\d|\d{2}))`
- DATE_RX_YEAR_PREFIX string = `((19\d{2}|200\d|201\d|\d{2})(\s|-|/|\\|_|\.)(\d{1,2})(\s|-|/|\\|_|\.)(\d{1,2}))`
- DATE_WITHOUT_SEP_MATCH string = `\d{4,8}`
-)
-
-func init() {
- loadFrequencyList()
-}
-
-func Omnimatch(password string, userInputs []string) (matches []match.Match) {
-
- //Can I run into the issue where nil is not equal to nil?
- if DICTIONARY_MATCHERS == nil || ADJACENCY_GRAPHS == nil {
- loadFrequencyList()
- }
-
- if userInputs != nil {
- userInputMatcher := buildDictMatcher("user_inputs", buildRankedDict(userInputs))
- matches = userInputMatcher(password)
- }
-
- for _, matcher := range MATCHERS {
- matches = append(matches, matcher(password)...)
- }
- sort.Sort(match.Matches(matches))
- return matches
-}
-
-func loadFrequencyList() {
-
- for n, list := range frequency.FrequencyLists {
- DICTIONARY_MATCHERS = append(DICTIONARY_MATCHERS, buildDictMatcher(n, buildRankedDict(list.List)))
- }
-
- L33T_TABLE = adjacency.AdjacencyGph["l33t"]
-
- ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["qwerty"])
- ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["dvorak"])
- ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["keypad"])
- ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["macKeypad"])
-
- //l33tFilePath, _ := filepath.Abs("adjacency/L33t.json")
- //L33T_TABLE = adjacency.GetAdjancencyGraphFromFile(l33tFilePath, "l33t")
-
- SEQUENCES = make(map[string]string)
- SEQUENCES["lower"] = "abcdefghijklmnopqrstuvwxyz"
- SEQUENCES["upper"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- SEQUENCES["digits"] = "0123456789"
-
- MATCHERS = append(MATCHERS, DICTIONARY_MATCHERS...)
- MATCHERS = append(MATCHERS, spatialMatch)
- MATCHERS = append(MATCHERS, repeatMatch)
- MATCHERS = append(MATCHERS, sequenceMatch)
- MATCHERS = append(MATCHERS, l33tMatch)
- MATCHERS = append(MATCHERS, dateSepMatcher)
- MATCHERS = append(MATCHERS, dateWithoutSepMatch)
-
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go
deleted file mode 100644
index eed71860c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package matching
-
-import (
- "github.com/nbutton23/zxcvbn-go/entropy"
- "github.com/nbutton23/zxcvbn-go/match"
- "strings"
-)
-
-func repeatMatch(password string) []match.Match {
- var matches []match.Match
-
- //Loop through password. if current == prev currentStreak++ else if currentStreak > 2 {buildMatch; currentStreak = 1} prev = current
- var current, prev string
- currentStreak := 1
- var i int
- var char rune
- for i, char = range password {
- current = string(char)
- if i == 0 {
- prev = current
- continue
- }
-
- if strings.ToLower(current) == strings.ToLower(prev) {
- currentStreak++
-
- } else if currentStreak > 2 {
- iPos := i - currentStreak
- jPos := i - 1
- matchRepeat := match.Match{
- Pattern: "repeat",
- I: iPos,
- J: jPos,
- Token: password[iPos : jPos+1],
- DictionaryName: prev}
- matchRepeat.Entropy = entropy.RepeatEntropy(matchRepeat)
- matches = append(matches, matchRepeat)
- currentStreak = 1
- } else {
- currentStreak = 1
- }
-
- prev = current
- }
-
- if currentStreak > 2 {
- iPos := i - currentStreak + 1
- jPos := i
- matchRepeat := match.Match{
- Pattern: "repeat",
- I: iPos,
- J: jPos,
- Token: password[iPos : jPos+1],
- DictionaryName: prev}
- matchRepeat.Entropy = entropy.RepeatEntropy(matchRepeat)
- matches = append(matches, matchRepeat)
- }
- return matches
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go
deleted file mode 100644
index f75aebf13..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package matching
-
-import (
- "github.com/nbutton23/zxcvbn-go/entropy"
- "github.com/nbutton23/zxcvbn-go/match"
- "strings"
-)
-
-func sequenceMatch(password string) []match.Match {
- var matches []match.Match
- for i := 0; i < len(password); {
- j := i + 1
- var seq string
- var seqName string
- seqDirection := 0
- for seqCandidateName, seqCandidate := range SEQUENCES {
- iN := strings.Index(seqCandidate, string(password[i]))
- var jN int
- if j < len(password) {
- jN = strings.Index(seqCandidate, string(password[j]))
- } else {
- jN = -1
- }
-
- if iN > -1 && jN > -1 {
- direction := jN - iN
- if direction == 1 || direction == -1 {
- seq = seqCandidate
- seqName = seqCandidateName
- seqDirection = direction
- break
- }
- }
-
- }
-
- if seq != "" {
- for {
- var prevN, curN int
- if j < len(password) {
- prevChar, curChar := password[j-1], password[j]
- prevN, curN = strings.Index(seq, string(prevChar)), strings.Index(seq, string(curChar))
- }
-
- if j == len(password) || curN-prevN != seqDirection {
- if j-i > 2 {
- matchSequence := match.Match{
- Pattern: "sequence",
- I: i,
- J: j - 1,
- Token: password[i:j],
- DictionaryName: seqName,
- }
-
- matchSequence.Entropy = entropy.SequenceEntropy(matchSequence, len(seq), (seqDirection == 1))
- matches = append(matches, matchSequence)
- }
- break
- } else {
- j += 1
- }
-
- }
- }
- i = j
- }
- return matches
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go
deleted file mode 100644
index e2db0f356..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go
+++ /dev/null
@@ -1,80 +0,0 @@
-package matching
-
-import (
- "github.com/nbutton23/zxcvbn-go/adjacency"
- "github.com/nbutton23/zxcvbn-go/entropy"
- "github.com/nbutton23/zxcvbn-go/match"
- "strings"
-)
-
-func spatialMatch(password string) (matches []match.Match) {
- for _, graph := range ADJACENCY_GRAPHS {
- if graph.Graph != nil {
- matches = append(matches, spatialMatchHelper(password, graph)...)
- }
- }
- return matches
-}
-
-func spatialMatchHelper(password string, graph adjacency.AdjacencyGraph) (matches []match.Match) {
-
- for i := 0; i < len(password)-1; {
- j := i + 1
- lastDirection := -99 //an int that it should never be!
- turns := 0
- shiftedCount := 0
-
- for {
- prevChar := password[j-1]
- found := false
- foundDirection := -1
- curDirection := -1
- //My graphs seem to be wrong. . . and where the hell is qwerty
- adjacents := graph.Graph[string(prevChar)]
- //Consider growing pattern by one character if j hasn't gone over the edge
- if j < len(password) {
- curChar := password[j]
- for _, adj := range adjacents {
- curDirection += 1
-
- if strings.Index(adj, string(curChar)) != -1 {
- found = true
- foundDirection = curDirection
-
- if strings.Index(adj, string(curChar)) == 1 {
- //index 1 in the adjacency means the key is shifted, 0 means unshifted: A vs a, % vs 5, etc.
- //for example, 'q' is adjacent to the entry '2@'. @ is shifted w/ index 1, 2 is unshifted.
- shiftedCount += 1
- }
-
- if lastDirection != foundDirection {
- //adding a turn is correct even in the initial case when last_direction is null:
- //every spatial pattern starts with a turn.
- turns += 1
- lastDirection = foundDirection
- }
- break
- }
- }
- }
-
- //if the current pattern continued, extend j and try to grow again
- if found {
- j += 1
- } else {
- //otherwise push the pattern discovered so far, if any...
- //don't consider length 1 or 2 chains.
- if j-i > 2 {
- matchSpc := match.Match{Pattern: "spatial", I: i, J: j - 1, Token: password[i:j], DictionaryName: graph.Name}
- matchSpc.Entropy = entropy.SpatialEntropy(matchSpc, turns, shiftedCount)
- matches = append(matches, matchSpc)
- }
- //. . . and then start a new search from the rest of the password
- i = j
- break
- }
- }
-
- }
- return matches
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go
deleted file mode 100644
index 0456fd7c2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go
+++ /dev/null
@@ -1,180 +0,0 @@
-package scoring
-
-import (
- "fmt"
- "github.com/nbutton23/zxcvbn-go/entropy"
- "github.com/nbutton23/zxcvbn-go/match"
- "github.com/nbutton23/zxcvbn-go/utils/math"
- "math"
- "sort"
-)
-
-const (
- START_UPPER string = `^[A-Z][^A-Z]+$`
- END_UPPER string = `^[^A-Z]+[A-Z]$'`
- ALL_UPPER string = `^[A-Z]+$`
-
- //for a hash function like bcrypt/scrypt/PBKDF2, 10ms per guess is a safe lower bound.
- //(usually a guess would take longer -- this assumes fast hardware and a small work factor.)
- //adjust for your site accordingly if you use another hash function, possibly by
- //several orders of magnitude!
- SINGLE_GUESS float64 = 0.010
- NUM_ATTACKERS float64 = 100 //Cores used to make guesses
- SECONDS_PER_GUESS float64 = SINGLE_GUESS / NUM_ATTACKERS
-)
-
-type MinEntropyMatch struct {
- Password string
- Entropy float64
- MatchSequence []match.Match
- CrackTime float64
- CrackTimeDisplay string
- Score int
- CalcTime float64
-}
-
-/*
-Returns minimum entropy
-
- Takes a list of overlapping matches, returns the non-overlapping sublist with
- minimum entropy. O(nm) dp alg for length-n password with m candidate matches.
-*/
-func MinimumEntropyMatchSequence(password string, matches []match.Match) MinEntropyMatch {
- bruteforceCardinality := float64(entropy.CalcBruteForceCardinality(password))
- upToK := make([]float64, len(password))
- backPointers := make([]match.Match, len(password))
-
- for k := 0; k < len(password); k++ {
- upToK[k] = get(upToK, k-1) + math.Log2(bruteforceCardinality)
-
- for _, match := range matches {
- if match.J != k {
- continue
- }
-
- i, j := match.I, match.J
- //see if best entropy up to i-1 + entropy of match is less that current min at j
- upTo := get(upToK, i-1)
- candidateEntropy := upTo + match.Entropy
-
- if candidateEntropy < upToK[j] {
- upToK[j] = candidateEntropy
- match.Entropy = candidateEntropy
- backPointers[j] = match
- }
- }
- }
-
- //walk backwards and decode the best sequence
- var matchSequence []match.Match
- passwordLen := len(password)
- passwordLen--
- for k := passwordLen; k >= 0; {
- match := backPointers[k]
- if match.Pattern != "" {
- matchSequence = append(matchSequence, match)
- k = match.I - 1
-
- } else {
- k--
- }
-
- }
- sort.Sort(match.Matches(matchSequence))
-
- makeBruteForceMatch := func(i, j int) match.Match {
- return match.Match{Pattern: "bruteforce",
- I: i,
- J: j,
- Token: password[i : j+1],
- Entropy: math.Log2(math.Pow(bruteforceCardinality, float64(j-i)))}
-
- }
-
- k := 0
- var matchSequenceCopy []match.Match
- for _, match := range matchSequence {
- i, j := match.I, match.J
- if i-k > 0 {
- matchSequenceCopy = append(matchSequenceCopy, makeBruteForceMatch(k, i-1))
- }
- k = j + 1
- matchSequenceCopy = append(matchSequenceCopy, match)
- }
-
- if k < len(password) {
- matchSequenceCopy = append(matchSequenceCopy, makeBruteForceMatch(k, len(password)-1))
- }
- var minEntropy float64
- if len(password) == 0 {
- minEntropy = float64(0)
- } else {
- minEntropy = upToK[len(password)-1]
- }
-
- crackTime := roundToXDigits(entropyToCrackTime(minEntropy), 3)
- return MinEntropyMatch{Password: password,
- Entropy: roundToXDigits(minEntropy, 3),
- MatchSequence: matchSequenceCopy,
- CrackTime: crackTime,
- CrackTimeDisplay: displayTime(crackTime),
- Score: crackTimeToScore(crackTime)}
-
-}
-func get(a []float64, i int) float64 {
- if i < 0 || i >= len(a) {
- return float64(0)
- }
-
- return a[i]
-}
-
-func entropyToCrackTime(entropy float64) float64 {
- crackTime := (0.5 * math.Pow(float64(2), entropy)) * SECONDS_PER_GUESS
-
- return crackTime
-}
-
-func roundToXDigits(number float64, digits int) float64 {
- return zxcvbn_math.Round(number, .5, digits)
-}
-
-func displayTime(seconds float64) string {
- formater := "%.1f %s"
- minute := float64(60)
- hour := minute * float64(60)
- day := hour * float64(24)
- month := day * float64(31)
- year := month * float64(12)
- century := year * float64(100)
-
- if seconds < minute {
- return "instant"
- } else if seconds < hour {
- return fmt.Sprintf(formater, (1 + math.Ceil(seconds/minute)), "minutes")
- } else if seconds < day {
- return fmt.Sprintf(formater, (1 + math.Ceil(seconds/hour)), "hours")
- } else if seconds < month {
- return fmt.Sprintf(formater, (1 + math.Ceil(seconds/day)), "days")
- } else if seconds < year {
- return fmt.Sprintf(formater, (1 + math.Ceil(seconds/month)), "months")
- } else if seconds < century {
- return fmt.Sprintf(formater, (1 + math.Ceil(seconds/century)), "years")
- } else {
- return "centuries"
- }
-}
-
-func crackTimeToScore(seconds float64) int {
- if seconds < math.Pow(10, 2) {
- return 0
- } else if seconds < math.Pow(10, 4) {
- return 1
- } else if seconds < math.Pow(10, 6) {
- return 2
- } else if seconds < math.Pow(10, 8) {
- return 3
- }
-
- return 4
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go
deleted file mode 100644
index d885479c3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package zxcvbn_math
-
-import "math"
-
-/**
-I am surprised that I have to define these. . . Maybe i just didn't look hard enough for a lib.
-*/
-
-//http://blog.plover.com/math/choose.html
-func NChoseK(n, k float64) float64 {
- if k > n {
- return 0
- } else if k == 0 {
- return 1
- }
-
- var r float64 = 1
-
- for d := float64(1); d <= k; d++ {
- r *= n
- r /= d
- n--
- }
-
- return r
-}
-
-func Round(val float64, roundOn float64, places int) (newVal float64) {
- var round float64
- pow := math.Pow(10, float64(places))
- digit := pow * val
- _, div := math.Modf(digit)
- if div >= roundOn {
- round = math.Ceil(digit)
- } else {
- round = math.Floor(digit)
- }
- newVal = round / pow
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go
deleted file mode 100644
index 510fe9679..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package zxcvbn
-
-import (
- "github.com/nbutton23/zxcvbn-go/matching"
- "github.com/nbutton23/zxcvbn-go/scoring"
- "github.com/nbutton23/zxcvbn-go/utils/math"
- "time"
-)
-
-func PasswordStrength(password string, userInputs []string) scoring.MinEntropyMatch {
- start := time.Now()
- matches := matching.Omnimatch(password, userInputs)
- result := scoring.MinimumEntropyMatchSequence(password, matches)
- end := time.Now()
-
- calcTime := end.Nanosecond() - start.Nanosecond()
- result.CalcTime = zxcvbn_math.Round(float64(calcTime)*time.Nanosecond.Seconds(), .5, 3)
- return result
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/ryanuber/go-glob/glob.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/ryanuber/go-glob/glob.go
deleted file mode 100644
index d9d46379a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/GoASTScanner/gas/vendor/github.com/ryanuber/go-glob/glob.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package glob
-
-import "strings"
-
-// The character which is treated like a glob
-const GLOB = "*"
-
-// Glob will test a string pattern, potentially containing globs, against a
-// subject string. The result is a simple true/false, determining whether or
-// not the glob pattern matched the subject text.
-func Glob(pattern, subj string) bool {
- // Empty pattern can only match empty subject
- if pattern == "" {
- return subj == pattern
- }
-
- // If the pattern _is_ a glob, it matches everything
- if pattern == GLOB {
- return true
- }
-
- parts := strings.Split(pattern, GLOB)
-
- if len(parts) == 1 {
- // No globs in pattern, so test for equality
- return subj == pattern
- }
-
- leadingGlob := strings.HasPrefix(pattern, GLOB)
- trailingGlob := strings.HasSuffix(pattern, GLOB)
- end := len(parts) - 1
-
- // Check the first section. Requires special handling.
- if !leadingGlob && !strings.HasPrefix(subj, parts[0]) {
- return false
- }
-
- // Go over the middle parts and ensure they match.
- for i := 1; i < end; i++ {
- if !strings.Contains(subj, parts[i]) {
- return false
- }
-
- // Trim evaluated text from subj as we loop over the pattern.
- idx := strings.Index(subj, parts[i]) + len(parts[i])
- subj = subj[idx:]
- }
-
- // Reached the last section. Requires special handling.
- return trailingGlob || strings.HasSuffix(subj, parts[end])
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alecthomas/gocyclo/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alecthomas/gocyclo/LICENSE
deleted file mode 100644
index 45f88d6cb..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alecthomas/gocyclo/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2013 Frederik Zipp. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of the copyright owner 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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alecthomas/gocyclo/gocyclo.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alecthomas/gocyclo/gocyclo.go
deleted file mode 100644
index d22b94dd1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alecthomas/gocyclo/gocyclo.go
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2013 Frederik Zipp. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Gocyclo calculates the cyclomatic complexities of functions and
-// methods in Go source code.
-//
-// Usage:
-// gocyclo [ ...] ...
-//
-// Flags
-// -over N show functions with complexity > N only and
-// return exit code 1 if the output is non-empty
-// -top N show the top N most complex functions only
-// -avg show the average complexity
-//
-// The output fields for each line are:
-//
-package main
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "io"
- "os"
- "path/filepath"
- "sort"
-)
-
-const usageDoc = `Calculate cyclomatic complexities of Go functions.
-usage:
- gocyclo [ ...] ...
-
-Flags
- -over N show functions with complexity > N only and
- return exit code 1 if the set is non-empty
- -top N show the top N most complex functions only
- -avg show the average complexity over all functions,
- not depending on whether -over or -top are set
-
-The output fields for each line are:
-
-`
-
-func usage() {
- fmt.Fprintf(os.Stderr, usageDoc)
- os.Exit(2)
-}
-
-var (
- over = flag.Int("over", 0, "show functions with complexity > N only")
- top = flag.Int("top", -1, "show the top N most complex functions only")
- avg = flag.Bool("avg", false, "show the average complexity")
-)
-
-func main() {
- flag.Usage = usage
- flag.Parse()
- args := flag.Args()
- if len(args) == 0 {
- usage()
- }
-
- stats := analyze(args)
- sort.Sort(byComplexity(stats))
- written := writeStats(os.Stdout, stats)
-
- if *avg {
- showAverage(stats)
- }
-
- if *over > 0 && written > 0 {
- os.Exit(1)
- }
-}
-
-func analyze(paths []string) []stat {
- stats := make([]stat, 0)
- for _, path := range paths {
- if isDir(path) {
- stats = analyzeDir(path, stats)
- } else {
- stats = analyzeFile(path, stats)
- }
- }
- return stats
-}
-
-func isDir(filename string) bool {
- fi, err := os.Stat(filename)
- return err == nil && fi.IsDir()
-}
-
-func analyzeFile(fname string, stats []stat) []stat {
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, fname, nil, 0)
- if err != nil {
- exitError(err)
- }
- return buildStats(f, fset, stats)
-}
-
-func analyzeDir(dirname string, stats []stat) []stat {
- files, _ := filepath.Glob(filepath.Join(dirname, "*.go"))
- for _, file := range files {
- stats = analyzeFile(file, stats)
- }
- return stats
-}
-
-func exitError(err error) {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
-}
-
-func writeStats(w io.Writer, sortedStats []stat) int {
- for i, stat := range sortedStats {
- if i == *top {
- return i
- }
- if stat.Complexity <= *over {
- return i
- }
- fmt.Fprintln(w, stat)
- }
- return len(sortedStats)
-}
-
-func showAverage(stats []stat) {
- fmt.Printf("Average: %.3g\n", average(stats))
-}
-
-func average(stats []stat) float64 {
- total := 0
- for _, s := range stats {
- total += s.Complexity
- }
- return float64(total) / float64(len(stats))
-}
-
-type stat struct {
- PkgName string
- FuncName string
- Complexity int
- Pos token.Position
-}
-
-func (s stat) String() string {
- return fmt.Sprintf("%d %s %s %s", s.Complexity, s.PkgName, s.FuncName, s.Pos)
-}
-
-type byComplexity []stat
-
-func (s byComplexity) Len() int { return len(s) }
-func (s byComplexity) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-func (s byComplexity) Less(i, j int) bool {
- return s[i].Complexity >= s[j].Complexity
-}
-
-func buildStats(f *ast.File, fset *token.FileSet, stats []stat) []stat {
- for _, decl := range f.Decls {
- if fn, ok := decl.(*ast.FuncDecl); ok {
- stats = append(stats, stat{
- PkgName: f.Name.Name,
- FuncName: funcName(fn),
- Complexity: complexity(fn),
- Pos: fset.Position(fn.Pos()),
- })
- }
- }
- return stats
-}
-
-// funcName returns the name representation of a function or method:
-// "(Type).Name" for methods or simply "Name" for functions.
-func funcName(fn *ast.FuncDecl) string {
- if fn.Recv != nil {
- typ := fn.Recv.List[0].Type
- return fmt.Sprintf("(%s).%s", recvString(typ), fn.Name)
- }
- return fn.Name.Name
-}
-
-// recvString returns a string representation of recv of the
-// form "T", "*T", or "BADRECV" (if not a proper receiver type).
-func recvString(recv ast.Expr) string {
- switch t := recv.(type) {
- case *ast.Ident:
- return t.Name
- case *ast.StarExpr:
- return "*" + recvString(t.X)
- }
- return "BADRECV"
-}
-
-// complexity calculates the cyclomatic complexity of a function.
-func complexity(fn *ast.FuncDecl) int {
- v := complexityVisitor{}
- ast.Walk(&v, fn)
- return v.Complexity
-}
-
-type complexityVisitor struct {
- // Complexity is the cyclomatic complexity
- Complexity int
-}
-
-// Visit implements the ast.Visitor interface.
-func (v *complexityVisitor) Visit(n ast.Node) ast.Visitor {
- switch n := n.(type) {
- case *ast.FuncDecl, *ast.IfStmt, *ast.ForStmt, *ast.RangeStmt, *ast.CaseClause, *ast.CommClause:
- v.Complexity++
- case *ast.BinaryExpr:
- if n.Op == token.LAND || n.Op == token.LOR {
- v.Complexity++
- }
- }
- return v
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/LICENSE
deleted file mode 100644
index 9310fbcff..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2017 Alex Kohler
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/import.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/import.go
deleted file mode 100644
index e02869163..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/import.go
+++ /dev/null
@@ -1,310 +0,0 @@
-package main
-
-/*
-
-This file holds a direct copy of the import path matching code of
-https://github.com/golang/go/blob/master/src/cmd/go/main.go. It can be
-replaced when https://golang.org/issue/8768 is resolved.
-
-It has been updated to follow upstream changes in a few ways.
-
-*/
-
-import (
- "fmt"
- "go/build"
- "log"
- "os"
- "path"
- "path/filepath"
- "regexp"
- "runtime"
- "strings"
-)
-
-var buildContext = build.Default
-
-var (
- goroot = filepath.Clean(runtime.GOROOT())
- gorootSrc = filepath.Join(goroot, "src")
-)
-
-// importPathsNoDotExpansion returns the import paths to use for the given
-// command line, but it does no ... expansion.
-func importPathsNoDotExpansion(args []string) []string {
- if len(args) == 0 {
- return []string{"."}
- }
- var out []string
- for _, a := range args {
- // Arguments are supposed to be import paths, but
- // as a courtesy to Windows developers, rewrite \ to /
- // in command-line arguments. Handles .\... and so on.
- if filepath.Separator == '\\' {
- a = strings.Replace(a, `\`, `/`, -1)
- }
-
- // Put argument in canonical form, but preserve leading ./.
- if strings.HasPrefix(a, "./") {
- a = "./" + path.Clean(a)
- if a == "./." {
- a = "."
- }
- } else {
- a = path.Clean(a)
- }
- if a == "all" || a == "std" {
- out = append(out, allPackages(a)...)
- continue
- }
- out = append(out, a)
- }
- return out
-}
-
-// importPaths returns the import paths to use for the given command line.
-func importPaths(args []string) []string {
- args = importPathsNoDotExpansion(args)
- var out []string
- for _, a := range args {
- if strings.Contains(a, "...") {
- if build.IsLocalImport(a) {
- out = append(out, allPackagesInFS(a)...)
- } else {
- out = append(out, allPackages(a)...)
- }
- continue
- }
- out = append(out, a)
- }
- return out
-}
-
-// matchPattern(pattern)(name) reports whether
-// name matches pattern. Pattern is a limited glob
-// pattern in which '...' means 'any string' and there
-// is no other special syntax.
-func matchPattern(pattern string) func(name string) bool {
- re := regexp.QuoteMeta(pattern)
- re = strings.Replace(re, `\.\.\.`, `.*`, -1)
- // Special case: foo/... matches foo too.
- if strings.HasSuffix(re, `/.*`) {
- re = re[:len(re)-len(`/.*`)] + `(/.*)?`
- }
- reg := regexp.MustCompile(`^` + re + `$`)
- return func(name string) bool {
- return reg.MatchString(name)
- }
-}
-
-// hasPathPrefix reports whether the path s begins with the
-// elements in prefix.
-func hasPathPrefix(s, prefix string) bool {
- switch {
- default:
- return false
- case len(s) == len(prefix):
- return s == prefix
- case len(s) > len(prefix):
- if prefix != "" && prefix[len(prefix)-1] == '/' {
- return strings.HasPrefix(s, prefix)
- }
- return s[len(prefix)] == '/' && s[:len(prefix)] == prefix
- }
-}
-
-// treeCanMatchPattern(pattern)(name) reports whether
-// name or children of name can possibly match pattern.
-// Pattern is the same limited glob accepted by matchPattern.
-func treeCanMatchPattern(pattern string) func(name string) bool {
- wildCard := false
- if i := strings.Index(pattern, "..."); i >= 0 {
- wildCard = true
- pattern = pattern[:i]
- }
- return func(name string) bool {
- return len(name) <= len(pattern) && hasPathPrefix(pattern, name) ||
- wildCard && strings.HasPrefix(name, pattern)
- }
-}
-
-// allPackages returns all the packages that can be found
-// under the $GOPATH directories and $GOROOT matching pattern.
-// The pattern is either "all" (all packages), "std" (standard packages)
-// or a path including "...".
-func allPackages(pattern string) []string {
- pkgs := matchPackages(pattern)
- if len(pkgs) == 0 {
- fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
- }
- return pkgs
-}
-
-func matchPackages(pattern string) []string {
- match := func(string) bool { return true }
- treeCanMatch := func(string) bool { return true }
- if pattern != "all" && pattern != "std" {
- match = matchPattern(pattern)
- treeCanMatch = treeCanMatchPattern(pattern)
- }
-
- have := map[string]bool{
- "builtin": true, // ignore pseudo-package that exists only for documentation
- }
- if !buildContext.CgoEnabled {
- have["runtime/cgo"] = true // ignore during walk
- }
- var pkgs []string
-
- // Commands
- cmd := filepath.Join(goroot, "src/cmd") + string(filepath.Separator)
- filepath.Walk(cmd, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() || path == cmd {
- return nil
- }
- name := path[len(cmd):]
- if !treeCanMatch(name) {
- return filepath.SkipDir
- }
- // Commands are all in cmd/, not in subdirectories.
- if strings.Contains(name, string(filepath.Separator)) {
- return filepath.SkipDir
- }
-
- // We use, e.g., cmd/gofmt as the pseudo import path for gofmt.
- name = "cmd/" + name
- if have[name] {
- return nil
- }
- have[name] = true
- if !match(name) {
- return nil
- }
- _, err = buildContext.ImportDir(path, 0)
- if err != nil {
- if _, noGo := err.(*build.NoGoError); !noGo {
- log.Print(err)
- }
- return nil
- }
- pkgs = append(pkgs, name)
- return nil
- })
-
- for _, src := range buildContext.SrcDirs() {
- if (pattern == "std" || pattern == "cmd") && src != gorootSrc {
- continue
- }
- src = filepath.Clean(src) + string(filepath.Separator)
- root := src
- if pattern == "cmd" {
- root += "cmd" + string(filepath.Separator)
- }
- filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() || path == src {
- return nil
- }
-
- // Avoid .foo, _foo, testdata and vendor directory trees.
- _, elem := filepath.Split(path)
- if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" || elem == "vendor" {
- return filepath.SkipDir
- }
-
- name := filepath.ToSlash(path[len(src):])
- if pattern == "std" && (strings.Contains(name, ".") || name == "cmd") {
- // The name "std" is only the standard library.
- // If the name is cmd, it's the root of the command tree.
- return filepath.SkipDir
- }
- if !treeCanMatch(name) {
- return filepath.SkipDir
- }
- if have[name] {
- return nil
- }
- have[name] = true
- if !match(name) {
- return nil
- }
- _, err = buildContext.ImportDir(path, 0)
- if err != nil {
- if _, noGo := err.(*build.NoGoError); noGo {
- return nil
- }
- }
- pkgs = append(pkgs, name)
- return nil
- })
- }
- return pkgs
-}
-
-// allPackagesInFS is like allPackages but is passed a pattern
-// beginning ./ or ../, meaning it should scan the tree rooted
-// at the given directory. There are ... in the pattern too.
-func allPackagesInFS(pattern string) []string {
- pkgs := matchPackagesInFS(pattern)
- if len(pkgs) == 0 {
- fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
- }
- return pkgs
-}
-
-func matchPackagesInFS(pattern string) []string {
- // Find directory to begin the scan.
- // Could be smarter but this one optimization
- // is enough for now, since ... is usually at the
- // end of a path.
- i := strings.Index(pattern, "...")
- dir, _ := path.Split(pattern[:i])
-
- // pattern begins with ./ or ../.
- // path.Clean will discard the ./ but not the ../.
- // We need to preserve the ./ for pattern matching
- // and in the returned import paths.
- prefix := ""
- if strings.HasPrefix(pattern, "./") {
- prefix = "./"
- }
- match := matchPattern(pattern)
-
- var pkgs []string
- filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() {
- return nil
- }
- if path == dir {
- // filepath.Walk starts at dir and recurses. For the recursive case,
- // the path is the result of filepath.Join, which calls filepath.Clean.
- // The initial case is not Cleaned, though, so we do this explicitly.
- //
- // This converts a path like "./io/" to "io". Without this step, running
- // "cd $GOROOT/src/pkg; go list ./io/..." would incorrectly skip the io
- // package, because prepending the prefix "./" to the unclean path would
- // result in "././io", and match("././io") returns false.
- path = filepath.Clean(path)
- }
-
- // Avoid .foo, _foo, testdata and vendor directory trees, but do not avoid "." or "..".
- _, elem := filepath.Split(path)
- dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
- if dot || strings.HasPrefix(elem, "_") || elem == "testdata" || elem == "vendor" {
- return filepath.SkipDir
- }
-
- name := prefix + filepath.ToSlash(path)
- if !match(name) {
- return nil
- }
- if _, err = build.ImportDir(path, 0); err != nil {
- if _, noGo := err.(*build.NoGoError); !noGo {
- log.Print(err)
- }
- return nil
- }
- pkgs = append(pkgs, name)
- return nil
- })
- return pkgs
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/nakedret.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/nakedret.go
deleted file mode 100644
index b65177028..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/alexkohler/nakedret/nakedret.go
+++ /dev/null
@@ -1,213 +0,0 @@
-package main
-
-import (
- "errors"
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "log"
- "os"
- "path/filepath"
- "strings"
-)
-
-const (
- pwd = "./"
-)
-
-func init() {
- //TODO allow build tags
- build.Default.UseAllFiles = true
-}
-
-func usage() {
- log.Printf("Usage of %s:\n", os.Args[0])
- log.Printf("\nnakedret [flags] # runs on package in current directory\n")
- log.Printf("\nnakedret [flags] [packages]\n")
- log.Printf("Flags:\n")
- flag.PrintDefaults()
-}
-
-type returnsVisitor struct {
- f *token.FileSet
- maxLength uint
-}
-
-func main() {
-
- // Remove log timestamp
- log.SetFlags(0)
-
- maxLength := flag.Uint("l", 5, "maximum number of lines for a naked return function")
- flag.Usage = usage
- flag.Parse()
-
- if err := checkNakedReturns(flag.Args(), maxLength); err != nil {
- log.Println(err)
- }
-}
-
-func checkNakedReturns(args []string, maxLength *uint) error {
-
- fset := token.NewFileSet()
-
- files, err := parseInput(args, fset)
- if err != nil {
- return fmt.Errorf("could not parse input %v", err)
- }
-
- if maxLength == nil {
- return errors.New("max length nil")
- }
-
- retVis := &returnsVisitor{
- f: fset,
- maxLength: *maxLength,
- }
-
- for _, f := range files {
- ast.Walk(retVis, f)
- }
-
- return nil
-}
-
-func parseInput(args []string, fset *token.FileSet) ([]*ast.File, error) {
- var directoryList []string
- var fileMode bool
- files := make([]*ast.File, 0)
-
- if len(args) == 0 {
- directoryList = append(directoryList, pwd)
- } else {
- for _, arg := range args {
- if strings.HasSuffix(arg, "/...") && isDir(arg[:len(arg)-len("/...")]) {
-
- for _, dirname := range allPackagesInFS(arg) {
- directoryList = append(directoryList, dirname)
- }
-
- } else if isDir(arg) {
- directoryList = append(directoryList, arg)
-
- } else if exists(arg) {
- if strings.HasSuffix(arg, ".go") {
- fileMode = true
- f, err := parser.ParseFile(fset, arg, nil, 0)
- if err != nil {
- return nil, err
- }
- files = append(files, f)
- } else {
- return nil, fmt.Errorf("invalid file %v specified", arg)
- }
- } else {
-
- //TODO clean this up a bit
- imPaths := importPaths([]string{arg})
- for _, importPath := range imPaths {
- pkg, err := build.Import(importPath, ".", 0)
- if err != nil {
- return nil, err
- }
- var stringFiles []string
- stringFiles = append(stringFiles, pkg.GoFiles...)
- // files = append(files, pkg.CgoFiles...)
- stringFiles = append(stringFiles, pkg.TestGoFiles...)
- if pkg.Dir != "." {
- for i, f := range stringFiles {
- stringFiles[i] = filepath.Join(pkg.Dir, f)
- }
- }
-
- fileMode = true
- for _, stringFile := range stringFiles {
- f, err := parser.ParseFile(fset, stringFile, nil, 0)
- if err != nil {
- return nil, err
- }
- files = append(files, f)
- }
-
- }
- }
- }
- }
-
- // if we're not in file mode, then we need to grab each and every package in each directory
- // we can to grab all the files
- if !fileMode {
- for _, fpath := range directoryList {
- pkgs, err := parser.ParseDir(fset, fpath, nil, 0)
- if err != nil {
- return nil, err
- }
-
- for _, pkg := range pkgs {
- for _, f := range pkg.Files {
- files = append(files, f)
- }
- }
- }
- }
-
- return files, nil
-}
-
-func isDir(filename string) bool {
- fi, err := os.Stat(filename)
- return err == nil && fi.IsDir()
-}
-
-func exists(filename string) bool {
- _, err := os.Stat(filename)
- return err == nil
-}
-
-func (v *returnsVisitor) Visit(node ast.Node) ast.Visitor {
- var namedReturns []*ast.Ident
-
- funcDecl, ok := node.(*ast.FuncDecl)
- if !ok {
- return v
- }
- var functionLineLength int
- // We've found a function
- if funcDecl.Type != nil && funcDecl.Type.Results != nil {
- for _, field := range funcDecl.Type.Results.List {
- for _, ident := range field.Names {
- if ident != nil {
- namedReturns = append(namedReturns, ident)
- }
- }
- }
- file := v.f.File(funcDecl.Pos())
- functionLineLength = file.Position(funcDecl.End()).Line - file.Position(funcDecl.Pos()).Line
- }
-
- if len(namedReturns) > 0 && funcDecl.Body != nil {
- // Scan the body for usage of the named returns
- for _, stmt := range funcDecl.Body.List {
-
- switch s := stmt.(type) {
- case *ast.ReturnStmt:
- if len(s.Results) == 0 {
- file := v.f.File(s.Pos())
- if file != nil && uint(functionLineLength) > v.maxLength {
- if funcDecl.Name != nil {
- log.Printf("%v:%v %v naked returns on %v line function \n", file.Name(), file.Position(s.Pos()).Line, funcDecl.Name.Name, functionLineLength)
- }
- }
- continue
- }
-
- default:
- }
- }
- }
-
- return v
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/LICENSE
deleted file mode 100644
index 423e1f9e0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015-2017 Nick Galbreath
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ascii.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ascii.go
deleted file mode 100644
index 1430718d6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ascii.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package misspell
-
-// ByteToUpper converts an ascii byte to upper cases
-// Uses a branchless algorithm
-func ByteToUpper(x byte) byte {
- b := byte(0x80) | x
- c := b - byte(0x61)
- d := ^(b - byte(0x7b))
- e := (c & d) & (^x & 0x7f)
- return x - (e >> 2)
-}
-
-// ByteToLower converts an ascii byte to lower case
-// uses a branchless algorithm
-func ByteToLower(eax byte) byte {
- ebx := eax&byte(0x7f) + byte(0x25)
- ebx = ebx&byte(0x7f) + byte(0x1a)
- ebx = ((ebx & ^eax) >> 2) & byte(0x20)
- return eax + ebx
-}
-
-// ByteEqualFold does ascii compare, case insensitive
-func ByteEqualFold(a, b byte) bool {
- return a == b || ByteToLower(a) == ByteToLower(b)
-}
-
-// StringEqualFold ASCII case-insensitive comparison
-// golang toUpper/toLower for both bytes and strings
-// appears to be Unicode based which is super slow
-// based from https://codereview.appspot.com/5180044/patch/14007/21002
-func StringEqualFold(s1, s2 string) bool {
- if len(s1) != len(s2) {
- return false
- }
- for i := 0; i < len(s1); i++ {
- c1 := s1[i]
- c2 := s2[i]
- // c1 & c2
- if c1 != c2 {
- c1 |= 'a' - 'A'
- c2 |= 'a' - 'A'
- if c1 != c2 || c1 < 'a' || c1 > 'z' {
- return false
- }
- }
- }
- return true
-}
-
-// StringHasPrefixFold is similar to strings.HasPrefix but comparison
-// is done ignoring ASCII case.
-// /
-func StringHasPrefixFold(s1, s2 string) bool {
- // prefix is bigger than input --> false
- if len(s1) < len(s2) {
- return false
- }
- if len(s1) == len(s2) {
- return StringEqualFold(s1, s2)
- }
- return StringEqualFold(s1[:len(s2)], s2)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/case.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/case.go
deleted file mode 100644
index 2ea3850df..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/case.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package misspell
-
-import (
- "strings"
-)
-
-// WordCase is an enum of various word casing styles
-type WordCase int
-
-// Various WordCase types.. likely to be not correct
-const (
- CaseUnknown WordCase = iota
- CaseLower
- CaseUpper
- CaseTitle
-)
-
-// CaseStyle returns what case style a word is in
-func CaseStyle(word string) WordCase {
- upperCount := 0
- lowerCount := 0
-
- // this iterates over RUNES not BYTES
- for i := 0; i < len(word); i++ {
- ch := word[i]
- switch {
- case ch >= 'a' && ch <= 'z':
- lowerCount++
- case ch >= 'A' && ch <= 'Z':
- upperCount++
- }
- }
-
- switch {
- case upperCount != 0 && lowerCount == 0:
- return CaseUpper
- case upperCount == 0 && lowerCount != 0:
- return CaseLower
- case upperCount == 1 && lowerCount > 0 && word[0] >= 'A' && word[0] <= 'Z':
- return CaseTitle
- }
- return CaseUnknown
-}
-
-// CaseVariations returns
-// If AllUpper or First-Letter-Only is upcased: add the all upper case version
-// If AllLower, add the original, the title and upcase forms
-// If Mixed, return the original, and the all upcase form
-//
-func CaseVariations(word string, style WordCase) []string {
- switch style {
- case CaseLower:
- return []string{word, strings.ToUpper(word[0:1]) + word[1:], strings.ToUpper(word)}
- case CaseUpper:
- return []string{strings.ToUpper(word)}
- default:
- return []string{word, strings.ToUpper(word)}
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/cmd/misspell/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/cmd/misspell/main.go
deleted file mode 100644
index 3d2c2b4d1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/cmd/misspell/main.go
+++ /dev/null
@@ -1,325 +0,0 @@
-package main
-
-import (
- "bytes"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "runtime"
- "strings"
- "text/template"
- "time"
-
- "github.com/client9/misspell"
-)
-
-var (
- defaultWrite *template.Template
- defaultRead *template.Template
-
- stdout *log.Logger
- debug *log.Logger
-
- version = "dev"
-)
-
-const (
- // Note for gometalinter it must be "File:Line:Column: Msg"
- // note space beteen ": Msg"
- defaultWriteTmpl = `{{ .Filename }}:{{ .Line }}:{{ .Column }}: corrected "{{ .Original }}" to "{{ .Corrected }}"`
- defaultReadTmpl = `{{ .Filename }}:{{ .Line }}:{{ .Column }}: "{{ .Original }}" is a misspelling of "{{ .Corrected }}"`
- csvTmpl = `{{ printf "%q" .Filename }},{{ .Line }},{{ .Column }},{{ .Original }},{{ .Corrected }}`
- csvHeader = `file,line,column,typo,corrected`
- sqliteTmpl = `INSERT INTO misspell VALUES({{ printf "%q" .Filename }},{{ .Line }},{{ .Column }},{{ printf "%q" .Original }},{{ printf "%q" .Corrected }});`
- sqliteHeader = `PRAGMA foreign_keys=OFF;
-BEGIN TRANSACTION;
-CREATE TABLE misspell(
- "file" TEXT, "line" INTEGER, "column" INTEGER, "typo" TEXT, "corrected" TEXT
-);`
- sqliteFooter = "COMMIT;"
-)
-
-func worker(writeit bool, r *misspell.Replacer, mode string, files <-chan string, results chan<- int) {
- count := 0
- for filename := range files {
- orig, err := misspell.ReadTextFile(filename)
- if err != nil {
- log.Println(err)
- continue
- }
- if len(orig) == 0 {
- continue
- }
-
- debug.Printf("Processing %s", filename)
-
- var updated string
- var changes []misspell.Diff
-
- if mode == "go" {
- updated, changes = r.ReplaceGo(orig)
- } else {
- updated, changes = r.Replace(orig)
- }
-
- if len(changes) == 0 {
- continue
- }
- count += len(changes)
- for _, diff := range changes {
- // add in filename
- diff.Filename = filename
-
- // output can be done by doing multiple goroutines
- // and can clobber os.Stdout.
- //
- // the log package can be used simultaneously from multiple goroutines
- var output bytes.Buffer
- if writeit {
- defaultWrite.Execute(&output, diff)
- } else {
- defaultRead.Execute(&output, diff)
- }
-
- // goroutine-safe print to os.Stdout
- stdout.Println(output.String())
- }
-
- if writeit {
- ioutil.WriteFile(filename, []byte(updated), 0)
- }
- }
- results <- count
-}
-
-func main() {
- t := time.Now()
- var (
- workers = flag.Int("j", 0, "Number of workers, 0 = number of CPUs")
- writeit = flag.Bool("w", false, "Overwrite file with corrections (default is just to display)")
- quietFlag = flag.Bool("q", false, "Do not emit misspelling output")
- outFlag = flag.String("o", "stdout", "output file or [stderr|stdout|]")
- format = flag.String("f", "", "'csv', 'sqlite3' or custom Golang template for output")
- ignores = flag.String("i", "", "ignore the following corrections, comma separated")
- locale = flag.String("locale", "", "Correct spellings using locale perferances for US or UK. Default is to use a neutral variety of English. Setting locale to US will correct the British spelling of 'colour' to 'color'")
- mode = flag.String("source", "auto", "Source mode: auto=guess, go=golang source, text=plain or markdown-like text")
- debugFlag = flag.Bool("debug", false, "Debug matching, very slow")
- exitError = flag.Bool("error", false, "Exit with 2 if misspelling found")
- showVersion = flag.Bool("v", false, "Show version and exit")
-
- showLegal = flag.Bool("legal", false, "Show legal information and exit")
- )
- flag.Parse()
-
- if *showVersion {
- fmt.Println(version)
- return
- }
- if *showLegal {
- fmt.Println(misspell.Legal)
- return
- }
- if *debugFlag {
- debug = log.New(os.Stderr, "DEBUG ", 0)
- } else {
- debug = log.New(ioutil.Discard, "", 0)
- }
-
- r := misspell.Replacer{
- Replacements: misspell.DictMain,
- Debug: *debugFlag,
- }
- //
- // Figure out regional variations
- //
- switch strings.ToUpper(*locale) {
- case "":
- // nothing
- case "US":
- r.AddRuleList(misspell.DictAmerican)
- case "UK", "GB":
- r.AddRuleList(misspell.DictBritish)
- case "NZ", "AU", "CA":
- log.Fatalf("Help wanted. https://github.com/client9/misspell/issues/6")
- default:
- log.Fatalf("Unknown locale: %q", *locale)
- }
-
- //
- // Stuff to ignore
- //
- if len(*ignores) > 0 {
- r.RemoveRule(strings.Split(*ignores, ","))
- }
-
- //
- // Source input mode
- //
- switch *mode {
- case "auto":
- case "go":
- case "text":
- default:
- log.Fatalf("Mode must be one of auto=guess, go=golang source, text=plain or markdown-like text")
- }
-
- //
- // Custom output
- //
- switch {
- case *format == "csv":
- tmpl := template.Must(template.New("csv").Parse(csvTmpl))
- defaultWrite = tmpl
- defaultRead = tmpl
- stdout.Println(csvHeader)
- case *format == "sqlite" || *format == "sqlite3":
- tmpl := template.Must(template.New("sqlite3").Parse(sqliteTmpl))
- defaultWrite = tmpl
- defaultRead = tmpl
- stdout.Println(sqliteHeader)
- case len(*format) > 0:
- t, err := template.New("custom").Parse(*format)
- if err != nil {
- log.Fatalf("Unable to compile log format: %s", err)
- }
- defaultWrite = t
- defaultRead = t
- default: // format == ""
- defaultWrite = template.Must(template.New("defaultWrite").Parse(defaultWriteTmpl))
- defaultRead = template.Must(template.New("defaultRead").Parse(defaultReadTmpl))
- }
-
- // we cant't just write to os.Stdout directly since we have multiple goroutine
- // all writing at the same time causing broken output. Log is routine safe.
- // we see it so it doesn't use a prefix or include a time stamp.
- switch {
- case *quietFlag || *outFlag == "/dev/null":
- stdout = log.New(ioutil.Discard, "", 0)
- case *outFlag == "/dev/stderr" || *outFlag == "stderr":
- stdout = log.New(os.Stderr, "", 0)
- case *outFlag == "/dev/stdout" || *outFlag == "stdout":
- stdout = log.New(os.Stdout, "", 0)
- case *outFlag == "" || *outFlag == "-":
- stdout = log.New(os.Stdout, "", 0)
- default:
- fo, err := os.Create(*outFlag)
- if err != nil {
- log.Fatalf("unable to create outfile %q: %s", *outFlag, err)
- }
- defer fo.Close()
- stdout = log.New(fo, "", 0)
- }
-
- //
- // Number of Workers / CPU to use
- //
- if *workers < 0 {
- log.Fatalf("-j must >= 0")
- }
- if *workers == 0 {
- *workers = runtime.NumCPU()
- }
- if *debugFlag {
- *workers = 1
- }
-
- //
- // Done with Flags.
- // Compile the Replacer and process files
- //
- r.Compile()
-
- args := flag.Args()
- debug.Printf("initialization complete in %v", time.Since(t))
-
- // stdin/stdout
- if len(args) == 0 {
- // if we are working with pipes/stdin/stdout
- // there is no concurrency, so we can directly
- // send data to the writers
- var fileout io.Writer
- var errout io.Writer
- switch *writeit {
- case true:
- // if we ARE writing the corrected stream
- // the corrected stream goes to stdout
- // and the misspelling errors goes to stderr
- // so we can do something like this:
- // curl something | misspell -w | gzip > afile.gz
- fileout = os.Stdout
- errout = os.Stderr
- case false:
- // if we are not writing out the corrected stream
- // then work just like files. Misspelling errors
- // are sent to stdout
- fileout = ioutil.Discard
- errout = os.Stdout
- }
- count := 0
- next := func(diff misspell.Diff) {
- count++
-
- // don't even evaluate the output templates
- if *quietFlag {
- return
- }
- diff.Filename = "stdin"
- if *writeit {
- defaultWrite.Execute(errout, diff)
- } else {
- defaultRead.Execute(errout, diff)
- }
- errout.Write([]byte{'\n'})
-
- }
- err := r.ReplaceReader(os.Stdin, fileout, next)
- if err != nil {
- os.Exit(1)
- }
- switch *format {
- case "sqlite", "sqlite3":
- fileout.Write([]byte(sqliteFooter))
- }
- if count != 0 && *exitError {
- // error
- os.Exit(2)
- }
- return
- }
-
- c := make(chan string, 64)
- results := make(chan int, *workers)
-
- for i := 0; i < *workers; i++ {
- go worker(*writeit, &r, *mode, c, results)
- }
-
- for _, filename := range args {
- filepath.Walk(filename, func(path string, info os.FileInfo, err error) error {
- if err == nil && !info.IsDir() {
- c <- path
- }
- return nil
- })
- }
- close(c)
-
- count := 0
- for i := 0; i < *workers; i++ {
- changed := <-results
- count += changed
- }
-
- switch *format {
- case "sqlite", "sqlite3":
- stdout.Println(sqliteFooter)
- }
-
- if count != 0 && *exitError {
- os.Exit(2)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ignore/glob.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ignore/glob.go
deleted file mode 100644
index 13281d1bc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ignore/glob.go
+++ /dev/null
@@ -1,118 +0,0 @@
-package ignore
-
-import (
- "bytes"
- "fmt"
-
- "github.com/gobwas/glob"
-)
-
-// Matcher defines an interface for filematchers
-//
-type Matcher interface {
- Match(string) bool
- True() bool
- MarshalText() ([]byte, error)
-}
-
-// MultiMatch has matching on a list of matchers
-type MultiMatch struct {
- matchers []Matcher
-}
-
-// NewMultiMatch creates a new MultiMatch instance
-func NewMultiMatch(matchers []Matcher) *MultiMatch {
- return &MultiMatch{matchers: matchers}
-}
-
-// Match satifies the Matcher iterface
-func (mm *MultiMatch) Match(arg string) bool {
- // Normal: OR
- // false, false -> false
- // false, true -> true
- // true, false -> true
- // true, true -> true
-
- // Invert:
- // false, false -> false
- // false, true -> false
- // true, false -> true
- // true, true -> false
- use := false
- for _, m := range mm.matchers {
- if m.Match(arg) {
- use = m.True()
- }
- }
- return use
-
-}
-
-// True returns true
-func (mm *MultiMatch) True() bool { return true }
-
-// MarshalText satifies the ?? interface
-func (mm *MultiMatch) MarshalText() ([]byte, error) {
- return []byte("multi"), nil
-}
-
-// GlobMatch handle glob matching
-type GlobMatch struct {
- orig string
- matcher glob.Glob
- normal bool
-}
-
-// NewGlobMatch creates a new GlobMatch instance or error
-func NewGlobMatch(arg []byte) (*GlobMatch, error) {
- truth := true
- if len(arg) > 0 && arg[0] == '!' {
- truth = false
- arg = arg[1:]
- }
- if bytes.IndexByte(arg, '/') == -1 {
- return NewBaseGlobMatch(string(arg), truth)
- }
- return NewPathGlobMatch(string(arg), truth)
-}
-
-// NewBaseGlobMatch compiles a new matcher.
-// Arg true should be set to false if the output is inverted.
-func NewBaseGlobMatch(arg string, truth bool) (*GlobMatch, error) {
- g, err := glob.Compile(arg)
- if err != nil {
- return nil, err
- }
- return &GlobMatch{orig: arg, matcher: g, normal: truth}, nil
-}
-
-// NewPathGlobMatch compiles a new matcher.
-// Arg true should be set to false if the output is inverted.
-func NewPathGlobMatch(arg string, truth bool) (*GlobMatch, error) {
- // if starts with "/" then glob only applies to top level
- if len(arg) > 0 && arg[0] == '/' {
- arg = arg[1:]
- }
-
- // create path-aware glob
- g, err := glob.Compile(arg, '/')
- if err != nil {
- return nil, err
- }
- return &GlobMatch{orig: arg, matcher: g, normal: truth}, nil
-}
-
-// True returns true if this should be evaluated normally ("true is true")
-// and false if the result should be inverted ("false is true")
-//
-func (g *GlobMatch) True() bool { return g.normal }
-
-// MarshalText is really a debug function
-func (g *GlobMatch) MarshalText() ([]byte, error) {
- return []byte(fmt.Sprintf("\"%s: %v %s\"", "GlobMatch", g.normal, g.orig)), nil
-}
-
-// Match satisfies the Matcher interface
-func (g *GlobMatch) Match(file string) bool {
- return g.matcher.Match(file)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ignore/parse.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ignore/parse.go
deleted file mode 100644
index cb63b25b0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/ignore/parse.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package ignore
-
-import (
- "bytes"
-)
-
-// Parse reads in a gitignore file and returns a Matcher
-func Parse(src []byte) (Matcher, error) {
- matchers := []Matcher{}
- lines := bytes.Split(src, []byte{'\n'})
- for _, line := range lines {
- if len(line) == 0 || len(bytes.TrimSpace(line)) == 0 {
- continue
- }
-
- if line[0] == '#' {
- continue
- }
-
- // TODO: line starts with '!'
- // TODO: line ends with '\ '
-
- // if starts with \# or \! then escaped
- if len(line) > 1 && line[0] == '\\' && (line[1] == '#' || line[1] == '!') {
- line = line[1:]
- }
-
- m, err := NewGlobMatch(line)
- if err != nil {
- return nil, err
- }
- matchers = append(matchers, m)
- }
- return NewMultiMatch(matchers), nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/legal.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/legal.go
deleted file mode 100644
index da0e6bd45..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/legal.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package misspell
-
-// Legal provides licensing info.
-const Legal = `
-Execept where noted below, the source code for misspell is
-copyright Nick Galbreath and distribution is allowed under a
-MIT license. See the following for details:
-
-* https://github.com/client9/misspell/blob/master/LICENSE
-* https://tldrlegal.com/license/mit-license
-
-Misspell makes uses of the Golang standard library and
-contains a modified version of Golang's strings.Replacer
-which are covered under a BSD License.
-
-* https://golang.org/pkg/strings/#Replacer
-* https://golang.org/src/strings/replace.go
-* https://github.com/golang/go/blob/master/LICENSE
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/mime.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/mime.go
deleted file mode 100644
index 9db4902b3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/mime.go
+++ /dev/null
@@ -1,210 +0,0 @@
-package misspell
-
-import (
- "bytes"
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "path/filepath"
- "strings"
-)
-
-// The number of possible binary formats is very large
-// items that might be checked into a repo or be an
-// artifact of a build. Additions welcome.
-//
-// Golang's internal table is very small and can't be
-// relied on. Even then things like ".js" have a mime
-// type of "application/javascipt" which isn't very helpful.
-// "[x]" means we have sniff test and suffix test should be eliminated
-var binary = map[string]bool{
- ".a": true, // [ ] archive
- ".bin": true, // [ ] binary
- ".bz2": true, // [ ] compression
- ".class": true, // [x] Java class file
- ".dll": true, // [ ] shared library
- ".exe": true, // [ ] binary
- ".gif": true, // [ ] image
- ".gpg": true, // [x] text, but really all base64
- ".gz": true, // [ ] compression
- ".ico": true, // [ ] image
- ".jar": true, // [x] archive
- ".jpeg": true, // [ ] image
- ".jpg": true, // [ ] image
- ".mp3": true, // [ ] audio
- ".mp4": true, // [ ] video
- ".mpeg": true, // [ ] video
- ".o": true, // [ ] object file
- ".pdf": true, // [x] pdf
- ".png": true, // [x] image
- ".pyc": true, // [ ] Python bytecode
- ".pyo": true, // [ ] Python bytecode
- ".so": true, // [x] shared library
- ".swp": true, // [ ] vim swap file
- ".tar": true, // [ ] archive
- ".tiff": true, // [ ] image
- ".woff": true, // [ ] font
- ".woff2": true, // [ ] font
- ".xz": true, // [ ] compression
- ".z": true, // [ ] compression
- ".zip": true, // [x] archive
-}
-
-// isBinaryFilename returns true if the file is likely to be binary
-//
-// Better heuristics could be done here, in particular a binary
-// file is unlikely to be UTF-8 encoded. However this is cheap
-// and will solve the immediate need of making sure common
-// binary formats are not corrupted by mistake.
-func isBinaryFilename(s string) bool {
- return binary[strings.ToLower(filepath.Ext(s))]
-}
-
-var scm = map[string]bool{
- ".bzr": true,
- ".git": true,
- ".hg": true,
- ".svn": true,
- "CVS": true,
-}
-
-// isSCMPath returns true if the path is likely part of a (private) SCM
-// directory. E.g. ./git/something = true
-func isSCMPath(s string) bool {
- // hack for .git/COMMIT_EDITMSG and .git/TAG_EDITMSG
- // normally we don't look at anything in .git
- // but COMMIT_EDITMSG and TAG_EDITMSG are used as
- // temp files for git commits. Allowing misspell to inspect
- // these files allows for commit-msg hooks
- // https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
- if strings.Contains(filepath.Base(s), "EDITMSG") {
- return false
- }
- parts := strings.Split(filepath.Clean(s), string(filepath.Separator))
- for _, dir := range parts {
- if scm[dir] {
- return true
- }
- }
- return false
-}
-
-var magicHeaders = [][]byte{
- // Issue #68
- // PGP messages and signatures are "text" but really just
- // blobs of base64-text and should not be misspell-checked
- []byte("-----BEGIN PGP MESSAGE-----"),
- []byte("-----BEGIN PGP SIGNATURE-----"),
-
- // ELF
- {0x7f, 0x45, 0x4c, 0x46},
-
- // Postscript
- {0x25, 0x21, 0x50, 0x53},
-
- // PDF
- {0x25, 0x50, 0x44, 0x46},
-
- // Java class file
- // https://en.wikipedia.org/wiki/Java_class_file
- {0xCA, 0xFE, 0xBA, 0xBE},
-
- // PNG
- // https://en.wikipedia.org/wiki/Portable_Network_Graphics
- {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a},
-
- // ZIP, JAR, ODF, OOXML
- {0x50, 0x4B, 0x03, 0x04},
- {0x50, 0x4B, 0x05, 0x06},
- {0x50, 0x4B, 0x07, 0x08},
-}
-
-func isTextFile(raw []byte) bool {
- for _, magic := range magicHeaders {
- if bytes.HasPrefix(raw, magic) {
- return false
- }
- }
-
- // allow any text/ type with utf-8 encoding
- // DetectContentType sometimes returns charset=utf-16 for XML stuff
- // in which case ignore.
- mime := http.DetectContentType(raw)
- return strings.HasPrefix(mime, "text/") && strings.HasSuffix(mime, "charset=utf-8")
-}
-
-// ReadTextFile returns the contents of a file, first testing if it is a text file
-// returns ("", nil) if not a text file
-// returns ("", error) if error
-// returns (string, nil) if text
-//
-// unfortunately, in worse case, this does
-// 1 stat
-// 1 open,read,close of 512 bytes
-// 1 more stat,open, read everything, close (via ioutil.ReadAll)
-// This could be kinder to the filesystem.
-//
-// This uses some heuristics of the file's extension (e.g. .zip, .txt) and
-// uses a sniffer to determine if the file is text or not.
-// Using file extensions isn't great, but probably
-// good enough for real-world use.
-// Golang's built in sniffer is problematic for differnet reasons. It's
-// optimized for HTML, and is very limited in detection. It would be good
-// to explicitly add some tests for ELF/DWARF formats to make sure we never
-// corrupt binary files.
-func ReadTextFile(filename string) (string, error) {
- if isBinaryFilename(filename) {
- return "", nil
- }
-
- if isSCMPath(filename) {
- return "", nil
- }
-
- fstat, err := os.Stat(filename)
-
- if err != nil {
- return "", fmt.Errorf("Unable to stat %q: %s", filename, err)
- }
-
- // directory: nothing to do.
- if fstat.IsDir() {
- return "", nil
- }
-
- // avoid reading in multi-gig files
- // if input is large, read the first 512 bytes to sniff type
- // if not-text, then exit
- isText := false
- if fstat.Size() > 50000 {
- fin, err := os.Open(filename)
- if err != nil {
- return "", fmt.Errorf("Unable to open large file %q: %s", filename, err)
- }
- defer fin.Close()
- buf := make([]byte, 512)
- _, err = io.ReadFull(fin, buf)
- if err != nil {
- return "", fmt.Errorf("Unable to read 512 bytes from %q: %s", filename, err)
- }
- if !isTextFile(buf) {
- return "", nil
- }
-
- // set so we don't double check this file
- isText = true
- }
-
- // read in whole file
- raw, err := ioutil.ReadFile(filename)
- if err != nil {
- return "", fmt.Errorf("Unable to read all %q: %s", filename, err)
- }
-
- if !isText && !isTextFile(raw) {
- return "", nil
- }
- return string(raw), nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/notwords.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/notwords.go
deleted file mode 100644
index 06d0d5a5a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/notwords.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package misspell
-
-import (
- "bytes"
- "regexp"
- "strings"
-)
-
-var (
- reEmail = regexp.MustCompile(`[a-zA-Z0-9_.%+-]+@[a-zA-Z0-9-.]+\.[a-zA-Z]{2,6}[^a-zA-Z]`)
- reHost = regexp.MustCompile(`[a-zA-Z0-9-.]+\.[a-zA-Z]+`)
- reBackslash = regexp.MustCompile(`\\[a-z]`)
-)
-
-// RemovePath attempts to strip away embedded file system paths, e.g.
-// /foo/bar or /static/myimg.png
-//
-// TODO: windows style
-//
-func RemovePath(s string) string {
- out := bytes.Buffer{}
- var idx int
- for len(s) > 0 {
- if idx = strings.IndexByte(s, '/'); idx == -1 {
- out.WriteString(s)
- break
- }
-
- if idx > 0 {
- idx--
- }
-
- var chclass string
- switch s[idx] {
- case '/', ' ', '\n', '\t', '\r':
- chclass = " \n\r\t"
- case '[':
- chclass = "]\n"
- case '(':
- chclass = ")\n"
- default:
- out.WriteString(s[:idx+2])
- s = s[idx+2:]
- continue
- }
-
- endx := strings.IndexAny(s[idx+1:], chclass)
- if endx != -1 {
- out.WriteString(s[:idx+1])
- out.Write(bytes.Repeat([]byte{' '}, endx))
- s = s[idx+endx+1:]
- } else {
- out.WriteString(s)
- break
- }
- }
- return out.String()
-}
-
-// replaceWithBlanks returns a string with the same number of spaces as the input
-func replaceWithBlanks(s string) string {
- return strings.Repeat(" ", len(s))
-}
-
-// RemoveEmail remove email-like strings, e.g. "nickg+junk@xfoobar.com", "nickg@xyz.abc123.biz"
-func RemoveEmail(s string) string {
- return reEmail.ReplaceAllStringFunc(s, replaceWithBlanks)
-}
-
-// RemoveHost removes host-like strings "foobar.com" "abc123.fo1231.biz"
-func RemoveHost(s string) string {
- return reHost.ReplaceAllStringFunc(s, replaceWithBlanks)
-}
-
-// RemoveBackslashEscapes removes characters that are preceeded by a backslash
-// commonly found in printf format stringd "\nto"
-func removeBackslashEscapes(s string) string {
- return reBackslash.ReplaceAllStringFunc(s, replaceWithBlanks)
-}
-
-// RemoveNotWords blanks out all the not words
-func RemoveNotWords(s string) string {
- // do most selective/specific first
- return removeBackslashEscapes(RemoveHost(RemoveEmail(RemovePath(StripURL(s)))))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/replace.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/replace.go
deleted file mode 100644
index a99bbcc58..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/replace.go
+++ /dev/null
@@ -1,246 +0,0 @@
-package misspell
-
-import (
- "bufio"
- "bytes"
- "io"
- "regexp"
- "strings"
- "text/scanner"
-)
-
-func max(x, y int) int {
- if x > y {
- return x
- }
- return y
-}
-
-func inArray(haystack []string, needle string) bool {
- for _, word := range haystack {
- if needle == word {
- return true
- }
- }
- return false
-}
-
-var wordRegexp = regexp.MustCompile(`[a-zA-Z0-9']+`)
-
-// Diff is datastructure showing what changed in a single line
-type Diff struct {
- Filename string
- FullLine string
- Line int
- Column int
- Original string
- Corrected string
-}
-
-// Replacer is the main struct for spelling correction
-type Replacer struct {
- Replacements []string
- Debug bool
- engine *StringReplacer
- corrected map[string]string
-}
-
-// New creates a new default Replacer using the main rule list
-func New() *Replacer {
- r := Replacer{
- Replacements: DictMain,
- }
- r.Compile()
- return &r
-}
-
-// RemoveRule deletes existings rules.
-// TODO: make inplace to save memory
-func (r *Replacer) RemoveRule(ignore []string) {
- newwords := make([]string, 0, len(r.Replacements))
- for i := 0; i < len(r.Replacements); i += 2 {
- if inArray(ignore, r.Replacements[i]) {
- continue
- }
- newwords = append(newwords, r.Replacements[i:i+2]...)
- }
- r.engine = nil
- r.Replacements = newwords
-}
-
-// AddRuleList appends new rules.
-// Input is in the same form as Strings.Replacer: [ old1, new1, old2, new2, ....]
-// Note: does not check for duplictes
-func (r *Replacer) AddRuleList(additions []string) {
- r.engine = nil
- r.Replacements = append(r.Replacements, additions...)
-}
-
-// Compile compiles the rules. Required before using the Replace functions
-func (r *Replacer) Compile() {
-
- r.corrected = make(map[string]string, len(r.Replacements)/2)
- for i := 0; i < len(r.Replacements); i += 2 {
- r.corrected[r.Replacements[i]] = r.Replacements[i+1]
- }
- r.engine = NewStringReplacer(r.Replacements...)
-}
-
-/*
-line1 and line2 are different
-extract words from each line1
-
-replace word -> newword
-if word == new-word
- continue
-if new-word in list of replacements
- continue
-new word not original, and not in list of replacements
- some substring got mixed up. UNdo
-*/
-func (r *Replacer) recheckLine(s string, lineNum int, buf io.Writer, next func(Diff)) {
- first := 0
- redacted := RemoveNotWords(s)
-
- idx := wordRegexp.FindAllStringIndex(redacted, -1)
- for _, ab := range idx {
- word := s[ab[0]:ab[1]]
- newword := r.engine.Replace(word)
- if newword == word {
- // no replacement done
- continue
- }
-
- // ignore camelCase words
- // https://github.com/client9/misspell/issues/113
- if CaseStyle(word) == CaseUnknown {
- continue
- }
-
- if StringEqualFold(r.corrected[strings.ToLower(word)], newword) {
- // word got corrected into something we know
- io.WriteString(buf, s[first:ab[0]])
- io.WriteString(buf, newword)
- first = ab[1]
- next(Diff{
- FullLine: s,
- Line: lineNum,
- Original: word,
- Corrected: newword,
- Column: ab[0],
- })
- continue
- }
- // Word got corrected into something unknown. Ignore it
- }
- io.WriteString(buf, s[first:])
-}
-
-// ReplaceGo is a specialized routine for correcting Golang source
-// files. Currently only checks comments, not identifiers for
-// spelling.
-func (r *Replacer) ReplaceGo(input string) (string, []Diff) {
- var s scanner.Scanner
- s.Init(strings.NewReader(input))
- s.Mode = scanner.ScanIdents | scanner.ScanFloats | scanner.ScanChars | scanner.ScanStrings | scanner.ScanRawStrings | scanner.ScanComments
- lastPos := 0
- output := ""
-Loop:
- for {
- switch s.Scan() {
- case scanner.Comment:
- origComment := s.TokenText()
- newComment := r.engine.Replace(origComment)
-
- if origComment != newComment {
- // s.Pos().Offset is the end of the current token
- // subtract len(origComment) to get the start of the token
- offset := s.Pos().Offset
- output = output + input[lastPos:offset-len(origComment)] + newComment
- lastPos = offset
- }
- case scanner.EOF:
- break Loop
- }
- }
-
- if lastPos == 0 {
- // no changes, no copies
- return input, nil
- }
- if lastPos < len(input) {
- output = output + input[lastPos:]
- }
- diffs := make([]Diff, 0, 8)
- buf := bytes.NewBuffer(make([]byte, 0, max(len(input), len(output))+100))
- // faster that making a bytes.Buffer and bufio.ReadString
- outlines := strings.SplitAfter(output, "\n")
- inlines := strings.SplitAfter(input, "\n")
- for i := 0; i < len(inlines); i++ {
- if inlines[i] == outlines[i] {
- buf.WriteString(outlines[i])
- continue
- }
- r.recheckLine(inlines[i], i+1, buf, func(d Diff) {
- diffs = append(diffs, d)
- })
- }
-
- return buf.String(), diffs
-
-}
-
-// Replace is corrects misspellings in input, returning corrected version
-// along with a list of diffs.
-func (r *Replacer) Replace(input string) (string, []Diff) {
- output := r.engine.Replace(input)
- if input == output {
- return input, nil
- }
- diffs := make([]Diff, 0, 8)
- buf := bytes.NewBuffer(make([]byte, 0, max(len(input), len(output))+100))
- // faster that making a bytes.Buffer and bufio.ReadString
- outlines := strings.SplitAfter(output, "\n")
- inlines := strings.SplitAfter(input, "\n")
- for i := 0; i < len(inlines); i++ {
- if inlines[i] == outlines[i] {
- buf.WriteString(outlines[i])
- continue
- }
- r.recheckLine(inlines[i], i+1, buf, func(d Diff) {
- diffs = append(diffs, d)
- })
- }
-
- return buf.String(), diffs
-}
-
-// ReplaceReader applies spelling corrections to a reader stream. Diffs are
-// emitted through a callback.
-func (r *Replacer) ReplaceReader(raw io.Reader, w io.Writer, next func(Diff)) error {
- var (
- err error
- line string
- lineNum int
- )
- reader := bufio.NewReader(raw)
- for err == nil {
- lineNum++
- line, err = reader.ReadString('\n')
-
- // if it's EOF, then line has the last line
- // don't like the check of err here and
- // in for loop
- if err != nil && err != io.EOF {
- return err
- }
- // easily 5x faster than regexp+map
- if line == r.engine.Replace(line) {
- io.WriteString(w, line)
- continue
- }
- // but it can be inaccurate, so we need to double check
- r.recheckLine(line, lineNum, w, next)
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/stringreplacer.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/stringreplacer.go
deleted file mode 100644
index 3151eceb7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/stringreplacer.go
+++ /dev/null
@@ -1,336 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misspell
-
-import (
- "io"
- // "log"
- "strings"
-)
-
-// StringReplacer replaces a list of strings with replacements.
-// It is safe for concurrent use by multiple goroutines.
-type StringReplacer struct {
- r replacer
-}
-
-// replacer is the interface that a replacement algorithm needs to implement.
-type replacer interface {
- Replace(s string) string
- WriteString(w io.Writer, s string) (n int, err error)
-}
-
-// NewStringReplacer returns a new Replacer from a list of old, new string pairs.
-// Replacements are performed in order, without overlapping matches.
-func NewStringReplacer(oldnew ...string) *StringReplacer {
- if len(oldnew)%2 == 1 {
- panic("strings.NewReplacer: odd argument count")
- }
-
- return &StringReplacer{r: makeGenericReplacer(oldnew)}
-}
-
-// Replace returns a copy of s with all replacements performed.
-func (r *StringReplacer) Replace(s string) string {
- return r.r.Replace(s)
-}
-
-// WriteString writes s to w with all replacements performed.
-func (r *StringReplacer) WriteString(w io.Writer, s string) (n int, err error) {
- return r.r.WriteString(w, s)
-}
-
-// trieNode is a node in a lookup trie for prioritized key/value pairs. Keys
-// and values may be empty. For example, the trie containing keys "ax", "ay",
-// "bcbc", "x" and "xy" could have eight nodes:
-//
-// n0 -
-// n1 a-
-// n2 .x+
-// n3 .y+
-// n4 b-
-// n5 .cbc+
-// n6 x+
-// n7 .y+
-//
-// n0 is the root node, and its children are n1, n4 and n6; n1's children are
-// n2 and n3; n4's child is n5; n6's child is n7. Nodes n0, n1 and n4 (marked
-// with a trailing "-") are partial keys, and nodes n2, n3, n5, n6 and n7
-// (marked with a trailing "+") are complete keys.
-type trieNode struct {
- // value is the value of the trie node's key/value pair. It is empty if
- // this node is not a complete key.
- value string
- // priority is the priority (higher is more important) of the trie node's
- // key/value pair; keys are not necessarily matched shortest- or longest-
- // first. Priority is positive if this node is a complete key, and zero
- // otherwise. In the example above, positive/zero priorities are marked
- // with a trailing "+" or "-".
- priority int
-
- // A trie node may have zero, one or more child nodes:
- // * if the remaining fields are zero, there are no children.
- // * if prefix and next are non-zero, there is one child in next.
- // * if table is non-zero, it defines all the children.
- //
- // Prefixes are preferred over tables when there is one child, but the
- // root node always uses a table for lookup efficiency.
-
- // prefix is the difference in keys between this trie node and the next.
- // In the example above, node n4 has prefix "cbc" and n4's next node is n5.
- // Node n5 has no children and so has zero prefix, next and table fields.
- prefix string
- next *trieNode
-
- // table is a lookup table indexed by the next byte in the key, after
- // remapping that byte through genericReplacer.mapping to create a dense
- // index. In the example above, the keys only use 'a', 'b', 'c', 'x' and
- // 'y', which remap to 0, 1, 2, 3 and 4. All other bytes remap to 5, and
- // genericReplacer.tableSize will be 5. Node n0's table will be
- // []*trieNode{ 0:n1, 1:n4, 3:n6 }, where the 0, 1 and 3 are the remapped
- // 'a', 'b' and 'x'.
- table []*trieNode
-}
-
-func (t *trieNode) add(key, val string, priority int, r *genericReplacer) {
- if key == "" {
- if t.priority == 0 {
- t.value = val
- t.priority = priority
- }
- return
- }
-
- if t.prefix != "" {
- // Need to split the prefix among multiple nodes.
- var n int // length of the longest common prefix
- for ; n < len(t.prefix) && n < len(key); n++ {
- if t.prefix[n] != key[n] {
- break
- }
- }
- if n == len(t.prefix) {
- t.next.add(key[n:], val, priority, r)
- } else if n == 0 {
- // First byte differs, start a new lookup table here. Looking up
- // what is currently t.prefix[0] will lead to prefixNode, and
- // looking up key[0] will lead to keyNode.
- var prefixNode *trieNode
- if len(t.prefix) == 1 {
- prefixNode = t.next
- } else {
- prefixNode = &trieNode{
- prefix: t.prefix[1:],
- next: t.next,
- }
- }
- keyNode := new(trieNode)
- t.table = make([]*trieNode, r.tableSize)
- t.table[r.mapping[t.prefix[0]]] = prefixNode
- t.table[r.mapping[key[0]]] = keyNode
- t.prefix = ""
- t.next = nil
- keyNode.add(key[1:], val, priority, r)
- } else {
- // Insert new node after the common section of the prefix.
- next := &trieNode{
- prefix: t.prefix[n:],
- next: t.next,
- }
- t.prefix = t.prefix[:n]
- t.next = next
- next.add(key[n:], val, priority, r)
- }
- } else if t.table != nil {
- // Insert into existing table.
- m := r.mapping[key[0]]
- if t.table[m] == nil {
- t.table[m] = new(trieNode)
- }
- t.table[m].add(key[1:], val, priority, r)
- } else {
- t.prefix = key
- t.next = new(trieNode)
- t.next.add("", val, priority, r)
- }
-}
-
-func (r *genericReplacer) lookup(s string, ignoreRoot bool) (val string, keylen int, found bool) {
- // Iterate down the trie to the end, and grab the value and keylen with
- // the highest priority.
- bestPriority := 0
- node := &r.root
- n := 0
- for node != nil {
- if node.priority > bestPriority && !(ignoreRoot && node == &r.root) {
- bestPriority = node.priority
- val = node.value
- keylen = n
- found = true
- }
-
- if s == "" {
- break
- }
- if node.table != nil {
- index := r.mapping[ByteToLower(s[0])]
- if int(index) == r.tableSize {
- break
- }
- node = node.table[index]
- s = s[1:]
- n++
- } else if node.prefix != "" && StringHasPrefixFold(s, node.prefix) {
- n += len(node.prefix)
- s = s[len(node.prefix):]
- node = node.next
- } else {
- break
- }
- }
- return
-}
-
-// genericReplacer is the fully generic algorithm.
-// It's used as a fallback when nothing faster can be used.
-type genericReplacer struct {
- root trieNode
- // tableSize is the size of a trie node's lookup table. It is the number
- // of unique key bytes.
- tableSize int
- // mapping maps from key bytes to a dense index for trieNode.table.
- mapping [256]byte
-}
-
-func makeGenericReplacer(oldnew []string) *genericReplacer {
- r := new(genericReplacer)
- // Find each byte used, then assign them each an index.
- for i := 0; i < len(oldnew); i += 2 {
- key := strings.ToLower(oldnew[i])
- for j := 0; j < len(key); j++ {
- r.mapping[key[j]] = 1
- }
- }
-
- for _, b := range r.mapping {
- r.tableSize += int(b)
- }
-
- var index byte
- for i, b := range r.mapping {
- if b == 0 {
- r.mapping[i] = byte(r.tableSize)
- } else {
- r.mapping[i] = index
- index++
- }
- }
- // Ensure root node uses a lookup table (for performance).
- r.root.table = make([]*trieNode, r.tableSize)
-
- for i := 0; i < len(oldnew); i += 2 {
- r.root.add(strings.ToLower(oldnew[i]), oldnew[i+1], len(oldnew)-i, r)
- }
- return r
-}
-
-type appendSliceWriter []byte
-
-// Write writes to the buffer to satisfy io.Writer.
-func (w *appendSliceWriter) Write(p []byte) (int, error) {
- *w = append(*w, p...)
- return len(p), nil
-}
-
-// WriteString writes to the buffer without string->[]byte->string allocations.
-func (w *appendSliceWriter) WriteString(s string) (int, error) {
- *w = append(*w, s...)
- return len(s), nil
-}
-
-type stringWriterIface interface {
- WriteString(string) (int, error)
-}
-
-type stringWriter struct {
- w io.Writer
-}
-
-func (w stringWriter) WriteString(s string) (int, error) {
- return w.w.Write([]byte(s))
-}
-
-func getStringWriter(w io.Writer) stringWriterIface {
- sw, ok := w.(stringWriterIface)
- if !ok {
- sw = stringWriter{w}
- }
- return sw
-}
-
-func (r *genericReplacer) Replace(s string) string {
- buf := make(appendSliceWriter, 0, len(s))
- r.WriteString(&buf, s)
- return string(buf)
-}
-
-func (r *genericReplacer) WriteString(w io.Writer, s string) (n int, err error) {
- sw := getStringWriter(w)
- var last, wn int
- var prevMatchEmpty bool
- for i := 0; i <= len(s); {
- // Fast path: s[i] is not a prefix of any pattern.
- if i != len(s) && r.root.priority == 0 {
- index := int(r.mapping[ByteToLower(s[i])])
- if index == r.tableSize || r.root.table[index] == nil {
- i++
- continue
- }
- }
-
- // Ignore the empty match iff the previous loop found the empty match.
- val, keylen, match := r.lookup(s[i:], prevMatchEmpty)
- prevMatchEmpty = match && keylen == 0
- if match {
- orig := s[i : i+keylen]
- switch CaseStyle(orig) {
- case CaseUnknown:
- // pretend we didn't match
- // i++
- // continue
- case CaseUpper:
- val = strings.ToUpper(val)
- case CaseLower:
- val = strings.ToLower(val)
- case CaseTitle:
- if len(val) < 2 {
- val = strings.ToUpper(val)
- } else {
- val = strings.ToUpper(val[:1]) + strings.ToLower(val[1:])
- }
- }
- wn, err = sw.WriteString(s[last:i])
- n += wn
- if err != nil {
- return
- }
- //log.Printf("%d: Going to correct %q with %q", i, s[i:i+keylen], val)
- wn, err = sw.WriteString(val)
- n += wn
- if err != nil {
- return
- }
- i += keylen
- last = i
- continue
- }
- i++
- }
- if last != len(s) {
- wn, err = sw.WriteString(s[last:])
- n += wn
- }
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/url.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/url.go
deleted file mode 100644
index 1a259f5f9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/url.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package misspell
-
-import (
- "regexp"
-)
-
-// Regexp for URL https://mathiasbynens.be/demo/url-regex
-//
-// original @imme_emosol (54 chars) has trouble with dashes in hostname
-// @(https?|ftp)://(-\.)?([^\s/?\.#-]+\.?)+(/[^\s]*)?$@iS
-var reURL = regexp.MustCompile(`(?i)(https?|ftp)://(-\.)?([^\s/?\.#]+\.?)+(/[^\s]*)?`)
-
-// StripURL attemps to replace URLs with blank spaces, e.g.
-// "xxx http://foo.com/ yyy -> "xxx yyyy"
-func StripURL(s string) string {
- return reURL.ReplaceAllStringFunc(s, replaceWithBlanks)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/cmd/globdraw/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/cmd/globdraw/main.go
deleted file mode 100644
index 585880db9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/cmd/globdraw/main.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "github.com/gobwas/glob"
- "github.com/gobwas/glob/match"
- "github.com/gobwas/glob/match/debug"
- "os"
- "strings"
- "unicode/utf8"
-)
-
-func main() {
- pattern := flag.String("p", "", "pattern to draw")
- sep := flag.String("s", "", "comma separated list of separators characters")
- flag.Parse()
-
- if *pattern == "" {
- flag.Usage()
- os.Exit(1)
- }
-
- var separators []rune
- if len(*sep) > 0 {
- for _, c := range strings.Split(*sep, ",") {
- if r, w := utf8.DecodeRuneInString(c); len(c) > w {
- fmt.Println("only single charactered separators are allowed")
- os.Exit(1)
- } else {
- separators = append(separators, r)
- }
- }
- }
-
- glob, err := glob.Compile(*pattern, separators...)
- if err != nil {
- fmt.Println("could not compile pattern:", err)
- os.Exit(1)
- }
-
- matcher := glob.(match.Matcher)
- fmt.Fprint(os.Stdout, debug.Graphviz(*pattern, matcher))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/cmd/globtest/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/cmd/globtest/main.go
deleted file mode 100644
index 95c102f73..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/cmd/globtest/main.go
+++ /dev/null
@@ -1,82 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "github.com/gobwas/glob"
- "os"
- "strings"
- "testing"
- "unicode/utf8"
-)
-
-func benchString(r testing.BenchmarkResult) string {
- nsop := r.NsPerOp()
- ns := fmt.Sprintf("%10d ns/op", nsop)
- allocs := "0"
- if r.N > 0 {
- if nsop < 100 {
- // The format specifiers here make sure that
- // the ones digits line up for all three possible formats.
- if nsop < 10 {
- ns = fmt.Sprintf("%13.2f ns/op", float64(r.T.Nanoseconds())/float64(r.N))
- } else {
- ns = fmt.Sprintf("%12.1f ns/op", float64(r.T.Nanoseconds())/float64(r.N))
- }
- }
-
- allocs = fmt.Sprintf("%d", r.MemAllocs/uint64(r.N))
- }
-
- return fmt.Sprintf("%8d\t%s\t%s allocs", r.N, ns, allocs)
-}
-
-func main() {
- pattern := flag.String("p", "", "pattern to draw")
- sep := flag.String("s", "", "comma separated list of separators")
- fixture := flag.String("f", "", "fixture")
- verbose := flag.Bool("v", false, "verbose")
- flag.Parse()
-
- if *pattern == "" {
- flag.Usage()
- os.Exit(1)
- }
-
- var separators []rune
- for _, c := range strings.Split(*sep, ",") {
- if r, w := utf8.DecodeRuneInString(c); len(c) > w {
- fmt.Println("only single charactered separators are allowed")
- os.Exit(1)
- } else {
- separators = append(separators, r)
- }
- }
-
- g, err := glob.Compile(*pattern, separators...)
- if err != nil {
- fmt.Println("could not compile pattern:", err)
- os.Exit(1)
- }
-
- if !*verbose {
- fmt.Println(g.Match(*fixture))
- return
- }
-
- fmt.Printf("result: %t\n", g.Match(*fixture))
-
- cb := testing.Benchmark(func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- glob.Compile(*pattern, separators...)
- }
- })
- fmt.Println("compile:", benchString(cb))
-
- mb := testing.Benchmark(func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- g.Match(*fixture)
- }
- })
- fmt.Println("match: ", benchString(mb))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/compiler/compiler.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/compiler/compiler.go
deleted file mode 100644
index fc70cae07..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/compiler/compiler.go
+++ /dev/null
@@ -1,519 +0,0 @@
-package compiler
-
-// TODO use constructor with all matchers, and to their structs private
-// TODO glue multiple Text nodes (like after QuoteMeta)
-
-import (
- "fmt"
- "reflect"
-
- "github.com/gobwas/glob/match"
- "github.com/gobwas/glob/syntax/ast"
- "github.com/gobwas/glob/util/runes"
-)
-
-func optimizeMatcher(matcher match.Matcher) match.Matcher {
- switch m := matcher.(type) {
-
- case match.Any:
- if len(m.Separators) == 0 {
- return match.NewSuper()
- }
-
- case match.AnyOf:
- if len(m.Matchers) == 1 {
- return m.Matchers[0]
- }
-
- return m
-
- case match.List:
- if m.Not == false && len(m.List) == 1 {
- return match.NewText(string(m.List))
- }
-
- return m
-
- case match.BTree:
- m.Left = optimizeMatcher(m.Left)
- m.Right = optimizeMatcher(m.Right)
-
- r, ok := m.Value.(match.Text)
- if !ok {
- return m
- }
-
- leftNil := m.Left == nil
- rightNil := m.Right == nil
-
- if leftNil && rightNil {
- return match.NewText(r.Str)
- }
-
- _, leftSuper := m.Left.(match.Super)
- lp, leftPrefix := m.Left.(match.Prefix)
-
- _, rightSuper := m.Right.(match.Super)
- rs, rightSuffix := m.Right.(match.Suffix)
-
- if leftSuper && rightSuper {
- return match.NewContains(r.Str, false)
- }
-
- if leftSuper && rightNil {
- return match.NewSuffix(r.Str)
- }
-
- if rightSuper && leftNil {
- return match.NewPrefix(r.Str)
- }
-
- if leftNil && rightSuffix {
- return match.NewPrefixSuffix(r.Str, rs.Suffix)
- }
-
- if rightNil && leftPrefix {
- return match.NewPrefixSuffix(lp.Prefix, r.Str)
- }
-
- return m
- }
-
- return matcher
-}
-
-func compileMatchers(matchers []match.Matcher) (match.Matcher, error) {
- if len(matchers) == 0 {
- return nil, fmt.Errorf("compile error: need at least one matcher")
- }
- if len(matchers) == 1 {
- return matchers[0], nil
- }
- if m := glueMatchers(matchers); m != nil {
- return m, nil
- }
-
- idx := -1
- maxLen := -1
- var val match.Matcher
- for i, matcher := range matchers {
- if l := matcher.Len(); l != -1 && l >= maxLen {
- maxLen = l
- idx = i
- val = matcher
- }
- }
-
- if val == nil { // not found matcher with static length
- r, err := compileMatchers(matchers[1:])
- if err != nil {
- return nil, err
- }
- return match.NewBTree(matchers[0], nil, r), nil
- }
-
- left := matchers[:idx]
- var right []match.Matcher
- if len(matchers) > idx+1 {
- right = matchers[idx+1:]
- }
-
- var l, r match.Matcher
- var err error
- if len(left) > 0 {
- l, err = compileMatchers(left)
- if err != nil {
- return nil, err
- }
- }
-
- if len(right) > 0 {
- r, err = compileMatchers(right)
- if err != nil {
- return nil, err
- }
- }
-
- return match.NewBTree(val, l, r), nil
-}
-
-func glueMatchers(matchers []match.Matcher) match.Matcher {
- if m := glueMatchersAsEvery(matchers); m != nil {
- return m
- }
- if m := glueMatchersAsRow(matchers); m != nil {
- return m
- }
- return nil
-}
-
-func glueMatchersAsRow(matchers []match.Matcher) match.Matcher {
- if len(matchers) <= 1 {
- return nil
- }
-
- var (
- c []match.Matcher
- l int
- )
- for _, matcher := range matchers {
- if ml := matcher.Len(); ml == -1 {
- return nil
- } else {
- c = append(c, matcher)
- l += ml
- }
- }
- return match.NewRow(l, c...)
-}
-
-func glueMatchersAsEvery(matchers []match.Matcher) match.Matcher {
- if len(matchers) <= 1 {
- return nil
- }
-
- var (
- hasAny bool
- hasSuper bool
- hasSingle bool
- min int
- separator []rune
- )
-
- for i, matcher := range matchers {
- var sep []rune
-
- switch m := matcher.(type) {
- case match.Super:
- sep = []rune{}
- hasSuper = true
-
- case match.Any:
- sep = m.Separators
- hasAny = true
-
- case match.Single:
- sep = m.Separators
- hasSingle = true
- min++
-
- case match.List:
- if !m.Not {
- return nil
- }
- sep = m.List
- hasSingle = true
- min++
-
- default:
- return nil
- }
-
- // initialize
- if i == 0 {
- separator = sep
- }
-
- if runes.Equal(sep, separator) {
- continue
- }
-
- return nil
- }
-
- if hasSuper && !hasAny && !hasSingle {
- return match.NewSuper()
- }
-
- if hasAny && !hasSuper && !hasSingle {
- return match.NewAny(separator)
- }
-
- if (hasAny || hasSuper) && min > 0 && len(separator) == 0 {
- return match.NewMin(min)
- }
-
- every := match.NewEveryOf()
-
- if min > 0 {
- every.Add(match.NewMin(min))
-
- if !hasAny && !hasSuper {
- every.Add(match.NewMax(min))
- }
- }
-
- if len(separator) > 0 {
- every.Add(match.NewContains(string(separator), true))
- }
-
- return every
-}
-
-func minimizeMatchers(matchers []match.Matcher) []match.Matcher {
- var done match.Matcher
- var left, right, count int
-
- for l := 0; l < len(matchers); l++ {
- for r := len(matchers); r > l; r-- {
- if glued := glueMatchers(matchers[l:r]); glued != nil {
- var swap bool
-
- if done == nil {
- swap = true
- } else {
- cl, gl := done.Len(), glued.Len()
- swap = cl > -1 && gl > -1 && gl > cl
- swap = swap || count < r-l
- }
-
- if swap {
- done = glued
- left = l
- right = r
- count = r - l
- }
- }
- }
- }
-
- if done == nil {
- return matchers
- }
-
- next := append(append([]match.Matcher{}, matchers[:left]...), done)
- if right < len(matchers) {
- next = append(next, matchers[right:]...)
- }
-
- if len(next) == len(matchers) {
- return next
- }
-
- return minimizeMatchers(next)
-}
-
-// minimizeAnyOf tries to apply some heuristics to minimize number of nodes in given tree
-func minimizeTree(tree *ast.Node) *ast.Node {
- switch tree.Kind {
- case ast.KindAnyOf:
- return minimizeTreeAnyOf(tree)
- default:
- return nil
- }
-}
-
-// minimizeAnyOf tries to find common children of given node of AnyOf pattern
-// it searches for common children from left and from right
-// if any common children are found – then it returns new optimized ast tree
-// else it returns nil
-func minimizeTreeAnyOf(tree *ast.Node) *ast.Node {
- if !areOfSameKind(tree.Children, ast.KindPattern) {
- return nil
- }
-
- commonLeft, commonRight := commonChildren(tree.Children)
- commonLeftCount, commonRightCount := len(commonLeft), len(commonRight)
- if commonLeftCount == 0 && commonRightCount == 0 { // there are no common parts
- return nil
- }
-
- var result []*ast.Node
- if commonLeftCount > 0 {
- result = append(result, ast.NewNode(ast.KindPattern, nil, commonLeft...))
- }
-
- var anyOf []*ast.Node
- for _, child := range tree.Children {
- reuse := child.Children[commonLeftCount : len(child.Children)-commonRightCount]
- var node *ast.Node
- if len(reuse) == 0 {
- // this pattern is completely reduced by commonLeft and commonRight patterns
- // so it become nothing
- node = ast.NewNode(ast.KindNothing, nil)
- } else {
- node = ast.NewNode(ast.KindPattern, nil, reuse...)
- }
- anyOf = appendIfUnique(anyOf, node)
- }
- switch {
- case len(anyOf) == 1 && anyOf[0].Kind != ast.KindNothing:
- result = append(result, anyOf[0])
- case len(anyOf) > 1:
- result = append(result, ast.NewNode(ast.KindAnyOf, nil, anyOf...))
- }
-
- if commonRightCount > 0 {
- result = append(result, ast.NewNode(ast.KindPattern, nil, commonRight...))
- }
-
- return ast.NewNode(ast.KindPattern, nil, result...)
-}
-
-func commonChildren(nodes []*ast.Node) (commonLeft, commonRight []*ast.Node) {
- if len(nodes) <= 1 {
- return
- }
-
- // find node that has least number of children
- idx := leastChildren(nodes)
- if idx == -1 {
- return
- }
- tree := nodes[idx]
- treeLength := len(tree.Children)
-
- // allocate max able size for rightCommon slice
- // to get ability insert elements in reverse order (from end to start)
- // without sorting
- commonRight = make([]*ast.Node, treeLength)
- lastRight := treeLength // will use this to get results as commonRight[lastRight:]
-
- var (
- breakLeft bool
- breakRight bool
- commonTotal int
- )
- for i, j := 0, treeLength-1; commonTotal < treeLength && j >= 0 && !(breakLeft && breakRight); i, j = i+1, j-1 {
- treeLeft := tree.Children[i]
- treeRight := tree.Children[j]
-
- for k := 0; k < len(nodes) && !(breakLeft && breakRight); k++ {
- // skip least children node
- if k == idx {
- continue
- }
-
- restLeft := nodes[k].Children[i]
- restRight := nodes[k].Children[j+len(nodes[k].Children)-treeLength]
-
- breakLeft = breakLeft || !treeLeft.Equal(restLeft)
-
- // disable searching for right common parts, if left part is already overlapping
- breakRight = breakRight || (!breakLeft && j <= i)
- breakRight = breakRight || !treeRight.Equal(restRight)
- }
-
- if !breakLeft {
- commonTotal++
- commonLeft = append(commonLeft, treeLeft)
- }
- if !breakRight {
- commonTotal++
- lastRight = j
- commonRight[j] = treeRight
- }
- }
-
- commonRight = commonRight[lastRight:]
-
- return
-}
-
-func appendIfUnique(target []*ast.Node, val *ast.Node) []*ast.Node {
- for _, n := range target {
- if reflect.DeepEqual(n, val) {
- return target
- }
- }
- return append(target, val)
-}
-
-func areOfSameKind(nodes []*ast.Node, kind ast.Kind) bool {
- for _, n := range nodes {
- if n.Kind != kind {
- return false
- }
- }
- return true
-}
-
-func leastChildren(nodes []*ast.Node) int {
- min := -1
- idx := -1
- for i, n := range nodes {
- if idx == -1 || (len(n.Children) < min) {
- min = len(n.Children)
- idx = i
- }
- }
- return idx
-}
-
-func compileTreeChildren(tree *ast.Node, sep []rune) ([]match.Matcher, error) {
- var matchers []match.Matcher
- for _, desc := range tree.Children {
- m, err := compile(desc, sep)
- if err != nil {
- return nil, err
- }
- matchers = append(matchers, optimizeMatcher(m))
- }
- return matchers, nil
-}
-
-func compile(tree *ast.Node, sep []rune) (m match.Matcher, err error) {
- switch tree.Kind {
- case ast.KindAnyOf:
- // todo this could be faster on pattern_alternatives_combine_lite (see glob_test.go)
- if n := minimizeTree(tree); n != nil {
- return compile(n, sep)
- }
- matchers, err := compileTreeChildren(tree, sep)
- if err != nil {
- return nil, err
- }
- return match.NewAnyOf(matchers...), nil
-
- case ast.KindPattern:
- if len(tree.Children) == 0 {
- return match.NewNothing(), nil
- }
- matchers, err := compileTreeChildren(tree, sep)
- if err != nil {
- return nil, err
- }
- m, err = compileMatchers(minimizeMatchers(matchers))
- if err != nil {
- return nil, err
- }
-
- case ast.KindAny:
- m = match.NewAny(sep)
-
- case ast.KindSuper:
- m = match.NewSuper()
-
- case ast.KindSingle:
- m = match.NewSingle(sep)
-
- case ast.KindNothing:
- m = match.NewNothing()
-
- case ast.KindList:
- l := tree.Value.(ast.List)
- m = match.NewList([]rune(l.Chars), l.Not)
-
- case ast.KindRange:
- r := tree.Value.(ast.Range)
- m = match.NewRange(r.Lo, r.Hi, r.Not)
-
- case ast.KindText:
- t := tree.Value.(ast.Text)
- m = match.NewText(t.Text)
-
- default:
- return nil, fmt.Errorf("could not compile tree: unknown node type")
- }
-
- return optimizeMatcher(m), nil
-}
-
-func Compile(tree *ast.Node, sep []rune) (match.Matcher, error) {
- m, err := compile(tree, sep)
- if err != nil {
- return nil, err
- }
-
- return m, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/glob.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/glob.go
deleted file mode 100644
index 2afde343a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/glob.go
+++ /dev/null
@@ -1,80 +0,0 @@
-package glob
-
-import (
- "github.com/gobwas/glob/compiler"
- "github.com/gobwas/glob/syntax"
-)
-
-// Glob represents compiled glob pattern.
-type Glob interface {
- Match(string) bool
-}
-
-// Compile creates Glob for given pattern and strings (if any present after pattern) as separators.
-// The pattern syntax is:
-//
-// pattern:
-// { term }
-//
-// term:
-// `*` matches any sequence of non-separator characters
-// `**` matches any sequence of characters
-// `?` matches any single non-separator character
-// `[` [ `!` ] { character-range } `]`
-// character class (must be non-empty)
-// `{` pattern-list `}`
-// pattern alternatives
-// c matches character c (c != `*`, `**`, `?`, `\`, `[`, `{`, `}`)
-// `\` c matches character c
-//
-// character-range:
-// c matches character c (c != `\\`, `-`, `]`)
-// `\` c matches character c
-// lo `-` hi matches character c for lo <= c <= hi
-//
-// pattern-list:
-// pattern { `,` pattern }
-// comma-separated (without spaces) patterns
-//
-func Compile(pattern string, separators ...rune) (Glob, error) {
- ast, err := syntax.Parse(pattern)
- if err != nil {
- return nil, err
- }
-
- matcher, err := compiler.Compile(ast, separators)
- if err != nil {
- return nil, err
- }
-
- return matcher, nil
-}
-
-// MustCompile is the same as Compile, except that if Compile returns error, this will panic
-func MustCompile(pattern string, separators ...rune) Glob {
- g, err := Compile(pattern, separators...)
- if err != nil {
- panic(err)
- }
-
- return g
-}
-
-// QuoteMeta returns a string that quotes all glob pattern meta characters
-// inside the argument text; For example, QuoteMeta(`{foo*}`) returns `\[foo\*\]`.
-func QuoteMeta(s string) string {
- b := make([]byte, 2*len(s))
-
- // a byte loop is correct because all meta characters are ASCII
- j := 0
- for i := 0; i < len(s); i++ {
- if syntax.Special(s[i]) {
- b[j] = '\\'
- j++
- }
- b[j] = s[i]
- j++
- }
-
- return string(b[0:j])
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/any.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/any.go
deleted file mode 100644
index 514a9a5c4..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/any.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package match
-
-import (
- "fmt"
- "github.com/gobwas/glob/util/strings"
-)
-
-type Any struct {
- Separators []rune
-}
-
-func NewAny(s []rune) Any {
- return Any{s}
-}
-
-func (self Any) Match(s string) bool {
- return strings.IndexAnyRunes(s, self.Separators) == -1
-}
-
-func (self Any) Index(s string) (int, []int) {
- found := strings.IndexAnyRunes(s, self.Separators)
- switch found {
- case -1:
- case 0:
- return 0, segments0
- default:
- s = s[:found]
- }
-
- segments := acquireSegments(len(s))
- for i := range s {
- segments = append(segments, i)
- }
- segments = append(segments, len(s))
-
- return 0, segments
-}
-
-func (self Any) Len() int {
- return lenNo
-}
-
-func (self Any) String() string {
- return fmt.Sprintf("", string(self.Separators))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/any_of.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/any_of.go
deleted file mode 100644
index 60370433a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/any_of.go
+++ /dev/null
@@ -1,84 +0,0 @@
-package match
-
-import (
- "fmt"
-)
-
-type AnyOf struct {
- Matchers Matchers
-}
-
-func NewAnyOf(m ...Matcher) AnyOf {
- return AnyOf{Matchers(m)}
-}
-
-func (self *AnyOf) Add(m Matcher) error {
- self.Matchers = append(self.Matchers, m)
- return nil
-}
-
-func (self AnyOf) Match(s string) bool {
- for _, m := range self.Matchers {
- if m.Match(s) {
- return true
- }
- }
-
- return false
-}
-
-func (self AnyOf) Index(s string) (int, []int) {
- index := -1
-
- segments := acquireSegments(len(s))
- for _, m := range self.Matchers {
- idx, seg := m.Index(s)
- if idx == -1 {
- continue
- }
-
- if index == -1 || idx < index {
- index = idx
- segments = append(segments[:0], seg...)
- continue
- }
-
- if idx > index {
- continue
- }
-
- // here idx == index
- segments = appendMerge(segments, seg)
- }
-
- if index == -1 {
- releaseSegments(segments)
- return -1, nil
- }
-
- return index, segments
-}
-
-func (self AnyOf) Len() (l int) {
- l = -1
- for _, m := range self.Matchers {
- ml := m.Len()
- switch {
- case l == -1:
- l = ml
- continue
-
- case ml == -1:
- return -1
-
- case l != ml:
- return -1
- }
- }
-
- return
-}
-
-func (self AnyOf) String() string {
- return fmt.Sprintf("", self.Matchers)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/btree.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/btree.go
deleted file mode 100644
index a8130e93e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/btree.go
+++ /dev/null
@@ -1,146 +0,0 @@
-package match
-
-import (
- "fmt"
- "unicode/utf8"
-)
-
-type BTree struct {
- Value Matcher
- Left Matcher
- Right Matcher
- ValueLengthRunes int
- LeftLengthRunes int
- RightLengthRunes int
- LengthRunes int
-}
-
-func NewBTree(Value, Left, Right Matcher) (tree BTree) {
- tree.Value = Value
- tree.Left = Left
- tree.Right = Right
-
- lenOk := true
- if tree.ValueLengthRunes = Value.Len(); tree.ValueLengthRunes == -1 {
- lenOk = false
- }
-
- if Left != nil {
- if tree.LeftLengthRunes = Left.Len(); tree.LeftLengthRunes == -1 {
- lenOk = false
- }
- }
-
- if Right != nil {
- if tree.RightLengthRunes = Right.Len(); tree.RightLengthRunes == -1 {
- lenOk = false
- }
- }
-
- if lenOk {
- tree.LengthRunes = tree.LeftLengthRunes + tree.ValueLengthRunes + tree.RightLengthRunes
- } else {
- tree.LengthRunes = -1
- }
-
- return tree
-}
-
-func (self BTree) Len() int {
- return self.LengthRunes
-}
-
-// todo?
-func (self BTree) Index(s string) (int, []int) {
- return -1, nil
-}
-
-func (self BTree) Match(s string) bool {
- inputLen := len(s)
-
- // self.Length, self.RLen and self.LLen are values meaning the length of runes for each part
- // here we manipulating byte length for better optimizations
- // but these checks still works, cause minLen of 1-rune string is 1 byte.
- if self.LengthRunes != -1 && self.LengthRunes > inputLen {
- return false
- }
-
- // try to cut unnecessary parts
- // by knowledge of length of right and left part
- var offset, limit int
- if self.LeftLengthRunes >= 0 {
- offset = self.LeftLengthRunes
- }
- if self.RightLengthRunes >= 0 {
- limit = inputLen - self.RightLengthRunes
- } else {
- limit = inputLen
- }
-
- for offset < limit {
- // search for matching part in substring
- index, segments := self.Value.Index(s[offset:limit])
- if index == -1 {
- releaseSegments(segments)
- return false
- }
-
- l := s[:offset+index]
- var left bool
- if self.Left != nil {
- left = self.Left.Match(l)
- } else {
- left = l == ""
- }
-
- if left {
- for i := len(segments) - 1; i >= 0; i-- {
- length := segments[i]
-
- var right bool
- var r string
- // if there is no string for the right branch
- if inputLen <= offset+index+length {
- r = ""
- } else {
- r = s[offset+index+length:]
- }
-
- if self.Right != nil {
- right = self.Right.Match(r)
- } else {
- right = r == ""
- }
-
- if right {
- releaseSegments(segments)
- return true
- }
- }
- }
-
- _, step := utf8.DecodeRuneInString(s[offset+index:])
- offset += index + step
-
- releaseSegments(segments)
- }
-
- return false
-}
-
-func (self BTree) String() string {
- const n string = ""
- var l, r string
- if self.Left == nil {
- l = n
- } else {
- l = self.Left.String()
- }
- if self.Right == nil {
- r = n
- } else {
- r = self.Right.String()
- }
-
- return fmt.Sprintf("%s]>", l, self.Value, r)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/contains.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/contains.go
deleted file mode 100644
index b4f57fcb3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/contains.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package match
-
-import (
- "fmt"
- "strings"
-)
-
-type Contains struct {
- Needle string
- Not bool
-}
-
-func NewContains(needle string, not bool) Contains {
- return Contains{needle, not}
-}
-
-func (self Contains) Match(s string) bool {
- return strings.Contains(s, self.Needle) != self.Not
-}
-
-func (self Contains) Index(s string) (int, []int) {
- var offset int
-
- idx := strings.Index(s, self.Needle)
-
- if !self.Not {
- if idx == -1 {
- return -1, nil
- }
-
- offset = idx + len(self.Needle)
- if len(s) <= offset {
- return 0, []int{offset}
- }
- s = s[offset:]
- } else if idx != -1 {
- s = s[:idx]
- }
-
- segments := acquireSegments(len(s) + 1)
- for i, _ := range s {
- segments = append(segments, offset+i)
- }
-
- return 0, append(segments, offset+len(s))
-}
-
-func (self Contains) Len() int {
- return lenNo
-}
-
-func (self Contains) String() string {
- var not string
- if self.Not {
- not = "!"
- }
- return fmt.Sprintf("", not, self.Needle)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/debug/debug.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/debug/debug.go
deleted file mode 100644
index 5c5dbc1a4..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/debug/debug.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package debug
-
-import (
- "bytes"
- "fmt"
- "github.com/gobwas/glob/match"
- "math/rand"
-)
-
-func Graphviz(pattern string, m match.Matcher) string {
- return fmt.Sprintf(`digraph G {graph[label="%s"];%s}`, pattern, graphviz_internal(m, fmt.Sprintf("%x", rand.Int63())))
-}
-
-func graphviz_internal(m match.Matcher, id string) string {
- buf := &bytes.Buffer{}
-
- switch matcher := m.(type) {
- case match.BTree:
- fmt.Fprintf(buf, `"%s"[label="%s"];`, id, matcher.Value.String())
- for _, m := range []match.Matcher{matcher.Left, matcher.Right} {
- switch n := m.(type) {
- case nil:
- rnd := rand.Int63()
- fmt.Fprintf(buf, `"%x"[label=""];`, rnd)
- fmt.Fprintf(buf, `"%s"->"%x";`, id, rnd)
-
- default:
- sub := fmt.Sprintf("%x", rand.Int63())
- fmt.Fprintf(buf, `"%s"->"%s";`, id, sub)
- fmt.Fprintf(buf, graphviz_internal(n, sub))
- }
- }
-
- case match.AnyOf:
- fmt.Fprintf(buf, `"%s"[label="AnyOf"];`, id)
- for _, m := range matcher.Matchers {
- rnd := rand.Int63()
- fmt.Fprintf(buf, graphviz_internal(m, fmt.Sprintf("%x", rnd)))
- fmt.Fprintf(buf, `"%s"->"%x";`, id, rnd)
- }
-
- case match.EveryOf:
- fmt.Fprintf(buf, `"%s"[label="EveryOf"];`, id)
- for _, m := range matcher.Matchers {
- rnd := rand.Int63()
- fmt.Fprintf(buf, graphviz_internal(m, fmt.Sprintf("%x", rnd)))
- fmt.Fprintf(buf, `"%s"->"%x";`, id, rnd)
- }
-
- default:
- fmt.Fprintf(buf, `"%s"[label="%s"];`, id, m.String())
- }
-
- return buf.String()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/every_of.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/every_of.go
deleted file mode 100644
index 7c968ee36..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/every_of.go
+++ /dev/null
@@ -1,99 +0,0 @@
-package match
-
-import (
- "fmt"
-)
-
-type EveryOf struct {
- Matchers Matchers
-}
-
-func NewEveryOf(m ...Matcher) EveryOf {
- return EveryOf{Matchers(m)}
-}
-
-func (self *EveryOf) Add(m Matcher) error {
- self.Matchers = append(self.Matchers, m)
- return nil
-}
-
-func (self EveryOf) Len() (l int) {
- for _, m := range self.Matchers {
- if ml := m.Len(); l > 0 {
- l += ml
- } else {
- return -1
- }
- }
-
- return
-}
-
-func (self EveryOf) Index(s string) (int, []int) {
- var index int
- var offset int
-
- // make `in` with cap as len(s),
- // cause it is the maximum size of output segments values
- next := acquireSegments(len(s))
- current := acquireSegments(len(s))
-
- sub := s
- for i, m := range self.Matchers {
- idx, seg := m.Index(sub)
- if idx == -1 {
- releaseSegments(next)
- releaseSegments(current)
- return -1, nil
- }
-
- if i == 0 {
- // we use copy here instead of `current = seg`
- // cause seg is a slice from reusable buffer `in`
- // and it could be overwritten in next iteration
- current = append(current, seg...)
- } else {
- // clear the next
- next = next[:0]
-
- delta := index - (idx + offset)
- for _, ex := range current {
- for _, n := range seg {
- if ex+delta == n {
- next = append(next, n)
- }
- }
- }
-
- if len(next) == 0 {
- releaseSegments(next)
- releaseSegments(current)
- return -1, nil
- }
-
- current = append(current[:0], next...)
- }
-
- index = idx + offset
- sub = s[index:]
- offset += idx
- }
-
- releaseSegments(next)
-
- return index, current
-}
-
-func (self EveryOf) Match(s string) bool {
- for _, m := range self.Matchers {
- if !m.Match(s) {
- return false
- }
- }
-
- return true
-}
-
-func (self EveryOf) String() string {
- return fmt.Sprintf("", self.Matchers)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/list.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/list.go
deleted file mode 100644
index 7fd763ecd..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/list.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package match
-
-import (
- "fmt"
- "github.com/gobwas/glob/util/runes"
- "unicode/utf8"
-)
-
-type List struct {
- List []rune
- Not bool
-}
-
-func NewList(list []rune, not bool) List {
- return List{list, not}
-}
-
-func (self List) Match(s string) bool {
- r, w := utf8.DecodeRuneInString(s)
- if len(s) > w {
- return false
- }
-
- inList := runes.IndexRune(self.List, r) != -1
- return inList == !self.Not
-}
-
-func (self List) Len() int {
- return lenOne
-}
-
-func (self List) Index(s string) (int, []int) {
- for i, r := range s {
- if self.Not == (runes.IndexRune(self.List, r) == -1) {
- return i, segmentsByRuneLength[utf8.RuneLen(r)]
- }
- }
-
- return -1, nil
-}
-
-func (self List) String() string {
- var not string
- if self.Not {
- not = "!"
- }
-
- return fmt.Sprintf("", not, string(self.List))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/match.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/match.go
deleted file mode 100644
index f80e007fb..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/match.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package match
-
-// todo common table of rune's length
-
-import (
- "fmt"
- "strings"
-)
-
-const lenOne = 1
-const lenZero = 0
-const lenNo = -1
-
-type Matcher interface {
- Match(string) bool
- Index(string) (int, []int)
- Len() int
- String() string
-}
-
-type Matchers []Matcher
-
-func (m Matchers) String() string {
- var s []string
- for _, matcher := range m {
- s = append(s, fmt.Sprint(matcher))
- }
-
- return fmt.Sprintf("%s", strings.Join(s, ","))
-}
-
-// appendMerge merges and sorts given already SORTED and UNIQUE segments.
-func appendMerge(target, sub []int) []int {
- lt, ls := len(target), len(sub)
- out := make([]int, 0, lt+ls)
-
- for x, y := 0, 0; x < lt || y < ls; {
- if x >= lt {
- out = append(out, sub[y:]...)
- break
- }
-
- if y >= ls {
- out = append(out, target[x:]...)
- break
- }
-
- xValue := target[x]
- yValue := sub[y]
-
- switch {
-
- case xValue == yValue:
- out = append(out, xValue)
- x++
- y++
-
- case xValue < yValue:
- out = append(out, xValue)
- x++
-
- case yValue < xValue:
- out = append(out, yValue)
- y++
-
- }
- }
-
- target = append(target[:0], out...)
-
- return target
-}
-
-func reverseSegments(input []int) {
- l := len(input)
- m := l / 2
-
- for i := 0; i < m; i++ {
- input[i], input[l-i-1] = input[l-i-1], input[i]
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/max.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/max.go
deleted file mode 100644
index 032ffbf01..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/max.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package match
-
-import (
- "fmt"
- "unicode/utf8"
-)
-
-type Max struct {
- Limit int
-}
-
-func NewMax(l int) Max {
- return Max{l}
-}
-
-func (self Max) Match(s string) bool {
- var l int
- for _ = range s {
- l += 1
- if l > self.Limit {
- return false
- }
- }
-
- return true
-}
-
-func (self Max) Index(s string) (int, []int) {
- segments := acquireSegments(self.Limit + 1)
- segments = append(segments, 0)
- var count int
- for i, r := range s {
- count++
- if count > self.Limit {
- break
- }
- segments = append(segments, i+utf8.RuneLen(r))
- }
-
- return 0, segments
-}
-
-func (self Max) Len() int {
- return lenNo
-}
-
-func (self Max) String() string {
- return fmt.Sprintf("", self.Limit)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/min.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/min.go
deleted file mode 100644
index 96b34cb20..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/min.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package match
-
-import (
- "fmt"
- "unicode/utf8"
-)
-
-type Min struct {
- Limit int
-}
-
-func NewMin(l int) Min {
- return Min{l}
-}
-
-func (self Min) Match(s string) bool {
- var l int
- for _ = range s {
- l += 1
- if l >= self.Limit {
- return true
- }
- }
-
- return false
-}
-
-func (self Min) Index(s string) (int, []int) {
- var count int
-
- c := len(s) - self.Limit + 1
- if c <= 0 {
- return -1, nil
- }
-
- segments := acquireSegments(c)
- for i, r := range s {
- count++
- if count >= self.Limit {
- segments = append(segments, i+utf8.RuneLen(r))
- }
- }
-
- if len(segments) == 0 {
- return -1, nil
- }
-
- return 0, segments
-}
-
-func (self Min) Len() int {
- return lenNo
-}
-
-func (self Min) String() string {
- return fmt.Sprintf("", self.Limit)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/nothing.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/nothing.go
deleted file mode 100644
index 0d4ecd36b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/nothing.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package match
-
-import (
- "fmt"
-)
-
-type Nothing struct{}
-
-func NewNothing() Nothing {
- return Nothing{}
-}
-
-func (self Nothing) Match(s string) bool {
- return len(s) == 0
-}
-
-func (self Nothing) Index(s string) (int, []int) {
- return 0, segments0
-}
-
-func (self Nothing) Len() int {
- return lenZero
-}
-
-func (self Nothing) String() string {
- return fmt.Sprintf("")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/prefix.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/prefix.go
deleted file mode 100644
index a7347250e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/prefix.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package match
-
-import (
- "fmt"
- "strings"
- "unicode/utf8"
-)
-
-type Prefix struct {
- Prefix string
-}
-
-func NewPrefix(p string) Prefix {
- return Prefix{p}
-}
-
-func (self Prefix) Index(s string) (int, []int) {
- idx := strings.Index(s, self.Prefix)
- if idx == -1 {
- return -1, nil
- }
-
- length := len(self.Prefix)
- var sub string
- if len(s) > idx+length {
- sub = s[idx+length:]
- } else {
- sub = ""
- }
-
- segments := acquireSegments(len(sub) + 1)
- segments = append(segments, length)
- for i, r := range sub {
- segments = append(segments, length+i+utf8.RuneLen(r))
- }
-
- return idx, segments
-}
-
-func (self Prefix) Len() int {
- return lenNo
-}
-
-func (self Prefix) Match(s string) bool {
- return strings.HasPrefix(s, self.Prefix)
-}
-
-func (self Prefix) String() string {
- return fmt.Sprintf("", self.Prefix)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/prefix_suffix.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/prefix_suffix.go
deleted file mode 100644
index 8208085a1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/prefix_suffix.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package match
-
-import (
- "fmt"
- "strings"
-)
-
-type PrefixSuffix struct {
- Prefix, Suffix string
-}
-
-func NewPrefixSuffix(p, s string) PrefixSuffix {
- return PrefixSuffix{p, s}
-}
-
-func (self PrefixSuffix) Index(s string) (int, []int) {
- prefixIdx := strings.Index(s, self.Prefix)
- if prefixIdx == -1 {
- return -1, nil
- }
-
- suffixLen := len(self.Suffix)
- if suffixLen <= 0 {
- return prefixIdx, []int{len(s) - prefixIdx}
- }
-
- if (len(s) - prefixIdx) <= 0 {
- return -1, nil
- }
-
- segments := acquireSegments(len(s) - prefixIdx)
- for sub := s[prefixIdx:]; ; {
- suffixIdx := strings.LastIndex(sub, self.Suffix)
- if suffixIdx == -1 {
- break
- }
-
- segments = append(segments, suffixIdx+suffixLen)
- sub = sub[:suffixIdx]
- }
-
- if len(segments) == 0 {
- releaseSegments(segments)
- return -1, nil
- }
-
- reverseSegments(segments)
-
- return prefixIdx, segments
-}
-
-func (self PrefixSuffix) Len() int {
- return lenNo
-}
-
-func (self PrefixSuffix) Match(s string) bool {
- return strings.HasPrefix(s, self.Prefix) && strings.HasSuffix(s, self.Suffix)
-}
-
-func (self PrefixSuffix) String() string {
- return fmt.Sprintf("", self.Prefix, self.Suffix)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/range.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/range.go
deleted file mode 100644
index ce30245a4..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/range.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package match
-
-import (
- "fmt"
- "unicode/utf8"
-)
-
-type Range struct {
- Lo, Hi rune
- Not bool
-}
-
-func NewRange(lo, hi rune, not bool) Range {
- return Range{lo, hi, not}
-}
-
-func (self Range) Len() int {
- return lenOne
-}
-
-func (self Range) Match(s string) bool {
- r, w := utf8.DecodeRuneInString(s)
- if len(s) > w {
- return false
- }
-
- inRange := r >= self.Lo && r <= self.Hi
-
- return inRange == !self.Not
-}
-
-func (self Range) Index(s string) (int, []int) {
- for i, r := range s {
- if self.Not != (r >= self.Lo && r <= self.Hi) {
- return i, segmentsByRuneLength[utf8.RuneLen(r)]
- }
- }
-
- return -1, nil
-}
-
-func (self Range) String() string {
- var not string
- if self.Not {
- not = "!"
- }
- return fmt.Sprintf("", not, string(self.Lo), string(self.Hi))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/row.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/row.go
deleted file mode 100644
index 0b9754d0e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/row.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package match
-
-import (
- "fmt"
-)
-
-type Row struct {
- Matchers Matchers
- RunesLength int
- Segments []int
-}
-
-func NewRow(len int, m ...Matcher) Row {
- return Row{
- Matchers: Matchers(m),
- RunesLength: len,
- Segments: []int{len},
- }
-}
-
-func (self Row) matchAll(s string) bool {
- var idx int
- for _, m := range self.Matchers {
- length := m.Len()
-
- var next, i int
- for next = range s[idx:] {
- i++
- if i == length {
- break
- }
- }
-
- if i < length || !m.Match(s[idx:idx+next+1]) {
- return false
- }
-
- idx += next + 1
- }
-
- return true
-}
-
-func (self Row) lenOk(s string) bool {
- var i int
- for _ = range s {
- i++
- if i > self.RunesLength {
- return false
- }
- }
- return self.RunesLength == i
-}
-
-func (self Row) Match(s string) bool {
- return self.lenOk(s) && self.matchAll(s)
-}
-
-func (self Row) Len() (l int) {
- return self.RunesLength
-}
-
-func (self Row) Index(s string) (int, []int) {
- for i := range s {
- if len(s[i:]) < self.RunesLength {
- break
- }
- if self.matchAll(s[i:]) {
- return i, self.Segments
- }
- }
- return -1, nil
-}
-
-func (self Row) String() string {
- return fmt.Sprintf("", self.RunesLength, self.Matchers)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/segments.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/segments.go
deleted file mode 100644
index 9ea6f3094..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/segments.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package match
-
-import (
- "sync"
-)
-
-type SomePool interface {
- Get() []int
- Put([]int)
-}
-
-var segmentsPools [1024]sync.Pool
-
-func toPowerOfTwo(v int) int {
- v--
- v |= v >> 1
- v |= v >> 2
- v |= v >> 4
- v |= v >> 8
- v |= v >> 16
- v++
-
- return v
-}
-
-const (
- cacheFrom = 16
- cacheToAndHigher = 1024
- cacheFromIndex = 15
- cacheToAndHigherIndex = 1023
-)
-
-var (
- segments0 = []int{0}
- segments1 = []int{1}
- segments2 = []int{2}
- segments3 = []int{3}
- segments4 = []int{4}
-)
-
-var segmentsByRuneLength [5][]int = [5][]int{
- 0: segments0,
- 1: segments1,
- 2: segments2,
- 3: segments3,
- 4: segments4,
-}
-
-func init() {
- for i := cacheToAndHigher; i >= cacheFrom; i >>= 1 {
- func(i int) {
- segmentsPools[i-1] = sync.Pool{New: func() interface{} {
- return make([]int, 0, i)
- }}
- }(i)
- }
-}
-
-func getTableIndex(c int) int {
- p := toPowerOfTwo(c)
- switch {
- case p >= cacheToAndHigher:
- return cacheToAndHigherIndex
- case p <= cacheFrom:
- return cacheFromIndex
- default:
- return p - 1
- }
-}
-
-func acquireSegments(c int) []int {
- // make []int with less capacity than cacheFrom
- // is faster than acquiring it from pool
- if c < cacheFrom {
- return make([]int, 0, c)
- }
-
- return segmentsPools[getTableIndex(c)].Get().([]int)[:0]
-}
-
-func releaseSegments(s []int) {
- c := cap(s)
-
- // make []int with less capacity than cacheFrom
- // is faster than acquiring it from pool
- if c < cacheFrom {
- return
- }
-
- segmentsPools[getTableIndex(c)].Put(s)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/single.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/single.go
deleted file mode 100644
index ee6e3954c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/single.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package match
-
-import (
- "fmt"
- "github.com/gobwas/glob/util/runes"
- "unicode/utf8"
-)
-
-// single represents ?
-type Single struct {
- Separators []rune
-}
-
-func NewSingle(s []rune) Single {
- return Single{s}
-}
-
-func (self Single) Match(s string) bool {
- r, w := utf8.DecodeRuneInString(s)
- if len(s) > w {
- return false
- }
-
- return runes.IndexRune(self.Separators, r) == -1
-}
-
-func (self Single) Len() int {
- return lenOne
-}
-
-func (self Single) Index(s string) (int, []int) {
- for i, r := range s {
- if runes.IndexRune(self.Separators, r) == -1 {
- return i, segmentsByRuneLength[utf8.RuneLen(r)]
- }
- }
-
- return -1, nil
-}
-
-func (self Single) String() string {
- return fmt.Sprintf("", string(self.Separators))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/suffix.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/suffix.go
deleted file mode 100644
index 85bea8c68..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/suffix.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package match
-
-import (
- "fmt"
- "strings"
-)
-
-type Suffix struct {
- Suffix string
-}
-
-func NewSuffix(s string) Suffix {
- return Suffix{s}
-}
-
-func (self Suffix) Len() int {
- return lenNo
-}
-
-func (self Suffix) Match(s string) bool {
- return strings.HasSuffix(s, self.Suffix)
-}
-
-func (self Suffix) Index(s string) (int, []int) {
- idx := strings.Index(s, self.Suffix)
- if idx == -1 {
- return -1, nil
- }
-
- return 0, []int{idx + len(self.Suffix)}
-}
-
-func (self Suffix) String() string {
- return fmt.Sprintf("", self.Suffix)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/super.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/super.go
deleted file mode 100644
index 3875950bb..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/super.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package match
-
-import (
- "fmt"
-)
-
-type Super struct{}
-
-func NewSuper() Super {
- return Super{}
-}
-
-func (self Super) Match(s string) bool {
- return true
-}
-
-func (self Super) Len() int {
- return lenNo
-}
-
-func (self Super) Index(s string) (int, []int) {
- segments := acquireSegments(len(s) + 1)
- for i := range s {
- segments = append(segments, i)
- }
- segments = append(segments, len(s))
-
- return 0, segments
-}
-
-func (self Super) String() string {
- return fmt.Sprintf("")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/text.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/text.go
deleted file mode 100644
index 0a17616d3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/match/text.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package match
-
-import (
- "fmt"
- "strings"
- "unicode/utf8"
-)
-
-// raw represents raw string to match
-type Text struct {
- Str string
- RunesLength int
- BytesLength int
- Segments []int
-}
-
-func NewText(s string) Text {
- return Text{
- Str: s,
- RunesLength: utf8.RuneCountInString(s),
- BytesLength: len(s),
- Segments: []int{len(s)},
- }
-}
-
-func (self Text) Match(s string) bool {
- return self.Str == s
-}
-
-func (self Text) Len() int {
- return self.RunesLength
-}
-
-func (self Text) Index(s string) (int, []int) {
- index := strings.Index(s, self.Str)
- if index == -1 {
- return -1, nil
- }
-
- return index, self.Segments
-}
-
-func (self Text) String() string {
- return fmt.Sprintf("", self.Str)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/ast/ast.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/ast/ast.go
deleted file mode 100644
index a903a20ee..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/ast/ast.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package ast
-
-type Node struct {
- Parent *Node
- Children []*Node
- Value interface{}
- Kind Kind
-}
-
-func NewNode(k Kind, v interface{}, ch ...*Node) *Node {
- n := &Node{
- Kind: k,
- Value: v,
- }
- for _, c := range ch {
- Insert(n, c)
- }
- return n
-}
-
-func (a *Node) Equal(b *Node) bool {
- if a.Kind != b.Kind {
- return false
- }
- if a.Value != b.Value {
- return false
- }
- if len(a.Children) != len(b.Children) {
- return false
- }
- for i, c := range a.Children {
- if !c.Equal(b.Children[i]) {
- return false
- }
- }
- return true
-}
-
-func Insert(parent *Node, children ...*Node) {
- parent.Children = append(parent.Children, children...)
- for _, ch := range children {
- ch.Parent = parent
- }
-}
-
-type List struct {
- Not bool
- Chars string
-}
-
-type Range struct {
- Not bool
- Lo, Hi rune
-}
-
-type Text struct {
- Text string
-}
-
-type Kind int
-
-const (
- KindNothing Kind = iota
- KindPattern
- KindList
- KindRange
- KindText
- KindAny
- KindSuper
- KindSingle
- KindAnyOf
-)
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/ast/parser.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/ast/parser.go
deleted file mode 100644
index 429b40943..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/ast/parser.go
+++ /dev/null
@@ -1,157 +0,0 @@
-package ast
-
-import (
- "errors"
- "fmt"
- "github.com/gobwas/glob/syntax/lexer"
- "unicode/utf8"
-)
-
-type Lexer interface {
- Next() lexer.Token
-}
-
-type parseFn func(*Node, Lexer) (parseFn, *Node, error)
-
-func Parse(lexer Lexer) (*Node, error) {
- var parser parseFn
-
- root := NewNode(KindPattern, nil)
-
- var (
- tree *Node
- err error
- )
- for parser, tree = parserMain, root; parser != nil; {
- parser, tree, err = parser(tree, lexer)
- if err != nil {
- return nil, err
- }
- }
-
- return root, nil
-}
-
-func parserMain(tree *Node, lex Lexer) (parseFn, *Node, error) {
- for {
- token := lex.Next()
- switch token.Type {
- case lexer.EOF:
- return nil, tree, nil
-
- case lexer.Error:
- return nil, tree, errors.New(token.Raw)
-
- case lexer.Text:
- Insert(tree, NewNode(KindText, Text{token.Raw}))
- return parserMain, tree, nil
-
- case lexer.Any:
- Insert(tree, NewNode(KindAny, nil))
- return parserMain, tree, nil
-
- case lexer.Super:
- Insert(tree, NewNode(KindSuper, nil))
- return parserMain, tree, nil
-
- case lexer.Single:
- Insert(tree, NewNode(KindSingle, nil))
- return parserMain, tree, nil
-
- case lexer.RangeOpen:
- return parserRange, tree, nil
-
- case lexer.TermsOpen:
- a := NewNode(KindAnyOf, nil)
- Insert(tree, a)
-
- p := NewNode(KindPattern, nil)
- Insert(a, p)
-
- return parserMain, p, nil
-
- case lexer.Separator:
- p := NewNode(KindPattern, nil)
- Insert(tree.Parent, p)
-
- return parserMain, p, nil
-
- case lexer.TermsClose:
- return parserMain, tree.Parent.Parent, nil
-
- default:
- return nil, tree, fmt.Errorf("unexpected token: %s", token)
- }
- }
- return nil, tree, fmt.Errorf("unknown error")
-}
-
-func parserRange(tree *Node, lex Lexer) (parseFn, *Node, error) {
- var (
- not bool
- lo rune
- hi rune
- chars string
- )
- for {
- token := lex.Next()
- switch token.Type {
- case lexer.EOF:
- return nil, tree, errors.New("unexpected end")
-
- case lexer.Error:
- return nil, tree, errors.New(token.Raw)
-
- case lexer.Not:
- not = true
-
- case lexer.RangeLo:
- r, w := utf8.DecodeRuneInString(token.Raw)
- if len(token.Raw) > w {
- return nil, tree, fmt.Errorf("unexpected length of lo character")
- }
- lo = r
-
- case lexer.RangeBetween:
- //
-
- case lexer.RangeHi:
- r, w := utf8.DecodeRuneInString(token.Raw)
- if len(token.Raw) > w {
- return nil, tree, fmt.Errorf("unexpected length of lo character")
- }
-
- hi = r
-
- if hi < lo {
- return nil, tree, fmt.Errorf("hi character '%s' should be greater than lo '%s'", string(hi), string(lo))
- }
-
- case lexer.Text:
- chars = token.Raw
-
- case lexer.RangeClose:
- isRange := lo != 0 && hi != 0
- isChars := chars != ""
-
- if isChars == isRange {
- return nil, tree, fmt.Errorf("could not parse range")
- }
-
- if isRange {
- Insert(tree, NewNode(KindRange, Range{
- Lo: lo,
- Hi: hi,
- Not: not,
- }))
- } else {
- Insert(tree, NewNode(KindList, List{
- Chars: chars,
- Not: not,
- }))
- }
-
- return parserMain, tree, nil
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/lexer/lexer.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/lexer/lexer.go
deleted file mode 100644
index a1c8d1962..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/lexer/lexer.go
+++ /dev/null
@@ -1,273 +0,0 @@
-package lexer
-
-import (
- "bytes"
- "fmt"
- "github.com/gobwas/glob/util/runes"
- "unicode/utf8"
-)
-
-const (
- char_any = '*'
- char_comma = ','
- char_single = '?'
- char_escape = '\\'
- char_range_open = '['
- char_range_close = ']'
- char_terms_open = '{'
- char_terms_close = '}'
- char_range_not = '!'
- char_range_between = '-'
-)
-
-var specials = []byte{
- char_any,
- char_single,
- char_escape,
- char_range_open,
- char_range_close,
- char_terms_open,
- char_terms_close,
-}
-
-func Special(c byte) bool {
- return bytes.IndexByte(specials, c) != -1
-}
-
-type tokens []Token
-
-func (i *tokens) shift() (ret Token) {
- ret = (*i)[0]
- copy(*i, (*i)[1:])
- *i = (*i)[:len(*i)-1]
- return
-}
-
-func (i *tokens) push(v Token) {
- *i = append(*i, v)
-}
-
-func (i *tokens) empty() bool {
- return len(*i) == 0
-}
-
-var eof rune = 0
-
-type lexer struct {
- data string
- pos int
- err error
-
- tokens tokens
- termsLevel int
-
- lastRune rune
- lastRuneSize int
- hasRune bool
-}
-
-func NewLexer(source string) *lexer {
- l := &lexer{
- data: source,
- tokens: tokens(make([]Token, 0, 4)),
- }
- return l
-}
-
-func (l *lexer) Next() Token {
- if l.err != nil {
- return Token{Error, l.err.Error()}
- }
- if !l.tokens.empty() {
- return l.tokens.shift()
- }
-
- l.fetchItem()
- return l.Next()
-}
-
-func (l *lexer) peek() (r rune, w int) {
- if l.pos == len(l.data) {
- return eof, 0
- }
-
- r, w = utf8.DecodeRuneInString(l.data[l.pos:])
- if r == utf8.RuneError {
- l.errorf("could not read rune")
- r = eof
- w = 0
- }
-
- return
-}
-
-func (l *lexer) read() rune {
- if l.hasRune {
- l.hasRune = false
- l.seek(l.lastRuneSize)
- return l.lastRune
- }
-
- r, s := l.peek()
- l.seek(s)
-
- l.lastRune = r
- l.lastRuneSize = s
-
- return r
-}
-
-func (l *lexer) seek(w int) {
- l.pos += w
-}
-
-func (l *lexer) unread() {
- if l.hasRune {
- l.errorf("could not unread rune")
- return
- }
- l.seek(-l.lastRuneSize)
- l.hasRune = true
-}
-
-func (l *lexer) errorf(f string, v ...interface{}) {
- l.err = fmt.Errorf(f, v...)
-}
-
-func (l *lexer) inTerms() bool {
- return l.termsLevel > 0
-}
-
-func (l *lexer) termsEnter() {
- l.termsLevel++
-}
-
-func (l *lexer) termsLeave() {
- l.termsLevel--
-}
-
-var inTextBreakers = []rune{char_single, char_any, char_range_open, char_terms_open}
-var inTermsBreakers = append(inTextBreakers, char_terms_close, char_comma)
-
-func (l *lexer) fetchItem() {
- r := l.read()
- switch {
- case r == eof:
- l.tokens.push(Token{EOF, ""})
-
- case r == char_terms_open:
- l.termsEnter()
- l.tokens.push(Token{TermsOpen, string(r)})
-
- case r == char_comma && l.inTerms():
- l.tokens.push(Token{Separator, string(r)})
-
- case r == char_terms_close && l.inTerms():
- l.tokens.push(Token{TermsClose, string(r)})
- l.termsLeave()
-
- case r == char_range_open:
- l.tokens.push(Token{RangeOpen, string(r)})
- l.fetchRange()
-
- case r == char_single:
- l.tokens.push(Token{Single, string(r)})
-
- case r == char_any:
- if l.read() == char_any {
- l.tokens.push(Token{Super, string(r) + string(r)})
- } else {
- l.unread()
- l.tokens.push(Token{Any, string(r)})
- }
-
- default:
- l.unread()
-
- var breakers []rune
- if l.inTerms() {
- breakers = inTermsBreakers
- } else {
- breakers = inTextBreakers
- }
- l.fetchText(breakers)
- }
-}
-
-func (l *lexer) fetchRange() {
- var wantHi bool
- var wantClose bool
- var seenNot bool
- for {
- r := l.read()
- if r == eof {
- l.errorf("unexpected end of input")
- return
- }
-
- if wantClose {
- if r != char_range_close {
- l.errorf("expected close range character")
- } else {
- l.tokens.push(Token{RangeClose, string(r)})
- }
- return
- }
-
- if wantHi {
- l.tokens.push(Token{RangeHi, string(r)})
- wantClose = true
- continue
- }
-
- if !seenNot && r == char_range_not {
- l.tokens.push(Token{Not, string(r)})
- seenNot = true
- continue
- }
-
- if n, w := l.peek(); n == char_range_between {
- l.seek(w)
- l.tokens.push(Token{RangeLo, string(r)})
- l.tokens.push(Token{RangeBetween, string(n)})
- wantHi = true
- continue
- }
-
- l.unread() // unread first peek and fetch as text
- l.fetchText([]rune{char_range_close})
- wantClose = true
- }
-}
-
-func (l *lexer) fetchText(breakers []rune) {
- var data []rune
- var escaped bool
-
-reading:
- for {
- r := l.read()
- if r == eof {
- break
- }
-
- if !escaped {
- if r == char_escape {
- escaped = true
- continue
- }
-
- if runes.IndexRune(breakers, r) != -1 {
- l.unread()
- break reading
- }
- }
-
- escaped = false
- data = append(data, r)
- }
-
- if len(data) > 0 {
- l.tokens.push(Token{Text, string(data)})
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/lexer/token.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/lexer/token.go
deleted file mode 100644
index 2797c4e83..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/lexer/token.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package lexer
-
-import "fmt"
-
-type TokenType int
-
-const (
- EOF TokenType = iota
- Error
- Text
- Char
- Any
- Super
- Single
- Not
- Separator
- RangeOpen
- RangeClose
- RangeLo
- RangeHi
- RangeBetween
- TermsOpen
- TermsClose
-)
-
-func (tt TokenType) String() string {
- switch tt {
- case EOF:
- return "eof"
-
- case Error:
- return "error"
-
- case Text:
- return "text"
-
- case Char:
- return "char"
-
- case Any:
- return "any"
-
- case Super:
- return "super"
-
- case Single:
- return "single"
-
- case Not:
- return "not"
-
- case Separator:
- return "separator"
-
- case RangeOpen:
- return "range_open"
-
- case RangeClose:
- return "range_close"
-
- case RangeLo:
- return "range_lo"
-
- case RangeHi:
- return "range_hi"
-
- case RangeBetween:
- return "range_between"
-
- case TermsOpen:
- return "terms_open"
-
- case TermsClose:
- return "terms_close"
-
- default:
- return "undef"
- }
-}
-
-type Token struct {
- Type TokenType
- Raw string
-}
-
-func (t Token) String() string {
- return fmt.Sprintf("%v<%q>", t.Type, t.Raw)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/syntax.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/syntax.go
deleted file mode 100644
index 1d168b148..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/syntax/syntax.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package syntax
-
-import (
- "github.com/gobwas/glob/syntax/ast"
- "github.com/gobwas/glob/syntax/lexer"
-)
-
-func Parse(s string) (*ast.Node, error) {
- return ast.Parse(lexer.NewLexer(s))
-}
-
-func Special(b byte) bool {
- return lexer.Special(b)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/util/runes/runes.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/util/runes/runes.go
deleted file mode 100644
index a72355641..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/util/runes/runes.go
+++ /dev/null
@@ -1,154 +0,0 @@
-package runes
-
-func Index(s, needle []rune) int {
- ls, ln := len(s), len(needle)
-
- switch {
- case ln == 0:
- return 0
- case ln == 1:
- return IndexRune(s, needle[0])
- case ln == ls:
- if Equal(s, needle) {
- return 0
- }
- return -1
- case ln > ls:
- return -1
- }
-
-head:
- for i := 0; i < ls && ls-i >= ln; i++ {
- for y := 0; y < ln; y++ {
- if s[i+y] != needle[y] {
- continue head
- }
- }
-
- return i
- }
-
- return -1
-}
-
-func LastIndex(s, needle []rune) int {
- ls, ln := len(s), len(needle)
-
- switch {
- case ln == 0:
- if ls == 0 {
- return 0
- }
- return ls
- case ln == 1:
- return IndexLastRune(s, needle[0])
- case ln == ls:
- if Equal(s, needle) {
- return 0
- }
- return -1
- case ln > ls:
- return -1
- }
-
-head:
- for i := ls - 1; i >= 0 && i >= ln; i-- {
- for y := ln - 1; y >= 0; y-- {
- if s[i-(ln-y-1)] != needle[y] {
- continue head
- }
- }
-
- return i - ln + 1
- }
-
- return -1
-}
-
-// IndexAny returns the index of the first instance of any Unicode code point
-// from chars in s, or -1 if no Unicode code point from chars is present in s.
-func IndexAny(s, chars []rune) int {
- if len(chars) > 0 {
- for i, c := range s {
- for _, m := range chars {
- if c == m {
- return i
- }
- }
- }
- }
- return -1
-}
-
-func Contains(s, needle []rune) bool {
- return Index(s, needle) >= 0
-}
-
-func Max(s []rune) (max rune) {
- for _, r := range s {
- if r > max {
- max = r
- }
- }
-
- return
-}
-
-func Min(s []rune) rune {
- min := rune(-1)
- for _, r := range s {
- if min == -1 {
- min = r
- continue
- }
-
- if r < min {
- min = r
- }
- }
-
- return min
-}
-
-func IndexRune(s []rune, r rune) int {
- for i, c := range s {
- if c == r {
- return i
- }
- }
- return -1
-}
-
-func IndexLastRune(s []rune, r rune) int {
- for i := len(s) - 1; i >= 0; i-- {
- if s[i] == r {
- return i
- }
- }
-
- return -1
-}
-
-func Equal(a, b []rune) bool {
- if len(a) == len(b) {
- for i := 0; i < len(a); i++ {
- if a[i] != b[i] {
- return false
- }
- }
-
- return true
- }
-
- return false
-}
-
-// HasPrefix tests whether the string s begins with prefix.
-func HasPrefix(s, prefix []rune) bool {
- return len(s) >= len(prefix) && Equal(s[0:len(prefix)], prefix)
-}
-
-// HasSuffix tests whether the string s ends with suffix.
-func HasSuffix(s, suffix []rune) bool {
- return len(s) >= len(suffix) && Equal(s[len(s)-len(suffix):], suffix)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/util/strings/strings.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/util/strings/strings.go
deleted file mode 100644
index 1be48f719..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/vendor/github.com/gobwas/glob/util/strings/strings.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package strings
-
-import "strings"
-
-func IndexAnyRunes(s string, rs []rune) int {
- for _, r := range rs {
- if i := strings.IndexRune(s, r); i != -1 {
- return i
- }
- }
-
- return -1
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/words.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/words.go
deleted file mode 100644
index c92dd19d0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/client9/misspell/words.go
+++ /dev/null
@@ -1,31158 +0,0 @@
-package misspell
-
-// Code generated automatically. DO NOT EDIT.
-
-// DictMain is the main rule set, not including locale-specific spellings
-var DictMain = []string{
- "differentiatiations", "differentiations",
- "disproportionaltely", "disproportionately",
- "oversimplificiation", "oversimplification",
- "transcendentational", "transcendental",
- "anthromorphization", "anthropomorphization",
- "disporportionately", "disproportionately",
- "dispraportionately", "disproportionately",
- "disproportianately", "disproportionately",
- "disproportionatley", "disproportionately",
- "disproprotionately", "disproportionately",
- "fundamentalistisch", "fundamentalists",
- "fundamentalistiska", "fundamentalists",
- "fundamentalistiske", "fundamentalists",
- "fundamentalistiskt", "fundamentalists",
- "histocompatability", "histocompatibility",
- "microtransacations", "microtransactions",
- "microtransacciones", "microtransactions",
- "microtransactional", "microtransactions",
- "microtransactioned", "microtransactions",
- "misunderstandingly", "misunderstandings",
- "oversemplification", "oversimplification",
- "oversimplifacation", "oversimplification",
- "oversimplificaiton", "oversimplification",
- "oversimplificating", "oversimplification",
- "oversimplyfication", "oversimplification",
- "cardiovasculaires", "cardiovascular",
- "certificationkits", "certifications",
- "counterporductive", "counterproductive",
- "coutnerproductive", "counterproductive",
- "disporportionatly", "disproportionately",
- "disproportiantely", "disproportionately",
- "disproportionatly", "disproportionately",
- "disproportionnate", "disproportionate",
- "disrepresentation", "misrepresentation",
- "fundamentalistisk", "fundamentalists",
- "incompatabilities", "incompatibilities",
- "inconsequentional", "inconsequential",
- "indistinguishible", "indistinguishable",
- "indistingusihable", "indistinguishable",
- "indistinquishable", "indistinguishable",
- "indistuingishable", "indistinguishable",
- "instatutionalized", "institutionalized",
- "institucionalized", "institutionalized",
- "institutionilized", "institutionalized",
- "instutitionalized", "institutionalized",
- "instututionalized", "institutionalized",
- "interchangeablely", "interchangeably",
- "interchangeablity", "interchangeably",
- "intercontinential", "intercontinental",
- "micortransactions", "microtransactions",
- "microstansactions", "microtransactions",
- "microtramsactions", "microtransactions",
- "microtranasctions", "microtransactions",
- "microtransacitons", "microtransactions",
- "microtransacrions", "microtransactions",
- "microtransactioms", "microtransactions",
- "microtransactiosn", "microtransactions",
- "microtranscations", "microtransactions",
- "microtrasnactions", "microtransactions",
- "mircotransactions", "microtransactions",
- "misinterpretating", "misinterpreting",
- "misrepresantation", "misrepresentation",
- "misrepresentaiton", "misrepresentation",
- "misrepresentating", "misrepresenting",
- "misunderstantings", "misunderstandings",
- "mocrotransactions", "microtransactions",
- "oversimplifaction", "oversimplification",
- "oversimplificaton", "oversimplification",
- "oversimplifiction", "oversimplification",
- "responsibillities", "responsibilities",
- "unconstitutionnal", "unconstitutional",
- "accomplishements", "accomplishments",
- "admininistrative", "administrative",
- "antidepresssants", "antidepressants",
- "architechturally", "architecturally",
- "cardiovasculaire", "cardiovascular",
- "charactarization", "characterization",
- "characterazation", "characterization",
- "characterisitics", "characteristics",
- "characteristsics", "characteristic",
- "characterizarion", "characterization",
- "charecterization", "characterization",
- "charicterization", "characterization",
- "circumstantional", "circumstantial",
- "conversationable", "conversational",
- "counterprodutive", "counterproductive",
- "demonstrationens", "demonstrations",
- "deterministische", "deterministic",
- "differenciations", "differentiation",
- "differentiantion", "differentiation",
- "differentiatiors", "differentiation",
- "differentitation", "differentiation",
- "disperportionate", "disproportionate",
- "disporportionate", "disproportionate",
- "dispraportionate", "disproportionate",
- "disproportianate", "disproportionate",
- "disproportionaly", "disproportionately",
- "disproprotionate", "disproportionate",
- "electromagnectic", "electromagnetic",
- "enviornmentalist", "environmentalist",
- "environmentality", "environmentally",
- "extraordinairily", "extraordinarily",
- "extraordinarilly", "extraordinary",
- "extraterrestials", "extraterrestrials",
- "fundamentalismos", "fundamentalists",
- "fundamentalismus", "fundamentalists",
- "fundamentalistas", "fundamentalists",
- "fundamentalisten", "fundamentalists",
- "fundamentalister", "fundamentalists",
- "imcomprehensible", "incomprehensible",
- "immunosupressant", "immunosuppressant",
- "imperfectionists", "imperfections",
- "implementaciones", "implementations",
- "implementationen", "implementations",
- "implementationer", "implementations",
- "inappropriatelly", "inappropriately",
- "incompatablities", "incompatibilities",
- "incompatiblities", "incompatibilities",
- "incomprehencible", "incomprehensible",
- "incomprehendible", "incomprehensible",
- "incomprehenisble", "incomprehensible",
- "incomprehensable", "incomprehensible",
- "incomprehinsible", "incomprehensible",
- "incomprihensible", "incomprehensible",
- "inconprehensible", "incomprehensible",
- "inconsistentcies", "inconsistencies",
- "inconstitutional", "unconstitutional",
- "incrompehensible", "incomprehensible",
- "indistinguisable", "indistinguishable",
- "institutionlized", "institutionalized",
- "intellectualiser", "intellectuals",
- "intellectualisme", "intellectuals",
- "interchangeabley", "interchangeably",
- "internationnally", "internationally",
- "interpretaciones", "interpretations",
- "interpretationen", "interpretations",
- "manoeuverability", "maneuverability",
- "massachusettians", "massachusetts",
- "microtransacions", "microtransactions",
- "microtransacting", "microtransactions",
- "microtransactios", "microtransactions",
- "microtransactons", "microtransactions",
- "microtransations", "microtransactions",
- "microtranscation", "microtransactions",
- "mircotransaction", "microtransactions",
- "miscommunciation", "miscommunication",
- "miscommunicaiton", "miscommunication",
- "miscomunnication", "miscommunication",
- "miscummunication", "miscommunication",
- "misinterpretated", "misinterpreted",
- "misinterpretions", "misinterpreting",
- "misinterpretting", "misinterpreting",
- "misproportionate", "disproportionate",
- "misrepresenation", "misrepresentation",
- "misrepresentaion", "misrepresentation",
- "misrepresentated", "misrepresented",
- "misrepresentatie", "misrepresentation",
- "misrepresentativ", "misrepresentation",
- "misubderstanding", "misunderstandings",
- "misudnerstanding", "misunderstandings",
- "misundarstanding", "misunderstandings",
- "misunderatanding", "misunderstandings",
- "misunderdtanding", "misunderstandings",
- "misundersatnding", "misunderstandings",
- "misundersranding", "misunderstandings",
- "misunderstadings", "misunderstandings",
- "misunderstadning", "misunderstandings",
- "misunderstamding", "misunderstandings",
- "misunderstandigs", "misunderstandings",
- "misunderstandimg", "misunderstandings",
- "misunderstandind", "misunderstandings",
- "misunderstanging", "misunderstandings",
- "misunderstanidng", "misunderstandings",
- "misunderstanings", "misunderstandings",
- "misunderstansing", "misunderstandings",
- "misunderstanting", "misunderstandings",
- "misunderstending", "misunderstandings",
- "misunderstnading", "misunderstandings",
- "misunderstsnding", "misunderstandings",
- "misunderstunding", "misunderstandings",
- "misundertsanding", "misunderstandings",
- "misundrestanding", "misunderstandings",
- "misunterstanding", "misunderstandings",
- "nationalistische", "nationalistic",
- "nationalististic", "nationalistic",
- "neconstitutional", "unconstitutional",
- "notwhithstanding", "notwithstanding",
- "objectificiation", "objectification",
- "organisationnels", "organisations",
- "perpendiculaires", "perpendicular",
- "phillosophically", "philosophically",
- "preinitalization", "preinitialization",
- "prescriptionists", "prescriptions",
- "procrastinarting", "procrastinating",
- "procrastinationg", "procrastinating",
- "procrastinazione", "procrastination",
- "professionalisim", "professionalism",
- "professionalisme", "professionals",
- "professionallism", "professionalism",
- "professionnalism", "professionalism",
- "programattically", "programmatically",
- "proportionallity", "proportionally",
- "reaponsibilities", "responsibilities",
- "reinitalizations", "reinitializations",
- "representaciones", "representations",
- "representationen", "representations",
- "representationer", "representations",
- "repsonsibilities", "responsibilities",
- "responcibilities", "responsibilities",
- "responisbilities", "responsibilities",
- "responsabilities", "responsibilities",
- "responsebilities", "responsibilities",
- "straightforeward", "straightforward",
- "surrepetitiously", "surreptitiously",
- "technologicially", "technologically",
- "unconditionnally", "unconditionally",
- "unconfortability", "discomfort",
- "unconstititional", "unconstitutional",
- "uncontrollablely", "uncontrollably",
- "underestimateing", "underestimating",
- "understandablely", "understandably",
- "unintentionnally", "unintentionally",
- "unsubstantianted", "unsubstantiated",
- "unsubstantiative", "unsubstantiated",
- "acclimitization", "acclimatization",
- "accomplishemnts", "accomplishments",
- "accountabillity", "accountability",
- "acknolwedgement", "acknowledgement",
- "acknoweldgement", "acknowledgement",
- "acknowldegement", "acknowledgement",
- "acknowlegdement", "acknowledgement",
- "administratieve", "administrative",
- "administratiors", "administrators",
- "administrativne", "administrative",
- "aforementionned", "aforementioned",
- "anitdepressants", "antidepressants",
- "antidepressents", "antidepressants",
- "archetecturally", "architecturally",
- "associationthis", "associations",
- "authobiographic", "autobiographic",
- "awknowledgement", "acknowledgement",
- "bureaucratische", "bureaucratic",
- "cardiovascualar", "cardiovascular",
- "carnagie-mellon", "carnegie-mellon",
- "carnigie-mellon", "carnegie-mellon",
- "celebrationists", "celebrations",
- "charactaristics", "characteristics",
- "characterisitcs", "characteristics",
- "characterisitic", "characteristic",
- "characterizaton", "characterization",
- "charactersistic", "characteristic",
- "charactersitics", "characteristics",
- "charactoristics", "characteristics",
- "charecteristics", "characteristics",
- "comfrontational", "confrontational",
- "commuinications", "communications",
- "compatabilities", "compatibilities",
- "complimentarity", "complimentary",
- "compositionwise", "compositions",
- "confidenciality", "confidential",
- "confidentuality", "confidential",
- "confrentational", "confrontational",
- "confrontacional", "confrontational",
- "conglaturations", "congratulations",
- "congradulations", "congratulations",
- "congragulations", "congratulations",
- "congratualtions", "congratulations",
- "congraturations", "congratulations",
- "consequentually", "consequently",
- "constitutionnal", "constitutional",
- "deinitalization", "deinitialization",
- "denominationals", "denominations",
- "destinationhash", "destinations",
- "deterministisch", "deterministic",
- "developmentwise", "developments",
- "differantiation", "differentiation",
- "differenciation", "differentiation",
- "differientation", "differentiation",
- "discriminatoire", "discriminate",
- "discriminatorie", "discriminate",
- "disproportiante", "disproportionate",
- "disproportinate", "disproportionate",
- "elecrtomagnetic", "electromagnetic",
- "electormagnetic", "electromagnetic",
- "electromagentic", "electromagnetic",
- "electromagnatic", "electromagnetic",
- "electromangetic", "electromagnetic",
- "electromegnetic", "electromagnetic",
- "electronagnetic", "electromagnetic",
- "enivronmentally", "environmentally",
- "entrepreneurers", "entrepreneurs",
- "enviornmentally", "environmentally",
- "enviromentalist", "environmentalist",
- "environemntally", "environmentally",
- "envrionmentally", "environmentally",
- "evolutionarilly", "evolutionary",
- "experementation", "experimentation",
- "experimantation", "experimentation",
- "experimentacion", "experimentation",
- "experimentating", "experimentation",
- "experimenterade", "experimented",
- "experimintation", "experimentation",
- "expirementation", "experimentation",
- "extraodrinarily", "extraordinarily",
- "extraordinairly", "extraordinarily",
- "extraordinarely", "extraordinarily",
- "extraordinaryly", "extraordinarily",
- "extraterrestial", "extraterrestrial",
- "extroardinarily", "extraordinarily",
- "fondamentalists", "fundamentalists",
- "fundamendalists", "fundamentalists",
- "fundamentalisme", "fundamentals",
- "fundamentalismo", "fundamentals",
- "fundamentalista", "fundamentals",
- "fundamentalisti", "fundamentals",
- "fundamnetalists", "fundamentalists",
- "fundemantalists", "fundamentalists",
- "fundimentalists", "fundamentalists",
- "fundumentalists", "fundamentalists",
- "gongratulations", "congratulations",
- "grammaticallity", "grammatically",
- "gundamentalists", "fundamentalists",
- "idiosynchracies", "idiosyncrasies",
- "implementaitons", "implementations",
- "implimentations", "implementations",
- "inapporpriately", "inappropriately",
- "inappropraitely", "inappropriately",
- "inappropriatley", "inappropriately",
- "incompatability", "incompatibility",
- "incompetentence", "incompetence",
- "incomprehensibe", "incomprehensible",
- "incomprehesible", "incomprehensible",
- "inconcequential", "inconsequential",
- "inconcistencies", "inconsistencies",
- "inconditionally", "unconditionally",
- "inconsecuential", "inconsequential",
- "inconsequantial", "inconsequential",
- "inconsequencial", "inconsequential",
- "inconsequentual", "inconsequential",
- "inconsiquential", "inconsequential",
- "inconsistancies", "inconsistencies",
- "inconsistencias", "inconsistencies",
- "inconsistensies", "inconsistencies",
- "inconsistenties", "inconsistencies",
- "independentisme", "independents",
- "independentiste", "independents",
- "independentness", "independents",
- "inexperiencable", "inexperience",
- "inplementations", "implementations",
- "instantaneoulsy", "instantaneous",
- "institutionella", "institutional",
- "institutionnels", "institutions",
- "instutionalized", "institutionalized",
- "insubstantiated", "unsubstantiated",
- "interchangabley", "interchangeably",
- "interchangebale", "interchangeable",
- "intercontinetal", "intercontinental",
- "interpertations", "interpretations",
- "interpratations", "interpretations",
- "interpritations", "interpretations",
- "intersectionals", "intersections",
- "intrepretations", "interpretations",
- "investigationes", "investigations",
- "journalistische", "journalistic",
- "libertarianisim", "libertarianism",
- "libertarianisme", "libertarians",
- "libertarianismo", "libertarians",
- "libertarianists", "libertarians",
- "libertariansism", "libertarianism",
- "manisfestations", "manifestations",
- "manouverability", "maneuverability",
- "manufacturerers", "manufacturers",
- "marshmallowiest", "marshmallows",
- "marshmallowness", "marshmallows",
- "microtransacton", "microtransactions",
- "mininterpreting", "misinterpreting",
- "miscommuniation", "miscommunication",
- "miscommunicatie", "miscommunication",
- "miscommuniction", "miscommunication",
- "misinterperting", "misinterpreting",
- "misinterprating", "misinterpreting",
- "misinterprented", "misinterpret",
- "misinterprested", "misinterpret",
- "misinterpretion", "misinterpreting",
- "misinterpretted", "misinterpreted",
- "misinterpriting", "misinterpreting",
- "misintrepreting", "misinterpreting",
- "misrepresention", "misrepresenting",
- "misunderstading", "misunderstanding",
- "misunderstandig", "misunderstandings",
- "misunderstandng", "misunderstandings",
- "misunderstaning", "misunderstanding",
- "multicultralism", "multiculturalism",
- "multinationella", "multinational",
- "nationalistisch", "nationalists",
- "nationalistisen", "nationalists",
- "nationalistiska", "nationalists",
- "nationalistiske", "nationalists",
- "nationalistiskt", "nationalists",
- "nationalistista", "nationalists",
- "objectificaiton", "objectification",
- "objectivication", "objectification",
- "organisationens", "organisations",
- "organisationers", "organisations",
- "overestimateing", "overestimating",
- "paychologically", "psychologically",
- "performancetest", "performances",
- "performancewise", "performances",
- "perpendiculaire", "perpendicular",
- "pharamceuticals", "pharmaceutical",
- "pharmacueticals", "pharmaceutical",
- "philoshopically", "philosophically",
- "philosohpically", "philosophically",
- "philosophycally", "philosophically",
- "phsycologically", "psychologically",
- "phychologically", "psychologically",
- "phylosophically", "philosophically",
- "physcologically", "psychologically",
- "precrastination", "procrastination",
- "prefessionalism", "professionalism",
- "premonasterians", "premonstratensians",
- "procastrinating", "procrastinating",
- "procastrination", "procrastination",
- "procrascinating", "procrastinating",
- "procrastenating", "procrastinating",
- "procrastiantion", "procrastination",
- "procrastibating", "procrastinating",
- "procrastibation", "procrastination",
- "procrastonating", "procrastinating",
- "procrestinating", "procrastinating",
- "procrestination", "procrastination",
- "professionalsim", "professionalism",
- "prograstination", "procrastination",
- "progressionists", "progressions",
- "progressionwise", "progressions",
- "prokrastination", "procrastination",
- "proportionallly", "proportionally",
- "proscratination", "procrastination",
- "pscyhologically", "psychologically",
- "pshycologically", "psychologically",
- "psichologically", "psychologically",
- "psychedelicious", "psychedelics",
- "psychedelicness", "psychedelics",
- "psycholigically", "psychologically",
- "psychopathische", "psychopathic",
- "pyschologically", "psychologically",
- "racionalization", "rationalization",
- "rationalizaiton", "rationalization",
- "rationalizating", "rationalization",
- "reccomendations", "recommendations",
- "recommandations", "recommendations",
- "recommondations", "recommendations",
- "reinitalization", "reinitialization",
- "repersentations", "representations",
- "represantations", "representations",
- "represantatives", "representatives",
- "representatieve", "representative",
- "representativas", "representatives",
- "representetives", "representatives",
- "representitives", "representatives",
- "responibilities", "responsibilities",
- "responsibilites", "responsibilities",
- "responsibilitys", "responsibilities",
- "responsibillity", "responsibility",
- "responsibilties", "responsibilities",
- "responsiblities", "responsibilities",
- "ridiculoussness", "ridiculousness",
- "saskatchewinian", "saskatchewan",
- "satisfactorally", "satisfactory",
- "satisfactorilly", "satisfactory",
- "schizophreniiic", "schizophrenic",
- "sensationalisim", "sensationalism",
- "spreadsheeticus", "spreadsheets",
- "starightforward", "straightforward",
- "straigthforward", "straightforward",
- "striaghtforward", "straightforward",
- "sustainabillity", "sustainability",
- "technoligically", "technologically",
- "troubelshooting", "troubleshooting",
- "troublehsooting", "troubleshooting",
- "troubleshotting", "troubleshooting",
- "trustworthyness", "trustworthiness",
- "ubsubstantiated", "unsubstantiated",
- "unappropriately", "inappropriately",
- "uncomfortablely", "uncomfortably",
- "uncomfortablity", "uncomfortably",
- "unconditionable", "unconditional",
- "unconstituional", "unconstitutional",
- "uncontitutional", "unconstitutional",
- "uncontrollabley", "uncontrollably",
- "uncontrollablly", "uncontrollably",
- "unconventionnal", "unconventional",
- "underastimating", "underestimating",
- "underestemating", "underestimating",
- "understandabley", "understandably",
- "unintensionally", "unintentionally",
- "unprofessionnal", "unprofessional",
- "unresponsivness", "unresponsive",
- "unsibstantiated", "unsubstantiated",
- "unsubstanciated", "unsubstantiated",
- "unsubstansiated", "unsubstantiated",
- "unsusbtantiated", "unsubstantiated",
- "untranslateable", "untranslatable",
- "vulernabilities", "vulnerabilities",
- "vulnarabilities", "vulnerabilities",
- "vulnurabilities", "vulnerabilities",
- "vunlerabilities", "vulnerabilities",
- "vurnerabilities", "vulnerabilities",
- "accomplishemnt", "accomplishment",
- "accomplishents", "accomplishes",
- "acconplishment", "accomplishment",
- "acknowledgeing", "acknowledging",
- "acknowledgemnt", "acknowledgement",
- "acomplishments", "accomplishments",
- "administartion", "administration",
- "administartors", "administrators",
- "administraters", "administrators",
- "administratief", "administrative",
- "administratiei", "administrative",
- "administratior", "administrator",
- "administrativo", "administration",
- "adminsitration", "administration",
- "adminsitrative", "administrative",
- "adminsitrators", "administrators",
- "affectionatley", "affectionate",
- "aforememtioned", "aforementioned",
- "aforementioend", "aforementioned",
- "alternativelly", "alternatively",
- "amministrative", "administrative",
- "anitdepressant", "antidepressants",
- "approproximate", "approximate",
- "approximatelly", "approximately",
- "archeaologists", "archeologists",
- "architechtures", "architectures",
- "architectureal", "architectural",
- "architecturial", "architectural",
- "assassintation", "assassination",
- "authenitcation", "authentication",
- "authenticaiton", "authentication",
- "authobiography", "autobiography",
- "breakthroughts", "breakthroughs",
- "bureaucratisch", "bureaucratic",
- "calssification", "classification",
- "capatilization", "capitalization",
- "capitalizacion", "capitalization",
- "capitalizaiton", "capitalization",
- "capitalizating", "capitalization",
- "capitilazation", "capitalization",
- "capitolization", "capitalization",
- "captialization", "capitalization",
- "cardiocascular", "cardiovascular",
- "cardiovascualr", "cardiovascular",
- "cardiovasuclar", "cardiovascular",
- "caridovascular", "cardiovascular",
- "cessationalism", "sensationalism",
- "cessationalist", "sensationalist",
- "charactaristic", "characteristic",
- "characterisics", "characteristics",
- "characterisitc", "characteristics",
- "characteristcs", "characteristics",
- "characteritics", "characteristic",
- "charactersitic", "characteristics",
- "charasteristic", "characteristics",
- "charecteristic", "characteristic",
- "cheeseburguers", "cheeseburgers",
- "cinematagraphy", "cinematography",
- "cinematagrophy", "cinematography",
- "cinematograhpy", "cinematography",
- "cinematogrophy", "cinematography",
- "cinematogrpahy", "cinematography",
- "cinemetography", "cinematography",
- "cinimatography", "cinematography",
- "circumstansial", "circumstantial",
- "circumstantual", "circumstantial",
- "circumstential", "circumstantial",
- "circunstantial", "circumstantial",
- "classificaiton", "classification",
- "coincedentally", "coincidentally",
- "coinsidentally", "coincidentally",
- "commemmorating", "commemorating",
- "communciations", "communications",
- "compatablities", "compatibilities",
- "compatibillity", "compatibility",
- "compatiblities", "compatibilities",
- "competitioners", "competitions",
- "comphrehensive", "comprehensive",
- "computationnal", "computational",
- "conciderations", "considerations",
- "condescenscion", "condescension",
- "condradictions", "contradictions",
- "configuartions", "configurations",
- "confugurations", "configurations",
- "conglaturation", "congratulations",
- "congratulatons", "congratulations",
- "conicidentally", "coincidentally",
- "conifgurations", "configurations",
- "conscioussness", "consciousness",
- "consentrations", "concentrations",
- "consiciousness", "consciousness",
- "considerablely", "considerably",
- "considerstions", "considerations",
- "constititional", "constitutional",
- "constitucional", "constitutional",
- "contamporaries", "contemporaries",
- "contemporaneus", "contemporaneous",
- "contraceptivos", "contraceptives",
- "contradicitons", "contradictions",
- "contradictiong", "contradicting",
- "contriceptives", "contraceptives",
- "controceptives", "contraceptives",
- "controdictions", "contradictions",
- "conversacional", "conversational",
- "converstaional", "conversational",
- "correpsondence", "correspondence",
- "correspondants", "correspondents",
- "correspondense", "correspondence",
- "correspondente", "correspondence",
- "corrispondants", "correspondents",
- "corrispondence", "correspondence",
- "corrospondence", "correspondence",
- "costumizations", "customization",
- "councidentally", "coincidentally",
- "crystalisation", "crystallisation",
- "curcumstantial", "circumstantial",
- "demenstrations", "demonstrations",
- "deminstrations", "demonstrations",
- "demonstartions", "demonstrations",
- "demonstrativno", "demonstrations",
- "demonstrativos", "demonstrations",
- "demosntrations", "demonstrations",
- "desintegration", "disintegration",
- "deterioriating", "deteriorating",
- "determinisitic", "deterministic",
- "differentiaton", "differentiation",
- "disatisfaction", "dissatisfaction",
- "discrimanatory", "discriminatory",
- "discriminacion", "discrimination",
- "discriminitory", "discriminatory",
- "disillusionned", "disillusioned",
- "diskrimination", "discrimination",
- "disproportiate", "disproportionate",
- "distingiushing", "distinguishing",
- "distingquished", "distinguished",
- "distingusihing", "distinguishing",
- "distinquishing", "distinguishing",
- "distuingishing", "distinguishing",
- "dysfunctionnal", "dysfunctional",
- "eldistribution", "redistribution",
- "electromagnetc", "electromagnetic",
- "electromagntic", "electromagnetic",
- "endoctrination", "indoctrination",
- "enthusiastisch", "enthusiastic",
- "entrepreneuers", "entrepreneurs",
- "entrepreneures", "entrepreneurs",
- "enviormentally", "environmentally",
- "enviromentally", "environmentally",
- "environmentals", "environments",
- "environmentaly", "environmentally",
- "experimentaion", "experimentation",
- "experimentella", "experimental",
- "extraordinairy", "extraordinary",
- "extraordinarly", "extraordinary",
- "extrordinarily", "extraordinarily",
- "fondamentalist", "fundamentalist",
- "foreshadowning", "foreshadowing",
- "functionallity", "functionality",
- "fundamendalist", "fundamentalist",
- "fundamentalits", "fundamentalists",
- "fundamnetalist", "fundamentalist",
- "fundemantalist", "fundamentalist",
- "fundimentalist", "fundamentalist",
- "fundumentalist", "fundamentalist",
- "generalizacion", "generalization",
- "generalizating", "generalization",
- "generelization", "generalization",
- "geographacilly", "geographically",
- "geographycally", "geographically",
- "geogrpahically", "geographically",
- "geopraphically", "geographically",
- "goegraphically", "geographically",
- "grandchilderen", "grandchildren",
- "gravitationnal", "gravitational",
- "groubdbreaking", "groundbreaking",
- "groudnbreaking", "groundbreaking",
- "hallcuinations", "hallucination",
- "hallicunations", "hallucinations",
- "hallucenations", "hallucinations",
- "halluciantions", "hallucinations",
- "hallucinaitons", "hallucination",
- "hallunications", "hallucinations",
- "hallusinations", "hallucinations",
- "halluzinations", "hallucinations",
- "hellucinations", "hallucinations",
- "heterosexuella", "heterosexual",
- "hipothetically", "hypothetically",
- "homosexuallity", "homosexuality",
- "hullucinations", "hallucinations",
- "hyopthetically", "hypothetically",
- "hypathetically", "hypothetically",
- "hypethetically", "hypothetically",
- "hypotehtically", "hypothetically",
- "hypotethically", "hypothetically",
- "identificacion", "identification",
- "identificaiton", "identification",
- "identificativo", "identification",
- "identifikation", "identification",
- "imlpementation", "implementations",
- "impelmentation", "implementations",
- "impersonationg", "impersonating",
- "implementacion", "implementation",
- "implementaiton", "implementation",
- "implementating", "implementation",
- "implementatino", "implementations",
- "implemetnation", "implementations",
- "implimentation", "implementation",
- "impossibillity", "impossibility",
- "inadvertantely", "inadvertently",
- "inappropriatly", "inappropriately",
- "inapproprietly", "inappropriately",
- "incompatablity", "incompatibility",
- "incompatiblity", "incompatibility",
- "inconsequental", "inconsequential",
- "inconsistentcy", "inconsistency",
- "incontrollably", "uncontrollably",
- "inconventional", "unconventional",
- "inconvienenced", "inconvenience",
- "indestrictible", "indestructible",
- "indestructuble", "indestructible",
- "indetification", "identification",
- "indistructible", "indestructible",
- "individuallity", "individuality",
- "indocrtination", "indoctrination",
- "indoctrication", "indoctrination",
- "indoktrination", "indoctrination",
- "industiralized", "industrialized",
- "industrailized", "industrialized",
- "industrualized", "industrialized",
- "industructible", "indestructible",
- "inexplicablely", "inexplicably",
- "infrastracture", "infrastructure",
- "infrastructuur", "infrastructure",
- "infrastrucutre", "infrastructure",
- "infrastrukture", "infrastructure",
- "infrastrutture", "infrastructure",
- "infrasturcture", "infrastructure",
- "initalisations", "initialisations",
- "initalizations", "initializations",
- "inplementation", "implementation",
- "inspirationnal", "inspirational",
- "instinctivelly", "instinctively",
- "institutionale", "institutionalized",
- "institutionals", "institutions",
- "institutionnal", "institutional",
- "intellectualis", "intellectuals",
- "intellectualls", "intellectuals",
- "intellecutally", "intellectually",
- "intercepticons", "interceptions",
- "interchangable", "interchangeable",
- "interchangably", "interchangeably",
- "interchangeble", "interchangeable",
- "interchangebly", "interchangeably",
- "interlectually", "intellectually",
- "internationaal", "international",
- "internationaly", "internationally",
- "internationnal", "international",
- "interpersonnal", "interpersonal",
- "interpertation", "interpretation",
- "interpratation", "interpretation",
- "interpretacion", "interpretation",
- "interpretaiton", "interpretations",
- "interpretating", "interpretation",
- "interpritation", "interpretation",
- "interstellaire", "interstellar",
- "intillectually", "intellectually",
- "intrepretation", "interpretation",
- "invesitgations", "investigations",
- "investiagtions", "investigations",
- "investigatiors", "investigations",
- "investigativos", "investigations",
- "investigstions", "investigations",
- "irrationallity", "irrationally",
- "irresponsibile", "irresponsible",
- "journalistisch", "journalistic",
- "justificativos", "justifications",
- "koncentrations", "concentrations",
- "liberatrianism", "libertarianism",
- "libertarainism", "libertarianism",
- "libertariansim", "libertarianism",
- "libertarinaism", "libertarianism",
- "libertaryanism", "libertarianism",
- "libertatianism", "libertarianism",
- "liberterianism", "libertarianism",
- "libretarianism", "libertarianism",
- "manufactureers", "manufactures",
- "manufactureras", "manufactures",
- "manufacturered", "manufactured",
- "manufactureres", "manufacturers",
- "manufactureros", "manufactures",
- "massachusettes", "massachusetts",
- "massachussetts", "massachusetts",
- "mataphorically", "metaphorically",
- "mathameticians", "mathematicians",
- "mathemagically", "mathematically",
- "mathematitians", "mathematicians",
- "mathemetically", "mathematically",
- "mathemeticians", "mathematicians",
- "mathimatically", "mathematically",
- "mediterainnean", "mediterranean",
- "mediterrannean", "mediterranean",
- "metaphotically", "metaphorically",
- "metephorically", "metaphorically",
- "methaporically", "metaphorically",
- "metiphorically", "metaphorically",
- "metophorically", "metaphorically",
- "metropolitaine", "metropolitan",
- "misconseptions", "misconceptions",
- "misinterperted", "misinterpreted",
- "misintrepreted", "misinterpreted",
- "mulitnationals", "multinational",
- "mulitplication", "multiplication",
- "multiplicacion", "multiplication",
- "multiplicaiton", "multiplication",
- "multiplicativo", "multiplication",
- "multiplikation", "multiplication",
- "mutlinationals", "multinational",
- "mutliplication", "multiplication",
- "nationalisitic", "nationalistic",
- "nationalistics", "nationalists",
- "nationalisties", "nationalists",
- "nationalistisk", "nationalists",
- "neighbourhoood", "neighbourhood",
- "nieghbourhoods", "neighbourhood",
- "northereastern", "northeastern",
- "objectificaton", "objectification",
- "opthalmologist", "ophthalmologist",
- "organizacional", "organizational",
- "organizaitonal", "organizational",
- "organziational", "organizational",
- "orginazational", "organizational",
- "overestemating", "overestimating",
- "overextimating", "overestimating",
- "overhwelmingly", "overwhelmingly",
- "overhwlemingly", "overwhelmingly",
- "overpolulation", "overpopulation",
- "overpopluation", "overpopulation",
- "oversetimating", "overestimating",
- "overshadowered", "overshadowed",
- "overwhemlingly", "overwhelmingly",
- "overwhlemingly", "overwhelmingly",
- "paliamentarian", "parliamentarian",
- "parliamentiary", "parliamentary",
- "performancepcs", "performances",
- "personalitites", "personalities",
- "pharamceutical", "pharmaceutical",
- "pharmaceudical", "pharmaceutical",
- "pharmacuetical", "pharmaceutical",
- "pharmaseutical", "pharmaceutical",
- "pharmeceutical", "pharmaceutical",
- "philosophicaly", "philosophically",
- "phramaceutical", "pharmaceutical",
- "playthroughers", "playthroughs",
- "porportionally", "proportionally",
- "practitionners", "practitioners",
- "predeterminded", "predetermined",
- "predominantely", "predominantly",
- "predominantley", "predominantly",
- "preinitalizing", "preinitializing",
- "prerequisities", "prerequisite",
- "procrastinatin", "procrastination",
- "procrastinaton", "procrastination",
- "professionials", "professionalism",
- "professionnals", "professionals",
- "profitabillity", "profitability",
- "progressivelly", "progressively",
- "progressivisme", "progressives",
- "pronounciation", "pronunciation",
- "proportianally", "proportionally",
- "proportionalty", "proportionally",
- "proportionella", "proportionally",
- "proprotionally", "proportionally",
- "protruberances", "protuberances",
- "pseudononymous", "pseudonymous",
- "psychologicaly", "psychologically",
- "qaulifications", "qualification",
- "qualifiactions", "qualification",
- "qualificaitons", "qualifications",
- "quarterbackers", "quarterbacks",
- "rationalizaton", "rationalization",
- "reaponsibility", "responsibility",
- "recommandation", "recommendation",
- "recommedations", "recommendations",
- "recommondation", "recommendation",
- "reconnaissence", "reconnaissance",
- "reconstruccion", "reconstruction",
- "reconsturction", "reconstruction",
- "redistirbution", "redistribution",
- "redistribucion", "redistribution",
- "redistributivo", "redistribution",
- "redistrubition", "redistribution",
- "refridgeration", "refrigeration",
- "rehabilitacion", "rehabilitation",
- "rehabilitaiton", "rehabilitation",
- "reinforcemnets", "reinforcements",
- "rekommendation", "recommendation",
- "rektifications", "certifications",
- "reniforcements", "reinforcements",
- "repersentation", "representation",
- "represantation", "representation",
- "represantative", "representative",
- "representacion", "representation",
- "representaiton", "representations",
- "representatief", "representative",
- "representating", "representation",
- "representativo", "representation",
- "representetive", "representative",
- "representitive", "representative",
- "representstion", "representations",
- "representstive", "representatives",
- "represetnation", "representations",
- "represnetation", "representations",
- "reprezentative", "representative",
- "repsonsibility", "responsibility",
- "resistribution", "redistribution",
- "responcibility", "responsibility",
- "responisbility", "responsibility",
- "responnsibilty", "responsibility",
- "responsability", "responsibility",
- "responsibilies", "responsibilities",
- "responsibities", "responsibilities",
- "restaraunteurs", "restaurateurs",
- "retroactivelly", "retroactively",
- "revolutionairy", "revolutionary",
- "revolutionnary", "revolutionary",
- "ridicilousness", "ridiculousness",
- "ridicoulusness", "ridiculousness",
- "rienforcements", "reinforcements",
- "righteoussness", "righteousness",
- "satisfactoraly", "satisfactory",
- "satisfactority", "satisfactorily",
- "sceintifically", "scientifically",
- "schizophrentic", "schizophrenic",
- "screenwrighter", "screenwriter",
- "sensacionalism", "sensationalism",
- "sensacionalist", "sensationalist",
- "sensasionalism", "sensationalism",
- "sensasionalist", "sensationalist",
- "sensationality", "sensationalist",
- "sensationalizm", "sensationalism",
- "sensationalsim", "sensationalism",
- "sensationilism", "sensationalism",
- "sensationilist", "sensationalist",
- "sensationslism", "sensationalism",
- "sensetionalism", "sensationalism",
- "sensibilisiert", "sensibilities",
- "sentationalism", "sensationalism",
- "sentationalist", "sensationalist",
- "senzationalism", "sensationalism",
- "senzationalist", "sensationalist",
- "sepcifications", "specification",
- "simaltaneously", "simultaneously",
- "simeltaneously", "simultaneously",
- "similtaneously", "simultaneously",
- "simlutaneously", "simultaneously",
- "simplificacion", "simplification",
- "simplificaiton", "simplification",
- "simplificating", "simplification",
- "simulatenously", "simultaneously",
- "simulatneously", "simultaneously",
- "simultaenously", "simultaneously",
- "simultainously", "simultaneously",
- "simultaneoulsy", "simultaneously",
- "simultaniously", "simultaneously",
- "simulteanously", "simultaneously",
- "sistematically", "systematically",
- "slaugterhouses", "slaughterhouses",
- "specailization", "specialization",
- "specialication", "specialization",
- "specializaiton", "specialization",
- "specificaitons", "specification",
- "speciliazation", "specialization",
- "spectacularely", "spectacularly",
- "spectacularily", "spectacularly",
- "spesifications", "specifications",
- "spezialisation", "specialization",
- "sportsmansship", "sportsmanship",
- "spreadsheeters", "spreadsheets",
- "straightforwad", "straightforward",
- "subconcsiously", "subconsciously",
- "subconsicously", "subconsciously",
- "subsconciously", "subconsciously",
- "sunconsciously", "subconsciously",
- "superintendant", "superintendent",
- "suppliementing", "supplementing",
- "surrepetitious", "surreptitious",
- "survivabililty", "survivability",
- "survivabillity", "survivability",
- "sustainabiltiy", "sustainability",
- "syncronization", "synchronization",
- "systemetically", "systematically",
- "systimatically", "systematically",
- "technologicaly", "technologically",
- "thermodinamics", "thermodynamics",
- "thermodyanmics", "thermodynamics",
- "thermodymamics", "thermodynamics",
- "thermodymanics", "thermodynamics",
- "thermodynamcis", "thermodynamics",
- "thermodynanics", "thermodynamics",
- "thermodynmaics", "thermodynamics",
- "thernodynamics", "thermodynamics",
- "theromdynamics", "thermodynamics",
- "transformacion", "transformation",
- "transfromation", "transformation",
- "transitionable", "transitional",
- "transitionning", "transitioning",
- "transofrmation", "transformation",
- "trasnformation", "transformation",
- "trasnportation", "transportation",
- "unbelievablely", "unbelievably",
- "unchallengable", "unchallengeable",
- "uncomfortabley", "uncomfortably",
- "uncomfortablly", "uncomfortably",
- "unconciousness", "unconsciousness",
- "unconditionaly", "unconditionally",
- "unconditionnal", "unconditional",
- "unconsciouslly", "unconsciously",
- "uncontrallable", "uncontrollable",
- "uncontrallably", "uncontrollably",
- "uncontrolablly", "uncontrollably",
- "unconvectional", "unconventional",
- "unconvencional", "unconventional",
- "unconvensional", "unconventional",
- "unconventianal", "unconventional",
- "underastimated", "underestimated",
- "underestamated", "underestimated",
- "underestemated", "underestimated",
- "underestimeted", "underestimated",
- "undersetimated", "underestimated",
- "understandebly", "understandably",
- "understandible", "understandable",
- "understandibly", "understandably",
- "undestructible", "indestructible",
- "unforetunately", "unfortunately",
- "unfortunatelly", "unfortunately",
- "unfourtunately", "unfortunately",
- "uninitalizable", "uninitializable",
- "unintelligient", "unintelligent",
- "unintentionaly", "unintentionally",
- "unintentionnal", "unintentional",
- "unmanouverable", "unmaneuverable",
- "unneccessarily", "unnecessarily",
- "unnecessarilly", "unnecessarily",
- "unprecendented", "unprecedented",
- "unprofessionel", "unprofessional",
- "unreasonablely", "unreasonably",
- "unsubstantiaed", "unsubstantiated",
- "unsurprizingly", "unsurprisingly",
- "vizualisations", "visualization",
- "vulnerabilites", "vulnerabilities",
- "vulnerabillity", "vulnerability",
- "vulnerablility", "vulnerability",
- "wholeheartadly", "wholeheartedly",
- "wholeheartidly", "wholeheartedly",
- "abbrievations", "abbreviation",
- "accelleration", "acceleration",
- "accomadations", "accommodations",
- "accommadating", "accommodating",
- "accommadation", "accommodation",
- "accommidation", "accommodation",
- "accomodations", "accommodations",
- "accomondating", "accommodating",
- "accomondation", "accommodation",
- "accomplishent", "accomplishment",
- "accountabilty", "accountability",
- "accredidation", "accreditation",
- "acknolwedging", "acknowledging",
- "acknowlegding", "acknowledging",
- "acomplishment", "accomplishment",
- "acquaintaince", "acquaintance",
- "acquaintences", "acquaintances",
- "acquaintinces", "acquaintances",
- "acquanitances", "acquaintance",
- "acquantainces", "acquaintances",
- "acquantiances", "acquaintances",
- "acquiantances", "acquaintances",
- "acquiantences", "acquaintances",
- "adminastrator", "administrator",
- "administartor", "administrator",
- "administraion", "administration",
- "administraron", "administrator",
- "administrater", "administrator",
- "administratio", "administrator",
- "administraton", "administration",
- "adminsitrator", "administrator",
- "adminstration", "administration",
- "adminstrative", "administrative",
- "admissability", "admissibility",
- "adnimistrator", "administrators",
- "adverticement", "advertisement",
- "advertisiment", "advertisement",
- "advertisments", "advertisements",
- "advirtisement", "advertisement",
- "aestethically", "aesthetically",
- "aesthatically", "aesthetically",
- "aesthitically", "aesthetically",
- "affectionnate", "affectionate",
- "aforementiond", "aforementioned",
- "agriculturual", "agricultural",
- "agrumentative", "argumentative",
- "alterantively", "alternatively",
- "alternativets", "alternatives",
- "alternativley", "alternatively",
- "alternitavely", "alternatively",
- "alternitively", "alternatively",
- "aninteresting", "uninteresting",
- "annoucnements", "announcements",
- "antagonisitic", "antagonistic",
- "anthropolgist", "anthropologist",
- "apporpriately", "appropriately",
- "apporpriation", "appropriation",
- "apporximately", "approximately",
- "appreciateing", "appreciating",
- "appreciateive", "appreciative",
- "appreciationg", "appreciating",
- "appropirately", "appropriately",
- "appropiration", "appropriation",
- "appropraitely", "appropriately",
- "appropreation", "appropriation",
- "appropriatley", "appropriately",
- "appropropiate", "appropriate",
- "approrpiation", "appropriation",
- "approxamately", "approximately",
- "approxiamtely", "approximately",
- "approximatley", "approximately",
- "approximitely", "approximately",
- "aqcuaintances", "acquaintances",
- "aqquaintances", "acquaintances",
- "archaelogical", "archaeological",
- "archaelogists", "archaeologists",
- "archeaologist", "archeologist",
- "archetectural", "architectural",
- "architechture", "architecture",
- "architechural", "architectural",
- "architectrual", "architectural",
- "architecutral", "architectural",
- "argumentitive", "argumentative",
- "arugmentative", "argumentative",
- "asethetically", "aesthetically",
- "assasinations", "assassinations",
- "audomoderator", "automoderator",
- "australianess", "australians",
- "authenticaion", "authentication",
- "authenticaton", "authentication",
- "autherization", "authorization",
- "authoratitive", "authoritative",
- "authoritatian", "authoritarian",
- "authoritation", "authorization",
- "authorititive", "authoritative",
- "authoritorian", "authoritarian",
- "authorotative", "authoritative",
- "authroization", "authorization",
- "automoderador", "automoderator",
- "automoderater", "automoderator",
- "automodorator", "automoderator",
- "automoterator", "automoderator",
- "autoritharian", "authoritarian",
- "availabillity", "availability",
- "awknowledging", "acknowledging",
- "billingualism", "bilingualism",
- "billionairres", "billionaire",
- "borderlanders", "borderlands",
- "breadtfeeding", "breastfeeding",
- "breastfeading", "breastfeeding",
- "breatsfeeding", "breastfeeding",
- "broadacasting", "broadcasting",
- "bureaucractic", "bureaucratic",
- "bureaucratics", "bureaucrats",
- "bureaucratius", "bureaucrats",
- "californiaman", "californian",
- "calrification", "clarification",
- "capitalizaton", "capitalization",
- "carbohdyrates", "carbohydrates",
- "carbohidrates", "carbohydrates",
- "carbohyrdates", "carbohydrates",
- "carboyhdrates", "carbohydrates",
- "carthographer", "cartographer",
- "catagorically", "categorically",
- "catastrophies", "catastrophe",
- "catastrophize", "catastrophe",
- "catigorically", "categorically",
- "catterpillars", "caterpillars",
- "celebrationis", "celebrations",
- "ceritfication", "certifications",
- "certificaiton", "certification",
- "championchips", "championship",
- "championshiop", "championships",
- "championsship", "championships",
- "chanpionships", "championships",
- "charactarized", "characterized",
- "characterisic", "characteristic",
- "characteristc", "characteristics",
- "characterists", "characteristics",
- "charicterized", "characterized",
- "charismatisch", "charismatic",
- "checkpointusa", "checkpoints",
- "cheeseburgare", "cheeseburger",
- "cheeseburgler", "cheeseburger",
- "cheeseburguer", "cheeseburger",
- "cheezeburgers", "cheeseburgers",
- "chornological", "chronological",
- "chronoligical", "chronological",
- "chronologicly", "chronological",
- "cinematograhy", "cinematography",
- "cinematograpy", "cinematography",
- "circomference", "circumference",
- "circumcission", "circumcision",
- "circumferance", "circumference",
- "circumsicions", "circumcision",
- "circumstanial", "circumstantial",
- "circumstantal", "circumstantial",
- "circumstnaces", "circumstance",
- "circunference", "circumference",
- "circunstances", "circumstances",
- "cirucmference", "circumference",
- "cirucmstances", "circumstances",
- "civilications", "civilizations",
- "civilizaitons", "civilizations",
- "clarificaiton", "clarification",
- "clasification", "clarification",
- "clerification", "clarification",
- "coincidentaly", "coincidentally",
- "coincidential", "coincidental",
- "colaborations", "collaborations",
- "collabaration", "collaboration",
- "collaberation", "collaboration",
- "collaberative", "collaborative",
- "collaboratore", "collaborate",
- "collectioners", "collections",
- "collectivelly", "collectively",
- "collobaration", "collaboration",
- "combatibility", "compatibility",
- "comeptitively", "competitively",
- "comfortablely", "comfortably",
- "comfortablity", "comfortably",
- "comfrontation", "confrontation",
- "commemerative", "commemorative",
- "commericially", "commercially",
- "commerorative", "commemorative",
- "comminication", "communication",
- "comminucation", "communications",
- "commissionees", "commissions",
- "commissionned", "commissioned",
- "commissionner", "commissioner",
- "commmemorated", "commemorated",
- "commuications", "communications",
- "commuincation", "communications",
- "communciation", "communication",
- "communiaction", "communications",
- "communicaiton", "communication",
- "communicatoin", "communications",
- "communicatons", "communications",
- "compadibility", "compatibility",
- "comparativley", "comparatively",
- "comparetively", "comparatively",
- "comparitavely", "comparatively",
- "comparitively", "comparatively",
- "compatability", "compatibility",
- "compatibiltiy", "compatibility",
- "compeditively", "competitively",
- "compensantion", "compensation",
- "compensationg", "compensating",
- "comperatively", "comparatively",
- "comperhension", "comprehension",
- "competatively", "competitively",
- "competitavely", "competitively",
- "competitevely", "competitively",
- "competitivley", "competitively",
- "competiveness", "competitiveness",
- "compilcations", "complication",
- "compitability", "compatibility",
- "complciations", "complication",
- "complecations", "complications",
- "compliactions", "complication",
- "complicaitons", "complication",
- "complilations", "complications",
- "complimentery", "complimentary",
- "complimentoni", "complimenting",
- "complimentory", "complimentary",
- "comprehention", "comprehension",
- "computacional", "computational",
- "comtamination", "contamination",
- "comtemplating", "contemplating",
- "concatination", "contamination",
- "conceivablely", "conceivably",
- "concencration", "concentration",
- "concenrtation", "concentrations",
- "concentartion", "concentrations",
- "concentracion", "concentration",
- "concentraited", "concentrated",
- "concentraiton", "concentrations",
- "concentratons", "concentrations",
- "concervatives", "conservatives",
- "concideration", "consideration",
- "concioussness", "consciousness",
- "concnetration", "concentrations",
- "concsiousness", "consciousness",
- "condascending", "condescending",
- "condescencion", "condescension",
- "condescendion", "condescension",
- "condescensing", "condescension",
- "condiscending", "condescending",
- "conditionning", "conditioning",
- "condradicting", "contradicting",
- "condradiction", "contradiction",
- "condradictory", "contradictory",
- "conecntration", "concentrations",
- "conenctration", "concentrations",
- "confidentally", "confidentially",
- "configruation", "configurations",
- "configuartion", "configuration",
- "configuracion", "configuration",
- "configuraiton", "configuration",
- "configuratoin", "configurations",
- "configureable", "configurable",
- "confrentation", "confrontation",
- "confrontacion", "confrontation",
- "confrontating", "confrontation",
- "confrontativo", "confrontation",
- "congratualted", "congratulate",
- "conifguration", "configurations",
- "conisderation", "considerations",
- "connecticunts", "connecticut",
- "connectivitiy", "connectivity",
- "conpassionate", "compassionate",
- "conplications", "complications",
- "conplimentary", "complimentary",
- "conplimenting", "complimenting",
- "conprehension", "comprehension",
- "consdieration", "considerations",
- "consenquently", "consequently",
- "consentrating", "concentrating",
- "consentration", "concentration",
- "consequencies", "consequence",
- "consequentely", "consequently",
- "consequeseces", "consequences",
- "conservatisim", "conservatism",
- "conservativsm", "conservatism",
- "conservitives", "conservatives",
- "consicousness", "consciousness",
- "considerabely", "considerable",
- "considerabile", "considerable",
- "considerabley", "considerably",
- "considerablly", "considerably",
- "consideracion", "consideration",
- "consideratoin", "considerations",
- "considerstion", "considerations",
- "considertaion", "considerations",
- "consituencies", "constituencies",
- "consitutional", "constitutional",
- "constallation", "constellation",
- "constarnation", "consternation",
- "constillation", "constellation",
- "constituintes", "constituents",
- "constituional", "constitutional",
- "constitutents", "constitutes",
- "constitutinal", "constitutional",
- "constructicon", "construction",
- "constructieve", "constructive",
- "constructiong", "constructing",
- "consttruction", "construction",
- "contaminacion", "contamination",
- "contaminanted", "contaminated",
- "contanimation", "contamination",
- "contenplating", "contemplating",
- "contimplating", "contemplating",
- "contraceptivo", "contraception",
- "contradiccion", "contradiction",
- "contradicitng", "contradicting",
- "contradiciton", "contradiction",
- "contradictary", "contradictory",
- "contradictons", "contradicts",
- "contraticting", "contradicting",
- "contravercial", "controversial",
- "contraversial", "controversial",
- "contreception", "contraception",
- "contreversial", "controversial",
- "contributeurs", "contributes",
- "contributiors", "contributors",
- "contriception", "contraception",
- "contridictory", "contradictory",
- "contritutions", "contributions",
- "contriversial", "controversial",
- "controception", "contraception",
- "controdicting", "contradicting",
- "controdiction", "contradiction",
- "controvercial", "controversial",
- "controverisal", "controversial",
- "controversary", "controversy",
- "controversity", "controversy",
- "controvertial", "controversial",
- "contstruction", "construction",
- "conventionnal", "conventional",
- "converastions", "conservation",
- "conversationa", "conservation",
- "conversationg", "conservation",
- "conversationy", "conservation",
- "conversatiosn", "conservation",
- "conversatives", "conservatives",
- "converstaions", "conversations",
- "convorsations", "conversations",
- "cooresponding", "corresponding",
- "coorperations", "corporations",
- "correctionals", "corrections",
- "correpsonding", "corresponding",
- "correspondant", "correspondent",
- "correspondece", "correspondence",
- "corresponders", "corresponds",
- "corresponsing", "corresponding",
- "corrispondant", "correspondent",
- "corrisponding", "corresponding",
- "corrosponding", "corresponding",
- "costomization", "customization",
- "costumization", "customization",
- "counterfeight", "counterfeit",
- "creationistas", "creationists",
- "cricumference", "circumference",
- "cringeworthey", "cringeworthy",
- "cringeworthly", "cringeworthy",
- "crytopgraphic", "cryptographic",
- "curcumference", "circumference",
- "curcumstances", "circumstances",
- "custumization", "customization",
- "cuztomization", "customization",
- "decentraliced", "decentralized",
- "decentrilized", "decentralized",
- "decomissioned", "decommissioned",
- "decompositing", "decomposing",
- "definitivelly", "definitively",
- "deinitalizing", "deinitializing",
- "demenstration", "demonstration",
- "democraticaly", "democratically",
- "democraticlly", "democratically",
- "demoninations", "denominations",
- "demonstarting", "demonstrating",
- "demonstartion", "demonstration",
- "demonstraiton", "demonstrations",
- "demonstratbly", "demonstrably",
- "demonstraties", "demonstrate",
- "demonstrativo", "demonstration",
- "demosntrating", "demonstrating",
- "demosntration", "demonstrations",
- "denomenations", "denominations",
- "denomonations", "denominations",
- "deomnstration", "demonstrations",
- "dermatalogist", "dermatologist",
- "dermatolagist", "dermatologist",
- "dermatoligist", "dermatologist",
- "dermatologyst", "dermatologist",
- "dermetologist", "dermatologist",
- "dermitologist", "dermatologist",
- "derpatologist", "dermatologist",
- "desentralized", "decentralized",
- "desillusioned", "disillusioned",
- "desintegrated", "disintegrated",
- "desinterested", "disinterested",
- "determenation", "determination",
- "determinacion", "determination",
- "determinining", "determining",
- "determinisitc", "deterministic",
- "determinsitic", "deterministic",
- "detmatologist", "dermatologist",
- "developmently", "developmental",
- "dezentralized", "decentralized",
- "differantiate", "differentiate",
- "differenciate", "differentiate",
- "differintiate", "differentiate",
- "diffirentiate", "differentiate",
- "disadvandages", "disadvantaged",
- "disadvantadge", "disadvantaged",
- "disadvanteged", "disadvantaged",
- "disadvanteges", "disadvantages",
- "disadvatanges", "disadvantages",
- "disadventaged", "disadvantaged",
- "disadventages", "disadvantages",
- "disallusioned", "disillusioned",
- "disappearence", "disappearance",
- "disappearnace", "disappearance",
- "disappearring", "disappearing",
- "disatvantaged", "disadvantaged",
- "disatvantages", "disadvantages",
- "disciplinairy", "disciplinary",
- "disciplinerad", "disciplined",
- "discipliniary", "disciplinary",
- "disconnecters", "disconnects",
- "discontinuted", "discontinued",
- "discrimianted", "discriminated",
- "discriminante", "discriminate",
- "discriminatie", "discriminate",
- "discriminatin", "discrimination",
- "disillisioned", "disillusioned",
- "disillutioned", "disillusioned",
- "disingenuious", "disingenuous",
- "disollusioned", "disillusioned",
- "disrecpectful", "disrespectful",
- "disrecpecting", "disrespecting",
- "disrepsectful", "disrespectful",
- "disrepsecting", "disrespecting",
- "disresepctful", "disrespectful",
- "disresepcting", "disrespecting",
- "disrespection", "disrespecting",
- "disrespekting", "disrespecting",
- "disrispectful", "disrespectful",
- "disrispecting", "disrespecting",
- "dissagreement", "disagreement",
- "dissapearance", "disappearance",
- "dissapointted", "dissapointed",
- "dissappointed", "disappointed",
- "dissobediance", "disobedience",
- "dissobedience", "disobedience",
- "distingishing", "distinguishing",
- "distinguising", "distinguishing",
- "distinquished", "distinguished",
- "distirbutions", "distributions",
- "distiungished", "distinguished",
- "distribustion", "distributions",
- "distributiors", "distributors",
- "distributivos", "distributions",
- "distrobutions", "distributions",
- "distrubitions", "distributions",
- "distuingished", "distinguished",
- "documantaries", "documentaries",
- "documenatries", "documentaries",
- "documentacion", "documentation",
- "documentaires", "documentaries",
- "documentaiton", "documentation",
- "documentarios", "documentaries",
- "documentaties", "documentaries",
- "documentating", "documentation",
- "documenteries", "documentaries",
- "documentories", "documentaries",
- "drammatically", "grammatically",
- "dsyfunctional", "dysfunctional",
- "dumbfoundeads", "dumbfounded",
- "dusfunctional", "dysfunctional",
- "dustification", "justification",
- "dysfonctional", "dysfunctional",
- "dysfucntional", "dysfunctional",
- "dysfuncitonal", "dysfunctional",
- "dysfunktional", "dysfunctional",
- "easthetically", "aesthetically",
- "effectiviness", "effectiveness",
- "effictiveness", "effectiveness",
- "effortlessely", "effortlessly",
- "effortlessley", "effortlessly",
- "embarrasement", "embarrassment",
- "embarrasments", "embarrassment",
- "embarressment", "embarrassment",
- "emberrassment", "embarrassment",
- "encarceration", "incarceration",
- "encorporating", "incorporating",
- "encyclopeadia", "encyclopedia",
- "encyclopeadic", "encyclopedia",
- "encyclopeedia", "encyclopedia",
- "encycolpedias", "encyclopedia",
- "endoctrinated", "indoctrinated",
- "enlightenting", "enlightening",
- "enlightnement", "enlightenment",
- "enligthenment", "enlightenment",
- "enteratinment", "entertainment",
- "enterpreneurs", "entrepreneurs",
- "enterprenuers", "entrepreneurs",
- "enterpreuners", "entrepreneurs",
- "entertianment", "entertainment",
- "enthusiasists", "enthusiasts",
- "enthusiastics", "enthusiasts",
- "entrepraneurs", "entrepreneurs",
- "entreprenaurs", "entrepreneurs",
- "entrepreneuer", "entrepreneurs",
- "entreprenours", "entrepreneurs",
- "entreprenuers", "entrepreneurs",
- "entreprenures", "entrepreneurs",
- "entrepreuners", "entrepreneurs",
- "entretainment", "entertainment",
- "enviornmental", "environmental",
- "environemntal", "environmental",
- "environmently", "environmental",
- "envolutionary", "evolutionary",
- "envrionmental", "environmental",
- "estabilshment", "establishments",
- "establishemnt", "establishments",
- "establishmnet", "establishments",
- "establsihment", "establishments",
- "estbalishment", "establishments",
- "ethnocentricm", "ethnocentrism",
- "evolutionairy", "evolutionary",
- "evolutionarly", "evolutionary",
- "evolutionnary", "evolutionary",
- "exaggeratting", "exaggerating",
- "excpetionally", "exceptionally",
- "executioneers", "executioner",
- "existentiella", "existential",
- "expectionally", "exceptionally",
- "experementing", "experimenting",
- "experienceing", "experiencing",
- "experimentais", "experiments",
- "experimention", "experimenting",
- "experimentors", "experiments",
- "expirementing", "experimenting",
- "expodentially", "exponentially",
- "exponantially", "exponentially",
- "exponencially", "exponentially",
- "exponentiella", "exponential",
- "extraodrinary", "extraordinary",
- "extraordianry", "extraordinary",
- "extraordinair", "extraordinary",
- "extraordinaly", "extraordinary",
- "extraoridnary", "extraordinary",
- "extremeophile", "extremophile",
- "extroardinary", "extraordinary",
- "familiarizate", "familiarize",
- "fantasitcally", "fantastically",
- "fantasmically", "fantastically",
- "fantistically", "fantastically",
- "faptastically", "fantastically",
- "figurativeley", "figuratively",
- "figurativelly", "figuratively",
- "frankenstiens", "frankenstein",
- "frankenstined", "frankenstein",
- "frankenstiner", "frankenstein",
- "frankenstines", "frankenstein",
- "friendzoneado", "friendzoned",
- "fucntionality", "functionality",
- "funcitonality", "functionality",
- "functionailty", "functionality",
- "fundamentalis", "fundamentals",
- "fundamnetally", "fundamentally",
- "fundementally", "fundamentally",
- "fundimentally", "fundamentally",
- "gamifications", "ramifications",
- "generalizaing", "generalizing",
- "generalizaton", "generalization",
- "generationals", "generations",
- "generationens", "generations",
- "generationers", "generations",
- "generationnal", "generational",
- "geographicaly", "geographically",
- "geographicial", "geographical",
- "geometricians", "geometers",
- "goreshadowing", "foreshadowing",
- "governmential", "governmental",
- "gradification", "gratification",
- "grammarically", "grammatically",
- "grandchildern", "grandchildren",
- "gratificacion", "gratification",
- "gratificaiton", "gratification",
- "grativational", "gravitational",
- "gravitacional", "gravitational",
- "gravitaitonal", "gravitational",
- "hallcuination", "hallucination",
- "hallicunation", "hallucination",
- "hallucenation", "hallucination",
- "halluciantion", "hallucinations",
- "hallukination", "hallucination",
- "hallunication", "hallucination",
- "hallusination", "hallucination",
- "halluzination", "hallucination",
- "heiroglyphics", "hieroglyphics",
- "hellucination", "hallucination",
- "highlightning", "highlighting",
- "homesexuality", "homosexuality",
- "homosexualtiy", "homosexuality",
- "homosexulaity", "homosexuality",
- "horizontallly", "horizontally",
- "hullucination", "hallucination",
- "hypocriticial", "hypocritical",
- "hypotheticaly", "hypothetically",
- "hystericallly", "hysterically",
- "identificaton", "identification",
- "ideoligically", "ideologically",
- "ideosyncratic", "idiosyncratic",
- "idiologically", "ideologically",
- "illistrations", "illustrations",
- "illustartions", "illustrations",
- "imperfactions", "imperfections",
- "impersinating", "impersonating",
- "implementaion", "implementation",
- "implementatin", "implementations",
- "implimenation", "implementation",
- "imprefections", "imperfections",
- "impresonating", "impersonating",
- "inaccessibile", "inaccessible",
- "inadventently", "inadvertently",
- "inadverdently", "inadvertently",
- "inadvertantly", "inadvertently",
- "inadvertendly", "inadvertently",
- "inapporpriate", "inappropriate",
- "inappropirate", "inappropriate",
- "inappropraite", "inappropriate",
- "inaproppriate", "inappropriate",
- "incarcaration", "incarceration",
- "incarciration", "incarceration",
- "incarseration", "incarceration",
- "incerceration", "incarceration",
- "incidentially", "incidentally",
- "incomfortable", "uncomfortable",
- "incomfortably", "uncomfortably",
- "incompatabile", "incompatible",
- "incompatiable", "incompatible",
- "incompatibile", "incompatible",
- "inconciderate", "inconsiderate",
- "inconcistency", "inconsistency",
- "inconditional", "unconditional",
- "inconsciously", "unconsciously",
- "inconsiderant", "inconsiderate",
- "inconsistance", "inconsistency",
- "inconsistancy", "inconsistency",
- "inconsistenly", "inconsistency",
- "inconsistensy", "inconsistency",
- "inconsistenty", "inconsistency",
- "inconveinence", "inconvenience",
- "inconveniance", "inconvenience",
- "inconveniente", "inconvenience",
- "inconvienence", "inconvenience",
- "incoroporated", "incorporated",
- "incorparating", "incorporating",
- "incorperating", "incorporating",
- "incorperation", "incorporation",
- "incorruptable", "incorruptible",
- "incramentally", "incrementally",
- "incrementarla", "incremental",
- "incrementarlo", "incremental",
- "indavertently", "inadvertently",
- "indefinitelly", "indefinitely",
- "independantes", "independents",
- "independantly", "independently",
- "independendet", "independent",
- "independendly", "independently",
- "indepentently", "independently",
- "indespensable", "indispensable",
- "indespensible", "indispensable",
- "indestructble", "indestructible",
- "indestructibe", "indestructible",
- "indictrinated", "indoctrinated",
- "indipendently", "independently",
- "indispensible", "indispensable",
- "indivuduality", "individuality",
- "indocrtinated", "indoctrinated",
- "indocternated", "indoctrinated",
- "indoctornated", "indoctrinated",
- "indoctrinatie", "indoctrinated",
- "indoctrinatin", "indoctrination",
- "indoctronated", "indoctrinated",
- "industrialied", "industrialized",
- "industrialzed", "industrialized",
- "inexeprienced", "inexperience",
- "inexpeirenced", "inexperience",
- "inexpereinced", "inexperienced",
- "inexperianced", "inexperienced",
- "inexperiecned", "inexperience",
- "inexperineced", "inexperience",
- "inexpierenced", "inexperienced",
- "inexplicabley", "inexplicably",
- "inexplicablly", "inexplicably",
- "infilitration", "infiltration",
- "infrastructre", "infrastructure",
- "infrastrucure", "infrastructure",
- "inintelligent", "unintelligent",
- "ininteresting", "uninteresting",
- "initalisation", "initialisation",
- "initalization", "initialization",
- "inperfections", "imperfections",
- "inpersonating", "impersonating",
- "inpossibility", "impossibility",
- "inpredictable", "unpredictable",
- "inresponsible", "irresponsible",
- "insectiverous", "insectivorous",
- "insecuritites", "insecurities",
- "insiginficant", "insignificant",
- "insiginifcant", "insignificant",
- "insignificent", "insignificant",
- "insignificunt", "insignificant",
- "insignifigant", "insignificant",
- "insiprational", "inspirational",
- "insperational", "inspirational",
- "inspiritional", "inspirational",
- "inspriational", "inspirational",
- "instantaenous", "instantaneous",
- "instantanious", "instantaneous",
- "instanteneous", "instantaneous",
- "instantenious", "instantaneous",
- "instincitvely", "instinctively",
- "instinctivley", "instinctively",
- "instititional", "institutional",
- "institutionel", "institutional",
- "insturmentals", "instrumental",
- "instutitional", "institutional",
- "insustainable", "unsustainable",
- "intelelctuals", "intellectuals",
- "intellectualy", "intellectually",
- "intellectuels", "intellectuals",
- "intellecutals", "intellectuals",
- "intellegently", "intelligently",
- "intelluctuals", "intellectuals",
- "intepretation", "interpretation",
- "intereactions", "intersections",
- "interesctions", "intersections",
- "interlectuals", "intellectuals",
- "intermittient", "intermittent",
- "intermittment", "intermittent",
- "internacional", "international",
- "interpersonel", "interpersonal",
- "interpresonal", "interpersonal",
- "interpretaion", "interpretation",
- "interpretarea", "interpreter",
- "interpretarem", "interpreter",
- "interpretares", "interpreter",
- "interpretarse", "interpreter",
- "interpretarte", "interpreter",
- "interpretatin", "interpretations",
- "interpreteert", "interpreter",
- "interragation", "interrogation",
- "interregation", "interrogation",
- "interrigation", "interrogation",
- "interrogacion", "interrogation",
- "interrogativo", "interrogation",
- "intertainment", "entertainment",
- "intillectuals", "intellectuals",
- "intraspection", "introspection",
- "intrensically", "intrinsically",
- "intriniscally", "intrinsically",
- "intrinsecally", "intrinsically",
- "intrisincally", "intrinsically",
- "intristically", "intrinsically",
- "introductiory", "introductory",
- "introspeccion", "introspection",
- "introspectivo", "introspection",
- "introspektion", "introspection",
- "invertibrates", "invertebrates",
- "invesitgation", "investigation",
- "invesitgative", "investigative",
- "invesitgators", "investigators",
- "investagators", "investigators",
- "investegating", "investigating",
- "investegators", "investigators",
- "investiagtion", "investigation",
- "investiagtive", "investigative",
- "investigacion", "investigation",
- "investigaiton", "investigations",
- "investigaters", "investigators",
- "investigativo", "investigation",
- "investigatons", "investigations",
- "investigsting", "investigating",
- "investigstion", "investigations",
- "investogators", "investigators",
- "invisibillity", "invisibility",
- "involuntarely", "involuntary",
- "involuntarity", "involuntary",
- "invulnerabile", "invulnerable",
- "irrationallly", "irrationally",
- "irresponcible", "irresponsible",
- "irresponisble", "irresponsible",
- "irresponsable", "irresponsible",
- "irresponsbile", "irresponsible",
- "irreversiable", "irreversible",
- "irreversibelt", "irreversible",
- "irreversibile", "irreversible",
- "irrisponsible", "irresponsible",
- "jacksonvillle", "jacksonville",
- "journalisitic", "journalistic",
- "journalistens", "journalists",
- "journalisters", "journalists",
- "journalistisk", "journalists",
- "jsutification", "justifications",
- "jurisdicitons", "jurisdictions",
- "jurisidctions", "jurisdictions",
- "juristictions", "jurisdictions",
- "jursidictions", "jurisdictions",
- "jusitfication", "justifications",
- "justifiaction", "justifications",
- "justificacion", "justification",
- "justificaiton", "justification",
- "justificativo", "justification",
- "justificatons", "justifications",
- "justificstion", "justifications",
- "justiifcation", "justifications",
- "karbohydrates", "carbohydrates",
- "knoweldgeable", "knowledgeable",
- "knowledegable", "knowledgeable",
- "knowledgebale", "knowledgable",
- "knowlegdeable", "knowledgeable",
- "kollaboration", "collaboration",
- "koncentration", "concentration",
- "konfiguration", "configuration",
- "konfrontation", "confrontation",
- "konservatives", "conservatives",
- "konstellation", "constellation",
- "kontamination", "contamination",
- "legitimatelly", "legitimately",
- "libertariaism", "libertarianism",
- "libertariansm", "libertarianism",
- "libitarianisn", "libertarianism",
- "lighthearthed", "lighthearted",
- "mainfestation", "manifestation",
- "manafacturers", "manufacturers",
- "manafacturing", "manufacturing",
- "manafestation", "manifestation",
- "manefestation", "manifestation",
- "manfuacturers", "manufactures",
- "manifacturers", "manufacturers",
- "manifacturing", "manufacturing",
- "manifastation", "manifestation",
- "manifestacion", "manifestation",
- "manifestating", "manifestation",
- "manifistation", "manifestation",
- "manipulationg", "manipulating",
- "manufacterers", "manufacturers",
- "manufactering", "manufacturing",
- "manufacterurs", "manufactures",
- "manufactorers", "manufacturers",
- "manufactoring", "manufacturing",
- "manufactuered", "manufactured",
- "manufactuerer", "manufacturer",
- "manufactueres", "manufactures",
- "manufacturedd", "manufactured",
- "manufactureds", "manufactures",
- "manufacturerd", "manufactured",
- "manufacturier", "manufacturer",
- "manufacturors", "manufacturers",
- "manufactuters", "manufactures",
- "manufacutrers", "manufactures",
- "manufcaturers", "manufactures",
- "marshmalllows", "marshmallows",
- "massachsuetts", "massachusetts",
- "massachucetts", "massachusetts",
- "massachuestts", "massachusetts",
- "massachusents", "massachusetts",
- "massachusites", "massachusetts",
- "massachussets", "massachusetts",
- "massechusetts", "massachusetts",
- "masturbateing", "masturbating",
- "materialisimo", "materialism",
- "mathamatician", "mathematician",
- "mathametician", "mathematician",
- "mathematicals", "mathematics",
- "mathematicaly", "mathematically",
- "mathematicans", "mathematics",
- "mathematicion", "mathematician",
- "mathematitian", "mathematician",
- "mathemetician", "mathematician",
- "mathmatically", "mathematically",
- "mathmaticians", "mathematicians",
- "mechanicallly", "mechanically",
- "medeterranean", "mediterranean",
- "meditarrenean", "mediterranean",
- "meditereanean", "mediterranean",
- "membranaphone", "membranophone",
- "metamorphysis", "metamorphosis",
- "metaphoricaly", "metaphorically",
- "metaphoricial", "metaphorical",
- "metaphysicals", "metaphysics",
- "metaphysicans", "metaphysics",
- "methamatician", "mathematician",
- "methematician", "mathematician",
- "metropolitain", "metropolitan",
- "metropolitcan", "metropolitan",
- "metropolitian", "metropolitan",
- "millionairres", "millionaire",
- "minneapolites", "minneapolis",
- "misanderstood", "misunderstood",
- "miscellanious", "miscellaneous",
- "misconcpetion", "misconceptions",
- "misconecption", "misconceptions",
- "misinterperet", "misinterpret",
- "misinterprate", "misinterpret",
- "misinterprent", "misinterpret",
- "misinterprted", "misinterpret",
- "misogynisitic", "misogynistic",
- "misrepreseted", "misrepresented",
- "misunterstood", "misunderstood",
- "modificaitons", "modifications",
- "motivationals", "motivations",
- "motivationnal", "motivational",
- "mulitnational", "multinational",
- "multimational", "multinational",
- "multiplicaton", "multiplication",
- "muncipalities", "municipalities",
- "munnicipality", "municipality",
- "mutlinational", "multinational",
- "nacionalistic", "nationalistic",
- "narcissisitic", "narcissistic",
- "narcississtic", "narcissistic",
- "natioanlistic", "nationalistic",
- "nationalisitc", "nationalistic",
- "nationalistes", "nationalists",
- "nationalsitic", "nationalistic",
- "neigbhourhood", "neighbourhood",
- "neighboorhoud", "neighbourhood",
- "neighborehood", "neighbourhood",
- "neighborhoood", "neighborhoods",
- "neighbourbood", "neighbourhood",
- "neighbourgood", "neighbourhood",
- "neighbourhoud", "neighbourhood",
- "neighourhoods", "neighborhoods",
- "nieghborhoods", "neighborhoods",
- "nieghbourhood", "neighbourhood",
- "noncombatents", "noncombatants",
- "noninitalized", "noninitialized",
- "northwestener", "northwestern",
- "notificaitons", "notifications",
- "occassionally", "occasionally",
- "operationable", "operational",
- "oppertunities", "opportunities",
- "opprotunities", "opportunities",
- "oppurtunities", "opportunities",
- "opthamologist", "ophthalmologist",
- "organistaions", "organisations",
- "organizatinal", "organizational",
- "organizativos", "organizations",
- "organsiations", "organisations",
- "organziations", "organizations",
- "orginasations", "organisations",
- "orginazations", "organizations",
- "overpopulaton", "overpopulation",
- "overreactiong", "overreacting",
- "overshaddowed", "overshadowed",
- "overwheliming", "overwhelming",
- "overwhelmigly", "overwhelmingly",
- "overwhelmingy", "overwhelmingly",
- "overwhelminly", "overwhelmingly",
- "palestininans", "palestinians",
- "paraphraseing", "paraphrasing",
- "paraphrashing", "paraphrasing",
- "parilamentary", "parliamentary",
- "parlaimentary", "parliamentary",
- "parliamantary", "parliamentary",
- "parliamentery", "parliamentary",
- "parliamnetary", "parliamentary",
- "parliementary", "parliamentary",
- "particiaption", "participation",
- "participacion", "participation",
- "participantes", "participants",
- "participativo", "participation",
- "particularely", "particularly",
- "particularily", "particularly",
- "particularlly", "particularly",
- "partizipation", "participation",
- "passionatelly", "passionately",
- "paychiatrists", "psychiatrists",
- "paychologists", "psychologists",
- "pennsylvainia", "pennsylvania",
- "pennsylvanica", "pennsylvania",
- "pennsylvannia", "pennsylvania",
- "perdominantly", "predominantly",
- "perpandicular", "perpendicular",
- "perpendicualr", "perpendicular",
- "perpenticular", "perpendicular",
- "perpetuationg", "perpetuating",
- "perpindicular", "perpendicular",
- "personalitits", "personalities",
- "pessimistisch", "pessimistic",
- "pharmaceutial", "pharmaceutical",
- "philisophical", "philosophical",
- "philosiphical", "philosophical",
- "philosohpical", "philosophical",
- "philosophycal", "philosophically",
- "philospohical", "philosophical",
- "phisiological", "physiological",
- "photagraphers", "photographers",
- "photographics", "photographs",
- "photographied", "photographed",
- "photographier", "photographer",
- "photograpphed", "photographed",
- "photogrophers", "photographers",
- "photogrpahers", "photographers",
- "photoshoppade", "photoshopped",
- "photoshoppped", "photoshopped",
- "phsyiological", "physiological",
- "phychiatrists", "psychiatrists",
- "phychological", "psychological",
- "phychologists", "psychologists",
- "phylosophical", "philosophical",
- "physciatrists", "psychiatrists",
- "physcological", "psychological",
- "physcologists", "psychologists",
- "physioligical", "physiological",
- "planeswlakers", "planeswalker",
- "plansewalkers", "planeswalker",
- "playthroughts", "playthroughs",
- "polysaccaride", "polysaccharide",
- "practicallity", "practically",
- "practicioners", "practitioners",
- "practisioners", "practitioners",
- "practitioneer", "practitioners",
- "practitionner", "practitioner",
- "pratictioners", "practitioners",
- "preconceieved", "preconceived",
- "predecessores", "predecessors",
- "predetermiend", "predetermined",
- "predetirmined", "predetermined",
- "preditermined", "predetermined",
- "predomenantly", "predominantly",
- "predominently", "predominantly",
- "pregressively", "progressively",
- "preinitalized", "preinitialized",
- "preinitalizes", "preinitializes",
- "preliferation", "proliferation",
- "prependicular", "perpendicular",
- "preposterious", "preposterous",
- "prerequisties", "prerequisite",
- "prerequistite", "prerequisite",
- "prescribtions", "prescriptions",
- "presumptuious", "presumptuous",
- "pretedermined", "predetermined",
- "problematisch", "problematic",
- "proclaimation", "proclamation",
- "prodominantly", "predominantly",
- "professionnal", "professional",
- "profitiablity", "profitability",
- "profitibality", "profitability",
- "progressivily", "progressively",
- "progressivley", "progressively",
- "prononciation", "pronunciation",
- "pronouciation", "pronunciation",
- "pronunciacion", "pronunciation",
- "pronunciating", "pronunciation",
- "pronuncuation", "pronunciation",
- "pronunication", "pronunciation",
- "pronuntiation", "pronunciation",
- "propabilities", "probabilities",
- "proportionaly", "proportionally",
- "proportionnal", "proportional",
- "proseletyzing", "proselytizing",
- "protagonistas", "protagonists",
- "protagonistes", "protagonists",
- "protestantisk", "protestants",
- "protruberance", "protuberance",
- "provocativley", "provocative",
- "pscyhiatrists", "psychiatrists",
- "pscyhological", "psychological",
- "pscyhologists", "psychologists",
- "pshycological", "psychological",
- "pshycologists", "psychologists",
- "psichological", "psychological",
- "psychaitrists", "psychiatrists",
- "psychedellics", "psychedelics",
- "psychiatrisch", "psychiatric",
- "psycholigical", "psychological",
- "psycholigists", "psychologists",
- "psychologycal", "psychologically",
- "psychologysts", "psychologists",
- "psychyatrists", "psychiatrists",
- "psysiological", "physiological",
- "purpendicular", "perpendicular",
- "pyschiatrists", "psychiatrists",
- "pyschological", "psychological",
- "pyschologists", "psychologists",
- "qaulification", "qualification",
- "qualifiaction", "qualification",
- "qualificaiton", "qualifications",
- "qualificatons", "qualifications",
- "qualifikation", "qualification",
- "questionalble", "questionable",
- "quinessential", "quintessential",
- "ramificaitons", "ramifications",
- "realisitcally", "realistically",
- "realtionships", "relationships",
- "reccommending", "recommending",
- "receptionnist", "receptionist",
- "receptionsist", "receptionist",
- "reconaissance", "reconnaissance",
- "reconcilation", "reconciliation",
- "reconnaisance", "reconnaissance",
- "reconstrucion", "reconstruction",
- "recreationnal", "recreational",
- "rectangulaire", "rectangular",
- "redistribuito", "redistribution",
- "redistributin", "redistribution",
- "reencarnation", "reincarnation",
- "refridgerator", "refrigerator",
- "rehabilitaion", "rehabilitation",
- "rehabilitatin", "rehabilitation",
- "rehabilitaton", "rehabilitation",
- "reincarantion", "reincarnation",
- "reincatnation", "reincarnation",
- "reinforcemens", "reinforcements",
- "reinforcemnts", "reinforcements",
- "reinitalising", "reinitialising",
- "reinitalizing", "reinitializing",
- "reinkarnation", "reincarnation",
- "reinstallling", "reinstalling",
- "reintarnation", "reincarnation",
- "relationshits", "relationships",
- "relationsship", "relationships",
- "relatiopnship", "relationship",
- "relentlessely", "relentlessly",
- "relentlessley", "relentlessly",
- "relinqushment", "relinquishment",
- "remifications", "ramifications",
- "reprehenisble", "reprehensible",
- "reprehensable", "reprehensible",
- "reprehinsible", "reprehensible",
- "represenation", "representation",
- "represensible", "reprehensible",
- "representaion", "representation",
- "representatie", "representatives",
- "representatin", "representations",
- "representerad", "represented",
- "representitve", "representative",
- "representives", "representatives",
- "repricussions", "repercussions",
- "reprihensible", "reprehensible",
- "resolutionary", "revolutionary",
- "respectivelly", "respectively",
- "responsibiliy", "responsibility",
- "responsibilty", "responsibility",
- "responsiblity", "responsibility",
- "respositories", "repositories",
- "resssurecting", "resurrecting",
- "ressurrection", "resurrection",
- "restaraunteur", "restaurateur",
- "retoractively", "retroactively",
- "retroactivily", "retroactively",
- "retroactivley", "retroactively",
- "retrocatively", "retroactively",
- "revelutionary", "revolutionary",
- "revolutionair", "revolutionary",
- "revolutionens", "revolutions",
- "revolutioners", "revolutions",
- "revoultionary", "revolutionary",
- "ridiculouness", "ridiculousness",
- "rienforcement", "reinforcements",
- "righetousness", "righteousness",
- "rightiousness", "righteousness",
- "rigtheousness", "righteousness",
- "rollarcoaster", "rollercoaster",
- "rollercaoster", "rollercoaster",
- "rollercoaters", "rollercoaster",
- "rollercoatser", "rollercoaster",
- "rollerocaster", "rollercoaster",
- "rollertoaster", "rollercoaster",
- "rollorcoaster", "rollercoaster",
- "sacrastically", "sarcastically",
- "sarcasitcally", "sarcastically",
- "satisfactorly", "satisfactory",
- "scandianvians", "scandinavian",
- "scateboarding", "skateboarding",
- "schisophrenic", "schizophrenic",
- "schiziphrenic", "schizophrenic",
- "schizophernia", "schizophrenia",
- "schizophernic", "schizophrenic",
- "schizophrania", "schizophrenia",
- "schizoprhenia", "schizophrenia",
- "schizoprhenic", "schizophrenic",
- "schozophrenia", "schizophrenia",
- "schozophrenic", "schizophrenic",
- "schyzophrenia", "schizophrenia",
- "schyzophrenic", "schizophrenic",
- "schziophrenia", "schizophrenia",
- "schziophrenic", "schizophrenic",
- "scientificaly", "scientifically",
- "scientificlly", "scientifically",
- "segementation", "segmentation",
- "sensationable", "sensational",
- "sensationails", "sensationalism",
- "sensationaism", "sensationalism",
- "sensationalim", "sensationalism",
- "sensationella", "sensational",
- "shcizophrenic", "schizophrenic",
- "significanlty", "significantly",
- "significently", "significantly",
- "signifigantly", "significantly",
- "simultaneosly", "simultaneously",
- "simultaneuous", "simultaneous",
- "simultanously", "simultaneously",
- "singificantly", "significantly",
- "skatebaording", "skateboarding",
- "skateborading", "skateboarding",
- "socioecenomic", "socioeconomic",
- "socioecomonic", "socioeconomic",
- "socioeconimic", "socioeconomic",
- "sohpisticated", "sophisticated",
- "sophisitcated", "sophisticated",
- "sophistacated", "sophisticated",
- "sophistocated", "sophisticated",
- "sophosticated", "sophisticated",
- "spacification", "specification",
- "specializaton", "specialization",
- "specificaiton", "specifications",
- "specificatons", "specifications",
- "specifikation", "specification",
- "spectaculaire", "spectacular",
- "spectaculalry", "spectacularly",
- "spectatularly", "spectacularly",
- "spesification", "specification",
- "spirituallity", "spiritually",
- "sponatenously", "spontaneously",
- "spontaenously", "spontaneously",
- "spontainously", "spontaneously",
- "spontaneoulsy", "spontaneously",
- "spontaneuosly", "spontaneously",
- "spontaniously", "spontaneously",
- "spontanuously", "spontaneously",
- "sponteanously", "spontaneously",
- "sponteneously", "spontaneously",
- "sporstmanship", "sportsmanship",
- "sportmansship", "sportsmanship",
- "sportsmamship", "sportsmanship",
- "sportsmenship", "sportsmanship",
- "sprotsmanship", "sportsmanship",
- "stakeboarding", "skateboarding",
- "startegically", "strategically",
- "statisitcally", "statistically",
- "statistacally", "statistically",
- "stereotipical", "stereotypical",
- "stereotpyical", "stereotypical",
- "stereotypcial", "stereotypical",
- "stereotypeing", "stereotyping",
- "stereotypying", "stereotyping",
- "steriotypical", "stereotypical",
- "steroetypical", "stereotypical",
- "steryotypical", "stereotypical",
- "storytellling", "storytelling",
- "stragegically", "strategically",
- "stragetically", "strategically",
- "straightenend", "straightened",
- "straitforward", "straightforward",
- "stratagically", "strategically",
- "stratigically", "strategically",
- "strawberrries", "strawberries",
- "stregnthening", "strengthening",
- "strenghtening", "strengthening",
- "strengthining", "strengthening",
- "stretegically", "strategically",
- "subcatagories", "subcategories",
- "subconsciosly", "subconsciously",
- "subconsciouly", "subconsciously",
- "subconsiously", "subconsciously",
- "subjectivelly", "subjectively",
- "subscribtions", "subscriptions",
- "substancially", "substantially",
- "substanitally", "substantially",
- "substansially", "substantially",
- "substantiable", "substantial",
- "substantually", "substantially",
- "substitutents", "substitutes",
- "successfullly", "successfully",
- "supermarkedet", "supermarket",
- "supermarkerts", "supermarkets",
- "superpowereds", "superpowers",
- "supersticious", "superstitious",
- "superstisious", "superstitious",
- "superstitiosi", "superstitious",
- "superstitiuos", "superstitious",
- "superstituous", "superstitious",
- "suphisticated", "sophisticated",
- "supscriptions", "subscriptions",
- "surreptiously", "surreptitiously",
- "survavibility", "survivability",
- "survibability", "survivability",
- "survivabiltiy", "survivability",
- "survivalibity", "survivability",
- "survivavility", "survivability",
- "survivebility", "survivability",
- "susbtantially", "substantially",
- "sustainabilty", "sustainability",
- "synchornously", "synchronously",
- "systematicaly", "systematically",
- "systematiclly", "systematically",
- "techmological", "technological",
- "technicallity", "technically",
- "technoligical", "technological",
- "technologicly", "technological",
- "techonlogical", "technological",
- "telaportation", "teleportation",
- "teleportating", "teleportation",
- "teleprotation", "teleportation",
- "teliportation", "teleportation",
- "teloportation", "teleportation",
- "territoriella", "territorial",
- "theoratically", "theoretically",
- "theoritically", "theoretically",
- "therapeutisch", "therapeutic",
- "thereotically", "theoretically",
- "thermodynaics", "thermodynamics",
- "thermodynamcs", "thermodynamics",
- "theroetically", "theoretically",
- "thoeretically", "theoretically",
- "tranistioning", "transitioning",
- "transcendance", "transcendence",
- "transcribtion", "transcription",
- "transcripcion", "transcription",
- "transferrring", "transferring",
- "transformarea", "transformer",
- "transformarem", "transformer",
- "transformarse", "transformers",
- "transformaton", "transformation",
- "transformered", "transformed",
- "transgengered", "transgendered",
- "transisioning", "transitioning",
- "transitionals", "transitions",
- "transitionnal", "transitional",
- "transitionned", "transitioned",
- "transkription", "transcription",
- "translyvanian", "transylvania",
- "transmisisons", "transmissions",
- "transmissable", "transmissible",
- "transmisssion", "transmissions",
- "transparantie", "transparent",
- "transparentcy", "transparency",
- "transplantees", "transplants",
- "transporation", "transportation",
- "transportaion", "transportation",
- "transportarme", "transporter",
- "transportarse", "transporter",
- "transportarte", "transporter",
- "transporteurs", "transporter",
- "transsexuella", "transsexual",
- "transylvannia", "transylvania",
- "trasngendered", "transgendered",
- "troubleshooot", "troubleshoot",
- "udnerestimate", "underestimated",
- "umcomfortable", "uncomfortable",
- "umcomfortably", "uncomfortably",
- "umpredictable", "unpredictable",
- "unappropriate", "inappropriate",
- "unbelievabley", "unbelievably",
- "unbelievablly", "unbelievably",
- "uncertaintity", "uncertainty",
- "uncomfertable", "uncomfortable",
- "uncomfertably", "uncomfortably",
- "uncomfortabel", "uncomfortably",
- "uncomforyable", "uncomfortably",
- "uncomfrotable", "uncomfortable",
- "uncomfrotably", "uncomfortably",
- "uncomftorable", "uncomfortable",
- "uncomftorably", "uncomfortably",
- "unconcsiously", "unconsciously",
- "unconfortable", "uncomfortable",
- "unconfortably", "uncomfortably",
- "unconscioulsy", "unconsciously",
- "unconsicously", "unconsciously",
- "unconsiderate", "inconsiderate",
- "uncontrollabe", "uncontrollable",
- "uncontrollaby", "uncontrollably",
- "unconventinal", "unconventional",
- "uncounciously", "unconsciously",
- "uncousciously", "unconsciously",
- "underastimate", "underestimate",
- "underesitmate", "underestimated",
- "underestamate", "underestimate",
- "underestemate", "underestimate",
- "underestiamte", "underestimated",
- "undergratuate", "undergraduate",
- "underhwelming", "underwhelming",
- "underhwleming", "underwhelming",
- "underminining", "undermining",
- "underpowererd", "underpowered",
- "undersetimate", "underestimate",
- "understandble", "understandable",
- "understandbly", "understandably",
- "underwealming", "underwhelming",
- "underwhemling", "underwhelming",
- "underwhleming", "underwhelming",
- "undoctrinated", "indoctrinated",
- "unexpectadely", "unexpectedly",
- "unfomfortable", "uncomfortable",
- "unforgiveable", "unforgivable",
- "unfortuantely", "unfortunately",
- "unfortunantly", "unfortunately",
- "unfortunatley", "unfortunately",
- "unfortuneatly", "unfortunately",
- "unfortunetely", "unfortunately",
- "unilaterallly", "unilaterally",
- "uninstallling", "uninstalling",
- "unintellegent", "unintelligent",
- "unintelligant", "unintelligent",
- "unintensional", "unintentional",
- "uninteristing", "uninteresting",
- "universitites", "universities",
- "unnecassarily", "unnecessarily",
- "unneccesarily", "unnecessarily",
- "unnecessairly", "unnecessarily",
- "unnecessarely", "unnecessarily",
- "unnecessarity", "unnecessarily",
- "unnecesserily", "unnecessarily",
- "unnecissarily", "unnecessarily",
- "unnessecarily", "unnecessarily",
- "unoperational", "nonoperational",
- "unprecendeted", "unprecedented",
- "unprecidented", "unprecedented",
- "unpredecented", "unprecedented",
- "unpredicatble", "unpredictable",
- "unpredictible", "unpredictable",
- "unpresedented", "unprecedented",
- "unpridictable", "unpredictable",
- "unprofessinal", "unprofessional",
- "unrealistisch", "unrealistic",
- "unreasonabley", "unreasonably",
- "unreasonablly", "unreasonably",
- "unrestrictred", "unrestricted",
- "unsistainable", "unsustainable",
- "unsubscribade", "unsubscribed",
- "unsubscribbed", "unsubscribe",
- "unsuccesfully", "unsuccessfully",
- "unsuccessfull", "unsuccessful",
- "unsucessfully", "unsuccessfully",
- "unsuprisingly", "unsurprisingly",
- "unsuprizingly", "unsurprisingly",
- "unsustainible", "unsustainable",
- "unsustianable", "unsustainable",
- "vertification", "certification",
- "villification", "vilification",
- "virualization", "visualization",
- "visualizacion", "visualization",
- "visualizaiton", "visualization",
- "visualizating", "visualization",
- "vitualization", "visualization",
- "vizualization", "visualization",
- "volounteering", "volunteering",
- "vulberability", "vulnerability",
- "vulernability", "vulnerability",
- "vulnarability", "vulnerability",
- "vulnerabiltiy", "vulnerability",
- "vulnurability", "vulnerability",
- "vunlerability", "vulnerability",
- "vurnerability", "vulnerability",
- "weightlfiting", "weightlifting",
- "weightlifitng", "weightlifting",
- "weightligting", "weightlifting",
- "weigthlifting", "weightlifting",
- "wholeheartdly", "wholeheartedly",
- "wholeheartedy", "wholeheartedly",
- "wholeheartely", "wholeheartedly",
- "wieghtlifting", "weightlifting",
- "abberivation", "abbreviation",
- "abberviation", "abbreviation",
- "abbreivation", "abbreviation",
- "abbreveation", "abbreviation",
- "abbrievation", "abbreviation",
- "abortificant", "abortifacient",
- "abrreviation", "abbreviation",
- "academcially", "academically",
- "accedentally", "accidentally",
- "accelarating", "accelerating",
- "accelaration", "acceleration",
- "acceleartion", "acceleration",
- "acceleraptor", "accelerator",
- "accelorating", "accelerating",
- "accessibilty", "accessibility",
- "accidentlaly", "accidently",
- "accomadating", "accommodating",
- "accomadation", "accommodation",
- "accomodating", "accommodating",
- "accomodation", "accommodation",
- "accrediation", "accreditation",
- "acculumation", "accumulation",
- "accumalation", "accumulation",
- "accumilation", "accumulation",
- "acedemically", "academically",
- "acheivements", "achievements",
- "acknolwedged", "acknowledged",
- "acknolwedges", "acknowledges",
- "acknoweldged", "acknowledged",
- "acknoweldges", "acknowledges",
- "acknowiedged", "acknowledged",
- "acknowladges", "acknowledges",
- "acknowldeged", "acknowledged",
- "acknowledget", "acknowledgement",
- "acknowleding", "acknowledging",
- "acknowlegded", "acknowledged",
- "acknowlegdes", "acknowledges",
- "ackumulation", "accumulation",
- "acquaintaces", "acquaintances",
- "acquaintence", "acquaintance",
- "acquantaince", "acquaintance",
- "acquantiance", "acquaintances",
- "acquiantance", "acquaintances",
- "acquiantence", "acquaintance",
- "adknowledged", "acknowledged",
- "adknowledges", "acknowledges",
- "administored", "administer",
- "adminsitered", "administered",
- "adminstrator", "administrator",
- "advantagious", "advantageous",
- "advantegeous", "advantageous",
- "adventageous", "advantageous",
- "adventureous", "adventures",
- "adventureres", "adventures",
- "adventurious", "adventurous",
- "adventuruous", "adventurous",
- "advertisiers", "advertisers",
- "advertisment", "advertisement",
- "advertisters", "advertisers",
- "advertisting", "advertising",
- "aestheticaly", "aesthetically",
- "aestheticlly", "aesthetically",
- "afficianados", "aficionados",
- "afficionados", "aficionados",
- "afghanisthan", "afghanistan",
- "afterhtought", "afterthought",
- "afterthougth", "afterthought",
- "aggressivley", "aggressively",
- "agircultural", "agricultural",
- "agknowledged", "acknowledged",
- "agnosticisim", "agnosticism",
- "agracultural", "agricultural",
- "agriculteral", "agricultural",
- "agriculteurs", "agriculture",
- "agricultrual", "agricultural",
- "agriculutral", "agricultural",
- "agrigultural", "agricultural",
- "agrocultural", "agricultural",
- "allegiancies", "allegiance",
- "alterantives", "alternatives",
- "alternatevly", "alternately",
- "alternatiely", "alternately",
- "alternatieve", "alternative",
- "alternativly", "alternatively",
- "alternativos", "alternatives",
- "alternatvely", "alternately",
- "alternitives", "alternatives",
- "altruistisch", "altruistic",
- "amendmenters", "amendments",
- "amohetamines", "amphetamines",
- "ampehtamines", "amphetamines",
- "ampethamines", "amphetamines",
- "amphatamines", "amphetamines",
- "amphedamines", "amphetamines",
- "amphetamenes", "amphetamines",
- "amphetemines", "amphetamines",
- "amphetimines", "amphetamines",
- "amphetmaines", "amphetamines",
- "anecdotallly", "anecdotally",
- "annhiliation", "annihilation",
- "annihalition", "annihilation",
- "annihilatron", "annihilation",
- "annihliation", "annihilation",
- "annilihation", "annihilation",
- "anniversairy", "anniversary",
- "anniversarry", "anniversary",
- "anniversiary", "anniversary",
- "annoucenment", "announcements",
- "annoucnement", "announcement",
- "announcemnet", "announcements",
- "announcemnts", "announcements",
- "anphetamines", "amphetamines",
- "ansalisation", "nasalisation",
- "ansalization", "nasalization",
- "antaganistic", "antagonistic",
- "antagonisitc", "antagonistic",
- "antagonostic", "antagonist",
- "antibioticos", "antibiotics",
- "anticiaption", "anticipation",
- "anticipacion", "anticipation",
- "antisipation", "anticipation",
- "antogonistic", "antagonistic",
- "antrhopology", "anthropology",
- "antrophology", "anthropology",
- "apllications", "applications",
- "apocalypitic", "apocalyptic",
- "apologistics", "apologists",
- "apologizeing", "apologizing",
- "apostrophied", "apostrophe",
- "apostrophies", "apostrophe",
- "apperciation", "appreciation",
- "applicaitons", "applications",
- "appoitnments", "appointments",
- "apporachable", "approachable",
- "appraochable", "approachable",
- "appreceating", "appreciating",
- "appreciaters", "appreciates",
- "appreciatied", "appreciative",
- "appreicating", "appreciating",
- "appreication", "appreciation",
- "appretiation", "appreciation",
- "appropriatin", "appropriation",
- "appropriatly", "appropriately",
- "appropriaton", "appropriation",
- "approprietly", "appropriately",
- "approstraphe", "apostrophe",
- "approxiately", "approximately",
- "approximatly", "approximately",
- "approximetly", "approximately",
- "aproximately", "approximately",
- "aqcuaintance", "acquaintance",
- "aqquaintance", "acquaintance",
- "arbitrariliy", "arbitrarily",
- "arbitrarilly", "arbitrarily",
- "archetecture", "architecture",
- "architechure", "architecture",
- "architectual", "architectural",
- "architectuur", "architecture",
- "architecutre", "architecture",
- "architexture", "architecture",
- "arcitechture", "architecture",
- "areodynamics", "aerodynamics",
- "argicultural", "agricultural",
- "argumentatie", "argumentative",
- "arithmetisch", "arithmetic",
- "armageddomon", "armageddon",
- "arrengements", "arrangements",
- "articifially", "artificially",
- "artificailly", "artificially",
- "artificiella", "artificial",
- "artificually", "artificially",
- "artifiically", "artificially",
- "assasination", "assassination",
- "assassinatin", "assassination",
- "assissinated", "assassinated",
- "associationg", "associating",
- "assoications", "associations",
- "assosiations", "associations",
- "assosication", "assassination",
- "assotiations", "associations",
- "assymetrical", "asymmetrical",
- "asthetically", "aesthetically",
- "astranomical", "astronomical",
- "astromonical", "astronomical",
- "astronautlis", "astronauts",
- "astronimical", "astronomical",
- "astronomicly", "astronomical",
- "athleticisim", "athleticism",
- "atmosphereic", "atmospheric",
- "audiobookmrs", "audiobooks",
- "auhtenticate", "authenticate",
- "australianas", "australians",
- "australianos", "australians",
- "authentisity", "authenticity",
- "authorithies", "authorities",
- "authoritiers", "authorities",
- "authorizaton", "authorization",
- "authrorities", "authorities",
- "autochtonous", "autochthonous",
- "autocorrrect", "autocorrect",
- "automobilies", "automobile",
- "automodertor", "automoderator",
- "automonomous", "autonomous",
- "auxilliaries", "auxiliaries",
- "avaliability", "availability",
- "avialability", "availability",
- "awknowledged", "acknowledged",
- "awknowledges", "acknowledges",
- "awkwardsness", "awkwardness",
- "babysittting", "babysitting",
- "beaurocratic", "bureaucratic",
- "beautifullly", "beautifully",
- "belligerante", "belligerent",
- "beuraucratic", "bureaucratic",
- "billionairre", "billionaire",
- "billionaries", "billionaires",
- "billioniares", "billionaires",
- "bioligically", "biologically",
- "birmingharam", "birmingham",
- "bittersweeet", "bittersweet",
- "blamethrower", "flamethrower",
- "blueberrries", "blueberries",
- "blueprintcss", "blueprints",
- "boardcasting", "broadcasting",
- "bobybuilding", "bodybuilding",
- "bodybuidling", "bodybuilding",
- "bodybuilidng", "bodybuilding",
- "bodybuliding", "bodybuilding",
- "bodydbuilder", "bodybuilder",
- "bombardement", "bombardment",
- "boradcasting", "broadcasting",
- "botivational", "motivational",
- "brainwahsing", "brainwashing",
- "brakethrough", "breakthrough",
- "braodcasting", "broadcasting",
- "brazilianese", "brazilians",
- "brazilianess", "brazilians",
- "breakthorugh", "breakthrough",
- "breaktrhough", "breakthrough",
- "breastfeedig", "breastfeeding",
- "breastfeeing", "breastfeeding",
- "breasttaking", "breathtaking",
- "brianwashing", "brainwashing",
- "broadcastors", "broadcasts",
- "brotherhoood", "brotherhood",
- "buearucratic", "bureaucratic",
- "bueraucratic", "bureaucratic",
- "bulletprooof", "bulletproof",
- "bureaocratic", "bureaucratic",
- "bureaucracie", "bureaucratic",
- "bureaucracts", "bureaucrats",
- "bureaucrates", "bureaucrats",
- "bureuacratic", "bureaucratic",
- "businessemen", "businessmen",
- "cababilities", "capabilities",
- "caclulations", "calculations",
- "calcluations", "calculation",
- "calcualtions", "calculations",
- "calculationg", "calculating",
- "calculatoare", "calculator",
- "californains", "californian",
- "californican", "californian",
- "californinan", "californian",
- "caluclations", "calculations",
- "camouflagued", "camouflage",
- "canceltation", "cancellation",
- "cannibalisim", "cannibalism",
- "canniballism", "cannibalism",
- "cannotations", "connotations",
- "capitalistes", "capitalists",
- "caracterized", "characterized",
- "carbohydrats", "carbohydrates",
- "carbohyrdate", "carbohydrates",
- "caricaturale", "caricature",
- "caricaturile", "caricature",
- "caricaturise", "caricature",
- "caricaturize", "caricature",
- "catastraphic", "catastrophic",
- "catastrohpic", "catastrophic",
- "catastrophie", "catastrophe",
- "categoricaly", "categorically",
- "categoriezed", "categorized",
- "catergorized", "categorized",
- "caterpillers", "caterpillars",
- "catestrophic", "catastrophic",
- "catholicisim", "catholicism",
- "catholocisim", "catholicism",
- "catistrophic", "catastrophic",
- "catostraphic", "catastrophic",
- "catostrophic", "catastrophic",
- "catterpilars", "caterpillars",
- "catterpillar", "caterpillar",
- "celebratings", "celebrations",
- "celebritites", "celebrities",
- "celibrations", "celebrations",
- "cententenial", "centennial",
- "cercumstance", "circumstance",
- "cerification", "verification",
- "certificiate", "certificate",
- "challengeing", "challenging",
- "chamiponship", "championships",
- "champinoship", "championships",
- "championchip", "championship",
- "championsihp", "championships",
- "championsips", "championships",
- "champiosnhip", "championships",
- "champoinship", "championship",
- "chanpionship", "championship",
- "charactarize", "characterize",
- "charaterized", "characterized",
- "charismastic", "charismatic",
- "cheerlearder", "cheerleader",
- "cheerleeders", "cheerleaders",
- "cheeseberger", "cheeseburger",
- "cheeseborger", "cheeseburger",
- "cheesebruger", "cheeseburgers",
- "cheeseburges", "cheeseburgers",
- "cheeseburgie", "cheeseburger",
- "cheezeburger", "cheeseburger",
- "chirstianity", "christianity",
- "chocolateers", "chocolates",
- "chrisitanity", "christianity",
- "christainity", "christianity",
- "christiantiy", "christianity",
- "christinaity", "christianity",
- "chromosomers", "chromosomes",
- "chronologial", "chronological",
- "chrsitianity", "christianity",
- "cilivization", "civilizations",
- "circulatiing", "circulating",
- "circulationg", "circulating",
- "circumcisied", "circumcised",
- "circumcition", "circumcision",
- "circumsicion", "circumcision",
- "circumsision", "circumcision",
- "circumsition", "circumcision",
- "circumsizion", "circumcision",
- "circumstanes", "circumstance",
- "circumstanta", "circumstantial",
- "circumstante", "circumstance",
- "circuncision", "circumcision",
- "circunstance", "circumstance",
- "civiliaztion", "civilizations",
- "civilizacion", "civilization",
- "civilizaiton", "civilization",
- "civilizatoin", "civilizations",
- "civilizatons", "civilizations",
- "civilziation", "civilizations",
- "civizilation", "civilizations",
- "claculations", "calculations",
- "classificato", "classification",
- "cockroachers", "cockroaches",
- "coefficienct", "coefficient",
- "coencidental", "coincidental",
- "coincedental", "coincidental",
- "coincidencal", "coincidental",
- "coincidentia", "coincidental",
- "coindidental", "coincidental",
- "coinsidental", "coincidental",
- "cointerpoint", "counterpoint",
- "collaberator", "collaborate",
- "collaboratie", "collaborate",
- "collaboratin", "collaboration",
- "collectivily", "collectively",
- "collectivley", "collectively",
- "colonialisim", "colonialism",
- "colonizacion", "colonization",
- "colonizators", "colonizers",
- "colonozation", "colonization",
- "combanations", "combinations",
- "combonations", "combinations",
- "comdemnation", "condemnation",
- "comemmorates", "commemorates",
- "comemoretion", "commemoration",
- "comeptitions", "competitions",
- "comfirmation", "confirmation",
- "comfortabley", "comfortably",
- "comfortablly", "comfortably",
- "comissioning", "commissioning",
- "commandemnts", "commandment",
- "commandmants", "commandments",
- "commandmends", "commandments",
- "commemmorate", "commemorate",
- "commendments", "commandments",
- "commenteries", "commenters",
- "commenwealth", "commonwealth",
- "commerciales", "commercials",
- "commerically", "commercially",
- "comminicated", "communicated",
- "commishioned", "commissioned",
- "commishioner", "commissioner",
- "commisioning", "commissioning",
- "commissionar", "commissioner",
- "commissionor", "commissioner",
- "committments", "commitments",
- "commoditites", "commodities",
- "commomwealth", "commonwealth",
- "commonhealth", "commonwealth",
- "commonweatlh", "commonwealth",
- "commonwelath", "commonwealth",
- "communciated", "communicated",
- "communiation", "communication",
- "communicatie", "communicate",
- "communicatin", "communications",
- "communicaton", "communication",
- "communitites", "communities",
- "compansating", "compensating",
- "compansation", "compensation",
- "comparativly", "comparatively",
- "comparisions", "comparisons",
- "comparission", "comparisons",
- "comparissons", "comparisons",
- "compatablity", "compatibility",
- "compatibiliy", "compatibility",
- "compatibilty", "compatibility",
- "compatiblity", "compatibility",
- "compensacion", "compensation",
- "compensative", "compensate",
- "compesitions", "compositions",
- "competetions", "competitions",
- "competitevly", "competitively",
- "competitiion", "competition",
- "competitiors", "competitors",
- "competitivly", "competitively",
- "competitivos", "competitions",
- "compinsating", "compensating",
- "compinsation", "compensation",
- "complainging", "complaining",
- "completetion", "completion",
- "compliations", "compilation",
- "complicacion", "complication",
- "complicatied", "complicate",
- "complicaties", "complicate",
- "complicatred", "complicate",
- "complicatted", "complicate",
- "complilation", "complication",
- "complimation", "complication",
- "complimenary", "complimentary",
- "complimentje", "complimented",
- "complimentry", "complimentary",
- "complination", "complication",
- "complitation", "complication",
- "composistion", "compositions",
- "compramising", "compromising",
- "compremising", "compromising",
- "compresssion", "compression",
- "compromissen", "compromise",
- "compromisses", "compromises",
- "compromizing", "compromising",
- "compromosing", "compromising",
- "comptability", "compatibility",
- "compulsivley", "compulsive",
- "compulsorary", "compulsory",
- "computarized", "computerized",
- "comrpomising", "compromising",
- "comtaminated", "contaminated",
- "comtemporary", "contemporary",
- "conbinations", "combinations",
- "concatinated", "contaminated",
- "conceivabley", "conceivably",
- "concellation", "cancellation",
- "concentraded", "concentrated",
- "concentraing", "concentrating",
- "concentraion", "concentration",
- "concentrarte", "concentrate",
- "concentratie", "concentrate",
- "concentratin", "concentration",
- "concequences", "consequences",
- "concequently", "consequently",
- "concersation", "conservation",
- "concervation", "conservation",
- "concervatism", "conservatism",
- "concervative", "conservative",
- "conciderable", "considerable",
- "conciderably", "considerably",
- "conciousness", "consciousness",
- "conclusiones", "conclusions",
- "conclusivley", "conclusive",
- "condamnation", "condemnation",
- "condemantion", "condemnation",
- "condenmation", "condemnation",
- "condescening", "condescending",
- "condescenion", "condescension",
- "conditionnal", "conditional",
- "conditionned", "conditioned",
- "conditionner", "conditioner",
- "condmenation", "condemnation",
- "condolencies", "condolences",
- "condolensces", "condolences",
- "condomnation", "condemnation",
- "condradicted", "contradicted",
- "conenctivity", "connectivity",
- "confedential", "confidential",
- "confederancy", "confederacy",
- "confederatie", "confederate",
- "confermation", "confirmation",
- "confersation", "conservation",
- "confessionis", "confessions",
- "confidencial", "confidential",
- "confidentail", "confidential",
- "confidentaly", "confidently",
- "confidentely", "confidently",
- "confidentiel", "confidential",
- "configuratin", "configurations",
- "configuraton", "configuration",
- "confirmacion", "confirmation",
- "confrimation", "confirmation",
- "confrontaion", "confrontation",
- "congegration", "congregation",
- "congergation", "congregation",
- "congradulate", "congratulate",
- "congragation", "congregation",
- "congragulate", "congratulate",
- "congratualte", "congratulate",
- "congregacion", "congregation",
- "congresional", "congressional",
- "congresssman", "congressman",
- "congresssmen", "congressmen",
- "congretation", "congregation",
- "congrigation", "congregation",
- "conicidental", "coincidental",
- "connatations", "connotations",
- "connecticuit", "connecticut",
- "connectivety", "connectivity",
- "connetations", "connotations",
- "connitations", "connotations",
- "connonations", "connotations",
- "conolization", "colonization",
- "conpensating", "compensating",
- "conpensation", "compensation",
- "conpetitions", "competitions",
- "conplimented", "complimented",
- "conpromising", "compromising",
- "consciouness", "consciousness",
- "consciouslly", "consciously",
- "consectutive", "consecutive",
- "consecuences", "consequences",
- "consecuentes", "consequences",
- "consecuently", "consequently",
- "consensuarlo", "consensual",
- "consentrated", "concentrated",
- "consentrates", "concentrates",
- "conseqeunces", "consequence",
- "consequenses", "consequences",
- "consequental", "consequently",
- "consequneces", "consequence",
- "conservacion", "conservation",
- "conservaties", "conservatives",
- "conservativo", "conservation",
- "conservativs", "conservatism",
- "conservitave", "conservatives",
- "conservitism", "conservatism",
- "conservitive", "conservative",
- "considerarle", "considerable",
- "considerarte", "considerate",
- "consideraste", "considerate",
- "consideratie", "considerate",
- "consideratin", "considerations",
- "consideribly", "considerably",
- "consilidated", "consolidated",
- "consipracies", "conspiracies",
- "consiquently", "consequently",
- "consistantly", "consistently",
- "consistencey", "consistency",
- "consistentcy", "consistently",
- "consitutents", "constituents",
- "consoldiated", "consolidated",
- "consolitated", "consolidate",
- "consolodated", "consolidated",
- "consoltation", "consultation",
- "conspericies", "conspiracies",
- "conspiracize", "conspiracies",
- "conspiriator", "conspirator",
- "conspiricies", "conspiracies",
- "conspriacies", "conspiracies",
- "consqeuences", "consequence",
- "constinually", "continually",
- "constitition", "constitution",
- "constituante", "constituents",
- "constituants", "constituents",
- "constituates", "constitutes",
- "constitucion", "constitution",
- "constituient", "constitute",
- "constituinte", "constituents",
- "constitutiei", "constitute",
- "constitutues", "constitute",
- "constiutents", "constituents",
- "constracting", "constructing",
- "constraction", "construction",
- "constrainsts", "constraints",
- "construccion", "construction",
- "construciton", "construction",
- "constructeds", "constructs",
- "constructief", "constructive",
- "constructies", "constructs",
- "constructifs", "constructs",
- "constructiin", "constructing",
- "constructivo", "construction",
- "consturction", "construction",
- "consultating", "consultation",
- "consumerisim", "consumerism",
- "contaiminate", "contaminate",
- "contaminatie", "contaminated",
- "contaminaton", "contamination",
- "contaminents", "containment",
- "contamporary", "contemporary",
- "contanimated", "contaminated",
- "contaniments", "containment",
- "contemperary", "contemporary",
- "contemporany", "contemporary",
- "continentais", "continents",
- "continential", "continental",
- "contineously", "continuously",
- "continiously", "continuously",
- "continuacion", "continuation",
- "continuating", "continuation",
- "continuativo", "continuation",
- "continuining", "continuing",
- "contirbution", "contribution",
- "contirbutors", "contributors",
- "contiunation", "continuation",
- "contrabution", "contribution",
- "contraceptie", "contraceptives",
- "contradicing", "contradicting",
- "contradicion", "contradiction",
- "contradicory", "contradictory",
- "contradictie", "contradicted",
- "contradictin", "contradiction",
- "contradicton", "contradiction",
- "contraticted", "contradicted",
- "contribucion", "contribution",
- "contribuitor", "contributor",
- "contributers", "contributors",
- "contributivo", "contribution",
- "contributons", "contributors",
- "contrictions", "contractions",
- "contridicted", "contradicted",
- "controlleras", "controllers",
- "controlllers", "controllers",
- "controverial", "controversial",
- "controveries", "controversies",
- "controversal", "controversial",
- "controversey", "controversy",
- "contructions", "contractions",
- "conveinently", "conveniently",
- "convencional", "conventional",
- "conveniantly", "conveniently",
- "converastion", "conversations",
- "converdation", "conservation",
- "conversacion", "conversation",
- "conversaiton", "conversations",
- "conversatino", "conservation",
- "conversatism", "conservatism",
- "conversatoin", "conversations",
- "conversiones", "conversions",
- "converstaion", "conversation",
- "convertables", "convertibles",
- "convertiable", "convertible",
- "convertibile", "convertible",
- "convervation", "conservation",
- "convervatism", "conservatism",
- "converzation", "conservation",
- "convesration", "conservation",
- "convienently", "conveniently",
- "convorsation", "conversation",
- "convseration", "conservation",
- "coordenation", "coordination",
- "coordiantion", "coordination",
- "coordinacion", "coordination",
- "coordinaters", "coordinates",
- "coordinatior", "coordinator",
- "coordinatore", "coordinate",
- "coordonation", "coordination",
- "cooridnation", "coordination",
- "coorperation", "cooperation",
- "coprorations", "corporations",
- "corinthianos", "corinthians",
- "corinthinans", "corinthians",
- "corparations", "corporations",
- "corperations", "corporations",
- "corporativos", "corporations",
- "corproations", "corporations",
- "corrdination", "coordination",
- "correponding", "corresponding",
- "correposding", "corresponding",
- "correspondes", "corresponds",
- "correspondig", "corresponding",
- "corresponing", "corresponding",
- "corrisponded", "corresponded",
- "costomizable", "customizable",
- "costumizable", "customizable",
- "councidental", "coincidental",
- "counsellling", "counselling",
- "counterfiets", "counterfeit",
- "counterfited", "counterfeit",
- "counterracts", "counterparts",
- "countertraps", "counterparts",
- "countrywides", "countryside",
- "coutnerparts", "counterparts",
- "coutnerpoint", "counterpoint",
- "covnersation", "conservation",
- "crankenstein", "frankenstein",
- "creationisim", "creationism",
- "creationnism", "creationism",
- "creationnist", "creationist",
- "creationsism", "creationism",
- "creationsist", "creationist",
- "creationsits", "creationists",
- "credibillity", "credibility",
- "crigneworthy", "cringeworthy",
- "cringewhorty", "cringeworthy",
- "cringeworhty", "cringeworthy",
- "cringewrothy", "cringeworthy",
- "cringyworthy", "cringeworthy",
- "criticallity", "critically",
- "criticiszing", "criticising",
- "croporations", "corporations",
- "crucifiction", "crucifixion",
- "cuestionable", "questionable",
- "culiminating", "culminating",
- "cumulatative", "cumulative",
- "cuntaminated", "contaminated",
- "curcumcision", "circumcision",
- "curcumstance", "circumstance",
- "custamizable", "customizable",
- "custimizable", "customizable",
- "customizaton", "customization",
- "customizeble", "customizable",
- "customizible", "customizable",
- "custumizable", "customizable",
- "cuztomizable", "customizable",
- "dabilitating", "debilitating",
- "dangerousely", "dangerously",
- "decensitized", "desensitized",
- "deceptionist", "receptionist",
- "declareation", "declaration",
- "decomposeion", "decomposition",
- "decomposited", "decomposed",
- "decscription", "description",
- "deffensively", "defensively",
- "deficiancies", "deficiencies",
- "deficiencias", "deficiencies",
- "deficiensies", "deficiencies",
- "definatively", "definitively",
- "defininitely", "definitively",
- "definitavely", "definitively",
- "definitevely", "definitively",
- "definitifely", "definitively",
- "definitinely", "definitively",
- "definititely", "definitively",
- "definitivley", "definitively",
- "deinitalized", "deinitialized",
- "deinitalizes", "deinitializes",
- "delibaretely", "deliberately",
- "deliberatley", "deliberately",
- "delibirately", "deliberately",
- "delibitating", "debilitating",
- "deliverately", "deliberately",
- "delusionally", "delusively",
- "demesticated", "domesticated",
- "democracries", "democracies",
- "democraphics", "demographics",
- "democratisch", "democratic",
- "demograhpics", "demographics",
- "demogrpahics", "demographics",
- "demonination", "denominations",
- "demonstarted", "demonstrated",
- "demonstartes", "demonstrates",
- "demonstrabil", "demonstrably",
- "demonstraion", "demonstration",
- "demonstraits", "demonstrates",
- "demonstrants", "demonstrates",
- "demonstratie", "demonstrate",
- "demonstratin", "demonstration",
- "demonstrerat", "demonstrate",
- "demosntrably", "demonstrably",
- "demosntrated", "demonstrated",
- "demosntrates", "demonstrates",
- "demostration", "demonstration",
- "denomenation", "denomination",
- "denominacion", "denomination",
- "denominatior", "denominator",
- "denominatons", "denominations",
- "denomonation", "denomination",
- "deomgraphics", "demographics",
- "depencencies", "dependencies",
- "dependancies", "dependencies",
- "dependencias", "dependencies",
- "dependenices", "dependencies",
- "dependensies", "dependencies",
- "deperecation", "deprecation",
- "deplacements", "replacements",
- "deregualtion", "deregulation",
- "deregulaiton", "deregulation",
- "derugulation", "deregulation",
- "describtions", "descriptions",
- "descriminant", "discriminant",
- "descriptivos", "descriptions",
- "desctiptions", "descriptions",
- "desctruction", "destruction",
- "desencitized", "desensitized",
- "desensatized", "desensitized",
- "desensitived", "desensitized",
- "desentisized", "desensitized",
- "desentitized", "desensitized",
- "desentizised", "desensitized",
- "desginations", "destinations",
- "desgustingly", "disgustingly",
- "desitnations", "destinations",
- "despectively", "respectively",
- "despensaries", "dispensaries",
- "desperatedly", "desperately",
- "desperatelly", "desperately",
- "desqualified", "disqualified",
- "desregarding", "disregarding",
- "dessertation", "dissertation",
- "destiantions", "destinations",
- "destinctions", "destinations",
- "destractions", "distractions",
- "destributors", "distributors",
- "determinanti", "determination",
- "determinaton", "determination",
- "determinging", "determining",
- "determinisic", "deterministic",
- "determinisim", "determinism",
- "deterministc", "deterministic",
- "determinitic", "deterministic",
- "detrimential", "detrimental",
- "developement", "development",
- "developmenet", "developments",
- "develpoments", "developments",
- "devolopement", "development",
- "devolopments", "developments",
- "diasspointed", "dissapointed",
- "dicitonaries", "dictionaries",
- "dictadorship", "dictatorship",
- "dictarorship", "dictatorship",
- "dictatorshop", "dictatorship",
- "dictionaires", "dictionaries",
- "didsapointed", "dissapointed",
- "differencial", "differential",
- "differencies", "differences",
- "differentate", "differentiate",
- "differnetial", "differential",
- "difficulites", "difficulties",
- "difficutlies", "difficulties",
- "diffuculties", "difficulties",
- "dimensionals", "dimensions",
- "dimensionnal", "dimensional",
- "dimensionsal", "dimensional",
- "diplomatisch", "diplomatic",
- "directionnal", "directional",
- "disaapointed", "dissapointed",
- "disadvandage", "disadvantaged",
- "disadvantged", "disadvantaged",
- "disadvantges", "disadvantages",
- "disadvatange", "disadvantage",
- "disadventage", "disadvantage",
- "disagremeent", "disagreements",
- "disapointing", "disappointing",
- "disappearnce", "disappearance",
- "disappearred", "disappeared",
- "disapperaing", "disappearing",
- "disaspointed", "dissapointed",
- "disastisfied", "dissatisfied",
- "disatissfied", "dissatisfied",
- "disatvantage", "disadvantage",
- "discertation", "dissertation",
- "disciniplary", "disciplinary",
- "disciplanary", "disciplinary",
- "disciplenary", "disciplinary",
- "disciplinare", "discipline",
- "disciplinera", "disciplinary",
- "disciplinery", "disciplinary",
- "disclipinary", "disciplinary",
- "disconencted", "disconnected",
- "disconnectes", "disconnects",
- "disconnectme", "disconnected",
- "disconnectus", "disconnects",
- "discontiuned", "discontinued",
- "discountined", "discontinued",
- "discreditied", "discredited",
- "discreditted", "discredited",
- "discriminare", "discriminate",
- "discriminted", "discriminated",
- "disctinction", "distinction",
- "disctinctive", "distinctive",
- "disctintions", "distinctions",
- "discualified", "disqualified",
- "discustingly", "disgustingly",
- "disemination", "dissemination",
- "disenchanged", "disenchanted",
- "disengenuous", "disingenuous",
- "disenginuous", "disingenuous",
- "disensitized", "desensitized",
- "disgareement", "disagreements",
- "disgruntaled", "disgruntled",
- "disgrunteled", "disgruntled",
- "disguntingly", "disgustingly",
- "disingeneous", "disingenuous",
- "disingenious", "disingenuous",
- "disinteresed", "disinterested",
- "disintereted", "disinterested",
- "dismantleing", "dismantling",
- "disobediance", "disobedience",
- "disobeidence", "disobedience",
- "dispalcement", "displacement",
- "dispapointed", "dissapointed",
- "dispencaries", "dispensaries",
- "dispensaires", "dispensaries",
- "dispensarios", "dispensaries",
- "dispensiries", "dispensaries",
- "dispensories", "dispensaries",
- "disqaulified", "disqualified",
- "disqualifyed", "disqualified",
- "disqustingly", "disgustingly",
- "disrecpected", "disrespected",
- "disrepsected", "disrespected",
- "disresepcted", "disrespected",
- "disrespecful", "disrespectful",
- "disrespecing", "disrespecting",
- "disrespectul", "disrespectful",
- "disrespekted", "disrespected",
- "disrtibution", "distributions",
- "dissapearing", "disappearing",
- "dissapionted", "dissapointed",
- "dissapoimted", "dissapointed",
- "dissapoitned", "dissapointed",
- "dissaponited", "dissapointed",
- "dissapoonted", "dissapointed",
- "dissapounted", "dissapointed",
- "dissappinted", "dissapointed",
- "dissapponted", "dissapointed",
- "dissastified", "dissatisfied",
- "dissatisifed", "dissatisfied",
- "dissatsified", "dissatisfied",
- "dissepointed", "dissapointed",
- "dissipointed", "dissapointed",
- "dissobediant", "disobedient",
- "dissobedient", "disobedient",
- "dissopointed", "dissapointed",
- "disspaointed", "dissapointed",
- "dissppointed", "dissapointed",
- "dissspointed", "dissapointed",
- "distinations", "distinctions",
- "distincitons", "distinctions",
- "distingished", "distinguished",
- "distingishes", "distinguishes",
- "distinguised", "distinguished",
- "distirbuting", "distributing",
- "distirbution", "distribution",
- "distrabution", "distribution",
- "distribitors", "distributors",
- "distribtuion", "distributions",
- "distribucion", "distribution",
- "distribuited", "distributed",
- "distribuiton", "distributions",
- "distribuitor", "distributor",
- "distribusion", "distributions",
- "distributino", "distributions",
- "distributior", "distributor",
- "distributons", "distributors",
- "distributore", "distribute",
- "distriubtion", "distributions",
- "distrobution", "distribution",
- "distrubances", "disturbance",
- "distrubiting", "distributing",
- "distrubition", "distribution",
- "distrubitors", "distributors",
- "distrubution", "distribution",
- "distrubutors", "distributors",
- "distructions", "distractions",
- "distustingly", "disgustingly",
- "ditactorship", "dictatorship",
- "documenation", "documentation",
- "documentaion", "documentation",
- "documentaire", "documentaries",
- "documentarse", "documentaries",
- "documentarsi", "documentaries",
- "domesitcated", "domesticated",
- "domisticated", "domesticated",
- "donesticated", "domesticated",
- "donwloadable", "downloadable",
- "dossapointed", "dissapointed",
- "downlaodable", "downloadable",
- "downloadbale", "downloadable",
- "downloadeble", "downloadable",
- "drankenstein", "frankenstein",
- "dublications", "publications",
- "dusgustingly", "disgustingly",
- "dynamicallly", "dynamically",
- "dyregulation", "deregulation",
- "earthquackes", "earthquakes",
- "earthquakers", "earthquakes",
- "econimically", "economically",
- "economisesti", "economists",
- "educationnal", "educational",
- "effectionate", "affectionate",
- "effectivelly", "effectively",
- "effectivenss", "effectiveness",
- "efficienctly", "efficiency",
- "effordlessly", "effortlessly",
- "ejacualtions", "ejaculation",
- "electorlytes", "electrolytes",
- "electricrain", "electrician",
- "electrictian", "electrician",
- "electrobytes", "electrolytes",
- "electrocytes", "electrolytes",
- "electrolites", "electrolytes",
- "electroltyes", "electrolytes",
- "electronicas", "electronics",
- "electronicos", "electronics",
- "electroyltes", "electrolytes",
- "elektrolytes", "electrolytes",
- "eloctrolytes", "electrolytes",
- "embarassment", "embarrassment",
- "embarasssing", "embarassing",
- "embarrasment", "embarrassment",
- "embarressing", "embarrassing",
- "embarrissing", "embarrassing",
- "emberrassing", "embarrassing",
- "emphetamines", "amphetamines",
- "emprisonment", "imprisonment",
- "encarcerated", "incarcerated",
- "enceclopedia", "encyclopedia",
- "enchancement", "enhancement",
- "enchancments", "enchantments",
- "enchantmants", "enchantments",
- "enchentments", "enchantments",
- "enciclopedia", "encyclopedia",
- "enclycopedia", "encyclopedia",
- "encorporated", "incorporated",
- "encourageing", "encouraging",
- "encyclapedia", "encyclopedia",
- "encyclepedia", "encyclopedia",
- "encyclopadia", "encyclopedia",
- "encyclopeida", "encyclopedia",
- "encyclopidia", "encyclopedia",
- "encycolpedia", "encyclopedia",
- "encyklopedia", "encyclopedia",
- "encylcopedia", "encyclopedia",
- "encyplopedia", "encyclopedia",
- "endoresments", "endorsement",
- "enemployment", "unemployment",
- "enfringement", "infringement",
- "enlightended", "enlightened",
- "enlightenend", "enlightened",
- "enlightented", "enlightened",
- "enlightining", "enlightening",
- "enligthening", "enlightening",
- "entaglements", "entanglements",
- "entartaining", "entertaining",
- "enterpreneur", "entrepreneurs",
- "enterprenuer", "entrepreneur",
- "entertainted", "entertained",
- "enthusiaists", "enthusiasts",
- "enthusuastic", "enthusiastic",
- "entoxication", "intoxication",
- "entrepeneurs", "entrepreneurs",
- "entreperneur", "entrepreneurs",
- "entreprenaur", "entrepreneur",
- "entrepreners", "entrepreneurs",
- "entrepreneus", "entrepreneurs",
- "entreprenour", "entrepreneur",
- "entreprenure", "entrepreneurs",
- "entreprenurs", "entrepreneurs",
- "entrepreuner", "entrepreneurs",
- "entretaining", "entertaining",
- "enviormental", "environmental",
- "enviornments", "environments",
- "enviromental", "environmental",
- "environemnts", "environments",
- "environmentl", "environmentally",
- "environmetal", "environmental",
- "envrionments", "environments",
- "establishmet", "establishments",
- "evelutionary", "evolutionary",
- "exagerrating", "exaggerating",
- "exaggarating", "exaggerating",
- "exaggaration", "exaggeration",
- "exaggeratted", "exaggerated",
- "exaggurating", "exaggerating",
- "exagguration", "exaggeration",
- "exceptionaly", "exceptionally",
- "exceptionnal", "exceptional",
- "exclusiveity", "exclusivity",
- "exclusivelly", "exclusively",
- "exclusivitiy", "exclusivity",
- "excorciating", "excruciating",
- "excrusiating", "excruciating",
- "excurciating", "excruciating",
- "exectuioners", "executioner",
- "executioneer", "executioner",
- "executionees", "executions",
- "executioness", "executions",
- "executionier", "executioner",
- "executionner", "executioner",
- "exeggerating", "exaggerating",
- "exeggeration", "exaggeration",
- "expeditonary", "expeditionary",
- "expendatures", "expenditures",
- "expendetures", "expenditures",
- "expentitures", "expenditures",
- "experamental", "experimental",
- "expereincing", "experiencing",
- "experemental", "experimental",
- "experiancing", "experiencing",
- "experiemntal", "experimental",
- "experiemnted", "experimented",
- "experimantal", "experimental",
- "experimentan", "experimentation",
- "experimentes", "experiments",
- "experimentle", "experimented",
- "experimentos", "experiments",
- "experimentul", "experimental",
- "expidentures", "expenditures",
- "expierencing", "experiencing",
- "expiremental", "experimental",
- "expiremented", "experimented",
- "explaination", "explanation",
- "explenations", "explanations",
- "expliotation", "exploitation",
- "exploitaiton", "exploitation",
- "exploitating", "exploitation",
- "exploititive", "exploitative",
- "explortation", "exploitation",
- "explotiation", "exploitation",
- "explotiative", "exploitative",
- "expolitation", "exploitation",
- "expolitative", "exploitative",
- "exponentialy", "exponentially",
- "expropiation", "expropriation",
- "extensivelly", "extensively",
- "extradiction", "extradition",
- "extraordiary", "extraordinary",
- "extraordinay", "extraordinary",
- "extrapolerat", "extrapolate",
- "extrapoloate", "extrapolate",
- "extremistisk", "extremists",
- "extrordinary", "extraordinary",
- "extruciating", "excruciating",
- "facilitatile", "facilitate",
- "fahrenheight", "fahrenheit",
- "falmethrower", "flamethrower",
- "familiarlize", "familiarize",
- "fanslaughter", "manslaughter",
- "fantasticaly", "fantastically",
- "fantasticlly", "fantastically",
- "fashionalble", "fashionable",
- "fermantation", "fermentation",
- "fermentacion", "fermentation",
- "fermentaiton", "fermentation",
- "fermentating", "fermentation",
- "fermintation", "fermentation",
- "fictionaries", "dictionaries",
- "figuartively", "figuratively",
- "figuratevely", "figuratively",
- "figurativley", "figuratively",
- "figuretively", "figuratively",
- "figuritively", "figuratively",
- "fingerpoints", "fingerprints",
- "firefigthers", "firefighters",
- "flamethorwer", "flamethrower",
- "flametrhower", "flamethrower",
- "flanethrower", "flamethrower",
- "flexibillity", "flexibility",
- "flourishment", "flourishing",
- "fluctiations", "fluctuations",
- "flucutations", "fluctuations",
- "fluxtuations", "fluctuations",
- "forgivenness", "forgiveness",
- "fortunatelly", "fortunately",
- "framethrower", "flamethrower",
- "frankenstain", "frankenstein",
- "frankensteen", "frankenstein",
- "frankenstine", "frankenstein",
- "frankinstein", "frankenstein",
- "frementation", "fermentation",
- "friendzonded", "friendzoned",
- "friendzonned", "friendzoned",
- "friendzowned", "friendzoned",
- "fringeworthy", "cringeworthy",
- "fronkenstein", "frankenstein",
- "fruitsations", "frustrations",
- "frustrastion", "frustrations",
- "fucntionally", "functionally",
- "funcitonally", "functionally",
- "functionable", "functional",
- "functionaliy", "functionally",
- "functionalty", "functionality",
- "functionlity", "functionality",
- "functionning", "functioning",
- "fundamentais", "fundamentals",
- "fundamentalt", "fundamentalist",
- "fundamentaly", "fundamentally",
- "fundemantals", "fundamentals",
- "fundementals", "fundamentals",
- "fundimentals", "fundamentals",
- "furstrations", "frustrations",
- "futuristisch", "futuristic",
- "fwankenstein", "frankenstein",
- "geneological", "genealogical",
- "generacional", "generational",
- "generalizare", "generalize",
- "generalizate", "generalize",
- "generelizing", "generalizing",
- "geograhpical", "geographical",
- "geographicly", "geographical",
- "geographisch", "geographic",
- "geogrpahical", "geographical",
- "goegraphical", "geographical",
- "governemntal", "governmental",
- "governmently", "governmental",
- "grammaticaal", "grammatical",
- "grammaticaly", "grammatically",
- "grandchilden", "grandchildren",
- "grandchilder", "grandchildren",
- "grandchilren", "grandchildren",
- "grassrooters", "grassroots",
- "gringeworthy", "cringeworthy",
- "guantanameow", "guantanamo",
- "guantanamero", "guantanamo",
- "hallucinatin", "hallucinations",
- "hallucinaton", "hallucination",
- "handwritting", "handwriting",
- "harrassments", "harassments",
- "headqaurters", "headquarters",
- "headquatered", "headquartered",
- "healthercare", "healthcare",
- "heavywieghts", "heavyweight",
- "helicopteros", "helicopters",
- "hererosexual", "heterosexual",
- "heretosexual", "heterosexual",
- "heteresexual", "heterosexual",
- "hetreosexual", "heterosexual",
- "highligthing", "highlighting",
- "hipocritical", "hypocritical",
- "hipothetical", "hypothetical",
- "histarically", "historically",
- "histerically", "historically",
- "historicians", "historians",
- "homogeneized", "homogenized",
- "homogenenous", "homogeneous",
- "homosexuales", "homosexuals",
- "homosexualiy", "homosexuality",
- "homosexualls", "homosexuals",
- "homosexualty", "homosexuality",
- "homosexuella", "homosexual",
- "hopsitalized", "hospitalized",
- "horisontally", "horizontally",
- "horizantally", "horizontally",
- "horiztonally", "horizontally",
- "horozontally", "horizontally",
- "hospitallity", "hospitality",
- "hospitilized", "hospitalized",
- "hospitolized", "hospitalized",
- "hosptialized", "hospitalized",
- "humanitarien", "humanitarian",
- "humanitarion", "humanitarian",
- "humanitatian", "humanitarian",
- "humaniterian", "humanitarian",
- "humantiarian", "humanitarian",
- "huminatarian", "humanitarian",
- "hurricanefps", "hurricanes",
- "hyopthetical", "hypothetical",
- "hypathetical", "hypothetical",
- "hypertrophey", "hypertrophy",
- "hypethetical", "hypothetical",
- "hypocrticial", "hypocritical",
- "hypocrytical", "hypocritical",
- "hypotehtical", "hypothetical",
- "hypotethical", "hypothetical",
- "hypotherical", "hypothetical",
- "hypotheticly", "hypothetical",
- "hystarically", "hysterically",
- "hystorically", "hysterically",
- "idealistisch", "idealistic",
- "identificato", "identification",
- "identifierad", "identified",
- "identifieras", "identifies",
- "identifyable", "identifiable",
- "ideologicaly", "ideologically",
- "idiosyncracy", "idiosyncrasy",
- "illegetimate", "illegitimate",
- "illegitamate", "illegitimate",
- "illegitamite", "illegitimate",
- "illegitemate", "illegitimate",
- "illegitimite", "illegitimate",
- "illigetimate", "illegitimate",
- "illigitemate", "illegitimate",
- "illistration", "illustration",
- "illsutration", "illustrations",
- "illustartion", "illustration",
- "illustraitor", "illustrator",
- "illustraties", "illustrate",
- "illustratior", "illustrator",
- "imcompatible", "incompatible",
- "imcompetence", "incompetence",
- "imexperience", "inexperience",
- "immediatelly", "immediately",
- "immortallity", "immortality",
- "imperialfist", "imperialist",
- "imperialisim", "imperialism",
- "imperialstic", "imperialist",
- "implamenting", "implementing",
- "implausibile", "implausible",
- "implecations", "implications",
- "implementase", "implements",
- "implementasi", "implements",
- "implementato", "implementation",
- "implentation", "implementation",
- "implimenting", "implementing",
- "imporvements", "improvements",
- "impossibilty", "impossibility",
- "impossiblely", "impossibly",
- "impossiblity", "impossibly",
- "impovershied", "impoverished",
- "impoversihed", "impoverished",
- "imprefection", "imperfections",
- "improsonment", "imprisonment",
- "improviserad", "improvised",
- "imrpovements", "improvements",
- "imtimidating", "intimidating",
- "imtimidation", "intimidation",
- "inaccesibles", "inaccessible",
- "inaccessable", "inaccessible",
- "inaccessbile", "inaccessible",
- "inaccurasies", "inaccuracies",
- "inaccuraties", "inaccuracies",
- "inaccuricies", "inaccuracies",
- "inacuraccies", "inaccuracies",
- "inadvertenly", "inadvertently",
- "inappropiate", "inappropriate",
- "inapproprate", "inappropriate",
- "inappropriae", "inappropriately",
- "inappropriet", "inappropriately",
- "inattractive", "unattractive",
- "inbelievable", "unbelievable",
- "incarcelated", "incarcerated",
- "incarcirated", "incarcerated",
- "incarserated", "incarcerated",
- "incedentally", "incidentally",
- "incentiveise", "incentives",
- "incestigator", "investigator",
- "incomaptible", "incompatible",
- "incomparible", "incompatible",
- "incompatable", "incompatible",
- "incompatibil", "incompatible",
- "incompetance", "incompetence",
- "incompetente", "incompetence",
- "incompitable", "incompatible",
- "incomptetent", "incompetent",
- "inconcistent", "inconsistent",
- "inconsistant", "inconsistent",
- "inconsistecy", "inconsistency",
- "inconsisteny", "inconsistency",
- "inconveinent", "inconvenient",
- "inconveniant", "inconvenient",
- "inconveniece", "inconvenience",
- "inconvenince", "inconvenience",
- "inconvienent", "inconvenient",
- "incorparated", "incorporated",
- "incorperated", "incorporated",
- "incorportaed", "incorporated",
- "incorportate", "incorporate",
- "incrediblely", "incredibly",
- "incrementers", "increments",
- "incremential", "incremental",
- "indefinately", "indefinitely",
- "indefineable", "undefinable",
- "indefinetely", "indefinitely",
- "indefinitive", "indefinite",
- "indefinitley", "indefinitely",
- "indefintiely", "indefinitely",
- "indepedantly", "independently",
- "indepencence", "independence",
- "independance", "independence",
- "independante", "independents",
- "independenet", "independents",
- "independenly", "independently",
- "independense", "independents",
- "independente", "independence",
- "independetly", "independently",
- "indepentents", "independents",
- "indetifiable", "identifiable",
- "indianaoplis", "indianapolis",
- "indianopolis", "indianapolis",
- "indicentally", "incidentally",
- "indifferance", "indifference",
- "indifferente", "indifference",
- "indiffernece", "indifference",
- "indimidating", "intimidating",
- "indimidation", "intimidation",
- "indipendence", "independence",
- "indisputible", "indisputable",
- "indisputibly", "indisputably",
- "individuales", "individuals",
- "individualty", "individuality",
- "individuella", "individual",
- "indiviudally", "individually",
- "indivudually", "individually",
- "indpendently", "independently",
- "indroduction", "introduction",
- "indroductory", "introductory",
- "industriella", "industrial",
- "industrijske", "industries",
- "inefficienct", "inefficient",
- "inefficienty", "inefficiently",
- "inevitablely", "inevitably",
- "inevitablity", "inevitably",
- "inevititably", "inevitably",
- "inexblicably", "inexplicably",
- "inexpectedly", "unexpectedly",
- "inexpereince", "inexperience",
- "inexperiance", "inexperience",
- "inexperieced", "inexperienced",
- "inexperiened", "inexperienced",
- "inexperiente", "inexperience",
- "inexpierence", "inexperienced",
- "inexplicabil", "inexplicably",
- "inexplicibly", "inexplicably",
- "infalability", "infallibility",
- "infilitrated", "infiltrated",
- "infiltraitor", "infiltrator",
- "infiltratior", "infiltrator",
- "infiltratred", "infiltrate",
- "influenceing", "influencing",
- "infogrpahics", "infographic",
- "inforgivable", "unforgivable",
- "infrantryman", "infantryman",
- "infridgement", "infringement",
- "infrignement", "infringement",
- "ingestigator", "investigator",
- "ingredientes", "ingredients",
- "ingreediants", "ingredients",
- "ininterested", "uninterested",
- "initalizable", "initializable",
- "inkompatible", "incompatible",
- "inkompetence", "incompetence",
- "inkonsistent", "inconsistent",
- "inlightening", "enlightening",
- "innersection", "intersection",
- "innerstellar", "interstellar",
- "inpenetrable", "impenetrable",
- "inplementing", "implementing",
- "inplications", "implications",
- "inpoverished", "impoverished",
- "inprisonment", "imprisonment",
- "inproductive", "unproductive",
- "inprovements", "improvements",
- "inresponsive", "unresponsive",
- "insentivised", "insensitive",
- "insentivises", "insensitive",
- "insignifiant", "insignificant",
- "insignificat", "insignificant",
- "insinuationg", "insinuating",
- "instabillity", "instability",
- "instalaltion", "installations",
- "installatons", "installations",
- "installatron", "installation",
- "instantaneos", "instantaneous",
- "instantaneus", "instantaneous",
- "instantanous", "instantaneous",
- "instinctivly", "instinctively",
- "institutuion", "institution",
- "instramental", "instrumental",
- "instrcutions", "instruction",
- "instrucitons", "instruction",
- "instructiosn", "instruction",
- "instructores", "instructors",
- "instrumentos", "instruments",
- "instrumentul", "instrumental",
- "insturmental", "instrumental",
- "instutitions", "institutions",
- "insuccessful", "unsuccessful",
- "insufficiant", "insufficient",
- "insuffucient", "insufficient",
- "insuspecting", "unsuspecting",
- "intaxication", "intoxication",
- "intelelctual", "intellectuals",
- "intellectals", "intellectuals",
- "intellectaul", "intellectuals",
- "intellectuel", "intellectual",
- "intellecutal", "intellectual",
- "intelligance", "intelligence",
- "intelligenly", "intelligently",
- "intelligente", "intelligence",
- "intelligenty", "intelligently",
- "intelligient", "intelligent",
- "intenational", "international",
- "intentionnal", "intentional",
- "intepretator", "interpretor",
- "interatellar", "interstellar",
- "interational", "international",
- "intercection", "interception",
- "intercepcion", "interception",
- "interceptons", "interceptions",
- "intereaction", "intersection",
- "interections", "interactions",
- "interersting", "interpreting",
- "interesction", "intersection",
- "interestigly", "interestingly",
- "interestinly", "interestingly",
- "interferance", "interference",
- "interfereing", "interfering",
- "interferisce", "interferes",
- "interferisse", "interferes",
- "interferring", "interfering",
- "intergration", "integration",
- "interlectual", "intellectual",
- "intermediare", "intermediate",
- "intermediete", "intermediate",
- "intermettent", "intermittent",
- "intermideate", "intermediate",
- "intermidiate", "intermediate",
- "internatinal", "international",
- "internationl", "international",
- "internations", "interactions",
- "internediate", "intermediate",
- "internelized", "internalized",
- "internilized", "internalized",
- "interperters", "interpreter",
- "interperting", "interpreting",
- "interprating", "interpreting",
- "interpretare", "interpreter",
- "interpretato", "interpretation",
- "interpreteer", "interpreter",
- "interpretier", "interpreter",
- "interpretion", "interpreting",
- "interpretter", "interpreter",
- "interpriting", "interpreting",
- "interraccial", "interracial",
- "interractial", "interracial",
- "interrogatin", "interrogation",
- "interrumping", "interrupting",
- "interrupteds", "interrupts",
- "interruptors", "interrupts",
- "interseccion", "intersection",
- "interseciton", "intersections",
- "interseption", "interception",
- "intersetllar", "interstellar",
- "interstallar", "interstellar",
- "interstaller", "interstellar",
- "intersteller", "interstellar",
- "interstellor", "interstellar",
- "intertaining", "entertaining",
- "intertwinded", "intertwined",
- "intertwinned", "intertwined",
- "interveiwing", "interviewing",
- "intervencion", "intervention",
- "interveneing", "intervening",
- "intervension", "intervention",
- "interviening", "interviewing",
- "intidimation", "intimidation",
- "intillectual", "intellectual",
- "intimidacion", "intimidation",
- "intimidative", "intimidate",
- "intimitading", "intimidating",
- "intimitating", "intimidating",
- "intimitation", "intimidation",
- "intorduction", "introduction",
- "intorductory", "introductory",
- "intoxicacion", "intoxication",
- "intoxination", "intoxication",
- "intrepreting", "interpreting",
- "intrinsicaly", "intrinsically",
- "introdiction", "introduction",
- "introduccion", "introduction",
- "introduceras", "introduces",
- "introduceres", "introduces",
- "introduciton", "introduction",
- "introductary", "introductory",
- "introducting", "introduction",
- "introductury", "introductory",
- "introduktion", "introduction",
- "introspectin", "introspection",
- "intruduction", "introduction",
- "intruductory", "introductory",
- "intsrumental", "instrumental",
- "intuitivelly", "intuitively",
- "inturrupting", "interrupting",
- "invervention", "intervention",
- "investagated", "investigated",
- "investagator", "investigator",
- "investegated", "investigated",
- "investegator", "investigator",
- "investigaron", "investigator",
- "investigater", "investigator",
- "investigatie", "investigative",
- "investigatin", "investigation",
- "investigatio", "investigator",
- "investigaton", "investigation",
- "investingate", "investigate",
- "investogator", "investigator",
- "invicibility", "invisibility",
- "invididually", "individually",
- "invisibiltiy", "invisibility",
- "invisilibity", "invisibility",
- "invisivility", "invisibility",
- "invlunerable", "invulnerable",
- "involnerable", "invulnerable",
- "involuntairy", "involuntary",
- "involuntarly", "involuntary",
- "invonvenient", "inconvenient",
- "invulenrable", "invulnerable",
- "invulernable", "invulnerable",
- "invulnarable", "invulnerable",
- "invulnerbale", "invulnerable",
- "invulnurable", "invulnerable",
- "invulverable", "invulnerable",
- "invunlerable", "invulnerable",
- "invurnerable", "invulnerable",
- "irrationably", "irrationally",
- "irrationatly", "irrationally",
- "irrationella", "irrational",
- "irreplacable", "irreplaceable",
- "irresistable", "irresistible",
- "irresistably", "irresistibly",
- "irrespecitve", "irrespective",
- "irresponsble", "irresponsible",
- "irresponsibe", "irresponsible",
- "irreverisble", "irreversible",
- "irreversebly", "irreversible",
- "irreversibel", "irreversible",
- "irrevirsible", "irreversible",
- "irrispective", "irrespective",
- "irriversible", "irreversible",
- "isdefinitely", "indefinitely",
- "isntallation", "installation",
- "isntrumental", "instrumental",
- "jackonsville", "jacksonville",
- "jounralistic", "journalistic",
- "jouranlistic", "journalistic",
- "journalisitc", "journalistic",
- "journalistes", "journalists",
- "judgementals", "judgements",
- "juggernaunts", "juggernaut",
- "juridisction", "jurisdictions",
- "jurisdiccion", "jurisdiction",
- "jurisdiciton", "jurisdiction",
- "jurisdiktion", "jurisdiction",
- "jurisfiction", "jurisdiction",
- "jurisidction", "jurisdiction",
- "juristiction", "jurisdiction",
- "jursidiction", "jurisdiction",
- "jusridiction", "jurisdiction",
- "justificatin", "justifications",
- "katastrophic", "catastrophic",
- "kidnergarten", "kindergarten",
- "kindergarden", "kindergarten",
- "kingergarten", "kindergarten",
- "kintergarten", "kindergarten",
- "knolwedgable", "knowledgable",
- "knoweldgable", "knowledgable",
- "knowladgable", "knowledgable",
- "knowldegable", "knowledgable",
- "knowldgeable", "knowledgable",
- "knowleagable", "knowledgable",
- "knowledagble", "knowledgable",
- "knowledeable", "knowledgable",
- "knowledgabel", "knowledgable",
- "knowledgeble", "knowledgeable",
- "knowledgebly", "knowledgable",
- "knowledgible", "knowledgable",
- "knowlegdable", "knowledgable",
- "knowlegeable", "knowledgeable",
- "knwoledgable", "knowledgable",
- "kolonization", "colonization",
- "kombinations", "combinations",
- "kommissioner", "commissioner",
- "kompensation", "compensation",
- "konfidential", "confidential",
- "konfirmation", "confirmation",
- "kongregation", "congregation",
- "konservatism", "conservatism",
- "konservative", "conservative",
- "konsultation", "consultation",
- "konversation", "conversation",
- "koordination", "coordination",
- "krankenstein", "frankenstein",
- "leaglization", "legalization",
- "legalizacion", "legalization",
- "legalizaiton", "legalization",
- "legendariske", "legendaries",
- "legimitately", "legitimately",
- "legislatiors", "legislators",
- "legistration", "registration",
- "legitamately", "legitimately",
- "legitamitely", "legitimately",
- "legitemately", "legitimately",
- "legitimatley", "legitimately",
- "legitimitely", "legitimately",
- "liberatrians", "libertarians",
- "libertarains", "libertarians",
- "libertariens", "libertarians",
- "libertaryans", "libertarians",
- "libertatians", "libertarians",
- "liberterians", "libertarians",
- "libretarians", "libertarians",
- "lighthearded", "lighthearted",
- "linguisticas", "linguistics",
- "linguisticos", "linguistics",
- "linguistisch", "linguistics",
- "litllefinger", "littlefinger",
- "littelfinger", "littlefinger",
- "litterfinger", "littlefinger",
- "littiefinger", "littlefinger",
- "littlefigner", "littlefinger",
- "littlefinder", "littlefinger",
- "littlepinger", "littlefinger",
- "lnowledgable", "knowledgable",
- "longitudonal", "longitudinal",
- "madturbating", "masturbating",
- "madturbation", "masturbation",
- "magnificient", "magnificent",
- "maintainance", "maintenance",
- "maintainence", "maintenance",
- "maintenaince", "maintenance",
- "malfucntions", "malfunction",
- "manafactured", "manufactured",
- "manafacturer", "manufacturer",
- "manafactures", "manufactures",
- "manifactured", "manufactured",
- "manifacturer", "manufacturer",
- "manifactures", "manufactures",
- "manifestaion", "manifestation",
- "manifestanti", "manifestation",
- "manipluating", "manipulating",
- "manipluation", "manipulation",
- "manipualting", "manipulating",
- "manipualtion", "manipulation",
- "manipualtive", "manipulative",
- "manipulacion", "manipulation",
- "manipulitive", "manipulative",
- "maniuplating", "manipulating",
- "maniuplation", "manipulation",
- "maniuplative", "manipulative",
- "manouverable", "maneuverable",
- "mansalughter", "manslaughter",
- "manslaugther", "manslaughter",
- "mansluaghter", "manslaughter",
- "manufactered", "manufactured",
- "manufacterer", "manufacturer",
- "manufacteres", "manufactures",
- "manufacteurs", "manufactures",
- "manufactored", "manufactured",
- "manufactorer", "manufacturer",
- "manufactores", "manufactures",
- "manufactuers", "manufacturers",
- "manufactuing", "manufacturing",
- "manufacturas", "manufactures",
- "manufacturor", "manufacturer",
- "manufactuter", "manufacture",
- "manufacuters", "manufactures",
- "manufacutred", "manufacture",
- "manufacutres", "manufactures",
- "manufaturing", "manufacturing",
- "manupilating", "manipulating",
- "manupulating", "manipulating",
- "manupulation", "manipulation",
- "manupulative", "manipulative",
- "marchmallows", "marshmallows",
- "marganilized", "marginalized",
- "margenalized", "marginalized",
- "marginilized", "marginalized",
- "marhsmallows", "marshmallows",
- "marshamllows", "marshmallows",
- "marshmallons", "marshmallows",
- "masoginistic", "misogynistic",
- "masogynistic", "misogynistic",
- "massachusets", "massachusetts",
- "massachustts", "massachusetts",
- "masterbation", "masturbation",
- "masterpeices", "masterpiece",
- "mastrubating", "masturbating",
- "mastrubation", "masturbation",
- "mastubration", "masturbation",
- "masturabting", "masturbating",
- "masturabtion", "masturbation",
- "masturbacion", "masturbation",
- "masturbaited", "masturbated",
- "masturbathon", "masturbation",
- "masturbsting", "masturbating",
- "masturdating", "masturbating",
- "mastutbation", "masturbation",
- "mataphorical", "metaphorical",
- "mataphysical", "metaphysical",
- "matchmakeing", "matchmaking",
- "mathemathics", "mathematics",
- "mathematican", "mathematician",
- "mathematicas", "mathematics",
- "mathematicks", "mathematics",
- "mathematicly", "mathematical",
- "mathematisch", "mathematics",
- "mathemetical", "mathematical",
- "matheticians", "mathematicians",
- "mathimatical", "mathematical",
- "mathmatician", "mathematician",
- "mecahnically", "mechanically",
- "mechancially", "mechanically",
- "meditaciones", "medications",
- "mediteranean", "mediterranean",
- "mediterraean", "mediterranean",
- "mediterranen", "mediterranean",
- "memerization", "memorization",
- "memorizacion", "memorization",
- "memorozation", "memorization",
- "metalurgical", "metallurgical",
- "metaphisical", "metaphysical",
- "metaphoricly", "metaphorical",
- "metaphsyical", "metaphysical",
- "metaphyiscal", "metaphysical",
- "metaphyscial", "metaphysical",
- "metaphysisch", "metaphysics",
- "metephorical", "metaphorical",
- "metephysical", "metaphysical",
- "meterologist", "meteorologist",
- "meterosexual", "heterosexual",
- "methaporical", "metaphorical",
- "methematical", "mathematical",
- "metiphorical", "metaphorical",
- "metophorical", "metaphorical",
- "metorpolitan", "metropolitan",
- "metrololitan", "metropolitan",
- "metropilitan", "metropolitan",
- "metroploitan", "metropolitan",
- "metropolians", "metropolis",
- "metropoliten", "metropolitan",
- "metropolitin", "metropolitan",
- "metropoliton", "metropolitan",
- "microcentres", "microcenter",
- "microphonies", "microphones",
- "microscophic", "microscopic",
- "microscopice", "microscope",
- "microscoptic", "microscopic",
- "midfieldiers", "midfielders",
- "millenialism", "millennialism",
- "millionairre", "millionaire",
- "millionaries", "millionaires",
- "millioniares", "millionaires",
- "minimalisitc", "minimalist",
- "minimalisity", "minimalist",
- "mininterpret", "misinterpret",
- "minipulating", "manipulating",
- "minipulation", "manipulation",
- "minipulative", "manipulative",
- "miracilously", "miraculously",
- "miracurously", "miraculous",
- "miscarraiges", "miscarriage",
- "miscelaneous", "miscellaneous",
- "miscellanous", "miscellaneous",
- "mischievious", "mischievous",
- "misdameanors", "misdemeanors",
- "misdeamenors", "misdemeanor",
- "misfourtunes", "misfortunes",
- "misgoynistic", "misogynistic",
- "misinterpert", "misinterpret",
- "misinterpred", "misinterpreted",
- "misinterprit", "misinterpreting",
- "misinterpted", "misinterpret",
- "misintrepret", "misinterpret",
- "misisonaries", "missionaries",
- "misoganistic", "misogynistic",
- "misogenistic", "misogynistic",
- "misoginystic", "misogynistic",
- "misognyistic", "misogynistic",
- "misogonistic", "misogynistic",
- "misogynisitc", "misogynistic",
- "misogynsitic", "misogynistic",
- "misogynystic", "misogynistic",
- "missionaires", "missionaries",
- "mississipppi", "mississippi",
- "misspellling", "misspelling",
- "misteriously", "mysteriously",
- "misundersood", "misunderstood",
- "misunderstod", "misunderstood",
- "misygonistic", "misogynistic",
- "modificacion", "modification",
- "modificaiton", "modification",
- "modificatons", "modifications",
- "modifikation", "modification",
- "modivational", "motivational",
- "moisterizing", "moisturizing",
- "moistorizing", "moisturizing",
- "moisutrizing", "moisturizing",
- "momentarilly", "momentarily",
- "monolithisch", "monolithic",
- "mositurizing", "moisturizing",
- "motherbaords", "motherboards",
- "motherborads", "motherboards",
- "motivacional", "motivational",
- "motovational", "motivational",
- "mousturizing", "moisturizing",
- "muktitasking", "multitasking",
- "mulittasking", "multitasking",
- "multinatinal", "multinational",
- "multitaksing", "multitasking",
- "munipulative", "manipulative",
- "mutlitasking", "multitasking",
- "mysoganistic", "misogynistic",
- "mysogenistic", "misogynistic",
- "mysogonistic", "misogynistic",
- "mysterioulsy", "mysteriously",
- "nacionalists", "nationalists",
- "narcisisstic", "narcissistic",
- "narcissictic", "narcissistic",
- "narcissisism", "narcissism",
- "narcissisist", "narcissist",
- "narcissisitc", "narcissist",
- "narcississts", "narcissist",
- "narssicistic", "narcissistic",
- "natioanlists", "nationalists",
- "nationalisic", "nationalistic",
- "nationalisim", "nationalism",
- "nationalistc", "nationalistic",
- "nationalites", "nationalist",
- "nationalitic", "nationalistic",
- "nationalitys", "nationalist",
- "nationallity", "nationally",
- "nationalsits", "nationalists",
- "nationalties", "nationalist",
- "nazionalists", "nationalists",
- "neccessarily", "necessarily",
- "neccessities", "necessities",
- "necessarilly", "necessarily",
- "necessitites", "necessities",
- "neckbearders", "neckbeards",
- "neckbeardese", "neckbeards",
- "neckbeardest", "neckbeards",
- "neckbeardies", "neckbeards",
- "neckbeardius", "neckbeards",
- "negociations", "negotiations",
- "negoitations", "negotiations",
- "negotiatians", "negotiations",
- "negotiatiing", "negotiating",
- "negotiationg", "negotiating",
- "negotiatiors", "negotiations",
- "neigbhorhood", "neighborhoods",
- "neigbourhood", "neighbourhood",
- "neighboorhod", "neighbourhood",
- "neighborhing", "neighboring",
- "neighborhods", "neighborhoods",
- "neighbourghs", "neighbours",
- "neighbourhod", "neighbourhood",
- "neighbourood", "neighbourhood",
- "neighbrohood", "neighborhoods",
- "neighourhood", "neighborhood",
- "neoroscience", "neuroscience",
- "neruological", "neurological",
- "neruoscience", "neuroscience",
- "netropolitan", "metropolitan",
- "neuorscience", "neuroscience",
- "neuralogical", "neurological",
- "neuroligical", "neurological",
- "neurosceince", "neuroscience",
- "neuroscienze", "neuroscience",
- "neurosicence", "neuroscience",
- "neverhteless", "nevertheless",
- "nieghborhood", "neighborhood",
- "norhtwestern", "northwestern",
- "nothingsness", "nothingness",
- "noticeablely", "noticeably",
- "notificacion", "notification",
- "notificaiton", "notification",
- "notificatons", "notifications",
- "nuerological", "neurological",
- "nueroscience", "neuroscience",
- "nutritionnal", "nutritional",
- "obersvations", "observations",
- "objectivelly", "objectively",
- "objectiviser", "objectives",
- "objectivitiy", "objectivity",
- "obversations", "observations",
- "ocassionally", "occasionally",
- "occaisonally", "occasionally",
- "occasioanlly", "occasionally",
- "occassionaly", "occasionally",
- "occationally", "occasionally",
- "occurrencies", "occurrences",
- "offensivelly", "offensively",
- "ogranisation", "organisation",
- "omniverously", "omnivorously",
- "operationnal", "operational",
- "opportuniste", "opportunities",
- "opportunites", "opportunities",
- "oppositition", "opposition",
- "opthalmology", "ophthalmology",
- "optimistisch", "optimistic",
- "optimizacion", "optimization",
- "optimizating", "optimization",
- "optimziation", "optimization",
- "optmizations", "optimizations",
- "oragnisation", "organisation",
- "orchastrated", "orchestrated",
- "orchestarted", "orchestrated",
- "orchestraded", "orchestrated",
- "orchistrated", "orchestrated",
- "orgainsation", "organisation",
- "orgainzation", "organizations",
- "organisaiton", "organisation",
- "organisatons", "organisations",
- "organistaion", "organisation",
- "organizacion", "organization",
- "organizaiton", "organization",
- "organizativo", "organization",
- "organizatons", "organizations",
- "organsiation", "organisation",
- "organziation", "organization",
- "orginasation", "organisation",
- "orginazation", "organization",
- "orgnaisation", "organisations",
- "originallity", "originality",
- "outraegously", "outrageously",
- "outrageoulsy", "outrageously",
- "outragesouly", "outrageously",
- "outrageuosly", "outrageously",
- "outragiously", "outrageously",
- "outsourceing", "outsourcing",
- "overbearring", "overbearing",
- "overblocking", "overclocking",
- "overclcoking", "overclocking",
- "overclicking", "overclocking",
- "overcloaking", "overclocking",
- "overclockign", "overclocking",
- "overclokcing", "overclocking",
- "overhearting", "overreacting",
- "overheathing", "overheating",
- "overhtinking", "overthinking",
- "overhwelming", "overwhelming",
- "overlappping", "overlapping",
- "overlcocking", "overclocking",
- "overreaktion", "overreaction",
- "overwealming", "overwhelming",
- "overwhelemed", "overwhelmed",
- "overwhemling", "overwhelming",
- "overwhleming", "overwhelming",
- "owerpowering", "overpowering",
- "painkilllers", "painkillers",
- "palastinians", "palestinians",
- "palesitnians", "palestinians",
- "palestenians", "palestinians",
- "palestinains", "palestinians",
- "palestiniens", "palestinians",
- "palestininan", "palestinian",
- "palestininas", "palestinians",
- "palistinians", "palestinians",
- "palythroughs", "playthroughs",
- "parapharsing", "paraphrasing",
- "paraphenalia", "paraphernalia",
- "paraphrashed", "paraphrase",
- "paraphrazing", "paraphrasing",
- "paraprashing", "paraphrasing",
- "paraprhasing", "paraphrasing",
- "parenthesees", "parentheses",
- "parenthesies", "parenthesis",
- "parliamentry", "parliamentary",
- "partecipants", "participants",
- "partecipated", "participated",
- "parternships", "partnership",
- "particapated", "participated",
- "particiapnts", "participant",
- "particiapted", "participated",
- "participante", "participate",
- "participaste", "participants",
- "participatie", "participated",
- "participatin", "participation",
- "participatns", "participant",
- "participaton", "participant",
- "participents", "participants",
- "particualrly", "particularly",
- "particulalry", "particularly",
- "particullary", "particularly",
- "passionatley", "passionately",
- "pathalogical", "pathological",
- "pathelogical", "pathological",
- "patholigical", "pathological",
- "paychedelics", "psychedelics",
- "paychiatrist", "psychiatrist",
- "paychologist", "psychologist",
- "paychopathic", "psychopathic",
- "penetratiing", "penetrating",
- "penisylvania", "pennsylvania",
- "pennsilvania", "pennsylvania",
- "pennslyvania", "pennsylvania",
- "pennsylvaina", "pennsylvania",
- "pennsyvlania", "pennsylvania",
- "pennyslvania", "pennsylvania",
- "penssylvania", "pennsylvania",
- "pentsylvania", "pennsylvania",
- "percentagens", "percentages",
- "perferential", "preferential",
- "performantes", "performances",
- "performences", "performances",
- "perfromances", "performances",
- "peridoically", "periodically",
- "peripathetic", "peripatetic",
- "periphereals", "peripherals",
- "peripherials", "peripherals",
- "permanantely", "permanently",
- "permanentely", "permanently",
- "permissiable", "permissible",
- "peroidically", "periodically",
- "perpatrators", "perpetrators",
- "perpatuating", "perpetuating",
- "perpertators", "perpetrators",
- "perpertrated", "perpetrated",
- "perpetraitor", "perpetrator",
- "perpetraters", "perpetrators",
- "perpetuaters", "perpetuates",
- "perpitrators", "perpetrators",
- "perposefully", "purposefully",
- "perposterous", "preposterous",
- "perpretators", "perpetrators",
- "perpsectives", "perspectives",
- "perputrators", "perpetrators",
- "perputuating", "perpetuating",
- "persepctives", "perspectives",
- "perservation", "preservation",
- "perseverence", "perseverance",
- "personalites", "personalities",
- "personallity", "personally",
- "personilized", "personalized",
- "perspecitves", "perspectives",
- "perspectivas", "perspectives",
- "persumptuous", "presumptuous",
- "perticularly", "particularly",
- "pertubations", "perturbations",
- "pessimisitic", "pessimistic",
- "pessimisstic", "pessimistic",
- "phenomenonal", "phenomenal",
- "phenomenonly", "phenomenally",
- "phenomonenon", "phenomenon",
- "phialdelphia", "philadelphia",
- "philadalphia", "philadelphia",
- "philadelhpia", "philadelphia",
- "philadeplhia", "philadelphia",
- "philadlephia", "philadelphia",
- "philedalphia", "philadelphia",
- "philedelphia", "philadelphia",
- "philidalphia", "philadelphia",
- "philippinnes", "philippines",
- "philippinoes", "philippines",
- "philisophers", "philosophers",
- "philisophies", "philosophies",
- "phillippines", "philippines",
- "philosiphers", "philosophers",
- "philosiphies", "philosophies",
- "philosohpers", "philosopher",
- "philosohpies", "philosophies",
- "philosophiae", "philosophies",
- "philosophics", "philosophies",
- "philosophios", "philosophies",
- "philospohers", "philosophers",
- "philospohies", "philosophies",
- "photagrapher", "photographer",
- "photochopped", "photoshopped",
- "photograhper", "photographer",
- "photograpers", "photographers",
- "photographes", "photographs",
- "photographyi", "photographic",
- "photogropher", "photographer",
- "photogrpahed", "photographed",
- "photogrpaher", "photographer",
- "photoshipped", "photoshopped",
- "photoshooped", "photoshopped",
- "photoshoppad", "photoshopped",
- "phychedelics", "psychedelics",
- "phychiatrist", "psychiatrist",
- "phychologist", "psychologist",
- "phychopathic", "psychopathic",
- "physcedelics", "psychedelics",
- "physciatrist", "psychiatrist",
- "physcologist", "psychologist",
- "physcopathic", "psychopathic",
- "physicallity", "physically",
- "physiologial", "physiological",
- "pilgrimmages", "pilgrimages",
- "pitchforkers", "pitchforks",
- "pkaythroughs", "playthroughs",
- "plabeswalker", "planeswalker",
- "plaestinians", "palestinians",
- "planeswaller", "planeswalker",
- "planeswlaker", "planeswalker",
- "planetwalker", "planeswalker",
- "plansewalker", "planeswalker",
- "plauthroughs", "playthroughs",
- "playhtroughs", "playthroughs",
- "playtgroughs", "playthroughs",
- "playthorughs", "playthroughs",
- "playthourghs", "playthroughs",
- "playthrougth", "playthroughs",
- "playthrouhgs", "playthroughs",
- "playthtoughs", "playthroughs",
- "playtrhoughs", "playthroughs",
- "populationes", "populations",
- "pornograpghy", "pornography",
- "porportional", "proportional",
- "portabillity", "portability",
- "portagonists", "protagonists",
- "positionning", "positioning",
- "positivitely", "positivity",
- "possessivize", "possessive",
- "possibillity", "possibility",
- "possiblility", "possibility",
- "possiblities", "possibilities",
- "powerfisting", "powerlifting",
- "powerlfiting", "powerlifting",
- "powerlifitng", "powerlifting",
- "powerlisting", "powerlifting",
- "powetlifting", "powerlifting",
- "powrrlifting", "powerlifting",
- "practicioner", "practitioner",
- "practisioner", "practitioner",
- "pratictioner", "practitioners",
- "precedessors", "predecessors",
- "preconveived", "preconceived",
- "predacessors", "predecessors",
- "predeccesors", "predecessor",
- "predecesores", "predecessor",
- "predescesors", "predecessors",
- "predessecors", "predecessors",
- "predetermind", "predetermined",
- "predicessors", "predecessors",
- "predocessors", "predecessors",
- "predomiantly", "predominately",
- "predominanty", "predominantly",
- "predominatly", "predominantly",
- "preferantial", "preferential",
- "preferentail", "preferential",
- "preformances", "performances",
- "preinitalize", "preinitialize",
- "preliminarly", "preliminary",
- "prematurelly", "prematurely",
- "premillenial", "premillennial",
- "preocupation", "preoccupation",
- "preperations", "preparations",
- "prepetrators", "perpetrators",
- "prepetuating", "perpetuating",
- "prepostorous", "preposterous",
- "preposturous", "preposterous",
- "prerequisets", "prerequisite",
- "prescirption", "prescriptions",
- "prescribtion", "prescription",
- "prescripcion", "prescription",
- "prescriptons", "prescriptions",
- "prescritpion", "prescriptions",
- "presedential", "presidential",
- "presentacion", "presentation",
- "presentaiton", "presentations",
- "preservacion", "preservation",
- "preservating", "preservation",
- "preservativo", "preservation",
- "presidencial", "presidential",
- "presidenital", "presidential",
- "presidentail", "presidential",
- "presnetation", "presentations",
- "presonalized", "personalized",
- "prespectives", "perspectives",
- "presrciption", "prescriptions",
- "presumpteous", "presumptuous",
- "presumputous", "presumptuous",
- "prevantative", "preventative",
- "preventation", "presentation",
- "preventetive", "preventative",
- "preventitive", "preventative",
- "prezidential", "presidential",
- "principlaity", "principality",
- "probabiliste", "probabilities",
- "probabilites", "probabilities",
- "probabillity", "probability",
- "probablistic", "probabilistic",
- "proclomation", "proclamation",
- "proconceived", "preconceived",
- "profesisonal", "professionals",
- "professiinal", "professionalism",
- "professioanl", "professionals",
- "professiomal", "professionalism",
- "professionel", "professional",
- "professionsl", "professionalism",
- "professoinal", "professionals",
- "professonial", "professionals",
- "proffesional", "professional",
- "proficientcy", "proficiency",
- "profissional", "professional",
- "profitabiliy", "profitability",
- "profitabilty", "profitability",
- "profressions", "progressions",
- "progatonists", "protagonists",
- "programmeurs", "programmer",
- "progressieve", "progressive",
- "progressioin", "progressions",
- "progressiong", "progressing",
- "progressisme", "progresses",
- "progressiste", "progresses",
- "progressivas", "progressives",
- "progressivey", "progressively",
- "progressivly", "progressively",
- "progressivsm", "progressives",
- "progresssing", "progressing",
- "progresssion", "progressions",
- "progresssive", "progressives",
- "prohibitting", "prohibiting",
- "projecticles", "projectiles",
- "proletariaat", "proletariat",
- "proletariant", "proletariat",
- "proletaricat", "proletariat",
- "prominantely", "prominently",
- "promiscuious", "promiscuous",
- "promisculous", "promiscuous",
- "promotionnal", "promotional",
- "pronounceing", "pronouncing",
- "pronunciaton", "pronunciation",
- "propertional", "proportional",
- "propesterous", "preposterous",
- "proportianal", "proportional",
- "proportionel", "proportional",
- "proposterous", "preposterous",
- "proprotional", "proportional",
- "prostetution", "prostitution",
- "prostitition", "prostitution",
- "prostitucion", "prostitution",
- "prostituiton", "prostitution",
- "prostitutiei", "prostitute",
- "protaganists", "protagonists",
- "protaginists", "protagonists",
- "protagnoists", "protagonists",
- "protestantes", "protestants",
- "protoganists", "protagonists",
- "prouncements", "pronouncements",
- "pruposefully", "purposefully",
- "pscyhologist", "psychologist",
- "pscyhopathic", "psychopathic",
- "pshyciatrist", "psychiatrist",
- "pshycologist", "psychologist",
- "pshycopathic", "psychopathic",
- "psichologist", "psychologist",
- "psychaitrist", "psychiatrist",
- "psychedellic", "psychedelic",
- "psychedilics", "psychedelics",
- "psychemedics", "psychedelics",
- "psychiatirst", "psychiatrists",
- "psychiatrics", "psychiatrist",
- "psychiatrict", "psychiatrist",
- "psychiatrits", "psychiatrists",
- "psychistrist", "psychiatrist",
- "psychodelics", "psychedelics",
- "psycholigist", "psychologist",
- "psychologial", "psychological",
- "psychologits", "psychologists",
- "psychologyst", "psychologist",
- "psychopathes", "psychopaths",
- "psychyatrist", "psychiatrist",
- "puplications", "publications",
- "puritannical", "puritanical",
- "purpetrators", "perpetrators",
- "purpetuating", "perpetuating",
- "purpusefully", "purposefully",
- "pyschedelics", "psychedelics",
- "pyschiatrist", "psychiatrist",
- "pyschologist", "psychologist",
- "pyschopathic", "psychopathic",
- "qualificaton", "qualification",
- "qualifierais", "qualifiers",
- "qualtitative", "quantitative",
- "quantatitive", "quantitative",
- "quantititive", "quantitative",
- "quarterblack", "quarterback",
- "quesitonable", "questionable",
- "questionalbe", "questionable",
- "questionning", "questioning",
- "questionsign", "questioning",
- "radioactieve", "radioactive",
- "rationallity", "rationally",
- "reactionairy", "reactionary",
- "reactionnary", "reactionary",
- "realisticaly", "realistically",
- "realisticlly", "realistically",
- "reasonablely", "reasonably",
- "recallection", "recollection",
- "reccomending", "recommending",
- "reccommended", "recommended",
- "recepcionist", "receptionist",
- "receptionest", "receptionist",
- "recgonizable", "recognizable",
- "reciporcated", "reciprocate",
- "reciprociate", "reciprocate",
- "reciprocrate", "reciprocate",
- "recognizible", "recognizable",
- "recolleciton", "recollection",
- "recommanding", "recommending",
- "recommendeds", "recommends",
- "recommendors", "recommends",
- "recommeneded", "recommended",
- "recommenting", "recommending",
- "recongizable", "recognizable",
- "recontructed", "reconstructed",
- "recpetionist", "receptionist",
- "recreacional", "recreational",
- "recriational", "recreational",
- "referenceing", "referencing",
- "refirgerator", "refrigerator",
- "refriderator", "refrigerator",
- "refrigarator", "refrigerator",
- "refrigerador", "refrigerator",
- "refrigerater", "refrigerator",
- "refrigirator", "refrigerator",
- "regenaration", "regeneration",
- "regeneracion", "regeneration",
- "regestration", "registration",
- "registartion", "registration",
- "registrating", "registration",
- "regrigerator", "refrigerator",
- "regulatorias", "regulators",
- "regulatories", "regulators",
- "regulatorios", "regulators",
- "reicarnation", "reincarnation",
- "reinforcemnt", "reinforcement",
- "reinitalised", "reinitialised",
- "reinitalises", "reinitialises",
- "reinitalized", "reinitialized",
- "reinitalizes", "reinitializes",
- "reinstallled", "reinstalled",
- "reisntalling", "reinstalling",
- "relaitonship", "relationships",
- "relatinoship", "relationships",
- "reliabillity", "reliability",
- "reluctanctly", "reluctantly",
- "remarkablely", "remarkably",
- "rememberance", "remembrance",
- "reminiscient", "reminiscent",
- "renaissaince", "renaissance",
- "renegeration", "regeneration",
- "reorganision", "reorganisation",
- "repalcements", "replacements",
- "repersenting", "representing",
- "reporduction", "reproduction",
- "reporductive", "reproductive",
- "reprecussion", "repercussions",
- "representate", "representative",
- "represention", "representing",
- "representive", "representative",
- "reproducable", "reproducible",
- "reproduccion", "reproduction",
- "reproduciton", "reproduction",
- "reproducting", "reproduction",
- "reproductivo", "reproduction",
- "reproduktion", "reproduction",
- "repsectfully", "respectfully",
- "repsectively", "respectively",
- "republicanas", "republicans",
- "republicanos", "republicans",
- "republicants", "republicans",
- "republicians", "republicans",
- "requerimento", "requirement",
- "requeriments", "requirements",
- "requierments", "requirements",
- "requriements", "requirements",
- "resembelance", "resemblance",
- "reseptionist", "receptionist",
- "reserrection", "resurrection",
- "resintalling", "reinstalling",
- "resistancies", "resistances",
- "resistencias", "resistances",
- "respecitvely", "respectively",
- "respectabile", "respectable",
- "respectivily", "respectively",
- "respectivley", "respectively",
- "respectuflly", "respectfully",
- "respiratiory", "respiratory",
- "responsabile", "responsible",
- "responsaveis", "responsive",
- "responsbilty", "responsibly",
- "responsibile", "responsible",
- "responsibily", "responsibility",
- "responsibley", "responsibly",
- "responsibliy", "responsibly",
- "responsiblty", "responsibly",
- "ressemblance", "resemblance",
- "ressemblence", "resemblance",
- "ressurection", "resurrection",
- "restaurantes", "restaurants",
- "restauration", "restoration",
- "restauraunts", "restaurants",
- "restirctions", "restrictions",
- "restrainting", "restraining",
- "restrcitions", "restriction",
- "restricitons", "restrictions",
- "resurreccion", "resurrection",
- "resurrektion", "resurrection",
- "retalitation", "retaliation",
- "retributioon", "retribution",
- "retroactivly", "retroactively",
- "revolutionay", "revolutionary",
- "revolutionos", "revolutions",
- "rezurrection", "resurrection",
- "rictatorship", "dictatorship",
- "ridicilously", "ridiculously",
- "ridicoulusly", "ridiculously",
- "righteouness", "righteousness",
- "rockerfeller", "rockefeller",
- "rollercoaser", "rollercoaster",
- "rollercoater", "rollercoaster",
- "romanitcally", "romantically",
- "roundabounts", "roundabout",
- "rudimentatry", "rudimentary",
- "rysurrection", "resurrection",
- "sacksonville", "jacksonville",
- "sacreligious", "sacrilegious",
- "sacrificeing", "sacrificing",
- "saksatchewan", "saskatchewan",
- "salughtering", "slaughtering",
- "sanctionning", "sanctioning",
- "sarcasticaly", "sarcastically",
- "sarcasticlly", "sarcastically",
- "sascatchewan", "saskatchewan",
- "saskatcehwan", "saskatchewan",
- "saskatchawan", "saskatchewan",
- "saskatechwan", "saskatchewan",
- "sasketchawan", "saskatchewan",
- "sasketchewan", "saskatchewan",
- "sasktachewan", "saskatchewan",
- "satasfaction", "satisfaction",
- "satasfactory", "satisfactory",
- "satisfaccion", "satisfaction",
- "satisfacting", "satisfaction",
- "satisfcation", "satisfaction",
- "satisfiction", "satisfaction",
- "satistactory", "satisfactory",
- "satsifaction", "satisfaction",
- "satsifactory", "satisfactory",
- "scandanivian", "scandinavian",
- "scandenavian", "scandinavian",
- "scandianvian", "scandinavian",
- "scandinacian", "scandinavian",
- "scandinaivan", "scandinavia",
- "scandinavica", "scandinavian",
- "scandinavien", "scandinavian",
- "scandinavion", "scandinavian",
- "scandivanian", "scandinavian",
- "scandonavian", "scandinavian",
- "schizophrena", "schizophrenia",
- "scholarhsips", "scholarships",
- "scholerships", "scholarships",
- "scholorships", "scholarships",
- "scnadinavian", "scandinavian",
- "screenshoots", "screenshot",
- "sensationail", "sensational",
- "sensationnal", "sensational",
- "sensibilites", "sensibilities",
- "sensitivitiy", "sensitivity",
- "sentimentals", "sentiments",
- "sertificates", "certificates",
- "serveillance", "surveillance",
- "seskatchewan", "saskatchewan",
- "shakesperean", "shakespeare",
- "shamelessely", "shamelessly",
- "shamelessley", "shamelessly",
- "shampionship", "championship",
- "shardholders", "shareholders",
- "shenanigains", "shenanigans",
- "shenanigangs", "shenanigans",
- "shenaniganns", "shenanigans",
- "shenanighans", "shenanigans",
- "shopkeeepers", "shopkeepers",
- "showboarding", "snowboarding",
- "siginificant", "significant",
- "significanly", "significantly",
- "significante", "significance",
- "significanty", "significantly",
- "significatly", "significantly",
- "signleplayer", "singleplayer",
- "simaltaneous", "simultaneous",
- "simeltaneous", "simultaneous",
- "similaraties", "similarities",
- "similiarites", "similarities",
- "similiarties", "similarities",
- "similiraties", "similarities",
- "similtaneous", "simultaneous",
- "simliarities", "similarities",
- "simlutaneous", "simultaneous",
- "simpathizers", "sympathizers",
- "simplistisch", "simplistic",
- "simulatenous", "simultaneous",
- "simulatneous", "simultaneous",
- "simultaenous", "simultaneous",
- "simultaneuos", "simultaneous",
- "simultanious", "simultaneous",
- "simulteneous", "simultaneous",
- "singelplayer", "singleplayer",
- "singlepalyer", "singleplayer",
- "sinlgeplayer", "singleplayer",
- "situationals", "situations",
- "situationnal", "situational",
- "skandinavian", "scandinavian",
- "skateboaring", "skateboarding",
- "skrawberries", "strawberries",
- "slaugthering", "slaughtering",
- "sloughtering", "slaughtering",
- "sluaghtering", "slaughtering",
- "snowballling", "snowballing",
- "snowbaording", "snowboarding",
- "socialistisk", "socialists",
- "socialogical", "sociological",
- "socioeconimc", "socioeconomic",
- "socioeconmic", "socioeconomic",
- "socioligical", "sociological",
- "sociopolical", "sociological",
- "somethingest", "somethings",
- "sophisticaed", "sophisticated",
- "sophisticted", "sophisticated",
- "southamption", "southampton",
- "southernerns", "southerners",
- "sovereighnty", "sovereignty",
- "sovereignety", "sovereignty",
- "sovereignity", "sovereignty",
- "specialistes", "specialists",
- "specializare", "specialize",
- "specializate", "specialize",
- "specializeds", "specializes",
- "specializied", "specialize",
- "speciallized", "specialised",
- "specifcation", "specification",
- "spectacuarly", "spectacular",
- "spectaculair", "spectacular",
- "spectaculary", "spectacularly",
- "spectacullar", "spectacularly",
- "specualtions", "speculation",
- "spermatozoan", "spermatozoon",
- "spesifically", "specifically",
- "spirituallly", "spiritually",
- "spirtiuality", "spirituality",
- "spirutuality", "spirituality",
- "spontaneosly", "spontaneously",
- "spontaneouly", "spontaneously",
- "spreadhseets", "spreadsheets",
- "spreadsheats", "spreadsheets",
- "spreadsheeds", "spreadsheets",
- "spreadsheeet", "spreadsheets",
- "standartized", "standardized",
- "standerdized", "standardized",
- "stardardized", "standardized",
- "starightened", "straightened",
- "starwberries", "strawberries",
- "statisticaly", "statistically",
- "stereotpying", "stereotyping",
- "stereotypers", "stereotypes",
- "stereotypian", "stereotyping",
- "steriotyping", "stereotyping",
- "steroetyping", "stereotyping",
- "steryotyping", "stereotyping",
- "straigntened", "straightened",
- "straigthened", "straightened",
- "strategicaly", "strategically",
- "strategiclly", "strategically",
- "strawburries", "strawberries",
- "streemlining", "streamlining",
- "streightened", "straightened",
- "strenghening", "strengthening",
- "strenghtened", "strengthened",
- "strengtheing", "strengthening",
- "stroytelling", "storytelling",
- "subconcsious", "subconscious",
- "subconsicous", "subconscious",
- "subcouncious", "subconscious",
- "subcsription", "subscriptions",
- "subesquently", "subsequently",
- "subjectivety", "subjectively",
- "subjectivily", "subjectively",
- "subjectivley", "subjectively",
- "subjudgation", "subjugation",
- "subredditors", "subreddits",
- "subscirption", "subscriptions",
- "subsconcious", "subconscious",
- "subscribbers", "subscribers",
- "subscribbing", "subscribing",
- "subscribirse", "subscriber",
- "subscribtion", "subscription",
- "subscriptons", "subscriptions",
- "subscritpion", "subscriptions",
- "subscrpition", "subscriptions",
- "subsiquently", "subsequently",
- "subsrciption", "subscriptions",
- "subsricption", "subscriptions",
- "substantialy", "substantially",
- "substantitve", "substantive",
- "substitition", "substitution",
- "substituters", "substitutes",
- "substitutivo", "substitution",
- "substitutues", "substitutes",
- "substracting", "subtracting",
- "substraction", "subtraction",
- "subterranian", "subterranean",
- "succsessfull", "successful",
- "sunconscious", "subconscious",
- "supermarkeds", "supermarkets",
- "supermarkers", "supermarkets",
- "supermarkert", "supermarkets",
- "supermarkten", "supermarket",
- "supermarktes", "supermarkets",
- "supernarkets", "supermarkets",
- "supernatrual", "supernatural",
- "supersticion", "superstition",
- "superstision", "superstition",
- "superstitios", "superstitious",
- "superstitous", "superstitious",
- "supervisiors", "supervisors",
- "supervisoras", "supervisors",
- "supervisores", "supervisors",
- "supllemental", "supplemental",
- "supplamental", "supplemental",
- "supplamented", "supplemented",
- "supplimental", "supplemental",
- "suppresssion", "suppression",
- "supscription", "subscription",
- "supsiciously", "suspiciously",
- "surprizingly", "surprisingly",
- "surrenderred", "surrendered",
- "surrundering", "surrendering",
- "survaillance", "surveillance",
- "survaillence", "surveillance",
- "survallience", "surveillance",
- "surveillence", "surveillance",
- "survelliance", "surveillance",
- "surviellance", "surveillance",
- "survivabiity", "survivability",
- "survivabiliy", "survivability",
- "survivabilty", "survivability",
- "susceptiable", "susceptible",
- "susceptibile", "susceptible",
- "suspeciously", "suspiciously",
- "suspicioulsy", "suspiciously",
- "suspiciuosly", "suspiciously",
- "suspisiously", "suspiciously",
- "sustainabily", "sustainability",
- "symapthizers", "sympathizers",
- "symetrically", "symmetrically",
- "symmetricaly", "symmetrically",
- "sympathethic", "sympathetic",
- "sympathsizer", "sympathizers",
- "sympathyzers", "sympathizers",
- "sympethizers", "sympathizers",
- "symphatizers", "sympathizers",
- "sympithizers", "sympathizers",
- "syncronously", "synchronously",
- "sysmatically", "systematically",
- "systematisch", "systematic",
- "tablespooons", "tablespoon",
- "tacticallity", "tactically",
- "tangencially", "tangentially",
- "tangenitally", "tangentially",
- "tangientally", "tangentially",
- "teamfighters", "teamfights",
- "teansylvania", "transylvania",
- "techanically", "mechanically",
- "techincality", "technicality",
- "technologial", "technological",
- "telelevision", "television",
- "teleportaion", "teleportation",
- "teleportaton", "teleportation",
- "temepratures", "temperatures",
- "temparatures", "temperatures",
- "temperaturas", "temperatures",
- "temporarilly", "temporarily",
- "tempreatures", "temperatures",
- "tempuratures", "temperatures",
- "tengentially", "tangentially",
- "termendously", "tremendously",
- "territorrial", "territorial",
- "territorries", "territories",
- "testasterone", "testosterone",
- "testestorone", "testosterone",
- "thanskgiving", "thanksgiving",
- "theologicial", "theological",
- "theoreticaly", "theoretically",
- "thermomenter", "thermometer",
- "thermomether", "thermometer",
- "thumbnailers", "thumbnails",
- "thunderboldt", "thunderbolt",
- "tindergarten", "kindergarten",
- "torubleshoot", "troubleshoot",
- "totalitarion", "totalitarian",
- "totalitatian", "totalitarian",
- "touchscreeen", "touchscreen",
- "traditionaly", "traditionally",
- "traditionnal", "traditional",
- "tradtionally", "traditionally",
- "tramendously", "tremendously",
- "tramsformers", "transformers",
- "tramsforming", "transforming",
- "tranditional", "transitional",
- "tranistional", "transitional",
- "tranistioned", "transitioned",
- "tranlsations", "translations",
- "tranmsission", "transmissions",
- "transaltions", "translations",
- "transaprency", "transparency",
- "transational", "transitional",
- "transcations", "transactions",
- "transcendant", "transcendent",
- "transcripton", "transcription",
- "transcriptus", "transcripts",
- "transesxuals", "transsexuals",
- "transfarmers", "transformers",
- "transfarring", "transferring",
- "transferrred", "transferred",
- "transformare", "transformers",
- "transformase", "transforms",
- "transformees", "transforms",
- "transforners", "transformers",
- "transfromers", "transformers",
- "transfroming", "transforming",
- "transgenderd", "transgendered",
- "transgendred", "transgendered",
- "transgenered", "transgender",
- "transicional", "transitional",
- "transilvania", "transylvania",
- "transimssion", "transmissions",
- "transisioned", "transitioned",
- "translastion", "translations",
- "translateing", "translating",
- "translationg", "translating",
- "translucient", "translucent",
- "translyvania", "transylvania",
- "transmisions", "transmission",
- "transmisison", "transmission",
- "transmissons", "transmissions",
- "transmitirte", "transmitter",
- "transmittted", "transmitted",
- "transmorfers", "transformer",
- "transofrmers", "transformers",
- "transofrming", "transforming",
- "transparancy", "transparency",
- "transparenty", "transparency",
- "transparrent", "transparent",
- "transperancy", "transparency",
- "transperency", "transparency",
- "transplantes", "transplants",
- "transporteur", "transporter",
- "transportion", "transporting",
- "transpotting", "transporting",
- "transsmision", "transmissions",
- "transylmania", "transylvania",
- "transylvanai", "transylvania",
- "trasnferring", "transferring",
- "trasnformers", "transformers",
- "trasnforming", "transforming",
- "trasnmission", "transmissions",
- "trasnparency", "transparency",
- "trasnporting", "transporting",
- "trememdously", "tremendously",
- "tremendoulsy", "tremendously",
- "tremondously", "tremendously",
- "troubelshoot", "troubleshoot",
- "troublehsoot", "troubleshoot",
- "trumendously", "tremendously",
- "trustworthly", "trustworthy",
- "ubsubscribed", "unsubscribed",
- "udnerpowered", "underpowered",
- "umbelievable", "unbelievable",
- "umemployment", "unemployment",
- "unaccaptable", "unacceptable",
- "unacceptible", "unacceptable",
- "unaccpetable", "unacceptable",
- "unacompanied", "unaccompanied",
- "unappealling", "unappealing",
- "unattractice", "unattractive",
- "unautherized", "unauthorized",
- "unauthroized", "unauthorized",
- "unbeleivable", "unbelievable",
- "unbeleivably", "unbelievably",
- "unbeliavable", "unbelievable",
- "unbeliavably", "unbelievably",
- "unbeliebable", "unbelievable",
- "unbelieveble", "unbelievable",
- "unbelievibly", "unbelievably",
- "unbeliveable", "unbelievable",
- "unbeliveably", "unbelievably",
- "unbelizeable", "unbelievable",
- "unbolievable", "unbelievable",
- "uncertainity", "uncertainty",
- "uncertaintly", "uncertainty",
- "uncompatible", "incompatible",
- "unconditinal", "unconditional",
- "unconsciosly", "unconsciously",
- "unconsciouly", "unconsciously",
- "unconsistent", "inconsistent",
- "unconvenient", "inconvenient",
- "unconvential", "unconventional",
- "undecideable", "undecidable",
- "undefinitely", "indefinitely",
- "undeniablely", "undeniably",
- "undergradate", "undergraduate",
- "undergradute", "undergraduate",
- "underminding", "undermining",
- "undermineing", "undermining",
- "undermineras", "undermines",
- "undermineres", "undermines",
- "underminging", "undermining",
- "underminning", "undermining",
- "undertakeing", "undertaking",
- "underwhelimg", "underwhelming",
- "underwheling", "underwhelming",
- "undesireable", "undesirable",
- "undoubtedbly", "undoubtedly",
- "unemployemnt", "unemployment",
- "unemplyoment", "unemployment",
- "unempolyment", "unemployment",
- "unenployment", "unemployment",
- "unequalities", "inequalities",
- "unexpectadly", "unexpectedly",
- "unexpectetly", "unexpectedly",
- "unexpectidly", "unexpectedly",
- "unexperience", "inexperience",
- "unexpextedly", "unexpectedly",
- "unexplicably", "inexplicably",
- "unforgetable", "unforgettable",
- "unforgiveble", "unforgivable",
- "unforgivible", "unforgivable",
- "unfortunatly", "unfortunately",
- "unfortunetly", "unfortunately",
- "unilatreally", "unilaterally",
- "uniliterally", "unilaterally",
- "unimpresssed", "unimpressed",
- "uninitalised", "uninitialised",
- "uninitalized", "uninitialized",
- "uninstallimg", "uninstalling",
- "uninstallled", "uninstalled",
- "unintentinal", "unintentional",
- "uninteresing", "uninteresting",
- "uninterneted", "uninterested",
- "uninterruped", "uninterrupted",
- "uninterupted", "uninterrupted",
- "unisntalling", "uninstalling",
- "unitesstates", "unitedstates",
- "univerisites", "universities",
- "univeristies", "universities",
- "universitets", "universities",
- "unliaterally", "unilaterally",
- "unneccessary", "unnecessary",
- "unnecesarily", "unnecessarily",
- "unnecessairy", "unnecessarily",
- "unnecessarly", "unnecessarily",
- "unnistalling", "uninstalling",
- "unpredictabe", "unpredictable",
- "unpreductive", "unproductive",
- "unproduktive", "unproductive",
- "unrealisitic", "unrealistic",
- "unreaponsive", "unresponsive",
- "unreasonalby", "unreasonably",
- "unrepsonsive", "unresponsive",
- "unresponcive", "unresponsive",
- "unresponisve", "unresponsive",
- "unresponsibe", "unresponsive",
- "unrestircted", "unrestricted",
- "unrestrcited", "unrestricted",
- "unristricted", "unrestricted",
- "unseccessful", "unsuccessful",
- "unsespecting", "unsuspecting",
- "unsibscribed", "unsubscribed",
- "unsoliciated", "unsolicited",
- "unsolicitied", "unsolicited",
- "unsubscirbed", "unsubscribed",
- "unsubscrible", "unsubscribed",
- "unsubscrided", "unsubscribed",
- "unsubscriped", "unsubscribed",
- "unsubscrubed", "unsubscribed",
- "unsubsrcibed", "unsubscribed",
- "unsucessfull", "unsuccessful",
- "unsunscribed", "unsubscribed",
- "unsurprizing", "unsurprising",
- "unsusbcribed", "unsubscribed",
- "unsustainble", "unsustainable",
- "unvelievable", "unbelievable",
- "unvelievably", "unbelievably",
- "unviersities", "universities",
- "unvulnerable", "invulnerable",
- "varification", "verification",
- "vegetarianas", "vegetarians",
- "vegetarianos", "vegetarians",
- "verficiation", "verification",
- "verificacion", "verification",
- "verificaiton", "verification",
- "verifikation", "verification",
- "vernaculaire", "vernacular",
- "versatillity", "versatility",
- "verticallity", "vertically",
- "videogamemes", "videogames",
- "visualizaton", "visualization",
- "vocabularily", "vocabulary",
- "vocabularity", "vocabulary",
- "volonteering", "volunteering",
- "volounteered", "volunteered",
- "voluntarilly", "voluntarily",
- "volunterring", "volunteering",
- "vulnerabilty", "vulnerability",
- "weightlifing", "weightlifting",
- "withdrawalls", "withdrawals",
- "withdrawling", "withdrawing",
- "withdrawning", "withdrawing",
- "wonderfullly", "wonderfully",
- "worshippping", "worshipping",
- "xenophobical", "xenophobia",
- "abandenment", "abandonment",
- "abandomnent", "abandonment",
- "abandonding", "abandoning",
- "abandonnent", "abandonment",
- "abandonning", "abandoning",
- "abbreviatin", "abbreviation",
- "abbreviaton", "abbreviation",
- "abdominable", "abdominal",
- "abomanation", "abomination",
- "abominacion", "abomination",
- "abomonation", "abomination",
- "abonimation", "abomination",
- "aboriginial", "aboriginal",
- "aborigional", "aboriginal",
- "abreviation", "abbreviation",
- "abritrarily", "arbitrarily",
- "abritration", "arbitration",
- "absolutelly", "absolutely",
- "absolutelys", "absolutes",
- "absolutisme", "absolutes",
- "absolutiste", "absolutes",
- "abstraccion", "abstraction",
- "abstraktion", "abstraction",
- "abstruction", "abstraction",
- "abundancies", "abundances",
- "academicaly", "academically",
- "academicese", "academics",
- "accelarated", "accelerated",
- "accelarator", "accelerator",
- "accelerater", "accelerator",
- "acceleratie", "accelerate",
- "acceleratio", "accelerator",
- "acceleraton", "acceleration",
- "accelorated", "accelerated",
- "accelorator", "accelerator",
- "acceptabelt", "acceptable",
- "accesseries", "accessories",
- "accessibile", "accessible",
- "accessibily", "accessibility",
- "accessoires", "accessories",
- "accidantely", "accidently",
- "accidentaly", "accidentally",
- "accidentely", "accidently",
- "accidential", "accidental",
- "accidentily", "accidently",
- "accidentlay", "accidently",
- "accidentley", "accidently",
- "accidentlly", "accidently",
- "accomadated", "accommodated",
- "accomadates", "accommodates",
- "accommadate", "accommodate",
- "accommidate", "accommodate",
- "accomodated", "accommodated",
- "accomodates", "accommodates",
- "accomondate", "accommodate",
- "accompained", "accompanied",
- "accompanyed", "accompanied",
- "accompianed", "accompanied",
- "accompinied", "accompanied",
- "accomplises", "accomplishes",
- "accomplishs", "accomplishes",
- "accomponied", "accompanied",
- "accountatns", "accountants",
- "accountents", "accountants",
- "accquainted", "acquainted",
- "accrediated", "accredited",
- "accreditied", "accredited",
- "accreditted", "accredited",
- "acculumated", "accumulated",
- "accumalated", "accumulated",
- "accumelated", "accumulated",
- "accumilated", "accumulated",
- "accumulatin", "accumulation",
- "accumulaton", "accumulation",
- "accuratelly", "accurately",
- "accustommed", "accustomed",
- "acheivement", "achievement",
- "acheivments", "achievements",
- "achievemint", "achievement",
- "achievemnts", "achievements",
- "achievments", "achievements",
- "achivements", "achievements",
- "acknolwedge", "acknowledge",
- "acknoweldge", "acknowledge",
- "acknowleded", "acknowledged",
- "acknowlegde", "acknowledge",
- "acknowleged", "acknowledge",
- "acknowleges", "acknowledges",
- "acknwoledge", "acknowledges",
- "acomplished", "accomplished",
- "acopalyptic", "apocalyptic",
- "acquaintace", "acquaintance",
- "acquisation", "acquisition",
- "activateing", "activating",
- "activationg", "activating",
- "activistion", "activision",
- "additinally", "additionally",
- "additionaly", "additionally",
- "additonally", "additionally",
- "adequatedly", "adequately",
- "adjectiveus", "adjectives",
- "administerd", "administered",
- "administrar", "administrator",
- "administren", "administer",
- "administrer", "administer",
- "administres", "administer",
- "administrez", "administer",
- "adminstered", "administered",
- "adminstrate", "administrate",
- "admittadely", "admittedly",
- "adolencence", "adolescence",
- "adolescance", "adolescence",
- "adolescense", "adolescence",
- "advantadges", "advantages",
- "advantageos", "advantageous",
- "advantageus", "advantageous",
- "advantagous", "advantageous",
- "adventerous", "adventures",
- "adventourus", "adventurous",
- "adversiting", "advertising",
- "advertisors", "advertisers",
- "advertisted", "advertised",
- "aesthethics", "aesthetics",
- "afficionado", "aficionado",
- "affiliction", "affiliation",
- "affirmitave", "affirmative",
- "affirmitive", "affirmative",
- "affixiation", "affiliation",
- "affrimative", "affirmative",
- "afgahnistan", "afghanistan",
- "afganhistan", "afghanistan",
- "afghanastan", "afghanistan",
- "afghansitan", "afghanistan",
- "afhganistan", "afghanistan",
- "afternarket", "aftermarket",
- "afterthougt", "afterthought",
- "aggaravates", "aggravates",
- "aggragating", "aggravating",
- "aggregatore", "aggregate",
- "aggressivly", "aggressively",
- "aggresssion", "aggression",
- "aggrovating", "aggravating",
- "agnostacism", "agnosticism",
- "agnostisicm", "agnosticism",
- "agnostisism", "agnosticism",
- "agnostocism", "agnosticism",
- "agnsoticism", "agnosticism",
- "agonsticism", "agnosticism",
- "agressively", "aggressively",
- "agressivley", "agressive",
- "agressivnes", "agressive",
- "agricolture", "agriculture",
- "agriculteur", "agriculture",
- "agricultral", "agricultural",
- "agricultual", "agricultural",
- "agricutlure", "agriculture",
- "ahtleticism", "athleticism",
- "alcoholicas", "alcoholics",
- "alcoholicos", "alcoholics",
- "alcoholisim", "alcoholism",
- "algorithems", "algorithm",
- "algorithims", "algorithm",
- "algorithmes", "algorithms",
- "algorithmns", "algorithms",
- "algorithmus", "algorithms",
- "algorithyms", "algorithm",
- "algorythims", "algorithms",
- "alientating", "alienating",
- "alleigances", "allegiance",
- "alltogether", "altogether",
- "alterantive", "alternative",
- "alternatley", "alternately",
- "alternitive", "alternative",
- "altheticism", "athleticism",
- "altnerately", "alternately",
- "altruisitic", "altruistic",
- "altruistric", "altruistic",
- "amalgomated", "amalgamated",
- "ambulancier", "ambulance",
- "amerliorate", "ameliorate",
- "ammendments", "amendments",
- "ampehtamine", "amphetamine",
- "ampethamine", "amphetamine",
- "amphetamies", "amphetamines",
- "amphetamins", "amphetamines",
- "amphetemine", "amphetamine",
- "amphetimine", "amphetamine",
- "amphetmaine", "amphetamines",
- "analyticals", "analytics",
- "anarchistes", "anarchists",
- "ancedotally", "anecdotally",
- "androgenous", "androgynous",
- "anecdatally", "anecdotally",
- "anecdotelly", "anecdotally",
- "anecodtally", "anecdotally",
- "anectodally", "anecdotally",
- "anectotally", "anecdotally",
- "anedoctally", "anecdotally",
- "angosticism", "agnosticism",
- "anihilation", "annihilation",
- "anitbiotics", "antibiotics",
- "annihalated", "annihilated",
- "annihilaton", "annihilation",
- "annihilited", "annihilated",
- "annihliated", "annihilated",
- "annilihated", "annihilated",
- "anniversery", "anniversary",
- "annonymouse", "anonymous",
- "announceing", "announcing",
- "announcemet", "announcements",
- "announcemnt", "announcement",
- "announcents", "announces",
- "annoymously", "anonymously",
- "anonamously", "anonymously",
- "anonimously", "anonymously",
- "anonmyously", "anonymously",
- "anonomously", "anonymously",
- "anonymousny", "anonymously",
- "anouncement", "announcement",
- "antagonisic", "antagonistic",
- "antagonistc", "antagonistic",
- "antagonstic", "antagonist",
- "anthropolgy", "anthropology",
- "anthropoloy", "anthropology",
- "antibiodics", "antibiotics",
- "antibioitcs", "antibiotic",
- "antibioitic", "antibiotic",
- "antibitoics", "antibiotics",
- "antiboitics", "antibiotics",
- "anticapated", "anticipated",
- "anticiapted", "anticipated",
- "anticipatin", "anticipation",
- "antiobitics", "antibiotic",
- "antiquaited", "antiquated",
- "antisipated", "anticipated",
- "apacolyptic", "apocalyptic",
- "apocaliptic", "apocalyptic",
- "apocalpytic", "apocalyptic",
- "apocalytpic", "apocalyptic",
- "apolagizing", "apologizing",
- "apolegetics", "apologetics",
- "apologistas", "apologists",
- "apologistes", "apologists",
- "apostrophie", "apostrophe",
- "apparantely", "apparently",
- "appareances", "appearances",
- "apparentely", "apparently",
- "appartments", "apartments",
- "appeareance", "appearance",
- "appearences", "appearances",
- "apperciated", "appreciated",
- "apperciates", "appreciates",
- "appereances", "appearances",
- "applicabile", "applicable",
- "applicaiton", "application",
- "applicatins", "applicants",
- "applicatons", "applications",
- "appoitnment", "appointments",
- "apporaching", "approaching",
- "apporpriate", "appropriate",
- "apporximate", "approximate",
- "appraoching", "approaching",
- "apprearance", "appearance",
- "apprecaited", "appreciated",
- "apprecaites", "appreciates",
- "appreciaite", "appreciative",
- "appreciatie", "appreciative",
- "appreciatin", "appreciation",
- "appreciaton", "appreciation",
- "appreciatve", "appreciative",
- "appreicated", "appreciated",
- "appreicates", "appreciates",
- "apprentince", "apprentice",
- "appriciated", "appreciated",
- "appriciates", "appreciates",
- "apprieciate", "appreciate",
- "appropirate", "appropriate",
- "appropraite", "appropriate",
- "appropriato", "appropriation",
- "approxamate", "approximate",
- "approxiamte", "approximate",
- "approxmiate", "approximate",
- "aprehensive", "apprehensive",
- "apsirations", "aspirations",
- "aqcuisition", "acquisition",
- "aquaintance", "acquaintance",
- "aquiantance", "acquaintance",
- "arbitrairly", "arbitrarily",
- "arbitralily", "arbitrarily",
- "arbitrarely", "arbitrarily",
- "arbitrarion", "arbitration",
- "arbitratily", "arbitrarily",
- "arbritarily", "arbitrarily",
- "arbritation", "arbitration",
- "arcaheology", "archaeology",
- "archaoelogy", "archeology",
- "archeaology", "archaeology",
- "archimedian", "archimedean",
- "architechts", "architect",
- "architectes", "architects",
- "architecure", "architecture",
- "argiculture", "agriculture",
- "argumentate", "argumentative",
- "aribtrarily", "arbitrarily",
- "aribtration", "arbitration",
- "arithmentic", "arithmetic",
- "arithmethic", "arithmetic",
- "arithmetric", "arithmetic",
- "armagedddon", "armageddon",
- "armageddeon", "armageddon",
- "arrangments", "arrangements",
- "arrengement", "arrangement",
- "articluated", "articulated",
- "articualted", "articulated",
- "artifically", "artificially",
- "artificialy", "artificially",
- "aspergerers", "aspergers",
- "asphyxation", "asphyxiation",
- "aspriations", "aspirations",
- "assasinated", "assassinated",
- "assasinates", "assassinates",
- "assassiante", "assassinate",
- "assassinare", "assassinate",
- "assassinatd", "assassinated",
- "assassinato", "assassination",
- "assassinats", "assassins",
- "assassinted", "assassinated",
- "assembleing", "assembling",
- "assemblying", "assembling",
- "assertation", "assertion",
- "assignemnts", "assignments",
- "assimialted", "assimilate",
- "assimilatie", "assimilate",
- "assimilerat", "assimilate",
- "assimiliate", "assimilate",
- "assimliated", "assimilate",
- "assingments", "assignments",
- "assistantes", "assistants",
- "assocaition", "associations",
- "associaiton", "associations",
- "associaties", "associates",
- "associatons", "associations",
- "assoication", "association",
- "assosiating", "associating",
- "assosiation", "association",
- "assoziation", "association",
- "assumptious", "assumptions",
- "astonashing", "astonishing",
- "astonoshing", "astonishing",
- "astronaught", "astronaut",
- "astronaunts", "astronaut",
- "astronautas", "astronauts",
- "astronautes", "astronauts",
- "asychronous", "asynchronous",
- "asyncronous", "asynchronous",
- "atatchments", "attachments",
- "atheistisch", "atheistic",
- "athelticism", "athleticism",
- "athletecism", "athleticism",
- "athleticsim", "athleticism",
- "athletisicm", "athleticism",
- "athletisism", "athleticism",
- "atmopsheric", "atmospheric",
- "atmoshperic", "atmospheric",
- "atmosoheric", "atmospheric",
- "atomspheric", "atmospheric",
- "atrocitites", "atrocities",
- "attachemnts", "attachments",
- "attackerasu", "attackers",
- "attackerats", "attackers",
- "attactments", "attachments",
- "attributred", "attributed",
- "attributted", "attribute",
- "attrocities", "atrocities",
- "audiobookas", "audiobooks",
- "audioboooks", "audiobook",
- "auotcorrect", "autocorrect",
- "austrailans", "australians",
- "austrailian", "australian",
- "australiaan", "australians",
- "australiams", "australians",
- "australiens", "australians",
- "australlian", "australian",
- "authenticiy", "authenticity",
- "authenticor", "authenticator",
- "authenticty", "authenticity",
- "authorative", "authoritative",
- "authoritate", "authoritative",
- "authoroties", "authorities",
- "autoatttack", "autoattack",
- "autocoreect", "autocorrect",
- "autocorrekt", "autocorrect",
- "autocorrent", "autocorrect",
- "autocorrext", "autocorrect",
- "autoctonous", "autochthonous",
- "autokorrect", "autocorrect",
- "automaticly", "automatically",
- "automatonic", "automation",
- "automoblies", "automobile",
- "auxillaries", "auxiliaries",
- "availabiliy", "availability",
- "availabilty", "availability",
- "availablity", "availability",
- "awesoneness", "awesomeness",
- "babysittter", "babysitter",
- "backbacking", "backpacking",
- "backgorunds", "backgrounds",
- "backhacking", "backpacking",
- "backjacking", "backpacking",
- "backtacking", "backpacking",
- "bangaldeshi", "bangladesh",
- "bangladesch", "bangladesh",
- "barceloneta", "barcelona",
- "bargainning", "bargaining",
- "battelfield", "battlefield",
- "battelfront", "battlefront",
- "battelships", "battleship",
- "battlefeild", "battlefield",
- "battlefiend", "battlefield",
- "battlefiled", "battlefield",
- "battlefornt", "battlefront",
- "battlehsips", "battleship",
- "beastiality", "bestiality",
- "beaurocracy", "bureaucracy",
- "beautyfully", "beautifully",
- "behaviorial", "behavioral",
- "belittleing", "belittling",
- "belittlling", "belittling",
- "belligerant", "belligerent",
- "belligirent", "belligerent",
- "bellweather", "bellwether",
- "benefitical", "beneficial",
- "bestiallity", "bestiality",
- "beuatifully", "beautifully",
- "beuraucracy", "bureaucracy",
- "beuraucrats", "bureaucrats",
- "billegerent", "belligerent",
- "billionairs", "billionaires",
- "billionarie", "billionaire",
- "billioniare", "billionaire",
- "biologicaly", "biologically",
- "birthdayers", "birthdays",
- "birthdaymas", "birthdays",
- "bittersweat", "bittersweet",
- "bitterwseet", "bittersweet",
- "blackberrry", "blackberry",
- "blacksmitch", "blacksmith",
- "bloodboorne", "bloodborne",
- "bluebarries", "blueberries",
- "blueburries", "blueberries",
- "blueprients", "blueprints",
- "bodybuildig", "bodybuilding",
- "bodybuildng", "bodybuilding",
- "bodybuiling", "bodybuilding",
- "bombardeada", "bombarded",
- "bombardeado", "bombarded",
- "bombarderad", "bombarded",
- "bordelrands", "borderlands",
- "bordlerands", "borderlands",
- "bortherhood", "brotherhood",
- "bourgeousie", "bourgeois",
- "boycottting", "boycotting",
- "bracelettes", "bracelets",
- "brainwahsed", "brainwashed",
- "brainwasing", "brainwashing",
- "braziliians", "brazilians",
- "breakthough", "breakthrough",
- "breakthrouh", "breakthrough",
- "breathtakng", "breathtaking",
- "brianwashed", "brainwashed",
- "brillaintly", "brilliantly",
- "broadcasing", "broadcasting",
- "broadcastes", "broadcasts",
- "broderlands", "borderlands",
- "brotherwood", "brotherhood",
- "buddhistisk", "buddhists",
- "buearucrats", "bureaucrats",
- "bueraucracy", "bureaucracy",
- "bueraucrats", "bureaucrats",
- "buisnessman", "businessman",
- "buisnessmen", "businessmen",
- "bullerproof", "bulletproof",
- "bulletbroof", "bulletproof",
- "bulletproff", "bulletproof",
- "bulletprrof", "bulletproof",
- "bullitproof", "bulletproof",
- "bureacuracy", "bureaucracy",
- "bureaocracy", "bureaucracy",
- "bureaocrats", "bureaucrats",
- "bureaucraps", "bureaucrats",
- "bureaucrash", "bureaucrats",
- "bureaucrasy", "bureaucrats",
- "bureaucrazy", "bureaucracy",
- "bureuacracy", "bureaucracy",
- "bureuacrats", "bureaucrats",
- "burueacrats", "bureaucrats",
- "businessnes", "businessmen",
- "busniessmen", "businessmen",
- "butterfiles", "butterflies",
- "butterfleye", "butterfly",
- "butterflyes", "butterflies",
- "butterfries", "butterflies",
- "butterlfies", "butterflies",
- "caclulating", "calculating",
- "caclulation", "calculation",
- "caclulators", "calculators",
- "cailbration", "calibration",
- "calbiration", "calibration",
- "calcualting", "calculating",
- "calcualtion", "calculations",
- "calcualtors", "calculators",
- "calculaters", "calculators",
- "calculatios", "calculators",
- "calculatons", "calculations",
- "calibartion", "calibration",
- "calibraiton", "calibration",
- "califorinan", "californian",
- "californain", "californian",
- "californica", "california",
- "californien", "californian",
- "californiia", "californian",
- "californina", "californian",
- "californnia", "californian",
- "califronian", "californian",
- "caluclating", "calculating",
- "caluclation", "calculation",
- "caluclators", "calculators",
- "caluculated", "calculated",
- "caluiflower", "cauliflower",
- "camouflague", "camouflage",
- "camouflauge", "camouflage",
- "campagining", "campaigning",
- "campainging", "campaigning",
- "canadianese", "canadians",
- "cannabilism", "cannibalism",
- "cannabolism", "cannibalism",
- "canniablism", "cannibalism",
- "cannibalizm", "cannibalism",
- "cannibaljim", "cannibalism",
- "cannibalsim", "cannibalism",
- "cannibilism", "cannibalism",
- "cannobalism", "cannibalism",
- "cannotation", "connotation",
- "capabilites", "capabilities",
- "capabilitiy", "capability",
- "capabillity", "capability",
- "capacitaron", "capacitor",
- "capacitores", "capacitors",
- "capatilists", "capitalists",
- "capatilized", "capitalized",
- "caperbility", "capability",
- "capitalisim", "capitalism",
- "capitilists", "capitalists",
- "capitilized", "capitalized",
- "capitolists", "capitalists",
- "capitolized", "capitalized",
- "captialists", "capitalists",
- "captialized", "capitalized",
- "cariactures", "caricature",
- "carniverous", "carnivorous",
- "castatrophe", "catastrophe",
- "catagorized", "categorized",
- "catapillars", "caterpillars",
- "catapillers", "caterpillars",
- "catasthrope", "catastrophe",
- "catastraphe", "catastrophe",
- "catastrohpe", "catastrophe",
- "catastropic", "catastrophic",
- "categroized", "categorized",
- "catepillars", "caterpillars",
- "catergorize", "categorize",
- "caterogized", "categorized",
- "caterpilars", "caterpillars",
- "caterpiller", "caterpillar",
- "catholacism", "catholicism",
- "catholicsim", "catholicism",
- "catholisicm", "catholicism",
- "catholisism", "catholicism",
- "catholizism", "catholicism",
- "catholocism", "catholicism",
- "catogerized", "categorized",
- "catterpilar", "caterpillar",
- "cauilflower", "cauliflower",
- "caulfilower", "cauliflower",
- "celebartion", "celebrations",
- "celebirties", "celebrities",
- "celebracion", "celebration",
- "celebrasion", "celebrations",
- "celebratons", "celebrations",
- "centipeddle", "centipede",
- "cerimonious", "ceremonious",
- "certaintity", "certainty",
- "certificaat", "certificate",
- "certificare", "certificate",
- "certificato", "certification",
- "certificats", "certificates",
- "challanging", "challenging",
- "challeneged", "challenged",
- "challeneger", "challenger",
- "challeneges", "challenges",
- "chameleooon", "chameleon",
- "championshp", "championship",
- "championsip", "championship",
- "chancellour", "chancellor",
- "charachters", "characters",
- "charasmatic", "charismatic",
- "charimastic", "charismatic",
- "charsimatic", "charismatic",
- "cheerleadra", "cheerleader",
- "cheerleards", "cheerleaders",
- "cheerleeder", "cheerleader",
- "cheesebuger", "cheeseburger",
- "cheeseburgs", "cheeseburgers",
- "chihuahuita", "chihuahua",
- "childrenmrs", "childrens",
- "chloesterol", "cholesterol",
- "cholesteral", "cholesterol",
- "cholestoral", "cholesterol",
- "cholestorol", "cholesterol",
- "cholosterol", "cholesterol",
- "chormosomes", "chromosomes",
- "christianty", "christianity",
- "chromasomes", "chromosomes",
- "chromesomes", "chromosomes",
- "chromisomes", "chromosomes",
- "chromosones", "chromosomes",
- "chromossome", "chromosomes",
- "chromozomes", "chromosomes",
- "chronicales", "chronicles",
- "chronichles", "chronicles",
- "cicrulating", "circulating",
- "cincinnasti", "cincinnati",
- "cincinnatti", "cincinnati",
- "cincinnnati", "cincinnati",
- "circimcised", "circumcised",
- "circluating", "circulating",
- "circualtion", "circulation",
- "circulacion", "circulation",
- "circumcison", "circumcision",
- "circumsiced", "circumcised",
- "circumsised", "circumcised",
- "circumstace", "circumstance",
- "circumvrent", "circumvent",
- "circuncised", "circumcised",
- "cirticising", "criticising",
- "ciruclating", "circulating",
- "ciruclation", "circulation",
- "citicenship", "citizenship",
- "citisenship", "citizenship",
- "citizinship", "citizenship",
- "civilizatin", "civilizations",
- "civilizaton", "civilization",
- "claculators", "calculators",
- "classifides", "classified",
- "cleanilness", "cleanliness",
- "cleanleness", "cleanliness",
- "cleanlyness", "cleanliness",
- "cleansiness", "cleanliness",
- "cliffbanger", "cliffhanger",
- "cliffhander", "cliffhanger",
- "cliffhangar", "cliffhanger",
- "clifthanger", "cliffhanger",
- "cockaroches", "cockroaches",
- "cockraoches", "cockroaches",
- "cockroackes", "cockroaches",
- "cocktailers", "cocktails",
- "coefficeint", "coefficient",
- "coefficiant", "coefficient",
- "coincedince", "coincidence",
- "coincidance", "coincidence",
- "coincidense", "coincidence",
- "coincidente", "coincidence",
- "coincidince", "coincidence",
- "coinsidence", "coincidence",
- "collabarate", "collaborate",
- "collaberate", "collaborate",
- "collaborant", "collaborate",
- "collaborare", "collaborate",
- "collaborato", "collaboration",
- "collapseing", "collapsing",
- "collaterial", "collateral",
- "collectieve", "collective",
- "collectivly", "collectively",
- "collectivos", "collections",
- "collobarate", "collaborate",
- "colloborate", "collaborate",
- "colonializm", "colonialism",
- "colonialsim", "colonialism",
- "colonianism", "colonialism",
- "colonizaton", "colonization",
- "comaprisons", "comparisons",
- "combiantion", "combinations",
- "combinacion", "combination",
- "combinaison", "combinations",
- "combinaiton", "combinations",
- "combinatino", "combinations",
- "combinatins", "combinations",
- "combinatios", "combinations",
- "combinining", "combining",
- "combonation", "combination",
- "comediantes", "comedians",
- "comeptition", "competition",
- "comeptitive", "competitive",
- "comeptitors", "competitors",
- "comfertable", "comfortable",
- "comfertably", "comfortably",
- "comfortabel", "comfortably",
- "comfortabil", "comfortably",
- "comfrotable", "comfortable",
- "comftorable", "comfortable",
- "comftorably", "comfortably",
- "comisioning", "commissioning",
- "comissioned", "commissioned",
- "comissioner", "commissioner",
- "commandered", "commanded",
- "commandmant", "commandment",
- "commantator", "commentator",
- "commendment", "commandment",
- "commentarea", "commenter",
- "commentaren", "commenter",
- "commentater", "commentator",
- "commenteers", "commenter",
- "commentries", "commenters",
- "commercialy", "commercially",
- "commericals", "commercials",
- "commericial", "commercial",
- "comminicate", "communicate",
- "comminucate", "communicate",
- "commisioned", "commissioned",
- "commisioner", "commissioner",
- "commisssion", "commissions",
- "committment", "commitment",
- "commodoties", "commodities",
- "commomplace", "commonplace",
- "commonspace", "commonplace",
- "commonweath", "commonwealth",
- "commonwelth", "commonwealth",
- "commuincate", "communicated",
- "communciate", "communicate",
- "communicted", "communicated",
- "communistas", "communists",
- "communistes", "communists",
- "compability", "compatibility",
- "compalation", "compilation",
- "compansated", "compensated",
- "comparabile", "comparable",
- "comparasion", "comparison",
- "comparasons", "comparisons",
- "comparement", "compartment",
- "comparetive", "comparative",
- "comparision", "comparison",
- "comparisson", "comparisons",
- "comparitave", "comparative",
- "comparitive", "comparative",
- "comparsions", "comparisons",
- "compassione", "compassionate",
- "compasssion", "compassion",
- "compatabile", "compatible",
- "compatative", "comparative",
- "compatiable", "compatible",
- "compatibile", "compatible",
- "compatibily", "compatibility",
- "compeditive", "competitive",
- "compeditors", "competitors",
- "compeitions", "competitions",
- "compeittion", "competitions",
- "compelation", "compilation",
- "compensante", "compensate",
- "compensatie", "compensate",
- "compensatin", "compensation",
- "compenstate", "compensate",
- "comperative", "comparative",
- "compesition", "composition",
- "competation", "computation",
- "competative", "competitive",
- "competators", "competitors",
- "competetion", "competition",
- "competetors", "competitors",
- "competiters", "competitors",
- "competiting", "competition",
- "competitior", "competitor",
- "competitivo", "competition",
- "competitoin", "competitions",
- "competitons", "competitors",
- "competution", "computation",
- "compilacion", "compilation",
- "compilcated", "complicate",
- "compination", "compilation",
- "compinsated", "compensated",
- "compitation", "computation",
- "compitetion", "competitions",
- "complacient", "complacent",
- "complciated", "complicate",
- "compleation", "compilation",
- "complecated", "complicated",
- "completaste", "completes",
- "completeing", "completing",
- "completeion", "completion",
- "completelly", "completely",
- "completelyl", "completely",
- "completelys", "completes",
- "completenes", "completes",
- "complexitiy", "complexity",
- "compliacted", "complicate",
- "compliation", "compilation",
- "complicarte", "complicate",
- "complicatie", "complicit",
- "complicatii", "complicit",
- "complicatin", "complicit",
- "complictaed", "complicate",
- "complimente", "complement",
- "complimenty", "complimentary",
- "complusions", "compulsion",
- "compolation", "compilation",
- "componenets", "components",
- "componentes", "components",
- "composicion", "composition",
- "composiiton", "compositions",
- "composision", "compositions",
- "compositied", "composite",
- "composities", "composite",
- "compositoin", "compositions",
- "compositons", "compositions",
- "compositore", "composite",
- "compostiion", "compositions",
- "compotition", "composition",
- "compramised", "compromised",
- "compramises", "compromises",
- "compremised", "compromised",
- "compremises", "compromises",
- "comprension", "compression",
- "compresores", "compressor",
- "compresssed", "compressed",
- "compresssor", "compressor",
- "comprimised", "compromised",
- "comprimises", "compromises",
- "compromessi", "compromises",
- "compromisng", "compromising",
- "compromisse", "compromises",
- "compromisso", "compromises",
- "compromized", "compromised",
- "compulstion", "compulsion",
- "compunation", "computation",
- "computacion", "computation",
- "computating", "computation",
- "computition", "computation",
- "conceivibly", "conceivably",
- "concencrate", "concentrate",
- "concentrace", "concentrate",
- "concentrade", "concentrated",
- "concentrait", "concentrate",
- "concentrant", "concentrate",
- "concentrare", "concentrate",
- "concentrato", "concentration",
- "concertmate", "concentrate",
- "conceviable", "conceivable",
- "conceviably", "conceivably",
- "concidering", "considering",
- "conciveable", "conceivable",
- "conciveably", "conceivably",
- "conclsuions", "concussions",
- "concludendo", "concluded",
- "conclussion", "conclusions",
- "conclussive", "conclusive",
- "conclutions", "conclusions",
- "concsiously", "consciously",
- "conculsions", "conclusions",
- "concusssion", "concussions",
- "condeferacy", "confederacy",
- "condicional", "conditional",
- "condidtions", "conditions",
- "conditionar", "conditioner",
- "conditionel", "conditional",
- "condolances", "condolences",
- "condolenses", "condolences",
- "condolonces", "condolences",
- "conductiong", "conducting",
- "condulences", "condolences",
- "conenctions", "connections",
- "conescutive", "consecutive",
- "confedaracy", "confederacy",
- "confedarate", "confederate",
- "confederecy", "confederacy",
- "conferances", "conferences",
- "conferedate", "confederate",
- "confererate", "confederate",
- "confescated", "confiscated",
- "confesssion", "confessions",
- "confidantly", "confidently",
- "configurare", "configure",
- "configurate", "configure",
- "configurato", "configuration",
- "confilcting", "conflicting",
- "confisgated", "confiscated",
- "conflciting", "conflicting",
- "confortable", "comfortable",
- "confrontato", "confrontation",
- "confussions", "confessions",
- "congrassman", "congressman",
- "congratuate", "congratulate",
- "conicidence", "coincidence",
- "conjonction", "conjunction",
- "conjucntion", "conjunction",
- "conjuncting", "conjunction",
- "conlcusions", "conclusions",
- "connatation", "connotation",
- "connecitcut", "connecticut",
- "connecticon", "connection",
- "connectiong", "connecting",
- "connectivty", "connectivity",
- "connetation", "connotation",
- "connonation", "connotation",
- "connotacion", "connotation",
- "conontation", "connotation",
- "conotations", "connotations",
- "conquerring", "conquering",
- "consdidered", "considered",
- "consectuive", "consecutive",
- "consecuence", "consequence",
- "conseguence", "consequence",
- "conselation", "consolation",
- "consentrate", "concentrate",
- "consequenes", "consequence",
- "consequense", "consequences",
- "consequente", "consequence",
- "consequenty", "consequently",
- "consequtive", "consecutive",
- "conservanti", "conservation",
- "conservatie", "conservatives",
- "conservaton", "conservation",
- "consficated", "confiscated",
- "considerabe", "considerate",
- "considerais", "considers",
- "considerant", "considerate",
- "considerato", "consideration",
- "considerble", "considerable",
- "considerbly", "considerably",
- "considereis", "considers",
- "consilation", "consolation",
- "consilidate", "consolidate",
- "consistance", "consistency",
- "consistenly", "consistently",
- "consistensy", "consistency",
- "consistenty", "consistently",
- "consitution", "constitution",
- "conslutants", "consultant",
- "consolacion", "consolation",
- "consoldiate", "consolidate",
- "consolidare", "consolidate",
- "consolodate", "consolidate",
- "consomation", "consolation",
- "conspiraces", "conspiracies",
- "conspiracys", "conspiracies",
- "conspirancy", "conspiracy",
- "constantins", "constants",
- "constantivs", "constants",
- "constarints", "constraint",
- "constituant", "constituent",
- "constituion", "constitution",
- "constituite", "constitute",
- "constitutie", "constitutes",
- "constrating", "constraint",
- "constriants", "constraints",
- "construcing", "constructing",
- "construcion", "construction",
- "construcive", "constructive",
- "constructie", "constructive",
- "constructos", "constructs",
- "constructur", "constructor",
- "constructus", "constructs",
- "constuction", "construction",
- "consturcted", "constructed",
- "consuelling", "counselling",
- "consulation", "consolation",
- "consultaion", "consultation",
- "consultanti", "consultation",
- "consumation", "consumption",
- "consumbales", "consumables",
- "consumersim", "consumerism",
- "consumibles", "consumables",
- "contagiosum", "contagious",
- "containered", "contained",
- "containmemt", "containment",
- "containters", "containers",
- "containting", "containing",
- "contaminato", "contamination",
- "contaminent", "containment",
- "contaminted", "contaminated",
- "contancting", "contracting",
- "contanimate", "contaminated",
- "contemplare", "contemplate",
- "contempoary", "contemporary",
- "contemporay", "contemporary",
- "contencious", "contentious",
- "contenental", "continental",
- "contengency", "contingency",
- "contenintal", "continental",
- "contenplate", "contemplate",
- "contensious", "contentious",
- "contentants", "contestants",
- "contentuous", "contentious",
- "contestaste", "contestants",
- "contestents", "contestants",
- "contianment", "containment",
- "contientous", "contentious",
- "contimplate", "contemplate",
- "continenets", "continents",
- "continentes", "continents",
- "continentul", "continental",
- "contingancy", "contingency",
- "contingient", "contingent",
- "contingincy", "contingency",
- "continously", "continuously",
- "continuarla", "continual",
- "continuarlo", "continual",
- "continuasse", "continues",
- "continueing", "continuing",
- "continuemos", "continues",
- "continueous", "continuous",
- "continuious", "continuous",
- "continuning", "continuing",
- "continunity", "continuity",
- "continuosly", "continuously",
- "continuting", "continuing",
- "continutity", "continuity",
- "continuuing", "continuing",
- "continuuity", "continuity",
- "contirbuted", "contributed",
- "contiunally", "continually",
- "contraccion", "contraction",
- "contraddice", "contradicted",
- "contradices", "contradicts",
- "contradtion", "contraction",
- "contraversy", "controversy",
- "contreversy", "controversy",
- "contribuent", "contribute",
- "contribuito", "contribution",
- "contributer", "contributor",
- "contributie", "contribute",
- "contributin", "contribution",
- "contributos", "contributors",
- "contribuyes", "contributes",
- "contricting", "contracting",
- "contriction", "contraction",
- "contridicts", "contradicts",
- "contriversy", "controversy",
- "controleurs", "controllers",
- "controllore", "controllers",
- "controvercy", "controversy",
- "controversa", "controversial",
- "contrubutes", "contributes",
- "contructing", "contracting",
- "contruction", "construction",
- "contructors", "contractors",
- "conveinence", "convenience",
- "conveneince", "convenience",
- "conveniance", "convenience",
- "conveniente", "convenience",
- "convenietly", "conveniently",
- "conventinal", "conventional",
- "converitble", "convertible",
- "conversaion", "conversion",
- "conversatin", "conversations",
- "converseley", "conversely",
- "converstion", "conversion",
- "convertirea", "converter",
- "convertirle", "convertible",
- "convertirme", "converter",
- "convertirte", "converter",
- "convicitons", "convictions",
- "convienence", "convenience",
- "convienient", "convenient",
- "convinceing", "convincing",
- "convincente", "convenient",
- "convincersi", "convinces",
- "convirtible", "convertible",
- "cooperacion", "cooperation",
- "cooperativo", "cooperation",
- "cooporation", "cooperation",
- "cooporative", "cooperative",
- "coordenated", "coordinated",
- "coordenates", "coordinates",
- "coordianted", "coordinated",
- "coordiantes", "coordinates",
- "coordiantor", "coordinator",
- "coordinador", "coordinator",
- "coordinants", "coordinates",
- "coordinater", "coordinator",
- "coordinaton", "coordination",
- "coordonated", "coordinated",
- "coordonates", "coordinates",
- "coordonator", "coordinator",
- "cooridnated", "coordinated",
- "cooridnates", "coordinates",
- "cooridnator", "coordinator",
- "copenhaagen", "copenhagen",
- "copenhaegen", "copenhagen",
- "copenhaguen", "copenhagen",
- "copenhangen", "copenhagen",
- "copmetitors", "competitors",
- "coproration", "corporation",
- "copyrigthed", "copyrighted",
- "corinthains", "corinthians",
- "corintheans", "corinthians",
- "corinthiens", "corinthians",
- "corinthinas", "corinthians",
- "cornithians", "corinthians",
- "corparation", "corporation",
- "corperation", "corporation",
- "corporacion", "corporation",
- "corporativo", "corporation",
- "corralation", "correlation",
- "correctings", "corrections",
- "correctivos", "corrections",
- "correktions", "corrections",
- "correktness", "correctness",
- "correlacion", "correlation",
- "correlaties", "correlates",
- "corrilation", "correlation",
- "corrisponds", "corresponds",
- "corrolation", "correlation",
- "corrosponds", "corresponds",
- "costitution", "constitution",
- "councellors", "councillors",
- "counrtyside", "countryside",
- "counsilling", "counselling",
- "countercoat", "counteract",
- "counteredit", "counterfeit",
- "counterfact", "counteract",
- "counterfait", "counterfeit",
- "counterfest", "counterfeit",
- "counterfiet", "counterfeit",
- "counterpaly", "counterplay",
- "counterpary", "counterplay",
- "counterpath", "counterpart",
- "counterpats", "counterparts",
- "counterpont", "counterpoint",
- "counterract", "counterpart",
- "counterside", "countryside",
- "countertrap", "counterpart",
- "countriside", "countryside",
- "countrycide", "countryside",
- "countrywise", "countryside",
- "courthourse", "courthouse",
- "coutnerfeit", "counterfeit",
- "coutnerpart", "counterpart",
- "coutnerplay", "counterplay",
- "creacionism", "creationism",
- "creationkit", "creationist",
- "creationsim", "creationism",
- "creationsit", "creationist",
- "creationsts", "creationists",
- "creativelly", "creatively",
- "credencials", "credentials",
- "credentails", "credentials",
- "credentaisl", "credentials",
- "credientals", "credentials",
- "credintials", "credentials",
- "cricitising", "criticising",
- "criculating", "circulating",
- "cringeworhy", "cringeworthy",
- "cringeworty", "cringeworthy",
- "cringewothy", "cringeworthy",
- "criticicing", "criticising",
- "criticisied", "criticise",
- "criticisims", "criticisms",
- "criticisize", "criticise",
- "criticiszed", "criticise",
- "critisicing", "criticizing",
- "critisising", "criticising",
- "critizicing", "criticizing",
- "critizising", "criticizing",
- "critizizing", "criticizing",
- "crockodiles", "crocodiles",
- "crocodiller", "crocodile",
- "crocodilule", "crocodile",
- "croporation", "corporation",
- "crossfiters", "crossfire",
- "cultivative", "cultivate",
- "curricullum", "curriculum",
- "customizabe", "customizable",
- "customizble", "customizable",
- "dangeroulsy", "dangerously",
- "dardenelles", "dardanelles",
- "deadlifters", "deadlifts",
- "dealershits", "dealerships",
- "deceptivley", "deceptive",
- "declaracion", "declaration",
- "decleration", "declaration",
- "declinining", "declining",
- "decloration", "declaration",
- "decoartions", "decoration",
- "decomposits", "decomposes",
- "decoratieve", "decorative",
- "decorativos", "decorations",
- "decotations", "decorations",
- "decsendants", "descendants",
- "deductiable", "deductible",
- "defenderlas", "defenders",
- "defenderlos", "defenders",
- "defendernos", "defenders",
- "defenesless", "defenseless",
- "defenisvely", "defensively",
- "defensivley", "defensively",
- "deficiencey", "deficiency",
- "deficienies", "deficiencies",
- "deficientcy", "deficiency",
- "definantley", "definately",
- "definatedly", "definately",
- "definateley", "definately",
- "definatelly", "definately",
- "definatelty", "definately",
- "definatetly", "definately",
- "definations", "definitions",
- "definatlely", "definately",
- "definetally", "definately",
- "definetlely", "definetly",
- "definitaley", "definately",
- "definitelly", "definitely",
- "definitevly", "definitively",
- "definitiely", "definitively",
- "definitieve", "definitive",
- "definitiley", "definitively",
- "definitivly", "definitively",
- "definitivno", "definition",
- "definitivos", "definitions",
- "definitlely", "definitly",
- "definitlety", "definitly",
- "deflecticon", "deflection",
- "degenererat", "degenerate",
- "degradacion", "degradation",
- "degradating", "degradation",
- "degragation", "degradation",
- "degridation", "degradation",
- "dehyrdation", "dehydration",
- "deinitalize", "deinitialize",
- "delaerships", "dealerships",
- "delapidated", "dilapidated",
- "delcaration", "declaration",
- "delearships", "dealerships",
- "delevopment", "development",
- "deliberante", "deliberate",
- "deliberatly", "deliberately",
- "deliberetly", "deliberately",
- "delightlful", "delightful",
- "deliverying", "delivering",
- "delusionnal", "delusional",
- "deminsional", "dimensional",
- "democarcies", "democracies",
- "democracize", "democracies",
- "democractic", "democratic",
- "democraphic", "demographic",
- "democrasies", "democracies",
- "democrazies", "democracies",
- "democrocies", "democracies",
- "demograhpic", "demographic",
- "demographis", "demographics",
- "demograpics", "demographics",
- "demogrpahic", "demographic",
- "demoninator", "denominator",
- "demonstarte", "demonstrate",
- "demonstates", "demonstrates",
- "demonstraby", "demonstrably",
- "demonstrant", "demonstrate",
- "demonstrats", "demonstrates",
- "demosntrate", "demonstrate",
- "denegrating", "denigrating",
- "denomenator", "denominator",
- "denominador", "denominator",
- "denominaron", "denominator",
- "denominater", "denominator",
- "denominaton", "denomination",
- "denomitator", "denominator",
- "denomonator", "denominator",
- "denonimator", "denominator",
- "deocrations", "decorations",
- "deomcracies", "democracies",
- "deparmental", "departmental",
- "depedencies", "dependencies",
- "dependancey", "dependency",
- "dependencey", "dependency",
- "dependencie", "dependence",
- "dependenies", "dependencies",
- "deplorabile", "deplorable",
- "depressieve", "depressive",
- "depresssion", "depression",
- "deprevation", "deprivation",
- "deprication", "deprivation",
- "deprivating", "deprivation",
- "deprivition", "deprivation",
- "deprovation", "deprivation",
- "depserately", "desperately",
- "depseration", "desperation",
- "deregulatin", "deregulation",
- "derivativos", "derivatives",
- "derivitaves", "derivatives",
- "derivitives", "derivatives",
- "derpivation", "deprivation",
- "derviatives", "derivatives",
- "descandants", "descendants",
- "descendands", "descendants",
- "descendends", "descended",
- "descendenta", "descendants",
- "descentants", "descendants",
- "descirption", "descriptions",
- "descprition", "descriptions",
- "describiste", "describes",
- "describtion", "description",
- "descripcion", "description",
- "descripiton", "descriptions",
- "descripters", "descriptors",
- "descriptoin", "descriptions",
- "descriptons", "descriptions",
- "descritpion", "descriptions",
- "descrpition", "descriptions",
- "desensitied", "desensitized",
- "desensitzed", "desensitized",
- "desentisize", "desensitized",
- "desgination", "designation",
- "designacion", "designation",
- "designstion", "designation",
- "desinations", "destinations",
- "desingation", "designation",
- "desitnation", "destination",
- "desoriented", "disoriented",
- "desparately", "desperately",
- "desparation", "desperation",
- "desperating", "desperation",
- "desperatley", "desperately",
- "despirately", "desperately",
- "despiration", "desperation",
- "destablized", "destabilized",
- "destiantion", "destinations",
- "destinaiton", "destinations",
- "destinatons", "destinations",
- "destinction", "destination",
- "destraction", "destruction",
- "destruccion", "destruction",
- "destruciton", "destruction",
- "destructivo", "destruction",
- "destruktion", "destruction",
- "destruktive", "destructive",
- "deteoriated", "deteriorated",
- "determanism", "determinism",
- "determening", "determining",
- "determenism", "determinism",
- "determinare", "determine",
- "determinato", "determination",
- "determinded", "determine",
- "determinsim", "determinism",
- "detramental", "detrimental",
- "detremental", "detrimental",
- "detrimentul", "detrimental",
- "detuschland", "deutschland",
- "deustchland", "deutschland",
- "deutchsland", "deutschland",
- "deutcshland", "deutschland",
- "deutschalnd", "deutschland",
- "deutshcland", "deutschland",
- "develepmont", "developments",
- "develompent", "developments",
- "developemnt", "developments",
- "developmant", "developmental",
- "developmetn", "developments",
- "developmnet", "developments",
- "developpers", "developers",
- "develpoment", "developments",
- "deveolpment", "developments",
- "deveploment", "developments",
- "devestating", "devastating",
- "devistating", "devastating",
- "deyhdration", "dehydration",
- "diagnositcs", "diagnostic",
- "diagnositic", "diagnostic",
- "diagonstics", "diagnostic",
- "dictatorhip", "dictatorship",
- "dictionaire", "dictionaries",
- "dictionairy", "dictionary",
- "dictionarys", "dictionaries",
- "dictionnary", "dictionary",
- "differances", "differences",
- "differantly", "differently",
- "differental", "differential",
- "differentes", "differences",
- "differneces", "differences",
- "differnetly", "differently",
- "difficulity", "difficulty",
- "difficultes", "difficulties",
- "dificulties", "difficulties",
- "dimensiones", "dimensions",
- "dimentional", "dimensional",
- "dimesnional", "dimensional",
- "diminisheds", "diminishes",
- "diminsihing", "diminishing",
- "diminuitive", "diminutive",
- "diminushing", "diminishing",
- "dinosaurios", "dinosaurs",
- "direccional", "directional",
- "direcitonal", "directional",
- "directorguy", "directory",
- "directorios", "directors",
- "direktional", "directional",
- "disadvantge", "disadvantage",
- "disagreemet", "disagreements",
- "disagreemtn", "disagreements",
- "disapperead", "disappeared",
- "disapporval", "disapproval",
- "disapprovel", "disapproval",
- "disasterous", "disastrous",
- "disastreous", "disastrous",
- "disastrious", "disastrous",
- "disastruous", "disastrous",
- "disatisfied", "dissatisfied",
- "disciplened", "disciplined",
- "disciplinas", "disciplines",
- "disciplince", "disciplines",
- "disclipined", "disciplined",
- "disclipines", "disciplines",
- "discogrophy", "discography",
- "discogrpahy", "discography",
- "disconencts", "disconnects",
- "disconneted", "disconnected",
- "disconnnect", "disconnect",
- "discontined", "discontinued",
- "discontiued", "discontinued",
- "discrapency", "discrepancy",
- "discretited", "discredited",
- "discrimante", "discriminate",
- "discrimiate", "discriminate",
- "discussiong", "discussing",
- "discusssion", "discussions",
- "disgraseful", "disgraceful",
- "disgrateful", "disgraceful",
- "disgrunteld", "disgruntled",
- "disgustigly", "disgustingly",
- "disgustingy", "disgustingly",
- "disgustinly", "disgustingly",
- "disicplined", "disciplined",
- "disicplines", "disciplines",
- "disingenuos", "disingenuous",
- "dismanlting", "dismantling",
- "dismantaled", "dismantled",
- "dismanteled", "dismantled",
- "disobediant", "disobedient",
- "disocgraphy", "discography",
- "disparingly", "disparagingly",
- "dispensaire", "dispensaries",
- "dispensarie", "dispenser",
- "dispensiary", "dispensary",
- "displacemnt", "displacement",
- "disposicion", "disposition",
- "disputandem", "disputandum",
- "disqualifed", "disqualified",
- "disregaring", "disregarding",
- "dissapeared", "disappeared",
- "dissapoined", "dissapointed",
- "dissapointd", "dissapointed",
- "dissapoited", "dissapointed",
- "dissappears", "disappears",
- "dissatisfed", "dissatisfied",
- "disscusions", "discussions",
- "dissertaion", "dissertation",
- "dissipatore", "dissipate",
- "distatesful", "distasteful",
- "distatseful", "distasteful",
- "disterbance", "disturbance",
- "disticntion", "distinctions",
- "distinciton", "distinction",
- "distincitve", "distinctive",
- "distinctily", "distinctly",
- "distingiush", "distinguish",
- "distinguise", "distinguished",
- "distinktion", "distinction",
- "distinquish", "distinguish",
- "distirbance", "disturbance",
- "distirbuted", "distribute",
- "distirbutor", "distributor",
- "distraccion", "distraction",
- "distractons", "distracts",
- "distraktion", "distraction",
- "distribitor", "distributor",
- "distribuent", "distribute",
- "distribuite", "distribute",
- "distribuito", "distribution",
- "distributie", "distributed",
- "distributin", "distribution",
- "distributio", "distributor",
- "distrobuted", "distributed",
- "distrubance", "disturbance",
- "distrubited", "distributed",
- "distrubitor", "distributor",
- "distrubuted", "distributed",
- "distrubutor", "distributor",
- "distructive", "destructive",
- "distuingish", "distinguish",
- "distunguish", "distinguish",
- "disturbante", "disturbance",
- "disturbence", "disturbance",
- "disucssions", "discussions",
- "divisionals", "divisions",
- "doccumented", "documented",
- "documantary", "documentary",
- "documenatry", "documentary",
- "documentare", "documentaries",
- "documentato", "documentation",
- "documentery", "documentary",
- "documentory", "documentary",
- "domesticted", "domesticated",
- "dominateurs", "dominates",
- "dominationg", "dominating",
- "donwloading", "downloading",
- "doublellift", "doublelift",
- "downlaoding", "downloading",
- "downloadbel", "downloadable",
- "downloadbig", "downloading",
- "downloadble", "downloadable",
- "downvoteers", "downvoters",
- "downvoteing", "downvoting",
- "downvoteres", "downvoters",
- "downvoteros", "downvoters",
- "downvoteurs", "downvoters",
- "downvotters", "downvoters",
- "downvotting", "downvoting",
- "dramaticaly", "dramatically",
- "dramaticlly", "dramatically",
- "drasitcally", "drastically",
- "dsyfunction", "dysfunction",
- "duetschland", "deutschland",
- "durabillity", "durability",
- "dyanmically", "dynamically",
- "dymanically", "dynamically",
- "dysfonction", "dysfunction",
- "dysfucntion", "dysfunction",
- "dysfunciton", "dysfunction",
- "dysfunktion", "dysfunction",
- "earhtquakes", "earthquakes",
- "earthqaukes", "earthquakes",
- "earthquacks", "earthquakes",
- "economicaly", "economically",
- "economiclly", "economically",
- "economisiti", "economist",
- "economistes", "economists",
- "educacional", "educational",
- "effeciently", "efficiently",
- "effecitvely", "effectively",
- "effectivley", "effectively",
- "efficeintly", "efficiently",
- "efficiantly", "efficiently",
- "efficientcy", "efficiently",
- "effortlesly", "effortlessly",
- "effortlessy", "effortlessly",
- "egaletarian", "egalitarian",
- "egalitatian", "egalitarian",
- "egaliterian", "egalitarian",
- "egostitical", "egotistical",
- "egotastical", "egotistical",
- "egotestical", "egotistical",
- "egotisitcal", "egotistical",
- "egotisticle", "egotistical",
- "egotystical", "egotistical",
- "ehtnicities", "ethnicities",
- "ejacluation", "ejaculation",
- "ejacualtion", "ejaculation",
- "electoratul", "electoral",
- "electornics", "electronics",
- "electricain", "electrician",
- "electricial", "electrical",
- "electricien", "electrician",
- "electricion", "electrician",
- "electricman", "electrician",
- "electrisity", "electricity",
- "electritian", "electrician",
- "electrocity", "electricity",
- "electrolyes", "electrolytes",
- "electrolyts", "electrolytes",
- "electroncis", "electrons",
- "electroylte", "electrolytes",
- "elementrary", "elementary",
- "eleminating", "eliminating",
- "elimanation", "elimination",
- "eliminacion", "elimination",
- "elimintates", "eliminates",
- "ellipitcals", "elliptical",
- "eloquentely", "eloquently",
- "emabrassing", "embarassing",
- "embaraasing", "embarassing",
- "embarasaing", "embarassing",
- "embarassign", "embarassing",
- "embarassimg", "embarassing",
- "embarassing", "embarrassing",
- "embarissing", "embarassing",
- "embarrasing", "embarrassing",
- "embarressed", "embarrassed",
- "embarrssing", "embarassing",
- "emergancies", "emergencies",
- "emergencias", "emergencies",
- "emergenices", "emergencies",
- "emmediately", "immediately",
- "emmisarries", "emissaries",
- "emotionella", "emotionally",
- "empahsizing", "emphasizing",
- "empathethic", "empathetic",
- "emphacizing", "emphasizing",
- "emphatising", "emphasizing",
- "emphatizing", "emphasizing",
- "emphazising", "emphasizing",
- "emphesizing", "emphasizing",
- "empiracally", "empirically",
- "empirialism", "imperialism",
- "empirialist", "imperialist",
- "enchamtment", "enchantment",
- "enchancment", "enchantment",
- "enchanement", "enchantment",
- "enchanthing", "enchanting",
- "enchantmant", "enchantment",
- "enchantmens", "enchantments",
- "enchantmets", "enchantments",
- "encomapsses", "encompasses",
- "encompasess", "encompasses",
- "encompesses", "encompasses",
- "encounteres", "encounters",
- "encoutnered", "encountered",
- "encryptiion", "encryption",
- "encyclopdia", "encyclopedia",
- "encylopedia", "encyclopedia",
- "endagnering", "endangering",
- "endandering", "endangering",
- "endorcement", "endorsement",
- "endoresment", "endorsement",
- "engagaments", "engagements",
- "engeneering", "engineering",
- "enginerring", "engineering",
- "enginnering", "engineering",
- "enlargments", "enlargements",
- "enligthened", "enlightened",
- "enourmously", "enormously",
- "enterpirses", "enterprises",
- "enterprices", "enterprises",
- "enterprishe", "enterprises",
- "entertainig", "entertaining",
- "entertwined", "entertained",
- "enthicities", "ethnicities",
- "enthisiasts", "enthusiasts",
- "enthuasists", "enthusiasts",
- "enthuisasts", "enthusiasts",
- "enthusaists", "enthusiasts",
- "enthusiants", "enthusiast",
- "enthusiasic", "enthusiastic",
- "enthusiasim", "enthusiasm",
- "enthusiasum", "enthusiasm",
- "enthusiatic", "enthusiastic",
- "enthusiests", "enthusiasts",
- "enthusigasm", "enthusiasm",
- "enthusisast", "enthusiasts",
- "entrepeneur", "entrepreneur",
- "entreperure", "entrepreneur",
- "entrepeuner", "entrepreneur",
- "entreprener", "entrepreneurs",
- "entreprenur", "entrepreneur",
- "entretained", "entertained",
- "envinroment", "environments",
- "enviorments", "environments",
- "enviornment", "environment",
- "envirnoment", "environment",
- "enviroments", "environments",
- "enviromnent", "environments",
- "environemnt", "environment",
- "environmnet", "environments",
- "envrionment", "environment",
- "equilavents", "equivalents",
- "equilbirium", "equilibrium",
- "equilevants", "equivalents",
- "equilibirum", "equilibrium",
- "equilibriam", "equilibrium",
- "equilibruim", "equilibrium",
- "equivalance", "equivalence",
- "equivalants", "equivalents",
- "equivalenet", "equivalents",
- "equivallent", "equivalent",
- "equivelance", "equivalence",
- "equivelants", "equivalents",
- "equivelents", "equivalents",
- "equivilants", "equivalents",
- "equivilence", "equivalence",
- "equivilents", "equivalents",
- "equivlalent", "equivalent",
- "equivlanets", "equivalents",
- "equivolence", "equivalence",
- "equivolents", "equivalents",
- "essencially", "essentially",
- "essentailly", "essentially",
- "essentialls", "essentials",
- "essentually", "essentially",
- "establising", "establishing",
- "ethicallity", "ethically",
- "ethincities", "ethnicities",
- "ethniticies", "ethnicities",
- "europeaners", "europeans",
- "europeaness", "europeans",
- "evaluatiing", "evaluating",
- "evaluationg", "evaluating",
- "evangalical", "evangelical",
- "evangelikal", "evangelical",
- "evengalical", "evangelical",
- "evenhtually", "eventually",
- "everyonehas", "everyones",
- "everyonelse", "everyones",
- "evidentally", "evidently",
- "exacarbated", "exacerbated",
- "exacberated", "exacerbated",
- "exagerating", "exaggerating",
- "exagerrated", "exaggerated",
- "exagerrates", "exaggerates",
- "exaggarated", "exaggerated",
- "exaggareted", "exaggerate",
- "exaggeratin", "exaggeration",
- "exaggerrate", "exaggerate",
- "exaggurated", "exaggerated",
- "exarcebated", "exacerbated",
- "excalmation", "exclamation",
- "excepcional", "exceptional",
- "exceptionel", "exceptional",
- "excessivley", "excessively",
- "exceutioner", "executioner",
- "exchanching", "exchanging",
- "exclamacion", "exclamation",
- "exclamating", "exclamation",
- "exclamativo", "exclamation",
- "exclemation", "exclamation",
- "exclimation", "exclamation",
- "exclucivity", "exclusivity",
- "exclusivety", "exclusivity",
- "exclusivily", "exclusivity",
- "exclusivley", "exclusively",
- "excpetional", "exceptional",
- "exculsively", "exclusively",
- "exculsivity", "exclusivity",
- "execitioner", "executioner",
- "execptional", "exceptional",
- "exectuables", "executable",
- "exectuioner", "executioner",
- "executionar", "executioner",
- "executionor", "executioner",
- "exerciseing", "exercising",
- "exeuctioner", "executioner",
- "existantial", "existential",
- "existencial", "existential",
- "existensial", "existential",
- "existentiel", "existential",
- "exlcamation", "exclamation",
- "exlcusively", "exclusively",
- "exlcusivity", "exclusivity",
- "exoskelaton", "exoskeleton",
- "expansiones", "expansions",
- "expectantcy", "expectancy",
- "expectating", "expectation",
- "expectional", "exceptional",
- "expendature", "expenditure",
- "expendeture", "expenditure",
- "expentiture", "expenditure",
- "expereinced", "experienced",
- "expereinces", "experiences",
- "experements", "experiments",
- "experianced", "experienced",
- "experiances", "experiences",
- "experiemnts", "experiments",
- "experiening", "experiencing",
- "experimetal", "experimental",
- "experimeted", "experimented",
- "experssions", "expressions",
- "expiditions", "expeditions",
- "expierenced", "experienced",
- "expierences", "experiences",
- "expirements", "experiments",
- "explainging", "explaining",
- "explaintory", "explanatory",
- "explanaiton", "explanations",
- "explanetary", "explanatory",
- "explanetory", "explanatory",
- "explanitary", "explanatory",
- "explanotory", "explanatory",
- "explenation", "explanation",
- "explenatory", "explanatory",
- "explicitely", "explicitly",
- "explicitily", "explicitly",
- "explination", "explanation",
- "explinatory", "explanatory",
- "exploitaion", "exploitation",
- "exploitatie", "exploitative",
- "explonation", "exploration",
- "exploracion", "exploration",
- "explorating", "exploration",
- "explorerers", "explorers",
- "explosiones", "explosions",
- "explotacion", "exploration",
- "expodential", "exponential",
- "exponantial", "exponential",
- "exponencial", "exponential",
- "exponentiel", "exponential",
- "expresscoin", "expression",
- "expressivos", "expressions",
- "expresssive", "expressive",
- "expressview", "expressive",
- "exprimental", "experimental",
- "expropiated", "expropriated",
- "extensiones", "extensions",
- "extensivley", "extensively",
- "extragavant", "extravagant",
- "extrapalate", "extrapolate",
- "extraploate", "extrapolate",
- "extrapolant", "extrapolate",
- "extrapolare", "extrapolate",
- "extrapolite", "extrapolate",
- "extrapulate", "extrapolate",
- "extravagent", "extravagant",
- "extravagina", "extravagant",
- "extravegant", "extravagant",
- "extravigant", "extravagant",
- "extravogant", "extravagant",
- "extremistas", "extremists",
- "extremistes", "extremists",
- "extropolate", "extrapolate",
- "fabircation", "fabrication",
- "fabricacion", "fabrication",
- "fabrikation", "fabrication",
- "facilitarte", "facilitate",
- "facilitiate", "facilitate",
- "facillitate", "facilitate",
- "facisnation", "fascination",
- "facsination", "fascination",
- "factuallity", "factually",
- "familairity", "familiarity",
- "familairize", "familiarize",
- "familiaries", "familiarize",
- "familierize", "familiarize",
- "fanatsizing", "fantasizing",
- "fanficitons", "fanfiction",
- "fantacising", "fantasizing",
- "fantacizing", "fantasizing",
- "fantasazing", "fantasizing",
- "fantasiaing", "fantasizing",
- "fantasyzing", "fantasizing",
- "fantazising", "fantasizing",
- "fascinacion", "fascination",
- "fascinatinf", "fascination",
- "fascisation", "fascination",
- "fascization", "fascination",
- "fashionalbe", "fashionable",
- "fashoinable", "fashionable",
- "fatalitites", "fatalities",
- "favoritisme", "favorites",
- "favoutrable", "favourable",
- "felxibility", "flexibility",
- "feministers", "feminists",
- "feministisk", "feminists",
- "fermentaion", "fermentation",
- "fermenterad", "fermented",
- "fertilizier", "fertilizer",
- "fertizilers", "fertilizer",
- "festivalens", "festivals",
- "fignernails", "fingernails",
- "fignerprint", "fingerprint",
- "figurativly", "figuratively",
- "finanically", "financially",
- "finantially", "financially",
- "fingerpints", "fingertips",
- "fingerpoint", "fingerprint",
- "fingertrips", "fingertips",
- "firefighers", "firefighters",
- "firefigther", "firefighters",
- "firendzoned", "friendzoned",
- "firghtening", "frightening",
- "flatterende", "flattered",
- "flawlessely", "flawlessly",
- "flawlessley", "flawlessly",
- "flexibiltiy", "flexibility",
- "flourescent", "fluorescent",
- "fluctuaties", "fluctuate",
- "fluctuative", "fluctuate",
- "flutteryshy", "fluttershy",
- "forcefullly", "forcefully",
- "foreseaable", "foreseeable",
- "foresseable", "foreseeable",
- "forgettting", "forgetting",
- "forgiviness", "forgiveness",
- "formallized", "formalized",
- "formattting", "formatting",
- "formidabble", "formidable",
- "formidabelt", "formidable",
- "formidabile", "formidable",
- "fortitudine", "fortitude",
- "fortuantely", "fortunately",
- "fortunantly", "fortunately",
- "fortunatley", "fortunately",
- "fortunetely", "fortunately",
- "franchieses", "franchises",
- "frankensite", "frankenstein",
- "frankensten", "frankenstein",
- "fransiscans", "franciscans",
- "freindships", "friendships",
- "freindzoned", "friendzoned",
- "frequenices", "frequencies",
- "frequensies", "frequencies",
- "frequenties", "frequencies",
- "frequentily", "frequently",
- "frequenzies", "frequencies",
- "friendboned", "friendzoned",
- "friendlines", "friendlies",
- "friendzonie", "friendzoned",
- "frientships", "friendships",
- "frientzoned", "friendzoned",
- "frightenend", "frightened",
- "frightining", "frightening",
- "frigthening", "frightening",
- "frinedzoned", "friendzoned",
- "frontlinies", "frontline",
- "frontlinjen", "frontline",
- "frustartion", "frustrations",
- "frustracion", "frustration",
- "frustraited", "frustrated",
- "frustrantes", "frustrates",
- "frustrasion", "frustrations",
- "frustrasted", "frustrates",
- "frustraties", "frustrates",
- "fucntioning", "functioning",
- "fulfillling", "fulfilling",
- "fulfullment", "fulfillment",
- "fullfilment", "fulfillment",
- "fullscreeen", "fullscreen",
- "funcitoning", "functioning",
- "functionaly", "functionally",
- "functionnal", "functional",
- "fundamentas", "fundamentals",
- "fundamently", "fundamental",
- "fundametals", "fundamentals",
- "fundamnetal", "fundamentals",
- "fundemantal", "fundamental",
- "fundemental", "fundamental",
- "fundimental", "fundamental",
- "furhtermore", "furthermore",
- "furstration", "frustration",
- "furthremore", "furthermore",
- "furthurmore", "furthermore",
- "futurisitic", "futuristic",
- "gangsterest", "gangsters",
- "gangsterous", "gangsters",
- "gauntlettes", "gauntlets",
- "geneologies", "genealogies",
- "generalizng", "generalizing",
- "generatting", "generating",
- "genitaliban", "genitalia",
- "gentlemanne", "gentlemen",
- "girlfirends", "girlfriends",
- "girlfreinds", "girlfriends",
- "girlfrients", "girlfriends",
- "glorifierad", "glorified",
- "glorifindel", "glorified",
- "goosebumbps", "goosebumps",
- "govenrments", "governments",
- "govermental", "governmental",
- "governemnts", "governments",
- "governmanet", "governmental",
- "governmeant", "governmental",
- "govormental", "governmental",
- "gracefullly", "gracefully",
- "grahpically", "graphically",
- "grammarical", "grammatical",
- "grammaticly", "grammatical",
- "grammitical", "grammatical",
- "graphcially", "graphically",
- "grassrooots", "grassroots",
- "gratuitious", "gratuitous",
- "gratuituous", "gratuitous",
- "gravitatiei", "gravitate",
- "grilfriends", "girlfriends",
- "grpahically", "graphically",
- "guaranteeds", "guarantees",
- "guerrillera", "guerrilla",
- "gunslingner", "gunslinger",
- "hamburgaren", "hamburger",
- "hamburgeres", "hamburgers",
- "hamburglers", "hamburgers",
- "hamburguers", "hamburgers",
- "handlebards", "handlebars",
- "handrwiting", "handwriting",
- "handycapped", "handicapped",
- "hanidcapped", "handicapped",
- "harassement", "harassment",
- "harrasments", "harassments",
- "harrassment", "harassment",
- "harvestgain", "harvesting",
- "headquartes", "headquarters",
- "headquaters", "headquarters",
- "hearhtstone", "hearthstone",
- "heartborken", "heartbroken",
- "heartbraker", "heartbreak",
- "heartbrakes", "heartbreak",
- "heartsthone", "hearthstone",
- "heaviweight", "heavyweight",
- "heavyweigth", "heavyweight",
- "heavywieght", "heavyweight",
- "helicoptors", "helicopters",
- "helicotpers", "helicopters",
- "helicpoters", "helicopters",
- "helictopers", "helicopters",
- "helikopters", "helicopters",
- "hemipsheres", "hemisphere",
- "hemishperes", "hemisphere",
- "herathstone", "hearthstone",
- "heterosexal", "heterosexual",
- "hexidecimal", "hexadecimal",
- "hierachical", "hierarchical",
- "hierarcical", "hierarchical",
- "highlighing", "highlighting",
- "highschoool", "highschool",
- "hipopotamus", "hippopotamus",
- "historicaly", "historically",
- "historicans", "historians",
- "historietas", "histories",
- "historinhas", "historians",
- "homecomeing", "homecoming",
- "homecomming", "homecoming",
- "homelesness", "homelessness",
- "homelessess", "homelessness",
- "homeowneris", "homeowners",
- "homoegenous", "homogeneous",
- "homogeneize", "homogenize",
- "homogenious", "homogeneous",
- "homogenuous", "homogeneous",
- "homophoboes", "homophobe",
- "homosexuais", "homosexuals",
- "homosexuels", "homosexuals",
- "hopelessely", "hopelessly",
- "hopelessley", "hopelessly",
- "hopsitality", "hospitality",
- "horizonatal", "horizontal",
- "horizontaal", "horizontal",
- "horizontaly", "horizontally",
- "horrendeous", "horrendous",
- "horrendious", "horrendous",
- "horrenduous", "horrendous",
- "hospitalzed", "hospitalized",
- "hospotality", "hospitality",
- "househoulds", "households",
- "humanitarna", "humanitarian",
- "humanitites", "humanities",
- "humilitaing", "humiliating",
- "humilitaion", "humiliation",
- "humillating", "humiliating",
- "humillation", "humiliation",
- "hurricaines", "hurricanes",
- "hurricances", "hurricanes",
- "hurricanger", "hurricane",
- "hyperbollic", "hyperbolic",
- "hyperbrophy", "hypertrophy",
- "hyperthropy", "hypertrophy",
- "hypertorphy", "hypertrophy",
- "hypertrohpy", "hypertrophy",
- "hypocritcal", "hypocritical",
- "hypocritial", "hypocritical",
- "hypocrities", "hypocrite",
- "hypothesees", "hypotheses",
- "hypothesies", "hypothesis",
- "hystericaly", "hysterically",
- "hystericlly", "hysterically",
- "iconclastic", "iconoclastic",
- "idealisitic", "idealistic",
- "identifible", "identifiable",
- "identitites", "identities",
- "identitties", "identities",
- "ideologiers", "ideologies",
- "ideologisen", "ideologies",
- "ideologiset", "ideologies",
- "ideologiske", "ideologies",
- "illegallity", "illegally",
- "illegitamte", "illegitimate",
- "illegitmate", "illegitimate",
- "illsutrator", "illustrator",
- "illuminanti", "illuminati",
- "illuminarti", "illuminati",
- "illuminatti", "illuminati",
- "illuminauti", "illuminati",
- "illuminiati", "illuminati",
- "illuminista", "illuminati",
- "illumintati", "illuminati",
- "illustarted", "illustrated",
- "illustartor", "illustrator",
- "illustraded", "illustrated",
- "illustraion", "illustration",
- "illustrater", "illustrator",
- "illustratie", "illustrate",
- "illustratin", "illustrations",
- "illustraton", "illustration",
- "imaganative", "imaginative",
- "imaganitive", "imaginative",
- "imaginacion", "imagination",
- "imaginatiei", "imaginative",
- "imaginating", "imagination",
- "imaginativo", "imagination",
- "imaginitave", "imaginative",
- "imbalanaced", "imbalanced",
- "imbalanaces", "imbalances",
- "imbalancers", "imbalances",
- "immatureity", "immaturity",
- "immedeately", "immediately",
- "immediantly", "immediately",
- "immediatley", "immediately",
- "immedietely", "immediately",
- "immideately", "immediately",
- "immidiately", "immediately",
- "immigraiton", "immigration",
- "immigrantes", "immigrants",
- "immoratlity", "immortality",
- "immortailty", "immortality",
- "immortalisy", "immortals",
- "impeccabile", "impeccable",
- "imperailist", "imperialist",
- "imperealist", "imperialist",
- "imperialims", "imperialism",
- "imperialsim", "imperialism",
- "imperiarist", "imperialist",
- "imperically", "empirically",
- "imperislist", "imperialist",
- "implausable", "implausible",
- "implausbile", "implausible",
- "implementas", "implements",
- "implementes", "implements",
- "implementig", "implementing",
- "implementos", "implements",
- "implicacion", "implication",
- "implicatons", "implications",
- "implicitely", "implicitly",
- "implicitily", "implicitly",
- "implikation", "implication",
- "implimented", "implemented",
- "importantce", "importance",
- "importently", "importantly",
- "imporvement", "improvement",
- "impossibile", "impossible",
- "impossibily", "impossibly",
- "impossibley", "impossibly",
- "impossiblly", "impossibly",
- "impoverised", "impoverished",
- "impracticle", "impractical",
- "impressario", "impresario",
- "impresssion", "impressions",
- "imprisonent", "imprisonment",
- "imprisonned", "imprisoned",
- "improbabile", "improbable",
- "improtantly", "importantly",
- "improvemnts", "improvements",
- "improvished", "improvised",
- "improvision", "improvisation",
- "improvments", "improvements",
- "impulsivley", "impulsive",
- "imrpovement", "improvement",
- "inaccessble", "inaccessible",
- "inaccuraces", "inaccuracies",
- "inaccurrate", "inaccurate",
- "inadvertant", "inadvertent",
- "inaguration", "inauguration",
- "inahbitants", "inhabitants",
- "incarantion", "incarnation",
- "incarcerato", "incarceration",
- "incarnacion", "incarnation",
- "incentivare", "incentive",
- "incentivate", "incentive",
- "incentivice", "incentive",
- "incentivies", "incentives",
- "incidencies", "incidence",
- "incidentaly", "incidentally",
- "incidential", "incidental",
- "inclanation", "inclination",
- "inclenation", "inclination",
- "inclinacion", "inclination",
- "inclinaison", "inclination",
- "incognition", "incognito",
- "incoherrent", "incoherent",
- "incompatble", "incompatible",
- "incompatent", "incompetent",
- "incompetant", "incompetent",
- "incompitent", "incompetent",
- "incompotent", "incompetent",
- "incomptable", "incompatible",
- "inconsisent", "inconsistent",
- "inconveniet", "inconvenient",
- "incoroprate", "incorporate",
- "incorparate", "incorporate",
- "incorperate", "incorporate",
- "incorporare", "incorporate",
- "incorported", "incorporated",
- "incorprates", "incorporates",
- "incorproate", "incorporated",
- "incramental", "incremental",
- "increadible", "incredible",
- "incrediable", "incredible",
- "incrediably", "incredibly",
- "incredibile", "incredible",
- "incredibily", "incredibly",
- "incredibley", "incredibly",
- "incrememnts", "increments",
- "incremenets", "increments",
- "incrementas", "increments",
- "incremently", "incremental",
- "incrementos", "increments",
- "incrimental", "incremental",
- "inctroduced", "introduced",
- "indefinetly", "indefinitely",
- "indefininte", "indefinite",
- "indefinitly", "indefinitely",
- "indepdenent", "independents",
- "indepedence", "independence",
- "indepednent", "independents",
- "independant", "independent",
- "independece", "independence",
- "independens", "independents",
- "independetn", "independents",
- "independets", "independents",
- "independnet", "independents",
- "indepentend", "independents",
- "indepentent", "independent",
- "indianapols", "indianapolis",
- "indicateurs", "indicates",
- "indicatiors", "indicators",
- "indictement", "indictment",
- "indifferant", "indifferent",
- "indiffernce", "indifference",
- "indigeneous", "indigenous",
- "indigenious", "indigenous",
- "indigenuous", "indigenous",
- "indigineous", "indigenous",
- "indipendent", "independent",
- "indirectely", "indirectly",
- "individiual", "individual",
- "individuais", "individuals",
- "individualy", "individually",
- "individuati", "individuality",
- "individuels", "individuals",
- "indivuduals", "individuals",
- "industriels", "industries",
- "ineffecitve", "ineffective",
- "ineffektive", "ineffective",
- "inefficeint", "inefficient",
- "inefficiant", "inefficient",
- "ineffictive", "ineffective",
- "ineffizient", "inefficient",
- "inequallity", "inequality",
- "inevitabile", "inevitable",
- "inevitabily", "inevitably",
- "inevitabley", "inevitably",
- "inevitablly", "inevitably",
- "inexpencive", "inexpensive",
- "inexpenisve", "inexpensive",
- "inexperiece", "inexperience",
- "inexperince", "inexperience",
- "inexplicaby", "inexplicably",
- "infallibale", "infallible",
- "infallibile", "infallible",
- "infectation", "infestation",
- "inferioirty", "inferiority",
- "infestating", "infestation",
- "infilitrate", "infiltrate",
- "infiltartor", "infiltrator",
- "infiltraron", "infiltrator",
- "infiltrarte", "infiltrate",
- "infiltrater", "infiltrator",
- "infiltratie", "infiltrate",
- "infiltrerat", "infiltrate",
- "infinitelly", "infinitely",
- "infintrator", "infiltrator",
- "inflamation", "inflammation",
- "inflatabale", "inflatable",
- "inflitrator", "infiltrator",
- "influancing", "influencing",
- "influencial", "influential",
- "influencian", "influencing",
- "influenting", "influencing",
- "influentual", "influential",
- "influincing", "influencing",
- "infograhpic", "infographic",
- "infograpgic", "infographic",
- "infogrpahic", "infographic",
- "informacion", "information",
- "informatice", "informative",
- "informatief", "informative",
- "informatiei", "informative",
- "informatike", "informative",
- "informativo", "information",
- "informitive", "informative",
- "infrigement", "infringement",
- "infringeing", "infringing",
- "infromation", "information",
- "infromative", "informative",
- "infulential", "influential",
- "ingerdients", "ingredients",
- "ingrediants", "ingredients",
- "ingreidents", "ingredient",
- "ingriedents", "ingredient",
- "inhabitents", "inhabitants",
- "inheirtance", "inheritance",
- "inheratance", "inheritance",
- "inheretance", "inheritance",
- "inheritence", "inheritance",
- "inhertiance", "inheritance",
- "initaitives", "initiatives",
- "initalisers", "initialisers",
- "initalising", "initialising",
- "initalizers", "initializers",
- "initalizing", "initializing",
- "initiaitive", "initiative",
- "inititiaves", "initiatives",
- "innocenters", "innocents",
- "innocentius", "innocents",
- "innoculated", "inoculated",
- "inpsiration", "inspiration",
- "inquisicion", "inquisition",
- "inquisistor", "inquisitor",
- "inquisiting", "inquisition",
- "inquisitior", "inquisitor",
- "inquisitivo", "inquisition",
- "inquizition", "inquisition",
- "insecurites", "insecurities",
- "insensative", "insensitive",
- "insensetive", "insensitive",
- "insentitive", "insensitive",
- "insepctions", "inspections",
- "inseperable", "inseparable",
- "insipration", "inspiration",
- "insitutions", "institutions",
- "insparation", "inspiration",
- "inspecticon", "inspection",
- "inspectoras", "inspectors",
- "insperation", "inspiration",
- "inspiracion", "inspiration",
- "inspirating", "inspiration",
- "inspriation", "inspiration",
- "instalation", "installation",
- "instalement", "installment",
- "installatin", "installations",
- "installeert", "installer",
- "installemnt", "installment",
- "installling", "installing",
- "installmant", "installment",
- "instanciate", "instantiate",
- "instantaneu", "instantaneous",
- "institucion", "institution",
- "institutiei", "institute",
- "instituttet", "institute",
- "instraments", "instruments",
- "instruccion", "instruction",
- "instruciton", "instruction",
- "instructers", "instructors",
- "instructior", "instructor",
- "instructios", "instructors",
- "instructivo", "instruction",
- "instructons", "instructors",
- "instruktion", "instruction",
- "instrumenal", "instrumental",
- "instrumetal", "instrumental",
- "insturction", "instruction",
- "insturctors", "instructors",
- "insturments", "instruments",
- "instutition", "institution",
- "instutution", "institution",
- "insufficent", "insufficient",
- "insuinating", "insinuating",
- "insuniating", "insinuating",
- "insurgencey", "insurgency",
- "intangiable", "intangible",
- "intangibile", "intangible",
- "inteferring", "interfering",
- "integracion", "integration",
- "integratron", "integration",
- "integrering", "interfering",
- "intelectual", "intellectual",
- "inteligence", "intelligence",
- "intellectul", "intellectuals",
- "intellectus", "intellectuals",
- "intellecual", "intellectual",
- "intellegent", "intelligent",
- "intelligant", "intelligent",
- "intencional", "intentional",
- "intentionly", "intentional",
- "interaccion", "interaction",
- "interactice", "interactive",
- "interacties", "interacts",
- "interactifs", "interacts",
- "interactins", "interacts",
- "interactios", "interacts",
- "interactivo", "interaction",
- "interactons", "interacts",
- "interaktion", "interaction",
- "interaktive", "interactive",
- "interasting", "interacting",
- "intercation", "integration",
- "interceptin", "interception",
- "intercoarse", "intercourse",
- "intercource", "intercourse",
- "interecting", "interacting",
- "interection", "interaction",
- "interelated", "interrelated",
- "interersted", "interpreted",
- "interesring", "interfering",
- "interessted", "interested",
- "interferece", "interference",
- "interferens", "interferes",
- "interferire", "interfere",
- "interfernce", "interference",
- "interferred", "interfere",
- "interferres", "interferes",
- "intergation", "integration",
- "intergrated", "integrated",
- "intermedate", "intermediate",
- "intermedite", "intermediate",
- "intermitent", "intermittent",
- "internation", "international",
- "interneters", "internets",
- "internetese", "internets",
- "internetest", "internets",
- "interneting", "interesting",
- "internetors", "internets",
- "internettes", "internets",
- "interperted", "interpreted",
- "interperter", "interpreter",
- "interprered", "interpreter",
- "interpretor", "interpreter",
- "interratial", "interracial",
- "interresing", "interfering",
- "interrogato", "interrogation",
- "interrputed", "interrupted",
- "interruping", "interrupting",
- "interruptes", "interrupts",
- "interruptis", "interrupts",
- "intersecton", "intersection",
- "interstelar", "interstellar",
- "intertained", "intertwined",
- "intertvined", "intertwined",
- "intertwyned", "intertwined",
- "intervalles", "intervals",
- "intervation", "integration",
- "interveiwed", "interviewed",
- "interveiwer", "interviewer",
- "intervenion", "intervening",
- "intervenire", "intervene",
- "interventie", "intervene",
- "intervewing", "intervening",
- "interviened", "interviewed",
- "interviewes", "interviews",
- "interviewie", "interviewer",
- "intervining", "intervening",
- "interwebers", "interwebs",
- "interwiever", "interviewer",
- "intestinces", "intestines",
- "inticracies", "intricacies",
- "intimadated", "intimidated",
- "intimidades", "intimidated",
- "intimidante", "intimidate",
- "intimidatie", "intimidated",
- "intimidatin", "intimidation",
- "intimidaton", "intimidation",
- "intimidiate", "intimidate",
- "intiminated", "intimidated",
- "intimitaded", "intimidated",
- "intimitated", "intimidated",
- "intiutively", "intuitively",
- "intoleranse", "intolerance",
- "intolerante", "intolerance",
- "intolerence", "intolerance",
- "intolernace", "intolerance",
- "intolorance", "intolerance",
- "intolorence", "intolerance",
- "intorducing", "introducing",
- "intorverted", "introverted",
- "intoxicatin", "intoxication",
- "intoxicaton", "intoxication",
- "intoxinated", "intoxicated",
- "intoxocated", "intoxicated",
- "intracacies", "intricacies",
- "intracicies", "intricacies",
- "intraverted", "introverted",
- "intrecacies", "intricacies",
- "intrepreted", "interpreted",
- "intrepreter", "interpreter",
- "intrerupted", "interrupted",
- "intricasies", "intricacies",
- "intricicies", "intricacies",
- "intrigueing", "intriguing",
- "intrinsisch", "intrinsic",
- "introducion", "introduction",
- "introducted", "introduced",
- "introductie", "introduce",
- "introvertie", "introverted",
- "introvertis", "introverts",
- "intruducing", "introducing",
- "intrumental", "instrumental",
- "intuatively", "intuitively",
- "intuitevely", "intuitively",
- "intuitivley", "intuitively",
- "intuituvely", "intuitively",
- "inutitively", "intuitively",
- "invaldiates", "invalidates",
- "invalidades", "invalidates",
- "invalidante", "invalidate",
- "invariabley", "invariably",
- "invariablly", "invariably",
- "inventiones", "inventions",
- "invesitgate", "investigate",
- "investagate", "investigate",
- "investiagte", "investigate",
- "investigare", "investigate",
- "invincibile", "invincible",
- "invincinble", "invincible",
- "invisibiity", "invisibility",
- "invisibiliy", "invisibility",
- "involantary", "involuntary",
- "involentary", "involuntary",
- "involintary", "involuntary",
- "involontary", "involuntary",
- "involunatry", "involuntary",
- "invulnerabe", "invulnerable",
- "invulnerble", "invulnerable",
- "iresistable", "irresistible",
- "iresistably", "irresistibly",
- "iresistible", "irresistible",
- "iresistibly", "irresistibly",
- "irrationaly", "irrationally",
- "irrationnal", "irrational",
- "islamisists", "islamists",
- "islamisters", "islamists",
- "islamistisk", "islamists",
- "isntruments", "instruments",
- "jacksonvile", "jacksonville",
- "jailbroaken", "jailbroken",
- "jailbrocken", "jailbroken",
- "jounralists", "journalists",
- "jouranlists", "journalists",
- "journalisim", "journalism",
- "journalistc", "journalistic",
- "journolists", "journalists",
- "judegmental", "judgemental",
- "judgamental", "judgemental",
- "judgementle", "judgemental",
- "judgementsl", "judgemental",
- "judgenental", "judgemental",
- "jugdemental", "judgemental",
- "juggernaugt", "juggernaut",
- "juggernault", "juggernaut",
- "juggernaunt", "juggernaut",
- "justifyable", "justifiable",
- "kidnappning", "kidnapping",
- "kidnappping", "kidnapping",
- "kilometeres", "kilometers",
- "kindergaten", "kindergarten",
- "knowledgabe", "knowledgable",
- "knowledgble", "knowledgable",
- "kryptoninte", "kryptonite",
- "lacklusture", "lackluster",
- "laughablely", "laughably",
- "legalizaing", "legalizing",
- "legalizaton", "legalization",
- "legalizeing", "legalizing",
- "legenadries", "legendaries",
- "legendaires", "legendaries",
- "legendarios", "legendaries",
- "legendarisk", "legendaries",
- "legendaryes", "legendaries",
- "legenderies", "legendaries",
- "legilsation", "legislation",
- "legislacion", "legislation",
- "legislativo", "legislation",
- "legistation", "legislation",
- "legistative", "legislative",
- "legistators", "legislators",
- "legitematly", "legitimately",
- "legitimancy", "legitimacy",
- "legitimatcy", "legitimacy",
- "legitimatly", "legitimately",
- "legitimetly", "legitimately",
- "legnedaries", "legendaries",
- "lengedaries", "legendaries",
- "liberalisim", "liberalism",
- "liberatrian", "libertarians",
- "libertairan", "libertarians",
- "libertarain", "libertarian",
- "libertarias", "libertarians",
- "libertarien", "libertarian",
- "libertaryan", "libertarian",
- "libertatian", "libertarian",
- "liberterian", "libertarian",
- "libguistics", "linguistics",
- "libretarian", "libertarian",
- "lieutennant", "lieutenant",
- "lieutentant", "lieutenant",
- "lightenning", "lightening",
- "lightenting", "lightening",
- "lightheared", "lighthearted",
- "lightheated", "lighthearted",
- "lightweigth", "lightweight",
- "lightwieght", "lightweight",
- "lightwright", "lightweight",
- "ligthweight", "lightweight",
- "limitaitons", "limitation",
- "linguisitcs", "linguistics",
- "linguisitic", "linguistic",
- "lingusitics", "linguistics",
- "lithuaninan", "lithuania",
- "littlefiger", "littlefinger",
- "littlefiner", "littlefinger",
- "lockscreeen", "lockscreen",
- "longevitity", "longevity",
- "lotharingen", "lothringen",
- "louisvillle", "louisville",
- "maginficent", "magnificent",
- "magneficent", "magnificent",
- "magnicifent", "magnificent",
- "magnifacent", "magnificent",
- "magnifecent", "magnificent",
- "magnificant", "magnificent",
- "magnitudine", "magnitude",
- "maintainted", "maintained",
- "maintanance", "maintenance",
- "maintanence", "maintenance",
- "maintenence", "maintenance",
- "maintianing", "maintaining",
- "maintinaing", "maintaining",
- "maintinance", "maintenance",
- "maintinence", "maintenance",
- "malfonction", "malfunction",
- "malfucntion", "malfunction",
- "malfunciton", "malfunction",
- "malfuncting", "malfunction",
- "malfunktion", "malfunction",
- "malpractise", "malpractice",
- "malpractive", "malpractice",
- "maneouvring", "manoeuvring",
- "manifestado", "manifesto",
- "manifestano", "manifesto",
- "manifestato", "manifesto",
- "manifestion", "manifesto",
- "manifestior", "manifesto",
- "manifestons", "manifests",
- "manifestors", "manifests",
- "manipluated", "manipulated",
- "manipualted", "manipulated",
- "manipulatie", "manipulative",
- "manipulatin", "manipulation",
- "manipulaton", "manipulation",
- "maniuplated", "manipulated",
- "mannerisims", "mannerisms",
- "manslaugher", "manslaughter",
- "manslaugter", "manslaughter",
- "manufacters", "manufactures",
- "manufacteur", "manufactures",
- "manufactued", "manufactured",
- "manufactuer", "manufacture",
- "manufacturs", "manufactures",
- "manufacuter", "manufacture",
- "manufacutre", "manufactures",
- "manufatured", "manufactured",
- "manupilated", "manipulated",
- "marganilize", "marginalized",
- "marhsmallow", "marshmallow",
- "marijuannas", "marijuana",
- "markerplace", "marketplace",
- "marketpalce", "marketplace",
- "marshamllow", "marshmallow",
- "marshmalows", "marshmallows",
- "masculanity", "masculinity",
- "masculenity", "masculinity",
- "masrhmallow", "marshmallow",
- "mastermined", "mastermind",
- "masterpeace", "masterpiece",
- "masterpeice", "masterpiece",
- "mastrubated", "masturbated",
- "mastrubates", "masturbate",
- "masturabted", "masturbated",
- "masturbaing", "masturbating",
- "masturbarte", "masturbate",
- "masturbathe", "masturbated",
- "masturbatie", "masturbated",
- "masturbatin", "masturbation",
- "masturbaton", "masturbation",
- "masturbsted", "masturbated",
- "masturpiece", "masterpiece",
- "masuclinity", "masculinity",
- "matchamking", "matchmaking",
- "materalists", "materialist",
- "materialsim", "materialism",
- "mathamatics", "mathematics",
- "mathcmaking", "matchmaking",
- "mathemagics", "mathematics",
- "mathemetics", "mathematics",
- "mathimatics", "mathematics",
- "matieralism", "materialism",
- "maybelleine", "maybelline",
- "maybelliene", "maybelline",
- "maybellinne", "maybelline",
- "maybellline", "maybelline",
- "mdifielders", "midfielders",
- "meatballers", "meatballs",
- "mecernaries", "mercenaries",
- "mechanicaly", "mechanically",
- "mechanichal", "mechanical",
- "mechaniclly", "mechanically",
- "mechanicsms", "mechanisms",
- "mechanisims", "mechanism",
- "mechanismus", "mechanisms",
- "medicaitons", "medications",
- "medicineras", "medicines",
- "meditatiing", "meditating",
- "meditationg", "meditating",
- "mentionning", "mentioning",
- "mercanaries", "mercenaries",
- "mercaneries", "mercenaries",
- "mercenaires", "mercenaries",
- "mercenarias", "mercenaries",
- "mercenarios", "mercenaries",
- "merceneries", "mercenaries",
- "merchandice", "merchandise",
- "merchandies", "merchandise",
- "merchanidse", "merchandise",
- "merchanters", "merchants",
- "merchendise", "merchandise",
- "merchindise", "merchandise",
- "mercinaries", "mercenaries",
- "mercineries", "mercenaries",
- "metabolisim", "metabolism",
- "metabolitic", "metabolic",
- "metaphisics", "metaphysics",
- "metaphorial", "metaphorical",
- "metaphorics", "metaphors",
- "metaphsyics", "metaphysics",
- "metaphyiscs", "metaphysics",
- "methodoligy", "methodology",
- "metholodogy", "methodology",
- "metropolian", "metropolitan",
- "metropolies", "metropolis",
- "metropollis", "metropolis",
- "metropolois", "metropolis",
- "micorcenter", "microcenter",
- "micorphones", "microphones",
- "microcender", "microcenter",
- "microcentre", "microcenter",
- "microcentro", "microcenter",
- "microhpones", "microphones",
- "microscrope", "microscope",
- "microwavees", "microwaves",
- "microwavers", "microwaves",
- "midfeilders", "midfielders",
- "midfiedlers", "midfielders",
- "midfileders", "midfielders",
- "midifelders", "midfielders",
- "millienaire", "millionaire",
- "millionairs", "millionaires",
- "millionarie", "millionaire",
- "millioniare", "millionaire",
- "mindlessely", "mindlessly",
- "mindlessley", "mindlessly",
- "minimalstic", "minimalist",
- "ministerens", "ministers",
- "ministerios", "ministers",
- "minneaoplis", "minneapolis",
- "minneaplois", "minneapolis",
- "minniapolis", "minneapolis",
- "miraculaous", "miraculous",
- "miraculosly", "miraculously",
- "miraculousy", "miraculously",
- "mircocenter", "microcenter",
- "mircophones", "microphones",
- "mircoscopic", "microscopic",
- "miscairrage", "miscarriage",
- "miscarraige", "miscarriage",
- "miscarridge", "miscarriage",
- "miscarriege", "miscarriage",
- "mischeivous", "mischievous",
- "mischevious", "mischievous",
- "misdameanor", "misdemeanor",
- "misdeamenor", "misdemeanor",
- "misdemeaner", "misdemeanor",
- "misdemenaor", "misdemeanor",
- "misdemenors", "misdemeanors",
- "misdimeanor", "misdemeanor",
- "misdomeanor", "misdemeanor",
- "miserablely", "miserably",
- "misfortunte", "misfortune",
- "misimformed", "misinformed",
- "misinterept", "misinterpret",
- "misinterpet", "misinterpret",
- "misoginysts", "misogynist",
- "misognyists", "misogynist",
- "misogyinsts", "misogynist",
- "misogynisic", "misogynistic",
- "misogynistc", "misogynistic",
- "misogynstic", "misogynist",
- "missionaire", "missionaries",
- "missionairy", "missionary",
- "missionares", "missionaries",
- "missionaris", "missionaries",
- "missionarry", "missionary",
- "missionnary", "missionary",
- "mississipis", "mississippi",
- "misspeeling", "misspelling",
- "misspellled", "misspelled",
- "mistakengly", "mistakenly",
- "mistakently", "mistakenly",
- "moderatedly", "moderately",
- "moderateurs", "moderates",
- "moderatorin", "moderation",
- "modificaton", "modification",
- "moisterizer", "moisturizer",
- "moistruizer", "moisturizer",
- "moisturizng", "moisturizing",
- "moisturizor", "moisturizer",
- "moistutizer", "moisturizer",
- "moisutrizer", "moisturizer",
- "moleculaire", "molecular",
- "molestating", "molestation",
- "moleststion", "molestation",
- "momemtarily", "momentarily",
- "momentairly", "momentarily",
- "momentaraly", "momentarily",
- "momentarely", "momentarily",
- "momenterily", "momentarily",
- "monestaries", "monasteries",
- "monitoreada", "monitored",
- "monitoreado", "monitored",
- "monogameous", "monogamous",
- "monolitihic", "monolithic",
- "monopollies", "monopolies",
- "monstorsity", "monstrosity",
- "monstrasity", "monstrosity",
- "monstrisity", "monstrosity",
- "monstrocity", "monstrosity",
- "monstrosoty", "monstrosity",
- "monstrostiy", "monstrosity",
- "monumentaal", "monumental",
- "monumentais", "monuments",
- "monumentals", "monuments",
- "monumentous", "monuments",
- "mositurizer", "moisturizer",
- "mosntrosity", "monstrosity",
- "motehrboard", "motherboard",
- "mothebroard", "motherboards",
- "motherbaord", "motherboard",
- "motherboads", "motherboards",
- "motherboars", "motherboards",
- "motherborad", "motherboard",
- "motherbords", "motherboards",
- "motherobard", "motherboards",
- "mothreboard", "motherboards",
- "motivatinal", "motivational",
- "motorcicles", "motorcycles",
- "motorcylces", "motorcycles",
- "mouthpeices", "mouthpiece",
- "mulitplayer", "multiplayer",
- "mulitplying", "multiplying",
- "multipalyer", "multiplayer",
- "multiplater", "multiplayer",
- "multiplebgs", "multiples",
- "multipleies", "multiples",
- "multitaskng", "multitasking",
- "multitudine", "multitude",
- "multiverese", "multiverse",
- "multyplayer", "multiplayer",
- "multyplying", "multiplying",
- "muncipality", "municipality",
- "murdererous", "murderers",
- "musicallity", "musically",
- "mutliplayer", "multiplayer",
- "mutliplying", "multiplying",
- "mysterieuse", "mysteries",
- "mysteriosly", "mysteriously",
- "mysteriouly", "mysteriously",
- "mysteriousy", "mysteriously",
- "napoleonian", "napoleonic",
- "narcisissim", "narcissism",
- "narcisissts", "narcissist",
- "narcisscism", "narcissism",
- "narcisscist", "narcissist",
- "narcissisim", "narcissism",
- "narcississm", "narcissism",
- "narcississt", "narcissist",
- "narcissistc", "narcissistic",
- "narcissitic", "narcissistic",
- "narcisssism", "narcissism",
- "narcisssist", "narcissist",
- "narcissstic", "narcissist",
- "natioanlist", "nationalist",
- "nationailty", "nationality",
- "nationalesl", "nationals",
- "nationalisn", "nationals",
- "nationalite", "nationalist",
- "nationalits", "nationalist",
- "nationalizm", "nationalism",
- "nationalsim", "nationalism",
- "neccesarily", "necessarily",
- "necessairly", "necessarily",
- "necessaties", "necessities",
- "necesseraly", "necessarily",
- "necesserily", "necessarily",
- "necessiates", "necessities",
- "necessitive", "necessities",
- "neckbeardos", "neckbeards",
- "neckbeardus", "neckbeards",
- "necormancer", "necromancer",
- "necromamcer", "necromancer",
- "necromanser", "necromancer",
- "necromencer", "necromancer",
- "needlessley", "needlessly",
- "negativeity", "negativity",
- "negativelly", "negatively",
- "negativitiy", "negativity",
- "negiotating", "negotiating",
- "negligiable", "negligible",
- "negociating", "negotiating",
- "negociation", "negotiation",
- "negoitating", "negotiating",
- "negoitation", "negotiation",
- "negotiatied", "negotiate",
- "negotiative", "negotiate",
- "negotiatons", "negotiations",
- "neigborhood", "neighborhood",
- "neigbouring", "neighbouring",
- "neighborhod", "neighborhood",
- "neighbourgs", "neighbours",
- "neighouring", "neighboring",
- "nercomancer", "necromancer",
- "nessasarily", "necessarily",
- "neurologial", "neurological",
- "neurosciene", "neuroscience",
- "neutrallity", "neutrality",
- "neverthelss", "nevertheless",
- "neverthless", "nevertheless",
- "newspapaers", "newspapers",
- "newspappers", "newspapers",
- "nieghboring", "neighboring",
- "nightmarket", "nightmare",
- "nonsencical", "nonsensical",
- "nonsenscial", "nonsensical",
- "nonsensicle", "nonsensical",
- "normallized", "normalized",
- "northwesten", "northwestern",
- "nostalgisch", "nostalgic",
- "noteworthly", "noteworthy",
- "noticeabley", "noticeably",
- "notificaton", "notification",
- "notoriuosly", "notoriously",
- "numericable", "numerical",
- "nurtitional", "nutritional",
- "nutricional", "nutritional",
- "nutrutional", "nutritional",
- "obamination", "abomination",
- "obersvation", "observation",
- "obilterated", "obliterated",
- "objectivety", "objectivity",
- "objectivify", "objectivity",
- "objectivily", "objectivity",
- "objectivley", "objectively",
- "obliberated", "obliterated",
- "obliderated", "obliterated",
- "obligerated", "obliterated",
- "oblitarated", "obliterated",
- "obliteraded", "obliterated",
- "obliterared", "obliterated",
- "oblitirated", "obliterated",
- "oblitorated", "obliterated",
- "obliverated", "obliterated",
- "observacion", "observation",
- "observaiton", "observant",
- "observasion", "observations",
- "observating", "observation",
- "observerats", "observers",
- "obsessivley", "obsessive",
- "obstruccion", "obstruction",
- "obstruktion", "obstruction",
- "obsturction", "obstruction",
- "obversation", "observation",
- "ocasionally", "occasionally",
- "ocassionaly", "occasionally",
- "occasionals", "occasions",
- "occasionaly", "occasionally",
- "occasionnal", "occasional",
- "occassional", "occasional",
- "occassioned", "occasioned",
- "occurrances", "occurrences",
- "offensivley", "offensively",
- "offesnively", "offensively",
- "officiallly", "officially",
- "olbiterated", "obliterated",
- "omniscienct", "omniscient",
- "operacional", "operational",
- "operasional", "operational",
- "operationel", "operational",
- "oppresssing", "oppressing",
- "oppresssion", "oppression",
- "opprotunity", "opportunity",
- "optimisitic", "optimistic",
- "optimizaton", "optimization",
- "orchestraed", "orchestrated",
- "orchestrial", "orchestra",
- "oreintation", "orientation",
- "organisaton", "organisation",
- "organiserad", "organised",
- "organistion", "organisation",
- "organizarea", "organizer",
- "organizarem", "organizer",
- "organizarme", "organizer",
- "organizarte", "organizer",
- "organiztion", "organization",
- "oridinarily", "ordinarily",
- "orientacion", "orientation",
- "originially", "originally",
- "originnally", "originally",
- "origniality", "originality",
- "ostensiably", "ostensibly",
- "ostensibily", "ostensibly",
- "outclasssed", "outclassed",
- "outnunbered", "outnumbered",
- "outperfroms", "outperform",
- "outpreforms", "outperform",
- "outrageosly", "outrageously",
- "outrageouly", "outrageously",
- "outragerous", "outrageous",
- "outskirters", "outskirts",
- "outsorucing", "outsourcing",
- "outsourcade", "outsourced",
- "outsoursing", "outsourcing",
- "overbraking", "overbearing",
- "overcapping", "overlapping",
- "overcharing", "overarching",
- "overclcoked", "overclocked",
- "overclicked", "overclocked",
- "overcloaked", "overclocked",
- "overclocing", "overclocking",
- "overclockig", "overclocking",
- "overclocled", "overclocked",
- "overcomeing", "overcoming",
- "overcomming", "overcoming",
- "overeaching", "overarching",
- "overfapping", "overlapping",
- "overheading", "overheating",
- "overhooking", "overlooking",
- "overhwelmed", "overwhelmed",
- "overkapping", "overlapping",
- "overklocked", "overclocked",
- "overlapsing", "overlapping",
- "overlcocked", "overclocked",
- "overlcoking", "overlooking",
- "overlooming", "overlooking",
- "overloooked", "overlooked",
- "overlordess", "overlords",
- "overmapping", "overlapping",
- "overpooling", "overlooking",
- "overpovered", "overpowered",
- "overpoweing", "overpowering",
- "overreacing", "overreacting",
- "overreactin", "overreaction",
- "overreacton", "overreaction",
- "overshaddow", "overshadowed",
- "overshadowd", "overshadowed",
- "overtapping", "overlapping",
- "overthining", "overthinking",
- "overthinkig", "overthinking",
- "overvlocked", "overclocked",
- "overwealmed", "overwhelmed",
- "overwelming", "overwhelming",
- "overwhelemd", "overwhelmed",
- "overwhelimg", "overwhelm",
- "overwheling", "overwhelming",
- "overwhemled", "overwhelmed",
- "overwhlemed", "overwhelmed",
- "overwritted", "overwrite",
- "pakistanais", "pakistani",
- "pakistanezi", "pakistani",
- "palceholder", "placeholder",
- "palesitnian", "palestinians",
- "palestenian", "palestinian",
- "palestinain", "palestinians",
- "palestinans", "palestinians",
- "palestinier", "palestine",
- "palistinian", "palestinian",
- "palythrough", "playthrough",
- "papanicalou", "papanicolaou",
- "parachutage", "parachute",
- "paragraphes", "paragraphs",
- "paramedicks", "paramedics",
- "paramedicos", "paramedics",
- "parameteres", "parameters",
- "paranthesis", "parenthesis",
- "parapharsed", "paraphrase",
- "paraprhased", "paraphrase",
- "parasitisme", "parasites",
- "parenthasis", "parenthesis",
- "parenthesys", "parentheses",
- "parenthises", "parenthesis",
- "parenthisis", "parenthesis",
- "parliamenty", "parliamentary",
- "parntership", "partnership",
- "parrallelly", "parallelly",
- "partecipant", "participant",
- "partecipate", "participate",
- "parternship", "partnership",
- "partiarchal", "patriarchal",
- "particapate", "participate",
- "particiapte", "participate",
- "participait", "participant",
- "participans", "participants",
- "participare", "participate",
- "participatd", "participant",
- "participati", "participant",
- "participats", "participant",
- "participent", "participant",
- "particpiate", "participated",
- "particually", "particularly",
- "particulaly", "particularly",
- "particulary", "particularly",
- "partnetship", "partnership",
- "partonizing", "patronizing",
- "passionatly", "passionately",
- "passionetly", "passionately",
- "passionnate", "passionate",
- "passporters", "passports",
- "pathologial", "pathological",
- "patriarchia", "patriarchal",
- "patriarcial", "patriarchal",
- "patriarical", "patriarchal",
- "patriotisch", "patriotic",
- "patriotisim", "patriotism",
- "patriottism", "patriotism",
- "patronozing", "patronizing",
- "peacefullly", "peacefully",
- "pedestirans", "pedestrians",
- "pedestrains", "pedestrians",
- "pedophilies", "pedophile",
- "pedophilles", "pedophile",
- "penetracion", "penetration",
- "penetrading", "penetrating",
- "penetrarion", "penetration",
- "penninsular", "peninsular",
- "pennsylvnia", "pennsylvania",
- "pepperocini", "pepperoni",
- "percantages", "percentages",
- "percautions", "precautions",
- "percentille", "percentile",
- "percpetions", "perceptions",
- "percusssion", "percussion",
- "perdicament", "predicament",
- "perdictable", "predictable",
- "perdictions", "predictions",
- "perephirals", "peripherals",
- "pereptually", "perpetually",
- "perferences", "preferences",
- "perfomrance", "performances",
- "perforamnce", "performances",
- "performaces", "performances",
- "performacne", "performances",
- "performanes", "performances",
- "performanse", "performances",
- "performence", "performance",
- "performnace", "performances",
- "perfromance", "performance",
- "perhiperals", "peripherals",
- "perihperals", "peripherals",
- "periodicaly", "periodically",
- "periperhals", "peripherals",
- "periphereal", "peripheral",
- "peripherial", "peripheral",
- "periphirals", "peripherals",
- "periphreals", "peripherals",
- "periphrials", "peripherals",
- "perjorative", "pejorative",
- "perliminary", "preliminary",
- "permamently", "permanently",
- "permanantly", "permanently",
- "permaturely", "prematurely",
- "permenantly", "permanently",
- "permenently", "permanently",
- "perminantly", "permanently",
- "perminently", "permanently",
- "permisisons", "permissions",
- "permissable", "permissible",
- "permisssion", "permissions",
- "pernamently", "permanently",
- "perosnality", "personality",
- "perparation", "preparation",
- "perpatrated", "perpetrated",
- "perpatrator", "perpetrator",
- "perpatuated", "perpetuated",
- "perpatuates", "perpetuates",
- "perpertated", "perpetuated",
- "perpertator", "perpetrators",
- "perpetraded", "perpetrated",
- "perpetrador", "perpetrator",
- "perpetraron", "perpetrator",
- "perpetrater", "perpetrator",
- "perpetuaded", "perpetuated",
- "perpetutate", "perpetuate",
- "perpetuties", "perpetuates",
- "perpitrated", "perpetrated",
- "perpitrator", "perpetrator",
- "perpretated", "perpetrated",
- "perpretator", "perpetrators",
- "perpsective", "perspective",
- "perputrator", "perpetrator",
- "perputually", "perpetually",
- "perputuated", "perpetuated",
- "perputuates", "perpetuates",
- "perrogative", "prerogative",
- "persceptive", "perspectives",
- "persectuion", "persecution",
- "persecucion", "persecution",
- "persecusion", "persecution",
- "persecutted", "persecuted",
- "persepctive", "perspective",
- "persicution", "persecution",
- "persistance", "persistence",
- "persistante", "persistent",
- "persistense", "persistence",
- "persistente", "persistence",
- "personhoood", "personhood",
- "perspecitve", "perspective",
- "perspectief", "perspective",
- "perspektive", "perspective",
- "persuassion", "persuasion",
- "persuassive", "persuasive",
- "persucution", "persecution",
- "persumption", "presumption",
- "pertubation", "perturbation",
- "pessimestic", "pessimistic",
- "pharamcists", "pharmacist",
- "phenomenona", "phenomena",
- "philadelpha", "philadelphia",
- "philadelpia", "philadelphia",
- "philiphines", "philippines",
- "philippenes", "philippines",
- "philippenis", "philippines",
- "philippides", "philippines",
- "philippinas", "philippines",
- "philippinos", "philippines",
- "philisopher", "philosopher",
- "phillipines", "philippines",
- "philosipher", "philosopher",
- "philosopers", "philosophers",
- "philosophae", "philosopher",
- "philosophia", "philosophical",
- "philosopies", "philosophies",
- "philosphies", "philosophies",
- "philospoher", "philosopher",
- "photograhed", "photographed",
- "photograher", "photographer",
- "photograhic", "photographic",
- "photograhpy", "photography",
- "photograped", "photographed",
- "photograper", "photographer",
- "photograpgh", "photographs",
- "photograpic", "photographic",
- "photogrpahs", "photographs",
- "photogrpahy", "photography",
- "physcedelic", "psychedelic",
- "physciatric", "psychiatric",
- "physcopaths", "psychopaths",
- "piankillers", "painkillers",
- "pilgrimmage", "pilgrimage",
- "pitchforcks", "pitchforks",
- "pitchforkes", "pitchforks",
- "plaestinian", "palestinian",
- "plagiariasm", "plagiarism",
- "planeswaker", "planeswalker",
- "planeswaler", "planeswalker",
- "planeswalkr", "planeswalker",
- "platfromers", "platformer",
- "playhtrough", "playthrough",
- "playthorugh", "playthrough",
- "playthourgh", "playthrough",
- "playthroguh", "playthroughs",
- "playthrougs", "playthroughs",
- "playthrouhg", "playthroughs",
- "playthtough", "playthrough",
- "playtrhough", "playthrough",
- "ploretariat", "proletariat",
- "policitally", "politically",
- "policitians", "politicians",
- "politicains", "politicians",
- "politicanti", "politician",
- "politiciens", "politicians",
- "politiicans", "politician",
- "polititians", "politicians",
- "polyphonyic", "polyphonic",
- "pomegranite", "pomegranate",
- "popluations", "populations",
- "poportional", "proportional",
- "popoulation", "population",
- "porjectiles", "projectiles",
- "porletariat", "proletariat",
- "pornagraphy", "pornography",
- "pornograghy", "pornography",
- "pornograhpy", "pornography",
- "pornograpgy", "pornography",
- "pornogrophy", "pornography",
- "pornogrpahy", "pornography",
- "porportions", "proportions",
- "portestants", "protestants",
- "portuguease", "portuguese",
- "portuguesse", "portuguese",
- "positionial", "positional",
- "positionnal", "positional",
- "positionned", "positioned",
- "positiveity", "positivity",
- "positiviely", "positively",
- "positivisme", "positives",
- "positivisty", "positivity",
- "positivitey", "positivity",
- "positivitiy", "positivity",
- "possesseurs", "possesses",
- "possesssion", "possessions",
- "possestions", "possessions",
- "possiblilty", "possibility",
- "potencially", "potentially",
- "potentailly", "potentially",
- "powerhourse", "powerhouse",
- "powerlifing", "powerlifting",
- "powerliftng", "powerlifting",
- "pracitcally", "practically",
- "practicarlo", "practical",
- "practioners", "practitioners",
- "practitions", "practitioners",
- "pragmatisch", "pragmatic",
- "precausions", "precautions",
- "precedessor", "predecessor",
- "precendence", "precedence",
- "precentages", "percentages",
- "preconceved", "preconceived",
- "preconcieve", "preconceived",
- "precuations", "precautions",
- "predacessor", "predecessor",
- "predecesser", "predecessor",
- "predections", "predictions",
- "predescesor", "predecessors",
- "predesessor", "predecessors",
- "predesposed", "predisposed",
- "predessecor", "predecessor",
- "predicatble", "predictable",
- "predicement", "predicament",
- "predicessor", "predecessor",
- "prediciment", "predicament",
- "predicitons", "predictions",
- "predictible", "predictable",
- "predictious", "predictions",
- "predictment", "predicament",
- "predisposte", "predisposed",
- "predocessor", "predecessor",
- "preferabbly", "preferably",
- "preferabely", "preferable",
- "preferabley", "preferably",
- "preferablly", "preferably",
- "preferances", "preferences",
- "preferenser", "preferences",
- "preferental", "preferential",
- "preferentes", "preferences",
- "preferrably", "preferably",
- "preferrring", "preferring",
- "preformance", "performance",
- "pregnanices", "pregnancies",
- "pregnencies", "pregnancies",
- "pregorative", "prerogative",
- "preipherals", "peripherals",
- "prejudicies", "prejudice",
- "preleminary", "preliminary",
- "prelimanary", "preliminary",
- "prelimenary", "preliminary",
- "premanently", "permanently",
- "prematuraly", "prematurely",
- "prematurily", "prematurely",
- "prematurley", "prematurely",
- "premilinary", "preliminary",
- "premissible", "permissible",
- "premissions", "permissions",
- "preorderded", "preordered",
- "preorderers", "preorders",
- "preparacion", "preparation",
- "preperation", "preparation",
- "prepetrated", "perpetrated",
- "prepetrator", "perpetrator",
- "prepetually", "perpetually",
- "prepetuated", "perpetuated",
- "prepetuates", "perpetuates",
- "preporation", "preparation",
- "preposterus", "preposterous",
- "prerequesit", "prerequisite",
- "prerequiste", "prerequisite",
- "prerequites", "prerequisite",
- "prerogitive", "prerogative",
- "prerogotive", "prerogative",
- "prescripton", "prescription",
- "presecution", "persecution",
- "presedintia", "presidential",
- "presentaion", "presentation",
- "presentatin", "presentations",
- "preservaton", "preservation",
- "preservered", "preserved",
- "presidencey", "presidency",
- "presidental", "presidential",
- "presidentcy", "presidency",
- "presistence", "persistence",
- "presitgious", "prestigious",
- "presitigous", "prestigious",
- "presomption", "presumption",
- "prespective", "perspective",
- "pressureing", "pressuring",
- "prestegious", "prestigious",
- "prestigeous", "prestigious",
- "prestigieus", "prestigious",
- "prestigiosa", "prestigious",
- "prestigiose", "prestigious",
- "prestigiosi", "prestigious",
- "prestigioso", "prestigious",
- "prestiguous", "prestigious",
- "presumabely", "presumably",
- "presumabley", "presumably",
- "presumptous", "presumptuous",
- "presumptuos", "presumptuous",
- "pretencious", "pretentious",
- "pretendendo", "pretended",
- "pretensious", "pretentious",
- "pretentieus", "pretentious",
- "prevailaing", "prevailing",
- "prevailling", "prevailing",
- "preventitve", "preventative",
- "preventivno", "prevention",
- "primatively", "primitively",
- "princessses", "princesses",
- "principales", "principles",
- "principalis", "principals",
- "principielt", "principle",
- "privatizied", "privatized",
- "priveledges", "privileges",
- "privelleges", "privileges",
- "privilegeds", "privileges",
- "privilegied", "privileged",
- "privilegien", "privilege",
- "privilegier", "privilege",
- "privilegies", "privilege",
- "proactivley", "proactive",
- "probabilaty", "probability",
- "probabilite", "probabilities",
- "probalibity", "probability",
- "probelmatic", "problematic",
- "problamatic", "problematic",
- "problimatic", "problematic",
- "problomatic", "problematic",
- "proccedings", "proceedings",
- "proccessing", "processing",
- "proceddings", "proceedings",
- "procedureal", "procedural",
- "procedurial", "procedural",
- "procedurile", "procedure",
- "processesor", "processors",
- "processeurs", "processes",
- "processsors", "processors",
- "procrastion", "procreation",
- "procriation", "procreation",
- "prodcutions", "productions",
- "prodictions", "productions",
- "producerats", "producers",
- "producitons", "productions",
- "productioin", "productions",
- "productivos", "productions",
- "productivty", "productivity",
- "produktions", "productions",
- "professinal", "professional",
- "professionl", "professionals",
- "professoras", "professors",
- "professores", "professors",
- "professorin", "profession",
- "professsion", "professions",
- "proficiancy", "proficiency",
- "proficienct", "proficient",
- "proficienty", "proficiency",
- "proficinecy", "proficiency",
- "profitabile", "profitable",
- "progerssion", "progressions",
- "progerssive", "progressives",
- "programable", "programmable",
- "programmare", "programmer",
- "programmars", "programmers",
- "programmate", "programme",
- "programmets", "programmers",
- "programmeur", "programmer",
- "programmier", "programmer",
- "programmmed", "programme",
- "programmmer", "programme",
- "progresison", "progressions",
- "progressers", "progresses",
- "progressief", "progressive",
- "progressino", "progressions",
- "progressivo", "progression",
- "progressoin", "progressions",
- "progressvie", "progressives",
- "prohabition", "prohibition",
- "prohibation", "prohibition",
- "prohibicion", "prohibition",
- "prohibiteds", "prohibits",
- "prohibitied", "prohibited",
- "prohibitifs", "prohibits",
- "prohibitivo", "prohibition",
- "prohibitons", "prohibits",
- "prohibitted", "prohibited",
- "projecticle", "projectile",
- "projectives", "projectiles",
- "projectlies", "projectiles",
- "prolateriat", "proletariat",
- "proletariet", "proletariat",
- "proletariot", "proletariat",
- "proletaryat", "proletariat",
- "proleteriat", "proletariat",
- "prolitariat", "proletariat",
- "prologomena", "prolegomena",
- "promenantly", "prominently",
- "promenently", "prominently",
- "prometheius", "prometheus",
- "prometheous", "prometheus",
- "promethesus", "prometheus",
- "prometheyus", "prometheus",
- "promimently", "prominently",
- "prominantly", "prominently",
- "prominately", "prominently",
- "promiscious", "promiscuous",
- "promocional", "promotional",
- "promsicuous", "promiscuous",
- "pronography", "pornography",
- "pronoucning", "pronouncing",
- "pronounched", "pronounced",
- "pronunciato", "pronunciation",
- "propaganada", "propaganda",
- "properitary", "proprietary",
- "propertiary", "proprietary",
- "propertions", "proportions",
- "prophechies", "prophecies",
- "propiertary", "proprietary",
- "propogation", "propagation",
- "proponenets", "proponents",
- "proponentes", "proponents",
- "proporition", "proposition",
- "proportians", "proportions",
- "proportinal", "proportional",
- "proposicion", "proposition",
- "propositivo", "proposition",
- "propostions", "proportions",
- "propreitary", "proprietary",
- "propriatary", "proprietary",
- "propriatery", "proprietary",
- "propriatory", "proprietary",
- "proprietery", "proprietary",
- "proprietory", "proprietary",
- "propriotary", "proprietary",
- "proprotions", "proportions",
- "propsective", "prospective",
- "propulstion", "propulsion",
- "prosectuion", "prosecution",
- "prosectuors", "prosecutors",
- "prosecuters", "prosecutors",
- "prosicution", "prosecution",
- "prosocution", "prosecution",
- "prosperious", "prosperous",
- "prospertity", "prosperity",
- "prospettive", "prospective",
- "prostethics", "prosthetic",
- "prosthethic", "prosthetic",
- "prostitites", "prostitutes",
- "prostitiute", "prostitute",
- "prostituate", "prostitute",
- "prostitudes", "prostitutes",
- "prostituees", "prostitutes",
- "prostituion", "prostitution",
- "prostitures", "prostitutes",
- "prostitutas", "prostitutes",
- "prostitutie", "prostitute",
- "prostitutin", "prostitution",
- "prostitutke", "prostitutes",
- "prostituton", "prostitution",
- "prostitutos", "prostitutes",
- "protability", "portability",
- "protaganist", "protagonist",
- "protaginist", "protagonist",
- "protagnoist", "protagonist",
- "protagoinst", "protagonists",
- "protagonits", "protagonists",
- "protagonsit", "protagonists",
- "protectings", "protections",
- "protectoras", "protectors",
- "protectores", "protectors",
- "protectrons", "protections",
- "protelariat", "proletariat",
- "protestents", "protestants",
- "protistants", "protestants",
- "protoganist", "protagonist",
- "protogonist", "protagonist",
- "protostants", "protestants",
- "protototype", "prototype",
- "provacative", "provocative",
- "provacotive", "provocative",
- "provicative", "provocative",
- "providencie", "providence",
- "provinciaal", "provincial",
- "provinicial", "provincial",
- "provisiones", "provisions",
- "provoactive", "provocative",
- "provocatief", "provocative",
- "provocitive", "provocative",
- "provocotive", "provocative",
- "provokative", "provocative",
- "pscyhedelic", "psychedelic",
- "pscyhiatric", "psychiatric",
- "pscyhopaths", "psychopaths",
- "pshyciatric", "psychiatric",
- "pshycopaths", "psychopaths",
- "psychaitric", "psychiatric",
- "psychedilic", "psychedelic",
- "psychedleic", "psychedelics",
- "psychiatist", "psychiatrist",
- "psychidelic", "psychedelic",
- "psychodelic", "psychedelic",
- "psychopants", "psychopaths",
- "psychopatch", "psychopath",
- "psychopatic", "psychopathic",
- "psychotisch", "psychotic",
- "psychriatic", "psychiatric",
- "publikation", "publication",
- "punctiation", "punctuation",
- "puncutation", "punctuation",
- "punshiments", "punishments",
- "punsihments", "punishments",
- "purchaseing", "purchasing",
- "purchashing", "purchasing",
- "purposefuly", "purposefully",
- "pyschedelic", "psychedelic",
- "pyschiatric", "psychiatric",
- "pyschopaths", "psychopaths",
- "qaurterback", "quarterback",
- "qualificato", "qualification",
- "qualifieres", "qualifiers",
- "quantitaive", "quantitative",
- "quantitatve", "quantitative",
- "quantitites", "quantities",
- "quantitties", "quantities",
- "quarantaine", "quarantine",
- "quarantenni", "quarantine",
- "quartercask", "quarterbacks",
- "quesitoning", "questioning",
- "questionned", "questioned",
- "questonable", "questionable",
- "radiaoctive", "radioactive",
- "radioactice", "radioactive",
- "radioactief", "radioactive",
- "radioaktive", "radioactive",
- "radiocative", "radioactive",
- "raidoactive", "radioactive",
- "reaccurring", "recurring",
- "reactionair", "reactionary",
- "realibility", "reliability",
- "realistisch", "realistic",
- "reaserchers", "researchers",
- "reaserching", "researching",
- "reasonabley", "reasonably",
- "reasonablly", "reasonably",
- "reassureing", "reassuring",
- "reassurring", "reassuring",
- "rebuildling", "rebuilding",
- "rebuplicans", "republicans",
- "reccomended", "recommended",
- "receptionst", "receptionist",
- "recgonition", "recognition",
- "recgonizing", "recognizing",
- "rechargable", "rechargeable",
- "recipientes", "recipients",
- "reciporcate", "reciprocate",
- "recipricate", "reciprocate",
- "reciprocant", "reciprocate",
- "reciprocite", "reciprocate",
- "recivership", "receivership",
- "reclutantly", "reluctantly",
- "recognicing", "recognizing",
- "recognision", "recognition",
- "recomending", "recommending",
- "recommandes", "recommends",
- "recommendes", "recommends",
- "recommented", "recommended",
- "reconcilled", "reconcile",
- "recongition", "recognition",
- "recongizing", "recognizing",
- "reconsidder", "reconsider",
- "recrational", "recreational",
- "recrutiment", "recruitment",
- "rectangluar", "rectangular",
- "rectangualr", "rectangular",
- "rectengular", "rectangular",
- "recuritment", "recruitment",
- "redundantcy", "redundancy",
- "reevalulate", "reevaluate",
- "reevalutate", "reevaluate",
- "reevaulated", "reevaluate",
- "refelctions", "reflections",
- "referancing", "referencing",
- "refereneced", "referenced",
- "refereneces", "references",
- "referincing", "referencing",
- "referrences", "references",
- "reflectivos", "reflections",
- "refreshener", "refresher",
- "refrubished", "refurbished",
- "refubrished", "refurbished",
- "refurbushed", "refurbished",
- "regeneratin", "regeneration",
- "regeneraton", "regeneration",
- "registerdns", "registers",
- "registeries", "registers",
- "registerred", "registered",
- "registraion", "registration",
- "regocnition", "recognition",
- "regresssion", "regression",
- "regresssive", "regressive",
- "regualtions", "regulations",
- "regulationg", "regulating",
- "regulatiors", "regulators",
- "reinassance", "renaissance",
- "reinforcemt", "reinforcement",
- "reinfornced", "reinforced",
- "reinitalise", "reinitialise",
- "reinitalize", "reinitialize",
- "reinstaling", "reinstalling",
- "reinstallng", "reinstalling",
- "reisntalled", "reinstalled",
- "relaibility", "reliability",
- "relatiation", "retaliation",
- "relationshp", "relationships",
- "relativiser", "relatives",
- "relativisme", "relatives",
- "relativitiy", "relativity",
- "relativitly", "relativity",
- "relcutantly", "reluctantly",
- "relentlesly", "relentlessly",
- "relentlessy", "relentlessly",
- "relevations", "revelations",
- "relfections", "reflections",
- "religeously", "religiously",
- "religionens", "religions",
- "religioners", "religions",
- "relpacement", "replacement",
- "reluctently", "reluctantly",
- "remarkabley", "remarkably",
- "remarkablly", "remarkably",
- "remasterred", "remastered",
- "remembrence", "remembrance",
- "reminescent", "reminiscent",
- "reminicient", "reminiscent",
- "reminiscant", "reminiscent",
- "reminiscint", "reminiscent",
- "reminscient", "reminiscent",
- "reminsicent", "reminiscent",
- "renaiisance", "renaissance",
- "renaiscance", "renaissance",
- "renaissanse", "renaissance",
- "renaissence", "renaissance",
- "renassaince", "renaissance",
- "renassiance", "renaissance",
- "reniassance", "renaissance",
- "rennovating", "renovating",
- "rennovation", "renovation",
- "repalcement", "replacement",
- "repbulicans", "republicans",
- "repeateadly", "repeatedly",
- "repectively", "respectively",
- "repersented", "represented",
- "replacemnet", "replacements",
- "replacemnts", "replacements",
- "repleacable", "replaceable",
- "repositiory", "repository",
- "representas", "represents",
- "representes", "represents",
- "represssion", "repression",
- "reproducion", "reproduction",
- "reproducive", "reproductive",
- "repsectable", "respectable",
- "repsonsible", "responsible",
- "repsonsibly", "responsibly",
- "republcians", "republicans",
- "republician", "republican",
- "republicons", "republicans",
- "repuglicans", "republicans",
- "requeriment", "requirement",
- "requierment", "requirements",
- "resemblence", "resemblance",
- "resemblense", "resembles",
- "reserachers", "researchers",
- "reseraching", "researching",
- "resgination", "resignation",
- "residencial", "residential",
- "residentail", "residential",
- "residentual", "residential",
- "resignacion", "resignation",
- "resignating", "resignation",
- "resignement", "resignment",
- "resignition", "resignation",
- "resintalled", "reinstalled",
- "resistansen", "resistances",
- "resistanses", "resistances",
- "resistences", "resistances",
- "resistnaces", "resistances",
- "resoltuions", "resolutions",
- "resotration", "restoration",
- "resoultions", "resolutions",
- "respecatble", "respectable",
- "respectabil", "respectable",
- "respectfuly", "respectfully",
- "respectible", "respectable",
- "respectivly", "respectively",
- "respectuful", "respectful",
- "respektable", "respectable",
- "resperatory", "respiratory",
- "resperitory", "respiratory",
- "respiritory", "respiratory",
- "respitatory", "respiratory",
- "responcible", "responsible",
- "responcibly", "responsibly",
- "respondendo", "responded",
- "responisble", "responsible",
- "responisbly", "responsibly",
- "responsable", "responsible",
- "responsably", "responsibly",
- "responsbile", "responsible",
- "responsbily", "responsibly",
- "responsibel", "responsibly",
- "responsibil", "responsibly",
- "responsivle", "responsive",
- "resporatory", "respiratory",
- "respository", "repository",
- "respriatory", "respiratory",
- "ressembling", "resembling",
- "ressurected", "resurrected",
- "restaraunts", "restaurants",
- "restaruants", "restaurants",
- "restauraunt", "restaurant",
- "restaurents", "restaurants",
- "resteraunts", "restaurants",
- "restirction", "restriction",
- "restorarion", "restoration",
- "restorating", "restoration",
- "restrainted", "restrained",
- "restrective", "restrictive",
- "restriccion", "restriction",
- "restricitng", "restricting",
- "restriciton", "restrictions",
- "restricitve", "restrictive",
- "restricteds", "restricts",
- "restricters", "restricts",
- "restrictied", "restrictive",
- "restrictifs", "restricts",
- "restrictins", "restricts",
- "restrictios", "restricts",
- "restrictivo", "restriction",
- "restrictons", "restricts",
- "restriktion", "restriction",
- "restriktive", "restrictive",
- "restrittive", "restrictive",
- "restructing", "restricting",
- "restruction", "restriction",
- "restuarants", "restaurants",
- "resturaunts", "restaurants",
- "resurecting", "resurrecting",
- "resurrecion", "resurrection",
- "retailation", "retaliation",
- "retalitated", "retaliated",
- "retardathon", "retardation",
- "retardating", "retardation",
- "retardatron", "retardation",
- "retartation", "retardation",
- "retirbution", "retribution",
- "retrebution", "retribution",
- "retribucion", "retribution",
- "retribuiton", "retribution",
- "retributivo", "retribution",
- "retribvtion", "retribution",
- "retrobution", "retribution",
- "retrubution", "retribution",
- "revealtions", "revelations",
- "revelaitons", "revelations",
- "revolations", "revolutions",
- "revoultions", "revolutions",
- "ridiculious", "ridiculous",
- "ridiculosly", "ridiculously",
- "ridiculouly", "ridiculously",
- "ridiculousy", "ridiculously",
- "rightfullly", "rightfully",
- "rolepalying", "roleplaying",
- "romanticaly", "romantically",
- "roundabaout", "roundabout",
- "roundabount", "roundabout",
- "rudimentery", "rudimentary",
- "rudimentory", "rudimentary",
- "ruidmentary", "rudimentary",
- "sacrifacing", "sacrificing",
- "sacrificare", "sacrifice",
- "sacrificied", "sacrifice",
- "sacrificies", "sacrifice",
- "sacrifieced", "sacrificed",
- "sacrifising", "sacrificing",
- "sacrifizing", "sacrificing",
- "salughtered", "slaughtered",
- "sanctionned", "sanctioned",
- "sarcastisch", "sarcastic",
- "saskatchewn", "saskatchewan",
- "saskatchwan", "saskatchewan",
- "satisfacion", "satisfaction",
- "satisfacory", "satisfactory",
- "scandanavia", "scandinavia",
- "scandanivia", "scandinavian",
- "scandenavia", "scandinavia",
- "scandianvia", "scandinavian",
- "scandimania", "scandinavia",
- "scandinaiva", "scandinavian",
- "scandinavan", "scandinavian",
- "scandivania", "scandinavian",
- "scandonavia", "scandinavia",
- "scarificing", "sacrificing",
- "scheduleing", "scheduling",
- "schedulling", "scheduling",
- "schoalrship", "scholarships",
- "scholarhips", "scholarship",
- "scholarstic", "scholastic",
- "scholership", "scholarship",
- "scholorship", "scholarship",
- "scientiests", "scientists",
- "scnadinavia", "scandinavia",
- "scrambleing", "scrambling",
- "screenshoot", "screenshot",
- "seamlessley", "seamlessly",
- "sedentarity", "sedentary",
- "seflishness", "selfishness",
- "segergation", "segregation",
- "segragation", "segregation",
- "segregacion", "segregation",
- "segretation", "segregation",
- "segrigation", "segregation",
- "selectivley", "selectively",
- "selfeshness", "selfishness",
- "senitmental", "sentimental",
- "sensacional", "sensational",
- "sensasional", "sensational",
- "sensationel", "sensational",
- "sensetional", "sensational",
- "sensitivety", "sensitivity",
- "sentamental", "sentimental",
- "sentemental", "sentimental",
- "sentenceing", "sentencing",
- "sentimentos", "sentiments",
- "sentimentul", "sentimental",
- "separatedly", "separately",
- "separatelly", "separately",
- "separatisme", "separates",
- "separatiste", "separates",
- "sepculating", "speculating",
- "serivceable", "serviceable",
- "serviciable", "serviceable",
- "settelement", "settlement",
- "settelments", "settlements",
- "settlemetns", "settlements",
- "sexualizied", "sexualized",
- "shakeapeare", "shakespeare",
- "shakepseare", "shakespeare",
- "shakesphere", "shakespeare",
- "shanenigans", "shenanigans",
- "shareholdes", "shareholders",
- "sharpeneing", "sharpening",
- "sharpenning", "sharpening",
- "shatterling", "shattering",
- "shatterring", "shattering",
- "sheakspeare", "shakespeare",
- "shenadigans", "shenanigans",
- "shenanagans", "shenanigans",
- "shenanagins", "shenanigans",
- "shenanegans", "shenanigans",
- "shenanegins", "shenanigans",
- "shenangians", "shenanigans",
- "shenanigens", "shenanigans",
- "shenanigins", "shenanigans",
- "shenenigans", "shenanigans",
- "sheninigans", "shenanigans",
- "shennaigans", "shenanigans",
- "shortenning", "shortening",
- "shortenting", "shortening",
- "signficiant", "significant",
- "signifantly", "significantly",
- "significane", "significance",
- "significato", "significant",
- "signifigant", "significant",
- "signifikant", "significant",
- "signitories", "signatories",
- "signularity", "singularity",
- "similarites", "similarities",
- "similarlity", "similarity",
- "similiarity", "similarity",
- "simluations", "simulations",
- "simplefying", "simplifying",
- "simplicitly", "simplicity",
- "simplifiing", "simplifying",
- "simplisitic", "simplistic",
- "simplyifing", "simplifying",
- "simualtions", "simulations",
- "simulatious", "simulations",
- "simultaneos", "simultaneous",
- "simultaneus", "simultaneous",
- "simultanous", "simultaneous",
- "singluarity", "singularity",
- "singualrity", "singularity",
- "singulairty", "singularity",
- "singularily", "singularity",
- "sitautional", "situational",
- "situacional", "situational",
- "situationly", "situational",
- "siutational", "situational",
- "skatebaords", "skateboard",
- "skateboader", "skateboard",
- "skepticisim", "skepticism",
- "skillshoots", "skillshots",
- "skillshosts", "skillshots",
- "slaugthered", "slaughtered",
- "slefishness", "selfishness",
- "sluaghtered", "slaughtered",
- "smarthpones", "smartphones",
- "snowboaring", "snowboarding",
- "snowbolling", "snowballing",
- "snowfalling", "snowballing",
- "socailizing", "socializing",
- "socialicing", "socializing",
- "socialistes", "socialists",
- "socialistos", "socialists",
- "socializare", "socialize",
- "sociapathic", "sociopathic",
- "sociologial", "sociological",
- "sociopathes", "sociopaths",
- "sociopathis", "sociopaths",
- "sociophatic", "sociopathic",
- "solidariety", "solidarity",
- "somethingis", "somethings",
- "sorrounding", "surrounding",
- "soundtrakcs", "soundtracks",
- "southamtpon", "southampton",
- "southanpton", "southampton",
- "southapmton", "southampton",
- "southernese", "southerners",
- "southerness", "southerners",
- "southernest", "southerners",
- "southernors", "southerners",
- "southmapton", "southampton",
- "southtampon", "southampton",
- "soveregnity", "sovereignty",
- "sovereighty", "sovereignty",
- "sovereingty", "sovereignty",
- "sovereinity", "sovereignty",
- "soveriegnty", "sovereignty",
- "soveriengty", "sovereignty",
- "soverignity", "sovereignty",
- "specailists", "specialists",
- "specailized", "specialized",
- "specailizes", "specializes",
- "specatcular", "spectacular",
- "specialiced", "specialized",
- "specialices", "specializes",
- "specialites", "specializes",
- "speciallist", "specialist",
- "speciallity", "specially",
- "speciallize", "specialize",
- "specialzied", "specialized",
- "specifcally", "specifically",
- "specificaly", "specifically",
- "specificato", "specification",
- "specificies", "specifics",
- "specifiying", "specifying",
- "specilaized", "specialize",
- "speciliazed", "specialize",
- "spectatores", "spectators",
- "spectatular", "spectacular",
- "spectauclar", "spectacular",
- "spectaulars", "spectaculars",
- "spectecular", "spectacular",
- "specualting", "speculating",
- "specualtion", "speculation",
- "specualtive", "speculative",
- "specularite", "speculative",
- "speculaties", "speculative",
- "spiritualiy", "spiritually",
- "spiritualty", "spirituality",
- "spirituella", "spiritually",
- "spirtiually", "spiritually",
- "spirutually", "spiritually",
- "spitirually", "spiritually",
- "sponatenous", "spontaneous",
- "sponatneous", "spontaneous",
- "sponsership", "sponsorship",
- "sponsorhips", "sponsorship",
- "sponsorhsip", "sponsorship",
- "sponsorshop", "sponsorship",
- "spontaenous", "spontaneous",
- "spontainous", "spontaneous",
- "spontaneuos", "spontaneous",
- "spontanious", "spontaneous",
- "sponteanous", "spontaneous",
- "sponteneous", "spontaneous",
- "spreadhseet", "spreadsheet",
- "spreadsheat", "spreadsheet",
- "spreadshets", "spreadsheets",
- "spreedsheet", "spreadsheet",
- "springfeild", "springfield",
- "springfiled", "springfield",
- "sprinklered", "sprinkled",
- "squirrelies", "squirrels",
- "squirrelius", "squirrels",
- "stabilizare", "stabilize",
- "stabilizied", "stabilize",
- "stabilizier", "stabilize",
- "stabilizies", "stabilize",
- "staggerring", "staggering",
- "staggerwing", "staggering",
- "stationairy", "stationary",
- "stationerad", "stationed",
- "stationnary", "stationary",
- "statisitcal", "statistical",
- "statisticly", "statistical",
- "statistisch", "statistics",
- "statsitical", "statistical",
- "stereotpyes", "stereotypes",
- "stereotying", "stereotyping",
- "steriotypes", "stereotypes",
- "steroetypes", "stereotypes",
- "steryotypes", "stereotypes",
- "stimluating", "stimulating",
- "stimualting", "stimulating",
- "stimualtion", "stimulation",
- "stimulantes", "stimulants",
- "stockpilled", "stockpile",
- "stormfrount", "stormfront",
- "storyteling", "storytelling",
- "straightden", "straightened",
- "straightend", "straightened",
- "straightmen", "straighten",
- "straightned", "straightened",
- "straightner", "straighten",
- "strangeshit", "strangest",
- "strategisch", "strategic",
- "strategiske", "strategies",
- "strawberies", "strawberries",
- "strawberrry", "strawberry",
- "strawbrerry", "strawberry",
- "strenghened", "strengthened",
- "strenghtend", "strengthen",
- "strenghtens", "strengthen",
- "strengtened", "strengthened",
- "structurels", "structures",
- "strugglebus", "struggles",
- "struggleing", "struggling",
- "stubborness", "stubbornness",
- "stutterring", "stuttering",
- "subcatagory", "subcategory",
- "subconscius", "subconscious",
- "subconscous", "subconscious",
- "subisdizing", "subsidizing",
- "subjectivly", "subjectively",
- "submergered", "submerged",
- "submisisons", "submissions",
- "subredddits", "subreddits",
- "subscirbers", "subscribers",
- "subscribbed", "subscribe",
- "subscribber", "subscriber",
- "subscriping", "subscribing",
- "subscriptin", "subscriptions",
- "subscripton", "subscription",
- "subsequenty", "subsequently",
- "subsidiezed", "subsidized",
- "subsidizied", "subsidized",
- "subsidizies", "subsidize",
- "subsiziding", "subsidizing",
- "subsquently", "subsequently",
- "subsrcibers", "subscribers",
- "substancial", "substantial",
- "substansial", "substantial",
- "substansive", "substantive",
- "substantied", "substantive",
- "substanties", "substantive",
- "substential", "substantial",
- "substitiute", "substitute",
- "substituded", "substituted",
- "substitudes", "substitutes",
- "substituion", "substitution",
- "substitures", "substitutes",
- "substitutie", "substitutes",
- "substitutos", "substitutes",
- "substitutue", "substitutes",
- "substracted", "subtracted",
- "suburburban", "suburban",
- "succesfully", "successfully",
- "successeurs", "successes",
- "successfull", "successful",
- "successfuly", "successfully",
- "successsion", "succession",
- "successully", "successfully",
- "succsesfull", "successfully",
- "sucessfully", "successfully",
- "sucseptible", "susceptible",
- "sufficently", "sufficiently",
- "suggestieve", "suggestive",
- "sumbissions", "submissions",
- "sunglassses", "sunglasses",
- "superceeded", "superseded",
- "superficiel", "superficial",
- "superfulous", "superfluous",
- "superhereos", "superhero",
- "superifical", "superficial",
- "superiorest", "superiors",
- "supermacist", "supremacist",
- "supermakert", "supermarkets",
- "supermakret", "supermarkets",
- "supermakter", "supermarkets",
- "supermarkts", "supermarkets",
- "supermaster", "supermarkets",
- "supernatual", "supernatural",
- "supersition", "supervision",
- "superstiton", "superstition",
- "supervisers", "supervisors",
- "supervisior", "supervisor",
- "suplimented", "supplemented",
- "supplaments", "supplements",
- "supplemetal", "supplemental",
- "supporteurs", "supporters",
- "supposedely", "supposedly",
- "supposidely", "supposedly",
- "supposingly", "supposedly",
- "suppresions", "suppression",
- "suppresssor", "suppressor",
- "supramacist", "supremacist",
- "supremacits", "supremacist",
- "supremasist", "supremacist",
- "supremicist", "supremacist",
- "suprimacist", "supremacist",
- "suprisingly", "surprisingly",
- "suprizingly", "surprisingly",
- "suroundings", "surroundings",
- "surpemacist", "supremacist",
- "surprisinly", "surprisingly",
- "surreptious", "surreptitious",
- "surroundign", "surroundings",
- "surroundigs", "surrounds",
- "surroundins", "surrounds",
- "surroundngs", "surrounds",
- "surveilence", "surveillance",
- "survivabily", "survivability",
- "susbtantial", "substantial",
- "susbtantive", "substantive",
- "suscepitble", "susceptible",
- "susceptable", "susceptible",
- "suscpetible", "susceptible",
- "susecptible", "susceptible",
- "suspectible", "susceptible",
- "suspiciosly", "suspiciously",
- "suspiciouly", "suspiciously",
- "suspiciouns", "suspicion",
- "suspicision", "suspicions",
- "suspicisons", "suspicions",
- "sustainible", "sustainable",
- "switerzland", "switzerland",
- "switserland", "switzerland",
- "switzlerand", "switzerland",
- "swizterland", "switzerland",
- "swtizerland", "switzerland",
- "symapthetic", "sympathetic",
- "symmertical", "symmetrical",
- "sympathatic", "sympathetic",
- "sympathiers", "sympathizers",
- "sympathsize", "sympathize",
- "sympethetic", "sympathetic",
- "symphatetic", "sympathetic",
- "symphatized", "sympathize",
- "symphatizer", "sympathizers",
- "symphatizes", "sympathize",
- "sympothetic", "sympathetic",
- "synthesasia", "synthesis",
- "synthesesia", "synthesis",
- "sypmathetic", "sympathetic",
- "tabelspoons", "tablespoons",
- "tablepsoons", "tablespoons",
- "tablespooon", "tablespoon",
- "tablesppons", "tablespoons",
- "tailgateing", "tailgating",
- "tailgatting", "tailgating",
- "tangentialy", "tangentially",
- "techincally", "technically",
- "techincians", "technicians",
- "techiniques", "techniques",
- "techncially", "technically",
- "technicalty", "technicality",
- "technichian", "technician",
- "technicials", "technicians",
- "techniciens", "technicians",
- "technitians", "technicians",
- "technnology", "technology",
- "technologia", "technological",
- "techticians", "technicians",
- "teleportato", "teleportation",
- "teleportion", "teleporting",
- "teleproting", "teleporting",
- "temeprature", "temperature",
- "temparament", "temperament",
- "temparature", "temperature",
- "temparement", "temperament",
- "tempearture", "temperatures",
- "temperamant", "temperament",
- "temperarily", "temporarily",
- "temperatues", "temperatures",
- "temperaturs", "temperatures",
- "temperatuur", "temperature",
- "temperement", "temperament",
- "tempermeant", "temperament",
- "tempertaure", "temperature",
- "temporairly", "temporarily",
- "temporaraly", "temporarily",
- "temporarity", "temporarily",
- "tempreature", "temperature",
- "temproarily", "temporarily",
- "tempurature", "temperature",
- "tepmorarily", "temporarily",
- "termanology", "terminology",
- "terminacion", "termination",
- "terminaison", "termination",
- "terminalogy", "terminology",
- "terminatior", "terminator",
- "terminatorn", "termination",
- "terminilogy", "terminology",
- "terminoligy", "terminology",
- "terratorial", "territorial",
- "terratories", "territories",
- "terretorial", "territorial",
- "terretories", "territories",
- "terrirorial", "territorial",
- "terrirories", "territories",
- "terriroties", "territories",
- "terristrial", "territorial",
- "territoires", "territories",
- "territorist", "terrorist",
- "territority", "territory",
- "terroristas", "terrorists",
- "terroristes", "terrorists",
- "terrorities", "territories",
- "terrotorial", "territorial",
- "terrotories", "territories",
- "testiclular", "testicular",
- "thankfullly", "thankfully",
- "thanksgivng", "thanksgiving",
- "theoligical", "theological",
- "theoratical", "theoretical",
- "theoreticly", "theoretical",
- "theoritical", "theoretical",
- "therapautic", "therapeutic",
- "therapeudic", "therapeutic",
- "therapeutuc", "therapeutic",
- "therapuetic", "therapeutic",
- "theraupetic", "therapeutic",
- "thereaputic", "therapeutic",
- "thereotical", "theoretical",
- "therepeutic", "therapeutic",
- "thermometor", "thermometer",
- "thermometre", "thermometer",
- "thermomiter", "thermometer",
- "thermomoter", "thermometer",
- "thermoneter", "thermometer",
- "thermostaat", "thermostat",
- "theroetical", "theoretical",
- "thoeretical", "theoretical",
- "threataning", "threatening",
- "threatended", "threatened",
- "threatining", "threatening",
- "throttleing", "throttling",
- "throughoput", "throughput",
- "throughtout", "throughout",
- "throughtput", "throughput",
- "thudnerbolt", "thunderbolt",
- "thunberbolt", "thunderbolt",
- "thunderblot", "thunderbolt",
- "thunderboat", "thunderbolt",
- "thunderbots", "thunderbolt",
- "thunderbowl", "thunderbolt",
- "thunderjolt", "thunderbolt",
- "thundervolt", "thunderbolt",
- "tightenting", "tightening",
- "tocuhscreen", "touchscreen",
- "torrentking", "torrenting",
- "torrentting", "torrenting",
- "torublesome", "troublesome",
- "torunaments", "tournaments",
- "totalitaran", "totalitarian",
- "totalitarni", "totalitarian",
- "touranments", "tournaments",
- "tournamnets", "tournaments",
- "tournemants", "tournaments",
- "tournements", "tournaments",
- "tournmanets", "tournaments",
- "tradicional", "traditional",
- "tradionally", "traditionally",
- "tradisional", "traditional",
- "traditionel", "traditional",
- "traditition", "tradition",
- "tragicallly", "tragically",
- "tramautized", "traumatized",
- "tramuatized", "traumatized",
- "trancendent", "transcendent",
- "trancending", "transcending",
- "tranclucent", "translucent",
- "trandgender", "transgender",
- "tranditions", "transitions",
- "tranistions", "transitions",
- "tranlastion", "translations",
- "tranlsating", "translating",
- "tranlsation", "translation",
- "tranluscent", "translucent",
- "trannsexual", "transsexual",
- "tranpshobic", "transphobic",
- "transaccion", "transaction",
- "transaciton", "transactions",
- "transalting", "translating",
- "transaltion", "translation",
- "transations", "transitions",
- "transcluent", "translucent",
- "transcripto", "transcription",
- "transctions", "transitions",
- "transculent", "translucent",
- "transending", "transcending",
- "transfender", "transgender",
- "transferers", "transfers",
- "transfering", "transferring",
- "transfersom", "transforms",
- "transfomers", "transforms",
- "transformas", "transforms",
- "transformes", "transformers",
- "transformis", "transforms",
- "transformus", "transforms",
- "transforums", "transforms",
- "transfromed", "transformed",
- "transfromer", "transformers",
- "transgemder", "transgender",
- "transgended", "transgendered",
- "transgenger", "transgender",
- "transgenres", "transgender",
- "transhpobic", "transphobic",
- "transisions", "transitions",
- "transisitor", "transistor",
- "transistion", "transition",
- "transistior", "transistor",
- "transitiond", "transitioned",
- "transitiong", "transitioning",
- "translatron", "translation",
- "translusent", "translucent",
- "transmatter", "transmitter",
- "transmision", "transmission",
- "transmissin", "transmissions",
- "transmisson", "transmission",
- "transmittor", "transmitter",
- "transmorged", "transformed",
- "transmutter", "transmitter",
- "transofrmed", "transformed",
- "transohobic", "transphobic",
- "transparant", "transparent",
- "transparecy", "transparency",
- "transpareny", "transparency",
- "transperant", "transparent",
- "transperent", "transparent",
- "transphonic", "transphobic",
- "transphopic", "transphobic",
- "transplanet", "transplant",
- "transporder", "transporter",
- "transporing", "transporting",
- "transportar", "transporter",
- "transportng", "transporting",
- "transportor", "transporter",
- "transseuxal", "transsexual",
- "transsexaul", "transsexual",
- "transsexuel", "transsexual",
- "transulcent", "translucent",
- "transylvnia", "transylvania",
- "tranzformer", "transformer",
- "tranzitions", "transitions",
- "tranzporter", "transporter",
- "trasncripts", "transcripts",
- "trasnferred", "transferred",
- "trasnformed", "transformed",
- "trasnformer", "transformer",
- "trasngender", "transgender",
- "trasnmitted", "transmitted",
- "trasnmitter", "transmitter",
- "trasnparent", "transparent",
- "trasnphobic", "transphobic",
- "trasnported", "transported",
- "trasnporter", "transporter",
- "traumatisch", "traumatic",
- "traumetized", "traumatized",
- "traumitized", "traumatized",
- "travellerhd", "travelled",
- "travellodge", "travelled",
- "tremendeous", "tremendous",
- "tremendious", "tremendous",
- "tremenduous", "tremendous",
- "trespessing", "trespassing",
- "tresspasing", "trespassing",
- "triggereing", "triggering",
- "triggerring", "triggering",
- "troubelsome", "troublesome",
- "truamatized", "traumatized",
- "trushworthy", "trustworthy",
- "trustowrthy", "trustworthy",
- "trustwhorty", "trustworthy",
- "trustworhty", "trustworthy",
- "truthfullly", "truthfully",
- "tupperwears", "tupperware",
- "turstworthy", "trustworthy",
- "ubiquitious", "ubiquitous",
- "ubiquituous", "ubiquitous",
- "ukraininans", "ukrainians",
- "ultimatelly", "ultimately",
- "unanimoulsy", "unanimous",
- "unappeasing", "unappealing",
- "unappeeling", "unappealing",
- "unathorised", "unauthorised",
- "unattendend", "unattended",
- "unatteneded", "unattended",
- "unattracive", "unattractive",
- "unauthoried", "unauthorized",
- "unavailible", "unavailable",
- "unavaliable", "unavailable",
- "unaviodable", "unavoidable",
- "unbalanaced", "unbalanced",
- "unbraikable", "unbreakable",
- "unbrakeable", "unbreakable",
- "unbreakabie", "unbreakable",
- "unbreakabke", "unbreakable",
- "unbreakbale", "unbreakable",
- "unbreakeble", "unbreakable",
- "unbrearable", "unbreakable",
- "uncensorred", "uncensored",
- "uncertaincy", "uncertainty",
- "uncertanity", "uncertainty",
- "uncertianty", "uncertainty",
- "unchangable", "unchangeable",
- "uncompetive", "uncompetitive",
- "unconcsious", "unconscious",
- "unconsicous", "unconscious",
- "uncouncious", "unconscious",
- "undeniabely", "undeniably",
- "undeniabley", "undeniably",
- "undeniablly", "undeniably",
- "undenialbly", "undeniably",
- "underestime", "underestimate",
- "undergating", "undertaking",
- "undergorund", "underground",
- "underheight", "underweight",
- "undermiming", "undermining",
- "undermindes", "undermines",
- "undernearth", "underneath",
- "underneight", "underweight",
- "underpining", "undermining",
- "underpowerd", "underpowered",
- "underpowred", "underpowered",
- "underratted", "underrated",
- "understannd", "understands",
- "understsand", "understands",
- "undertacker", "undertaker",
- "underwarter", "underwater",
- "underwieght", "underweight",
- "underwright", "underweight",
- "undesireble", "undesirable",
- "undesriable", "undesirable",
- "undetecable", "undetectable",
- "undiserable", "undesirable",
- "undoubedtly", "undoubtedly",
- "undoubetdly", "undoubtedly",
- "undoubtadly", "undoubtedly",
- "undoubtebly", "undoubtedly",
- "undoubtetly", "undoubtedly",
- "undreground", "underground",
- "unemployeed", "unemployed",
- "unemployent", "unemployment",
- "unemploymed", "unemployed",
- "unexpectdly", "unexpectedly",
- "unexpectely", "unexpectedly",
- "unfamilliar", "unfamiliar",
- "unfortuante", "unfortunate",
- "ungreatfull", "ungrateful",
- "unilateraly", "unilaterally",
- "unilaterlly", "unilaterally",
- "unimportent", "unimportant",
- "uninspiried", "uninspired",
- "uninstaling", "uninstalling",
- "uninstallng", "uninstalling",
- "uninteresed", "uninterested",
- "uniquesness", "uniqueness",
- "unisntalled", "uninstalled",
- "universella", "universally",
- "universites", "universities",
- "univesities", "universities",
- "unjustifyed", "unjustified",
- "unknowinlgy", "unknowingly",
- "unkowningly", "unknowingly",
- "unnecassary", "unnecessary",
- "unneccesary", "unnecessary",
- "unnecessery", "unnecessary",
- "unnecissary", "unnecessary",
- "unnessecary", "unnecessary",
- "unnistalled", "uninstalled",
- "unoriginial", "unoriginal",
- "unorigional", "unoriginal",
- "unoticeable", "unnoticeable",
- "unpleaseant", "unpleasant",
- "unportected", "unprotected",
- "unprepaired", "unprepared",
- "unpreparred", "unprepared",
- "unproducive", "unproductive",
- "unprotexted", "unprotected",
- "unqaulified", "unqualified",
- "unrealisitc", "unrealistic",
- "unrealsitic", "unrealistic",
- "unreasonbly", "unreasonably",
- "unregluated", "unregulated",
- "unregualted", "unregulated",
- "unregulared", "unregulated",
- "unrepentent", "unrepentant",
- "unresponive", "unresponsive",
- "unrestriced", "unrestricted",
- "unsettleing", "unsettling",
- "unsintalled", "uninstalled",
- "unsolicated", "unsolicited",
- "unsoliticed", "unsolicited",
- "unsolocited", "unsolicited",
- "unsubscirbe", "unsubscribe",
- "unsubscrbed", "unsubscribed",
- "unsubscried", "unsubscribed",
- "unsubscripe", "unsubscribe",
- "unsubscrive", "unsubscribe",
- "unsubscrube", "unsubscribe",
- "unsubsrcibe", "unsubscribe",
- "unsuccesful", "unsuccessful",
- "unsuccessul", "unsuccessful",
- "unsucesfuly", "unsuccessfully",
- "unsucessful", "unsuccessful",
- "unsunscribe", "unsubscribe",
- "unsuprising", "unsurprising",
- "unsuprizing", "unsurprising",
- "unsurprized", "unsurprised",
- "unsusbcribe", "unsubscribe",
- "unviersally", "universally",
- "unwarrented", "unwarranted",
- "utiliatrian", "utilitarian",
- "utilitatian", "utilitarian",
- "utiliterian", "utilitarian",
- "utilizacion", "utilization",
- "utilizaiton", "utilization",
- "utilizating", "utilization",
- "utiltiarian", "utilitarian",
- "vacciantion", "vaccination",
- "vaccinaties", "vaccinate",
- "vegaterians", "vegetarians",
- "vegetariens", "vegetarians",
- "vegetatians", "vegetarians",
- "vegeterians", "vegetarians",
- "vehementely", "vehemently",
- "venezuelean", "venezuela",
- "venezuelian", "venezuela",
- "ventalation", "ventilation",
- "ventelation", "ventilation",
- "ventialtion", "ventilation",
- "ventilacion", "ventilation",
- "verastility", "versatility",
- "verfication", "verification",
- "versatality", "versatility",
- "versitality", "versatility",
- "versitilaty", "versatility",
- "victorieuse", "victories",
- "victoriuous", "victorious",
- "vietnameese", "vietnamese",
- "vietnamesse", "vietnamese",
- "vietnamiese", "vietnamese",
- "vietnamnese", "vietnamese",
- "vigilanties", "vigilante",
- "visibillity", "visibility",
- "vocabularly", "vocabulary",
- "volatillity", "volatility",
- "volonteered", "volunteered",
- "volounteers", "volunteers",
- "volunatrily", "voluntarily",
- "voluntairly", "voluntarily",
- "volunteeers", "volunteers",
- "volunteraly", "voluntarily",
- "voluntereed", "volunteered",
- "volunterily", "voluntarily",
- "vulnerabile", "vulnerable",
- "wallpapaers", "wallpapers",
- "wallpappers", "wallpapers",
- "washingtion", "washington",
- "watermeleon", "watermelon",
- "waterprooof", "waterproof",
- "wavelegnths", "wavelength",
- "wavelenghth", "wavelength",
- "wavelenghts", "wavelength",
- "weaknessses", "weaknesses",
- "wellingston", "wellington",
- "wellingtion", "wellington",
- "westernerns", "westerners",
- "westmisnter", "westminster",
- "westmnister", "westminster",
- "westmonster", "westminster",
- "whisperered", "whispered",
- "whitholding", "withholding",
- "wikileakers", "wikileaks",
- "willingless", "willingness",
- "wincheseter", "winchester",
- "windsheilds", "windshield",
- "withdrawels", "withdrawals",
- "withdrawles", "withdrawals",
- "withhelding", "withholding",
- "withrdawing", "withdrawing",
- "witnesssing", "witnessing",
- "woodowrking", "woodworking",
- "woodworkign", "woodworking",
- "worhsipping", "worshipping",
- "workstaiton", "workstation",
- "workststion", "workstation",
- "worshopping", "worshipping",
- "xenophoblic", "xenophobic",
- "abandining", "abandoning",
- "abandonned", "abandoned",
- "abbreviato", "abbreviation",
- "abnoramlly", "abnormally",
- "abnormalty", "abnormally",
- "abnornally", "abnormally",
- "abominaton", "abomination",
- "abondoning", "abandoning",
- "aborginial", "aboriginal",
- "aboriganal", "aboriginal",
- "aborigenal", "aboriginal",
- "aborignial", "aboriginal",
- "aborigonal", "aboriginal",
- "aboroginal", "aboriginal",
- "aboslutely", "absolutely",
- "abosrption", "absorption",
- "abreviated", "abbreviated",
- "absintence", "abstinence",
- "absitnence", "abstinence",
- "absolument", "absolute",
- "absolutley", "absolutely",
- "absoprtion", "absorption",
- "absorbsion", "absorption",
- "absorbtion", "absorption",
- "absorpsion", "absorption",
- "absoultely", "absolutely",
- "abstanence", "abstinence",
- "abstenance", "abstinence",
- "abstenince", "abstinence",
- "abstinense", "abstinence",
- "abstinince", "abstinence",
- "absurditiy", "absurdity",
- "abundacies", "abundances",
- "academicas", "academics",
- "academicos", "academics",
- "academicus", "academics",
- "accdiently", "accidently",
- "accelarate", "accelerate",
- "accelerade", "accelerated",
- "accelerare", "accelerate",
- "accelerato", "acceleration",
- "acceleread", "accelerated",
- "accelertor", "accelerator",
- "accelorate", "accelerate",
- "acceptabel", "acceptable",
- "acceptabil", "acceptable",
- "acceptence", "acceptance",
- "accepterad", "accepted",
- "acceptible", "acceptable",
- "accerelate", "accelerated",
- "accesories", "accessories",
- "accessable", "accessible",
- "accessbile", "accessible",
- "accessoire", "accessories",
- "accessoirs", "accessories",
- "accicently", "accidently",
- "accidantly", "accidently",
- "accidebtly", "accidently",
- "accidenlty", "accidently",
- "accidentes", "accidents",
- "accidentky", "accidently",
- "accidently", "accidentally",
- "accidnetly", "accidently",
- "accomadate", "accommodate",
- "accomodate", "accommodate",
- "accompined", "accompanied",
- "accomplise", "accomplishes",
- "accompliss", "accomplishes",
- "accostumed", "accustomed",
- "accountent", "accountant",
- "accpetable", "acceptable",
- "accpetance", "acceptance",
- "accuastion", "accusation",
- "acculumate", "accumulate",
- "accumalate", "accumulate",
- "accumelate", "accumulate",
- "accumilate", "accumulate",
- "accumulare", "accumulate",
- "accumulato", "accumulation",
- "accumulted", "accumulated",
- "accuratley", "accurately",
- "accusating", "accusation",
- "accusition", "accusation",
- "accustumed", "accustomed",
- "acheivable", "achievable",
- "acheivment", "achievement",
- "acheviable", "achievable",
- "achiavable", "achievable",
- "achieveble", "achievable",
- "achievemnt", "achievement",
- "achievemts", "achieves",
- "achievents", "achieves",
- "achievment", "achievement",
- "achilleous", "achilles",
- "achiveable", "achievable",
- "achivement", "achievement",
- "acitvating", "activating",
- "acitvision", "activision",
- "acknowldge", "acknowledge",
- "acknowlede", "acknowledge",
- "acknowlege", "acknowledge",
- "acommodate", "accommodate",
- "acopalypse", "apocalypse",
- "acordingly", "accordingly",
- "acqauinted", "acquainted",
- "acquanited", "acquainted",
- "acquianted", "acquainted",
- "acquinated", "acquainted",
- "acquisiton", "acquisition",
- "acticating", "activating",
- "actication", "activation",
- "activacion", "activation",
- "activaters", "activates",
- "activiates", "activist",
- "activiites", "activist",
- "activisiom", "activism",
- "activisits", "activist",
- "activistas", "activists",
- "activistes", "activists",
- "activiting", "activating",
- "activizion", "activision",
- "acustommed", "accustomed",
- "adaptacion", "adaptation",
- "adaptating", "adaptation",
- "adaquetely", "adequately",
- "addicitons", "addictions",
- "addionally", "additionally",
- "additivies", "additive",
- "additivley", "additive",
- "addittions", "addictions",
- "addmission", "admission",
- "addresable", "addressable",
- "addressess", "addresses",
- "adequatley", "adequately",
- "adequetely", "adequately",
- "adequitely", "adequately",
- "adernaline", "adrenaline",
- "adjectivos", "adjectives",
- "adjustible", "adjustable",
- "admendment", "amendment",
- "administed", "administered",
- "administor", "administer",
- "administre", "administer",
- "administro", "administer",
- "adminsiter", "administer",
- "admissable", "admissible",
- "admittadly", "admittedly",
- "admittetly", "admittedly",
- "admittidly", "admittedly",
- "adolencent", "adolescent",
- "adolescant", "adolescent",
- "adolescene", "adolescence",
- "adoloscent", "adolescent",
- "adolsecent", "adolescent",
- "adpatation", "adaptation",
- "adreanline", "adrenaline",
- "adrelanine", "adrenaline",
- "adreneline", "adrenaline",
- "adreniline", "adrenaline",
- "adressable", "addressable",
- "advanteges", "advantages",
- "advatanges", "advantages",
- "adventrous", "adventurous",
- "adventrues", "adventures",
- "adventuers", "adventures",
- "adventuous", "adventurous",
- "adventuros", "adventurous",
- "adventurus", "adventurous",
- "adverticed", "advertised",
- "aestethics", "aesthetics",
- "aesthatics", "aesthetics",
- "aesthestic", "aesthetics",
- "affiliaton", "affiliation",
- "affilliate", "affiliate",
- "affirmitve", "affirmative",
- "afflcition", "affliction",
- "afflection", "affliction",
- "affliation", "affliction",
- "affliciton", "affliction",
- "afforadble", "affordable",
- "affordible", "affordable",
- "affortable", "affordable",
- "africaners", "africans",
- "africaness", "africans",
- "aftermaket", "aftermarket",
- "afternooon", "afternoon",
- "aggravanti", "aggravating",
- "aggraveted", "aggravated",
- "aggreement", "agreement",
- "aggregious", "egregious",
- "aggresions", "aggression",
- "aggressivo", "aggression",
- "aggrovated", "aggravated",
- "agnosticim", "agnosticism",
- "agnosticsm", "agnosticism",
- "agnostisch", "agnostic",
- "agnostiscm", "agnosticism",
- "agnostisim", "agnosticism",
- "agreeement", "agreement",
- "agricultre", "agriculture",
- "agricultue", "agriculture",
- "agriculure", "agriculture",
- "agricuture", "agriculture",
- "ailenating", "alienating",
- "ajdectives", "adjectives",
- "alchoholic", "alcoholic",
- "alchoolism", "alcoholism",
- "alcohalics", "alcoholics",
- "alcohalism", "alcoholism",
- "alcoholsim", "alcoholism",
- "aleinating", "alienating",
- "algorhitms", "algorithms",
- "algorithem", "algorithm",
- "algorithim", "algorithm",
- "algorithsm", "algorithms",
- "algorithum", "algorithm",
- "algorithym", "algorithm",
- "algoritmes", "algorithms",
- "algoritmos", "algorithms",
- "algorthims", "algorithms",
- "algortihms", "algorithms",
- "algorythms", "algorithms",
- "alievating", "alienating",
- "alledgedly", "allegedly",
- "allegeance", "allegiance",
- "allegedely", "allegedly",
- "allegedley", "allegedly",
- "allegience", "allegiance",
- "alleigance", "allegiance",
- "allergisch", "allergic",
- "alliegance", "allegiance",
- "alligeance", "allegiance",
- "alocholics", "alcoholics",
- "alocholism", "alcoholism",
- "alogrithms", "algorithms",
- "alphabeast", "alphabet",
- "alteracion", "alteration",
- "alterarion", "alteration",
- "alterating", "alteration",
- "alternador", "alternator",
- "alternater", "alternator",
- "alternatie", "alternatives",
- "alternatly", "alternately",
- "alternatve", "alternate",
- "alternetly", "alternately",
- "altogehter", "altogether",
- "altogheter", "altogether",
- "altriustic", "altruistic",
- "altruisitc", "altruistic",
- "altrusitic", "altruistic",
- "alturistic", "altruistic",
- "aluminimum", "aluminum",
- "amargeddon", "armageddon",
- "amateurest", "amateurs",
- "ambassabor", "ambassador",
- "ambassader", "ambassador",
- "ambassator", "ambassador",
- "ambassedor", "ambassador",
- "ambassidor", "ambassador",
- "ambassodor", "ambassador",
- "ambiguitiy", "ambiguity",
- "amendmants", "amendments",
- "amendmends", "amendments",
- "americains", "americas",
- "americanas", "americans",
- "americanis", "americas",
- "americanss", "americas",
- "americants", "americas",
- "americanus", "americans",
- "americares", "americas",
- "ammendment", "amendment",
- "amrageddon", "armageddon",
- "analitical", "analytical",
- "analitycal", "analytical",
- "analogeous", "analogous",
- "analyitcal", "analytical",
- "analyseles", "analyses",
- "analyseras", "analyses",
- "analyseres", "analyses",
- "analysised", "analyses",
- "analysises", "analyses",
- "analysisto", "analysts",
- "analystics", "analysts",
- "anarchisim", "anarchism",
- "anarchistm", "anarchism",
- "anarchiszm", "anarchism",
- "anarchsits", "anarchists",
- "anayltical", "analytical",
- "ancilliary", "ancillary",
- "androiders", "androids",
- "androidtvs", "androids",
- "anecdotale", "anecdote",
- "anecdotice", "anecdote",
- "anestheisa", "anesthesia",
- "anesthetia", "anesthesia",
- "anesthisia", "anesthesia",
- "anitbiotic", "antibiotic",
- "anitquated", "antiquated",
- "anitsocial", "antisocial",
- "aniversary", "anniversary",
- "annilihate", "annihilated",
- "anniverary", "anniversary",
- "anniversay", "anniversary",
- "anniversry", "anniversary",
- "annointing", "anointing",
- "annonceurs", "announcers",
- "annoucners", "announcers",
- "annoucning", "announcing",
- "announched", "announce",
- "annyoingly", "annoyingly",
- "anonymosly", "anonymously",
- "anonymousy", "anonymously",
- "antaganist", "antagonist",
- "antagnoist", "antagonist",
- "antarcitca", "antarctica",
- "antarctida", "antarctica",
- "anthropoly", "anthropology",
- "antibiodic", "antibiotic",
- "antibiotcs", "antibiotics",
- "antibitoic", "antibiotic",
- "antiboitic", "antibiotics",
- "anticapate", "anticipate",
- "anticiapte", "anticipate",
- "anticipare", "anticipate",
- "anticipato", "anticipation",
- "anticuated", "antiquated",
- "antiquited", "antiquated",
- "antiqvated", "antiquated",
- "antisipate", "anticipate",
- "antisocail", "antisocial",
- "antisosial", "antisocial",
- "antoganist", "antagonist",
- "antractica", "antarctica",
- "apacolypse", "apocalypse",
- "apartheied", "apartheid",
- "aplication", "application",
- "apocalipse", "apocalypse",
- "apocalpyse", "apocalypse",
- "apocalypes", "apocalypse",
- "apocalypic", "apocalyptic",
- "apocalyspe", "apocalypse",
- "apocalytic", "apocalyptic",
- "apocaplyse", "apocalypse",
- "apocolapse", "apocalypse",
- "apolagetic", "apologetic",
- "apolagized", "apologized",
- "apolegetic", "apologetic",
- "apoligetic", "apologetic",
- "apoligists", "apologists",
- "apoligized", "apologized",
- "apologisms", "apologists",
- "apologiste", "apologise",
- "apologitic", "apologetic",
- "apostraphe", "apostrophe",
- "apostrephe", "apostrophe",
- "apostrohpe", "apostrophe",
- "apostropes", "apostrophe",
- "apparantly", "apparently",
- "appareance", "appearance",
- "apparenlty", "apparently",
- "appartment", "apartment",
- "appealling", "appealing",
- "appearence", "appearance",
- "appearnace", "appearances",
- "apperances", "appearances",
- "apperantly", "apparently",
- "apperciate", "appreciate",
- "appereance", "appearance",
- "appetities", "appetite",
- "appetitite", "appetite",
- "appication", "application",
- "applainces", "appliances",
- "applicaple", "applicable",
- "applicates", "applicants",
- "applicaton", "application",
- "applicible", "applicable",
- "appliences", "appliances",
- "appointmet", "appointments",
- "appologies", "apologies",
- "apporached", "approached",
- "apporaches", "approaches",
- "appraoched", "approached",
- "appraoches", "approaches",
- "apprecaite", "appreciate",
- "appreciato", "appreciation",
- "appreciste", "appreciates",
- "apprecitae", "appreciates",
- "apprecited", "appreciated",
- "apprectice", "apprentice",
- "appreicate", "appreciate",
- "apprendice", "apprentice",
- "apprentace", "apprentice",
- "apprentise", "apprentice",
- "appretiate", "appreciate",
- "appretince", "apprentice",
- "appriceate", "appreciates",
- "appriciate", "appreciate",
- "appriecate", "appreciates",
- "approacing", "approaching",
- "appropiate", "appropriate",
- "approprate", "appropriate",
- "apropriate", "appropriate",
- "aproximate", "approximate",
- "apsotrophe", "apostrophe",
- "aptitudine", "aptitude",
- "aqcuainted", "acquainted",
- "aquisition", "acquisition",
- "aramgeddon", "armageddon",
- "arangement", "arrangement",
- "arbitarily", "arbitrarily",
- "arbitraily", "arbitrarily",
- "arbitraion", "arbitration",
- "arbitrairy", "arbitrarily",
- "arbitrarly", "arbitrary",
- "arbitraton", "arbitration",
- "arcehtypes", "archetypes",
- "archaelogy", "archaeology",
- "archaeolgy", "archaeology",
- "archaology", "archeology",
- "archatypes", "archetypes",
- "archetects", "architects",
- "archetipes", "archetypes",
- "archetpyes", "archetypes",
- "archetypus", "archetypes",
- "archeytpes", "archetypes",
- "archictect", "architect",
- "architechs", "architects",
- "architecht", "architect",
- "architecte", "architecture",
- "architexts", "architects",
- "architypes", "archetypes",
- "archtiects", "architects",
- "archytypes", "archetypes",
- "argentinia", "argentina",
- "arguements", "arguments",
- "argumentas", "arguments",
- "argumentos", "arguments",
- "arithemtic", "arithmetic",
- "arithmitic", "arithmetic",
- "aritmethic", "arithmetic",
- "armagaddon", "armageddon",
- "armageddan", "armageddon",
- "armagedden", "armageddon",
- "armageddin", "armageddon",
- "armagedeon", "armageddon",
- "armageedon", "armageddon",
- "armagideon", "armageddon",
- "armegaddon", "armageddon",
- "arrangerad", "arranged",
- "arrangment", "arrangement",
- "arthimetic", "arithmetic",
- "articifial", "artificial",
- "articluate", "articulate",
- "articualte", "articulate",
- "articulted", "articulated",
- "artifactos", "artifacts",
- "artificiel", "artificial",
- "artihmetic", "arithmetic",
- "artillerly", "artillery",
- "asbestoast", "asbestos",
- "asethetics", "aesthetics",
- "asisstants", "assistants",
- "aspiratons", "aspirations",
- "assasinate", "assassinate",
- "assassians", "assassin",
- "assassinas", "assassins",
- "assassines", "assassins",
- "assassinos", "assassins",
- "assemblare", "assemble",
- "assempling", "assembling",
- "assersions", "assertions",
- "assesement", "assessment",
- "assestment", "assessment",
- "assignemnt", "assignment",
- "assimalate", "assimilate",
- "assimilant", "assimilate",
- "assimilare", "assimilate",
- "assimliate", "assimilate",
- "assimulate", "assimilate",
- "assingment", "assignment",
- "assistanat", "assistants",
- "assistanse", "assistants",
- "assistante", "assistance",
- "assistence", "assistance",
- "assistendo", "assisted",
- "assistents", "assistants",
- "assmebling", "assembling",
- "assocaited", "associated",
- "assocaites", "associates",
- "assocation", "association",
- "associatie", "associated",
- "associatin", "associations",
- "associaton", "association",
- "associsted", "associates",
- "assoicated", "associated",
- "assoicates", "associates",
- "assosiated", "associated",
- "assosiates", "associates",
- "asssassans", "assassins",
- "assupmtion", "assumptions",
- "assymetric", "asymmetric",
- "asteroides", "asteroids",
- "asthetical", "aesthetical",
- "astonising", "astonishing",
- "astornauts", "astronauts",
- "astranauts", "astronauts",
- "astronatus", "astronauts",
- "astronaunt", "astronaut",
- "astronomia", "astronomical",
- "astronouts", "astronauts",
- "astronuats", "astronauts",
- "asutralian", "australian",
- "atatchment", "attachment",
- "athleticos", "athletics",
- "athleticsm", "athleticism",
- "athletiscm", "athleticism",
- "athletisim", "athleticism",
- "atmopshere", "atmosphere",
- "atmoshpere", "atmosphere",
- "atomsphere", "atmosphere",
- "atriculate", "articulate",
- "atrocoties", "atrocities",
- "atrosities", "atrocities",
- "attachemnt", "attachment",
- "attackeras", "attackers",
- "attactment", "attachment",
- "attemtping", "attempting",
- "attendence", "attendance",
- "attendents", "attendants",
- "attirbutes", "attributes",
- "attmepting", "attempting",
- "attracters", "attracts",
- "attractice", "attractive",
- "attracties", "attracts",
- "attractifs", "attracts",
- "attraktion", "attraction",
- "attraktive", "attractive",
- "attribuito", "attribution",
- "attritubes", "attributes",
- "auctioners", "auctions",
- "audioboook", "audiobook",
- "audioboost", "audiobooks",
- "auidobooks", "audiobooks",
- "auotattack", "autoattack",
- "austrailan", "australian",
- "austrailia", "australia",
- "australain", "australians",
- "australien", "australian",
- "australina", "australians",
- "austrlaian", "australians",
- "authenticy", "authenticity",
- "autherized", "authorized",
- "authoritay", "authority",
- "authorites", "authorities",
- "authorithy", "authority",
- "authroized", "authorized",
- "autistisch", "autistic",
- "autoattaks", "autoattack",
- "autocorect", "autocorrect",
- "autocorrct", "autocorrect",
- "autocorret", "autocorrect",
- "autograpgh", "autograph",
- "automatice", "automate",
- "automatico", "automation",
- "automatied", "automate",
- "automatiek", "automate",
- "automatron", "automation",
- "automatted", "automate",
- "automibile", "automobile",
- "automitive", "automotive",
- "automoblie", "automobile",
- "automomous", "autonomous",
- "automonous", "autonomous",
- "automotice", "automotive",
- "automotion", "automation",
- "automotize", "automotive",
- "automotove", "automotive",
- "autonamous", "autonomous",
- "autonation", "automation",
- "autonimous", "autonomous",
- "autonomity", "autonomy",
- "autononous", "autonomous",
- "auttoatack", "autoattack",
- "auxilliary", "auxiliary",
- "availabale", "available",
- "availaible", "available",
- "availiable", "available",
- "averageadi", "averaged",
- "averageifs", "averages",
- "awesomeley", "awesomely",
- "awesomelly", "awesomely",
- "awesomenss", "awesomeness",
- "awkwardess", "awkwardness",
- "babysister", "babysitter",
- "babysiting", "babysitting",
- "babysittng", "babysitting",
- "bachelores", "bachelors",
- "backgorund", "background",
- "backgroudn", "backgrounds",
- "backgrouds", "backgrounds",
- "backgrouns", "backgrounds",
- "backgruond", "backgrounds",
- "backpacing", "backpacking",
- "backpackng", "backpacking",
- "backrgound", "backgrounds",
- "backrounds", "backgrounds",
- "baksetball", "basketball",
- "balanceada", "balanced",
- "balanceado", "balanced",
- "balckberry", "blackberry",
- "balckhawks", "blackhawks",
- "balcksmith", "blacksmith",
- "bandwagoon", "bandwagon",
- "bangaldesh", "bangladesh",
- "bangladash", "bangladesh",
- "bangledash", "bangladesh",
- "bangledesh", "bangladesh",
- "banglidesh", "bangladesh",
- "bankrupcty", "bankruptcy",
- "bankruptsy", "bankruptcy",
- "bankrutpcy", "bankruptcy",
- "barabrians", "barbarians",
- "barbariens", "barbarians",
- "barbarions", "barbarians",
- "barbarisch", "barbaric",
- "barberians", "barbarians",
- "bargianing", "bargaining",
- "bartendars", "bartenders",
- "basektball", "basketball",
- "baskteball", "basketball",
- "bastardous", "bastards",
- "battelship", "battleship",
- "battelstar", "battlestar",
- "battlearts", "battlestar",
- "battlechip", "battleship",
- "battlefied", "battlefield",
- "battlefont", "battlefront",
- "battlehips", "battleship",
- "battlesaur", "battlestar",
- "battlescar", "battlestar",
- "battleshop", "battleship",
- "battlestsr", "battlestar",
- "beahviours", "behaviours",
- "beautifuly", "beautifully",
- "beautilful", "beautifully",
- "beautyfull", "beautiful",
- "becnhmarks", "benchmarks",
- "beethoveen", "beethoven",
- "begginings", "beginnings",
- "begininngs", "beginnings",
- "beginninng", "beginnings",
- "behaivours", "behaviours",
- "behaviorly", "behavioral",
- "behavoiral", "behavioral",
- "behavoiurs", "behaviours",
- "behavorial", "behavioral",
- "behavoural", "behavioral",
- "behvaiours", "behaviours",
- "beleagured", "beleaguered",
- "beleivable", "believable",
- "beliavable", "believable",
- "beliebable", "believable",
- "believeble", "believable",
- "beliveable", "believable",
- "benchamrks", "benchmarks",
- "benchmakrs", "benchmarks",
- "benckmarks", "benchmarks",
- "benefecial", "beneficial",
- "beneficary", "beneficiary",
- "beneficiul", "beneficial",
- "benefitial", "beneficial",
- "beneifical", "beneficial",
- "benelovent", "benevolent",
- "benevalent", "benevolent",
- "benevelant", "benevolent",
- "benevelent", "benevolent",
- "benevelont", "benevolent",
- "benevloent", "benevolent",
- "benevolant", "benevolent",
- "benificial", "beneficial",
- "benovelent", "benevolent",
- "bernouilli", "bernoulli",
- "besitality", "bestiality",
- "bestaility", "bestiality",
- "besteality", "bestiality",
- "betrayeado", "betrayed",
- "bilateraly", "bilaterally",
- "billborads", "billboards",
- "bioligical", "biological",
- "biologiset", "biologist",
- "biologiskt", "biologist",
- "birghtness", "brightness",
- "birmignham", "birmingham",
- "birmimgham", "birmingham",
- "bisexuella", "bisexual",
- "bitterseet", "bittersweet",
- "bitterswet", "bittersweet",
- "blackahwks", "blackhawks",
- "blackbarry", "blackberry",
- "blackbeary", "blackberry",
- "blackbeery", "blackberry",
- "blackcawks", "blackhawks",
- "blackhakws", "blackhawks",
- "blackhwaks", "blackhawks",
- "blackmsith", "blacksmith",
- "blackshits", "blacksmith",
- "blasphemey", "blasphemy",
- "blitzkreig", "blitzkrieg",
- "blochchain", "blockchain",
- "blockcahin", "blockchain",
- "blockchian", "blockchain",
- "bloodboner", "bloodborne",
- "bloodbonre", "bloodborne",
- "bloodborbe", "bloodborne",
- "bloodbrone", "bloodborne",
- "bloodporne", "bloodborne",
- "bloorborne", "bloodborne",
- "blueberies", "blueberries",
- "blueberris", "blueberries",
- "blueberrry", "blueberry",
- "bluebrints", "blueprints",
- "boardcasts", "broadcasts",
- "bodyheight", "bodyweight",
- "bodyweigth", "bodyweight",
- "bodywieght", "bodyweight",
- "bombarment", "bombardment",
- "bookmakred", "bookmarked",
- "bootlaoder", "bootloader",
- "bootleader", "bootloader",
- "boradcasts", "broadcasts",
- "borderlads", "borderlands",
- "borderlans", "borderlands",
- "bottelneck", "bottleneck",
- "bottlebeck", "bottleneck",
- "boundaires", "boundaries",
- "bounderies", "boundaries",
- "bourgeoius", "bourgeois",
- "boycutting", "boycotting",
- "boyfirends", "boyfriends",
- "boyfreinds", "boyfriends",
- "boyfrients", "boyfriends",
- "braceletes", "bracelets",
- "braceletts", "bracelets",
- "brainwased", "brainwashed",
- "brakedowns", "breakdowns",
- "braodcasts", "broadcasts",
- "brasillian", "brazilian",
- "bratenders", "bartenders",
- "brazilains", "brazilians",
- "brazileans", "brazilians",
- "braziliaan", "brazilians",
- "brazilions", "brazilians",
- "brazillans", "brazilians",
- "brightoner", "brighten",
- "brigthness", "brightness",
- "brillaince", "brilliance",
- "brilliante", "brilliance",
- "brillianty", "brilliantly",
- "brimestone", "brimstone",
- "brimingham", "birmingham",
- "broacasted", "broadcast",
- "brotherhod", "brotherhood",
- "brotherood", "brotherhood",
- "brusselers", "brussels",
- "brutallity", "brutally",
- "buisnesses", "businesses",
- "bulgariska", "bulgaria",
- "bulletpoof", "bulletproof",
- "bulletprof", "bulletproof",
- "bureaucats", "bureaucrats",
- "businesman", "businessman",
- "businesmen", "businessmen",
- "businessen", "businessmen",
- "butterfies", "butterflies",
- "cabinettas", "cabinets",
- "caclulated", "calculated",
- "caclulator", "calculator",
- "cahracters", "characters",
- "calcluator", "calculators",
- "calcualted", "calculated",
- "calcualtor", "calculator",
- "calculador", "calculator",
- "calcularon", "calculator",
- "calculater", "calculator",
- "calculatin", "calculations",
- "calibratin", "calibration",
- "calibraton", "calibration",
- "califnoria", "californian",
- "califonria", "californian",
- "califorian", "californian",
- "califorina", "california",
- "californai", "californian",
- "califronia", "california",
- "caligraphy", "calligraphy",
- "caliofrnia", "californian",
- "calrifying", "clarifying",
- "calssified", "classified",
- "caluclated", "calculated",
- "caluclator", "calculator",
- "caluculate", "calculate",
- "cambodican", "cambodia",
- "camofluage", "camouflage",
- "camoufalge", "camouflage",
- "camouglage", "camouflage",
- "campaiging", "campaigning",
- "campaignes", "campaigns",
- "cancellato", "cancellation",
- "candidatas", "candidates",
- "candidatxs", "candidates",
- "candidiate", "candidate",
- "canditates", "candidates",
- "cannibalsm", "cannibalism",
- "cannisters", "canisters",
- "cannonical", "canonical",
- "capabality", "capability",
- "capabiltiy", "capability",
- "capacators", "capacitors",
- "capaciters", "capacitors",
- "capactiors", "capacitors",
- "capasitors", "capacitors",
- "capatilism", "capitalism",
- "capatilist", "capitalist",
- "capatilize", "capitalize",
- "capialized", "capitalized",
- "capicators", "capacitors",
- "capitalisn", "capitals",
- "capitalits", "capitalists",
- "capitalsim", "capitalism",
- "capitalsit", "capitalists",
- "capitarist", "capitalist",
- "capitilism", "capitalism",
- "capitilist", "capitalist",
- "capitilize", "capitalize",
- "capitlaism", "capitalism",
- "capitlaist", "capitalist",
- "capitlaize", "capitalized",
- "capitolism", "capitalism",
- "capitolist", "capitalist",
- "capitolize", "capitalize",
- "captainers", "captains",
- "captialism", "capitalism",
- "captialist", "capitalist",
- "captialize", "capitalize",
- "captivitiy", "captivity",
- "caraciture", "caricature",
- "carciature", "caricature",
- "cardinales", "cardinals",
- "cardinalis", "cardinals",
- "carefullly", "carefully",
- "cariacture", "caricature",
- "caricatore", "caricature",
- "cariciture", "caricature",
- "caricuture", "caricature",
- "carismatic", "charismatic",
- "carribbean", "caribbean",
- "cartdridge", "cartridge",
- "cartdriges", "cartridges",
- "carthagian", "carthaginian",
- "cartilidge", "cartilage",
- "cartirdges", "cartridges",
- "cartrdiges", "cartridges",
- "cartriages", "cartridges",
- "cartrigdes", "cartridges",
- "casaulties", "casualties",
- "cassowarry", "cassowary",
- "casualites", "casualties",
- "casualries", "casualties",
- "casulaties", "casualties",
- "cataclysim", "cataclysm",
- "cataclysym", "cataclysm",
- "catagories", "categories",
- "catapillar", "caterpillar",
- "catapiller", "caterpillar",
- "catastrope", "catastrophe",
- "catastrphe", "catastrophe",
- "categorice", "categorize",
- "categoried", "categorized",
- "categoriei", "categorize",
- "cateogrize", "categorized",
- "catepillar", "caterpillar",
- "caterpilar", "caterpillar",
- "catholicsm", "catholicism",
- "catholicus", "catholics",
- "catholisim", "catholicism",
- "cativating", "activating",
- "cattleship", "battleship",
- "causalties", "casualties",
- "cautionsly", "cautiously",
- "celebratin", "celebration",
- "celebrites", "celebrities",
- "celebritiy", "celebrity",
- "cellpading", "cellpadding",
- "cellulaire", "cellular",
- "cemetaries", "cemeteries",
- "censorhsip", "censorship",
- "censurship", "censorship",
- "centipedle", "centipede",
- "ceremonias", "ceremonies",
- "ceremoniis", "ceremonies",
- "ceremonije", "ceremonies",
- "cerimonial", "ceremonial",
- "cerimonies", "ceremonies",
- "certainity", "certainty",
- "certainlyt", "certainty",
- "chairtable", "charitable",
- "chalenging", "challenging",
- "challanged", "challenged",
- "challanges", "challenges",
- "challegner", "challenger",
- "challender", "challenger",
- "challengue", "challenger",
- "challengur", "challenger",
- "challening", "challenging",
- "challneger", "challenger",
- "chanceller", "chancellor",
- "chancillor", "chancellor",
- "chansellor", "chancellor",
- "charachter", "character",
- "charactere", "characterize",
- "characterz", "characterize",
- "charactors", "characters",
- "charakters", "characters",
- "charatable", "charitable",
- "charecters", "characters",
- "charistics", "characteristics",
- "charitible", "charitable",
- "chartiable", "charitable",
- "chechpoint", "checkpoint",
- "checkpiont", "checkpoint",
- "checkpoins", "checkpoints",
- "checkponts", "checkpoints",
- "cheesecase", "cheesecake",
- "cheesecave", "cheesecake",
- "cheeseface", "cheesecake",
- "cheezecake", "cheesecake",
- "chemcially", "chemically",
- "chidlbirth", "childbirth",
- "chihuahuha", "chihuahua",
- "childbrith", "childbirth",
- "childrends", "childrens",
- "childrenis", "childrens",
- "childrents", "childrens",
- "chirstians", "christians",
- "chocalates", "chocolates",
- "chocloates", "chocolates",
- "chocoaltes", "chocolates",
- "chocolatie", "chocolates",
- "chocolatos", "chocolates",
- "chocolatte", "chocolates",
- "chocolotes", "chocolates",
- "cholestrol", "cholesterol",
- "chormosome", "chromosome",
- "chornicles", "chronicles",
- "chrisitans", "christians",
- "christains", "christians",
- "christiaan", "christian",
- "christimas", "christians",
- "christinas", "christians",
- "christines", "christians",
- "christmans", "christians",
- "chromasome", "chromosome",
- "chromesome", "chromosome",
- "chromisome", "chromosome",
- "chromosmes", "chromosomes",
- "chromosoms", "chromosomes",
- "chromosone", "chromosome",
- "chromosoom", "chromosome",
- "chromozome", "chromosome",
- "chronciles", "chronicles",
- "chronicals", "chronicles",
- "chronicels", "chronicles",
- "chronocles", "chronicles",
- "chronosome", "chromosome",
- "chrsitians", "christians",
- "cigarattes", "cigarettes",
- "cigerattes", "cigarettes",
- "cincinatti", "cincinnati",
- "cinncinati", "cincinnati",
- "circulaire", "circular",
- "circulaton", "circulation",
- "circumsice", "circumcised",
- "circumsied", "circumcised",
- "circumwent", "circumvent",
- "circunvent", "circumvent",
- "cirruculum", "curriculum",
- "claculator", "calculator",
- "clairfying", "clarifying",
- "clasically", "classically",
- "classicals", "classics",
- "classrooom", "classroom",
- "cleanliess", "cleanliness",
- "cleareance", "clearance",
- "cleverleys", "cleverly",
- "cliffhager", "cliffhanger",
- "climateers", "climates",
- "climatiser", "climates",
- "clincially", "clinically",
- "clitoridis", "clitoris",
- "clitorious", "clitoris",
- "co-incided", "coincided",
- "cockroachs", "cockroaches",
- "cockroahes", "cockroaches",
- "coefficent", "coefficient",
- "cognatious", "contagious",
- "cognitivie", "cognitive",
- "coincidnce", "coincide",
- "colelctive", "collective",
- "colelctors", "collectors",
- "collapsers", "collapses",
- "collaquial", "colloquial",
- "collasping", "collapsing",
- "collataral", "collateral",
- "collaterol", "collateral",
- "collatoral", "collateral",
- "collcetion", "collections",
- "colleauges", "colleagues",
- "colleciton", "collection",
- "collectems", "collects",
- "collectief", "collective",
- "collecties", "collects",
- "collectifs", "collects",
- "collectivo", "collection",
- "collectoin", "collections",
- "collectons", "collections",
- "collectros", "collects",
- "collegaues", "colleagues",
- "collequial", "colloquial",
- "colleteral", "collateral",
- "colliquial", "colloquial",
- "collission", "collisions",
- "collitions", "collisions",
- "colloqiual", "colloquial",
- "colloquail", "colloquial",
- "colloqueal", "colloquial",
- "collpasing", "collapsing",
- "colonialsm", "colonialism",
- "colorblend", "colorblind",
- "coloublind", "colorblind",
- "columbidae", "columbia",
- "comapnions", "companions",
- "comaprable", "comparable",
- "comaprison", "comparison",
- "comaptible", "compatible",
- "combatabts", "combatants",
- "combatents", "combatants",
- "combinatin", "combinations",
- "combinaton", "combination",
- "comediants", "comedians",
- "comepndium", "compendium",
- "comferting", "comforting",
- "comforming", "comforting",
- "comfortbly", "comfortably",
- "comisioned", "commissioned",
- "comisioner", "commissioner",
- "comissions", "commissions",
- "commandbox", "commando",
- "commandent", "commandment",
- "commandeur", "commanders",
- "commandore", "commanders",
- "commandpod", "commando",
- "commanists", "communists",
- "commemters", "commenters",
- "commencera", "commerce",
- "commenciez", "commence",
- "commentaar", "commentary",
- "commentare", "commenter",
- "commentars", "commenters",
- "commentart", "commentator",
- "commentery", "commentary",
- "commentsry", "commenters",
- "commercail", "commercials",
- "commercent", "commence",
- "commerical", "commercial",
- "comminists", "communists",
- "commisison", "commissions",
- "commissons", "commissions",
- "commiteted", "commited",
- "commodites", "commodities",
- "commtiment", "commitments",
- "communicae", "communicated",
- "communisim", "communism",
- "communiste", "communities",
- "communites", "communities",
- "communters", "commenters",
- "compadible", "compatible",
- "compagnons", "companions",
- "compainons", "companions",
- "compairson", "comparison",
- "compalined", "complained",
- "compandium", "compendium",
- "companians", "companions",
- "companines", "companions",
- "compansate", "compensate",
- "comparabil", "comparable",
- "comparason", "comparison",
- "comparaste", "compares",
- "comparatie", "comparative",
- "compareble", "comparable",
- "comparemos", "compares",
- "comparions", "comparison",
- "compariosn", "comparisons",
- "comparisen", "compares",
- "comparitve", "comparative",
- "comparsion", "comparison",
- "compartent", "compartment",
- "compartmet", "compartment",
- "compatibel", "compatible",
- "compatibil", "compatible",
- "compeating", "completing",
- "compeditor", "competitor",
- "compednium", "compendium",
- "compeeting", "completing",
- "compeltely", "completely",
- "compelting", "completing",
- "compeltion", "completion",
- "compemdium", "compendium",
- "compenduim", "compendium",
- "compenents", "components",
- "compenidum", "compendium",
- "compensare", "compensate",
- "comperable", "comparable",
- "comperhend", "comprehend",
- "compession", "compassion",
- "competance", "competence",
- "competator", "competitor",
- "competenet", "competence",
- "competense", "competence",
- "competenze", "competence",
- "competeted", "competed",
- "competetor", "competitor",
- "competidor", "competitor",
- "competiors", "competitors",
- "competitie", "competitive",
- "competitin", "competitions",
- "competitio", "competitor",
- "competiton", "competition",
- "competitve", "competitive",
- "compilance", "compliance",
- "compilaton", "compilation",
- "compinsate", "compensate",
- "compitable", "compatible",
- "compitance", "compliance",
- "complacant", "complacent",
- "complaince", "compliance",
- "complaines", "complaints",
- "complainig", "complaining",
- "complainte", "complained",
- "complation", "completion",
- "compleatly", "completely",
- "complecate", "complicate",
- "completeds", "completes",
- "completent", "complement",
- "completily", "complexity",
- "completito", "completion",
- "completley", "completely",
- "complexers", "complexes",
- "complexety", "complexity",
- "complianed", "compliance",
- "compliants", "complaints",
- "complicaed", "complicate",
- "complicare", "complicate",
- "complicati", "complicit",
- "complicato", "complication",
- "complicite", "complicate",
- "complicted", "complicated",
- "complience", "compliance",
- "complimate", "complicate",
- "complition", "completion",
- "complusion", "compulsion",
- "complusive", "compulsive",
- "complusory", "compulsory",
- "compolsive", "compulsive",
- "compolsory", "compulsory",
- "compolsury", "compulsory",
- "componants", "components",
- "componenet", "components",
- "componsate", "compensate",
- "comporable", "comparable",
- "compositae", "composite",
- "compositie", "composite",
- "compositon", "composition",
- "compraison", "comparisons",
- "compramise", "compromise",
- "comprassem", "compress",
- "comprehand", "comprehend",
- "compresion", "compression",
- "compresors", "compressor",
- "compresser", "compressor",
- "compressio", "compressor",
- "compresson", "compression",
- "comprihend", "comprehend",
- "comprimise", "compromise",
- "compromiss", "compromises",
- "compromize", "compromise",
- "compromsie", "compromises",
- "comprossor", "compressor",
- "compteting", "completing",
- "comptetion", "completion",
- "compulisve", "compulsive",
- "compulosry", "compulsory",
- "compulsary", "compulsory",
- "compulsery", "compulsory",
- "compulsing", "compulsion",
- "compulsivo", "compulsion",
- "compulsury", "compulsory",
- "compuslion", "compulsion",
- "compuslive", "compulsive",
- "compuslory", "compulsory",
- "compustion", "compulsion",
- "computanti", "computation",
- "conatiners", "containers",
- "concedendo", "conceded",
- "concedered", "conceded",
- "conceitual", "conceptual",
- "concentate", "concentrate",
- "concenting", "connecting",
- "conceptial", "conceptual",
- "conceptuel", "conceptual",
- "concersion", "concession",
- "concesions", "concession",
- "concidered", "considered",
- "conciously", "consciously",
- "concission", "concession",
- "conclsuion", "concussion",
- "conclusies", "conclusive",
- "conclution", "conclusion",
- "concorrent", "concurrent",
- "concsience", "conscience",
- "conculsion", "conclusion",
- "conculsive", "conclusive",
- "concurment", "concurrent",
- "concurrant", "concurrent",
- "concurrect", "concurrent",
- "concusions", "concussion",
- "concusison", "concussions",
- "condamning", "condemning",
- "condemming", "condemning",
- "condencing", "condemning",
- "condenming", "condemning",
- "condensend", "condensed",
- "condidtion", "condition",
- "conditinal", "conditional",
- "conditiner", "conditioner",
- "conditiond", "conditioned",
- "conditiong", "conditioning",
- "condmening", "condemning",
- "conduiting", "conducting",
- "conencting", "connecting",
- "conenction", "connection",
- "conenctors", "connectors",
- "conesencus", "consensus",
- "confedarcy", "confederacy",
- "confedence", "conference",
- "confedercy", "confederacy",
- "conferance", "conference",
- "conferenze", "conference",
- "conferming", "confirming",
- "confernece", "conferences",
- "confessino", "confessions",
- "confidance", "confidence",
- "confidenly", "confidently",
- "confidense", "confidence",
- "confidenty", "confidently",
- "conflcting", "conflating",
- "conflicing", "conflicting",
- "conflictos", "conflicts",
- "confliting", "conflating",
- "confriming", "confirming",
- "confussion", "confession",
- "congratule", "congratulate",
- "congresman", "congressman",
- "congresmen", "congressmen",
- "congressen", "congressmen",
- "conjecutre", "conjecture",
- "conjuction", "conjunction",
- "conjuncion", "conjunction",
- "conlcusion", "conclusion",
- "conncetion", "connections",
- "conneciton", "connection",
- "connecties", "connects",
- "connectins", "connects",
- "connectivy", "connectivity",
- "connectpro", "connector",
- "conneticut", "connecticut",
- "connotaion", "connotation",
- "conpsiracy", "conspiracy",
- "conqeuring", "conquering",
- "conqouring", "conquering",
- "conquerers", "conquerors",
- "conquoring", "conquering",
- "consciense", "conscience",
- "consciouly", "consciously",
- "consdiered", "considered",
- "consending", "consenting",
- "consensuel", "consensual",
- "consenusal", "consensual",
- "consequece", "consequence",
- "consequnce", "consequence",
- "conservare", "conserve",
- "conservato", "conservation",
- "conservice", "conserve",
- "conservies", "conserve",
- "conservite", "conserve",
- "consicence", "conscience",
- "consideras", "considers",
- "consideret", "considerate",
- "consipracy", "conspiracy",
- "consistant", "consistent",
- "consistens", "consists",
- "consisteny", "consistency",
- "consitency", "consistency",
- "consituted", "constituted",
- "conslutant", "consultant",
- "consluting", "consulting",
- "consolidad", "consolidated",
- "consonents", "consonants",
- "consorcium", "consortium",
- "conspirace", "conspiracies",
- "conspiricy", "conspiracy",
- "conspriacy", "conspiracy",
- "constaints", "constraints",
- "constatnly", "constantly",
- "constently", "constantly",
- "constitude", "constitute",
- "constitued", "constitute",
- "constituem", "constitute",
- "constituer", "constitute",
- "constitues", "constitutes",
- "constituie", "constitute",
- "constituit", "constitute",
- "constitutn", "constituents",
- "constituye", "constitute",
- "constnatly", "constantly",
- "constracts", "constructs",
- "constraits", "constraints",
- "constransi", "constraints",
- "constrants", "constraints",
- "construced", "constructed",
- "constructo", "construction",
- "construint", "constraint",
- "construits", "constructs",
- "construted", "constructed",
- "consueling", "consulting",
- "consultata", "consultant",
- "consultate", "consultant",
- "consultati", "consultant",
- "consultato", "consultation",
- "consultent", "consultant",
- "consumated", "consummated",
- "consumbale", "consumables",
- "consuments", "consumes",
- "consumirem", "consumerism",
- "consumires", "consumerism",
- "consumirse", "consumerism",
- "consumiste", "consumes",
- "consumpion", "consumption",
- "contaction", "contacting",
- "contageous", "contagious",
- "contagiosa", "contagious",
- "contagioso", "contagious",
- "contaigous", "contagious",
- "containors", "containers",
- "contaminen", "containment",
- "contanting", "contacting",
- "contection", "contention",
- "contectual", "contextual",
- "conteiners", "contenders",
- "contempate", "contemplate",
- "contemplat", "contempt",
- "contempory", "contemporary",
- "contenants", "continents",
- "contencion", "contention",
- "contendors", "contenders",
- "contenents", "continents",
- "conteneurs", "contenders",
- "contengent", "contingent",
- "contension", "contention",
- "contentino", "contention",
- "contentios", "contentious",
- "contentous", "contentious",
- "contestais", "contests",
- "contestans", "contests",
- "contestase", "contests",
- "contestion", "contention",
- "contestors", "contests",
- "contextful", "contextual",
- "contextuel", "contextual",
- "contextura", "contextual",
- "contianers", "containers",
- "contianing", "containing",
- "contibuted", "contributed",
- "contibutes", "contributes",
- "contigents", "continents",
- "contigious", "contagious",
- "contignent", "contingent",
- "continants", "continents",
- "continenal", "continental",
- "continenet", "continents",
- "contineous", "continuous",
- "continetal", "continental",
- "contingecy", "contingency",
- "contingeny", "contingency",
- "continient", "contingent",
- "continious", "continuous",
- "continiuty", "continuity",
- "contintent", "contingent",
- "continualy", "continually",
- "continuare", "continue",
- "continuati", "continuity",
- "continuato", "continuation",
- "continuent", "contingent",
- "continuety", "continuity",
- "continunes", "continents",
- "continuons", "continuous",
- "continutiy", "continuity",
- "continuuum", "continuum",
- "contitnent", "contingent",
- "contiuning", "containing",
- "contiunity", "continuity",
- "contorller", "controllers",
- "contracing", "contracting",
- "contractar", "contractor",
- "contracter", "contractor",
- "contractin", "contraction",
- "contractos", "contracts",
- "contradice", "contradicted",
- "contradics", "contradicts",
- "contredict", "contradict",
- "contribued", "contributed",
- "contribuem", "contribute",
- "contribuer", "contribute",
- "contribues", "contributes",
- "contribuie", "contribute",
- "contribuit", "contribute",
- "contributo", "contribution",
- "contributs", "contributes",
- "contribuye", "contribute",
- "contricted", "contracted",
- "contridict", "contradict",
- "contriubte", "contributes",
- "controlelr", "controllers",
- "controlers", "controls",
- "controling", "controlling",
- "controlles", "controls",
- "controvery", "controversy",
- "controvesy", "controversy",
- "contrubite", "contributes",
- "contrubute", "contribute",
- "contuining", "continuing",
- "contuinity", "continuity",
- "convaluted", "convoluted",
- "convcition", "convictions",
- "conveinent", "convenient",
- "conveluted", "convoluted",
- "convencion", "convention",
- "conveniant", "convenient",
- "conveniece", "convenience",
- "convenince", "convenience",
- "convential", "conventional",
- "converesly", "conversely",
- "convergens", "converse",
- "converison", "conversions",
- "converning", "converting",
- "conversare", "converse",
- "conversino", "conversions",
- "conversley", "conversely",
- "conversoin", "conversions",
- "conversons", "conversions",
- "convertion", "conversion",
- "convertire", "converter",
- "converying", "converting",
- "conveyered", "conveyed",
- "conviccion", "conviction",
- "conviciton", "conviction",
- "convienent", "convenient",
- "conviluted", "convoluted",
- "convincted", "convince",
- "convinsing", "convincing",
- "convinving", "convincing",
- "convoluded", "convoluted",
- "convoulted", "convoluted",
- "convulated", "convoluted",
- "convuluted", "convoluted",
- "cooperatve", "cooperative",
- "coordenate", "coordinate",
- "coordiante", "coordinate",
- "coordinare", "coordinate",
- "coordinato", "coordination",
- "coordinats", "coordinates",
- "coordonate", "coordinate",
- "cooridnate", "coordinate",
- "copehnagen", "copenhagen",
- "copenaghen", "copenhagen",
- "copenahgen", "copenhagen",
- "copengagen", "copenhagen",
- "copengahen", "copenhagen",
- "copenhagan", "copenhagen",
- "copenhague", "copenhagen",
- "copenhagun", "copenhagen",
- "copenhaven", "copenhagen",
- "copenhegan", "copenhagen",
- "copyrighed", "copyrighted",
- "copyrigted", "copyrighted",
- "corinthans", "corinthians",
- "corinthias", "corinthians",
- "corinthins", "corinthians",
- "cornmitted", "committed",
- "corporatie", "corporate",
- "corralated", "correlated",
- "corralates", "correlates",
- "correccion", "correction",
- "correciton", "corrections",
- "correcters", "correctors",
- "correctess", "correctness",
- "correctivo", "correction",
- "correctons", "corrections",
- "corregated", "correlated",
- "correkting", "correcting",
- "correlatas", "correlates",
- "correlatie", "correlated",
- "correlatos", "correlates",
- "correspend", "correspond",
- "corrilated", "correlated",
- "corrilates", "correlates",
- "corrispond", "correspond",
- "corrolated", "correlated",
- "corrolates", "correlates",
- "corrospond", "correspond",
- "corrpution", "corruption",
- "corrulates", "correlates",
- "corrupcion", "corruption",
- "cosmeticas", "cosmetics",
- "cosmeticos", "cosmetics",
- "costumized", "customized",
- "counceling", "counseling",
- "councellor", "councillor",
- "councelors", "counselors",
- "councilers", "councils",
- "counselers", "counselors",
- "counsellng", "counselling",
- "counsilers", "counselors",
- "counsiling", "counseling",
- "counsilors", "counselors",
- "counsolers", "counselors",
- "counsoling", "counseling",
- "countepart", "counteract",
- "counteratk", "counteract",
- "counterbat", "counteract",
- "countercat", "counteract",
- "countercut", "counteract",
- "counteries", "counters",
- "countoring", "countering",
- "countryies", "countryside",
- "countrying", "countering",
- "courcework", "coursework",
- "coursefork", "coursework",
- "courthosue", "courthouse",
- "courtrooom", "courtroom",
- "cousnelors", "counselors",
- "coutneract", "counteract",
- "coutnering", "countering",
- "covenental", "covenant",
- "cranberrry", "cranberry",
- "creationis", "creations",
- "creationsm", "creationism",
- "creationst", "creationist",
- "creativily", "creatively",
- "creativley", "creatively",
- "credibilty", "credibility",
- "creeperest", "creepers",
- "crimanally", "criminally",
- "criminalty", "criminally",
- "criminalul", "criminally",
- "criticable", "critical",
- "criticarlo", "critical",
- "criticiing", "criticising",
- "criticisim", "criticism",
- "criticisme", "criticise",
- "criticisng", "criticising",
- "criticists", "critics",
- "criticisze", "criticise",
- "criticizms", "criticisms",
- "criticizng", "criticizing",
- "critisiced", "criticized",
- "critisicms", "criticisms",
- "critisicsm", "criticisms",
- "critisiscm", "criticisms",
- "critisisms", "criticisms",
- "critisizes", "criticises",
- "critisizms", "criticisms",
- "critiziced", "criticized",
- "critizised", "criticized",
- "critizisms", "criticisms",
- "critizized", "criticized",
- "crocodille", "crocodile",
- "crossfiter", "crossfire",
- "crutchetts", "crutches",
- "crystalens", "crystals",
- "crystalisk", "crystals",
- "crystallis", "crystals",
- "cuatiously", "cautiously",
- "culterally", "culturally",
- "cultrually", "culturally",
- "culumative", "cumulative",
- "culutrally", "culturally",
- "cumbersone", "cumbersome",
- "cumbursome", "cumbersome",
- "cumpolsory", "compulsory",
- "cumulitive", "cumulative",
- "currancies", "currencies",
- "currenctly", "currency",
- "currenices", "currencies",
- "currentfps", "currents",
- "currentlys", "currents",
- "currentpos", "currents",
- "currentusa", "currents",
- "curriculem", "curriculum",
- "curriculim", "curriculum",
- "curriences", "currencies",
- "curroption", "corruption",
- "custimized", "customized",
- "customzied", "customized",
- "custumized", "customized",
- "cutscences", "cutscene",
- "cutscenses", "cutscene",
- "dangerouly", "dangerously",
- "dealerhsip", "dealerships",
- "deathamtch", "deathmatch",
- "deathmacth", "deathmatch",
- "debateable", "debatable",
- "decembeard", "december",
- "decendants", "descendants",
- "decendents", "descendants",
- "decideable", "decidable",
- "deciptions", "depictions",
- "decisiones", "decisions",
- "declarasen", "declares",
- "declaraste", "declares",
- "declaremos", "declares",
- "decomposit", "decompose",
- "decoracion", "decoration",
- "decorativo", "decoration",
- "decoritive", "decorative",
- "decroative", "decorative",
- "decsending", "descending",
- "dedicacion", "dedication",
- "dedikation", "dedication",
- "deducatble", "deductible",
- "deducitble", "deductible",
- "defacation", "defamation",
- "defamating", "defamation",
- "defanitely", "definately",
- "defelction", "deflection",
- "defendeers", "defender",
- "defendents", "defendants",
- "defenderes", "defenders",
- "defenesman", "defenseman",
- "defenselss", "defenseless",
- "defensivly", "defensively",
- "defianetly", "definately",
- "defiantely", "definately",
- "defiantley", "definately",
- "defibately", "definately",
- "deficately", "definately",
- "deficiancy", "deficiency",
- "deficience", "deficiencies",
- "deficienct", "deficient",
- "deficienty", "deficiency",
- "defiintely", "definately",
- "definaetly", "definately",
- "definaitly", "definately",
- "definaltey", "definately",
- "definataly", "definately",
- "definateky", "definately",
- "definately", "definitely",
- "definatily", "definately",
- "defination", "definition",
- "definative", "definitive",
- "definatlly", "definately",
- "definatrly", "definately",
- "definayely", "definately",
- "defineatly", "definately",
- "definetaly", "definately",
- "definetely", "definitely",
- "definetily", "definately",
- "definetlly", "definetly",
- "definettly", "definately",
- "definicion", "definition",
- "definietly", "definitely",
- "definining", "defining",
- "definitaly", "definately",
- "definiteyl", "definitly",
- "definitivo", "definition",
- "definitley", "definitely",
- "definitlly", "definitly",
- "definitlry", "definitly",
- "definitlty", "definitly",
- "definjtely", "definately",
- "definltely", "definately",
- "definotely", "definately",
- "definstely", "definately",
- "defintaley", "definately",
- "defintiely", "definitely",
- "defintiion", "definitions",
- "definutely", "definately",
- "deflaction", "deflection",
- "defleciton", "deflection",
- "deflektion", "deflection",
- "defniately", "definately",
- "degenarate", "degenerate",
- "degenerare", "degenerate",
- "degenerite", "degenerate",
- "degoratory", "derogatory",
- "degraderad", "degraded",
- "dehydraded", "dehydrated",
- "dehyrdated", "dehydrated",
- "deifnately", "definately",
- "deisgnated", "designated",
- "delaership", "dealership",
- "delearship", "dealership",
- "delegaties", "delegate",
- "delegative", "delegate",
- "delfection", "deflection",
- "delibarate", "deliberate",
- "deliberant", "deliberate",
- "delibirate", "deliberate",
- "deligthful", "delightful",
- "deliverate", "deliberate",
- "deliverees", "deliveries",
- "deliviered", "delivered",
- "deliviring", "delivering",
- "delporable", "deplorable",
- "delpoyment", "deployment",
- "delutional", "delusional",
- "dementieva", "dementia",
- "deminsions", "dimensions",
- "democracis", "democracies",
- "democracts", "democrat",
- "democratas", "democrats",
- "democrates", "democrats",
- "demograhic", "demographic",
- "demographs", "demographics",
- "demograpic", "demographic",
- "demolation", "demolition",
- "demolicion", "demolition",
- "demolision", "demolition",
- "demolitian", "demolition",
- "demoliting", "demolition",
- "demoloshed", "demolished",
- "demolution", "demolition",
- "demonished", "demolished",
- "demonstate", "demonstrate",
- "demonstras", "demonstrates",
- "demorcracy", "democracy",
- "denegerate", "degenerate",
- "denominato", "denomination",
- "denomintor", "denominator",
- "deocrative", "decorative",
- "deomcratic", "democratic",
- "deparments", "departments",
- "departmens", "departments",
- "departmnet", "departments",
- "depcitions", "depictions",
- "depdending", "depending",
- "depencency", "dependency",
- "dependance", "dependence",
- "dependancy", "dependency",
- "dependandt", "dependant",
- "dependends", "depended",
- "dependened", "depended",
- "dependenta", "dependant",
- "dependente", "dependence",
- "depicitons", "depictions",
- "deplorabel", "deplorable",
- "deplorabil", "deplorable",
- "deplorible", "deplorable",
- "deplyoment", "deployment",
- "depolyment", "deployment",
- "depositers", "deposits",
- "depressief", "depressive",
- "depressies", "depressive",
- "deprivaton", "deprivation",
- "deragotory", "derogatory",
- "derivaties", "derivatives",
- "deriviated", "derived",
- "derivitave", "derivative",
- "derivitive", "derivative",
- "derogatary", "derogatory",
- "derogatery", "derogatory",
- "derogetory", "derogatory",
- "derogitory", "derogatory",
- "derogotary", "derogatory",
- "derogotory", "derogatory",
- "derviative", "derivative",
- "descendats", "descendants",
- "descendend", "descended",
- "descenting", "descending",
- "descerning", "descending",
- "descipable", "despicable",
- "descisions", "decisions",
- "descriibes", "describes",
- "descripton", "description",
- "desginated", "designated",
- "desigining", "designing",
- "desireable", "desirable",
- "desktopbsd", "desktops",
- "despciable", "despicable",
- "desperatly", "desperately",
- "desperetly", "desperately",
- "despicaple", "despicable",
- "despicible", "despicable",
- "dessicated", "desiccated",
- "destinatin", "destinations",
- "destinaton", "destination",
- "destoryers", "destroyers",
- "destorying", "destroying",
- "destroyeds", "destroyers",
- "destroyeer", "destroyers",
- "destrucion", "destruction",
- "destrucive", "destructive",
- "destryoing", "destroying",
- "detectarlo", "detector",
- "detectaron", "detector",
- "detectoare", "detector",
- "determinas", "determines",
- "determinig", "determining",
- "determinsm", "determinism",
- "deutschand", "deutschland",
- "devastaded", "devastated",
- "devastaing", "devastating",
- "devastanti", "devastating",
- "devasteted", "devastated",
- "develepors", "developers",
- "develoeprs", "developers",
- "developmet", "developments",
- "developors", "develops",
- "developped", "developed",
- "developres", "develops",
- "develpment", "development",
- "devestated", "devastated",
- "devolvendo", "devolved",
- "deyhdrated", "dehydrated",
- "diagnosied", "diagnose",
- "diagnosies", "diagnosis",
- "diagnositc", "diagnostic",
- "diagnossed", "diagnose",
- "diagnosted", "diagnose",
- "diagnotics", "diagnostic",
- "diagonstic", "diagnostic",
- "dichotomoy", "dichotomy",
- "dicitonary", "dictionary",
- "diconnects", "disconnects",
- "dicovering", "discovering",
- "dictateurs", "dictates",
- "dictionare", "dictionaries",
- "differance", "difference",
- "differenly", "differently",
- "differense", "differences",
- "differente", "difference",
- "differentl", "differential",
- "differenty", "differently",
- "differnece", "difference",
- "difficulte", "difficulties",
- "difficults", "difficulties",
- "difficutly", "difficulty",
- "diffuculty", "difficulty",
- "diganostic", "diagnostic",
- "dimensinal", "dimensional",
- "dimentions", "dimensions",
- "dimesnions", "dimensions",
- "dimineshes", "diminishes",
- "diminising", "diminishing",
- "dimunitive", "diminutive",
- "dinosaures", "dinosaurs",
- "dinosaurus", "dinosaurs",
- "dipections", "depictions",
- "diplimatic", "diplomatic",
- "diplomacia", "diplomatic",
- "diplomancy", "diplomacy",
- "dipolmatic", "diplomatic",
- "directinla", "directional",
- "directionl", "directional",
- "directivos", "directions",
- "directores", "directors",
- "directorys", "directors",
- "directsong", "directions",
- "disaapoint", "disappoint",
- "disagreeed", "disagreed",
- "disapeared", "disappeared",
- "disappeard", "disappeared",
- "disappered", "disappeared",
- "disappiont", "disappoint",
- "disaproval", "disapproval",
- "disastorus", "disastrous",
- "disastrosa", "disastrous",
- "disastrose", "disastrous",
- "disastrosi", "disastrous",
- "disastroso", "disastrous",
- "disaterous", "disastrous",
- "discalimer", "disclaimer",
- "discapline", "discipline",
- "discepline", "discipline",
- "disception", "discretion",
- "discharded", "discharged",
- "disciplers", "disciples",
- "disciplies", "disciplines",
- "disciplins", "disciplines",
- "disciprine", "discipline",
- "disclamier", "disclaimer",
- "discliamer", "disclaimer",
- "disclipine", "discipline",
- "disclousre", "disclosure",
- "disclsoure", "disclosure",
- "discograhy", "discography",
- "discograpy", "discography",
- "discolsure", "disclosure",
- "disconenct", "disconnect",
- "disconncet", "disconnects",
- "disconnets", "disconnects",
- "discontued", "discounted",
- "discoruage", "discourages",
- "discources", "discourse",
- "discourgae", "discourages",
- "discourges", "discourages",
- "discoveres", "discovers",
- "discoveryd", "discovered",
- "discoverys", "discovers",
- "discrecion", "discretion",
- "discreddit", "discredited",
- "discrepany", "discrepancy",
- "discresion", "discretion",
- "discreting", "discretion",
- "discribing", "describing",
- "discrimine", "discriminate",
- "discrouage", "discourages",
- "discrption", "discretion",
- "discusison", "discussions",
- "discusting", "discussing",
- "disgracful", "disgraceful",
- "disgrunted", "disgruntled",
- "disgruntld", "disgruntled",
- "disguisted", "disguise",
- "disgustiny", "disgustingly",
- "disgustosa", "disgusts",
- "disgustose", "disgusts",
- "disgustosi", "disgusts",
- "disgustoso", "disgusts",
- "dishcarged", "discharged",
- "dishinored", "dishonored",
- "disicpline", "discipline",
- "disiplined", "disciplined",
- "dislcaimer", "disclaimer",
- "dismanteld", "dismantled",
- "dismanting", "dismantling",
- "dismentled", "dismantled",
- "dispecable", "despicable",
- "dispencary", "dispensary",
- "dispencers", "dispenser",
- "dispencing", "dispensing",
- "dispensare", "dispenser",
- "dispensory", "dispensary",
- "dispesnary", "dispensary",
- "dispicable", "despicable",
- "displayfps", "displays",
- "dispositon", "disposition",
- "dispostion", "disposition",
- "disputerad", "disputed",
- "disrecpect", "disrespect",
- "disrection", "discretion",
- "disrepsect", "disrespect",
- "disresepct", "disrespect",
- "disrespekt", "disrespect",
- "disription", "disruption",
- "disrispect", "disrespect",
- "disrputing", "disrupting",
- "disruptivo", "disruption",
- "disruptron", "disruption",
- "dissapears", "disappears",
- "dissappear", "disappear",
- "disscusion", "discussion",
- "dissmisive", "dismissive",
- "dissodance", "dissonance",
- "dissonante", "dissonance",
- "dissonence", "dissonance",
- "distastful", "distasteful",
- "disticntly", "distinctly",
- "distiction", "distinction",
- "distincion", "distinction",
- "distincive", "distinctive",
- "distinclty", "distinctly",
- "distinctie", "distinctive",
- "distinctin", "distinctions",
- "distingish", "distinguish",
- "distingush", "distinguish",
- "distintcly", "distinctly",
- "distoriton", "distortion",
- "distorsion", "distortion",
- "distortian", "distortion",
- "distortron", "distortion",
- "distractes", "distracts",
- "distractia", "district",
- "distractin", "district",
- "distractiv", "district",
- "distration", "distortion",
- "distribuem", "distribute",
- "distribuer", "distribute",
- "distribuie", "distribute",
- "distribuit", "distribute",
- "distributs", "distributors",
- "distribuye", "distribute",
- "distrotion", "distortion",
- "distrubing", "disturbing",
- "distrubtes", "distrust",
- "distrubute", "distribute",
- "distubring", "disturbing",
- "disturbace", "disturbance",
- "disturping", "disrupting",
- "disucssing", "discussing",
- "disucssion", "discussion",
- "disurption", "disruption",
- "ditributed", "distributed",
- "diversifiy", "diversify",
- "dividendes", "dividends",
- "dividendos", "dividends",
- "divideneds", "dividend",
- "divinition", "divination",
- "divinitory", "divinity",
- "divisiones", "divisions",
- "dobulelift", "doublelift",
- "doccuments", "documents",
- "documentry", "documentary",
- "dogmatisch", "dogmatic",
- "dolphinese", "dolphins",
- "domianting", "dominating",
- "domimation", "domination",
- "dominacion", "domination",
- "dominaters", "dominates",
- "donwgraded", "downgraded",
- "donwloaded", "downloaded",
- "donwvoters", "downvoters",
- "donwvoting", "downvoting",
- "doomsdaily", "doomsday",
- "doubellift", "doublelift",
- "doubleiift", "doublelift",
- "doubleleft", "doublelift",
- "doublelfit", "doublelift",
- "doublerift", "doublelift",
- "doulbelift", "doublelift",
- "downgarded", "downgraded",
- "downgrated", "downgrade",
- "downlaoded", "downloaded",
- "downloadas", "downloads",
- "downloades", "downloads",
- "downovting", "downvoting",
- "downroaded", "downgraded",
- "downsiders", "downsides",
- "downstaris", "downstairs",
- "downstiars", "downstairs",
- "downtokers", "downvoters",
- "downtoking", "downvoting",
- "downtraded", "downgraded",
- "downviting", "downvoting",
- "downvotear", "downvoters",
- "downvoteas", "downvoters",
- "downvoteds", "downvoters",
- "downvotees", "downvoters",
- "downvotesd", "downvoters",
- "downvotess", "downvoters",
- "downvotest", "downvoters",
- "downvoteur", "downvoters",
- "downvoties", "downvoters",
- "downvotres", "downvoters",
- "downvotted", "downvote",
- "downvottes", "downvoters",
- "downwoters", "downvoters",
- "downwoting", "downvoting",
- "drasticaly", "drastically",
- "drasticlly", "drastically",
- "draughtman", "draughtsman",
- "dumbbellls", "dumbbells",
- "dumbfouded", "dumbfounded",
- "dumbfouned", "dumbfounded",
- "dungeoness", "dungeons",
- "dupilcates", "duplicates",
- "duplicants", "duplicates",
- "duplicatas", "duplicates",
- "duplicitas", "duplicates",
- "duplifaces", "duplicates",
- "durabiltiy", "durability",
- "dyamically", "dynamically",
- "dynamicaly", "dynamically",
- "dynamicdns", "dynamics",
- "dynamiclly", "dynamically",
- "dynamicpsf", "dynamics",
- "dynamitage", "dynamite",
- "dysfuncion", "dysfunction",
- "earhtbound", "earthbound",
- "earthqauke", "earthquake",
- "earthquack", "earthquake",
- "earthquaks", "earthquakes",
- "earthquate", "earthquake",
- "earthqukes", "earthquakes",
- "easthetics", "aesthetics",
- "ecoligical", "ecological",
- "ecomonical", "economical",
- "econimical", "economical",
- "econimists", "economists",
- "economicas", "economics",
- "economicos", "economics",
- "economicus", "economics",
- "economisch", "economic",
- "economisit", "economists",
- "effeciency", "efficiency",
- "effectivly", "effectively",
- "efficeincy", "efficiency",
- "efficently", "efficiently",
- "efficiancy", "efficiency",
- "efficienct", "efficient",
- "efficienty", "efficiently",
- "egotistcal", "egotistical",
- "ehtnically", "ethnically",
- "ejaculaion", "ejaculation",
- "ejaculatie", "ejaculate",
- "ejaculatin", "ejaculation",
- "ejaculaton", "ejaculation",
- "ejaculatte", "ejaculate",
- "electircal", "electrical",
- "electivite", "elective",
- "electoraat", "electorate",
- "electorale", "electorate",
- "electorite", "electorate",
- "electornic", "electronic",
- "electrican", "electrician",
- "electriciy", "electricity",
- "electricty", "electricity",
- "electrinic", "electrician",
- "electroate", "electorate",
- "electrodan", "electron",
- "electroinc", "electron",
- "electrolye", "electrolytes",
- "electroman", "electron",
- "electroncs", "electrons",
- "electrones", "electrons",
- "electronik", "election",
- "electronis", "electronics",
- "electronix", "election",
- "elemantary", "elementary",
- "elementery", "elementary",
- "elementray", "elementary",
- "eleminated", "eliminated",
- "elephantes", "elephants",
- "elephantis", "elephants",
- "elephantos", "elephants",
- "elephantus", "elephants",
- "eletricity", "electricity",
- "elimanates", "eliminates",
- "elimenates", "eliminates",
- "elimentary", "elementary",
- "elimimates", "eliminates",
- "eliminaste", "eliminates",
- "eliminatin", "elimination",
- "eliminaton", "elimination",
- "eliminster", "eliminates",
- "ellipitcal", "elliptical",
- "ellipsical", "elliptical",
- "ellipticle", "elliptical",
- "ellitpical", "elliptical",
- "ellpitical", "elliptical",
- "eloquantly", "eloquently",
- "eloquintly", "eloquently",
- "emapthetic", "empathetic",
- "embarassed", "embarrassed",
- "embarassig", "embarassing",
- "embarrased", "embarrassed",
- "embarrases", "embarrassed",
- "embezelled", "embezzled",
- "emblamatic", "emblematic",
- "embodyment", "embodiment",
- "emergenies", "emergencies",
- "emmigrated", "emigrated",
- "emminently", "eminently",
- "emmisaries", "emissaries",
- "emobdiment", "embodiment",
- "emotionaly", "emotionally",
- "empahsized", "emphasized",
- "empahsizes", "emphasizes",
- "empathatic", "empathetic",
- "emphacized", "emphasized",
- "emphatetic", "empathetic",
- "emphatised", "emphasized",
- "emphatized", "emphasized",
- "emphatizes", "emphasizes",
- "emphazised", "emphasized",
- "emphazises", "emphasizes",
- "emphesized", "emphasized",
- "emphesizes", "emphasizes",
- "emphisized", "emphasized",
- "emphisizes", "emphasizes",
- "empiricaly", "empirically",
- "employeers", "employees",
- "employeurs", "employer",
- "emprisoned", "imprisoned",
- "encahnting", "enchanting",
- "enchancing", "enchanting",
- "enchanging", "enchanting",
- "enchantent", "enchantment",
- "enchantmet", "enchantments",
- "encompases", "encompasses",
- "encounterd", "encountered",
- "encountred", "encountered",
- "encouraing", "encouraging",
- "encoutners", "encounters",
- "encription", "encryption",
- "encrpytion", "encryption",
- "encyrption", "encryption",
- "endlessley", "endlessly",
- "endolithes", "endoliths",
- "enforceing", "enforcing",
- "engagemnet", "engagements",
- "engagemnts", "engagements",
- "engieneers", "engineers",
- "enginereed", "engineered",
- "enivitable", "inevitable",
- "enlargment", "enlargement",
- "enlighment", "enlighten",
- "enlightend", "enlightened",
- "enlightned", "enlightened",
- "enrolement", "enrollment",
- "enrollemnt", "enrollment",
- "enterpirse", "enterprise",
- "enterprice", "enterprise",
- "enterpries", "enterprises",
- "enterprize", "enterprise",
- "enterprsie", "enterprises",
- "enterrpise", "enterprises",
- "entertaing", "entertaining",
- "enthically", "ethnically",
- "enthisiast", "enthusiast",
- "enthuiasts", "enthusiast",
- "enthuisast", "enthusiasts",
- "enthusiams", "enthusiasm",
- "enthusiant", "enthusiast",
- "enthusiats", "enthusiast",
- "enthusiest", "enthusiast",
- "enthusists", "enthusiasts",
- "envelopped", "envelope",
- "enveloppen", "envelope",
- "enveloppes", "envelope",
- "enviorment", "environment",
- "enviroment", "environment",
- "environmet", "environments",
- "equiavlent", "equivalents",
- "equilavent", "equivalent",
- "equilibium", "equilibrium",
- "equilibrim", "equilibrium",
- "equilibrum", "equilibrium",
- "equippment", "equipment",
- "equitorial", "equatorial",
- "equivalant", "equivalent",
- "equivalnce", "equivalence",
- "equivalnet", "equivalents",
- "equivelant", "equivalent",
- "equivelent", "equivalent",
- "equivilant", "equivalent",
- "equivilent", "equivalent",
- "equivlaent", "equivalents",
- "equivolent", "equivalent",
- "eratically", "erratically",
- "escalative", "escalate",
- "escavation", "escalation",
- "esitmation", "estimation",
- "esoterisch", "esoteric",
- "especailly", "especially",
- "espeically", "especially",
- "espressino", "espresso",
- "espression", "espresso",
- "essencials", "essentials",
- "essensials", "essentials",
- "essentails", "essentials",
- "essentialy", "essentially",
- "essentiels", "essentials",
- "essentuals", "essentials",
- "estabishes", "establishes",
- "estimacion", "estimation",
- "estimativo", "estimation",
- "estination", "estimation",
- "ethicallly", "ethically",
- "ethincally", "ethnically",
- "ethnicites", "ethnicities",
- "ethnicitiy", "ethnicity",
- "euphorical", "euphoria",
- "euphorisch", "euphoric",
- "euthanaisa", "euthanasia",
- "euthanazia", "euthanasia",
- "euthanesia", "euthanasia",
- "evaluacion", "evaluation",
- "evalutaion", "evaluation",
- "evaulating", "evaluating",
- "evaulation", "evaluation",
- "eventaully", "eventually",
- "eventially", "eventually",
- "everyoneis", "everyones",
- "exacberate", "exacerbated",
- "exagerated", "exaggerated",
- "exagerates", "exaggerates",
- "exagerrate", "exaggerate",
- "exaggarate", "exaggerate",
- "exaggurate", "exaggerate",
- "exahusting", "exhausting",
- "exahustion", "exhaustion",
- "examinated", "examined",
- "examinerad", "examined",
- "exapansion", "expansion",
- "exapnsions", "expansions",
- "exauhsting", "exhausting",
- "exauhstion", "exhaustion",
- "excecuting", "executing",
- "excecution", "execution",
- "exceedigly", "exceedingly",
- "exceedinly", "exceedingly",
- "excellance", "excellence",
- "excellenet", "excellence",
- "excellenze", "excellence",
- "excerising", "exercising",
- "excessivly", "excessively",
- "exchangees", "exchanges",
- "excitiment", "excitement",
- "exclsuives", "exclusives",
- "exclusivas", "exclusives",
- "exclusivly", "exclusively",
- "exclusivos", "exclusives",
- "exclusivty", "exclusivity",
- "exclussive", "exclusives",
- "exclusvies", "exclusives",
- "excpetions", "exceptions",
- "exculsives", "exclusives",
- "exculsivly", "exclusively",
- "execptions", "exceptions",
- "exectuable", "executable",
- "exectuions", "executions",
- "exectuives", "executives",
- "execusions", "executions",
- "executabil", "executable",
- "executible", "executable",
- "executiner", "executioner",
- "executings", "executions",
- "executivas", "executives",
- "exeedingly", "exceedingly",
- "exepmtions", "exemptions",
- "exeptional", "exceptional",
- "exercicing", "exercising",
- "exercizing", "exercising",
- "exersicing", "exercising",
- "exersising", "exercising",
- "exersizing", "exercising",
- "exerternal", "external",
- "exeuctions", "executions",
- "exhasuting", "exhausting",
- "exhasution", "exhaustion",
- "exhaustivo", "exhaustion",
- "exhibicion", "exhibition",
- "exhibitons", "exhibits",
- "exhuasting", "exhausting",
- "exhuastion", "exhaustion",
- "exibitions", "exhibitions",
- "exictement", "excitement",
- "exipration", "expiration",
- "existantes", "existent",
- "existenial", "existential",
- "existental", "existential",
- "exlcusives", "exclusives",
- "exorbatant", "exorbitant",
- "exorbatent", "exorbitant",
- "exorbidant", "exorbitant",
- "exorbirant", "exorbitant",
- "exorbitent", "exorbitant",
- "expalining", "explaining",
- "expanisons", "expansions",
- "expansivos", "expansions",
- "expanssion", "expansions",
- "expantions", "expansions",
- "expecially", "especially",
- "expectaion", "expectation",
- "expectansy", "expectancy",
- "expectency", "expectancy",
- "expections", "exceptions",
- "expedetion", "expedition",
- "expedicion", "expedition",
- "expeditivo", "expedition",
- "expeiments", "experiments",
- "expemtions", "exemptions",
- "expendeble", "expendable",
- "expendible", "expendable",
- "expensable", "expendable",
- "expentancy", "expectancy",
- "expereince", "experience",
- "experement", "experiment",
- "experiance", "experience",
- "experieced", "experienced",
- "experieces", "experiences",
- "experiemnt", "experiment",
- "experiened", "experienced",
- "experiense", "experiences",
- "expermient", "experiments",
- "experssion", "expression",
- "expextancy", "expectancy",
- "expidetion", "expedition",
- "expierence", "experience",
- "expination", "expiration",
- "expirement", "experiment",
- "explanatin", "explanations",
- "explicatia", "explicit",
- "explicatie", "explicit",
- "explicatif", "explicit",
- "explicatii", "explicit",
- "explicetly", "explicitly",
- "explicilty", "explicitly",
- "explioting", "exploiting",
- "exploiding", "exploiting",
- "exploition", "exploiting",
- "explorarea", "explorer",
- "exploreres", "explorers",
- "explosivas", "explosives",
- "explossion", "explosions",
- "explossive", "explosives",
- "explosvies", "explosives",
- "explotions", "explosions",
- "explusions", "explosions",
- "expodition", "exposition",
- "expoliting", "exploiting",
- "expolsions", "explosions",
- "expolsives", "explosives",
- "exponental", "exponential",
- "exposicion", "exposition",
- "expositivo", "exposition",
- "expotition", "exposition",
- "exprensive", "expressive",
- "expresions", "expression",
- "expresison", "expressions",
- "expressens", "expresses",
- "expressief", "expressive",
- "expressley", "expressly",
- "expriation", "expiration",
- "extensivly", "extensively",
- "extentions", "extensions",
- "exterioara", "exterior",
- "exterioare", "exterior",
- "extermally", "externally",
- "extermists", "extremists",
- "extraccion", "extraction",
- "extractivo", "extraction",
- "extractnow", "extraction",
- "extradtion", "extraction",
- "extremaste", "extremes",
- "extremeley", "extremely",
- "extremelly", "extremely",
- "extrememly", "extremely",
- "extremests", "extremists",
- "extremised", "extremes",
- "extremisim", "extremism",
- "extremisme", "extremes",
- "extremiste", "extremes",
- "extrenally", "externally",
- "extrimists", "extremists",
- "eyeballers", "eyeballs",
- "fabriacted", "fabricated",
- "fabricatie", "fabricated",
- "faciliated", "facilitated",
- "facilitait", "facilitate",
- "facilitant", "facilitate",
- "facilitare", "facilitate",
- "facisnated", "fascinated",
- "facitilies", "facilities",
- "facsinated", "fascinated",
- "fahernheit", "fahrenheit",
- "fahrenhiet", "fahrenheit",
- "fallatious", "fallacious",
- "fallicious", "fallacious",
- "falshbacks", "flashbacks",
- "familiarty", "familiarity",
- "familiarze", "familiarize",
- "fanaticals", "fanatics",
- "fanfaction", "fanfiction",
- "fanfcition", "fanfiction",
- "fanficiton", "fanfiction",
- "fanserivce", "fanservice",
- "fanservise", "fanservice",
- "fanservive", "fanservice",
- "fantasiose", "fantasies",
- "farehnheit", "fahrenheit",
- "farhenheit", "fahrenheit",
- "fascianted", "fascinated",
- "fascinatie", "fascinated",
- "fascinatin", "fascination",
- "fascistisk", "fascists",
- "fatalaties", "fatalities",
- "favoruites", "favourites",
- "favourates", "favourites",
- "favouritsm", "favourites",
- "favourties", "favourites",
- "federacion", "federation",
- "federativo", "federation",
- "fellowhsip", "fellowship",
- "fellowshop", "fellowship",
- "feminimity", "femininity",
- "feministas", "feminists",
- "feminitity", "femininity",
- "fermentato", "fermentation",
- "fertalizer", "fertilizer",
- "fertelizer", "fertilizer",
- "fertilizar", "fertilizer",
- "fertilzier", "fertilizer",
- "fertiziler", "fertilizer",
- "festivales", "festivals",
- "fetishiste", "fetishes",
- "ficticious", "fictitious",
- "filessytem", "filesystem",
- "filesytems", "filesystem",
- "filmamkers", "filmmakers",
- "filmmakare", "filmmakers",
- "finallizes", "finalizes",
- "financialy", "financially",
- "fingernals", "fingernails",
- "fingerpies", "fingertips",
- "fingerpint", "fingerprint",
- "fingertaps", "fingertips",
- "fingertits", "fingertips",
- "fingertops", "fingertips",
- "fireballls", "fireballs",
- "firefigher", "firefighter",
- "firefigter", "firefighter",
- "firendlies", "friendlies",
- "firghtened", "frightened",
- "fisionable", "fissionable",
- "flashligth", "flashlight",
- "flaskbacks", "flashbacks",
- "flawleslly", "flawlessly",
- "flexibiliy", "flexibility",
- "flexibilty", "flexibility",
- "flimmakers", "filmmakers",
- "fluctuatie", "fluctuate",
- "fluctuatin", "fluctuations",
- "flutterhsy", "fluttershy",
- "fluttersky", "fluttershy",
- "flutterspy", "fluttershy",
- "forcifully", "forcefully",
- "forecfully", "forcefully",
- "foreginers", "foreigners",
- "foregorund", "foreground",
- "foreignese", "foreigners",
- "foreigness", "foreigners",
- "foreignors", "foreigners",
- "foreingers", "foreigners",
- "forensisch", "forensic",
- "foreseeble", "foreseeable",
- "forgeiners", "foreigners",
- "forgieners", "foreigners",
- "forgivance", "forgiven",
- "forgivenss", "forgiveness",
- "forgotting", "forgetting",
- "foriegners", "foreigners",
- "formadible", "formidable",
- "formalhaut", "fomalhaut",
- "formallity", "formally",
- "formallize", "formalize",
- "formatiing", "formatting",
- "formatings", "formations",
- "formativos", "formations",
- "formidabel", "formidable",
- "formidabil", "formidable",
- "formidible", "formidable",
- "forminable", "formidable",
- "formitable", "formidable",
- "formuladas", "formulas",
- "formulados", "formulas",
- "forseeable", "foreseeable",
- "fortelling", "foretelling",
- "fortunatly", "fortunately",
- "fortunetly", "fortunately",
- "foundaiton", "foundations",
- "foundaries", "foundries",
- "foundatoin", "foundations",
- "fractalers", "fractals",
- "fractalius", "fractals",
- "fractalpus", "fractals",
- "fracturare", "fracture",
- "fragmanted", "fragment",
- "francaises", "franchises",
- "franchices", "franchises",
- "franchines", "franchises",
- "franchizes", "franchises",
- "franchsies", "franchises",
- "fransiscan", "franciscan",
- "franticaly", "frantically",
- "franticlly", "frantically",
- "fraternaty", "fraternity",
- "fraternety", "fraternity",
- "fraterntiy", "fraternity",
- "fraturnity", "fraternity",
- "fraudalent", "fraudulent",
- "fraudelant", "fraudulent",
- "fraudelent", "fraudulent",
- "fraudolent", "fraudulent",
- "fraudulant", "fraudulent",
- "freedomers", "freedoms",
- "freedomest", "freedoms",
- "freindlies", "friendlies",
- "freindship", "friendship",
- "frequencey", "frequency",
- "friednship", "friendships",
- "friednzone", "friendzoned",
- "friendhsip", "friendship",
- "friendsies", "friendlies",
- "friendzies", "friendlies",
- "friendzond", "friendzoned",
- "frientship", "friendship",
- "frigthened", "frightened",
- "fromatting", "formatting",
- "fromidable", "formidable",
- "frontlinie", "frontline",
- "fruadulent", "fraudulent",
- "frustraded", "frustrated",
- "frustradet", "frustrates",
- "frustraits", "frustrates",
- "frustrants", "frustrates",
- "frustratin", "frustration",
- "frustrsted", "frustrates",
- "fucntional", "functional",
- "fulfulling", "fulfilling",
- "fullfiling", "fulfilling",
- "fullfilled", "fulfilled",
- "fullscrean", "fullscreen",
- "fulttershy", "fluttershy",
- "funcitonal", "functional",
- "fundametal", "fundamental",
- "furstrated", "frustrated",
- "furstrates", "frustrates",
- "furutistic", "futuristic",
- "futhermore", "furthermore",
- "futurestic", "futuristic",
- "futurisitc", "futuristic",
- "futurustic", "futuristic",
- "galvinized", "galvanized",
- "garuanteed", "guaranteed",
- "garuantees", "guarantees",
- "gauntanamo", "guantanamo",
- "gauntlents", "gauntlet",
- "gauranteed", "guaranteed",
- "gaurantees", "guarantees",
- "gaurenteed", "guaranteed",
- "gaurentees", "guarantees",
- "generalice", "generalize",
- "generalife", "generalize",
- "generalnie", "generalize",
- "generaters", "generates",
- "generaties", "generate",
- "generatios", "generators",
- "generatons", "generators",
- "generatore", "generate",
- "generelize", "generalize",
- "generocity", "generosity",
- "generoisty", "generosity",
- "generostiy", "generosity",
- "geneticaly", "genetically",
- "geneticlly", "genetically",
- "genitalias", "genitals",
- "genuinelly", "genuinely",
- "geographia", "geographical",
- "geogrpahic", "geographic",
- "germanisch", "germanic",
- "gigantisch", "gigantic",
- "gimmickers", "gimmicks",
- "girlfirend", "girlfriend",
- "girlfreind", "girlfriend",
- "girlfriens", "girlfriends",
- "girlfrinds", "girlfriends",
- "girlfrined", "girlfriends",
- "goalkeaper", "goalkeeper",
- "goalkeeprs", "goalkeeper",
- "goalkepeer", "goalkeeper",
- "goegraphic", "geographic",
- "golakeeper", "goalkeeper",
- "goldburger", "goldberg",
- "goosebumbs", "goosebumps",
- "goosegumps", "goosebumps",
- "goosepumps", "goosebumps",
- "gothenberg", "gothenburg",
- "govenrment", "government",
- "govermenet", "goverment",
- "govermnent", "governments",
- "governemnt", "government",
- "governened", "governed",
- "governered", "governed",
- "governmant", "governmental",
- "governmetn", "governments",
- "governmnet", "government",
- "govnerment", "government",
- "govornment", "government",
- "gradiating", "graduating",
- "gradiation", "graduation",
- "graduacion", "graduation",
- "grapefriut", "grapefruit",
- "grapefrukt", "grapefruit",
- "graphicaly", "graphically",
- "graphiclly", "graphically",
- "gratituous", "gratuitous",
- "gratiutous", "gratuitous",
- "gratuidous", "gratuitous",
- "gratuituos", "gratuitous",
- "gratutious", "gratuitous",
- "graudating", "graduating",
- "graudation", "graduation",
- "gravitatie", "gravitate",
- "greatfully", "gratefully",
- "greenhosue", "greenhouse",
- "greviances", "grievances",
- "grievences", "grievances",
- "grilfriend", "girlfriend",
- "guaduloupe", "guadalupe",
- "guanatanmo", "guantanamo",
- "guantamamo", "guantanamo",
- "guantamano", "guantanamo",
- "guantanano", "guantanamo",
- "guantanemo", "guantanamo",
- "guantanoma", "guantanamo",
- "guantanomo", "guantanamo",
- "guantonamo", "guantanamo",
- "guarantess", "guarantees",
- "guardiands", "guardians",
- "guardianes", "guardians",
- "guardianis", "guardians",
- "guarenteed", "guaranteed",
- "guarentees", "guarantees",
- "guarnateed", "guaranteed",
- "guarnatees", "guarantees",
- "guarunteed", "guaranteed",
- "guaruntees", "guarantees",
- "guatamalan", "guatemalan",
- "gunatanamo", "guantanamo",
- "gunlsinger", "gunslinger",
- "gunsiinger", "gunslinger",
- "gunslanger", "gunslinger",
- "gunsligner", "gunslinger",
- "gunstinger", "gunslinger",
- "gymanstics", "gymnastics",
- "gymnasitcs", "gymnastics",
- "gynmastics", "gymnastics",
- "haemorrage", "haemorrhage",
- "halloweeen", "halloween",
- "hambergers", "hamburgers",
- "hamburgare", "hamburger",
- "hamburgesa", "hamburgers",
- "hamburgles", "hamburgers",
- "hamburgurs", "hamburgers",
- "handcuffes", "handcuffs",
- "handelbars", "handlebars",
- "handicaped", "handicapped",
- "handwritng", "handwriting",
- "harasments", "harassments",
- "hardlinked", "hardline",
- "harmoniacs", "harmonic",
- "harmonisch", "harmonic",
- "harrasment", "harassment",
- "harrassing", "harassing",
- "harvasting", "harvesting",
- "haversting", "harvesting",
- "headhpones", "headphones",
- "headphoens", "headphones",
- "headquarer", "headquarter",
- "headquater", "headquarter",
- "headshoots", "headshot",
- "healtchare", "healthcare",
- "healtheast", "healthiest",
- "healthyest", "healthiest",
- "heapdhones", "headphones",
- "heartbeart", "heartbeat",
- "heartbeast", "heartbeat",
- "heartborne", "heartbroken",
- "heartbrake", "heartbreak",
- "hearthsone", "hearthstone",
- "heatlhcare", "healthcare",
- "heavyweght", "heavyweight",
- "heavyweigt", "heavyweight",
- "hedgehodge", "hedgehog",
- "heidelburg", "heidelberg",
- "heigthened", "heightened",
- "heistation", "hesitation",
- "helathcare", "healthcare",
- "helicopers", "helicopters",
- "helicoptor", "helicopter",
- "helicotper", "helicopters",
- "helicpoter", "helicopter",
- "helictoper", "helicopters",
- "helikopter", "helicopter",
- "hemingwary", "hemingway",
- "hemingwavy", "hemingway",
- "hemipshere", "hemisphere",
- "hemishpere", "hemisphere",
- "hemmorhage", "hemorrhage",
- "hempishere", "hemisphere",
- "herculeans", "hercules",
- "herculeasy", "hercules",
- "herculeees", "hercules",
- "hesitstion", "hesitation",
- "hestiation", "hesitation",
- "hieghtened", "heightened",
- "hierachies", "hierarchies",
- "hieroglphs", "hieroglyphs",
- "highalnder", "highlander",
- "highlighed", "highlighted",
- "highligted", "highlighted",
- "highloader", "highlander",
- "highpander", "highlander",
- "highscholl", "highschool",
- "highshcool", "highschool",
- "hillarious", "hilarious",
- "hinderance", "hindrance",
- "hinderence", "hindrance",
- "hipsterest", "hipsters",
- "hispanicos", "hispanics",
- "hispanicus", "hispanics",
- "histarical", "historical",
- "histerical", "historical",
- "historiaan", "historians",
- "historicas", "historians",
- "historicly", "historical",
- "historiens", "histories",
- "historisch", "historic",
- "hoemopathy", "homeopathy",
- "hollywoood", "hollywood",
- "homecuming", "homecoming",
- "homeoapthy", "homeopathy",
- "homeonwers", "homeowners",
- "homeopahty", "homeopathy",
- "homeophaty", "homeopathy",
- "homeopothy", "homeopathy",
- "homeothapy", "homeopathy",
- "homepoathy", "homeopathy",
- "homewoners", "homeowners",
- "homoepathy", "homeopathy",
- "homogeneos", "homogeneous",
- "homogeneus", "homogeneous",
- "homophibia", "homophobia",
- "homophibic", "homophobic",
- "homophobie", "homophobe",
- "homophonia", "homophobia",
- "homophopia", "homophobia",
- "homophopic", "homophobic",
- "homosexaul", "homosexual",
- "homosexuel", "homosexual",
- "honeymooon", "honeymoon",
- "hopefullly", "hopefully",
- "hopeleslly", "hopelessly",
- "horisontal", "horizontal",
- "horizantal", "horizontal",
- "horizontes", "horizons",
- "horiztonal", "horizontal",
- "horrendeus", "horrendous",
- "horriblely", "horribly",
- "hospitales", "hospitals",
- "hospitalty", "hospitality",
- "hospitible", "hospitable",
- "hsitorians", "historians",
- "humanaties", "humanities",
- "humanitary", "humanity",
- "humiliatin", "humiliation",
- "humiliaton", "humiliation",
- "humilitied", "humiliated",
- "humillated", "humiliated",
- "hurricance", "hurricane",
- "hurriganes", "hurricanes",
- "hurrikanes", "hurricanes",
- "hurrycanes", "hurricanes",
- "hydropilic", "hydrophilic",
- "hydropobic", "hydrophobic",
- "hyperbolie", "hyperbole",
- "hyperlobic", "hyperbolic",
- "hyperlogic", "hyperbolic",
- "hypertrohy", "hypertrophy",
- "hypertropy", "hypertrophy",
- "hyphotesis", "hypothesis",
- "hypocrates", "hypocrites",
- "hypocriscy", "hypocrisy",
- "hypocrises", "hypocrites",
- "hypocritus", "hypocrites",
- "hypocrties", "hypocrites",
- "hypocrytes", "hypocrites",
- "hypokrites", "hypocrites",
- "hypothecis", "hypothesis",
- "hypotheiss", "hypotheses",
- "hypothesus", "hypotheses",
- "hypothises", "hypotheses",
- "hypothisis", "hypothesis",
- "hypothosis", "hypothesis",
- "hyprocites", "hypocrites",
- "hystarical", "hysterical",
- "hystericly", "hysterical",
- "hysteriska", "hysteria",
- "ibuprofein", "ibuprofen",
- "ibuprofine", "ibuprofen",
- "icelandinc", "icelandic",
- "idealisitc", "idealistic",
- "idealogies", "ideologies",
- "identicial", "identical",
- "identifyed", "identified",
- "identitets", "identities",
- "ideolagies", "ideologies",
- "ideoligies", "ideologies",
- "ideologias", "ideologies",
- "ideologice", "ideologies",
- "ideologije", "ideologies",
- "ideologins", "ideologies",
- "ideologisk", "ideologies",
- "ideolouges", "ideologies",
- "illegalest", "illegals",
- "illegallly", "illegally",
- "illegimacy", "illegitimacy",
- "illegitime", "illegitimate",
- "illegitimt", "illegitimate",
- "illimunati", "illuminati",
- "illinoians", "illinois",
- "illistrate", "illiterate",
- "illitarate", "illiterate",
- "illitirate", "illiterate",
- "illumanati", "illuminati",
- "illumaniti", "illuminati",
- "illumianti", "illuminati",
- "illumimati", "illuminati",
- "illuminaci", "illuminati",
- "illuminadi", "illuminati",
- "illuminami", "illuminati",
- "illuminazi", "illuminati",
- "illuminite", "illuminati",
- "illuminiti", "illuminati",
- "illuminoti", "illuminati",
- "illuminuti", "illuminati",
- "illumniati", "illuminati",
- "illumunati", "illuminati",
- "illuninati", "illuminati",
- "illusiones", "illusions",
- "illustrant", "illustrate",
- "illustrare", "illustrate",
- "illustrato", "illustration",
- "imablanced", "imbalanced",
- "imablances", "imbalances",
- "imaginatie", "imaginative",
- "imaginaton", "imagination",
- "imaginitve", "imaginative",
- "imbalenced", "imbalanced",
- "imbalences", "imbalances",
- "imcomplete", "incomplete",
- "imediately", "immediately",
- "imigration", "emigration",
- "immaturaty", "immaturity",
- "immaturety", "immaturity",
- "immedeatly", "immediately",
- "immediatly", "immediately",
- "immedietly", "immediately",
- "immenseley", "immensely",
- "immidately", "immediately",
- "immigranti", "immigration",
- "immigrents", "immigrants",
- "immitating", "imitating",
- "immobilien", "immobile",
- "immobilier", "immobile",
- "immobilzed", "immobile",
- "immobilzer", "immobile",
- "immobilzes", "immobile",
- "immortales", "immortals",
- "immortalis", "immortals",
- "immortaliy", "immortality",
- "immortalls", "immortals",
- "immortalty", "immortality",
- "impartirla", "impartial",
- "impecabbly", "impeccably",
- "impeccible", "impeccable",
- "impeckable", "impeccable",
- "impelments", "implements",
- "imperetive", "imperative",
- "imperialsm", "imperialism",
- "imperialst", "imperialist",
- "imperitave", "imperative",
- "imperitive", "imperative",
- "implaments", "implements",
- "implantase", "implants",
- "implausble", "implausible",
- "implausibe", "implausible",
- "implemenet", "implements",
- "implicatia", "implicit",
- "implicatie", "implicit",
- "implicatii", "implicit",
- "implicetly", "implicitly",
- "impliciete", "implicit",
- "implicilty", "implicitly",
- "impliments", "implements",
- "imporbable", "improbable",
- "importanly", "importantly",
- "importanty", "importantly",
- "importence", "importance",
- "importerad", "imported",
- "imporvised", "improvised",
- "impossable", "impossible",
- "impossbily", "impossibly",
- "impossibal", "impossibly",
- "impossibel", "impossibly",
- "impossibry", "impossibly",
- "impossibul", "impossibly",
- "impractial", "impractical",
- "impreative", "imperative",
- "impresison", "impressions",
- "impressoin", "impressions",
- "impressons", "impressions",
- "improbabil", "improbable",
- "improbible", "improbable",
- "impropable", "improbable",
- "improsined", "imprisoned",
- "improsoned", "imprisoned",
- "improvemnt", "improvement",
- "improvents", "improves",
- "improvized", "improvised",
- "imprsioned", "imprisoned",
- "impulsemos", "impulses",
- "imrpovised", "improvised",
- "inablility", "inability",
- "inaccruate", "inaccurate",
- "inadaquate", "inadequate",
- "inadaquete", "inadequate",
- "inadecuate", "inadequate",
- "inadeguate", "inadequate",
- "inadeqaute", "inadequate",
- "inadequete", "inadequate",
- "inadequite", "inadequate",
- "inadiquate", "inadequate",
- "inagurated", "inaugurated",
- "inbalanced", "imbalanced",
- "inbetweeen", "inbetween",
- "incarnaton", "incarnation",
- "incentivos", "incentives",
- "inchoerent", "incoherent",
- "incidentes", "incidents",
- "incidently", "incidentally",
- "incidentul", "incidental",
- "inclreased", "increased",
- "incognitio", "incognito",
- "incoherant", "incoherent",
- "incohorent", "incoherent",
- "incorectly", "incorrectly",
- "incorrecly", "incorrectly",
- "incorrecty", "incorrectly",
- "incorretly", "incorrectly",
- "incraments", "increments",
- "incredable", "incredible",
- "incredably", "incredibly",
- "incremetal", "incremental",
- "incriments", "increments",
- "inctroduce", "introduce",
- "indefenite", "indefinite",
- "indefinate", "indefinite",
- "indefinete", "indefinite",
- "indefinity", "indefinitely",
- "indeginous", "indigenous",
- "indentical", "identical",
- "independet", "independent",
- "indepenent", "independent",
- "inderictly", "indirectly",
- "indicaters", "indicates",
- "indicativo", "indication",
- "indicatore", "indicate",
- "indicitave", "indicative",
- "indicitive", "indicative",
- "indiffernt", "indifferent",
- "indigenius", "indigenous",
- "indiginous", "indigenous",
- "indigneous", "indigenous",
- "indikation", "indication",
- "indireclty", "indirectly",
- "indirektly", "indirectly",
- "individuel", "individual",
- "indiviudal", "individuals",
- "indivudual", "individual",
- "indoensian", "indonesian",
- "indonasian", "indonesian",
- "indoneisan", "indonesian",
- "indonesean", "indonesian",
- "indonesien", "indonesian",
- "indonesion", "indonesian",
- "indonisian", "indonesian",
- "indonistan", "indonesian",
- "indpendent", "independent",
- "industiral", "industrial",
- "industires", "industries",
- "industrail", "industrial",
- "industrees", "industries",
- "industrias", "industries",
- "industriel", "industrial",
- "industrija", "industrial",
- "industrije", "industries",
- "indviduals", "individuals",
- "inefficent", "inefficient",
- "ineqaulity", "inequality",
- "inequailty", "inequality",
- "inevatible", "inevitable",
- "inevetable", "inevitable",
- "inevetably", "inevitably",
- "inevetible", "inevitable",
- "inevidable", "inevitable",
- "inevidably", "inevitably",
- "inevitible", "inevitable",
- "inevitibly", "inevitably",
- "inevtiable", "inevitable",
- "inevtiably", "inevitably",
- "infallable", "infallible",
- "infaltable", "inflatable",
- "infeccious", "infectious",
- "infecteous", "infectious",
- "infectuous", "infectious",
- "infedility", "infidelity",
- "infektious", "infectious",
- "inferioara", "inferior",
- "inferioare", "inferior",
- "inferiorty", "inferiority",
- "inferrence", "inference",
- "infestaion", "infestation",
- "infestaton", "infestation",
- "infestions", "infections",
- "infideltiy", "infidelity",
- "infidility", "infidelity",
- "infiltrade", "infiltrate",
- "infiltrait", "infiltrate",
- "infiltrare", "infiltrate",
- "infiltrase", "infiltrate",
- "infinately", "infinitely",
- "infinetely", "infinitely",
- "infiniment", "infinite",
- "infinitley", "infinitely",
- "infintiely", "infinitely",
- "inflamable", "inflatable",
- "inflateble", "inflatable",
- "inflatible", "inflatable",
- "infleunced", "influenced",
- "inflitrate", "infiltrate",
- "influanced", "influenced",
- "influances", "influences",
- "influencie", "influences",
- "influening", "influencing",
- "influensed", "influences",
- "influenser", "influences",
- "influenses", "influences",
- "influental", "influential",
- "influented", "influenced",
- "influentes", "influences",
- "influneced", "influenced",
- "infograhic", "infographic",
- "infograpic", "infographic",
- "infomation", "information",
- "informable", "informal",
- "informarla", "informal",
- "informarle", "informal",
- "informarlo", "informal",
- "informatie", "informative",
- "informella", "informal",
- "informerad", "informed",
- "informtion", "information",
- "infridging", "infringing",
- "infrigning", "infringing",
- "infulenced", "influenced",
- "infulences", "influences",
- "ingenuitiy", "ingenuity",
- "ingrediant", "ingredient",
- "ingrediens", "ingredients",
- "ingrediets", "ingredient",
- "inhabitans", "inhabitants",
- "inhabitats", "inhabitants",
- "inherantly", "inherently",
- "inherintly", "inherently",
- "inheritage", "heritage",
- "inhernetly", "inherently",
- "inifnitely", "infinitely",
- "initaition", "initiation",
- "initalised", "initialised",
- "initaliser", "initialiser",
- "initalises", "initialises",
- "initalisms", "initialisms",
- "initalized", "initialized",
- "initalizer", "initializer",
- "initalizes", "initializes",
- "initalling", "initialling",
- "initalness", "initialness",
- "initiaitve", "initiatives",
- "initiaties", "initiatives",
- "initiativs", "initiatives",
- "initiatves", "initiatives",
- "initiavite", "initiatives",
- "inititaive", "initiatives",
- "inititiave", "initiatives",
- "initmately", "intimately",
- "initmidate", "intimidate",
- "inituition", "initiation",
- "injustaces", "injustices",
- "injusticas", "injustices",
- "inmigrants", "immigrants",
- "innoavtion", "innovations",
- "innocentes", "innocents",
- "innotation", "innovation",
- "innovacion", "innovation",
- "innovaiton", "innovations",
- "innovatief", "innovate",
- "innovaties", "innovate",
- "innovativo", "innovation",
- "innvoation", "innovation",
- "inofficial", "unofficial",
- "inpsection", "inspection",
- "inquisator", "inquisitor",
- "inquisidor", "inquisitor",
- "inquisiter", "inquisitor",
- "inquisitio", "inquisitor",
- "inquisitir", "inquisitor",
- "inquisiton", "inquisition",
- "inquistior", "inquisitor",
- "inquizitor", "inquisitor",
- "inqusitior", "inquisitor",
- "insensitve", "insensitive",
- "insepction", "inspection",
- "insistance", "insistence",
- "insistente", "insistence",
- "insistenze", "insistence",
- "insistince", "insistence",
- "insitution", "institution",
- "inspeccion", "inspection",
- "inspeciton", "inspections",
- "inspectons", "inspections",
- "inspectres", "inspectors",
- "inspektion", "inspection",
- "inspektors", "inspectors",
- "inspiraste", "inspires",
- "inspiraton", "inspiration",
- "inspirerad", "inspired",
- "inspireras", "inspires",
- "insrugency", "insurgency",
- "instabiliy", "instability",
- "instabilty", "instability",
- "installeer", "installer",
- "installent", "installment",
- "installesd", "installs",
- "installion", "installing",
- "instatance", "instance",
- "instelling", "installing",
- "instituded", "instituted",
- "instituion", "institution",
- "institutie", "institute",
- "institutue", "instituted",
- "instrament", "instrument",
- "instrcutor", "instructors",
- "instrucion", "instruction",
- "instructer", "instructor",
- "instructie", "instructed",
- "instruktor", "instructor",
- "instuction", "instruction",
- "instuments", "instruments",
- "insturcted", "instructed",
- "insturctor", "instructor",
- "insturment", "instrument",
- "instutions", "intuitions",
- "instututed", "instituted",
- "insurgance", "insurgency",
- "insurgancy", "insurgency",
- "intangable", "intangible",
- "intangeble", "intangible",
- "intangibil", "intangible",
- "intanjible", "intangible",
- "integraded", "integrated",
- "integrarla", "integral",
- "integrarlo", "integral",
- "integratie", "integrated",
- "integreres", "interferes",
- "integreted", "integrated",
- "inteligent", "intelligent",
- "intenseley", "intensely",
- "intensitiy", "intensity",
- "intentinal", "intentional",
- "intentines", "intestines",
- "interacive", "interactive",
- "interactes", "interacts",
- "interactie", "interactive",
- "interactue", "interacted",
- "interasted", "interacted",
- "interbread", "interbreed",
- "intercepto", "interception",
- "intercorse", "intercourse",
- "intercouse", "intercourse",
- "intereacts", "interfaces",
- "interected", "interacted",
- "interefers", "interferes",
- "interesant", "interest",
- "interesing", "interesting",
- "interestes", "interests",
- "interfacce", "interfaces",
- "interfears", "interferes",
- "interfeers", "interferes",
- "interferce", "interferes",
- "interferre", "interfere",
- "intergated", "integrated",
- "interioara", "interior",
- "interioare", "interior",
- "intermedie", "intermediate",
- "internetbs", "internets",
- "internetes", "internets",
- "internetis", "internets",
- "internetts", "internets",
- "internetus", "internets",
- "interprate", "interpret",
- "interrugum", "interregnum",
- "interruped", "interrupted",
- "interstela", "interstellar",
- "intervalls", "intervals",
- "intervalos", "intervals",
- "interveign", "intervening",
- "interveing", "intervening",
- "interveiws", "interviews",
- "intervento", "intervention",
- "intervenue", "intervene",
- "interveres", "interferes",
- "intervieni", "interviewing",
- "intervieuw", "interviews",
- "interviewd", "interviewed",
- "interviewr", "interviewer",
- "intervines", "intervenes",
- "interviwed", "interviewed",
- "interviwer", "interviewer",
- "interwebbs", "interwebs",
- "intestents", "intestines",
- "intestinas", "intestines",
- "intestinos", "intestines",
- "intestions", "intestines",
- "intidimate", "intimidate",
- "intimadate", "intimidate",
- "intimatley", "intimately",
- "intimiated", "intimidate",
- "intimidade", "intimidated",
- "intimidant", "intimidate",
- "intimidare", "intimidate",
- "intimitade", "intimidated",
- "intimitaly", "intimately",
- "intimitate", "intimidate",
- "intimitely", "intimately",
- "intolarant", "intolerant",
- "intolerace", "intolerance",
- "intolerate", "intolerant",
- "intolerent", "intolerant",
- "intolorant", "intolerant",
- "intolorent", "intolerant",
- "intorduced", "introduced",
- "intorduces", "introduces",
- "intorverts", "introverts",
- "intoxicted", "intoxicated",
- "intraverts", "introverts",
- "intreguing", "intriguing",
- "intricaces", "intricacies",
- "intriguied", "intrigue",
- "intrigured", "intrigue",
- "intrinseci", "intrinsic",
- "intrinsinc", "intrinsic",
- "intriquing", "intriguing",
- "intriuging", "intriguing",
- "introdecks", "introduces",
- "introdused", "introduces",
- "introvents", "introverts",
- "introvered", "introverted",
- "introversa", "introverts",
- "introverse", "introverts",
- "introversi", "introverts",
- "introverso", "introverts",
- "introversy", "introverts",
- "introveted", "introverted",
- "intruduced", "introduced",
- "intruduces", "introduces",
- "intruiging", "intriguing",
- "intruments", "instruments",
- "intuitevly", "intuitively",
- "intuitivly", "intuitively",
- "intuitivno", "intuition",
- "intutively", "intuitively",
- "inumerable", "enumerable",
- "inusrgency", "insurgency",
- "invaderats", "invaders",
- "invaildate", "invalidates",
- "invairably", "invariably",
- "invaldiate", "invalidates",
- "invalidade", "invalidate",
- "invalidare", "invalidate",
- "invalubale", "invaluable",
- "invalueble", "invaluable",
- "invaraibly", "invariably",
- "invariabil", "invariably",
- "invaribaly", "invariably",
- "invaulable", "invaluable",
- "inveitable", "inevitable",
- "inveitably", "inevitably",
- "invensions", "inventions",
- "inventario", "inventor",
- "inventarlo", "inventor",
- "inventaron", "inventor",
- "inventings", "inventions",
- "inventivos", "inventions",
- "invertendo", "inverted",
- "inverterad", "inverted",
- "invertions", "inventions",
- "investemnt", "investments",
- "investiage", "investigate",
- "investions", "inventions",
- "investirat", "investigator",
- "investmens", "investments",
- "invicinble", "invincible",
- "invididual", "individual",
- "invincable", "invincible",
- "invinceble", "invincible",
- "invinicble", "invincible",
- "invinsible", "invincible",
- "invinvible", "invincible",
- "invisibily", "invisibility",
- "invitacion", "invitation",
- "invitating", "invitation",
- "involunary", "involuntary",
- "involvment", "involvement",
- "ironcially", "ironically",
- "irracional", "irrational",
- "irrationel", "irrational",
- "irrelavant", "irrelevant",
- "irrelavent", "irrelevant",
- "irrelevent", "irrelevant",
- "irrelivant", "irrelevant",
- "irrelivent", "irrelevant",
- "irrevelant", "irrelevant",
- "irreverant", "irrelevant",
- "irridation", "irritation",
- "irriration", "irritation",
- "irritacion", "irritation",
- "irritaties", "irritate",
- "islamisist", "islamist",
- "islamistas", "islamists",
- "isntalling", "installing",
- "isntructed", "instructed",
- "isntrument", "instrument",
- "israeliens", "israelis",
- "israelitas", "israelis",
- "italianess", "italians",
- "itnroduced", "introduced",
- "jailborken", "jailbroken",
- "jalibroken", "jailbroken",
- "jamaicains", "jamaican",
- "jamaicaman", "jamaican",
- "jerusaleum", "jerusalem",
- "jounralism", "journalism",
- "jounralist", "journalist",
- "jouranlism", "journalism",
- "jouranlist", "journalist",
- "journalims", "journals",
- "journalits", "journals",
- "journalizm", "journalism",
- "journalsim", "journalism",
- "journolist", "journalist",
- "judegments", "judgements",
- "judgemenal", "judgemental",
- "judgemetal", "judgemental",
- "jugdements", "judgements",
- "juggarnaut", "juggernaut",
- "juggeranut", "juggernaut",
- "juggernath", "juggernaut",
- "juggernout", "juggernaut",
- "juggernuat", "juggernaut",
- "juggetnaut", "juggernaut",
- "jugglenaut", "juggernaut",
- "juggurnaut", "juggernaut",
- "justifible", "justifiable",
- "juvenilles", "juvenile",
- "kickstarer", "kickstarter",
- "kickstartr", "kickstarter",
- "kickstater", "kickstarter",
- "kidnapning", "kidnapping",
- "kidnappade", "kidnapped",
- "killingest", "killings",
- "kilometros", "kilometers",
- "kilomiters", "kilometers",
- "kilomoters", "kilometers",
- "kilomteres", "kilometers",
- "kindapping", "kidnapping",
- "kingdomers", "kingdoms",
- "krpytonite", "kryptonite",
- "krypotnite", "kryptonite",
- "krypronite", "kryptonite",
- "kryptinite", "kryptonite",
- "kryptolite", "kryptonite",
- "kryptonyte", "kryptonite",
- "krypyonite", "kryptonite",
- "krytponite", "kryptonite",
- "kyrptonite", "kryptonite",
- "labarotory", "laboratory",
- "laboratroy", "laboratory",
- "laborerers", "laborers",
- "laboritory", "laboratory",
- "laborotory", "laboratory",
- "lackbuster", "lackluster",
- "lacklaster", "lackluster",
- "landacapes", "landscapes",
- "landingers", "landings",
- "landshapes", "landscapes",
- "landspaces", "landscapes",
- "lannasters", "lannisters",
- "lannesters", "lannisters",
- "lannistars", "lannisters",
- "lannsiters", "lannisters",
- "lateration", "alteration",
- "latitudine", "latitude",
- "laughabley", "laughably",
- "laughablly", "laughably",
- "launchered", "launched",
- "leaglizing", "legalizing",
- "lectureres", "lectures",
- "legalazing", "legalizing",
- "legalizare", "legalize",
- "legalizate", "legalize",
- "legendaies", "legendaries",
- "legendaris", "legendaries",
- "legimitacy", "legitimacy",
- "legimitate", "legitimate",
- "legislatie", "legislative",
- "legitamacy", "legitimacy",
- "legitamate", "legitimate",
- "legitamicy", "legitimacy",
- "legitamite", "legitimate",
- "legitemacy", "legitimacy",
- "legitemate", "legitimate",
- "legitimaly", "legitimacy",
- "legitimicy", "legitimacy",
- "legitimite", "legitimate",
- "leiutenant", "lieutenant",
- "lesbianese", "lesbians",
- "lesbianest", "lesbians",
- "leuitenant", "lieutenant",
- "levetating", "levitating",
- "liberacion", "liberation",
- "liberalest", "liberate",
- "liberalizm", "liberalism",
- "liberalnim", "liberalism",
- "liberalsim", "liberalism",
- "liberarion", "liberation",
- "liberaties", "liberate",
- "liberatore", "liberate",
- "libertania", "libertarians",
- "libguistic", "linguistic",
- "lietuenant", "lieutenant",
- "lieutanant", "lieutenant",
- "lieutanent", "lieutenant",
- "lieutenent", "lieutenant",
- "lifestiles", "lifestyles",
- "lifestlyes", "lifestyles",
- "lifesystem", "filesystem",
- "lifesytles", "lifestyles",
- "lifetimers", "lifetimes",
- "lifetsyles", "lifestyles",
- "lighhtning", "lightening",
- "lightergas", "lighters",
- "lighthning", "lightening",
- "lighthorse", "lighthouse",
- "lighthosue", "lighthouse",
- "lighthours", "lighthouse",
- "lightining", "lighting",
- "lightneing", "lightening",
- "lightnting", "lightening",
- "lightrooom", "lightroom",
- "lightweigt", "lightweight",
- "ligitation", "litigation",
- "ligthening", "lightening",
- "ligthhouse", "lighthouse",
- "likelyhood", "likelihood",
- "limination", "limitation",
- "limitacion", "limitation",
- "limitaiton", "limitation",
- "limitating", "limitation",
- "limitativo", "limitation",
- "linguisics", "linguistics",
- "linguisitc", "linguistics",
- "linguistcs", "linguistics",
- "linguistis", "linguistics",
- "linguitics", "linguistic",
- "lingusitic", "linguistics",
- "lingvistic", "linguistic",
- "liousville", "louisville",
- "listeneres", "listeners",
- "literallly", "literally",
- "literarely", "literary",
- "literarlly", "literary",
- "literatire", "literate",
- "literative", "literate",
- "literatute", "literate",
- "lithuanina", "lithuania",
- "litterally", "literally",
- "liuetenant", "lieutenant",
- "liveatream", "livestream",
- "livelehood", "livelihood",
- "liverpoool", "liverpool",
- "livescream", "livestream",
- "livestreem", "livestream",
- "livestrems", "livestream",
- "livilehood", "livelihood",
- "livliehood", "livelihood",
- "lobbyistes", "lobbyists",
- "lockacreen", "lockscreen",
- "logictical", "logistical",
- "logisitcal", "logistical",
- "logisticas", "logistics",
- "logisticly", "logistical",
- "loiusville", "louisville",
- "lollipoopy", "lollipop",
- "lonelyness", "loneliness",
- "longevitiy", "longevity",
- "lonileness", "loneliness",
- "lonlieness", "loneliness",
- "louieville", "louisville",
- "louisiania", "louisiana",
- "louisianna", "louisiana",
- "louisivlle", "louisville",
- "louisviile", "louisville",
- "lousiville", "louisville",
- "luietenant", "lieutenant",
- "mabyelline", "maybelline",
- "magnifient", "magnificent",
- "mainpulate", "manipulate",
- "mainstreem", "mainstream",
- "maintaince", "maintained",
- "maintaines", "maintains",
- "maintainig", "maintaining",
- "maintenace", "maintenance",
- "maintianed", "maintained",
- "maintioned", "mentioned",
- "malfuncion", "malfunction",
- "malpractce", "malpractice",
- "managebale", "manageable",
- "maneagable", "manageable",
- "maneouvred", "manoeuvred",
- "maneouvres", "manoeuvres",
- "maneuveres", "maneuvers",
- "maneuveurs", "maneuver",
- "manifestas", "manifests",
- "manifestes", "manifests",
- "manifestus", "manifests",
- "manipluate", "manipulate",
- "manipualte", "manipulate",
- "manipulant", "manipulate",
- "manipulare", "manipulate",
- "manipulted", "manipulated",
- "maniuplate", "manipulate",
- "mannarisms", "mannerisms",
- "mannersims", "mannerisms",
- "mannorisms", "mannerisms",
- "manufacter", "manufacture",
- "manufacure", "manufacture",
- "manufature", "manufacture",
- "maraudeurs", "marauder",
- "margaritte", "margaret",
- "margianlly", "marginally",
- "marginaali", "marginal",
- "marginable", "marginal",
- "marignally", "marginally",
- "marijuanna", "marijuana",
- "marketting", "marketing",
- "marshmalow", "marshmallow",
- "masculinty", "masculinity",
- "massacrare", "massacre",
- "massivelly", "massively",
- "masteriers", "masteries",
- "masternind", "mastermind",
- "masterpice", "masterpiece",
- "mastrubate", "masturbate",
- "mastubrate", "masturbated",
- "masturabte", "masturbate",
- "masturbait", "masturbate",
- "masturbare", "masturbate",
- "masturbeta", "masturbated",
- "masturdate", "masturbate",
- "materiales", "materials",
- "materialsm", "materialism",
- "maximazing", "maximizing",
- "maximixing", "maximizing",
- "mayballine", "maybelline",
- "maybellene", "maybelline",
- "maybellibe", "maybelline",
- "maybilline", "maybelline",
- "mccarthyst", "mccarthyist",
- "mdifielder", "midfielder",
- "meagthread", "megathread",
- "meaningess", "meanings",
- "meaningles", "meanings",
- "meatballls", "meatballs",
- "mecahnical", "mechanical",
- "mecahnisms", "mechanisms",
- "mechancial", "mechanical",
- "mechandise", "merchandise",
- "mechanichs", "mechanics",
- "mechanicle", "mechanical",
- "mechanicly", "mechanical",
- "mechanicus", "mechanics",
- "mechanincs", "mechanic",
- "mechanisim", "mechanism",
- "mechansims", "mechanisms",
- "mechinical", "mechanical",
- "mechinisms", "mechanisms",
- "mediaction", "medications",
- "medicacion", "medication",
- "medicaiton", "medication",
- "medicalert", "medicare",
- "medicallly", "medically",
- "medicatons", "medications",
- "medicinens", "medicines",
- "medicinske", "medicine",
- "medicority", "mediocrity",
- "medidating", "meditating",
- "mediocirty", "mediocrity",
- "mediocraty", "mediocrity",
- "mediocrety", "mediocrity",
- "mediocricy", "mediocrity",
- "mediocrily", "mediocrity",
- "mediocrisy", "mediocrity",
- "meditacion", "medications",
- "meditaiton", "meditation",
- "melatonian", "melatonin",
- "melatonion", "melatonin",
- "mellinnium", "millennium",
- "melodieuse", "melodies",
- "membrances", "membrane",
- "mentallity", "mentally",
- "mentionnes", "mentions",
- "mercenaire", "mercenaries",
- "mercenares", "mercenaries",
- "mercentile", "mercantile",
- "merchanise", "merchandise",
- "merchantos", "merchants",
- "messagease", "messages",
- "messagepad", "messaged",
- "messenging", "messaging",
- "metabalism", "metabolism",
- "metabilism", "metabolism",
- "metabloism", "metabolism",
- "metablosim", "metabolism",
- "metabolics", "metabolism",
- "metabolizm", "metabolism",
- "metabolsim", "metabolism",
- "metalurgic", "metallurgic",
- "metaphoras", "metaphors",
- "metaphores", "metaphors",
- "metaphyics", "metaphysics",
- "meterology", "meteorology",
- "methaphors", "metaphors",
- "methodolgy", "methodology",
- "methodoloy", "methodology",
- "metrapolis", "metropolis",
- "metrolopis", "metropolis",
- "metropilis", "metropolis",
- "metroplois", "metropolis",
- "metropolin", "metropolitan",
- "metropolos", "metropolis",
- "metropolys", "metropolis",
- "mexicanese", "mexicans",
- "mexicaness", "mexicans",
- "michelline", "michelle",
- "micorwaves", "microwaves",
- "microhpone", "microphone",
- "microscoop", "microscope",
- "microvaves", "microwaves",
- "microvaxes", "microwaves",
- "micrpohone", "microphones",
- "midfeilder", "midfielder",
- "midfiedler", "midfielder",
- "midfieldes", "midfielders",
- "midfielers", "midfielders",
- "midfileder", "midfielder",
- "midifelder", "midfielder",
- "midnlessly", "mindlessly",
- "migitation", "mitigation",
- "migrainers", "migraines",
- "miletsones", "milestones",
- "milisecond", "millisecond",
- "militiades", "militias",
- "militiants", "militias",
- "millinnium", "millennium",
- "miminalist", "minimalist",
- "minamilist", "minimalist",
- "mindleslly", "mindlessly",
- "minimazing", "minimizing",
- "minimilast", "minimalist",
- "minimilist", "minimalist",
- "mininalist", "minimalist",
- "ministeres", "ministers",
- "ministerns", "ministers",
- "minneaplis", "minneapolis",
- "minneapols", "minneapolis",
- "minnesotta", "minnesota",
- "minoritets", "minorities",
- "minoroties", "minorities",
- "miracalous", "miraculous",
- "miracluous", "miraculous",
- "miracoulus", "miraculous",
- "mircophone", "microphone",
- "mircoscope", "microscope",
- "mircowaves", "microwaves",
- "misandrony", "misandry",
- "miscarrage", "miscarriage",
- "miscarrige", "miscarriage",
- "misdemenor", "misdemeanor",
- "miserabley", "miserably",
- "miserablly", "miserably",
- "misforture", "misfortune",
- "misgoynist", "misogynist",
- "misinfomed", "misinformed",
- "misinterpt", "misinterpret",
- "misisonary", "missionary",
- "misoganist", "misogynist",
- "misogenist", "misogynist",
- "misoginist", "misogynist",
- "misoginyst", "misogynist",
- "misognyist", "misogynist",
- "misogonist", "misogynist",
- "misogonyst", "misogynist",
- "misogyinst", "misogynist",
- "misogynyst", "misogynist",
- "misoygnist", "misogynist",
- "mispelling", "misspelling",
- "missionare", "missionaries",
- "missionera", "missionary",
- "missisippi", "mississippi",
- "mississipi", "mississippi",
- "mississppi", "mississippi",
- "misspeling", "misspelling",
- "misspellng", "misspelling",
- "mistakedly", "mistakenly",
- "mistakinly", "mistakenly",
- "mistankely", "mistakenly",
- "misterious", "mysterious",
- "misteryous", "mysterious",
- "mistreaded", "mistreated",
- "misygonist", "misogynist",
- "mitigaiton", "mitigation",
- "moderacion", "moderation",
- "moderaters", "moderates",
- "moderatley", "moderately",
- "moderatore", "moderate",
- "moderatorn", "moderation",
- "modificato", "modification",
- "modifieras", "modifiers",
- "modifieres", "modifiers",
- "moisturier", "moisturizer",
- "moleculair", "molecular",
- "molestaion", "molestation",
- "molestarle", "molester",
- "molestarme", "molester",
- "molestarse", "molester",
- "molestarte", "molester",
- "molestered", "molested",
- "momentarly", "momentarily",
- "monagomous", "monogamous",
- "monetizare", "monetize",
- "monitering", "monitoring",
- "monogymous", "monogamous",
- "monolistic", "monolithic",
- "monolitich", "monolithic",
- "monolopies", "monopolies",
- "monolothic", "monolithic",
- "monolythic", "monolithic",
- "monopilies", "monopolies",
- "monoploies", "monopolies",
- "monopolets", "monopolies",
- "monopolice", "monopolies",
- "monopolios", "monopolies",
- "monothilic", "monolithic",
- "monsterous", "monsters",
- "montioring", "monitoring",
- "monumentos", "monuments",
- "monumentul", "monumental",
- "monumentus", "monuments",
- "mormonisim", "mormonism",
- "morphinate", "morphine",
- "morrisette", "morissette",
- "morrisound", "morrison",
- "mosquitero", "mosquito",
- "mosquiters", "mosquitoes",
- "motherbard", "motherboard",
- "motherboad", "motherboard",
- "motherbord", "motherboard",
- "motivaiton", "motivations",
- "motiviated", "motivated",
- "motorcicle", "motorcycle",
- "motorcylce", "motorcycle",
- "motorcyles", "motorcycles",
- "motorollas", "motorola",
- "mouthpeace", "mouthpiece",
- "mouthpeice", "mouthpiece",
- "movespeeed", "movespeed",
- "mozzaralla", "mozzarella",
- "mozzeralla", "mozzarella",
- "mozzorella", "mozzarella",
- "mulitation", "mutilation",
- "mulitplied", "multiplied",
- "mulitplier", "multiplier",
- "mulitverse", "multiverse",
- "multilpier", "multiplier",
- "multiplaer", "multiplier",
- "multiplaye", "multiply",
- "multiplayr", "multiply",
- "multiplays", "multiply",
- "multipleye", "multiply",
- "multipling", "multiplying",
- "multiplyed", "multiplied",
- "multiplyer", "multiple",
- "multiplyng", "multiplying",
- "murderered", "murdered",
- "murdereres", "murderers",
- "muscicians", "musicians",
- "musculaire", "muscular",
- "mushroooms", "mushroom",
- "mutialtion", "mutilation",
- "mutiliated", "mutilated",
- "mutliation", "mutilation",
- "mutliplied", "multiplied",
- "mutliplier", "multiplier",
- "mutliverse", "multiverse",
- "mysogynist", "misogynist",
- "mysterieus", "mysteries",
- "nagivating", "navigating",
- "nagivation", "navigation",
- "narcassism", "narcissism",
- "narcassist", "narcissist",
- "narcessist", "narcissist",
- "narciscism", "narcissism",
- "narciscist", "narcissist",
- "narcisissm", "narcissism",
- "narcisisst", "narcissist",
- "narcisists", "narcissist",
- "narcissicm", "narcissism",
- "narcissict", "narcissist",
- "narcissitc", "narcissist",
- "narcissits", "narcissist",
- "narcoticos", "narcotics",
- "narrativas", "narratives",
- "narrativos", "narratives",
- "narritives", "narratives",
- "nashvillle", "nashville",
- "nationales", "nationals",
- "nationalis", "nationals",
- "nationalit", "nationalist",
- "nationaliy", "nationality",
- "nationalty", "nationality",
- "nationella", "national",
- "naturually", "naturally",
- "naviagting", "navigating",
- "naviagtion", "navigation",
- "navigatore", "navigate",
- "neccessary", "necessary",
- "necesarily", "necessarily",
- "necessairy", "necessarily",
- "necessarly", "necessary",
- "necessarry", "necessary",
- "necessiate", "necessitate",
- "necessites", "necessities",
- "neckbeared", "neckbeard",
- "neckboards", "neckbeards",
- "neckbreads", "neckbeards",
- "neckneards", "neckbeards",
- "necromacer", "necromancer",
- "necromaner", "necromancer",
- "needleslly", "needlessly",
- "negativaty", "negativity",
- "negativley", "negatively",
- "negelcting", "neglecting",
- "negilgence", "negligence",
- "negiotated", "negotiated",
- "neglacting", "neglecting",
- "neglagence", "negligence",
- "neglegance", "negligence",
- "neglegible", "negligible",
- "neglegting", "neglecting",
- "neglibible", "negligible",
- "neglicence", "negligence",
- "neglicible", "negligible",
- "neglicting", "neglecting",
- "negligable", "negligible",
- "negligance", "negligence",
- "negligeble", "negligible",
- "negligente", "negligence",
- "negociated", "negotiated",
- "negogiated", "negotiated",
- "negoitated", "negotiated",
- "negotaited", "negotiated",
- "negotation", "negotiation",
- "negotiaion", "negotiation",
- "negotiatie", "negotiated",
- "negotiatin", "negotiations",
- "negotiaton", "negotiation",
- "neigbhours", "neighbours",
- "neighbhors", "neighbours",
- "neighbords", "neighbours",
- "neighbores", "neighbours",
- "netowrking", "networking",
- "netruality", "neutrality",
- "neturality", "neutrality",
- "netwroking", "networking",
- "neurologia", "neurological",
- "neutrailty", "neutrality",
- "newletters", "newsletters",
- "newlsetter", "newsletter",
- "newsettler", "newsletter",
- "newslatter", "newsletter",
- "nieghbours", "neighbours",
- "nightmates", "nightmares",
- "nightmears", "nightmares",
- "nightmeres", "nightmares",
- "nigthmares", "nightmares",
- "nipticking", "nitpicking",
- "nitpciking", "nitpicking",
- "nominacion", "nomination",
- "nominatino", "nominations",
- "nominativo", "nomination",
- "nominatons", "nominations",
- "nonsencial", "nonsensical",
- "nontheless", "nonetheless",
- "northerend", "northern",
- "nostalgica", "nostalgia",
- "nostalgija", "nostalgia",
- "noteworhty", "noteworthy",
- "nothingess", "nothingness",
- "noticabely", "noticeably",
- "noticabley", "noticeably",
- "noticiably", "noticeably",
- "notoriosly", "notoriously",
- "novembeard", "november",
- "nuetrality", "neutrality",
- "nutricious", "nutritious",
- "nutrientes", "nutrients",
- "nutritents", "nutrients",
- "nutritinal", "nutritional",
- "nutritiuos", "nutritious",
- "nutritivos", "nutritious",
- "nutrituous", "nutritious",
- "nutrutious", "nutritious",
- "obatinable", "obtainable",
- "obejctives", "objectives",
- "obilgatory", "obligatory",
- "objecitves", "objectives",
- "objectivas", "objectives",
- "objectivly", "objectively",
- "objectivst", "objectives",
- "objectivty", "objectivity",
- "objektives", "objectives",
- "obligitary", "obligatory",
- "obligitory", "obligatory",
- "observabil", "observable",
- "observarse", "observers",
- "observaton", "observation",
- "observeras", "observers",
- "observered", "observed",
- "observeres", "observers",
- "observible", "observable",
- "obstancles", "obstacles",
- "obstrucion", "obstruction",
- "obstructin", "obstruction",
- "obtainabie", "obtainable",
- "obtaineble", "obtainable",
- "obtainible", "obtainable",
- "obtianable", "obtainable",
- "ocasionaly", "occasionally",
- "ocassional", "occasional",
- "ocassioned", "occasioned",
- "occaisonal", "occasional",
- "occasionly", "occasional",
- "occassions", "occasions",
- "occational", "occasional",
- "occulation", "occupation",
- "occupaiton", "occupation",
- "occurances", "occurrences",
- "occurences", "occurrences",
- "occurrance", "occurrence",
- "octohedral", "octahedral",
- "octohedron", "octahedron",
- "offensivly", "offensively",
- "offereings", "offerings",
- "officailly", "officially",
- "olbigatory", "obligatory",
- "ominpotent", "omnipotent",
- "ominscient", "omniscient",
- "omnipetent", "omnipotent",
- "omnipitent", "omnipotent",
- "omnipotant", "omnipotent",
- "omnisicent", "omniscient",
- "omniverous", "omnivorous",
- "omnsicient", "omniscient",
- "onmipotent", "omnipotent",
- "onmiscient", "omniscient",
- "operatings", "operations",
- "operativne", "operative",
- "operativos", "operations",
- "oportunity", "opportunity",
- "opponenets", "opponent",
- "oppononent", "opponent",
- "oppressiun", "oppressing",
- "optimisitc", "optimistic",
- "optimizare", "optimize",
- "optimizate", "optimize",
- "optimizied", "optimize",
- "organicaly", "organically",
- "organiclly", "organically",
- "organisate", "organise",
- "organische", "organise",
- "organisera", "organizers",
- "organisere", "organizers",
- "organisert", "organizers",
- "organisier", "organise",
- "organisims", "organism",
- "organismed", "organise",
- "organismen", "organise",
- "organismer", "organise",
- "organismes", "organisms",
- "organismus", "organisms",
- "organisten", "organise",
- "organiszed", "organise",
- "organizaed", "organize",
- "organizare", "organizer",
- "organizate", "organize",
- "organizors", "organizers",
- "organizuje", "organize",
- "organziers", "organizers",
- "orientaion", "orientation",
- "orientarla", "oriental",
- "orientarlo", "oriental",
- "origianlly", "originally",
- "originales", "originals",
- "originalet", "originated",
- "originalis", "originals",
- "originalty", "originality",
- "orignially", "originally",
- "origniated", "originated",
- "origonally", "originally",
- "origonated", "originated",
- "ostencibly", "ostensibly",
- "ostenisbly", "ostensibly",
- "ostensably", "ostensibly",
- "ostentibly", "ostensibly",
- "ostrasiced", "ostracized",
- "ostrasized", "ostracized",
- "ostraziced", "ostracized",
- "ostrazised", "ostracized",
- "ostrecized", "ostracized",
- "ostricized", "ostracized",
- "ostrocized", "ostracized",
- "oustanding", "outstanding",
- "outcalssed", "outclassed",
- "outlcassed", "outclassed",
- "outnumberd", "outnumbered",
- "outnumbred", "outnumbered",
- "outperfoms", "outperform",
- "outperfrom", "outperform",
- "outpreform", "outperform",
- "outrageuos", "outrageous",
- "outragious", "outrageous",
- "outragoues", "outrageous",
- "outreagous", "outrageous",
- "outsourcad", "outsourced",
- "outsouring", "outsourcing",
- "outsoursed", "outsourced",
- "outweighes", "outweighs",
- "overarcing", "overarching",
- "overclockd", "overclocked",
- "overcloked", "overclocked",
- "overcoding", "overcoming",
- "overheards", "overhead",
- "overheared", "overhead",
- "overhooked", "overlooked",
- "overlanded", "overloaded",
- "overlaoded", "overloaded",
- "overlaping", "overlapping",
- "overlauded", "overloaded",
- "overloards", "overload",
- "overlorded", "overloaded",
- "overlordes", "overlords",
- "overnurfed", "overturned",
- "overpirced", "overpriced",
- "overpowerd", "overpowered",
- "overpowred", "overpowered",
- "overprised", "overpriced",
- "overtunned", "overturned",
- "overtunred", "overturned",
- "overturing", "overturn",
- "overweigth", "overweight",
- "overwhemed", "overwhelmed",
- "overwieght", "overweight",
- "overwritte", "overwrite",
- "pahtfinder", "pathfinder",
- "painfullly", "painfully",
- "painkilers", "painkillers",
- "pairlament", "parliament",
- "pakistanti", "pakistani",
- "paladinlst", "paladins",
- "palcements", "placements",
- "paleolitic", "paleolithic",
- "palestinan", "palestinian",
- "paltformer", "platformer",
- "palyerbase", "playerbase",
- "parachutte", "parachute",
- "parademics", "paramedics",
- "paradiggum", "paradigm",
- "paragraghs", "paragraphs",
- "paragrahps", "paragraphs",
- "paragrapgh", "paragraphs",
- "paragrpahs", "paragraphs",
- "parahprase", "paraphrase",
- "paralleles", "parallels",
- "parallells", "parallels",
- "paramadics", "paramedics",
- "paramaters", "parameters",
- "paramecias", "paramedics",
- "parametics", "paramedics",
- "parametros", "parameters",
- "paramiters", "parameters",
- "paramormal", "paranormal",
- "paranoicas", "paranoia",
- "paranomral", "paranormal",
- "paranornal", "paranormal",
- "parapharse", "paraphrase",
- "paraphraze", "paraphrase",
- "paraprhase", "paraphrase",
- "parasitter", "parasite",
- "parilament", "parliament",
- "parituclar", "particular",
- "parlaiment", "parliament",
- "parliamant", "parliament",
- "parliamone", "parliament",
- "parliement", "parliament",
- "parrallell", "parallel",
- "parrallely", "parallelly",
- "partiarchy", "patriarchy",
- "participas", "participants",
- "participat", "participants",
- "participte", "participate",
- "particualr", "particular",
- "partiotism", "patriotism",
- "passionais", "passions",
- "passionale", "passionately",
- "passionant", "passionate",
- "passionite", "passionate",
- "passivedns", "passives",
- "passivelly", "passively",
- "patenterad", "patented",
- "pathfidner", "pathfinder",
- "pathfindir", "pathfinder",
- "pathifnder", "pathfinder",
- "patientens", "patients",
- "patrairchy", "patriarchy",
- "patriachry", "patriarchy",
- "patriarcal", "patriarchal",
- "patriarhal", "patriarchal",
- "patriatchy", "patriarchy",
- "patriatism", "patriotism",
- "patrionism", "patriotism",
- "patriotics", "patriotism",
- "patriotisk", "patriots",
- "patroitism", "patriotism",
- "patryarchy", "patriarchy",
- "pedantisch", "pedantic",
- "pedestiran", "pedestrian",
- "pedestrain", "pedestrian",
- "pedictions", "depictions",
- "pedohpiles", "pedophiles",
- "pedohpilia", "pedophilia",
- "pedophilac", "pedophilia",
- "pedophilea", "pedophilia",
- "pedophilie", "pedophile",
- "pedophilla", "pedophilia",
- "pedophille", "pedophile",
- "pedopholia", "pedophilia",
- "penetraion", "penetration",
- "penetratin", "penetration",
- "penetraton", "penetration",
- "penguinese", "penguins",
- "penguiness", "penguins",
- "peninsulla", "peninsula",
- "penninsula", "peninsula",
- "peodphiles", "pedophiles",
- "peodphilia", "pedophilia",
- "pepperment", "peppermint",
- "pepperonni", "pepperoni",
- "percantage", "percentage",
- "percantile", "percentile",
- "percaution", "precaution",
- "percenatge", "percentages",
- "percential", "percentile",
- "percentige", "percentile",
- "perceptoin", "perceptions",
- "percession", "percussion",
- "percetange", "percentages",
- "percetnage", "percentages",
- "percintile", "percentile",
- "percission", "percussion",
- "percpetion", "perceptions",
- "percusions", "percussion",
- "perdicting", "predicting",
- "perdiction", "prediction",
- "perdictive", "predictive",
- "perenially", "perennially",
- "perfeccion", "perfection",
- "perfecxion", "perfection",
- "perfektion", "perfection",
- "perferable", "preferable",
- "perferably", "preferably",
- "perference", "preference",
- "perferring", "preferring",
- "perfexcion", "perfection",
- "perfomance", "performance",
- "performace", "performance",
- "performane", "performances",
- "performans", "performances",
- "performens", "performers",
- "performous", "performs",
- "perfromers", "performers",
- "perhiperal", "peripheral",
- "peridinkle", "periwinkle",
- "perihperal", "peripheral",
- "periodisch", "periodic",
- "periperhal", "peripheral",
- "peripheals", "peripherals",
- "peripheria", "peripheral",
- "periphiral", "peripheral",
- "periphreal", "peripheral",
- "periphrial", "peripheral",
- "peritinkle", "periwinkle",
- "periwankle", "periwinkle",
- "periwinkel", "periwinkle",
- "periwinkie", "periwinkle",
- "periwinlke", "periwinkle",
- "permanenty", "permanently",
- "permanetly", "permanently",
- "permisions", "permission",
- "permisison", "permissions",
- "permissble", "permissible",
- "permissibe", "permissible",
- "permissons", "permissions",
- "perogative", "prerogative",
- "perordered", "preordered",
- "perpatuate", "perpetuate",
- "perpetualy", "perpetually",
- "perpetuare", "perpetuate",
- "persausion", "persuasion",
- "persausive", "persuasive",
- "persective", "respective",
- "persectued", "persecuted",
- "persecutie", "persecuted",
- "persecutin", "persecution",
- "perserving", "preserving",
- "persicuted", "persecuted",
- "persistant", "persistent",
- "persistens", "persists",
- "persoanlly", "personally",
- "persocuted", "persecuted",
- "personalie", "personalized",
- "personalis", "personas",
- "personarse", "personas",
- "personatus", "personas",
- "personnell", "personnel",
- "perspecive", "perspective",
- "perspectie", "perspectives",
- "persuasian", "persuasion",
- "persuasing", "persuasion",
- "persuasivo", "persuasion",
- "persuation", "persuasion",
- "persucuted", "persecuted",
- "persumably", "presumably",
- "persussion", "persuasion",
- "persvasive", "persuasive",
- "perswasion", "persuasion",
- "pertinante", "pertinent",
- "pervailing", "prevailing",
- "pervalence", "prevalence",
- "pervention", "prevention",
- "perversley", "perverse",
- "pesitcides", "pesticides",
- "pessimistc", "pessimistic",
- "pessimitic", "pessimistic",
- "pestacides", "pesticides",
- "pestecides", "pesticides",
- "pesticedes", "pesticides",
- "pesticidas", "pesticides",
- "pestisides", "pesticides",
- "pestizides", "pesticides",
- "pharamcist", "pharmacist",
- "pharmacias", "pharmacist",
- "pharmacyst", "pharmacist",
- "pharmasist", "pharmacist",
- "pharmicist", "pharmacist",
- "phemonenon", "phenomenon",
- "phenemenon", "phenomenon",
- "phenemonal", "phenomenal",
- "phenomanal", "phenomenal",
- "phenomanon", "phenomenon",
- "phenomemon", "phenomenon",
- "phenomenen", "phenomenon",
- "phenomenol", "phenomenal",
- "phenomenom", "phenomenon",
- "phenominon", "phenomenon",
- "phenomonal", "phenomenal",
- "phenomonen", "phenomenon",
- "phenomonon", "phenomenon",
- "phenonemal", "phenomenal",
- "phenonemon", "phenomenon",
- "phenonmena", "phenomena",
- "philipines", "philippines",
- "philippins", "philippines",
- "philisophy", "philosophy",
- "phillipine", "philippine",
- "phillipses", "phillies",
- "philosiphy", "philosophy",
- "philosohpy", "philosophy",
- "philosoper", "philosopher",
- "philospher", "philosopher",
- "philospohy", "philosophy",
- "photogragh", "photograph",
- "photograhs", "photographs",
- "photograhy", "photography",
- "photograps", "photographs",
- "photograpy", "photography",
- "photogrpah", "photographs",
- "photoshopd", "photoshopped",
- "photoshope", "photoshopped",
- "phramacist", "pharmacist",
- "phsyically", "physically",
- "phsyicians", "physicians",
- "phsyicists", "physicists",
- "phsyiology", "physiology",
- "phycisians", "physicians",
- "phycisists", "physicists",
- "phyiscally", "physically",
- "phyisology", "physiology",
- "physcially", "physically",
- "physcology", "psychology",
- "physcopath", "psychopath",
- "physicials", "physicians",
- "physiciens", "physicians",
- "physioligy", "physiology",
- "picthforks", "pitchforks",
- "pinoneered", "pioneered",
- "pitchferks", "pitchforks",
- "pitchfolks", "pitchforks",
- "pitchfords", "pitchforks",
- "pitchworks", "pitchforks",
- "pitckforks", "pitchforks",
- "pittaburgh", "pittsburgh",
- "pittsbrugh", "pittsburgh",
- "placehoder", "placeholder",
- "placeholdr", "placeholder",
- "placeholer", "placeholder",
- "placemenet", "placements",
- "plagairism", "plagiarism",
- "plagarisim", "plagiarism",
- "plagiariam", "plagiarism",
- "plagiarios", "plagiarism",
- "plagiarius", "plagiarism",
- "plagiarizm", "plagiarism",
- "plagierism", "plagiarism",
- "plaguarism", "plagiarism",
- "plaigarism", "plagiarism",
- "plasticosa", "plastics",
- "platfarmer", "platformer",
- "platformar", "platformer",
- "platformie", "platformer",
- "platfotmer", "platformer",
- "platfromer", "platformer",
- "platofrmer", "platformer",
- "playaround", "playground",
- "playersare", "playerbase",
- "playgorund", "playground",
- "playthrogh", "playthrough",
- "playthrouh", "playthrough",
- "playwrites", "playwrights",
- "plethorian", "plethora",
- "policitian", "politician",
- "polinators", "pollinators",
- "polishuset", "polishes",
- "politessen", "politeness",
- "politicain", "politician",
- "politicaly", "politically",
- "politicien", "politician",
- "politicing", "politician",
- "politicion", "politician",
- "politickin", "politician",
- "politiikan", "politician",
- "politiness", "politeness",
- "polititian", "politician",
- "popualtion", "populations",
- "populairty", "popularity",
- "populaiton", "populations",
- "popularaty", "popularity",
- "popularest", "populate",
- "popularily", "popularity",
- "populaties", "populate",
- "populatiry", "popularity",
- "populative", "populate",
- "populatoin", "populations",
- "popultaion", "populations",
- "pormetheus", "prometheus",
- "pornograhy", "pornography",
- "pornograpy", "pornography",
- "pornogrphy", "pornography",
- "porportion", "proportion",
- "portabilty", "portability",
- "portarying", "portraying",
- "portoguese", "portuguese",
- "portraiing", "portraying",
- "portrating", "portraying",
- "portrayels", "portrays",
- "portugeuse", "portuguese",
- "portuguise", "portuguese",
- "posessions", "possessions",
- "posicional", "positional",
- "positevely", "positively",
- "positioing", "positioning",
- "positionly", "positional",
- "positionne", "positioned",
- "positivley", "positively",
- "possesives", "possessive",
- "possessers", "possesses",
- "possessess", "possesses",
- "possibiliy", "possibility",
- "possibilty", "possibility",
- "possissive", "possessive",
- "posthomous", "posthumous",
- "potentialy", "potentially",
- "poulations", "populations",
- "powerhorse", "powerhouse",
- "powerhosue", "powerhouse",
- "powerhours", "powerhouse",
- "powerhsell", "powershell",
- "powerprint", "powerpoint",
- "powersehll", "powershell",
- "ppublisher", "publisher",
- "practially", "practically",
- "practicaly", "practically",
- "practicess", "practise",
- "practiclly", "practically",
- "practioner", "practitioner",
- "precaucion", "precaution",
- "precausion", "precaution",
- "precautios", "precautions",
- "precedance", "precedence",
- "precedense", "precedence",
- "preceeding", "preceding",
- "precendece", "precedence",
- "precentage", "percentage",
- "precentile", "percentile",
- "preciselly", "precisely",
- "precuation", "precautions",
- "precussion", "percussion",
- "predecated", "predicated",
- "predecence", "precedence",
- "predecesor", "predecessor",
- "predection", "prediction",
- "predective", "predictive",
- "prediccion", "prediction",
- "prediceted", "predicated",
- "predicited", "predicated",
- "predicitng", "predicting",
- "prediciton", "prediction",
- "predicitve", "predictive",
- "predickted", "predicated",
- "predictave", "predictive",
- "predictivo", "prediction",
- "predictons", "predictions",
- "predjuiced", "prejudiced",
- "predjuices", "prejudices",
- "preduction", "prediction",
- "preductive", "predictive",
- "predujiced", "prejudiced",
- "predujices", "prejudices",
- "prefarable", "preferable",
- "prefarably", "preferably",
- "prefection", "perfection",
- "preferance", "preference",
- "prefereble", "preferable",
- "preferente", "preference",
- "preferenze", "preference",
- "preferible", "preferable",
- "preferibly", "preferably",
- "prefernece", "preferences",
- "preformers", "performers",
- "pregancies", "pregnancies",
- "pregnanies", "pregnancies",
- "preipheral", "peripheral",
- "preisdents", "presidents",
- "preisthood", "priesthood",
- "prejeduced", "prejudiced",
- "prejeduces", "prejudices",
- "prejiduced", "prejudiced",
- "prejiduces", "prejudices",
- "prejucided", "prejudiced",
- "prejucides", "prejudices",
- "prejuduced", "prejudiced",
- "prejuduces", "prejudices",
- "prelimiary", "preliminary",
- "prematurly", "prematurely",
- "preminence", "preeminence",
- "premission", "permission",
- "preorderes", "preorders",
- "prepartion", "preparation",
- "prepetuate", "perpetuate",
- "preposters", "preposterous",
- "prescients", "presidents",
- "prescirbed", "prescribed",
- "prescriped", "prescribed",
- "presearing", "preserving",
- "presecuted", "persecuted",
- "presedency", "presidency",
- "presedents", "presidents",
- "presenning", "presenting",
- "presentase", "presents",
- "presentato", "presentation",
- "presention", "presenting",
- "presentors", "presents",
- "preservare", "preserve",
- "preservato", "preservation",
- "preserverd", "preserved",
- "presidancy", "presidency",
- "presidante", "presidents",
- "presidenta", "presidential",
- "presidenty", "presidency",
- "presidunce", "presidency",
- "presistent", "persistent",
- "presonally", "personally",
- "presonhood", "personhood",
- "pressuming", "pressuring",
- "prestigios", "prestigious",
- "prestigous", "prestigious",
- "presuambly", "presumably",
- "presuasion", "persuasion",
- "presuasive", "persuasive",
- "presumebly", "presumably",
- "presumendo", "presumed",
- "presumibly", "presumably",
- "presumpton", "presumption",
- "pretaining", "pertaining",
- "pretection", "protection",
- "pretendias", "pretends",
- "pretensive", "pretense",
- "pretentios", "pretentious",
- "pretentous", "pretentious",
- "prevalecen", "prevalence",
- "prevalente", "prevalence",
- "prevencion", "prevention",
- "preventivo", "prevention",
- "preventors", "prevents",
- "previaling", "prevailing",
- "previosuly", "previously",
- "previoulsy", "previously",
- "prevolence", "prevalence",
- "pricinpals", "principals",
- "primarilly", "primarily",
- "primatives", "primitives",
- "princepals", "principals",
- "princesess", "princesses",
- "princibles", "principles",
- "principaly", "principality",
- "principels", "principals",
- "principial", "principal",
- "principias", "principals",
- "principlas", "principals",
- "prinicipal", "principal",
- "prinicpals", "principals",
- "prinicples", "principles",
- "printerest", "printers",
- "prioratize", "prioritize",
- "prioretize", "prioritize",
- "prioritice", "prioritize",
- "prioritied", "prioritize",
- "prioroties", "priorities",
- "priorotize", "prioritize",
- "priotities", "priorities",
- "priotitize", "prioritize",
- "privaleged", "privileged",
- "privaleges", "privileges",
- "privaticed", "privatized",
- "privelaged", "privileged",
- "privelages", "privileges",
- "priveldges", "privileges",
- "priveleged", "privileged",
- "priveleges", "privileges",
- "privelidge", "privileged",
- "priveliged", "privileged",
- "priveliges", "privileges",
- "privetized", "privatized",
- "privilaged", "privileged",
- "privilages", "privileges",
- "priviledge", "privilege",
- "privilegde", "privileges",
- "privilegie", "privilege",
- "priviliged", "privileged",
- "priviliges", "privileges",
- "privitazed", "privatized",
- "privitized", "privatized",
- "probabiliy", "probability",
- "probabilty", "probability",
- "probablies", "probable",
- "probablybe", "probable",
- "problemita", "problematic",
- "procalimed", "proclaimed",
- "procceding", "proceeding",
- "procedding", "proceeding",
- "procederal", "procedural",
- "procedings", "proceedings",
- "procedrual", "procedural",
- "proceededs", "proceeds",
- "proceedure", "procedure",
- "proceesing", "proceeding",
- "processsor", "processors",
- "proclamied", "proclaimed",
- "proclaming", "proclaiming",
- "procliamed", "proclaimed",
- "procreatin", "procreation",
- "procudures", "procedures",
- "prodcution", "production",
- "prodecural", "procedural",
- "prodecures", "procedures",
- "produccion", "production",
- "produceras", "produces",
- "produceres", "produces",
- "producirse", "producers",
- "produciton", "production",
- "producting", "production",
- "productino", "productions",
- "productivo", "production",
- "productivy", "productivity",
- "productoin", "productions",
- "produktion", "production",
- "produktive", "productive",
- "produtcion", "productions",
- "profesions", "profession",
- "professers", "professors",
- "professorn", "profession",
- "professsor", "professors",
- "proffesion", "profession",
- "proficeint", "proficient",
- "proficiant", "proficient",
- "proficieny", "proficiency",
- "proficincy", "proficiency",
- "profitabel", "profitable",
- "profitabil", "profitable",
- "profitible", "profitable",
- "proftiable", "profitable",
- "programmar", "programmer",
- "programmme", "programme",
- "progresing", "progressing",
- "progresion", "progression",
- "progresive", "progressive",
- "progressie", "progressives",
- "progressin", "progression",
- "progresson", "progression",
- "progressos", "progresses",
- "progressus", "progresses",
- "prohibirte", "prohibit",
- "prohibites", "prohibits",
- "prohibitng", "prohibiting",
- "prohibiton", "prohibition",
- "prohibitus", "prohibits",
- "prohibitve", "prohibited",
- "prohobited", "prohibited",
- "prohpecies", "prophecies",
- "projecitle", "projectiles",
- "projectiel", "projectiles",
- "projecties", "projectiles",
- "projectils", "projectiles",
- "projectles", "projectiles",
- "projectlie", "projectiles",
- "projectyle", "projectile",
- "projektile", "projectile",
- "projektion", "projection",
- "prometheas", "prometheus",
- "promethese", "prometheus",
- "promethius", "prometheus",
- "promethous", "prometheus",
- "promethues", "prometheus",
- "prominance", "prominence",
- "prominenty", "prominently",
- "prominetly", "prominently",
- "promiscous", "promiscuous",
- "promiscuos", "promiscuous",
- "promoteurs", "promotes",
- "promotheus", "prometheus",
- "promotinal", "promotional",
- "pronoucned", "pronounced",
- "pronouning", "pronouncing",
- "propechies", "prophecies",
- "propencity", "propensity",
- "propenents", "proponents",
- "properites", "properties",
- "propersity", "propensity",
- "propertion", "proportion",
- "propertius", "properties",
- "prophacies", "prophecies",
- "prophocies", "prophecies",
- "propietary", "proprietary",
- "proplusion", "propulsion",
- "propoganda", "propaganda",
- "propogates", "propagates",
- "propolsion", "propulsion",
- "proponants", "proponents",
- "proponenet", "proponent",
- "proporcion", "proportion",
- "proporties", "properties",
- "proporting", "proportion",
- "propositon", "proposition",
- "propotions", "proportions",
- "proprietry", "proprietary",
- "proprotion", "proportion",
- "propserity", "prosperity",
- "propserous", "prosperous",
- "propulaios", "propulsion",
- "propulsing", "propulsion",
- "propultion", "propulsion",
- "propuslion", "propulsion",
- "prosectued", "prosecuted",
- "prosectuor", "prosecutor",
- "prosecuter", "prosecutor",
- "prosecutie", "prosecuted",
- "prosicuted", "prosecuted",
- "prosicutor", "prosecutor",
- "prosocuted", "prosecuted",
- "prosparity", "prosperity",
- "prospectos", "prospects",
- "prosperety", "prosperity",
- "prospertiy", "prosperity",
- "prosphetic", "prosthetic",
- "prosporous", "prosperous",
- "prostehtic", "prosthetic",
- "prosterity", "prosperity",
- "prostethic", "prosthetic",
- "prostitite", "prostitute",
- "prostitude", "prostitute",
- "prostituee", "prostitute",
- "prostituer", "prostitute",
- "prostitues", "prostitutes",
- "prostiture", "prostitute",
- "prostituto", "prostitution",
- "prostituye", "prostitute",
- "protaginst", "protagonist",
- "protastant", "protestant",
- "proteccion", "protection",
- "proteciton", "protections",
- "protectice", "protective",
- "protectiei", "protective",
- "protectoin", "protections",
- "protectons", "protectors",
- "protectron", "protection",
- "protestans", "protests",
- "protestare", "protesters",
- "protestato", "protestant",
- "protestent", "protestant",
- "protestina", "protestant",
- "prothsetic", "prosthetic",
- "protistant", "protestant",
- "protocoles", "protocols",
- "protocolls", "protocols",
- "protocolos", "protocols",
- "protohypes", "prototypes",
- "protostant", "protestant",
- "prototipes", "prototypes",
- "prototpyes", "prototypes",
- "protraying", "portraying",
- "protuguese", "portuguese",
- "provencial", "provincial",
- "proveribal", "proverbial",
- "provervial", "proverbial",
- "providance", "providence",
- "providince", "providence",
- "provinciae", "province",
- "provincies", "province",
- "provincija", "provincial",
- "provinence", "providence",
- "provinical", "provincial",
- "provintial", "provincial",
- "provinvial", "provincial",
- "provisiosn", "provision",
- "provisonal", "provisional",
- "provocatie", "provocative",
- "pscyhology", "psychology",
- "pscyhopath", "psychopath",
- "pshycology", "psychology",
- "pshycopath", "psychopath",
- "psychedlic", "psychedelic",
- "psychiatic", "psychiatric",
- "psycholoog", "psychology",
- "psychopaat", "psychopath",
- "psychopats", "psychopaths",
- "ptichforks", "pitchforks",
- "publicitan", "publication",
- "publisheed", "published",
- "publisherr", "publisher",
- "publishher", "publisher",
- "publissher", "publisher",
- "publlisher", "publisher",
- "punihsment", "punishments",
- "punishemnt", "punishments",
- "punishible", "punishable",
- "punishmnet", "punishments",
- "punissable", "punishable",
- "punsihable", "punishable",
- "purchacing", "purchasing",
- "purpolsion", "propulsion",
- "purposedly", "purposely",
- "purposelly", "purposely",
- "purpotedly", "purportedly",
- "pususading", "persuading",
- "pyschology", "psychology",
- "pyschopath", "psychopath",
- "qaulifiers", "qualifiers",
- "quailfiers", "qualifiers",
- "qualfiiers", "qualifiers",
- "qualifieds", "qualifies",
- "qualifiies", "qualifiers",
- "qualifiing", "qualifying",
- "qualifires", "qualifiers",
- "qualifyers", "qualifiers",
- "qualitying", "qualifying",
- "quanitites", "quantities",
- "quantaties", "quantities",
- "quantitize", "quantities",
- "quarantena", "quarantine",
- "quarantene", "quarantine",
- "quarantied", "quarantine",
- "quarintine", "quarantine",
- "quaruntine", "quarantine",
- "quesitoned", "questioned",
- "questional", "questionable",
- "questionne", "questioned",
- "rabinnical", "rabbinical",
- "radiactive", "radioactive",
- "radioacive", "radioactive",
- "rainbowers", "rainbows",
- "randmoness", "randomness",
- "randomzied", "randomized",
- "randonmess", "randomness",
- "randumness", "randomness",
- "raspberrry", "raspberry",
- "rationalle", "rationale",
- "readmition", "readmission",
- "realitvely", "relatively",
- "realtively", "relatively",
- "realtivity", "relativity",
- "reaserched", "researched",
- "reasercher", "researcher",
- "rebiulding", "rebuilding",
- "reboudning", "rebounding",
- "rebouncing", "rebounding",
- "rebuidling", "rebuilding",
- "rebuliding", "rebuilding",
- "rebuplican", "republican",
- "reccommend", "recommend",
- "recepients", "recipients",
- "receptoras", "receptors",
- "receptores", "receptors",
- "recgonised", "recognised",
- "recgonized", "recognized",
- "recgonizes", "recognizes",
- "reciepents", "recipients",
- "recipeints", "recipients",
- "recipiants", "recipients",
- "recocnised", "recognised",
- "recoginsed", "recognised",
- "recoginzed", "recognized",
- "recognices", "recognizes",
- "recogniton", "recognition",
- "recognzied", "recognised",
- "recomended", "recommended",
- "recommande", "recommend",
- "recommands", "recommends",
- "recommeded", "recommended",
- "recommened", "recommend",
- "recommennd", "recommends",
- "recomments", "recommends",
- "recompence", "recompense",
- "reconcider", "reconsider",
- "reconcille", "reconcile",
- "recongised", "recognised",
- "recongized", "recognized",
- "recongizes", "recognizes",
- "reconisder", "reconsider",
- "reconsiled", "reconsider",
- "recordarle", "recorder",
- "recordarme", "recorder",
- "recordarse", "recorder",
- "recordarte", "recorder",
- "recreacion", "recreation",
- "recreatief", "recreate",
- "recreativo", "recreation",
- "recrutiers", "recruiters",
- "rectanglar", "rectangular",
- "rectangual", "rectangular",
- "rectanguar", "rectangular",
- "recuriters", "recruiters",
- "recurrance", "recurrence",
- "recursivly", "recursively",
- "redefinied", "redefine",
- "redefinine", "redefine",
- "redemtpion", "redemption",
- "redepmtion", "redemption",
- "redesiging", "redesign",
- "rediculous", "ridiculous",
- "redmeption", "redemption",
- "redneckers", "rednecks",
- "redneckese", "rednecks",
- "redneckest", "rednecks",
- "reduncancy", "redundancy",
- "redundency", "redundancy",
- "redundnacy", "redundancy",
- "redunduncy", "redundancy",
- "reenforced", "reinforced",
- "reevaulate", "reevaluate",
- "refedendum", "referendum",
- "refelcting", "reflecting",
- "refelction", "reflection",
- "refelctive", "reflective",
- "referances", "references",
- "referandum", "referendum",
- "referemces", "references",
- "referemdum", "referendum",
- "referendim", "referendum",
- "referendom", "referendum",
- "referenece", "reference",
- "referening", "referencing",
- "referenses", "referees",
- "referentes", "references",
- "referneces", "references",
- "referrence", "reference",
- "referundum", "referendum",
- "refference", "reference",
- "refleciton", "reflections",
- "reflecters", "reflects",
- "reflektion", "reflection",
- "reflextion", "reflection",
- "reformerad", "reformed",
- "refrigerar", "refrigerator",
- "refurbised", "refurbished",
- "regenarate", "regenerate",
- "registeres", "registers",
- "registrato", "registration",
- "regresives", "regressive",
- "regressivo", "regression",
- "regualting", "regulating",
- "regualtion", "regulations",
- "regualtors", "regulators",
- "regulacion", "regulation",
- "regulament", "regulate",
- "regulaotrs", "regulators",
- "regularily", "regularly",
- "regularing", "regulating",
- "regularlas", "regulars",
- "regularlos", "regulars",
- "regulaters", "regulators",
- "regulatios", "regulators",
- "regulatons", "regulations",
- "rehtorical", "rhetorical",
- "reinstaled", "reinstalled",
- "reitrement", "retirement",
- "relagation", "relaxation",
- "relatation", "relaxation",
- "relativety", "relativity",
- "relativily", "relativity",
- "relativley", "relatively",
- "relavation", "relaxation",
- "relaxating", "relaxation",
- "relazation", "relaxation",
- "releagtion", "relegation",
- "relegetion", "relegation",
- "relentness", "relentless",
- "reletnless", "relentless",
- "relevation", "revelation",
- "relexation", "relegation",
- "relfecting", "reflecting",
- "relfection", "reflection",
- "relfective", "reflective",
- "reliabilty", "reliability",
- "reliablely", "reliably",
- "religiones", "religions",
- "religiosly", "religiously",
- "religiousy", "religiously",
- "religously", "religiously",
- "relitavely", "relatively",
- "reluctanct", "reluctant",
- "reluctanly", "reluctantly",
- "reluctanty", "reluctantly",
- "remarcably", "remarkably",
- "remarkibly", "remarkably",
- "rememberes", "remembers",
- "remenicent", "reminiscent",
- "reminisent", "reminiscent",
- "reminscent", "reminiscent",
- "remmebered", "remembered",
- "renaissace", "renaissance",
- "renderered", "rendered",
- "renegerate", "regenerate",
- "renewabels", "renewables",
- "renewebles", "renewables",
- "rennovated", "renovated",
- "renweables", "renewables",
- "repatition", "repetition",
- "repblicans", "republicans",
- "repbulican", "republican",
- "repeadedly", "repeatedly",
- "repeadetly", "repeatedly",
- "repearable", "repeatable",
- "repearedly", "repealed",
- "repeatadly", "repeatedly",
- "repeatedlt", "repealed",
- "repeatetly", "repeatedly",
- "repeatible", "repeatable",
- "repeatidly", "repeatedly",
- "repectable", "repeatable",
- "repentable", "repeatable",
- "repentence", "repentance",
- "repersents", "represents",
- "repetation", "repetition",
- "repeteadly", "repeatedly",
- "repetetion", "repetition",
- "repeticion", "repetition",
- "repetitivo", "repetition",
- "replacated", "replicated",
- "replaceble", "replaceable",
- "replacemet", "replacements",
- "replacemnt", "replacement",
- "replacemtn", "replacements",
- "replecated", "replicated",
- "repoistory", "repository",
- "reponsible", "responsible",
- "reportadly", "reportedly",
- "reporteros", "reporters",
- "reportidly", "reportedly",
- "repositary", "repository",
- "reposotory", "repository",
- "repostiory", "repository",
- "representn", "representing",
- "repressent", "represents",
- "repressivo", "repression",
- "repsectful", "respectful",
- "repsecting", "respecting",
- "repsective", "respective",
- "repsonding", "responding",
- "repsonsive", "responsive",
- "reptuation", "reputation",
- "repubicans", "republicans",
- "republcian", "republican",
- "republians", "republicans",
- "republicon", "republican",
- "repuglican", "republican",
- "repulicans", "republicans",
- "reputacion", "reputation",
- "requirment", "requirement",
- "requrement", "requirement",
- "resemblace", "resemble",
- "reserached", "researched",
- "reseracher", "researchers",
- "reserverad", "reserved",
- "reservered", "reserved",
- "residental", "residential",
- "resistable", "resistible",
- "resistanes", "resistances",
- "resistanse", "resistances",
- "resistence", "resistance",
- "resistendo", "resisted",
- "resistered", "resisted",
- "resistnace", "resistances",
- "resitsance", "resistances",
- "resoltuion", "resolutions",
- "resolucion", "resolution",
- "resolutino", "resolutions",
- "resolutoin", "resolutions",
- "resolutons", "resolutions",
- "resolvemos", "resolves",
- "resolvendo", "resolved",
- "resolveres", "resolves",
- "resolverse", "resolves",
- "resolviste", "resolves",
- "resonabelt", "resonate",
- "resoultion", "resolution",
- "respecitve", "respective",
- "respectifs", "respects",
- "respection", "respecting",
- "respectons", "respects",
- "respectuos", "respects",
- "respektive", "respective",
- "respiratoy", "respiratory",
- "responcive", "responsive",
- "responisve", "responsive",
- "responsibe", "responsive",
- "responsiby", "responsibly",
- "responsile", "responsive",
- "responsing", "responding",
- "ressembled", "resembled",
- "restarants", "restaurants",
- "restaraunt", "restaurant",
- "restaruant", "restaurant",
- "restatting", "restarting",
- "restaurent", "restaurant",
- "restauring", "restarting",
- "resteraunt", "restaurant",
- "restircted", "restricted",
- "restorting", "restarting",
- "restrainig", "restraining",
- "restrcited", "restricted",
- "restrcting", "restarting",
- "restricing", "restricting",
- "restricion", "restriction",
- "restricive", "restrictive",
- "restrictes", "restricts",
- "restrictie", "restrictive",
- "restricton", "restriction",
- "restructed", "restricted",
- "restuarant", "restaurant",
- "resturants", "restaurants",
- "resturaunt", "restaurant",
- "retaliaton", "retaliation",
- "rethorical", "rhetorical",
- "retierment", "retirement",
- "retribuito", "retribution",
- "retrosepct", "retrospect",
- "retrospekt", "retrospect",
- "revaluated", "reevaluated",
- "revealtion", "revelations",
- "revelaiton", "revelations",
- "revelatons", "revelations",
- "revelution", "revelation",
- "reversable", "reversible",
- "reversably", "reversal",
- "reviewtrue", "reviewer",
- "revisiones", "revisions",
- "revisionis", "revisions",
- "revoltuion", "revolution",
- "revoluiton", "revolutions",
- "revolutoin", "revolutions",
- "revoultion", "revolution",
- "rewarching", "rewatching",
- "rewatchibg", "rewatching",
- "rewatchign", "rewatching",
- "rewatchimg", "rewatching",
- "rhapsodomy", "rhapsody",
- "rhetorisch", "rhetoric",
- "ridicilous", "ridiculous",
- "ridicoulus", "ridiculous",
- "ridiculise", "ridicule",
- "ridiculize", "ridicule",
- "ridiculled", "ridicule",
- "ridiculose", "ridicule",
- "ridiculued", "ridicule",
- "rienforced", "reinforced",
- "rigthfully", "rightfully",
- "roleplaing", "roleplaying",
- "romanmania", "romanian",
- "roundaboot", "roundabout",
- "rucuperate", "recuperate",
- "rudimentry", "rudimentary",
- "sacarmento", "sacramento",
- "sacntioned", "sanctioned",
- "sacraficed", "sacrificed",
- "sacrafices", "sacrifices",
- "sacramenno", "sacramento",
- "sacreficed", "sacrificed",
- "sacrefices", "sacrifices",
- "sacremento", "sacramento",
- "sacrifaced", "sacrificed",
- "sacrifaces", "sacrifices",
- "sacrifical", "sacrificial",
- "sacrificas", "sacrifices",
- "sacrificie", "sacrificed",
- "sacrificng", "sacrificing",
- "sacrifises", "sacrifices",
- "sacrifized", "sacrificed",
- "sacrifizes", "sacrifices",
- "sacromento", "sacramento",
- "sadistisch", "sadistic",
- "sanctionne", "sanctioned",
- "sandiwches", "sandwiches",
- "sandviches", "sandwiches",
- "sandwishes", "sandwiches",
- "sanitazion", "sanitation",
- "santiation", "sanitation",
- "sastifying", "satisfying",
- "satellitte", "satellites",
- "satifsying", "satisfying",
- "satrically", "satirically",
- "satsifying", "satisfying",
- "sattelites", "satellites",
- "saturacion", "saturation",
- "scandalosa", "scandals",
- "scandalose", "scandals",
- "scandalosi", "scandals",
- "scandaloso", "scandals",
- "scandaniva", "scandinavia",
- "scandinava", "scandinavian",
- "scandinvia", "scandinavia",
- "scaramento", "sacramento",
- "scarificed", "sacrificed",
- "scarifices", "sacrifices",
- "scarmbling", "scrambling",
- "scartching", "scratching",
- "sceintific", "scientific",
- "sceintists", "scientists",
- "scenarioes", "scenarios",
- "scenarions", "scenarios",
- "scenarious", "scenarios",
- "scheudling", "scheduling",
- "scholarhip", "scholarship",
- "scholarley", "scholarly",
- "sciencists", "scientists",
- "scientests", "scientists",
- "scirptures", "scriptures",
- "scooterers", "scooters",
- "scorebaord", "scoreboard",
- "scoreborad", "scoreboard",
- "scorebored", "scoreboard",
- "scorpiomon", "scorpion",
- "scracthing", "scratching",
- "scramblies", "scramble",
- "screenshat", "screenshot",
- "screenshit", "screenshot",
- "scriptores", "scriptures",
- "scripturae", "scriptures",
- "scriputres", "scriptures",
- "scritpures", "scriptures",
- "scrutinity", "scrutiny",
- "seahawkers", "seahawks",
- "sebastiaan", "sebastian",
- "segegrated", "segregated",
- "segragated", "segregated",
- "segregaded", "segregated",
- "segregatie", "segregated",
- "segretated", "segregated",
- "segrigated", "segregated",
- "selectiose", "selections",
- "selectivly", "selectively",
- "selectivos", "selections",
- "selfishess", "selfishness",
- "senitments", "sentiments",
- "sensitiviy", "sensitivity",
- "sensitivty", "sensitivity",
- "sentaments", "sentiments",
- "sentancing", "sentencing",
- "sentements", "sentiments",
- "sentencian", "sentencing",
- "sentensing", "sentencing",
- "sentimenal", "sentimental",
- "sentimetal", "sentimental",
- "sentincing", "sentencing",
- "sentinents", "sentiments",
- "separacion", "separation",
- "separaters", "separates",
- "separatley", "separately",
- "separatron", "separation",
- "separetely", "separately",
- "seperately", "separately",
- "seperating", "separating",
- "seperation", "separation",
- "seperatism", "separatism",
- "seperatist", "separatist",
- "seperatley", "seperate",
- "sepulchure", "sepulchre",
- "serenitary", "serenity",
- "serviceble", "serviceable",
- "settelment", "settlement",
- "settlemens", "settlements",
- "settlemets", "settlements",
- "settlemnts", "settlements",
- "seuxalized", "sexualized",
- "seventeeen", "seventeen",
- "sexaulized", "sexualized",
- "sexualixed", "sexualized",
- "sexuallity", "sexually",
- "sexualzied", "sexualized",
- "sexulaized", "sexualized",
- "shakespare", "shakespeare",
- "shakespeer", "shakespeare",
- "shakespere", "shakespeare",
- "shamelesly", "shamelessly",
- "shamelessy", "shamelessly",
- "shaprening", "sharpening",
- "shareholds", "shareholders",
- "sharkening", "sharpening",
- "sharpining", "sharpening",
- "shartening", "sharpening",
- "shatnering", "shattering",
- "shattening", "shattering",
- "shepharded", "shepherd",
- "shilouette", "silhouette",
- "shitlasses", "shitless",
- "shortenend", "shortened",
- "shortining", "shortening",
- "sidelinien", "sideline",
- "sidelinjen", "sideline",
- "sidelinked", "sideline",
- "sigantures", "signatures",
- "sightstine", "sightstone",
- "signficant", "significant",
- "signifiant", "significant",
- "significat", "significant",
- "signitures", "signatures",
- "sigthstone", "sightstone",
- "sihlouette", "silhouette",
- "silohuette", "silhouette",
- "silouhette", "silhouette",
- "similairty", "similarity",
- "similarily", "similarly",
- "similarlly", "similarly",
- "similiarly", "similarly",
- "similiarty", "similarity",
- "simliarity", "similarity",
- "simluation", "simulation",
- "simplictic", "simplistic",
- "simplifing", "simplifying",
- "simplifyed", "simplified",
- "simplifyng", "simplifying",
- "simplisitc", "simplistic",
- "simplisity", "simplicity",
- "simplistes", "simplest",
- "simplivity", "simplicity",
- "simplyfied", "simplified",
- "simualtion", "simulation",
- "simulacion", "simulation",
- "simulaiton", "simulations",
- "simulaties", "simulate",
- "simulative", "simulate",
- "simulatons", "simulations",
- "simulatore", "simulate",
- "sincereley", "sincerely",
- "sincerelly", "sincerely",
- "singatures", "signatures",
- "singulaire", "singular",
- "singulariy", "singularity",
- "singularty", "singularity",
- "singulator", "singular",
- "sitautions", "situations",
- "situatinal", "situational",
- "skatebaord", "skateboard",
- "skateborad", "skateboard",
- "skatebored", "skateboard",
- "skatebrand", "skateboard",
- "skeletones", "skeletons",
- "skeptecism", "skepticism",
- "skepticals", "skeptics",
- "skepticles", "skeptics",
- "skepticons", "skeptics",
- "skeptisicm", "skepticism",
- "skeptisism", "skepticism",
- "sketchysex", "sketches",
- "sketpicism", "skepticism",
- "skillhosts", "skillshots",
- "skillshits", "skillshots",
- "skillshoot", "skillshots",
- "skillslots", "skillshots",
- "skillsofts", "skillshots",
- "skillsshot", "skillshots",
- "skirmiches", "skirmish",
- "skpeticism", "skepticism",
- "slaughterd", "slaughtered",
- "slipperies", "slippers",
- "smarpthone", "smartphones",
- "smarthpone", "smartphone",
- "snadwiches", "sandwiches",
- "snowbaling", "snowballing",
- "snowballes", "snowballs",
- "snowballls", "snowballs",
- "socailists", "socialists",
- "socailized", "socialized",
- "socialisim", "socialism",
- "socializng", "socializing",
- "socialsits", "socialists",
- "sociapaths", "sociopaths",
- "socilaists", "socialists",
- "socilaized", "socialized",
- "sociologia", "sociological",
- "sociopatas", "sociopaths",
- "sociopatch", "sociopaths",
- "sociopatic", "sociopathic",
- "socratease", "socrates",
- "socreboard", "scoreboard",
- "soemthings", "somethings",
- "soldiarity", "solidarity",
- "solidairty", "solidarity",
- "soliditary", "solidarity",
- "solitudine", "solitude",
- "somehtings", "somethings",
- "someonelse", "someones",
- "somethibng", "somethin",
- "somethigng", "somethin",
- "somethigns", "somethings",
- "somethihng", "somethin",
- "somethiing", "somethin",
- "somethijng", "somethin",
- "somethikng", "somethin",
- "somethimng", "somethin",
- "somethinbg", "somethings",
- "somethines", "somethings",
- "somethinfg", "somethings",
- "somethinhg", "somethings",
- "somethinig", "somethings",
- "somethinkg", "somethings",
- "somethinks", "somethings",
- "somethinmg", "somethings",
- "somethinng", "somethings",
- "somethintg", "somethings",
- "somethiong", "somethin",
- "somethiung", "somethin",
- "sophicated", "sophisticated",
- "sotrmfront", "stormfront",
- "sotrylines", "storylines",
- "soudntrack", "soundtrack",
- "soundrtack", "soundtracks",
- "soundtracs", "soundtracks",
- "soundtrakc", "soundtracks",
- "soundtrakk", "soundtrack",
- "soundtraks", "soundtracks",
- "southampon", "southampton",
- "southamton", "southampton",
- "southerers", "southerners",
- "southernes", "southerners",
- "southerton", "southern",
- "souveniers", "souvenirs",
- "sovereigny", "sovereignty",
- "sovereinty", "sovereignty",
- "soverignty", "sovereignty",
- "spartaniis", "spartans",
- "spartanops", "spartans",
- "specailist", "specialist",
- "specailize", "specializes",
- "specialice", "specialize",
- "specialied", "specialized",
- "specialies", "specializes",
- "specialits", "specials",
- "speciallly", "specially",
- "speciallty", "specially",
- "specialops", "specials",
- "specialsts", "specialists",
- "specialtys", "specials",
- "specialzed", "specialized",
- "specialzes", "specializes",
- "specifices", "specifics",
- "specifiing", "specifying",
- "specifiyng", "specifying",
- "speciliast", "specialists",
- "specimines", "specimen",
- "spectarors", "spectators",
- "spectaters", "spectators",
- "spectracal", "spectral",
- "spectraply", "spectral",
- "spectrolab", "spectral",
- "speculatie", "speculative",
- "speculatin", "speculation",
- "speecheasy", "speeches",
- "speicalist", "specialist",
- "spiritualy", "spiritually",
- "sponsorees", "sponsors",
- "sponsorhip", "sponsorship",
- "sponsorise", "sponsors",
- "spontaneos", "spontaneous",
- "spontaneus", "spontaneous",
- "spontanous", "spontaneous",
- "spoonfulls", "spoonfuls",
- "spreadshet", "spreadsheet",
- "springfeld", "springfield",
- "springfied", "springfield",
- "spriritual", "spiritual",
- "squirrells", "squirrels",
- "squirrelus", "squirrels",
- "stabelized", "stabilized",
- "stabilzied", "stabilized",
- "stablility", "stability",
- "stablizied", "stabilized",
- "staggaring", "staggering",
- "stakeboard", "skateboard",
- "starighten", "straighten",
- "starnation", "starvation",
- "startegies", "strategies",
- "startupbus", "startups",
- "starwberry", "strawberry",
- "statememts", "statements",
- "statictics", "statistics",
- "stationair", "stationary",
- "statisitcs", "statistics",
- "statistcal", "statistical",
- "statistisk", "statistics",
- "stauration", "saturation",
- "stealthboy", "stealthy",
- "stealthely", "stealthy",
- "stealthify", "stealthy",
- "stealthray", "stealthy",
- "steeleries", "steelers",
- "stereotipe", "stereotype",
- "stereotpye", "stereotypes",
- "steriotype", "stereotype",
- "steroetype", "stereotype",
- "sterotypes", "stereotypes",
- "steryotype", "stereotype",
- "stimilants", "stimulants",
- "stimilated", "stimulated",
- "stimualted", "stimulated",
- "stimulatie", "stimulated",
- "stimulatin", "stimulation",
- "stimulaton", "stimulation",
- "stimulents", "stimulants",
- "stomrfront", "stormfront",
- "storelines", "storylines",
- "stormfornt", "stormfront",
- "stormfromt", "stormfront",
- "stornfront", "stormfront",
- "stornghold", "stronghold",
- "stradegies", "strategies",
- "strageties", "strategies",
- "straighted", "straightened",
- "straightie", "straighten",
- "straightin", "straighten",
- "straigthen", "straighten",
- "stranglove", "strangle",
- "strangreal", "strangle",
- "stratagies", "strategies",
- "strategems", "strategies",
- "strategice", "strategies",
- "strategisk", "strategies",
- "stravation", "starvation",
- "strawbarry", "strawberry",
- "strawbeary", "strawberry",
- "strawbeery", "strawberry",
- "strawbrary", "strawberry",
- "strawburry", "strawberry",
- "streaching", "stretching",
- "streamtrue", "streamer",
- "strechting", "stretching",
- "strecthing", "stretching",
- "stregnthen", "strengthen",
- "streichung", "stretching",
- "strenghten", "strengthen",
- "strengsten", "strengthen",
- "strengthes", "strengths",
- "strengthin", "strengthen",
- "stressende", "stressed",
- "striaghten", "straighten",
- "stromfront", "stormfront",
- "stronkhold", "stronghold",
- "stroylines", "storylines",
- "structered", "structured",
- "structrual", "structural",
- "structurel", "structural",
- "strucutral", "structural",
- "strucutred", "structured",
- "strucutres", "structures",
- "strugglign", "struggling",
- "strwaberry", "strawberry",
- "sttutering", "stuttering",
- "stupidfree", "stupider",
- "stupiditiy", "stupidity",
- "sturctural", "structural",
- "sturctures", "structures",
- "sturggling", "struggling",
- "subarmines", "submarines",
- "subcultuur", "subculture",
- "subesquent", "subsequent",
- "subisdized", "subsidized",
- "subjectief", "subjective",
- "subjectifs", "subjects",
- "subjectivy", "subjectively",
- "subjektive", "subjective",
- "submariens", "submarines",
- "submarinas", "submarines",
- "submergerd", "submerged",
- "submerines", "submarines",
- "submisison", "submissions",
- "submissies", "submissive",
- "submissons", "submissions",
- "submittion", "submitting",
- "subsadized", "subsidized",
- "subscirbed", "subscribed",
- "subscirber", "subscribers",
- "subscribar", "subscriber",
- "subscribir", "subscriber",
- "subscrible", "subscriber",
- "subscriped", "subscribed",
- "subscrubed", "subscribed",
- "subscryber", "subscriber",
- "subsedized", "subsidized",
- "subsequant", "subsequent",
- "subsidezed", "subsidized",
- "subsidiced", "subsidized",
- "subsidizng", "subsidizing",
- "subsiduary", "subsidiary",
- "subsiquent", "subsequent",
- "subsittute", "substitutes",
- "subsizided", "subsidized",
- "subsrcibed", "subscribed",
- "substanial", "substantial",
- "substansen", "substances",
- "substanser", "substances",
- "substanses", "substances",
- "substantie", "substantive",
- "substatial", "substantial",
- "substences", "substances",
- "substitite", "substitute",
- "substittue", "substitutes",
- "substitude", "substitute",
- "substitued", "substitute",
- "substituer", "substitute",
- "substitues", "substitutes",
- "substiture", "substitute",
- "substituto", "substitution",
- "substituts", "substitutes",
- "substracts", "subtracts",
- "substutite", "substitutes",
- "subsudized", "subsidized",
- "subtitltes", "subtitle",
- "succceeded", "succeeded",
- "succcesses", "successes",
- "succesfuly", "successfully",
- "succesions", "succession",
- "successing", "succession",
- "successivo", "succession",
- "sucesfully", "successfully",
- "sucessfull", "successful",
- "sucessfuly", "successfully",
- "sudnerland", "sunderland",
- "sufferered", "suffered",
- "sufferring", "suffering",
- "sufficiant", "sufficient",
- "suggestied", "suggestive",
- "suggestief", "suggestive",
- "suggestons", "suggests",
- "sumbarines", "submarines",
- "sumbissive", "submissive",
- "sumbitting", "submitting",
- "summerized", "summarized",
- "summorized", "summarized",
- "summurized", "summarized",
- "sunderlona", "sunderland",
- "sunderlund", "sunderland",
- "sungalsses", "sunglasses",
- "sunglesses", "sunglasses",
- "sunglinger", "gunslinger",
- "sunscreeen", "sunscreen",
- "superfical", "superficial",
- "superfluos", "superfluous",
- "superioara", "superior",
- "superioare", "superior",
- "superioris", "superiors",
- "superivsor", "supervisors",
- "supermaket", "supermarket",
- "supermarkt", "supermarket",
- "superouman", "superhuman",
- "superposer", "superpowers",
- "superviors", "supervisors",
- "superviosr", "supervisors",
- "supervisar", "supervisor",
- "superviser", "supervisor",
- "supervisin", "supervision",
- "supervison", "supervision",
- "supervsior", "supervisors",
- "supperssor", "suppressor",
- "supplament", "supplement",
- "supplemant", "supplemental",
- "supplemets", "supplements",
- "supportare", "supporters",
- "supporteur", "supporter",
- "supportied", "supported",
- "supportors", "supporters",
- "supposdely", "supposedly",
- "supposebly", "supposedly",
- "supposidly", "supposedly",
- "suppresion", "suppression",
- "suppresors", "suppressor",
- "suppressin", "suppression",
- "suppressio", "suppressor",
- "suppresson", "suppression",
- "suprassing", "surpassing",
- "supressing", "suppressing",
- "supression", "suppression",
- "supsension", "suspension",
- "supsicions", "suspicions",
- "supsicious", "suspicious",
- "surounding", "surrounding",
- "surplanted", "supplanted",
- "surpressed", "suppressed",
- "surprizing", "surprising",
- "surrenderd", "surrendered",
- "surrouding", "surrounding",
- "surroundes", "surrounds",
- "surroundig", "surroundings",
- "survivours", "survivor",
- "suseptable", "susceptible",
- "suseptible", "susceptible",
- "suspecions", "suspicions",
- "suspecious", "suspicious",
- "suspencion", "suspension",
- "suspendeds", "suspense",
- "suspention", "suspension",
- "suspicians", "suspicions",
- "suspiciois", "suspicions",
- "suspicioso", "suspicions",
- "suspicioun", "suspicion",
- "suspicison", "suspicions",
- "suspiciuos", "suspicions",
- "suspicsion", "suspicions",
- "suspisions", "suspicions",
- "suspisious", "suspicious",
- "suspitions", "suspicions",
- "sustainble", "sustainable",
- "swaetshirt", "sweatshirt",
- "swearengin", "swearing",
- "swearshirt", "sweatshirt",
- "sweathsirt", "sweatshirt",
- "sweatshits", "sweatshirt",
- "sweatshort", "sweatshirt",
- "sweatshrit", "sweatshirt",
- "sweerheart", "sweetheart",
- "sweetshart", "sweetheart",
- "switcheasy", "switches",
- "switzerand", "switzerland",
- "symapthize", "sympathize",
- "symbolisch", "symbolic",
- "symbolisim", "symbolism",
- "symetrical", "symmetrical",
- "sympatheic", "sympathetic",
- "sympathiek", "sympathize",
- "sympathien", "sympathize",
- "sympathtic", "sympathetic",
- "sympathyze", "sympathize",
- "sympethize", "sympathize",
- "symphatize", "sympathize",
- "symphonity", "symphony",
- "sympothize", "sympathize",
- "syncronous", "synchronous",
- "synomymous", "synonymous",
- "synomynous", "synonymous",
- "synonamous", "synonymous",
- "synonimous", "synonymous",
- "synonmyous", "synonymous",
- "synonomous", "synonymous",
- "synonumous", "synonymous",
- "synonynous", "synonymous",
- "sypmathize", "sympathize",
- "systamatic", "systematic",
- "systemetic", "systematic",
- "systemisch", "systemic",
- "systimatic", "systematic",
- "tabelspoon", "tablespoon",
- "tablespons", "tablespoons",
- "tablesppon", "tablespoon",
- "tacitcally", "tactically",
- "taiwanesse", "taiwanese",
- "taligating", "tailgating",
- "tantrumers", "tantrums",
- "targetting", "targeting",
- "teamfigths", "teamfights",
- "teamifghts", "teamfights",
- "teamspeack", "teamspeak",
- "techicians", "technicians",
- "techincian", "technician",
- "techinican", "technician",
- "techinques", "techniques",
- "technicain", "technician",
- "technicaly", "technically",
- "technicans", "technicians",
- "technichan", "technician",
- "technicien", "technician",
- "technicion", "technician",
- "technitian", "technician",
- "technqiues", "techniques",
- "techtician", "technician",
- "tehnically", "ethnically",
- "telegrapgh", "telegraph",
- "teleporing", "teleporting",
- "televesion", "television",
- "televisivo", "television",
- "temafights", "teamfights",
- "temerature", "temperature",
- "temperatue", "temperature",
- "temperment", "temperament",
- "temperture", "temperature",
- "templarios", "templars",
- "templarius", "templars",
- "temporaily", "temporarily",
- "temporarly", "temporary",
- "temptating", "temptation",
- "temptetion", "temptation",
- "tendancies", "tendencies",
- "tendencias", "tendencies",
- "tendencije", "tendencies",
- "tendensies", "tendencies",
- "tendincies", "tendencies",
- "tensionors", "tensions",
- "tentacreul", "tentacle",
- "termanator", "terminator",
- "termendous", "tremendous",
- "termiantor", "terminator",
- "termigator", "terminator",
- "terminales", "terminals",
- "terminalis", "terminals",
- "terminarla", "terminal",
- "terminarlo", "terminal",
- "terminaron", "terminator",
- "terminater", "terminator",
- "terminolgy", "terminology",
- "terorrists", "terrorists",
- "terrerists", "terrorists",
- "terrestial", "terrestrial",
- "terriblely", "terribly",
- "terriories", "territories",
- "territoral", "territorial",
- "territores", "territories",
- "territoris", "territories",
- "territorry", "territory",
- "terrorisim", "terrorism",
- "terrorsits", "terrorists",
- "terrurists", "terrorists",
- "testiclees", "testicles",
- "testiclies", "testicle",
- "testimoney", "testimony",
- "thankyooou", "thankyou",
- "themselfes", "themselves",
- "themsevles", "themselves",
- "themsleves", "themselves",
- "theocracry", "theocracy",
- "theologial", "theological",
- "therapetic", "therapeutic",
- "therepists", "therapists",
- "theripists", "therapists",
- "thermastat", "thermostat",
- "thermistat", "thermostat",
- "thermomter", "thermometer",
- "theromstat", "thermostat",
- "thorttling", "throttling",
- "thorughout", "throughout",
- "thouroghly", "thoroughly",
- "threadened", "threaded",
- "threatenes", "threatens",
- "threatning", "threatening",
- "threshhold", "threshold",
- "throthling", "throttling",
- "throtlling", "throttling",
- "throughiut", "throughput",
- "thubmnails", "thumbnails",
- "thumbmails", "thumbnails",
- "thunderbot", "thunderbolt",
- "thunderolt", "thunderbolt",
- "tighetning", "tightening",
- "tightining", "tightening",
- "tigthening", "tightening",
- "tjpanishad", "upanishad",
- "toothbruch", "toothbrush",
- "toothbruth", "toothbrush",
- "toothbursh", "toothbrush",
- "toothrbush", "toothbrush",
- "toppingest", "toppings",
- "torchilght", "torchlight",
- "torchlgiht", "torchlight",
- "torchligth", "torchlight",
- "torhclight", "torchlight",
- "torrentbig", "torrenting",
- "torrenters", "torrents",
- "torrentors", "torrents",
- "tortillera", "tortilla",
- "tortillias", "tortilla",
- "tortillita", "tortilla",
- "tortilllas", "tortilla",
- "torunament", "tournament",
- "totalitara", "totalitarian",
- "touchsceen", "touchscreen",
- "touchscren", "touchscreen",
- "touranment", "tournaments",
- "tourmanent", "tournaments",
- "tournamets", "tournaments",
- "tournamnet", "tournament",
- "tournemant", "tournament",
- "tournement", "tournament",
- "toxicitity", "toxicity",
- "trafficing", "trafficking",
- "trainwreak", "trainwreck",
- "traitorise", "traitors",
- "tramboline", "trampoline",
- "tramploine", "trampoline",
- "trampolene", "trampoline",
- "tranformed", "transformed",
- "tranistion", "transition",
- "tranlsated", "translated",
- "transalted", "translated",
- "transaltes", "translates",
- "transaltor", "translator",
- "transation", "transition",
- "transciprt", "transcripts",
- "transcirpt", "transcripts",
- "transcrips", "transcripts",
- "transcrito", "transcript",
- "transcrits", "transcripts",
- "transcrpit", "transcript",
- "transfered", "transferred",
- "transferer", "transferred",
- "transferes", "transfers",
- "transferrs", "transfers",
- "transferts", "transfers",
- "transfomed", "transformed",
- "transfored", "transformed",
- "transforme", "transfer",
- "transfroms", "transforms",
- "transgeder", "transgender",
- "transgener", "transgender",
- "transicion", "transition",
- "transision", "transition",
- "transister", "transistor",
- "transitons", "transitions",
- "transitors", "transistor",
- "transkript", "transcript",
- "translater", "translator",
- "translatin", "translations",
- "translatio", "translator",
- "translpant", "transplants",
- "transluent", "translucent",
- "transmited", "transmitted",
- "transmiter", "transmitter",
- "transmitor", "transistor",
- "transmorgs", "transforms",
- "transpalnt", "transplants",
- "transphoic", "transphobic",
- "transplain", "transplant",
- "transplate", "transplant",
- "transplats", "transplants",
- "transpoder", "transported",
- "transportr", "transporter",
- "transsexal", "transsexual",
- "transtator", "translator",
- "tranzistor", "transistor",
- "trasncript", "transcript",
- "trasnforms", "transforms",
- "trasnlated", "translated",
- "trasnlator", "translator",
- "trasnplant", "transplant",
- "traveleres", "travelers",
- "travelodge", "traveled",
- "traverlers", "traverse",
- "traversare", "traverse",
- "traversier", "traverse",
- "treasurery", "treasury",
- "trememdous", "tremendous",
- "tremondous", "tremendous",
- "trespasing", "trespassing",
- "trianwreck", "trainwreck",
- "trochlight", "torchlight",
- "trustworhy", "trustworthy",
- "trustworty", "trustworthy",
- "trustwothy", "trustworthy",
- "tryannical", "tyrannical",
- "tunraround", "turnaround",
- "tupparware", "tupperware",
- "turnapound", "turnaround",
- "turthfully", "truthfully",
- "tutoriales", "tutorials",
- "tyrantical", "tyrannical",
- "ubiqituous", "ubiquitous",
- "ubiquotous", "ubiquitous",
- "ubiqutious", "ubiquitous",
- "ukrainains", "ukrainians",
- "ukraineans", "ukrainians",
- "ukrainiens", "ukrainians",
- "ukraininas", "ukrainians",
- "ukrianians", "ukrainians",
- "ulitmately", "ultimately",
- "ulterioara", "ulterior",
- "ulterioare", "ulterior",
- "ultimative", "ultimate",
- "ultimatley", "ultimately",
- "ultimatuum", "ultimatum",
- "unanwsered", "unanswered",
- "unasnwered", "unanswered",
- "unattanded", "unattended",
- "unattented", "unattended",
- "unavailabe", "unavailable",
- "unavailble", "unavailable",
- "unavoidble", "unavoidable",
- "unawnsered", "unanswered",
- "unbalenced", "unbalanced",
- "unballance", "unbalance",
- "unbalnaced", "unbalanced",
- "unbareable", "unbearable",
- "unbeakable", "unbeatable",
- "unbeareble", "unbearable",
- "unbeatbale", "unbeatable",
- "unbeateble", "unbeatable",
- "unbeerable", "unbearable",
- "unbeetable", "unbeatable",
- "unbeknowst", "unbeknownst",
- "unbreakble", "unbreakable",
- "uncencored", "uncensored",
- "uncensered", "uncensored",
- "uncersored", "uncensored",
- "uncertainy", "uncertainty",
- "uncertanty", "uncertainty",
- "uncesnored", "uncensored",
- "uncomitted", "uncommitted",
- "uncommited", "uncommitted",
- "unconcious", "unconscious",
- "unconscous", "unconscious",
- "undebiably", "undeniably",
- "undeinable", "undeniable",
- "undeinably", "undeniably",
- "undenaible", "undeniable",
- "undenaibly", "undeniably",
- "undenyable", "undeniable",
- "undenyably", "undeniably",
- "underbaker", "undertaker",
- "undercling", "underlying",
- "underfaker", "undertaker",
- "undergated", "underrated",
- "undergrand", "undergrad",
- "undergroud", "underground",
- "undergrund", "underground",
- "undermimes", "undermines",
- "underminde", "undermines",
- "underminig", "undermining",
- "underneeth", "underneath",
- "underneith", "underneath",
- "undernieth", "underneath",
- "underpowed", "underpowered",
- "underraged", "underrated",
- "underraker", "undertaker",
- "underrater", "undertaker",
- "undersatnd", "understands",
- "understadn", "understands",
- "understans", "understands",
- "understnad", "understands",
- "understoon", "understood",
- "understsnd", "understands",
- "undertoker", "undertaker",
- "undertsand", "understands",
- "undertunes", "undertones",
- "underwager", "underwater",
- "underwares", "underwater",
- "underwolrd", "underworld",
- "underwoord", "underworld",
- "underwrold", "underworld",
- "underyling", "underlying",
- "undesrtand", "understands",
- "undoubtedy", "undoubtedly",
- "undoubtely", "undoubtedly",
- "undoubtley", "undoubtedly",
- "uneccesary", "unnecessary",
- "unecessary", "unnecessary",
- "unedcuated", "uneducated",
- "unedicated", "uneducated",
- "unempolyed", "unemployed",
- "unexplaind", "unexplained",
- "unexplaned", "unexplained",
- "unfamilair", "unfamiliar",
- "unfamilier", "unfamiliar",
- "unfinsihed", "unfinished",
- "unfirendly", "unfriendly",
- "unfortuate", "unfortunate",
- "unfreindly", "unfriendly",
- "unfriednly", "unfriendly",
- "unfriently", "unfriendly",
- "ungrapeful", "ungrateful",
- "ungreatful", "ungrateful",
- "unhealthly", "unhealthy",
- "unicornios", "unicorns",
- "unifnished", "unfinished",
- "unihabited", "uninhabited",
- "unilatreal", "unilateral",
- "unimporant", "unimportant",
- "unimpresed", "unimpressed",
- "unimpressd", "unimpressed",
- "uninsipred", "uninspired",
- "uninspried", "uninspired",
- "uninstaled", "uninstalled",
- "uniquiness", "uniqueness",
- "univercity", "university",
- "univeristy", "university",
- "universale", "universe",
- "universaly", "universally",
- "universels", "universes",
- "universets", "universes",
- "universite", "universities",
- "universtiy", "university",
- "unjustifed", "unjustified",
- "unknowingy", "unknowingly",
- "unknowinly", "unknowingly",
- "unnecesary", "unnecessary",
- "unofficail", "unofficial",
- "unoffocial", "unofficial",
- "unorginial", "unoriginal",
- "unorignial", "unoriginal",
- "unorigonal", "unoriginal",
- "unplacable", "unplayable",
- "unplaybale", "unplayable",
- "unplayeble", "unplayable",
- "unpleasent", "unpleasant",
- "unpopulair", "unpopular",
- "unproteced", "unprotected",
- "unqiueness", "uniqueness",
- "unqualifed", "unqualified",
- "unrealesed", "unreleased",
- "unrealible", "unreliable",
- "unrealistc", "unrealistic",
- "unrealitic", "unrealistic",
- "unreasonal", "unreasonably",
- "unrelaible", "unreliable",
- "unreleated", "unreleased",
- "unrelyable", "unreliable",
- "unrepetant", "unrepentant",
- "unrepetent", "unrepentant",
- "unresponse", "unresponsive",
- "unsencored", "uncensored",
- "unsetlling", "unsettling",
- "unsolicted", "unsolicited",
- "unsubscibe", "unsubscribe",
- "unsubscrbe", "unsubscribe",
- "unsucesful", "unsuccessful",
- "unsuprised", "unsurprised",
- "unsuprized", "unsurprised",
- "unviersity", "university",
- "unwrittern", "unwritten",
- "urkainians", "ukrainians",
- "utlimately", "ultimately",
- "utlrasound", "ultrasound",
- "vaccinatie", "vaccinated",
- "vaccineras", "vaccines",
- "valentians", "valentines",
- "valentiens", "valentines",
- "valentimes", "valentines",
- "valentinas", "valentines",
- "valentinos", "valentines",
- "valentones", "valentines",
- "validitity", "validity",
- "valnetines", "valentines",
- "vandalisim", "vandalism",
- "vasectomey", "vasectomy",
- "vegatarian", "vegetarian",
- "vegaterian", "vegetarian",
- "vegeratian", "vegetarians",
- "vegetairan", "vegetarians",
- "vegetarain", "vegetarians",
- "vegetarien", "vegetarian",
- "vegetarion", "vegetarian",
- "vegetatian", "vegetarian",
- "vegeterian", "vegetarian",
- "vegitables", "vegetables",
- "vehemantly", "vehemently",
- "vehemontly", "vehemently",
- "veitnamese", "vietnamese",
- "veiwership", "viewership",
- "veiwpoints", "viewpoints",
- "venezuella", "venezuela",
- "verificato", "verification",
- "verifyable", "verifiable",
- "veritcally", "vertically",
- "veritiable", "verifiable",
- "vernecular", "vernacular",
- "vernicular", "vernacular",
- "versatiliy", "versatility",
- "versatille", "versatile",
- "versatilty", "versatility",
- "versitlity", "versatility",
- "vewiership", "viewership",
- "vibratoare", "vibrator",
- "vicitmized", "victimized",
- "vicotrious", "victorious",
- "victemized", "victimized",
- "victomized", "victimized",
- "victorinos", "victorious",
- "victorinus", "victorious",
- "victoriosa", "victorious",
- "victorioso", "victorious",
- "victoriuos", "victorious",
- "victumized", "victimized",
- "videogaems", "videogames",
- "videojames", "videogames",
- "vidoegames", "videogames",
- "vientamese", "vietnamese",
- "vietmanese", "vietnamese",
- "vietnamees", "vietnamese",
- "vietnamise", "vietnamese",
- "viewpionts", "viewpoints",
- "vigilantie", "vigilante",
- "vigoruosly", "vigorously",
- "vigourosly", "vigorously",
- "villageois", "villages",
- "vindicitve", "vindictive",
- "vindictave", "vindictive",
- "visibiltiy", "visibility",
- "vitenamese", "vietnamese",
- "vocabluary", "vocabulary",
- "volatiltiy", "volatility",
- "volativity", "volatility",
- "volitality", "volatility",
- "volleyboll", "volleyball",
- "vollyeball", "volleyball",
- "volonteers", "volunteers",
- "volounteer", "volunteer",
- "voluntairy", "voluntarily",
- "voluntarly", "voluntary",
- "voluntears", "volunteers",
- "volunteeer", "volunteers",
- "volunteerd", "volunteered",
- "voluntered", "volunteered",
- "vulernable", "vulnerable",
- "vulnarable", "vulnerable",
- "vulnerabil", "vulnerable",
- "vulnurable", "vulnerable",
- "vunlerable", "vulnerable",
- "warrandyte", "warranty",
- "warrantles", "warranties",
- "warrenties", "warranties",
- "washignton", "washington",
- "waterlemon", "watermelon",
- "watermalon", "watermelon",
- "waterproff", "waterproof",
- "wavelegnth", "wavelength",
- "wavelenghs", "wavelength",
- "wavelenght", "wavelength",
- "weakensses", "weaknesses",
- "weaknesess", "weaknesses",
- "weathliest", "wealthiest",
- "wedensdays", "wednesdays",
- "wednesdsay", "wednesdays",
- "wednessday", "wednesdays",
- "wednsedays", "wednesdays",
- "weightened", "weighted",
- "welathiest", "wealthiest",
- "wellignton", "wellington",
- "wellingotn", "wellington",
- "wendesdays", "wednesdays",
- "wereabouts", "whereabouts",
- "westbroook", "westbrook",
- "westernese", "westerners",
- "westerness", "westerners",
- "westminser", "westminster",
- "westminter", "westminster",
- "whatosever", "whatsoever",
- "whatseover", "whatsoever",
- "whipsering", "whispering",
- "whsipering", "whispering",
- "widepsread", "widespread",
- "wikileakes", "wikileaks",
- "wilderniss", "wilderness",
- "wildreness", "wilderness",
- "willfullly", "willfully",
- "winchestor", "winchester",
- "windhsield", "windshield",
- "windsheild", "windshield",
- "windshiled", "windshield",
- "wisconsion", "wisconsin",
- "wishpering", "whispering",
- "withdrawan", "withdrawn",
- "withdrawel", "withdrawal",
- "withdrawin", "withdrawn",
- "withholdng", "withholding",
- "withrdawal", "withdrawals",
- "witnissing", "witnessing",
- "wonderfull", "wonderful",
- "wonderfuly", "wonderfully",
- "wonderwand", "wonderland",
- "worhsiping", "worshiping",
- "workingest", "workings",
- "workstaion", "workstation",
- "workstaton", "workstation",
- "worshippig", "worshipping",
- "worshoping", "worshiping",
- "wrestlewar", "wrestler",
- "xenohpobic", "xenophobic",
- "xenophibia", "xenophobia",
- "xenophibic", "xenophobic",
- "xenophonic", "xenophobic",
- "xenophopia", "xenophobia",
- "xenophopic", "xenophobic",
- "xeonphobia", "xenophobia",
- "xeonphobic", "xenophobic",
- "yourselfes", "yourselves",
- "yoursleves", "yourselves",
- "zimbabwaen", "zimbabwe",
- "zionistisk", "zionists",
- "abandonig", "abandoning",
- "abandonne", "abandonment",
- "abanonded", "abandoned",
- "abdomnial", "abdominal",
- "abdonimal", "abdominal",
- "aberation", "aberration",
- "abnormaly", "abnormally",
- "abodminal", "abdominal",
- "abondoned", "abandoned",
- "aborigene", "aborigine",
- "aboslutes", "absolutes",
- "abosrbing", "absorbing",
- "abreviate", "abbreviate",
- "abritrary", "arbitrary",
- "abruptley", "abruptly",
- "absailing", "abseiling",
- "absloutes", "absolutes",
- "absolutey", "absolutely",
- "absolutly", "absolutely",
- "absoultes", "absolutes",
- "abstracto", "abstraction",
- "absurdley", "absurdly",
- "absuridty", "absurdity",
- "abusrdity", "absurdity",
- "academica", "academia",
- "accademic", "academic",
- "accalimed", "acclaimed",
- "accelerar", "accelerator",
- "accending", "ascending",
- "accension", "accession",
- "accidenty", "accidently",
- "acclamied", "acclaimed",
- "accliamed", "acclaimed",
- "accomdate", "accommodate",
- "accordeon", "accordion",
- "accordian", "accordion",
- "accoridng", "according",
- "accountas", "accountants",
- "accountat", "accountants",
- "accoustic", "acoustic",
- "accroding", "according",
- "accuraccy", "accuracy",
- "acftually", "factually",
- "acheiving", "achieving",
- "achieveds", "achieves",
- "achillees", "achilles",
- "achilleos", "achilles",
- "achilleus", "achilles",
- "achiveing", "achieving",
- "acitvates", "activates",
- "aclhemist", "alchemist",
- "acomplish", "accomplish",
- "acquisito", "acquisition",
- "acronymes", "acronyms",
- "acronymns", "acronyms",
- "acsending", "ascending",
- "acsension", "ascension",
- "activaste", "activates",
- "activatin", "activation",
- "activelly", "actively",
- "activisim", "activism",
- "activisit", "activist",
- "activites", "activities",
- "actresess", "actresses",
- "acusation", "causation",
- "acutality", "actuality",
- "adavanced", "advanced",
- "adbominal", "abdominal",
- "additonal", "additional",
- "addoptive", "adoptive",
- "addresing", "addressing",
- "addtional", "additional",
- "adhearing", "adhering",
- "adherance", "adherence",
- "adjectivs", "adjectives",
- "adjustabe", "adjustable",
- "administr", "administer",
- "admitedly", "admittedly",
- "adolecent", "adolescent",
- "adovcated", "advocated",
- "adovcates", "advocates",
- "adquiring", "acquiring",
- "adresable", "addressable",
- "adressing", "addressing",
- "aduiobook", "audiobook",
- "advatange", "advantage",
- "adventurs", "adventures",
- "adveristy", "adversity",
- "advertisy", "adversity",
- "advisorys", "advisors",
- "aeorspace", "aerospace",
- "aeropsace", "aerospace",
- "aerosapce", "aerospace",
- "aersopace", "aerospace",
- "aestethic", "aesthetic",
- "aethistic", "atheistic",
- "affiliato", "affiliation",
- "affinitiy", "affinity",
- "affirmate", "affirmative",
- "affliated", "affiliated",
- "africanas", "africans",
- "africanos", "africans",
- "aggegrate", "aggregate",
- "aggresive", "aggressive",
- "agnosticm", "agnosticism",
- "agregates", "aggregates",
- "agreggate", "aggregate",
- "agrentina", "argentina",
- "agression", "aggression",
- "agressive", "aggressive",
- "agressvie", "agressive",
- "agruement", "arguement",
- "agruments", "arguments",
- "agurement", "arguement",
- "ailenated", "alienated",
- "airbourne", "airborne",
- "aircrafts", "aircraft",
- "airplance", "airplane",
- "airrcraft", "aircraft",
- "aksreddit", "askreddit",
- "alcehmist", "alchemist",
- "alchemsit", "alchemist",
- "alchimest", "alchemist",
- "alchmeist", "alchemist",
- "alchoolic", "alcoholic",
- "alcoholis", "alcoholics",
- "alechmist", "alchemist",
- "alegience", "allegiance",
- "aleinated", "alienated",
- "algoriths", "algorithms",
- "algoritms", "algorithms",
- "algorthim", "algorithm",
- "algortihm", "algorithm",
- "alignemnt", "alignment",
- "alimunium", "aluminium",
- "alingment", "alignment",
- "allainces", "alliances",
- "alledgely", "allegedly",
- "allegence", "allegiance",
- "alleivate", "alleviate",
- "allievate", "alleviate",
- "alliviate", "alleviate",
- "allopones", "allophones",
- "allthough", "although",
- "almightly", "almighty",
- "alocholic", "alcoholic",
- "alogrithm", "algorithm",
- "alphabeat", "alphabet",
- "alrightey", "alrighty",
- "alrightly", "alrighty",
- "alrightty", "alrighty",
- "alrington", "arlington",
- "alrorythm", "algorithm",
- "alterante", "alternate",
- "alternatr", "alternator",
- "althetics", "athletics",
- "althought", "although",
- "altruisim", "altruism",
- "amateures", "amateurs",
- "ambluance", "ambulance",
- "ambuigity", "ambiguity",
- "amendmant", "amendment",
- "amercians", "americans",
- "americain", "american",
- "americams", "americas",
- "americaps", "americas",
- "americats", "americas",
- "amibguity", "ambiguity",
- "aminosity", "animosity",
- "amrstrong", "armstrong",
- "amublance", "ambulance",
- "amunition", "ammunition",
- "anachrist", "anarchist",
- "analagous", "analogous",
- "analitycs", "analytics",
- "analtyics", "analytics",
- "analyitcs", "analytics",
- "analyseas", "analyses",
- "analysees", "analyses",
- "analysens", "analyses",
- "analysise", "analyses",
- "analystes", "analysts",
- "analzying", "analyzing",
- "anarchsim", "anarchism",
- "anayltics", "analytics",
- "anaylzing", "analyzing",
- "ancedotal", "anecdotal",
- "ancedotes", "anecdotes",
- "ancestory", "ancestry",
- "androgeny", "androgyny",
- "androides", "androids",
- "androidos", "androids",
- "anecdotle", "anecdote",
- "anecodtal", "anecdotal",
- "anecodtes", "anecdotes",
- "anectodal", "anecdotal",
- "anectodes", "anecdotes",
- "anedoctal", "anecdotal",
- "anedoctes", "anecdotes",
- "animostiy", "animosity",
- "anitvirus", "antivirus",
- "anlaytics", "analytics",
- "anniversy", "anniversary",
- "annointed", "anointed",
- "annoucnes", "announces",
- "annoyingy", "annoyingly",
- "annoymous", "anonymous",
- "annoynace", "annoyance",
- "annyoance", "annoyance",
- "anomisity", "animosity",
- "anomolies", "anomalies",
- "anomolous", "anomalous",
- "anomynity", "anonymity",
- "anomynous", "anonymous",
- "anonimity", "anonymity",
- "anonmyous", "anonymous",
- "anonymoys", "anonymously",
- "anorexiac", "anorexic",
- "anorexica", "anorexia",
- "anrachist", "anarchist",
- "ansestors", "ancestors",
- "antarctia", "antarctica",
- "antennaes", "antennas",
- "antiviurs", "antivirus",
- "antivrius", "antivirus",
- "antivuris", "antivirus",
- "anwsering", "answering",
- "anynomity", "anonymity",
- "anynomous", "anonymous",
- "aparthide", "apartheid",
- "aparthied", "apartheid",
- "apartmens", "apartments",
- "apocalype", "apocalypse",
- "apostrope", "apostrophe",
- "apparenty", "apparently",
- "appearane", "appearances",
- "appenines", "apennines",
- "apperance", "appearance",
- "appetitie", "appetite",
- "applaudes", "applause",
- "applicato", "application",
- "appreciae", "appreciates",
- "apprentie", "apprentice",
- "approachs", "approaches",
- "apratheid", "apartheid",
- "apsaragus", "asparagus",
- "apsergers", "aspergers",
- "aquainted", "acquainted",
- "arbirtary", "arbitrary",
- "arbritary", "arbitrary",
- "arcehtype", "archetype",
- "archetect", "architect",
- "archetpye", "archetype",
- "archetyps", "archetypes",
- "architecs", "architects",
- "archtypes", "archetypes",
- "aregument", "arguement",
- "areospace", "aerospace",
- "argessive", "agressive",
- "argeument", "arguement",
- "arguabley", "arguably",
- "arguablly", "arguably",
- "arguement", "argument",
- "arguemnet", "arguement",
- "arguemnts", "arguments",
- "argumeent", "arguement",
- "arhtritis", "arthritis",
- "aribtrary", "arbitrary",
- "ariplanes", "airplanes",
- "aristolte", "aristotle",
- "aristotel", "aristotle",
- "aritfacts", "artifacts",
- "arlignton", "arlington",
- "arlingotn", "arlington",
- "armistace", "armistice",
- "armstorng", "armstrong",
- "arpatheid", "apartheid",
- "arthirtis", "arthritis",
- "artifcats", "artifacts",
- "artifical", "artificial",
- "artillary", "artillery",
- "arugement", "arguement",
- "arugments", "arguments",
- "asapragus", "asparagus",
- "asbestoes", "asbestos",
- "asborbing", "absorbing",
- "asburdity", "absurdity",
- "ascendend", "ascended",
- "ascneding", "ascending",
- "ascnesion", "ascension",
- "asethetic", "aesthetic",
- "asnwering", "answering",
- "asociated", "associated",
- "assasined", "assassinated",
- "assassian", "assassin",
- "assassine", "assassinate",
- "assasssin", "assassins",
- "assaultes", "assaults",
- "assembeld", "assembled",
- "assembley", "assembly",
- "assemblie", "assemble",
- "assisnate", "assassinate",
- "assistans", "assistants",
- "assistsnt", "assistants",
- "assmebled", "assembled",
- "associato", "association",
- "assoicate", "associate",
- "asssasins", "assassins",
- "assualted", "assaulted",
- "assulated", "assaulted",
- "asteorids", "asteroids",
- "astericks", "asterisk",
- "asteriods", "asteroids",
- "astroanut", "astronaut",
- "astronuat", "astronaut",
- "astrounat", "astronaut",
- "asuterity", "austerity",
- "atempting", "attempting",
- "atheltics", "athletics",
- "atheneans", "athenians",
- "athesitic", "atheistic",
- "athetlics", "athletics",
- "athiestic", "atheistic",
- "athleticm", "athleticism",
- "atmosphir", "atmospheric",
- "atributed", "attributed",
- "atributes", "attributes",
- "atrifacts", "artifacts",
- "atrillery", "artillery",
- "atrittion", "attrition",
- "attachmet", "attachments",
- "attaindre", "attainder",
- "attemting", "attempting",
- "attemtped", "attempted",
- "attendent", "attendant",
- "attension", "attention",
- "attirbute", "attribute",
- "attirtion", "attrition",
- "attmepted", "attempted",
- "attractes", "attracts",
- "attractin", "attraction",
- "attributo", "attribution",
- "attributs", "attributes",
- "attritube", "attribute",
- "auctionrs", "auctions",
- "auidobook", "audiobook",
- "auromated", "automated",
- "australin", "australians",
- "authroity", "authority",
- "autoattak", "autoattack",
- "autogrpah", "autograph",
- "autonomos", "autonomous",
- "auxillary", "auxiliary",
- "avaialble", "available",
- "availible", "available",
- "avalaible", "available",
- "avaliable", "available",
- "averageed", "averaged",
- "avialable", "available",
- "awakenend", "awakened",
- "awesomley", "awesomely",
- "awkawrdly", "awkwardly",
- "awnsering", "answering",
- "bacehlors", "bachelors",
- "bachelour", "bachelor",
- "bachleors", "bachelors",
- "bacholers", "bachelors",
- "backdooor", "backdoor",
- "backfeild", "backfield",
- "backfiled", "backfield",
- "backgroud", "background",
- "backpakcs", "backpacks",
- "badnwagon", "bandwagon",
- "badnwidth", "bandwidth",
- "balckjack", "blackjack",
- "balcklist", "blacklist",
- "balitmore", "baltimore",
- "ballisitc", "ballistic",
- "ballsitic", "ballistic",
- "balsphemy", "blasphemy",
- "bandiwdth", "bandwidth",
- "bandwdith", "bandwidth",
- "bandwidht", "bandwidth",
- "bandwitdh", "bandwidth",
- "bankrupcy", "bankruptcy",
- "bankrupty", "bankruptcy",
- "banruptcy", "bankruptcy",
- "baordwalk", "boardwalk",
- "barabrian", "barbarian",
- "barbarain", "barbarian",
- "barbarina", "barbarian",
- "barcelets", "bracelets",
- "barcleona", "barcelona",
- "bareclona", "barcelona",
- "barrackus", "barracks",
- "bascially", "basically",
- "bastardes", "bastards",
- "bastardos", "bastards",
- "bastardus", "bastards",
- "bathrooom", "bathroom",
- "batlimore", "baltimore",
- "battailon", "battalion",
- "battlaion", "battalion",
- "beahviour", "behaviour",
- "beauitful", "beautiful",
- "beautifyl", "beautifully",
- "becnhmark", "benchmark",
- "becomeing", "becoming",
- "becomming", "becoming",
- "beehtoven", "beethoven",
- "begginers", "beginners",
- "beggining", "beginning",
- "begininng", "beginning",
- "beginnins", "beginnings",
- "behaivors", "behaviors",
- "behaivour", "behaviour",
- "behavoirs", "behaviors",
- "behavoiur", "behaviour",
- "behvaiour", "behaviour",
- "beleiving", "believing",
- "beliveing", "believing",
- "belssings", "blessings",
- "bemusemnt", "bemusement",
- "benchamrk", "benchmark",
- "benchmars", "benchmarks",
- "benedicat", "benedict",
- "benedickt", "benedict",
- "benghazhi", "benghazi",
- "benghazzi", "benghazi",
- "bergamont", "bergamot",
- "berkelely", "berkeley",
- "bersekrer", "berserker",
- "berskerer", "berserker",
- "beseiging", "besieging",
- "bestialiy", "bestiality",
- "beuatiful", "beautiful",
- "biginning", "beginning",
- "bigrading", "brigading",
- "billbaord", "billboard",
- "billboars", "billboards",
- "binominal", "binomial",
- "birgading", "brigading",
- "birghtest", "brightest",
- "birhtdays", "birthdays",
- "bitcoints", "bitcoins",
- "blackbery", "blackberry",
- "blackhaws", "blackhawks",
- "blackshit", "blacksmith",
- "blanketts", "blankets",
- "blapshemy", "blasphemy",
- "blashpemy", "blasphemy",
- "blaspehmy", "blasphemy",
- "blasphmey", "blasphemy",
- "blatanlty", "blatantly",
- "blatimore", "baltimore",
- "bleuberry", "blueberry",
- "bleutooth", "bluetooth",
- "blisteres", "blisters",
- "blizzcoin", "blizzcon",
- "blockchan", "blockchain",
- "blockeras", "blockers",
- "bloodbore", "bloodborne",
- "boardband", "broadband",
- "boardcast", "broadcast",
- "bodyweigt", "bodyweight",
- "bookamrks", "bookmarks",
- "bookmakrs", "bookmarks",
- "bookmarkd", "bookmarked",
- "boradband", "broadband",
- "boradcast", "broadcast",
- "boradwalk", "boardwalk",
- "bouregois", "bourgeois",
- "bourgeios", "bourgeois",
- "bourgoeis", "bourgeois",
- "boyfirend", "boyfriend",
- "boyfreind", "boyfriend",
- "boyfriens", "boyfriends",
- "brabarian", "barbarian",
- "bracelona", "barcelona",
- "braodband", "broadband",
- "braodcast", "broadcast",
- "brazilias", "brazilians",
- "breakdows", "breakdowns",
- "breserker", "berserker",
- "bretheren", "brethren",
- "bridaging", "brigading",
- "brightern", "brighten",
- "brigthest", "brightest",
- "brilliany", "brilliantly",
- "brithdays", "birthdays",
- "broadwalk", "boardwalk",
- "bruiseres", "bruisers",
- "brunettte", "brunette",
- "brusseles", "brussels",
- "brussells", "brussels",
- "brutailty", "brutality",
- "brutallly", "brutally",
- "buddhisim", "buddhism",
- "buddihsts", "buddhists",
- "buddishts", "buddhists",
- "buhddists", "buddhists",
- "buidlings", "buildings",
- "bulidings", "buildings",
- "burgunday", "burgundy",
- "burgundry", "burgundy",
- "burritoes", "burritos",
- "burtality", "brutality",
- "busineses", "business",
- "businessa", "businessman",
- "businesse", "businessmen",
- "businesss", "businesses",
- "bussiness", "business",
- "buthcered", "butchered",
- "butterlfy", "butterfly",
- "cacausian", "caucasian",
- "caclulate", "calculate",
- "cacuasian", "caucasian",
- "caculater", "calculator",
- "cafeteira", "cafeteria",
- "cafetiera", "cafeteria",
- "caffeinne", "caffeine",
- "calcualte", "calculate",
- "californa", "california",
- "caluclate", "calculate",
- "calulated", "calculated",
- "calulater", "calculator",
- "cambirdge", "cambridge",
- "cambrdige", "cambridge",
- "cambrigde", "cambridge",
- "camoflage", "camouflage",
- "campagins", "campaigns",
- "campaings", "campaigns",
- "campiagns", "campaigns",
- "campusers", "campuses",
- "camrbidge", "cambridge",
- "canadains", "canadians",
- "candadate", "candidate",
- "candidats", "candidates",
- "cannister", "canister",
- "cannoical", "canonical",
- "canoncial", "canonical",
- "capactior", "capacitor",
- "capicator", "capacitor",
- "capitalis", "capitals",
- "caprenter", "carpenter",
- "capsulers", "capsules",
- "capsulets", "capsules",
- "carachter", "character",
- "cardbaord", "cardboard",
- "cardborad", "cardboard",
- "cardianls", "cardinals",
- "cardnials", "cardinals",
- "caridnals", "cardinals",
- "carmalite", "carmelite",
- "carnberry", "cranberry",
- "carolinia", "carolina",
- "carpetner", "carpenter",
- "carptener", "carpenter",
- "carribean", "caribbean",
- "cartdrige", "cartridge",
- "cartilege", "cartilage",
- "cartirdge", "cartridge",
- "cartrdige", "cartridge",
- "cartrigde", "cartridge",
- "casaulity", "causality",
- "cashieres", "cashiers",
- "cassawory", "cassowary",
- "cassettte", "cassette",
- "casuation", "causation",
- "cataclsym", "cataclysm",
- "cataclyms", "cataclysm",
- "catacylsm", "cataclysm",
- "catacyslm", "cataclysm",
- "catalcysm", "cataclysm",
- "catalgoue", "catalogue",
- "cathderal", "cathedral",
- "catherdal", "cathedral",
- "cathloics", "catholics",
- "cathredal", "cathedral",
- "caucaisan", "caucasian",
- "caucasain", "caucasian",
- "causacian", "caucasian",
- "causailty", "causality",
- "celebirty", "celebrity",
- "celebrato", "celebration",
- "celebrite", "celebrities",
- "celesital", "celestial",
- "celestail", "celestial",
- "cementary", "cemetery",
- "cemetarey", "cemetery",
- "cenitpede", "centipede",
- "centepide", "centipede",
- "centipeed", "centipede",
- "centruies", "centuries",
- "centuties", "centuries",
- "cerebrawl", "cerebral",
- "certanity", "certainty",
- "certianty", "certainty",
- "cesspoool", "cesspool",
- "chairmain", "chairman",
- "challange", "challenge",
- "challengr", "challenger",
- "challengs", "challenges",
- "chameloen", "chameleon",
- "champagen", "champagne",
- "champange", "champagne",
- "chandlure", "chandler",
- "changable", "changeable",
- "charactor", "character",
- "chatedral", "cathedral",
- "chatolics", "catholics",
- "checkmeat", "checkmate",
- "checkpoit", "checkpoints",
- "chekcmate", "checkmate",
- "chemestry", "chemistry",
- "chemicaly", "chemically",
- "chemsitry", "chemistry",
- "chernboyl", "chernobyl",
- "chernobly", "chernobyl",
- "chernoybl", "chernobyl",
- "chernyobl", "chernobyl",
- "cheronbyl", "chernobyl",
- "chidlfree", "childfree",
- "chidlrens", "childrens",
- "chihauhua", "chihuahua",
- "chihuahau", "chihuahua",
- "childbird", "childbirth",
- "childerns", "childrens",
- "childisch", "childish",
- "childresn", "childrens",
- "chirstian", "christian",
- "chirstmas", "christmas",
- "chiuhahua", "chihuahua",
- "chlidfree", "childfree",
- "chlidrens", "childrens",
- "chocloate", "chocolate",
- "chocoalte", "chocolate",
- "chocolats", "chocolates",
- "chocolste", "chocolates",
- "cholocate", "chocolate",
- "chrenobyl", "chernobyl",
- "chrisitan", "christian",
- "christain", "christian",
- "christams", "christmas",
- "chrsitian", "christian",
- "chrsitmas", "christmas",
- "churchers", "churches",
- "cigaretts", "cigarettes",
- "cigeratte", "cigarette",
- "cilivians", "civilians",
- "cilpboard", "clipboard",
- "cilynders", "cylinders",
- "circuitos", "circuits",
- "ciriculum", "curriculum",
- "cirticise", "criticise",
- "civilains", "civilians",
- "civillian", "civilian",
- "classicos", "classics",
- "classicus", "classics",
- "classifiy", "classify",
- "cleanisng", "cleansing",
- "cleasning", "cleansing",
- "clikcbait", "clickbait",
- "clinicaly", "clinically",
- "clipbaord", "clipboard",
- "clitories", "clitoris",
- "clitorios", "clitoris",
- "clitorius", "clitoris",
- "clucthing", "clutching",
- "clutchign", "clutching",
- "cluthcing", "clutching",
- "coca cola", "coca-cola",
- "cockatils", "cocktails",
- "cocktials", "cocktails",
- "cognizent", "cognizant",
- "colateral", "collateral",
- "collabore", "collaborate",
- "collasped", "collapsed",
- "collaspes", "collapses",
- "colleauge", "colleague",
- "collectes", "collects",
- "collectie", "collective",
- "collecton", "collection",
- "collectos", "collectors",
- "collegaue", "colleague",
- "collegues", "colleagues",
- "collisson", "collisions",
- "collonade", "colonnade",
- "collonies", "colonies",
- "collpased", "collapsed",
- "collpases", "collapses",
- "colombina", "colombia",
- "columbina", "columbia",
- "comapnies", "companies",
- "combatans", "combatants",
- "combinato", "combination",
- "combusion", "combustion",
- "comestics", "cosmetics",
- "comisions", "commissions",
- "comission", "commission",
- "comitting", "committing",
- "commandes", "commands",
- "commentar", "commentator",
- "commentes", "commenters",
- "commercie", "commerce",
- "commision", "commission",
- "commiteed", "commited",
- "commiting", "committing",
- "commitmet", "commitments",
- "commongly", "commonly",
- "communiss", "communists",
- "communite", "communities",
- "communits", "communist",
- "communsim", "communism",
- "compaines", "companies",
- "compalins", "complains",
- "compalint", "compliant",
- "comparisn", "comparisons",
- "compeltes", "completes",
- "competant", "competent",
- "competend", "competed",
- "competion", "competition",
- "competive", "competitive",
- "compilant", "compliant",
- "compilare", "compiler",
- "compilato", "compilation",
- "compitent", "competent",
- "complaind", "complained",
- "complaing", "complaining",
- "completen", "complement",
- "completey", "completely",
- "completin", "completion",
- "complians", "complains",
- "componant", "component",
- "comprable", "comparable",
- "compresas", "compress",
- "compreses", "compress",
- "compteurs", "computers",
- "comptuers", "computers",
- "computato", "computation",
- "comradets", "comrades",
- "comsetics", "cosmetics",
- "conanical", "canonical",
- "conatiner", "container",
- "concelaed", "concealed",
- "concelaer", "concealer",
- "concelear", "concealer",
- "concensus", "consensus",
- "conceptos", "concepts",
- "conceptul", "conceptual",
- "concernig", "concerning",
- "concertas", "concerts",
- "concevied", "conceived",
- "conciders", "considers",
- "concieted", "conceited",
- "concieved", "conceived",
- "conclusie", "conclusive",
- "concsious", "conscious",
- "concurret", "concurrent",
- "condamned", "condemned",
- "condemend", "condemned",
- "condemmed", "condemned",
- "condemnig", "condemning",
- "condenmed", "condemned",
- "condesend", "condensed",
- "condesned", "condensed",
- "condmened", "condemned",
- "conection", "connection",
- "conenctor", "connector",
- "conferene", "conferences",
- "confessin", "confession",
- "confideny", "confidently",
- "confilcts", "conflicts",
- "confimred", "confirmed",
- "confirmas", "confirms",
- "conflcits", "conflicts",
- "confrimed", "confirmed",
- "congitive", "cognitive",
- "conlcuded", "concluded",
- "connectes", "connects",
- "connectit", "connecticut",
- "connectos", "connectors",
- "conquerer", "conqueror",
- "consdider", "consider",
- "consensul", "consensual",
- "conserned", "concerned",
- "consicous", "conscious",
- "considerd", "considered",
- "considert", "considerate",
- "consisent", "consistent",
- "consistes", "consists",
- "consolato", "consolation",
- "consolide", "consolidate",
- "consonent", "consonant",
- "constanly", "constantly",
- "constanst", "constants",
- "constanty", "constantly",
- "constasnt", "constants",
- "constitue", "constitutes",
- "constrait", "constraints",
- "construcs", "constructs",
- "construde", "construed",
- "construst", "constructs",
- "constured", "construed",
- "consulant", "consultant",
- "consultat", "consultant",
- "consumate", "consummate",
- "contactes", "contacts",
- "contactos", "contacts",
- "contagios", "contagious",
- "containes", "contains",
- "containig", "containing",
- "containts", "contains",
- "contemple", "contemplate",
- "contendor", "contender",
- "contentas", "contents",
- "contentes", "contents",
- "contentos", "contents",
- "contestas", "contests",
- "contestat", "contestants",
- "contestes", "contests",
- "contextes", "contexts",
- "contextos", "contexts",
- "contianer", "container",
- "contibute", "contribute",
- "contigent", "contingent",
- "continant", "continental",
- "continens", "continents",
- "continous", "continuous",
- "continuos", "continuous",
- "continute", "continue",
- "contiunal", "continual",
- "contracto", "contraction",
- "contribue", "contribute",
- "contribuo", "contributor",
- "controlas", "controls",
- "controled", "controlled",
- "controles", "controls",
- "controlls", "controls",
- "convenant", "covenant",
- "convencen", "convenience",
- "conveniet", "convenient",
- "conversie", "converse",
- "conversin", "conversions",
- "convertie", "convertible",
- "convertis", "converts",
- "cooldwons", "cooldowns",
- "coordinar", "coordinator",
- "copenhagn", "copenhagen",
- "coprorate", "corporate",
- "copywrite", "copyright",
- "corcodile", "crocodile",
- "corparate", "corporate",
- "corproate", "corporate",
- "correclty", "correctly",
- "correctin", "correction",
- "correlato", "correlation",
- "corridoor", "corridor",
- "corruptin", "corruption",
- "corssfire", "crossfire",
- "corsshair", "crosshair",
- "corsspost", "crosspost",
- "coruching", "crouching",
- "cosemtics", "cosmetics",
- "costumise", "costumes",
- "counciles", "councils",
- "councills", "councils",
- "councilos", "councils",
- "countains", "contains",
- "counteres", "counters",
- "countires", "countries",
- "courching", "crouching",
- "courtesey", "courtesy",
- "courtesty", "courtesy",
- "coururier", "courier",
- "coutnered", "countered",
- "crapenter", "carpenter",
- "creativey", "creatively",
- "creedence", "credence",
- "crhistmas", "christmas",
- "cricketts", "crickets",
- "criminaly", "criminally",
- "critereon", "criterion",
- "criterias", "criteria",
- "criticaly", "critically",
- "criticies", "criticise",
- "criticisn", "criticising",
- "critisice", "criticise",
- "critisicm", "criticism",
- "critising", "criticising",
- "critisism", "criticism",
- "critisize", "criticise",
- "critizing", "criticizing",
- "crosshiar", "crosshair",
- "crossifre", "crossfire",
- "crticised", "criticised",
- "crusdaers", "crusaders",
- "crutchers", "crutches",
- "crystalls", "crystals",
- "crystalus", "crystals",
- "crystalys", "crystals",
- "cuacasian", "caucasian",
- "cuasality", "causality",
- "culitvate", "cultivate",
- "culturaly", "culturally",
- "culturels", "cultures",
- "curiostiy", "curiosity",
- "curisoity", "curiosity",
- "currenlty", "currently",
- "curriculm", "curriculum",
- "cursaders", "crusaders",
- "custcenes", "cutscenes",
- "cutsceens", "cutscenes",
- "cutscence", "cutscene",
- "cutsences", "cutscenes",
- "cyclinder", "cylinder",
- "cyclistes", "cyclists",
- "cylindres", "cylinders",
- "cynicisim", "cynicism",
- "dahsboard", "dashboard",
- "dalmation", "dalmatian",
- "dangeroys", "dangerously",
- "dashbaord", "dashboard",
- "daugthers", "daughters",
- "davantage", "advantage",
- "deadlfits", "deadlifts",
- "deadpoool", "deadpool",
- "dealershp", "dealerships",
- "deathmath", "deathmatch",
- "decalring", "declaring",
- "decendant", "descendant",
- "decendent", "descendant",
- "decipting", "depicting",
- "deciption", "depiction",
- "decisivie", "decisive",
- "declarase", "declares",
- "declarees", "declares",
- "decoratie", "decorative",
- "decoratin", "decorations",
- "decpetion", "deception",
- "decpetive", "deceptive",
- "decribing", "describing",
- "decsended", "descended",
- "deductibe", "deductible",
- "defaintly", "defiantly",
- "defaltion", "deflation",
- "defanitly", "defiantly",
- "defeintly", "definetly",
- "defendent", "defendant",
- "defensese", "defenseless",
- "defianlty", "defiantly",
- "deficeint", "deficient",
- "deficieny", "deficiency",
- "deficites", "deficits",
- "definance", "defiance",
- "definatey", "definately",
- "definatly", "definitely",
- "definetly", "definitely",
- "definetyl", "definetly",
- "definilty", "definitly",
- "definitie", "definitive",
- "definitin", "definitions",
- "definitly", "definitely",
- "definiton", "definition",
- "definitve", "definite",
- "definityl", "definitly",
- "definltey", "definetly",
- "defintaly", "defiantly",
- "defintily", "definitly",
- "defintion", "definition",
- "defintley", "definetly",
- "defitenly", "definetly",
- "defitinly", "definitly",
- "defitnaly", "defiantly",
- "defitnely", "definetly",
- "deflectin", "deflection",
- "defnietly", "definetly",
- "degeneret", "degenerate",
- "degradato", "degradation",
- "degradead", "degraded",
- "degrassie", "degrasse",
- "degrassse", "degrasse",
- "deifnetly", "definetly",
- "deifnitly", "definitly",
- "deisgners", "designers",
- "delagates", "delegates",
- "delcaring", "declaring",
- "delcining", "declining",
- "delegatie", "delegate",
- "delerious", "delirious",
- "delfation", "deflation",
- "deliveres", "delivers",
- "deliverys", "delivers",
- "delpoying", "deploying",
- "demcorats", "democrats",
- "deminsion", "dimension",
- "democarcy", "democracy",
- "democract", "democrat",
- "demonstre", "demonstrate",
- "denominar", "denominator",
- "dentistas", "dentists",
- "dentistes", "dentists",
- "deomcrats", "democrats",
- "deopsited", "deposited",
- "deparment", "department",
- "departmet", "departments",
- "depciting", "depicting",
- "depcition", "depiction",
- "depection", "deception",
- "depedency", "dependency",
- "depicitng", "depicting",
- "depiciton", "depiction",
- "deplyoing", "deploying",
- "depoisted", "deposited",
- "depolying", "deploying",
- "depositas", "deposits",
- "deposites", "deposits",
- "depositis", "deposits",
- "depositos", "deposits",
- "depostied", "deposited",
- "depressie", "depressive",
- "depressin", "depression",
- "depserate", "desperate",
- "depsoited", "deposited",
- "descirbes", "describes",
- "descision", "decision",
- "desginers", "designers",
- "desgining", "designing",
- "desicions", "decisions",
- "designade", "designated",
- "designato", "designation",
- "desingage", "disengage",
- "desingers", "designers",
- "desinging", "designing",
- "desktopos", "desktops",
- "desparate", "desperate",
- "desperato", "desperation",
- "despoited", "deposited",
- "desriable", "desirable",
- "dessigned", "designed",
- "destinato", "destination",
- "destoryed", "destroyed",
- "destoryer", "destroyer",
- "destroyes", "destroys",
- "destructo", "destruction",
- "destryoed", "destroyed",
- "destryoer", "destroyer",
- "desuction", "seduction",
- "detailled", "detailed",
- "detatched", "detached",
- "detectivs", "detectives",
- "deteriate", "deteriorate",
- "determing", "determining",
- "determins", "determines",
- "developrs", "develops",
- "diabetees", "diabetes",
- "diablical", "diabolical",
- "diagonaal", "diagonal",
- "diagonsed", "diagnosed",
- "diagonsis", "diagnosis",
- "diagramas", "diagrams",
- "diagramms", "diagrams",
- "dialectes", "dialects",
- "dialectos", "dialects",
- "diarrheoa", "diarrhea",
- "diasbling", "disabling",
- "dichomoty", "dichotomy",
- "dicovered", "discovered",
- "dictaters", "dictates",
- "dictionay", "dictionary",
- "difenitly", "definitly",
- "diferrent", "different",
- "differene", "differences",
- "differens", "differences",
- "differeny", "differently",
- "difficuly", "difficulty",
- "diffucult", "difficult",
- "dificulty", "difficulty",
- "diganosed", "diagnosed",
- "diganosis", "diagnosis",
- "dimenions", "dimensions",
- "dimention", "dimension",
- "dimesnion", "dimension",
- "diminishs", "diminishes",
- "dinasours", "dinosaurs",
- "dinosuars", "dinosaurs",
- "dinsoaurs", "dinosaurs",
- "dionsaurs", "dinosaurs",
- "diphtongs", "diphthongs",
- "dipthongs", "diphthongs",
- "direcotry", "directory",
- "directoty", "directory",
- "directroy", "directory",
- "disaprity", "disparity",
- "disastros", "disastrous",
- "disatrous", "disastrous",
- "disbaling", "disabling",
- "disbeleif", "disbelief",
- "disbelife", "disbelief",
- "disciplen", "disciplines",
- "disclamer", "disclaimer",
- "disclosue", "disclosure",
- "disconnet", "disconnect",
- "discosure", "discourse",
- "discoverd", "discovered",
- "discovere", "discoveries",
- "discredid", "discredited",
- "discribed", "described",
- "discribes", "describes",
- "discussin", "discussion",
- "diserable", "desirable",
- "disgarees", "disagrees",
- "disgiused", "disguised",
- "disgusied", "disguised",
- "disgustes", "disgusts",
- "disgustos", "disgusts",
- "disgustus", "disgusts",
- "dishonesy", "dishonesty",
- "dishonord", "dishonored",
- "disicples", "disciples",
- "dismantel", "dismantle",
- "dismisals", "dismissal",
- "disnegage", "disengage",
- "dispairty", "disparity",
- "dispalyed", "displayed",
- "dispartiy", "disparity",
- "dispenced", "dispensed",
- "dispeners", "dispenser",
- "displayes", "displays",
- "disruptin", "disruption",
- "dissapear", "disappear",
- "dissarray", "disarray",
- "dissmisal", "dismissal",
- "disspiate", "dissipate",
- "distincte", "distinctive",
- "distrcits", "districts",
- "distribue", "distributed",
- "distrubed", "disturbed",
- "distrupts", "distrust",
- "disturben", "disturbance",
- "diverisfy", "diversify",
- "diveristy", "diversity",
- "diverstiy", "diversity",
- "dividened", "dividend",
- "divinitiy", "divinity",
- "doccument", "document",
- "docrtines", "doctrines",
- "docuhebag", "douchebag",
- "dogdammit", "goddammit",
- "dogfather", "godfather",
- "dolphines", "dolphins",
- "domecracy", "democracy",
- "domecrats", "democrats",
- "domiantes", "dominates",
- "dominatin", "domination",
- "dominaton", "domination",
- "dominiant", "dominant",
- "donwgrade", "downgrade",
- "donwloads", "downloads",
- "donwsides", "downsides",
- "donwvoted", "downvoted",
- "donwvotes", "downvotes",
- "doublelit", "doublelift",
- "doucehbag", "douchebag",
- "downgarde", "downgrade",
- "downlaods", "downloads",
- "downloaad", "download",
- "downovted", "downvoted",
- "dravadian", "dravidian",
- "drummless", "drumless",
- "dsyphoria", "dysphoria",
- "dsytopian", "dystopian",
- "duaghters", "daughters",
- "duplicats", "duplicates",
- "durabiliy", "durability",
- "dynamicus", "dynamics",
- "dypshoria", "dysphoria",
- "dyshporia", "dysphoria",
- "dysoptian", "dystopian",
- "dysphoira", "dysphoria",
- "dysphroia", "dysphoria",
- "dyspohria", "dysphoria",
- "dyspotian", "dystopian",
- "dystopain", "dystopian",
- "dystpoian", "dystopian",
- "eachohter", "eachother",
- "eachotehr", "eachother",
- "eachtoher", "eachother",
- "earpluggs", "earplugs",
- "earthboud", "earthbound",
- "eastwoood", "eastwood",
- "eastwoord", "eastwood",
- "ecclectic", "eclectic",
- "ecomonics", "economics",
- "edficient", "deficient",
- "effecient", "efficient",
- "efficeint", "efficient",
- "efficency", "efficiency",
- "efficieny", "efficiency",
- "effulence", "effluence",
- "egalitara", "egalitarian",
- "egpytians", "egyptians",
- "egyptains", "egyptians",
- "egytpians", "egyptians",
- "ehtically", "ethically",
- "ehtnicity", "ethnicity",
- "eighteeen", "eighteen",
- "eitquette", "etiquette",
- "ejacualte", "ejaculate",
- "electivre", "elective",
- "electorns", "electrons",
- "electrial", "electrical",
- "electricy", "electricity",
- "electroal", "electoral",
- "elementay", "elementary",
- "elepahnts", "elephants",
- "eliminase", "eliminates",
- "eliminato", "elimination",
- "ellignton", "ellington",
- "ellingotn", "ellington",
- "eloquenty", "eloquently",
- "elsehwere", "elsewhere",
- "emapthize", "empathize",
- "embarress", "embarrassed",
- "emmisarry", "emissary",
- "emmisions", "emissions",
- "emmitting", "emitting",
- "empahsize", "emphasize",
- "emperical", "empirical",
- "emphaised", "emphasised",
- "emphatize", "empathize",
- "emphazise", "emphasize",
- "emphysyma", "emphysema",
- "empitness", "emptiness",
- "employeer", "employer",
- "employeur", "employer",
- "empolyees", "employees",
- "emtpiness", "emptiness",
- "emualtion", "emulation",
- "enahncing", "enhancing",
- "enchantig", "enchanting",
- "enclousre", "enclosure",
- "enclsoure", "enclosure",
- "encolsure", "enclosure",
- "encompase", "encompass",
- "encounted", "encountered",
- "encrpyted", "encrypted",
- "encrytped", "encrypted",
- "encyrpted", "encrypted",
- "endangerd", "endangered",
- "enevlopes", "envelopes",
- "enforcees", "enforces",
- "engagemet", "engagements",
- "engagment", "engagement",
- "engieneer", "engineer",
- "engineeer", "engineer",
- "engineerd", "engineered",
- "enhacning", "enhancing",
- "enhanceds", "enhances",
- "enligthen", "enlighten",
- "enourmous", "enormous",
- "ensconsed", "ensconced",
- "enthicity", "ethnicity",
- "enthusiam", "enthusiasm",
- "enthusiat", "enthusiast",
- "entirelly", "entirely",
- "entitlied", "entitled",
- "enveloppe", "envelope",
- "epidsodes", "episodes",
- "epilepsey", "epilepsy",
- "epiphanny", "epiphany",
- "episonage", "espionage",
- "epscially", "specially",
- "epsionage", "espionage",
- "eqautions", "equations",
- "equialent", "equivalent",
- "equivalet", "equivalents",
- "ermington", "remington",
- "erroenous", "erroneous",
- "escalatie", "escalate",
- "escalatin", "escalation",
- "esitmated", "estimated",
- "esitmates", "estimates",
- "eslewhere", "elsewhere",
- "especialy", "especially",
- "espianoge", "espionage",
- "espinoage", "espionage",
- "espoinage", "espionage",
- "esponiage", "espionage",
- "espressso", "espresso",
- "essencial", "essential",
- "essentail", "essential",
- "essentias", "essentials",
- "essentual", "essential",
- "essesital", "essential",
- "estiamted", "estimated",
- "estiamtes", "estimates",
- "estimatin", "estimation",
- "ethcially", "ethically",
- "ethincity", "ethnicity",
- "ethnicaly", "ethnically",
- "ethniticy", "ethnicity",
- "etmyology", "etymology",
- "euclidian", "euclidean",
- "euorpeans", "europeans",
- "euphoriac", "euphoric",
- "euphorica", "euphoria",
- "europenas", "europeans",
- "europians", "europeans",
- "eurpoeans", "europeans",
- "evangelia", "evangelical",
- "evelation", "elevation",
- "evenlopes", "envelopes",
- "eventally", "eventually",
- "eventualy", "eventually",
- "everthing", "everything",
- "evertyime", "everytime",
- "everwhere", "everywhere",
- "everyoens", "everyones",
- "everyteim", "everytime",
- "everytiem", "everytime",
- "everyting", "everything",
- "eveyrones", "everyones",
- "evreyones", "everyones",
- "evreytime", "everytime",
- "exagerate", "exaggerate",
- "exahusted", "exhausted",
- "exapnsive", "expansive",
- "exauhsted", "exhausted",
- "excahnges", "exchanges",
- "excecuted", "executed",
- "excecutes", "executes",
- "excellant", "excellent",
- "excercise", "exercise",
- "excerised", "exercised",
- "excerises", "exercises",
- "exceuting", "executing",
- "exchnages", "exchanges",
- "exclsuive", "exclusive",
- "excludeds", "excludes",
- "exclusivs", "exclusives",
- "exclusivy", "exclusivity",
- "excpetion", "exception",
- "exculding", "excluding",
- "exculsion", "exclusion",
- "exculsive", "exclusive",
- "execising", "exercising",
- "execption", "exception",
- "exectuing", "executing",
- "exectuion", "execution",
- "exectuive", "executive",
- "executabe", "executable",
- "exepmtion", "exemption",
- "exerbated", "exacerbated",
- "exercices", "exercise",
- "exerciese", "exercises",
- "exercizes", "exercise",
- "exersices", "exercises",
- "exhasuted", "exhausted",
- "exhaustin", "exhaustion",
- "exhibites", "exhibits",
- "exhibitin", "exhibition",
- "exhibtion", "exhibition",
- "exhuasted", "exhausted",
- "exibition", "exhibition",
- "existance", "existence",
- "existenta", "existential",
- "existince", "existence",
- "existnace", "existance",
- "exlcuding", "excluding",
- "exlcusion", "exclusion",
- "exlcusive", "exclusive",
- "exlpoding", "exploding",
- "exlporers", "explorers",
- "exlposion", "explosion",
- "exonorate", "exonerate",
- "expalined", "explained",
- "expanisve", "expansive",
- "expatriot", "expatriate",
- "expectany", "expectancy",
- "expection", "exception",
- "expemtion", "exemption",
- "experimet", "experiments",
- "explaines", "explains",
- "explainig", "explaining",
- "explaning", "explaining",
- "expliciet", "explicit",
- "explicity", "explicitly",
- "explictly", "explicitly",
- "explioted", "exploited",
- "explodeds", "explodes",
- "exploites", "exploits",
- "explorare", "explorer",
- "explotied", "exploited",
- "expolding", "exploding",
- "expolited", "exploited",
- "expolsion", "explosion",
- "expolsive", "explosive",
- "expressie", "expressive",
- "expressin", "expression",
- "exsitance", "existance",
- "extention", "extension",
- "exteriour", "exterior",
- "extermely", "extremely",
- "extermism", "extremism",
- "extermist", "extremist",
- "externaly", "externally",
- "extractin", "extraction",
- "extrapole", "extrapolate",
- "extreemly", "extremely",
- "extremers", "extremes",
- "extremley", "extremely",
- "extrotion", "extortion",
- "eyeballls", "eyeballs",
- "eyebrowes", "eyebrows",
- "eyebrowns", "eyebrows",
- "eyesahdow", "eyeshadow",
- "eyeshdaow", "eyeshadow",
- "eygptians", "egyptians",
- "eytmology", "etymology",
- "faceboook", "facebook",
- "faciliate", "facilitate",
- "facilites", "facilities",
- "facilitiy", "facility",
- "facinated", "fascinated",
- "facutally", "factually",
- "familiair", "familiar",
- "familiare", "familiarize",
- "familiary", "familiarity",
- "familliar", "familiar",
- "fanaticas", "fanatics",
- "fanaticos", "fanatics",
- "fanaticus", "fanatics",
- "fanatsies", "fantasies",
- "fanatsize", "fantasize",
- "fandation", "foundation",
- "fanservie", "fanservice",
- "fantazise", "fantasize",
- "farenheit", "fahrenheit",
- "fascistes", "fascists",
- "fashoined", "fashioned",
- "favorties", "favorites",
- "favoruite", "favourite",
- "favourits", "favourites",
- "favourtie", "favourite",
- "fedreally", "federally",
- "feminisim", "feminism",
- "feminsits", "feminists",
- "femminist", "feminist",
- "fesitvals", "festivals",
- "fetishers", "fetishes",
- "fightings", "fighting",
- "filetimes", "lifetimes",
- "filiament", "filament",
- "filmmakes", "filmmakers",
- "fingernal", "fingernails",
- "flashligt", "flashlight",
- "flavorade", "flavored",
- "flavoures", "flavours",
- "flavourus", "flavours",
- "flawlessy", "flawlessly",
- "flexibily", "flexibility",
- "fluctaute", "fluctuate",
- "flucutate", "fluctuate",
- "fluttersy", "fluttershy",
- "follwoing", "following",
- "foootball", "football",
- "forcefuly", "forcefully",
- "forcibley", "forcibly",
- "forciblly", "forcibly",
- "forearmes", "forearms",
- "foreginer", "foreigner",
- "foregroud", "foreground",
- "foreinger", "foreigner",
- "forgeiner", "foreigner",
- "forgiener", "foreigner",
- "forgivens", "forgiveness",
- "foriegner", "foreigner",
- "forigener", "foreigner",
- "formerlly", "formerly",
- "formualte", "formulate",
- "formulaes", "formulas",
- "formulars", "formulas",
- "forntline", "frontline",
- "forntpage", "frontpage",
- "fortuante", "fortunate",
- "forumlate", "formulate",
- "foundatin", "foundations",
- "fourteeen", "fourteen",
- "fractales", "fractals",
- "fractalis", "fractals",
- "fractalus", "fractals",
- "fragement", "fragment",
- "fragmenot", "fragment",
- "franchies", "franchise",
- "francsico", "francisco",
- "franscico", "francisco",
- "frecklers", "freckles",
- "freedomes", "freedoms",
- "freestlye", "freestyle",
- "freesytle", "freestyle",
- "fremented", "fermented",
- "freqeuncy", "frequency",
- "frequence", "frequencies",
- "friendlis", "friendlies",
- "frightend", "frightened",
- "fromation", "formation",
- "frontapge", "frontpage",
- "frontilne", "frontline",
- "frustrato", "frustration",
- "frustrats", "frustrates",
- "fucntions", "functions",
- "fullscren", "fullscreen",
- "funcitons", "functions",
- "functiong", "functioning",
- "functtion", "function",
- "furiosuly", "furiously",
- "furiuosly", "furiously",
- "futuristc", "futuristic",
- "gagnsters", "gangsters",
- "galations", "galatians",
- "galdiator", "gladiator",
- "gallaxies", "galaxies",
- "garanteed", "guaranteed",
- "garantees", "guarantees",
- "garuantee", "guarantee",
- "gatherins", "gatherings",
- "gauntelts", "gauntlets",
- "gauntlent", "gauntlet",
- "gaurantee", "guarantee",
- "gaurentee", "guarantee",
- "genatilia", "genitalia",
- "geneology", "genealogy",
- "generalbs", "generals",
- "generalis", "generals",
- "generaste", "generates",
- "generatie", "generate",
- "generatin", "generations",
- "generatos", "generators",
- "genitaila", "genitalia",
- "genitales", "genitals",
- "genitalis", "genitals",
- "geniunely", "genuinely",
- "gentailia", "genitalia",
- "gentelmen", "gentlemen",
- "gentialia", "genitalia",
- "genuienly", "genuinely",
- "genuinley", "genuinely",
- "geogrpahy", "geography",
- "germaniac", "germanic",
- "geurrilla", "guerrilla",
- "gimmickey", "gimmicky",
- "gimmickly", "gimmicky",
- "girlfried", "girlfriend",
- "goalkeepr", "goalkeeper",
- "godafther", "godfather",
- "godspeeed", "godspeed",
- "goegraphy", "geography",
- "goldfisch", "goldfish",
- "goosebums", "goosebumps",
- "gorvement", "goverment",
- "govemrent", "goverment",
- "govenment", "government",
- "goverance", "governance",
- "goveremnt", "goverment",
- "goverment", "government",
- "govermetn", "goverment",
- "govermnet", "goverment",
- "governmet", "governments",
- "govorment", "government",
- "govrement", "goverment",
- "gracefull", "graceful",
- "gracefuly", "gracefully",
- "graduaste", "graduates",
- "graduatin", "graduation",
- "grahpical", "graphical",
- "grativate", "gravitate",
- "graudally", "gradually",
- "graudates", "graduates",
- "greenalnd", "greenland",
- "grenaders", "grenades",
- "grpahical", "graphical",
- "guadulupe", "guadalupe",
- "guaranted", "guaranteed",
- "guarantes", "guarantees",
- "guardains", "guardians",
- "guarentee", "guarantee",
- "guaridans", "guardians",
- "guatamala", "guatemala",
- "guerrilas", "guerrillas",
- "guradians", "guardians",
- "guranteed", "guaranteed",
- "gurantees", "guarantees",
- "gutiarist", "guitarist",
- "habsbourg", "habsburg",
- "hairstlye", "hairstyle",
- "hairsytle", "hairstyle",
- "halarious", "hilarious",
- "hambruger", "hamburger",
- "hamburges", "hamburgers",
- "hamphsire", "hampshire",
- "hamsphire", "hampshire",
- "handboook", "handbook",
- "handedley", "handedly",
- "handedlly", "handedly",
- "handicape", "handicapped",
- "hapmshire", "hampshire",
- "happended", "happened",
- "happenend", "happened",
- "happenned", "happened",
- "harasment", "harassment",
- "hardenend", "hardened",
- "hardwoord", "hardwood",
- "haristyle", "hairstyle",
- "harrasing", "harassing",
- "harrassed", "harassed",
- "harrasses", "harassed",
- "hdinsight", "hindsight",
- "headahces", "headaches",
- "headhpone", "headphone",
- "headshoot", "headshot",
- "healither", "healthier",
- "healtheir", "healthier",
- "healthiet", "healthiest",
- "healthire", "healthier",
- "heapdhone", "headphone",
- "hedgehoog", "hedgehog",
- "hedgehorg", "hedgehog",
- "heightend", "heightened",
- "heirarchy", "hierarchy",
- "herculase", "hercules",
- "herculeas", "hercules",
- "herculees", "hercules",
- "herculeus", "hercules",
- "heriarchy", "hierarchy",
- "hesistant", "hesitant",
- "hesistate", "hesitate",
- "hesitatin", "hesitation",
- "hieroglph", "hieroglyph",
- "highschol", "highschool",
- "hindisght", "hindsight",
- "hindrence", "hindrance",
- "hinduisim", "hinduism",
- "hinduisum", "hinduism",
- "hipsanics", "hispanics",
- "hirearchy", "hierarchy",
- "hirsohima", "hiroshima",
- "hispancis", "hispanics",
- "hitboxers", "hitboxes",
- "hoepfully", "hopefully",
- "holocasut", "holocaust",
- "holocuast", "holocaust",
- "homeonwer", "homeowner",
- "homeopaty", "homeopathy",
- "homewolrd", "homeworld",
- "homewoner", "homeowner",
- "homewrold", "homeworld",
- "homogenes", "homogeneous",
- "homosexul", "homosexuals",
- "hopelessy", "hopelessly",
- "hopsitals", "hospitals",
- "horishima", "hiroshima",
- "horizones", "horizons",
- "horizonts", "horizons",
- "horrendos", "horrendous",
- "horribley", "horribly",
- "horriblly", "horribly",
- "horrifing", "horrifying",
- "hositlity", "hostility",
- "hospitaly", "hospitality",
- "hosptials", "hospitals",
- "hourgalss", "hourglass",
- "hourlgass", "hourglass",
- "househols", "households",
- "humanitis", "humanities",
- "humanoind", "humanoid",
- "humiditiy", "humidity",
- "hunagrian", "hungarian",
- "hurriance", "hurricane",
- "hurricans", "hurricanes",
- "husbandos", "husbands",
- "hydraluic", "hydraulic",
- "hydropile", "hydrophile",
- "hydropobe", "hydrophobe",
- "hydrualic", "hydraulic",
- "hyopcrite", "hypocrite",
- "hypcorite", "hypocrite",
- "hyperoble", "hyperbole",
- "hypocracy", "hypocrisy",
- "hypocrasy", "hypocrisy",
- "hypocricy", "hypocrisy",
- "hypocriet", "hypocrite",
- "hypocrits", "hypocrites",
- "hyporcite", "hypocrite",
- "hypothess", "hypotheses",
- "hyprocisy", "hypocrisy",
- "hyprocite", "hypocrite",
- "hyrdation", "hydration",
- "hyrdaulic", "hydraulic",
- "hysterica", "hysteria",
- "hysteriia", "hysteria",
- "iburpofen", "ibuprofen",
- "icleandic", "icelandic",
- "icongnito", "incognito",
- "idealisim", "idealism",
- "idealistc", "idealistic",
- "identifiy", "identify",
- "ideologis", "ideologies",
- "ignornace", "ignorance",
- "illegales", "illegals",
- "illegalis", "illegals",
- "illegalls", "illegals",
- "illnesess", "illnesses",
- "illsuions", "illusions",
- "illuminai", "illuminati",
- "imagenary", "imaginary",
- "imaginery", "imaginary",
- "imaptient", "impatient",
- "imigrated", "emigrated",
- "immensley", "immensely",
- "immerisve", "immersive",
- "immesnely", "immensely",
- "immidiate", "immediate",
- "immigrato", "immigration",
- "immitated", "imitated",
- "immitator", "imitator",
- "immobilie", "immobile",
- "immobille", "immobile",
- "immobilze", "immobile",
- "immortaly", "immortality",
- "immserive", "immersive",
- "impaitent", "impatient",
- "imparital", "impartial",
- "impedence", "impedance",
- "implantes", "implants",
- "implicati", "implicit",
- "impliciet", "implicit",
- "implicity", "implicitly",
- "impliment", "implement",
- "implusive", "impulsive",
- "importamt", "important",
- "importend", "imported",
- "imporving", "improving",
- "impossibe", "impossible",
- "imprefect", "imperfect",
- "impressin", "impressions",
- "imprioned", "imprisoned",
- "improbabe", "improbable",
- "impulisve", "impulsive",
- "impuslive", "impulsive",
- "imrpoving", "improving",
- "inadequet", "inadequate",
- "inadquate", "inadequate",
- "inaugures", "inaugurates",
- "inbalance", "imbalance",
- "inbeetwen", "inbetween",
- "inbetween", "between",
- "inbewteen", "inbetween",
- "incarnato", "incarnation",
- "incgonito", "incognito",
- "inclinato", "inclination",
- "includeds", "includes",
- "incoginto", "incognito",
- "incongito", "incognito",
- "incorpore", "incorporate",
- "incpetion", "inception",
- "incredibe", "incredible",
- "incrediby", "incredibly",
- "inculding", "including",
- "incunabla", "incunabula",
- "indicaste", "indicates",
- "indicatie", "indicative",
- "indicence", "incidence",
- "indicents", "incidents",
- "indigenos", "indigenous",
- "indirecty", "indirectly",
- "indisious", "insidious",
- "individul", "individual",
- "individus", "individuals",
- "indoensia", "indonesia",
- "indoneisa", "indonesia",
- "indutrial", "industrial",
- "inersting", "inserting",
- "inexpense", "inexpensive",
- "infallibe", "infallible",
- "inferioir", "inferior",
- "inferiour", "inferior",
- "infestato", "infestation",
- "infiltrar", "infiltrator",
- "infinitey", "infinity",
- "infinitie", "infinite",
- "infinitiy", "infinity",
- "infinitly", "infinity",
- "inflatabe", "inflatable",
- "influense", "influences",
- "influenta", "influential",
- "informate", "informative",
- "infraread", "infrared",
- "ingeniuty", "ingenuity",
- "ingeunity", "ingenuity",
- "ingocnito", "incognito",
- "ingorance", "ignorance",
- "inguenity", "ingenuity",
- "inhabitat", "inhabitants",
- "inheirted", "inherited",
- "inhertied", "inherited",
- "initailly", "initially",
- "initalese", "initialese",
- "initaling", "initialing",
- "initalise", "initialise",
- "initalism", "initialism",
- "initalize", "initialize",
- "initalled", "initialled",
- "initation", "initiation",
- "initiales", "initials",
- "initiatie", "initiatives",
- "initiatin", "initiation",
- "initiatve", "initiate",
- "injustics", "injustices",
- "inlcuding", "including",
- "inmigrant", "immigrant",
- "innoucous", "innocuous",
- "innovatin", "innovations",
- "innovatve", "innovate",
- "inpection", "inception",
- "inpending", "impending",
- "inproving", "improving",
- "inpsector", "inspector",
- "inpsiring", "inspiring",
- "inquisito", "inquisition",
- "inquisitr", "inquisitor",
- "inresting", "inserting",
- "insanelly", "insanely",
- "insepctor", "inspector",
- "insidiuos", "insidious",
- "insipring", "inspiring",
- "insluated", "insulated",
- "inspectin", "inspection",
- "instabilt", "instability",
- "installes", "installs",
- "installus", "installs",
- "instering", "inserting",
- "insticnts", "instincts",
- "institude", "instituted",
- "instituto", "institution",
- "insualted", "insulated",
- "insurence", "insurance",
- "insurgeny", "insurgency",
- "integirty", "integrity",
- "integraal", "integral",
- "integrade", "integrated",
- "integrato", "integration",
- "intenisty", "intensity",
- "intensley", "intensely",
- "interacte", "interactive",
- "interents", "internets",
- "interesat", "interest",
- "interesst", "interests",
- "interewbs", "interwebs",
- "interfase", "interfaces",
- "interfeer", "interfere",
- "interfers", "interferes",
- "intergate", "integrate",
- "intergity", "integrity",
- "interiour", "interior",
- "internest", "internets",
- "interpert", "interpret",
- "interprut", "interrupt",
- "interrups", "interrupts",
- "interstae", "interstate",
- "interveen", "intervene",
- "intervied", "interviewed",
- "intervier", "interviewer",
- "intervies", "interviews",
- "intesnely", "intensely",
- "intesnity", "intensity",
- "intestins", "intestines",
- "inticrate", "intricate",
- "intimidad", "intimidated",
- "intircate", "intricate",
- "intiution", "intuition",
- "intiutive", "intuitive",
- "intorduce", "introduce",
- "intorvert", "introvert",
- "intracite", "intricate",
- "intrduced", "introduced",
- "intregity", "integrity",
- "intrenets", "internets",
- "intrepret", "interpret",
- "intrerupt", "interrupt",
- "intrewebs", "interwebs",
- "intrinisc", "intrinsic",
- "intrisinc", "intrinsic",
- "intrisnic", "intrinsic",
- "intriuged", "intrigued",
- "introdued", "introduced",
- "introduse", "introduces",
- "introvers", "introverts",
- "intruiged", "intrigued",
- "intrument", "instrument",
- "inutition", "intuition",
- "inutitive", "intuitive",
- "invaderas", "invaders",
- "invalidas", "invalidates",
- "inventios", "inventions",
- "investige", "investigate",
- "investmet", "investments",
- "invincibe", "invincible",
- "invloving", "involving",
- "invovling", "involving",
- "ipubrofen", "ibuprofen",
- "iranianos", "iranians",
- "irelevent", "irrelevant",
- "ironicaly", "ironically",
- "irritatie", "irritate",
- "irritatin", "irritation",
- "isalmists", "islamists",
- "isalnders", "islanders",
- "islamiskt", "islamist",
- "islamsits", "islamists",
- "islmaists", "islamists",
- "isntaller", "installer",
- "isntances", "instances",
- "isntantly", "instantly",
- "israelies", "israelis",
- "israelits", "israelis",
- "italianas", "italians",
- "italianos", "italians",
- "jailbrake", "jailbreak",
- "jalibreak", "jailbreak",
- "jamaicain", "jamaican",
- "jersualem", "jerusalem",
- "jeruselam", "jerusalem",
- "jeruslaem", "jerusalem",
- "journalis", "journals",
- "judegment", "judgement",
- "judgemant", "judgemental",
- "judisuary", "judiciary",
- "jugdement", "judgement",
- "juggernat", "juggernaut",
- "juvenille", "juvenile",
- "keneysian", "keynesian",
- "kentuckey", "kentucky",
- "kenyesian", "keynesian",
- "keybaords", "keyboards",
- "keyensian", "keynesian",
- "keyesnian", "keynesian",
- "keynseian", "keynesian",
- "keysenian", "keynesian",
- "kilometes", "kilometers",
- "kindapped", "kidnapped",
- "kncokback", "knockback",
- "knoweldge", "knowledge",
- "knowlegde", "knowledge",
- "konckback", "knockback",
- "kryptonie", "kryptonite",
- "labirynth", "labyrinth",
- "laboratoy", "laboratory",
- "laboreres", "laborers",
- "labratory", "laboratory",
- "labriynth", "labyrinth",
- "labryinth", "labyrinth",
- "labyrnith", "labyrinth",
- "landscaps", "landscapes",
- "landscspe", "landscapes",
- "langauges", "languages",
- "languague", "language",
- "lanuchers", "launchers",
- "lanugages", "languages",
- "larington", "arlington",
- "latitudie", "latitude",
- "lattitude", "latitude",
- "laucnhers", "launchers",
- "laucnhing", "launching",
- "launchign", "launching",
- "laybrinth", "labyrinth",
- "lebanesse", "lebanese",
- "leceister", "leicester",
- "leciester", "leicester",
- "legitmate", "legitimate",
- "legnedary", "legendary",
- "lesbianas", "lesbians",
- "lesbianus", "lesbians",
- "letivicus", "leviticus",
- "leutenant", "lieutenant",
- "levaithan", "leviathan",
- "levellign", "levelling",
- "levetated", "levitated",
- "levetates", "levitates",
- "levicitus", "leviticus",
- "levleling", "levelling",
- "lfiesteal", "lifesteal",
- "liberales", "liberals",
- "liberalim", "liberalism",
- "liberalis", "liberals",
- "liberatin", "liberation",
- "libraires", "libraries",
- "liecester", "leicester",
- "lieuenant", "lieutenant",
- "lieutenat", "lieutenant",
- "lifespawn", "lifespan",
- "lifestlye", "lifestyle",
- "lighnting", "lightning",
- "lightnign", "lightning",
- "ligthning", "lightning",
- "ligthroom", "lightroom",
- "lingerine", "lingerie",
- "lispticks", "lipsticks",
- "listenend", "listened",
- "literarly", "literary",
- "literarry", "literary",
- "literatre", "literate",
- "literatue", "literate",
- "literture", "literature",
- "lithaunia", "lithuania",
- "lithuaina", "lithuania",
- "lithuiana", "lithuania",
- "lithunaia", "lithuania",
- "litigatin", "litigation",
- "lituhania", "lithuania",
- "liveprool", "liverpool",
- "livestrem", "livestream",
- "lobbysits", "lobbyists",
- "lockscren", "lockscreen",
- "logisitcs", "logistics",
- "logsitics", "logistics",
- "loiusiana", "louisiana",
- "lollipoop", "lollipop",
- "louisvile", "louisville",
- "luanchers", "launchers",
- "luanching", "launching",
- "lubicrant", "lubricant",
- "lubircant", "lubricant",
- "ludcrious", "ludicrous",
- "ludricous", "ludicrous",
- "lunaticos", "lunatics",
- "lunaticus", "lunatics",
- "macaronni", "macaroni",
- "maestries", "masteries",
- "magainzes", "magazines",
- "magensium", "magnesium",
- "magincian", "magician",
- "magintude", "magnitude",
- "magneisum", "magnesium",
- "magnesuim", "magnesium",
- "magnifine", "magnificent",
- "mainfesto", "manifesto",
- "mainfests", "manifests",
- "mainstrem", "mainstream",
- "maintaing", "maintaining",
- "maintance", "maintenance",
- "maintians", "maintains",
- "mairjuana", "marijuana",
- "malasyian", "malaysian",
- "malayisan", "malaysian",
- "malaysain", "malaysian",
- "maletonin", "melatonin",
- "maltesian", "maltese",
- "malyasian", "malaysian",
- "managable", "manageable",
- "managment", "management",
- "mandarian", "mandarin",
- "mandarijn", "mandarin",
- "mandarion", "mandarin",
- "maneouvre", "manoeuvre",
- "maneuveur", "maneuver",
- "maneveurs", "maneuvers",
- "manfiesto", "manifesto",
- "manfiests", "manifests",
- "mangesium", "magnesium",
- "mangitude", "magnitude",
- "manouvers", "maneuvers",
- "mantained", "maintained",
- "manuevers", "maneuvers",
- "maraudeur", "marauder",
- "marevlous", "marvelous",
- "margarent", "margaret",
- "margarite", "margaret",
- "marginaal", "marginal",
- "marginaly", "marginally",
- "marijauna", "marijuana",
- "marineras", "mariners",
- "marineris", "mariners",
- "marineros", "mariners",
- "marjiuana", "marijuana",
- "marjority", "majority",
- "marmelade", "marmalade",
- "marrtyred", "martyred",
- "massagens", "massages",
- "massivley", "massively",
- "masteires", "masteries",
- "mastereis", "masteries",
- "masterise", "masteries",
- "mastermid", "mastermind",
- "mastieres", "masteries",
- "masturbae", "masturbated",
- "materiaal", "material",
- "matierals", "materials",
- "mattreses", "mattress",
- "mayalsian", "malaysian",
- "maylasian", "malaysian",
- "mccarthey", "mccarthy",
- "mecahnics", "mechanics",
- "mecernary", "mercenary",
- "mechancis", "mechanics",
- "mechanims", "mechanism",
- "mechaninc", "mechanic",
- "mechansim", "mechanism",
- "medicince", "medicine",
- "mediciney", "mediciny",
- "meditatie", "meditate",
- "meditatin", "meditation",
- "megathred", "megathread",
- "melanotin", "melatonin",
- "melborune", "melbourne",
- "melbounre", "melbourne",
- "membrance", "membrane",
- "menstraul", "menstrual",
- "menstural", "menstrual",
- "mensutral", "menstrual",
- "mentiones", "mentions",
- "mercanery", "mercenary",
- "merhcants", "merchants",
- "messagers", "messages",
- "messanger", "messenger",
- "metabloic", "metabolic",
- "metalurgy", "metallurgy",
- "methaphor", "metaphor",
- "methapors", "metaphors",
- "methodoly", "methodology",
- "metropols", "metropolis",
- "mexicanas", "mexicans",
- "mexicants", "mexicans",
- "mexicanus", "mexicans",
- "michellle", "michelle",
- "micorwave", "microwave",
- "micoscopy", "microscopy",
- "microphen", "microphone",
- "migrantes", "migrants",
- "migrianes", "migraines",
- "milawukee", "milwaukee",
- "milennium", "millennium",
- "milestons", "milestones",
- "militians", "militias",
- "millenial", "millennial",
- "millenian", "millennia",
- "millenium", "millennium",
- "millionar", "millionaire",
- "millitary", "military",
- "miluwakee", "milwaukee",
- "milwakuee", "milwaukee",
- "milwuakee", "milwaukee",
- "mindcarck", "mindcrack",
- "mindlessy", "mindlessly",
- "minerales", "minerals",
- "minisclue", "miniscule",
- "miniscuel", "miniscule",
- "ministery", "ministry",
- "minisucle", "miniscule",
- "minitaure", "miniature",
- "minituare", "miniature",
- "minneosta", "minnesota",
- "minnestoa", "minnesota",
- "minsicule", "miniscule",
- "minsiters", "ministers",
- "minstries", "ministries",
- "miraculos", "miraculous",
- "mircowave", "microwave",
- "mirrorred", "mirrored",
- "miserabel", "miserable",
- "mispelled", "misspelled",
- "misreable", "miserable",
- "misreably", "miserably",
- "missisipi", "mississippi",
- "missonary", "missionary",
- "missourri", "missouri",
- "misspelld", "misspelled",
- "mobilitiy", "mobility",
- "moderatey", "moderately",
- "moderatin", "moderation",
- "modifires", "modifiers",
- "moelcules", "molecules",
- "moleclues", "molecules",
- "molestare", "molester",
- "molestato", "molestation",
- "molesterd", "molested",
- "monestary", "monastery",
- "monitores", "monitors",
- "monolgoue", "monologue",
- "monolight", "moonlight",
- "monolouge", "monologue",
- "monopolis", "monopolies",
- "monopolly", "monopoly",
- "monopoloy", "monopoly",
- "monserrat", "montserrat",
- "monstorus", "monstrous",
- "monstruos", "monstrous",
- "montanous", "mountainous",
- "monumnets", "monuments",
- "moratlity", "mortality",
- "morbidley", "morbidly",
- "morgatges", "mortgages",
- "morgtages", "mortgages",
- "morisette", "morissette",
- "mormonsim", "mormonism",
- "morroccan", "moroccan",
- "mortailty", "mortality",
- "mosquitto", "mosquito",
- "motivatie", "motivate",
- "motivatin", "motivations",
- "motorcyce", "motorcycles",
- "motorolja", "motorola",
- "motoroloa", "motorola",
- "moustahce", "moustache",
- "movepseed", "movespeed",
- "mozzarela", "mozzarella",
- "mucisians", "musicians",
- "mulitated", "mutilated",
- "mulitples", "multiples",
- "multipled", "multiplied",
- "multplies", "multiples",
- "murdererd", "murdered",
- "muscially", "musically",
- "muscician", "musician",
- "musculair", "muscular",
- "mushrooom", "mushroom",
- "musicains", "musicians",
- "mutatiohn", "mutation",
- "mutialted", "mutilated",
- "mutilatin", "mutilation",
- "mutliated", "mutilated",
- "mutliples", "multiples",
- "mutlitude", "multitude",
- "mysterise", "mysteries",
- "mysterous", "mysterious",
- "nacrotics", "narcotics",
- "naferious", "nefarious",
- "nahsville", "nashville",
- "narcissim", "narcissism",
- "narcissit", "narcissist",
- "narcissts", "narcissist",
- "narctoics", "narcotics",
- "nasvhille", "nashville",
- "nationaal", "national",
- "nationaly", "nationally",
- "nativelly", "natively",
- "natrually", "naturally",
- "navigatie", "navigate",
- "navigatin", "navigation",
- "neccesary", "necessary",
- "necessite", "necessities",
- "neckbears", "neckbeards",
- "neckbread", "neckbeard",
- "nedlessly", "endlessly",
- "needlessy", "needlessly",
- "negiotate", "negotiate",
- "negociate", "negotiate",
- "negoitate", "negotiate",
- "neigbhour", "neighbour",
- "neigbours", "neighbours",
- "neighboor", "neighbor",
- "nessecary", "necessary",
- "newcaslte", "newcastle",
- "newcastel", "newcastle",
- "nieghbour", "neighbour",
- "nightfa;;", "nightfall",
- "nightlcub", "nightclub",
- "nigthclub", "nightclub",
- "nigthlife", "nightlife",
- "nigthmare", "nightmare",
- "nihilisim", "nihilism",
- "ninteenth", "nineteenth",
- "nominatie", "nominate",
- "nominatin", "nomination",
- "noninital", "noninitial",
- "norhteast", "northeast",
- "norhtwest", "northwest",
- "normanday", "normandy",
- "northeren", "northern",
- "norwegain", "norwegian",
- "norwiegan", "norwegian",
- "nostaglia", "nostalgia",
- "nostaglic", "nostalgic",
- "nostaliga", "nostalgia",
- "nostaligc", "nostalgic",
- "nostlagia", "nostalgia",
- "nostlagic", "nostalgic",
- "nostriles", "nostrils",
- "nostrills", "nostrils",
- "notacible", "noticable",
- "notciable", "noticable",
- "noteboook", "notebook",
- "noteriety", "notoriety",
- "noteworty", "noteworthy",
- "noticable", "noticeable",
- "noticably", "noticeably",
- "noticalbe", "noticable",
- "noticeing", "noticing",
- "noticible", "noticeable",
- "notoroius", "notorious",
- "novermber", "november",
- "nullabour", "nullarbor",
- "numberous", "numerous",
- "numercial", "numerical",
- "numerious", "numerous",
- "nuremburg", "nuremberg",
- "nurtients", "nutrients",
- "nutirents", "nutrients",
- "nutreints", "nutrients",
- "nutritent", "nutrient",
- "nutritian", "nutritional",
- "nutritios", "nutritious",
- "obediance", "obedience",
- "obeidence", "obedience",
- "obersvant", "observant",
- "obersvers", "observers",
- "obesssion", "obsession",
- "obiedence", "obedience",
- "obivously", "obviously",
- "objectivs", "objectives",
- "objectivy", "objectivity",
- "obscruity", "obscurity",
- "obscuirty", "obscurity",
- "observare", "observer",
- "observerd", "observed",
- "obssesion", "obsession",
- "obssesive", "obsessive",
- "obssessed", "obsessed",
- "obstruced", "obstructed",
- "obsucrity", "obscurity",
- "obtainabe", "obtainable",
- "obviosuly", "obviously",
- "obvioulsy", "obviously",
- "obvisouly", "obviously",
- "obvoiusly", "obviously",
- "ocasional", "occasional",
- "ocasioned", "occasioned",
- "ocassions", "occasions",
- "occaisons", "occasions",
- "occassion", "occasion",
- "occurance", "occurrence",
- "occurence", "occurrence",
- "octohedra", "octahedra",
- "ocuntries", "countries",
- "ocurrance", "occurrence",
- "ocurrence", "occurrence",
- "offcially", "officially",
- "offically", "officially",
- "officialy", "officially",
- "offpsring", "offspring",
- "offspirng", "offspring",
- "offsrping", "offspring",
- "ogliarchy", "oligarchy",
- "oilgarchy", "oligarchy",
- "oligrachy", "oligarchy",
- "ommitting", "omitting",
- "onlsaught", "onslaught",
- "onsalught", "onslaught",
- "onslaugth", "onslaught",
- "onsluaght", "onslaught",
- "onwership", "ownership",
- "opiniones", "opinions",
- "oposition", "opposition",
- "opponenet", "opponent",
- "opposiste", "opposites",
- "opposties", "opposites",
- "oppressin", "oppression",
- "opression", "oppression",
- "opressive", "oppressive",
- "opthalmic", "ophthalmic",
- "optimisim", "optimism",
- "optimistc", "optimistic",
- "optinally", "optimally",
- "oragnered", "orangered",
- "oragnised", "organised",
- "oragnizer", "organizer",
- "orcehstra", "orchestra",
- "ordinarly", "ordinary",
- "orgainsed", "organised",
- "orgainzer", "organizer",
- "organered", "orangered",
- "organices", "organise",
- "organisim", "organism",
- "organiske", "organise",
- "organiste", "organise",
- "organites", "organise",
- "organizms", "organism",
- "organsied", "organised",
- "organsims", "organisms",
- "organzier", "organizer",
- "orginally", "originally",
- "orgnaised", "organised",
- "orhcestra", "orchestra",
- "orientato", "orientation",
- "origanaly", "originally",
- "originall", "original",
- "originalt", "originality",
- "originaly", "originally",
- "origintea", "originate",
- "origional", "original",
- "orignally", "originally",
- "orignials", "originals",
- "oublisher", "publisher",
- "oursleves", "ourselves",
- "oustiders", "outsiders",
- "oustpoken", "outspoken",
- "outisders", "outsiders",
- "outnumbed", "outnumbered",
- "outpalyed", "outplayed",
- "outperfom", "outperform",
- "outpsoken", "outspoken",
- "outrageos", "outrageous",
- "outskirst", "outskirts",
- "outskrits", "outskirts",
- "outwieghs", "outweighs",
- "overbaord", "overboard",
- "overclcok", "overclock",
- "overdirve", "overdrive",
- "overhpyed", "overhyped",
- "overhwelm", "overwhelm",
- "overlcock", "overclock",
- "overloard", "overload",
- "overpaied", "overpaid",
- "overpowed", "overpowered",
- "overriden", "overridden",
- "overwhlem", "overwhelm",
- "overwirte", "overwrite",
- "overwtach", "overwatch",
- "overyhped", "overhyped",
- "owernship", "ownership",
- "pacificts", "pacifist",
- "packageid", "packaged",
- "pactivity", "captivity",
- "painkills", "painkillers",
- "paitently", "patiently",
- "paitience", "patience",
- "pakistain", "pakistani",
- "pakistian", "pakistani",
- "pakistnai", "pakistani",
- "paksitani", "pakistani",
- "paladines", "paladins",
- "paladinos", "paladins",
- "palestein", "palestine",
- "palestina", "palestinian",
- "palistian", "palestinian",
- "paltforms", "platforms",
- "palystyle", "playstyle",
- "pancakers", "pancakes",
- "pantomine", "pantomime",
- "paradimes", "paradise",
- "paragraps", "paragraphs",
- "paragrpah", "paragraph",
- "paralells", "parallels",
- "paralelly", "parallelly",
- "paralisys", "paralysis",
- "parallely", "parallelly",
- "paralzyed", "paralyzed",
- "paramedis", "paramedics",
- "paramters", "parameters",
- "paranoica", "paranoia",
- "paranoida", "paranoia",
- "parasties", "parasites",
- "paraylsis", "paralysis",
- "paraylzed", "paralyzed",
- "parellels", "parallels",
- "paricular", "particular",
- "parisitic", "parasitic",
- "paritally", "partially",
- "parliment", "parliament",
- "parmesaen", "parmesan",
- "parntered", "partnered",
- "parrallel", "parallel",
- "partchett", "pratchett",
- "parterned", "partnered",
- "participe", "participate",
- "partiotic", "patriotic",
- "partisain", "partisan",
- "pasengers", "passengers",
- "passagens", "passages",
- "passagers", "passages",
- "passerbys", "passersby",
- "passiones", "passions",
- "passivley", "passively",
- "passowrds", "passwords",
- "pateintly", "patiently",
- "paticular", "particular",
- "patinetly", "patiently",
- "patriarca", "patriarchal",
- "patriarcy", "patriarchy",
- "patriotas", "patriots",
- "patriotes", "patriots",
- "patroitic", "patriotic",
- "pattented", "patented",
- "pavillion", "pavilion",
- "pbulisher", "publisher",
- "peacefuly", "peacefully",
- "pedohpile", "pedophile",
- "pedophila", "pedophilia",
- "pedophils", "pedophiles",
- "peircings", "piercings",
- "penalites", "penalties",
- "penatlies", "penalties",
- "penduluum", "pendulum",
- "penerator", "penetrator",
- "penguines", "penguins",
- "penguings", "penguins",
- "penguinos", "penguins",
- "peninsual", "peninsula",
- "peninusla", "peninsula",
- "penisnula", "peninsula",
- "penisular", "peninsular",
- "pennisula", "peninsula",
- "pensinula", "peninsula",
- "pentagoon", "pentagon",
- "peodphile", "pedophile",
- "pepperino", "pepperoni",
- "peppermit", "peppermint",
- "percepted", "perceived",
- "percevied", "perceived",
- "percieved", "perceived",
- "percisely", "precisely",
- "percision", "precision",
- "percursor", "precursor",
- "perdators", "predators",
- "peremiter", "perimeter",
- "perfeclty", "perfectly",
- "perfomers", "performers",
- "performas", "performs",
- "perfromer", "performer",
- "pericings", "piercings",
- "perimetre", "perimeter",
- "peristent", "persistent",
- "periwinke", "periwinkle",
- "permanant", "permanent",
- "permature", "premature",
- "permenant", "permanent",
- "permieter", "perimeter",
- "permissie", "permissible",
- "permissin", "permissions",
- "permisson", "permission",
- "pernament", "permanent",
- "perorders", "preorders",
- "perpetrar", "perpetrator",
- "perpetuae", "perpetuate",
- "perpetuas", "perpetuates",
- "persauded", "persuaded",
- "perscribe", "prescribe",
- "perserved", "preserved",
- "persistes", "persists",
- "personaes", "personas",
- "personaly", "personally",
- "personell", "personnel",
- "personhod", "personhood",
- "persuated", "persuade",
- "pertended", "pretended",
- "pertoleum", "petroleum",
- "perusaded", "persuaded",
- "pervertes", "perverse",
- "pesticids", "pesticides",
- "petroluem", "petroleum",
- "phemonena", "phenomena",
- "phenemona", "phenomena",
- "phenonema", "phenomena",
- "phillipse", "phillies",
- "philosopy", "philosophy",
- "philosphy", "philosophy",
- "phonecian", "phoenecian",
- "phonemena", "phenomena",
- "phongraph", "phonograph",
- "photograh", "photograph",
- "phsyician", "physician",
- "phsyicist", "physicist",
- "phycisian", "physician",
- "phycisist", "physicist",
- "physicaly", "physically",
- "physicits", "physicist",
- "physisict", "physicist",
- "piblisher", "publisher",
- "picthfork", "pitchfork",
- "pinetrest", "pinterest",
- "placeheld", "placeholder",
- "placemens", "placements",
- "plaestine", "palestine",
- "plagarism", "plagiarism",
- "planatery", "planetary",
- "planation", "plantation",
- "planteary", "planetary",
- "plasticas", "plastics",
- "plasticos", "plastics",
- "plasticus", "plastics",
- "platfroms", "platforms",
- "platofrms", "platforms",
- "plausable", "plausible",
- "plausbile", "plausible",
- "plausibel", "plausible",
- "playgroud", "playground",
- "playright", "playwright",
- "playstlye", "playstyle",
- "playwrite", "playwright",
- "plebicite", "plebiscite",
- "plethoria", "plethora",
- "ploarized", "polarized",
- "pointeres", "pointers",
- "polinator", "pollinator",
- "polishees", "polishes",
- "politelly", "politely",
- "politican", "politician",
- "politicas", "politics",
- "politicin", "politician",
- "politicus", "politics",
- "polygammy", "polygamy",
- "populatin", "populations",
- "poralized", "polarized",
- "porcelian", "porcelain",
- "porcelina", "porcelain",
- "poreclain", "porcelain",
- "porftolio", "portfolio",
- "porgramme", "programme",
- "portfoilo", "portfolio",
- "portoflio", "portfolio",
- "portraing", "portraying",
- "portrayes", "portrays",
- "portrayls", "portrays",
- "portriats", "portraits",
- "portugese", "portuguese",
- "portugues", "portuguese",
- "posessing", "possessing",
- "posession", "possession",
- "positiond", "positioned",
- "positiong", "positioning",
- "positionl", "positional",
- "positiviy", "positivity",
- "possesess", "possesses",
- "possesing", "possessing",
- "possesion", "possession",
- "possessin", "possessions",
- "possibile", "possible",
- "possibily", "possibility",
- "possibley", "possibly",
- "possiblly", "possibly",
- "possition", "position",
- "powderade", "powdered",
- "powerfull", "powerful",
- "pracitcal", "practical",
- "practhett", "pratchett",
- "practicly", "practically",
- "practives", "practise",
- "pragamtic", "pragmatic",
- "preadtors", "predators",
- "precedeed", "preceded",
- "preceeded", "preceded",
- "preceived", "perceived",
- "preciesly", "precisely",
- "precisley", "precisely",
- "precurors", "precursor",
- "precurosr", "precursor",
- "precurser", "precursor",
- "predatobr", "predator",
- "predictie", "predictive",
- "predictin", "prediction",
- "predjuice", "prejudice",
- "predujice", "prejudice",
- "prefectly", "perfectly",
- "preferens", "preferences",
- "prefering", "preferring",
- "preformer", "performer",
- "pregnance", "pregnancies",
- "preimeter", "perimeter",
- "prejiduce", "prejudice",
- "prejucide", "prejudice",
- "premanent", "permanent",
- "premeired", "premiered",
- "preorderd", "preordered",
- "preparato", "preparation",
- "prepatory", "preparatory",
- "presentas", "presents",
- "presentes", "presents",
- "presicely", "precisely",
- "presicion", "precision",
- "presideny", "presidency",
- "prestigiu", "prestigious",
- "prestigue", "prestige",
- "presuaded", "persuaded",
- "pretendas", "pretends",
- "pretensje", "pretense",
- "pretinent", "pertinent",
- "prevelant", "prevalent",
- "preventin", "prevention",
- "previvous", "previous",
- "priesthod", "priesthood",
- "priestood", "priesthood",
- "primaires", "primaries",
- "primairly", "primarily",
- "primarliy", "primarily",
- "primative", "primitive",
- "primordal", "primordial",
- "princesas", "princess",
- "princeses", "princess",
- "princesss", "princesses",
- "principas", "principals",
- "principly", "principally",
- "prinicple", "principle",
- "prioritie", "prioritize",
- "prioritse", "priorities",
- "privalege", "privilege",
- "privelege", "privilege",
- "privelige", "privilege",
- "privilage", "privilege",
- "privilegs", "privileges",
- "privledge", "privilege",
- "probabily", "probability",
- "probablly", "probably",
- "problemas", "problems",
- "procative", "proactive",
- "procedger", "procedure",
- "proceding", "proceeding",
- "proceedes", "proceeds",
- "procelain", "porcelain",
- "procesess", "processes",
- "processer", "processor",
- "processos", "processors",
- "proclamed", "proclaimed",
- "procotols", "protocols",
- "prodecure", "procedure",
- "productie", "productive",
- "productin", "productions",
- "productos", "products",
- "profesion", "profusion",
- "professer", "professor",
- "professin", "professions",
- "proffesed", "professed",
- "proffesor", "professor",
- "progessed", "progressed",
- "programas", "programs",
- "programem", "programme",
- "programes", "programs",
- "programms", "programs",
- "progresso", "progression",
- "progresss", "progresses",
- "projectie", "projectile",
- "projectin", "projection",
- "prominant", "prominent",
- "promiscus", "promiscuous",
- "promotted", "promoted",
- "pronomial", "pronominal",
- "pronouced", "pronounced",
- "pronounds", "pronouns",
- "pronounes", "pronouns",
- "propagana", "propaganda",
- "properies", "properties",
- "propertly", "property",
- "propeties", "properties",
- "prophesie", "prophecies",
- "prophetes", "prophets",
- "propogate", "propagate",
- "proposels", "proposes",
- "proposito", "proposition",
- "propperly", "properly",
- "propsects", "prospects",
- "prosperos", "prosperous",
- "prostitue", "prostitute",
- "protectes", "protects",
- "protectie", "protective",
- "protectos", "protectors",
- "proteinas", "proteins",
- "proteines", "proteins",
- "protestas", "protests",
- "protestat", "protestant",
- "protestes", "protests",
- "protestos", "protests",
- "protfolio", "portfolio",
- "protocool", "protocol",
- "prototpye", "prototype",
- "prototyps", "prototypes",
- "protraits", "portraits",
- "protrayal", "portrayal",
- "protrayed", "portrayed",
- "provicial", "provincial",
- "provincie", "province",
- "provisios", "provisions",
- "pruchased", "purchased",
- "pruchases", "purchases",
- "prugatory", "purgatory",
- "pruposely", "purposely",
- "pscyhotic", "psychotic",
- "pseudonyn", "pseudonym",
- "pshycosis", "psychosis",
- "pshycotic", "psychotic",
- "psycology", "psychology",
- "psycothic", "psychotic",
- "ptichfork", "pitchfork",
- "pubilsher", "publisher",
- "publiaher", "publisher",
- "publicaly", "publicly",
- "publicani", "publication",
- "publicher", "publisher",
- "publiclly", "publicly",
- "publihser", "publisher",
- "publisehr", "publisher",
- "publisger", "publisher",
- "publishor", "publisher",
- "publishre", "publisher",
- "publsiher", "publisher",
- "publusher", "publisher",
- "puchasing", "purchasing",
- "punishmet", "punishments",
- "puplisher", "publisher",
- "puragtory", "purgatory",
- "purcahsed", "purchased",
- "purcahses", "purchases",
- "purhcased", "purchased",
- "purposley", "purposely",
- "pursuaded", "persuaded",
- "pursuades", "persuades",
- "pyramidas", "pyramids",
- "pyramides", "pyramids",
- "pyschosis", "psychosis",
- "pyschotic", "psychotic",
- "qaulifies", "qualifies",
- "quantifiy", "quantify",
- "quantitiy", "quantity",
- "quantitty", "quantity",
- "quartlery", "quarterly",
- "queations", "equations",
- "queenland", "queensland",
- "questiond", "questioned",
- "questiong", "questioning",
- "questionn", "questioning",
- "radicalis", "radicals",
- "rapsberry", "raspberry",
- "rasbperry", "raspberry",
- "rationaly", "rationally",
- "reactiony", "reactionary",
- "realisitc", "realistic",
- "realoding", "reloading",
- "realsitic", "realistic",
- "realtable", "relatable",
- "realtions", "relations",
- "realtives", "relatives",
- "reamining", "remaining",
- "reaplying", "replaying",
- "reasearch", "research",
- "reaveling", "revealing",
- "rebellios", "rebellious",
- "rebllions", "rebellions",
- "recations", "creations",
- "reccomend", "recommend",
- "reccuring", "recurring",
- "receeding", "receding",
- "recepient", "recipient",
- "recgonise", "recognise",
- "recgonize", "recognize",
- "recidents", "residents",
- "recievers", "receivers",
- "recieving", "receiving",
- "recipiant", "recipient",
- "reciproce", "reciprocate",
- "reclutant", "reluctant",
- "recoginse", "recognise",
- "recoginze", "recognize",
- "recomends", "recommends",
- "recommens", "recommends",
- "reconenct", "reconnect",
- "recongise", "recognise",
- "recongize", "recognize",
- "reconicle", "reconcile",
- "reconized", "recognized",
- "recordare", "recorder",
- "recoveres", "recovers",
- "recoverys", "recovers",
- "recpetive", "receptive",
- "recpetors", "receptors",
- "recquired", "required",
- "recreatie", "recreate",
- "recruitcs", "recruits",
- "recruites", "recruits",
- "recrusion", "recursion",
- "recrutied", "recruited",
- "recrutier", "recruiter",
- "rectangel", "rectangle",
- "rectanlge", "rectangle",
- "recuiting", "recruiting",
- "recurison", "recursion",
- "recurited", "recruited",
- "recuriter", "recruiter",
- "recusrion", "recursion",
- "redeemeed", "redeemed",
- "redundany", "redundancy",
- "redundent", "redundant",
- "reedeming", "redeeming",
- "refelcted", "reflected",
- "refereces", "references",
- "refereees", "referees",
- "refereers", "referees",
- "referemce", "reference",
- "referencs", "references",
- "referense", "references",
- "referiang", "referring",
- "referinng", "refering",
- "refernces", "references",
- "refernece", "reference",
- "refershed", "refreshed",
- "refersher", "refresher",
- "reffering", "referring",
- "reflectie", "reflective",
- "refrehser", "refresher",
- "refrences", "references",
- "refromist", "reformist",
- "regionaal", "regional",
- "registerd", "registered",
- "registery", "registry",
- "regualrly", "regularly",
- "regualtor", "regulator",
- "regulaion", "regulation",
- "regulalry", "regularly",
- "regulares", "regulars",
- "regularis", "regulars",
- "regulatin", "regulations",
- "regurally", "regularly",
- "reigining", "reigning",
- "reinstale", "reinstalled",
- "reisntall", "reinstall",
- "reknowned", "renowned",
- "relaoding", "reloading",
- "relatiate", "retaliate",
- "relativiy", "relativity",
- "relativly", "relatively",
- "relativno", "relation",
- "relavence", "relevance",
- "relcutant", "reluctant",
- "relevence", "relevance",
- "relfected", "reflected",
- "reliabily", "reliability",
- "reliabley", "reliably",
- "religeous", "religious",
- "remasterd", "remastered",
- "rememberd", "remembered",
- "rememebrs", "remembers",
- "remianing", "remaining",
- "remignton", "remington",
- "remingotn", "remington",
- "remmebers", "remembers",
- "remotelly", "remotely",
- "rendevous", "rendezvous",
- "rendezous", "rendezvous",
- "renedered", "rende",
- "renegated", "renegade",
- "rennovate", "renovate",
- "repalying", "replaying",
- "repblican", "republican",
- "repeatedy", "repeatedly",
- "repective", "receptive",
- "repeition", "repetition",
- "repentent", "repentant",
- "rephrasse", "rephrase",
- "replusive", "repulsive",
- "reportedy", "reportedly",
- "represend", "represented",
- "repressin", "repression",
- "reprtoire", "repertoire",
- "repsonded", "responded",
- "reptition", "repetition",
- "reptuable", "reputable",
- "repubican", "republican",
- "republian", "republican",
- "repulican", "republican",
- "repulisve", "repulsive",
- "repuslive", "repulsive",
- "resaurant", "restaurant",
- "researchs", "researchers",
- "resembels", "resembles",
- "reserverd", "reserved",
- "resintall", "reinstall",
- "resistane", "resistances",
- "resistans", "resistances",
- "resistend", "resisted",
- "resistent", "resistant",
- "resmebles", "resembles",
- "resolutin", "resolutions",
- "resoruces", "resources",
- "respectes", "respects",
- "respectos", "respects",
- "responces", "response",
- "respondas", "responds",
- "respondis", "responds",
- "respondus", "responds",
- "respoting", "reposting",
- "ressemble", "resemble",
- "ressurect", "resurrect",
- "restarant", "restaurant",
- "resticted", "restricted",
- "restircts", "restricts",
- "restorani", "restoration",
- "restraind", "restrained",
- "restraing", "restraining",
- "restraunt", "restraint",
- "restriant", "restraint",
- "restricte", "restrictive",
- "resturant", "restaurant",
- "retailate", "retaliate",
- "retalaite", "retaliate",
- "retaliers", "retailers",
- "reteriver", "retriever",
- "retirever", "retriever",
- "retrevier", "retriever",
- "reuptable", "reputable",
- "reveiwers", "reviewers",
- "revelaing", "revealing",
- "revelance", "relevance",
- "revolutin", "revolutions",
- "rewachted", "rewatched",
- "rewatchig", "rewatching",
- "rferences", "references",
- "ridiculos", "ridiculous",
- "ridiculue", "ridicule",
- "ridiculus", "ridiculous",
- "righetous", "righteous",
- "rightfuly", "rightfully",
- "rightoues", "righteous",
- "rigourous", "rigorous",
- "rigtheous", "righteous",
- "rilvaries", "rivalries",
- "rininging", "ringing",
- "rivarlies", "rivalries",
- "rivlaries", "rivalries",
- "roaylties", "royalties",
- "roboticus", "robotics",
- "roganisms", "organisms",
- "royalites", "royalties",
- "roylaties", "royalties",
- "ruleboook", "rulebook",
- "sacarstic", "sarcastic",
- "sacntuary", "sanctuary",
- "sacrafice", "sacrifice",
- "sacrastic", "sarcastic",
- "sacrifise", "sacrifices",
- "salughter", "slaughter",
- "samckdown", "smackdown",
- "sanctiond", "sanctioned",
- "sancturay", "sanctuary",
- "sancutary", "sanctuary",
- "sandstrom", "sandstorm",
- "sandwhich", "sandwich",
- "sanhedrim", "sanhedrin",
- "santcuary", "sanctuary",
- "santioned", "sanctioned",
- "sapphirre", "sapphire",
- "sastified", "satisfied",
- "sastifies", "satisfies",
- "satelites", "satellites",
- "saterdays", "saturdays",
- "satisifed", "satisfied",
- "satisifes", "satisfies",
- "satrudays", "saturdays",
- "satsified", "satisfied",
- "satsifies", "satisfies",
- "sattelite", "satellite",
- "saxaphone", "saxophone",
- "scaepgoat", "scapegoat",
- "scaleable", "scalable",
- "scandales", "scandals",
- "scandalos", "scandals",
- "scantuary", "sanctuary",
- "scaricity", "scarcity",
- "scarifice", "sacrifice",
- "scarmbled", "scrambled",
- "scartched", "scratched",
- "scartches", "scratches",
- "scavanged", "scavenged",
- "sceintist", "scientist",
- "scholalry", "scholarly",
- "sciencers", "sciences",
- "scientfic", "scientific",
- "scientifc", "scientific",
- "scientits", "scientist",
- "sclupture", "sculpture",
- "scnearios", "scenarios",
- "scoreboad", "scoreboard",
- "scottisch", "scottish",
- "scracthed", "scratched",
- "scracthes", "scratches",
- "scrambeld", "scrambled",
- "scrathces", "scratches",
- "scrollade", "scrolled",
- "scrutiney", "scrutiny",
- "scrutinty", "scrutiny",
- "sculpteur", "sculpture",
- "sculputre", "sculpture",
- "scultpure", "sculpture",
- "scuplture", "sculpture",
- "scuptures", "sculptures",
- "seamlessy", "seamlessly",
- "searchign", "searching",
- "sebasitan", "sebastian",
- "sebastain", "sebastian",
- "sebsatian", "sebastian",
- "secceeded", "seceded",
- "secertary", "secretary",
- "secratary", "secretary",
- "secratery", "secretary",
- "secretery", "secretary",
- "secretley", "secretly",
- "sednetary", "sedentary",
- "seduciton", "seduction",
- "semanitcs", "semantics",
- "semestres", "semesters",
- "semnatics", "semantics",
- "semseters", "semesters",
- "senatores", "senators",
- "sendetary", "sedentary",
- "sensitivy", "sensitivity",
- "sentimant", "sentimental",
- "sepcially", "specially",
- "seperated", "separated",
- "seperates", "separates",
- "seperator", "separator",
- "septmeber", "september",
- "seraching", "searching",
- "seriosuly", "seriously",
- "serioulsy", "seriously",
- "seriuosly", "seriously",
- "servantes", "servants",
- "settlment", "settlement",
- "sexualizd", "sexualized",
- "sexuallly", "sexually",
- "shadasloo", "shadaloo",
- "shaprness", "sharpness",
- "sharpenss", "sharpness",
- "shawhsank", "shawshank",
- "sheilding", "shielding",
- "shephered", "shepherd",
- "shileding", "shielding",
- "shitstrom", "shitstorm",
- "shletered", "sheltered",
- "shoudlers", "shoulders",
- "shouldnot", "shouldnt",
- "shperical", "spherical",
- "shwashank", "shawshank",
- "sidebaord", "sideboard",
- "siganture", "signature",
- "signapore", "singapore",
- "signitory", "signatory",
- "silhouete", "silhouette",
- "similiair", "similiar",
- "simliarly", "similarly",
- "simluated", "simulated",
- "simluator", "simulator",
- "simplifiy", "simplify",
- "simualted", "simulated",
- "simualtor", "simulator",
- "simulatie", "simulate",
- "simulatin", "simulation",
- "sinagpore", "singapore",
- "sincerley", "sincerely",
- "singature", "signature",
- "singpaore", "singapore",
- "singulair", "singular",
- "singulary", "singularity",
- "skateboad", "skateboard",
- "skeletaal", "skeletal",
- "skepitcal", "skeptical",
- "skepticim", "skepticism",
- "sketpical", "skeptical",
- "slaughted", "slaughtered",
- "slaugther", "slaughter",
- "slipperly", "slippery",
- "sluaghter", "slaughter",
- "smackdwon", "smackdown",
- "smealting", "smelting",
- "smeesters", "semesters",
- "snadstorm", "sandstorm",
- "snippetts", "snippets",
- "snowfalke", "snowflake",
- "snowflaek", "snowflake",
- "snowlfake", "snowflake",
- "snwoballs", "snowballs",
- "snythesis", "synthesis",
- "snythetic", "synthetic",
- "socailism", "socialism",
- "socailist", "socialist",
- "socailize", "socialize",
- "soceities", "societies",
- "socialini", "socializing",
- "socialiss", "socialists",
- "socialsim", "socialism",
- "socieites", "societies",
- "socilaism", "socialism",
- "socilaist", "socialist",
- "sociopati", "sociopathic",
- "sociopats", "sociopaths",
- "socratees", "socrates",
- "socrateks", "socrates",
- "soemthing", "something",
- "sohpomore", "sophomore",
- "soliliquy", "soliloquy",
- "somehting", "something",
- "someoneis", "someones",
- "somethign", "something",
- "somethins", "somethings",
- "sopohmore", "sophomore",
- "sotryline", "storyline",
- "soundtrak", "soundtrack",
- "sountrack", "soundtrack",
- "sourthern", "southern",
- "souvenier", "souvenir",
- "soveregin", "sovereign",
- "sovereing", "sovereign",
- "soveriegn", "sovereign",
- "spacegoat", "scapegoat",
- "spagehtti", "spaghetti",
- "spahgetti", "spaghetti",
- "sparlking", "sparkling",
- "spartants", "spartans",
- "specailly", "specially",
- "specailty", "specialty",
- "specality", "specialty",
- "speciales", "specials",
- "specialis", "specials",
- "speciatly", "specialty",
- "specifing", "specifying",
- "specimine", "specimen",
- "spectrail", "spectral",
- "specualte", "speculate",
- "speechers", "speeches",
- "spehrical", "spherical",
- "speically", "specially",
- "spetember", "september",
- "sphagetti", "spaghetti",
- "splatooon", "splatoon",
- "sponosred", "sponsored",
- "sponsered", "sponsored",
- "sponsores", "sponsors",
- "spontanes", "spontaneous",
- "sponzored", "sponsored",
- "sprakling", "sparkling",
- "sprinkeld", "sprinkled",
- "squadroon", "squadron",
- "squirrles", "squirrels",
- "squirrtle", "squirrel",
- "squrriels", "squirrels",
- "srirachia", "sriracha",
- "srirachra", "sriracha",
- "stabliize", "stabilize",
- "stainlees", "stainless",
- "startegic", "strategic",
- "startlxde", "startled",
- "statisitc", "statistic",
- "staurdays", "saturdays",
- "steadilly", "steadily",
- "stealthly", "stealthy",
- "stichting", "stitching",
- "sticthing", "stitching",
- "stimulans", "stimulants",
- "stockplie", "stockpile",
- "stornegst", "strongest",
- "stragetic", "strategic",
- "straightn", "straighten",
- "strangets", "strangest",
- "strategis", "strategies",
- "strawbery", "strawberry",
- "streamade", "streamed",
- "streamare", "streamer",
- "streamear", "streamer",
- "strechted", "stretched",
- "strechtes", "stretches",
- "strecthed", "stretched",
- "strecthes", "stretches",
- "stregnths", "strengths",
- "strenghen", "strengthen",
- "strengthn", "strengthen",
- "strentghs", "strengths",
- "stressade", "stressed",
- "stressers", "stresses",
- "strictist", "strictest",
- "stringnet", "stringent",
- "stroyline", "storyline",
- "structual", "structural",
- "structurs", "structures",
- "strucutre", "structure",
- "struggeld", "struggled",
- "struggels", "struggles",
- "stryofoam", "styrofoam",
- "stuctured", "structured",
- "stuggling", "struggling",
- "stupitidy", "stupidity",
- "sturcture", "structure",
- "sturggled", "struggled",
- "sturggles", "struggles",
- "styrofaom", "styrofoam",
- "subarmine", "submarine",
- "subculter", "subculture",
- "submachne", "submachine",
- "subpecies", "subspecies",
- "subscirbe", "subscribe",
- "subsidary", "subsidiary",
- "subsizide", "subsidize",
- "subsquent", "subsequent",
- "subsrcibe", "subscribe",
- "substanse", "substances",
- "substanta", "substantial",
- "substante", "substantive",
- "substarte", "substrate",
- "substitue", "substitute",
- "substract", "subtract",
- "subtances", "substances",
- "subtiltes", "subtitles",
- "subtitels", "subtitles",
- "subtletly", "subtlety",
- "subtlties", "subtitles",
- "succedded", "succeeded",
- "succeedes", "succeeds",
- "succesful", "successful",
- "succesion", "succession",
- "succesive", "successive",
- "suceeding", "succeeding",
- "sucesfuly", "successfully",
- "sucessful", "successful",
- "sucession", "succession",
- "sucessive", "successive",
- "sufferage", "suffrage",
- "sufferred", "suffered",
- "sufficent", "sufficient",
- "suggestes", "suggests",
- "suggestie", "suggestive",
- "sumbarine", "submarine",
- "sumberged", "submerged",
- "summenors", "summoners",
- "summoenrs", "summoners",
- "sunderlad", "sunderland",
- "sunglases", "sunglasses",
- "superfluu", "superfluous",
- "superiour", "superior",
- "superisor", "superiors",
- "supermare", "supermarket",
- "superviso", "supervision",
- "suposedly", "supposedly",
- "supportes", "supports",
- "suppreses", "suppress",
- "supressed", "suppressed",
- "supresses", "suppresses",
- "suprising", "surprising",
- "suprizing", "surprising",
- "supsicion", "suspicion",
- "surounded", "surrounded",
- "surprized", "surprised",
- "surronded", "surrounded",
- "surrouded", "surrounded",
- "surrouned", "surround",
- "survivers", "survivors",
- "survivied", "survived",
- "survivour", "survivor",
- "susbcribe", "subscribe",
- "susbtrate", "substrate",
- "susncreen", "sunscreen",
- "suspectes", "suspects",
- "suspendes", "suspense",
- "suspensie", "suspense",
- "swastikka", "swastika",
- "sweatshit", "sweatshirt",
- "sweetheat", "sweetheart",
- "switchign", "switching",
- "swithcing", "switching",
- "swtiching", "switching",
- "sydnicate", "syndicate",
- "sykwalker", "skywalker",
- "sylablles", "syllables",
- "syllabels", "syllables",
- "symbolsim", "symbolism",
- "symettric", "symmetric",
- "symmetral", "symmetric",
- "symmetria", "symmetrical",
- "symoblism", "symbolism",
- "sympathie", "sympathize",
- "symphoney", "symphony",
- "symptomes", "symptoms",
- "symptomps", "symptoms",
- "synagouge", "synagogue",
- "syndacite", "syndicate",
- "syndiacte", "syndicate",
- "synidcate", "syndicate",
- "synonymes", "synonyms",
- "synonymis", "synonyms",
- "synonymns", "synonyms",
- "synonymos", "synonymous",
- "synonymus", "synonyms",
- "synopsies", "synopsis",
- "syntehsis", "synthesis",
- "syntehtic", "synthetic",
- "syntethic", "synthetic",
- "syphyllis", "syphilis",
- "syracusae", "syracuse",
- "sytrofoam", "styrofoam",
- "tablespon", "tablespoon",
- "tacticaly", "tactically",
- "tanenhill", "tannehill",
- "tannheill", "tannehill",
- "targetted", "targeted",
- "tawainese", "taiwanese",
- "tawianese", "taiwanese",
- "taxanomic", "taxonomic",
- "teamfighs", "teamfights",
- "teamfigth", "teamfight",
- "teamifght", "teamfight",
- "teampseak", "teamspeak",
- "teaspooon", "teaspoon",
- "techician", "technician",
- "techinque", "technique",
- "technolgy", "technology",
- "teeangers", "teenagers",
- "tehtering", "tethering",
- "telegrpah", "telegraph",
- "televsion", "television",
- "temafight", "teamfight",
- "tempaltes", "templates",
- "temparate", "temperate",
- "templaras", "templars",
- "templares", "templars",
- "temporali", "temporarily",
- "tenacitiy", "tenacity",
- "tensiones", "tensions",
- "tentacels", "tentacles",
- "tentacuel", "tentacle",
- "tentalces", "tentacles",
- "termianls", "terminals",
- "terminato", "termination",
- "terorrism", "terrorism",
- "terorrist", "terrorist",
- "terrabyte", "terabyte",
- "terribley", "terribly",
- "terriblly", "terribly",
- "terriroty", "territory",
- "terrorits", "terrorist",
- "terrorsim", "terrorism",
- "tesitcles", "testicles",
- "tesitmony", "testimony",
- "testicels", "testicles",
- "testomony", "testimony",
- "texturers", "textures",
- "thankfuly", "thankfully",
- "thankyoou", "thankyou",
- "themselfs", "themselves",
- "themselvs", "themselves",
- "themslves", "themselves",
- "theologia", "theological",
- "therafter", "thereafter",
- "therefoer", "therefor",
- "therefour", "therefor",
- "theroists", "theorists",
- "thetering", "tethering",
- "thirlling", "thrilling",
- "thirteeen", "thirteen",
- "thoecracy", "theocracy",
- "thoerists", "theorists",
- "thoroughy", "thoroughly",
- "thoughout", "throughout",
- "threatend", "threatened",
- "throrough", "thorough",
- "throughly", "thoroughly",
- "througout", "throughout",
- "thrusdays", "thursdays",
- "thurdsays", "thursdays",
- "thursdsay", "thursdays",
- "thursters", "thrusters",
- "tiawanese", "taiwanese",
- "timestmap", "timestamp",
- "tirangles", "triangles",
- "tocuhdown", "touchdown",
- "toghether", "together",
- "tolerence", "tolerance",
- "tommorrow", "tomorrow",
- "torandoes", "tornadoes",
- "torchligt", "torchlight",
- "torelable", "tolerable",
- "toritllas", "tortillas",
- "tornaodes", "tornadoes",
- "torpeados", "torpedoes",
- "torrentas", "torrents",
- "torrentes", "torrents",
- "tortialls", "tortillas",
- "tortillia", "tortilla",
- "tortillla", "tortilla",
- "tottehnam", "tottenham",
- "tottenahm", "tottenham",
- "tottneham", "tottenham",
- "toturials", "tutorials",
- "touchdwon", "touchdown",
- "touristas", "tourists",
- "touristes", "tourists",
- "touristey", "touristy",
- "touristly", "touristy",
- "touristsy", "touristy",
- "tournamet", "tournament",
- "toxicitiy", "toxicity",
- "trafficed", "trafficked",
- "tragicaly", "tragically",
- "traileras", "trailers",
- "traingles", "triangles",
- "trainwrek", "trainwreck",
- "traitoris", "traitors",
- "traitorus", "traitors",
- "tramautic", "traumatic",
- "tranlsate", "translate",
- "transalte", "translate",
- "transcris", "transcripts",
- "transcrit", "transcript",
- "transferd", "transferred",
- "transfere", "transferred",
- "transfors", "transforms",
- "transfrom", "transform",
- "transiten", "transient",
- "transitin", "transitions",
- "transofrm", "transform",
- "transplat", "transplant",
- "trasnfers", "transfers",
- "trasnform", "transform",
- "trasnport", "transport",
- "traversie", "traverse",
- "travestry", "travesty",
- "treasuers", "treasures",
- "treasurey", "treasury",
- "treatmens", "treatments",
- "treausres", "treasures",
- "tremendos", "tremendous",
- "trhilling", "thrilling",
- "trhusters", "thrusters",
- "triangels", "triangles",
- "trianlges", "triangles",
- "tribunaal", "tribunal",
- "triguered", "triggered",
- "trinagles", "triangles",
- "truamatic", "traumatic",
- "truthfuly", "truthfully",
- "tunrtable", "turntable",
- "turnaroud", "turnaround",
- "turntabel", "turntable",
- "typcially", "typically",
- "tyrranies", "tyrannies",
- "ubiquitos", "ubiquitous",
- "ugprading", "upgrading",
- "ukrainain", "ukrainian",
- "ukrainias", "ukrainians",
- "ukrainina", "ukrainian",
- "ukrainisn", "ukrainians",
- "ukrianian", "ukrainian",
- "ulitmatum", "ultimatum",
- "ulteriour", "ulterior",
- "umbrellla", "umbrella",
- "unaminous", "unanimous",
- "unanmious", "unanimous",
- "unanswerd", "unanswered",
- "unanymous", "unanimous",
- "unbannend", "unbanned",
- "uncensord", "uncensored",
- "uncomited", "uncommitted",
- "undercunt", "undercut",
- "underdong", "underdog",
- "undergard", "undergrad",
- "underming", "undermining",
- "understad", "understands",
- "underwaer", "underwear",
- "underware", "underwear",
- "undescore", "underscore",
- "unforseen", "unforeseen",
- "unfortune", "unfortunate",
- "unfriendy", "unfriendly",
- "unhealhty", "unhealthy",
- "unheathly", "unhealthy",
- "unhelathy", "unhealthy",
- "unicornis", "unicorns",
- "unicornus", "unicorns",
- "uniformes", "uniforms",
- "uninamous", "unanimous",
- "unintuive", "unintuitive",
- "uniquelly", "uniquely",
- "unisntall", "uninstall",
- "univerity", "university",
- "universse", "universes",
- "univesity", "university",
- "unnistall", "uninstall",
- "unoffical", "unofficial",
- "unopenend", "unopened",
- "unplayabe", "unplayable",
- "unplesant", "unpleasant",
- "unpopluar", "unpopular",
- "unrankend", "unranked",
- "unreliabe", "unreliable",
- "unrwitten", "unwritten",
- "untrianed", "untrained",
- "unusaully", "unusually",
- "unuseable", "unusable",
- "unusuable", "unusable",
- "unvierses", "universes",
- "unweildly", "unwieldy",
- "unwieldly", "unwieldy",
- "unwirtten", "unwritten",
- "unworthly", "unworthy",
- "upcomming", "upcoming",
- "upgarding", "upgrading",
- "upgradded", "upgraded",
- "uplfiting", "uplifting",
- "uplifitng", "uplifting",
- "urkainian", "ukrainian",
- "utlimatum", "ultimatum",
- "vacciante", "vaccinate",
- "vaccinato", "vaccination",
- "vacciners", "vaccines",
- "vacestomy", "vasectomy",
- "vaguaries", "vagaries",
- "vaibility", "viability",
- "vaildated", "validated",
- "vairables", "variables",
- "valdiated", "validated",
- "valentein", "valentine",
- "valentien", "valentine",
- "valentins", "valentines",
- "validitiy", "validity",
- "valueable", "valuable",
- "vanadlism", "vandalism",
- "vandalsim", "vandalism",
- "varaibles", "variables",
- "varations", "variations",
- "variantes", "variants",
- "vascetomy", "vasectomy",
- "vastecomy", "vasectomy",
- "veganisim", "veganism",
- "vegetarin", "vegetarians",
- "vegitable", "vegetable",
- "vehementy", "vehemently",
- "veiwpoint", "viewpoint",
- "velantine", "valentine",
- "vendettta", "vendetta",
- "venegance", "vengeance",
- "veneuzela", "venezuela",
- "venezeula", "venezuela",
- "venezulea", "venezuela",
- "vengaence", "vengeance",
- "vengenace", "vengeance",
- "ventilato", "ventilation",
- "verbatium", "verbatim",
- "verfiying", "verifying",
- "verifiyng", "verifying",
- "verisions", "revisions",
- "versalite", "versatile",
- "versatily", "versatility",
- "versiones", "versions",
- "versitale", "versatile",
- "verstaile", "versatile",
- "verticaly", "vertically",
- "veryifing", "verifying",
- "vicotrian", "victorian",
- "vicotries", "victories",
- "victoires", "victories",
- "victorain", "victorian",
- "victorina", "victorian",
- "victorios", "victorious",
- "videogaem", "videogame",
- "videogams", "videogames",
- "vidoegame", "videogame",
- "viewpiont", "viewpoint",
- "vigilence", "vigilance",
- "vigliante", "vigilante",
- "vigourous", "vigorous",
- "viligante", "vigilante",
- "viloently", "violently",
- "vincinity", "vicinity",
- "vioalting", "violating",
- "violentce", "violence",
- "virbation", "vibration",
- "virgintiy", "virginity",
- "virignity", "virginity",
- "virutally", "virtually",
- "visibiliy", "visibility",
- "vitaminas", "vitamins",
- "vitamines", "vitamins",
- "vitrually", "virtually",
- "vociemail", "voicemail",
- "voilating", "violating",
- "voilation", "violation",
- "voilently", "violently",
- "volatiliy", "volatility",
- "voleyball", "volleyball",
- "volontary", "voluntary",
- "volonteer", "volunteer",
- "volunatry", "voluntary",
- "volunteed", "volunteered",
- "vriginity", "virginity",
- "wallpapes", "wallpapers",
- "warrantly", "warranty",
- "warrriors", "warriors",
- "wavelengh", "wavelength",
- "weakenend", "weakened",
- "weakneses", "weakness",
- "weaknesss", "weaknesses",
- "wealtheir", "wealthier",
- "weaponary", "weaponry",
- "wedensday", "wednesday",
- "wednesdsy", "wednesdays",
- "wednessay", "wednesdays",
- "wednseday", "wednesday",
- "welathier", "wealthier",
- "wendesday", "wednesday",
- "wesbtrook", "westbrook",
- "westernes", "westerners",
- "westrbook", "westbrook",
- "whereever", "wherever",
- "whietlist", "whitelist",
- "whilrwind", "whirlwind",
- "whilsting", "whistling",
- "whipsered", "whispered",
- "whislting", "whistling",
- "whisperes", "whispers",
- "whitelsit", "whitelist",
- "whitleist", "whitelist",
- "whitsling", "whistling",
- "whrilwind", "whirlwind",
- "whsipered", "whispered",
- "whtielist", "whitelist",
- "widespred", "widespread",
- "widesread", "widespread",
- "windshied", "windshield",
- "wintesses", "witnesses",
- "wisconisn", "wisconsin",
- "wishlisht", "wishlist",
- "wishpered", "whispered",
- "withdrawl", "withdrawal",
- "withelist", "whitelist",
- "witnesess", "witnesses",
- "wolrdview", "worldview",
- "wolrdwide", "worldwide",
- "wonderlad", "wonderland",
- "wordlview", "worldview",
- "wordlwide", "worldwide",
- "worhtless", "worthless",
- "workfroce", "workforce",
- "worldivew", "worldview",
- "worldveiw", "worldview",
- "worstened", "worsened",
- "worthelss", "worthless",
- "xenbolade", "xenoblade",
- "xenobalde", "xenoblade",
- "xenophoby", "xenophobia",
- "xeonblade", "xenoblade",
- "yementite", "yemenite",
- "yorkshrie", "yorkshire",
- "yorskhire", "yorkshire",
- "yosemitie", "yosemite",
- "youngents", "youngest",
- "yourselvs", "yourselves",
- "zimbabwae", "zimbabwe",
- "zionistas", "zionists",
- "zionistes", "zionists",
- "abandond", "abandoned",
- "abdomine", "abdomen",
- "abilitiy", "ability",
- "abilties", "abilities",
- "abondons", "abandons",
- "aboslute", "absolute",
- "abosrbed", "absorbed",
- "abruplty", "abruptly",
- "abrutply", "abruptly",
- "abscence", "absence",
- "absestos", "asbestos",
- "absoluts", "absolutes",
- "absolvte", "absolve",
- "absorbes", "absorbs",
- "absoulte", "absolute",
- "abstante", "bastante",
- "abudance", "abundance",
- "abudcted", "abducted",
- "abundunt", "abundant",
- "aburptly", "abruptly",
- "abuseres", "abusers",
- "abusrdly", "absurdly",
- "academis", "academics",
- "accademy", "academy",
- "acccused", "accused",
- "acceptes", "accepts",
- "accidens", "accidents",
- "accideny", "accidently",
- "accoring", "according",
- "accountt", "accountant",
- "accpeted", "accepted",
- "accuarcy", "accuracy",
- "accumule", "accumulate",
- "accusato", "accusation",
- "accussed", "accused",
- "acedamia", "academia",
- "acedemic", "academic",
- "acheived", "achieved",
- "acheives", "achieves",
- "achieval", "achievable",
- "acnedote", "anecdote",
- "acording", "according",
- "acornyms", "acronyms",
- "acousitc", "acoustic",
- "acoutsic", "acoustic",
- "acovados", "avocados",
- "acquifer", "acquire",
- "acquited", "acquitted",
- "acquried", "acquired",
- "acronmys", "acronyms",
- "acronysm", "acronyms",
- "acroynms", "acronyms",
- "acrynoms", "acronyms",
- "acsended", "ascended",
- "actaully", "actually",
- "activite", "activities",
- "activits", "activities",
- "activley", "actively",
- "actresss", "actresses",
- "actualey", "actualy",
- "actualiy", "actuality",
- "actualky", "actualy",
- "actualmy", "actualy",
- "actualoy", "actualy",
- "actualpy", "actualy",
- "actualty", "actualy",
- "acutally", "actually",
- "acutions", "auctions",
- "adaptare", "adapter",
- "adbandon", "abandon",
- "adbucted", "abducted",
- "addictes", "addicts",
- "addictin", "addictions",
- "addictis", "addictions",
- "addional", "additional",
- "addopted", "adopted",
- "addresed", "addressed",
- "adealide", "adelaide",
- "adecuate", "adequate",
- "adeilade", "adelaide",
- "adeladie", "adelaide",
- "adeliade", "adelaide",
- "adeqaute", "adequate",
- "adheisve", "adhesive",
- "adhevise", "adhesive",
- "adivsors", "advisors",
- "admiraal", "admiral",
- "adolence", "adolescent",
- "adorbale", "adorable",
- "adovcacy", "advocacy",
- "adpaters", "adapters",
- "adquired", "acquired",
- "adquires", "acquires",
- "adresing", "addressing",
- "adressed", "addressed",
- "adroable", "adorable",
- "adultrey", "adultery",
- "adventue", "adventures",
- "adventus", "adventures",
- "advertis", "adverts",
- "advesary", "adversary",
- "adviseer", "adviser",
- "adviseur", "adviser",
- "advocade", "advocated",
- "advocats", "advocates",
- "advsiors", "advisors",
- "aethists", "atheists",
- "affaires", "affairs",
- "affilate", "affiliate",
- "affintiy", "affinity",
- "affleunt", "affluent",
- "affulent", "affluent",
- "afircans", "africans",
- "africain", "african",
- "afternon", "afternoon",
- "againnst", "against",
- "agnositc", "agnostic",
- "agonstic", "agnostic",
- "agravate", "aggravate",
- "agreemnt", "agreement",
- "agregate", "aggregate",
- "agressie", "agressive",
- "agressor", "aggressor",
- "agrieved", "aggrieved",
- "agruable", "arguable",
- "agruably", "arguably",
- "agrument", "argument",
- "ahtletes", "athletes",
- "aincents", "ancients",
- "airboner", "airborne",
- "airbrone", "airborne",
- "aircarft", "aircraft",
- "airplans", "airplanes",
- "airporta", "airports",
- "airpsace", "airspace",
- "airscape", "airspace",
- "akransas", "arkansas",
- "alchemey", "alchemy",
- "alchohol", "alcohol",
- "alcholic", "alcoholic",
- "alcoholc", "alcoholics",
- "aldutery", "adultery",
- "aleniate", "alienate",
- "algoritm", "algorithm",
- "alimoney", "alimony",
- "alirghty", "alrighty",
- "allaince", "alliance",
- "alledged", "alleged",
- "alledges", "alleges",
- "allegedy", "allegedly",
- "allegely", "allegedly",
- "allegric", "allergic",
- "allergey", "allergy",
- "allianse", "alliances",
- "alligned", "aligned",
- "allinace", "alliance",
- "allopone", "allophone",
- "allready", "already",
- "almigthy", "almighty",
- "alpahbet", "alphabet",
- "alrigthy", "alrighty",
- "altantic", "atlantic",
- "alterato", "alteration",
- "alternar", "alternator",
- "althetes", "athletes",
- "althetic", "athletic",
- "altriusm", "altruism",
- "altrusim", "altruism",
- "alturism", "altruism",
- "aluminim", "aluminium",
- "alumnium", "aluminum",
- "alunimum", "aluminum",
- "amatersu", "amateurs",
- "amaterus", "amateurs",
- "amendmet", "amendments",
- "amercian", "american",
- "amercias", "americas",
- "amernian", "armenian",
- "amethsyt", "amethyst",
- "ameythst", "amethyst",
- "ammended", "amended",
- "amnestry", "amnesty",
- "amoungst", "amongst",
- "amplifiy", "amplify",
- "amplifly", "amplify",
- "amrchair", "armchair",
- "amrenian", "armenian",
- "amtheyst", "amethyst",
- "analgoue", "analogue",
- "analisys", "analysis",
- "analitic", "analytic",
- "analouge", "analogue",
- "analysie", "analyse",
- "analysit", "analyst",
- "analyste", "analyse",
- "analysze", "analyse",
- "analzyed", "analyzed",
- "anaolgue", "analogue",
- "anarchim", "anarchism",
- "anaylses", "analyses",
- "anaylsis", "analysis",
- "anaylsts", "analysts",
- "anaylzed", "analyzed",
- "ancedote", "anecdote",
- "anceints", "ancients",
- "ancinets", "ancients",
- "andoirds", "androids",
- "andorids", "androids",
- "andriods", "androids",
- "anecdots", "anecdotes",
- "anectode", "anecdote",
- "anedocte", "anecdote",
- "aneroxia", "anorexia",
- "aneroxic", "anorexic",
- "angostic", "agnostic",
- "angrilly", "angrily",
- "anicents", "ancients",
- "animatie", "animate",
- "animatte", "animate",
- "anlayses", "analyses",
- "annoints", "anoints",
- "annouced", "announced",
- "annoucne", "announce",
- "anntenas", "antennas",
- "anoerxia", "anorexia",
- "anoerxic", "anorexic",
- "anonymos", "anonymous",
- "anoreixa", "anorexia",
- "anounced", "announced",
- "anoxeria", "anorexia",
- "anoxeric", "anorexic",
- "answeres", "answers",
- "antartic", "antarctic",
- "antennea", "antenna",
- "antennna", "antenna",
- "anticipe", "anticipate",
- "antiquae", "antique",
- "antivirs", "antivirus",
- "anwsered", "answered",
- "anyhting", "anything",
- "anyhwere", "anywhere",
- "anyoneis", "anyones",
- "anythign", "anything",
- "anytying", "anything",
- "aparment", "apartment",
- "apartmet", "apartments",
- "apenines", "apennines",
- "aperutre", "aperture",
- "aplhabet", "alphabet",
- "apologes", "apologise",
- "aposltes", "apostles",
- "apostels", "apostles",
- "appaluse", "applause",
- "apparant", "apparent",
- "appareal", "apparel",
- "appareil", "apparel",
- "apperead", "appeared",
- "applaued", "applaud",
- "appluase", "applause",
- "appology", "apology",
- "apporach", "approach",
- "appraoch", "approach",
- "apreture", "aperture",
- "apsotles", "apostles",
- "aqaurium", "aquarium",
- "aqcuired", "acquired",
- "aquaduct", "aqueduct",
- "aquairum", "aquarium",
- "aquaruim", "aquarium",
- "aquiring", "acquiring",
- "aquitted", "acquitted",
- "arbitary", "arbitrary",
- "arbitray", "arbitrary",
- "arbiture", "arbiter",
- "architet", "architect",
- "archtype", "archetype",
- "aremnian", "armenian",
- "argentia", "argentina",
- "argubaly", "arguably",
- "arguemet", "arguement",
- "arguemtn", "arguement",
- "ariborne", "airborne",
- "aricraft", "aircraft",
- "ariplane", "airplane",
- "ariports", "airports",
- "arispace", "airspace",
- "aristote", "aristotle",
- "aritfact", "artifact",
- "arizonia", "arizona",
- "arkasnas", "arkansas",
- "arlighty", "alrighty",
- "armamant", "armament",
- "armenain", "armenian",
- "armenina", "armenian",
- "armpitts", "armpits",
- "armstrog", "armstrong",
- "arpanoid", "paranoid",
- "arpeture", "aperture",
- "arragned", "arranged",
- "arrestes", "arrests",
- "arrestos", "arrests",
- "arsenaal", "arsenal",
- "artemios", "artemis",
- "artemius", "artemis",
- "arthrits", "arthritis",
- "articule", "articulate",
- "artifacs", "artifacts",
- "artifcat", "artifact",
- "artilley", "artillery",
- "artisitc", "artistic",
- "artistas", "artists",
- "arugable", "arguable",
- "arugably", "arguably",
- "arugment", "argument",
- "asborbed", "absorbed",
- "asburdly", "absurdly",
- "ascneded", "ascended",
- "asissted", "assisted",
- "askreddt", "askreddit",
- "asnwered", "answered",
- "aspectos", "aspects",
- "asperges", "aspergers",
- "assasins", "assassins",
- "assemple", "assemble",
- "assertin", "assertions",
- "asshates", "asshats",
- "asshatts", "asshats",
- "assimile", "assimilate",
- "assistat", "assistants",
- "assitant", "assistant",
- "assmeble", "assemble",
- "assmebly", "assembly",
- "asssasin", "assassin",
- "assualts", "assaults",
- "asteorid", "asteroid",
- "asteriks", "asterisk",
- "asteriod", "asteroid",
- "asterois", "asteroids",
- "astersik", "asterisk",
- "asthetic", "aesthetic",
- "astronat", "astronaut",
- "asutrian", "austrian",
- "atheisim", "atheism",
- "atheistc", "atheistic",
- "atheltes", "athletes",
- "atheltic", "athletic",
- "athenean", "athenian",
- "athesits", "atheists",
- "athetlic", "athletic",
- "athients", "athiest",
- "atittude", "attitude",
- "atlantia", "atlanta",
- "atmoizer", "atomizer",
- "atomzier", "atomizer",
- "atribute", "attribute",
- "atrifact", "artifact",
- "attackes", "attackers",
- "attemped", "attempted",
- "attemted", "attempted",
- "attemtps", "attempts",
- "attidute", "attitude",
- "attitide", "attitude",
- "attribue", "attribute",
- "aucitons", "auctions",
- "audactiy", "audacity",
- "audcaity", "audacity",
- "audeince", "audience",
- "audiobok", "audiobook",
- "austeriy", "austerity",
- "austiran", "austrian",
- "austitic", "autistic",
- "austrain", "austrian",
- "australa", "australian",
- "austrija", "austria",
- "austrila", "austria",
- "autisitc", "autistic",
- "autoattk", "autoattack",
- "autograh", "autograph",
- "automato", "automation",
- "automony", "autonomy",
- "autority", "authority",
- "autsitic", "autistic",
- "auxilary", "auxiliary",
- "avacodos", "avocados",
- "avaiable", "available",
- "availabe", "available",
- "availble", "available",
- "avaition", "aviation",
- "avalable", "available",
- "avalance", "avalanche",
- "avataras", "avatars",
- "avatards", "avatars",
- "avatares", "avatars",
- "averadge", "averaged",
- "avergaed", "averaged",
- "avergaes", "averages",
- "aviaiton", "aviation",
- "avilable", "available",
- "avnegers", "avengers",
- "avodacos", "avocados",
- "awekened", "weakened",
- "awesomey", "awesomely",
- "awfullly", "awfully",
- "awkwardy", "awkwardly",
- "awnsered", "answered",
- "babysite", "babysitter",
- "baceause", "because",
- "bacehlor", "bachelor",
- "bachleor", "bachelor",
- "bacholer", "bachelor",
- "backeast", "backseat",
- "backerds", "backers",
- "backfied", "backfield",
- "backpacs", "backpacks",
- "balcanes", "balances",
- "balconey", "balcony",
- "balconny", "balcony",
- "ballistc", "ballistic",
- "balnaced", "balanced",
- "banannas", "bananas",
- "banditas", "bandits",
- "bandwith", "bandwidth",
- "bangkock", "bangkok",
- "baptisim", "baptism",
- "barabric", "barbaric",
- "barbarin", "barbarian",
- "barbaris", "barbarians",
- "bardford", "bradford",
- "bargaing", "bargaining",
- "baristia", "barista",
- "barrakcs", "barracks",
- "barrells", "barrels",
- "basicaly", "basically",
- "basiclay", "basicly",
- "basicley", "basicly",
- "basicliy", "basicly",
- "batistia", "batista",
- "battalin", "battalion",
- "bayonent", "bayonet",
- "beachead", "beachhead",
- "beacuoup", "beaucoup",
- "beardude", "bearded",
- "beastley", "beastly",
- "beatiful", "beautiful",
- "beccause", "because",
- "becuasse", "becuase",
- "befirend", "befriend",
- "befreind", "befriend",
- "begginer", "beginner",
- "begginig", "begging",
- "begginng", "begging",
- "begining", "beginning",
- "beginnig", "beginning",
- "behaivor", "behavior",
- "behavios", "behaviours",
- "behavoir", "behavior",
- "behavour", "behavior",
- "behngazi", "benghazi",
- "behtesda", "bethesda",
- "beleived", "believed",
- "beleiver", "believer",
- "beleives", "believes",
- "beliefes", "beliefs",
- "benefica", "beneficial",
- "bengahzi", "benghazi",
- "bengalas", "bengals",
- "bengalos", "bengals",
- "bengazhi", "benghazi",
- "benghzai", "benghazi",
- "bengzhai", "benghazi",
- "benhgazi", "benghazi",
- "benidect", "benedict",
- "benifits", "benefits",
- "berekley", "berkeley",
- "berserkr", "berserker",
- "beseiged", "besieged",
- "betehsda", "bethesda",
- "beteshda", "bethesda",
- "bethdesa", "bethesda",
- "bethedsa", "bethesda",
- "bethseda", "bethesda",
- "beyoncye", "beyonce",
- "bibilcal", "biblical",
- "bicylces", "bicycles",
- "bigfooot", "bigfoot",
- "bigining", "beginning",
- "bilbical", "biblical",
- "billboad", "billboard",
- "bilsters", "blisters",
- "bilzzard", "blizzard",
- "bilzzcon", "blizzcon",
- "biologia", "biological",
- "birhtday", "birthday",
- "birsbane", "brisbane",
- "birthdsy", "birthdays",
- "biseuxal", "bisexual",
- "bisexaul", "bisexual",
- "bitcions", "bitcoins",
- "bitocins", "bitcoins",
- "blackade", "blacked",
- "blackend", "blacked",
- "blackjak", "blackjack",
- "blacklit", "blacklist",
- "blatanty", "blatantly",
- "blessins", "blessings",
- "blessure", "blessing",
- "bloggare", "blogger",
- "bloggeur", "blogger",
- "bluebery", "blueberry",
- "bluetooh", "bluetooth",
- "blugaria", "bulgaria",
- "boardway", "broadway",
- "bollcoks", "bollocks",
- "bomberos", "bombers",
- "bookmars", "bookmarks",
- "boradway", "broadway",
- "boredoom", "boredom",
- "bouldore", "boulder",
- "bounites", "bounties",
- "boutnies", "bounties",
- "boutqiue", "boutique",
- "bouyancy", "buoyancy",
- "boyfried", "boyfriend",
- "bradcast", "broadcast",
- "bradfrod", "bradford",
- "brakeout", "breakout",
- "braodway", "broadway",
- "braverly", "bravery",
- "breathis", "breaths",
- "breathos", "breaths",
- "brekaout", "breakout",
- "brendamn", "brendan",
- "breweres", "brewers",
- "brewerey", "brewery",
- "brewerks", "brewers",
- "brewerys", "brewers",
- "brigaged", "brigade",
- "brigated", "brigade",
- "brigthen", "brighten",
- "briliant", "brilliant",
- "brillant", "brilliant",
- "bristool", "bristol",
- "brithday", "birthday",
- "brittish", "british",
- "briusers", "bruisers",
- "broadbad", "broadband",
- "broadcat", "broadcasts",
- "broadley", "broadly",
- "brocolli", "broccoli",
- "brodaway", "broadway",
- "broncoes", "broncos",
- "broswing", "browsing",
- "browines", "brownies",
- "browisng", "browsing",
- "brtually", "brutally",
- "brugundy", "burgundy",
- "bruisend", "bruised",
- "brussles", "brussels",
- "brusting", "bursting",
- "bubblews", "bubbles",
- "buddhits", "buddhist",
- "buddhsim", "buddhism",
- "buddishm", "buddhism",
- "buddisht", "buddhist",
- "buglaria", "bulgaria",
- "buhddism", "buddhism",
- "buhddist", "buddhist",
- "buidlers", "builders",
- "buidling", "building",
- "buildins", "buildings",
- "buisness", "business",
- "bulagria", "bulgaria",
- "bulgaira", "bulgaria",
- "buliders", "builders",
- "buliding", "building",
- "bulletts", "bullets",
- "burisers", "bruisers",
- "burriots", "burritos",
- "burritio", "burrito",
- "burritto", "burrito",
- "burrtios", "burritos",
- "burssels", "brussels",
- "burtally", "brutally",
- "burtsing", "bursting",
- "busrting", "bursting",
- "butcherd", "butchered",
- "butterey", "buttery",
- "butterfy", "butterfly",
- "butterry", "buttery",
- "butthoel", "butthole",
- "bycicles", "bicycles",
- "cabbagge", "cabbage",
- "cabients", "cabinets",
- "cabinate", "cabinet",
- "cabinent", "cabinet",
- "cabniets", "cabinets",
- "caclulus", "calculus",
- "cafetera", "cafeteria",
- "caffinee", "caffeine",
- "cahsiers", "cashiers",
- "cainster", "canister",
- "calander", "calendar",
- "calcular", "calculator",
- "calgarry", "calgary",
- "calibler", "calibre",
- "caloires", "calories",
- "calrkson", "clarkson",
- "calroies", "calories",
- "calssify", "classify",
- "calulate", "calculate",
- "calymore", "claymore",
- "camapign", "campaign",
- "cambodai", "cambodia",
- "camboida", "cambodia",
- "cambpell", "campbell",
- "cambride", "cambridge",
- "cambrige", "cambridge",
- "camoufle", "camouflage",
- "campagin", "campaign",
- "campaing", "campaign",
- "campains", "campaigns",
- "camperas", "campers",
- "camperos", "campers",
- "canadias", "canadians",
- "cananbis", "cannabis",
- "cancelas", "cancels",
- "canceles", "cancels",
- "cancells", "cancels",
- "canceres", "cancers",
- "cancerns", "cancers",
- "cancerus", "cancers",
- "candiate", "candidate",
- "candiens", "candies",
- "canistre", "canister",
- "cannabil", "cannibal",
- "cannbial", "cannibal",
- "cannibas", "cannabis",
- "cansiter", "canister",
- "capitans", "captains",
- "capitola", "capital",
- "capitulo", "capitol",
- "capmbell", "campbell",
- "capsuels", "capsules",
- "capsulse", "capsules",
- "capsumel", "capsule",
- "capteurs", "captures",
- "captials", "capitals",
- "captians", "captains",
- "capusles", "capsules",
- "caputres", "captures",
- "cardboad", "cardboard",
- "cardianl", "cardinal",
- "cardnial", "cardinal",
- "careflly", "carefully",
- "carefull", "careful",
- "carefuly", "carefully",
- "caricate", "caricature",
- "caridgan", "cardigan",
- "caridnal", "cardinal",
- "carinval", "carnival",
- "carloina", "carolina",
- "carnagie", "carnegie",
- "carnigie", "carnegie",
- "carnvial", "carnival",
- "carrotts", "carrots",
- "carrotus", "carrots",
- "cartells", "cartels",
- "cartmaan", "cartman",
- "cartride", "cartridge",
- "cartrige", "cartridge",
- "carvinal", "carnival",
- "casaulty", "casualty",
- "casheirs", "cashiers",
- "cashieer", "cashier",
- "cashires", "cashiers",
- "castleos", "castles",
- "castlers", "castles",
- "casulaty", "casualty",
- "cataclym", "cataclysm",
- "catagory", "category",
- "cataline", "catiline",
- "cataloge", "catalogue",
- "catalsyt", "catalyst",
- "cataylst", "catalyst",
- "cathloic", "catholic",
- "catlayst", "catalyst",
- "caucasin", "caucasian",
- "causalty", "casualty",
- "cellural", "cellular",
- "celullar", "cellular",
- "celverly", "cleverly",
- "cemetary", "cemetery",
- "centeres", "centers",
- "centerns", "centers",
- "centrase", "centres",
- "centrers", "centres",
- "ceratine", "creatine",
- "cerberal", "cerebral",
- "cerbreus", "cerberus",
- "cerbures", "cerberus",
- "ceremone", "ceremonies",
- "cerimony", "ceremony",
- "ceromony", "ceremony",
- "certainy", "certainty",
- "challege", "challenge",
- "chambear", "chamber",
- "chambres", "chambers",
- "champage", "champagne",
- "chanisaw", "chainsaw",
- "chanlder", "chandler",
- "charcaol", "charcoal",
- "chargehr", "charger",
- "chargeur", "charger",
- "chariman", "chairman",
- "charimsa", "charisma",
- "charmisa", "charisma",
- "charocal", "charcoal",
- "charsima", "charisma",
- "chasiers", "cashiers",
- "chassids", "chassis",
- "chassies", "chassis",
- "chatolic", "catholic",
- "chcukles", "chuckles",
- "checkare", "checker",
- "checkear", "checker",
- "cheesees", "cheeses",
- "cheeseus", "cheeses",
- "cheetoos", "cheetos",
- "chemcial", "chemical",
- "chemisty", "chemistry",
- "chernobl", "chernobyl",
- "chiansaw", "chainsaw",
- "chidlish", "childish",
- "chihuaha", "chihuahua",
- "childres", "childrens",
- "chillade", "chilled",
- "chillead", "chilled",
- "chillend", "chilled",
- "chilvary", "chivalry",
- "chinesse", "chinese",
- "chivarly", "chivalry",
- "chivlary", "chivalry",
- "chlidish", "childish",
- "chlroine", "chlorine",
- "chmabers", "chambers",
- "chocolae", "chocolates",
- "chocolet", "chocolates",
- "choesive", "cohesive",
- "choicers", "choices",
- "cholrine", "chlorine",
- "chorline", "chlorine",
- "chracter", "character",
- "christin", "christian",
- "chroline", "chlorine",
- "chromose", "chromosome",
- "chronice", "chronicles",
- "chruches", "churches",
- "chuckels", "chuckles",
- "cielings", "ceilings",
- "cigarete", "cigarettes",
- "cigarets", "cigarettes",
- "cilmbers", "climbers",
- "cilnatro", "cilantro",
- "ciltoris", "clitoris",
- "circiuts", "circuits",
- "circkets", "crickets",
- "circlebs", "circles",
- "circluar", "circular",
- "ciricuit", "circuit",
- "cirlcing", "circling",
- "ciruclar", "circular",
- "clannand", "clannad",
- "clarifiy", "clarify",
- "clarskon", "clarkson",
- "clasical", "classical",
- "classrom", "classroom",
- "classsic", "classics",
- "clausens", "clauses",
- "cleanies", "cleanse",
- "cleasner", "cleanser",
- "clenaser", "cleanser",
- "clevelry", "cleverly",
- "clhorine", "chlorine",
- "cliamtes", "climates",
- "cliantro", "cilantro",
- "clickare", "clicker",
- "clickbat", "clickbait",
- "clickear", "clicker",
- "clientes", "clients",
- "clincial", "clinical",
- "clinicas", "clinics",
- "clinicos", "clinics",
- "clipboad", "clipboard",
- "clitiros", "clitoris",
- "closeing", "closing",
- "closeley", "closely",
- "clyamore", "claymore",
- "clyinder", "cylinder",
- "cmoputer", "computer",
- "coindice", "coincide",
- "collapes", "collapse",
- "collares", "collars",
- "collaris", "collars",
- "collaros", "collars",
- "collaspe", "collapse",
- "colleage", "colleagues",
- "collecte", "collective",
- "collegue", "colleague",
- "collisin", "collisions",
- "collosal", "colossal",
- "collpase", "collapse",
- "coloardo", "colorado",
- "colordao", "colorado",
- "colubmia", "columbia",
- "columnas", "columns",
- "comadres", "comrades",
- "comander", "commander",
- "comandos", "commandos",
- "comapany", "company",
- "comapres", "compares",
- "combiens", "combines",
- "combinig", "combining",
- "comediac", "comedic",
- "comedias", "comedians",
- "comestic", "cosmetic",
- "comision", "commission",
- "comiting", "committing",
- "comitted", "committed",
- "comittee", "committee",
- "commandd", "commanded",
- "commecen", "commence",
- "commedic", "comedic",
- "commense", "commenters",
- "commenty", "commentary",
- "commiest", "commits",
- "commited", "committed",
- "commitee", "committee",
- "commites", "commits",
- "committe", "committee",
- "committs", "commits",
- "commitus", "commits",
- "commmand", "command",
- "communit", "communist",
- "companis", "companions",
- "comparse", "compares",
- "comparte", "compare",
- "compasso", "compassion",
- "compelte", "complete",
- "compense", "compensate",
- "complais", "complains",
- "complane", "complacent",
- "complate", "complacent",
- "compleet", "complete",
- "completi", "complexity",
- "complets", "completes",
- "complety", "completely",
- "complexs", "complexes",
- "complext", "complexity",
- "complexy", "complexity",
- "complict", "complicit",
- "complier", "compiler",
- "compones", "compose",
- "componet", "components",
- "componts", "compost",
- "composet", "compost",
- "composit", "compost",
- "composte", "compose",
- "comprese", "compressed",
- "compreso", "compressor",
- "compsers", "compress",
- "comptown", "compton",
- "compunet", "compute",
- "computre", "compute",
- "comradre", "comrade",
- "comsetic", "cosmetic",
- "conatins", "contains",
- "conceald", "concealed",
- "conceide", "conceived",
- "conceled", "concede",
- "concened", "concede",
- "concepta", "conceptual",
- "concered", "concede",
- "concernt", "concert",
- "concerte", "concrete",
- "concesso", "concession",
- "conceted", "concede",
- "conceved", "concede",
- "concibes", "concise",
- "concider", "consider",
- "concides", "concise",
- "concious", "conscious",
- "conclued", "conclude",
- "concluse", "conclusive",
- "concluso", "conclusion",
- "concreet", "concrete",
- "concrets", "concerts",
- "condemnd", "condemned",
- "conditon", "condition",
- "condomes", "condoms",
- "condomns", "condoms",
- "conduict", "conduit",
- "conected", "connected",
- "conencts", "connects",
- "confeses", "confess",
- "confesos", "confess",
- "confesso", "confession",
- "configue", "configure",
- "confilct", "conflict",
- "confirmd", "confirmed",
- "conflcit", "conflict",
- "conflics", "conflicts",
- "confrims", "confirms",
- "conicide", "coincide",
- "conlcude", "conclude",
- "conqueor", "conquer",
- "conquerd", "conquered",
- "conqured", "conquered",
- "conscent", "consent",
- "consious", "conscious",
- "constans", "constants",
- "constast", "constants",
- "constatn", "constant",
- "constrat", "constraint",
- "construt", "constructs",
- "containd", "contained",
- "containg", "containing",
- "contaire", "containers",
- "contanti", "contacting",
- "contense", "contenders",
- "contenst", "contents",
- "contexta", "contextual",
- "contextl", "contextual",
- "contians", "contains",
- "contined", "continued",
- "contines", "continents",
- "continum", "continuum",
- "continus", "continues",
- "continut", "continuity",
- "continuu", "continuous",
- "contracr", "contractor",
- "contracs", "contracts",
- "controll", "control",
- "convenit", "convenient",
- "convento", "convention",
- "converst", "converts",
- "convertr", "converter",
- "conviced", "convinced",
- "convicto", "conviction",
- "convingi", "convincing",
- "convinse", "convinces",
- "cooldows", "cooldowns",
- "coordine", "coordinate",
- "coralina", "carolina",
- "corollla", "corolla",
- "corolloa", "corolla",
- "corosion", "corrosion",
- "corpsers", "corpses",
- "corrdior", "corridor",
- "correcty", "correctly",
- "correnti", "correcting",
- "corretly", "correctly",
- "corrupto", "corruption",
- "cosemtic", "cosmetic",
- "cosutmes", "costumes",
- "couldnot", "couldnt",
- "coulored", "coloured",
- "counries", "countries",
- "counseil", "counsel",
- "counsole", "counsel",
- "counterd", "countered",
- "countert", "counteract",
- "countres", "counters",
- "courtrom", "courtroom",
- "courtsey", "courtesy",
- "cousines", "cousins",
- "cousings", "cousins",
- "coutners", "counters",
- "covanent", "covenant",
- "coverted", "converted",
- "coyotees", "coyotes",
- "cpatains", "captains",
- "cranbery", "cranberry",
- "crayones", "crayons",
- "creaeted", "created",
- "createin", "creatine",
- "createur", "creature",
- "creatien", "creatine",
- "creepgin", "creeping",
- "cricling", "circling",
- "cringely", "cringey",
- "cringery", "cringey",
- "criticas", "critics",
- "critices", "critics",
- "criticie", "criticise",
- "criticim", "criticisms",
- "criticis", "critics",
- "criticms", "critics",
- "criticos", "critics",
- "criticts", "critics",
- "criticus", "critics",
- "critiera", "criteria",
- "critized", "criticized",
- "croatioa", "croatia",
- "crossfie", "crossfire",
- "crosshar", "crosshair",
- "crosspot", "crosspost",
- "crowbahr", "crowbar",
- "cruasder", "crusader",
- "cruciaal", "crucial",
- "crucibel", "crucible",
- "cruicble", "crucible",
- "crusdaer", "crusader",
- "crusiers", "cruisers",
- "crusiing", "cruising",
- "cruthces", "crutches",
- "cthulhlu", "cthulhu",
- "cthulluh", "cthulhu",
- "cubpoard", "cupboard",
- "cuddleys", "cuddles",
- "culprint", "culprit",
- "cultrual", "cultural",
- "culutral", "cultural",
- "cupbaord", "cupboard",
- "cupborad", "cupboard",
- "curcible", "crucible",
- "curisers", "cruisers",
- "curising", "cruising",
- "currecny", "currency",
- "currence", "currencies",
- "currenly", "currently",
- "currenty", "currently",
- "cursader", "crusader",
- "custcene", "cutscene",
- "cutsceen", "cutscene",
- "cutscens", "cutscenes",
- "cutsence", "cutscene",
- "cylcists", "cyclists",
- "cylidner", "cylinder",
- "cylindre", "cylinder",
- "cynisicm", "cynicism",
- "cyrstals", "crystals",
- "dacquiri", "daiquiri",
- "daimonds", "diamonds",
- "dangeros", "dangers",
- "dangerus", "dangers",
- "darkenss", "darkness",
- "darnkess", "darkness",
- "dashboad", "dashboard",
- "daugther", "daughter",
- "deadlfit", "deadlift",
- "deadlifs", "deadlifts",
- "deafeted", "defeated",
- "deafults", "defaults",
- "dealying", "delaying",
- "deamenor", "demeanor",
- "deathcat", "deathmatch",
- "debuffes", "debuffs",
- "debufffs", "debuffs",
- "decalred", "declared",
- "decalres", "declares",
- "decembre", "december",
- "decidely", "decidedly",
- "decieved", "deceived",
- "decifits", "deficits",
- "decipted", "depicted",
- "declears", "declares",
- "declinig", "declining",
- "decmeber", "december",
- "decribed", "described",
- "decribes", "describes",
- "dedicato", "dedication",
- "deductie", "deductible",
- "defautls", "defaults",
- "defectos", "defects",
- "defectus", "defects",
- "defendas", "defends",
- "defendes", "defenders",
- "defendis", "defends",
- "defendre", "defender",
- "defendrs", "defends",
- "defensea", "defenseman",
- "defensen", "defenseman",
- "defensie", "defensive",
- "defetead", "defeated",
- "deffined", "defined",
- "deficiet", "deficient",
- "definate", "definite",
- "definaty", "definately",
- "definety", "definetly",
- "definito", "definition",
- "definitv", "definitive",
- "deflatin", "deflation",
- "deflecto", "deflection",
- "defualts", "defaults",
- "degarded", "degraded",
- "degenere", "degenerate",
- "degraged", "degrade",
- "degrated", "degrade",
- "deisgned", "designed",
- "deisgner", "designer",
- "dekstops", "desktops",
- "delcared", "declared",
- "delcares", "declares",
- "delepted", "depleted",
- "delivere", "deliveries",
- "delpeted", "depleted",
- "delpoyed", "deployed",
- "delyaing", "delaying",
- "demandas", "demands",
- "demandes", "demands",
- "demenaor", "demeanor",
- "democray", "democracy",
- "demolito", "demolition",
- "denseley", "densely",
- "densitiy", "density",
- "deomcrat", "democrat",
- "deovtion", "devotion",
- "departer", "departure",
- "departue", "departure",
- "depcited", "depicted",
- "depelted", "depleted",
- "dependat", "dependant",
- "depictes", "depicts",
- "depictin", "depictions",
- "depolyed", "deployed",
- "depositd", "deposited",
- "depostis", "deposits",
- "depresse", "depressive",
- "depresso", "depression",
- "derivate", "derivative",
- "descened", "descend",
- "descibed", "described",
- "descirbe", "describe",
- "descrise", "describes",
- "desgined", "designed",
- "desginer", "designer",
- "desicive", "decisive",
- "designad", "designated",
- "designes", "designs",
- "designet", "designated",
- "desinged", "designed",
- "desinger", "designer",
- "desitned", "destined",
- "desktiop", "desktop",
- "desorder", "disorder",
- "despides", "despised",
- "despiste", "despise",
- "destiney", "destiny",
- "destinty", "destiny",
- "destkops", "desktops",
- "destorys", "destroys",
- "destrose", "destroyers",
- "destroyd", "destroyed",
- "destroyr", "destroyers",
- "detalied", "detailed",
- "detectas", "detects",
- "detectes", "detects",
- "detectie", "detectives",
- "determen", "determines",
- "devasted", "devastated",
- "develope", "develop",
- "devialet", "deviate",
- "deviatie", "deviate",
- "devilers", "delivers",
- "devloved", "devolved",
- "devovled", "devolved",
- "diaganol", "diagonal",
- "diagnoal", "diagonal",
- "diagnoes", "diagnose",
- "diagnosi", "diagnostic",
- "diagonse", "diagnose",
- "diahrrea", "diarrhea",
- "dialetcs", "dialects",
- "dialgoue", "dialogue",
- "dialouge", "dialogue",
- "diarreah", "diarrhea",
- "diarreha", "diarrhea",
- "dichtomy", "dichotomy",
- "dickisch", "dickish",
- "dicovers", "discovers",
- "dicovery", "discovery",
- "dicussed", "discussed",
- "diferent", "different",
- "differnt", "different",
- "difficut", "difficulty",
- "diffrent", "different",
- "diganose", "diagnose",
- "dignitiy", "dignity",
- "dimaonds", "diamonds",
- "dinasour", "dinosaur",
- "dinosaus", "dinosaurs",
- "dinosuar", "dinosaur",
- "dinsoaur", "dinosaur",
- "dionsaur", "dinosaur",
- "diphtong", "diphthong",
- "diplomma", "diploma",
- "dipthong", "diphthong",
- "direclty", "directly",
- "directin", "directions",
- "directix", "directx",
- "directos", "directors",
- "directoy", "directory",
- "directrx", "directx",
- "dirfting", "drifting",
- "disabeld", "disabled",
- "disabels", "disables",
- "disagred", "disagreed",
- "disagres", "disagrees",
- "disbaled", "disabled",
- "disbales", "disables",
- "disbelif", "disbelief",
- "dischard", "discharged",
- "dischare", "discharged",
- "discound", "discounted",
- "discoure", "discourse",
- "discoved", "discovered",
- "discreto", "discretion",
- "discribe", "describe",
- "disentry", "dysentery",
- "disgiuse", "disguise",
- "dishoner", "dishonored",
- "dishonet", "dishonesty",
- "dislikse", "dislikes",
- "dismante", "dismantle",
- "dismisse", "dismissive",
- "disolved", "dissolved",
- "dispacth", "dispatch",
- "dispalys", "displays",
- "dispence", "dispense",
- "dispersa", "dispensary",
- "displayd", "displayed",
- "disposle", "dispose",
- "disposte", "dispose",
- "dispoves", "dispose",
- "disptach", "dispatch",
- "disricts", "districts",
- "dissovle", "dissolve",
- "distates", "distaste",
- "distatse", "distaste",
- "disticnt", "distinct",
- "distorto", "distortion",
- "distrcit", "district",
- "districs", "districts",
- "disturbd", "disturbed",
- "disupted", "disputed",
- "disuptes", "disputes",
- "diversed", "diverse",
- "diversiy", "diversify",
- "dividens", "dividends",
- "divintiy", "divinity",
- "divisons", "divisions",
- "doapmine", "dopamine",
- "docrines", "doctrines",
- "docrtine", "doctrine",
- "doctines", "doctrines",
- "doctirne", "doctrine",
- "doctrins", "doctrines",
- "dogamtic", "dogmatic",
- "dolhpins", "dolphins",
- "domapine", "dopamine",
- "domecrat", "democrat",
- "domiante", "dominate",
- "dominato", "domination",
- "dominats", "dominates",
- "dominent", "dominant",
- "dominoin", "dominion",
- "donwload", "download",
- "donwvote", "downvote",
- "doomdsay", "doomsday",
- "doosmday", "doomsday",
- "doplhins", "dolphins",
- "dopmaine", "dopamine",
- "dormtund", "dortmund",
- "dortumnd", "dortmund",
- "dotrmund", "dortmund",
- "douchely", "douchey",
- "doucheus", "douches",
- "dowloads", "downloads",
- "downlaod", "download",
- "downloas", "downloads",
- "downstar", "downstairs",
- "downvore", "downvoters",
- "downvotr", "downvoters",
- "downvots", "downvotes",
- "draculea", "dracula",
- "draculla", "dracula",
- "dragones", "dragons",
- "dragonus", "dragons",
- "drfiting", "drifting",
- "driectly", "directly",
- "drifitng", "drifting",
- "driveris", "drivers",
- "drotmund", "dortmund",
- "duaghter", "daughter",
- "dumbbels", "dumbbells",
- "dumptser", "dumpster",
- "dumspter", "dumpster",
- "dunegons", "dungeons",
- "dungeoun", "dungeon",
- "dungoens", "dungeons",
- "dupicate", "duplicate",
- "duplicas", "duplicates",
- "dwarvens", "dwarves",
- "dyanmics", "dynamics",
- "dyanmite", "dynamite",
- "dymanics", "dynamics",
- "dymanite", "dynamite",
- "dynastry", "dynasty",
- "dysentry", "dysentery",
- "dysphora", "dysphoria",
- "earilest", "earliest",
- "eatswood", "eastwood",
- "eceonomy", "economy",
- "ecidious", "deciduous",
- "ecologia", "ecological",
- "ecomonic", "economic",
- "ecstacys", "ecstasy",
- "ecstascy", "ecstasy",
- "ecstasty", "ecstasy",
- "ectastic", "ecstatic",
- "editoras", "editors",
- "editores", "editors",
- "efficent", "efficient",
- "egpytian", "egyptian",
- "egyptain", "egyptian",
- "egytpian", "egyptian",
- "ehtereal", "ethereal",
- "ehternet", "ethernet",
- "eigtheen", "eighteen",
- "electhor", "electro",
- "electorn", "electron",
- "elementy", "elementary",
- "elephans", "elephants",
- "elevatin", "elevation",
- "elicided", "elicited",
- "eligable", "eligible",
- "elimiate", "eliminate",
- "eliminas", "eliminates",
- "elitisim", "elitism",
- "elitistm", "elitism",
- "ellected", "elected",
- "embarass", "embarrass",
- "embargos", "embargoes",
- "embarras", "embarrass",
- "embassay", "embassy",
- "embassey", "embassy",
- "embasssy", "embassy",
- "emergend", "emerged",
- "emergerd", "emerged",
- "eminated", "emanated",
- "emminent", "eminent",
- "emmisary", "emissary",
- "emmision", "emission",
- "emmiting", "emitting",
- "emmitted", "emitted",
- "empathie", "empathize",
- "empirial", "empirical",
- "emulatin", "emulation",
- "enahnces", "enhances",
- "enchanct", "enchant",
- "encolsed", "enclosed",
- "endanged", "endangered",
- "endevors", "endeavors",
- "endevour", "endeavour",
- "endlessy", "endlessly",
- "endorces", "endorse",
- "engeneer", "engineer",
- "engeries", "energies",
- "engineed", "engineered",
- "engrames", "engrams",
- "engramms", "engrams",
- "enigneer", "engineer",
- "enitrely", "entirely",
- "enlcosed", "enclosed",
- "enlsaved", "enslaved",
- "ensalved", "enslaved",
- "enterity", "entirety",
- "entierly", "entirely",
- "entierty", "entirety",
- "entilted", "entitled",
- "entirley", "entirely",
- "entiteld", "entitled",
- "entitity", "entity",
- "entropay", "entropy",
- "entrophy", "entropy",
- "ephipany", "epiphany",
- "epihpany", "epiphany",
- "epilespy", "epilepsy",
- "epilgoue", "epilogue",
- "episdoes", "episodes",
- "epitomie", "epitome",
- "epliepsy", "epilepsy",
- "epliogue", "epilogue",
- "epsiodes", "episodes",
- "epsresso", "espresso",
- "eqaulity", "equality",
- "eqaution", "equation",
- "equailty", "equality",
- "eraticly", "erratically",
- "erroneos", "erroneous",
- "errupted", "erupted",
- "escalato", "escalation",
- "esctatic", "ecstatic",
- "esential", "essential",
- "esitmate", "estimate",
- "esperate", "seperate",
- "esportes", "esports",
- "estiamte", "estimate",
- "estoeric", "esoteric",
- "estonija", "estonia",
- "estoniya", "estonia",
- "etherael", "ethereal",
- "etherent", "ethernet",
- "ethicaly", "ethically",
- "etiquete", "etiquette",
- "etrailer", "retailer",
- "eugencis", "eugenics",
- "eugneics", "eugenics",
- "euhporia", "euphoria",
- "euhporic", "euphoric",
- "euorpean", "european",
- "euphoira", "euphoria",
- "euphroia", "euphoria",
- "euphroic", "euphoric",
- "europian", "european",
- "eurpoean", "european",
- "evangers", "avengers",
- "everyons", "everyones",
- "evidencd", "evidenced",
- "evidende", "evidenced",
- "evloving", "evolving",
- "evolveds", "evolves",
- "evolveos", "evolves",
- "evovling", "evolving",
- "excecute", "execute",
- "excedded", "exceeded",
- "excelent", "excellent",
- "exceptin", "exceptions",
- "excerise", "exercise",
- "excisted", "existed",
- "exclusie", "exclusives",
- "exculded", "excluded",
- "exculdes", "excludes",
- "exection", "execution",
- "exectued", "executed",
- "executie", "executive",
- "executin", "execution",
- "exellent", "excellent",
- "exerbate", "exacerbate",
- "exercide", "exercised",
- "exercies", "exercise",
- "exersice", "exercise",
- "exersize", "exercise",
- "exhalted", "exalted",
- "exhaustn", "exhaustion",
- "exhausto", "exhaustion",
- "exicting", "exciting",
- "exisitng", "existing",
- "existane", "existance",
- "existant", "existent",
- "existend", "existed",
- "exlcuded", "excluded",
- "exlcudes", "excludes",
- "exlporer", "explorer",
- "exoticas", "exotics",
- "exoticos", "exotics",
- "expalins", "explains",
- "expandas", "expands",
- "expandes", "expands",
- "expansie", "expansive",
- "expectes", "expects",
- "expectus", "expects",
- "expedito", "expedition",
- "expences", "expense",
- "expensie", "expense",
- "expensve", "expense",
- "expertas", "experts",
- "expertis", "experts",
- "expertos", "experts",
- "expireds", "expires",
- "explaind", "explained",
- "explaing", "explaining",
- "expliots", "exploits",
- "explodie", "explode",
- "exploint", "exploit",
- "explosie", "explosive",
- "explosin", "explosions",
- "exploted", "explode",
- "expoldes", "explodes",
- "expolits", "exploits",
- "exportas", "exports",
- "exportes", "exports",
- "exportfs", "exports",
- "exposees", "exposes",
- "exposito", "exposition",
- "expresse", "expressive",
- "expresss", "expresses",
- "expressy", "expressly",
- "exressed", "expressed",
- "exsitent", "existent",
- "exsiting", "existing",
- "extactly", "exactly",
- "extemely", "extremely",
- "extendes", "extends",
- "extendos", "extends",
- "extenion", "extension",
- "extensie", "extensive",
- "extensis", "extensions",
- "extortin", "extortion",
- "extracto", "extraction",
- "extreems", "extremes",
- "extremly", "extremely",
- "eygptian", "egyptian",
- "faboulus", "fabulous",
- "fabricas", "fabrics",
- "fabrices", "fabrics",
- "fabricus", "fabrics",
- "faceplam", "facepalm",
- "facilisi", "facilities",
- "faciltiy", "facility",
- "facsists", "fascists",
- "factores", "factors",
- "factorys", "factors",
- "factualy", "factually",
- "faggotts", "faggots",
- "faggotus", "faggots",
- "falcones", "falcons",
- "falgship", "flagship",
- "faliures", "failures",
- "falseley", "falsely",
- "falshing", "flashing",
- "falvored", "flavored",
- "falvours", "flavours",
- "familair", "familiar",
- "famoulsy", "famously",
- "fanatism", "fanaticism",
- "fanatsic", "fanatics",
- "fanserve", "fanservice",
- "fantasty", "fantasy",
- "farcking", "fracking",
- "fascisim", "fascism",
- "fashiond", "fashioned",
- "fasicsts", "fascists",
- "fatigure", "fatigue",
- "favorits", "favorites",
- "favourie", "favourites",
- "feasable", "feasible",
- "feasbile", "feasible",
- "febraury", "february",
- "februray", "february",
- "feburary", "february",
- "fedility", "fidelity",
- "fedorahs", "fedoras",
- "fedorans", "fedoras",
- "feilding", "fielding",
- "feisable", "feasible",
- "feitshes", "fetishes",
- "feltcher", "fletcher",
- "felxible", "flexible",
- "feminint", "femininity",
- "feminsim", "feminism",
- "feromone", "pheromone",
- "fesiable", "feasible",
- "festivas", "festivals",
- "festivle", "festive",
- "fictious", "fictitious",
- "fideling", "fielding",
- "fideltiy", "fidelity",
- "fiedling", "fielding",
- "fiedlity", "fidelity",
- "fighitng", "fighting",
- "figthing", "fighting",
- "fileding", "fielding",
- "fimilies", "families",
- "finacial", "financial",
- "fineshes", "finesse",
- "fingersi", "fingertips",
- "finnisch", "finnish",
- "finsihes", "finishes",
- "firebals", "fireballs",
- "firendly", "friendly",
- "firmwear", "firmware",
- "firwmare", "firmware",
- "flaghsip", "flagship",
- "flamable", "flammable",
- "flasghip", "flagship",
- "flatterd", "flattered",
- "flatteur", "flatter",
- "flattire", "flatter",
- "flavores", "flavors",
- "flechter", "fletcher",
- "flecther", "fletcher",
- "flemmish", "flemish",
- "flethcer", "fletcher",
- "flexbile", "flexible",
- "flexibel", "flexible",
- "flippade", "flipped",
- "flitered", "filtered",
- "florecen", "florence",
- "floridia", "florida",
- "floruide", "fluoride",
- "floruish", "flourish",
- "flourine", "fluorine",
- "floursih", "flourish",
- "fluorish", "flourish",
- "fluroide", "fluoride",
- "folowing", "following",
- "fontrier", "fontier",
- "forasken", "forsaken",
- "forbiden", "forbidden",
- "foreamrs", "forearms",
- "foreksin", "foreskin",
- "forenics", "forensic",
- "forenisc", "forensic",
- "foresnic", "forensic",
- "foreward", "foreword",
- "foricbly", "forcibly",
- "forigven", "forgiven",
- "formatin", "formation",
- "formelly", "formerly",
- "formuals", "formulas",
- "fornesic", "forensic",
- "forresst", "forrest",
- "forsekan", "forsaken",
- "forsekin", "foreskin",
- "forsenic", "forensic",
- "forskaen", "forsaken",
- "forsting", "frosting",
- "fortitue", "fortitude",
- "fortunae", "fortune",
- "fortunte", "fortune",
- "forumlas", "formulas",
- "forunner", "forerunner",
- "fossiles", "fossils",
- "fossilis", "fossils",
- "foundary", "foundry",
- "fountian", "fountain",
- "fourties", "forties",
- "fowrards", "forwards",
- "frackign", "fracking",
- "framgent", "fragment",
- "franches", "franchise",
- "franchie", "franchises",
- "franciso", "francisco",
- "frankiln", "franklin",
- "franlkin", "franklin",
- "freckels", "freckles",
- "freindly", "friendly",
- "frequeny", "frequency",
- "friendle", "friendlies",
- "friendsi", "friendlies",
- "frimware", "firmware",
- "frogiven", "forgiven",
- "frointer", "frontier",
- "fromerly", "formerly",
- "froniter", "frontier",
- "fronteir", "frontier",
- "frosaken", "forsaken",
- "frutcose", "fructose",
- "fucntion", "function",
- "fufilled", "fulfilled",
- "fulfiled", "fulfilled",
- "fullfill", "fulfill",
- "funciton", "function",
- "fundirse", "fundies",
- "funniliy", "funnily",
- "funnilly", "funnily",
- "furctose", "fructose",
- "furition", "fruition",
- "furuther", "further",
- "futurers", "futures",
- "futureus", "futures",
- "gamemdoe", "gamemode",
- "gamepaly", "gameplay",
- "gamergat", "gamertag",
- "gammeode", "gamemode",
- "ganerate", "generate",
- "garantee", "guarantee",
- "gardient", "gradient",
- "garfeild", "garfield",
- "garfiled", "garfield",
- "garflied", "garfield",
- "garnison", "garrison",
- "garrions", "garrison",
- "garriosn", "garrison",
- "garrsion", "garrison",
- "gatherig", "gatherings",
- "gauarana", "guaraná",
- "gauntelt", "gauntlet",
- "gauntles", "gauntlets",
- "gaurdian", "guardian",
- "gaurding", "guarding",
- "gautnlet", "gauntlet",
- "gemoetry", "geometry",
- "generaly", "generally",
- "generase", "generates",
- "generats", "generates",
- "genialia", "genitalia",
- "genisues", "geniuses",
- "genitala", "genitalia",
- "genrates", "generates",
- "gentials", "genitals",
- "gentlemn", "gentlemen",
- "genuises", "geniuses",
- "geograpy", "geography",
- "geomerty", "geometry",
- "geomtery", "geometry",
- "germanos", "germans",
- "germanus", "germans",
- "gernades", "grenades",
- "giagbyte", "gigabyte",
- "gigabtye", "gigabyte",
- "gigaybte", "gigabyte",
- "gigbayte", "gigabyte",
- "gignatic", "gigantic",
- "giltched", "glitched",
- "giltches", "glitches",
- "girafffe", "giraffe",
- "girefing", "griefing",
- "girlling", "grilling",
- "gladiatr", "gladiator",
- "glichted", "glitched",
- "glichtes", "glitches",
- "glicthed", "glitched",
- "glicthes", "glitches",
- "glitchey", "glitchy",
- "glitchly", "glitchy",
- "glitchty", "glitchy",
- "glithced", "glitched",
- "glithces", "glitches",
- "gloablly", "globally",
- "glodberg", "goldberg",
- "glodfish", "goldfish",
- "gloriuos", "glorious",
- "gltiched", "glitched",
- "gltiches", "glitches",
- "gmaertag", "gamertag",
- "goblings", "goblins",
- "goddammn", "goddamn",
- "goddammt", "goddammit",
- "godesses", "goddesses",
- "godlberg", "goldberg",
- "godlfish", "goldfish",
- "godounov", "godunov",
- "godpseed", "godspeed",
- "godspede", "godspeed",
- "goldifsh", "goldfish",
- "gonewidl", "gonewild",
- "goodlcuk", "goodluck",
- "goregous", "gorgeous",
- "gorgoeus", "gorgeous",
- "gorillia", "gorilla",
- "gorillla", "gorilla",
- "gospells", "gospels",
- "gottleib", "gottlieb",
- "gourmelt", "gourmet",
- "gourment", "gourmet",
- "gouvener", "governor",
- "govement", "government",
- "goverend", "governed",
- "govermet", "goverment",
- "governer", "governor",
- "gradualy", "gradually",
- "grafield", "garfield",
- "grafitti", "graffiti",
- "grahpics", "graphics",
- "grahpite", "graphite",
- "graident", "gradient",
- "granolla", "granola",
- "graphcis", "graphics",
- "grapichs", "graphics",
- "grappnel", "grapple",
- "greandes", "grenades",
- "greatful", "grateful",
- "greeneer", "greener",
- "greenhoe", "greenhouse",
- "greenlad", "greenland",
- "greenore", "greener",
- "greusome", "gruesome",
- "grieifng", "griefing",
- "grifeing", "griefing",
- "grizzlay", "grizzly",
- "grizzley", "grizzly",
- "grpahics", "graphics",
- "grpahite", "graphite",
- "gruseome", "gruesome",
- "guantano", "guantanamo",
- "guardain", "guardian",
- "guardias", "guardians",
- "guaridan", "guardian",
- "guerrila", "guerrilla",
- "guidence", "guidance",
- "guiseppe", "giuseppe",
- "guitards", "guitars",
- "guitares", "guitars",
- "guitarit", "guitarist",
- "gullbile", "gullible",
- "gunanine", "guanine",
- "guniness", "guinness",
- "gunniess", "guinness",
- "guradian", "guardian",
- "gurading", "guarding",
- "gurantee", "guarantee",
- "guresome", "gruesome",
- "guttaral", "guttural",
- "gutteral", "guttural",
- "hacthing", "hatching",
- "hafltime", "halftime",
- "haircuit", "haircut",
- "halfitme", "halftime",
- "hallowen", "halloween",
- "hamburgr", "hamburgers",
- "hamitlon", "hamilton",
- "hamliton", "hamilton",
- "handcufs", "handcuffs",
- "handeldy", "handedly",
- "handlade", "handled",
- "handlare", "handler",
- "handledy", "handedly",
- "hannbial", "hannibal",
- "haording", "hoarding",
- "hapening", "happening",
- "happends", "happens",
- "happenes", "happens",
- "happilly", "happily",
- "harldine", "hardline",
- "harrased", "harassed",
- "harrases", "harasses",
- "hatchign", "hatching",
- "hatesink", "heatsink",
- "hathcing", "hatching",
- "headachs", "headaches",
- "headests", "headsets",
- "headhsot", "headshot",
- "headseat", "headset",
- "healthit", "healthiest",
- "heastink", "heatsink",
- "heathern", "heathen",
- "heatskin", "heatsink",
- "heaviliy", "heavily",
- "heavilly", "heavily",
- "heavnely", "heavenly",
- "hedeghog", "hedgehog",
- "hegdehog", "hedgehog",
- "heighest", "heights",
- "heighted", "heightened",
- "heirachy", "hierarchy",
- "heistant", "hesitant",
- "heistate", "hesitate",
- "hellifre", "hellfire",
- "helluvva", "helluva",
- "helpfull", "helpful",
- "heratige", "heritage",
- "herclues", "hercules",
- "heridity", "heredity",
- "heroicas", "heroics",
- "heroices", "heroics",
- "heroicos", "heroics",
- "heroicus", "heroics",
- "hertiage", "heritage",
- "herucles", "hercules",
- "hestiant", "hesitant",
- "hestiate", "hesitate",
- "heveanly", "heavenly",
- "hierachy", "hierarchy",
- "hierarcy", "hierarchy",
- "highlane", "highlander",
- "hindiusm", "hinduism",
- "hindusim", "hinduism",
- "hinudism", "hinduism",
- "hiptsers", "hipsters",
- "hispanis", "hispanics",
- "hispters", "hipsters",
- "histroic", "historic",
- "hodlings", "holdings",
- "hoenstly", "honestly",
- "hoildays", "holidays",
- "holdiays", "holidays",
- "hollywod", "hollywood",
- "homeword", "homeworld",
- "homineim", "hominem",
- "homineum", "hominem",
- "honeslty", "honestly",
- "honeymon", "honeymoon",
- "honsetly", "honestly",
- "hopefuly", "hopefully",
- "hopkings", "hopkins",
- "hopsital", "hospital",
- "horading", "hoarding",
- "horzions", "horizons",
- "hosptial", "hospital",
- "hosteles", "hostels",
- "hostiliy", "hostility",
- "hotshoot", "hotshot",
- "hotsport", "hotspot",
- "hsyteria", "hysteria",
- "htaching", "hatching",
- "htiboxes", "hitboxes",
- "huanting", "haunting",
- "humaniod", "humanoid",
- "humanite", "humanities",
- "humantiy", "humanity",
- "humerous", "humorous",
- "huminoid", "humanoid",
- "humitidy", "humidity",
- "humoural", "humoral",
- "humouros", "humorous",
- "humurous", "humorous",
- "hunderds", "hundreds",
- "hundread", "hundred",
- "hungarin", "hungarian",
- "huntmsan", "huntsman",
- "hutnsman", "huntsman",
- "hybrides", "hybrids",
- "hybridus", "hybrids",
- "hydorgen", "hydrogen",
- "hydratin", "hydration",
- "hydregon", "hydrogen",
- "hygience", "hygiene",
- "hygienne", "hygiene",
- "hyperbel", "hyperbole",
- "hypocrit", "hypocrite",
- "hyponsis", "hypnosis",
- "hyrdogen", "hydrogen",
- "icefrong", "icefrog",
- "icelings", "ceilings",
- "idaeidae", "idea",
- "idealogy", "ideology",
- "idealsim", "idealism",
- "idenfity", "identify",
- "idenitfy", "identify",
- "identite", "identities",
- "ideologe", "ideologies",
- "illiegal", "illegal",
- "illinios", "illinois",
- "illionis", "illinois",
- "illnesss", "illnesses",
- "illumini", "illuminati",
- "illustre", "illustrate",
- "illution", "illusion",
- "ilogical", "illogical",
- "ilterate", "literate",
- "imapired", "impaired",
- "imgrants", "migrants",
- "imigrant", "emigrant",
- "immboile", "immobile",
- "immenint", "imminent",
- "immersie", "immerse",
- "immersve", "immerse",
- "immitate", "imitate",
- "immoblie", "immobile",
- "immortas", "immortals",
- "impactes", "impacts",
- "impactos", "impacts",
- "imparied", "impaired",
- "imperavi", "imperative",
- "imperfet", "imperfect",
- "implemet", "implements",
- "implosed", "implode",
- "impluses", "impulses",
- "imporper", "improper",
- "importas", "imports",
- "importen", "importance",
- "importes", "imports",
- "imporved", "improved",
- "imporves", "improves",
- "impropre", "improper",
- "improted", "imported",
- "improvie", "improvised",
- "impusles", "impulses",
- "imrpoved", "improved",
- "imrpoves", "improves",
- "inbetwen", "inbetween",
- "inclince", "incline",
- "inclinde", "incline",
- "includng", "including",
- "incorect", "incorrect",
- "incuding", "including",
- "inculded", "included",
- "indianas", "indians",
- "indiands", "indians",
- "indiania", "indiana",
- "indianna", "indiana",
- "indianos", "indians",
- "indicato", "indication",
- "indicats", "indicators",
- "indonesa", "indonesia",
- "indulgue", "indulge",
- "infantis", "infants",
- "infantus", "infants",
- "infarred", "infrared",
- "infectin", "infections",
- "infermon", "inferno",
- "infiltre", "infiltrate",
- "infintie", "infinite",
- "infintiy", "infinity",
- "inflatie", "inflate",
- "influens", "influences",
- "informas", "informs",
- "informis", "informs",
- "infromal", "informal",
- "infromed", "informed",
- "ingenius", "ingenious",
- "ingition", "ignition",
- "ingorant", "ignorant",
- "inheriet", "inherit",
- "inherint", "inherit",
- "inhumaan", "inhuman",
- "inhumain", "inhuman",
- "inifnite", "infinite",
- "inifnity", "infinity",
- "inisghts", "insights",
- "initails", "initials",
- "initaite", "initiate",
- "initaled", "initialed",
- "initally", "initially",
- "initialy", "initially",
- "initmacy", "intimacy",
- "initmate", "intimate",
- "injustie", "injustices",
- "inlcuded", "included",
- "inlcudes", "includes",
- "innocens", "innocents",
- "innocuos", "innocuous",
- "innvoate", "innovate",
- "inocence", "innocence",
- "inpolite", "impolite",
- "inpsired", "inspired",
- "inquirey", "inquiry",
- "inquirie", "inquire",
- "inquiriy", "inquiry",
- "inrested", "inserted",
- "insanley", "insanely",
- "insectes", "insects",
- "insectos", "insects",
- "insertas", "inserts",
- "insertes", "inserts",
- "insertos", "inserts",
- "insidios", "insidious",
- "insigths", "insights",
- "insipred", "inspired",
- "insipres", "inspires",
- "insistas", "insists",
- "insistes", "insists",
- "insistis", "insists",
- "insmonia", "insomnia",
- "insomina", "insomnia",
- "insonmia", "insomnia",
- "inspried", "inspired",
- "inspries", "inspires",
- "instanse", "instances",
- "instanty", "instantly",
- "instered", "inserted",
- "insticnt", "instinct",
- "instincs", "instincts",
- "institue", "institute",
- "insultas", "insults",
- "insultes", "insults",
- "insultos", "insults",
- "intamicy", "intimacy",
- "intamite", "intimate",
- "intendes", "intends",
- "intendos", "intends",
- "intentas", "intents",
- "intented", "intended",
- "interace", "interacted",
- "interacs", "interacts",
- "interect", "interacted",
- "interent", "internet",
- "interese", "interested",
- "interfce", "interface",
- "intergal", "integral",
- "internts", "interns",
- "internus", "interns",
- "interpet", "interpret",
- "interrim", "interim",
- "interste", "interstate",
- "interupt", "interrupt",
- "intevene", "intervene",
- "intially", "initially",
- "intiials", "initials",
- "intimaty", "intimately",
- "intimide", "intimidate",
- "intregal", "integral",
- "intriuge", "intrigue",
- "introdue", "introduces",
- "introdus", "introduces",
- "introvet", "introvert",
- "intruige", "intrigue",
- "intutive", "intuitive",
- "inudstry", "industry",
- "inventer", "inventor",
- "invertes", "inverse",
- "invincil", "invincible",
- "invitato", "invitation",
- "invloved", "involved",
- "invloves", "involves",
- "invovled", "involved",
- "invovles", "involves",
- "iranains", "iranians",
- "iraninas", "iranians",
- "iritable", "irritable",
- "iritated", "irritated",
- "ironicly", "ironically",
- "irritato", "irritation",
- "isalmist", "islamist",
- "isarelis", "israelis",
- "islamits", "islamist",
- "islamsit", "islamist",
- "islandes", "islanders",
- "ismalist", "islamist",
- "isntalls", "installs",
- "isolatie", "isolate",
- "israelli", "israeli",
- "israleis", "israelis",
- "isralies", "israelis",
- "isrealis", "israelis",
- "issueing", "issuing",
- "italains", "italians",
- "jaguards", "jaguars",
- "jaguares", "jaguars",
- "jailbrek", "jailbreak",
- "jaimacan", "jamaican",
- "jamacain", "jamaican",
- "jamaicia", "jamaica",
- "jamiacan", "jamaican",
- "januaray", "january",
- "janurary", "january",
- "jeapardy", "jeopardy",
- "jefferry", "jeffery",
- "jefferty", "jeffery",
- "jennigns", "jennings",
- "jeoprady", "jeopardy",
- "jepoardy", "jeopardy",
- "jerusalm", "jerusalem",
- "jewelrey", "jewelry",
- "jewllery", "jewellery",
- "joanthan", "jonathan",
- "joepardy", "jeopardy",
- "johanine", "johannine",
- "jonatahn", "jonathan",
- "journaal", "journal",
- "journied", "journeyed",
- "journies", "journeys",
- "joysitck", "joystick",
- "juadaism", "judaism",
- "judaisim", "judaism",
- "judgemet", "judgements",
- "juducial", "judicial",
- "jugnling", "jungling",
- "junglign", "jungling",
- "junlging", "jungling",
- "justifiy", "justify",
- "juveline", "juvenile",
- "juvenlie", "juvenile",
- "katemine", "ketamine",
- "kennedey", "kennedy",
- "ketmaine", "ketamine",
- "keybaord", "keyboard",
- "keyboars", "keyboards",
- "keyborad", "keyboard",
- "keychian", "keychain",
- "kicthens", "kitchens",
- "kindgoms", "kingdoms",
- "kittiens", "kitties",
- "knockbak", "knockback",
- "knowlege", "knowledge",
- "knuckels", "knuckles",
- "koreanos", "koreans",
- "kunckles", "knuckles",
- "kurdisch", "kurdish",
- "labatory", "lavatory",
- "labenese", "lebanese",
- "laboraty", "laboratory",
- "laguages", "languages",
- "landscae", "landscapes",
- "langauge", "language",
- "lanucher", "launcher",
- "lanuches", "launches",
- "laodouts", "loadouts",
- "larwence", "lawrence",
- "lasagnea", "lasagna",
- "lasagnia", "lasagna",
- "laucnhed", "launched",
- "laucnher", "launcher",
- "laucnhes", "launches",
- "laundrey", "laundry",
- "lawernce", "lawrence",
- "lazyness", "laziness",
- "leaglize", "legalize",
- "lecteurs", "lectures",
- "lecutres", "lectures",
- "lefitsts", "leftists",
- "leftsits", "leftists",
- "legenday", "legendary",
- "legionis", "legions",
- "legitimt", "legitimate",
- "lengthes", "lengths",
- "lengthly", "lengthy",
- "lentiles", "lentils",
- "lentills", "lentils",
- "lesbains", "lesbians",
- "lesibans", "lesbians",
- "levander", "lavender",
- "levelign", "leveling",
- "levetate", "levitate",
- "leviathn", "leviathan",
- "levleing", "leveling",
- "liberato", "liberation",
- "libertae", "liberate",
- "libertea", "liberate",
- "librarse", "libraries",
- "licencie", "licence",
- "licencse", "licence",
- "liebrals", "liberals",
- "liekable", "likeable",
- "lifepsan", "lifespan",
- "lifestel", "lifesteal",
- "lifestye", "lifestyle",
- "lighitng", "lighting",
- "lightnig", "lightning",
- "lightres", "lighters",
- "lightrom", "lightroom",
- "ligthers", "lighters",
- "ligthing", "lighting",
- "likebale", "likeable",
- "limitant", "militant",
- "limitato", "limitation",
- "lincolin", "lincoln",
- "lincolon", "lincoln",
- "lineupes", "lineups",
- "lingeire", "lingerie",
- "lingiere", "lingerie",
- "linnaena", "linnaean",
- "lipstics", "lipsticks",
- "liquidas", "liquids",
- "liquides", "liquids",
- "liquidos", "liquids",
- "liscense", "license",
- "lisenced", "silenced",
- "listenes", "listens",
- "listents", "listens",
- "listners", "listeners",
- "litature", "literature",
- "litecion", "litecoin",
- "liteicon", "litecoin",
- "literaly", "literally",
- "lithuana", "lithuania",
- "litigato", "litigation",
- "liverpol", "liverpool",
- "logtiech", "logitech",
- "longitme", "longtime",
- "longtiem", "longtime",
- "looseley", "loosely",
- "loreplay", "roleplay",
- "luanched", "launched",
- "luancher", "launcher",
- "luanches", "launches",
- "lubricat", "lubricant",
- "lucifear", "lucifer",
- "luckilly", "luckily",
- "macarino", "macaroni",
- "machiens", "machines",
- "mackeral", "mackerel",
- "macthups", "matchups",
- "magasine", "magazine",
- "magazins", "magazines",
- "magentic", "magnetic",
- "magicain", "magician",
- "magisine", "magazine",
- "magizine", "magazine",
- "magnetis", "magnets",
- "magnited", "magnitude",
- "magnitue", "magnitude",
- "mainfest", "manifest",
- "maintian", "maintain",
- "majoroty", "majority",
- "makrsman", "marksman",
- "malariya", "malaria",
- "malasiya", "malaysia",
- "malasyia", "malaysia",
- "malayisa", "malaysia",
- "malyasia", "malaysia",
- "mamalian", "mammalian",
- "manadrin", "mandarin",
- "manaully", "manually",
- "mandaste", "mandates",
- "mandrain", "mandarin",
- "mandrian", "mandarin",
- "maneveur", "maneuver",
- "manevuer", "maneuver",
- "manfiest", "manifest",
- "mangetic", "magnetic",
- "manglade", "mangled",
- "manifeso", "manifesto",
- "manipule", "manipulate",
- "manouver", "maneuver",
- "manuales", "manuals",
- "manuever", "maneuver",
- "maraconi", "macaroni",
- "maradeur", "marauder",
- "maraduer", "marauder",
- "maragret", "margaret",
- "marbleds", "marbles",
- "margerat", "margaret",
- "margines", "margins",
- "margings", "margins",
- "marginis", "margins",
- "marignal", "marginal",
- "marilyin", "marilyn",
- "marinens", "marines",
- "markedet", "marketed",
- "markeras", "markers",
- "markerts", "markers",
- "marniers", "mariners",
- "marraige", "marriage",
- "marryied", "married",
- "marskman", "marksman",
- "maruader", "marauder",
- "marvelos", "marvelous",
- "marxisim", "marxism",
- "mascarra", "mascara",
- "massacer", "massacre",
- "massarce", "massacre",
- "massasge", "massages",
- "masscare", "massacre",
- "masteris", "masteries",
- "masturbe", "masturbate",
- "materias", "materials",
- "mathcups", "matchups",
- "mathewes", "mathews",
- "matieral", "material",
- "matterss", "mattress",
- "mauarder", "marauder",
- "maximini", "maximizing",
- "mayalsia", "malaysia",
- "maybelle", "maybelline",
- "maylasia", "malaysia",
- "mccarhty", "mccarthy",
- "mcgergor", "mcgregor",
- "mchanics", "mechanics",
- "mclarean", "mclaren",
- "mcreggor", "mcgregor",
- "meagtron", "megatron",
- "meancing", "menacing",
- "meaninng", "meaning",
- "meatbals", "meatballs",
- "mecahnic", "mechanic",
- "mechanim", "mechanism",
- "mechanis", "mechanics",
- "medacine", "medicine",
- "medatite", "meditate",
- "medeival", "medieval",
- "medevial", "medieval",
- "mediavel", "medieval",
- "medicaly", "medically",
- "mediciad", "medicaid",
- "medicins", "medicines",
- "medicore", "mediocre",
- "medievel", "medieval",
- "mediocer", "mediocre",
- "mediocry", "mediocrity",
- "mediorce", "mediocre",
- "meditato", "meditation",
- "mediveal", "medieval",
- "medoicre", "mediocre",
- "meerkrat", "meerkat",
- "megatorn", "megatron",
- "meidcare", "medicare",
- "meixcans", "mexicans",
- "melboure", "melbourne",
- "meltodwn", "meltdown",
- "memoriez", "memorize",
- "mencaing", "menacing",
- "menstrul", "menstrual",
- "mentiong", "mentioning",
- "meoldies", "melodies",
- "merchans", "merchants",
- "mercurcy", "mercury",
- "mercurey", "mercury",
- "merficul", "merciful",
- "merhcant", "merchant",
- "mericful", "merciful",
- "messgaed", "messaged",
- "messiach", "messiah",
- "metagaem", "metagame",
- "metahpor", "metaphor",
- "metamage", "metagame",
- "methapor", "metaphor",
- "metldown", "meltdown",
- "metricas", "metrics",
- "metrices", "metrics",
- "metropos", "metropolis",
- "mexcians", "mexicans",
- "mexicain", "mexican",
- "mhytical", "mythical",
- "michagan", "michigan",
- "michgian", "michigan",
- "microtax", "microatx",
- "microwae", "microwaves",
- "midfeild", "midfield",
- "midfiled", "midfield",
- "midifeld", "midfield",
- "migrains", "migraines",
- "migriane", "migraine",
- "milennia", "millennia",
- "miligram", "milligram",
- "miliitas", "militias",
- "miliraty", "military",
- "militais", "militias",
- "millenia", "millennia",
- "millenna", "millennia",
- "miltiant", "militant",
- "minature", "miniature",
- "mindcrak", "mindcrack",
- "minerial", "mineral",
- "mingiame", "minigame",
- "minimage", "minigame",
- "minimals", "minimalist",
- "minimalt", "minimalist",
- "minimini", "minimizing",
- "minimium", "minimum",
- "miniscue", "miniscule",
- "minsiter", "minister",
- "minsitry", "ministry",
- "miraculu", "miraculous",
- "miralces", "miracles",
- "mircales", "miracles",
- "mircoatx", "microatx",
- "mirgaine", "migraine",
- "mirorred", "mirrored",
- "misnadry", "misandry",
- "misogynt", "misogynist",
- "missigno", "mission",
- "missiony", "missionary",
- "misslies", "missiles",
- "missorui", "missouri",
- "misspeld", "misspelled",
- "mistakey", "mistakenly",
- "mistread", "mistreated",
- "mobiltiy", "mobility",
- "moderats", "moderates",
- "modulair", "modular",
- "moleculs", "molecules",
- "momentos", "moments",
- "momentus", "moments",
- "monagomy", "monogamy",
- "mongoles", "mongols",
- "mongolos", "mongols",
- "monitord", "monitored",
- "monogmay", "monogamy",
- "monolite", "monolithic",
- "monologe", "monologue",
- "monolopy", "monopoly",
- "monoploy", "monopoly",
- "monopols", "monopolies",
- "monrachy", "monarchy",
- "monstros", "monstrous",
- "montaban", "montana",
- "montains", "mountains",
- "montanha", "montana",
- "montania", "montana",
- "montanna", "montana",
- "montanta", "montana",
- "montanya", "montana",
- "montaran", "montana",
- "monteize", "monetize",
- "monteral", "montreal",
- "montiors", "monitors",
- "montnana", "montana",
- "montypic", "monotypic",
- "monumnet", "monument",
- "moonligt", "moonlight",
- "moprhine", "morphine",
- "morbildy", "morbidly",
- "mordibly", "morbidly",
- "morevoer", "moreover",
- "morhpine", "morphine",
- "moribdly", "morbidly",
- "mormones", "mormons",
- "mormonts", "mormons",
- "moroever", "moreover",
- "morotola", "motorola",
- "morphein", "morphine",
- "morriosn", "morrison",
- "morrocco", "morocco",
- "morrsion", "morrison",
- "mortards", "mortars",
- "mortarts", "mortars",
- "moruning", "mourning",
- "mosnters", "monsters",
- "mosqueto", "mosquitoes",
- "mosquite", "mosquitoes",
- "mosqutio", "mosquito",
- "motoroal", "motorola",
- "mounment", "monument",
- "mounring", "mourning",
- "mountian", "mountain",
- "moustace", "moustache",
- "movesped", "movespeed",
- "mozillia", "mozilla",
- "mozillla", "mozilla",
- "msytical", "mystical",
- "mucnhies", "munchies",
- "mudering", "murdering",
- "muffings", "muffins",
- "muffinus", "muffins",
- "mulitple", "multiple",
- "mulitply", "multiply",
- "multiplr", "multiplier",
- "multipls", "multiples",
- "mundance", "mundane",
- "mundande", "mundane",
- "muniches", "munchies",
- "murderes", "murders",
- "murderus", "murders",
- "muscluar", "muscular",
- "muscualr", "muscular",
- "musicaly", "musically",
- "musuclar", "muscular",
- "mutliple", "multiple",
- "mutliply", "multiply",
- "myhtical", "mythical",
- "mysitcal", "mystical",
- "mysogyny", "misogyny",
- "mysteris", "mysteries",
- "mythraic", "mithraic",
- "nagivate", "navigate",
- "naopleon", "napoleon",
- "napcakes", "pancakes",
- "naploeon", "napoleon",
- "napoelon", "napoleon",
- "napolean", "napoleon",
- "napoloen", "napoleon",
- "narcissm", "narcissism",
- "narcisst", "narcissist",
- "narcotis", "narcotics",
- "narwharl", "narwhal",
- "naseuous", "nauseous",
- "nashvile", "nashville",
- "nasueous", "nauseous",
- "natievly", "natively",
- "nationas", "nationals",
- "nationsl", "nationals",
- "nativley", "natively",
- "natuilus", "nautilus",
- "naturaly", "naturally",
- "naturels", "natures",
- "naturely", "naturally",
- "naturens", "natures",
- "naturual", "natural",
- "nauesous", "nauseous",
- "naughtly", "naughty",
- "nauitlus", "nautilus",
- "nauseuos", "nauseous",
- "nautiuls", "nautilus",
- "nautlius", "nautilus",
- "nautulis", "nautilus",
- "naviagte", "navigate",
- "navigato", "navigation",
- "nazereth", "nazareth",
- "necesary", "necessary",
- "neckbead", "neckbeard",
- "needlees", "needles",
- "nefarios", "nefarious",
- "negativy", "negativity",
- "neglectn", "neglecting",
- "neglible", "negligible",
- "neigbour", "neighbour",
- "neolitic", "neolithic",
- "netboook", "netbook",
- "neuronas", "neurons",
- "neutraal", "neutral",
- "neutralt", "neutrality",
- "neutraly", "neutrality",
- "newcaste", "newcastle",
- "nickanme", "nickname",
- "nickmane", "nickname",
- "nieghbor", "neighbor",
- "nightime", "nighttime",
- "nightley", "nightly",
- "nightlie", "nightlife",
- "nihilsim", "nihilism",
- "nilihism", "nihilism",
- "nirtogen", "nitrogen",
- "nirvanna", "nirvana",
- "nitorgen", "nitrogen",
- "niusance", "nuisance",
- "noctrune", "nocturne",
- "noctunre", "nocturne",
- "nocturen", "nocturne",
- "nominato", "nomination",
- "nonsence", "nonsense",
- "nonsesne", "nonsense",
- "noramlly", "normally",
- "norhtern", "northern",
- "normalis", "normals",
- "normalls", "normals",
- "normalos", "normals",
- "northeat", "northeast",
- "northren", "northern",
- "northwet", "northwest",
- "norwegin", "norwegian",
- "nostalga", "nostalgia",
- "nostirls", "nostrils",
- "notabley", "notably",
- "notablly", "notably",
- "noteable", "notable",
- "noteably", "notably",
- "noticabe", "noticable",
- "notorios", "notorious",
- "novmeber", "november",
- "nromandy", "normandy",
- "nuatilus", "nautilus",
- "nuculear", "nuclear",
- "nuetered", "neutered",
- "nuisanse", "nuisance",
- "nullifiy", "nullify",
- "nurtient", "nutrient",
- "nusaince", "nuisance",
- "nusiance", "nuisance",
- "nutirent", "nutrient",
- "nutriens", "nutrients",
- "nuturing", "nurturing",
- "obdisian", "obsidian",
- "obediant", "obedient",
- "obession", "obsession",
- "obilvion", "oblivion",
- "obisdian", "obsidian",
- "obsessie", "obsessive",
- "obsessin", "obsession",
- "obsidain", "obsidian",
- "obstacal", "obstacle",
- "obvilion", "oblivion",
- "ocasions", "occasions",
- "ocassion", "occasion",
- "occaison", "occasion",
- "occupato", "occupation",
- "occuring", "occurring",
- "octobear", "october",
- "octopuns", "octopus",
- "ofcoruse", "ofcourse",
- "ofcoures", "ofcourse",
- "ofcousre", "ofcourse",
- "ofcrouse", "ofcourse",
- "officals", "officials",
- "officaly", "officially",
- "offsited", "offside",
- "ofocurse", "ofcourse",
- "oligarcy", "oligarchy",
- "olmypics", "olympics",
- "olymipcs", "olympics",
- "olypmics", "olympics",
- "ommision", "omission",
- "ommiting", "omitting",
- "ommitted", "omitted",
- "ongewild", "gonewild",
- "onslaugt", "onslaught",
- "operatie", "operative",
- "opinoins", "opinions",
- "oppinion", "opinion",
- "opponant", "opponent",
- "opposits", "opposites",
- "oppossed", "opposed",
- "oppresso", "oppression",
- "optimaal", "optimal",
- "optomism", "optimism",
- "oragnise", "organise",
- "orangerd", "orangered",
- "orangers", "oranges",
- "orangism", "organism",
- "orchesta", "orchestra",
- "ordianry", "ordinary",
- "oreintal", "oriental",
- "orgainse", "organise",
- "orgainze", "organize",
- "organims", "organism",
- "organsie", "organise",
- "organsim", "organism",
- "organzie", "organize",
- "orgasmes", "orgasms",
- "orgasmos", "orgasms",
- "orgasmus", "orgasms",
- "orginize", "organise",
- "orhtodox", "orthodox",
- "oridnary", "ordinary",
- "originas", "origins",
- "origines", "origins",
- "originsl", "originals",
- "orphanes", "orphans",
- "osbidian", "obsidian",
- "othrodox", "orthodox",
- "ourselvs", "ourselves",
- "oustider", "outsider",
- "outfeild", "outfield",
- "outfidel", "outfield",
- "outfiled", "outfield",
- "outisder", "outsider",
- "outplayd", "outplayed",
- "outputed", "outputted",
- "outsoure", "outsourced",
- "overboad", "overboard",
- "overclok", "overclock",
- "overdrev", "overdrive",
- "overhual", "overhaul",
- "overlaod", "overload",
- "overpiad", "overpaid",
- "overules", "overuse",
- "overwath", "overwatch",
- "overwhem", "overwhelm",
- "oximoron", "oxymoron",
- "oylmpics", "olympics",
- "pacakged", "packaged",
- "packadge", "packaged",
- "paficist", "pacifist",
- "painfuly", "painfully",
- "paitence", "patience",
- "paitents", "patients",
- "palidans", "paladins",
- "palstics", "plastics",
- "paltform", "platform",
- "paltinum", "platinum",
- "palyable", "playable",
- "palyoffs", "playoffs",
- "pancaeks", "pancakes",
- "panckaes", "pancakes",
- "pandoria", "pandora",
- "pandorra", "pandora",
- "panedmic", "pandemic",
- "panethon", "pantheon",
- "pankaces", "pancakes",
- "panmedic", "pandemic",
- "pantehon", "pantheon",
- "panthoen", "pantheon",
- "paradies", "paradise",
- "paradyse", "parades",
- "paragrah", "paragraph",
- "paraiste", "parasite",
- "paralell", "parallel",
- "paralely", "parallelly",
- "paralles", "parallels",
- "parameds", "paramedics",
- "paramter", "parameter",
- "paranioa", "paranoia",
- "paraniod", "paranoid",
- "paraside", "paradise",
- "parasits", "parasites",
- "parastie", "parasite",
- "parctise", "practise",
- "paremsan", "parmesan",
- "paristan", "partisan",
- "parmasen", "parmesan",
- "parmenas", "parmesan",
- "parmsean", "parmesan",
- "parnters", "partners",
- "parralel", "parallel",
- "parterns", "partners",
- "partialy", "partially",
- "partians", "partisan",
- "partical", "particular",
- "particel", "particle",
- "partiets", "parties",
- "partiots", "patriots",
- "partnerd", "partnered",
- "partsian", "partisan",
- "passabel", "passable",
- "passione", "passionate",
- "passisve", "passives",
- "passpost", "passports",
- "passvies", "passives",
- "passwors", "passwords",
- "pasttime", "pastime",
- "pastural", "pastoral",
- "pateince", "patience",
- "pateints", "patients",
- "patethic", "pathetic",
- "patheitc", "pathetic",
- "patienty", "patiently",
- "patirots", "patriots",
- "patriarh", "patriarchy",
- "patroits", "patriots",
- "patrolls", "patrols",
- "patronas", "patrons",
- "patrones", "patrons",
- "patronis", "patrons",
- "patronos", "patrons",
- "pattened", "patented",
- "patterno", "patterson",
- "pattersn", "patterson",
- "pblisher", "publisher",
- "peageant", "pageant",
- "pebbleos", "pebbles",
- "pebblers", "pebbles",
- "pebblets", "pebbles",
- "peciluar", "peculiar",
- "pecuilar", "peculiar",
- "peculair", "peculiar",
- "peculure", "peculiar",
- "peformed", "performed",
- "peircing", "piercing",
- "penaltis", "penalties",
- "penatgon", "pentagon",
- "penciles", "pencils",
- "pendatic", "pedantic",
- "pengiuns", "penguins",
- "penisula", "peninsula",
- "pensioen", "pension",
- "pepperin", "pepperoni",
- "perceded", "preceded",
- "percente", "percentile",
- "percieve", "perceive",
- "percious", "precious",
- "perclude", "preclude",
- "perfecty", "perfectly",
- "perfroms", "performs",
- "perheaps", "perhaps",
- "pericing", "piercing",
- "peridoic", "periodic",
- "perimetr", "perimeter",
- "periodes", "periods",
- "periodos", "periods",
- "permanet", "permanent",
- "permiere", "premiere",
- "permises", "premises",
- "permitas", "permits",
- "permites", "permits",
- "permitis", "permits",
- "permitts", "permits",
- "permiums", "premiums",
- "peroidic", "periodic",
- "perosnas", "personas",
- "perpetue", "perpetuate",
- "persaude", "persuade",
- "perserve", "preserve",
- "persisit", "persist",
- "personel", "personnel",
- "persones", "persons",
- "personis", "persons",
- "personsa", "personas",
- "perstige", "prestige",
- "persuaso", "persuasion",
- "persuded", "persuaded",
- "persuing", "pursuing",
- "persuits", "pursuits",
- "persumed", "presumed",
- "pertaing", "pertaining",
- "pertians", "pertains",
- "pertinet", "pertinent",
- "pervents", "prevents",
- "perverst", "pervert",
- "perviews", "previews",
- "pervious", "previous",
- "perxoide", "peroxide",
- "pessiary", "pessary",
- "petetion", "petition",
- "petrolem", "petroleum",
- "phantoom", "phantom",
- "pharamcy", "pharmacy",
- "pharmacs", "pharmacist",
- "pharmsci", "pharmacist",
- "phenomon", "phenomenon",
- "phramacy", "pharmacy",
- "phsyical", "physical",
- "phsyique", "physique",
- "phyiscal", "physical",
- "phyisque", "physique",
- "physcial", "physical",
- "physicis", "physicians",
- "physicks", "physics",
- "physicts", "physicist",
- "physqiue", "physique",
- "picthers", "pitchers",
- "pillards", "pillars",
- "pillaris", "pillars",
- "pinancle", "pinnacle",
- "pinapple", "pineapple",
- "pinnalce", "pinnacle",
- "pinnaple", "pineapple",
- "pinncale", "pinnacle",
- "pinpiont", "pinpoint",
- "pinteret", "pinterest",
- "piolting", "piloting",
- "pioneeer", "pioneer",
- "pithcers", "pitchers",
- "placebro", "placebo",
- "placemet", "placements",
- "planetas", "planets",
- "planetos", "planets",
- "plantiff", "plaintiff",
- "plantium", "platinum",
- "plasitcs", "plastics",
- "platfrom", "platform",
- "platimun", "platinum",
- "platnium", "platinum",
- "platnuim", "platinum",
- "plausibe", "plausible",
- "playbody", "playboy",
- "playstye", "playstyle",
- "pleasent", "pleasant",
- "plehtora", "plethora",
- "pleothra", "plethora",
- "plethroa", "plethora",
- "ploygamy", "polygamy",
- "pnatheon", "pantheon",
- "poeoples", "peoples",
- "poingant", "poignant",
- "pointeur", "pointer",
- "pointure", "pointer",
- "poisones", "poisons",
- "poisonis", "poisons",
- "poisonos", "poisons",
- "poisonus", "poisons",
- "polgyamy", "polygamy",
- "polietly", "politely",
- "politing", "piloting",
- "politley", "politely",
- "poltical", "political",
- "poluting", "polluting",
- "polution", "pollution",
- "polygoon", "polygon",
- "polymore", "polymer",
- "pomotion", "promotion",
- "popoulus", "populous",
- "populair", "popular",
- "populare", "popular",
- "populary", "popularity",
- "porcelan", "porcelain",
- "porposes", "proposes",
- "portabel", "portable",
- "portalis", "portals",
- "portalus", "portals",
- "portayed", "portrayed",
- "portgual", "portugal",
- "portrais", "portraits",
- "portrary", "portray",
- "portrayl", "portrayal",
- "portriat", "portrait",
- "posessed", "possessed",
- "posesses", "possesses",
- "posioned", "poisoned",
- "positivs", "positives",
- "positivy", "positivity",
- "possable", "possible",
- "possably", "possibly",
- "possbily", "possibly",
- "posseses", "possesses",
- "possesse", "possessive",
- "possesss", "possesses",
- "potrayed", "portrayed",
- "poverful", "powerful",
- "powerded", "powdered",
- "powerpot", "powerpoint",
- "pracitse", "practise",
- "practial", "practical",
- "practies", "practise",
- "pratcise", "practise",
- "praticle", "particle",
- "prceeded", "preceded",
- "preadtor", "predator",
- "preample", "preamble",
- "preceeds", "precedes",
- "precisie", "precise",
- "precisly", "precisely",
- "precisou", "precious",
- "preculde", "preclude",
- "predicat", "predict",
- "predicte", "predictive",
- "preferas", "prefers",
- "prefered", "preferred",
- "preferes", "prefers",
- "preferis", "prefers",
- "preferrs", "prefers",
- "preimere", "premiere",
- "preimums", "premiums",
- "preiodic", "periodic",
- "preivews", "previews",
- "prejudis", "prejudices",
- "prelayed", "replayed",
- "premeire", "premiere",
- "premesis", "premises",
- "premiare", "premier",
- "premines", "premise",
- "premuims", "premiums",
- "preorded", "preordered",
- "preordes", "preorders",
- "preoxide", "peroxide",
- "prepaird", "prepaid",
- "preqeuls", "prequels",
- "prequles", "prequels",
- "prescrie", "prescribed",
- "presense", "presence",
- "presenst", "presets",
- "presidet", "presidents",
- "presists", "persists",
- "presitge", "prestige",
- "presonas", "personas",
- "presuade", "persuade",
- "pretador", "predator",
- "pretains", "pertains",
- "preveiws", "previews",
- "preverse", "perverse",
- "previwes", "previews",
- "pricipal", "principal",
- "priciple", "principle",
- "priemere", "premiere",
- "priestes", "priests",
- "primaris", "primaries",
- "primarly", "primarily",
- "princila", "principals",
- "principl", "principals",
- "prisitne", "pristine",
- "probelms", "problems",
- "probleem", "problem",
- "procalim", "proclaim",
- "proccess", "process",
- "proceded", "proceeded",
- "proceder", "procedure",
- "procedes", "proceeds",
- "procedue", "procedure",
- "proceeed", "proceed",
- "procesed", "proceeds",
- "processs", "processes",
- "proclami", "proclaim",
- "procliam", "proclaim",
- "procotol", "protocol",
- "prodcuts", "products",
- "producto", "production",
- "profesor", "professor",
- "proficit", "proficient",
- "profilic", "prolific",
- "progroms", "pogroms",
- "prohibis", "prohibits",
- "prohpecy", "prophecy",
- "prohpets", "prophets",
- "projecte", "projectile",
- "projecto", "projection",
- "prolouge", "prologue",
- "promplty", "promptly",
- "promptes", "prompts",
- "promptus", "prompts",
- "promtply", "promptly",
- "pronoune", "pronounced",
- "propechy", "prophecy",
- "propehcy", "prophecy",
- "propehts", "prophets",
- "prophacy", "prophecy",
- "propmted", "prompted",
- "propmtly", "promptly",
- "proponet", "proponents",
- "proposse", "proposes",
- "proposte", "propose",
- "proprety", "property",
- "propsect", "prospect",
- "prosepct", "prospect",
- "prostite", "prostitute",
- "protable", "portable",
- "protecte", "protective",
- "protiens", "proteins",
- "protines", "proteins",
- "protocal", "protocol",
- "prototye", "prototype",
- "protrait", "portrait",
- "protrays", "portrays",
- "protugal", "portugal",
- "proverai", "proverbial",
- "providee", "providence",
- "proximty", "proximity",
- "pruchase", "purchase",
- "pryamids", "pyramids",
- "ptichers", "pitchers",
- "pubisher", "publisher",
- "publiser", "publisher",
- "puinsher", "punisher",
- "pulisher", "publisher",
- "pumkpins", "pumpkins",
- "pumpinks", "pumpkins",
- "pumpknis", "pumpkins",
- "punshier", "punisher",
- "punsiher", "punisher",
- "punsihes", "punishes",
- "purcahse", "purchase",
- "pyramind", "pyramid",
- "pyrimads", "pyramids",
- "pyrmaids", "pyramids",
- "qauntity", "quantity",
- "qualifiy", "qualify",
- "quanitfy", "quantify",
- "quantaty", "quantity",
- "quantite", "quantities",
- "quantuum", "quantum",
- "quarante", "quarantine",
- "quartery", "quarterly",
- "qucikest", "quickest",
- "queation", "equation",
- "quention", "quentin",
- "quickets", "quickest",
- "quicklyu", "quickly",
- "rabbitos", "rabbits",
- "rabbitts", "rabbits",
- "racistas", "racists",
- "racistes", "racists",
- "radaince", "radiance",
- "rahpsody", "rhapsody",
- "raidance", "radiance",
- "railraod", "railroad",
- "randomes", "randoms",
- "randomez", "randomized",
- "randomns", "randoms",
- "randomrs", "randoms",
- "randomus", "randoms",
- "raosting", "roasting",
- "raphsody", "rhapsody",
- "raptores", "raptors",
- "raspbery", "raspberry",
- "rationel", "rationale",
- "realible", "reliable",
- "realibly", "reliably",
- "realiest", "earliest",
- "realisim", "realism",
- "realisme", "realise",
- "realistc", "realistic",
- "realiste", "realise",
- "realoded", "reloaded",
- "realsied", "realised",
- "realtion", "relation",
- "realtive", "relative",
- "reamined", "remained",
- "reapired", "repaired",
- "reaplugs", "earplugs",
- "reaserch", "research",
- "reasonal", "reasonably",
- "reatiler", "retailer",
- "reaveled", "revealed",
- "rebellis", "rebellious",
- "reboudns", "rebounds",
- "rebounce", "rebound",
- "rebuildt", "rebuilt",
- "rebuplic", "republic",
- "receeded", "receded",
- "recepits", "receipts",
- "receptie", "receptive",
- "receptos", "receptors",
- "receving", "receiving",
- "recident", "resident",
- "reciding", "residing",
- "recieved", "received",
- "reciever", "receiver",
- "recieves", "receives",
- "recipees", "recipes",
- "recipets", "recipes",
- "recogise", "recognise",
- "recogize", "recognize",
- "recognie", "recognizes",
- "recomend", "recommend",
- "recommed", "recommend",
- "reconnet", "reconnect",
- "rectange", "rectangle",
- "rectifiy", "rectify",
- "recuring", "recurring",
- "recurits", "recruits",
- "redeisgn", "redesign",
- "redemeed", "redeemed",
- "redesgin", "redesign",
- "redesing", "redesign",
- "reedemed", "redeemed",
- "refeeres", "referees",
- "refelcts", "reflects",
- "refelxes", "reflexes",
- "referede", "referee",
- "referene", "referee",
- "referens", "references",
- "referere", "referee",
- "referign", "refering",
- "refering", "referring",
- "refernce", "references",
- "reffered", "referred",
- "refilles", "refills",
- "refillls", "refills",
- "reflecte", "reflective",
- "reflecto", "reflection",
- "reformes", "reforms",
- "refreing", "refering",
- "refrence", "reference",
- "refreshd", "refreshed",
- "refreshr", "refresher",
- "refromed", "reformed",
- "regardes", "regards",
- "regenade", "renegade",
- "regenere", "regenerate",
- "regiones", "regions",
- "regisrty", "registry",
- "registed", "registered",
- "regresas", "regress",
- "regreses", "regress",
- "regresos", "regress",
- "regresse", "regressive",
- "regresso", "regression",
- "regrests", "regress",
- "regretts", "regrets",
- "regsitry", "registry",
- "regualrs", "regulars",
- "regualte", "regulate",
- "reguarly", "regularly",
- "regulary", "regularly",
- "regulatr", "regulator",
- "regulats", "regulators",
- "rehersal", "rehearsal",
- "rehtoric", "rhetoric",
- "reiceved", "recieved",
- "reigment", "regiment",
- "reigonal", "regional",
- "rekenton", "renekton",
- "relaible", "reliable",
- "relaibly", "reliably",
- "relaised", "realised",
- "relaoded", "reloaded",
- "relasped", "relapsed",
- "relatabe", "relatable",
- "relateds", "relates",
- "relativy", "relativity",
- "relavent", "relevant",
- "relected", "reelected",
- "relegato", "relegation",
- "releived", "relieved",
- "releiver", "reliever",
- "relevent", "relevant",
- "relfects", "reflects",
- "relfexes", "reflexes",
- "reliased", "realised",
- "religous", "religious",
- "relpased", "relapsed",
- "remainds", "remains",
- "remainig", "remaining",
- "remannts", "remnants",
- "remarkes", "remarks",
- "remembed", "remembered",
- "remembee", "remembered",
- "rememebr", "remember",
- "remenant", "remnant",
- "reminent", "remnant",
- "remmeber", "remember",
- "remotley", "remotely",
- "renderes", "renders",
- "reneagde", "renegade",
- "renetkon", "renekton",
- "renewabe", "renewables",
- "renketon", "renekton",
- "renmants", "remnants",
- "renoylds", "reynolds",
- "renteris", "renters",
- "renyolds", "reynolds",
- "reowrked", "reworked",
- "repaires", "repairs",
- "repalces", "replaces",
- "reparied", "repaired",
- "repblics", "republics",
- "repbulic", "republic",
- "repeatae", "repeatable",
- "repeates", "repeats",
- "repetion", "repetition",
- "repharse", "rephrase",
- "repitles", "reptiles",
- "replased", "relapsed",
- "replayes", "replays",
- "replicae", "replicated",
- "replubic", "republic",
- "reportes", "reporters",
- "reposity", "repository",
- "repostas", "reposts",
- "repostes", "reposts",
- "repostig", "reposting",
- "repostus", "reposts",
- "represet", "represents",
- "represso", "repression",
- "reprhase", "rephrase",
- "repsects", "respects",
- "repsonds", "responds",
- "repsonse", "response",
- "repsoted", "reposted",
- "repubics", "republics",
- "republis", "republics",
- "repulics", "republics",
- "repulsie", "repulsive",
- "requiers", "requires",
- "requieum", "requiem",
- "requilme", "requiem",
- "requried", "required",
- "requries", "requires",
- "rescuecd", "rescued",
- "researce", "researcher",
- "resembes", "resembles",
- "reserach", "research",
- "resevoir", "reservoir",
- "resgined", "resigned",
- "residude", "residue",
- "residule", "residue",
- "resinged", "resigned",
- "resistas", "resists",
- "resisten", "resistance",
- "resistes", "resists",
- "resloved", "resolved",
- "resloves", "resolves",
- "resmeble", "resemble",
- "resotred", "restored",
- "resourse", "resources",
- "resovled", "resolved",
- "resovles", "resolves",
- "respecte", "respective",
- "respesct", "respects",
- "responce", "response",
- "responed", "respond",
- "respones", "response",
- "responsd", "responds",
- "respoted", "reposted",
- "restanti", "restarting",
- "restrait", "restraint",
- "restrics", "restricts",
- "resuable", "reusable",
- "retailes", "retailers",
- "retalier", "retailer",
- "rethoric", "rhetoric",
- "retirase", "retires",
- "retireds", "retires",
- "retireus", "retires",
- "retireve", "retrieve",
- "retreive", "retrieve",
- "retrived", "retrieved",
- "retunred", "returned",
- "reuasble", "reusable",
- "reveales", "reveals",
- "reveiwed", "reviewed",
- "reveiwer", "reviewer",
- "revelaed", "revealed",
- "revelant", "relevant",
- "revelead", "revealed",
- "reverals", "reversal",
- "reviewes", "reviewers",
- "revlover", "revolver",
- "revloves", "revolves",
- "revovler", "revolver",
- "revovles", "revolves",
- "rewatchd", "rewatched",
- "rewitten", "rewritten",
- "rewritte", "rewrite",
- "rewtched", "wretched",
- "reynlods", "reynolds",
- "reyonlds", "reynolds",
- "rhaposdy", "rhapsody",
- "rhaspody", "rhapsody",
- "rheotric", "rhetoric",
- "righteos", "righteous",
- "rigntone", "ringtone",
- "ringotne", "ringtone",
- "ritalian", "ritalin",
- "rivalrly", "rivalry",
- "roachers", "roaches",
- "robberts", "robbers",
- "robberys", "robbers",
- "robocoop", "robocop",
- "robocorp", "robocop",
- "robocoup", "robocop",
- "roelplay", "roleplay",
- "roganism", "organism",
- "rolepaly", "roleplay",
- "romaanin", "romanian",
- "romainan", "romanian",
- "romanain", "romanian",
- "romanica", "romania",
- "rosettta", "rosetta",
- "rostaing", "roasting",
- "routeros", "routers",
- "rutgerus", "rutgers",
- "ryenolds", "reynolds",
- "sacrifie", "sacrifice",
- "saddends", "saddens",
- "saddenes", "saddens",
- "sadisitc", "sadistic",
- "salaires", "salaries",
- "sandales", "sandals",
- "sandalls", "sandals",
- "sandstom", "sandstorm",
- "sanotrum", "santorum",
- "santourm", "santorum",
- "santroum", "santorum",
- "santurom", "santorum",
- "sapcebar", "spacebar",
- "sapphrie", "sapphire",
- "sarcasam", "sarcasm",
- "sarcasim", "sarcasm",
- "sarcastc", "sarcastic",
- "sargeant", "sergeant",
- "sasauges", "sausages",
- "sasuages", "sausages",
- "satelite", "satellite",
- "satellie", "satellites",
- "saterday", "saturday",
- "satifies", "satisfies",
- "satisfiy", "satisfy",
- "satrical", "satirical",
- "satruday", "saturday",
- "saturdsy", "saturdays",
- "sawstika", "swastika",
- "scandlas", "scandals",
- "scannign", "scanning",
- "scarmble", "scramble",
- "scepture", "scepter",
- "schedual", "schedule",
- "schoalrs", "scholars",
- "scholary", "scholarly",
- "schoodle", "schooled",
- "scientic", "scientific",
- "scientis", "scientist",
- "scoprion", "scorpion",
- "scorates", "socrates",
- "scoripon", "scorpion",
- "scorpoin", "scorpion",
- "scostman", "scotsman",
- "scratchs", "scratches",
- "scriptue", "scriptures",
- "scriptus", "scripts",
- "scritped", "scripted",
- "scroates", "socrates",
- "scropion", "scorpion",
- "scrpited", "scripted",
- "scruitny", "scrutiny",
- "scrunity", "scrutiny",
- "sctosman", "scotsman",
- "sculpter", "sculpture",
- "scurtiny", "scrutiny",
- "seahakws", "seahawks",
- "seahwaks", "seahawks",
- "seantors", "senators",
- "sebastin", "sebastian",
- "seceeded", "succeeded",
- "secertly", "secretly",
- "secrelty", "secretly",
- "secretas", "secrets",
- "secretos", "secrets",
- "secruity", "security",
- "secuirty", "security",
- "sedereal", "sidereal",
- "seldomly", "seldom",
- "selectie", "selective",
- "selfiers", "selfies",
- "semestre", "semester",
- "semseter", "semester",
- "senarios", "scenarios",
- "senerity", "serenity",
- "seniores", "seniors",
- "senisble", "sensible",
- "sensibel", "sensible",
- "sensores", "sensors",
- "senstive", "sensitive",
- "sentaors", "senators",
- "sentiers", "sentries",
- "sentinet", "sentient",
- "sentinte", "sentient",
- "sentires", "sentries",
- "sentreis", "sentries",
- "separato", "separation",
- "separete", "seperate",
- "sepearte", "seperate",
- "seperate", "separate",
- "seplling", "spelling",
- "sepreate", "seperate",
- "sepulcre", "sepulchre",
- "serached", "searched",
- "seraches", "searches",
- "serentiy", "serenity",
- "sergaent", "sergeant",
- "settigns", "settings",
- "seventen", "seventeen",
- "severeal", "several",
- "severeid", "severed",
- "severide", "severed",
- "severley", "severely",
- "sexaully", "sexually",
- "seziures", "seizures",
- "sezuires", "seizures",
- "shadoloo", "shadaloo",
- "shangahi", "shanghai",
- "shanghia", "shanghai",
- "sharplay", "sharply",
- "sharpley", "sharply",
- "shawshak", "shawshank",
- "shcolars", "scholars",
- "shcooled", "schooled",
- "sheilded", "shielded",
- "shelterd", "sheltered",
- "shelvers", "shelves",
- "shelveys", "shelves",
- "sherlcok", "sherlock",
- "shetlers", "shelters",
- "shfiting", "shifting",
- "shifitng", "shifting",
- "shifteer", "shifter",
- "shileded", "shielded",
- "shineing", "shining",
- "shitstom", "shitstorm",
- "shittoon", "shitton",
- "shittown", "shitton",
- "shleters", "shelters",
- "shnaghai", "shanghai",
- "shortend", "shortened",
- "shotuout", "shoutout",
- "shoudlnt", "shouldnt",
- "shouldes", "shoulders",
- "shoulndt", "shouldnt",
- "shrapenl", "shrapnel",
- "shrelock", "sherlock",
- "shrinked", "shrunk",
- "shrpanel", "shrapnel",
- "shtiless", "shitless",
- "shuoldnt", "shouldnt",
- "sideboad", "sideboard",
- "sidleine", "sideline",
- "siezable", "sizeable",
- "siezures", "seizures",
- "signatue", "signatures",
- "signfies", "signifies",
- "signifiy", "signify",
- "signigns", "signings",
- "signular", "singular",
- "silbings", "siblings",
- "silicoln", "silicon",
- "silicoon", "silicon",
- "silimiar", "similiar",
- "simialir", "similiar",
- "simiilar", "similiar",
- "similair", "similar",
- "similari", "similiar",
- "similart", "similarity",
- "similary", "similarly",
- "similiar", "similar",
- "simliiar", "similiar",
- "simluate", "simulate",
- "simmilar", "similar",
- "simpelst", "simplest",
- "simplets", "simplest",
- "simplicy", "simplicity",
- "simplier", "simpler",
- "simulato", "simulation",
- "singlers", "singles",
- "singluar", "singular",
- "sinistre", "sinister",
- "sinsiter", "sinister",
- "sitckers", "stickers",
- "sitrring", "stirring",
- "sizebale", "sizeable",
- "skateing", "skating",
- "skecthes", "sketches",
- "skelatel", "skeletal",
- "skeletos", "skeletons",
- "sketchey", "sketchy",
- "sketpics", "skeptics",
- "skillsto", "skillshots",
- "skimrish", "skirmish",
- "skpetics", "skeptics",
- "skrimish", "skirmish",
- "skteches", "sketches",
- "skywalkr", "skywalker",
- "slaptoon", "splatoon",
- "slaverly", "slavery",
- "slienced", "silenced",
- "sliently", "silently",
- "slighlty", "slightly",
- "sligthly", "slightly",
- "smartare", "smarter",
- "snetries", "sentries",
- "snippent", "snippet",
- "snippert", "snippet",
- "snowbals", "snowballs",
- "snugglie", "snuggle",
- "snydrome", "syndrome",
- "snyopsis", "synopsis",
- "soberity", "sobriety",
- "sobreity", "sobriety",
- "socailly", "socially",
- "socalism", "socialism",
- "socartes", "socrates",
- "socialim", "socialism",
- "socities", "societies",
- "socttish", "scottish",
- "soemthin", "somethin",
- "soilders", "soldiers",
- "solatary", "solitary",
- "soldeirs", "soldiers",
- "soliders", "soldiers",
- "soluable", "soluble",
- "solutide", "solitude",
- "somalija", "somalia",
- "somehtin", "somethin",
- "someoens", "someones",
- "somethis", "somethings",
- "sometihn", "somethin",
- "sometinh", "somethin",
- "somoenes", "someones",
- "somtimes", "sometimes",
- "somwhere", "somewhere",
- "soparnos", "sopranos",
- "sophmore", "sophomore",
- "sorcercy", "sorcery",
- "sorcerey", "sorcery",
- "sorceror", "sorcerer",
- "sorcerry", "sorcery",
- "sorpanos", "sopranos",
- "southren", "southern",
- "soverein", "sovereign",
- "soverign", "sovereign",
- "sovietes", "soviets",
- "spagheti", "spaghetti",
- "spainish", "spanish",
- "spaltoon", "splatoon",
- "spammade", "spammed",
- "spammare", "spammer",
- "spammear", "spammer",
- "spammend", "spammed",
- "spammeur", "spammer",
- "spanisch", "spanish",
- "sparklie", "sparkle",
- "spawnign", "spawning",
- "specemin", "specimen",
- "speciaal", "special",
- "specialt", "specialist",
- "specialy", "specially",
- "specialz", "specialize",
- "specifed", "specified",
- "specifiy", "specify",
- "speciman", "specimen",
- "specrtal", "spectral",
- "speicals", "specials",
- "spellign", "spelling",
- "spendour", "splendour",
- "sphereos", "spheres",
- "spilnter", "splinter",
- "spiltter", "splitter",
- "spindrel", "spindle",
- "spirites", "spirits",
- "spiritis", "spirits",
- "spiritus", "spirits",
- "spirtied", "spirited",
- "spleling", "spelling",
- "splitner", "splinter",
- "spoilerd", "spoiled",
- "spoliers", "spoilers",
- "sponsord", "sponsored",
- "sporanos", "sopranos",
- "spotifiy", "spotify",
- "spotifty", "spotify",
- "sppeches", "speeches",
- "sprayade", "sprayed",
- "spreaded", "spread",
- "springst", "sprints",
- "sprinkel", "sprinkle",
- "sprintas", "sprints",
- "spritual", "spiritual",
- "sproutes", "sprouts",
- "spwaning", "spawning",
- "sqaudron", "squadron",
- "sqaurely", "squarely",
- "sqiurtle", "squirtle",
- "squardon", "squadron",
- "squareds", "squares",
- "squarley", "squarely",
- "squeakey", "squeaky",
- "squeakly", "squeaky",
- "squirlte", "squirtle",
- "squirrle", "squirrel",
- "squirtel", "squirtle",
- "squishey", "squishy",
- "squishly", "squishy",
- "squritle", "squirtle",
- "squrriel", "squirrel",
- "squrtile", "squirtle",
- "sriarcha", "sriracha",
- "srriacha", "sriracha",
- "sryacuse", "syracuse",
- "staduims", "stadiums",
- "staidums", "stadiums",
- "staklers", "stalkers",
- "stalekrs", "stalkers",
- "stalkear", "stalker",
- "staminia", "stamina",
- "stampade", "stamped",
- "stampeed", "stamped",
- "stancels", "stances",
- "stancers", "stances",
- "standars", "standards",
- "standbay", "standby",
- "standbuy", "standby",
- "stangant", "stagnant",
- "staright", "straight",
- "starined", "strained",
- "starlted", "startled",
- "startegy", "strategy",
- "starteld", "startled",
- "startsup", "startups",
- "stateman", "statesman",
- "staticts", "statist",
- "stationd", "stationed",
- "stationy", "stationary",
- "statiskt", "statist",
- "statistc", "statistic",
- "statment", "statement",
- "stattues", "statutes",
- "statuets", "statutes",
- "statuser", "stature",
- "staurday", "saturday",
- "steadliy", "steadily",
- "stealhty", "stealthy",
- "steathly", "stealthy",
- "stelathy", "stealthy",
- "sterilze", "sterile",
- "steriods", "steroids",
- "stichted", "stitched",
- "sticthed", "stitched",
- "sticthes", "stitches",
- "stimulai", "stimuli",
- "stimulas", "stimulants",
- "stimulat", "stimulants",
- "stimulli", "stimuli",
- "stingent", "stringent",
- "stirkers", "strikers",
- "stlakers", "stalkers",
- "stomache", "stomach",
- "stormade", "stormed",
- "stormend", "stormed",
- "stradegy", "strategy",
- "stragety", "strategy",
- "straignt", "straighten",
- "straigth", "straight",
- "straings", "strains",
- "strangel", "strangle",
- "stranget", "strangest",
- "stratgey", "strategy",
- "stratled", "startled",
- "streames", "streams",
- "streamos", "streams",
- "streamus", "streams",
- "streamys", "streams",
- "stregnth", "strength",
- "stremear", "streamer",
- "strenght", "strength",
- "strengts", "strengths",
- "strenous", "strenuous",
- "strentgh", "strength",
- "stretchs", "stretches",
- "striaght", "straight",
- "striclty", "strictly",
- "striekrs", "strikers",
- "strikely", "strikingly",
- "stringet", "stringent",
- "stubbron", "stubborn",
- "stubmled", "stumbled",
- "stucture", "structure",
- "studioes", "studios",
- "stuipder", "stupider",
- "stumbeld", "stumbled",
- "stupdily", "stupidly",
- "stupidiy", "stupidity",
- "stylisch", "stylish",
- "styrofom", "styrofoam",
- "suasages", "sausages",
- "subltety", "subtlety",
- "submarie", "submarines",
- "subruban", "suburban",
- "subscrie", "subscriber",
- "subsidie", "subsidized",
- "subsidiy", "subsidy",
- "substace", "substance",
- "substans", "substances",
- "substite", "substitute",
- "subtelty", "subtlety",
- "subtetly", "subtlety",
- "subtilte", "subtitle",
- "subtitel", "subtitle",
- "subtitls", "subtitles",
- "subtltey", "subtlety",
- "succeded", "succeeded",
- "succedes", "succeeds",
- "succeeed", "succeed",
- "succesed", "succeeds",
- "successs", "successes",
- "succsess", "success",
- "suceeded", "succeeded",
- "sucesful", "successful",
- "sucesion", "succession",
- "sucesses", "successes",
- "sucessor", "successor",
- "sucessot", "successor",
- "sucidial", "suicidal",
- "suddnely", "suddenly",
- "sufficit", "sufficient",
- "suggesst", "suggests",
- "suggeste", "suggestive",
- "summenor", "summoner",
- "summones", "summoners",
- "sunfiber", "sunfire",
- "sunscren", "sunscreen",
- "superham", "superhuman",
- "superheo", "superhero",
- "superios", "superiors",
- "supirsed", "suprised",
- "suposing", "supposing",
- "supporre", "supporters",
- "suprised", "surprised",
- "suprized", "surprised",
- "suprsied", "suprised",
- "supsects", "suspects",
- "supsense", "suspense",
- "surbuban", "suburban",
- "surounds", "surrounds",
- "surpases", "surpass",
- "surpress", "suppress",
- "surprize", "surprise",
- "surrouns", "surrounds",
- "surveill", "surveil",
- "surveyer", "surveyor",
- "surviver", "survivor",
- "suspened", "suspend",
- "suspenso", "suspension",
- "swaering", "swearing",
- "swansoon", "swanson",
- "swasitka", "swastika",
- "swaskita", "swastika",
- "swatiska", "swastika",
- "swatsika", "swastika",
- "swedisch", "swedish",
- "swiftley", "swiftly",
- "swithced", "switched",
- "swithces", "switches",
- "swtiched", "switched",
- "swtiches", "switches",
- "syarcuse", "syracuse",
- "sydnrome", "syndrome",
- "sylablle", "syllable",
- "syllabel", "syllable",
- "symapthy", "sympathy",
- "symboles", "symbols",
- "symhpony", "symphony",
- "symmerty", "symmetry",
- "symmtery", "symmetry",
- "symoblic", "symbolic",
- "symphaty", "sympathy",
- "symptoom", "symptom",
- "symtpoms", "symptoms",
- "synomyns", "synonyms",
- "synonmys", "synonyms",
- "synonomy", "synonym",
- "synoynms", "synonyms",
- "synphony", "symphony",
- "synposis", "synopsis",
- "sypmathy", "sympathy",
- "sypmtoms", "symptoms",
- "sypnosis", "synopsis",
- "syraucse", "syracuse",
- "syrcause", "syracuse",
- "syringae", "syringe",
- "syringue", "syringe",
- "sysamdin", "sysadmin",
- "sysdamin", "sysadmin",
- "tacticas", "tactics",
- "tacticts", "tactics",
- "tacticus", "tactics",
- "tagliate", "tailgate",
- "tahnkyou", "thankyou",
- "tailsman", "talisman",
- "taiwanee", "taiwanese",
- "taligate", "tailgate",
- "taliored", "tailored",
- "tallents", "tallest",
- "talsiman", "talisman",
- "tanturms", "tantrums",
- "tapitude", "aptitude",
- "tasliman", "talisman",
- "tattooes", "tattoos",
- "tattooos", "tattoos",
- "taxanomy", "taxonomy",
- "teamfigt", "teamfight",
- "teamspek", "teamspeak",
- "teancity", "tenacity",
- "teapsoon", "teaspoon",
- "techniqe", "technique",
- "teenages", "teenagers",
- "telegrah", "telegraph",
- "telphony", "telephony",
- "tempalrs", "templars",
- "tempalte", "template",
- "templats", "templates",
- "templeos", "temples",
- "templers", "temples",
- "temporay", "temporary",
- "temprary", "temporary",
- "tenacles", "tentacles",
- "tenactiy", "tenacity",
- "tencaity", "tenacity",
- "tendancy", "tendency",
- "tendence", "tendencies",
- "tentacel", "tentacle",
- "tentacls", "tentacles",
- "tentalce", "tentacle",
- "tequilia", "tequila",
- "terriory", "territory",
- "territoy", "territory",
- "terroist", "terrorist",
- "tesitcle", "testicle",
- "testicel", "testicle",
- "testifiy", "testify",
- "teusdays", "tuesdays",
- "texutres", "textures",
- "thaliand", "thailand",
- "theather", "theater",
- "theathre", "theater",
- "theature", "theater",
- "theisitc", "theistic",
- "themslef", "themself",
- "theorits", "theorist",
- "theraphy", "therapy",
- "thereian", "therein",
- "theroies", "theories",
- "theroist", "theorist",
- "thesitic", "theistic",
- "thialand", "thailand",
- "thiestic", "theistic",
- "thikning", "thinking",
- "thirites", "thirties",
- "thirstay", "thirsty",
- "thnakyou", "thankyou",
- "thoeries", "theories",
- "thoerist", "theorist",
- "thomspon", "thompson",
- "thopmson", "thompson",
- "thougths", "thoughts",
- "thourogh", "thorough",
- "threates", "threatens",
- "threefor", "therefor",
- "thriteen", "thirteen",
- "thrities", "thirties",
- "throaths", "throats",
- "throners", "thrones",
- "throough", "thorough",
- "throught", "thought",
- "thrusday", "thursday",
- "thumbnal", "thumbnails",
- "thurdsay", "thursday",
- "thursdsy", "thursdays",
- "tightare", "tighter",
- "timestap", "timestamp",
- "tirangle", "triangle",
- "tirbunal", "tribunal",
- "titainum", "titanium",
- "titanuim", "titanium",
- "tocuhpad", "touchpad",
- "togehter", "together",
- "togheter", "together",
- "toiletts", "toilets",
- "tolerabe", "tolerable",
- "tommorow", "tomorrow",
- "tonguers", "tongues",
- "toriodal", "toroidal",
- "toritlla", "tortilla",
- "tornadoe", "tornado",
- "torotise", "tortoise",
- "torpedeo", "torpedo",
- "torphies", "trophies",
- "tortiose", "tortoise",
- "toruisty", "touristy",
- "toruneys", "tourneys",
- "touchapd", "touchpad",
- "tounreys", "tourneys",
- "tourisim", "tourism",
- "touritsy", "touristy",
- "tournyes", "tourneys",
- "toursits", "tourists",
- "toursity", "touristy",
- "toxiticy", "toxicity",
- "trabajao", "trabajo",
- "trabajdo", "trabajo",
- "trackres", "trackers",
- "trageted", "targeted",
- "traingle", "triangle",
- "traitour", "traitor",
- "trakcers", "trackers",
- "traliers", "trailers",
- "tranform", "transform",
- "transeat", "translates",
- "transfom", "transform",
- "transfos", "transforms",
- "transiet", "transient",
- "transito", "transition",
- "transpot", "transport",
- "trasnfer", "transfer",
- "tratiors", "traitors",
- "traveles", "travels",
- "traveres", "traverse",
- "treasurs", "treasures",
- "treatmet", "treatments",
- "treatsie", "treaties",
- "treausre", "treasure",
- "tredning", "trending",
- "tremelos", "tremolos",
- "tresuary", "treasury",
- "trialers", "trailers",
- "trianers", "trainers",
- "triangel", "triangle",
- "triangls", "triangles",
- "trianing", "training",
- "trianlge", "triangle",
- "triators", "traitors",
- "tribuanl", "tribunal",
- "trickyer", "trickery",
- "triggern", "triggering",
- "trilogoy", "trilogy",
- "trinagle", "triangle",
- "trinekts", "trinkets",
- "tringale", "triangle",
- "trinitiy", "trinity",
- "triology", "trilogy",
- "triumpth", "triumph",
- "trohpies", "trophies",
- "trollade", "trolled",
- "tropcial", "tropical",
- "trotilla", "tortilla",
- "trpoical", "tropical",
- "trubinal", "tribunal",
- "trubines", "turbines",
- "tsunamai", "tsunami",
- "tuesdsay", "tuesdays",
- "tunnells", "tunnels",
- "turkisch", "turkish",
- "turntabe", "turntable",
- "turretts", "turrets",
- "tusedays", "tuesdays",
- "tutorual", "tutorial",
- "twilgiht", "twilight",
- "tylenool", "tylenol",
- "typicaly", "typically",
- "tyranies", "tyrannies",
- "tyrannia", "tyrannical",
- "ublisher", "publisher",
- "udnercut", "undercut",
- "udnerdog", "underdog",
- "ugpraded", "upgraded",
- "ugprades", "upgrades",
- "ukrainie", "ukraine",
- "ukrainin", "ukrainian",
- "ukranian", "ukrainian",
- "ulitmate", "ultimate",
- "ultamite", "ultimate",
- "ultiamte", "ultimate",
- "ultimely", "ultimately",
- "ultrason", "ultrasound",
- "umberlla", "umbrella",
- "unabnned", "unbanned",
- "unbanend", "unbanned",
- "uncanney", "uncanny",
- "uncannny", "uncanny",
- "underbog", "undergo",
- "underglo", "undergo",
- "undersog", "undergo",
- "undertoe", "undertones",
- "underwar", "underwater",
- "unfailry", "unfairly",
- "unfarily", "unfairly",
- "ungodley", "ungodly",
- "unhapppy", "unhappy",
- "unhealty", "unhealthy",
- "unicrons", "unicorns",
- "unifroms", "uniforms",
- "uniquley", "uniquely",
- "univeral", "universal",
- "unlikley", "unlikely",
- "unlockes", "unlocks",
- "unluckly", "unlucky",
- "unpoened", "unopened",
- "unqiuely", "uniquely",
- "unrakned", "unranked",
- "unrnaked", "unranked",
- "unrpoven", "unproven",
- "unsuable", "unusable",
- "untraind", "untrained",
- "unusualy", "unusually",
- "unvierse", "universe",
- "unworhty", "unworthy",
- "upgarded", "upgraded",
- "upgardes", "upgrades",
- "uploades", "uploads",
- "upstaris", "upstairs",
- "upstiars", "upstairs",
- "urethrea", "urethra",
- "uruguary", "uruguay",
- "ususally", "usually",
- "utilitiy", "utility",
- "utlimate", "ultimate",
- "vaccinae", "vaccinated",
- "vaccinet", "vaccinated",
- "vacinity", "vicinity",
- "vaguelly", "vaguely",
- "vaiation", "aviation",
- "vaieties", "varieties",
- "vailidty", "validity",
- "vairable", "variable",
- "vaklyrie", "valkyrie",
- "valenica", "valencia",
- "valentie", "valentines",
- "valentis", "valentines",
- "validade", "validated",
- "valkirye", "valkyrie",
- "valkiyre", "valkyrie",
- "valkriye", "valkyrie",
- "valkryie", "valkyrie",
- "valkyire", "valkyrie",
- "valnecia", "valencia",
- "valubale", "valuable",
- "valykrie", "valkyrie",
- "vamipres", "vampires",
- "vampiers", "vampires",
- "vampries", "vampires",
- "vangurad", "vanguard",
- "vanillia", "vanilla",
- "vanillla", "vanilla",
- "vanugard", "vanguard",
- "varaible", "variable",
- "varaints", "variants",
- "variabel", "variable",
- "varibale", "variable",
- "varities", "varieties",
- "vassales", "vassals",
- "vassalls", "vassals",
- "vassalos", "vassals",
- "vaticaan", "vatican",
- "vaticina", "vatican",
- "vaulable", "valuable",
- "vaylkrie", "valkyrie",
- "vechiles", "vehicles",
- "vectores", "vectors",
- "vegansim", "veganism",
- "vegtable", "vegetable",
- "vehciles", "vehicles",
- "vehicels", "vehicles",
- "vehicule", "vehicle",
- "veichles", "vehicles",
- "venelope", "envelope",
- "venemous", "venomous",
- "vengance", "vengeance",
- "vengence", "vengeance",
- "verablly", "verbally",
- "verbaitm", "verbatim",
- "verisons", "versions",
- "versatel", "versatile",
- "vertabim", "verbatim",
- "vertigro", "vertigo",
- "vesseles", "vessels",
- "vessells", "vessels",
- "viabiliy", "viability",
- "viatmins", "vitamins",
- "vibratie", "vibrate",
- "vibratin", "vibration",
- "vicintiy", "vicinity",
- "vicseral", "visceral",
- "victimas", "victims",
- "victimes", "victims",
- "victorin", "victorian",
- "victoris", "victories",
- "vieweres", "viewers",
- "viewpoit", "viewpoints",
- "vigilane", "vigilante",
- "vigliant", "vigilant",
- "vikingos", "vikings",
- "viligant", "vigilant",
- "villegas", "villages",
- "vindicte", "vindictive",
- "vinicity", "vicinity",
- "violatin", "violation",
- "violenty", "violently",
- "violetas", "violates",
- "virament", "vraiment",
- "virbator", "vibrator",
- "virginas", "virgins",
- "virgines", "virgins",
- "virgings", "virgins",
- "virginis", "virgins",
- "virginus", "virgins",
- "virtualy", "virtually",
- "virtuels", "virtues",
- "virtuose", "virtues",
- "viscreal", "visceral",
- "visercal", "visceral",
- "visibily", "visibility",
- "visibley", "visibly",
- "visiblly", "visibly",
- "vitailty", "vitality",
- "vitimans", "vitamins",
- "vitmains", "vitamins",
- "vitories", "victories",
- "voicemal", "voicemail",
- "voilates", "violates",
- "volatily", "volatility",
- "volcando", "volcano",
- "volcanoe", "volcano",
- "volcaron", "volcano",
- "vriament", "vraiment",
- "wahtever", "whatever",
- "wallpapr", "wallpapers",
- "warantee", "warranty",
- "warcarft", "warcraft",
- "warrante", "warranties",
- "warriros", "warriors",
- "watchemn", "watchmen",
- "watchign", "watching",
- "wathcing", "watching",
- "wathcmen", "watchmen",
- "wathever", "whatever",
- "watkings", "watkins",
- "wealthly", "wealthy",
- "webistes", "websites",
- "websties", "websites",
- "wednesdy", "wednesdays",
- "weigthed", "weighted",
- "weridest", "weirdest",
- "werstler", "wrestler",
- "wesbites", "websites",
- "westbrok", "westbrook",
- "westerse", "westerners",
- "wherease", "whereas",
- "whipsers", "whispers",
- "whislist", "wishlist",
- "whisltes", "whistles",
- "whisperd", "whispered",
- "whistels", "whistles",
- "whitsles", "whistles",
- "whsipers", "whispers",
- "widgetas", "widgets",
- "wieghted", "weighted",
- "willaims", "williams",
- "willfuly", "willfully",
- "willimas", "williams",
- "windsoar", "windsor",
- "wininpeg", "winnipeg",
- "winnigns", "winnings",
- "winnpieg", "winnipeg",
- "wiredest", "weirdest",
- "wishlsit", "wishlist",
- "wishpers", "whispers",
- "withdral", "withdrawal",
- "witnesss", "witnesses",
- "wonderes", "wonders",
- "wonderus", "wonders",
- "workfore", "workforce",
- "wouldnot", "wouldnt",
- "wranlger", "wrangler",
- "wreckign", "wrecking",
- "wrecthed", "wretched",
- "wrekcing", "wrecking",
- "wreslter", "wrestler",
- "wresters", "wrestlers",
- "writting", "writing",
- "wrnagler", "wrangler",
- "wrteched", "wretched",
- "yeilding", "yielding",
- "yoesmite", "yosemite",
- "yorksher", "yorkshire",
- "yorkshie", "yorkshire",
- "yosemeti", "yosemite",
- "yosimete", "yosemite",
- "zealotes", "zealots",
- "zealoths", "zealots",
- "zealotus", "zealots",
- "zealouts", "zealous",
- "zepplein", "zeppelin",
- "zepplien", "zeppelin",
- "zimbabew", "zimbabwe",
- "zimbawbe", "zimbabwe",
- "zinoists", "zionists",
- "zionisim", "zionism",
- "zionistm", "zionism",
- "zionsits", "zionists",
- "zoinists", "zionists",
- "abiltiy", "ability",
- "abodmen", "abdomen",
- "abondon", "abandon",
- "aboslve", "absolve",
- "abosrbs", "absorbs",
- "abriter", "arbiter",
- "abrupty", "abruptly",
- "absense", "absence",
- "absolue", "absolute",
- "absovle", "absolve",
- "absrobs", "absorbs",
- "absuers", "abusers",
- "absurdy", "absurdly",
- "absymal", "abysmal",
- "abymsal", "abysmal",
- "acadamy", "academy",
- "acadmic", "academic",
- "accesss", "access",
- "accpets", "accepts",
- "accross", "across",
- "accuray", "accuracy",
- "acheive", "achieve",
- "achived", "achieved",
- "acident", "accident",
- "ackward", "awkward",
- "acrlyic", "acrylic",
- "actauly", "actualy",
- "activit", "activist",
- "activly", "actively",
- "actualy", "actually",
- "actulay", "actualy",
- "acuracy", "accuracy",
- "acusing", "causing",
- "acustom", "accustom",
- "acutaly", "actualy",
- "acyrlic", "acrylic",
- "adaptes", "adapters",
- "adatper", "adapter",
- "adbomen", "abdomen",
- "addcits", "addicts",
- "adderss", "address",
- "addtion", "addition",
- "adequet", "adequate",
- "adequit", "adequate",
- "adivser", "adviser",
- "adivsor", "advisor",
- "admited", "admitted",
- "admrial", "admiral",
- "adpater", "adapter",
- "adquire", "acquire",
- "adultey", "adultery",
- "adverst", "adverts",
- "adviced", "advised",
- "advocay", "advocacy",
- "advsior", "advisor",
- "aeriels", "aerials",
- "affaris", "affairs",
- "affiars", "affairs",
- "afircan", "african",
- "africas", "africans",
- "afwully", "awfully",
- "againts", "against",
- "agaisnt", "against",
- "aganist", "against",
- "aggreed", "agreed",
- "agianst", "against",
- "agreing", "agreeing",
- "agruing", "arguing",
- "ahtiest", "athiest",
- "aicraft", "aircraft",
- "ailmony", "alimony",
- "airbore", "airborne",
- "aircaft", "aircraft",
- "airlfow", "airflow",
- "airosft", "airsoft",
- "airpost", "airports",
- "airsfot", "airsoft",
- "airzona", "arizona",
- "alchmey", "alchemy",
- "alchool", "alcohol",
- "alcohal", "alcohol",
- "aledged", "alleged",
- "aledges", "alleges",
- "alegbra", "algebra",
- "algerba", "algebra",
- "alienet", "alienate",
- "alledge", "allege",
- "allegry", "allergy",
- "alltime", "all-time",
- "almighy", "almighty",
- "alochol", "alcohol",
- "alotted", "allotted",
- "alowing", "allowing",
- "alphabt", "alphabet",
- "alreayd", "already",
- "alrighy", "alrighty",
- "altanta", "atlanta",
- "alteast", "atleast",
- "altough", "although",
- "alusion", "allusion",
- "amateus", "amateurs",
- "amatuer", "amateur",
- "amature", "armature",
- "amensia", "amnesia",
- "amensty", "amnesty",
- "amercia", "america",
- "americs", "americas",
- "ammount", "amount",
- "ammused", "amused",
- "amneisa", "amnesia",
- "amnsety", "amnesty",
- "amognst", "amongst",
- "amongts", "amongst",
- "amonsgt", "amongst",
- "ampilfy", "amplify",
- "amrpits", "armpits",
- "analoge", "analogue",
- "analsyt", "analyst",
- "analyes", "analyse",
- "analyts", "analyst",
- "analzye", "analyze",
- "anaylse", "analyse",
- "anaylst", "analyst",
- "anaylze", "analyze",
- "anceint", "ancient",
- "andorid", "android",
- "andriod", "android",
- "androis", "androids",
- "angirly", "angrily",
- "angluar", "angular",
- "angualr", "angular",
- "anicent", "ancient",
- "anitque", "antique",
- "anixety", "anxiety",
- "anmesia", "amnesia",
- "anmesty", "amnesty",
- "annoint", "anoint",
- "annualy", "annually",
- "annuled", "annulled",
- "anohter", "another",
- "anomoly", "anomaly",
- "answerd", "answered",
- "anuglar", "angular",
- "anulled", "annulled",
- "anwsers", "answers",
- "anwyays", "anyways",
- "anxeity", "anxiety",
- "anyoens", "anyones",
- "anyonse", "anyones",
- "anywyas", "anyways",
- "aparent", "apparent",
- "appeard", "appeared",
- "appluad", "applaud",
- "aproval", "approval",
- "apsects", "aspects",
- "apshalt", "asphalt",
- "apsirin", "aspirin",
- "aqcuire", "acquire",
- "aquarim", "aquarium",
- "aquired", "acquired",
- "aranged", "arranged",
- "arbitre", "arbiter",
- "arcahic", "archaic",
- "archiac", "archaic",
- "arcylic", "acrylic",
- "aresnal", "arsenal",
- "aretmis", "artemis",
- "argubly", "arguably",
- "aribter", "arbiter",
- "ariflow", "airflow",
- "arisoft", "airsoft",
- "aritsts", "artists",
- "armchar", "armchair",
- "arogant", "arrogant",
- "arogent", "arrogant",
- "arresst", "arrests",
- "arround", "around",
- "arsneal", "arsenal",
- "artcile", "article",
- "artical", "article",
- "articel", "article",
- "artistc", "artistic",
- "artmeis", "artemis",
- "artsits", "artists",
- "aruging", "arguing",
- "aseuxal", "asexual",
- "asexaul", "asexual",
- "ashpalt", "asphalt",
- "asiprin", "aspirin",
- "asissts", "assists",
- "asnwers", "answers",
- "asorbed", "absorbed",
- "aspahlt", "asphalt",
- "asphlat", "asphalt",
- "aspriin", "aspirin",
- "assagne", "assange",
- "assasin", "assassin",
- "assembe", "assemble",
- "assemby", "assembly",
- "assisst", "assists",
- "assnage", "assange",
- "asssits", "assists",
- "assualt", "assault",
- "asterik", "asterisk",
- "asutria", "austria",
- "atcualy", "actualy",
- "atelast", "atleast",
- "athesim", "atheism",
- "athiesm", "atheism",
- "athiest", "atheist",
- "athiets", "athiest",
- "athlets", "athletes",
- "atlantc", "atlantic",
- "atleats", "atleast",
- "atlesat", "atleast",
- "atorney", "attorney",
- "atremis", "artemis",
- "attemps", "attempts",
- "attemts", "attempts",
- "attened", "attended",
- "attracs", "attracts",
- "audbile", "audible",
- "audibel", "audible",
- "austira", "austria",
- "austrai", "austria",
- "autistc", "autistic",
- "avation", "aviation",
- "avtaars", "avatars",
- "awakend", "awakened",
- "bablyon", "babylon",
- "backdor", "backdoor",
- "backsta", "backseat",
- "baclony", "balcony",
- "badnits", "bandits",
- "baiscly", "basicly",
- "bakcers", "backers",
- "balanse", "balances",
- "balcked", "blacked",
- "banhsee", "banshee",
- "bankgok", "bangkok",
- "baoynet", "bayonet",
- "baptims", "baptism",
- "baptsim", "baptism",
- "baragin", "bargain",
- "bargani", "bargain",
- "bargian", "bargain",
- "bariner", "brainer",
- "barlkey", "barkley",
- "barracs", "barracks",
- "barrles", "barrels",
- "barsita", "barista",
- "barvery", "bravery",
- "bascily", "basicly",
- "basicly", "basically",
- "basilcy", "basicly",
- "basiton", "bastion",
- "basnhee", "banshee",
- "bastane", "bastante",
- "bastars", "bastards",
- "bastino", "bastion",
- "bathrom", "bathroom",
- "batitsa", "batista",
- "batsita", "batista",
- "bayblon", "babylon",
- "baynoet", "bayonet",
- "bayoent", "bayonet",
- "bceuase", "becuase",
- "beacuse", "because",
- "bealtes", "beatles",
- "beaslty", "beastly",
- "beatels", "beatles",
- "beaucop", "beaucoup",
- "becamae", "became",
- "becames", "becomes",
- "becasue", "because",
- "becouse", "because",
- "becuaes", "becuase",
- "becuase", "because",
- "becusae", "becuase",
- "befried", "befriend",
- "beggins", "begins",
- "beglian", "belgian",
- "beglium", "belgium",
- "begnals", "bengals",
- "bejiing", "beijing",
- "beleifs", "beliefs",
- "beleive", "believe",
- "belgain", "belgian",
- "belguim", "belgium",
- "believr", "believer",
- "believs", "believes",
- "belifes", "beliefs",
- "beligan", "belgian",
- "beligum", "belgium",
- "belived", "believed",
- "belives", "believes",
- "benagls", "bengals",
- "benedit", "benedict",
- "benghai", "benghazi",
- "benglas", "bengals",
- "benifit", "benefit",
- "beoynce", "beyonce",
- "beraded", "bearded",
- "bersekr", "berserk",
- "beseige", "besiege",
- "betales", "beatles",
- "bethesa", "bethesda",
- "betrayd", "betrayed",
- "beucase", "becuase",
- "bewteen", "between",
- "bicthes", "bitches",
- "bidrman", "birdman",
- "biejing", "beijing",
- "bifgoot", "bigfoot",
- "bigorty", "bigotry",
- "bigtoed", "bigoted",
- "bigtory", "bigotry",
- "biogted", "bigoted",
- "biogtry", "bigotry",
- "bioplar", "bipolar",
- "biploar", "bipolar",
- "birdamn", "birdman",
- "birdges", "bridges",
- "birgade", "brigade",
- "bitcion", "bitcoin",
- "bithced", "bitched",
- "bithces", "bitches",
- "bitocin", "bitcoin",
- "bizzare", "bizarre",
- "blacony", "balcony",
- "blaimed", "blamed",
- "blankes", "blankets",
- "blegian", "belgian",
- "blegium", "belgium",
- "blizzad", "blizzard",
- "blockes", "blockers",
- "bloster", "bolster",
- "blulets", "bullets",
- "bobmers", "bombers",
- "bollocs", "bollocks",
- "bondary", "boundary",
- "bonnano", "bonanno",
- "bonsues", "bonuses",
- "boraden", "broaden",
- "borader", "broader",
- "boradly", "broadly",
- "bordeom", "boredom",
- "boslter", "bolster",
- "boudler", "boulder",
- "boundry", "boundary",
- "bounses", "bonuses",
- "boutiqe", "boutique",
- "bouyant", "buoyant",
- "braevry", "bravery",
- "braista", "barista",
- "brakley", "barkley",
- "branier", "brainer",
- "braoden", "broaden",
- "braoder", "broader",
- "braodly", "broadly",
- "brednan", "brendan",
- "breifly", "briefly",
- "breserk", "berserk",
- "brethen", "brethren",
- "brewrey", "brewery",
- "briagde", "brigade",
- "brianer", "brainer",
- "bridman", "birdman",
- "brielfy", "briefly",
- "brigdes", "bridges",
- "brightn", "brighten",
- "brisben", "brisbane",
- "britian", "britain",
- "britsol", "bristol",
- "briused", "bruised",
- "briuser", "bruiser",
- "briuses", "bruises",
- "brocoli", "broccoli",
- "bronocs", "broncos",
- "browine", "brownie",
- "brownei", "brownie",
- "brownis", "brownies",
- "bruglar", "burglar",
- "brunete", "brunette",
- "bruning", "burning",
- "brusied", "bruised",
- "brusies", "bruises",
- "brusses", "brussels",
- "brutaly", "brutally",
- "btiched", "bitched",
- "btiches", "bitches",
- "bubbels", "bubbles",
- "buddhim", "buddhism",
- "buddhit", "buddhist",
- "buddist", "buddhist",
- "budgest", "budgets",
- "bugdets", "budgets",
- "buildes", "builders",
- "bulgara", "bulgaria",
- "bullest", "bullets",
- "buoancy", "buoyancy",
- "burguny", "burgundy",
- "buriser", "bruiser",
- "burlgar", "burglar",
- "burnign", "burning",
- "burried", "buried",
- "burrtio", "burrito",
- "busines", "business",
- "busness", "business",
- "butthoe", "butthole",
- "buttrey", "buttery",
- "cababge", "cabbage",
- "cabines", "cabinets",
- "cabniet", "cabinet",
- "caclium", "calcium",
- "cacuses", "caucuses",
- "caffeen", "caffeine",
- "cahched", "cached",
- "cahotic", "chaotic",
- "cahsier", "cashier",
- "cailbre", "calibre",
- "calaber", "caliber",
- "calagry", "calgary",
- "calback", "callback",
- "calbire", "calibre",
- "calcuim", "calcium",
- "calculs", "calculus",
- "calicum", "calcium",
- "calrify", "clarify",
- "calrity", "clarity",
- "caluses", "clauses",
- "camboda", "cambodia",
- "campain", "campaign",
- "campuss", "campuses",
- "cancles", "cancels",
- "cancres", "cancers",
- "cancuks", "canucks",
- "canides", "candies",
- "cannnot", "cannot",
- "canrage", "carnage",
- "capible", "capable",
- "capitas", "capitals",
- "capsuls", "capsules",
- "captais", "captains",
- "captial", "capital",
- "captiol", "capitol",
- "captued", "captured",
- "capturd", "captured",
- "capusle", "capsule",
- "carange", "carnage",
- "carbien", "carbine",
- "cardaic", "cardiac",
- "cardina", "cardigan",
- "careing", "caring",
- "caridac", "cardiac",
- "carmtan", "cartman",
- "carnege", "carnage",
- "carnige", "carnage",
- "carolan", "carolina",
- "carreer", "career",
- "carrers", "careers",
- "cartles", "cartels",
- "caryons", "crayons",
- "casette", "cassette",
- "casheir", "cashier",
- "cashies", "cashiers",
- "cashire", "cashier",
- "casltes", "castles",
- "caspule", "capsule",
- "cassete", "cassette",
- "castels", "castles",
- "casuing", "causing",
- "cathlic", "catholic",
- "cauncks", "canucks",
- "cavarly", "cavalry",
- "cavlary", "cavalry",
- "celcius", "celsius",
- "celisus", "celsius",
- "celitcs", "celtics",
- "celsuis", "celsius",
- "centruy", "century",
- "centuty", "century",
- "ceratin", "certain",
- "cermaic", "ceramic",
- "certian", "certain",
- "cervial", "cervical",
- "cesspol", "cesspool",
- "cetlics", "celtics",
- "chambre", "chamber",
- "charcol", "charcoal",
- "charisa", "charisma",
- "chasiss", "chassis",
- "chatoic", "chaotic",
- "cheeots", "cheetos",
- "cheesse", "cheeses",
- "chekcer", "checker",
- "chelsae", "chelsea",
- "cheslea", "chelsea",
- "chiense", "chinese",
- "childen", "children",
- "chimeny", "chimney",
- "chinees", "chinese",
- "chinmey", "chimney",
- "chipest", "chipset",
- "chispet", "chipset",
- "chivaly", "chivalry",
- "chlesea", "chelsea",
- "choatic", "chaotic",
- "chocies", "choices",
- "choosen", "chosen",
- "chtulhu", "cthulhu",
- "churchs", "churches",
- "cilanto", "cilantro",
- "cilents", "clients",
- "circels", "circles",
- "circuis", "circuits",
- "cirlces", "circles",
- "clacium", "calcium",
- "claerer", "clearer",
- "claerly", "clearly",
- "clagary", "calgary",
- "claibre", "calibre",
- "claimes", "claims",
- "clairfy", "clarify",
- "clairty", "clarity",
- "clanand", "clannad",
- "clarfiy", "clarify",
- "classis", "classics",
- "clasues", "clauses",
- "claymer", "claymore",
- "claymoe", "claymore",
- "cleanes", "cleanse",
- "cleasne", "cleanse",
- "cleints", "clients",
- "clenase", "cleanse",
- "clesius", "celsius",
- "cletics", "celtics",
- "clevery", "cleverly",
- "climats", "climates",
- "climbes", "climbers",
- "clincis", "clinics",
- "clitors", "clitoris",
- "cloesly", "closely",
- "closley", "closely",
- "cluases", "clauses",
- "cluprit", "culprit",
- "coalese", "coalesce",
- "coctail", "cocktail",
- "cohesie", "cohesive",
- "colgone", "cologne",
- "collape", "collapse",
- "collest", "collects",
- "collony", "colony",
- "collumn", "column",
- "cologen", "cologne",
- "colomba", "colombia",
- "colonge", "cologne",
- "colorao", "colorado",
- "colourd", "coloured",
- "columsn", "columns",
- "comando", "commando",
- "comapny", "company",
- "comapre", "compare",
- "comarde", "comrade",
- "comback", "comeback",
- "combins", "combines",
- "comdeic", "comedic",
- "comited", "committed",
- "commano", "commando",
- "commans", "commands",
- "commere", "commerce",
- "comming", "coming",
- "commitd", "commited",
- "compase", "compares",
- "compede", "competed",
- "compilr", "compiler",
- "compnay", "company",
- "compots", "compost",
- "comrads", "comrades",
- "comtpon", "compton",
- "conceed", "concede",
- "conceps", "concepts",
- "conclue", "conclude",
- "concret", "concert",
- "condenm", "condemn",
- "condiut", "conduit",
- "condmen", "condemn",
- "confids", "confides",
- "confins", "confines",
- "confise", "confines",
- "conflit", "conflict",
- "conived", "connived",
- "connecs", "connects",
- "conqeur", "conquer",
- "conqure", "conquer",
- "consept", "concept",
- "consern", "concern",
- "consums", "consumes",
- "contacs", "contacts",
- "contais", "contains",
- "contast", "contacts",
- "contemt", "contempt",
- "contens", "contents",
- "contess", "contests",
- "contian", "contain",
- "contine", "continue",
- "convers", "converts",
- "conveyd", "conveyed",
- "convine", "convince",
- "coprses", "corpses",
- "coputer", "computer",
- "corasir", "corsair",
- "coratia", "croatia",
- "coridal", "cordial",
- "corsari", "corsair",
- "corsiar", "corsair",
- "corspes", "corpses",
- "corwbar", "crowbar",
- "costums", "costumes",
- "coudlnt", "couldnt",
- "coulmns", "columns",
- "coulndt", "couldnt",
- "counsle", "counsel",
- "countes", "counters",
- "courtey", "courtesy",
- "covenat", "covenant",
- "coytoes", "coyotes",
- "crabine", "carbine",
- "cralwed", "crawled",
- "craotia", "croatia",
- "craweld", "crawled",
- "creamic", "ceramic",
- "createn", "creatine",
- "creater", "creature",
- "creatie", "creatine",
- "creatue", "creature",
- "creepes", "creepers",
- "creepig", "creeping",
- "creulty", "cruelty",
- "cricles", "circles",
- "critera", "criteria",
- "cropses", "corpses",
- "crosair", "corsair",
- "crpytic", "cryptic",
- "crsytal", "crystal",
- "crtical", "critical",
- "crucibe", "crucible",
- "cruetly", "cruelty",
- "cruical", "crucial",
- "crulety", "cruelty",
- "crusdae", "crusade",
- "crusier", "cruiser",
- "crusies", "cruises",
- "crusive", "cursive",
- "crutchs", "crutches",
- "crypitc", "cryptic",
- "crystas", "crystals",
- "crystsl", "crystals",
- "crytpic", "cryptic",
- "crytsal", "crystal",
- "cthluhu", "cthulhu",
- "cthuhlu", "cthulhu",
- "cthuluh", "cthulhu",
- "ctuhlhu", "cthulhu",
- "cuasing", "causing",
- "cubcile", "cubicle",
- "cubilce", "cubicle",
- "cuddels", "cuddles",
- "culrpit", "culprit",
- "culturs", "cultures",
- "cupboad", "cupboard",
- "cuplrit", "culprit",
- "curatin", "curtain",
- "curcial", "crucial",
- "curcuit", "circuit",
- "curelty", "cruelty",
- "curiser", "cruiser",
- "curisve", "cursive",
- "currate", "curate",
- "currens", "currents",
- "curreny", "currency",
- "currest", "currents",
- "cursade", "crusade",
- "curtian", "curtain",
- "cyandie", "cyanide",
- "cyclits", "cyclist",
- "cycloen", "cyclone",
- "cycolps", "cyclops",
- "cylcist", "cyclist",
- "cylcone", "cyclone",
- "cylcops", "cyclops",
- "cynaide", "cyanide",
- "cyrptic", "cryptic",
- "cyrstal", "crystal",
- "dagners", "dangers",
- "daimond", "diamond",
- "damenor", "demeanor",
- "dammage", "damage",
- "darcula", "dracula",
- "dargons", "dragons",
- "darkets", "darkest",
- "datbase", "database",
- "daulity", "duality",
- "dawrves", "dwarves",
- "ddogers", "dodgers",
- "ddoging", "dodging",
- "deadlit", "deadlift",
- "deadpol", "deadpool",
- "deafult", "default",
- "deahtly", "deathly",
- "deatils", "details",
- "deatlhy", "deathly",
- "decalre", "declare",
- "decison", "decision",
- "declars", "declares",
- "declase", "declares",
- "decress", "decrees",
- "decribe", "describe",
- "decsend", "descend",
- "dectect", "detect",
- "defaint", "defiant",
- "defauls", "defaults",
- "defelct", "deflect",
- "defensd", "defends",
- "deffine", "define",
- "definat", "defiant",
- "definet", "definite",
- "definie", "definite",
- "definig", "defining",
- "definit", "definite",
- "defualt", "default",
- "degarde", "degrade",
- "degrase", "degrasse",
- "degrate", "degrade",
- "deiners", "deniers",
- "deisgns", "designs",
- "deivant", "deviant",
- "dekstop", "desktop",
- "delcare", "declare",
- "delfect", "deflect",
- "demenor", "demeanor",
- "dementa", "dementia",
- "demsond", "desmond",
- "deneirs", "deniers",
- "denisty", "density",
- "densley", "densely",
- "depcits", "depicts",
- "dependd", "depended",
- "depitcs", "depicts",
- "deployd", "deployed",
- "depsise", "despise",
- "descrie", "describe",
- "descuss", "discuss",
- "desgins", "designs",
- "desings", "designs",
- "desitny", "destiny",
- "desnely", "densely",
- "desnity", "density",
- "desomnd", "desmond",
- "despict", "depict",
- "despide", "despised",
- "despies", "despise",
- "destkop", "desktop",
- "destory", "destroy",
- "destros", "destroys",
- "detaild", "detailed",
- "detials", "details",
- "detorit", "detroit",
- "detriot", "detroit",
- "deuling", "dueling",
- "devaint", "deviant",
- "devaite", "deviate",
- "devided", "divided",
- "devlove", "devolve",
- "devotin", "devotion",
- "devovle", "devolve",
- "diabets", "diabetes",
- "dialecs", "dialects",
- "dialoge", "dialogue",
- "diamons", "diamonds",
- "diasble", "disable",
- "dicksih", "dickish",
- "dicover", "discover",
- "dictats", "dictates",
- "dieties", "deities",
- "dilpoma", "diploma",
- "dimaond", "diamond",
- "dingity", "dignity",
- "dinosar", "dinosaur",
- "diosese", "diocese",
- "dipolma", "diploma",
- "dirbble", "dribble",
- "directy", "directly",
- "diretcx", "directx",
- "dirived", "derived",
- "dirvers", "drivers",
- "disbale", "disable",
- "disguss", "disgusts",
- "disliks", "dislikes",
- "disover", "discover",
- "dispair", "despair",
- "dispath", "dispatch",
- "dispite", "despite",
- "dispuse", "disputes",
- "disputs", "disputes",
- "dissole", "dissolve",
- "distase", "distaste",
- "distint", "distinct",
- "divison", "division",
- "docuhes", "douches",
- "docuhey", "douchey",
- "dogders", "dodgers",
- "dogding", "dodging",
- "dolhpin", "dolphin",
- "dolphis", "dolphins",
- "dominae", "dominate",
- "dominno", "dominion",
- "doplhin", "dolphin",
- "dortmud", "dortmund",
- "draclua", "dracula",
- "dracual", "dracula",
- "drakest", "darkest",
- "dramtic", "dramatic",
- "dribbel", "dribble",
- "driectx", "directx",
- "driftig", "drifting",
- "drinkes", "drinkers",
- "druming", "drumming",
- "duailty", "duality",
- "dualtiy", "duality",
- "dubsetp", "dubstep",
- "dulaity", "duality",
- "duleing", "dueling",
- "dunegon", "dungeon",
- "dungeos", "dungeons",
- "dungoen", "dungeon",
- "durring", "during",
- "dusbtep", "dubstep",
- "dyansty", "dynasty",
- "dynamis", "dynamics",
- "dynsaty", "dynasty",
- "earlies", "earliest",
- "earliet", "earliest",
- "earplus", "earplugs",
- "eastwod", "eastwood",
- "ebcuase", "becuase",
- "ecilpse", "eclipse",
- "eclipes", "eclipse",
- "eclispe", "eclipse",
- "eclpise", "eclipse",
- "ectsasy", "ecstasy",
- "edbiles", "edibles",
- "edibels", "edibles",
- "effords", "efforts",
- "ehtanol", "ethanol",
- "eifnach", "einfach",
- "eighten", "eighteen",
- "einfahc", "einfach",
- "elasped", "elapsed",
- "elcipse", "eclipse",
- "elction", "election",
- "elecrto", "electro",
- "electic", "electric",
- "electon", "election",
- "ellitot", "elliott",
- "elloitt", "elliott",
- "elphant", "elephant",
- "emabrgo", "embargo",
- "emabssy", "embassy",
- "emapthy", "empathy",
- "embeded", "embedded",
- "embrago", "embargo",
- "eminate", "emanate",
- "emipres", "empires",
- "emision", "emission",
- "emiting", "emitting",
- "emition", "emission",
- "emmited", "emitted",
- "empahty", "empathy",
- "emphsis", "emphasis",
- "empiers", "empires",
- "empited", "emptied",
- "emplore", "employer",
- "emporer", "emperor",
- "empries", "empires",
- "emtpied", "emptied",
- "enameld", "enameled",
- "encahnt", "enchant",
- "encalve", "enclave",
- "encrpyt", "encrypt",
- "encyrpt", "encrypt",
- "endores", "endorse",
- "endrose", "endorse",
- "energis", "energies",
- "enforse", "enforces",
- "enginer", "engineer",
- "englsih", "english",
- "enhanse", "enhances",
- "enlcave", "enclave",
- "enlgish", "english",
- "enlsave", "enslave",
- "ensalve", "enslave",
- "entbook", "netbook",
- "entirey", "entirety",
- "entorpy", "entropy",
- "epiloge", "epilogue",
- "episdoe", "episode",
- "epsiode", "episode",
- "epsorts", "esports",
- "eptiome", "epitome",
- "equiped", "equipped",
- "erested", "arrested",
- "escapse", "escapes",
- "escpaes", "escapes",
- "esctasy", "ecstasy",
- "esporst", "esports",
- "espreso", "espresso",
- "esprots", "esports",
- "essense", "essence",
- "etherel", "ethereal",
- "ethnaol", "ethanol",
- "euphora", "euphoria",
- "europen", "european",
- "eurpean", "european",
- "everets", "everest",
- "everset", "everest",
- "evloved", "evolved",
- "evloves", "evolves",
- "evovled", "evolved",
- "evovles", "evolves",
- "exaclty", "exactly",
- "exahust", "exhaust",
- "examind", "examined",
- "exapnds", "expands",
- "exatled", "exalted",
- "excange", "exchange",
- "excatly", "exactly",
- "excells", "excels",
- "exceprt", "excerpt",
- "excluse", "excludes",
- "excrept", "excerpt",
- "exculde", "exclude",
- "exelent", "excellent",
- "exemple", "example",
- "exerpts", "excerpts",
- "exhasut", "exhaust",
- "exhuast", "exhaust",
- "exising", "existing",
- "existet", "existent",
- "exlated", "exalted",
- "exlcude", "exclude",
- "exliled", "exiled",
- "exludes", "excludes",
- "exmaple", "example",
- "exoitcs", "exotics",
- "expalin", "explain",
- "expeced", "expected",
- "expells", "expels",
- "expiers", "expires",
- "explict", "explicit",
- "expliot", "exploit",
- "explods", "explodes",
- "explose", "explodes",
- "expolde", "explode",
- "expolit", "exploit",
- "exposse", "exposes",
- "expries", "expires",
- "exsited", "existed",
- "extered", "exerted",
- "exterme", "extreme",
- "extoics", "exotics",
- "extreem", "extreme",
- "extrems", "extremes",
- "eyebals", "eyeballs",
- "eyebros", "eyebrows",
- "fabulos", "fabulous",
- "facebok", "facebook",
- "facepam", "facepalm",
- "faclons", "falcons",
- "facsism", "fascism",
- "facsist", "fascist",
- "failurs", "failures",
- "faincee", "fiancee",
- "falesly", "falsely",
- "falired", "flaired",
- "falshed", "flashed",
- "falshes", "flashes",
- "falsley", "falsely",
- "falvors", "flavors",
- "familes", "families",
- "famoust", "famous",
- "famousy", "famously",
- "fanatsy", "fantasy",
- "fantaic", "fanatic",
- "faoming", "foaming",
- "fascits", "fascist",
- "fasicsm", "fascism",
- "fasicst", "fascist",
- "faslely", "falsely",
- "fatiuge", "fatigue",
- "febuary", "february",
- "fecthed", "fetched",
- "fecthes", "fetches",
- "feminen", "feminine",
- "feminie", "feminine",
- "feminim", "feminism",
- "feodras", "fedoras",
- "fertily", "fertility",
- "fesitve", "festive",
- "fethced", "fetched",
- "fethces", "fetches",
- "fetishs", "fetishes",
- "fianite", "finite",
- "fianlly", "finally",
- "fiercly", "fiercely",
- "filcker", "flicker",
- "filpped", "flipped",
- "filterd", "filtered",
- "finacee", "fiancee",
- "fineses", "finesse",
- "fininsh", "finnish",
- "finishs", "finishes",
- "finisse", "finishes",
- "finnsih", "finnish",
- "firends", "friends",
- "firggin", "friggin",
- "firsbee", "frisbee",
- "firslty", "firstly",
- "firtsly", "firstly",
- "fitlers", "filters",
- "flacons", "falcons",
- "flahsed", "flashed",
- "flahses", "flashes",
- "flaried", "flaired",
- "flasely", "falsely",
- "flashig", "flashing",
- "flavord", "flavored",
- "flavous", "flavours",
- "flawess", "flawless",
- "flciker", "flicker",
- "fliters", "filters",
- "flordia", "florida",
- "florene", "florence",
- "fnaatic", "fanatic",
- "fomaing", "foaming",
- "fonetic", "phonetic",
- "forefit", "forfeit",
- "foregin", "foreign",
- "foreing", "foreign",
- "forfiet", "forfeit",
- "forhead", "forehead",
- "foriegn", "foreign",
- "formaly", "formally",
- "formery", "formerly",
- "formost", "foremost",
- "formual", "formula",
- "formuls", "formulas",
- "forrset", "forrest",
- "forsakn", "forsaken",
- "forsane", "forsaken",
- "forumla", "formula",
- "fountan", "fountain",
- "fourten", "fourteen",
- "fracter", "fracture",
- "fragmet", "fragment",
- "freedos", "freedoms",
- "freinds", "friends",
- "frigign", "friggin",
- "fristly", "firstly",
- "frostig", "frosting",
- "frsibee", "frisbee",
- "fruitin", "fruition",
- "fullets", "fullest",
- "fullset", "fullest",
- "funides", "fundies",
- "funtion", "function",
- "furance", "furnace",
- "furncae", "furnace",
- "futhroc", "futhark",
- "gadgest", "gadgets",
- "gagdets", "gadgets",
- "galatic", "galactic",
- "galcier", "glacier",
- "galsgow", "glasgow",
- "gameply", "gameplay",
- "gamerga", "gamertag",
- "gankign", "ganking",
- "ganster", "gangster",
- "garabge", "garbage",
- "garfied", "garfield",
- "garnola", "granola",
- "generas", "generals",
- "genersl", "generals",
- "geniuss", "geniuses",
- "geogria", "georgia",
- "geomety", "geometry",
- "georiga", "georgia",
- "gernade", "grenade",
- "gerogia", "georgia",
- "gigabye", "gigabyte",
- "giltchy", "glitchy",
- "gimmics", "gimmicks",
- "gimmicy", "gimmicky",
- "girzzly", "grizzly",
- "glagsow", "glasgow",
- "glaicer", "glacier",
- "glicthy", "glitchy",
- "glimpes", "glimpse",
- "glimspe", "glimpse",
- "glipmse", "glimpse",
- "glitchd", "glitched",
- "glitchs", "glitches",
- "glithcy", "glitchy",
- "globaly", "globally",
- "gloiath", "goliath",
- "glorios", "glorious",
- "gltichy", "glitchy",
- "gnaking", "ganking",
- "gnawwed", "gnawed",
- "goddanm", "goddamn",
- "goddman", "goddamn",
- "godliek", "godlike",
- "godlman", "goldman",
- "godsped", "godspeed",
- "goergia", "georgia",
- "goilath", "goliath",
- "golaith", "goliath",
- "golbins", "goblins",
- "goldamn", "goldman",
- "goldbeg", "goldberg",
- "goldike", "godlike",
- "golitah", "goliath",
- "goodluk", "goodluck",
- "gorumet", "gourmet",
- "gosepls", "gospels",
- "gosples", "gospels",
- "gpysies", "gypsies",
- "grabage", "garbage",
- "grahpic", "graphic",
- "grainte", "granite",
- "grammer", "grammar",
- "graniet", "granite",
- "grantie", "granite",
- "graphie", "graphite",
- "graphis", "graphics",
- "grappel", "grapple",
- "greande", "grenade",
- "grenads", "grenades",
- "greneer", "greener",
- "griaffe", "giraffe",
- "gridles", "griddles",
- "grillig", "grilling",
- "grpahic", "graphic",
- "guardin", "guardian",
- "guiness", "guinness",
- "gullibe", "gullible",
- "gutiars", "guitars",
- "gypises", "gypsies",
- "gyspies", "gypsies",
- "habaeus", "habeas",
- "haethen", "heathen",
- "hailfax", "halifax",
- "halfiax", "halifax",
- "handbok", "handbook",
- "handedy", "handedly",
- "handeld", "handled",
- "hanlder", "handler",
- "hannibl", "hannibal",
- "hanuted", "haunted",
- "haorder", "hoarder",
- "hapened", "happened",
- "happend", "happened",
- "happliy", "happily",
- "harased", "harassed",
- "harases", "harasses",
- "hardend", "hardened",
- "hardwod", "hardwood",
- "haricut", "haircut",
- "hatchig", "hatching",
- "hauntig", "haunting",
- "haviest", "heaviest",
- "headest", "headset",
- "headses", "headsets",
- "heaveny", "heavenly",
- "heigher", "higher",
- "heigths", "heights",
- "helemts", "helmets",
- "hellfie", "hellfire",
- "hellvua", "helluva",
- "helment", "helmet",
- "helpped", "helped",
- "hemlets", "helmets",
- "henious", "heinous",
- "heorics", "heroics",
- "heorine", "heroine",
- "heriocs", "heroics",
- "herione", "heroine",
- "herocis", "heroics",
- "heronie", "heroine",
- "hesiman", "heisman",
- "hieghts", "heights",
- "hienous", "heinous",
- "hiesman", "heisman",
- "himselv", "himself",
- "hiptser", "hipster",
- "hismelf", "himself",
- "hispter", "hipster",
- "hitboxs", "hitboxes",
- "hoilday", "holiday",
- "hokpins", "hopkins",
- "holdiay", "holiday",
- "holdins", "holdings",
- "homniem", "hominem",
- "horader", "hoarder",
- "hosited", "hoisted",
- "hosthot", "hotshot",
- "hostles", "hostels",
- "hostpot", "hotspot",
- "hothsot", "hotshot",
- "hotpsot", "hotspot",
- "hotsopt", "hotspot",
- "hounour", "honour",
- "hseldon", "sheldon",
- "huanted", "haunted",
- "humanit", "humanist",
- "humants", "humanist",
- "humidiy", "humidity",
- "humoros", "humorous",
- "hunagry", "hungary",
- "hunderd", "hundred",
- "hundres", "hundreds",
- "hungray", "hungary",
- "hurdels", "hurdles",
- "hurldes", "hurdles",
- "husbans", "husbands",
- "hweaton", "wheaton",
- "hybirds", "hybrids",
- "hydogen", "hydrogen",
- "hygeine", "hygiene",
- "hypnoss", "hypnosis",
- "hyrbids", "hybrids",
- "hystera", "hysteria",
- "iceforg", "icefrog",
- "ierland", "ireland",
- "ignitin", "ignition",
- "ignorat", "ignorant",
- "illegas", "illegals",
- "illegsl", "illegals",
- "illinos", "illinois",
- "imanent", "eminent",
- "imapcts", "impacts",
- "iminent", "eminent",
- "imminet", "imminent",
- "implict", "implicit",
- "imploed", "implode",
- "imploys", "employs",
- "impluse", "impulse",
- "impolde", "implode",
- "importd", "imported",
- "imporve", "improve",
- "impules", "impulse",
- "impusle", "impulse",
- "imrpove", "improve",
- "incldue", "include",
- "incluse", "includes",
- "indains", "indians",
- "indiaan", "indiana",
- "indluge", "indulge",
- "indugle", "indulge",
- "infalte", "inflate",
- "infenro", "inferno",
- "infered", "inferred",
- "inferir", "inferior",
- "infinet", "infinite",
- "infinie", "infinite",
- "infinit", "infinite",
- "infornt", "infront",
- "infroms", "informs",
- "infrotn", "infront",
- "inheirt", "inherit",
- "inidans", "indians",
- "initals", "initials",
- "initisl", "initials",
- "inlcine", "incline",
- "inovker", "invoker",
- "inpeach", "impeach",
- "inpsect", "inspect",
- "inpsire", "inspire",
- "inquier", "inquire",
- "inquriy", "inquiry",
- "insaney", "insanely",
- "inscets", "insects",
- "insepct", "inspect",
- "insipre", "inspire",
- "insluts", "insults",
- "instade", "instead",
- "instint", "instinct",
- "intenst", "intents",
- "intered", "interred",
- "interet", "interest",
- "internt", "internet",
- "interro", "interior",
- "intrest", "interest",
- "intrige", "intrigue",
- "invlove", "involve",
- "invoekr", "invoker",
- "invovle", "involve",
- "iornman", "ironman",
- "iranain", "iranian",
- "iranias", "iranians",
- "iranina", "iranian",
- "irleand", "ireland",
- "ironamn", "ironman",
- "isalmic", "islamic",
- "isareli", "israeli",
- "islamit", "islamist",
- "islmaic", "islamic",
- "isloate", "isolate",
- "isralei", "israeli",
- "isreali", "israeli",
- "italias", "italians",
- "jagaurs", "jaguars",
- "jaguras", "jaguars",
- "jamacia", "jamaica",
- "jamaina", "jamaican",
- "jamiaca", "jamaica",
- "jamsine", "jasmine",
- "janaury", "january",
- "januray", "january",
- "japanes", "japanese",
- "jasmien", "jasmine",
- "jaugars", "jaguars",
- "jaunary", "january",
- "jeircho", "jericho",
- "jennins", "jennings",
- "jeopary", "jeopardy",
- "jeresys", "jerseys",
- "jericoh", "jericho",
- "jersyes", "jerseys",
- "jewerly", "jewelry",
- "jorunal", "journal",
- "jounral", "journal",
- "joystik", "joystick",
- "juadism", "judaism",
- "judasim", "judaism",
- "judical", "judicial",
- "juipter", "jupiter",
- "junglig", "jungling",
- "juptier", "jupiter",
- "jusitfy", "justify",
- "justfiy", "justify",
- "karakoe", "karaoke",
- "karoake", "karaoke",
- "kenendy", "kennedy",
- "kenndey", "kennedy",
- "kentucy", "kentucky",
- "keyboad", "keyboard",
- "keychan", "keychain",
- "keynode", "keynote",
- "kicthen", "kitchen",
- "killins", "killings",
- "kineitc", "kinetic",
- "kinghts", "knights",
- "kinteic", "kinetic",
- "kitches", "kitchens",
- "kitites", "kitties",
- "knietic", "kinetic",
- "knigths", "knights",
- "knuckel", "knuckle",
- "kroeans", "koreans",
- "krudish", "kurdish",
- "ktichen", "kitchen",
- "kubirck", "kubrick",
- "kunckle", "knuckle",
- "kurbick", "kubrick",
- "kuridsh", "kurdish",
- "laguage", "language",
- "landins", "landings",
- "lantren", "lantern",
- "laready", "already",
- "laregly", "largely",
- "largley", "largely",
- "lasanga", "lasagna",
- "lasgana", "lasagna",
- "latitue", "latitude",
- "latnern", "lantern",
- "launhed", "launched",
- "lavendr", "lavender",
- "leathal", "lethal",
- "lefitst", "leftist",
- "leftits", "leftist",
- "legnths", "lengths",
- "legnthy", "lengthy",
- "legoins", "legions",
- "leigons", "legions",
- "lenghts", "lengths",
- "lenoard", "leonard",
- "lepoard", "leopard",
- "lesbain", "lesbian",
- "lesiban", "lesbian",
- "lesiure", "leisure",
- "liasion", "liaison",
- "liasons", "liaisons",
- "liberae", "liberate",
- "liberas", "liberals",
- "lienups", "lineups",
- "liesure", "leisure",
- "liftime", "lifetime",
- "lighlty", "lightly",
- "lightes", "lighters",
- "ligthly", "lightly",
- "linclon", "lincoln",
- "linueps", "lineups",
- "liqiuds", "liquids",
- "lisence", "license",
- "lisense", "license",
- "listend", "listened",
- "litecon", "litecoin",
- "literae", "literate",
- "lithuim", "lithium",
- "litihum", "lithium",
- "loadous", "loadouts",
- "loenard", "leonard",
- "loepard", "leopard",
- "logiteh", "logitech",
- "loosley", "loosely",
- "luandry", "laundry",
- "luckliy", "luckily",
- "luicfer", "lucifer",
- "lunatis", "lunatics",
- "maching", "machine",
- "machins", "machines",
- "maclolm", "malcolm",
- "macthup", "matchup",
- "madsion", "madison",
- "magents", "magnets",
- "magicin", "magician",
- "magolia", "magnolia",
- "maidson", "madison",
- "maintan", "maintain",
- "mairlyn", "marilyn",
- "malaira", "malaria",
- "malaysa", "malaysia",
- "malclom", "malcolm",
- "manauls", "manuals",
- "mandase", "mandates",
- "mandats", "mandates",
- "mangeld", "mangled",
- "mangets", "magnets",
- "manualy", "manually",
- "manuver", "maneuver",
- "marbels", "marbles",
- "margart", "margaret",
- "mariage", "marriage",
- "mariens", "marines",
- "maritan", "martian",
- "marixsm", "marxism",
- "mariyln", "marilyn",
- "markede", "marketed",
- "marlbes", "marbles",
- "marliyn", "marilyn",
- "marnies", "marines",
- "marrage", "marriage",
- "martail", "martial",
- "martain", "martian",
- "masacra", "mascara",
- "massace", "massacre",
- "mathcup", "matchup",
- "mathwes", "mathews",
- "matrial", "martial",
- "maunals", "manuals",
- "mcalren", "mclaren",
- "meanins", "meanings",
- "medicad", "medicaid",
- "medicae", "medicare",
- "medioce", "mediocre",
- "meixcan", "mexican",
- "meldoic", "melodic",
- "melieux", "milieux",
- "melodis", "melodies",
- "memeber", "member",
- "memoery", "memory",
- "memorie", "memory",
- "menally", "mentally",
- "mentaly", "mentally",
- "meoldic", "melodic",
- "meranda", "veranda",
- "merchat", "merchant",
- "merucry", "mercury",
- "messagd", "messaged",
- "messaih", "messiah",
- "metagem", "metagame",
- "metalic", "metallic",
- "mexcian", "mexican",
- "michina", "michigan",
- "midfied", "midfield",
- "midotwn", "midtown",
- "midtwon", "midtown",
- "migrans", "migrants",
- "militat", "militant",
- "militis", "militias",
- "miltary", "military",
- "mimimum", "minimum",
- "mineras", "minerals",
- "mininos", "minions",
- "ministr", "minister",
- "ministy", "ministry",
- "minoins", "minions",
- "minstry", "ministry",
- "minumum", "minimum",
- "mirrord", "mirrored",
- "misandy", "misandry",
- "misison", "mission",
- "misouri", "missouri",
- "mispell", "misspell",
- "missils", "missiles",
- "mistery", "mystery",
- "mobiliy", "mobility",
- "modualr", "modular",
- "momento", "memento",
- "momment", "moment",
- "monarcy", "monarchy",
- "monatge", "montage",
- "monglos", "mongols",
- "monitos", "monitors",
- "monstre", "monster",
- "montaeg", "montage",
- "montrel", "montreal",
- "monumet", "monument",
- "morbidy", "morbidly",
- "morgage", "mortgage",
- "morphen", "morphine",
- "morphie", "morphine",
- "morroco", "morocco",
- "mortage", "mortgage",
- "mosnter", "monster",
- "mosture", "moisture",
- "motivet", "motivate",
- "motnage", "montage",
- "motoral", "motorola",
- "mountan", "mountain",
- "movment", "movement",
- "mucuous", "mucous",
- "muesums", "museums",
- "muliple", "multiple",
- "mulsims", "muslims",
- "multipe", "multiple",
- "multipy", "multiply",
- "munbers", "numbers",
- "munchis", "munchies",
- "murderd", "murdered",
- "muscial", "musical",
- "mushrom", "mushroom",
- "musilms", "muslims",
- "muslces", "muscles",
- "musuems", "museums",
- "mutatin", "mutation",
- "mypsace", "myspace",
- "mysapce", "myspace",
- "napolen", "napoleon",
- "narhwal", "narwhal",
- "natique", "antique",
- "nativey", "natively",
- "natrual", "natural",
- "naugthy", "naughty",
- "nauseos", "nauseous",
- "nautils", "nautilus",
- "nautral", "natural",
- "nautres", "natures",
- "nectode", "netcode",
- "needels", "needles",
- "neruons", "neurons",
- "neslave", "enslave",
- "netocde", "netcode",
- "netowrk", "network",
- "netural", "neutral",
- "neturon", "neutron",
- "netwrok", "network",
- "neurton", "neutron",
- "neuterd", "neutered",
- "nighlty", "nightly",
- "nigthly", "nightly",
- "nihilim", "nihilism",
- "ninties", "1990s",
- "niverse", "inverse",
- "nocture", "nocturne",
- "nominae", "nominate",
- "nominet", "nominate",
- "nonsene", "nonsense",
- "noramls", "normals",
- "norhern", "northern",
- "normaly", "normally",
- "normany", "normandy",
- "northen", "northern",
- "nostris", "nostrils",
- "notario", "ontario",
- "notebok", "notebook",
- "nothern", "northern",
- "nowdays", "nowadays",
- "nrivana", "nirvana",
- "nuaghty", "naughty",
- "nubmers", "numbers",
- "nucelar", "nuclear",
- "nucelus", "nucleus",
- "nuclean", "unclean",
- "nuclues", "nucleus",
- "nucular", "nuclear",
- "nuerons", "neurons",
- "nuetral", "neutral",
- "nuetron", "neutron",
- "nulcear", "nuclear",
- "nullfiy", "nullify",
- "nusance", "nuisance",
- "nutriet", "nutrient",
- "oarcles", "oracles",
- "obivous", "obvious",
- "obvoius", "obvious",
- "ocarnia", "ocarina",
- "ocasion", "occasion",
- "occured", "occurred",
- "ocotber", "october",
- "ocotpus", "octopus",
- "ocraina", "ocarina",
- "ocuntry", "country",
- "ocurred", "occurred",
- "ofcoure", "ofcourse",
- "offcers", "officers",
- "offical", "official",
- "offisde", "offside",
- "oftenly", "often",
- "ogrilla", "gorilla",
- "olmypic", "olympic",
- "olreans", "orleans",
- "olympis", "olympics",
- "olypmic", "olympic",
- "omision", "omission",
- "omiting", "omitting",
- "omlette", "omelette",
- "ommited", "omitted",
- "onatrio", "ontario",
- "onbaord", "onboard",
- "onborad", "onboard",
- "ontairo", "ontario",
- "ontraio", "ontario",
- "opartor", "operator",
- "openess", "openness",
- "opitcal", "optical",
- "opitmal", "optimal",
- "oponent", "opponent",
- "oposite", "opposite",
- "oppenly", "openly",
- "opponet", "opponent",
- "oprhans", "orphans",
- "optimim", "optimism",
- "oracels", "oracles",
- "oragnes", "oranges",
- "oragsms", "orgasms",
- "oralces", "oracles",
- "orbtial", "orbital",
- "orcales", "oracles",
- "orelans", "orleans",
- "organes", "organise",
- "organie", "organise",
- "organim", "organism",
- "orginal", "original",
- "orhpans", "orphans",
- "oribtal", "orbital",
- "orlenas", "orleans",
- "orpahns", "orphans",
- "orthodx", "orthodox",
- "outfied", "outfield",
- "outsidr", "outsider",
- "overhal", "overhaul",
- "overpad", "overpaid",
- "oversue", "overuse",
- "overtun", "overturn",
- "ownders", "wonders",
- "owuldve", "wouldve",
- "oylmpic", "olympic",
- "pacakge", "package",
- "pacifit", "pacifist",
- "packade", "packaged",
- "pacthes", "patches",
- "pahntom", "phantom",
- "paitent", "patient",
- "palcebo", "placebo",
- "pallete", "palette",
- "palster", "plaster",
- "palyboy", "playboy",
- "pamflet", "pamphlet",
- "pamplet", "pamphlet",
- "pancaks", "pancakes",
- "pandroa", "pandora",
- "panthen", "pantheon",
- "paradim", "paradigm",
- "paradse", "parades",
- "paralel", "parallel",
- "paranoa", "paranoia",
- "parises", "praises",
- "parites", "parties",
- "partice", "particle",
- "partick", "patrick",
- "partiel", "particle",
- "partiot", "patriot",
- "partols", "patrols",
- "passabe", "passable",
- "passivs", "passives",
- "pasuing", "pausing",
- "pateint", "patient",
- "pathces", "patches",
- "patiens", "patients",
- "patirot", "patriot",
- "patrcik", "patrick",
- "patrios", "patriots",
- "patroit", "patriot",
- "peaples", "peoples",
- "pebbels", "pebbles",
- "peirced", "pierced",
- "penatly", "penalty",
- "pendulm", "pendulum",
- "penguis", "penguins",
- "penicls", "pencils",
- "penison", "pension",
- "penisse", "penises",
- "penitum", "pentium",
- "pensies", "penises",
- "pensino", "pension",
- "pentuim", "pentium",
- "peopels", "peoples",
- "percise", "precise",
- "perdict", "predict",
- "perfers", "prefers",
- "perhasp", "perhaps",
- "perhpas", "perhaps",
- "perisan", "persian",
- "perjery", "perjury",
- "permade", "premade",
- "permier", "premier",
- "permise", "premise",
- "permium", "premium",
- "peroids", "periods",
- "peronal", "personal",
- "perpaid", "prepaid",
- "perphas", "perhaps",
- "persain", "persian",
- "persets", "presets",
- "persits", "persist",
- "persued", "pursued",
- "persuit", "pursuit",
- "pervail", "prevail",
- "perview", "preview",
- "pharoah", "pharaoh",
- "phatnom", "phantom",
- "phsyics", "physics",
- "phyiscs", "physics",
- "physcis", "physics",
- "physiqe", "physique",
- "picthed", "pitched",
- "picther", "pitcher",
- "picthes", "pitches",
- "piegons", "pigeons",
- "piglrim", "pilgrim",
- "pigoens", "pigeons",
- "pilgirm", "pilgrim",
- "pilrgim", "pilgrim",
- "pinoeer", "pioneer",
- "pinpoit", "pinpoint",
- "pionere", "pioneer",
- "pireced", "pierced",
- "pithces", "pitches",
- "plantes", "planets",
- "plastis", "plastics",
- "plastre", "plaster",
- "plataeu", "plateau",
- "plateua", "plateau",
- "playabe", "playable",
- "playofs", "playoffs",
- "plesant", "pleasant",
- "pligrim", "pilgrim",
- "ploygon", "polygon",
- "ploymer", "polymer",
- "podemso", "podemos",
- "podmeos", "podemos",
- "poeples", "peoples",
- "poignat", "poignant",
- "poineer", "pioneer",
- "pointes", "pointers",
- "poisond", "poisoned",
- "polgyon", "polygon",
- "polical", "political",
- "polishs", "polishes",
- "polisse", "polishes",
- "politey", "politely",
- "poluted", "polluted",
- "polutes", "pollutes",
- "popluar", "popular",
- "populer", "popular",
- "populos", "populous",
- "porpose", "propose",
- "porshan", "portion",
- "porshon", "portion",
- "portait", "portrait",
- "portary", "portray",
- "portras", "portrays",
- "portrat", "portrait",
- "posions", "poisons",
- "positon", "position",
- "positve", "positive",
- "possiby", "possibly",
- "postdam", "potsdam",
- "postion", "position",
- "postive", "positive",
- "potatos", "potatoes",
- "potical", "optical",
- "potrait", "portrait",
- "powderd", "powdered",
- "poweful", "powerful",
- "poylgon", "polygon",
- "poylmer", "polymer",
- "practie", "practise",
- "praisse", "praises",
- "praries", "prairies",
- "prasied", "praised",
- "prasies", "praises",
- "pratice", "practice",
- "preamde", "premade",
- "preceed", "precede",
- "precice", "precise",
- "preests", "presets",
- "prehaps", "perhaps",
- "preimer", "premier",
- "preimum", "premium",
- "preists", "priests",
- "preivew", "preview",
- "premeir", "premier",
- "premiee", "premiere",
- "premire", "premier",
- "premits", "permits",
- "premius", "premiums",
- "premuim", "premium",
- "prepair", "prepare",
- "preriod", "period",
- "presens", "presents",
- "presest", "presets",
- "presist", "persist",
- "prestes", "presets",
- "presude", "presumed",
- "pretene", "pretense",
- "pretens", "pretends",
- "preveiw", "preview",
- "prevert", "pervert",
- "previal", "prevail",
- "previes", "previews",
- "previos", "previous",
- "priased", "praised",
- "priases", "praises",
- "printes", "printers",
- "pristen", "pristine",
- "probabe", "probable",
- "probaly", "probably",
- "probelm", "problem",
- "procede", "proceed",
- "procees", "proceeds",
- "procesd", "proceeds",
- "proclam", "proclaim",
- "produly", "proudly",
- "produse", "produces",
- "progidy", "prodigy",
- "progrom", "pogrom",
- "prohibt", "prohibit",
- "prohpet", "prophet",
- "prologe", "prologue",
- "promose", "promotes",
- "promots", "promotes",
- "prompty", "promptly",
- "promtps", "prompts",
- "pronous", "pronouns",
- "prooved", "proved",
- "propeht", "prophet",
- "prophey", "prophecy",
- "propper", "proper",
- "protals", "portals",
- "protecs", "protects",
- "protess", "protests",
- "protocl", "protocol",
- "protray", "portray",
- "prouldy", "proudly",
- "provded", "provided",
- "provine", "province",
- "prusuit", "pursuit",
- "pryamid", "pyramid",
- "pscyhed", "psyched",
- "ptiched", "pitched",
- "pticher", "pitcher",
- "puasing", "pausing",
- "publicy", "publicly",
- "publsih", "publish",
- "puhsups", "pushups",
- "punishs", "punishes",
- "punisse", "punishes",
- "pursiut", "pursuit",
- "pursude", "pursued",
- "purused", "pursued",
- "pushpus", "pushups",
- "pyarmid", "pyramid",
- "pyramis", "pyramids",
- "pyrmaid", "pyramid",
- "pysched", "psyched",
- "qaulify", "qualify",
- "qaulity", "quality",
- "qauntum", "quantum",
- "quailfy", "qualify",
- "quailty", "quality",
- "queires", "queries",
- "queitly", "quietly",
- "quereis", "queries",
- "quicket", "quickest",
- "quielty", "quietly",
- "quitely", "quietly",
- "qunatum", "quantum",
- "qunetin", "quentin",
- "racisst", "racists",
- "racthet", "ratchet",
- "radaint", "radiant",
- "radiane", "radiance",
- "radicas", "radicals",
- "radiers", "raiders",
- "raelism", "realism",
- "raidant", "radiant",
- "railrod", "railroad",
- "rainbos", "rainbows",
- "raoches", "roaches",
- "raoming", "roaming",
- "raptros", "raptors",
- "raputre", "rapture",
- "rathcet", "ratchet",
- "ratpure", "rapture",
- "reacing", "reaching",
- "reagrds", "regards",
- "realies", "realise",
- "realsie", "realise",
- "realsim", "realism",
- "realtes", "relates",
- "reamins", "remains",
- "reapirs", "repairs",
- "rebouns", "rebounds",
- "rebulit", "rebuilt",
- "recalim", "reclaim",
- "receips", "receipts",
- "recided", "resided",
- "reciept", "receipt",
- "recievd", "recieved",
- "recieve", "receive",
- "recitfy", "rectify",
- "recived", "received",
- "reclami", "reclaim",
- "recliam", "reclaim",
- "recorre", "recorder",
- "recoves", "recovers",
- "recpies", "recipes",
- "redeemd", "redeemed",
- "redners", "renders",
- "refelct", "reflect",
- "referal", "referral",
- "refered", "referred",
- "referig", "refering",
- "referrs", "refers",
- "reflexs", "reflexes",
- "refrers", "refers",
- "refroms", "reforms",
- "refusla", "refusal",
- "regerts", "regrets",
- "regiems", "regimes",
- "regimet", "regiment",
- "registy", "registry",
- "regluar", "regular",
- "regrest", "regrets",
- "regulae", "regulate",
- "regulas", "regulars",
- "regulsr", "regulars",
- "reigmes", "regimes",
- "reigons", "regions",
- "reitres", "retires",
- "reivews", "reviews",
- "reknown", "renown",
- "relaise", "realise",
- "relapes", "relapse",
- "relaspe", "relapse",
- "relatie", "relative",
- "relatin", "relation",
- "relcaim", "reclaim",
- "releive", "relieve",
- "releses", "releases",
- "relfect", "reflect",
- "reliabe", "reliable",
- "relient", "reliant",
- "relized", "realised",
- "relpase", "relapse",
- "remaind", "remained",
- "remaing", "remaining",
- "remakrs", "remarks",
- "remannt", "remnant",
- "remeber", "remember",
- "remians", "remains",
- "remnans", "remnants",
- "renderd", "rendered",
- "renegae", "renegade",
- "renmant", "remnant",
- "rentors", "renters",
- "rentres", "renters",
- "renuion", "reunion",
- "repaird", "repaired",
- "repalys", "replays",
- "repblic", "republic",
- "repeast", "repeats",
- "repitle", "reptile",
- "replase", "replaces",
- "replayd", "replayed",
- "reponse", "response",
- "repostd", "reposted",
- "repsawn", "respawn",
- "repsond", "respond",
- "repsots", "reposts",
- "reptiel", "reptile",
- "reptils", "reptiles",
- "repubic", "republic",
- "republi", "republic",
- "repulic", "republic",
- "reqiuem", "requiem",
- "requeim", "requiem",
- "requime", "requiem",
- "requred", "required",
- "resapwn", "respawn",
- "rescuse", "rescues",
- "resembe", "resemble",
- "reslove", "resolve",
- "resolvs", "resolves",
- "resonet", "resonate",
- "resovle", "resolve",
- "respest", "respects",
- "respone", "response",
- "respwan", "respawn",
- "ressits", "resists",
- "restord", "restored",
- "resuced", "rescued",
- "resuces", "rescues",
- "returnd", "returned",
- "reuinon", "reunion",
- "reveald", "revealed",
- "reveiws", "reviews",
- "revelas", "reveals",
- "reveral", "reversal",
- "reviere", "reviewer",
- "reviewd", "reviewed",
- "reviewr", "reviewer",
- "revolvr", "revolver",
- "revolvs", "revolves",
- "rewirte", "rewrite",
- "reworkd", "reworked",
- "rewriet", "rewrite",
- "reynols", "reynolds",
- "rhapsoy", "rhapsody",
- "rhythem", "rhythm",
- "rhythim", "rhythm",
- "rhytmic", "rhythmic",
- "riaders", "raiders",
- "ritlain", "ritalin",
- "ritoers", "rioters",
- "rivarly", "rivalry",
- "rivlary", "rivalry",
- "roahces", "roaches",
- "robotis", "robotics",
- "rococco", "rococo",
- "roestta", "rosetta",
- "roiters", "rioters",
- "roleply", "roleplay",
- "romaina", "romania",
- "romaing", "roaming",
- "romanin", "romanian",
- "romanna", "romanian",
- "roomate", "roommate",
- "rotuers", "routers",
- "rugters", "rutgers",
- "rulebok", "rulebook",
- "rumorus", "rumours",
- "rumuors", "rumours",
- "runnung", "running",
- "ruslted", "rustled",
- "russina", "russian",
- "russion", "russian",
- "rusteld", "rustled",
- "rythmic", "rhythmic",
- "rythyms", "rhythms",
- "sacrasm", "sarcasm",
- "saddnes", "saddens",
- "sadistc", "sadistic",
- "sadning", "sanding",
- "salaris", "salaries",
- "salavge", "salvage",
- "salvery", "slavery",
- "salying", "slaying",
- "sampels", "samples",
- "samruai", "samurai",
- "samuari", "samurai",
- "samuria", "samurai",
- "sandlas", "sandals",
- "sandnig", "sanding",
- "sanlder", "sandler",
- "santorm", "santorum",
- "sapphie", "sapphire",
- "sarcams", "sarcasm",
- "sargant", "sergeant",
- "sasuage", "sausage",
- "satifsy", "satisfy",
- "satsify", "satisfy",
- "satsohi", "satoshi",
- "savanha", "savannah",
- "savannh", "savannah",
- "saveing", "saving",
- "sawnsea", "swansea",
- "sawnson", "swanson",
- "scandas", "scandals",
- "scannig", "scanning",
- "scartch", "scratch",
- "scheems", "schemes",
- "schoold", "schooled",
- "sciense", "sciences",
- "scinece", "science",
- "scootes", "scooters",
- "scorpin", "scorpion",
- "scpeter", "scepter",
- "scracth", "scratch",
- "scrambe", "scramble",
- "scritps", "scripts",
- "scrolld", "scrolled",
- "scrpits", "scripts",
- "scyhter", "scyther",
- "seached", "searched",
- "seaches", "searches",
- "seahaws", "seahawks",
- "seantor", "senator",
- "searchd", "searched",
- "searchs", "searches",
- "sebrian", "serbian",
- "secerts", "secrets",
- "secpter", "scepter",
- "secrest", "secrets",
- "secrety", "secretly",
- "seflies", "selfies",
- "seguoys", "segues",
- "seinors", "seniors",
- "selifes", "selfies",
- "senoirs", "seniors",
- "sensure", "censure",
- "sentaor", "senator",
- "sentris", "sentries",
- "serbain", "serbian",
- "sergeat", "sergeant",
- "sergent", "sergeant",
- "seriban", "serbian",
- "servans", "servants",
- "sesnors", "sensors",
- "settins", "settings",
- "severly", "severely",
- "sexualy", "sexually",
- "seziure", "seizure",
- "shaddow", "shadow",
- "shanghi", "shanghai",
- "shaprie", "sharpie",
- "shaprly", "sharply",
- "sharipe", "sharpie",
- "shcemes", "schemes",
- "sheelpe", "sheeple",
- "sheepel", "sheeple",
- "shephed", "shepherd",
- "sherlok", "sherlock",
- "shetler", "shelter",
- "shevles", "shelves",
- "shfiter", "shifter",
- "shieldd", "shielded",
- "shiping", "shipping",
- "shirely", "shirley",
- "shitfer", "shifter",
- "shledon", "sheldon",
- "shleter", "shelter",
- "shoudln", "should",
- "shouldt", "shouldnt",
- "shoutot", "shoutout",
- "showede", "showered",
- "showerd", "showered",
- "shperes", "spheres",
- "shriley", "shirley",
- "siblins", "siblings",
- "sidelen", "sideline",
- "sideral", "sidereal",
- "siezing", "seizing",
- "siezure", "seizure",
- "signfiy", "signify",
- "signins", "signings",
- "signles", "singles",
- "silders", "sliders",
- "silenty", "silently",
- "similir", "similiar",
- "simliar", "similar",
- "simplet", "simplest",
- "simpley", "simply",
- "simplfy", "simplify",
- "simpliy", "simplify",
- "simposn", "simpson",
- "simspon", "simpson",
- "singals", "signals",
- "singels", "singles",
- "singify", "signify",
- "singsog", "singsong",
- "sitmuli", "stimuli",
- "skecthy", "sketchy",
- "skeletl", "skeletal",
- "skeptis", "skeptics",
- "sketchs", "sketches",
- "sketpic", "skeptic",
- "skpetic", "skeptic",
- "sktechy", "sketchy",
- "skwyard", "skyward",
- "slavage", "salvage",
- "slayign", "slaying",
- "sldiers", "sliders",
- "slefies", "selfies",
- "slighly", "slightly",
- "slighty", "slightly",
- "slippes", "slippers",
- "slippey", "slippery",
- "smaples", "samples",
- "smartre", "smarter",
- "smaurai", "samurai",
- "snadler", "sandler",
- "snigles", "singles",
- "snippes", "snippets",
- "snodwen", "snowden",
- "snwoden", "snowden",
- "snycing", "syncing",
- "snyergy", "synergy",
- "socialy", "socially",
- "sofware", "software",
- "soildly", "solidly",
- "soldies", "soldiers",
- "soldily", "solidly",
- "somaila", "somalia",
- "someons", "someones",
- "somethn", "somethin",
- "southen", "southern",
- "soveits", "soviets",
- "spacebr", "spacebar",
- "spainsh", "spanish",
- "spansih", "spanish",
- "spanwed", "spawned",
- "sparkel", "sparkle",
- "spartas", "spartans",
- "spartsn", "spartans",
- "sparyed", "sprayed",
- "spawend", "spawned",
- "spawnig", "spawning",
- "specail", "special",
- "specfic", "specific",
- "specias", "specials",
- "specisl", "specials",
- "spectum", "spectrum",
- "speechs", "speeches",
- "spehres", "spheres",
- "speical", "special",
- "speices", "species",
- "spellig", "spelling",
- "spindel", "spindle",
- "spiritd", "spirited",
- "splaton", "splatoon",
- "splittr", "splitter",
- "spoiles", "spoilers",
- "spoitfy", "spotify",
- "spolied", "spoiled",
- "sponser", "sponsor",
- "sporles", "sproles",
- "sporuts", "sprouts",
- "spotfiy", "spotify",
- "sprinke", "sprinkle",
- "sproels", "sproles",
- "spwaned", "spawned",
- "sqaures", "squares",
- "sqeuaky", "squeaky",
- "sqiushy", "squishy",
- "squarey", "squarely",
- "squirel", "squirtle",
- "squirle", "squirrel",
- "squirrl", "squirrel",
- "squirte", "squirtle",
- "squsihy", "squishy",
- "sriraca", "sriracha",
- "srpouts", "sprouts",
- "sryians", "syrians",
- "sryinge", "syringe",
- "stadius", "stadiums",
- "staduim", "stadium",
- "stagnat", "stagnant",
- "staidum", "stadium",
- "stakler", "stalker",
- "stalkes", "stalkers",
- "stamnia", "stamina",
- "staoshi", "satoshi",
- "starins", "strains",
- "startde", "startled",
- "startus", "startups",
- "statits", "statist",
- "statsit", "statist",
- "statuer", "stature",
- "statuse", "statutes",
- "statuts", "statutes",
- "stautes", "statues",
- "stealty", "stealthy",
- "steeles", "steelers",
- "steorid", "steroid",
- "steriel", "sterile",
- "sterlie", "sterile",
- "stickes", "stickers",
- "stiring", "stirring",
- "stirker", "striker",
- "stirrig", "stirring",
- "stitchs", "stitches",
- "stlaker", "stalker",
- "stlyish", "stylish",
- "storeis", "stories",
- "storise", "stories",
- "stormde", "stormed",
- "straigt", "straight",
- "straind", "strained",
- "streamd", "streamed",
- "stregth", "strength",
- "strengh", "strength",
- "streoid", "steroid",
- "stresss", "stresses",
- "strians", "strains",
- "stricty", "strictly",
- "striekr", "striker",
- "stromed", "stormed",
- "stubbon", "stubborn",
- "studing", "studying",
- "stuidos", "studios",
- "stunami", "tsunami",
- "stupidr", "stupider",
- "stupidy", "stupidly",
- "stupire", "stupider",
- "suasage", "sausage",
- "subisdy", "subsidy",
- "subjest", "subjects",
- "subtiel", "subtitle",
- "succede", "succeed",
- "succeds", "succeeds",
- "succees", "succeeds",
- "succesd", "succeeds",
- "suceeds", "succeeds",
- "suddeny", "suddenly",
- "suefull", "usefull",
- "sufferd", "suffered",
- "summonr", "summoner",
- "summore", "summoner",
- "sunggle", "snuggle",
- "sunifre", "sunfire",
- "superme", "supreme",
- "suposed", "supposed",
- "suposes", "supposes",
- "suppoed", "supposed",
- "suppost", "supports",
- "suprass", "surpass",
- "supress", "suppress",
- "suprisd", "suprised",
- "suprise", "surprise",
- "suprize", "surprise",
- "supsend", "suspend",
- "suround", "surround",
- "surpeme", "supreme",
- "surroud", "surround",
- "sweidsh", "swedish",
- "swiflty", "swiftly",
- "swiming", "swimming",
- "switchs", "switches",
- "switfly", "swiftly",
- "swnasea", "swansea",
- "sycning", "syncing",
- "sycther", "scyther",
- "syirans", "syrians",
- "sykward", "skyward",
- "syllabe", "syllable",
- "symetry", "symmetry",
- "symmety", "symmetry",
- "symobls", "symbols",
- "sympaty", "sympathy",
- "symtpom", "symptom",
- "synegry", "synergy",
- "synoynm", "synonym",
- "sypmtom", "symptom",
- "syracue", "syracuse",
- "syrains", "syrians",
- "sysadmn", "sysadmin",
- "systemc", "systemic",
- "sytlish", "stylish",
- "tabacco", "tobacco",
- "tailban", "taliban",
- "tailord", "tailored",
- "talbian", "taliban",
- "tallets", "tallest",
- "tangeld", "tangled",
- "tanlged", "tangled",
- "targetd", "targeted",
- "taryvon", "trayvon",
- "teached", "taught",
- "teaspon", "teaspoon",
- "techeis", "techies",
- "tehcies", "techies",
- "temepst", "tempest",
- "tempels", "temples",
- "tempets", "tempest",
- "templas", "templars",
- "tempset", "tempest",
- "tenacle", "tentacle",
- "tendacy", "tendency",
- "tequlia", "tequila",
- "tesitfy", "testify",
- "testice", "testicle",
- "teusday", "tuesday",
- "thankyu", "thankyou",
- "thearpy", "therapy",
- "theistc", "theistic",
- "theives", "thieves",
- "themsef", "themself",
- "therefo", "thereof",
- "therien", "therein",
- "theroem", "theorem",
- "thesits", "theists",
- "thiests", "theists",
- "thirldy", "thirdly",
- "thirten", "thirteen",
- "thirtsy", "thirsty",
- "thoerem", "theorem",
- "thorats", "throats",
- "thornes", "thrones",
- "thoruim", "thorium",
- "thoughs", "thoughts",
- "threadd", "threaded",
- "threeof", "thereof",
- "thridly", "thirdly",
- "thristy", "thirsty",
- "throast", "throats",
- "throium", "thorium",
- "thryoid", "thyroid",
- "thyorid", "thyroid",
- "thyriod", "thyroid",
- "tigther", "tighter",
- "tiolets", "toilets",
- "tirdent", "trident",
- "titanim", "titanium",
- "tlaking", "talking",
- "tobbaco", "tobacco",
- "toliets", "toilets",
- "tolkein", "tolkien",
- "tomatos", "tomatoes",
- "tongiht", "tonight",
- "tonuges", "tongues",
- "toppins", "toppings",
- "torando", "tornado",
- "torndao", "tornado",
- "torpdeo", "torpedo",
- "torrest", "torrents",
- "tortila", "tortilla",
- "toruney", "tourney",
- "toubles", "troubles",
- "touchda", "touchpad",
- "tounrey", "tourney",
- "tourisy", "touristy",
- "tourits", "tourist",
- "tournes", "tourneys",
- "toursim", "tourism",
- "toursit", "tourist",
- "towords", "towards",
- "trackes", "trackers",
- "trailes", "trailers",
- "traines", "trainers",
- "trainig", "training",
- "tralier", "trailer",
- "tratior", "traitor",
- "traveld", "traveled",
- "travere", "traverse",
- "travesy", "travesty",
- "travles", "travels",
- "treasue", "treasure",
- "treatis", "treaties",
- "tremelo", "tremolo",
- "trendig", "trending",
- "trialer", "trailer",
- "triange", "triangle",
- "triator", "traitor",
- "trickey", "trickery",
- "tridnet", "trident",
- "trimuph", "triumph",
- "trinkes", "trinkets",
- "trinkst", "trinkets",
- "trintiy", "trinity",
- "triolgy", "trilogy",
- "troleld", "trolled",
- "troling", "trolling",
- "tronado", "tornado",
- "tropedo", "torpedo",
- "trudnle", "trundle",
- "truimph", "triumph",
- "trukish", "turkish",
- "trundel", "trundle",
- "trunlde", "trundle",
- "tryahrd", "tryhard",
- "tryavon", "trayvon",
- "tsamina", "stamina",
- "tsnuami", "tsunami",
- "tsuanmi", "tsunami",
- "tsunmai", "tsunami",
- "tuesdsy", "tuesdays",
- "tunnles", "tunnels",
- "turbins", "turbines",
- "turksih", "turkish",
- "turltes", "turtles",
- "turrest", "turrets",
- "turtels", "turtles",
- "tuseday", "tuesday",
- "tusnami", "tsunami",
- "tutrles", "turtles",
- "twiligt", "twilight",
- "tyelnol", "tylenol",
- "typcial", "typical",
- "tyrhard", "tryhard",
- "tyrrany", "tyranny",
- "udpated", "updated",
- "uesfull", "usefull",
- "ugprade", "upgrade",
- "ukarine", "ukraine",
- "ukranie", "ukraine",
- "ukriane", "ukraine",
- "ultimae", "ultimate",
- "umbrela", "umbrella",
- "unahppy", "unhappy",
- "unbannd", "unbanned",
- "underog", "undergo",
- "unfairy", "unfairly",
- "ungoldy", "ungodly",
- "unicors", "unicorns",
- "uniquey", "uniquely",
- "unknwon", "unknown",
- "unkonwn", "unknown",
- "unlcean", "unclean",
- "unlcoks", "unlocks",
- "unlcuky", "unlucky",
- "unlikey", "unlikely",
- "unopend", "unopened",
- "unprone", "unproven",
- "unusabe", "unusable",
- "unworty", "unworthy",
- "upgarde", "upgrade",
- "upgrads", "upgrades",
- "uplaods", "uploads",
- "upsteam", "upstream",
- "urainum", "uranium",
- "uranuim", "uranium",
- "uretrha", "urethra",
- "urkaine", "ukraine",
- "urnaium", "uranium",
- "urugauy", "uruguay",
- "usefull", "useful",
- "usefuly", "usefully",
- "utiltiy", "utility",
- "utopain", "utopian",
- "utpoian", "utopian",
- "vaccins", "vaccines",
- "vaccume", "vacuum",
- "vageuly", "vaguely",
- "vaguley", "vaguely",
- "vairant", "variant",
- "valenca", "valencia",
- "valetta", "valletta",
- "valkyre", "valkyrie",
- "valuabe", "valuable",
- "valuble", "valuable",
- "vampirs", "vampires",
- "vanguad", "vanguard",
- "varaint", "variant",
- "vareity", "variety",
- "varians", "variants",
- "varient", "variant",
- "varisty", "varsity",
- "varitey", "variety",
- "varstiy", "varsity",
- "vasalls", "vassals",
- "vasslas", "vassals",
- "vaugely", "vaguely",
- "vecotrs", "vectors",
- "vectros", "vectors",
- "veitnam", "vietnam",
- "veiwers", "viewers",
- "vendeta", "vendetta",
- "verbaly", "verbally",
- "verical", "vertical",
- "verious", "various",
- "verison", "version",
- "veritgo", "vertigo",
- "versoin", "version",
- "vertgio", "vertigo",
- "vessles", "vessels",
- "vetween", "between",
- "viatmin", "vitamin",
- "vibratr", "vibrator",
- "vicitms", "victims",
- "vientam", "vietnam",
- "vigrins", "virgins",
- "vikigns", "vikings",
- "villian", "villain",
- "villify", "vilify",
- "virbate", "vibrate",
- "virigns", "virgins",
- "virtiol", "vitriol",
- "virutal", "virtual",
- "virutes", "virtues",
- "visable", "visible",
- "visably", "visibly",
- "visbily", "visibly",
- "visting", "visiting",
- "vistors", "visitors",
- "vitaliy", "vitality",
- "vitamis", "vitamins",
- "vitenam", "vietnam",
- "vitirol", "vitriol",
- "vitmain", "vitamin",
- "vitroil", "vitriol",
- "vitrual", "virtual",
- "vitrues", "virtues",
- "volatge", "voltage",
- "volumne", "volume",
- "votlage", "voltage",
- "vrigins", "virgins",
- "waclott", "walcott",
- "wacther", "watcher",
- "waitres", "waiters",
- "waktins", "watkins",
- "warcrat", "warcraft",
- "wardobe", "wardrobe",
- "wariwck", "warwick",
- "warrany", "warranty",
- "warrent", "warrant",
- "warrios", "warriors",
- "warwcik", "warwick",
- "wathcer", "watcher",
- "watiers", "waiters",
- "waviers", "waivers",
- "wawrick", "warwick",
- "wayword", "wayward",
- "webapge", "webpage",
- "webiste", "website",
- "webstie", "website",
- "weigths", "weights",
- "weilded", "wielded",
- "weirldy", "weirdly",
- "weirods", "weirdos",
- "welathy", "wealthy",
- "wendsay", "wednesday",
- "wensday", "wednesday",
- "wepbage", "webpage",
- "weridly", "weirdly",
- "weridos", "weirdos",
- "werstle", "wrestle",
- "wesbite", "website",
- "whaeton", "wheaton",
- "whipser", "whisper",
- "whislte", "whistle",
- "whistel", "whistle",
- "whitsle", "whistle",
- "whsiper", "whisper",
- "wiaters", "waiters",
- "wiavers", "waivers",
- "widgest", "widgets",
- "wieghts", "weights",
- "wigdets", "widgets",
- "windosr", "windsor",
- "winnins", "winnings",
- "winsdor", "windsor",
- "wintson", "winston",
- "wirting", "writing",
- "wisnton", "winston",
- "withces", "witches",
- "witheld", "withheld",
- "withing", "within",
- "withold", "withhold",
- "wlacott", "walcott",
- "wokring", "working",
- "workins", "workings",
- "woudlnt", "wouldnt",
- "woudlve", "wouldve",
- "woulndt", "wouldnt",
- "wreslte", "wrestle",
- "wroking", "working",
- "wtiches", "witches",
- "wupport", "support",
- "yaching", "yachting",
- "younget", "youngest",
- "youseff", "yousef",
- "youself", "yourself",
- "zaelots", "zealots",
- "zealtos", "zealots",
- "zelaots", "zealots",
- "zelaous", "zealous",
- "zimbabe", "zimbabwe",
- "zionsim", "zionism",
- "zionsit", "zionist",
- "zoinism", "zionism",
- "zoinist", "zionist",
- "abbout", "about",
- "abilty", "ability",
- "absail", "abseil",
- "abutts", "abuts",
- "achive", "achieve",
- "acused", "accused",
- "addopt", "adopt",
- "addres", "address",
- "adress", "address",
- "aeriel", "aerial",
- "affort", "afford",
- "agains", "against",
- "aginst", "against",
- "ahppen", "happen",
- "aiport", "airport",
- "aisian", "asian",
- "albiet", "albeit",
- "alchol", "alcohol",
- "aledge", "allege",
- "aleged", "alleged",
- "allign", "align",
- "almsot", "almost",
- "alomst", "almost",
- "alowed", "allowed",
- "alwasy", "always",
- "alwyas", "always",
- "amking", "making",
- "ammend", "amend",
- "amoung", "among",
- "aplied", "applied",
- "appart", "apart",
- "aquire", "acquire",
- "aready", "already",
- "arised", "arose",
- "arival", "arrival",
- "arrary", "array",
- "artice", "article",
- "asetic", "ascetic",
- "asside", "aside",
- "attemp", "attempt",
- "attemt", "attempt",
- "auther", "author",
- "awared", "awarded",
- "bedore", "before",
- "beeing", "being",
- "befoer", "before",
- "beggin", "begin",
- "beleif", "belief",
- "belive", "believe",
- "beteen", "between",
- "betwen", "between",
- "beween", "between",
- "bianry", "binary",
- "boyant", "buoyant",
- "broady", "broadly",
- "buddah", "buddha",
- "buring", "burying",
- "carcas", "carcass",
- "casion", "caisson",
- "casued", "caused",
- "casues", "causes",
- "ceasar", "caesar",
- "cencus", "census",
- "censur", "censor",
- "cheifs", "chiefs",
- "circut", "circuit",
- "clasic", "classic",
- "coform", "conform",
- "comany", "company",
- "coucil", "council",
- "densly", "densely",
- "deside", "decide",
- "devels", "delves",
- "devide", "divide",
- "dieing", "dying",
- "divice", "device",
- "doulbe", "double",
- "dreasm", "dreams",
- "duting", "during",
- "ealier", "earlier",
- "eearly", "early",
- "efford", "effort",
- "emited", "emitted",
- "emnity", "enmity",
- "enduce", "induce",
- "enlish", "english",
- "erally", "orally",
- "eratic", "erratic",
- "ethose", "those",
- "exampt", "exempt",
- "excact", "exact",
- "excell", "excel",
- "exerpt", "excerpt",
- "exinct", "extinct",
- "expell", "expel",
- "expoch", "epoch",
- "extint", "extinct",
- "facist", "fascist",
- "faught", "fought",
- "finaly", "finally",
- "forsaw", "foresaw",
- "fougth", "fought",
- "fourty", "forty",
- "foward", "forward",
- "freind", "friend",
- "fromed", "formed",
- "fufill", "fulfill",
- "futher", "further",
- "gardai", "gardaí",
- "ghandi", "gandhi",
- "glight", "flight",
- "gloabl", "global",
- "godess", "goddess",
- "guilia", "giulia",
- "guilio", "giulio",
- "habeus", "habeas",
- "harras", "harass",
- "hatian", "haitian",
- "heared", "heard",
- "hertzs", "hertz",
- "hieght", "height",
- "higest", "highest",
- "higway", "highway",
- "honory", "honorary",
- "howver", "however",
- "hstory", "history",
- "hunman", "human",
- "husban", "husband",
- "hvaing", "having",
- "illess", "illness",
- "ilness", "illness",
- "imagin", "imagine",
- "imense", "immense",
- "includ", "include",
- "inital", "initial",
- "interm", "interim",
- "intial", "initial",
- "iunior", "junior",
- "jaques", "jacques",
- "jospeh", "joseph",
- "jouney", "journey",
- "klenex", "kleenex",
- "labled", "labelled",
- "largst", "largest",
- "larrry", "larry",
- "lefted", "left",
- "lenght", "length",
- "lerans", "learns",
- "liason", "liaison",
- "libary", "library",
- "lieing", "lying",
- "lieved", "lived",
- "littel", "little",
- "livley", "lively",
- "lonley", "lonely",
- "mailny", "mainly",
- "markes", "marks",
- "mileau", "milieu",
- "milion", "million",
- "millon", "million",
- "misile", "missile",
- "missen", "mizzen",
- "missle", "missile",
- "mkaing", "making",
- "moderm", "modem",
- "moreso", "more",
- "mounth", "month",
- "myraid", "myriad",
- "naieve", "naive",
- "nestin", "nesting",
- "nineth", "ninth",
- "noveau", "nouveau",
- "occour", "occur",
- "occurr", "occur",
- "offred", "offered",
- "omited", "omitted",
- "ouevre", "oeuvre",
- "oxigen", "oxygen",
- "p0enis", "penis",
- "packge", "package",
- "peaple", "people",
- "pensle", "pencil",
- "peopel", "people",
- "peotry", "poetry",
- "perade", "parade",
- "persan", "person",
- "persue", "pursue",
- "plateu", "plateau",
- "poenis", "penis",
- "poisin", "poison",
- "polute", "pollute",
- "posess", "possess",
- "posion", "poison",
- "prairy", "prairie",
- "prarie", "prairie",
- "preiod", "period",
- "privte", "private",
- "proces", "process",
- "proove", "prove",
- "psuedo", "pseudo",
- "psyhic", "psychic",
- "pucini", "puccini",
- "pumkin", "pumpkin",
- "puting", "putting",
- "pyscic", "psychic",
- "quizes", "quizzes",
- "quuery", "query",
- "racaus", "raucous",
- "radify", "ratify",
- "raelly", "really",
- "reacll", "recall",
- "realyl", "really",
- "reched", "reached",
- "recide", "reside",
- "recrod", "record",
- "refect", "reflect",
- "relaly", "really",
- "renewl", "renewal",
- "retuns", "returns",
- "reveiw", "review",
- "rhymme", "rhyme",
- "rigeur", "rigueur",
- "rocord", "record",
- "rougly", "roughly",
- "runing", "running",
- "rythem", "rhythm",
- "rythim", "rhythm",
- "saftey", "safety",
- "salery", "salary",
- "satisy", "satisfy",
- "satric", "satiric",
- "saught", "sought",
- "scince", "science",
- "scirpt", "script",
- "seceed", "succeed",
- "seinor", "senior",
- "sepina", "subpoena",
- "sevice", "service",
- "shamen", "shaman",
- "sheild", "shield",
- "shiped", "shipped",
- "shorly", "shortly",
- "shoudl", "should",
- "shreak", "shriek",
- "siezed", "seized",
- "sixtin", "sistine",
- "sneeks", "sneaks",
- "somene", "someone",
- "soudns", "sounds",
- "sourth", "south",
- "speach", "speech",
- "spects", "aspects",
- "spoace", "space",
- "sqaure", "square",
- "staion", "station",
- "stange", "strange",
- "stilus", "stylus",
- "stirrs", "stirs",
- "stopry", "story",
- "strnad", "strand",
- "studdy", "study",
- "suceed", "succeed",
- "sucess", "success",
- "sucide", "suicide",
- "sumary", "summary",
- "suport", "support",
- "supose", "suppose",
- "surfce", "surface",
- "surley", "surly",
- "swaers", "swears",
- "swepth", "swept",
- "talekd", "talked",
- "theese", "these",
- "therby", "thereby",
- "thigns", "things",
- "thigsn", "things",
- "thikns", "thinks",
- "thiunk", "think",
- "thnigs", "things",
- "threee", "three",
- "tkaing", "taking",
- "tounge", "tongue",
- "tourch", "torch",
- "towrad", "toward",
- "trafic", "traffic",
- "troups", "troupes",
- "truely", "truly",
- "twelth", "twelfth",
- "tyrany", "tyranny",
- "unabel", "unable",
- "unkown", "unknown",
- "untill", "until",
- "usally", "usually",
- "useage", "usage",
- "useing", "using",
- "usualy", "usually",
- "vaccum", "vacuum",
- "variey", "variety",
- "varing", "varying",
- "varity", "variety",
- "vasall", "vassal",
- "vigeur", "vigueur",
- "villin", "villain",
- "vreity", "variety",
- "vriety", "variety",
- "whants", "wants",
- "wheras", "whereas",
- "wheter", "whether",
- "wholey", "wholly",
- "whther", "whether",
- "wnated", "wanted",
- "writen", "written",
- "yaerly", "yearly",
- "yotube", "youtube",
- "zeebra", "zebra",
- "abotu", "about",
- "adres", "address",
- "afair", "affair",
- "agian", "again",
- "agina", "again",
- "agred", "agreed",
- "alege", "allege",
- "alsot", "also",
- "altho", "although",
- "amung", "among",
- "anual", "annual",
- "aroud", "around",
- "arund", "around",
- "asign", "assign",
- "assit", "assist",
- "asume", "assume",
- "atain", "attain",
- "autor", "author",
- "baout", "about",
- "blaim", "blame",
- "boaut", "bout",
- "boook", "book",
- "borke", "broke",
- "breif", "brief",
- "caost", "coast",
- "casue", "cause",
- "chasr", "chaser",
- "cheif", "chief",
- "chuch", "church",
- "claer", "clear",
- "clera", "clear",
- "coudl", "could",
- "crowm", "crown",
- "deram", "dram",
- "diety", "deity",
- "doens", "does",
- "doign", "doing",
- "donig", "doing",
- "drnik", "drink",
- "durig", "during",
- "earnt", "earned",
- "eigth", "eighth",
- "eiter", "either",
- "emtpy", "empty",
- "endig", "ending",
- "eveyr", "every",
- "exept", "except",
- "eyars", "years",
- "eyasr", "years",
- "fiels", "fields",
- "firts", "flirts",
- "fleed", "fled",
- "fomed", "formed",
- "foucs", "focus",
- "foudn", "found",
- "fouth", "fourth",
- "frome", "from",
- "ganes", "games",
- "gaurd", "guard",
- "gerat", "great",
- "gogin", "going",
- "goign", "going",
- "gonig", "going",
- "graet", "great",
- "greif", "grief",
- "gropu", "group",
- "guage", "gauge",
- "hapen", "happen",
- "herad", "heard",
- "heroe", "hero",
- "higer", "higher",
- "housr", "hours",
- "htere", "there",
- "htikn", "think",
- "hting", "thing",
- "htink", "think",
- "hwihc", "which",
- "hwile", "while",
- "hwole", "whole",
- "idaes", "ideas",
- "idesa", "ideas",
- "ihaca", "ithaca",
- "knwos", "knows",
- "konws", "knows",
- "lastr", "last",
- "lavae", "larvae",
- "layed", "laid",
- "leage", "league",
- "leanr", "lean",
- "leran", "learn",
- "levle", "level",
- "lible", "libel",
- "liekd", "liked",
- "liuke", "like",
- "lmits", "limits",
- "lonly", "lonely",
- "lukid", "likud",
- "lybia", "libya",
- "maked", "marked",
- "makse", "makes",
- "mamal", "mammal",
- "mileu", "milieu",
- "mkaes", "makes",
- "modle", "model",
- "moent", "moment",
- "moeny", "money",
- "monts", "months",
- "movei", "movie",
- "muder", "murder",
- "mysef", "myself",
- "neice", "niece",
- "ninty", "ninety",
- "ocurr", "occur",
- "oging", "going",
- "opose", "oppose",
- "orded", "ordered",
- "orgin", "origin",
- "otehr", "other",
- "ouput", "output",
- "owudl", "would",
- "paide", "paid",
- "palce", "place",
- "pased", "passed",
- "payed", "paid",
- "peice", "piece",
- "peoms", "poems",
- "poety", "poetry",
- "pwoer", "power",
- "qtuie", "quite",
- "qutie", "quite",
- "realy", "really",
- "repid", "rapid",
- "rised", "raised",
- "rulle", "rule",
- "rwite", "write",
- "rythm", "rhythm",
- "safty", "safety",
- "scoll", "scroll",
- "seach", "search",
- "seige", "siege",
- "seing", "seeing",
- "sence", "sense",
- "sicne", "since",
- "sieze", "seize",
- "sinse", "sines",
- "slowy", "slowly",
- "snese", "sneeze",
- "soley", "solely",
- "sotry", "story",
- "sotyr", "satyr",
- "soudn", "sound",
- "sould", "could",
- "spred", "spread",
- "stlye", "style",
- "stong", "strong",
- "stoyr", "story",
- "strat", "start",
- "stroy", "story",
- "suppy", "supply",
- "swaer", "swear",
- "syrap", "syrup",
- "sytem", "system",
- "sytle", "style",
- "tatoo", "tattoo",
- "thast", "that",
- "theif", "thief",
- "theri", "their",
- "thgat", "that",
- "thier", "their",
- "thign", "thing",
- "thikn", "think",
- "thnig", "thing",
- "thrid", "third",
- "thsoe", "those",
- "thyat", "that",
- "tihkn", "think",
- "timne", "time",
- "tiome", "time",
- "tkaes", "takes",
- "todya", "today",
- "tyhat", "that",
- "unsed", "used",
- "weild", "wield",
- "whant", "want",
- "whcih", "which",
- "whihc", "which",
- "whith", "with",
- "whlch", "which",
- "wholy", "wholly",
- "wierd", "weird",
- "wille", "will",
- "willk", "will",
- "withh", "with",
- "witht", "with",
- "wiull", "will",
- "wnats", "wants",
- "wohle", "whole",
- "worls", "world",
- "woudl", "would",
- "wriet", "write",
- "wroet", "wrote",
- "yaers", "years",
- "yatch", "yacht",
- "yearm", "year",
- "yeasr", "years",
- "yeild", "yield",
- "yeras", "years",
- "yersa", "years",
- "agin", "again",
- "agre", "agree",
- "ahev", "have",
- "ahve", "have",
- "alse", "else",
- "amke", "make",
- "anbd", "and",
- "andd", "and",
- "apon", "upon",
- "aslo", "also",
- "awya", "away",
- "bakc", "back",
- "bcak", "back",
- "clas", "class",
- "cpoy", "coy",
- "cxan", "cyan",
- "daed", "dead",
- "dael", "deal",
- "diea", "idea",
- "doub", "doubt",
- "dyas", "dryas",
- "eahc", "each",
- "efel", "evil",
- "eles", "eels",
- "ened", "need",
- "enxt", "next",
- "esle", "else",
- "eyar", "year",
- "fatc", "fact",
- "fidn", "find",
- "fomr", "from",
- "grwo", "grow",
- "haev", "have",
- "halp", "help",
- "holf", "hold",
- "hten", "then",
- "htey", "they",
- "htis", "this",
- "hvae", "have",
- "hvea", "have",
- "inot", "into",
- "iwll", "will",
- "iwth", "with",
- "jstu", "just",
- "jsut", "just",
- "knwo", "know",
- "konw", "know",
- "kwno", "know",
- "liek", "like",
- "loev", "love",
- "lveo", "love",
- "lvoe", "love",
- "mkae", "make",
- "mkea", "make",
- "mroe", "more",
- "nkow", "know",
- "nkwo", "know",
- "nmae", "name",
- "noth", "north",
- "nowe", "now",
- "omre", "more",
- "onot", "note",
- "onyl", "only",
- "owrk", "work",
- "peom", "poem",
- "pich", "pitch",
- "rela", "real",
- "sasy", "says",
- "smae", "same",
- "smoe", "some",
- "soem", "some",
- "sohw", "show",
- "stpo", "stop",
- "suop", "soup",
- "syas", "says",
- "tahn", "than",
- "taht", "that",
- "tast", "taste",
- "tath", "that",
- "tehy", "they",
- "tghe", "the",
- "ther", "there",
- "thge", "the",
- "thna", "than",
- "thne", "then",
- "thsi", "this",
- "thta", "that",
- "tiem", "time",
- "tihs", "this",
- "tjhe", "the",
- "tkae", "take",
- "tood", "todo",
- "tust", "trust",
- "twon", "town",
- "twpo", "two",
- "tyhe", "they",
- "uise", "use",
- "vell", "well",
- "veyr", "very",
- "vrey", "very",
- "vyer", "very",
- "vyre", "very",
- "waht", "what",
- "wass", "was",
- "watn", "want",
- "weas", "was",
- "wehn", "when",
- "whic", "which",
- "whta", "what",
- "wich", "which",
- "wief", "wife",
- "wiew", "view",
- "wiht", "with",
- "witn", "with",
- "wnat", "want",
- "wokr", "work",
- "wrok", "work",
- "wtih", "with",
- "yaer", "year",
- "yera", "year",
- "yrea", "year",
- "ytou", "you",
- "adn", "and",
- "ect", "etc",
- "nto", "not",
- "teh", "the",
- "thn", "then",
- "tje", "the",
- "whn", "when",
- "wih", "with",
- "yuo", "you",
-}
-
-// DictAmerican converts UK spellings to US spellings
-var DictAmerican = []string{
- "institutionalisation", "institutionalization",
- "internationalisation", "internationalization",
- "professionalisation", "professionalization",
- "compartmentalising", "compartmentalizing",
- "institutionalising", "institutionalizing",
- "internationalising", "internationalizing",
- "compartmentalised", "compartmentalized",
- "compartmentalises", "compartmentalizes",
- "decriminalisation", "decriminalization",
- "denationalisation", "denationalization",
- "fictionalisations", "fictionalizations",
- "institutionalised", "institutionalized",
- "institutionalises", "institutionalizes",
- "intellectualising", "intellectualizing",
- "internationalised", "internationalized",
- "internationalises", "internationalizes",
- "pedestrianisation", "pedestrianization",
- "professionalising", "professionalizing",
- "archaeologically", "archeologically",
- "compartmentalise", "compartmentalize",
- "decentralisation", "decentralization",
- "demilitarisation", "demilitarization",
- "externalisations", "externalizations",
- "fictionalisation", "fictionalization",
- "institutionalise", "institutionalize",
- "intellectualised", "intellectualized",
- "intellectualises", "intellectualizes",
- "internationalise", "internationalize",
- "nationalisations", "nationalizations",
- "palaeontologists", "paleontologists",
- "professionalised", "professionalized",
- "professionalises", "professionalizes",
- "rationalisations", "rationalizations",
- "sensationalising", "sensationalizing",
- "sentimentalising", "sentimentalizing",
- "acclimatisation", "acclimatization",
- "bougainvillaeas", "bougainvilleas",
- "commercialising", "commercializing",
- "conceptualising", "conceptualizing",
- "contextualising", "contextualizing",
- "crystallisation", "crystallization",
- "decriminalising", "decriminalizing",
- "democratisation", "democratization",
- "denationalising", "denationalizing",
- "depersonalising", "depersonalizing",
- "desensitisation", "desensitization",
- "destabilisation", "destabilization",
- "disorganisation", "disorganization",
- "extemporisation", "extemporization",
- "externalisation", "externalization",
- "familiarisation", "familiarization",
- "generalisations", "generalizations",
- "hospitalisation", "hospitalization",
- "individualising", "individualizing",
- "industrialising", "industrializing",
- "intellectualise", "intellectualize",
- "internalisation", "internalization",
- "manoeuvrability", "maneuverability",
- "marginalisation", "marginalization",
- "materialisation", "materialization",
- "miniaturisation", "miniaturization",
- "nationalisation", "nationalization",
- "neighbourliness", "neighborliness",
- "overemphasising", "overemphasizing",
- "palaeontologist", "paleontologist",
- "particularising", "particularizing",
- "pedestrianising", "pedestrianizing",
- "professionalise", "professionalize",
- "psychoanalysing", "psychoanalyzing",
- "rationalisation", "rationalization",
- "reorganisations", "reorganizations",
- "revolutionising", "revolutionizing",
- "sensationalised", "sensationalized",
- "sensationalises", "sensationalizes",
- "sentimentalised", "sentimentalized",
- "sentimentalises", "sentimentalizes",
- "specialisations", "specializations",
- "standardisation", "standardization",
- "synchronisation", "synchronization",
- "systematisation", "systematization",
- "aggrandisement", "aggrandizement",
- "anaesthetising", "anesthetizing",
- "archaeological", "archeological",
- "archaeologists", "archeologists",
- "bougainvillaea", "bougainvillea",
- "characterising", "characterizing",
- "collectivising", "collectivizing",
- "commercialised", "commercialized",
- "commercialises", "commercializes",
- "conceptualised", "conceptualized",
- "conceptualises", "conceptualizes",
- "contextualised", "contextualized",
- "contextualises", "contextualizes",
- "decentralising", "decentralizing",
- "decriminalised", "decriminalized",
- "decriminalises", "decriminalizes",
- "dehumanisation", "dehumanization",
- "demilitarising", "demilitarizing",
- "demobilisation", "demobilization",
- "demoralisation", "demoralization",
- "denationalised", "denationalized",
- "denationalises", "denationalizes",
- "depersonalised", "depersonalized",
- "depersonalises", "depersonalizes",
- "disembowelling", "disemboweling",
- "dramatisations", "dramatizations",
- "editorialising", "editorializing",
- "encyclopaedias", "encyclopedias",
- "fictionalising", "fictionalizing",
- "fraternisation", "fraternization",
- "generalisation", "generalization",
- "gynaecological", "gynecological",
- "gynaecologists", "gynecologists",
- "haematological", "hematological",
- "haematologists", "hematologists",
- "immobilisation", "immobilization",
- "individualised", "individualized",
- "individualises", "individualizes",
- "industrialised", "industrialized",
- "industrialises", "industrializes",
- "liberalisation", "liberalization",
- "monopolisation", "monopolization",
- "naturalisation", "naturalization",
- "neighbourhoods", "neighborhoods",
- "neutralisation", "neutralization",
- "organisational", "organizational",
- "outmanoeuvring", "outmaneuvering",
- "overemphasised", "overemphasized",
- "overemphasises", "overemphasizes",
- "paediatricians", "pediatricians",
- "particularised", "particularized",
- "particularises", "particularizes",
- "pasteurisation", "pasteurization",
- "pedestrianised", "pedestrianized",
- "pedestrianises", "pedestrianizes",
- "philosophising", "philosophizing",
- "politicisation", "politicization",
- "popularisation", "popularization",
- "pressurisation", "pressurization",
- "prioritisation", "prioritization",
- "privatisations", "privatizations",
- "propagandising", "propagandizing",
- "psychoanalysed", "psychoanalyzed",
- "psychoanalyses", "psychoanalyzes",
- "regularisation", "regularization",
- "reorganisation", "reorganization",
- "revolutionised", "revolutionized",
- "revolutionises", "revolutionizes",
- "secularisation", "secularization",
- "sensationalise", "sensationalize",
- "sentimentalise", "sentimentalize",
- "serialisations", "serializations",
- "specialisation", "specialization",
- "sterilisations", "sterilizations",
- "stigmatisation", "stigmatization",
- "transistorised", "transistorized",
- "unrecognisable", "unrecognizable",
- "visualisations", "visualizations",
- "westernisation", "westernization",
- "accessorising", "accessorizing",
- "acclimatising", "acclimatizing",
- "amortisations", "amortizations",
- "amphitheatres", "amphitheaters",
- "anaesthetised", "anesthetized",
- "anaesthetises", "anesthetizes",
- "anaesthetists", "anesthetists",
- "archaeologist", "archeologist",
- "backpedalling", "backpedaling",
- "behaviourists", "behaviorists",
- "breathalysers", "breathalyzers",
- "breathalysing", "breathalyzing",
- "callisthenics", "calisthenics",
- "cannibalising", "cannibalizing",
- "characterised", "characterized",
- "characterises", "characterizes",
- "circularising", "circularizing",
- "clarinettists", "clarinetists",
- "collectivised", "collectivized",
- "collectivises", "collectivizes",
- "commercialise", "commercialize",
- "computerising", "computerizing",
- "conceptualise", "conceptualize",
- "contextualise", "contextualize",
- "criminalising", "criminalizing",
- "crystallising", "crystallizing",
- "decentralised", "decentralized",
- "decentralises", "decentralizes",
- "decriminalise", "decriminalize",
- "demilitarised", "demilitarized",
- "demilitarises", "demilitarizes",
- "democratising", "democratizing",
- "denationalise", "denationalize",
- "depersonalise", "depersonalize",
- "desensitising", "desensitizing",
- "destabilising", "destabilizing",
- "disembowelled", "disemboweled",
- "dishonourable", "dishonorable",
- "dishonourably", "dishonorably",
- "dramatisation", "dramatization",
- "editorialised", "editorialized",
- "editorialises", "editorializes",
- "encyclopaedia", "encyclopedia",
- "encyclopaedic", "encyclopedic",
- "extemporising", "extemporizing",
- "externalising", "externalizing",
- "familiarising", "familiarizing",
- "fertilisation", "fertilization",
- "fictionalised", "fictionalized",
- "fictionalises", "fictionalizes",
- "formalisation", "formalization",
- "fossilisation", "fossilization",
- "globalisation", "globalization",
- "gynaecologist", "gynecologist",
- "haematologist", "hematologist",
- "haemophiliacs", "hemophiliacs",
- "haemorrhaging", "hemorrhaging",
- "harmonisation", "harmonization",
- "hospitalising", "hospitalizing",
- "hypothesising", "hypothesizing",
- "immortalising", "immortalizing",
- "individualise", "individualize",
- "industrialise", "industrialize",
- "internalising", "internalizing",
- "marginalising", "marginalizing",
- "materialising", "materializing",
- "mechanisation", "mechanization",
- "memorialising", "memorializing",
- "miniaturising", "miniaturizing",
- "miscatalogued", "miscataloged",
- "misdemeanours", "misdemeanors",
- "multicoloured", "multicolored",
- "nationalising", "nationalizing",
- "neighbourhood", "neighborhood",
- "normalisation", "normalization",
- "organisations", "organizations",
- "outmanoeuvred", "outmaneuvered",
- "outmanoeuvres", "outmaneuvers",
- "overemphasise", "overemphasize",
- "paediatrician", "pediatrician",
- "palaeontology", "paleontology",
- "particularise", "particularize",
- "passivisation", "passivization",
- "patronisingly", "patronizingly",
- "pedestrianise", "pedestrianize",
- "personalising", "personalizing",
- "philosophised", "philosophized",
- "philosophises", "philosophizes",
- "privatisation", "privatization",
- "propagandised", "propagandized",
- "propagandises", "propagandizes",
- "proselytisers", "proselytizers",
- "proselytising", "proselytizing",
- "psychoanalyse", "psychoanalyze",
- "pulverisation", "pulverization",
- "rationalising", "rationalizing",
- "reconnoitring", "reconnoitering",
- "revolutionise", "revolutionize",
- "romanticising", "romanticizing",
- "serialisation", "serialization",
- "socialisation", "socialization",
- "stabilisation", "stabilization",
- "standardising", "standardizing",
- "sterilisation", "sterilization",
- "subsidisation", "subsidization",
- "synchronising", "synchronizing",
- "systematising", "systematizing",
- "tantalisingly", "tantalizingly",
- "underutilised", "underutilized",
- "victimisation", "victimization",
- "visualisation", "visualization",
- "vocalisations", "vocalizations",
- "vulgarisation", "vulgarization",
- "accessorised", "accessorized",
- "accessorises", "accessorizes",
- "acclimatised", "acclimatized",
- "acclimatises", "acclimatizes",
- "amortisation", "amortization",
- "amphitheatre", "amphitheater",
- "anaesthetics", "anesthetics",
- "anaesthetise", "anesthetize",
- "anaesthetist", "anesthetist",
- "antagonising", "antagonizing",
- "appetisingly", "appetizingly",
- "backpedalled", "backpedaled",
- "bastardising", "bastardizing",
- "behaviourism", "behaviorism",
- "behaviourist", "behaviorist",
- "bowdlerising", "bowdlerizing",
- "breathalysed", "breathalyzed",
- "breathalyser", "breathalyzer",
- "breathalyses", "breathalyzes",
- "cannibalised", "cannibalized",
- "cannibalises", "cannibalizes",
- "capitalising", "capitalizing",
- "caramelising", "caramelizing",
- "categorising", "categorizing",
- "centigrammes", "centigrams",
- "centralising", "centralizing",
- "centrepieces", "centerpieces",
- "characterise", "characterize",
- "circularised", "circularized",
- "circularises", "circularizes",
- "clarinettist", "clarinetist",
- "collectivise", "collectivize",
- "colonisation", "colonization",
- "computerised", "computerized",
- "computerises", "computerizes",
- "criminalised", "criminalized",
- "criminalises", "criminalizes",
- "crystallised", "crystallized",
- "crystallises", "crystallizes",
- "decentralise", "decentralize",
- "dehumanising", "dehumanizing",
- "demilitarise", "demilitarize",
- "demobilising", "demobilizing",
- "democratised", "democratized",
- "democratises", "democratizes",
- "demoralising", "demoralizing",
- "desensitised", "desensitized",
- "desensitises", "desensitizes",
- "destabilised", "destabilized",
- "destabilises", "destabilizes",
- "discolouring", "discoloring",
- "dishonouring", "dishonoring",
- "disorganised", "disorganized",
- "editorialise", "editorialize",
- "endeavouring", "endeavoring",
- "equalisation", "equalization",
- "evangelising", "evangelizing",
- "extemporised", "extemporized",
- "extemporises", "extemporizes",
- "externalised", "externalized",
- "externalises", "externalizes",
- "familiarised", "familiarized",
- "familiarises", "familiarizes",
- "fictionalise", "fictionalize",
- "finalisation", "finalization",
- "fraternising", "fraternizing",
- "generalising", "generalizing",
- "haemophiliac", "hemophiliac",
- "haemorrhaged", "hemorrhaged",
- "haemorrhages", "hemorrhages",
- "haemorrhoids", "hemorrhoids",
- "homoeopathic", "homeopathic",
- "homogenising", "homogenizing",
- "hospitalised", "hospitalized",
- "hospitalises", "hospitalizes",
- "hypothesised", "hypothesized",
- "hypothesises", "hypothesizes",
- "idealisation", "idealization",
- "immobilisers", "immobilizers",
- "immobilising", "immobilizing",
- "immortalised", "immortalized",
- "immortalises", "immortalizes",
- "immunisation", "immunization",
- "initialising", "initializing",
- "internalised", "internalized",
- "internalises", "internalizes",
- "jeopardising", "jeopardizing",
- "legalisation", "legalization",
- "legitimising", "legitimizing",
- "liberalising", "liberalizing",
- "manoeuvrable", "maneuverable",
- "manoeuvrings", "maneuverings",
- "marginalised", "marginalized",
- "marginalises", "marginalizes",
- "marvellously", "marvelously",
- "materialised", "materialized",
- "materialises", "materializes",
- "maximisation", "maximization",
- "memorialised", "memorialized",
- "memorialises", "memorializes",
- "metabolising", "metabolizing",
- "militarising", "militarizing",
- "milligrammes", "milligrams",
- "miniaturised", "miniaturized",
- "miniaturises", "miniaturizes",
- "misbehaviour", "misbehavior",
- "misdemeanour", "misdemeanor",
- "mobilisation", "mobilization",
- "moisturisers", "moisturizers",
- "moisturising", "moisturizing",
- "monopolising", "monopolizing",
- "moustachioed", "mustachioed",
- "nationalised", "nationalized",
- "nationalises", "nationalizes",
- "naturalising", "naturalizing",
- "neighbouring", "neighboring",
- "neutralising", "neutralizing",
- "oesophaguses", "esophaguses",
- "organisation", "organization",
- "orthopaedics", "orthopedics",
- "outmanoeuvre", "outmaneuver",
- "palaeolithic", "paleolithic",
- "pasteurising", "pasteurizing",
- "personalised", "personalized",
- "personalises", "personalizes",
- "philosophise", "philosophize",
- "plagiarising", "plagiarizing",
- "ploughshares", "plowshares",
- "polarisation", "polarization",
- "politicising", "politicizing",
- "popularising", "popularizing",
- "pressurising", "pressurizing",
- "prioritising", "prioritizing",
- "propagandise", "propagandize",
- "proselytised", "proselytized",
- "proselytiser", "proselytizer",
- "proselytises", "proselytizes",
- "radicalising", "radicalizing",
- "rationalised", "rationalized",
- "rationalises", "rationalizes",
- "realisations", "realizations",
- "recognisable", "recognizable",
- "recognisably", "recognizably",
- "recognisance", "recognizance",
- "reconnoitred", "reconnoitered",
- "reconnoitres", "reconnoiters",
- "regularising", "regularizing",
- "reorganising", "reorganizing",
- "revitalising", "revitalizing",
- "rhapsodising", "rhapsodizing",
- "romanticised", "romanticized",
- "romanticises", "romanticizes",
- "scandalising", "scandalizing",
- "scrutinising", "scrutinizing",
- "secularising", "secularizing",
- "specialising", "specializing",
- "squirrelling", "squirreling",
- "standardised", "standardized",
- "standardises", "standardizes",
- "stigmatising", "stigmatizing",
- "sympathisers", "sympathizers",
- "sympathising", "sympathizing",
- "synchronised", "synchronized",
- "synchronises", "synchronizes",
- "synthesisers", "synthesizers",
- "synthesising", "synthesizing",
- "systematised", "systematized",
- "systematises", "systematizes",
- "technicolour", "technicolor",
- "theatregoers", "theatergoers",
- "traumatising", "traumatizing",
- "trivialising", "trivializing",
- "unauthorised", "unauthorized",
- "uncatalogued", "uncataloged",
- "unfavourable", "unfavorable",
- "unfavourably", "unfavorably",
- "unionisation", "unionization",
- "unrecognised", "unrecognized",
- "untrammelled", "untrammeled",
- "urbanisation", "urbanization",
- "vaporisation", "vaporization",
- "vocalisation", "vocalization",
- "watercolours", "watercolors",
- "westernising", "westernizing",
- "accessorise", "accessorize",
- "acclimatise", "acclimatize",
- "agonisingly", "agonizingly",
- "amortisable", "amortizable",
- "anaesthesia", "anesthesia",
- "anaesthetic", "anesthetic",
- "anglicising", "anglicizing",
- "antagonised", "antagonized",
- "antagonises", "antagonizes",
- "apologising", "apologizing",
- "archaeology", "archeology",
- "authorising", "authorizing",
- "bastardised", "bastardized",
- "bastardises", "bastardizes",
- "bedevilling", "bedeviling",
- "behavioural", "behavioral",
- "belabouring", "belaboring",
- "bowdlerised", "bowdlerized",
- "bowdlerises", "bowdlerizes",
- "breathalyse", "breathalyze",
- "brutalising", "brutalizing",
- "cannibalise", "cannibalize",
- "capitalised", "capitalized",
- "capitalises", "capitalizes",
- "caramelised", "caramelized",
- "caramelises", "caramelizes",
- "carbonising", "carbonizing",
- "cataloguing", "cataloging",
- "categorised", "categorized",
- "categorises", "categorizes",
- "cauterising", "cauterizing",
- "centigramme", "centigram",
- "centilitres", "centiliters",
- "centimetres", "centimeters",
- "centralised", "centralized",
- "centralises", "centralizes",
- "centrefolds", "centerfolds",
- "centrepiece", "centerpiece",
- "channelling", "channeling",
- "chequebooks", "checkbooks",
- "circularise", "circularize",
- "colourfully", "colorfully",
- "colourizing", "colorizing",
- "computerise", "computerize",
- "councillors", "councilors",
- "counselling", "counseling",
- "counsellors", "counselors",
- "criminalise", "criminalize",
- "criticising", "criticizing",
- "crystallise", "crystallize",
- "customising", "customizing",
- "defenceless", "defenseless",
- "dehumanised", "dehumanized",
- "dehumanises", "dehumanizes",
- "demobilised", "demobilized",
- "demobilises", "demobilizes",
- "democratise", "democratize",
- "demoralised", "demoralized",
- "demoralises", "demoralizes",
- "deodorising", "deodorizing",
- "desensitise", "desensitize",
- "destabilise", "destabilize",
- "discoloured", "discolored",
- "dishevelled", "disheveled",
- "dishonoured", "dishonored",
- "dramatising", "dramatizing",
- "economising", "economizing",
- "empathising", "empathizing",
- "emphasising", "emphasizing",
- "endeavoured", "endeavored",
- "epitomising", "epitomizing",
- "evangelised", "evangelized",
- "evangelises", "evangelizes",
- "extemporise", "extemporize",
- "externalise", "externalize",
- "factorising", "factorizing",
- "familiarise", "familiarize",
- "fantasising", "fantasizing",
- "favouritism", "favoritism",
- "fertilisers", "fertilizers",
- "fertilising", "fertilizing",
- "flavourings", "flavorings",
- "flavourless", "flavorless",
- "flavoursome", "flavorsome",
- "formalising", "formalizing",
- "fossilising", "fossilizing",
- "fraternised", "fraternized",
- "fraternises", "fraternizes",
- "galvanising", "galvanizing",
- "generalised", "generalized",
- "generalises", "generalizes",
- "ghettoising", "ghettoizing",
- "globalising", "globalizing",
- "gruellingly", "gruelingly",
- "gynaecology", "gynecology",
- "haematology", "hematology",
- "haemoglobin", "hemoglobin",
- "haemophilia", "hemophilia",
- "haemorrhage", "hemorrhage",
- "harmonising", "harmonizing",
- "homoeopaths", "homeopaths",
- "homoeopathy", "homeopathy",
- "homogenised", "homogenized",
- "homogenises", "homogenizes",
- "hospitalise", "hospitalize",
- "hybridising", "hybridizing",
- "hypnotising", "hypnotizing",
- "hypothesise", "hypothesize",
- "immobilised", "immobilized",
- "immobiliser", "immobilizer",
- "immobilises", "immobilizes",
- "immortalise", "immortalize",
- "impanelling", "impaneling",
- "imperilling", "imperiling",
- "initialised", "initialized",
- "initialises", "initializes",
- "initialling", "initialing",
- "instalments", "installments",
- "internalise", "internalize",
- "italicising", "italicizing",
- "jeopardised", "jeopardized",
- "jeopardises", "jeopardizes",
- "kilogrammes", "kilograms",
- "legitimised", "legitimized",
- "legitimises", "legitimizes",
- "liberalised", "liberalized",
- "liberalises", "liberalizes",
- "lionisation", "lionization",
- "liquidisers", "liquidizers",
- "liquidising", "liquidizing",
- "magnetising", "magnetizing",
- "manoeuvring", "maneuvering",
- "marginalise", "marginalize",
- "marshalling", "marshaling",
- "materialise", "materialize",
- "mechanising", "mechanizing",
- "memorialise", "memorialize",
- "mesmerising", "mesmerizing",
- "metabolised", "metabolized",
- "metabolises", "metabolizes",
- "micrometres", "micrometers",
- "militarised", "militarized",
- "militarises", "militarizes",
- "milligramme", "milligram",
- "millilitres", "milliliters",
- "millimetres", "millimeters",
- "miniaturise", "miniaturize",
- "modernising", "modernizing",
- "moisturised", "moisturized",
- "moisturiser", "moisturizer",
- "moisturises", "moisturizes",
- "monopolised", "monopolized",
- "monopolises", "monopolizes",
- "nationalise", "nationalize",
- "naturalised", "naturalized",
- "naturalises", "naturalizes",
- "neighbourly", "neighborly",
- "neutralised", "neutralized",
- "neutralises", "neutralizes",
- "normalising", "normalizing",
- "orthopaedic", "orthopedic",
- "ostracising", "ostracizing",
- "oxidisation", "oxidization",
- "paediatrics", "pediatrics",
- "paedophiles", "pedophiles",
- "paedophilia", "pedophilia",
- "passivising", "passivizing",
- "pasteurised", "pasteurized",
- "pasteurises", "pasteurizes",
- "patronising", "patronizing",
- "personalise", "personalize",
- "plagiarised", "plagiarized",
- "plagiarises", "plagiarizes",
- "ploughshare", "plowshare",
- "politicised", "politicized",
- "politicises", "politicizes",
- "popularised", "popularized",
- "popularises", "popularizes",
- "praesidiums", "presidiums",
- "pressurised", "pressurized",
- "pressurises", "pressurizes",
- "prioritised", "prioritized",
- "prioritises", "prioritizes",
- "privatising", "privatizing",
- "proselytise", "proselytize",
- "publicising", "publicizing",
- "pulverising", "pulverizing",
- "quarrelling", "quarreling",
- "radicalised", "radicalized",
- "radicalises", "radicalizes",
- "randomising", "randomizing",
- "rationalise", "rationalize",
- "realisation", "realization",
- "recognising", "recognizing",
- "reconnoitre", "reconnoiter",
- "regularised", "regularized",
- "regularises", "regularizes",
- "remodelling", "remodeling",
- "reorganised", "reorganized",
- "reorganises", "reorganizes",
- "revitalised", "revitalized",
- "revitalises", "revitalizes",
- "rhapsodised", "rhapsodized",
- "rhapsodises", "rhapsodizes",
- "romanticise", "romanticize",
- "scandalised", "scandalized",
- "scandalises", "scandalizes",
- "sceptically", "skeptically",
- "scrutinised", "scrutinized",
- "scrutinises", "scrutinizes",
- "secularised", "secularized",
- "secularises", "secularizes",
- "sensitising", "sensitizing",
- "serialising", "serializing",
- "sermonising", "sermonizing",
- "shrivelling", "shriveling",
- "signalising", "signalizing",
- "snorkelling", "snorkeling",
- "snowploughs", "snowplow",
- "socialising", "socializing",
- "solemnising", "solemnizing",
- "specialised", "specialized",
- "specialises", "specializes",
- "squirrelled", "squirreled",
- "stabilisers", "stabilizers",
- "stabilising", "stabilizing",
- "standardise", "standardize",
- "stencilling", "stenciling",
- "sterilisers", "sterilizers",
- "sterilising", "sterilizing",
- "stigmatised", "stigmatized",
- "stigmatises", "stigmatizes",
- "subsidisers", "subsidizers",
- "subsidising", "subsidizing",
- "summarising", "summarizing",
- "symbolising", "symbolizing",
- "sympathised", "sympathized",
- "sympathiser", "sympathizer",
- "sympathises", "sympathizes",
- "synchronise", "synchronize",
- "synthesised", "synthesized",
- "synthesiser", "synthesizer",
- "synthesises", "synthesizes",
- "systematise", "systematize",
- "tantalising", "tantalizing",
- "temporising", "temporizing",
- "tenderising", "tenderizing",
- "terrorising", "terrorizing",
- "theatregoer", "theatergoer",
- "traumatised", "traumatized",
- "traumatises", "traumatizes",
- "trivialised", "trivialized",
- "trivialises", "trivializes",
- "tyrannising", "tyrannizing",
- "uncivilised", "uncivilized",
- "unorganised", "unorganized",
- "unravelling", "unraveling",
- "utilisation", "utilization",
- "vandalising", "vandalizing",
- "verbalising", "verbalizing",
- "victimising", "victimizing",
- "visualising", "visualizing",
- "vulgarising", "vulgarizing",
- "watercolour", "watercolor",
- "westernised", "westernized",
- "westernises", "westernizes",
- "worshipping", "worshiping",
- "aeroplanes", "airplanes",
- "amortising", "amortizing",
- "anglicised", "anglicized",
- "anglicises", "anglicizes",
- "annualised", "annualized",
- "antagonise", "antagonize",
- "apologised", "apologized",
- "apologises", "apologizes",
- "appetisers", "appetizers",
- "appetising", "appetizing",
- "authorised", "authorized",
- "authorises", "authorizes",
- "bannisters", "banisters",
- "bastardise", "bastardize",
- "bedevilled", "bedeviled",
- "behaviours", "behaviors",
- "bejewelled", "bejeweled",
- "belaboured", "belabored",
- "bowdlerise", "bowdlerize",
- "brutalised", "brutalized",
- "brutalises", "brutalizes",
- "canalising", "canalizing",
- "cancelling", "canceling",
- "canonising", "canonizing",
- "capitalise", "capitalize",
- "caramelise", "caramelize",
- "carbonised", "carbonized",
- "carbonises", "carbonizes",
- "catalogued", "cataloged",
- "catalogues", "catalogs",
- "catalysing", "catalyzing",
- "categorise", "categorize",
- "cauterised", "cauterized",
- "cauterises", "cauterizes",
- "centilitre", "centiliter",
- "centimetre", "centimeter",
- "centralise", "centralize",
- "centrefold", "centerfold",
- "channelled", "channeled",
- "chequebook", "checkbook",
- "chiselling", "chiseling",
- "civilising", "civilizing",
- "clamouring", "clamoring",
- "colonisers", "colonizers",
- "colonising", "colonizing",
- "colourants", "colorants",
- "colourized", "colorized",
- "colourizes", "colorizes",
- "colourless", "colorless",
- "connexions", "connections",
- "councillor", "councilor",
- "counselled", "counseled",
- "counsellor", "counselor",
- "criticised", "criticized",
- "criticises", "criticizes",
- "cudgelling", "cudgeling",
- "customised", "customized",
- "customises", "customizes",
- "dehumanise", "dehumanize",
- "demobilise", "demobilize",
- "demonising", "demonizing",
- "demoralise", "demoralize",
- "deodorised", "deodorized",
- "deodorises", "deodorizes",
- "deputising", "deputizing",
- "digitising", "digitizing",
- "discolours", "discolors",
- "dishonours", "dishonors",
- "dramatised", "dramatized",
- "dramatises", "dramatizes",
- "drivelling", "driveling",
- "economised", "economized",
- "economises", "economizes",
- "empathised", "empathized",
- "empathises", "empathizes",
- "emphasised", "emphasized",
- "emphasises", "emphasizes",
- "enamelling", "enameling",
- "endeavours", "endeavors",
- "energising", "energizing",
- "epaulettes", "epaulets",
- "epicentres", "epicenters",
- "epitomised", "epitomized",
- "epitomises", "epitomizes",
- "equalisers", "equalizers",
- "equalising", "equalizing",
- "eulogising", "eulogizing",
- "evangelise", "evangelize",
- "factorised", "factorized",
- "factorises", "factorizes",
- "fantasised", "fantasized",
- "fantasises", "fantasizes",
- "favourable", "favorable",
- "favourably", "favorably",
- "favourites", "favorites",
- "feminising", "feminizing",
- "fertilised", "fertilized",
- "fertiliser", "fertilizer",
- "fertilises", "fertilizes",
- "fibreglass", "fiberglass",
- "finalising", "finalizing",
- "flavouring", "flavoring",
- "formalised", "formalized",
- "formalises", "formalizes",
- "fossilised", "fossilized",
- "fossilises", "fossilizes",
- "fraternise", "fraternize",
- "fulfilment", "fulfillment",
- "funnelling", "funneling",
- "galvanised", "galvanized",
- "galvanises", "galvanizes",
- "gambolling", "gamboling",
- "gaolbreaks", "jailbreaks",
- "generalise", "generalize",
- "ghettoised", "ghettoized",
- "ghettoises", "ghettoizes",
- "globalised", "globalized",
- "globalises", "globalizes",
- "gonorrhoea", "gonorrhea",
- "grovelling", "groveling",
- "harbouring", "harboring",
- "harmonised", "harmonized",
- "harmonises", "harmonizes",
- "homoeopath", "homeopath",
- "homogenise", "homogenize",
- "honourable", "honorable",
- "honourably", "honorably",
- "humanising", "humanizing",
- "humourless", "humorless",
- "hybridised", "hybridized",
- "hybridises", "hybridizes",
- "hypnotised", "hypnotized",
- "hypnotises", "hypnotizes",
- "idealising", "idealizing",
- "immobilise", "immobilize",
- "immunising", "immunizing",
- "impanelled", "impaneled",
- "imperilled", "imperiled",
- "inflexions", "inflections",
- "initialise", "initialize",
- "initialled", "initialed",
- "instalment", "installment",
- "ionisation", "ionization",
- "italicised", "italicized",
- "italicises", "italicizes",
- "jeopardise", "jeopardize",
- "kilogramme", "kilogram",
- "kilometres", "kilometers",
- "lacklustre", "lackluster",
- "legalising", "legalizing",
- "legitimise", "legitimize",
- "liberalise", "liberalize",
- "liquidised", "liquidized",
- "liquidiser", "liquidizer",
- "liquidises", "liquidizes",
- "localising", "localizing",
- "magnetised", "magnetized",
- "magnetises", "magnetizes",
- "manoeuvred", "maneuvered",
- "manoeuvres", "maneuvers",
- "marshalled", "marshaled",
- "marvelling", "marveling",
- "marvellous", "marvelous",
- "maximising", "maximizing",
- "mechanised", "mechanized",
- "mechanises", "mechanizes",
- "memorising", "memorizing",
- "mesmerised", "mesmerized",
- "mesmerises", "mesmerizes",
- "metabolise", "metabolize",
- "micrometre", "micrometer",
- "militarise", "militarize",
- "millilitre", "milliliter",
- "millimetre", "millimeter",
- "minimising", "minimizing",
- "mobilising", "mobilizing",
- "modernised", "modernized",
- "modernises", "modernizes",
- "moisturise", "moisturize",
- "monopolise", "monopolize",
- "moralising", "moralizing",
- "mouldering", "moldering",
- "moustached", "mustached",
- "moustaches", "mustaches",
- "naturalise", "naturalize",
- "neighbours", "neighbors",
- "neutralise", "neutralize",
- "normalised", "normalized",
- "normalises", "normalizes",
- "oesophagus", "esophagus",
- "optimising", "optimizing",
- "organisers", "organizers",
- "organising", "organizing",
- "ostracised", "ostracized",
- "ostracises", "ostracizes",
- "paederasts", "pederasts",
- "paediatric", "pediatric",
- "paedophile", "pedophile",
- "panellists", "panelists",
- "paralysing", "paralyzing",
- "parcelling", "parceling",
- "passivised", "passivized",
- "passivises", "passivizes",
- "pasteurise", "pasteurize",
- "patronised", "patronized",
- "patronises", "patronizes",
- "penalising", "penalizing",
- "pencilling", "penciling",
- "plagiarise", "plagiarize",
- "polarising", "polarizing",
- "politicise", "politicize",
- "popularise", "popularize",
- "practising", "practicing",
- "praesidium", "presidium",
- "pressurise", "pressurize",
- "prioritise", "prioritize",
- "privatised", "privatized",
- "privatises", "privatizes",
- "programmes", "programs",
- "publicised", "publicized",
- "publicises", "publicizes",
- "pulverised", "pulverized",
- "pulverises", "pulverizes",
- "pummelling", "pummeled",
- "quarrelled", "quarreled",
- "radicalise", "radicalize",
- "randomised", "randomized",
- "randomises", "randomizes",
- "realisable", "realizable",
- "recognised", "recognized",
- "recognises", "recognizes",
- "refuelling", "refueling",
- "regularise", "regularize",
- "remodelled", "remodeled",
- "remoulding", "remolding",
- "reorganise", "reorganize",
- "revitalise", "revitalize",
- "rhapsodise", "rhapsodize",
- "ritualised", "ritualized",
- "sanitising", "sanitizing",
- "satirising", "satirizing",
- "scandalise", "scandalize",
- "scepticism", "skepticism",
- "scrutinise", "scrutinize",
- "secularise", "secularize",
- "sensitised", "sensitized",
- "sensitises", "sensitizes",
- "sepulchres", "sepulchers",
- "serialised", "serialized",
- "serialises", "serializes",
- "sermonised", "sermonized",
- "sermonises", "sermonizes",
- "shovelling", "shoveling",
- "shrivelled", "shriveled",
- "signalised", "signalized",
- "signalises", "signalizes",
- "signalling", "signaling",
- "snivelling", "sniveling",
- "snorkelled", "snorkeled",
- "snowplough", "snowplow",
- "socialised", "socialized",
- "socialises", "socializes",
- "sodomising", "sodomizing",
- "solemnised", "solemnized",
- "solemnises", "solemnizes",
- "specialise", "specialize",
- "spiralling", "spiraling",
- "splendours", "splendors",
- "stabilised", "stabilized",
- "stabiliser", "stabilizer",
- "stabilises", "stabilizes",
- "stencilled", "stenciled",
- "sterilised", "sterilized",
- "steriliser", "sterilizer",
- "sterilises", "sterilizes",
- "stigmatise", "stigmatize",
- "subsidised", "subsidized",
- "subsidiser", "subsidizer",
- "subsidises", "subsidizes",
- "succouring", "succoring",
- "sulphurous", "sulfurous",
- "summarised", "summarized",
- "summarises", "summarizes",
- "swivelling", "swiveling",
- "symbolised", "symbolized",
- "symbolises", "symbolizes",
- "sympathise", "sympathize",
- "synthesise", "synthesize",
- "tantalised", "tantalized",
- "tantalises", "tantalizes",
- "temporised", "temporized",
- "temporises", "temporizes",
- "tenderised", "tenderized",
- "tenderises", "tenderizes",
- "terrorised", "terrorized",
- "terrorises", "terrorizes",
- "theorising", "theorizing",
- "traumatise", "traumatize",
- "travellers", "travelers",
- "travelling", "traveling",
- "tricolours", "tricolors",
- "trivialise", "trivialize",
- "tunnelling", "tunneling",
- "tyrannised", "tyrannized",
- "tyrannises", "tyrannizes",
- "unequalled", "unequaled",
- "unionising", "unionizing",
- "unravelled", "unraveled",
- "unrivalled", "unrivaled",
- "urbanising", "urbanizing",
- "utilisable", "utilizable",
- "vandalised", "vandalized",
- "vandalises", "vandalizes",
- "vaporising", "vaporizing",
- "verbalised", "verbalized",
- "verbalises", "verbalizes",
- "victimised", "victimized",
- "victimises", "victimizes",
- "visualised", "visualized",
- "visualises", "visualizes",
- "vocalising", "vocalizing",
- "vulcanised", "vulcanized",
- "vulgarised", "vulgarized",
- "vulgarises", "vulgarizes",
- "weaselling", "weaseling",
- "westernise", "westernize",
- "womanisers", "womanizers",
- "womanising", "womanizing",
- "worshipped", "worshiped",
- "worshipper", "worshiper",
- "aeroplane", "airplane",
- "aetiology", "etiology",
- "agonising", "agonizing",
- "almanacks", "almanacs",
- "aluminium", "aluminum",
- "amortised", "amortized",
- "amortises", "amortizes",
- "analogues", "analogs",
- "analysing", "analyzing",
- "anglicise", "anglicize",
- "apologise", "apologize",
- "appetiser", "appetizer",
- "armourers", "armorers",
- "armouries", "armories",
- "artefacts", "artifacts",
- "authorise", "authorize",
- "baptising", "baptizing",
- "behaviour", "behavior",
- "belabours", "belabors",
- "brutalise", "brutalize",
- "callipers", "calipers",
- "canalised", "canalized",
- "canalises", "canalizes",
- "cancelled", "canceled",
- "canonised", "canonized",
- "canonises", "canonizes",
- "carbonise", "carbonize",
- "carolling", "caroling",
- "catalogue", "catalog",
- "catalysed", "catalyzed",
- "catalyses", "catalyzes",
- "cauterise", "cauterize",
- "cavilling", "caviling",
- "chequered", "checkered",
- "chiselled", "chiseled",
- "civilised", "civilized",
- "civilises", "civilizes",
- "clamoured", "clamored",
- "colonised", "colonized",
- "coloniser", "colonizer",
- "colonises", "colonizes",
- "colourant", "colorant",
- "coloureds", "coloreds",
- "colourful", "colorful",
- "colouring", "coloring",
- "colourize", "colorize",
- "connexion", "connection",
- "criticise", "criticize",
- "cruellest", "cruelest",
- "cudgelled", "cudgeled",
- "customise", "customize",
- "demeanour", "demeanor",
- "demonised", "demonized",
- "demonises", "demonizes",
- "deodorise", "deodorize",
- "deputised", "deputized",
- "deputises", "deputizes",
- "dialogues", "dialogs",
- "diarrhoea", "diarrhea",
- "digitised", "digitized",
- "digitises", "digitizes",
- "discolour", "discolor",
- "disfavour", "disfavor",
- "dishonour", "dishonor",
- "dramatise", "dramatize",
- "drivelled", "driveled",
- "economise", "economize",
- "empathise", "empathize",
- "emphasise", "emphasize",
- "enamelled", "enameled",
- "enamoured", "enamored",
- "endeavour", "endeavor",
- "energised", "energized",
- "energises", "energizes",
- "epaulette", "epaulet",
- "epicentre", "epicenter",
- "epitomise", "epitomize",
- "equalised", "equalized",
- "equaliser", "equalizer",
- "equalises", "equalizes",
- "eulogised", "eulogized",
- "eulogises", "eulogizes",
- "factorise", "factorize",
- "fantasise", "fantasize",
- "favouring", "favoring",
- "favourite", "favorite",
- "feminised", "feminized",
- "feminises", "feminizes",
- "fertilise", "fertilize",
- "finalised", "finalized",
- "finalises", "finalizes",
- "flautists", "flutists",
- "flavoured", "flavored",
- "formalise", "formalize",
- "fossilise", "fossilize",
- "funnelled", "funneled",
- "galvanise", "galvanize",
- "gambolled", "gamboled",
- "gaolbirds", "jailbirds",
- "gaolbreak", "jailbreak",
- "ghettoise", "ghettoize",
- "globalise", "globalize",
- "gravelled", "graveled",
- "grovelled", "groveled",
- "gruelling", "grueling",
- "harboured", "harbored",
- "harmonise", "harmonize",
- "honouring", "honoring",
- "humanised", "humanized",
- "humanises", "humanizes",
- "humouring", "humoring",
- "hybridise", "hybridize",
- "hypnotise", "hypnotize",
- "idealised", "idealized",
- "idealises", "idealizes",
- "idolising", "idolizing",
- "immunised", "immunized",
- "immunises", "immunizes",
- "inflexion", "inflection",
- "italicise", "italicize",
- "itemising", "itemizing",
- "jewellers", "jewelers",
- "jewellery", "jewelry",
- "kilometre", "kilometer",
- "labelling", "labeling",
- "labourers", "laborers",
- "labouring", "laboring",
- "legalised", "legalized",
- "legalises", "legalizes",
- "leukaemia", "leukemia",
- "levellers", "levelers",
- "levelling", "leveling",
- "libelling", "libeling",
- "libellous", "libelous",
- "licencing", "licensing",
- "lionising", "lionizing",
- "liquidise", "liquidize",
- "localised", "localized",
- "localises", "localizes",
- "magnetise", "magnetize",
- "manoeuvre", "maneuver",
- "marvelled", "marveled",
- "maximised", "maximized",
- "maximises", "maximizes",
- "mechanise", "mechanize",
- "mediaeval", "medieval",
- "memorised", "memorized",
- "memorises", "memorizes",
- "mesmerise", "mesmerize",
- "minimised", "minimized",
- "minimises", "minimizes",
- "mobilised", "mobilized",
- "mobilises", "mobilizes",
- "modellers", "modelers",
- "modelling", "modeling",
- "modernise", "modernize",
- "moralised", "moralized",
- "moralises", "moralizes",
- "motorised", "motorized",
- "mouldered", "moldered",
- "mouldiest", "moldiest",
- "mouldings", "moldings",
- "moustache", "mustache",
- "neighbour", "neighbor",
- "normalise", "normalize",
- "odourless", "odorless",
- "oestrogen", "estrogen",
- "optimised", "optimized",
- "optimises", "optimizes",
- "organised", "organized",
- "organiser", "organizer",
- "organises", "organizes",
- "ostracise", "ostracize",
- "oxidising", "oxidizing",
- "paederast", "pederast",
- "panelling", "paneling",
- "panellist", "panelist",
- "paralysed", "paralyzed",
- "paralyses", "paralyzes",
- "parcelled", "parceled",
- "passivise", "passivize",
- "patronise", "patronize",
- "pedalling", "pedaling",
- "penalised", "penalized",
- "penalises", "penalizes",
- "pencilled", "penciled",
- "ploughing", "plowing",
- "ploughman", "plowman",
- "ploughmen", "plowmen",
- "polarised", "polarized",
- "polarises", "polarizes",
- "practised", "practiced",
- "practises", "practices",
- "pretences", "pretenses",
- "primaeval", "primeval",
- "privatise", "privatize",
- "programme", "program",
- "publicise", "publicize",
- "pulverise", "pulverize",
- "pummelled", "pummel",
- "randomise", "randomize",
- "ravelling", "raveling",
- "realising", "realizing",
- "recognise", "recognize",
- "refuelled", "refueled",
- "remoulded", "remolded",
- "revellers", "revelers",
- "revelling", "reveling",
- "rivalling", "rivaling",
- "saltpetre", "saltpeter",
- "sanitised", "sanitized",
- "sanitises", "sanitizes",
- "satirised", "satirized",
- "satirises", "satirizes",
- "savouries", "savories",
- "savouring", "savoring",
- "sceptical", "skeptical",
- "sensitise", "sensitize",
- "sepulchre", "sepulcher",
- "serialise", "serialize",
- "sermonise", "sermonize",
- "shovelled", "shoveled",
- "signalise", "signalize",
- "signalled", "signaled",
- "snivelled", "sniveled",
- "socialise", "socialize",
- "sodomised", "sodomized",
- "sodomises", "sodomizes",
- "solemnise", "solemnize",
- "spiralled", "spiraled",
- "splendour", "splendor",
- "stabilise", "stabilize",
- "sterilise", "sterilize",
- "subsidise", "subsidize",
- "succoured", "succored",
- "sulphates", "sulfates",
- "sulphides", "sulfides",
- "summarise", "summarize",
- "swivelled", "swiveled",
- "symbolise", "symbolize",
- "syphoning", "siphoning",
- "tantalise", "tantalize",
- "tasselled", "tasseled",
- "temporise", "temporize",
- "tenderise", "tenderize",
- "terrorise", "terrorize",
- "theorised", "theorized",
- "theorises", "theorizes",
- "towelling", "toweling",
- "travelled", "traveled",
- "traveller", "traveler",
- "trialling", "trialing",
- "tricolour", "tricolor",
- "tunnelled", "tunneled",
- "tyrannise", "tyrannize",
- "unionised", "unionized",
- "unionises", "unionizes",
- "unsavoury", "unsavory",
- "urbanised", "urbanized",
- "urbanises", "urbanizes",
- "utilising", "utilizing",
- "vandalise", "vandalize",
- "vaporised", "vaporized",
- "vaporises", "vaporizes",
- "verbalise", "verbalize",
- "victimise", "victimize",
- "visualise", "visualize",
- "vocalised", "vocalized",
- "vocalises", "vocalizes",
- "vulgarise", "vulgarize",
- "weaselled", "weaseled",
- "womanised", "womanized",
- "womaniser", "womanizer",
- "womanises", "womanizes",
- "yodelling", "yodeling",
- "yoghourts", "yogurts",
- "agonised", "agonized",
- "agonises", "agonizes",
- "almanack", "almanac",
- "amortise", "amortize",
- "analogue", "analog",
- "analysed", "analyzed",
- "analyses", "analyzes",
- "armoured", "armored",
- "armourer", "armorer",
- "artefact", "artifact",
- "baptised", "baptized",
- "baptises", "baptizes",
- "baulking", "balking",
- "belabour", "belabor",
- "bevelled", "beveled",
- "calibres", "calibers",
- "calliper", "caliper",
- "canalise", "canalize",
- "canonise", "canonize",
- "carolled", "caroled",
- "catalyse", "catalyze",
- "cavilled", "caviled",
- "civilise", "civilize",
- "clamours", "clamors",
- "clangour", "clangor",
- "colonise", "colonize",
- "coloured", "colored",
- "cosiness", "coziness",
- "crueller", "crueler",
- "defences", "defenses",
- "demonise", "demonize",
- "deputise", "deputize",
- "dialling", "dialing",
- "dialogue", "dialog",
- "digitise", "digitize",
- "draughty", "drafty",
- "duelling", "dueling",
- "energise", "energize",
- "enthrals", "enthralls",
- "equalise", "equalize",
- "eulogise", "eulogize",
- "favoured", "favored",
- "feminise", "feminize",
- "finalise", "finalize",
- "flautist", "flutist",
- "flavours", "flavors",
- "foetuses", "fetuses",
- "fuelling", "fueling",
- "gaolbird", "jailbird",
- "gryphons", "griffins",
- "harbours", "harbors",
- "honoured", "honored",
- "humanise", "humanize",
- "humoured", "humored",
- "idealise", "idealize",
- "idolised", "idolized",
- "idolises", "idolizes",
- "immunise", "immunize",
- "ionisers", "ionizers",
- "ionising", "ionizing",
- "itemised", "itemized",
- "itemises", "itemizes",
- "jewelled", "jeweled",
- "jeweller", "jeweler",
- "labelled", "labeled",
- "laboured", "labored",
- "labourer", "laborer",
- "legalise", "legalize",
- "levelled", "leveled",
- "leveller", "leveler",
- "libelled", "libeled",
- "licenced", "licensed",
- "licences", "licenses",
- "lionised", "lionized",
- "lionises", "lionizes",
- "localise", "localize",
- "maximise", "maximize",
- "memorise", "memorize",
- "minimise", "minimize",
- "misspelt", "misspelled",
- "mobilise", "mobilize",
- "modelled", "modeled",
- "modeller", "modeler",
- "moralise", "moralize",
- "moulders", "molders",
- "mouldier", "moldier",
- "moulding", "molding",
- "moulting", "molting",
- "offences", "offenses",
- "optimise", "optimize",
- "organise", "organize",
- "oxidised", "oxidized",
- "oxidises", "oxidizes",
- "panelled", "paneled",
- "paralyse", "paralyze",
- "parlours", "parlors",
- "pedalled", "pedaled",
- "penalise", "penalize",
- "philtres", "filters",
- "ploughed", "plowed",
- "polarise", "polarize",
- "practise", "practice",
- "pretence", "pretense",
- "ravelled", "raveled",
- "realised", "realized",
- "realises", "realizes",
- "remoulds", "remolds",
- "revelled", "reveled",
- "reveller", "reveler",
- "rivalled", "rivaled",
- "rumoured", "rumored",
- "sanitise", "sanitize",
- "satirise", "satirize",
- "saviours", "saviors",
- "savoured", "savored",
- "sceptics", "skeptics",
- "sceptres", "scepters",
- "sodomise", "sodomize",
- "spectres", "specters",
- "succours", "succors",
- "sulphate", "sulfate",
- "sulphide", "sulfide",
- "syphoned", "siphoned",
- "theatres", "theaters",
- "theorise", "theorize",
- "towelled", "toweled",
- "toxaemia", "toxemia",
- "trialled", "trialed",
- "unionise", "unionize",
- "urbanise", "urbanize",
- "utilised", "utilized",
- "utilises", "utilizes",
- "vaporise", "vaporize",
- "vocalise", "vocalize",
- "womanise", "womanize",
- "yodelled", "yodeled",
- "yoghourt", "yogurt",
- "yoghurts", "yogurts",
- "agonise", "agonize",
- "anaemia", "anemia",
- "anaemic", "anemic",
- "analyse", "analyze",
- "arbours", "arbors",
- "armoury", "armory",
- "baptise", "baptize",
- "baulked", "balked",
- "behoved", "behooved",
- "behoves", "behooves",
- "calibre", "caliber",
- "candour", "candor",
- "centred", "centered",
- "centres", "centers",
- "cheques", "checks",
- "clamour", "clamor",
- "colours", "colors",
- "cosiest", "coziest",
- "defence", "defense",
- "dialled", "dialed",
- "distils", "distills",
- "duelled", "dueled",
- "enthral", "enthrall",
- "favours", "favors",
- "fervour", "fervor",
- "flavour", "flavor",
- "fuelled", "fueled",
- "fulfils", "fulfills",
- "gaolers", "jailers",
- "gaoling", "jailing",
- "gipsies", "gypsies",
- "glueing", "gluing",
- "goitres", "goiters",
- "grammes", "grams",
- "groynes", "groins",
- "gryphon", "griffin",
- "harbour", "harbor",
- "honours", "honors",
- "humours", "humors",
- "idolise", "idolize",
- "instals", "installs",
- "instils", "instills",
- "ionised", "ionized",
- "ioniser", "ionizer",
- "ionises", "ionizes",
- "itemise", "itemize",
- "labours", "labors",
- "licence", "license",
- "lionise", "lionize",
- "louvred", "louvered",
- "louvres", "louvers",
- "moulded", "molded",
- "moulder", "molder",
- "moulted", "molted",
- "offence", "offense",
- "oxidise", "oxidize",
- "parlour", "parlor",
- "philtre", "filter",
- "ploughs", "plows",
- "pyjamas", "pajamas",
- "rancour", "rancor",
- "realise", "realize",
- "remould", "remold",
- "rigours", "rigors",
- "rumours", "rumors",
- "saviour", "savior",
- "savours", "savors",
- "savoury", "savory",
- "sceptic", "skeptic",
- "sceptre", "scepter",
- "spectre", "specter",
- "storeys", "stories",
- "succour", "succor",
- "sulphur", "sulfur",
- "syphons", "siphons",
- "theatre", "theater",
- "tumours", "tumors",
- "utilise", "utilize",
- "vapours", "vapors",
- "waggons", "wagons",
- "yoghurt", "yogurt",
- "ageing", "aging",
- "appals", "appalls",
- "arbour", "arbor",
- "ardour", "ardor",
- "baulks", "balks",
- "behove", "behoove",
- "centre", "center",
- "cheque", "check",
- "chilli", "chili",
- "colour", "color",
- "cosier", "cozier",
- "cosies", "cozies",
- "cosily", "cozily",
- "distil", "distill",
- "edoema", "edema",
- "enrols", "enrolls",
- "faecal", "fecal",
- "faeces", "feces",
- "favour", "favor",
- "fibres", "fibers",
- "foetal", "fetal",
- "foetid", "fetid",
- "foetus", "fetus",
- "fulfil", "fulfill",
- "gaoled", "jailed",
- "gaoler", "jailer",
- "goitre", "goiter",
- "gramme", "gram",
- "groyne", "groin",
- "honour", "honor",
- "humour", "humor",
- "instal", "install",
- "instil", "instill",
- "ionise", "ionize",
- "labour", "labor",
- "litres", "liters",
- "lustre", "luster",
- "meagre", "meager",
- "metres", "meters",
- "mitres", "miters",
- "moulds", "molds",
- "mouldy", "moldy",
- "moults", "molts",
- "odours", "odors",
- "plough", "plow",
- "pyjama", "pajama",
- "rigour", "rigor",
- "rumour", "rumor",
- "savour", "savor",
- "storey", "story",
- "syphon", "siphon",
- "tumour", "tumor",
- "valour", "valor",
- "vapour", "vapor",
- "vigour", "vigor",
- "waggon", "wagon",
- "appal", "appall",
- "baulk", "balk",
- "enrol", "enroll",
- "fibre", "fiber",
- "gaols", "jails",
- "litre", "liter",
- "metre", "meter",
- "mitre", "miter",
- "mould", "mold",
- "moult", "molt",
- "odour", "odor",
- "tyres", "tires",
- "cosy", "cozy",
- "gaol", "jail",
- "tyre", "tire",
-}
-
-// DictBritish converts US spellings to UK spellings
-var DictBritish = []string{
- "institutionalization", "institutionalisation",
- "internationalization", "internationalisation",
- "professionalization", "professionalisation",
- "compartmentalizing", "compartmentalising",
- "institutionalizing", "institutionalising",
- "internationalizing", "internationalising",
- "compartmentalized", "compartmentalised",
- "compartmentalizes", "compartmentalises",
- "decriminalization", "decriminalisation",
- "denationalization", "denationalisation",
- "fictionalizations", "fictionalisations",
- "institutionalized", "institutionalised",
- "institutionalizes", "institutionalises",
- "intellectualizing", "intellectualising",
- "internationalized", "internationalised",
- "internationalizes", "internationalises",
- "pedestrianization", "pedestrianisation",
- "professionalizing", "professionalising",
- "compartmentalize", "compartmentalise",
- "decentralization", "decentralisation",
- "demilitarization", "demilitarisation",
- "externalizations", "externalisations",
- "fictionalization", "fictionalisation",
- "institutionalize", "institutionalise",
- "intellectualized", "intellectualised",
- "intellectualizes", "intellectualises",
- "internationalize", "internationalise",
- "nationalizations", "nationalisations",
- "professionalized", "professionalised",
- "professionalizes", "professionalises",
- "rationalizations", "rationalisations",
- "sensationalizing", "sensationalising",
- "sentimentalizing", "sentimentalising",
- "acclimatization", "acclimatisation",
- "commercializing", "commercialising",
- "conceptualizing", "conceptualising",
- "contextualizing", "contextualising",
- "crystallization", "crystallisation",
- "decriminalizing", "decriminalising",
- "democratization", "democratisation",
- "denationalizing", "denationalising",
- "depersonalizing", "depersonalising",
- "desensitization", "desensitisation",
- "disorganization", "disorganisation",
- "extemporization", "extemporisation",
- "externalization", "externalisation",
- "familiarization", "familiarisation",
- "generalizations", "generalisations",
- "hospitalization", "hospitalisation",
- "individualizing", "individualising",
- "industrializing", "industrialising",
- "intellectualize", "intellectualise",
- "internalization", "internalisation",
- "maneuverability", "manoeuvrability",
- "materialization", "materialisation",
- "miniaturization", "miniaturisation",
- "nationalization", "nationalisation",
- "overemphasizing", "overemphasising",
- "paleontologists", "palaeontologists",
- "particularizing", "particularising",
- "pedestrianizing", "pedestrianising",
- "professionalize", "professionalise",
- "psychoanalyzing", "psychoanalysing",
- "rationalization", "rationalisation",
- "reorganizations", "reorganisations",
- "revolutionizing", "revolutionising",
- "sensationalized", "sensationalised",
- "sensationalizes", "sensationalises",
- "sentimentalized", "sentimentalised",
- "sentimentalizes", "sentimentalises",
- "specializations", "specialisations",
- "standardization", "standardisation",
- "synchronization", "synchronisation",
- "systematization", "systematisation",
- "aggrandizement", "aggrandisement",
- "characterizing", "characterising",
- "collectivizing", "collectivising",
- "commercialized", "commercialised",
- "commercializes", "commercialises",
- "conceptualized", "conceptualised",
- "conceptualizes", "conceptualises",
- "contextualized", "contextualised",
- "contextualizes", "contextualises",
- "decentralizing", "decentralising",
- "decriminalized", "decriminalised",
- "decriminalizes", "decriminalises",
- "dehumanization", "dehumanisation",
- "demilitarizing", "demilitarising",
- "demobilization", "demobilisation",
- "demoralization", "demoralisation",
- "denationalized", "denationalised",
- "denationalizes", "denationalises",
- "depersonalized", "depersonalised",
- "depersonalizes", "depersonalises",
- "dramatizations", "dramatisations",
- "editorializing", "editorialising",
- "fictionalizing", "fictionalising",
- "fraternization", "fraternisation",
- "generalization", "generalisation",
- "immobilization", "immobilisation",
- "individualized", "individualised",
- "individualizes", "individualises",
- "industrialized", "industrialised",
- "industrializes", "industrialises",
- "liberalization", "liberalisation",
- "monopolization", "monopolisation",
- "naturalization", "naturalisation",
- "neighborliness", "neighbourliness",
- "neutralization", "neutralisation",
- "organizational", "organisational",
- "outmaneuvering", "outmanoeuvring",
- "overemphasized", "overemphasised",
- "overemphasizes", "overemphasises",
- "paleontologist", "palaeontologist",
- "particularized", "particularised",
- "particularizes", "particularises",
- "pasteurization", "pasteurisation",
- "pedestrianized", "pedestrianised",
- "pedestrianizes", "pedestrianises",
- "philosophizing", "philosophising",
- "politicization", "politicisation",
- "popularization", "popularisation",
- "pressurization", "pressurisation",
- "prioritization", "prioritisation",
- "privatizations", "privatisations",
- "propagandizing", "propagandising",
- "psychoanalyzed", "psychoanalysed",
- "psychoanalyzes", "psychoanalyses",
- "reconnoitering", "reconnoitring",
- "regularization", "regularisation",
- "reorganization", "reorganisation",
- "revolutionized", "revolutionised",
- "revolutionizes", "revolutionises",
- "secularization", "secularisation",
- "sensationalize", "sensationalise",
- "sentimentalize", "sentimentalise",
- "serializations", "serialisations",
- "specialization", "specialisation",
- "sterilizations", "sterilisations",
- "stigmatization", "stigmatisation",
- "transistorized", "transistorised",
- "unrecognizable", "unrecognisable",
- "visualizations", "visualisations",
- "westernization", "westernisation",
- "accessorizing", "accessorising",
- "acclimatizing", "acclimatising",
- "amortizations", "amortisations",
- "amphitheaters", "amphitheatres",
- "anesthetizing", "anaesthetising",
- "archeologists", "archaeologists",
- "breathalyzers", "breathalysers",
- "breathalyzing", "breathalysing",
- "cannibalizing", "cannibalising",
- "characterized", "characterised",
- "characterizes", "characterises",
- "circularizing", "circularising",
- "collectivized", "collectivised",
- "collectivizes", "collectivises",
- "commercialize", "commercialise",
- "computerizing", "computerising",
- "conceptualize", "conceptualise",
- "contextualize", "contextualise",
- "criminalizing", "criminalising",
- "crystallizing", "crystallising",
- "decentralized", "decentralised",
- "decentralizes", "decentralises",
- "decriminalize", "decriminalise",
- "demilitarized", "demilitarised",
- "demilitarizes", "demilitarises",
- "democratizing", "democratising",
- "denationalize", "denationalise",
- "depersonalize", "depersonalise",
- "desensitizing", "desensitising",
- "destabilizing", "destabilising",
- "disemboweling", "disembowelling",
- "dramatization", "dramatisation",
- "editorialized", "editorialised",
- "editorializes", "editorialises",
- "extemporizing", "extemporising",
- "externalizing", "externalising",
- "familiarizing", "familiarising",
- "fertilization", "fertilisation",
- "fictionalized", "fictionalised",
- "fictionalizes", "fictionalises",
- "formalization", "formalisation",
- "fossilization", "fossilisation",
- "globalization", "globalisation",
- "gynecological", "gynaecological",
- "gynecologists", "gynaecologists",
- "harmonization", "harmonisation",
- "hematological", "haematological",
- "hematologists", "haematologists",
- "hospitalizing", "hospitalising",
- "hypothesizing", "hypothesising",
- "immortalizing", "immortalising",
- "individualize", "individualise",
- "industrialize", "industrialise",
- "internalizing", "internalising",
- "marginalizing", "marginalising",
- "materializing", "materialising",
- "mechanization", "mechanisation",
- "memorializing", "memorialising",
- "miniaturizing", "miniaturising",
- "nationalizing", "nationalising",
- "neighborhoods", "neighbourhoods",
- "normalization", "normalisation",
- "organizations", "organisations",
- "outmaneuvered", "outmanoeuvred",
- "overemphasize", "overemphasise",
- "particularize", "particularise",
- "passivization", "passivisation",
- "patronizingly", "patronisingly",
- "pedestrianize", "pedestrianise",
- "pediatricians", "paediatricians",
- "personalizing", "personalising",
- "philosophized", "philosophised",
- "philosophizes", "philosophises",
- "privatization", "privatisation",
- "propagandized", "propagandised",
- "propagandizes", "propagandises",
- "proselytizers", "proselytisers",
- "proselytizing", "proselytising",
- "psychoanalyze", "psychoanalyse",
- "pulverization", "pulverisation",
- "rationalizing", "rationalising",
- "reconnoitered", "reconnoitred",
- "revolutionize", "revolutionise",
- "romanticizing", "romanticising",
- "serialization", "serialisation",
- "socialization", "socialisation",
- "standardizing", "standardising",
- "sterilization", "sterilisation",
- "subsidization", "subsidisation",
- "synchronizing", "synchronising",
- "systematizing", "systematising",
- "tantalizingly", "tantalisingly",
- "underutilized", "underutilised",
- "victimization", "victimisation",
- "visualization", "visualisation",
- "vocalizations", "vocalisations",
- "vulgarization", "vulgarisation",
- "accessorized", "accessorised",
- "accessorizes", "accessorises",
- "acclimatized", "acclimatised",
- "acclimatizes", "acclimatises",
- "amortization", "amortisation",
- "amphitheater", "amphitheatre",
- "anesthetists", "anaesthetists",
- "anesthetized", "anaesthetised",
- "anesthetizes", "anaesthetises",
- "antagonizing", "antagonising",
- "appetizingly", "appetisingly",
- "archeologist", "archaeologist",
- "backpedaling", "backpedalling",
- "bastardizing", "bastardising",
- "behaviorists", "behaviourists",
- "bowdlerizing", "bowdlerising",
- "breathalyzed", "breathalysed",
- "breathalyzes", "breathalyses",
- "cannibalized", "cannibalised",
- "cannibalizes", "cannibalises",
- "capitalizing", "capitalising",
- "caramelizing", "caramelising",
- "categorizing", "categorising",
- "centerpieces", "centrepieces",
- "centralizing", "centralising",
- "characterize", "characterise",
- "circularized", "circularised",
- "circularizes", "circularises",
- "clarinetists", "clarinettists",
- "collectivize", "collectivise",
- "colonization", "colonisation",
- "computerized", "computerised",
- "computerizes", "computerises",
- "criminalized", "criminalised",
- "criminalizes", "criminalises",
- "crystallized", "crystallised",
- "crystallizes", "crystallises",
- "decentralize", "decentralise",
- "dehumanizing", "dehumanising",
- "demilitarize", "demilitarise",
- "demobilizing", "demobilising",
- "democratized", "democratised",
- "democratizes", "democratises",
- "demoralizing", "demoralising",
- "desensitized", "desensitised",
- "desensitizes", "desensitises",
- "destabilized", "destabilised",
- "destabilizes", "destabilises",
- "disemboweled", "disembowelled",
- "dishonorable", "dishonourable",
- "dishonorably", "dishonourably",
- "disorganized", "disorganised",
- "editorialize", "editorialise",
- "equalization", "equalisation",
- "evangelizing", "evangelising",
- "extemporized", "extemporised",
- "extemporizes", "extemporises",
- "externalized", "externalised",
- "externalizes", "externalises",
- "familiarized", "familiarised",
- "familiarizes", "familiarises",
- "fictionalize", "fictionalise",
- "finalization", "finalisation",
- "fraternizing", "fraternising",
- "generalizing", "generalising",
- "gynecologist", "gynaecologist",
- "hematologist", "haematologist",
- "hemophiliacs", "haemophiliacs",
- "hemorrhaging", "haemorrhaging",
- "homogenizing", "homogenising",
- "hospitalized", "hospitalised",
- "hospitalizes", "hospitalises",
- "hypothesized", "hypothesised",
- "hypothesizes", "hypothesises",
- "idealization", "idealisation",
- "immobilizers", "immobilisers",
- "immobilizing", "immobilising",
- "immortalized", "immortalised",
- "immortalizes", "immortalises",
- "immunization", "immunisation",
- "initializing", "initialising",
- "installments", "instalments",
- "internalized", "internalised",
- "internalizes", "internalises",
- "jeopardizing", "jeopardising",
- "legalization", "legalisation",
- "legitimizing", "legitimising",
- "liberalizing", "liberalising",
- "maneuverable", "manoeuvrable",
- "maneuverings", "manoeuvrings",
- "marginalized", "marginalised",
- "marginalizes", "marginalises",
- "materialized", "materialised",
- "materializes", "materialises",
- "maximization", "maximisation",
- "memorialized", "memorialised",
- "memorializes", "memorialises",
- "metabolizing", "metabolising",
- "militarizing", "militarising",
- "miniaturized", "miniaturised",
- "miniaturizes", "miniaturises",
- "miscataloged", "miscatalogued",
- "misdemeanors", "misdemeanours",
- "mobilization", "mobilisation",
- "moisturizers", "moisturisers",
- "moisturizing", "moisturising",
- "monopolizing", "monopolising",
- "multicolored", "multicoloured",
- "nationalized", "nationalised",
- "nationalizes", "nationalises",
- "naturalizing", "naturalising",
- "neighborhood", "neighbourhood",
- "neutralizing", "neutralising",
- "organization", "organisation",
- "outmaneuvers", "outmanoeuvres",
- "paleontology", "palaeontology",
- "pasteurizing", "pasteurising",
- "pediatrician", "paediatrician",
- "personalized", "personalised",
- "personalizes", "personalises",
- "philosophize", "philosophise",
- "plagiarizing", "plagiarising",
- "polarization", "polarisation",
- "politicizing", "politicising",
- "popularizing", "popularising",
- "pressurizing", "pressurising",
- "prioritizing", "prioritising",
- "propagandize", "propagandise",
- "proselytized", "proselytised",
- "proselytizer", "proselytiser",
- "proselytizes", "proselytises",
- "radicalizing", "radicalising",
- "rationalized", "rationalised",
- "rationalizes", "rationalises",
- "realizations", "realisations",
- "recognizable", "recognisable",
- "recognizably", "recognisably",
- "recognizance", "recognisance",
- "reconnoiters", "reconnoitres",
- "regularizing", "regularising",
- "reorganizing", "reorganising",
- "revitalizing", "revitalising",
- "rhapsodizing", "rhapsodising",
- "romanticized", "romanticised",
- "romanticizes", "romanticises",
- "scandalizing", "scandalising",
- "scrutinizing", "scrutinising",
- "secularizing", "secularising",
- "standardized", "standardised",
- "standardizes", "standardises",
- "stigmatizing", "stigmatising",
- "sympathizers", "sympathisers",
- "sympathizing", "sympathising",
- "synchronized", "synchronised",
- "synchronizes", "synchronises",
- "synthesizing", "synthesising",
- "systematized", "systematised",
- "systematizes", "systematises",
- "theatergoers", "theatregoers",
- "traumatizing", "traumatising",
- "trivializing", "trivialising",
- "unauthorized", "unauthorised",
- "unionization", "unionisation",
- "unrecognized", "unrecognised",
- "urbanization", "urbanisation",
- "vaporization", "vaporisation",
- "vocalization", "vocalisation",
- "westernizing", "westernising",
- "accessorize", "accessorise",
- "acclimatize", "acclimatise",
- "agonizingly", "agonisingly",
- "amortizable", "amortisable",
- "anesthetics", "anaesthetics",
- "anesthetist", "anaesthetist",
- "anesthetize", "anaesthetise",
- "anglicizing", "anglicising",
- "antagonized", "antagonised",
- "antagonizes", "antagonises",
- "apologizing", "apologising",
- "backpedaled", "backpedalled",
- "bastardized", "bastardised",
- "bastardizes", "bastardises",
- "behaviorism", "behaviourism",
- "behaviorist", "behaviourist",
- "bowdlerized", "bowdlerised",
- "bowdlerizes", "bowdlerises",
- "brutalizing", "brutalising",
- "cannibalize", "cannibalise",
- "capitalized", "capitalised",
- "capitalizes", "capitalises",
- "caramelized", "caramelised",
- "caramelizes", "caramelises",
- "carbonizing", "carbonising",
- "categorized", "categorised",
- "categorizes", "categorises",
- "cauterizing", "cauterising",
- "centerfolds", "centrefolds",
- "centerpiece", "centrepiece",
- "centiliters", "centilitres",
- "centimeters", "centimetres",
- "centralized", "centralised",
- "centralizes", "centralises",
- "circularize", "circularise",
- "clarinetist", "clarinettist",
- "computerize", "computerise",
- "criminalize", "criminalise",
- "criticizing", "criticising",
- "crystallize", "crystallise",
- "customizing", "customising",
- "defenseless", "defenceless",
- "dehumanized", "dehumanised",
- "dehumanizes", "dehumanises",
- "demobilized", "demobilised",
- "demobilizes", "demobilises",
- "democratize", "democratise",
- "demoralized", "demoralised",
- "demoralizes", "demoralises",
- "deodorizing", "deodorising",
- "desensitize", "desensitise",
- "destabilize", "destabilise",
- "discoloring", "discolouring",
- "dishonoring", "dishonouring",
- "dramatizing", "dramatising",
- "economizing", "economising",
- "empathizing", "empathising",
- "emphasizing", "emphasising",
- "endeavoring", "endeavouring",
- "epitomizing", "epitomising",
- "esophaguses", "oesophaguses",
- "evangelized", "evangelised",
- "evangelizes", "evangelises",
- "extemporize", "extemporise",
- "externalize", "externalise",
- "factorizing", "factorising",
- "familiarize", "familiarise",
- "fantasizing", "fantasising",
- "fertilizers", "fertilisers",
- "fertilizing", "fertilising",
- "formalizing", "formalising",
- "fossilizing", "fossilising",
- "fraternized", "fraternised",
- "fraternizes", "fraternises",
- "fulfillment", "fulfilment",
- "galvanizing", "galvanising",
- "generalized", "generalised",
- "generalizes", "generalises",
- "ghettoizing", "ghettoising",
- "globalizing", "globalising",
- "harmonizing", "harmonising",
- "hemophiliac", "haemophiliac",
- "hemorrhaged", "haemorrhaged",
- "hemorrhages", "haemorrhages",
- "hemorrhoids", "haemorrhoids",
- "homogenized", "homogenised",
- "homogenizes", "homogenises",
- "hospitalize", "hospitalise",
- "hybridizing", "hybridising",
- "hypnotizing", "hypnotising",
- "hypothesize", "hypothesise",
- "immobilized", "immobilised",
- "immobilizer", "immobiliser",
- "immobilizes", "immobilises",
- "immortalize", "immortalise",
- "initialized", "initialised",
- "initializes", "initialises",
- "installment", "instalment",
- "internalize", "internalise",
- "italicizing", "italicising",
- "jeopardized", "jeopardised",
- "jeopardizes", "jeopardises",
- "legitimized", "legitimised",
- "legitimizes", "legitimises",
- "liberalized", "liberalised",
- "liberalizes", "liberalises",
- "lionization", "lionisation",
- "liquidizers", "liquidisers",
- "liquidizing", "liquidising",
- "magnetizing", "magnetising",
- "maneuvering", "manoeuvring",
- "marginalize", "marginalise",
- "marvelously", "marvellously",
- "materialize", "materialise",
- "mechanizing", "mechanising",
- "memorialize", "memorialise",
- "mesmerizing", "mesmerising",
- "metabolized", "metabolised",
- "metabolizes", "metabolises",
- "militarized", "militarised",
- "militarizes", "militarises",
- "milliliters", "millilitres",
- "millimeters", "millimetres",
- "miniaturize", "miniaturise",
- "misbehavior", "misbehaviour",
- "misdemeanor", "misdemeanour",
- "modernizing", "modernising",
- "moisturized", "moisturised",
- "moisturizer", "moisturiser",
- "moisturizes", "moisturises",
- "monopolized", "monopolised",
- "monopolizes", "monopolises",
- "nationalize", "nationalise",
- "naturalized", "naturalised",
- "naturalizes", "naturalises",
- "neighboring", "neighbouring",
- "neutralized", "neutralised",
- "neutralizes", "neutralises",
- "normalizing", "normalising",
- "orthopedics", "orthopaedics",
- "ostracizing", "ostracising",
- "outmaneuver", "outmanoeuvre",
- "oxidization", "oxidisation",
- "pasteurized", "pasteurised",
- "pasteurizes", "pasteurises",
- "patronizing", "patronising",
- "personalize", "personalise",
- "plagiarized", "plagiarised",
- "plagiarizes", "plagiarises",
- "politicized", "politicised",
- "politicizes", "politicises",
- "popularized", "popularised",
- "popularizes", "popularises",
- "pressurized", "pressurised",
- "pressurizes", "pressurises",
- "prioritized", "prioritised",
- "prioritizes", "prioritises",
- "privatizing", "privatising",
- "proselytize", "proselytise",
- "publicizing", "publicising",
- "pulverizing", "pulverising",
- "radicalized", "radicalised",
- "radicalizes", "radicalises",
- "randomizing", "randomising",
- "rationalize", "rationalise",
- "realization", "realisation",
- "recognizing", "recognising",
- "reconnoiter", "reconnoitre",
- "regularized", "regularised",
- "regularizes", "regularises",
- "reorganized", "reorganised",
- "reorganizes", "reorganises",
- "revitalized", "revitalised",
- "revitalizes", "revitalises",
- "rhapsodized", "rhapsodised",
- "rhapsodizes", "rhapsodises",
- "romanticize", "romanticise",
- "scandalized", "scandalised",
- "scandalizes", "scandalises",
- "scrutinized", "scrutinised",
- "scrutinizes", "scrutinises",
- "secularized", "secularised",
- "secularizes", "secularises",
- "sensitizing", "sensitising",
- "serializing", "serialising",
- "sermonizing", "sermonising",
- "signalizing", "signalising",
- "skeptically", "sceptically",
- "socializing", "socialising",
- "solemnizing", "solemnising",
- "specialized", "specialised",
- "specializes", "specialises",
- "squirreling", "squirrelling",
- "stabilizers", "stabilisers",
- "stabilizing", "stabilising",
- "standardize", "standardise",
- "sterilizers", "sterilisers",
- "sterilizing", "sterilising",
- "stigmatized", "stigmatised",
- "stigmatizes", "stigmatises",
- "subsidizers", "subsidisers",
- "subsidizing", "subsidising",
- "summarizing", "summarising",
- "symbolizing", "symbolising",
- "sympathized", "sympathised",
- "sympathizer", "sympathiser",
- "sympathizes", "sympathises",
- "synchronize", "synchronise",
- "synthesized", "synthesised",
- "synthesizes", "synthesises",
- "systematize", "systematise",
- "tantalizing", "tantalising",
- "temporizing", "temporising",
- "tenderizing", "tenderising",
- "terrorizing", "terrorising",
- "theatergoer", "theatregoer",
- "traumatized", "traumatised",
- "traumatizes", "traumatises",
- "trivialized", "trivialised",
- "trivializes", "trivialises",
- "tyrannizing", "tyrannising",
- "uncataloged", "uncatalogued",
- "uncivilized", "uncivilised",
- "unfavorable", "unfavourable",
- "unfavorably", "unfavourably",
- "unorganized", "unorganised",
- "untrammeled", "untrammelled",
- "utilization", "utilisation",
- "vandalizing", "vandalising",
- "verbalizing", "verbalising",
- "victimizing", "victimising",
- "visualizing", "visualising",
- "vulgarizing", "vulgarising",
- "watercolors", "watercolours",
- "westernized", "westernised",
- "westernizes", "westernises",
- "amortizing", "amortising",
- "anesthesia", "anaesthesia",
- "anesthetic", "anaesthetic",
- "anglicized", "anglicised",
- "anglicizes", "anglicises",
- "annualized", "annualised",
- "antagonize", "antagonise",
- "apologized", "apologised",
- "apologizes", "apologises",
- "appetizers", "appetisers",
- "appetizing", "appetising",
- "archeology", "archaeology",
- "authorizes", "authorises",
- "bastardize", "bastardise",
- "bedeviling", "bedevilling",
- "behavioral", "behavioural",
- "belaboring", "belabouring",
- "bowdlerize", "bowdlerise",
- "brutalized", "brutalised",
- "brutalizes", "brutalises",
- "canalizing", "canalising",
- "canonizing", "canonising",
- "capitalize", "capitalise",
- "caramelize", "caramelise",
- "carbonized", "carbonised",
- "carbonizes", "carbonises",
- "cataloging", "cataloguing",
- "catalyzing", "catalysing",
- "categorize", "categorise",
- "cauterized", "cauterised",
- "cauterizes", "cauterises",
- "centerfold", "centrefold",
- "centiliter", "centilitre",
- "centimeter", "centimetre",
- "centralize", "centralise",
- "channeling", "channelling",
- "checkbooks", "chequebooks",
- "civilizing", "civilising",
- "colonizers", "colonisers",
- "colonizing", "colonising",
- "colorfully", "colourfully",
- "colorizing", "colourizing",
- "councilors", "councillors",
- "counselors", "counsellors",
- "criticized", "criticised",
- "criticizes", "criticises",
- "customized", "customised",
- "customizes", "customises",
- "dehumanize", "dehumanise",
- "demobilize", "demobilise",
- "demonizing", "demonising",
- "demoralize", "demoralise",
- "deodorized", "deodorised",
- "deodorizes", "deodorises",
- "deputizing", "deputising",
- "digitizing", "digitising",
- "discolored", "discoloured",
- "disheveled", "dishevelled",
- "dishonored", "dishonoured",
- "dramatized", "dramatised",
- "dramatizes", "dramatises",
- "economized", "economised",
- "economizes", "economises",
- "empathized", "empathised",
- "empathizes", "empathises",
- "emphasized", "emphasised",
- "emphasizes", "emphasises",
- "endeavored", "endeavoured",
- "energizing", "energising",
- "epicenters", "epicentres",
- "epitomized", "epitomised",
- "epitomizes", "epitomises",
- "equalizers", "equalisers",
- "equalizing", "equalising",
- "eulogizing", "eulogising",
- "evangelize", "evangelise",
- "factorized", "factorised",
- "factorizes", "factorises",
- "fantasized", "fantasised",
- "fantasizes", "fantasises",
- "favoritism", "favouritism",
- "feminizing", "feminising",
- "fertilized", "fertilised",
- "fertilizer", "fertiliser",
- "fertilizes", "fertilises",
- "fiberglass", "fibreglass",
- "finalizing", "finalising",
- "flavorings", "flavourings",
- "flavorless", "flavourless",
- "flavorsome", "flavoursome",
- "formalized", "formalised",
- "formalizes", "formalises",
- "fossilized", "fossilised",
- "fossilizes", "fossilises",
- "fraternize", "fraternise",
- "galvanized", "galvanised",
- "galvanizes", "galvanises",
- "generalize", "generalise",
- "ghettoized", "ghettoised",
- "ghettoizes", "ghettoises",
- "globalized", "globalised",
- "globalizes", "globalises",
- "gruelingly", "gruellingly",
- "gynecology", "gynaecology",
- "harmonized", "harmonised",
- "harmonizes", "harmonises",
- "hematology", "haematology",
- "hemoglobin", "haemoglobin",
- "hemophilia", "haemophilia",
- "hemorrhage", "haemorrhage",
- "homogenize", "homogenise",
- "humanizing", "humanising",
- "hybridized", "hybridised",
- "hybridizes", "hybridises",
- "hypnotized", "hypnotised",
- "hypnotizes", "hypnotises",
- "idealizing", "idealising",
- "immobilize", "immobilise",
- "immunizing", "immunising",
- "impaneling", "impanelling",
- "imperiling", "imperilling",
- "initialing", "initialling",
- "initialize", "initialise",
- "ionization", "ionisation",
- "italicized", "italicised",
- "italicizes", "italicises",
- "jeopardize", "jeopardise",
- "kilometers", "kilometres",
- "lackluster", "lacklustre",
- "legalizing", "legalising",
- "legitimize", "legitimise",
- "liberalize", "liberalise",
- "liquidized", "liquidised",
- "liquidizer", "liquidiser",
- "liquidizes", "liquidises",
- "localizing", "localising",
- "magnetized", "magnetised",
- "magnetizes", "magnetises",
- "maneuvered", "manoeuvred",
- "marshaling", "marshalling",
- "maximizing", "maximising",
- "mechanized", "mechanised",
- "mechanizes", "mechanises",
- "memorizing", "memorising",
- "mesmerized", "mesmerised",
- "mesmerizes", "mesmerises",
- "metabolize", "metabolise",
- "militarize", "militarise",
- "milliliter", "millilitre",
- "millimeter", "millimetre",
- "minimizing", "minimising",
- "mobilizing", "mobilising",
- "modernized", "modernised",
- "modernizes", "modernises",
- "moisturize", "moisturise",
- "monopolize", "monopolise",
- "moralizing", "moralising",
- "naturalize", "naturalise",
- "neighborly", "neighbourly",
- "neutralize", "neutralise",
- "normalized", "normalised",
- "normalizes", "normalises",
- "optimizing", "optimising",
- "organizers", "organisers",
- "organizing", "organising",
- "orthopedic", "orthopaedic",
- "ostracized", "ostracised",
- "ostracizes", "ostracises",
- "paralyzing", "paralysing",
- "pasteurize", "pasteurise",
- "patronized", "patronised",
- "patronizes", "patronises",
- "pedophiles", "paedophiles",
- "pedophilia", "paedophilia",
- "penalizing", "penalising",
- "plagiarize", "plagiarise",
- "plowshares", "ploughshares",
- "polarizing", "polarising",
- "politicize", "politicise",
- "popularize", "popularise",
- "prioritize", "prioritise",
- "privatized", "privatised",
- "privatizes", "privatises",
- "publicized", "publicised",
- "publicizes", "publicises",
- "pulverized", "pulverised",
- "pulverizes", "pulverises",
- "quarreling", "quarrelling",
- "radicalize", "radicalise",
- "randomized", "randomised",
- "randomizes", "randomises",
- "realizable", "realisable",
- "recognized", "recognised",
- "recognizes", "recognises",
- "regularize", "regularise",
- "remodeling", "remodelling",
- "reorganize", "reorganise",
- "revitalize", "revitalise",
- "rhapsodize", "rhapsodise",
- "ritualized", "ritualised",
- "sanitizing", "sanitising",
- "satirizing", "satirising",
- "scandalize", "scandalise",
- "scrutinize", "scrutinise",
- "secularize", "secularise",
- "sensitized", "sensitised",
- "sensitizes", "sensitises",
- "sepulchers", "sepulchres",
- "serialized", "serialised",
- "serializes", "serialises",
- "sermonized", "sermonised",
- "sermonizes", "sermonises",
- "shriveling", "shrivelling",
- "signalized", "signalised",
- "signalizes", "signalises",
- "skepticism", "scepticism",
- "socialized", "socialised",
- "socializes", "socialises",
- "sodomizing", "sodomising",
- "solemnized", "solemnised",
- "solemnizes", "solemnises",
- "specialize", "specialise",
- "squirreled", "squirrelled",
- "stabilized", "stabilised",
- "stabilizer", "stabiliser",
- "stabilizes", "stabilises",
- "stenciling", "stencilling",
- "sterilized", "sterilised",
- "sterilizer", "steriliser",
- "sterilizes", "sterilises",
- "stigmatize", "stigmatise",
- "subsidized", "subsidised",
- "subsidizer", "subsidiser",
- "subsidizes", "subsidises",
- "summarized", "summarised",
- "summarizes", "summarises",
- "symbolized", "symbolised",
- "symbolizes", "symbolises",
- "sympathize", "sympathise",
- "tantalized", "tantalised",
- "tantalizes", "tantalises",
- "temporized", "temporised",
- "temporizes", "temporises",
- "tenderized", "tenderised",
- "tenderizes", "tenderises",
- "terrorized", "terrorised",
- "terrorizes", "terrorises",
- "theorizing", "theorising",
- "traumatize", "traumatise",
- "trivialize", "trivialise",
- "tyrannized", "tyrannised",
- "tyrannizes", "tyrannises",
- "unionizing", "unionising",
- "unraveling", "unravelling",
- "urbanizing", "urbanising",
- "utilizable", "utilisable",
- "vandalized", "vandalised",
- "vandalizes", "vandalises",
- "vaporizing", "vaporising",
- "verbalized", "verbalised",
- "verbalizes", "verbalises",
- "victimized", "victimised",
- "victimizes", "victimises",
- "visualized", "visualised",
- "visualizes", "visualises",
- "vocalizing", "vocalising",
- "vulcanized", "vulcanised",
- "vulgarized", "vulgarised",
- "vulgarizes", "vulgarises",
- "watercolor", "watercolour",
- "westernize", "westernise",
- "womanizers", "womanisers",
- "womanizing", "womanising",
- "worshiping", "worshipping",
- "agonizing", "agonising",
- "airplanes", "aeroplanes",
- "amortized", "amortised",
- "amortizes", "amortises",
- "analyzing", "analysing",
- "apologize", "apologise",
- "appetizer", "appetiser",
- "artifacts", "artefacts",
- "baptizing", "baptising",
- "bedeviled", "bedevilled",
- "behaviors", "behaviours",
- "bejeweled", "bejewelled",
- "belabored", "belaboured",
- "brutalize", "brutalise",
- "canalized", "canalised",
- "canalizes", "canalises",
- "canonized", "canonised",
- "canonizes", "canonises",
- "carbonize", "carbonise",
- "cataloged", "catalogued",
- "catalyzed", "catalysed",
- "catalyzes", "catalyses",
- "cauterize", "cauterise",
- "channeled", "channelled",
- "checkbook", "chequebook",
- "checkered", "chequered",
- "chiseling", "chiselling",
- "civilized", "civilised",
- "civilizes", "civilises",
- "clamoring", "clamouring",
- "colonized", "colonised",
- "colonizer", "coloniser",
- "colonizes", "colonises",
- "colorants", "colourants",
- "colorized", "colourized",
- "colorizes", "colourizes",
- "colorless", "colourless",
- "councilor", "councillor",
- "counseled", "counselled",
- "counselor", "counsellor",
- "criticize", "criticise",
- "cudgeling", "cudgelling",
- "customize", "customise",
- "demonized", "demonised",
- "demonizes", "demonises",
- "deodorize", "deodorise",
- "deputized", "deputised",
- "deputizes", "deputises",
- "digitized", "digitised",
- "digitizes", "digitises",
- "discolors", "discolours",
- "dishonors", "dishonours",
- "dramatize", "dramatise",
- "driveling", "drivelling",
- "economize", "economise",
- "empathize", "empathise",
- "emphasize", "emphasise",
- "enameling", "enamelling",
- "endeavors", "endeavours",
- "energized", "energised",
- "energizes", "energises",
- "enthralls", "enthrals",
- "epicenter", "epicentre",
- "epitomize", "epitomise",
- "equalized", "equalised",
- "equalizer", "equaliser",
- "equalizes", "equalises",
- "eulogized", "eulogised",
- "eulogizes", "eulogises",
- "factorize", "factorise",
- "fantasize", "fantasise",
- "favorable", "favourable",
- "favorably", "favourably",
- "favorites", "favourites",
- "feminized", "feminised",
- "feminizes", "feminises",
- "fertilize", "fertilise",
- "finalized", "finalised",
- "finalizes", "finalises",
- "flavoring", "flavouring",
- "formalize", "formalise",
- "fossilize", "fossilise",
- "funneling", "funnelling",
- "galvanize", "galvanise",
- "gamboling", "gambolling",
- "ghettoize", "ghettoise",
- "globalize", "globalise",
- "gonorrhea", "gonorrhoea",
- "groveling", "grovelling",
- "harboring", "harbouring",
- "harmonize", "harmonise",
- "honorably", "honourably",
- "humanized", "humanised",
- "humanizes", "humanises",
- "hybridize", "hybridise",
- "hypnotize", "hypnotise",
- "idealized", "idealised",
- "idealizes", "idealises",
- "idolizing", "idolising",
- "immunized", "immunised",
- "immunizes", "immunises",
- "impaneled", "impanelled",
- "imperiled", "imperilled",
- "initialed", "initialled",
- "italicize", "italicise",
- "itemizing", "itemising",
- "kilometer", "kilometre",
- "legalized", "legalised",
- "legalizes", "legalises",
- "lionizing", "lionising",
- "liquidize", "liquidise",
- "localized", "localised",
- "localizes", "localises",
- "magnetize", "magnetise",
- "maneuvers", "manoeuvres",
- "marshaled", "marshalled",
- "marveling", "marvelling",
- "marvelous", "marvellous",
- "maximized", "maximised",
- "maximizes", "maximises",
- "mechanize", "mechanise",
- "memorized", "memorised",
- "memorizes", "memorises",
- "mesmerize", "mesmerise",
- "minimized", "minimised",
- "minimizes", "minimises",
- "mobilized", "mobilised",
- "mobilizes", "mobilises",
- "modernize", "modernise",
- "moldering", "mouldering",
- "moralized", "moralised",
- "moralizes", "moralises",
- "motorized", "motorised",
- "mustached", "moustached",
- "mustaches", "moustaches",
- "neighbors", "neighbours",
- "normalize", "normalise",
- "optimized", "optimised",
- "optimizes", "optimises",
- "organized", "organised",
- "organizer", "organiser",
- "organizes", "organises",
- "ostracize", "ostracise",
- "oxidizing", "oxidising",
- "panelists", "panellists",
- "paralyzed", "paralysed",
- "paralyzes", "paralyses",
- "parceling", "parcelling",
- "patronize", "patronise",
- "pedophile", "paedophile",
- "penalized", "penalised",
- "penalizes", "penalises",
- "penciling", "pencilling",
- "plowshare", "ploughshare",
- "polarized", "polarised",
- "polarizes", "polarises",
- "practiced", "practised",
- "pretenses", "pretences",
- "privatize", "privatise",
- "publicize", "publicise",
- "pulverize", "pulverise",
- "quarreled", "quarrelled",
- "randomize", "randomise",
- "realizing", "realising",
- "recognize", "recognise",
- "refueling", "refuelling",
- "remodeled", "remodelled",
- "remolding", "remoulding",
- "saltpeter", "saltpetre",
- "sanitized", "sanitised",
- "sanitizes", "sanitises",
- "satirized", "satirised",
- "satirizes", "satirises",
- "sensitize", "sensitise",
- "sepulcher", "sepulchre",
- "serialize", "serialise",
- "sermonize", "sermonise",
- "shoveling", "shovelling",
- "shriveled", "shrivelled",
- "signaling", "signalling",
- "signalize", "signalise",
- "skeptical", "sceptical",
- "sniveling", "snivelling",
- "snorkeled", "snorkelled",
- "socialize", "socialise",
- "sodomized", "sodomised",
- "sodomizes", "sodomises",
- "solemnize", "solemnise",
- "spiraling", "spiralling",
- "splendors", "splendours",
- "stabilize", "stabilise",
- "stenciled", "stencilled",
- "sterilize", "sterilise",
- "subsidize", "subsidise",
- "succoring", "succouring",
- "sulfurous", "sulphurous",
- "summarize", "summarise",
- "swiveling", "swivelling",
- "symbolize", "symbolise",
- "tantalize", "tantalise",
- "temporize", "temporise",
- "tenderize", "tenderise",
- "terrorize", "terrorise",
- "theorized", "theorised",
- "theorizes", "theorises",
- "travelers", "travellers",
- "traveling", "travelling",
- "tricolors", "tricolours",
- "tunneling", "tunnelling",
- "tyrannize", "tyrannise",
- "unequaled", "unequalled",
- "unionized", "unionised",
- "unionizes", "unionises",
- "unraveled", "unravelled",
- "unrivaled", "unrivalled",
- "urbanized", "urbanised",
- "urbanizes", "urbanises",
- "utilizing", "utilising",
- "vandalize", "vandalise",
- "vaporized", "vaporised",
- "vaporizes", "vaporises",
- "verbalize", "verbalise",
- "victimize", "victimise",
- "visualize", "visualise",
- "vocalized", "vocalised",
- "vocalizes", "vocalises",
- "vulgarize", "vulgarise",
- "weaseling", "weaselling",
- "womanized", "womanised",
- "womanizer", "womaniser",
- "womanizes", "womanises",
- "worshiped", "worshipped",
- "worshiper", "worshipper",
- "agonized", "agonised",
- "agonizes", "agonises",
- "airplane", "aeroplane",
- "aluminum", "aluminium",
- "amortize", "amortise",
- "analyzed", "analysed",
- "analyzes", "analyses",
- "armorers", "armourers",
- "armories", "armouries",
- "artifact", "artefact",
- "baptized", "baptised",
- "baptizes", "baptises",
- "behavior", "behaviour",
- "behooved", "behoved",
- "behooves", "behoves",
- "belabors", "belabours",
- "calibers", "calibres",
- "canalize", "canalise",
- "canonize", "canonise",
- "catalogs", "catalogues",
- "catalyze", "catalyse",
- "caviling", "cavilling",
- "centered", "centred",
- "chiseled", "chiselled",
- "civilize", "civilise",
- "clamored", "clamoured",
- "colonize", "colonise",
- "colorant", "colourant",
- "coloreds", "coloureds",
- "colorful", "colourful",
- "coloring", "colouring",
- "colorize", "colourize",
- "coziness", "cosiness",
- "cruelest", "cruellest",
- "cudgeled", "cudgelled",
- "defenses", "defences",
- "demeanor", "demeanour",
- "demonize", "demonise",
- "deputize", "deputise",
- "diarrhea", "diarrhoea",
- "digitize", "digitise",
- "disfavor", "disfavour",
- "dishonor", "dishonour",
- "distills", "distils",
- "driveled", "drivelled",
- "enameled", "enamelled",
- "enamored", "enamoured",
- "endeavor", "endeavour",
- "energize", "energise",
- "epaulets", "epaulettes",
- "equalize", "equalise",
- "estrogen", "oestrogen",
- "etiology", "aetiology",
- "eulogize", "eulogise",
- "favoring", "favouring",
- "favorite", "favourite",
- "feminize", "feminise",
- "finalize", "finalise",
- "flavored", "flavoured",
- "flutists", "flautists",
- "fulfills", "fulfils",
- "funneled", "funnelled",
- "gamboled", "gambolled",
- "graveled", "gravelled",
- "groveled", "grovelled",
- "grueling", "gruelling",
- "harbored", "harboured",
- "honoring", "honouring",
- "humanize", "humanise",
- "humoring", "humouring",
- "idealize", "idealise",
- "idolized", "idolised",
- "idolizes", "idolises",
- "immunize", "immunise",
- "ionizing", "ionising",
- "itemized", "itemised",
- "itemizes", "itemises",
- "jewelers", "jewellers",
- "labeling", "labelling",
- "laborers", "labourers",
- "laboring", "labouring",
- "legalize", "legalise",
- "leukemia", "leukaemia",
- "levelers", "levellers",
- "leveling", "levelling",
- "libeling", "libelling",
- "libelous", "libellous",
- "lionized", "lionised",
- "lionizes", "lionises",
- "localize", "localise",
- "louvered", "louvred",
- "maneuver", "manoeuvre",
- "marveled", "marvelled",
- "maximize", "maximise",
- "memorize", "memorise",
- "minimize", "minimise",
- "mobilize", "mobilise",
- "modelers", "modellers",
- "modeling", "modelling",
- "moldered", "mouldered",
- "moldiest", "mouldiest",
- "moldings", "mouldings",
- "moralize", "moralise",
- "mustache", "moustache",
- "neighbor", "neighbour",
- "odorless", "odourless",
- "offenses", "offences",
- "optimize", "optimise",
- "organize", "organise",
- "oxidized", "oxidised",
- "oxidizes", "oxidises",
- "paneling", "panelling",
- "panelist", "panellist",
- "paralyze", "paralyse",
- "parceled", "parcelled",
- "pedaling", "pedalling",
- "penalize", "penalise",
- "penciled", "pencilled",
- "polarize", "polarise",
- "pretense", "pretence",
- "pummeled", "pummelling",
- "raveling", "ravelling",
- "realized", "realised",
- "realizes", "realises",
- "refueled", "refuelled",
- "remolded", "remoulded",
- "revelers", "revellers",
- "reveling", "revelling",
- "rivaling", "rivalling",
- "sanitize", "sanitise",
- "satirize", "satirise",
- "savories", "savouries",
- "savoring", "savouring",
- "scepters", "sceptres",
- "shoveled", "shovelled",
- "signaled", "signalled",
- "skeptics", "sceptics",
- "sniveled", "snivelled",
- "sodomize", "sodomise",
- "specters", "spectres",
- "spiraled", "spiralled",
- "splendor", "splendour",
- "succored", "succoured",
- "sulfates", "sulphates",
- "sulfides", "sulphides",
- "swiveled", "swivelled",
- "tasseled", "tasselled",
- "theaters", "theatres",
- "theorize", "theorise",
- "toweling", "towelling",
- "traveler", "traveller",
- "trialing", "trialling",
- "tricolor", "tricolour",
- "tunneled", "tunnelled",
- "unionize", "unionise",
- "unsavory", "unsavoury",
- "urbanize", "urbanise",
- "utilized", "utilised",
- "utilizes", "utilises",
- "vaporize", "vaporise",
- "vocalize", "vocalise",
- "weaseled", "weaselled",
- "womanize", "womanise",
- "yodeling", "yodelling",
- "agonize", "agonise",
- "analyze", "analyse",
- "appalls", "appals",
- "armored", "armoured",
- "armorer", "armourer",
- "baptize", "baptise",
- "behoove", "behove",
- "belabor", "belabour",
- "beveled", "bevelled",
- "caliber", "calibre",
- "caroled", "carolled",
- "caviled", "cavilled",
- "centers", "centres",
- "clamors", "clamours",
- "clangor", "clangour",
- "colored", "coloured",
- "coziest", "cosiest",
- "crueler", "crueller",
- "defense", "defence",
- "dialing", "dialling",
- "dialogs", "dialogues",
- "distill", "distil",
- "dueling", "duelling",
- "enrolls", "enrols",
- "epaulet", "epaulette",
- "favored", "favoured",
- "flavors", "flavours",
- "flutist", "flautist",
- "fueling", "fuelling",
- "fulfill", "fulfil",
- "goiters", "goitres",
- "harbors", "harbours",
- "honored", "honoured",
- "humored", "humoured",
- "idolize", "idolise",
- "ionized", "ionised",
- "ionizes", "ionises",
- "itemize", "itemise",
- "jeweled", "jewelled",
- "jeweler", "jeweller",
- "jewelry", "jewellery",
- "labeled", "labelled",
- "labored", "laboured",
- "laborer", "labourer",
- "leveled", "levelled",
- "leveler", "leveller",
- "libeled", "libelled",
- "lionize", "lionise",
- "louvers", "louvres",
- "modeled", "modelled",
- "modeler", "modeller",
- "molders", "moulders",
- "moldier", "mouldier",
- "molding", "moulding",
- "molting", "moulting",
- "offense", "offence",
- "oxidize", "oxidise",
- "pajamas", "pyjamas",
- "paneled", "panelled",
- "parlors", "parlours",
- "pedaled", "pedalled",
- "plowing", "ploughing",
- "plowman", "ploughman",
- "plowmen", "ploughmen",
- "realize", "realise",
- "remolds", "remoulds",
- "reveled", "revelled",
- "reveler", "reveller",
- "rivaled", "rivalled",
- "rumored", "rumoured",
- "saviors", "saviours",
- "savored", "savoured",
- "scepter", "sceptre",
- "skeptic", "sceptic",
- "specter", "spectre",
- "succors", "succours",
- "sulfate", "sulphate",
- "sulfide", "sulphide",
- "theater", "theatre",
- "toweled", "towelled",
- "toxemia", "toxaemia",
- "trialed", "trialled",
- "utilize", "utilise",
- "yodeled", "yodelled",
- "anemia", "anaemia",
- "anemic", "anaemic",
- "appall", "appal",
- "arbors", "arbours",
- "armory", "armoury",
- "candor", "candour",
- "center", "centre",
- "clamor", "clamour",
- "colors", "colours",
- "cozier", "cosier",
- "cozies", "cosies",
- "cozily", "cosily",
- "dialed", "dialled",
- "drafty", "draughty",
- "dueled", "duelled",
- "favors", "favours",
- "fervor", "fervour",
- "fibers", "fibres",
- "flavor", "flavour",
- "fueled", "fuelled",
- "goiter", "goitre",
- "harbor", "harbour",
- "honors", "honours",
- "humors", "humours",
- "labors", "labours",
- "liters", "litres",
- "louver", "louvre",
- "luster", "lustre",
- "meager", "meagre",
- "miters", "mitres",
- "molded", "moulded",
- "molder", "moulder",
- "molted", "moulted",
- "pajama", "pyjama",
- "parlor", "parlour",
- "plowed", "ploughed",
- "rancor", "rancour",
- "remold", "remould",
- "rigors", "rigours",
- "rumors", "rumours",
- "savors", "savours",
- "savory", "savoury",
- "succor", "succour",
- "tumors", "tumours",
- "vapors", "vapours",
- "aging", "ageing",
- "arbor", "arbour",
- "ardor", "ardour",
- "armor", "armour",
- "chili", "chilli",
- "color", "colour",
- "edema", "edoema",
- "favor", "favour",
- "fecal", "faecal",
- "feces", "faeces",
- "fiber", "fibre",
- "honor", "honour",
- "humor", "humour",
- "labor", "labour",
- "liter", "litre",
- "miter", "mitre",
- "molds", "moulds",
- "moldy", "mouldy",
- "molts", "moults",
- "odors", "odours",
- "plows", "ploughs",
- "rigor", "rigour",
- "rumor", "rumour",
- "savor", "savour",
- "valor", "valour",
- "vapor", "vapour",
- "vigor", "vigour",
- "cozy", "cosy",
- "mold", "mould",
- "molt", "moult",
- "odor", "odour",
- "plow", "plough",
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/asmdecl.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/asmdecl.go
deleted file mode 100644
index d543b2ee5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/asmdecl.go
+++ /dev/null
@@ -1,682 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Identify mismatches between assembly files and Go func declarations.
-
-package main
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/token"
- "regexp"
- "strconv"
- "strings"
-)
-
-// 'kind' is a kind of assembly variable.
-// The kinds 1, 2, 4, 8 stand for values of that size.
-type asmKind int
-
-// These special kinds are not valid sizes.
-const (
- asmString asmKind = 100 + iota
- asmSlice
- asmInterface
- asmEmptyInterface
-)
-
-// An asmArch describes assembly parameters for an architecture
-type asmArch struct {
- name string
- ptrSize int
- intSize int
- maxAlign int
- bigEndian bool
- stack string
- lr bool
-}
-
-// An asmFunc describes the expected variables for a function on a given architecture.
-type asmFunc struct {
- arch *asmArch
- size int // size of all arguments
- vars map[string]*asmVar
- varByOffset map[int]*asmVar
-}
-
-// An asmVar describes a single assembly variable.
-type asmVar struct {
- name string
- kind asmKind
- typ string
- off int
- size int
- inner []*asmVar
-}
-
-var (
- asmArch386 = asmArch{"386", 4, 4, 4, false, "SP", false}
- asmArchArm = asmArch{"arm", 4, 4, 4, false, "R13", true}
- asmArchArm64 = asmArch{"arm64", 8, 8, 8, false, "RSP", true}
- asmArchAmd64 = asmArch{"amd64", 8, 8, 8, false, "SP", false}
- asmArchAmd64p32 = asmArch{"amd64p32", 4, 4, 8, false, "SP", false}
- asmArchMips64 = asmArch{"mips64", 8, 8, 8, true, "R29", true}
- asmArchMips64LE = asmArch{"mips64", 8, 8, 8, false, "R29", true}
- asmArchPpc64 = asmArch{"ppc64", 8, 8, 8, true, "R1", true}
- asmArchPpc64LE = asmArch{"ppc64le", 8, 8, 8, false, "R1", true}
-
- arches = []*asmArch{
- &asmArch386,
- &asmArchArm,
- &asmArchArm64,
- &asmArchAmd64,
- &asmArchAmd64p32,
- &asmArchMips64,
- &asmArchMips64LE,
- &asmArchPpc64,
- &asmArchPpc64LE,
- }
-)
-
-var (
- re = regexp.MustCompile
- asmPlusBuild = re(`//\s+\+build\s+([^\n]+)`)
- asmTEXT = re(`\bTEXT\b.*·([^\(]+)\(SB\)(?:\s*,\s*([0-9A-Z|+]+))?(?:\s*,\s*\$(-?[0-9]+)(?:-([0-9]+))?)?`)
- asmDATA = re(`\b(DATA|GLOBL)\b`)
- asmNamedFP = re(`([a-zA-Z0-9_\xFF-\x{10FFFF}]+)(?:\+([0-9]+))\(FP\)`)
- asmUnnamedFP = re(`[^+\-0-9](([0-9]+)\(FP\))`)
- asmSP = re(`[^+\-0-9](([0-9]+)\(([A-Z0-9]+)\))`)
- asmOpcode = re(`^\s*(?:[A-Z0-9a-z_]+:)?\s*([A-Z]+)\s*([^,]*)(?:,\s*(.*))?`)
- ppc64Suff = re(`([BHWD])(ZU|Z|U|BR)?$`)
-)
-
-func asmCheck(pkg *Package) {
- if !vet("asmdecl") {
- return
- }
-
- // No work if no assembly files.
- if !pkg.hasFileWithSuffix(".s") {
- return
- }
-
- // Gather declarations. knownFunc[name][arch] is func description.
- knownFunc := make(map[string]map[string]*asmFunc)
-
- for _, f := range pkg.files {
- if f.file != nil {
- for _, decl := range f.file.Decls {
- if decl, ok := decl.(*ast.FuncDecl); ok && decl.Body == nil {
- knownFunc[decl.Name.Name] = f.asmParseDecl(decl)
- }
- }
- }
- }
-
-Files:
- for _, f := range pkg.files {
- if !strings.HasSuffix(f.name, ".s") {
- continue
- }
- Println("Checking file", f.name)
-
- // Determine architecture from file name if possible.
- var arch string
- var archDef *asmArch
- for _, a := range arches {
- if strings.HasSuffix(f.name, "_"+a.name+".s") {
- arch = a.name
- archDef = a
- break
- }
- }
-
- lines := strings.SplitAfter(string(f.content), "\n")
- var (
- fn *asmFunc
- fnName string
- localSize, argSize int
- wroteSP bool
- haveRetArg bool
- retLine []int
- )
-
- flushRet := func() {
- if fn != nil && fn.vars["ret"] != nil && !haveRetArg && len(retLine) > 0 {
- v := fn.vars["ret"]
- for _, line := range retLine {
- f.Badf(token.NoPos, "%s:%d: [%s] %s: RET without writing to %d-byte ret+%d(FP)", f.name, line, arch, fnName, v.size, v.off)
- }
- }
- retLine = nil
- }
- for lineno, line := range lines {
- lineno++
-
- badf := func(format string, args ...interface{}) {
- f.Badf(token.NoPos, "%s:%d: [%s] %s: %s", f.name, lineno, arch, fnName, fmt.Sprintf(format, args...))
- }
-
- if arch == "" {
- // Determine architecture from +build line if possible.
- if m := asmPlusBuild.FindStringSubmatch(line); m != nil {
- Fields:
- for _, fld := range strings.Fields(m[1]) {
- for _, a := range arches {
- if a.name == fld {
- arch = a.name
- archDef = a
- break Fields
- }
- }
- }
- }
- }
-
- if m := asmTEXT.FindStringSubmatch(line); m != nil {
- flushRet()
- if arch == "" {
- f.Warnf(token.NoPos, "%s: cannot determine architecture for assembly file", f.name)
- continue Files
- }
- fnName = m[1]
- fn = knownFunc[m[1]][arch]
- if fn != nil {
- size, _ := strconv.Atoi(m[4])
- if size != fn.size && (m[2] != "7" && !strings.Contains(m[2], "NOSPLIT") || size != 0) {
- badf("wrong argument size %d; expected $...-%d", size, fn.size)
- }
- }
- localSize, _ = strconv.Atoi(m[3])
- localSize += archDef.intSize
- if archDef.lr {
- // Account for caller's saved LR
- localSize += archDef.intSize
- }
- argSize, _ = strconv.Atoi(m[4])
- if fn == nil && !strings.Contains(fnName, "<>") {
- badf("function %s missing Go declaration", fnName)
- }
- wroteSP = false
- haveRetArg = false
- continue
- } else if strings.Contains(line, "TEXT") && strings.Contains(line, "SB") {
- // function, but not visible from Go (didn't match asmTEXT), so stop checking
- flushRet()
- fn = nil
- fnName = ""
- continue
- }
-
- if strings.Contains(line, "RET") {
- retLine = append(retLine, lineno)
- }
-
- if fnName == "" {
- continue
- }
-
- if asmDATA.FindStringSubmatch(line) != nil {
- fn = nil
- }
-
- if archDef == nil {
- continue
- }
-
- if strings.Contains(line, ", "+archDef.stack) || strings.Contains(line, ",\t"+archDef.stack) {
- wroteSP = true
- continue
- }
-
- for _, m := range asmSP.FindAllStringSubmatch(line, -1) {
- if m[3] != archDef.stack || wroteSP {
- continue
- }
- off := 0
- if m[1] != "" {
- off, _ = strconv.Atoi(m[2])
- }
- if off >= localSize {
- if fn != nil {
- v := fn.varByOffset[off-localSize]
- if v != nil {
- badf("%s should be %s+%d(FP)", m[1], v.name, off-localSize)
- continue
- }
- }
- if off >= localSize+argSize {
- badf("use of %s points beyond argument frame", m[1])
- continue
- }
- badf("use of %s to access argument frame", m[1])
- }
- }
-
- if fn == nil {
- continue
- }
-
- for _, m := range asmUnnamedFP.FindAllStringSubmatch(line, -1) {
- off, _ := strconv.Atoi(m[2])
- v := fn.varByOffset[off]
- if v != nil {
- badf("use of unnamed argument %s; offset %d is %s+%d(FP)", m[1], off, v.name, v.off)
- } else {
- badf("use of unnamed argument %s", m[1])
- }
- }
-
- for _, m := range asmNamedFP.FindAllStringSubmatch(line, -1) {
- name := m[1]
- off := 0
- if m[2] != "" {
- off, _ = strconv.Atoi(m[2])
- }
- if name == "ret" || strings.HasPrefix(name, "ret_") {
- haveRetArg = true
- }
- v := fn.vars[name]
- if v == nil {
- // Allow argframe+0(FP).
- if name == "argframe" && off == 0 {
- continue
- }
- v = fn.varByOffset[off]
- if v != nil {
- badf("unknown variable %s; offset %d is %s+%d(FP)", name, off, v.name, v.off)
- } else {
- badf("unknown variable %s", name)
- }
- continue
- }
- asmCheckVar(badf, fn, line, m[0], off, v)
- }
- }
- flushRet()
- }
-}
-
-// asmParseDecl parses a function decl for expected assembly variables.
-func (f *File) asmParseDecl(decl *ast.FuncDecl) map[string]*asmFunc {
- var (
- arch *asmArch
- fn *asmFunc
- offset int
- failed bool
- )
-
- addVar := func(outer string, v asmVar) {
- if vo := fn.vars[outer]; vo != nil {
- vo.inner = append(vo.inner, &v)
- }
- fn.vars[v.name] = &v
- for i := 0; i < v.size; i++ {
- fn.varByOffset[v.off+i] = &v
- }
- }
-
- addParams := func(list []*ast.Field) {
- for i, fld := range list {
- // Determine alignment, size, and kind of type in declaration.
- var align, size int
- var kind asmKind
- names := fld.Names
- typ := f.gofmt(fld.Type)
- switch t := fld.Type.(type) {
- default:
- switch typ {
- default:
- f.Warnf(fld.Type.Pos(), "unknown assembly argument type %s", typ)
- failed = true
- return
- case "int8", "uint8", "byte", "bool":
- size = 1
- case "int16", "uint16":
- size = 2
- case "int32", "uint32", "float32":
- size = 4
- case "int64", "uint64", "float64":
- align = arch.maxAlign
- size = 8
- case "int", "uint":
- size = arch.intSize
- case "uintptr", "iword", "Word", "Errno", "unsafe.Pointer":
- size = arch.ptrSize
- case "string", "ErrorString":
- size = arch.ptrSize * 2
- align = arch.ptrSize
- kind = asmString
- }
- case *ast.ChanType, *ast.FuncType, *ast.MapType, *ast.StarExpr:
- size = arch.ptrSize
- case *ast.InterfaceType:
- align = arch.ptrSize
- size = 2 * arch.ptrSize
- if len(t.Methods.List) > 0 {
- kind = asmInterface
- } else {
- kind = asmEmptyInterface
- }
- case *ast.ArrayType:
- if t.Len == nil {
- size = arch.ptrSize + 2*arch.intSize
- align = arch.ptrSize
- kind = asmSlice
- break
- }
- f.Warnf(fld.Type.Pos(), "unsupported assembly argument type %s", typ)
- failed = true
- case *ast.StructType:
- f.Warnf(fld.Type.Pos(), "unsupported assembly argument type %s", typ)
- failed = true
- }
- if align == 0 {
- align = size
- }
- if kind == 0 {
- kind = asmKind(size)
- }
- offset += -offset & (align - 1)
-
- // Create variable for each name being declared with this type.
- if len(names) == 0 {
- name := "unnamed"
- if decl.Type.Results != nil && len(decl.Type.Results.List) > 0 && &list[0] == &decl.Type.Results.List[0] && i == 0 {
- // Assume assembly will refer to single unnamed result as r.
- name = "ret"
- }
- names = []*ast.Ident{{Name: name}}
- }
- for _, id := range names {
- name := id.Name
- addVar("", asmVar{
- name: name,
- kind: kind,
- typ: typ,
- off: offset,
- size: size,
- })
- switch kind {
- case 8:
- if arch.ptrSize == 4 {
- w1, w2 := "lo", "hi"
- if arch.bigEndian {
- w1, w2 = w2, w1
- }
- addVar(name, asmVar{
- name: name + "_" + w1,
- kind: 4,
- typ: "half " + typ,
- off: offset,
- size: 4,
- })
- addVar(name, asmVar{
- name: name + "_" + w2,
- kind: 4,
- typ: "half " + typ,
- off: offset + 4,
- size: 4,
- })
- }
-
- case asmEmptyInterface:
- addVar(name, asmVar{
- name: name + "_type",
- kind: asmKind(arch.ptrSize),
- typ: "interface type",
- off: offset,
- size: arch.ptrSize,
- })
- addVar(name, asmVar{
- name: name + "_data",
- kind: asmKind(arch.ptrSize),
- typ: "interface data",
- off: offset + arch.ptrSize,
- size: arch.ptrSize,
- })
-
- case asmInterface:
- addVar(name, asmVar{
- name: name + "_itable",
- kind: asmKind(arch.ptrSize),
- typ: "interface itable",
- off: offset,
- size: arch.ptrSize,
- })
- addVar(name, asmVar{
- name: name + "_data",
- kind: asmKind(arch.ptrSize),
- typ: "interface data",
- off: offset + arch.ptrSize,
- size: arch.ptrSize,
- })
-
- case asmSlice:
- addVar(name, asmVar{
- name: name + "_base",
- kind: asmKind(arch.ptrSize),
- typ: "slice base",
- off: offset,
- size: arch.ptrSize,
- })
- addVar(name, asmVar{
- name: name + "_len",
- kind: asmKind(arch.intSize),
- typ: "slice len",
- off: offset + arch.ptrSize,
- size: arch.intSize,
- })
- addVar(name, asmVar{
- name: name + "_cap",
- kind: asmKind(arch.intSize),
- typ: "slice cap",
- off: offset + arch.ptrSize + arch.intSize,
- size: arch.intSize,
- })
-
- case asmString:
- addVar(name, asmVar{
- name: name + "_base",
- kind: asmKind(arch.ptrSize),
- typ: "string base",
- off: offset,
- size: arch.ptrSize,
- })
- addVar(name, asmVar{
- name: name + "_len",
- kind: asmKind(arch.intSize),
- typ: "string len",
- off: offset + arch.ptrSize,
- size: arch.intSize,
- })
- }
- offset += size
- }
- }
- }
-
- m := make(map[string]*asmFunc)
- for _, arch = range arches {
- fn = &asmFunc{
- arch: arch,
- vars: make(map[string]*asmVar),
- varByOffset: make(map[int]*asmVar),
- }
- offset = 0
- addParams(decl.Type.Params.List)
- if decl.Type.Results != nil && len(decl.Type.Results.List) > 0 {
- offset += -offset & (arch.maxAlign - 1)
- addParams(decl.Type.Results.List)
- }
- fn.size = offset
- m[arch.name] = fn
- }
-
- if failed {
- return nil
- }
- return m
-}
-
-// asmCheckVar checks a single variable reference.
-func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr string, off int, v *asmVar) {
- m := asmOpcode.FindStringSubmatch(line)
- if m == nil {
- if !strings.HasPrefix(strings.TrimSpace(line), "//") {
- badf("cannot find assembly opcode")
- }
- return
- }
-
- // Determine operand sizes from instruction.
- // Typically the suffix suffices, but there are exceptions.
- var src, dst, kind asmKind
- op := m[1]
- switch fn.arch.name + "." + op {
- case "386.FMOVLP":
- src, dst = 8, 4
- case "arm.MOVD":
- src = 8
- case "arm.MOVW":
- src = 4
- case "arm.MOVH", "arm.MOVHU":
- src = 2
- case "arm.MOVB", "arm.MOVBU":
- src = 1
- // LEA* opcodes don't really read the second arg.
- // They just take the address of it.
- case "386.LEAL":
- dst = 4
- case "amd64.LEAQ":
- dst = 8
- case "amd64p32.LEAL":
- dst = 4
- default:
- switch fn.arch.name {
- case "386", "amd64":
- if strings.HasPrefix(op, "F") && (strings.HasSuffix(op, "D") || strings.HasSuffix(op, "DP")) {
- // FMOVDP, FXCHD, etc
- src = 8
- break
- }
- if strings.HasPrefix(op, "P") && strings.HasSuffix(op, "RD") {
- // PINSRD, PEXTRD, etc
- src = 4
- break
- }
- if strings.HasPrefix(op, "F") && (strings.HasSuffix(op, "F") || strings.HasSuffix(op, "FP")) {
- // FMOVFP, FXCHF, etc
- src = 4
- break
- }
- if strings.HasSuffix(op, "SD") {
- // MOVSD, SQRTSD, etc
- src = 8
- break
- }
- if strings.HasSuffix(op, "SS") {
- // MOVSS, SQRTSS, etc
- src = 4
- break
- }
- if strings.HasPrefix(op, "SET") {
- // SETEQ, etc
- src = 1
- break
- }
- switch op[len(op)-1] {
- case 'B':
- src = 1
- case 'W':
- src = 2
- case 'L':
- src = 4
- case 'D', 'Q':
- src = 8
- }
- case "ppc64", "ppc64le":
- // Strip standard suffixes to reveal size letter.
- m := ppc64Suff.FindStringSubmatch(op)
- if m != nil {
- switch m[1][0] {
- case 'B':
- src = 1
- case 'H':
- src = 2
- case 'W':
- src = 4
- case 'D':
- src = 8
- }
- }
- case "mips64", "mips64le":
- switch op {
- case "MOVB", "MOVBU":
- src = 1
- case "MOVH", "MOVHU":
- src = 2
- case "MOVW", "MOVWU", "MOVF":
- src = 4
- case "MOVV", "MOVD":
- src = 8
- }
- }
- }
- if dst == 0 {
- dst = src
- }
-
- // Determine whether the match we're holding
- // is the first or second argument.
- if strings.Index(line, expr) > strings.Index(line, ",") {
- kind = dst
- } else {
- kind = src
- }
-
- vk := v.kind
- vt := v.typ
- switch vk {
- case asmInterface, asmEmptyInterface, asmString, asmSlice:
- // allow reference to first word (pointer)
- vk = v.inner[0].kind
- vt = v.inner[0].typ
- }
-
- if off != v.off {
- var inner bytes.Buffer
- for i, vi := range v.inner {
- if len(v.inner) > 1 {
- fmt.Fprintf(&inner, ",")
- }
- fmt.Fprintf(&inner, " ")
- if i == len(v.inner)-1 {
- fmt.Fprintf(&inner, "or ")
- }
- fmt.Fprintf(&inner, "%s+%d(FP)", vi.name, vi.off)
- }
- badf("invalid offset %s; expected %s+%d(FP)%s", expr, v.name, v.off, inner.String())
- return
- }
- if kind != 0 && kind != vk {
- var inner bytes.Buffer
- if len(v.inner) > 0 {
- fmt.Fprintf(&inner, " containing")
- for i, vi := range v.inner {
- if i > 0 && len(v.inner) > 2 {
- fmt.Fprintf(&inner, ",")
- }
- fmt.Fprintf(&inner, " ")
- if i > 0 && i == len(v.inner)-1 {
- fmt.Fprintf(&inner, "and ")
- }
- fmt.Fprintf(&inner, "%s+%d(FP)", vi.name, vi.off)
- }
- }
- badf("invalid %s of %s; %s is %d-byte value%s", op, expr, vt, vk, inner.String())
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/assign.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/assign.go
deleted file mode 100644
index 54c1ae1fd..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/assign.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-This file contains the code to check for useless assignments.
-*/
-
-package main
-
-import (
- "go/ast"
- "go/token"
- "reflect"
-)
-
-func init() {
- register("assign",
- "check for useless assignments",
- checkAssignStmt,
- assignStmt)
-}
-
-// TODO: should also check for assignments to struct fields inside methods
-// that are on T instead of *T.
-
-// checkAssignStmt checks for assignments of the form " = ".
-// These are almost always useless, and even when they aren't they are usually a mistake.
-func checkAssignStmt(f *File, node ast.Node) {
- stmt := node.(*ast.AssignStmt)
- if stmt.Tok != token.ASSIGN {
- return // ignore :=
- }
- if len(stmt.Lhs) != len(stmt.Rhs) {
- // If LHS and RHS have different cardinality, they can't be the same.
- return
- }
- for i, lhs := range stmt.Lhs {
- rhs := stmt.Rhs[i]
- if reflect.TypeOf(lhs) != reflect.TypeOf(rhs) {
- continue // short-circuit the heavy-weight gofmt check
- }
- le := f.gofmt(lhs)
- re := f.gofmt(rhs)
- if le == re {
- f.Badf(stmt.Pos(), "self-assignment of %s to %s", re, le)
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/atomic.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/atomic.go
deleted file mode 100644
index b2ca2d80f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/atomic.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "go/token"
-)
-
-func init() {
- register("atomic",
- "check for common mistaken usages of the sync/atomic package",
- checkAtomicAssignment,
- assignStmt)
-}
-
-// checkAtomicAssignment walks the assignment statement checking for common
-// mistaken usage of atomic package, such as: x = atomic.AddUint64(&x, 1)
-func checkAtomicAssignment(f *File, node ast.Node) {
- n := node.(*ast.AssignStmt)
- if len(n.Lhs) != len(n.Rhs) {
- return
- }
- if len(n.Lhs) == 1 && n.Tok == token.DEFINE {
- return
- }
-
- for i, right := range n.Rhs {
- call, ok := right.(*ast.CallExpr)
- if !ok {
- continue
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- continue
- }
- pkg, ok := sel.X.(*ast.Ident)
- if !ok || pkg.Name != "atomic" {
- continue
- }
-
- switch sel.Sel.Name {
- case "AddInt32", "AddInt64", "AddUint32", "AddUint64", "AddUintptr":
- f.checkAtomicAddAssignment(n.Lhs[i], call)
- }
- }
-}
-
-// checkAtomicAddAssignment walks the atomic.Add* method calls checking for assigning the return value
-// to the same variable being used in the operation
-func (f *File) checkAtomicAddAssignment(left ast.Expr, call *ast.CallExpr) {
- if len(call.Args) != 2 {
- return
- }
- arg := call.Args[0]
- broken := false
-
- if uarg, ok := arg.(*ast.UnaryExpr); ok && uarg.Op == token.AND {
- broken = f.gofmt(left) == f.gofmt(uarg.X)
- } else if star, ok := left.(*ast.StarExpr); ok {
- broken = f.gofmt(star.X) == f.gofmt(arg)
- }
-
- if broken {
- f.Bad(left.Pos(), "direct assignment to atomic value")
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/bool.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/bool.go
deleted file mode 100644
index 07c2a93df..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/bool.go
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains boolean condition tests.
-
-package main
-
-import (
- "go/ast"
- "go/token"
-)
-
-func init() {
- register("bool",
- "check for mistakes involving boolean operators",
- checkBool,
- binaryExpr)
-}
-
-func checkBool(f *File, n ast.Node) {
- e := n.(*ast.BinaryExpr)
-
- var op boolOp
- switch e.Op {
- case token.LOR:
- op = or
- case token.LAND:
- op = and
- default:
- return
- }
-
- comm := op.commutativeSets(e)
- for _, exprs := range comm {
- op.checkRedundant(f, exprs)
- op.checkSuspect(f, exprs)
- }
-}
-
-type boolOp struct {
- name string
- tok token.Token // token corresponding to this operator
- badEq token.Token // token corresponding to the equality test that should not be used with this operator
-}
-
-var (
- or = boolOp{"or", token.LOR, token.NEQ}
- and = boolOp{"and", token.LAND, token.EQL}
-)
-
-// commutativeSets returns all side effect free sets of
-// expressions in e that are connected by op.
-// For example, given 'a || b || f() || c || d' with the or op,
-// commutativeSets returns {{b, a}, {d, c}}.
-func (op boolOp) commutativeSets(e *ast.BinaryExpr) [][]ast.Expr {
- exprs := op.split(e)
-
- // Partition the slice of expressions into commutative sets.
- i := 0
- var sets [][]ast.Expr
- for j := 0; j <= len(exprs); j++ {
- if j == len(exprs) || hasSideEffects(exprs[j]) {
- if i < j {
- sets = append(sets, exprs[i:j])
- }
- i = j + 1
- }
- }
-
- return sets
-}
-
-// checkRedundant checks for expressions of the form
-// e && e
-// e || e
-// Exprs must contain only side effect free expressions.
-func (op boolOp) checkRedundant(f *File, exprs []ast.Expr) {
- seen := make(map[string]bool)
- for _, e := range exprs {
- efmt := f.gofmt(e)
- if seen[efmt] {
- f.Badf(e.Pos(), "redundant %s: %s %s %s", op.name, efmt, op.tok, efmt)
- } else {
- seen[efmt] = true
- }
- }
-}
-
-// checkSuspect checks for expressions of the form
-// x != c1 || x != c2
-// x == c1 && x == c2
-// where c1 and c2 are constant expressions.
-// If c1 and c2 are the same then it's redundant;
-// if c1 and c2 are different then it's always true or always false.
-// Exprs must contain only side effect free expressions.
-func (op boolOp) checkSuspect(f *File, exprs []ast.Expr) {
- // seen maps from expressions 'x' to equality expressions 'x != c'.
- seen := make(map[string]string)
-
- for _, e := range exprs {
- bin, ok := e.(*ast.BinaryExpr)
- if !ok || bin.Op != op.badEq {
- continue
- }
-
- // In order to avoid false positives, restrict to cases
- // in which one of the operands is constant. We're then
- // interested in the other operand.
- // In the rare case in which both operands are constant
- // (e.g. runtime.GOOS and "windows"), we'll only catch
- // mistakes if the LHS is repeated, which is how most
- // code is written.
- var x ast.Expr
- switch {
- case f.pkg.types[bin.Y].Value != nil:
- x = bin.X
- case f.pkg.types[bin.X].Value != nil:
- x = bin.Y
- default:
- continue
- }
-
- // e is of the form 'x != c' or 'x == c'.
- xfmt := f.gofmt(x)
- efmt := f.gofmt(e)
- if prev, found := seen[xfmt]; found {
- // checkRedundant handles the case in which efmt == prev.
- if efmt != prev {
- f.Badf(e.Pos(), "suspect %s: %s %s %s", op.name, efmt, op.tok, prev)
- }
- } else {
- seen[xfmt] = efmt
- }
- }
-}
-
-// hasSideEffects reports whether evaluation of e has side effects.
-func hasSideEffects(e ast.Expr) bool {
- safe := true
- ast.Inspect(e, func(node ast.Node) bool {
- switch n := node.(type) {
- // Using CallExpr here will catch conversions
- // as well as function and method invocations.
- // We'll live with the false negatives for now.
- case *ast.CallExpr:
- safe = false
- return false
- case *ast.UnaryExpr:
- if n.Op == token.ARROW {
- safe = false
- return false
- }
- }
- return true
- })
- return !safe
-}
-
-// split returns a slice of all subexpressions in e that are connected by op.
-// For example, given 'a || (b || c) || d' with the or op,
-// split returns []{d, c, b, a}.
-func (op boolOp) split(e ast.Expr) (exprs []ast.Expr) {
- for {
- e = unparen(e)
- if b, ok := e.(*ast.BinaryExpr); ok && b.Op == op.tok {
- exprs = append(exprs, op.split(b.Y)...)
- e = b.X
- } else {
- exprs = append(exprs, e)
- break
- }
- }
- return
-}
-
-// unparen returns e with any enclosing parentheses stripped.
-func unparen(e ast.Expr) ast.Expr {
- for {
- p, ok := e.(*ast.ParenExpr)
- if !ok {
- return e
- }
- e = p.X
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/buildtag.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/buildtag.go
deleted file mode 100644
index ccf764ef8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/buildtag.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "fmt"
- "os"
- "strings"
- "unicode"
-)
-
-var (
- nl = []byte("\n")
- slashSlash = []byte("//")
- plusBuild = []byte("+build")
-)
-
-// checkBuildTag checks that build tags are in the correct location and well-formed.
-func checkBuildTag(name string, data []byte) {
- if !vet("buildtags") {
- return
- }
- lines := bytes.SplitAfter(data, nl)
-
- // Determine cutpoint where +build comments are no longer valid.
- // They are valid in leading // comments in the file followed by
- // a blank line.
- var cutoff int
- for i, line := range lines {
- line = bytes.TrimSpace(line)
- if len(line) == 0 {
- cutoff = i
- continue
- }
- if bytes.HasPrefix(line, slashSlash) {
- continue
- }
- break
- }
-
- for i, line := range lines {
- line = bytes.TrimSpace(line)
- if !bytes.HasPrefix(line, slashSlash) {
- continue
- }
- text := bytes.TrimSpace(line[2:])
- if bytes.HasPrefix(text, plusBuild) {
- fields := bytes.Fields(text)
- if !bytes.Equal(fields[0], plusBuild) {
- // Comment is something like +buildasdf not +build.
- fmt.Fprintf(os.Stderr, "%s:%d: possible malformed +build comment\n", name, i+1)
- continue
- }
- if i >= cutoff {
- fmt.Fprintf(os.Stderr, "%s:%d: +build comment must appear before package clause and be followed by a blank line\n", name, i+1)
- setExit(1)
- continue
- }
- // Check arguments.
- Args:
- for _, arg := range fields[1:] {
- for _, elem := range strings.Split(string(arg), ",") {
- if strings.HasPrefix(elem, "!!") {
- fmt.Fprintf(os.Stderr, "%s:%d: invalid double negative in build constraint: %s\n", name, i+1, arg)
- setExit(1)
- break Args
- }
- if strings.HasPrefix(elem, "!") {
- elem = elem[1:]
- }
- for _, c := range elem {
- if !unicode.IsLetter(c) && !unicode.IsDigit(c) && c != '_' && c != '.' {
- fmt.Fprintf(os.Stderr, "%s:%d: invalid non-alphanumeric build constraint: %s\n", name, i+1, arg)
- setExit(1)
- break Args
- }
- }
- }
- }
- continue
- }
- // Comment with +build but not at beginning.
- if bytes.Contains(line, plusBuild) && i < cutoff {
- fmt.Fprintf(os.Stderr, "%s:%d: possible malformed +build comment\n", name, i+1)
- continue
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/cgo.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/cgo.go
deleted file mode 100644
index b896862c8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/cgo.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Check for invalid cgo pointer passing.
-// This looks for code that uses cgo to call C code passing values
-// whose types are almost always invalid according to the cgo pointer
-// sharing rules.
-// Specifically, it warns about attempts to pass a Go chan, map, func,
-// or slice to C, either directly, or via a pointer, array, or struct.
-
-package main
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-)
-
-func init() {
- register("cgocall",
- "check for types that may not be passed to cgo calls",
- checkCgoCall,
- callExpr)
-}
-
-func checkCgoCall(f *File, node ast.Node) {
- x := node.(*ast.CallExpr)
-
- // We are only looking for calls to functions imported from
- // the "C" package.
- sel, ok := x.Fun.(*ast.SelectorExpr)
- if !ok {
- return
- }
- id, ok := sel.X.(*ast.Ident)
- if !ok || id.Name != "C" {
- return
- }
-
- for _, arg := range x.Args {
- if !typeOKForCgoCall(cgoBaseType(f, arg)) {
- f.Badf(arg.Pos(), "possibly passing Go type with embedded pointer to C")
- }
-
- // Check for passing the address of a bad type.
- if conv, ok := arg.(*ast.CallExpr); ok && len(conv.Args) == 1 && f.hasBasicType(conv.Fun, types.UnsafePointer) {
- arg = conv.Args[0]
- }
- if u, ok := arg.(*ast.UnaryExpr); ok && u.Op == token.AND {
- if !typeOKForCgoCall(cgoBaseType(f, u.X)) {
- f.Badf(arg.Pos(), "possibly passing Go type with embedded pointer to C")
- }
- }
- }
-}
-
-// cgoBaseType tries to look through type conversions involving
-// unsafe.Pointer to find the real type. It converts:
-// unsafe.Pointer(x) => x
-// *(*unsafe.Pointer)(unsafe.Pointer(&x)) => x
-func cgoBaseType(f *File, arg ast.Expr) types.Type {
- switch arg := arg.(type) {
- case *ast.CallExpr:
- if len(arg.Args) == 1 && f.hasBasicType(arg.Fun, types.UnsafePointer) {
- return cgoBaseType(f, arg.Args[0])
- }
- case *ast.StarExpr:
- call, ok := arg.X.(*ast.CallExpr)
- if !ok || len(call.Args) != 1 {
- break
- }
- // Here arg is *f(v).
- t := f.pkg.types[call.Fun].Type
- if t == nil {
- break
- }
- ptr, ok := t.Underlying().(*types.Pointer)
- if !ok {
- break
- }
- // Here arg is *(*p)(v)
- elem, ok := ptr.Elem().Underlying().(*types.Basic)
- if !ok || elem.Kind() != types.UnsafePointer {
- break
- }
- // Here arg is *(*unsafe.Pointer)(v)
- call, ok = call.Args[0].(*ast.CallExpr)
- if !ok || len(call.Args) != 1 {
- break
- }
- // Here arg is *(*unsafe.Pointer)(f(v))
- if !f.hasBasicType(call.Fun, types.UnsafePointer) {
- break
- }
- // Here arg is *(*unsafe.Pointer)(unsafe.Pointer(v))
- u, ok := call.Args[0].(*ast.UnaryExpr)
- if !ok || u.Op != token.AND {
- break
- }
- // Here arg is *(*unsafe.Pointer)(unsafe.Pointer(&v))
- return cgoBaseType(f, u.X)
- }
-
- return f.pkg.types[arg].Type
-}
-
-// typeOKForCgoCall returns true if the type of arg is OK to pass to a
-// C function using cgo. This is not true for Go types with embedded
-// pointers.
-func typeOKForCgoCall(t types.Type) bool {
- if t == nil {
- return true
- }
- switch t := t.Underlying().(type) {
- case *types.Chan, *types.Map, *types.Signature, *types.Slice:
- return false
- case *types.Pointer:
- return typeOKForCgoCall(t.Elem())
- case *types.Array:
- return typeOKForCgoCall(t.Elem())
- case *types.Struct:
- for i := 0; i < t.NumFields(); i++ {
- if !typeOKForCgoCall(t.Field(i).Type()) {
- return false
- }
- }
- }
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/composite.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/composite.go
deleted file mode 100644
index 8594c4897..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/composite.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the test for unkeyed struct literals.
-
-package main
-
-import (
- "github.com/dnephin/govet/internal/whitelist"
- "flag"
- "go/ast"
- "go/types"
- "strings"
-)
-
-var compositeWhiteList = flag.Bool("compositewhitelist", true, "use composite white list; for testing only")
-
-func init() {
- register("composites",
- "check that composite literals used field-keyed elements",
- checkUnkeyedLiteral,
- compositeLit)
-}
-
-// checkUnkeyedLiteral checks if a composite literal is a struct literal with
-// unkeyed fields.
-func checkUnkeyedLiteral(f *File, node ast.Node) {
- cl := node.(*ast.CompositeLit)
-
- typ := f.pkg.types[cl].Type
- if typ == nil {
- // cannot determine composite literals' type, skip it
- return
- }
- typeName := typ.String()
- if *compositeWhiteList && whitelist.UnkeyedLiteral[typeName] {
- // skip whitelisted types
- return
- }
- if _, ok := typ.Underlying().(*types.Struct); !ok {
- // skip non-struct composite literals
- return
- }
- if isLocalType(f, typeName) {
- // allow unkeyed locally defined composite literal
- return
- }
-
- // check if the CompositeLit contains an unkeyed field
- allKeyValue := true
- for _, e := range cl.Elts {
- if _, ok := e.(*ast.KeyValueExpr); !ok {
- allKeyValue = false
- break
- }
- }
- if allKeyValue {
- // all the composite literal fields are keyed
- return
- }
-
- f.Badf(cl.Pos(), "%s composite literal uses unkeyed fields", typeName)
-}
-
-func isLocalType(f *File, typeName string) bool {
- if strings.HasPrefix(typeName, "struct{") {
- // struct literals are local types
- return true
- }
-
- pkgname := f.pkg.path
- if strings.HasPrefix(typeName, pkgname+".") {
- return true
- }
-
- // treat types as local inside test packages with _test name suffix
- if strings.HasSuffix(pkgname, "_test") {
- pkgname = pkgname[:len(pkgname)-len("_test")]
- }
- return strings.HasPrefix(typeName, pkgname+".")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/copylock.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/copylock.go
deleted file mode 100644
index 65337688b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/copylock.go
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the code to check that locks are not passed by value.
-
-package main
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
-)
-
-func init() {
- register("copylocks",
- "check that locks are not passed by value",
- checkCopyLocks,
- funcDecl, rangeStmt, funcLit, callExpr, assignStmt, genDecl, compositeLit, returnStmt)
-}
-
-// checkCopyLocks checks whether node might
-// inadvertently copy a lock.
-func checkCopyLocks(f *File, node ast.Node) {
- switch node := node.(type) {
- case *ast.RangeStmt:
- checkCopyLocksRange(f, node)
- case *ast.FuncDecl:
- checkCopyLocksFunc(f, node.Name.Name, node.Recv, node.Type)
- case *ast.FuncLit:
- checkCopyLocksFunc(f, "func", nil, node.Type)
- case *ast.CallExpr:
- checkCopyLocksCallExpr(f, node)
- case *ast.AssignStmt:
- checkCopyLocksAssign(f, node)
- case *ast.GenDecl:
- checkCopyLocksGenDecl(f, node)
- case *ast.CompositeLit:
- checkCopyLocksCompositeLit(f, node)
- case *ast.ReturnStmt:
- checkCopyLocksReturnStmt(f, node)
- }
-}
-
-// checkCopyLocksAssign checks whether an assignment
-// copies a lock.
-func checkCopyLocksAssign(f *File, as *ast.AssignStmt) {
- for i, x := range as.Rhs {
- if path := lockPathRhs(f, x); path != nil {
- f.Badf(x.Pos(), "assignment copies lock value to %v: %v", f.gofmt(as.Lhs[i]), path)
- }
- }
-}
-
-// checkCopyLocksGenDecl checks whether lock is copied
-// in variable declaration.
-func checkCopyLocksGenDecl(f *File, gd *ast.GenDecl) {
- if gd.Tok != token.VAR {
- return
- }
- for _, spec := range gd.Specs {
- valueSpec := spec.(*ast.ValueSpec)
- for i, x := range valueSpec.Values {
- if path := lockPathRhs(f, x); path != nil {
- f.Badf(x.Pos(), "variable declaration copies lock value to %v: %v", valueSpec.Names[i].Name, path)
- }
- }
- }
-}
-
-// checkCopyLocksCompositeLit detects lock copy inside a composite literal
-func checkCopyLocksCompositeLit(f *File, cl *ast.CompositeLit) {
- for _, x := range cl.Elts {
- if node, ok := x.(*ast.KeyValueExpr); ok {
- x = node.Value
- }
- if path := lockPathRhs(f, x); path != nil {
- f.Badf(x.Pos(), "literal copies lock value from %v: %v", f.gofmt(x), path)
- }
- }
-}
-
-// checkCopyLocksReturnStmt detects lock copy in return statement
-func checkCopyLocksReturnStmt(f *File, rs *ast.ReturnStmt) {
- for _, x := range rs.Results {
- if path := lockPathRhs(f, x); path != nil {
- f.Badf(x.Pos(), "return copies lock value: %v", path)
- }
- }
-}
-
-// checkCopyLocksCallExpr detects lock copy in the arguments to a function call
-func checkCopyLocksCallExpr(f *File, ce *ast.CallExpr) {
- if id, ok := ce.Fun.(*ast.Ident); ok && id.Name == "new" && f.pkg.types[id].IsBuiltin() {
- // Skip 'new(Type)' for built-in 'new'
- return
- }
- for _, x := range ce.Args {
- if path := lockPathRhs(f, x); path != nil {
- f.Badf(x.Pos(), "function call copies lock value: %v", path)
- }
- }
-}
-
-// checkCopyLocksFunc checks whether a function might
-// inadvertently copy a lock, by checking whether
-// its receiver, parameters, or return values
-// are locks.
-func checkCopyLocksFunc(f *File, name string, recv *ast.FieldList, typ *ast.FuncType) {
- if recv != nil && len(recv.List) > 0 {
- expr := recv.List[0].Type
- if path := lockPath(f.pkg.typesPkg, f.pkg.types[expr].Type); path != nil {
- f.Badf(expr.Pos(), "%s passes lock by value: %v", name, path)
- }
- }
-
- if typ.Params != nil {
- for _, field := range typ.Params.List {
- expr := field.Type
- if path := lockPath(f.pkg.typesPkg, f.pkg.types[expr].Type); path != nil {
- f.Badf(expr.Pos(), "%s passes lock by value: %v", name, path)
- }
- }
- }
-
- // Don't check typ.Results. If T has a Lock field it's OK to write
- // return T{}
- // because that is returning the zero value. Leave result checking
- // to the return statement.
-}
-
-// checkCopyLocksRange checks whether a range statement
-// might inadvertently copy a lock by checking whether
-// any of the range variables are locks.
-func checkCopyLocksRange(f *File, r *ast.RangeStmt) {
- checkCopyLocksRangeVar(f, r.Tok, r.Key)
- checkCopyLocksRangeVar(f, r.Tok, r.Value)
-}
-
-func checkCopyLocksRangeVar(f *File, rtok token.Token, e ast.Expr) {
- if e == nil {
- return
- }
- id, isId := e.(*ast.Ident)
- if isId && id.Name == "_" {
- return
- }
-
- var typ types.Type
- if rtok == token.DEFINE {
- if !isId {
- return
- }
- obj := f.pkg.defs[id]
- if obj == nil {
- return
- }
- typ = obj.Type()
- } else {
- typ = f.pkg.types[e].Type
- }
-
- if typ == nil {
- return
- }
- if path := lockPath(f.pkg.typesPkg, typ); path != nil {
- f.Badf(e.Pos(), "range var %s copies lock: %v", f.gofmt(e), path)
- }
-}
-
-type typePath []types.Type
-
-// String pretty-prints a typePath.
-func (path typePath) String() string {
- n := len(path)
- var buf bytes.Buffer
- for i := range path {
- if i > 0 {
- fmt.Fprint(&buf, " contains ")
- }
- // The human-readable path is in reverse order, outermost to innermost.
- fmt.Fprint(&buf, path[n-i-1].String())
- }
- return buf.String()
-}
-
-func lockPathRhs(f *File, x ast.Expr) typePath {
- if _, ok := x.(*ast.CompositeLit); ok {
- return nil
- }
- if _, ok := x.(*ast.CallExpr); ok {
- // A call may return a zero value.
- return nil
- }
- if star, ok := x.(*ast.StarExpr); ok {
- if _, ok := star.X.(*ast.CallExpr); ok {
- // A call may return a pointer to a zero value.
- return nil
- }
- }
- return lockPath(f.pkg.typesPkg, f.pkg.types[x].Type)
-}
-
-// lockPath returns a typePath describing the location of a lock value
-// contained in typ. If there is no contained lock, it returns nil.
-func lockPath(tpkg *types.Package, typ types.Type) typePath {
- if typ == nil {
- return nil
- }
-
- // We're only interested in the case in which the underlying
- // type is a struct. (Interfaces and pointers are safe to copy.)
- styp, ok := typ.Underlying().(*types.Struct)
- if !ok {
- return nil
- }
-
- // We're looking for cases in which a reference to this type
- // can be locked, but a value cannot. This differentiates
- // embedded interfaces from embedded values.
- if plock := types.NewMethodSet(types.NewPointer(typ)).Lookup(tpkg, "Lock"); plock != nil {
- if lock := types.NewMethodSet(typ).Lookup(tpkg, "Lock"); lock == nil {
- return []types.Type{typ}
- }
- }
-
- nfields := styp.NumFields()
- for i := 0; i < nfields; i++ {
- ftyp := styp.Field(i).Type()
- subpath := lockPath(tpkg, ftyp)
- if subpath != nil {
- return append(subpath, typ)
- }
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/deadcode.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/deadcode.go
deleted file mode 100644
index b1077aef3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/deadcode.go
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Check for syntactically unreachable code.
-
-package main
-
-import (
- "go/ast"
- "go/token"
-)
-
-func init() {
- register("unreachable",
- "check for unreachable code",
- checkUnreachable,
- funcDecl, funcLit)
-}
-
-type deadState struct {
- f *File
- hasBreak map[ast.Stmt]bool
- hasGoto map[string]bool
- labels map[string]ast.Stmt
- breakTarget ast.Stmt
-
- reachable bool
-}
-
-// checkUnreachable checks a function body for dead code.
-//
-// TODO(adonovan): use the new cfg package, which is more precise.
-func checkUnreachable(f *File, node ast.Node) {
- var body *ast.BlockStmt
- switch n := node.(type) {
- case *ast.FuncDecl:
- body = n.Body
- case *ast.FuncLit:
- body = n.Body
- }
- if body == nil {
- return
- }
-
- d := &deadState{
- f: f,
- hasBreak: make(map[ast.Stmt]bool),
- hasGoto: make(map[string]bool),
- labels: make(map[string]ast.Stmt),
- }
-
- d.findLabels(body)
-
- d.reachable = true
- d.findDead(body)
-}
-
-// findLabels gathers information about the labels defined and used by stmt
-// and about which statements break, whether a label is involved or not.
-func (d *deadState) findLabels(stmt ast.Stmt) {
- switch x := stmt.(type) {
- default:
- d.f.Warnf(x.Pos(), "internal error in findLabels: unexpected statement %T", x)
-
- case *ast.AssignStmt,
- *ast.BadStmt,
- *ast.DeclStmt,
- *ast.DeferStmt,
- *ast.EmptyStmt,
- *ast.ExprStmt,
- *ast.GoStmt,
- *ast.IncDecStmt,
- *ast.ReturnStmt,
- *ast.SendStmt:
- // no statements inside
-
- case *ast.BlockStmt:
- for _, stmt := range x.List {
- d.findLabels(stmt)
- }
-
- case *ast.BranchStmt:
- switch x.Tok {
- case token.GOTO:
- if x.Label != nil {
- d.hasGoto[x.Label.Name] = true
- }
-
- case token.BREAK:
- stmt := d.breakTarget
- if x.Label != nil {
- stmt = d.labels[x.Label.Name]
- }
- if stmt != nil {
- d.hasBreak[stmt] = true
- }
- }
-
- case *ast.IfStmt:
- d.findLabels(x.Body)
- if x.Else != nil {
- d.findLabels(x.Else)
- }
-
- case *ast.LabeledStmt:
- d.labels[x.Label.Name] = x.Stmt
- d.findLabels(x.Stmt)
-
- // These cases are all the same, but the x.Body only works
- // when the specific type of x is known, so the cases cannot
- // be merged.
- case *ast.ForStmt:
- outer := d.breakTarget
- d.breakTarget = x
- d.findLabels(x.Body)
- d.breakTarget = outer
-
- case *ast.RangeStmt:
- outer := d.breakTarget
- d.breakTarget = x
- d.findLabels(x.Body)
- d.breakTarget = outer
-
- case *ast.SelectStmt:
- outer := d.breakTarget
- d.breakTarget = x
- d.findLabels(x.Body)
- d.breakTarget = outer
-
- case *ast.SwitchStmt:
- outer := d.breakTarget
- d.breakTarget = x
- d.findLabels(x.Body)
- d.breakTarget = outer
-
- case *ast.TypeSwitchStmt:
- outer := d.breakTarget
- d.breakTarget = x
- d.findLabels(x.Body)
- d.breakTarget = outer
-
- case *ast.CommClause:
- for _, stmt := range x.Body {
- d.findLabels(stmt)
- }
-
- case *ast.CaseClause:
- for _, stmt := range x.Body {
- d.findLabels(stmt)
- }
- }
-}
-
-// findDead walks the statement looking for dead code.
-// If d.reachable is false on entry, stmt itself is dead.
-// When findDead returns, d.reachable tells whether the
-// statement following stmt is reachable.
-func (d *deadState) findDead(stmt ast.Stmt) {
- // Is this a labeled goto target?
- // If so, assume it is reachable due to the goto.
- // This is slightly conservative, in that we don't
- // check that the goto is reachable, so
- // L: goto L
- // will not provoke a warning.
- // But it's good enough.
- if x, isLabel := stmt.(*ast.LabeledStmt); isLabel && d.hasGoto[x.Label.Name] {
- d.reachable = true
- }
-
- if !d.reachable {
- switch stmt.(type) {
- case *ast.EmptyStmt:
- // do not warn about unreachable empty statements
- default:
- d.f.Bad(stmt.Pos(), "unreachable code")
- d.reachable = true // silence error about next statement
- }
- }
-
- switch x := stmt.(type) {
- default:
- d.f.Warnf(x.Pos(), "internal error in findDead: unexpected statement %T", x)
-
- case *ast.AssignStmt,
- *ast.BadStmt,
- *ast.DeclStmt,
- *ast.DeferStmt,
- *ast.EmptyStmt,
- *ast.GoStmt,
- *ast.IncDecStmt,
- *ast.SendStmt:
- // no control flow
-
- case *ast.BlockStmt:
- for _, stmt := range x.List {
- d.findDead(stmt)
- }
-
- case *ast.BranchStmt:
- switch x.Tok {
- case token.BREAK, token.GOTO, token.FALLTHROUGH:
- d.reachable = false
- case token.CONTINUE:
- // NOTE: We accept "continue" statements as terminating.
- // They are not necessary in the spec definition of terminating,
- // because a continue statement cannot be the final statement
- // before a return. But for the more general problem of syntactically
- // identifying dead code, continue redirects control flow just
- // like the other terminating statements.
- d.reachable = false
- }
-
- case *ast.ExprStmt:
- // Call to panic?
- call, ok := x.X.(*ast.CallExpr)
- if ok {
- name, ok := call.Fun.(*ast.Ident)
- if ok && name.Name == "panic" && name.Obj == nil {
- d.reachable = false
- }
- }
-
- case *ast.ForStmt:
- d.findDead(x.Body)
- d.reachable = x.Cond != nil || d.hasBreak[x]
-
- case *ast.IfStmt:
- d.findDead(x.Body)
- if x.Else != nil {
- r := d.reachable
- d.reachable = true
- d.findDead(x.Else)
- d.reachable = d.reachable || r
- } else {
- // might not have executed if statement
- d.reachable = true
- }
-
- case *ast.LabeledStmt:
- d.findDead(x.Stmt)
-
- case *ast.RangeStmt:
- d.findDead(x.Body)
- d.reachable = true
-
- case *ast.ReturnStmt:
- d.reachable = false
-
- case *ast.SelectStmt:
- // NOTE: Unlike switch and type switch below, we don't care
- // whether a select has a default, because a select without a
- // default blocks until one of the cases can run. That's different
- // from a switch without a default, which behaves like it has
- // a default with an empty body.
- anyReachable := false
- for _, comm := range x.Body.List {
- d.reachable = true
- for _, stmt := range comm.(*ast.CommClause).Body {
- d.findDead(stmt)
- }
- anyReachable = anyReachable || d.reachable
- }
- d.reachable = anyReachable || d.hasBreak[x]
-
- case *ast.SwitchStmt:
- anyReachable := false
- hasDefault := false
- for _, cas := range x.Body.List {
- cc := cas.(*ast.CaseClause)
- if cc.List == nil {
- hasDefault = true
- }
- d.reachable = true
- for _, stmt := range cc.Body {
- d.findDead(stmt)
- }
- anyReachable = anyReachable || d.reachable
- }
- d.reachable = anyReachable || d.hasBreak[x] || !hasDefault
-
- case *ast.TypeSwitchStmt:
- anyReachable := false
- hasDefault := false
- for _, cas := range x.Body.List {
- cc := cas.(*ast.CaseClause)
- if cc.List == nil {
- hasDefault = true
- }
- d.reachable = true
- for _, stmt := range cc.Body {
- d.findDead(stmt)
- }
- anyReachable = anyReachable || d.reachable
- }
- d.reachable = anyReachable || d.hasBreak[x] || !hasDefault
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/doc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/doc.go
deleted file mode 100644
index 69d5f9cc7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/doc.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Vet examines Go source code and reports suspicious constructs, such as Printf
-calls whose arguments do not align with the format string. Vet uses heuristics
-that do not guarantee all reports are genuine problems, but it can find errors
-not caught by the compilers.
-
-It can be invoked three ways:
-
-By package, from the go tool:
- go vet package/path/name
-vets the package whose path is provided.
-
-By files:
- go tool vet source/directory/*.go
-vets the files named, all of which must be in the same package.
-
-By directory:
- go tool vet source/directory
-recursively descends the directory, vetting each package it finds.
-
-Vet's exit code is 2 for erroneous invocation of the tool, 1 if a
-problem was reported, and 0 otherwise. Note that the tool does not
-check every possible problem and depends on unreliable heuristics
-so it should be used as guidance only, not as a firm indicator of
-program correctness.
-
-By default the -all flag is set so all checks are performed.
-If any flags are explicitly set to true, only those tests are run. Conversely, if
-any flag is explicitly set to false, only those tests are disabled. Thus -printf=true
-runs the printf check, -printf=false runs all checks except the printf check.
-
-Available checks:
-
-Assembly declarations
-
-Flag: -asmdecl
-
-Mismatches between assembly files and Go function declarations.
-
-Useless assignments
-
-Flag: -assign
-
-Check for useless assignments.
-
-Atomic mistakes
-
-Flag: -atomic
-
-Common mistaken usages of the sync/atomic package.
-
-Boolean conditions
-
-Flag: -bool
-
-Mistakes involving boolean operators.
-
-Build tags
-
-Flag: -buildtags
-
-Badly formed or misplaced +build tags.
-
-Invalid uses of cgo
-
-Flag: -cgocall
-
-Detect some violations of the cgo pointer passing rules.
-
-Unkeyed composite literals
-
-Flag: -composites
-
-Composite struct literals that do not use the field-keyed syntax.
-
-Copying locks
-
-Flag: -copylocks
-
-Locks that are erroneously passed by value.
-
-Tests, benchmarks and documentation examples
-
-Flag: -tests
-
-Mistakes involving tests including functions with incorrect names or signatures
-and example tests that document identifiers not in the package.
-
-Failure to call the cancelation function returned by context.WithCancel.
-
-Flag: -lostcancel
-
-The cancelation function returned by context.WithCancel, WithTimeout,
-and WithDeadline must be called or the new context will remain live
-until its parent context is cancelled.
-(The background context is never cancelled.)
-
-Methods
-
-Flag: -methods
-
-Non-standard signatures for methods with familiar names, including:
- Format GobEncode GobDecode MarshalJSON MarshalXML
- Peek ReadByte ReadFrom ReadRune Scan Seek
- UnmarshalJSON UnreadByte UnreadRune WriteByte
- WriteTo
-
-Nil function comparison
-
-Flag: -nilfunc
-
-Comparisons between functions and nil.
-
-Printf family
-
-Flag: -printf
-
-Suspicious calls to functions in the Printf family, including any functions
-with these names, disregarding case:
- Print Printf Println
- Fprint Fprintf Fprintln
- Sprint Sprintf Sprintln
- Error Errorf
- Fatal Fatalf
- Log Logf
- Panic Panicf Panicln
-The -printfuncs flag can be used to redefine this list.
-If the function name ends with an 'f', the function is assumed to take
-a format descriptor string in the manner of fmt.Printf. If not, vet
-complains about arguments that look like format descriptor strings.
-
-It also checks for errors such as using a Writer as the first argument of
-Printf.
-
-Struct tags
-
-Range loop variables
-
-Flag: -rangeloops
-
-Incorrect uses of range loop variables in closures.
-
-Shadowed variables
-
-Flag: -shadow=false (experimental; must be set explicitly)
-
-Variables that may have been unintentionally shadowed.
-
-Shifts
-
-Flag: -shift
-
-Shifts equal to or longer than the variable's length.
-
-Flag: -structtags
-
-Struct tags that do not follow the format understood by reflect.StructTag.Get.
-Well-known encoding struct tags (json, xml) used with unexported fields.
-
-Unreachable code
-
-Flag: -unreachable
-
-Unreachable code.
-
-Misuse of unsafe Pointers
-
-Flag: -unsafeptr
-
-Likely incorrect uses of unsafe.Pointer to convert integers to pointers.
-A conversion from uintptr to unsafe.Pointer is invalid if it implies that
-there is a uintptr-typed word in memory that holds a pointer value,
-because that word will be invisible to stack copying and to the garbage
-collector.
-
-Unused result of certain function calls
-
-Flag: -unusedresult
-
-Calls to well-known functions and methods that return a value that is
-discarded. By default, this includes functions like fmt.Errorf and
-fmt.Sprintf and methods like String and Error. The flags -unusedfuncs
-and -unusedstringmethods control the set.
-
-Other flags
-
-These flags configure the behavior of vet:
-
- -all (default true)
- Enable all non-experimental checks.
- -v
- Verbose mode
- -printfuncs
- A comma-separated list of print-like function names
- to supplement the standard list.
- For more information, see the discussion of the -printf flag.
- -shadowstrict
- Whether to be strict about shadowing; can be noisy.
-*/
-package main
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/cfg/builder.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/cfg/builder.go
deleted file mode 100644
index da1cc7e63..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/cfg/builder.go
+++ /dev/null
@@ -1,512 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cfg
-
-// This file implements the CFG construction pass.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
-)
-
-type builder struct {
- cfg *CFG
- mayReturn func(*ast.CallExpr) bool
- current *Block
- lblocks map[*ast.Object]*lblock // labeled blocks
- targets *targets // linked stack of branch targets
-}
-
-func (b *builder) stmt(_s ast.Stmt) {
- // The label of the current statement. If non-nil, its _goto
- // target is always set; its _break and _continue are set only
- // within the body of switch/typeswitch/select/for/range.
- // It is effectively an additional default-nil parameter of stmt().
- var label *lblock
-start:
- switch s := _s.(type) {
- case *ast.BadStmt,
- *ast.SendStmt,
- *ast.IncDecStmt,
- *ast.GoStmt,
- *ast.DeferStmt,
- *ast.EmptyStmt,
- *ast.AssignStmt:
- // No effect on control flow.
- b.add(s)
-
- case *ast.ExprStmt:
- b.add(s)
- if call, ok := s.X.(*ast.CallExpr); ok && !b.mayReturn(call) {
- // Calls to panic, os.Exit, etc, never return.
- b.current = b.newUnreachableBlock("unreachable.call")
- }
-
- case *ast.DeclStmt:
- // Treat each var ValueSpec as a separate statement.
- d := s.Decl.(*ast.GenDecl)
- if d.Tok == token.VAR {
- for _, spec := range d.Specs {
- if spec, ok := spec.(*ast.ValueSpec); ok {
- b.add(spec)
- }
- }
- }
-
- case *ast.LabeledStmt:
- label = b.labeledBlock(s.Label)
- b.jump(label._goto)
- b.current = label._goto
- _s = s.Stmt
- goto start // effectively: tailcall stmt(g, s.Stmt, label)
-
- case *ast.ReturnStmt:
- b.add(s)
- b.current = b.newUnreachableBlock("unreachable.return")
-
- case *ast.BranchStmt:
- var block *Block
- switch s.Tok {
- case token.BREAK:
- if s.Label != nil {
- if lb := b.labeledBlock(s.Label); lb != nil {
- block = lb._break
- }
- } else {
- for t := b.targets; t != nil && block == nil; t = t.tail {
- block = t._break
- }
- }
-
- case token.CONTINUE:
- if s.Label != nil {
- if lb := b.labeledBlock(s.Label); lb != nil {
- block = lb._continue
- }
- } else {
- for t := b.targets; t != nil && block == nil; t = t.tail {
- block = t._continue
- }
- }
-
- case token.FALLTHROUGH:
- for t := b.targets; t != nil; t = t.tail {
- block = t._fallthrough
- }
-
- case token.GOTO:
- if s.Label != nil {
- block = b.labeledBlock(s.Label)._goto
- }
- }
- if block == nil {
- block = b.newBlock("undefined.branch")
- }
- b.jump(block)
- b.current = b.newUnreachableBlock("unreachable.branch")
-
- case *ast.BlockStmt:
- b.stmtList(s.List)
-
- case *ast.IfStmt:
- if s.Init != nil {
- b.stmt(s.Init)
- }
- then := b.newBlock("if.then")
- done := b.newBlock("if.done")
- _else := done
- if s.Else != nil {
- _else = b.newBlock("if.else")
- }
- b.add(s.Cond)
- b.ifelse(then, _else)
- b.current = then
- b.stmt(s.Body)
- b.jump(done)
-
- if s.Else != nil {
- b.current = _else
- b.stmt(s.Else)
- b.jump(done)
- }
-
- b.current = done
-
- case *ast.SwitchStmt:
- b.switchStmt(s, label)
-
- case *ast.TypeSwitchStmt:
- b.typeSwitchStmt(s, label)
-
- case *ast.SelectStmt:
- b.selectStmt(s, label)
-
- case *ast.ForStmt:
- b.forStmt(s, label)
-
- case *ast.RangeStmt:
- b.rangeStmt(s, label)
-
- default:
- panic(fmt.Sprintf("unexpected statement kind: %T", s))
- }
-}
-
-func (b *builder) stmtList(list []ast.Stmt) {
- for _, s := range list {
- b.stmt(s)
- }
-}
-
-func (b *builder) switchStmt(s *ast.SwitchStmt, label *lblock) {
- if s.Init != nil {
- b.stmt(s.Init)
- }
- if s.Tag != nil {
- b.add(s.Tag)
- }
- done := b.newBlock("switch.done")
- if label != nil {
- label._break = done
- }
- // We pull the default case (if present) down to the end.
- // But each fallthrough label must point to the next
- // body block in source order, so we preallocate a
- // body block (fallthru) for the next case.
- // Unfortunately this makes for a confusing block order.
- var defaultBody *[]ast.Stmt
- var defaultFallthrough *Block
- var fallthru, defaultBlock *Block
- ncases := len(s.Body.List)
- for i, clause := range s.Body.List {
- body := fallthru
- if body == nil {
- body = b.newBlock("switch.body") // first case only
- }
-
- // Preallocate body block for the next case.
- fallthru = done
- if i+1 < ncases {
- fallthru = b.newBlock("switch.body")
- }
-
- cc := clause.(*ast.CaseClause)
- if cc.List == nil {
- // Default case.
- defaultBody = &cc.Body
- defaultFallthrough = fallthru
- defaultBlock = body
- continue
- }
-
- var nextCond *Block
- for _, cond := range cc.List {
- nextCond = b.newBlock("switch.next")
- b.add(cond) // one half of the tag==cond condition
- b.ifelse(body, nextCond)
- b.current = nextCond
- }
- b.current = body
- b.targets = &targets{
- tail: b.targets,
- _break: done,
- _fallthrough: fallthru,
- }
- b.stmtList(cc.Body)
- b.targets = b.targets.tail
- b.jump(done)
- b.current = nextCond
- }
- if defaultBlock != nil {
- b.jump(defaultBlock)
- b.current = defaultBlock
- b.targets = &targets{
- tail: b.targets,
- _break: done,
- _fallthrough: defaultFallthrough,
- }
- b.stmtList(*defaultBody)
- b.targets = b.targets.tail
- }
- b.jump(done)
- b.current = done
-}
-
-func (b *builder) typeSwitchStmt(s *ast.TypeSwitchStmt, label *lblock) {
- if s.Init != nil {
- b.stmt(s.Init)
- }
- if s.Assign != nil {
- b.add(s.Assign)
- }
-
- done := b.newBlock("typeswitch.done")
- if label != nil {
- label._break = done
- }
- var default_ *ast.CaseClause
- for _, clause := range s.Body.List {
- cc := clause.(*ast.CaseClause)
- if cc.List == nil {
- default_ = cc
- continue
- }
- body := b.newBlock("typeswitch.body")
- var next *Block
- for _, casetype := range cc.List {
- next = b.newBlock("typeswitch.next")
- // casetype is a type, so don't call b.add(casetype).
- // This block logically contains a type assertion,
- // x.(casetype), but it's unclear how to represent x.
- _ = casetype
- b.ifelse(body, next)
- b.current = next
- }
- b.current = body
- b.typeCaseBody(cc, done)
- b.current = next
- }
- if default_ != nil {
- b.typeCaseBody(default_, done)
- } else {
- b.jump(done)
- }
- b.current = done
-}
-
-func (b *builder) typeCaseBody(cc *ast.CaseClause, done *Block) {
- b.targets = &targets{
- tail: b.targets,
- _break: done,
- }
- b.stmtList(cc.Body)
- b.targets = b.targets.tail
- b.jump(done)
-}
-
-func (b *builder) selectStmt(s *ast.SelectStmt, label *lblock) {
- // First evaluate channel expressions.
- // TODO(adonovan): fix: evaluate only channel exprs here.
- for _, clause := range s.Body.List {
- if comm := clause.(*ast.CommClause).Comm; comm != nil {
- b.stmt(comm)
- }
- }
-
- done := b.newBlock("select.done")
- if label != nil {
- label._break = done
- }
-
- var defaultBody *[]ast.Stmt
- for _, cc := range s.Body.List {
- clause := cc.(*ast.CommClause)
- if clause.Comm == nil {
- defaultBody = &clause.Body
- continue
- }
- body := b.newBlock("select.body")
- next := b.newBlock("select.next")
- b.ifelse(body, next)
- b.current = body
- b.targets = &targets{
- tail: b.targets,
- _break: done,
- }
- switch comm := clause.Comm.(type) {
- case *ast.ExprStmt: // <-ch
- // nop
- case *ast.AssignStmt: // x := <-states[state].Chan
- b.add(comm.Lhs[0])
- }
- b.stmtList(clause.Body)
- b.targets = b.targets.tail
- b.jump(done)
- b.current = next
- }
- if defaultBody != nil {
- b.targets = &targets{
- tail: b.targets,
- _break: done,
- }
- b.stmtList(*defaultBody)
- b.targets = b.targets.tail
- b.jump(done)
- }
- b.current = done
-}
-
-func (b *builder) forStmt(s *ast.ForStmt, label *lblock) {
- // ...init...
- // jump loop
- // loop:
- // if cond goto body else done
- // body:
- // ...body...
- // jump post
- // post: (target of continue)
- // ...post...
- // jump loop
- // done: (target of break)
- if s.Init != nil {
- b.stmt(s.Init)
- }
- body := b.newBlock("for.body")
- done := b.newBlock("for.done") // target of 'break'
- loop := body // target of back-edge
- if s.Cond != nil {
- loop = b.newBlock("for.loop")
- }
- cont := loop // target of 'continue'
- if s.Post != nil {
- cont = b.newBlock("for.post")
- }
- if label != nil {
- label._break = done
- label._continue = cont
- }
- b.jump(loop)
- b.current = loop
- if loop != body {
- b.add(s.Cond)
- b.ifelse(body, done)
- b.current = body
- }
- b.targets = &targets{
- tail: b.targets,
- _break: done,
- _continue: cont,
- }
- b.stmt(s.Body)
- b.targets = b.targets.tail
- b.jump(cont)
-
- if s.Post != nil {
- b.current = cont
- b.stmt(s.Post)
- b.jump(loop) // back-edge
- }
- b.current = done
-}
-
-func (b *builder) rangeStmt(s *ast.RangeStmt, label *lblock) {
- b.add(s.X)
-
- if s.Key != nil {
- b.add(s.Key)
- }
- if s.Value != nil {
- b.add(s.Value)
- }
-
- // ...
- // loop: (target of continue)
- // if ... goto body else done
- // body:
- // ...
- // jump loop
- // done: (target of break)
-
- loop := b.newBlock("range.loop")
- b.jump(loop)
- b.current = loop
-
- body := b.newBlock("range.body")
- done := b.newBlock("range.done")
- b.ifelse(body, done)
- b.current = body
-
- if label != nil {
- label._break = done
- label._continue = loop
- }
- b.targets = &targets{
- tail: b.targets,
- _break: done,
- _continue: loop,
- }
- b.stmt(s.Body)
- b.targets = b.targets.tail
- b.jump(loop) // back-edge
- b.current = done
-}
-
-// -------- helpers --------
-
-// Destinations associated with unlabeled for/switch/select stmts.
-// We push/pop one of these as we enter/leave each construct and for
-// each BranchStmt we scan for the innermost target of the right type.
-//
-type targets struct {
- tail *targets // rest of stack
- _break *Block
- _continue *Block
- _fallthrough *Block
-}
-
-// Destinations associated with a labeled block.
-// We populate these as labels are encountered in forward gotos or
-// labeled statements.
-//
-type lblock struct {
- _goto *Block
- _break *Block
- _continue *Block
-}
-
-// labeledBlock returns the branch target associated with the
-// specified label, creating it if needed.
-//
-func (b *builder) labeledBlock(label *ast.Ident) *lblock {
- lb := b.lblocks[label.Obj]
- if lb == nil {
- lb = &lblock{_goto: b.newBlock(label.Name)}
- if b.lblocks == nil {
- b.lblocks = make(map[*ast.Object]*lblock)
- }
- b.lblocks[label.Obj] = lb
- }
- return lb
-}
-
-// newBlock appends a new unconnected basic block to b.cfg's block
-// slice and returns it.
-// It does not automatically become the current block.
-// comment is an optional string for more readable debugging output.
-func (b *builder) newBlock(comment string) *Block {
- g := b.cfg
- block := &Block{
- index: int32(len(g.Blocks)),
- comment: comment,
- }
- block.Succs = block.succs2[:0]
- g.Blocks = append(g.Blocks, block)
- return block
-}
-
-func (b *builder) newUnreachableBlock(comment string) *Block {
- block := b.newBlock(comment)
- block.unreachable = true
- return block
-}
-
-func (b *builder) add(n ast.Node) {
- b.current.Nodes = append(b.current.Nodes, n)
-}
-
-// jump adds an edge from the current block to the target block,
-// and sets b.current to nil.
-func (b *builder) jump(target *Block) {
- b.current.Succs = append(b.current.Succs, target)
- b.current = nil
-}
-
-// ifelse emits edges from the current block to the t and f blocks,
-// and sets b.current to nil.
-func (b *builder) ifelse(t, f *Block) {
- b.current.Succs = append(b.current.Succs, t, f)
- b.current = nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/cfg/cfg.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/cfg/cfg.go
deleted file mode 100644
index e4d5bfe5d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/cfg/cfg.go
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This package constructs a simple control-flow graph (CFG) of the
-// statements and expressions within a single function.
-//
-// Use cfg.New to construct the CFG for a function body.
-//
-// The blocks of the CFG contain all the function's non-control
-// statements. The CFG does not contain control statements such as If,
-// Switch, Select, and Branch, but does contain their subexpressions.
-// For example, this source code:
-//
-// if x := f(); x != nil {
-// T()
-// } else {
-// F()
-// }
-//
-// produces this CFG:
-//
-// 1: x := f()
-// x != nil
-// succs: 2, 3
-// 2: T()
-// succs: 4
-// 3: F()
-// succs: 4
-// 4:
-//
-// The CFG does contain Return statements; even implicit returns are
-// materialized (at the position of the function's closing brace).
-//
-// The CFG does not record conditions associated with conditional branch
-// edges, nor the short-circuit semantics of the && and || operators,
-// nor abnormal control flow caused by panic. If you need this
-// information, use golang.org/x/tools/go/ssa instead.
-//
-package cfg
-
-// Although the vet tool has type information, it is often extremely
-// fragmentary, so for simplicity this package does not depend on
-// go/types. Consequently control-flow conditions are ignored even
-// when constant, and "mayReturn" information must be provided by the
-// client.
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/format"
- "go/token"
-)
-
-// A CFG represents the control-flow graph of a single function.
-//
-// The entry point is Blocks[0]; there may be multiple return blocks.
-type CFG struct {
- Blocks []*Block // block[0] is entry; order otherwise undefined
-}
-
-// A Block represents a basic block: a list of statements and
-// expressions that are always evaluated sequentially.
-//
-// A block may have 0-2 successors: zero for a return block or a block
-// that calls a function such as panic that never returns; one for a
-// normal (jump) block; and two for a conditional (if) block.
-type Block struct {
- Nodes []ast.Node // statements, expressions, and ValueSpecs
- Succs []*Block // successor nodes in the graph
-
- comment string // for debugging
- index int32 // index within CFG.Blocks
- unreachable bool // is block of stmts following return/panic/for{}
- succs2 [2]*Block // underlying array for Succs
-}
-
-// New returns a new control-flow graph for the specified function body,
-// which must be non-nil.
-//
-// The CFG builder calls mayReturn to determine whether a given function
-// call may return. For example, calls to panic, os.Exit, and log.Fatal
-// do not return, so the builder can remove infeasible graph edges
-// following such calls. The builder calls mayReturn only for a
-// CallExpr beneath an ExprStmt.
-func New(body *ast.BlockStmt, mayReturn func(*ast.CallExpr) bool) *CFG {
- b := builder{
- mayReturn: mayReturn,
- cfg: new(CFG),
- }
- b.current = b.newBlock("entry")
- b.stmt(body)
-
- // Does control fall off the end of the function's body?
- // Make implicit return explicit.
- if b.current != nil && !b.current.unreachable {
- b.add(&ast.ReturnStmt{
- Return: body.End() - 1,
- })
- }
-
- return b.cfg
-}
-
-func (b *Block) String() string {
- return fmt.Sprintf("block %d (%s)", b.index, b.comment)
-}
-
-// Return returns the return statement at the end of this block if present, nil otherwise.
-func (b *Block) Return() (ret *ast.ReturnStmt) {
- if len(b.Nodes) > 0 {
- ret, _ = b.Nodes[len(b.Nodes)-1].(*ast.ReturnStmt)
- }
- return
-}
-
-// Format formats the control-flow graph for ease of debugging.
-func (g *CFG) Format(fset *token.FileSet) string {
- var buf bytes.Buffer
- for _, b := range g.Blocks {
- fmt.Fprintf(&buf, ".%d: # %s\n", b.index, b.comment)
- for _, n := range b.Nodes {
- fmt.Fprintf(&buf, "\t%s\n", formatNode(fset, n))
- }
- if len(b.Succs) > 0 {
- fmt.Fprintf(&buf, "\tsuccs:")
- for _, succ := range b.Succs {
- fmt.Fprintf(&buf, " %d", succ.index)
- }
- buf.WriteByte('\n')
- }
- buf.WriteByte('\n')
- }
- return buf.String()
-}
-
-func formatNode(fset *token.FileSet, n ast.Node) string {
- var buf bytes.Buffer
- format.Node(&buf, fset, n)
- // Indent secondary lines by a tab.
- return string(bytes.Replace(buf.Bytes(), []byte("\n"), []byte("\n\t"), -1))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/whitelist/whitelist.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/whitelist/whitelist.go
deleted file mode 100644
index fdd65d373..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/internal/whitelist/whitelist.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package whitelist defines exceptions for the vet tool.
-package whitelist
-
-// UnkeyedLiteral is a white list of types in the standard packages
-// that are used with unkeyed literals we deem to be acceptable.
-var UnkeyedLiteral = map[string]bool{
- // These image and image/color struct types are frozen. We will never add fields to them.
- "image/color.Alpha16": true,
- "image/color.Alpha": true,
- "image/color.CMYK": true,
- "image/color.Gray16": true,
- "image/color.Gray": true,
- "image/color.NRGBA64": true,
- "image/color.NRGBA": true,
- "image/color.NYCbCrA": true,
- "image/color.RGBA64": true,
- "image/color.RGBA": true,
- "image/color.YCbCr": true,
- "image.Point": true,
- "image.Rectangle": true,
- "image.Uniform": true,
-
- "unicode.Range16": true,
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/lostcancel.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/lostcancel.go
deleted file mode 100644
index adaff23e1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/lostcancel.go
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "github.com/dnephin/govet/internal/cfg"
- "fmt"
- "go/ast"
- "go/types"
- "strconv"
-)
-
-func init() {
- register("lostcancel",
- "check for failure to call cancelation function returned by context.WithCancel",
- checkLostCancel,
- funcDecl, funcLit)
-}
-
-const debugLostCancel = false
-
-var contextPackage = "context"
-
-// checkLostCancel reports a failure to the call the cancel function
-// returned by context.WithCancel, either because the variable was
-// assigned to the blank identifier, or because there exists a
-// control-flow path from the call to a return statement and that path
-// does not "use" the cancel function. Any reference to the variable
-// counts as a use, even within a nested function literal.
-//
-// checkLostCancel analyzes a single named or literal function.
-func checkLostCancel(f *File, node ast.Node) {
- // Fast path: bypass check if file doesn't use context.WithCancel.
- if !hasImport(f.file, contextPackage) {
- return
- }
-
- // Maps each cancel variable to its defining ValueSpec/AssignStmt.
- cancelvars := make(map[*types.Var]ast.Node)
-
- // Find the set of cancel vars to analyze.
- stack := make([]ast.Node, 0, 32)
- ast.Inspect(node, func(n ast.Node) bool {
- switch n.(type) {
- case *ast.FuncLit:
- if len(stack) > 0 {
- return false // don't stray into nested functions
- }
- case nil:
- stack = stack[:len(stack)-1] // pop
- return true
- }
- stack = append(stack, n) // push
-
- // Look for [{AssignStmt,ValueSpec} CallExpr SelectorExpr]:
- //
- // ctx, cancel := context.WithCancel(...)
- // ctx, cancel = context.WithCancel(...)
- // var ctx, cancel = context.WithCancel(...)
- //
- if isContextWithCancel(f, n) && isCall(stack[len(stack)-2]) {
- var id *ast.Ident // id of cancel var
- stmt := stack[len(stack)-3]
- switch stmt := stmt.(type) {
- case *ast.ValueSpec:
- if len(stmt.Names) > 1 {
- id = stmt.Names[1]
- }
- case *ast.AssignStmt:
- if len(stmt.Lhs) > 1 {
- id, _ = stmt.Lhs[1].(*ast.Ident)
- }
- }
- if id != nil {
- if id.Name == "_" {
- f.Badf(id.Pos(), "the cancel function returned by context.%s should be called, not discarded, to avoid a context leak",
- n.(*ast.SelectorExpr).Sel.Name)
- } else if v, ok := f.pkg.uses[id].(*types.Var); ok {
- cancelvars[v] = stmt
- } else if v, ok := f.pkg.defs[id].(*types.Var); ok {
- cancelvars[v] = stmt
- }
- }
- }
-
- return true
- })
-
- if len(cancelvars) == 0 {
- return // no need to build CFG
- }
-
- // Tell the CFG builder which functions never return.
- info := &types.Info{Uses: f.pkg.uses, Selections: f.pkg.selectors}
- mayReturn := func(call *ast.CallExpr) bool {
- name := callName(info, call)
- return !noReturnFuncs[name]
- }
-
- // Build the CFG.
- var g *cfg.CFG
- var sig *types.Signature
- switch node := node.(type) {
- case *ast.FuncDecl:
- sig, _ = f.pkg.defs[node.Name].Type().(*types.Signature)
- g = cfg.New(node.Body, mayReturn)
- case *ast.FuncLit:
- sig, _ = f.pkg.types[node.Type].Type.(*types.Signature)
- g = cfg.New(node.Body, mayReturn)
- }
-
- // Print CFG.
- if debugLostCancel {
- fmt.Println(g.Format(f.fset))
- }
-
- // Examine the CFG for each variable in turn.
- // (It would be more efficient to analyze all cancelvars in a
- // single pass over the AST, but seldom is there more than one.)
- for v, stmt := range cancelvars {
- if ret := lostCancelPath(f, g, v, stmt, sig); ret != nil {
- lineno := f.fset.Position(stmt.Pos()).Line
- f.Badf(stmt.Pos(), "the %s function is not used on all paths (possible context leak)", v.Name())
- f.Badf(ret.Pos(), "this return statement may be reached without using the %s var defined on line %d", v.Name(), lineno)
- }
- }
-}
-
-func isCall(n ast.Node) bool { _, ok := n.(*ast.CallExpr); return ok }
-
-func hasImport(f *ast.File, path string) bool {
- for _, imp := range f.Imports {
- v, _ := strconv.Unquote(imp.Path.Value)
- if v == path {
- return true
- }
- }
- return false
-}
-
-// isContextWithCancel reports whether n is one of the qualified identifiers
-// context.With{Cancel,Timeout,Deadline}.
-func isContextWithCancel(f *File, n ast.Node) bool {
- if sel, ok := n.(*ast.SelectorExpr); ok {
- switch sel.Sel.Name {
- case "WithCancel", "WithTimeout", "WithDeadline":
- if x, ok := sel.X.(*ast.Ident); ok {
- if pkgname, ok := f.pkg.uses[x].(*types.PkgName); ok {
- return pkgname.Imported().Path() == contextPackage
- }
- // Import failed, so we can't check package path.
- // Just check the local package name (heuristic).
- return x.Name == "context"
- }
- }
- }
- return false
-}
-
-// lostCancelPath finds a path through the CFG, from stmt (which defines
-// the 'cancel' variable v) to a return statement, that doesn't "use" v.
-// If it finds one, it returns the return statement (which may be synthetic).
-// sig is the function's type, if known.
-func lostCancelPath(f *File, g *cfg.CFG, v *types.Var, stmt ast.Node, sig *types.Signature) *ast.ReturnStmt {
- vIsNamedResult := sig != nil && tupleContains(sig.Results(), v)
-
- // uses reports whether stmts contain a "use" of variable v.
- uses := func(f *File, v *types.Var, stmts []ast.Node) bool {
- found := false
- for _, stmt := range stmts {
- ast.Inspect(stmt, func(n ast.Node) bool {
- switch n := n.(type) {
- case *ast.Ident:
- if f.pkg.uses[n] == v {
- found = true
- }
- case *ast.ReturnStmt:
- // A naked return statement counts as a use
- // of the named result variables.
- if n.Results == nil && vIsNamedResult {
- found = true
- }
- }
- return !found
- })
- }
- return found
- }
-
- // blockUses computes "uses" for each block, caching the result.
- memo := make(map[*cfg.Block]bool)
- blockUses := func(f *File, v *types.Var, b *cfg.Block) bool {
- res, ok := memo[b]
- if !ok {
- res = uses(f, v, b.Nodes)
- memo[b] = res
- }
- return res
- }
-
- // Find the var's defining block in the CFG,
- // plus the rest of the statements of that block.
- var defblock *cfg.Block
- var rest []ast.Node
-outer:
- for _, b := range g.Blocks {
- for i, n := range b.Nodes {
- if n == stmt {
- defblock = b
- rest = b.Nodes[i+1:]
- break outer
- }
- }
- }
- if defblock == nil {
- panic("internal error: can't find defining block for cancel var")
- }
-
- // Is v "used" in the remainder of its defining block?
- if uses(f, v, rest) {
- return nil
- }
-
- // Does the defining block return without using v?
- if ret := defblock.Return(); ret != nil {
- return ret
- }
-
- // Search the CFG depth-first for a path, from defblock to a
- // return block, in which v is never "used".
- seen := make(map[*cfg.Block]bool)
- var search func(blocks []*cfg.Block) *ast.ReturnStmt
- search = func(blocks []*cfg.Block) *ast.ReturnStmt {
- for _, b := range blocks {
- if !seen[b] {
- seen[b] = true
-
- // Prune the search if the block uses v.
- if blockUses(f, v, b) {
- continue
- }
-
- // Found path to return statement?
- if ret := b.Return(); ret != nil {
- if debugLostCancel {
- fmt.Printf("found path to return in block %s\n", b)
- }
- return ret // found
- }
-
- // Recur
- if ret := search(b.Succs); ret != nil {
- if debugLostCancel {
- fmt.Printf(" from block %s\n", b)
- }
- return ret
- }
- }
- }
- return nil
- }
- return search(defblock.Succs)
-}
-
-func tupleContains(tuple *types.Tuple, v *types.Var) bool {
- for i := 0; i < tuple.Len(); i++ {
- if tuple.At(i) == v {
- return true
- }
- }
- return false
-}
-
-var noReturnFuncs = map[string]bool{
- "(*testing.common).FailNow": true,
- "(*testing.common).Fatal": true,
- "(*testing.common).Fatalf": true,
- "(*testing.common).Skip": true,
- "(*testing.common).SkipNow": true,
- "(*testing.common).Skipf": true,
- "log.Fatal": true,
- "log.Fatalf": true,
- "log.Fatalln": true,
- "os.Exit": true,
- "panic": true,
- "runtime.Goexit": true,
-}
-
-// callName returns the canonical name of the builtin, method, or
-// function called by call, if known.
-func callName(info *types.Info, call *ast.CallExpr) string {
- switch fun := call.Fun.(type) {
- case *ast.Ident:
- // builtin, e.g. "panic"
- if obj, ok := info.Uses[fun].(*types.Builtin); ok {
- return obj.Name()
- }
- case *ast.SelectorExpr:
- if sel, ok := info.Selections[fun]; ok && sel.Kind() == types.MethodVal {
- // method call, e.g. "(*testing.common).Fatal"
- meth := sel.Obj()
- return fmt.Sprintf("(%s).%s",
- meth.Type().(*types.Signature).Recv().Type(),
- meth.Name())
- }
- if obj, ok := info.Uses[fun.Sel]; ok {
- // qualified identifier, e.g. "os.Exit"
- return fmt.Sprintf("%s.%s",
- obj.Pkg().Path(),
- obj.Name())
- }
- }
-
- // function with no name, or defined in missing imported package
- return ""
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/main.go
deleted file mode 100644
index df6e0e16f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/main.go
+++ /dev/null
@@ -1,504 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Vet is a simple checker for static errors in Go source code.
-// See doc.go for more information.
-package main
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/printer"
- "go/token"
- "go/types"
- "io/ioutil"
- "os"
- "path/filepath"
- "strconv"
- "strings"
-)
-
-var (
- verbose = flag.Bool("v", false, "verbose")
- tags = flag.String("tags", "", "comma-separated list of build tags to apply when parsing")
- noRecurse = flag.Bool("no-recurse", false, "disable recursive directory walking")
- tagList = []string{} // exploded version of tags flag; set in main
-)
-
-var exitCode = 0
-
-// "-all" flag enables all non-experimental checks
-var all = triStateFlag("all", unset, "enable all non-experimental checks")
-
-// Flags to control which individual checks to perform.
-var report = map[string]*triState{
- // Only unusual checks are written here.
- // Most checks that operate during the AST walk are added by register.
- "asmdecl": triStateFlag("asmdecl", unset, "check assembly against Go declarations"),
- "buildtags": triStateFlag("buildtags", unset, "check that +build tags are valid"),
-}
-
-// experimental records the flags enabling experimental features. These must be
-// requested explicitly; they are not enabled by -all.
-var experimental = map[string]bool{}
-
-// setTrueCount record how many flags are explicitly set to true.
-var setTrueCount int
-
-// dirsRun and filesRun indicate whether the vet is applied to directory or
-// file targets. The distinction affects which checks are run.
-var dirsRun, filesRun bool
-
-// includesNonTest indicates whether the vet is applied to non-test targets.
-// Certain checks are relevant only if they touch both test and non-test files.
-var includesNonTest bool
-
-// A triState is a boolean that knows whether it has been set to either true or false.
-// It is used to identify if a flag appears; the standard boolean flag cannot
-// distinguish missing from unset. It also satisfies flag.Value.
-type triState int
-
-const (
- unset triState = iota
- setTrue
- setFalse
-)
-
-func triStateFlag(name string, value triState, usage string) *triState {
- flag.Var(&value, name, usage)
- return &value
-}
-
-// triState implements flag.Value, flag.Getter, and flag.boolFlag.
-// They work like boolean flags: we can say vet -printf as well as vet -printf=true
-func (ts *triState) Get() interface{} {
- return *ts == setTrue
-}
-
-func (ts triState) isTrue() bool {
- return ts == setTrue
-}
-
-func (ts *triState) Set(value string) error {
- b, err := strconv.ParseBool(value)
- if err != nil {
- return err
- }
- if b {
- *ts = setTrue
- setTrueCount++
- } else {
- *ts = setFalse
- }
- return nil
-}
-
-func (ts *triState) String() string {
- switch *ts {
- case unset:
- return "true" // An unset flag will be set by -all, so defaults to true.
- case setTrue:
- return "true"
- case setFalse:
- return "false"
- }
- panic("not reached")
-}
-
-func (ts triState) IsBoolFlag() bool {
- return true
-}
-
-// vet tells whether to report errors for the named check, a flag name.
-func vet(name string) bool {
- return report[name].isTrue()
-}
-
-// setExit sets the value for os.Exit when it is called, later. It
-// remembers the highest value.
-func setExit(err int) {
- if err > exitCode {
- exitCode = err
- }
-}
-
-var (
- // Each of these vars has a corresponding case in (*File).Visit.
- assignStmt *ast.AssignStmt
- binaryExpr *ast.BinaryExpr
- callExpr *ast.CallExpr
- compositeLit *ast.CompositeLit
- exprStmt *ast.ExprStmt
- field *ast.Field
- funcDecl *ast.FuncDecl
- funcLit *ast.FuncLit
- genDecl *ast.GenDecl
- interfaceType *ast.InterfaceType
- rangeStmt *ast.RangeStmt
- returnStmt *ast.ReturnStmt
-
- // checkers is a two-level map.
- // The outer level is keyed by a nil pointer, one of the AST vars above.
- // The inner level is keyed by checker name.
- checkers = make(map[ast.Node]map[string]func(*File, ast.Node))
-)
-
-func register(name, usage string, fn func(*File, ast.Node), types ...ast.Node) {
- report[name] = triStateFlag(name, unset, usage)
- for _, typ := range types {
- m := checkers[typ]
- if m == nil {
- m = make(map[string]func(*File, ast.Node))
- checkers[typ] = m
- }
- m[name] = fn
- }
-}
-
-// Usage is a replacement usage function for the flags package.
-func Usage() {
- fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
- fmt.Fprintf(os.Stderr, "\tvet [flags] directory...\n")
- fmt.Fprintf(os.Stderr, "\tvet [flags] files... # Must be a single package\n")
- fmt.Fprintf(os.Stderr, "By default, -all is set and all non-experimental checks are run.\n")
- fmt.Fprintf(os.Stderr, "For more information run\n")
- fmt.Fprintf(os.Stderr, "\tgo doc cmd/vet\n\n")
- fmt.Fprintf(os.Stderr, "Flags:\n")
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-// File is a wrapper for the state of a file used in the parser.
-// The parse tree walkers are all methods of this type.
-type File struct {
- pkg *Package
- fset *token.FileSet
- name string
- content []byte
- file *ast.File
- b bytes.Buffer // for use by methods
-
- // Parsed package "foo" when checking package "foo_test"
- basePkg *Package
-
- // The objects that are receivers of a "String() string" method.
- // This is used by the recursiveStringer method in print.go.
- stringers map[*ast.Object]bool
-
- // Registered checkers to run.
- checkers map[ast.Node][]func(*File, ast.Node)
-}
-
-func main() {
- flag.Usage = Usage
- flag.Parse()
-
- // If any flag is set, we run only those checks requested.
- // If all flag is set true or if no flags are set true, set all the non-experimental ones
- // not explicitly set (in effect, set the "-all" flag).
- if setTrueCount == 0 || *all == setTrue {
- for name, setting := range report {
- if *setting == unset && !experimental[name] {
- *setting = setTrue
- }
- }
- }
-
- tagList = strings.Split(*tags, ",")
-
- initPrintFlags()
- initUnusedFlags()
-
- if flag.NArg() == 0 {
- Usage()
- }
- for _, name := range flag.Args() {
- // Is it a directory?
- fi, err := os.Stat(name)
- if err != nil {
- warnf("error walking tree: %s", err)
- continue
- }
- if fi.IsDir() {
- dirsRun = true
- } else {
- filesRun = true
- if !strings.HasSuffix(name, "_test.go") {
- includesNonTest = true
- }
- }
- }
- if dirsRun && filesRun {
- Usage()
- }
- if dirsRun {
- for _, name := range flag.Args() {
- if *noRecurse {
- doPackageDir(name)
- } else {
- walkDir(name)
- }
- }
- os.Exit(exitCode)
- }
- if doPackage(".", flag.Args(), nil) == nil {
- warnf("no files checked")
- }
- os.Exit(exitCode)
-}
-
-// prefixDirectory places the directory name on the beginning of each name in the list.
-func prefixDirectory(directory string, names []string) {
- if directory != "." {
- for i, name := range names {
- names[i] = filepath.Join(directory, name)
- }
- }
-}
-
-// doPackageDir analyzes the single package found in the directory, if there is one,
-// plus a test package, if there is one.
-func doPackageDir(directory string) {
- context := build.Default
- if len(context.BuildTags) != 0 {
- warnf("build tags %s previously set", context.BuildTags)
- }
- context.BuildTags = append(tagList, context.BuildTags...)
-
- pkg, err := context.ImportDir(directory, 0)
- if err != nil {
- // If it's just that there are no go source files, that's fine.
- if _, nogo := err.(*build.NoGoError); nogo {
- return
- }
- // Non-fatal: we are doing a recursive walk and there may be other directories.
- warnf("cannot process directory %s: %s", directory, err)
- return
- }
- var names []string
- names = append(names, pkg.GoFiles...)
- names = append(names, pkg.CgoFiles...)
- names = append(names, pkg.TestGoFiles...) // These are also in the "foo" package.
- names = append(names, pkg.SFiles...)
- prefixDirectory(directory, names)
- basePkg := doPackage(directory, names, nil)
- // Is there also a "foo_test" package? If so, do that one as well.
- if len(pkg.XTestGoFiles) > 0 {
- names = pkg.XTestGoFiles
- prefixDirectory(directory, names)
- doPackage(directory, names, basePkg)
- }
-}
-
-type Package struct {
- path string
- defs map[*ast.Ident]types.Object
- uses map[*ast.Ident]types.Object
- selectors map[*ast.SelectorExpr]*types.Selection
- types map[ast.Expr]types.TypeAndValue
- spans map[types.Object]Span
- files []*File
- typesPkg *types.Package
-}
-
-// doPackage analyzes the single package constructed from the named files.
-// It returns the parsed Package or nil if none of the files have been checked.
-func doPackage(directory string, names []string, basePkg *Package) *Package {
- var files []*File
- var astFiles []*ast.File
- fs := token.NewFileSet()
- for _, name := range names {
- data, err := ioutil.ReadFile(name)
- if err != nil {
- // Warn but continue to next package.
- warnf("%s: %s", name, err)
- return nil
- }
- checkBuildTag(name, data)
- var parsedFile *ast.File
- if strings.HasSuffix(name, ".go") {
- parsedFile, err = parser.ParseFile(fs, name, data, 0)
- if err != nil {
- warnf("%s: %s", name, err)
- return nil
- }
- astFiles = append(astFiles, parsedFile)
- }
- files = append(files, &File{fset: fs, content: data, name: name, file: parsedFile})
- }
- if len(astFiles) == 0 {
- return nil
- }
- pkg := new(Package)
- pkg.path = astFiles[0].Name.Name
- pkg.files = files
- // Type check the package.
- err := pkg.check(fs, astFiles)
- if err != nil && *verbose {
- warnf("%s", err)
- }
-
- // Check.
- chk := make(map[ast.Node][]func(*File, ast.Node))
- for typ, set := range checkers {
- for name, fn := range set {
- if vet(name) {
- chk[typ] = append(chk[typ], fn)
- }
- }
- }
- for _, file := range files {
- file.pkg = pkg
- file.basePkg = basePkg
- file.checkers = chk
- if file.file != nil {
- file.walkFile(file.name, file.file)
- }
- }
- asmCheck(pkg)
- return pkg
-}
-
-func visit(path string, f os.FileInfo, err error) error {
- if err != nil {
- warnf("walk error: %s", err)
- return err
- }
- // One package per directory. Ignore the files themselves.
- if !f.IsDir() {
- return nil
- }
- doPackageDir(path)
- return nil
-}
-
-func (pkg *Package) hasFileWithSuffix(suffix string) bool {
- for _, f := range pkg.files {
- if strings.HasSuffix(f.name, suffix) {
- return true
- }
- }
- return false
-}
-
-// walkDir recursively walks the tree looking for Go packages.
-func walkDir(root string) {
- filepath.Walk(root, visit)
-}
-
-// errorf formats the error to standard error, adding program
-// identification and a newline, and exits.
-func errorf(format string, args ...interface{}) {
- fmt.Fprintf(os.Stderr, "vet: "+format+"\n", args...)
- os.Exit(2)
-}
-
-// warnf formats the error to standard error, adding program
-// identification and a newline, but does not exit.
-func warnf(format string, args ...interface{}) {
- fmt.Fprintf(os.Stderr, "vet: "+format+"\n", args...)
- setExit(1)
-}
-
-// Println is fmt.Println guarded by -v.
-func Println(args ...interface{}) {
- if !*verbose {
- return
- }
- fmt.Println(args...)
-}
-
-// Printf is fmt.Printf guarded by -v.
-func Printf(format string, args ...interface{}) {
- if !*verbose {
- return
- }
- fmt.Printf(format+"\n", args...)
-}
-
-// Bad reports an error and sets the exit code..
-func (f *File) Bad(pos token.Pos, args ...interface{}) {
- f.Warn(pos, args...)
- setExit(1)
-}
-
-// Badf reports a formatted error and sets the exit code.
-func (f *File) Badf(pos token.Pos, format string, args ...interface{}) {
- f.Warnf(pos, format, args...)
- setExit(1)
-}
-
-// loc returns a formatted representation of the position.
-func (f *File) loc(pos token.Pos) string {
- if pos == token.NoPos {
- return ""
- }
- // Do not print columns. Because the pos often points to the start of an
- // expression instead of the inner part with the actual error, the
- // precision can mislead.
- posn := f.fset.Position(pos)
- return fmt.Sprintf("%s:%d", posn.Filename, posn.Line)
-}
-
-// Warn reports an error but does not set the exit code.
-func (f *File) Warn(pos token.Pos, args ...interface{}) {
- fmt.Fprintf(os.Stderr, "%s: %s", f.loc(pos), fmt.Sprintln(args...))
-}
-
-// Warnf reports a formatted error but does not set the exit code.
-func (f *File) Warnf(pos token.Pos, format string, args ...interface{}) {
- fmt.Fprintf(os.Stderr, "%s: %s\n", f.loc(pos), fmt.Sprintf(format, args...))
-}
-
-// walkFile walks the file's tree.
-func (f *File) walkFile(name string, file *ast.File) {
- Println("Checking file", name)
- ast.Walk(f, file)
-}
-
-// Visit implements the ast.Visitor interface.
-func (f *File) Visit(node ast.Node) ast.Visitor {
- var key ast.Node
- switch node.(type) {
- case *ast.AssignStmt:
- key = assignStmt
- case *ast.BinaryExpr:
- key = binaryExpr
- case *ast.CallExpr:
- key = callExpr
- case *ast.CompositeLit:
- key = compositeLit
- case *ast.ExprStmt:
- key = exprStmt
- case *ast.Field:
- key = field
- case *ast.FuncDecl:
- key = funcDecl
- case *ast.FuncLit:
- key = funcLit
- case *ast.GenDecl:
- key = genDecl
- case *ast.InterfaceType:
- key = interfaceType
- case *ast.RangeStmt:
- key = rangeStmt
- case *ast.ReturnStmt:
- key = returnStmt
- }
- for _, fn := range f.checkers[key] {
- fn(f, node)
- }
- return f
-}
-
-// gofmt returns a string representation of the expression.
-func (f *File) gofmt(x ast.Expr) string {
- f.b.Reset()
- printer.Fprint(&f.b, f.fset, x)
- return f.b.String()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/method.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/method.go
deleted file mode 100644
index 8a554e152..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/method.go
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the code to check canonical methods.
-
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/printer"
- "strings"
-)
-
-func init() {
- register("methods",
- "check that canonically named methods are canonically defined",
- checkCanonicalMethod,
- funcDecl, interfaceType)
-}
-
-type MethodSig struct {
- args []string
- results []string
-}
-
-// canonicalMethods lists the input and output types for Go methods
-// that are checked using dynamic interface checks. Because the
-// checks are dynamic, such methods would not cause a compile error
-// if they have the wrong signature: instead the dynamic check would
-// fail, sometimes mysteriously. If a method is found with a name listed
-// here but not the input/output types listed here, vet complains.
-//
-// A few of the canonical methods have very common names.
-// For example, a type might implement a Scan method that
-// has nothing to do with fmt.Scanner, but we still want to check
-// the methods that are intended to implement fmt.Scanner.
-// To do that, the arguments that have a = prefix are treated as
-// signals that the canonical meaning is intended: if a Scan
-// method doesn't have a fmt.ScanState as its first argument,
-// we let it go. But if it does have a fmt.ScanState, then the
-// rest has to match.
-var canonicalMethods = map[string]MethodSig{
- // "Flush": {{}, {"error"}}, // http.Flusher and jpeg.writer conflict
- "Format": {[]string{"=fmt.State", "rune"}, []string{}}, // fmt.Formatter
- "GobDecode": {[]string{"[]byte"}, []string{"error"}}, // gob.GobDecoder
- "GobEncode": {[]string{}, []string{"[]byte", "error"}}, // gob.GobEncoder
- "MarshalJSON": {[]string{}, []string{"[]byte", "error"}}, // json.Marshaler
- "MarshalXML": {[]string{"*xml.Encoder", "xml.StartElement"}, []string{"error"}}, // xml.Marshaler
- "Peek": {[]string{"=int"}, []string{"[]byte", "error"}}, // image.reader (matching bufio.Reader)
- "ReadByte": {[]string{}, []string{"byte", "error"}}, // io.ByteReader
- "ReadFrom": {[]string{"=io.Reader"}, []string{"int64", "error"}}, // io.ReaderFrom
- "ReadRune": {[]string{}, []string{"rune", "int", "error"}}, // io.RuneReader
- "Scan": {[]string{"=fmt.ScanState", "rune"}, []string{"error"}}, // fmt.Scanner
- "Seek": {[]string{"=int64", "int"}, []string{"int64", "error"}}, // io.Seeker
- "UnmarshalJSON": {[]string{"[]byte"}, []string{"error"}}, // json.Unmarshaler
- "UnmarshalXML": {[]string{"*xml.Decoder", "xml.StartElement"}, []string{"error"}}, // xml.Unmarshaler
- "UnreadByte": {[]string{}, []string{"error"}},
- "UnreadRune": {[]string{}, []string{"error"}},
- "WriteByte": {[]string{"byte"}, []string{"error"}}, // jpeg.writer (matching bufio.Writer)
- "WriteTo": {[]string{"=io.Writer"}, []string{"int64", "error"}}, // io.WriterTo
-}
-
-func checkCanonicalMethod(f *File, node ast.Node) {
- switch n := node.(type) {
- case *ast.FuncDecl:
- if n.Recv != nil {
- canonicalMethod(f, n.Name, n.Type)
- }
- case *ast.InterfaceType:
- for _, field := range n.Methods.List {
- for _, id := range field.Names {
- canonicalMethod(f, id, field.Type.(*ast.FuncType))
- }
- }
- }
-}
-
-func canonicalMethod(f *File, id *ast.Ident, t *ast.FuncType) {
- // Expected input/output.
- expect, ok := canonicalMethods[id.Name]
- if !ok {
- return
- }
-
- // Actual input/output
- args := typeFlatten(t.Params.List)
- var results []ast.Expr
- if t.Results != nil {
- results = typeFlatten(t.Results.List)
- }
-
- // Do the =s (if any) all match?
- if !f.matchParams(expect.args, args, "=") || !f.matchParams(expect.results, results, "=") {
- return
- }
-
- // Everything must match.
- if !f.matchParams(expect.args, args, "") || !f.matchParams(expect.results, results, "") {
- expectFmt := id.Name + "(" + argjoin(expect.args) + ")"
- if len(expect.results) == 1 {
- expectFmt += " " + argjoin(expect.results)
- } else if len(expect.results) > 1 {
- expectFmt += " (" + argjoin(expect.results) + ")"
- }
-
- f.b.Reset()
- if err := printer.Fprint(&f.b, f.fset, t); err != nil {
- fmt.Fprintf(&f.b, "<%s>", err)
- }
- actual := f.b.String()
- actual = strings.TrimPrefix(actual, "func")
- actual = id.Name + actual
-
- f.Badf(id.Pos(), "method %s should have signature %s", actual, expectFmt)
- }
-}
-
-func argjoin(x []string) string {
- y := make([]string, len(x))
- for i, s := range x {
- if s[0] == '=' {
- s = s[1:]
- }
- y[i] = s
- }
- return strings.Join(y, ", ")
-}
-
-// Turn parameter list into slice of types
-// (in the ast, types are Exprs).
-// Have to handle f(int, bool) and f(x, y, z int)
-// so not a simple 1-to-1 conversion.
-func typeFlatten(l []*ast.Field) []ast.Expr {
- var t []ast.Expr
- for _, f := range l {
- if len(f.Names) == 0 {
- t = append(t, f.Type)
- continue
- }
- for _ = range f.Names {
- t = append(t, f.Type)
- }
- }
- return t
-}
-
-// Does each type in expect with the given prefix match the corresponding type in actual?
-func (f *File) matchParams(expect []string, actual []ast.Expr, prefix string) bool {
- for i, x := range expect {
- if !strings.HasPrefix(x, prefix) {
- continue
- }
- if i >= len(actual) {
- return false
- }
- if !f.matchParamType(x, actual[i]) {
- return false
- }
- }
- if prefix == "" && len(actual) > len(expect) {
- return false
- }
- return true
-}
-
-// Does this one type match?
-func (f *File) matchParamType(expect string, actual ast.Expr) bool {
- if strings.HasPrefix(expect, "=") {
- expect = expect[1:]
- }
- // Strip package name if we're in that package.
- if n := len(f.file.Name.Name); len(expect) > n && expect[:n] == f.file.Name.Name && expect[n] == '.' {
- expect = expect[n+1:]
- }
-
- // Overkill but easy.
- f.b.Reset()
- printer.Fprint(&f.b, f.fset, actual)
- return f.b.String() == expect
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/nilfunc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/nilfunc.go
deleted file mode 100644
index bfe05e335..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/nilfunc.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-This file contains the code to check for useless function comparisons.
-A useless comparison is one like f == nil as opposed to f() == nil.
-*/
-
-package main
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-)
-
-func init() {
- register("nilfunc",
- "check for comparisons between functions and nil",
- checkNilFuncComparison,
- binaryExpr)
-}
-
-func checkNilFuncComparison(f *File, node ast.Node) {
- e := node.(*ast.BinaryExpr)
-
- // Only want == or != comparisons.
- if e.Op != token.EQL && e.Op != token.NEQ {
- return
- }
-
- // Only want comparisons with a nil identifier on one side.
- var e2 ast.Expr
- switch {
- case f.isNil(e.X):
- e2 = e.Y
- case f.isNil(e.Y):
- e2 = e.X
- default:
- return
- }
-
- // Only want identifiers or selector expressions.
- var obj types.Object
- switch v := e2.(type) {
- case *ast.Ident:
- obj = f.pkg.uses[v]
- case *ast.SelectorExpr:
- obj = f.pkg.uses[v.Sel]
- default:
- return
- }
-
- // Only want functions.
- if _, ok := obj.(*types.Func); !ok {
- return
- }
-
- f.Badf(e.Pos(), "comparison of function %v %v nil is always %v", obj.Name(), e.Op, e.Op == token.NEQ)
-}
-
-// isNil reports whether the provided expression is the built-in nil
-// identifier.
-func (f *File) isNil(e ast.Expr) bool {
- return f.pkg.types[e].Type == types.Typ[types.UntypedNil]
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/print.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/print.go
deleted file mode 100644
index f4b985cfb..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/print.go
+++ /dev/null
@@ -1,650 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the printf-checker.
-
-package main
-
-import (
- "bytes"
- "flag"
- "go/ast"
- "go/constant"
- "go/token"
- "go/types"
- "strconv"
- "strings"
- "unicode/utf8"
-)
-
-var printfuncs = flag.String("printfuncs", "", "comma-separated list of print function names to check")
-
-func init() {
- register("printf",
- "check printf-like invocations",
- checkFmtPrintfCall,
- funcDecl, callExpr)
-}
-
-func initPrintFlags() {
- if *printfuncs == "" {
- return
- }
- for _, name := range strings.Split(*printfuncs, ",") {
- if len(name) == 0 {
- flag.Usage()
- }
-
- // Backwards compatibility: skip optional first argument
- // index after the colon.
- if colon := strings.LastIndex(name, ":"); colon > 0 {
- name = name[:colon]
- }
-
- name = strings.ToLower(name)
- if name[len(name)-1] == 'f' {
- isFormattedPrint[name] = true
- } else {
- isPrint[name] = true
- }
- }
-}
-
-// isFormattedPrint records the formatted-print functions. Names are
-// lower-cased so the lookup is case insensitive.
-var isFormattedPrint = map[string]bool{
- "errorf": true,
- "fatalf": true,
- "fprintf": true,
- "logf": true,
- "panicf": true,
- "printf": true,
- "sprintf": true,
-}
-
-// isPrint records the unformatted-print functions. Names are lower-cased
-// so the lookup is case insensitive.
-var isPrint = map[string]bool{
- "error": true,
- "fatal": true,
- "fprint": true,
- "fprintln": true,
- "log": true,
- "panic": true,
- "panicln": true,
- "print": true,
- "println": true,
- "sprint": true,
- "sprintln": true,
-}
-
-// formatString returns the format string argument and its index within
-// the given printf-like call expression.
-//
-// The last parameter before variadic arguments is assumed to be
-// a format string.
-//
-// The first string literal or string constant is assumed to be a format string
-// if the call's signature cannot be determined.
-//
-// If it cannot find any format string parameter, it returns ("", -1).
-func formatString(f *File, call *ast.CallExpr) (string, int) {
- typ := f.pkg.types[call.Fun].Type
- if typ != nil {
- if sig, ok := typ.(*types.Signature); ok {
- if !sig.Variadic() {
- // Skip checking non-variadic functions
- return "", -1
- }
- idx := sig.Params().Len() - 2
- if idx < 0 {
- // Skip checking variadic functions without
- // fixed arguments.
- return "", -1
- }
- s, ok := stringLiteralArg(f, call, idx)
- if !ok {
- // The last argument before variadic args isn't a string
- return "", -1
- }
- return s, idx
- }
- }
-
- // Cannot determine call's signature. Fallback to scanning for the first
- // string argument in the call
- for idx := range call.Args {
- if s, ok := stringLiteralArg(f, call, idx); ok {
- return s, idx
- }
- }
- return "", -1
-}
-
-// stringLiteralArg returns call's string constant argument at the index idx.
-//
-// ("", false) is returned if call's argument at the index idx isn't a string
-// literal.
-func stringLiteralArg(f *File, call *ast.CallExpr, idx int) (string, bool) {
- if idx >= len(call.Args) {
- return "", false
- }
- arg := call.Args[idx]
- lit := f.pkg.types[arg].Value
- if lit != nil && lit.Kind() == constant.String {
- return constant.StringVal(lit), true
- }
- return "", false
-}
-
-// checkCall triggers the print-specific checks if the call invokes a print function.
-func checkFmtPrintfCall(f *File, node ast.Node) {
- if d, ok := node.(*ast.FuncDecl); ok && isStringer(f, d) {
- // Remember we saw this.
- if f.stringers == nil {
- f.stringers = make(map[*ast.Object]bool)
- }
- if l := d.Recv.List; len(l) == 1 {
- if n := l[0].Names; len(n) == 1 {
- f.stringers[n[0].Obj] = true
- }
- }
- return
- }
-
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return
- }
- var Name string
- switch x := call.Fun.(type) {
- case *ast.Ident:
- Name = x.Name
- case *ast.SelectorExpr:
- Name = x.Sel.Name
- default:
- return
- }
-
- name := strings.ToLower(Name)
- if _, ok := isFormattedPrint[name]; ok {
- f.checkPrintf(call, Name)
- return
- }
- if _, ok := isPrint[name]; ok {
- f.checkPrint(call, Name)
- return
- }
-}
-
-// isStringer returns true if the provided declaration is a "String() string"
-// method, an implementation of fmt.Stringer.
-func isStringer(f *File, d *ast.FuncDecl) bool {
- return d.Recv != nil && d.Name.Name == "String" && d.Type.Results != nil &&
- len(d.Type.Params.List) == 0 && len(d.Type.Results.List) == 1 &&
- f.pkg.types[d.Type.Results.List[0].Type].Type == types.Typ[types.String]
-}
-
-// formatState holds the parsed representation of a printf directive such as "%3.*[4]d".
-// It is constructed by parsePrintfVerb.
-type formatState struct {
- verb rune // the format verb: 'd' for "%d"
- format string // the full format directive from % through verb, "%.3d".
- name string // Printf, Sprintf etc.
- flags []byte // the list of # + etc.
- argNums []int // the successive argument numbers that are consumed, adjusted to refer to actual arg in call
- indexed bool // whether an indexing expression appears: %[1]d.
- firstArg int // Index of first argument after the format in the Printf call.
- // Used only during parse.
- file *File
- call *ast.CallExpr
- argNum int // Which argument we're expecting to format now.
- indexPending bool // Whether we have an indexed argument that has not resolved.
- nbytes int // number of bytes of the format string consumed.
-}
-
-// checkPrintf checks a call to a formatted print routine such as Printf.
-func (f *File) checkPrintf(call *ast.CallExpr, name string) {
- format, idx := formatString(f, call)
- if idx < 0 {
- if *verbose {
- f.Warn(call.Pos(), "can't check non-constant format in call to", name)
- }
- return
- }
-
- firstArg := idx + 1 // Arguments are immediately after format string.
- if !strings.Contains(format, "%") {
- if len(call.Args) > firstArg {
- f.Badf(call.Pos(), "no formatting directive in %s call", name)
- }
- return
- }
- // Hard part: check formats against args.
- argNum := firstArg
- indexed := false
- for i, w := 0, 0; i < len(format); i += w {
- w = 1
- if format[i] == '%' {
- state := f.parsePrintfVerb(call, name, format[i:], firstArg, argNum)
- if state == nil {
- return
- }
- w = len(state.format)
- if state.indexed {
- indexed = true
- }
- if !f.okPrintfArg(call, state) { // One error per format is enough.
- return
- }
- if len(state.argNums) > 0 {
- // Continue with the next sequential argument.
- argNum = state.argNums[len(state.argNums)-1] + 1
- }
- }
- }
- // Dotdotdot is hard.
- if call.Ellipsis.IsValid() && argNum >= len(call.Args)-1 {
- return
- }
- // If the arguments were direct indexed, we assume the programmer knows what's up.
- // Otherwise, there should be no leftover arguments.
- if !indexed && argNum != len(call.Args) {
- expect := argNum - firstArg
- numArgs := len(call.Args) - firstArg
- f.Badf(call.Pos(), "wrong number of args for format in %s call: %d needed but %d args", name, expect, numArgs)
- }
-}
-
-// parseFlags accepts any printf flags.
-func (s *formatState) parseFlags() {
- for s.nbytes < len(s.format) {
- switch c := s.format[s.nbytes]; c {
- case '#', '0', '+', '-', ' ':
- s.flags = append(s.flags, c)
- s.nbytes++
- default:
- return
- }
- }
-}
-
-// scanNum advances through a decimal number if present.
-func (s *formatState) scanNum() {
- for ; s.nbytes < len(s.format); s.nbytes++ {
- c := s.format[s.nbytes]
- if c < '0' || '9' < c {
- return
- }
- }
-}
-
-// parseIndex scans an index expression. It returns false if there is a syntax error.
-func (s *formatState) parseIndex() bool {
- if s.nbytes == len(s.format) || s.format[s.nbytes] != '[' {
- return true
- }
- // Argument index present.
- s.indexed = true
- s.nbytes++ // skip '['
- start := s.nbytes
- s.scanNum()
- if s.nbytes == len(s.format) || s.nbytes == start || s.format[s.nbytes] != ']' {
- s.file.Badf(s.call.Pos(), "illegal syntax for printf argument index")
- return false
- }
- arg32, err := strconv.ParseInt(s.format[start:s.nbytes], 10, 32)
- if err != nil {
- s.file.Badf(s.call.Pos(), "illegal syntax for printf argument index: %s", err)
- return false
- }
- s.nbytes++ // skip ']'
- arg := int(arg32)
- arg += s.firstArg - 1 // We want to zero-index the actual arguments.
- s.argNum = arg
- s.indexPending = true
- return true
-}
-
-// parseNum scans a width or precision (or *). It returns false if there's a bad index expression.
-func (s *formatState) parseNum() bool {
- if s.nbytes < len(s.format) && s.format[s.nbytes] == '*' {
- if s.indexPending { // Absorb it.
- s.indexPending = false
- }
- s.nbytes++
- s.argNums = append(s.argNums, s.argNum)
- s.argNum++
- } else {
- s.scanNum()
- }
- return true
-}
-
-// parsePrecision scans for a precision. It returns false if there's a bad index expression.
-func (s *formatState) parsePrecision() bool {
- // If there's a period, there may be a precision.
- if s.nbytes < len(s.format) && s.format[s.nbytes] == '.' {
- s.flags = append(s.flags, '.') // Treat precision as a flag.
- s.nbytes++
- if !s.parseIndex() {
- return false
- }
- if !s.parseNum() {
- return false
- }
- }
- return true
-}
-
-// parsePrintfVerb looks the formatting directive that begins the format string
-// and returns a formatState that encodes what the directive wants, without looking
-// at the actual arguments present in the call. The result is nil if there is an error.
-func (f *File) parsePrintfVerb(call *ast.CallExpr, name, format string, firstArg, argNum int) *formatState {
- state := &formatState{
- format: format,
- name: name,
- flags: make([]byte, 0, 5),
- argNum: argNum,
- argNums: make([]int, 0, 1),
- nbytes: 1, // There's guaranteed to be a percent sign.
- indexed: false,
- firstArg: firstArg,
- file: f,
- call: call,
- }
- // There may be flags.
- state.parseFlags()
- indexPending := false
- // There may be an index.
- if !state.parseIndex() {
- return nil
- }
- // There may be a width.
- if !state.parseNum() {
- return nil
- }
- // There may be a precision.
- if !state.parsePrecision() {
- return nil
- }
- // Now a verb, possibly prefixed by an index (which we may already have).
- if !indexPending && !state.parseIndex() {
- return nil
- }
- if state.nbytes == len(state.format) {
- f.Badf(call.Pos(), "missing verb at end of format string in %s call", name)
- return nil
- }
- verb, w := utf8.DecodeRuneInString(state.format[state.nbytes:])
- state.verb = verb
- state.nbytes += w
- if verb != '%' {
- state.argNums = append(state.argNums, state.argNum)
- }
- state.format = state.format[:state.nbytes]
- return state
-}
-
-// printfArgType encodes the types of expressions a printf verb accepts. It is a bitmask.
-type printfArgType int
-
-const (
- argBool printfArgType = 1 << iota
- argInt
- argRune
- argString
- argFloat
- argComplex
- argPointer
- anyType printfArgType = ^0
-)
-
-type printVerb struct {
- verb rune // User may provide verb through Formatter; could be a rune.
- flags string // known flags are all ASCII
- typ printfArgType
-}
-
-// Common flag sets for printf verbs.
-const (
- noFlag = ""
- numFlag = " -+.0"
- sharpNumFlag = " -+.0#"
- allFlags = " -+.0#"
-)
-
-// printVerbs identifies which flags are known to printf for each verb.
-// TODO: A type that implements Formatter may do what it wants, and vet
-// will complain incorrectly.
-var printVerbs = []printVerb{
- // '-' is a width modifier, always valid.
- // '.' is a precision for float, max width for strings.
- // '+' is required sign for numbers, Go format for %v.
- // '#' is alternate format for several verbs.
- // ' ' is spacer for numbers
- {'%', noFlag, 0},
- {'b', numFlag, argInt | argFloat | argComplex},
- {'c', "-", argRune | argInt},
- {'d', numFlag, argInt},
- {'e', numFlag, argFloat | argComplex},
- {'E', numFlag, argFloat | argComplex},
- {'f', numFlag, argFloat | argComplex},
- {'F', numFlag, argFloat | argComplex},
- {'g', numFlag, argFloat | argComplex},
- {'G', numFlag, argFloat | argComplex},
- {'o', sharpNumFlag, argInt},
- {'p', "-#", argPointer},
- {'q', " -+.0#", argRune | argInt | argString},
- {'s', " -+.0", argString},
- {'t', "-", argBool},
- {'T', "-", anyType},
- {'U', "-#", argRune | argInt},
- {'v', allFlags, anyType},
- {'x', sharpNumFlag, argRune | argInt | argString},
- {'X', sharpNumFlag, argRune | argInt | argString},
-}
-
-// okPrintfArg compares the formatState to the arguments actually present,
-// reporting any discrepancies it can discern. If the final argument is ellipsissed,
-// there's little it can do for that.
-func (f *File) okPrintfArg(call *ast.CallExpr, state *formatState) (ok bool) {
- var v printVerb
- found := false
- // Linear scan is fast enough for a small list.
- for _, v = range printVerbs {
- if v.verb == state.verb {
- found = true
- break
- }
- }
- if !found {
- f.Badf(call.Pos(), "unrecognized printf verb %q", state.verb)
- return false
- }
- for _, flag := range state.flags {
- if !strings.ContainsRune(v.flags, rune(flag)) {
- f.Badf(call.Pos(), "unrecognized printf flag for verb %q: %q", state.verb, flag)
- return false
- }
- }
- // Verb is good. If len(state.argNums)>trueArgs, we have something like %.*s and all
- // but the final arg must be an integer.
- trueArgs := 1
- if state.verb == '%' {
- trueArgs = 0
- }
- nargs := len(state.argNums)
- for i := 0; i < nargs-trueArgs; i++ {
- argNum := state.argNums[i]
- if !f.argCanBeChecked(call, i, true, state) {
- return
- }
- arg := call.Args[argNum]
- if !f.matchArgType(argInt, nil, arg) {
- f.Badf(call.Pos(), "arg %s for * in printf format not of type int", f.gofmt(arg))
- return false
- }
- }
- if state.verb == '%' {
- return true
- }
- argNum := state.argNums[len(state.argNums)-1]
- if !f.argCanBeChecked(call, len(state.argNums)-1, false, state) {
- return false
- }
- arg := call.Args[argNum]
- if f.isFunctionValue(arg) && state.verb != 'p' && state.verb != 'T' {
- f.Badf(call.Pos(), "arg %s in printf call is a function value, not a function call", f.gofmt(arg))
- return false
- }
- if !f.matchArgType(v.typ, nil, arg) {
- typeString := ""
- if typ := f.pkg.types[arg].Type; typ != nil {
- typeString = typ.String()
- }
- f.Badf(call.Pos(), "arg %s for printf verb %%%c of wrong type: %s", f.gofmt(arg), state.verb, typeString)
- return false
- }
- if v.typ&argString != 0 && v.verb != 'T' && !bytes.Contains(state.flags, []byte{'#'}) && f.recursiveStringer(arg) {
- f.Badf(call.Pos(), "arg %s for printf causes recursive call to String method", f.gofmt(arg))
- return false
- }
- return true
-}
-
-// recursiveStringer reports whether the provided argument is r or &r for the
-// fmt.Stringer receiver identifier r.
-func (f *File) recursiveStringer(e ast.Expr) bool {
- if len(f.stringers) == 0 {
- return false
- }
- var obj *ast.Object
- switch e := e.(type) {
- case *ast.Ident:
- obj = e.Obj
- case *ast.UnaryExpr:
- if id, ok := e.X.(*ast.Ident); ok && e.Op == token.AND {
- obj = id.Obj
- }
- }
-
- // It's unlikely to be a recursive stringer if it has a Format method.
- if typ := f.pkg.types[e].Type; typ != nil {
- // Not a perfect match; see issue 6259.
- if f.hasMethod(typ, "Format") {
- return false
- }
- }
-
- // We compare the underlying Object, which checks that the identifier
- // is the one we declared as the receiver for the String method in
- // which this printf appears.
- return f.stringers[obj]
-}
-
-// isFunctionValue reports whether the expression is a function as opposed to a function call.
-// It is almost always a mistake to print a function value.
-func (f *File) isFunctionValue(e ast.Expr) bool {
- if typ := f.pkg.types[e].Type; typ != nil {
- _, ok := typ.(*types.Signature)
- return ok
- }
- return false
-}
-
-// argCanBeChecked reports whether the specified argument is statically present;
-// it may be beyond the list of arguments or in a terminal slice... argument, which
-// means we can't see it.
-func (f *File) argCanBeChecked(call *ast.CallExpr, formatArg int, isStar bool, state *formatState) bool {
- argNum := state.argNums[formatArg]
- if argNum < 0 {
- // Shouldn't happen, so catch it with prejudice.
- panic("negative arg num")
- }
- if argNum == 0 {
- f.Badf(call.Pos(), `index value [0] for %s("%s"); indexes start at 1`, state.name, state.format)
- return false
- }
- if argNum < len(call.Args)-1 {
- return true // Always OK.
- }
- if call.Ellipsis.IsValid() {
- return false // We just can't tell; there could be many more arguments.
- }
- if argNum < len(call.Args) {
- return true
- }
- // There are bad indexes in the format or there are fewer arguments than the format needs.
- // This is the argument number relative to the format: Printf("%s", "hi") will give 1 for the "hi".
- arg := argNum - state.firstArg + 1 // People think of arguments as 1-indexed.
- f.Badf(call.Pos(), `missing argument for %s("%s"): format reads arg %d, have only %d args`, state.name, state.format, arg, len(call.Args)-state.firstArg)
- return false
-}
-
-// checkPrint checks a call to an unformatted print routine such as Println.
-func (f *File) checkPrint(call *ast.CallExpr, name string) {
- firstArg := 0
- typ := f.pkg.types[call.Fun].Type
- if typ == nil {
- // Skip checking functions with unknown type.
- return
- }
- if sig, ok := typ.(*types.Signature); ok {
- if !sig.Variadic() {
- // Skip checking non-variadic functions.
- return
- }
- params := sig.Params()
- firstArg = params.Len() - 1
-
- typ := params.At(firstArg).Type()
- typ = typ.(*types.Slice).Elem()
- it, ok := typ.(*types.Interface)
- if !ok || !it.Empty() {
- // Skip variadic functions accepting non-interface{} args.
- return
- }
- }
- args := call.Args
- if len(args) <= firstArg {
- // Skip calls without variadic args.
- return
- }
- args = args[firstArg:]
-
- // check for Println(os.Stderr, ...)
- if firstArg == 0 {
- if sel, ok := args[0].(*ast.SelectorExpr); ok {
- if x, ok := sel.X.(*ast.Ident); ok {
- if x.Name == "os" && strings.HasPrefix(sel.Sel.Name, "Std") {
- f.Badf(call.Pos(), "first argument to %s is %s.%s", name, x.Name, sel.Sel.Name)
- }
- }
- }
- }
- arg := args[0]
- if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING {
- if strings.Contains(lit.Value, "%") {
- f.Badf(call.Pos(), "possible formatting directive in %s call", name)
- }
- }
- if strings.HasSuffix(name, "ln") {
- // The last item, if a string, should not have a newline.
- arg = args[len(args)-1]
- if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING {
- if strings.HasSuffix(lit.Value, `\n"`) {
- f.Badf(call.Pos(), "%s call ends with newline", name)
- }
- }
- }
- for _, arg := range args {
- if f.isFunctionValue(arg) {
- f.Badf(call.Pos(), "arg %s in %s call is a function value, not a function call", f.gofmt(arg), name)
- }
- if f.recursiveStringer(arg) {
- f.Badf(call.Pos(), "arg %s in %s call causes recursive call to String method", f.gofmt(arg), name)
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/rangeloop.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/rangeloop.go
deleted file mode 100644
index e085e21a2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/rangeloop.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-This file contains the code to check range loop variables bound inside function
-literals that are deferred or launched in new goroutines. We only check
-instances where the defer or go statement is the last statement in the loop
-body, as otherwise we would need whole program analysis.
-
-For example:
-
- for i, v := range s {
- go func() {
- println(i, v) // not what you might expect
- }()
- }
-
-See: https://golang.org/doc/go_faq.html#closures_and_goroutines
-*/
-
-package main
-
-import "go/ast"
-
-func init() {
- register("rangeloops",
- "check that range loop variables are used correctly",
- checkRangeLoop,
- rangeStmt)
-}
-
-// checkRangeLoop walks the body of the provided range statement, checking if
-// its index or value variables are used unsafely inside goroutines or deferred
-// function literals.
-func checkRangeLoop(f *File, node ast.Node) {
- n := node.(*ast.RangeStmt)
- key, _ := n.Key.(*ast.Ident)
- val, _ := n.Value.(*ast.Ident)
- if key == nil && val == nil {
- return
- }
- sl := n.Body.List
- if len(sl) == 0 {
- return
- }
- var last *ast.CallExpr
- switch s := sl[len(sl)-1].(type) {
- case *ast.GoStmt:
- last = s.Call
- case *ast.DeferStmt:
- last = s.Call
- default:
- return
- }
- lit, ok := last.Fun.(*ast.FuncLit)
- if !ok {
- return
- }
- ast.Inspect(lit.Body, func(n ast.Node) bool {
- id, ok := n.(*ast.Ident)
- if !ok || id.Obj == nil {
- return true
- }
- if f.pkg.types[id].Type == nil {
- // Not referring to a variable
- return true
- }
- if key != nil && id.Obj == key.Obj || val != nil && id.Obj == val.Obj {
- f.Bad(id.Pos(), "range variable", id.Name, "captured by func literal")
- }
- return true
- })
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/shadow.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/shadow.go
deleted file mode 100644
index 29c952fd8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/shadow.go
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-This file contains the code to check for shadowed variables.
-A shadowed variable is a variable declared in an inner scope
-with the same name and type as a variable in an outer scope,
-and where the outer variable is mentioned after the inner one
-is declared.
-
-(This definition can be refined; the module generates too many
-false positives and is not yet enabled by default.)
-
-For example:
-
- func BadRead(f *os.File, buf []byte) error {
- var err error
- for {
- n, err := f.Read(buf) // shadows the function variable 'err'
- if err != nil {
- break // causes return of wrong value
- }
- foo(buf)
- }
- return err
- }
-
-*/
-
-package main
-
-import (
- "flag"
- "go/ast"
- "go/token"
- "go/types"
-)
-
-var strictShadowing = flag.Bool("shadowstrict", false, "whether to be strict about shadowing; can be noisy")
-
-func init() {
- register("shadow",
- "check for shadowed variables (experimental; must be set explicitly)",
- checkShadow,
- assignStmt, genDecl)
- experimental["shadow"] = true
-}
-
-func checkShadow(f *File, node ast.Node) {
- switch n := node.(type) {
- case *ast.AssignStmt:
- checkShadowAssignment(f, n)
- case *ast.GenDecl:
- checkShadowDecl(f, n)
- }
-}
-
-// Span stores the minimum range of byte positions in the file in which a
-// given variable (types.Object) is mentioned. It is lexically defined: it spans
-// from the beginning of its first mention to the end of its last mention.
-// A variable is considered shadowed (if *strictShadowing is off) only if the
-// shadowing variable is declared within the span of the shadowed variable.
-// In other words, if a variable is shadowed but not used after the shadowed
-// variable is declared, it is inconsequential and not worth complaining about.
-// This simple check dramatically reduces the nuisance rate for the shadowing
-// check, at least until something cleverer comes along.
-//
-// One wrinkle: A "naked return" is a silent use of a variable that the Span
-// will not capture, but the compilers catch naked returns of shadowed
-// variables so we don't need to.
-//
-// Cases this gets wrong (TODO):
-// - If a for loop's continuation statement mentions a variable redeclared in
-// the block, we should complain about it but don't.
-// - A variable declared inside a function literal can falsely be identified
-// as shadowing a variable in the outer function.
-//
-type Span struct {
- min token.Pos
- max token.Pos
-}
-
-// contains reports whether the position is inside the span.
-func (s Span) contains(pos token.Pos) bool {
- return s.min <= pos && pos < s.max
-}
-
-// growSpan expands the span for the object to contain the instance represented
-// by the identifier.
-func (pkg *Package) growSpan(ident *ast.Ident, obj types.Object) {
- if *strictShadowing {
- return // No need
- }
- pos := ident.Pos()
- end := ident.End()
- span, ok := pkg.spans[obj]
- if ok {
- if span.min > pos {
- span.min = pos
- }
- if span.max < end {
- span.max = end
- }
- } else {
- span = Span{pos, end}
- }
- pkg.spans[obj] = span
-}
-
-// checkShadowAssignment checks for shadowing in a short variable declaration.
-func checkShadowAssignment(f *File, a *ast.AssignStmt) {
- if a.Tok != token.DEFINE {
- return
- }
- if f.idiomaticShortRedecl(a) {
- return
- }
- for _, expr := range a.Lhs {
- ident, ok := expr.(*ast.Ident)
- if !ok {
- f.Badf(expr.Pos(), "invalid AST: short variable declaration of non-identifier")
- return
- }
- checkShadowing(f, ident)
- }
-}
-
-// idiomaticShortRedecl reports whether this short declaration can be ignored for
-// the purposes of shadowing, that is, that any redeclarations it contains are deliberate.
-func (f *File) idiomaticShortRedecl(a *ast.AssignStmt) bool {
- // Don't complain about deliberate redeclarations of the form
- // i := i
- // Such constructs are idiomatic in range loops to create a new variable
- // for each iteration. Another example is
- // switch n := n.(type)
- if len(a.Rhs) != len(a.Lhs) {
- return false
- }
- // We know it's an assignment, so the LHS must be all identifiers. (We check anyway.)
- for i, expr := range a.Lhs {
- lhs, ok := expr.(*ast.Ident)
- if !ok {
- f.Badf(expr.Pos(), "invalid AST: short variable declaration of non-identifier")
- return true // Don't do any more processing.
- }
- switch rhs := a.Rhs[i].(type) {
- case *ast.Ident:
- if lhs.Name != rhs.Name {
- return false
- }
- case *ast.TypeAssertExpr:
- if id, ok := rhs.X.(*ast.Ident); ok {
- if lhs.Name != id.Name {
- return false
- }
- }
- default:
- return false
- }
- }
- return true
-}
-
-// idiomaticRedecl reports whether this declaration spec can be ignored for
-// the purposes of shadowing, that is, that any redeclarations it contains are deliberate.
-func (f *File) idiomaticRedecl(d *ast.ValueSpec) bool {
- // Don't complain about deliberate redeclarations of the form
- // var i, j = i, j
- if len(d.Names) != len(d.Values) {
- return false
- }
- for i, lhs := range d.Names {
- if rhs, ok := d.Values[i].(*ast.Ident); ok {
- if lhs.Name != rhs.Name {
- return false
- }
- }
- }
- return true
-}
-
-// checkShadowDecl checks for shadowing in a general variable declaration.
-func checkShadowDecl(f *File, d *ast.GenDecl) {
- if d.Tok != token.VAR {
- return
- }
- for _, spec := range d.Specs {
- valueSpec, ok := spec.(*ast.ValueSpec)
- if !ok {
- f.Badf(spec.Pos(), "invalid AST: var GenDecl not ValueSpec")
- return
- }
- // Don't complain about deliberate redeclarations of the form
- // var i = i
- if f.idiomaticRedecl(valueSpec) {
- return
- }
- for _, ident := range valueSpec.Names {
- checkShadowing(f, ident)
- }
- }
-}
-
-// checkShadowing checks whether the identifier shadows an identifier in an outer scope.
-func checkShadowing(f *File, ident *ast.Ident) {
- if ident.Name == "_" {
- // Can't shadow the blank identifier.
- return
- }
- obj := f.pkg.defs[ident]
- if obj == nil {
- return
- }
- // obj.Parent.Parent is the surrounding scope. If we can find another declaration
- // starting from there, we have a shadowed identifier.
- _, shadowed := obj.Parent().Parent().LookupParent(obj.Name(), obj.Pos())
- if shadowed == nil {
- return
- }
- // Don't complain if it's shadowing a universe-declared identifier; that's fine.
- if shadowed.Parent() == types.Universe {
- return
- }
- if *strictShadowing {
- // The shadowed identifier must appear before this one to be an instance of shadowing.
- if shadowed.Pos() > ident.Pos() {
- return
- }
- } else {
- // Don't complain if the span of validity of the shadowed identifier doesn't include
- // the shadowing identifier.
- span, ok := f.pkg.spans[shadowed]
- if !ok {
- f.Badf(ident.Pos(), "internal error: no range for %q", ident.Name)
- return
- }
- if !span.contains(ident.Pos()) {
- return
- }
- }
- // Don't complain if the types differ: that implies the programmer really wants two different things.
- if types.Identical(obj.Type(), shadowed.Type()) {
- f.Badf(ident.Pos(), "declaration of %q shadows declaration at %s", obj.Name(), f.loc(shadowed.Pos()))
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/shift.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/shift.go
deleted file mode 100644
index 8c038b4bd..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/shift.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-This file contains the code to check for suspicious shifts.
-*/
-
-package main
-
-import (
- "go/ast"
- "go/constant"
- "go/token"
- "go/types"
-)
-
-func init() {
- register("shift",
- "check for useless shifts",
- checkShift,
- binaryExpr, assignStmt)
-}
-
-func checkShift(f *File, node ast.Node) {
- switch node := node.(type) {
- case *ast.BinaryExpr:
- if node.Op == token.SHL || node.Op == token.SHR {
- checkLongShift(f, node, node.X, node.Y)
- }
- case *ast.AssignStmt:
- if len(node.Lhs) != 1 || len(node.Rhs) != 1 {
- return
- }
- if node.Tok == token.SHL_ASSIGN || node.Tok == token.SHR_ASSIGN {
- checkLongShift(f, node, node.Lhs[0], node.Rhs[0])
- }
- }
-}
-
-// checkLongShift checks if shift or shift-assign operations shift by more than
-// the length of the underlying variable.
-func checkLongShift(f *File, node ast.Node, x, y ast.Expr) {
- v := f.pkg.types[y].Value
- if v == nil {
- return
- }
- amt, ok := constant.Int64Val(v)
- if !ok {
- return
- }
- t := f.pkg.types[x].Type
- if t == nil {
- return
- }
- b, ok := t.Underlying().(*types.Basic)
- if !ok {
- return
- }
- var size int64
- var msg string
- switch b.Kind() {
- case types.Uint8, types.Int8:
- size = 8
- case types.Uint16, types.Int16:
- size = 16
- case types.Uint32, types.Int32:
- size = 32
- case types.Uint64, types.Int64:
- size = 64
- case types.Int, types.Uint, types.Uintptr:
- // These types may be as small as 32 bits, but no smaller.
- size = 32
- msg = "might be "
- default:
- return
- }
- if amt >= size {
- ident := f.gofmt(x)
- f.Badf(node.Pos(), "%s %stoo small for shift of %d", ident, msg, amt)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/structtag.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/structtag.go
deleted file mode 100644
index abff14fb1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/structtag.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the test for canonical struct tags.
-
-package main
-
-import (
- "errors"
- "go/ast"
- "reflect"
- "strconv"
-)
-
-func init() {
- register("structtags",
- "check that struct field tags have canonical format and apply to exported fields as needed",
- checkCanonicalFieldTag,
- field)
-}
-
-// checkCanonicalFieldTag checks a struct field tag.
-func checkCanonicalFieldTag(f *File, node ast.Node) {
- field := node.(*ast.Field)
- if field.Tag == nil {
- return
- }
-
- tag, err := strconv.Unquote(field.Tag.Value)
- if err != nil {
- f.Badf(field.Pos(), "unable to read struct tag %s", field.Tag.Value)
- return
- }
-
- if err := validateStructTag(tag); err != nil {
- f.Badf(field.Pos(), "struct field tag %s not compatible with reflect.StructTag.Get: %s", field.Tag.Value, err)
- }
-
- // Check for use of json or xml tags with unexported fields.
-
- // Embedded struct. Nothing to do for now, but that
- // may change, depending on what happens with issue 7363.
- if len(field.Names) == 0 {
- return
- }
-
- if field.Names[0].IsExported() {
- return
- }
-
- st := reflect.StructTag(tag)
- for _, enc := range [...]string{"json", "xml"} {
- if st.Get(enc) != "" {
- f.Badf(field.Pos(), "struct field %s has %s tag but is not exported", field.Names[0].Name, enc)
- return
- }
- }
-}
-
-var (
- errTagSyntax = errors.New("bad syntax for struct tag pair")
- errTagKeySyntax = errors.New("bad syntax for struct tag key")
- errTagValueSyntax = errors.New("bad syntax for struct tag value")
-)
-
-// validateStructTag parses the struct tag and returns an error if it is not
-// in the canonical format, which is a space-separated list of key:"value"
-// settings. The value may contain spaces.
-func validateStructTag(tag string) error {
- // This code is based on the StructTag.Get code in package reflect.
-
- for tag != "" {
- // Skip leading space.
- i := 0
- for i < len(tag) && tag[i] == ' ' {
- i++
- }
- tag = tag[i:]
- if tag == "" {
- break
- }
-
- // Scan to colon. A space, a quote or a control character is a syntax error.
- // Strictly speaking, control chars include the range [0x7f, 0x9f], not just
- // [0x00, 0x1f], but in practice, we ignore the multi-byte control characters
- // as it is simpler to inspect the tag's bytes than the tag's runes.
- i = 0
- for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f {
- i++
- }
- if i == 0 {
- return errTagKeySyntax
- }
- if i+1 >= len(tag) || tag[i] != ':' {
- return errTagSyntax
- }
- if tag[i+1] != '"' {
- return errTagValueSyntax
- }
- tag = tag[i+1:]
-
- // Scan quoted string to find value.
- i = 1
- for i < len(tag) && tag[i] != '"' {
- if tag[i] == '\\' {
- i++
- }
- i++
- }
- if i >= len(tag) {
- return errTagValueSyntax
- }
- qvalue := tag[:i+1]
- tag = tag[i+1:]
-
- if _, err := strconv.Unquote(qvalue); err != nil {
- return errTagValueSyntax
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/tests.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/tests.go
deleted file mode 100644
index 8c051f133..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/tests.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "go/types"
- "strings"
- "unicode"
- "unicode/utf8"
-)
-
-func init() {
- register("tests",
- "check for common mistaken usages of tests/documentation examples",
- checkTestFunctions,
- funcDecl)
-}
-
-func isExampleSuffix(s string) bool {
- r, size := utf8.DecodeRuneInString(s)
- return size > 0 && unicode.IsLower(r)
-}
-
-func isTestSuffix(name string) bool {
- if len(name) == 0 {
- // "Test" is ok.
- return true
- }
- r, _ := utf8.DecodeRuneInString(name)
- return !unicode.IsLower(r)
-}
-
-func isTestParam(typ ast.Expr, wantType string) bool {
- ptr, ok := typ.(*ast.StarExpr)
- if !ok {
- // Not a pointer.
- return false
- }
- // No easy way of making sure it's a *testing.T or *testing.B:
- // ensure the name of the type matches.
- if name, ok := ptr.X.(*ast.Ident); ok {
- return name.Name == wantType
- }
- if sel, ok := ptr.X.(*ast.SelectorExpr); ok {
- return sel.Sel.Name == wantType
- }
- return false
-}
-
-func lookup(name string, scopes []*types.Scope) types.Object {
- for _, scope := range scopes {
- if o := scope.Lookup(name); o != nil {
- return o
- }
- }
- return nil
-}
-
-func extendedScope(f *File) []*types.Scope {
- scopes := []*types.Scope{f.pkg.typesPkg.Scope()}
- if f.basePkg != nil {
- scopes = append(scopes, f.basePkg.typesPkg.Scope())
- } else {
- // If basePkg is not specified (e.g. when checking a single file) try to
- // find it among imports.
- pkgName := f.pkg.typesPkg.Name()
- if strings.HasSuffix(pkgName, "_test") {
- basePkgName := strings.TrimSuffix(pkgName, "_test")
- for _, p := range f.pkg.typesPkg.Imports() {
- if p.Name() == basePkgName {
- scopes = append(scopes, p.Scope())
- break
- }
- }
- }
- }
- return scopes
-}
-
-func checkExample(fn *ast.FuncDecl, f *File, report reporter) {
- fnName := fn.Name.Name
- if params := fn.Type.Params; len(params.List) != 0 {
- report("%s should be niladic", fnName)
- }
- if results := fn.Type.Results; results != nil && len(results.List) != 0 {
- report("%s should return nothing", fnName)
- }
-
- if filesRun && !includesNonTest {
- // The coherence checks between a test and the package it tests
- // will report false positives if no non-test files have
- // been provided.
- return
- }
-
- if fnName == "Example" {
- // Nothing more to do.
- return
- }
-
- var (
- exName = strings.TrimPrefix(fnName, "Example")
- elems = strings.SplitN(exName, "_", 3)
- ident = elems[0]
- obj = lookup(ident, extendedScope(f))
- )
- if ident != "" && obj == nil {
- // Check ExampleFoo and ExampleBadFoo.
- report("%s refers to unknown identifier: %s", fnName, ident)
- // Abort since obj is absent and no subsequent checks can be performed.
- return
- }
- if len(elems) < 2 {
- // Nothing more to do.
- return
- }
-
- if ident == "" {
- // Check Example_suffix and Example_BadSuffix.
- if residual := strings.TrimPrefix(exName, "_"); !isExampleSuffix(residual) {
- report("%s has malformed example suffix: %s", fnName, residual)
- }
- return
- }
-
- mmbr := elems[1]
- if !isExampleSuffix(mmbr) {
- // Check ExampleFoo_Method and ExampleFoo_BadMethod.
- if obj, _, _ := types.LookupFieldOrMethod(obj.Type(), true, obj.Pkg(), mmbr); obj == nil {
- report("%s refers to unknown field or method: %s.%s", fnName, ident, mmbr)
- }
- }
- if len(elems) == 3 && !isExampleSuffix(elems[2]) {
- // Check ExampleFoo_Method_suffix and ExampleFoo_Method_Badsuffix.
- report("%s has malformed example suffix: %s", fnName, elems[2])
- }
-}
-
-func checkTest(fn *ast.FuncDecl, prefix string, report reporter) {
- // Want functions with 0 results and 1 parameter.
- if fn.Type.Results != nil && len(fn.Type.Results.List) > 0 ||
- fn.Type.Params == nil ||
- len(fn.Type.Params.List) != 1 ||
- len(fn.Type.Params.List[0].Names) > 1 {
- return
- }
-
- // The param must look like a *testing.T or *testing.B.
- if !isTestParam(fn.Type.Params.List[0].Type, prefix[:1]) {
- return
- }
-
- if !isTestSuffix(fn.Name.Name[len(prefix):]) {
- report("%s has malformed name: first letter after '%s' must not be lowercase", fn.Name.Name, prefix)
- }
-}
-
-type reporter func(format string, args ...interface{})
-
-// checkTestFunctions walks Test, Benchmark and Example functions checking
-// malformed names, wrong signatures and examples documenting inexistent
-// identifiers.
-func checkTestFunctions(f *File, node ast.Node) {
- if !strings.HasSuffix(f.name, "_test.go") {
- return
- }
-
- fn, ok := node.(*ast.FuncDecl)
- if !ok || fn.Recv != nil {
- // Ignore non-functions or functions with receivers.
- return
- }
-
- report := func(format string, args ...interface{}) { f.Badf(node.Pos(), format, args...) }
-
- switch {
- case strings.HasPrefix(fn.Name.Name, "Example"):
- checkExample(fn, f, report)
- case strings.HasPrefix(fn.Name.Name, "Test"):
- checkTest(fn, "Test", report)
- case strings.HasPrefix(fn.Name.Name, "Benchmark"):
- checkTest(fn, "Benchmark", report)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/types.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/types.go
deleted file mode 100644
index 4d0e6154b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/types.go
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the pieces of the tool that use typechecking from the go/types package.
-
-package main
-
-import (
- "go/ast"
- "go/importer"
- "go/token"
- "go/types"
-)
-
-// stdImporter is the importer we use to import packages.
-// It is created during initialization so that all packages
-// are imported by the same importer.
-var stdImporter = importer.Default()
-
-var (
- errorType *types.Interface
- stringerType *types.Interface // possibly nil
- formatterType *types.Interface // possibly nil
-)
-
-func init() {
- errorType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface)
-
- if typ := importType("fmt", "Stringer"); typ != nil {
- stringerType = typ.Underlying().(*types.Interface)
- }
-
- if typ := importType("fmt", "Formatter"); typ != nil {
- formatterType = typ.Underlying().(*types.Interface)
- }
-}
-
-// importType returns the type denoted by the qualified identifier
-// path.name, and adds the respective package to the imports map
-// as a side effect. In case of an error, importType returns nil.
-func importType(path, name string) types.Type {
- pkg, err := stdImporter.Import(path)
- if err != nil {
- // This can happen if the package at path hasn't been compiled yet.
- warnf("import failed: %v", err)
- return nil
- }
- if obj, ok := pkg.Scope().Lookup(name).(*types.TypeName); ok {
- return obj.Type()
- }
- warnf("invalid type name %q", name)
- return nil
-}
-
-func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File) error {
- pkg.defs = make(map[*ast.Ident]types.Object)
- pkg.uses = make(map[*ast.Ident]types.Object)
- pkg.selectors = make(map[*ast.SelectorExpr]*types.Selection)
- pkg.spans = make(map[types.Object]Span)
- pkg.types = make(map[ast.Expr]types.TypeAndValue)
- config := types.Config{
- // We use the same importer for all imports to ensure that
- // everybody sees identical packages for the given paths.
- Importer: stdImporter,
- // By providing a Config with our own error function, it will continue
- // past the first error. There is no need for that function to do anything.
- Error: func(error) {},
- }
- info := &types.Info{
- Selections: pkg.selectors,
- Types: pkg.types,
- Defs: pkg.defs,
- Uses: pkg.uses,
- }
- typesPkg, err := config.Check(pkg.path, fs, astFiles, info)
- pkg.typesPkg = typesPkg
- // update spans
- for id, obj := range pkg.defs {
- pkg.growSpan(id, obj)
- }
- for id, obj := range pkg.uses {
- pkg.growSpan(id, obj)
- }
- return err
-}
-
-// matchArgType reports an error if printf verb t is not appropriate
-// for operand arg.
-//
-// typ is used only for recursive calls; external callers must supply nil.
-//
-// (Recursion arises from the compound types {map,chan,slice} which
-// may be printed with %d etc. if that is appropriate for their element
-// types.)
-func (f *File) matchArgType(t printfArgType, typ types.Type, arg ast.Expr) bool {
- return f.matchArgTypeInternal(t, typ, arg, make(map[types.Type]bool))
-}
-
-// matchArgTypeInternal is the internal version of matchArgType. It carries a map
-// remembering what types are in progress so we don't recur when faced with recursive
-// types or mutually recursive types.
-func (f *File) matchArgTypeInternal(t printfArgType, typ types.Type, arg ast.Expr, inProgress map[types.Type]bool) bool {
- // %v, %T accept any argument type.
- if t == anyType {
- return true
- }
- if typ == nil {
- // external call
- typ = f.pkg.types[arg].Type
- if typ == nil {
- return true // probably a type check problem
- }
- }
- // If the type implements fmt.Formatter, we have nothing to check.
- // formatterTyp may be nil - be conservative and check for Format method in that case.
- if formatterType != nil && types.Implements(typ, formatterType) || f.hasMethod(typ, "Format") {
- return true
- }
- // If we can use a string, might arg (dynamically) implement the Stringer or Error interface?
- if t&argString != 0 {
- if types.AssertableTo(errorType, typ) || stringerType != nil && types.AssertableTo(stringerType, typ) {
- return true
- }
- }
-
- typ = typ.Underlying()
- if inProgress[typ] {
- // We're already looking at this type. The call that started it will take care of it.
- return true
- }
- inProgress[typ] = true
-
- switch typ := typ.(type) {
- case *types.Signature:
- return t&argPointer != 0
-
- case *types.Map:
- // Recur: map[int]int matches %d.
- return t&argPointer != 0 ||
- (f.matchArgTypeInternal(t, typ.Key(), arg, inProgress) && f.matchArgTypeInternal(t, typ.Elem(), arg, inProgress))
-
- case *types.Chan:
- return t&argPointer != 0
-
- case *types.Array:
- // Same as slice.
- if types.Identical(typ.Elem().Underlying(), types.Typ[types.Byte]) && t&argString != 0 {
- return true // %s matches []byte
- }
- // Recur: []int matches %d.
- return t&argPointer != 0 || f.matchArgTypeInternal(t, typ.Elem().Underlying(), arg, inProgress)
-
- case *types.Slice:
- // Same as array.
- if types.Identical(typ.Elem().Underlying(), types.Typ[types.Byte]) && t&argString != 0 {
- return true // %s matches []byte
- }
- // Recur: []int matches %d. But watch out for
- // type T []T
- // If the element is a pointer type (type T[]*T), it's handled fine by the Pointer case below.
- return t&argPointer != 0 || f.matchArgTypeInternal(t, typ.Elem(), arg, inProgress)
-
- case *types.Pointer:
- // Ugly, but dealing with an edge case: a known pointer to an invalid type,
- // probably something from a failed import.
- if typ.Elem().String() == "invalid type" {
- if *verbose {
- f.Warnf(arg.Pos(), "printf argument %v is pointer to invalid or unknown type", f.gofmt(arg))
- }
- return true // special case
- }
- // If it's actually a pointer with %p, it prints as one.
- if t == argPointer {
- return true
- }
- // If it's pointer to struct, that's equivalent in our analysis to whether we can print the struct.
- if str, ok := typ.Elem().Underlying().(*types.Struct); ok {
- return f.matchStructArgType(t, str, arg, inProgress)
- }
- // The rest can print with %p as pointers, or as integers with %x etc.
- return t&(argInt|argPointer) != 0
-
- case *types.Struct:
- return f.matchStructArgType(t, typ, arg, inProgress)
-
- case *types.Interface:
- // If the static type of the argument is empty interface, there's little we can do.
- // Example:
- // func f(x interface{}) { fmt.Printf("%s", x) }
- // Whether x is valid for %s depends on the type of the argument to f. One day
- // we will be able to do better. For now, we assume that empty interface is OK
- // but non-empty interfaces, with Stringer and Error handled above, are errors.
- return typ.NumMethods() == 0
-
- case *types.Basic:
- switch typ.Kind() {
- case types.UntypedBool,
- types.Bool:
- return t&argBool != 0
-
- case types.UntypedInt,
- types.Int,
- types.Int8,
- types.Int16,
- types.Int32,
- types.Int64,
- types.Uint,
- types.Uint8,
- types.Uint16,
- types.Uint32,
- types.Uint64,
- types.Uintptr:
- return t&argInt != 0
-
- case types.UntypedFloat,
- types.Float32,
- types.Float64:
- return t&argFloat != 0
-
- case types.UntypedComplex,
- types.Complex64,
- types.Complex128:
- return t&argComplex != 0
-
- case types.UntypedString,
- types.String:
- return t&argString != 0
-
- case types.UnsafePointer:
- return t&(argPointer|argInt) != 0
-
- case types.UntypedRune:
- return t&(argInt|argRune) != 0
-
- case types.UntypedNil:
- return t&argPointer != 0 // TODO?
-
- case types.Invalid:
- if *verbose {
- f.Warnf(arg.Pos(), "printf argument %v has invalid or unknown type", f.gofmt(arg))
- }
- return true // Probably a type check problem.
- }
- panic("unreachable")
- }
-
- return false
-}
-
-// hasBasicType reports whether x's type is a types.Basic with the given kind.
-func (f *File) hasBasicType(x ast.Expr, kind types.BasicKind) bool {
- t := f.pkg.types[x].Type
- if t != nil {
- t = t.Underlying()
- }
- b, ok := t.(*types.Basic)
- return ok && b.Kind() == kind
-}
-
-// matchStructArgType reports whether all the elements of the struct match the expected
-// type. For instance, with "%d" all the elements must be printable with the "%d" format.
-func (f *File) matchStructArgType(t printfArgType, typ *types.Struct, arg ast.Expr, inProgress map[types.Type]bool) bool {
- for i := 0; i < typ.NumFields(); i++ {
- if !f.matchArgTypeInternal(t, typ.Field(i).Type(), arg, inProgress) {
- return false
- }
- }
- return true
-}
-
-// hasMethod reports whether the type contains a method with the given name.
-// It is part of the workaround for Formatters and should be deleted when
-// that workaround is no longer necessary.
-// TODO: This could be better once issue 6259 is fixed.
-func (f *File) hasMethod(typ types.Type, name string) bool {
- // assume we have an addressable variable of type typ
- obj, _, _ := types.LookupFieldOrMethod(typ, true, f.pkg.typesPkg, name)
- _, ok := obj.(*types.Func)
- return ok
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/unsafeptr.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/unsafeptr.go
deleted file mode 100644
index a143e4d81..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/unsafeptr.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Check for invalid uintptr -> unsafe.Pointer conversions.
-
-package main
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-)
-
-func init() {
- register("unsafeptr",
- "check for misuse of unsafe.Pointer",
- checkUnsafePointer,
- callExpr)
-}
-
-func checkUnsafePointer(f *File, node ast.Node) {
- x := node.(*ast.CallExpr)
- if len(x.Args) != 1 {
- return
- }
- if f.hasBasicType(x.Fun, types.UnsafePointer) && f.hasBasicType(x.Args[0], types.Uintptr) && !f.isSafeUintptr(x.Args[0]) {
- f.Badf(x.Pos(), "possible misuse of unsafe.Pointer")
- }
-}
-
-// isSafeUintptr reports whether x - already known to be a uintptr -
-// is safe to convert to unsafe.Pointer. It is safe if x is itself derived
-// directly from an unsafe.Pointer via conversion and pointer arithmetic
-// or if x is the result of reflect.Value.Pointer or reflect.Value.UnsafeAddr
-// or obtained from the Data field of a *reflect.SliceHeader or *reflect.StringHeader.
-func (f *File) isSafeUintptr(x ast.Expr) bool {
- switch x := x.(type) {
- case *ast.ParenExpr:
- return f.isSafeUintptr(x.X)
-
- case *ast.SelectorExpr:
- switch x.Sel.Name {
- case "Data":
- // reflect.SliceHeader and reflect.StringHeader are okay,
- // but only if they are pointing at a real slice or string.
- // It's not okay to do:
- // var x SliceHeader
- // x.Data = uintptr(unsafe.Pointer(...))
- // ... use x ...
- // p := unsafe.Pointer(x.Data)
- // because in the middle the garbage collector doesn't
- // see x.Data as a pointer and so x.Data may be dangling
- // by the time we get to the conversion at the end.
- // For now approximate by saying that *Header is okay
- // but Header is not.
- pt, ok := f.pkg.types[x.X].Type.(*types.Pointer)
- if ok {
- t, ok := pt.Elem().(*types.Named)
- if ok && t.Obj().Pkg().Path() == "reflect" {
- switch t.Obj().Name() {
- case "StringHeader", "SliceHeader":
- return true
- }
- }
- }
- }
-
- case *ast.CallExpr:
- switch len(x.Args) {
- case 0:
- // maybe call to reflect.Value.Pointer or reflect.Value.UnsafeAddr.
- sel, ok := x.Fun.(*ast.SelectorExpr)
- if !ok {
- break
- }
- switch sel.Sel.Name {
- case "Pointer", "UnsafeAddr":
- t, ok := f.pkg.types[sel.X].Type.(*types.Named)
- if ok && t.Obj().Pkg().Path() == "reflect" && t.Obj().Name() == "Value" {
- return true
- }
- }
-
- case 1:
- // maybe conversion of uintptr to unsafe.Pointer
- return f.hasBasicType(x.Fun, types.Uintptr) && f.hasBasicType(x.Args[0], types.UnsafePointer)
- }
-
- case *ast.BinaryExpr:
- switch x.Op {
- case token.ADD, token.SUB:
- return f.isSafeUintptr(x.X) && !f.isSafeUintptr(x.Y)
- }
- }
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/unused.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/unused.go
deleted file mode 100644
index df2317a43..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/dnephin/govet/unused.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file defines the check for unused results of calls to certain
-// pure functions.
-
-package main
-
-import (
- "flag"
- "go/ast"
- "go/token"
- "go/types"
- "strings"
-)
-
-var unusedFuncsFlag = flag.String("unusedfuncs",
- "errors.New,fmt.Errorf,fmt.Sprintf,fmt.Sprint,sort.Reverse",
- "comma-separated list of functions whose results must be used")
-
-var unusedStringMethodsFlag = flag.String("unusedstringmethods",
- "Error,String",
- "comma-separated list of names of methods of type func() string whose results must be used")
-
-func init() {
- register("unusedresult",
- "check for unused result of calls to functions in -unusedfuncs list and methods in -unusedstringmethods list",
- checkUnusedResult,
- exprStmt)
-}
-
-// func() string
-var sigNoArgsStringResult = types.NewSignature(nil, nil,
- types.NewTuple(types.NewVar(token.NoPos, nil, "", types.Typ[types.String])),
- false)
-
-var unusedFuncs = make(map[string]bool)
-var unusedStringMethods = make(map[string]bool)
-
-func initUnusedFlags() {
- commaSplit := func(s string, m map[string]bool) {
- if s != "" {
- for _, name := range strings.Split(s, ",") {
- if len(name) == 0 {
- flag.Usage()
- }
- m[name] = true
- }
- }
- }
- commaSplit(*unusedFuncsFlag, unusedFuncs)
- commaSplit(*unusedStringMethodsFlag, unusedStringMethods)
-}
-
-func checkUnusedResult(f *File, n ast.Node) {
- call, ok := unparen(n.(*ast.ExprStmt).X).(*ast.CallExpr)
- if !ok {
- return // not a call statement
- }
- fun := unparen(call.Fun)
-
- if f.pkg.types[fun].IsType() {
- return // a conversion, not a call
- }
-
- selector, ok := fun.(*ast.SelectorExpr)
- if !ok {
- return // neither a method call nor a qualified ident
- }
-
- sel, ok := f.pkg.selectors[selector]
- if ok && sel.Kind() == types.MethodVal {
- // method (e.g. foo.String())
- obj := sel.Obj().(*types.Func)
- sig := sel.Type().(*types.Signature)
- if types.Identical(sig, sigNoArgsStringResult) {
- if unusedStringMethods[obj.Name()] {
- f.Badf(call.Lparen, "result of (%s).%s call not used",
- sig.Recv().Type(), obj.Name())
- }
- }
- } else if !ok {
- // package-qualified function (e.g. fmt.Errorf)
- obj, _ := f.pkg.uses[selector.Sel]
- if obj, ok := obj.(*types.Func); ok {
- qname := obj.Pkg().Path() + "." + obj.Name()
- if unusedFuncs[qname] {
- f.Badf(call.Lparen, "result of %v call not used", qname)
- }
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/LICENSE
deleted file mode 100644
index 65d761bc9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2013 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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/golint/golint.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/golint/golint.go
deleted file mode 100644
index d8360ad31..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/golint/golint.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 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 or at
-// https://developers.google.com/open-source/licenses/bsd.
-
-// golint lints the Go source files named on its command line.
-package main
-
-import (
- "flag"
- "fmt"
- "go/build"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
-
- "github.com/golang/lint"
-)
-
-var (
- minConfidence = flag.Float64("min_confidence", 0.8, "minimum confidence of a problem to print it")
- setExitStatus = flag.Bool("set_exit_status", false, "set exit status to 1 if any issues are found")
- suggestions int
-)
-
-func usage() {
- fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
- fmt.Fprintf(os.Stderr, "\tgolint [flags] # runs on package in current directory\n")
- fmt.Fprintf(os.Stderr, "\tgolint [flags] [packages]\n")
- fmt.Fprintf(os.Stderr, "\tgolint [flags] [directories] # where a '/...' suffix includes all sub-directories\n")
- fmt.Fprintf(os.Stderr, "\tgolint [flags] [files] # all must belong to a single package\n")
- fmt.Fprintf(os.Stderr, "Flags:\n")
- flag.PrintDefaults()
-}
-
-func main() {
- flag.Usage = usage
- flag.Parse()
-
- if flag.NArg() == 0 {
- lintDir(".")
- } else {
- // dirsRun, filesRun, and pkgsRun indicate whether golint is applied to
- // directory, file or package targets. The distinction affects which
- // checks are run. It is no valid to mix target types.
- var dirsRun, filesRun, pkgsRun int
- var args []string
- for _, arg := range flag.Args() {
- if strings.HasSuffix(arg, "/...") && isDir(arg[:len(arg)-len("/...")]) {
- dirsRun = 1
- for _, dirname := range allPackagesInFS(arg) {
- args = append(args, dirname)
- }
- } else if isDir(arg) {
- dirsRun = 1
- args = append(args, arg)
- } else if exists(arg) {
- filesRun = 1
- args = append(args, arg)
- } else {
- pkgsRun = 1
- args = append(args, arg)
- }
- }
-
- if dirsRun+filesRun+pkgsRun != 1 {
- usage()
- os.Exit(2)
- }
- switch {
- case dirsRun == 1:
- for _, dir := range args {
- lintDir(dir)
- }
- case filesRun == 1:
- lintFiles(args...)
- case pkgsRun == 1:
- for _, pkg := range importPaths(args) {
- lintPackage(pkg)
- }
- }
- }
-
- if *setExitStatus && suggestions > 0 {
- fmt.Fprintf(os.Stderr, "Found %d lint suggestions; failing.\n", suggestions)
- os.Exit(1)
- }
-}
-
-func isDir(filename string) bool {
- fi, err := os.Stat(filename)
- return err == nil && fi.IsDir()
-}
-
-func exists(filename string) bool {
- _, err := os.Stat(filename)
- return err == nil
-}
-
-func lintFiles(filenames ...string) {
- files := make(map[string][]byte)
- for _, filename := range filenames {
- src, err := ioutil.ReadFile(filename)
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- continue
- }
- files[filename] = src
- }
-
- l := new(lint.Linter)
- ps, err := l.LintFiles(files)
- if err != nil {
- fmt.Fprintf(os.Stderr, "%v\n", err)
- return
- }
- for _, p := range ps {
- if p.Confidence >= *minConfidence {
- fmt.Printf("%v: %s\n", p.Position, p.Text)
- suggestions++
- }
- }
-}
-
-func lintDir(dirname string) {
- pkg, err := build.ImportDir(dirname, 0)
- lintImportedPackage(pkg, err)
-}
-
-func lintPackage(pkgname string) {
- pkg, err := build.Import(pkgname, ".", 0)
- lintImportedPackage(pkg, err)
-}
-
-func lintImportedPackage(pkg *build.Package, err error) {
- if err != nil {
- if _, nogo := err.(*build.NoGoError); nogo {
- // Don't complain if the failure is due to no Go source files.
- return
- }
- fmt.Fprintln(os.Stderr, err)
- return
- }
-
- var files []string
- files = append(files, pkg.GoFiles...)
- files = append(files, pkg.CgoFiles...)
- files = append(files, pkg.TestGoFiles...)
- if pkg.Dir != "." {
- for i, f := range files {
- files[i] = filepath.Join(pkg.Dir, f)
- }
- }
- // TODO(dsymonds): Do foo_test too (pkg.XTestGoFiles)
-
- lintFiles(files...)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/golint/import.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/golint/import.go
deleted file mode 100644
index 02a0daa61..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/golint/import.go
+++ /dev/null
@@ -1,310 +0,0 @@
-package main
-
-/*
-
-This file holds a direct copy of the import path matching code of
-https://github.com/golang/go/blob/master/src/cmd/go/main.go. It can be
-replaced when https://golang.org/issue/8768 is resolved.
-
-It has been updated to follow upstream changes in a few ways.
-
-*/
-
-import (
- "fmt"
- "go/build"
- "log"
- "os"
- "path"
- "path/filepath"
- "regexp"
- "runtime"
- "strings"
-)
-
-var buildContext = build.Default
-
-var (
- goroot = filepath.Clean(runtime.GOROOT())
- gorootSrc = filepath.Join(goroot, "src")
-)
-
-// importPathsNoDotExpansion returns the import paths to use for the given
-// command line, but it does no ... expansion.
-func importPathsNoDotExpansion(args []string) []string {
- if len(args) == 0 {
- return []string{"."}
- }
- var out []string
- for _, a := range args {
- // Arguments are supposed to be import paths, but
- // as a courtesy to Windows developers, rewrite \ to /
- // in command-line arguments. Handles .\... and so on.
- if filepath.Separator == '\\' {
- a = strings.Replace(a, `\`, `/`, -1)
- }
-
- // Put argument in canonical form, but preserve leading ./.
- if strings.HasPrefix(a, "./") {
- a = "./" + path.Clean(a)
- if a == "./." {
- a = "."
- }
- } else {
- a = path.Clean(a)
- }
- if a == "all" || a == "std" {
- out = append(out, allPackages(a)...)
- continue
- }
- out = append(out, a)
- }
- return out
-}
-
-// importPaths returns the import paths to use for the given command line.
-func importPaths(args []string) []string {
- args = importPathsNoDotExpansion(args)
- var out []string
- for _, a := range args {
- if strings.Contains(a, "...") {
- if build.IsLocalImport(a) {
- out = append(out, allPackagesInFS(a)...)
- } else {
- out = append(out, allPackages(a)...)
- }
- continue
- }
- out = append(out, a)
- }
- return out
-}
-
-// matchPattern(pattern)(name) reports whether
-// name matches pattern. Pattern is a limited glob
-// pattern in which '...' means 'any string' and there
-// is no other special syntax.
-func matchPattern(pattern string) func(name string) bool {
- re := regexp.QuoteMeta(pattern)
- re = strings.Replace(re, `\.\.\.`, `.*`, -1)
- // Special case: foo/... matches foo too.
- if strings.HasSuffix(re, `/.*`) {
- re = re[:len(re)-len(`/.*`)] + `(/.*)?`
- }
- reg := regexp.MustCompile(`^` + re + `$`)
- return func(name string) bool {
- return reg.MatchString(name)
- }
-}
-
-// hasPathPrefix reports whether the path s begins with the
-// elements in prefix.
-func hasPathPrefix(s, prefix string) bool {
- switch {
- default:
- return false
- case len(s) == len(prefix):
- return s == prefix
- case len(s) > len(prefix):
- if prefix != "" && prefix[len(prefix)-1] == '/' {
- return strings.HasPrefix(s, prefix)
- }
- return s[len(prefix)] == '/' && s[:len(prefix)] == prefix
- }
-}
-
-// treeCanMatchPattern(pattern)(name) reports whether
-// name or children of name can possibly match pattern.
-// Pattern is the same limited glob accepted by matchPattern.
-func treeCanMatchPattern(pattern string) func(name string) bool {
- wildCard := false
- if i := strings.Index(pattern, "..."); i >= 0 {
- wildCard = true
- pattern = pattern[:i]
- }
- return func(name string) bool {
- return len(name) <= len(pattern) && hasPathPrefix(pattern, name) ||
- wildCard && strings.HasPrefix(name, pattern)
- }
-}
-
-// allPackages returns all the packages that can be found
-// under the $GOPATH directories and $GOROOT matching pattern.
-// The pattern is either "all" (all packages), "std" (standard packages)
-// or a path including "...".
-func allPackages(pattern string) []string {
- pkgs := matchPackages(pattern)
- if len(pkgs) == 0 {
- fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
- }
- return pkgs
-}
-
-func matchPackages(pattern string) []string {
- match := func(string) bool { return true }
- treeCanMatch := func(string) bool { return true }
- if pattern != "all" && pattern != "std" {
- match = matchPattern(pattern)
- treeCanMatch = treeCanMatchPattern(pattern)
- }
-
- have := map[string]bool{
- "builtin": true, // ignore pseudo-package that exists only for documentation
- }
- if !buildContext.CgoEnabled {
- have["runtime/cgo"] = true // ignore during walk
- }
- var pkgs []string
-
- // Commands
- cmd := filepath.Join(goroot, "src/cmd") + string(filepath.Separator)
- filepath.Walk(cmd, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() || path == cmd {
- return nil
- }
- name := path[len(cmd):]
- if !treeCanMatch(name) {
- return filepath.SkipDir
- }
- // Commands are all in cmd/, not in subdirectories.
- if strings.Contains(name, string(filepath.Separator)) {
- return filepath.SkipDir
- }
-
- // We use, e.g., cmd/gofmt as the pseudo import path for gofmt.
- name = "cmd/" + name
- if have[name] {
- return nil
- }
- have[name] = true
- if !match(name) {
- return nil
- }
- _, err = buildContext.ImportDir(path, 0)
- if err != nil {
- if _, noGo := err.(*build.NoGoError); !noGo {
- log.Print(err)
- }
- return nil
- }
- pkgs = append(pkgs, name)
- return nil
- })
-
- for _, src := range buildContext.SrcDirs() {
- if (pattern == "std" || pattern == "cmd") && src != gorootSrc {
- continue
- }
- src = filepath.Clean(src) + string(filepath.Separator)
- root := src
- if pattern == "cmd" {
- root += "cmd" + string(filepath.Separator)
- }
- filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() || path == src {
- return nil
- }
-
- // Avoid .foo, _foo, and testdata directory trees.
- _, elem := filepath.Split(path)
- if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" {
- return filepath.SkipDir
- }
-
- name := filepath.ToSlash(path[len(src):])
- if pattern == "std" && (strings.Contains(name, ".") || name == "cmd") {
- // The name "std" is only the standard library.
- // If the name is cmd, it's the root of the command tree.
- return filepath.SkipDir
- }
- if !treeCanMatch(name) {
- return filepath.SkipDir
- }
- if have[name] {
- return nil
- }
- have[name] = true
- if !match(name) {
- return nil
- }
- _, err = buildContext.ImportDir(path, 0)
- if err != nil {
- if _, noGo := err.(*build.NoGoError); noGo {
- return nil
- }
- }
- pkgs = append(pkgs, name)
- return nil
- })
- }
- return pkgs
-}
-
-// allPackagesInFS is like allPackages but is passed a pattern
-// beginning ./ or ../, meaning it should scan the tree rooted
-// at the given directory. There are ... in the pattern too.
-func allPackagesInFS(pattern string) []string {
- pkgs := matchPackagesInFS(pattern)
- if len(pkgs) == 0 {
- fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
- }
- return pkgs
-}
-
-func matchPackagesInFS(pattern string) []string {
- // Find directory to begin the scan.
- // Could be smarter but this one optimization
- // is enough for now, since ... is usually at the
- // end of a path.
- i := strings.Index(pattern, "...")
- dir, _ := path.Split(pattern[:i])
-
- // pattern begins with ./ or ../.
- // path.Clean will discard the ./ but not the ../.
- // We need to preserve the ./ for pattern matching
- // and in the returned import paths.
- prefix := ""
- if strings.HasPrefix(pattern, "./") {
- prefix = "./"
- }
- match := matchPattern(pattern)
-
- var pkgs []string
- filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() {
- return nil
- }
- if path == dir {
- // filepath.Walk starts at dir and recurses. For the recursive case,
- // the path is the result of filepath.Join, which calls filepath.Clean.
- // The initial case is not Cleaned, though, so we do this explicitly.
- //
- // This converts a path like "./io/" to "io". Without this step, running
- // "cd $GOROOT/src/pkg; go list ./io/..." would incorrectly skip the io
- // package, because prepending the prefix "./" to the unclean path would
- // result in "././io", and match("././io") returns false.
- path = filepath.Clean(path)
- }
-
- // Avoid .foo, _foo, and testdata directory trees, but do not avoid "." or "..".
- _, elem := filepath.Split(path)
- dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
- if dot || strings.HasPrefix(elem, "_") || elem == "testdata" {
- return filepath.SkipDir
- }
-
- name := prefix + filepath.ToSlash(path)
- if !match(name) {
- return nil
- }
- if _, err = build.ImportDir(path, 0); err != nil {
- if _, noGo := err.(*build.NoGoError); !noGo {
- log.Print(err)
- }
- return nil
- }
- pkgs = append(pkgs, name)
- return nil
- })
- return pkgs
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/lint.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/lint.go
deleted file mode 100644
index fb47da001..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/golang/lint/lint.go
+++ /dev/null
@@ -1,1622 +0,0 @@
-// Copyright (c) 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 or at
-// https://developers.google.com/open-source/licenses/bsd.
-
-// Package lint contains a linter for Go source code.
-package lint
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/printer"
- "go/token"
- "go/types"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "unicode"
- "unicode/utf8"
-
- "golang.org/x/tools/go/gcexportdata"
-)
-
-const styleGuideBase = "https://golang.org/wiki/CodeReviewComments"
-
-// A Linter lints Go source code.
-type Linter struct {
-}
-
-// Problem represents a problem in some source code.
-type Problem struct {
- Position token.Position // position in source file
- Text string // the prose that describes the problem
- Link string // (optional) the link to the style guide for the problem
- Confidence float64 // a value in (0,1] estimating the confidence in this problem's correctness
- LineText string // the source line
- Category string // a short name for the general category of the problem
-
- // If the problem has a suggested fix (the minority case),
- // ReplacementLine is a full replacement for the relevant line of the source file.
- ReplacementLine string
-}
-
-func (p *Problem) String() string {
- if p.Link != "" {
- return p.Text + "\n\n" + p.Link
- }
- return p.Text
-}
-
-type byPosition []Problem
-
-func (p byPosition) Len() int { return len(p) }
-func (p byPosition) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-
-func (p byPosition) Less(i, j int) bool {
- pi, pj := p[i].Position, p[j].Position
-
- if pi.Filename != pj.Filename {
- return pi.Filename < pj.Filename
- }
- if pi.Line != pj.Line {
- return pi.Line < pj.Line
- }
- if pi.Column != pj.Column {
- return pi.Column < pj.Column
- }
-
- return p[i].Text < p[j].Text
-}
-
-// Lint lints src.
-func (l *Linter) Lint(filename string, src []byte) ([]Problem, error) {
- return l.LintFiles(map[string][]byte{filename: src})
-}
-
-// LintFiles lints a set of files of a single package.
-// The argument is a map of filename to source.
-func (l *Linter) LintFiles(files map[string][]byte) ([]Problem, error) {
- pkg := &pkg{
- fset: token.NewFileSet(),
- files: make(map[string]*file),
- }
- var pkgName string
- for filename, src := range files {
- if isGenerated(src) {
- continue // See issue #239
- }
- f, err := parser.ParseFile(pkg.fset, filename, src, parser.ParseComments)
- if err != nil {
- return nil, err
- }
- if pkgName == "" {
- pkgName = f.Name.Name
- } else if f.Name.Name != pkgName {
- return nil, fmt.Errorf("%s is in package %s, not %s", filename, f.Name.Name, pkgName)
- }
- pkg.files[filename] = &file{
- pkg: pkg,
- f: f,
- fset: pkg.fset,
- src: src,
- filename: filename,
- }
- }
- if len(pkg.files) == 0 {
- return nil, nil
- }
- return pkg.lint(), nil
-}
-
-var (
- genHdr = []byte("// Code generated ")
- genFtr = []byte(" DO NOT EDIT.")
-)
-
-// isGenerated reports whether the source file is generated code
-// according the rules from https://golang.org/s/generatedcode.
-func isGenerated(src []byte) bool {
- sc := bufio.NewScanner(bytes.NewReader(src))
- for sc.Scan() {
- b := sc.Bytes()
- if bytes.HasPrefix(b, genHdr) && bytes.HasSuffix(b, genFtr) && len(b) >= len(genHdr)+len(genFtr) {
- return true
- }
- }
- return false
-}
-
-// pkg represents a package being linted.
-type pkg struct {
- fset *token.FileSet
- files map[string]*file
-
- typesPkg *types.Package
- typesInfo *types.Info
-
- // sortable is the set of types in the package that implement sort.Interface.
- sortable map[string]bool
- // main is whether this is a "main" package.
- main bool
-
- problems []Problem
-}
-
-func (p *pkg) lint() []Problem {
- if err := p.typeCheck(); err != nil {
- /* TODO(dsymonds): Consider reporting these errors when golint operates on entire packages.
- if e, ok := err.(types.Error); ok {
- pos := p.fset.Position(e.Pos)
- conf := 1.0
- if strings.Contains(e.Msg, "can't find import: ") {
- // Golint is probably being run in a context that doesn't support
- // typechecking (e.g. package files aren't found), so don't warn about it.
- conf = 0
- }
- if conf > 0 {
- p.errorfAt(pos, conf, category("typechecking"), e.Msg)
- }
-
- // TODO(dsymonds): Abort if !e.Soft?
- }
- */
- }
-
- p.scanSortable()
- p.main = p.isMain()
-
- for _, f := range p.files {
- f.lint()
- }
-
- sort.Sort(byPosition(p.problems))
-
- return p.problems
-}
-
-// file represents a file being linted.
-type file struct {
- pkg *pkg
- f *ast.File
- fset *token.FileSet
- src []byte
- filename string
-}
-
-func (f *file) isTest() bool { return strings.HasSuffix(f.filename, "_test.go") }
-
-func (f *file) lint() {
- f.lintPackageComment()
- f.lintImports()
- f.lintBlankImports()
- f.lintExported()
- f.lintNames()
- f.lintVarDecls()
- f.lintElses()
- f.lintRanges()
- f.lintErrorf()
- f.lintErrors()
- f.lintErrorStrings()
- f.lintReceiverNames()
- f.lintIncDec()
- f.lintErrorReturn()
- f.lintUnexportedReturn()
- f.lintTimeNames()
- f.lintContextKeyTypes()
- f.lintContextArgs()
-}
-
-type link string
-type category string
-
-// The variadic arguments may start with link and category types,
-// and must end with a format string and any arguments.
-// It returns the new Problem.
-func (f *file) errorf(n ast.Node, confidence float64, args ...interface{}) *Problem {
- pos := f.fset.Position(n.Pos())
- if pos.Filename == "" {
- pos.Filename = f.filename
- }
- return f.pkg.errorfAt(pos, confidence, args...)
-}
-
-func (p *pkg) errorfAt(pos token.Position, confidence float64, args ...interface{}) *Problem {
- problem := Problem{
- Position: pos,
- Confidence: confidence,
- }
- if pos.Filename != "" {
- // The file might not exist in our mapping if a //line directive was encountered.
- if f, ok := p.files[pos.Filename]; ok {
- problem.LineText = srcLine(f.src, pos)
- }
- }
-
-argLoop:
- for len(args) > 1 { // always leave at least the format string in args
- switch v := args[0].(type) {
- case link:
- problem.Link = string(v)
- case category:
- problem.Category = string(v)
- default:
- break argLoop
- }
- args = args[1:]
- }
-
- problem.Text = fmt.Sprintf(args[0].(string), args[1:]...)
-
- p.problems = append(p.problems, problem)
- return &p.problems[len(p.problems)-1]
-}
-
-var newImporter = func(fset *token.FileSet) types.ImporterFrom {
- return gcexportdata.NewImporter(fset, make(map[string]*types.Package))
-}
-
-func (p *pkg) typeCheck() error {
- config := &types.Config{
- // By setting a no-op error reporter, the type checker does as much work as possible.
- Error: func(error) {},
- Importer: newImporter(p.fset),
- }
- info := &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- }
- var anyFile *file
- var astFiles []*ast.File
- for _, f := range p.files {
- anyFile = f
- astFiles = append(astFiles, f.f)
- }
- pkg, err := config.Check(anyFile.f.Name.Name, p.fset, astFiles, info)
- // Remember the typechecking info, even if config.Check failed,
- // since we will get partial information.
- p.typesPkg = pkg
- p.typesInfo = info
- return err
-}
-
-func (p *pkg) typeOf(expr ast.Expr) types.Type {
- if p.typesInfo == nil {
- return nil
- }
- return p.typesInfo.TypeOf(expr)
-}
-
-func (p *pkg) isNamedType(typ types.Type, importPath, name string) bool {
- n, ok := typ.(*types.Named)
- if !ok {
- return false
- }
- tn := n.Obj()
- return tn != nil && tn.Pkg() != nil && tn.Pkg().Path() == importPath && tn.Name() == name
-}
-
-// scopeOf returns the tightest scope encompassing id.
-func (p *pkg) scopeOf(id *ast.Ident) *types.Scope {
- var scope *types.Scope
- if obj := p.typesInfo.ObjectOf(id); obj != nil {
- scope = obj.Parent()
- }
- if scope == p.typesPkg.Scope() {
- // We were given a top-level identifier.
- // Use the file-level scope instead of the package-level scope.
- pos := id.Pos()
- for _, f := range p.files {
- if f.f.Pos() <= pos && pos < f.f.End() {
- scope = p.typesInfo.Scopes[f.f]
- break
- }
- }
- }
- return scope
-}
-
-func (p *pkg) scanSortable() {
- p.sortable = make(map[string]bool)
-
- // bitfield for which methods exist on each type.
- const (
- Len = 1 << iota
- Less
- Swap
- )
- nmap := map[string]int{"Len": Len, "Less": Less, "Swap": Swap}
- has := make(map[string]int)
- for _, f := range p.files {
- f.walk(func(n ast.Node) bool {
- fn, ok := n.(*ast.FuncDecl)
- if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 {
- return true
- }
- // TODO(dsymonds): We could check the signature to be more precise.
- recv := receiverType(fn)
- if i, ok := nmap[fn.Name.Name]; ok {
- has[recv] |= i
- }
- return false
- })
- }
- for typ, ms := range has {
- if ms == Len|Less|Swap {
- p.sortable[typ] = true
- }
- }
-}
-
-func (p *pkg) isMain() bool {
- for _, f := range p.files {
- if f.isMain() {
- return true
- }
- }
- return false
-}
-
-func (f *file) isMain() bool {
- if f.f.Name.Name == "main" {
- return true
- }
- return false
-}
-
-// lintPackageComment checks package comments. It complains if
-// there is no package comment, or if it is not of the right form.
-// This has a notable false positive in that a package comment
-// could rightfully appear in a different file of the same package,
-// but that's not easy to fix since this linter is file-oriented.
-func (f *file) lintPackageComment() {
- if f.isTest() {
- return
- }
-
- const ref = styleGuideBase + "#package-comments"
- prefix := "Package " + f.f.Name.Name + " "
-
- // Look for a detached package comment.
- // First, scan for the last comment that occurs before the "package" keyword.
- var lastCG *ast.CommentGroup
- for _, cg := range f.f.Comments {
- if cg.Pos() > f.f.Package {
- // Gone past "package" keyword.
- break
- }
- lastCG = cg
- }
- if lastCG != nil && strings.HasPrefix(lastCG.Text(), prefix) {
- endPos := f.fset.Position(lastCG.End())
- pkgPos := f.fset.Position(f.f.Package)
- if endPos.Line+1 < pkgPos.Line {
- // There isn't a great place to anchor this error;
- // the start of the blank lines between the doc and the package statement
- // is at least pointing at the location of the problem.
- pos := token.Position{
- Filename: endPos.Filename,
- // Offset not set; it is non-trivial, and doesn't appear to be needed.
- Line: endPos.Line + 1,
- Column: 1,
- }
- f.pkg.errorfAt(pos, 0.9, link(ref), category("comments"), "package comment is detached; there should be no blank lines between it and the package statement")
- return
- }
- }
-
- if f.f.Doc == nil {
- f.errorf(f.f, 0.2, link(ref), category("comments"), "should have a package comment, unless it's in another file for this package")
- return
- }
- s := f.f.Doc.Text()
- if ts := strings.TrimLeft(s, " \t"); ts != s {
- f.errorf(f.f.Doc, 1, link(ref), category("comments"), "package comment should not have leading space")
- s = ts
- }
- // Only non-main packages need to keep to this form.
- if !f.pkg.main && !strings.HasPrefix(s, prefix) {
- f.errorf(f.f.Doc, 1, link(ref), category("comments"), `package comment should be of the form "%s..."`, prefix)
- }
-}
-
-// lintBlankImports complains if a non-main package has blank imports that are
-// not documented.
-func (f *file) lintBlankImports() {
- // In package main and in tests, we don't complain about blank imports.
- if f.pkg.main || f.isTest() {
- return
- }
-
- // The first element of each contiguous group of blank imports should have
- // an explanatory comment of some kind.
- for i, imp := range f.f.Imports {
- pos := f.fset.Position(imp.Pos())
-
- if !isBlank(imp.Name) {
- continue // Ignore non-blank imports.
- }
- if i > 0 {
- prev := f.f.Imports[i-1]
- prevPos := f.fset.Position(prev.Pos())
- if isBlank(prev.Name) && prevPos.Line+1 == pos.Line {
- continue // A subsequent blank in a group.
- }
- }
-
- // This is the first blank import of a group.
- if imp.Doc == nil && imp.Comment == nil {
- ref := ""
- f.errorf(imp, 1, link(ref), category("imports"), "a blank import should be only in a main or test package, or have a comment justifying it")
- }
- }
-}
-
-// lintImports examines import blocks.
-func (f *file) lintImports() {
- for i, is := range f.f.Imports {
- _ = i
- if is.Name != nil && is.Name.Name == "." && !f.isTest() {
- f.errorf(is, 1, link(styleGuideBase+"#import-dot"), category("imports"), "should not use dot imports")
- }
-
- }
-}
-
-const docCommentsLink = styleGuideBase + "#doc-comments"
-
-// lintExported examines the exported names.
-// It complains if any required doc comments are missing,
-// or if they are not of the right form. The exact rules are in
-// lintFuncDoc, lintTypeDoc and lintValueSpecDoc; this function
-// also tracks the GenDecl structure being traversed to permit
-// doc comments for constants to be on top of the const block.
-// It also complains if the names stutter when combined with
-// the package name.
-func (f *file) lintExported() {
- if f.isTest() {
- return
- }
-
- var lastGen *ast.GenDecl // last GenDecl entered.
-
- // Set of GenDecls that have already had missing comments flagged.
- genDeclMissingComments := make(map[*ast.GenDecl]bool)
-
- f.walk(func(node ast.Node) bool {
- switch v := node.(type) {
- case *ast.GenDecl:
- if v.Tok == token.IMPORT {
- return false
- }
- // token.CONST, token.TYPE or token.VAR
- lastGen = v
- return true
- case *ast.FuncDecl:
- f.lintFuncDoc(v)
- if v.Recv == nil {
- // Only check for stutter on functions, not methods.
- // Method names are not used package-qualified.
- f.checkStutter(v.Name, "func")
- }
- // Don't proceed inside funcs.
- return false
- case *ast.TypeSpec:
- // inside a GenDecl, which usually has the doc
- doc := v.Doc
- if doc == nil {
- doc = lastGen.Doc
- }
- f.lintTypeDoc(v, doc)
- f.checkStutter(v.Name, "type")
- // Don't proceed inside types.
- return false
- case *ast.ValueSpec:
- f.lintValueSpecDoc(v, lastGen, genDeclMissingComments)
- return false
- }
- return true
- })
-}
-
-var allCapsRE = regexp.MustCompile(`^[A-Z0-9_]+$`)
-
-// knownNameExceptions is a set of names that are known to be exempt from naming checks.
-// This is usually because they are constrained by having to match names in the
-// standard library.
-var knownNameExceptions = map[string]bool{
- "LastInsertId": true, // must match database/sql
- "kWh": true,
-}
-
-// lintNames examines all names in the file.
-// It complains if any use underscores or incorrect known initialisms.
-func (f *file) lintNames() {
- // Package names need slightly different handling than other names.
- if strings.Contains(f.f.Name.Name, "_") && !strings.HasSuffix(f.f.Name.Name, "_test") {
- f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("naming"), "don't use an underscore in package name")
- }
-
- check := func(id *ast.Ident, thing string) {
- if id.Name == "_" {
- return
- }
- if knownNameExceptions[id.Name] {
- return
- }
-
- // Handle two common styles from other languages that don't belong in Go.
- if len(id.Name) >= 5 && allCapsRE.MatchString(id.Name) && strings.Contains(id.Name, "_") {
- f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use ALL_CAPS in Go names; use CamelCase")
- return
- }
- if len(id.Name) > 2 && id.Name[0] == 'k' && id.Name[1] >= 'A' && id.Name[1] <= 'Z' {
- should := string(id.Name[1]+'a'-'A') + id.Name[2:]
- f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use leading k in Go names; %s %s should be %s", thing, id.Name, should)
- }
-
- should := lintName(id.Name)
- if id.Name == should {
- return
- }
-
- if len(id.Name) > 2 && strings.Contains(id.Name[1:], "_") {
- f.errorf(id, 0.9, link("http://golang.org/doc/effective_go.html#mixed-caps"), category("naming"), "don't use underscores in Go names; %s %s should be %s", thing, id.Name, should)
- return
- }
- f.errorf(id, 0.8, link(styleGuideBase+"#initialisms"), category("naming"), "%s %s should be %s", thing, id.Name, should)
- }
- checkList := func(fl *ast.FieldList, thing string) {
- if fl == nil {
- return
- }
- for _, f := range fl.List {
- for _, id := range f.Names {
- check(id, thing)
- }
- }
- }
- f.walk(func(node ast.Node) bool {
- switch v := node.(type) {
- case *ast.AssignStmt:
- if v.Tok == token.ASSIGN {
- return true
- }
- for _, exp := range v.Lhs {
- if id, ok := exp.(*ast.Ident); ok {
- check(id, "var")
- }
- }
- case *ast.FuncDecl:
- if f.isTest() && (strings.HasPrefix(v.Name.Name, "Example") || strings.HasPrefix(v.Name.Name, "Test") || strings.HasPrefix(v.Name.Name, "Benchmark")) {
- return true
- }
-
- thing := "func"
- if v.Recv != nil {
- thing = "method"
- }
-
- // Exclude naming warnings for functions that are exported to C but
- // not exported in the Go API.
- // See https://github.com/golang/lint/issues/144.
- if ast.IsExported(v.Name.Name) || !isCgoExported(v) {
- check(v.Name, thing)
- }
-
- checkList(v.Type.Params, thing+" parameter")
- checkList(v.Type.Results, thing+" result")
- case *ast.GenDecl:
- if v.Tok == token.IMPORT {
- return true
- }
- var thing string
- switch v.Tok {
- case token.CONST:
- thing = "const"
- case token.TYPE:
- thing = "type"
- case token.VAR:
- thing = "var"
- }
- for _, spec := range v.Specs {
- switch s := spec.(type) {
- case *ast.TypeSpec:
- check(s.Name, thing)
- case *ast.ValueSpec:
- for _, id := range s.Names {
- check(id, thing)
- }
- }
- }
- case *ast.InterfaceType:
- // Do not check interface method names.
- // They are often constrainted by the method names of concrete types.
- for _, x := range v.Methods.List {
- ft, ok := x.Type.(*ast.FuncType)
- if !ok { // might be an embedded interface name
- continue
- }
- checkList(ft.Params, "interface method parameter")
- checkList(ft.Results, "interface method result")
- }
- case *ast.RangeStmt:
- if v.Tok == token.ASSIGN {
- return true
- }
- if id, ok := v.Key.(*ast.Ident); ok {
- check(id, "range var")
- }
- if id, ok := v.Value.(*ast.Ident); ok {
- check(id, "range var")
- }
- case *ast.StructType:
- for _, f := range v.Fields.List {
- for _, id := range f.Names {
- check(id, "struct field")
- }
- }
- }
- return true
- })
-}
-
-// lintName returns a different name if it should be different.
-func lintName(name string) (should string) {
- // Fast path for simple cases: "_" and all lowercase.
- if name == "_" {
- return name
- }
- allLower := true
- for _, r := range name {
- if !unicode.IsLower(r) {
- allLower = false
- break
- }
- }
- if allLower {
- return name
- }
-
- // Split camelCase at any lower->upper transition, and split on underscores.
- // Check each word for common initialisms.
- runes := []rune(name)
- w, i := 0, 0 // index of start of word, scan
- for i+1 <= len(runes) {
- eow := false // whether we hit the end of a word
- if i+1 == len(runes) {
- eow = true
- } else if runes[i+1] == '_' {
- // underscore; shift the remainder forward over any run of underscores
- eow = true
- n := 1
- for i+n+1 < len(runes) && runes[i+n+1] == '_' {
- n++
- }
-
- // Leave at most one underscore if the underscore is between two digits
- if i+n+1 < len(runes) && unicode.IsDigit(runes[i]) && unicode.IsDigit(runes[i+n+1]) {
- n--
- }
-
- copy(runes[i+1:], runes[i+n+1:])
- runes = runes[:len(runes)-n]
- } else if unicode.IsLower(runes[i]) && !unicode.IsLower(runes[i+1]) {
- // lower->non-lower
- eow = true
- }
- i++
- if !eow {
- continue
- }
-
- // [w,i) is a word.
- word := string(runes[w:i])
- if u := strings.ToUpper(word); commonInitialisms[u] {
- // Keep consistent case, which is lowercase only at the start.
- if w == 0 && unicode.IsLower(runes[w]) {
- u = strings.ToLower(u)
- }
- // All the common initialisms are ASCII,
- // so we can replace the bytes exactly.
- copy(runes[w:], []rune(u))
- } else if w > 0 && strings.ToLower(word) == word {
- // already all lowercase, and not the first word, so uppercase the first character.
- runes[w] = unicode.ToUpper(runes[w])
- }
- w = i
- }
- return string(runes)
-}
-
-// commonInitialisms is a set of common initialisms.
-// Only add entries that are highly unlikely to be non-initialisms.
-// For instance, "ID" is fine (Freudian code is rare), but "AND" is not.
-var commonInitialisms = map[string]bool{
- "ACL": true,
- "API": true,
- "ASCII": true,
- "CPU": true,
- "CSS": true,
- "DNS": true,
- "EOF": true,
- "GUID": true,
- "HTML": true,
- "HTTP": true,
- "HTTPS": true,
- "ID": true,
- "IP": true,
- "JSON": true,
- "LHS": true,
- "QPS": true,
- "RAM": true,
- "RHS": true,
- "RPC": true,
- "SLA": true,
- "SMTP": true,
- "SQL": true,
- "SSH": true,
- "TCP": true,
- "TLS": true,
- "TTL": true,
- "UDP": true,
- "UI": true,
- "UID": true,
- "UUID": true,
- "URI": true,
- "URL": true,
- "UTF8": true,
- "VM": true,
- "XML": true,
- "XMPP": true,
- "XSRF": true,
- "XSS": true,
-}
-
-// lintTypeDoc examines the doc comment on a type.
-// It complains if they are missing from an exported type,
-// or if they are not of the standard form.
-func (f *file) lintTypeDoc(t *ast.TypeSpec, doc *ast.CommentGroup) {
- if !ast.IsExported(t.Name.Name) {
- return
- }
- if doc == nil {
- f.errorf(t, 1, link(docCommentsLink), category("comments"), "exported type %v should have comment or be unexported", t.Name)
- return
- }
-
- s := doc.Text()
- articles := [...]string{"A", "An", "The"}
- for _, a := range articles {
- if strings.HasPrefix(s, a+" ") {
- s = s[len(a)+1:]
- break
- }
- }
- if !strings.HasPrefix(s, t.Name.Name+" ") {
- f.errorf(doc, 1, link(docCommentsLink), category("comments"), `comment on exported type %v should be of the form "%v ..." (with optional leading article)`, t.Name, t.Name)
- }
-}
-
-var commonMethods = map[string]bool{
- "Error": true,
- "Read": true,
- "ServeHTTP": true,
- "String": true,
- "Write": true,
-}
-
-// lintFuncDoc examines doc comments on functions and methods.
-// It complains if they are missing, or not of the right form.
-// It has specific exclusions for well-known methods (see commonMethods above).
-func (f *file) lintFuncDoc(fn *ast.FuncDecl) {
- if !ast.IsExported(fn.Name.Name) {
- // func is unexported
- return
- }
- kind := "function"
- name := fn.Name.Name
- if fn.Recv != nil && len(fn.Recv.List) > 0 {
- // method
- kind = "method"
- recv := receiverType(fn)
- if !ast.IsExported(recv) {
- // receiver is unexported
- return
- }
- if commonMethods[name] {
- return
- }
- switch name {
- case "Len", "Less", "Swap":
- if f.pkg.sortable[recv] {
- return
- }
- }
- name = recv + "." + name
- }
- if fn.Doc == nil {
- f.errorf(fn, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment or be unexported", kind, name)
- return
- }
- s := fn.Doc.Text()
- prefix := fn.Name.Name + " "
- if !strings.HasPrefix(s, prefix) {
- f.errorf(fn.Doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix)
- }
-}
-
-// lintValueSpecDoc examines package-global variables and constants.
-// It complains if they are not individually declared,
-// or if they are not suitably documented in the right form (unless they are in a block that is commented).
-func (f *file) lintValueSpecDoc(vs *ast.ValueSpec, gd *ast.GenDecl, genDeclMissingComments map[*ast.GenDecl]bool) {
- kind := "var"
- if gd.Tok == token.CONST {
- kind = "const"
- }
-
- if len(vs.Names) > 1 {
- // Check that none are exported except for the first.
- for _, n := range vs.Names[1:] {
- if ast.IsExported(n.Name) {
- f.errorf(vs, 1, category("comments"), "exported %s %s should have its own declaration", kind, n.Name)
- return
- }
- }
- }
-
- // Only one name.
- name := vs.Names[0].Name
- if !ast.IsExported(name) {
- return
- }
-
- if vs.Doc == nil && gd.Doc == nil {
- if genDeclMissingComments[gd] {
- return
- }
- block := ""
- if kind == "const" && gd.Lparen.IsValid() {
- block = " (or a comment on this block)"
- }
- f.errorf(vs, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment%s or be unexported", kind, name, block)
- genDeclMissingComments[gd] = true
- return
- }
- // If this GenDecl has parens and a comment, we don't check its comment form.
- if gd.Lparen.IsValid() && gd.Doc != nil {
- return
- }
- // The relevant text to check will be on either vs.Doc or gd.Doc.
- // Use vs.Doc preferentially.
- doc := vs.Doc
- if doc == nil {
- doc = gd.Doc
- }
- prefix := name + " "
- if !strings.HasPrefix(doc.Text(), prefix) {
- f.errorf(doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix)
- }
-}
-
-func (f *file) checkStutter(id *ast.Ident, thing string) {
- pkg, name := f.f.Name.Name, id.Name
- if !ast.IsExported(name) {
- // unexported name
- return
- }
- // A name stutters if the package name is a strict prefix
- // and the next character of the name starts a new word.
- if len(name) <= len(pkg) {
- // name is too short to stutter.
- // This permits the name to be the same as the package name.
- return
- }
- if !strings.EqualFold(pkg, name[:len(pkg)]) {
- return
- }
- // We can assume the name is well-formed UTF-8.
- // If the next rune after the package name is uppercase or an underscore
- // the it's starting a new word and thus this name stutters.
- rem := name[len(pkg):]
- if next, _ := utf8.DecodeRuneInString(rem); next == '_' || unicode.IsUpper(next) {
- f.errorf(id, 0.8, link(styleGuideBase+"#package-names"), category("naming"), "%s name will be used as %s.%s by other packages, and that stutters; consider calling this %s", thing, pkg, name, rem)
- }
-}
-
-// zeroLiteral is a set of ast.BasicLit values that are zero values.
-// It is not exhaustive.
-var zeroLiteral = map[string]bool{
- "false": true, // bool
- // runes
- `'\x00'`: true,
- `'\000'`: true,
- // strings
- `""`: true,
- "``": true,
- // numerics
- "0": true,
- "0.": true,
- "0.0": true,
- "0i": true,
-}
-
-// lintVarDecls examines variable declarations. It complains about declarations with
-// redundant LHS types that can be inferred from the RHS.
-func (f *file) lintVarDecls() {
- var lastGen *ast.GenDecl // last GenDecl entered.
-
- f.walk(func(node ast.Node) bool {
- switch v := node.(type) {
- case *ast.GenDecl:
- if v.Tok != token.CONST && v.Tok != token.VAR {
- return false
- }
- lastGen = v
- return true
- case *ast.ValueSpec:
- if lastGen.Tok == token.CONST {
- return false
- }
- if len(v.Names) > 1 || v.Type == nil || len(v.Values) == 0 {
- return false
- }
- rhs := v.Values[0]
- // An underscore var appears in a common idiom for compile-time interface satisfaction,
- // as in "var _ Interface = (*Concrete)(nil)".
- if isIdent(v.Names[0], "_") {
- return false
- }
- // If the RHS is a zero value, suggest dropping it.
- zero := false
- if lit, ok := rhs.(*ast.BasicLit); ok {
- zero = zeroLiteral[lit.Value]
- } else if isIdent(rhs, "nil") {
- zero = true
- }
- if zero {
- f.errorf(rhs, 0.9, category("zero-value"), "should drop = %s from declaration of var %s; it is the zero value", f.render(rhs), v.Names[0])
- return false
- }
- lhsTyp := f.pkg.typeOf(v.Type)
- rhsTyp := f.pkg.typeOf(rhs)
-
- if !validType(lhsTyp) || !validType(rhsTyp) {
- // Type checking failed (often due to missing imports).
- return false
- }
-
- if !types.Identical(lhsTyp, rhsTyp) {
- // Assignment to a different type is not redundant.
- return false
- }
-
- // The next three conditions are for suppressing the warning in situations
- // where we were unable to typecheck.
-
- // If the LHS type is an interface, don't warn, since it is probably a
- // concrete type on the RHS. Note that our feeble lexical check here
- // will only pick up interface{} and other literal interface types;
- // that covers most of the cases we care to exclude right now.
- if _, ok := v.Type.(*ast.InterfaceType); ok {
- return false
- }
- // If the RHS is an untyped const, only warn if the LHS type is its default type.
- if defType, ok := f.isUntypedConst(rhs); ok && !isIdent(v.Type, defType) {
- return false
- }
-
- f.errorf(v.Type, 0.8, category("type-inference"), "should omit type %s from declaration of var %s; it will be inferred from the right-hand side", f.render(v.Type), v.Names[0])
- return false
- }
- return true
- })
-}
-
-func validType(T types.Type) bool {
- return T != nil &&
- T != types.Typ[types.Invalid] &&
- !strings.Contains(T.String(), "invalid type") // good but not foolproof
-}
-
-// lintElses examines else blocks. It complains about any else block whose if block ends in a return.
-func (f *file) lintElses() {
- // We don't want to flag if { } else if { } else { } constructions.
- // They will appear as an IfStmt whose Else field is also an IfStmt.
- // Record such a node so we ignore it when we visit it.
- ignore := make(map[*ast.IfStmt]bool)
-
- f.walk(func(node ast.Node) bool {
- ifStmt, ok := node.(*ast.IfStmt)
- if !ok || ifStmt.Else == nil {
- return true
- }
- if ignore[ifStmt] {
- return true
- }
- if elseif, ok := ifStmt.Else.(*ast.IfStmt); ok {
- ignore[elseif] = true
- return true
- }
- if _, ok := ifStmt.Else.(*ast.BlockStmt); !ok {
- // only care about elses without conditions
- return true
- }
- if len(ifStmt.Body.List) == 0 {
- return true
- }
- shortDecl := false // does the if statement have a ":=" initialization statement?
- if ifStmt.Init != nil {
- if as, ok := ifStmt.Init.(*ast.AssignStmt); ok && as.Tok == token.DEFINE {
- shortDecl = true
- }
- }
- lastStmt := ifStmt.Body.List[len(ifStmt.Body.List)-1]
- if _, ok := lastStmt.(*ast.ReturnStmt); ok {
- extra := ""
- if shortDecl {
- extra = " (move short variable declaration to its own line if necessary)"
- }
- f.errorf(ifStmt.Else, 1, link(styleGuideBase+"#indent-error-flow"), category("indent"), "if block ends with a return statement, so drop this else and outdent its block"+extra)
- }
- return true
- })
-}
-
-// lintRanges examines range clauses. It complains about redundant constructions.
-func (f *file) lintRanges() {
- f.walk(func(node ast.Node) bool {
- rs, ok := node.(*ast.RangeStmt)
- if !ok {
- return true
- }
- if rs.Value == nil {
- // for x = range m { ... }
- return true // single var form
- }
- if !isIdent(rs.Value, "_") {
- // for ?, y = range m { ... }
- return true
- }
-
- p := f.errorf(rs.Value, 1, category("range-loop"), "should omit 2nd value from range; this loop is equivalent to `for %s %s range ...`", f.render(rs.Key), rs.Tok)
-
- newRS := *rs // shallow copy
- newRS.Value = nil
- p.ReplacementLine = f.firstLineOf(&newRS, rs)
-
- return true
- })
-}
-
-// lintErrorf examines errors.New and testing.Error calls. It complains if its only argument is an fmt.Sprintf invocation.
-func (f *file) lintErrorf() {
- f.walk(func(node ast.Node) bool {
- ce, ok := node.(*ast.CallExpr)
- if !ok || len(ce.Args) != 1 {
- return true
- }
- isErrorsNew := isPkgDot(ce.Fun, "errors", "New")
- var isTestingError bool
- se, ok := ce.Fun.(*ast.SelectorExpr)
- if ok && se.Sel.Name == "Error" {
- if typ := f.pkg.typeOf(se.X); typ != nil {
- isTestingError = typ.String() == "*testing.T"
- }
- }
- if !isErrorsNew && !isTestingError {
- return true
- }
- arg := ce.Args[0]
- ce, ok = arg.(*ast.CallExpr)
- if !ok || !isPkgDot(ce.Fun, "fmt", "Sprintf") {
- return true
- }
- errorfPrefix := "fmt"
- if isTestingError {
- errorfPrefix = f.render(se.X)
- }
- p := f.errorf(node, 1, category("errors"), "should replace %s(fmt.Sprintf(...)) with %s.Errorf(...)", f.render(se), errorfPrefix)
-
- m := f.srcLineWithMatch(ce, `^(.*)`+f.render(se)+`\(fmt\.Sprintf\((.*)\)\)(.*)$`)
- if m != nil {
- p.ReplacementLine = m[1] + errorfPrefix + ".Errorf(" + m[2] + ")" + m[3]
- }
-
- return true
- })
-}
-
-// lintErrors examines global error vars. It complains if they aren't named in the standard way.
-func (f *file) lintErrors() {
- for _, decl := range f.f.Decls {
- gd, ok := decl.(*ast.GenDecl)
- if !ok || gd.Tok != token.VAR {
- continue
- }
- for _, spec := range gd.Specs {
- spec := spec.(*ast.ValueSpec)
- if len(spec.Names) != 1 || len(spec.Values) != 1 {
- continue
- }
- ce, ok := spec.Values[0].(*ast.CallExpr)
- if !ok {
- continue
- }
- if !isPkgDot(ce.Fun, "errors", "New") && !isPkgDot(ce.Fun, "fmt", "Errorf") {
- continue
- }
-
- id := spec.Names[0]
- prefix := "err"
- if id.IsExported() {
- prefix = "Err"
- }
- if !strings.HasPrefix(id.Name, prefix) {
- f.errorf(id, 0.9, category("naming"), "error var %s should have name of the form %sFoo", id.Name, prefix)
- }
- }
- }
-}
-
-func lintErrorString(s string) (isClean bool, conf float64) {
- const basicConfidence = 0.8
- const capConfidence = basicConfidence - 0.2
- first, firstN := utf8.DecodeRuneInString(s)
- last, _ := utf8.DecodeLastRuneInString(s)
- if last == '.' || last == ':' || last == '!' || last == '\n' {
- return false, basicConfidence
- }
- if unicode.IsUpper(first) {
- // People use proper nouns and exported Go identifiers in error strings,
- // so decrease the confidence of warnings for capitalization.
- if len(s) <= firstN {
- return false, capConfidence
- }
- // Flag strings starting with something that doesn't look like an initialism.
- if second, _ := utf8.DecodeRuneInString(s[firstN:]); !unicode.IsUpper(second) {
- return false, capConfidence
- }
- }
- return true, 0
-}
-
-// lintErrorStrings examines error strings.
-// It complains if they are capitalized or end in punctuation or a newline.
-func (f *file) lintErrorStrings() {
- f.walk(func(node ast.Node) bool {
- ce, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !isPkgDot(ce.Fun, "errors", "New") && !isPkgDot(ce.Fun, "fmt", "Errorf") {
- return true
- }
- if len(ce.Args) < 1 {
- return true
- }
- str, ok := ce.Args[0].(*ast.BasicLit)
- if !ok || str.Kind != token.STRING {
- return true
- }
- s, _ := strconv.Unquote(str.Value) // can assume well-formed Go
- if s == "" {
- return true
- }
- clean, conf := lintErrorString(s)
- if clean {
- return true
- }
-
- f.errorf(str, conf, link(styleGuideBase+"#error-strings"), category("errors"),
- "error strings should not be capitalized or end with punctuation or a newline")
- return true
- })
-}
-
-// lintReceiverNames examines receiver names. It complains about inconsistent
-// names used for the same type and names such as "this".
-func (f *file) lintReceiverNames() {
- typeReceiver := map[string]string{}
- f.walk(func(n ast.Node) bool {
- fn, ok := n.(*ast.FuncDecl)
- if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 {
- return true
- }
- names := fn.Recv.List[0].Names
- if len(names) < 1 {
- return true
- }
- name := names[0].Name
- const ref = styleGuideBase + "#receiver-names"
- if name == "_" {
- f.errorf(n, 1, link(ref), category("naming"), `receiver name should not be an underscore`)
- return true
- }
- if name == "this" || name == "self" {
- f.errorf(n, 1, link(ref), category("naming"), `receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"`)
- return true
- }
- recv := receiverType(fn)
- if prev, ok := typeReceiver[recv]; ok && prev != name {
- f.errorf(n, 1, link(ref), category("naming"), "receiver name %s should be consistent with previous receiver name %s for %s", name, prev, recv)
- return true
- }
- typeReceiver[recv] = name
- return true
- })
-}
-
-// lintIncDec examines statements that increment or decrement a variable.
-// It complains if they don't use x++ or x--.
-func (f *file) lintIncDec() {
- f.walk(func(n ast.Node) bool {
- as, ok := n.(*ast.AssignStmt)
- if !ok {
- return true
- }
- if len(as.Lhs) != 1 {
- return true
- }
- if !isOne(as.Rhs[0]) {
- return true
- }
- var suffix string
- switch as.Tok {
- case token.ADD_ASSIGN:
- suffix = "++"
- case token.SUB_ASSIGN:
- suffix = "--"
- default:
- return true
- }
- f.errorf(as, 0.8, category("unary-op"), "should replace %s with %s%s", f.render(as), f.render(as.Lhs[0]), suffix)
- return true
- })
-}
-
-// lintErrorReturn examines function declarations that return an error.
-// It complains if the error isn't the last parameter.
-func (f *file) lintErrorReturn() {
- f.walk(func(n ast.Node) bool {
- fn, ok := n.(*ast.FuncDecl)
- if !ok || fn.Type.Results == nil {
- return true
- }
- ret := fn.Type.Results.List
- if len(ret) <= 1 {
- return true
- }
- // An error return parameter should be the last parameter.
- // Flag any error parameters found before the last.
- for _, r := range ret[:len(ret)-1] {
- if isIdent(r.Type, "error") {
- f.errorf(fn, 0.9, category("arg-order"), "error should be the last type when returning multiple items")
- break // only flag one
- }
- }
- return true
- })
-}
-
-// lintUnexportedReturn examines exported function declarations.
-// It complains if any return an unexported type.
-func (f *file) lintUnexportedReturn() {
- f.walk(func(n ast.Node) bool {
- fn, ok := n.(*ast.FuncDecl)
- if !ok {
- return true
- }
- if fn.Type.Results == nil {
- return false
- }
- if !fn.Name.IsExported() {
- return false
- }
- thing := "func"
- if fn.Recv != nil && len(fn.Recv.List) > 0 {
- thing = "method"
- if !ast.IsExported(receiverType(fn)) {
- // Don't report exported methods of unexported types,
- // such as private implementations of sort.Interface.
- return false
- }
- }
- for _, ret := range fn.Type.Results.List {
- typ := f.pkg.typeOf(ret.Type)
- if exportedType(typ) {
- continue
- }
- f.errorf(ret.Type, 0.8, category("unexported-type-in-api"),
- "exported %s %s returns unexported type %s, which can be annoying to use",
- thing, fn.Name.Name, typ)
- break // only flag one
- }
- return false
- })
-}
-
-// exportedType reports whether typ is an exported type.
-// It is imprecise, and will err on the side of returning true,
-// such as for composite types.
-func exportedType(typ types.Type) bool {
- switch T := typ.(type) {
- case *types.Named:
- // Builtin types have no package.
- return T.Obj().Pkg() == nil || T.Obj().Exported()
- case *types.Map:
- return exportedType(T.Key()) && exportedType(T.Elem())
- case interface {
- Elem() types.Type
- }: // array, slice, pointer, chan
- return exportedType(T.Elem())
- }
- // Be conservative about other types, such as struct, interface, etc.
- return true
-}
-
-// timeSuffixes is a list of name suffixes that imply a time unit.
-// This is not an exhaustive list.
-var timeSuffixes = []string{
- "Sec", "Secs", "Seconds",
- "Msec", "Msecs",
- "Milli", "Millis", "Milliseconds",
- "Usec", "Usecs", "Microseconds",
- "MS", "Ms",
-}
-
-func (f *file) lintTimeNames() {
- f.walk(func(node ast.Node) bool {
- v, ok := node.(*ast.ValueSpec)
- if !ok {
- return true
- }
- for _, name := range v.Names {
- origTyp := f.pkg.typeOf(name)
- // Look for time.Duration or *time.Duration;
- // the latter is common when using flag.Duration.
- typ := origTyp
- if pt, ok := typ.(*types.Pointer); ok {
- typ = pt.Elem()
- }
- if !f.pkg.isNamedType(typ, "time", "Duration") {
- continue
- }
- suffix := ""
- for _, suf := range timeSuffixes {
- if strings.HasSuffix(name.Name, suf) {
- suffix = suf
- break
- }
- }
- if suffix == "" {
- continue
- }
- f.errorf(v, 0.9, category("time"), "var %s is of type %v; don't use unit-specific suffix %q", name.Name, origTyp, suffix)
- }
- return true
- })
-}
-
-// lintContextKeyTypes checks for call expressions to context.WithValue with
-// basic types used for the key argument.
-// See: https://golang.org/issue/17293
-func (f *file) lintContextKeyTypes() {
- f.walk(func(node ast.Node) bool {
- switch node := node.(type) {
- case *ast.CallExpr:
- f.checkContextKeyType(node)
- }
-
- return true
- })
-}
-
-// checkContextKeyType reports an error if the call expression calls
-// context.WithValue with a key argument of basic type.
-func (f *file) checkContextKeyType(x *ast.CallExpr) {
- sel, ok := x.Fun.(*ast.SelectorExpr)
- if !ok {
- return
- }
- pkg, ok := sel.X.(*ast.Ident)
- if !ok || pkg.Name != "context" {
- return
- }
- if sel.Sel.Name != "WithValue" {
- return
- }
-
- // key is second argument to context.WithValue
- if len(x.Args) != 3 {
- return
- }
- key := f.pkg.typesInfo.Types[x.Args[1]]
-
- if ktyp, ok := key.Type.(*types.Basic); ok && ktyp.Kind() != types.Invalid {
- f.errorf(x, 1.0, category("context"), fmt.Sprintf("should not use basic type %s as key in context.WithValue", key.Type))
- }
-}
-
-// lintContextArgs examines function declarations that contain an
-// argument with a type of context.Context
-// It complains if that argument isn't the first parameter.
-func (f *file) lintContextArgs() {
- f.walk(func(n ast.Node) bool {
- fn, ok := n.(*ast.FuncDecl)
- if !ok || len(fn.Type.Params.List) <= 1 {
- return true
- }
- // A context.Context should be the first parameter of a function.
- // Flag any that show up after the first.
- for _, arg := range fn.Type.Params.List[1:] {
- if isPkgDot(arg.Type, "context", "Context") {
- f.errorf(fn, 0.9, link("https://golang.org/pkg/context/"), category("arg-order"), "context.Context should be the first parameter of a function")
- break // only flag one
- }
- }
- return true
- })
-}
-
-// receiverType returns the named type of the method receiver, sans "*",
-// or "invalid-type" if fn.Recv is ill formed.
-func receiverType(fn *ast.FuncDecl) string {
- switch e := fn.Recv.List[0].Type.(type) {
- case *ast.Ident:
- return e.Name
- case *ast.StarExpr:
- if id, ok := e.X.(*ast.Ident); ok {
- return id.Name
- }
- }
- // The parser accepts much more than just the legal forms.
- return "invalid-type"
-}
-
-func (f *file) walk(fn func(ast.Node) bool) {
- ast.Walk(walker(fn), f.f)
-}
-
-func (f *file) render(x interface{}) string {
- var buf bytes.Buffer
- if err := printer.Fprint(&buf, f.fset, x); err != nil {
- panic(err)
- }
- return buf.String()
-}
-
-func (f *file) debugRender(x interface{}) string {
- var buf bytes.Buffer
- if err := ast.Fprint(&buf, f.fset, x, nil); err != nil {
- panic(err)
- }
- return buf.String()
-}
-
-// walker adapts a function to satisfy the ast.Visitor interface.
-// The function return whether the walk should proceed into the node's children.
-type walker func(ast.Node) bool
-
-func (w walker) Visit(node ast.Node) ast.Visitor {
- if w(node) {
- return w
- }
- return nil
-}
-
-func isIdent(expr ast.Expr, ident string) bool {
- id, ok := expr.(*ast.Ident)
- return ok && id.Name == ident
-}
-
-// isBlank returns whether id is the blank identifier "_".
-// If id == nil, the answer is false.
-func isBlank(id *ast.Ident) bool { return id != nil && id.Name == "_" }
-
-func isPkgDot(expr ast.Expr, pkg, name string) bool {
- sel, ok := expr.(*ast.SelectorExpr)
- return ok && isIdent(sel.X, pkg) && isIdent(sel.Sel, name)
-}
-
-func isZero(expr ast.Expr) bool {
- lit, ok := expr.(*ast.BasicLit)
- return ok && lit.Kind == token.INT && lit.Value == "0"
-}
-
-func isOne(expr ast.Expr) bool {
- lit, ok := expr.(*ast.BasicLit)
- return ok && lit.Kind == token.INT && lit.Value == "1"
-}
-
-func isCgoExported(f *ast.FuncDecl) bool {
- if f.Recv != nil || f.Doc == nil {
- return false
- }
-
- cgoExport := regexp.MustCompile(fmt.Sprintf("(?m)^//export %s$", regexp.QuoteMeta(f.Name.Name)))
- for _, c := range f.Doc.List {
- if cgoExport.MatchString(c.Text) {
- return true
- }
- }
- return false
-}
-
-var basicTypeKinds = map[types.BasicKind]string{
- types.UntypedBool: "bool",
- types.UntypedInt: "int",
- types.UntypedRune: "rune",
- types.UntypedFloat: "float64",
- types.UntypedComplex: "complex128",
- types.UntypedString: "string",
-}
-
-// isUntypedConst reports whether expr is an untyped constant,
-// and indicates what its default type is.
-// scope may be nil.
-func (f *file) isUntypedConst(expr ast.Expr) (defType string, ok bool) {
- // Re-evaluate expr outside of its context to see if it's untyped.
- // (An expr evaluated within, for example, an assignment context will get the type of the LHS.)
- exprStr := f.render(expr)
- tv, err := types.Eval(f.fset, f.pkg.typesPkg, expr.Pos(), exprStr)
- if err != nil {
- return "", false
- }
- if b, ok := tv.Type.(*types.Basic); ok {
- if dt, ok := basicTypeKinds[b.Kind()]; ok {
- return dt, true
- }
- }
-
- return "", false
-}
-
-// firstLineOf renders the given node and returns its first line.
-// It will also match the indentation of another node.
-func (f *file) firstLineOf(node, match ast.Node) string {
- line := f.render(node)
- if i := strings.Index(line, "\n"); i >= 0 {
- line = line[:i]
- }
- return f.indentOf(match) + line
-}
-
-func (f *file) indentOf(node ast.Node) string {
- line := srcLine(f.src, f.fset.Position(node.Pos()))
- for i, r := range line {
- switch r {
- case ' ', '\t':
- default:
- return line[:i]
- }
- }
- return line // unusual or empty line
-}
-
-func (f *file) srcLineWithMatch(node ast.Node, pattern string) (m []string) {
- line := srcLine(f.src, f.fset.Position(node.Pos()))
- line = strings.TrimSuffix(line, "\n")
- rx := regexp.MustCompile(pattern)
- return rx.FindStringSubmatch(line)
-}
-
-// srcLine returns the complete line at p, including the terminating newline.
-func srcLine(src []byte, p token.Position) string {
- // Run to end of line in both directions if not at line start/end.
- lo, hi := p.Offset, p.Offset+1
- for lo > 0 && src[lo-1] != '\n' {
- lo--
- }
- for hi < len(src) && src[hi-1] != '\n' {
- hi++
- }
- return string(src[lo:hi])
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/gordonklaus/ineffassign/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/gordonklaus/ineffassign/LICENSE
deleted file mode 100644
index 9e3d9bcc0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/gordonklaus/ineffassign/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2016 Gordon Klaus 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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/gordonklaus/ineffassign/ineffassign.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/gordonklaus/ineffassign/ineffassign.go
deleted file mode 100644
index 8a97f885e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/gordonklaus/ineffassign/ineffassign.go
+++ /dev/null
@@ -1,545 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "os"
- "path/filepath"
- "sort"
- "strings"
-)
-
-const invalidArgumentExitCode = 3
-
-var dontRecurseFlag = flag.Bool("n", false, "don't recursively check paths")
-
-func main() {
- flag.Parse()
-
- if len(flag.Args()) == 0 {
- fmt.Println("missing argument: filepath")
- os.Exit(invalidArgumentExitCode)
- }
-
- lintFailed := false
- for _, path := range flag.Args() {
- root, err := filepath.Abs(path)
- if err != nil {
- fmt.Printf("Error finding absolute path: %s", err)
- os.Exit(invalidArgumentExitCode)
- }
- if walkPath(root) {
- lintFailed = true
- }
- }
- if lintFailed {
- os.Exit(1)
- }
-}
-
-func walkPath(root string) bool {
- lintFailed := false
- filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
- if err != nil {
- fmt.Printf("Error during filesystem walk: %v\n", err)
- return nil
- }
- if fi.IsDir() {
- if path != root && (*dontRecurseFlag ||
- filepath.Base(path) == "testdata" ||
- filepath.Base(path) == "vendor") {
- return filepath.SkipDir
- }
- return nil
- }
- if !strings.HasSuffix(path, ".go") {
- return nil
- }
- fset, _, ineff := checkPath(path)
- for _, id := range ineff {
- fmt.Printf("%s: ineffectual assignment to %s\n", fset.Position(id.Pos()), id.Name)
- lintFailed = true
- }
- return nil
- })
- return lintFailed
-}
-
-func checkPath(path string) (*token.FileSet, []*ast.CommentGroup, []*ast.Ident) {
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, path, nil, parser.ParseComments)
- if err != nil {
- return nil, nil, nil
- }
-
- bld := &builder{vars: map[*ast.Object]*variable{}}
- bld.walk(f)
-
- chk := &checker{vars: bld.vars, seen: map[*block]bool{}}
- for _, b := range bld.roots {
- chk.check(b)
- }
- sort.Sort(chk.ineff)
-
- return fset, f.Comments, chk.ineff
-}
-
-type builder struct {
- roots []*block
- block *block
- vars map[*ast.Object]*variable
- results []*ast.FieldList
- breaks branchStack
- continues branchStack
- gotos branchStack
- labelStmt *ast.LabeledStmt
-}
-
-type block struct {
- children []*block
- ops map[*ast.Object][]operation
-}
-
-func (b *block) addChild(c *block) {
- b.children = append(b.children, c)
-}
-
-type operation struct {
- id *ast.Ident
- assign bool
-}
-
-type variable struct {
- fundept int
- escapes bool
-}
-
-func (bld *builder) walk(n ast.Node) {
- if n != nil {
- ast.Walk(bld, n)
- }
-}
-
-func (bld *builder) Visit(n ast.Node) ast.Visitor {
- switch n := n.(type) {
- case *ast.FuncDecl:
- if n.Body != nil {
- bld.fun(n.Type, n.Body)
- }
- case *ast.FuncLit:
- bld.fun(n.Type, n.Body)
- case *ast.IfStmt:
- bld.walk(n.Init)
- bld.walk(n.Cond)
- b0 := bld.block
- bld.newBlock(b0)
- bld.walk(n.Body)
- b1 := bld.block
- if n.Else != nil {
- bld.newBlock(b0)
- bld.walk(n.Else)
- b0 = bld.block
- }
- bld.newBlock(b0, b1)
- case *ast.ForStmt:
- lbl := bld.stmtLabel(n)
- brek := bld.breaks.push(lbl)
- continu := bld.continues.push(lbl)
- bld.walk(n.Init)
- start := bld.newBlock(bld.block)
- bld.walk(n.Cond)
- cond := bld.block
- bld.newBlock(cond)
- bld.walk(n.Body)
- continu.setDestination(bld.newBlock(bld.block))
- bld.walk(n.Post)
- bld.block.addChild(start)
- brek.setDestination(bld.newBlock(cond))
- bld.breaks.pop()
- bld.continues.pop()
- case *ast.RangeStmt:
- lbl := bld.stmtLabel(n)
- brek := bld.breaks.push(lbl)
- continu := bld.continues.push(lbl)
- bld.walk(n.X)
- pre := bld.newBlock(bld.block)
- start := bld.newBlock(pre)
- if n.Key != nil {
- lhs := []ast.Expr{n.Key}
- if n.Value != nil {
- lhs = append(lhs, n.Value)
- }
- bld.walk(&ast.AssignStmt{Lhs: lhs, Tok: n.Tok, TokPos: n.TokPos, Rhs: []ast.Expr{&ast.Ident{NamePos: n.X.End()}}})
- }
- bld.walk(n.Body)
- bld.block.addChild(start)
- continu.setDestination(pre)
- brek.setDestination(bld.newBlock(pre, bld.block))
- bld.breaks.pop()
- bld.continues.pop()
- case *ast.SwitchStmt:
- bld.walk(n.Init)
- bld.walk(n.Tag)
- bld.swtch(n, n.Body.List)
- case *ast.TypeSwitchStmt:
- bld.walk(n.Init)
- bld.walk(n.Assign)
- bld.swtch(n, n.Body.List)
- case *ast.SelectStmt:
- brek := bld.breaks.push(bld.stmtLabel(n))
- for _, c := range n.Body.List {
- c := c.(*ast.CommClause).Comm
- if s, ok := c.(*ast.AssignStmt); ok {
- bld.walk(s.Rhs[0])
- } else {
- bld.walk(c)
- }
- }
- b0 := bld.block
- exits := make([]*block, len(n.Body.List))
- dfault := false
- for i, c := range n.Body.List {
- c := c.(*ast.CommClause)
- bld.newBlock(b0)
- bld.walk(c)
- exits[i] = bld.block
- dfault = dfault || c.Comm == nil
- }
- if !dfault {
- exits = append(exits, b0)
- }
- brek.setDestination(bld.newBlock(exits...))
- bld.breaks.pop()
- case *ast.LabeledStmt:
- bld.gotos.get(n.Label).setDestination(bld.newBlock(bld.block))
- bld.labelStmt = n
- bld.walk(n.Stmt)
- case *ast.BranchStmt:
- switch n.Tok {
- case token.BREAK:
- bld.breaks.get(n.Label).addSource(bld.block)
- bld.newBlock()
- case token.CONTINUE:
- bld.continues.get(n.Label).addSource(bld.block)
- bld.newBlock()
- case token.GOTO:
- bld.gotos.get(n.Label).addSource(bld.block)
- bld.newBlock()
- }
-
- case *ast.AssignStmt:
- for _, x := range n.Rhs {
- bld.walk(x)
- }
- for _, x := range n.Lhs {
- if id, ok := ident(x); ok {
- if n.Tok >= token.ADD_ASSIGN && n.Tok <= token.AND_NOT_ASSIGN {
- bld.use(id)
- }
- bld.assign(id)
- } else {
- bld.walk(x)
- }
- }
- case *ast.GenDecl:
- if n.Tok == token.VAR {
- for _, s := range n.Specs {
- s := s.(*ast.ValueSpec)
- for _, x := range s.Values {
- bld.walk(x)
- }
- for _, id := range s.Names {
- if len(s.Values) > 0 {
- bld.assign(id)
- } else {
- bld.use(id)
- }
- }
- }
- }
- case *ast.IncDecStmt:
- if id, ok := ident(n.X); ok {
- bld.use(id)
- bld.assign(id)
- } else {
- bld.walk(n.X)
- }
- case *ast.Ident:
- bld.use(n)
- case *ast.ReturnStmt:
- for _, x := range n.Results {
- bld.walk(x)
- }
- res := bld.results[len(bld.results)-1]
- if res == nil {
- break
- }
- for _, f := range res.List {
- for _, id := range f.Names {
- if n.Results != nil {
- bld.assign(id)
- }
- bld.use(id)
- }
- }
-
- case *ast.UnaryExpr:
- id, ok := ident(n.X)
- if ix, isIx := n.X.(*ast.IndexExpr); isIx {
- // We don't care about indexing into slices, but without type information we can do no better.
- id, ok = ident(ix.X)
- }
- if ok && n.Op == token.AND {
- if v, ok := bld.vars[id.Obj]; ok {
- v.escapes = true
- }
- }
- return bld
- case *ast.SelectorExpr:
- // A method call (possibly delayed via a method value) might implicitly take
- // the address of its receiver, causing it to escape.
- // We can't do any better here without knowing the variable's type.
- if id, ok := ident(n.X); ok {
- if v, ok := bld.vars[id.Obj]; ok {
- v.escapes = true
- }
- }
- return bld
- case *ast.SliceExpr:
- // We don't care about slicing into slices, but without type information we can do no better.
- if id, ok := ident(n.X); ok {
- if v, ok := bld.vars[id.Obj]; ok {
- v.escapes = true
- }
- }
- return bld
-
- default:
- return bld
- }
- return nil
-}
-
-func (bld *builder) fun(typ *ast.FuncType, body *ast.BlockStmt) {
- for _, v := range bld.vars {
- v.fundept++
- }
- bld.results = append(bld.results, typ.Results)
-
- b := bld.block
- bld.newBlock()
- bld.roots = append(bld.roots, bld.block)
- bld.walk(typ)
- bld.walk(body)
- bld.block = b
-
- bld.results = bld.results[:len(bld.results)-1]
- for _, v := range bld.vars {
- v.fundept--
- }
-}
-
-func (bld *builder) swtch(stmt ast.Stmt, cases []ast.Stmt) {
- brek := bld.breaks.push(bld.stmtLabel(stmt))
- b0 := bld.block
- list := b0
- exits := make([]*block, 0, len(cases)+1)
- var dfault, fallthru *block
- for _, c := range cases {
- c := c.(*ast.CaseClause)
-
- if c.List != nil {
- list = bld.newBlock(list)
- for _, x := range c.List {
- bld.walk(x)
- }
- }
-
- parents := []*block{}
- if c.List != nil {
- parents = append(parents, list)
- }
- if fallthru != nil {
- parents = append(parents, fallthru)
- fallthru = nil
- }
- bld.newBlock(parents...)
- if c.List == nil {
- dfault = bld.block
- }
- for _, s := range c.Body {
- bld.walk(s)
- if s, ok := s.(*ast.BranchStmt); ok && s.Tok == token.FALLTHROUGH {
- fallthru = bld.block
- }
- }
-
- if fallthru == nil {
- exits = append(exits, bld.block)
- }
- }
- if dfault != nil {
- list.addChild(dfault)
- } else {
- exits = append(exits, b0)
- }
- brek.setDestination(bld.newBlock(exits...))
- bld.breaks.pop()
-}
-
-func (bld *builder) newBlock(parents ...*block) *block {
- bld.block = &block{ops: map[*ast.Object][]operation{}}
- for _, b := range parents {
- b.addChild(bld.block)
- }
- return bld.block
-}
-
-func (bld *builder) stmtLabel(s ast.Stmt) *ast.Object {
- if ls := bld.labelStmt; ls != nil && ls.Stmt == s {
- return ls.Label.Obj
- }
- return nil
-}
-
-func (bld *builder) assign(id *ast.Ident) {
- bld.newOp(id, true)
-}
-
-func (bld *builder) use(id *ast.Ident) {
- bld.newOp(id, false)
-}
-
-func (bld *builder) newOp(id *ast.Ident, assign bool) {
- if id.Name == "_" || id.Obj == nil {
- return
- }
-
- v, ok := bld.vars[id.Obj]
- if !ok {
- v = &variable{}
- bld.vars[id.Obj] = v
- }
- v.escapes = v.escapes || v.fundept > 0 || bld.block == nil
-
- if b := bld.block; b != nil {
- b.ops[id.Obj] = append(b.ops[id.Obj], operation{id, assign})
- }
-}
-
-type branchStack []*branch
-
-type branch struct {
- label *ast.Object
- srcs []*block
- dst *block
-}
-
-func (s *branchStack) push(lbl *ast.Object) *branch {
- br := &branch{label: lbl}
- *s = append(*s, br)
- return br
-}
-
-func (s *branchStack) get(lbl *ast.Ident) *branch {
- for i := len(*s) - 1; i >= 0; i-- {
- if br := (*s)[i]; lbl == nil || br.label == lbl.Obj {
- return br
- }
- }
- return s.push(lbl.Obj)
-}
-
-func (br *branch) addSource(src *block) {
- br.srcs = append(br.srcs, src)
- if br.dst != nil {
- src.addChild(br.dst)
- }
-}
-
-func (br *branch) setDestination(dst *block) {
- br.dst = dst
- for _, src := range br.srcs {
- src.addChild(dst)
- }
-}
-
-func (s *branchStack) pop() {
- *s = (*s)[:len(*s)-1]
-}
-
-func ident(x ast.Expr) (*ast.Ident, bool) {
- if p, ok := x.(*ast.ParenExpr); ok {
- return ident(p.X)
- }
- id, ok := x.(*ast.Ident)
- return id, ok
-}
-
-type checker struct {
- vars map[*ast.Object]*variable
- seen map[*block]bool
- ineff idents
-}
-
-func (chk *checker) check(b *block) {
- if chk.seen[b] {
- return
- }
- chk.seen[b] = true
-
- for obj, ops := range b.ops {
- if chk.vars[obj].escapes {
- continue
- }
- ops:
- for i, op := range ops {
- if !op.assign {
- continue
- }
- if i+1 < len(ops) {
- if ops[i+1].assign {
- chk.ineff = append(chk.ineff, op.id)
- }
- continue
- }
- seen := map[*block]bool{}
- for _, b := range b.children {
- if used(obj, b, seen) {
- continue ops
- }
- }
- chk.ineff = append(chk.ineff, op.id)
- }
- }
-
- for _, b := range b.children {
- chk.check(b)
- }
-}
-
-func used(obj *ast.Object, b *block, seen map[*block]bool) bool {
- if seen[b] {
- return false
- }
- seen[b] = true
-
- if ops := b.ops[obj]; len(ops) > 0 {
- return !ops[0].assign
- }
- for _, b := range b.children {
- if used(obj, b, seen) {
- return true
- }
- }
- return false
-}
-
-type idents []*ast.Ident
-
-func (ids idents) Len() int { return len(ids) }
-func (ids idents) Less(i, j int) bool { return ids[i].Pos() < ids[j].Pos() }
-func (ids idents) Swap(i, j int) { ids[i], ids[j] = ids[j], ids[i] }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/LICENSE
deleted file mode 100644
index e92649543..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Jonathan Gautheron
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/cmd/goconst/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/cmd/goconst/main.go
deleted file mode 100644
index a06515d68..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/cmd/goconst/main.go
+++ /dev/null
@@ -1,166 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "flag"
- "fmt"
- "io"
- "log"
- "os"
- "strconv"
- "strings"
-
- "github.com/jgautheron/goconst"
-)
-
-const usageDoc = `goconst: find repeated strings that could be replaced by a constant
-
-Usage:
-
- goconst ARGS [...]
-
-Flags:
-
- -ignore exclude files matching the given regular expression
- -ignore-tests exclude tests from the search (default: true)
- -min-occurrences report from how many occurrences (default: 2)
- -min-length only report strings with the minimum given length (default: 3)
- -match-constant look for existing constants matching the strings
- -numbers search also for duplicated numbers
- -min minimum value, only works with -numbers
- -max maximum value, only works with -numbers
- -output output formatting (text or json)
-
-Examples:
-
- goconst ./...
- goconst -ignore "yacc|\.pb\." $GOPATH/src/github.com/cockroachdb/cockroach/...
- goconst -min-occurrences 3 -output json $GOPATH/src/github.com/cockroachdb/cockroach
- goconst -numbers -min 60 -max 512 .
-`
-
-var (
- flagIgnore = flag.String("ignore", "", "ignore files matching the given regular expression")
- flagIgnoreTests = flag.Bool("ignore-tests", true, "exclude tests from the search")
- flagMinOccurrences = flag.Int("min-occurrences", 2, "report from how many occurrences")
- flagMinLength = flag.Int("min-length", 3, "only report strings with the minimum given length")
- flagMatchConstant = flag.Bool("match-constant", false, "look for existing constants matching the strings")
- flagNumbers = flag.Bool("numbers", false, "search also for duplicated numbers")
- flagMin = flag.Int("min", 0, "minimum value, only works with -numbers")
- flagMax = flag.Int("max", 0, "maximum value, only works with -numbers")
- flagOutput = flag.String("output", "text", "output formatting")
-)
-
-func main() {
- flag.Usage = func() {
- usage(os.Stderr)
- }
- flag.Parse()
- log.SetPrefix("goconst: ")
-
- args := flag.Args()
- if len(args) < 1 {
- usage(os.Stderr)
- os.Exit(1)
- }
- for _, path := range args {
- if err := run(path); err != nil {
- log.Println(err)
- os.Exit(1)
- }
- }
-}
-
-func run(path string) error {
- gco := goconst.New(
- path,
- *flagIgnore,
- *flagIgnoreTests,
- *flagMatchConstant,
- *flagNumbers,
- *flagMinLength,
- )
- strs, consts, err := gco.ParseTree()
- if err != nil {
- return err
- }
-
- return printOutput(strs, consts, *flagOutput, *flagMinOccurrences, *flagMin, *flagMax)
-}
-
-func usage(out io.Writer) {
- fmt.Fprintf(out, usageDoc)
-}
-
-func printOutput(strs goconst.Strings, consts goconst.Constants, output string, minOccurrences, min, max int) error {
- for str, item := range strs {
- // Filter out items whose occurrences don't match the min value
- if len(item) < minOccurrences {
- delete(strs, str)
- }
-
- // If the value is a number
- if i, err := strconv.Atoi(str); err == nil {
- if min != 0 && i < min {
- delete(strs, str)
- }
- if max != 0 && i > max {
- delete(strs, str)
- }
- }
- }
-
- switch output {
- case "json":
- enc := json.NewEncoder(os.Stdout)
- err := enc.Encode(struct {
- Strings goconst.Strings `json:"strings,omitEmpty"`
- Constants goconst.Constants `json:"constants,omitEmpty"`
- }{
- strs, consts,
- })
- if err != nil {
- return err
- }
- case "text":
- for str, item := range strs {
- for _, xpos := range item {
- fmt.Printf(
- `%s:%d:%d:%d other occurrence(s) of "%s" found in: %s`,
- xpos.Filename,
- xpos.Line,
- xpos.Column,
- len(item)-1,
- str,
- occurrences(item, xpos),
- )
- fmt.Print("\n")
- }
-
- if len(consts) == 0 {
- continue
- }
- if cst, ok := consts[str]; ok {
- // const should be in the same package and exported
- fmt.Printf(`A matching constant has been found for "%s": %s`, str, cst.Name)
- fmt.Printf("\n\t%s\n", cst.String())
- }
- }
- default:
- return fmt.Errorf(`Unsupported output format: %s`, output)
- }
- return nil
-}
-
-func occurrences(item []goconst.ExtendedPos, current goconst.ExtendedPos) string {
- occurrences := []string{}
- for _, xpos := range item {
- if xpos == current {
- continue
- }
- occurrences = append(occurrences, fmt.Sprintf(
- "%s:%d:%d", xpos.Filename, xpos.Line, xpos.Column,
- ))
- }
- return strings.Join(occurrences, " ")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/parser.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/parser.go
deleted file mode 100644
index 5f837230b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/parser.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// Package goconst finds repeated strings that could be replaced by a constant.
-//
-// There are obvious benefits to using constants instead of repeating strings,
-// mostly to ease maintenance. Cannot argue against changing a single constant versus many strings.
-// While this could be considered a beginner mistake, across time,
-// multiple packages and large codebases, some repetition could have slipped in.
-package goconst
-
-import (
- "go/ast"
- "go/parser"
- "go/token"
- "log"
- "os"
- "path/filepath"
- "regexp"
- "strings"
-)
-
-const (
- testSuffix = "_test.go"
-)
-
-type Parser struct {
- // Meant to be passed via New()
- path, ignore string
- ignoreTests, matchConstant bool
- minLength int
-
- supportedTokens []token.Token
-
- // Internals
- strs Strings
- consts Constants
-}
-
-// New creates a new instance of the parser.
-// This is your entry point if you'd like to use goconst as an API.
-func New(path, ignore string, ignoreTests, matchConstant, numbers bool, minLength int) *Parser {
- supportedTokens := []token.Token{token.STRING}
- if numbers {
- supportedTokens = append(supportedTokens, token.INT, token.FLOAT)
- }
-
- return &Parser{
- path: path,
- ignore: ignore,
- ignoreTests: ignoreTests,
- matchConstant: matchConstant,
- minLength: minLength,
- supportedTokens: supportedTokens,
-
- // Initialize the maps
- strs: Strings{},
- consts: Constants{},
- }
-}
-
-// ParseTree will search the given path for occurrences that could be moved into constants.
-// If "..." is appended, the search will be recursive.
-func (p *Parser) ParseTree() (Strings, Constants, error) {
- pathLen := len(p.path)
- // Parse recursively the given path if the recursive notation is found
- if pathLen >= 5 && p.path[pathLen-3:] == "..." {
- filepath.Walk(p.path[:pathLen-3], func(path string, f os.FileInfo, err error) error {
- if err != nil {
- log.Println(err)
- // resume walking
- return nil
- }
-
- if f.IsDir() {
- p.parseDir(path)
- }
- return nil
- })
- } else {
- p.parseDir(p.path)
- }
- return p.strs, p.consts, nil
-}
-
-func (p *Parser) parseDir(dir string) error {
- fset := token.NewFileSet()
- pkgs, err := parser.ParseDir(fset, dir, func(info os.FileInfo) bool {
- valid, name := true, info.Name()
-
- if p.ignoreTests {
- if strings.HasSuffix(name, testSuffix) {
- valid = false
- }
- }
-
- if len(p.ignore) != 0 {
- match, err := regexp.MatchString(p.ignore, dir+name)
- if err != nil {
- log.Fatal(err)
- return true
- }
- if match {
- valid = false
- }
- }
-
- return valid
- }, 0)
- if err != nil {
- return err
- }
-
- for _, pkg := range pkgs {
- for fn, f := range pkg.Files {
- ast.Walk(&treeVisitor{
- fileSet: fset,
- packageName: pkg.Name,
- fileName: fn,
- p: p,
- }, f)
- }
- }
-
- return nil
-}
-
-type Strings map[string][]ExtendedPos
-type Constants map[string]ConstType
-
-type ConstType struct {
- token.Position
- Name, packageName string
-}
-
-type ExtendedPos struct {
- token.Position
- packageName string
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/visitor.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/visitor.go
deleted file mode 100644
index a86421f6d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/jgautheron/goconst/visitor.go
+++ /dev/null
@@ -1,143 +0,0 @@
-package goconst
-
-import (
- "go/ast"
- "go/token"
- "strings"
-)
-
-// treeVisitor carries the package name and file name
-// for passing it to the imports map, and the fileSet for
-// retrieving the token.Position.
-type treeVisitor struct {
- p *Parser
- fileSet *token.FileSet
- packageName, fileName string
-}
-
-// Visit browses the AST tree for strings that could be potentially
-// replaced by constants.
-// A map of existing constants is built as well (-match-constant).
-func (v *treeVisitor) Visit(node ast.Node) ast.Visitor {
- if node == nil {
- return v
- }
-
- // A single case with "ast.BasicLit" would be much easier
- // but then we wouldn't be able to tell in which context
- // the string is defined (could be a constant definition).
- switch t := node.(type) {
- // Scan for constants in an attempt to match strings with existing constants
- case *ast.GenDecl:
- if !v.p.matchConstant {
- return v
- }
- if t.Tok != token.CONST {
- return v
- }
-
- for _, spec := range t.Specs {
- val := spec.(*ast.ValueSpec)
- for i, str := range val.Values {
- lit, ok := str.(*ast.BasicLit)
- if !ok || !v.isSupported(lit.Kind) {
- continue
- }
-
- v.addConst(val.Names[i].Name, lit.Value, val.Names[i].Pos())
- }
- }
-
- // foo := "moo"
- case *ast.AssignStmt:
- for _, rhs := range t.Rhs {
- lit, ok := rhs.(*ast.BasicLit)
- if !ok || !v.isSupported(lit.Kind) {
- continue
- }
-
- v.addString(lit.Value, rhs.(*ast.BasicLit).Pos())
- }
-
- // if foo == "moo"
- case *ast.BinaryExpr:
- if t.Op != token.EQL && t.Op != token.NEQ {
- return v
- }
-
- var lit *ast.BasicLit
- var ok bool
-
- lit, ok = t.X.(*ast.BasicLit)
- if ok && v.isSupported(lit.Kind) {
- v.addString(lit.Value, lit.Pos())
- }
-
- lit, ok = t.Y.(*ast.BasicLit)
- if ok && v.isSupported(lit.Kind) {
- v.addString(lit.Value, lit.Pos())
- }
-
- // case "foo":
- case *ast.CaseClause:
- for _, item := range t.List {
- lit, ok := item.(*ast.BasicLit)
- if ok && v.isSupported(lit.Kind) {
- v.addString(lit.Value, lit.Pos())
- }
- }
-
- // return "boo"
- case *ast.ReturnStmt:
- for _, item := range t.Results {
- lit, ok := item.(*ast.BasicLit)
- if ok && v.isSupported(lit.Kind) {
- v.addString(lit.Value, lit.Pos())
- }
- }
- }
-
- return v
-}
-
-// addString adds a string in the map along with its position in the tree.
-func (v *treeVisitor) addString(str string, pos token.Pos) {
- str = strings.Replace(str, `"`, "", 2)
-
- // Ignore empty strings
- if len(str) == 0 {
- return
- }
-
- if len(str) < v.p.minLength {
- return
- }
-
- _, ok := v.p.strs[str]
- if !ok {
- v.p.strs[str] = make([]ExtendedPos, 0)
- }
- v.p.strs[str] = append(v.p.strs[str], ExtendedPos{
- packageName: v.packageName,
- Position: v.fileSet.Position(pos),
- })
-}
-
-// addConst adds a const in the map along with its position in the tree.
-func (v *treeVisitor) addConst(name string, val string, pos token.Pos) {
- val = strings.Replace(val, `"`, "", 2)
- v.p.consts[val] = ConstType{
- Name: name,
- packageName: v.packageName,
- Position: v.fileSet.Position(pos),
- }
-}
-
-func (v *treeVisitor) isSupported(tk token.Token) bool {
- for _, s := range v.p.supportedTokens {
- if tk == s {
- return true
- }
- }
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/LICENSE
deleted file mode 100644
index a2b16b5bd..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2013 Kamil Kisiel
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/internal/errcheck/errcheck.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/internal/errcheck/errcheck.go
deleted file mode 100644
index ca69cff03..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/internal/errcheck/errcheck.go
+++ /dev/null
@@ -1,481 +0,0 @@
-// Package errcheck is the library used to implement the errcheck command-line tool.
-//
-// Note: The API of this package has not been finalized and may change at any point.
-package errcheck
-
-import (
- "bufio"
- "errors"
- "fmt"
- "go/ast"
- "go/build"
- "go/token"
- "go/types"
- "os"
- "regexp"
- "sort"
- "strings"
- "sync"
-
- "golang.org/x/tools/go/loader"
-)
-
-var errorType *types.Interface
-
-func init() {
- errorType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface)
-
-}
-
-var (
- // ErrNoGoFiles is returned when CheckPackage is run on a package with no Go source files
- ErrNoGoFiles = errors.New("package contains no go source files")
-)
-
-// UncheckedError indicates the position of an unchecked error return.
-type UncheckedError struct {
- Pos token.Position
- Line string
- FuncName string
-}
-
-// UncheckedErrors is returned from the CheckPackage function if the package contains
-// any unchecked errors.
-// Errors should be appended using the Append method, which is safe to use concurrently.
-type UncheckedErrors struct {
- mu sync.Mutex
-
- // Errors is a list of all the unchecked errors in the package.
- // Printing an error reports its position within the file and the contents of the line.
- Errors []UncheckedError
-}
-
-func (e *UncheckedErrors) Append(errors ...UncheckedError) {
- e.mu.Lock()
- defer e.mu.Unlock()
- e.Errors = append(e.Errors, errors...)
-}
-
-func (e *UncheckedErrors) Error() string {
- return fmt.Sprintf("%d unchecked errors", len(e.Errors))
-}
-
-// Len is the number of elements in the collection.
-func (e *UncheckedErrors) Len() int { return len(e.Errors) }
-
-// Swap swaps the elements with indexes i and j.
-func (e *UncheckedErrors) Swap(i, j int) { e.Errors[i], e.Errors[j] = e.Errors[j], e.Errors[i] }
-
-type byName struct{ *UncheckedErrors }
-
-// Less reports whether the element with index i should sort before the element with index j.
-func (e byName) Less(i, j int) bool {
- ei, ej := e.Errors[i], e.Errors[j]
-
- pi, pj := ei.Pos, ej.Pos
-
- if pi.Filename != pj.Filename {
- return pi.Filename < pj.Filename
- }
- if pi.Line != pj.Line {
- return pi.Line < pj.Line
- }
- if pi.Column != pj.Column {
- return pi.Column < pj.Column
- }
-
- return ei.Line < ej.Line
-}
-
-type Checker struct {
- // ignore is a map of package names to regular expressions. Identifiers from a package are
- // checked against its regular expressions and if any of the expressions match the call
- // is not checked.
- Ignore map[string]*regexp.Regexp
-
- // If blank is true then assignments to the blank identifier are also considered to be
- // ignored errors.
- Blank bool
-
- // If asserts is true then ignored type assertion results are also checked
- Asserts bool
-
- // build tags
- Tags []string
-
- Verbose bool
-
- // If true, checking of of _test.go files is disabled
- WithoutTests bool
-
- exclude map[string]bool
-}
-
-func NewChecker() *Checker {
- c := Checker{}
- c.SetExclude(map[string]bool{})
- return &c
-}
-
-func (c *Checker) SetExclude(l map[string]bool) {
- // Default exclude for stdlib functions
- c.exclude = map[string]bool{
- "math/rand.Read": true,
- "(*math/rand.Rand).Read": true,
-
- "(*bytes.Buffer).Write": true,
- "(*bytes.Buffer).WriteByte": true,
- "(*bytes.Buffer).WriteRune": true,
- "(*bytes.Buffer).WriteString": true,
- }
- for k := range l {
- c.exclude[k] = true
- }
-}
-
-func (c *Checker) logf(msg string, args ...interface{}) {
- if c.Verbose {
- fmt.Fprintf(os.Stderr, msg+"\n", args...)
- }
-}
-
-func (c *Checker) load(paths ...string) (*loader.Program, error) {
- ctx := build.Default
- for _, tag := range c.Tags {
- ctx.BuildTags = append(ctx.BuildTags, tag)
- }
- loadcfg := loader.Config{
- Build: &ctx,
- }
- rest, err := loadcfg.FromArgs(paths, !c.WithoutTests)
- if err != nil {
- return nil, fmt.Errorf("could not parse arguments: %s", err)
- }
- if len(rest) > 0 {
- return nil, fmt.Errorf("unhandled extra arguments: %v", rest)
- }
-
- return loadcfg.Load()
-}
-
-// CheckPackages checks packages for errors.
-func (c *Checker) CheckPackages(paths ...string) error {
- program, err := c.load(paths...)
- if err != nil {
- return fmt.Errorf("could not type check: %s", err)
- }
-
- var wg sync.WaitGroup
- u := &UncheckedErrors{}
- for _, pkgInfo := range program.InitialPackages() {
- if pkgInfo.Pkg.Path() == "unsafe" { // not a real package
- continue
- }
-
- wg.Add(1)
-
- go func(pkgInfo *loader.PackageInfo) {
- defer wg.Done()
- c.logf("Checking %s", pkgInfo.Pkg.Path())
-
- v := &visitor{
- prog: program,
- pkg: pkgInfo,
- ignore: c.Ignore,
- blank: c.Blank,
- asserts: c.Asserts,
- lines: make(map[string][]string),
- exclude: c.exclude,
- errors: []UncheckedError{},
- }
-
- for _, astFile := range v.pkg.Files {
- ast.Walk(v, astFile)
- }
- u.Append(v.errors...)
- }(pkgInfo)
- }
-
- wg.Wait()
- if u.Len() > 0 {
- sort.Sort(byName{u})
- return u
- }
- return nil
-}
-
-// visitor implements the errcheck algorithm
-type visitor struct {
- prog *loader.Program
- pkg *loader.PackageInfo
- ignore map[string]*regexp.Regexp
- blank bool
- asserts bool
- lines map[string][]string
- exclude map[string]bool
-
- errors []UncheckedError
-}
-
-func (v *visitor) fullName(call *ast.CallExpr) (string, bool) {
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return "", false
- }
- fn, ok := v.pkg.ObjectOf(sel.Sel).(*types.Func)
- if !ok {
- // Shouldn't happen, but be paranoid
- return "", false
- }
- // The name is fully qualified by the import path, possible type,
- // function/method name and pointer receiver.
- //
- // TODO(dh): vendored packages will have /vendor/ in their name,
- // thus not matching vendored standard library packages. If we
- // want to support vendored stdlib packages, we need to implement
- // FullName with our own logic.
- return fn.FullName(), true
-}
-
-func (v *visitor) excludeCall(call *ast.CallExpr) bool {
- if name, ok := v.fullName(call); ok {
- return v.exclude[name]
- }
-
- return false
-}
-
-func (v *visitor) ignoreCall(call *ast.CallExpr) bool {
- if v.excludeCall(call) {
- return true
- }
-
- // Try to get an identifier.
- // Currently only supports simple expressions:
- // 1. f()
- // 2. x.y.f()
- var id *ast.Ident
- switch exp := call.Fun.(type) {
- case (*ast.Ident):
- id = exp
- case (*ast.SelectorExpr):
- id = exp.Sel
- default:
- // eg: *ast.SliceExpr, *ast.IndexExpr
- }
-
- if id == nil {
- return false
- }
-
- // If we got an identifier for the function, see if it is ignored
- if re, ok := v.ignore[""]; ok && re.MatchString(id.Name) {
- return true
- }
-
- if obj := v.pkg.Uses[id]; obj != nil {
- if pkg := obj.Pkg(); pkg != nil {
- if re, ok := v.ignore[pkg.Path()]; ok {
- return re.MatchString(id.Name)
- }
-
- // if current package being considered is vendored, check to see if it should be ignored based
- // on the unvendored path.
- if nonVendoredPkg, ok := nonVendoredPkgPath(pkg.Path()); ok {
- if re, ok := v.ignore[nonVendoredPkg]; ok {
- return re.MatchString(id.Name)
- }
- }
- }
- }
-
- return false
-}
-
-// nonVendoredPkgPath returns the unvendored version of the provided package path (or returns the provided path if it
-// does not represent a vendored path). The second return value is true if the provided package was vendored, false
-// otherwise.
-func nonVendoredPkgPath(pkgPath string) (string, bool) {
- lastVendorIndex := strings.LastIndex(pkgPath, "/vendor/")
- if lastVendorIndex == -1 {
- return pkgPath, false
- }
- return pkgPath[lastVendorIndex+len("/vendor/"):], true
-}
-
-// errorsByArg returns a slice s such that
-// len(s) == number of return types of call
-// s[i] == true iff return type at position i from left is an error type
-func (v *visitor) errorsByArg(call *ast.CallExpr) []bool {
- switch t := v.pkg.Types[call].Type.(type) {
- case *types.Named:
- // Single return
- return []bool{isErrorType(t)}
- case *types.Pointer:
- // Single return via pointer
- return []bool{isErrorType(t)}
- case *types.Tuple:
- // Multiple returns
- s := make([]bool, t.Len())
- for i := 0; i < t.Len(); i++ {
- switch et := t.At(i).Type().(type) {
- case *types.Named:
- // Single return
- s[i] = isErrorType(et)
- case *types.Pointer:
- // Single return via pointer
- s[i] = isErrorType(et)
- default:
- s[i] = false
- }
- }
- return s
- }
- return []bool{false}
-}
-
-func (v *visitor) callReturnsError(call *ast.CallExpr) bool {
- if v.isRecover(call) {
- return true
- }
- for _, isError := range v.errorsByArg(call) {
- if isError {
- return true
- }
- }
- return false
-}
-
-// isRecover returns true if the given CallExpr is a call to the built-in recover() function.
-func (v *visitor) isRecover(call *ast.CallExpr) bool {
- if fun, ok := call.Fun.(*ast.Ident); ok {
- if _, ok := v.pkg.Uses[fun].(*types.Builtin); ok {
- return fun.Name == "recover"
- }
- }
- return false
-}
-
-func (v *visitor) addErrorAtPosition(position token.Pos, call *ast.CallExpr) {
- pos := v.prog.Fset.Position(position)
- lines, ok := v.lines[pos.Filename]
- if !ok {
- lines = readfile(pos.Filename)
- v.lines[pos.Filename] = lines
- }
-
- line := "??"
- if pos.Line-1 < len(lines) {
- line = strings.TrimSpace(lines[pos.Line-1])
- }
-
- var name string
- if call != nil {
- name, _ = v.fullName(call)
- }
-
- v.errors = append(v.errors, UncheckedError{pos, line, name})
-}
-
-func readfile(filename string) []string {
- var f, err = os.Open(filename)
- if err != nil {
- return nil
- }
-
- var lines []string
- var scanner = bufio.NewScanner(f)
- for scanner.Scan() {
- lines = append(lines, scanner.Text())
- }
- return lines
-}
-
-func (v *visitor) Visit(node ast.Node) ast.Visitor {
- switch stmt := node.(type) {
- case *ast.ExprStmt:
- if call, ok := stmt.X.(*ast.CallExpr); ok {
- if !v.ignoreCall(call) && v.callReturnsError(call) {
- v.addErrorAtPosition(call.Lparen, call)
- }
- }
- case *ast.GoStmt:
- if !v.ignoreCall(stmt.Call) && v.callReturnsError(stmt.Call) {
- v.addErrorAtPosition(stmt.Call.Lparen, stmt.Call)
- }
- case *ast.DeferStmt:
- if !v.ignoreCall(stmt.Call) && v.callReturnsError(stmt.Call) {
- v.addErrorAtPosition(stmt.Call.Lparen, stmt.Call)
- }
- case *ast.AssignStmt:
- if len(stmt.Rhs) == 1 {
- // single value on rhs; check against lhs identifiers
- if call, ok := stmt.Rhs[0].(*ast.CallExpr); ok {
- if !v.blank {
- break
- }
- if v.ignoreCall(call) {
- break
- }
- isError := v.errorsByArg(call)
- for i := 0; i < len(stmt.Lhs); i++ {
- if id, ok := stmt.Lhs[i].(*ast.Ident); ok {
- // We shortcut calls to recover() because errorsByArg can't
- // check its return types for errors since it returns interface{}.
- if id.Name == "_" && (v.isRecover(call) || isError[i]) {
- v.addErrorAtPosition(id.NamePos, call)
- }
- }
- }
- } else if assert, ok := stmt.Rhs[0].(*ast.TypeAssertExpr); ok {
- if !v.asserts {
- break
- }
- if assert.Type == nil {
- // type switch
- break
- }
- if len(stmt.Lhs) < 2 {
- // assertion result not read
- v.addErrorAtPosition(stmt.Rhs[0].Pos(), nil)
- } else if id, ok := stmt.Lhs[1].(*ast.Ident); ok && v.blank && id.Name == "_" {
- // assertion result ignored
- v.addErrorAtPosition(id.NamePos, nil)
- }
- }
- } else {
- // multiple value on rhs; in this case a call can't return
- // multiple values. Assume len(stmt.Lhs) == len(stmt.Rhs)
- for i := 0; i < len(stmt.Lhs); i++ {
- if id, ok := stmt.Lhs[i].(*ast.Ident); ok {
- if call, ok := stmt.Rhs[i].(*ast.CallExpr); ok {
- if !v.blank {
- continue
- }
- if v.ignoreCall(call) {
- continue
- }
- if id.Name == "_" && v.callReturnsError(call) {
- v.addErrorAtPosition(id.NamePos, call)
- }
- } else if assert, ok := stmt.Rhs[i].(*ast.TypeAssertExpr); ok {
- if !v.asserts {
- continue
- }
- if assert.Type == nil {
- // Shouldn't happen anyway, no multi assignment in type switches
- continue
- }
- v.addErrorAtPosition(id.NamePos, nil)
- }
- }
- }
- }
- default:
- }
- return v
-}
-
-func isErrorType(t types.Type) bool {
- return types.Implements(t, errorType)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/main.go
deleted file mode 100644
index 097bd49c8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/errcheck/main.go
+++ /dev/null
@@ -1,193 +0,0 @@
-package main
-
-import (
- "bufio"
- "flag"
- "fmt"
- "os"
- "path/filepath"
- "regexp"
- "runtime"
- "strings"
-
- "github.com/kisielk/errcheck/internal/errcheck"
- "github.com/kisielk/gotool"
-)
-
-const (
- exitCodeOk int = iota
- exitUncheckedError
- exitFatalError
-)
-
-var abspath bool
-
-type ignoreFlag map[string]*regexp.Regexp
-
-func (f ignoreFlag) String() string {
- pairs := make([]string, 0, len(f))
- for pkg, re := range f {
- prefix := ""
- if pkg != "" {
- prefix = pkg + ":"
- }
- pairs = append(pairs, prefix+re.String())
- }
- return fmt.Sprintf("%q", strings.Join(pairs, ","))
-}
-
-func (f ignoreFlag) Set(s string) error {
- if s == "" {
- return nil
- }
- for _, pair := range strings.Split(s, ",") {
- colonIndex := strings.Index(pair, ":")
- var pkg, re string
- if colonIndex == -1 {
- pkg = ""
- re = pair
- } else {
- pkg = pair[:colonIndex]
- re = pair[colonIndex+1:]
- }
- regex, err := regexp.Compile(re)
- if err != nil {
- return err
- }
- f[pkg] = regex
- }
- return nil
-}
-
-type tagsFlag []string
-
-func (f *tagsFlag) String() string {
- return fmt.Sprintf("%q", strings.Join(*f, " "))
-}
-
-func (f *tagsFlag) Set(s string) error {
- if s == "" {
- return nil
- }
- tags := strings.Split(s, " ")
- if tags == nil {
- return nil
- }
- for _, tag := range tags {
- if tag != "" {
- *f = append(*f, tag)
- }
- }
- return nil
-}
-
-var dotStar = regexp.MustCompile(".*")
-
-func reportUncheckedErrors(e *errcheck.UncheckedErrors, verbose bool) {
- wd, err := os.Getwd()
- if err != nil {
- wd = ""
- }
- for _, uncheckedError := range e.Errors {
- pos := uncheckedError.Pos.String()
- if !abspath {
- newPos, err := filepath.Rel(wd, pos)
- if err == nil {
- pos = newPos
- }
- }
-
- if verbose && uncheckedError.FuncName != "" {
- fmt.Printf("%s:\t%s\t%s\n", pos, uncheckedError.FuncName, uncheckedError.Line)
- } else {
- fmt.Printf("%s:\t%s\n", pos, uncheckedError.Line)
- }
- }
-}
-
-func mainCmd(args []string) int {
- runtime.GOMAXPROCS(runtime.NumCPU())
-
- checker := errcheck.NewChecker()
- paths, err := parseFlags(checker, args)
- if err != exitCodeOk {
- return err
- }
-
- if err := checker.CheckPackages(paths...); err != nil {
- if e, ok := err.(*errcheck.UncheckedErrors); ok {
- reportUncheckedErrors(e, checker.Verbose)
- return exitUncheckedError
- } else if err == errcheck.ErrNoGoFiles {
- fmt.Fprintln(os.Stderr, err)
- return exitCodeOk
- }
- fmt.Fprintf(os.Stderr, "error: failed to check packages: %s\n", err)
- return exitFatalError
- }
- return exitCodeOk
-}
-
-func parseFlags(checker *errcheck.Checker, args []string) ([]string, int) {
- flags := flag.NewFlagSet(args[0], flag.ContinueOnError)
- flags.BoolVar(&checker.Blank, "blank", false, "if true, check for errors assigned to blank identifier")
- flags.BoolVar(&checker.Asserts, "asserts", false, "if true, check for ignored type assertion results")
- flags.BoolVar(&checker.WithoutTests, "ignoretests", false, "if true, checking of _test.go files is disabled")
- flags.BoolVar(&checker.Verbose, "verbose", false, "produce more verbose logging")
-
- flags.BoolVar(&abspath, "abspath", false, "print absolute paths to files")
-
- tags := tagsFlag{}
- flags.Var(&tags, "tags", "space-separated list of build tags to include")
- ignorePkg := flags.String("ignorepkg", "", "comma-separated list of package paths to ignore")
- ignore := ignoreFlag(map[string]*regexp.Regexp{
- "fmt": dotStar,
- })
- flags.Var(ignore, "ignore", "[deprecated] comma-separated list of pairs of the form pkg:regex\n"+
- " the regex is used to ignore names within pkg.")
-
- var excludeFile string
- flags.StringVar(&excludeFile, "exclude", "", "Path to a file containing a list of functions to exclude from checking")
-
- if err := flags.Parse(args[1:]); err != nil {
- return nil, exitFatalError
- }
-
- if excludeFile != "" {
- exclude := make(map[string]bool)
- fh, err := os.Open(excludeFile)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Could not read exclude file: %s\n", err)
- return nil, exitFatalError
- }
- scanner := bufio.NewScanner(fh)
- for scanner.Scan() {
- name := scanner.Text()
- exclude[name] = true
-
- if checker.Verbose {
- fmt.Printf("Excluding %s\n", name)
- }
- }
- if err := scanner.Err(); err != nil {
- fmt.Fprintf(os.Stderr, "Could not read exclude file: %s\n", err)
- return nil, exitFatalError
- }
- checker.SetExclude(exclude)
- }
-
- checker.Tags = tags
- for _, pkg := range strings.Split(*ignorePkg, ",") {
- if pkg != "" {
- ignore[pkg] = dotStar
- }
- }
- checker.Ignore = ignore
-
- // ImportPaths normalizes paths and expands '...'
- return gotool.ImportPaths(flags.Args()), exitCodeOk
-}
-
-func main() {
- os.Exit(mainCmd(os.Args))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/LICENSE
deleted file mode 100644
index 1cbf651e2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2013 Kamil Kisiel
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go13.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go13.go
deleted file mode 100644
index 2dd9b3fdf..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go13.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// +build !go1.4
-
-package gotool
-
-import (
- "go/build"
- "path/filepath"
- "runtime"
-)
-
-var gorootSrc = filepath.Join(runtime.GOROOT(), "src", "pkg")
-
-func shouldIgnoreImport(p *build.Package) bool {
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go14-15.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go14-15.go
deleted file mode 100644
index aa99a3227..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go14-15.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// +build go1.4,!go1.6
-
-package gotool
-
-import (
- "go/build"
- "path/filepath"
- "runtime"
-)
-
-var gorootSrc = filepath.Join(runtime.GOROOT(), "src")
-
-func shouldIgnoreImport(p *build.Package) bool {
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go16-18.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go16-18.go
deleted file mode 100644
index f25cec14a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/go16-18.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// +build go1.6,!go1.9
-
-package gotool
-
-import (
- "go/build"
- "path/filepath"
- "runtime"
-)
-
-var gorootSrc = filepath.Join(runtime.GOROOT(), "src")
-
-func shouldIgnoreImport(p *build.Package) bool {
- return p == nil || len(p.InvalidGoFiles) == 0
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/path.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/path.go
deleted file mode 100644
index 74e15b9d3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/path.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package load
-
-import (
- "strings"
-)
-
-// hasPathPrefix reports whether the path s begins with the
-// elements in prefix.
-func hasPathPrefix(s, prefix string) bool {
- switch {
- default:
- return false
- case len(s) == len(prefix):
- return s == prefix
- case len(s) > len(prefix):
- if prefix != "" && prefix[len(prefix)-1] == '/' {
- return strings.HasPrefix(s, prefix)
- }
- return s[len(prefix)] == '/' && s[:len(prefix)] == prefix
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/pkg.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/pkg.go
deleted file mode 100644
index b937ede75..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/pkg.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-// Package load loads packages.
-package load
-
-import (
- "strings"
-)
-
-// isStandardImportPath reports whether $GOROOT/src/path should be considered
-// part of the standard distribution. For historical reasons we allow people to add
-// their own code to $GOROOT instead of using $GOPATH, but we assume that
-// code will start with a domain name (dot in the first element).
-func isStandardImportPath(path string) bool {
- i := strings.Index(path, "/")
- if i < 0 {
- i = len(path)
- }
- elem := path[:i]
- return !strings.Contains(elem, ".")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/search.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/search.go
deleted file mode 100644
index 17ed62dda..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/internal/load/search.go
+++ /dev/null
@@ -1,354 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package load
-
-import (
- "fmt"
- "go/build"
- "log"
- "os"
- "path"
- "path/filepath"
- "regexp"
- "strings"
-)
-
-// Context specifies values for operation of ImportPaths that would
-// otherwise come from cmd/go/internal/cfg package.
-//
-// This is a construct added for gotool purposes and doesn't have
-// an equivalent upstream in cmd/go.
-type Context struct {
- // BuildContext is the build context to use.
- BuildContext build.Context
-
- // GOROOTsrc is the location of the src directory in GOROOT.
- // At this time, it's used only in MatchPackages to skip
- // GOOROOT/src entry from BuildContext.SrcDirs output.
- GOROOTsrc string
-}
-
-// allPackages returns all the packages that can be found
-// under the $GOPATH directories and $GOROOT matching pattern.
-// The pattern is either "all" (all packages), "std" (standard packages),
-// "cmd" (standard commands), or a path including "...".
-func (c *Context) allPackages(pattern string) []string {
- pkgs := c.MatchPackages(pattern)
- if len(pkgs) == 0 {
- fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
- }
- return pkgs
-}
-
-// allPackagesInFS is like allPackages but is passed a pattern
-// beginning ./ or ../, meaning it should scan the tree rooted
-// at the given directory. There are ... in the pattern too.
-func (c *Context) allPackagesInFS(pattern string) []string {
- pkgs := c.MatchPackagesInFS(pattern)
- if len(pkgs) == 0 {
- fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
- }
- return pkgs
-}
-
-// MatchPackages returns a list of package paths matching pattern
-// (see go help packages for pattern syntax).
-func (c *Context) MatchPackages(pattern string) []string {
- match := func(string) bool { return true }
- treeCanMatch := func(string) bool { return true }
- if !IsMetaPackage(pattern) {
- match = matchPattern(pattern)
- treeCanMatch = treeCanMatchPattern(pattern)
- }
-
- have := map[string]bool{
- "builtin": true, // ignore pseudo-package that exists only for documentation
- }
- if !c.BuildContext.CgoEnabled {
- have["runtime/cgo"] = true // ignore during walk
- }
- var pkgs []string
-
- for _, src := range c.BuildContext.SrcDirs() {
- if (pattern == "std" || pattern == "cmd") && src != c.GOROOTsrc {
- continue
- }
- src = filepath.Clean(src) + string(filepath.Separator)
- root := src
- if pattern == "cmd" {
- root += "cmd" + string(filepath.Separator)
- }
- filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
- if err != nil || path == src {
- return nil
- }
-
- want := true
- // Avoid .foo, _foo, and testdata directory trees.
- _, elem := filepath.Split(path)
- if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" {
- want = false
- }
-
- name := filepath.ToSlash(path[len(src):])
- if pattern == "std" && (!isStandardImportPath(name) || name == "cmd") {
- // The name "std" is only the standard library.
- // If the name is cmd, it's the root of the command tree.
- want = false
- }
- if !treeCanMatch(name) {
- want = false
- }
-
- if !fi.IsDir() {
- if fi.Mode()&os.ModeSymlink != 0 && want {
- if target, err := os.Stat(path); err == nil && target.IsDir() {
- fmt.Fprintf(os.Stderr, "warning: ignoring symlink %s\n", path)
- }
- }
- return nil
- }
- if !want {
- return filepath.SkipDir
- }
-
- if have[name] {
- return nil
- }
- have[name] = true
- if !match(name) {
- return nil
- }
- pkg, err := c.BuildContext.ImportDir(path, 0)
- if err != nil {
- if _, noGo := err.(*build.NoGoError); noGo {
- return nil
- }
- }
-
- // If we are expanding "cmd", skip main
- // packages under cmd/vendor. At least as of
- // March, 2017, there is one there for the
- // vendored pprof tool.
- if pattern == "cmd" && strings.HasPrefix(pkg.ImportPath, "cmd/vendor") && pkg.Name == "main" {
- return nil
- }
-
- pkgs = append(pkgs, name)
- return nil
- })
- }
- return pkgs
-}
-
-// MatchPackagesInFS returns a list of package paths matching pattern,
-// which must begin with ./ or ../
-// (see go help packages for pattern syntax).
-func (c *Context) MatchPackagesInFS(pattern string) []string {
- // Find directory to begin the scan.
- // Could be smarter but this one optimization
- // is enough for now, since ... is usually at the
- // end of a path.
- i := strings.Index(pattern, "...")
- dir, _ := path.Split(pattern[:i])
-
- // pattern begins with ./ or ../.
- // path.Clean will discard the ./ but not the ../.
- // We need to preserve the ./ for pattern matching
- // and in the returned import paths.
- prefix := ""
- if strings.HasPrefix(pattern, "./") {
- prefix = "./"
- }
- match := matchPattern(pattern)
-
- var pkgs []string
- filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() {
- return nil
- }
- if path == dir {
- // filepath.Walk starts at dir and recurses. For the recursive case,
- // the path is the result of filepath.Join, which calls filepath.Clean.
- // The initial case is not Cleaned, though, so we do this explicitly.
- //
- // This converts a path like "./io/" to "io". Without this step, running
- // "cd $GOROOT/src; go list ./io/..." would incorrectly skip the io
- // package, because prepending the prefix "./" to the unclean path would
- // result in "././io", and match("././io") returns false.
- path = filepath.Clean(path)
- }
-
- // Avoid .foo, _foo, and testdata directory trees, but do not avoid "." or "..".
- _, elem := filepath.Split(path)
- dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
- if dot || strings.HasPrefix(elem, "_") || elem == "testdata" {
- return filepath.SkipDir
- }
-
- name := prefix + filepath.ToSlash(path)
- if !match(name) {
- return nil
- }
-
- // We keep the directory if we can import it, or if we can't import it
- // due to invalid Go source files. This means that directories containing
- // parse errors will be built (and fail) instead of being silently skipped
- // as not matching the pattern. Go 1.5 and earlier skipped, but that
- // behavior means people miss serious mistakes.
- // See golang.org/issue/11407.
- if p, err := c.BuildContext.ImportDir(path, 0); err != nil && (p == nil || len(p.InvalidGoFiles) == 0) {
- if _, noGo := err.(*build.NoGoError); !noGo {
- log.Print(err)
- }
- return nil
- }
- pkgs = append(pkgs, name)
- return nil
- })
- return pkgs
-}
-
-// treeCanMatchPattern(pattern)(name) reports whether
-// name or children of name can possibly match pattern.
-// Pattern is the same limited glob accepted by matchPattern.
-func treeCanMatchPattern(pattern string) func(name string) bool {
- wildCard := false
- if i := strings.Index(pattern, "..."); i >= 0 {
- wildCard = true
- pattern = pattern[:i]
- }
- return func(name string) bool {
- return len(name) <= len(pattern) && hasPathPrefix(pattern, name) ||
- wildCard && strings.HasPrefix(name, pattern)
- }
-}
-
-// matchPattern(pattern)(name) reports whether
-// name matches pattern. Pattern is a limited glob
-// pattern in which '...' means 'any string' and there
-// is no other special syntax.
-// Unfortunately, there are two special cases. Quoting "go help packages":
-//
-// First, /... at the end of the pattern can match an empty string,
-// so that net/... matches both net and packages in its subdirectories, like net/http.
-// Second, any slash-separted pattern element containing a wildcard never
-// participates in a match of the "vendor" element in the path of a vendored
-// package, so that ./... does not match packages in subdirectories of
-// ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do.
-// Note, however, that a directory named vendor that itself contains code
-// is not a vendored package: cmd/vendor would be a command named vendor,
-// and the pattern cmd/... matches it.
-func matchPattern(pattern string) func(name string) bool {
- // Convert pattern to regular expression.
- // The strategy for the trailing /... is to nest it in an explicit ? expression.
- // The strategy for the vendor exclusion is to change the unmatchable
- // vendor strings to a disallowed code point (vendorChar) and to use
- // "(anything but that codepoint)*" as the implementation of the ... wildcard.
- // This is a bit complicated but the obvious alternative,
- // namely a hand-written search like in most shell glob matchers,
- // is too easy to make accidentally exponential.
- // Using package regexp guarantees linear-time matching.
-
- const vendorChar = "\x00"
-
- if strings.Contains(pattern, vendorChar) {
- return func(name string) bool { return false }
- }
-
- re := regexp.QuoteMeta(pattern)
- re = replaceVendor(re, vendorChar)
- switch {
- case strings.HasSuffix(re, `/`+vendorChar+`/\.\.\.`):
- re = strings.TrimSuffix(re, `/`+vendorChar+`/\.\.\.`) + `(/vendor|/` + vendorChar + `/\.\.\.)`
- case re == vendorChar+`/\.\.\.`:
- re = `(/vendor|/` + vendorChar + `/\.\.\.)`
- case strings.HasSuffix(re, `/\.\.\.`):
- re = strings.TrimSuffix(re, `/\.\.\.`) + `(/\.\.\.)?`
- }
- re = strings.Replace(re, `\.\.\.`, `[^`+vendorChar+`]*`, -1)
-
- reg := regexp.MustCompile(`^` + re + `$`)
-
- return func(name string) bool {
- if strings.Contains(name, vendorChar) {
- return false
- }
- return reg.MatchString(replaceVendor(name, vendorChar))
- }
-}
-
-// replaceVendor returns the result of replacing
-// non-trailing vendor path elements in x with repl.
-func replaceVendor(x, repl string) string {
- if !strings.Contains(x, "vendor") {
- return x
- }
- elem := strings.Split(x, "/")
- for i := 0; i < len(elem)-1; i++ {
- if elem[i] == "vendor" {
- elem[i] = repl
- }
- }
- return strings.Join(elem, "/")
-}
-
-// ImportPaths returns the import paths to use for the given command line.
-func (c *Context) ImportPaths(args []string) []string {
- args = c.ImportPathsNoDotExpansion(args)
- var out []string
- for _, a := range args {
- if strings.Contains(a, "...") {
- if build.IsLocalImport(a) {
- out = append(out, c.allPackagesInFS(a)...)
- } else {
- out = append(out, c.allPackages(a)...)
- }
- continue
- }
- out = append(out, a)
- }
- return out
-}
-
-// ImportPathsNoDotExpansion returns the import paths to use for the given
-// command line, but it does no ... expansion.
-func (c *Context) ImportPathsNoDotExpansion(args []string) []string {
- if len(args) == 0 {
- return []string{"."}
- }
- var out []string
- for _, a := range args {
- // Arguments are supposed to be import paths, but
- // as a courtesy to Windows developers, rewrite \ to /
- // in command-line arguments. Handles .\... and so on.
- if filepath.Separator == '\\' {
- a = strings.Replace(a, `\`, `/`, -1)
- }
-
- // Put argument in canonical form, but preserve leading ./.
- if strings.HasPrefix(a, "./") {
- a = "./" + path.Clean(a)
- if a == "./." {
- a = "."
- }
- } else {
- a = path.Clean(a)
- }
- if IsMetaPackage(a) {
- out = append(out, c.allPackages(a)...)
- continue
- }
- out = append(out, a)
- }
- return out
-}
-
-// IsMetaPackage checks if name is a reserved package name that expands to multiple packages.
-func IsMetaPackage(name string) bool {
- return name == "std" || name == "cmd" || name == "all"
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/match.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/match.go
deleted file mode 100644
index 4dbdbff47..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/match.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2009 The Go Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// +build go1.9
-
-package gotool
-
-import (
- "path/filepath"
-
- "github.com/kisielk/gotool/internal/load"
-)
-
-// importPaths returns the import paths to use for the given command line.
-func (c *Context) importPaths(args []string) []string {
- lctx := load.Context{
- BuildContext: c.BuildContext,
- GOROOTsrc: c.joinPath(c.BuildContext.GOROOT, "src"),
- }
- return lctx.ImportPaths(args)
-}
-
-// joinPath calls c.BuildContext.JoinPath (if not nil) or else filepath.Join.
-//
-// It's a copy of the unexported build.Context.joinPath helper.
-func (c *Context) joinPath(elem ...string) string {
- if f := c.BuildContext.JoinPath; f != nil {
- return f(elem...)
- }
- return filepath.Join(elem...)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/match18.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/match18.go
deleted file mode 100644
index 6d6b1368c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/match18.go
+++ /dev/null
@@ -1,317 +0,0 @@
-// Copyright (c) 2009 The Go Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// +build !go1.9
-
-package gotool
-
-import (
- "fmt"
- "go/build"
- "log"
- "os"
- "path"
- "path/filepath"
- "regexp"
- "strings"
-)
-
-// This file contains code from the Go distribution.
-
-// matchPattern(pattern)(name) reports whether
-// name matches pattern. Pattern is a limited glob
-// pattern in which '...' means 'any string' and there
-// is no other special syntax.
-func matchPattern(pattern string) func(name string) bool {
- re := regexp.QuoteMeta(pattern)
- re = strings.Replace(re, `\.\.\.`, `.*`, -1)
- // Special case: foo/... matches foo too.
- if strings.HasSuffix(re, `/.*`) {
- re = re[:len(re)-len(`/.*`)] + `(/.*)?`
- }
- reg := regexp.MustCompile(`^` + re + `$`)
- return reg.MatchString
-}
-
-// matchPackages returns a list of package paths matching pattern
-// (see go help packages for pattern syntax).
-func (c *Context) matchPackages(pattern string) []string {
- match := func(string) bool { return true }
- treeCanMatch := func(string) bool { return true }
- if !isMetaPackage(pattern) {
- match = matchPattern(pattern)
- treeCanMatch = treeCanMatchPattern(pattern)
- }
-
- have := map[string]bool{
- "builtin": true, // ignore pseudo-package that exists only for documentation
- }
- if !c.BuildContext.CgoEnabled {
- have["runtime/cgo"] = true // ignore during walk
- }
- var pkgs []string
-
- for _, src := range c.BuildContext.SrcDirs() {
- if (pattern == "std" || pattern == "cmd") && src != gorootSrc {
- continue
- }
- src = filepath.Clean(src) + string(filepath.Separator)
- root := src
- if pattern == "cmd" {
- root += "cmd" + string(filepath.Separator)
- }
- filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() || path == src {
- return nil
- }
-
- // Avoid .foo, _foo, and testdata directory trees.
- _, elem := filepath.Split(path)
- if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" {
- return filepath.SkipDir
- }
-
- name := filepath.ToSlash(path[len(src):])
- if pattern == "std" && (!isStandardImportPath(name) || name == "cmd") {
- // The name "std" is only the standard library.
- // If the name is cmd, it's the root of the command tree.
- return filepath.SkipDir
- }
- if !treeCanMatch(name) {
- return filepath.SkipDir
- }
- if have[name] {
- return nil
- }
- have[name] = true
- if !match(name) {
- return nil
- }
- _, err = c.BuildContext.ImportDir(path, 0)
- if err != nil {
- if _, noGo := err.(*build.NoGoError); noGo {
- return nil
- }
- }
- pkgs = append(pkgs, name)
- return nil
- })
- }
- return pkgs
-}
-
-// importPathsNoDotExpansion returns the import paths to use for the given
-// command line, but it does no ... expansion.
-func (c *Context) importPathsNoDotExpansion(args []string) []string {
- if len(args) == 0 {
- return []string{"."}
- }
- var out []string
- for _, a := range args {
- // Arguments are supposed to be import paths, but
- // as a courtesy to Windows developers, rewrite \ to /
- // in command-line arguments. Handles .\... and so on.
- if filepath.Separator == '\\' {
- a = strings.Replace(a, `\`, `/`, -1)
- }
-
- // Put argument in canonical form, but preserve leading ./.
- if strings.HasPrefix(a, "./") {
- a = "./" + path.Clean(a)
- if a == "./." {
- a = "."
- }
- } else {
- a = path.Clean(a)
- }
- if isMetaPackage(a) {
- out = append(out, c.allPackages(a)...)
- continue
- }
- out = append(out, a)
- }
- return out
-}
-
-// importPaths returns the import paths to use for the given command line.
-func (c *Context) importPaths(args []string) []string {
- args = c.importPathsNoDotExpansion(args)
- var out []string
- for _, a := range args {
- if strings.Contains(a, "...") {
- if build.IsLocalImport(a) {
- out = append(out, c.allPackagesInFS(a)...)
- } else {
- out = append(out, c.allPackages(a)...)
- }
- continue
- }
- out = append(out, a)
- }
- return out
-}
-
-// allPackages returns all the packages that can be found
-// under the $GOPATH directories and $GOROOT matching pattern.
-// The pattern is either "all" (all packages), "std" (standard packages),
-// "cmd" (standard commands), or a path including "...".
-func (c *Context) allPackages(pattern string) []string {
- pkgs := c.matchPackages(pattern)
- if len(pkgs) == 0 {
- fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
- }
- return pkgs
-}
-
-// allPackagesInFS is like allPackages but is passed a pattern
-// beginning ./ or ../, meaning it should scan the tree rooted
-// at the given directory. There are ... in the pattern too.
-func (c *Context) allPackagesInFS(pattern string) []string {
- pkgs := c.matchPackagesInFS(pattern)
- if len(pkgs) == 0 {
- fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
- }
- return pkgs
-}
-
-// matchPackagesInFS returns a list of package paths matching pattern,
-// which must begin with ./ or ../
-// (see go help packages for pattern syntax).
-func (c *Context) matchPackagesInFS(pattern string) []string {
- // Find directory to begin the scan.
- // Could be smarter but this one optimization
- // is enough for now, since ... is usually at the
- // end of a path.
- i := strings.Index(pattern, "...")
- dir, _ := path.Split(pattern[:i])
-
- // pattern begins with ./ or ../.
- // path.Clean will discard the ./ but not the ../.
- // We need to preserve the ./ for pattern matching
- // and in the returned import paths.
- prefix := ""
- if strings.HasPrefix(pattern, "./") {
- prefix = "./"
- }
- match := matchPattern(pattern)
-
- var pkgs []string
- filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error {
- if err != nil || !fi.IsDir() {
- return nil
- }
- if path == dir {
- // filepath.Walk starts at dir and recurses. For the recursive case,
- // the path is the result of filepath.Join, which calls filepath.Clean.
- // The initial case is not Cleaned, though, so we do this explicitly.
- //
- // This converts a path like "./io/" to "io". Without this step, running
- // "cd $GOROOT/src; go list ./io/..." would incorrectly skip the io
- // package, because prepending the prefix "./" to the unclean path would
- // result in "././io", and match("././io") returns false.
- path = filepath.Clean(path)
- }
-
- // Avoid .foo, _foo, and testdata directory trees, but do not avoid "." or "..".
- _, elem := filepath.Split(path)
- dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
- if dot || strings.HasPrefix(elem, "_") || elem == "testdata" {
- return filepath.SkipDir
- }
-
- name := prefix + filepath.ToSlash(path)
- if !match(name) {
- return nil
- }
-
- // We keep the directory if we can import it, or if we can't import it
- // due to invalid Go source files. This means that directories containing
- // parse errors will be built (and fail) instead of being silently skipped
- // as not matching the pattern. Go 1.5 and earlier skipped, but that
- // behavior means people miss serious mistakes.
- // See golang.org/issue/11407.
- if p, err := c.BuildContext.ImportDir(path, 0); err != nil && shouldIgnoreImport(p) {
- if _, noGo := err.(*build.NoGoError); !noGo {
- log.Print(err)
- }
- return nil
- }
- pkgs = append(pkgs, name)
- return nil
- })
- return pkgs
-}
-
-// isMetaPackage checks if name is a reserved package name that expands to multiple packages.
-func isMetaPackage(name string) bool {
- return name == "std" || name == "cmd" || name == "all"
-}
-
-// isStandardImportPath reports whether $GOROOT/src/path should be considered
-// part of the standard distribution. For historical reasons we allow people to add
-// their own code to $GOROOT instead of using $GOPATH, but we assume that
-// code will start with a domain name (dot in the first element).
-func isStandardImportPath(path string) bool {
- i := strings.Index(path, "/")
- if i < 0 {
- i = len(path)
- }
- elem := path[:i]
- return !strings.Contains(elem, ".")
-}
-
-// hasPathPrefix reports whether the path s begins with the
-// elements in prefix.
-func hasPathPrefix(s, prefix string) bool {
- switch {
- default:
- return false
- case len(s) == len(prefix):
- return s == prefix
- case len(s) > len(prefix):
- if prefix != "" && prefix[len(prefix)-1] == '/' {
- return strings.HasPrefix(s, prefix)
- }
- return s[len(prefix)] == '/' && s[:len(prefix)] == prefix
- }
-}
-
-// treeCanMatchPattern(pattern)(name) reports whether
-// name or children of name can possibly match pattern.
-// Pattern is the same limited glob accepted by matchPattern.
-func treeCanMatchPattern(pattern string) func(name string) bool {
- wildCard := false
- if i := strings.Index(pattern, "..."); i >= 0 {
- wildCard = true
- pattern = pattern[:i]
- }
- return func(name string) bool {
- return len(name) <= len(pattern) && hasPathPrefix(pattern, name) ||
- wildCard && strings.HasPrefix(name, pattern)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/tool.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/tool.go
deleted file mode 100644
index c7409e11e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/kisielk/gotool/tool.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Package gotool contains utility functions used to implement the standard
-// "cmd/go" tool, provided as a convenience to developers who want to write
-// tools with similar semantics.
-package gotool
-
-import "go/build"
-
-// Export functions here to make it easier to keep the implementations up to date with upstream.
-
-// DefaultContext is the default context that uses build.Default.
-var DefaultContext = Context{
- BuildContext: build.Default,
-}
-
-// A Context specifies the supporting context.
-type Context struct {
- // BuildContext is the build.Context that is used when computing import paths.
- BuildContext build.Context
-}
-
-// ImportPaths returns the import paths to use for the given command line.
-//
-// The path "all" is expanded to all packages in $GOPATH and $GOROOT.
-// The path "std" is expanded to all packages in the Go standard library.
-// The path "cmd" is expanded to all Go standard commands.
-// The string "..." is treated as a wildcard within a path.
-// When matching recursively, directories are ignored if they are prefixed with
-// a dot or an underscore (such as ".foo" or "_foo"), or are named "testdata".
-// Relative import paths are not converted to full import paths.
-// If args is empty, a single element "." is returned.
-func (c *Context) ImportPaths(args []string) []string {
- return c.importPaths(args)
-}
-
-// ImportPaths returns the import paths to use for the given command line
-// using default context.
-//
-// The path "all" is expanded to all packages in $GOPATH and $GOROOT.
-// The path "std" is expanded to all packages in the Go standard library.
-// The path "cmd" is expanded to all Go standard commands.
-// The string "..." is treated as a wildcard within a path.
-// When matching recursively, directories are ignored if they are prefixed with
-// a dot or an underscore (such as ".foo" or "_foo"), or are named "testdata".
-// Relative import paths are not converted to full import paths.
-// If args is empty, a single element "." is returned.
-func ImportPaths(args []string) []string {
- return DefaultContext.importPaths(args)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/maligned/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/maligned/LICENSE
deleted file mode 100644
index 744875676..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/maligned/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/maligned/maligned.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/maligned/maligned.go
deleted file mode 100644
index ae3fadf67..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/maligned/maligned.go
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/token"
- "go/types"
- "log"
- "sort"
-
- "github.com/kisielk/gotool"
- "golang.org/x/tools/go/loader"
-)
-
-var fset = token.NewFileSet()
-
-func main() {
- flag.Parse()
-
- importPaths := gotool.ImportPaths(flag.Args())
- if len(importPaths) == 0 {
- return
- }
-
- var conf loader.Config
- conf.Fset = fset
- for _, importPath := range importPaths {
- conf.Import(importPath)
- }
- prog, err := conf.Load()
- if err != nil {
- log.Fatal(err)
- }
-
- for _, pkg := range prog.InitialPackages() {
- for _, file := range pkg.Files {
- ast.Inspect(file, func(node ast.Node) bool {
- if s, ok := node.(*ast.StructType); ok {
- malign(node.Pos(), pkg.Types[s].Type.(*types.Struct))
- }
- return true
- })
- }
- }
-}
-
-func malign(pos token.Pos, str *types.Struct) {
- wordSize := int64(8)
- maxAlign := int64(8)
- switch build.Default.GOARCH {
- case "386", "arm":
- wordSize, maxAlign = 4, 4
- case "amd64p32":
- wordSize = 4
- }
-
- s := gcSizes{wordSize, maxAlign}
- sz, opt := s.Sizeof(str), optimalSize(str, &s)
- if sz != opt {
- fmt.Printf("%s: struct of size %d could be %d\n", fset.Position(pos), sz, opt)
- }
-}
-
-func optimalSize(str *types.Struct, sizes *gcSizes) int64 {
- nf := str.NumFields()
- fields := make([]*types.Var, nf)
- alignofs := make([]int64, nf)
- sizeofs := make([]int64, nf)
- for i := 0; i < nf; i++ {
- fields[i] = str.Field(i)
- ft := fields[i].Type()
- alignofs[i] = sizes.Alignof(ft)
- sizeofs[i] = sizes.Sizeof(ft)
- }
- sort.Sort(&byAlignAndSize{fields, alignofs, sizeofs})
- return sizes.Sizeof(types.NewStruct(fields, nil))
-}
-
-type byAlignAndSize struct {
- fields []*types.Var
- alignofs []int64
- sizeofs []int64
-}
-
-func (s *byAlignAndSize) Len() int { return len(s.fields) }
-func (s *byAlignAndSize) Swap(i, j int) {
- s.fields[i], s.fields[j] = s.fields[j], s.fields[i]
- s.alignofs[i], s.alignofs[j] = s.alignofs[j], s.alignofs[i]
- s.sizeofs[i], s.sizeofs[j] = s.sizeofs[j], s.sizeofs[i]
-}
-
-func (s *byAlignAndSize) Less(i, j int) bool {
- // Place zero sized objects before non-zero sized objects.
- if s.sizeofs[i] == 0 && s.sizeofs[j] != 0 {
- return true
- }
- if s.sizeofs[j] == 0 && s.sizeofs[i] != 0 {
- return false
- }
-
- // Next, place more tightly aligned objects before less tightly aligned objects.
- if s.alignofs[i] != s.alignofs[j] {
- return s.alignofs[i] > s.alignofs[j]
- }
-
- // Lastly, order by size.
- if s.sizeofs[i] != s.sizeofs[j] {
- return s.sizeofs[i] > s.sizeofs[j]
- }
-
- return false
-}
-
-// Code below based on go/types.StdSizes.
-
-type gcSizes struct {
- WordSize int64
- MaxAlign int64
-}
-
-func (s *gcSizes) Alignof(T types.Type) int64 {
- // NOTE: On amd64, complex64 is 8 byte aligned,
- // even though float32 is only 4 byte aligned.
-
- // For arrays and structs, alignment is defined in terms
- // of alignment of the elements and fields, respectively.
- switch t := T.Underlying().(type) {
- case *types.Array:
- // spec: "For a variable x of array type: unsafe.Alignof(x)
- // is the same as unsafe.Alignof(x[0]), but at least 1."
- return s.Alignof(t.Elem())
- case *types.Struct:
- // spec: "For a variable x of struct type: unsafe.Alignof(x)
- // is the largest of the values unsafe.Alignof(x.f) for each
- // field f of x, but at least 1."
- max := int64(1)
- for i, nf := 0, t.NumFields(); i < nf; i++ {
- if a := s.Alignof(t.Field(i).Type()); a > max {
- max = a
- }
- }
- return max
- }
- a := s.Sizeof(T) // may be 0
- // spec: "For a variable x of any type: unsafe.Alignof(x) is at least 1."
- if a < 1 {
- return 1
- }
- if a > s.MaxAlign {
- return s.MaxAlign
- }
- return a
-}
-
-var basicSizes = [...]byte{
- types.Bool: 1,
- types.Int8: 1,
- types.Int16: 2,
- types.Int32: 4,
- types.Int64: 8,
- types.Uint8: 1,
- types.Uint16: 2,
- types.Uint32: 4,
- types.Uint64: 8,
- types.Float32: 4,
- types.Float64: 8,
- types.Complex64: 8,
- types.Complex128: 16,
-}
-
-func (s *gcSizes) Sizeof(T types.Type) int64 {
- switch t := T.Underlying().(type) {
- case *types.Basic:
- k := t.Kind()
- if int(k) < len(basicSizes) {
- if s := basicSizes[k]; s > 0 {
- return int64(s)
- }
- }
- if k == types.String {
- return s.WordSize * 2
- }
- case *types.Array:
- n := t.Len()
- if n == 0 {
- return 0
- }
- a := s.Alignof(t.Elem())
- z := s.Sizeof(t.Elem())
- return align(z, a)*(n-1) + z
- case *types.Slice:
- return s.WordSize * 3
- case *types.Struct:
- nf := t.NumFields()
- if nf == 0 {
- return 0
- }
-
- var o int64
- max := int64(1)
- for i := 0; i < nf; i++ {
- ft := t.Field(i).Type()
- a, sz := s.Alignof(ft), s.Sizeof(ft)
- if a > max {
- max = a
- }
- if i == nf-1 && sz == 0 && o != 0 {
- sz = 1
- }
- o = align(o, a) + sz
- }
- return align(o, max)
- case *types.Interface:
- return s.WordSize * 2
- }
- return s.WordSize // catch-all
-}
-
-// align returns the smallest y >= x such that y % a == 0.
-func align(x, a int64) int64 {
- y := x + a - 1
- return y - y%a
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/unconvert/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/unconvert/LICENSE
deleted file mode 100644
index 744875676..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/unconvert/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/unconvert/unconvert.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/unconvert/unconvert.go
deleted file mode 100644
index 4c8332c3b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mdempsky/unconvert/unconvert.go
+++ /dev/null
@@ -1,650 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Unconvert removes redundant type conversions from Go packages.
-package main
-
-import (
- "bytes"
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/format"
- "go/parser"
- "go/token"
- "go/types"
- "io/ioutil"
- "log"
- "os"
- "reflect"
- "runtime/pprof"
- "sort"
- "sync"
- "unicode"
-
- "github.com/kisielk/gotool"
- "golang.org/x/text/width"
- "golang.org/x/tools/go/loader"
-)
-
-// Unnecessary conversions are identified by the position
-// of their left parenthesis within a source file.
-
-type editSet map[token.Position]struct{}
-
-type fileToEditSet map[string]editSet
-
-func apply(file string, edits editSet) {
- if len(edits) == 0 {
- return
- }
-
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, file, nil, parser.ParseComments)
- if err != nil {
- log.Fatal(err)
- }
-
- // Note: We modify edits during the walk.
- v := editor{edits: edits, file: fset.File(f.Package)}
- ast.Walk(&v, f)
- if len(edits) != 0 {
- log.Printf("%s: missing edits %s", file, edits)
- }
-
- // TODO(mdempsky): Write to temporary file and rename.
- var buf bytes.Buffer
- err = format.Node(&buf, fset, f)
- if err != nil {
- log.Fatal(err)
- }
-
- err = ioutil.WriteFile(file, buf.Bytes(), 0)
- if err != nil {
- log.Fatal(err)
- }
-}
-
-type editor struct {
- edits editSet
- file *token.File
-}
-
-func (e *editor) Visit(n ast.Node) ast.Visitor {
- if n == nil {
- return nil
- }
- v := reflect.ValueOf(n).Elem()
- for i, n := 0, v.NumField(); i < n; i++ {
- switch f := v.Field(i).Addr().Interface().(type) {
- case *ast.Expr:
- e.rewrite(f)
- case *[]ast.Expr:
- for i := range *f {
- e.rewrite(&(*f)[i])
- }
- }
- }
- return e
-}
-
-func (e *editor) rewrite(f *ast.Expr) {
- call, ok := (*f).(*ast.CallExpr)
- if !ok {
- return
- }
-
- pos := e.file.Position(call.Lparen)
- if _, ok := e.edits[pos]; !ok {
- return
- }
- *f = call.Args[0]
- delete(e.edits, pos)
-}
-
-var (
- cr = []byte{'\r'}
- nl = []byte{'\n'}
-)
-
-func print(conversions []token.Position) {
- var file string
- var lines [][]byte
-
- for _, pos := range conversions {
- fmt.Printf("%s:%d:%d: unnecessary conversion\n", pos.Filename, pos.Line, pos.Column)
- if *flagV {
- if pos.Filename != file {
- buf, err := ioutil.ReadFile(pos.Filename)
- if err != nil {
- log.Fatal(err)
- }
- file = pos.Filename
- lines = bytes.Split(buf, nl)
- }
-
- line := bytes.TrimSuffix(lines[pos.Line-1], cr)
- fmt.Printf("%s\n", line)
-
- // For files processed by cgo, Column is the
- // column location after cgo processing, which
- // may be different than the source column
- // that we want here. In lieu of a better
- // heuristic for detecting this case, at least
- // avoid panicking if column is out of bounds.
- if pos.Column <= len(line) {
- fmt.Printf("%s^\n", rub(line[:pos.Column-1]))
- }
- }
- }
-}
-
-// Rub returns a copy of buf with all non-whitespace characters replaced
-// by spaces (like rubbing them out with white out).
-func rub(buf []byte) []byte {
- // TODO(mdempsky): Handle combining characters?
- var res bytes.Buffer
- for _, r := range string(buf) {
- if unicode.IsSpace(r) {
- res.WriteRune(r)
- continue
- }
- switch width.LookupRune(r).Kind() {
- case width.EastAsianWide, width.EastAsianFullwidth:
- res.WriteString(" ")
- default:
- res.WriteByte(' ')
- }
- }
- return res.Bytes()
-}
-
-var (
- flagAll = flag.Bool("all", false, "type check all GOOS and GOARCH combinations")
- flagApply = flag.Bool("apply", false, "apply edits to source files")
- flagCPUProfile = flag.String("cpuprofile", "", "write CPU profile to file")
- // TODO(mdempsky): Better description and maybe flag name.
- flagSafe = flag.Bool("safe", false, "be more conservative (experimental)")
- flagV = flag.Bool("v", false, "verbose output")
-)
-
-func usage() {
- fmt.Fprintf(os.Stderr, "usage: unconvert [flags] [package ...]\n")
- flag.PrintDefaults()
-}
-
-func main() {
- flag.Usage = usage
- flag.Parse()
-
- if *flagCPUProfile != "" {
- f, err := os.Create(*flagCPUProfile)
- if err != nil {
- log.Fatal(err)
- }
- pprof.StartCPUProfile(f)
- defer pprof.StopCPUProfile()
- }
-
- importPaths := gotool.ImportPaths(flag.Args())
- if len(importPaths) == 0 {
- return
- }
-
- var m fileToEditSet
- if *flagAll {
- m = mergeEdits(importPaths)
- } else {
- m = computeEdits(importPaths, build.Default.GOOS, build.Default.GOARCH, build.Default.CgoEnabled)
- }
-
- if *flagApply {
- var wg sync.WaitGroup
- for f, e := range m {
- wg.Add(1)
- f, e := f, e
- go func() {
- defer wg.Done()
- apply(f, e)
- }()
- }
- wg.Wait()
- } else {
- var conversions []token.Position
- for _, positions := range m {
- for pos := range positions {
- conversions = append(conversions, pos)
- }
- }
- sort.Sort(byPosition(conversions))
- print(conversions)
- if len(conversions) > 0 {
- os.Exit(1)
- }
- }
-}
-
-var plats = [...]struct {
- goos, goarch string
-}{
- // TODO(mdempsky): buildall.bash also builds linux-386-387 and linux-arm-arm5.
- {"android", "386"},
- {"android", "amd64"},
- {"android", "arm"},
- {"android", "arm64"},
- {"darwin", "386"},
- {"darwin", "amd64"},
- {"darwin", "arm"},
- {"darwin", "arm64"},
- {"dragonfly", "amd64"},
- {"freebsd", "386"},
- {"freebsd", "amd64"},
- {"freebsd", "arm"},
- {"linux", "386"},
- {"linux", "amd64"},
- {"linux", "arm"},
- {"linux", "arm64"},
- {"linux", "mips64"},
- {"linux", "mips64le"},
- {"linux", "ppc64"},
- {"linux", "ppc64le"},
- {"linux", "s390x"},
- {"nacl", "386"},
- {"nacl", "amd64p32"},
- {"nacl", "arm"},
- {"netbsd", "386"},
- {"netbsd", "amd64"},
- {"netbsd", "arm"},
- {"openbsd", "386"},
- {"openbsd", "amd64"},
- {"openbsd", "arm"},
- {"plan9", "386"},
- {"plan9", "amd64"},
- {"plan9", "arm"},
- {"solaris", "amd64"},
- {"windows", "386"},
- {"windows", "amd64"},
-}
-
-func mergeEdits(importPaths []string) fileToEditSet {
- m := make(fileToEditSet)
- for _, plat := range plats {
- for f, e := range computeEdits(importPaths, plat.goos, plat.goarch, false) {
- if e0, ok := m[f]; ok {
- for k := range e0 {
- if _, ok := e[k]; !ok {
- delete(e0, k)
- }
- }
- } else {
- m[f] = e
- }
- }
- }
- return m
-}
-
-type noImporter struct{}
-
-func (noImporter) Import(path string) (*types.Package, error) {
- panic("golang.org/x/tools/go/loader said this wouldn't be called")
-}
-
-func computeEdits(importPaths []string, os, arch string, cgoEnabled bool) fileToEditSet {
- ctxt := build.Default
- ctxt.GOOS = os
- ctxt.GOARCH = arch
- ctxt.CgoEnabled = cgoEnabled
-
- var conf loader.Config
- conf.Build = &ctxt
- conf.TypeChecker.Importer = noImporter{}
- for _, importPath := range importPaths {
- conf.Import(importPath)
- }
- prog, err := conf.Load()
- if err != nil {
- log.Fatal(err)
- }
-
- type res struct {
- file string
- edits editSet
- }
- ch := make(chan res)
- var wg sync.WaitGroup
- for _, pkg := range prog.InitialPackages() {
- for _, file := range pkg.Files {
- pkg, file := pkg, file
- wg.Add(1)
- go func() {
- defer wg.Done()
- v := visitor{pkg: pkg, file: conf.Fset.File(file.Package), edits: make(editSet)}
- ast.Walk(&v, file)
- ch <- res{v.file.Name(), v.edits}
- }()
- }
- }
- go func() {
- wg.Wait()
- close(ch)
- }()
-
- m := make(fileToEditSet)
- for r := range ch {
- m[r.file] = r.edits
- }
- return m
-}
-
-type step struct {
- n ast.Node
- i int
-}
-
-type visitor struct {
- pkg *loader.PackageInfo
- file *token.File
- edits editSet
- path []step
-}
-
-func (v *visitor) Visit(node ast.Node) ast.Visitor {
- if node != nil {
- v.path = append(v.path, step{n: node})
- } else {
- n := len(v.path)
- v.path = v.path[:n-1]
- if n >= 2 {
- v.path[n-2].i++
- }
- }
-
- if call, ok := node.(*ast.CallExpr); ok {
- v.unconvert(call)
- }
- return v
-}
-
-func (v *visitor) unconvert(call *ast.CallExpr) {
- // TODO(mdempsky): Handle useless multi-conversions.
-
- // Conversions have exactly one argument.
- if len(call.Args) != 1 || call.Ellipsis != token.NoPos {
- return
- }
- ft, ok := v.pkg.Types[call.Fun]
- if !ok {
- fmt.Println("Missing type for function")
- return
- }
- if !ft.IsType() {
- // Function call; not a conversion.
- return
- }
- at, ok := v.pkg.Types[call.Args[0]]
- if !ok {
- fmt.Println("Missing type for argument")
- return
- }
- if !types.Identical(ft.Type, at.Type) {
- // A real conversion.
- return
- }
- if isUntypedValue(call.Args[0], &v.pkg.Info) {
- // Workaround golang.org/issue/13061.
- return
- }
- if *flagSafe && !v.isSafeContext(at.Type) {
- // TODO(mdempsky): Remove this message.
- fmt.Println("Skipped a possible type conversion because of -safe at", v.file.Position(call.Pos()))
- return
- }
- if v.isCgoCheckPointerContext() {
- // cmd/cgo generates explicit type conversions that
- // are often redundant when introducing
- // _cgoCheckPointer calls (issue #16). Users can't do
- // anything about these, so skip over them.
- return
- }
-
- v.edits[v.file.Position(call.Lparen)] = struct{}{}
-}
-
-func (v *visitor) isCgoCheckPointerContext() bool {
- ctxt := &v.path[len(v.path)-2]
- if ctxt.i != 1 {
- return false
- }
- call, ok := ctxt.n.(*ast.CallExpr)
- if !ok {
- return false
- }
- ident, ok := call.Fun.(*ast.Ident)
- if !ok {
- return false
- }
- return ident.Name == "_cgoCheckPointer"
-}
-
-// isSafeContext reports whether the current context requires
-// an expression of type t.
-//
-// TODO(mdempsky): That's a bad explanation.
-func (v *visitor) isSafeContext(t types.Type) bool {
- ctxt := &v.path[len(v.path)-2]
- switch n := ctxt.n.(type) {
- case *ast.AssignStmt:
- pos := ctxt.i - len(n.Lhs)
- if pos < 0 {
- fmt.Println("Type conversion on LHS of assignment?")
- return false
- }
- if n.Tok == token.DEFINE {
- // Skip := assignments.
- return true
- }
- // We're a conversion in the pos'th element of n.Rhs.
- // Check that the corresponding element of n.Lhs is of type t.
- lt, ok := v.pkg.Types[n.Lhs[pos]]
- if !ok {
- fmt.Println("Missing type for LHS expression")
- return false
- }
- return types.Identical(t, lt.Type)
- case *ast.BinaryExpr:
- if n.Op == token.SHL || n.Op == token.SHR {
- if ctxt.i == 1 {
- // RHS of a shift is always safe.
- return true
- }
- // For the LHS, we should inspect up another level.
- fmt.Println("TODO(mdempsky): Handle LHS of shift expressions")
- return true
- }
- var other ast.Expr
- if ctxt.i == 0 {
- other = n.Y
- } else {
- other = n.X
- }
- ot, ok := v.pkg.Types[other]
- if !ok {
- fmt.Println("Missing type for other binop subexpr")
- return false
- }
- return types.Identical(t, ot.Type)
- case *ast.CallExpr:
- pos := ctxt.i - 1
- if pos < 0 {
- // Type conversion in the function subexpr is okay.
- return true
- }
- ft, ok := v.pkg.Types[n.Fun]
- if !ok {
- fmt.Println("Missing type for function expression")
- return false
- }
- sig, ok := ft.Type.(*types.Signature)
- if !ok {
- // "Function" is either a type conversion (ok) or a builtin (ok?).
- return true
- }
- params := sig.Params()
- var pt types.Type
- if sig.Variadic() && n.Ellipsis == token.NoPos && pos >= params.Len()-1 {
- pt = params.At(params.Len() - 1).Type().(*types.Slice).Elem()
- } else {
- pt = params.At(pos).Type()
- }
- return types.Identical(t, pt)
- case *ast.CompositeLit, *ast.KeyValueExpr:
- fmt.Println("TODO(mdempsky): Compare against value type of composite literal type at", v.file.Position(n.Pos()))
- return true
- case *ast.ReturnStmt:
- // TODO(mdempsky): Is there a better way to get the corresponding
- // return parameter type?
- var funcType *ast.FuncType
- for i := len(v.path) - 1; funcType == nil && i >= 0; i-- {
- switch f := v.path[i].n.(type) {
- case *ast.FuncDecl:
- funcType = f.Type
- case *ast.FuncLit:
- funcType = f.Type
- }
- }
- var typeExpr ast.Expr
- for i, j := ctxt.i, 0; j < len(funcType.Results.List); j++ {
- f := funcType.Results.List[j]
- if len(f.Names) == 0 {
- if i >= 1 {
- i--
- continue
- }
- } else {
- if i >= len(f.Names) {
- i -= len(f.Names)
- continue
- }
- }
- typeExpr = f.Type
- break
- }
- if typeExpr == nil {
- fmt.Println(ctxt)
- }
- pt, ok := v.pkg.Types[typeExpr]
- if !ok {
- fmt.Println("Missing type for return parameter at", v.file.Position(n.Pos()))
- return false
- }
- return types.Identical(t, pt.Type)
- case *ast.StarExpr, *ast.UnaryExpr:
- // TODO(mdempsky): I think these are always safe.
- return true
- case *ast.SwitchStmt:
- // TODO(mdempsky): I think this is always safe?
- return true
- default:
- // TODO(mdempsky): When can this happen?
- fmt.Printf("... huh, %T at %v\n", n, v.file.Position(n.Pos()))
- return true
- }
-}
-
-func isUntypedValue(n ast.Expr, info *types.Info) (res bool) {
- switch n := n.(type) {
- case *ast.BinaryExpr:
- switch n.Op {
- case token.SHL, token.SHR:
- // Shifts yield an untyped value if their LHS is untyped.
- return isUntypedValue(n.X, info)
- case token.EQL, token.NEQ, token.LSS, token.GTR, token.LEQ, token.GEQ:
- // Comparisons yield an untyped boolean value.
- return true
- case token.ADD, token.SUB, token.MUL, token.QUO, token.REM,
- token.AND, token.OR, token.XOR, token.AND_NOT,
- token.LAND, token.LOR:
- return isUntypedValue(n.X, info) && isUntypedValue(n.Y, info)
- }
- case *ast.UnaryExpr:
- switch n.Op {
- case token.ADD, token.SUB, token.NOT, token.XOR:
- return isUntypedValue(n.X, info)
- }
- case *ast.BasicLit:
- // Basic literals are always untyped.
- return true
- case *ast.ParenExpr:
- return isUntypedValue(n.X, info)
- case *ast.SelectorExpr:
- return isUntypedValue(n.Sel, info)
- case *ast.Ident:
- if obj, ok := info.Uses[n]; ok {
- if obj.Pkg() == nil && obj.Name() == "nil" {
- // The universal untyped zero value.
- return true
- }
- if b, ok := obj.Type().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
- // Reference to an untyped constant.
- return true
- }
- }
- case *ast.CallExpr:
- if b, ok := asBuiltin(n.Fun, info); ok {
- switch b.Name() {
- case "real", "imag":
- return isUntypedValue(n.Args[0], info)
- case "complex":
- return isUntypedValue(n.Args[0], info) && isUntypedValue(n.Args[1], info)
- }
- }
- }
-
- return false
-}
-
-func asBuiltin(n ast.Expr, info *types.Info) (*types.Builtin, bool) {
- for {
- paren, ok := n.(*ast.ParenExpr)
- if !ok {
- break
- }
- n = paren.X
- }
-
- ident, ok := n.(*ast.Ident)
- if !ok {
- return nil, false
- }
-
- obj, ok := info.Uses[ident]
- if !ok {
- return nil, false
- }
-
- b, ok := obj.(*types.Builtin)
- return b, ok
-}
-
-type byPosition []token.Position
-
-func (p byPosition) Len() int {
- return len(p)
-}
-
-func (p byPosition) Less(i, j int) bool {
- if p[i].Filename != p[j].Filename {
- return p[i].Filename < p[j].Filename
- }
- if p[i].Line != p[j].Line {
- return p[i].Line < p[j].Line
- }
- return p[i].Column < p[j].Column
-}
-
-func (p byPosition) Swap(i, j int) {
- p[i], p[j] = p[j], p[i]
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/LICENSE
deleted file mode 100644
index ab317d841..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Michal Bohuslávek
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/job/buildtree.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/job/buildtree.go
deleted file mode 100644
index 2a18e9504..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/job/buildtree.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package job
-
-import (
- "github.com/mibk/dupl/suffixtree"
- "github.com/mibk/dupl/syntax"
-)
-
-func BuildTree(schan chan []*syntax.Node) (t *suffixtree.STree, d *[]*syntax.Node, done chan bool) {
- t = suffixtree.New()
- data := make([]*syntax.Node, 0, 100)
- done = make(chan bool)
- go func() {
- for seq := range schan {
- data = append(data, seq...)
- for _, node := range seq {
- t.Update(node)
- }
- }
- done <- true
- }()
- return t, &data, done
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/job/parse.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/job/parse.go
deleted file mode 100644
index ca14e82aa..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/job/parse.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package job
-
-import (
- "log"
-
- "github.com/mibk/dupl/syntax"
- "github.com/mibk/dupl/syntax/golang"
-)
-
-func Parse(fchan chan string) chan []*syntax.Node {
-
- // parse AST
- achan := make(chan *syntax.Node)
- go func() {
- for file := range fchan {
- ast, err := golang.Parse(file)
- if err != nil {
- log.Println(err)
- continue
- }
- achan <- ast
- }
- close(achan)
- }()
-
- // serialize
- schan := make(chan []*syntax.Node)
- go func() {
- for ast := range achan {
- seq := syntax.Serialize(ast)
- schan <- seq
- }
- close(schan)
- }()
- return schan
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/main.go
deleted file mode 100644
index f2af56612..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/main.go
+++ /dev/null
@@ -1,219 +0,0 @@
-package main
-
-import (
- "bufio"
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "sort"
- "strings"
-
- "github.com/mibk/dupl/job"
- "github.com/mibk/dupl/output"
- "github.com/mibk/dupl/syntax"
-)
-
-const defaultThreshold = 15
-
-var (
- paths = []string{"."}
- vendor = flag.Bool("vendor", false, "check files in vendor directory")
- verbose = flag.Bool("verbose", false, "explain what is being done")
- threshold = flag.Int("threshold", defaultThreshold, "minimum token sequence as a clone")
- files = flag.Bool("files", false, "files names from stdin")
-
- html = flag.Bool("html", false, "html output")
- plumbing = flag.Bool("plumbing", false, "plumbing output for consumption by scripts or tools")
-)
-
-const (
- vendorDirPrefix = "vendor" + string(filepath.Separator)
- vendorDirInPath = string(filepath.Separator) + "vendor" + string(filepath.Separator)
-)
-
-func init() {
- flag.BoolVar(verbose, "v", false, "alias for -verbose")
- flag.IntVar(threshold, "t", defaultThreshold, "alias for -threshold")
-}
-
-func usage() {
- fmt.Fprintln(os.Stderr, `Usage of dupl:
- dupl [flags] [paths]
-
-Paths:
- If the given path is a file, dupl will use it regardless of
- the file extension. If it is a directory it will recursively
- search for *.go files in that directory.
-
- If no path is given dupl will recursively search for *.go
- files in the current directory.
-
-Flags:
- -files
- read file names from stdin one at each line
- -html
- output the results as HTML, including duplicate code fragments
- -plumbing
- plumbing (easy-to-parse) output for consumption by scripts or tools
- -t, -threshold size
- minimum token sequence size as a clone (default 15)
- -vendor
- check files in vendor directory
- -v, -verbose
- explain what is being done
-
-Examples:
- dupl -t 100
- Search clones in the current directory of size at least
- 100 tokens.
- dupl $(find app/ -name '*_test.go')
- Search for clones in tests in the app directory.
- find app/ -name '*_test.go' |dupl -files
- The same as above.`)
- os.Exit(2)
-}
-
-func main() {
- flag.Usage = usage
- flag.Parse()
- if *html && *plumbing {
- log.Fatal("you can have either plumbing or HTML output")
- }
- if flag.NArg() > 0 {
- paths = flag.Args()
- }
-
- if *verbose {
- log.Println("Building suffix tree")
- }
- schan := job.Parse(filesFeed())
- t, data, done := job.BuildTree(schan)
- <-done
-
- // finish stream
- t.Update(&syntax.Node{Type: -1})
-
- if *verbose {
- log.Println("Searching for clones")
- }
- mchan := t.FindDuplOver(*threshold)
- duplChan := make(chan syntax.Match)
- go func() {
- for m := range mchan {
- match := syntax.FindSyntaxUnits(*data, m, *threshold)
- if len(match.Frags) > 0 {
- duplChan <- match
- }
- }
- close(duplChan)
- }()
- printDupls(duplChan)
-}
-
-func filesFeed() chan string {
- if *files {
- fchan := make(chan string)
- go func() {
- s := bufio.NewScanner(os.Stdin)
- for s.Scan() {
- f := s.Text()
- if strings.HasPrefix(f, "./") {
- f = f[2:]
- }
- fchan <- f
- }
- close(fchan)
- }()
- return fchan
- }
- return crawlPaths(paths)
-}
-
-func crawlPaths(paths []string) chan string {
- fchan := make(chan string)
- go func() {
- for _, path := range paths {
- info, err := os.Lstat(path)
- if err != nil {
- log.Fatal(err)
- }
- if !info.IsDir() {
- fchan <- path
- continue
- }
- filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
- if !*vendor && (strings.HasPrefix(path, vendorDirPrefix) ||
- strings.Contains(path, vendorDirInPath)) {
- return nil
- }
- if !info.IsDir() && strings.HasSuffix(info.Name(), ".go") {
- fchan <- path
- }
- return nil
- })
- }
- close(fchan)
- }()
- return fchan
-}
-
-func printDupls(duplChan <-chan syntax.Match) {
- groups := make(map[string][][]*syntax.Node)
- for dupl := range duplChan {
- groups[dupl.Hash] = append(groups[dupl.Hash], dupl.Frags...)
- }
- keys := make([]string, 0, len(groups))
- for k := range groups {
- keys = append(keys, k)
- }
- sort.Strings(keys)
-
- p := getPrinter()
- for _, k := range keys {
- uniq := unique(groups[k])
- if len(uniq) > 1 {
- if err := p.Print(uniq); err != nil {
- log.Fatal(err)
- }
- }
- }
- p.Finish()
-}
-
-func getPrinter() output.Printer {
- var fr fileReader
- if *html {
- return output.NewHTMLPrinter(os.Stdout, fr)
- } else if *plumbing {
- return output.NewPlumbingPrinter(os.Stdout, fr)
- }
- return output.NewTextPrinter(os.Stdout, fr)
-}
-
-type fileReader struct{}
-
-func (fileReader) ReadFile(filename string) ([]byte, error) {
- return ioutil.ReadFile(filename)
-}
-
-func unique(group [][]*syntax.Node) [][]*syntax.Node {
- fileMap := make(map[string]map[int]struct{})
-
- var newGroup [][]*syntax.Node
- for _, seq := range group {
- node := seq[0]
- file, ok := fileMap[node.Filename]
- if !ok {
- file = make(map[int]struct{})
- fileMap[node.Filename] = file
- }
- if _, ok := file[node.Pos]; !ok {
- file[node.Pos] = struct{}{}
- newGroup = append(newGroup, seq)
- }
- }
- return newGroup
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/html.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/html.go
deleted file mode 100644
index d8597ff74..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/html.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package output
-
-import (
- "bytes"
- "fmt"
- "io"
- "regexp"
- "sort"
-
- "github.com/mibk/dupl/syntax"
-)
-
-type HTMLPrinter struct {
- iota int
- *TextPrinter
-}
-
-func NewHTMLPrinter(w io.Writer, fr FileReader) *HTMLPrinter {
- fmt.Fprint(w, `
-
-Duplicates
-
-`)
- return &HTMLPrinter{
- TextPrinter: NewTextPrinter(w, fr),
- }
-}
-
-func (p *HTMLPrinter) Print(dups [][]*syntax.Node) error {
- p.iota++
- fmt.Fprintf(p.writer, "#%d found %d clones \n", p.iota, len(dups))
-
- clones := make([]clone, len(dups))
- for i, dup := range dups {
- cnt := len(dup)
- if cnt == 0 {
- panic("zero length dup")
- }
- nstart := dup[0]
- nend := dup[cnt-1]
-
- file, err := p.freader.ReadFile(nstart.Filename)
- if err != nil {
- return err
- }
-
- lineStart, _ := blockLines(file, nstart.Pos, nend.End)
- cl := clone{filename: nstart.Filename, lineStart: lineStart}
- start := findLineBeg(file, nstart.Pos)
- content := append(toWhitespace(file[start:nstart.Pos]), file[nstart.Pos:nend.End]...)
- cl.fragment = deindent(content)
- clones[i] = cl
- }
-
- sort.Sort(byNameAndLine(clones))
- for _, cl := range clones {
- fmt.Fprintf(p.writer, "%s:%d \n%s \n", cl.filename, cl.lineStart, cl.fragment)
- }
- return nil
-}
-
-func (*HTMLPrinter) Finish() {}
-
-func findLineBeg(file []byte, index int) int {
- for i := index; i >= 0; i-- {
- if file[i] == '\n' {
- return i + 1
- }
- }
- return 0
-}
-
-func toWhitespace(str []byte) []byte {
- var out []byte
- for _, c := range bytes.Runes(str) {
- if c == '\t' {
- out = append(out, '\t')
- } else {
- out = append(out, ' ')
- }
- }
- return out
-}
-
-func deindent(block []byte) []byte {
- const maxVal = 99
- min := maxVal
- re := regexp.MustCompile(`(^|\n)(\t*)\S`)
- for _, line := range re.FindAllSubmatch(block, -1) {
- indent := line[2]
- if len(indent) < min {
- min = len(indent)
- }
- }
- if min == 0 || min == maxVal {
- return block
- }
- block = block[min:]
-Loop:
- for i := 0; i < len(block); i++ {
- if block[i] == '\n' && i != len(block)-1 {
- for j := 0; j < min; j++ {
- if block[i+j+1] != '\t' {
- continue Loop
- }
- }
- block = append(block[:i+1], block[i+1+min:]...)
- }
- }
- return block
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/plumbing.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/plumbing.go
deleted file mode 100644
index a08326d80..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/plumbing.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package output
-
-import (
- "fmt"
- "io"
- "sort"
-
- "github.com/mibk/dupl/syntax"
-)
-
-type PlumbingPrinter struct {
- *TextPrinter
-}
-
-func NewPlumbingPrinter(w io.Writer, fr FileReader) *PlumbingPrinter {
- return &PlumbingPrinter{NewTextPrinter(w, fr)}
-}
-
-func (p *PlumbingPrinter) Print(dups [][]*syntax.Node) error {
- clones, err := p.prepareClonesInfo(dups)
- if err != nil {
- return err
- }
- sort.Sort(byNameAndLine(clones))
- for i, cl := range clones {
- nextCl := clones[(i+1)%len(clones)]
- fmt.Fprintf(p.writer, "%s:%d-%d: duplicate of %s:%d-%d\n", cl.filename, cl.lineStart, cl.lineEnd,
- nextCl.filename, nextCl.lineStart, nextCl.lineEnd)
- }
- return nil
-}
-
-func (p *PlumbingPrinter) Finish() {}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/text.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/text.go
deleted file mode 100644
index 771df46b9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/output/text.go
+++ /dev/null
@@ -1,109 +0,0 @@
-package output
-
-import (
- "fmt"
- "io"
- "sort"
-
- "github.com/mibk/dupl/syntax"
-)
-
-type FileReader interface {
- ReadFile(filename string) ([]byte, error)
-}
-
-type Printer interface {
- Print(dups [][]*syntax.Node) error
- Finish()
-}
-
-type TextPrinter struct {
- writer io.Writer
- freader FileReader
- cnt int
-}
-
-func NewTextPrinter(w io.Writer, fr FileReader) *TextPrinter {
- return &TextPrinter{
- writer: w,
- freader: fr,
- }
-}
-
-func (p *TextPrinter) Print(dups [][]*syntax.Node) error {
- p.cnt++
- fmt.Fprintf(p.writer, "found %d clones:\n", len(dups))
- clones, err := p.prepareClonesInfo(dups)
- if err != nil {
- return err
- }
- sort.Sort(byNameAndLine(clones))
- for _, cl := range clones {
- fmt.Fprintf(p.writer, " %s:%d,%d\n", cl.filename, cl.lineStart, cl.lineEnd)
- }
- return nil
-}
-
-func (p *TextPrinter) prepareClonesInfo(dups [][]*syntax.Node) ([]clone, error) {
- clones := make([]clone, len(dups))
- for i, dup := range dups {
- cnt := len(dup)
- if cnt == 0 {
- panic("zero length dup")
- }
- nstart := dup[0]
- nend := dup[cnt-1]
-
- file, err := p.freader.ReadFile(nstart.Filename)
- if err != nil {
- return nil, err
- }
-
- cl := clone{filename: nstart.Filename}
- cl.lineStart, cl.lineEnd = blockLines(file, nstart.Pos, nend.End)
- clones[i] = cl
- }
- return clones, nil
-}
-
-func (p *TextPrinter) Finish() {
- fmt.Fprintf(p.writer, "\nFound total %d clone groups.\n", p.cnt)
-}
-
-func blockLines(file []byte, from, to int) (int, int) {
- line := 1
- lineStart, lineEnd := 0, 0
- for offset, b := range file {
- if b == '\n' {
- line++
- }
- if offset == from {
- lineStart = line
- }
- if offset == to-1 {
- lineEnd = line
- break
- }
- }
- return lineStart, lineEnd
-}
-
-type clone struct {
- filename string
- lineStart int
- lineEnd int
- fragment []byte
-}
-
-type byNameAndLine []clone
-
-func (c byNameAndLine) Len() int { return len(c) }
-
-func (c byNameAndLine) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
-
-func (c byNameAndLine) Less(i, j int) bool {
- if c[i].filename == c[j].filename {
- return c[i].lineStart < c[j].lineStart
- }
- return c[i].filename < c[j].filename
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/suffixtree/dupl.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/suffixtree/dupl.go
deleted file mode 100644
index ab145b4f3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/suffixtree/dupl.go
+++ /dev/null
@@ -1,98 +0,0 @@
-package suffixtree
-
-import "sort"
-
-type Match struct {
- Ps []Pos
- Len Pos
-}
-
-type posList struct {
- positions []Pos
-}
-
-func newPosList() *posList {
- return &posList{make([]Pos, 0)}
-}
-
-func (p *posList) append(p2 *posList) {
- p.positions = append(p.positions, p2.positions...)
-}
-
-func (p *posList) add(pos Pos) {
- p.positions = append(p.positions, pos)
-}
-
-type contextList struct {
- lists map[int]*posList
-}
-
-func newContextList() *contextList {
- return &contextList{make(map[int]*posList)}
-}
-
-func (c *contextList) getAll() []Pos {
- keys := make([]int, 0, len(c.lists))
- for k := range c.lists {
- keys = append(keys, k)
- }
- sort.Ints(keys)
- var ps []Pos
- for _, k := range keys {
- ps = append(ps, c.lists[k].positions...)
- }
- return ps
-}
-
-func (c *contextList) append(c2 *contextList) {
- for lc, pl := range c2.lists {
- if _, ok := c.lists[lc]; ok {
- c.lists[lc].append(pl)
- } else {
- c.lists[lc] = pl
- }
- }
-}
-
-// FindDuplOver find pairs of maximal duplicities over a threshold
-// length.
-func (t *STree) FindDuplOver(threshold int) <-chan Match {
- auxTran := newTran(0, 0, t.root)
- ch := make(chan Match)
- go func() {
- walkTrans(auxTran, 0, threshold, ch)
- close(ch)
- }()
- return ch
-}
-
-func walkTrans(parent *tran, length, threshold int, ch chan<- Match) *contextList {
- s := parent.state
-
- cl := newContextList()
-
- if len(s.trans) == 0 {
- pl := newPosList()
- start := parent.end + 1 - Pos(length)
- pl.add(start)
- ch := 0
- if start > 0 {
- ch = s.tree.data[start-1].Val()
- }
- cl.lists[ch] = pl
- return cl
- }
-
- for _, t := range s.trans {
- ln := length + t.len()
- cl2 := walkTrans(t, ln, threshold, ch)
- if ln >= threshold {
- cl.append(cl2)
- }
- }
- if length >= threshold && len(cl.lists) > 1 {
- m := Match{cl.getAll(), Pos(length)}
- ch <- m
- }
- return cl
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/suffixtree/suffixtree.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/suffixtree/suffixtree.go
deleted file mode 100644
index 738015025..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/suffixtree/suffixtree.go
+++ /dev/null
@@ -1,216 +0,0 @@
-package suffixtree
-
-import (
- "bytes"
- "fmt"
- "math"
- "strings"
-)
-
-const infinity = math.MaxInt32
-
-// Pos denotes position in data slice.
-type Pos int32
-
-type Token interface {
- Val() int
-}
-
-// STree is a struct representing a suffix tree.
-type STree struct {
- data []Token
- root *state
- auxState *state // auxiliary state
-
- // active point
- s *state
- start, end Pos
-}
-
-// New creates new suffix tree.
-func New() *STree {
- t := new(STree)
- t.data = make([]Token, 0, 50)
- t.root = newState(t)
- t.auxState = newState(t)
- t.root.linkState = t.auxState
- t.s = t.root
- return t
-}
-
-// Update refreshes the suffix tree to by new data.
-func (t *STree) Update(data ...Token) {
- t.data = append(t.data, data...)
- for _ = range data {
- t.update()
- t.s, t.start = t.canonize(t.s, t.start, t.end)
- t.end++
- }
-}
-
-// update transforms suffix tree T(n) to T(n+1).
-func (t *STree) update() {
- oldr := t.root
-
- // (s, (start, end)) is the canonical reference pair for the active point
- s := t.s
- start, end := t.start, t.end
- var r *state
- for {
- var endPoint bool
- r, endPoint = t.testAndSplit(s, start, end-1)
- if endPoint {
- break
- }
- r.fork(end)
- if oldr != t.root {
- oldr.linkState = r
- }
- oldr = r
- s, start = t.canonize(s.linkState, start, end-1)
- }
- if oldr != t.root {
- oldr.linkState = r
- }
-
- // update active point
- t.s = s
- t.start = start
-}
-
-// testAndSplit tests whether a state with canonical ref. pair
-// (s, (start, end)) is the end point, that is, a state that have
-// a c-transition. If not, then state (exs, (start, end)) is made
-// explicit (if not already so).
-func (t *STree) testAndSplit(s *state, start, end Pos) (exs *state, endPoint bool) {
- c := t.data[t.end]
- if start <= end {
- tr := s.findTran(t.data[start])
- splitPoint := tr.start + end - start + 1
- if t.data[splitPoint].Val() == c.Val() {
- return s, true
- }
- // make the (s, (start, end)) state explicit
- newSt := newState(s.tree)
- newSt.addTran(splitPoint, tr.end, tr.state)
- tr.end = splitPoint - 1
- tr.state = newSt
- return newSt, false
- }
- if s == t.auxState || s.findTran(c) != nil {
- return s, true
- }
- return s, false
-}
-
-// canonize returns updated state and start position for ref. pair
-// (s, (start, end)) of state r so the new ref. pair is canonical,
-// that is, referenced from the closest explicit ancestor of r.
-func (t *STree) canonize(s *state, start, end Pos) (*state, Pos) {
- if s == t.auxState {
- s, start = t.root, start+1
- }
- if start > end {
- return s, start
- }
-
- var tr *tran
- for {
- if start <= end {
- tr = s.findTran(t.data[start])
- if tr == nil {
- panic(fmt.Sprintf("there should be some transition for '%d' at %d",
- t.data[start].Val(), start))
- }
- }
- if tr.end-tr.start > end-start {
- break
- }
- start += tr.end - tr.start + 1
- s = tr.state
- }
- if s == nil {
- panic("there should always be some suffix link resolution")
- }
- return s, start
-}
-
-func (t *STree) At(p Pos) Token {
- if p < 0 || p >= Pos(len(t.data)) {
- panic("position out of bounds")
- }
- return t.data[p]
-}
-
-func (t *STree) String() string {
- buf := new(bytes.Buffer)
- printState(buf, t.root, 0)
- return buf.String()
-}
-
-func printState(buf *bytes.Buffer, s *state, ident int) {
- for _, tr := range s.trans {
- fmt.Fprint(buf, strings.Repeat(" ", ident))
- fmt.Fprintf(buf, "* (%d, %d)\n", tr.start, tr.ActEnd())
- printState(buf, tr.state, ident+1)
- }
-}
-
-// state is an explicit state of the suffix tree.
-type state struct {
- tree *STree
- trans []*tran
- linkState *state
-}
-
-func newState(t *STree) *state {
- return &state{
- tree: t,
- trans: make([]*tran, 0),
- linkState: nil,
- }
-}
-
-func (s *state) addTran(start, end Pos, r *state) {
- s.trans = append(s.trans, newTran(start, end, r))
-}
-
-// fork creates a new branch from the state s.
-func (s *state) fork(i Pos) *state {
- r := newState(s.tree)
- s.addTran(i, infinity, r)
- return r
-}
-
-// findTran finds c-transition.
-func (s *state) findTran(c Token) *tran {
- for _, tran := range s.trans {
- if s.tree.data[tran.start].Val() == c.Val() {
- return tran
- }
- }
- return nil
-}
-
-// tran represents a state's transition.
-type tran struct {
- start, end Pos
- state *state
-}
-
-func newTran(start, end Pos, s *state) *tran {
- return &tran{start, end, s}
-}
-
-func (t *tran) len() int {
- return int(t.end - t.start + 1)
-}
-
-// ActEnd returns actual end position as consistent with
-// the actual length of the data in the STree.
-func (t *tran) ActEnd() Pos {
- if t.end == infinity {
- return Pos(len(t.state.tree.data)) - 1
- }
- return t.end
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/syntax/golang/golang.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/syntax/golang/golang.go
deleted file mode 100644
index 8cc304f48..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/syntax/golang/golang.go
+++ /dev/null
@@ -1,392 +0,0 @@
-package golang
-
-import (
- "go/ast"
- "go/parser"
- "go/token"
-
- "github.com/mibk/dupl/syntax"
-)
-
-const (
- BadNode = iota
- File
- ArrayType
- AssignStmt
- BasicLit
- BinaryExpr
- BlockStmt
- BranchStmt
- CallExpr
- CaseClause
- ChanType
- CommClause
- CompositeLit
- DeclStmt
- DeferStmt
- Ellipsis
- EmptyStmt
- ExprStmt
- Field
- FieldList
- ForStmt
- FuncDecl
- FuncLit
- FuncType
- GenDecl
- GoStmt
- Ident
- IfStmt
- IncDecStmt
- IndexExpr
- InterfaceType
- KeyValueExpr
- LabeledStmt
- MapType
- ParenExpr
- RangeStmt
- ReturnStmt
- SelectStmt
- SelectorExpr
- SendStmt
- SliceExpr
- StarExpr
- StructType
- SwitchStmt
- TypeAssertExpr
- TypeSpec
- TypeSwitchStmt
- UnaryExpr
- ValueSpec
-)
-
-// Parse the given file and return uniform syntax tree.
-func Parse(filename string) (*syntax.Node, error) {
- fset := token.NewFileSet()
- file, err := parser.ParseFile(fset, filename, nil, 0)
- if err != nil {
- return nil, err
- }
- t := &transformer{
- fileset: fset,
- filename: filename,
- }
- return t.trans(file), nil
-}
-
-type transformer struct {
- fileset *token.FileSet
- filename string
-}
-
-// trans transforms given golang AST to uniform tree structure.
-func (t *transformer) trans(node ast.Node) (o *syntax.Node) {
- o = syntax.NewNode()
- o.Filename = t.filename
- st, end := node.Pos(), node.End()
- o.Pos, o.End = t.fileset.File(st).Offset(st), t.fileset.File(end).Offset(end)
-
- switch n := node.(type) {
- case *ast.ArrayType:
- o.Type = ArrayType
- if n.Len != nil {
- o.AddChildren(t.trans(n.Len))
- }
- o.AddChildren(t.trans(n.Elt))
-
- case *ast.AssignStmt:
- o.Type = AssignStmt
- for _, e := range n.Rhs {
- o.AddChildren(t.trans(e))
- }
-
- for _, e := range n.Lhs {
- o.AddChildren(t.trans(e))
- }
-
- case *ast.BasicLit:
- o.Type = BasicLit
-
- case *ast.BinaryExpr:
- o.Type = BinaryExpr
- o.AddChildren(t.trans(n.X), t.trans(n.Y))
-
- case *ast.BlockStmt:
- o.Type = BlockStmt
- for _, stmt := range n.List {
- o.AddChildren(t.trans(stmt))
- }
-
- case *ast.BranchStmt:
- o.Type = BranchStmt
- if n.Label != nil {
- o.AddChildren(t.trans(n.Label))
- }
-
- case *ast.CallExpr:
- o.Type = CallExpr
- o.AddChildren(t.trans(n.Fun))
- for _, arg := range n.Args {
- o.AddChildren(t.trans(arg))
- }
-
- case *ast.CaseClause:
- o.Type = CaseClause
- for _, e := range n.List {
- o.AddChildren(t.trans(e))
- }
- for _, stmt := range n.Body {
- o.AddChildren(t.trans(stmt))
- }
-
- case *ast.ChanType:
- o.Type = ChanType
- o.AddChildren(t.trans(n.Value))
-
- case *ast.CommClause:
- o.Type = CommClause
- if n.Comm != nil {
- o.AddChildren(t.trans(n.Comm))
- }
- for _, stmt := range n.Body {
- o.AddChildren(t.trans(stmt))
- }
-
- case *ast.CompositeLit:
- o.Type = CompositeLit
- if n.Type != nil {
- o.AddChildren(t.trans(n.Type))
- }
- for _, e := range n.Elts {
- o.AddChildren(t.trans(e))
- }
-
- case *ast.DeclStmt:
- o.Type = DeclStmt
- o.AddChildren(t.trans(n.Decl))
-
- case *ast.DeferStmt:
- o.Type = DeferStmt
- o.AddChildren(t.trans(n.Call))
-
- case *ast.Ellipsis:
- o.Type = Ellipsis
- if n.Elt != nil {
- o.AddChildren(t.trans(n.Elt))
- }
-
- case *ast.EmptyStmt:
- o.Type = EmptyStmt
-
- case *ast.ExprStmt:
- o.Type = ExprStmt
- o.AddChildren(t.trans(n.X))
-
- case *ast.Field:
- o.Type = Field
- for _, name := range n.Names {
- o.AddChildren(t.trans(name))
- }
- o.AddChildren(t.trans(n.Type))
-
- case *ast.FieldList:
- o.Type = FieldList
- for _, field := range n.List {
- o.AddChildren(t.trans(field))
- }
-
- case *ast.File:
- o.Type = File
- for _, decl := range n.Decls {
- if genDecl, ok := decl.(*ast.GenDecl); ok && genDecl.Tok == token.IMPORT {
- // skip import declarations
- continue
- }
- o.AddChildren(t.trans(decl))
- }
-
- case *ast.ForStmt:
- o.Type = ForStmt
- if n.Init != nil {
- o.AddChildren(t.trans(n.Init))
- }
- if n.Cond != nil {
- o.AddChildren(t.trans(n.Cond))
- }
- if n.Post != nil {
- o.AddChildren(t.trans(n.Post))
- }
- o.AddChildren(t.trans(n.Body))
-
- case *ast.FuncDecl:
- o.Type = FuncDecl
- if n.Recv != nil {
- o.AddChildren(t.trans(n.Recv))
- }
- o.AddChildren(t.trans(n.Name), t.trans(n.Type))
- if n.Body != nil {
- o.AddChildren(t.trans(n.Body))
- }
-
- case *ast.FuncLit:
- o.Type = FuncLit
- o.AddChildren(t.trans(n.Type), t.trans(n.Body))
-
- case *ast.FuncType:
- o.Type = FuncType
- o.AddChildren(t.trans(n.Params))
- if n.Results != nil {
- o.AddChildren(t.trans(n.Results))
- }
-
- case *ast.GenDecl:
- o.Type = GenDecl
- for _, spec := range n.Specs {
- o.AddChildren(t.trans(spec))
- }
-
- case *ast.GoStmt:
- o.Type = GoStmt
- o.AddChildren(t.trans(n.Call))
-
- case *ast.Ident:
- o.Type = Ident
-
- case *ast.IfStmt:
- o.Type = IfStmt
- if n.Init != nil {
- o.AddChildren(t.trans(n.Init))
- }
- o.AddChildren(t.trans(n.Cond), t.trans(n.Body))
- if n.Else != nil {
- o.AddChildren(t.trans(n.Else))
- }
-
- case *ast.IncDecStmt:
- o.Type = IncDecStmt
- o.AddChildren(t.trans(n.X))
-
- case *ast.IndexExpr:
- o.Type = IndexExpr
- o.AddChildren(t.trans(n.X), t.trans(n.Index))
-
- case *ast.InterfaceType:
- o.Type = InterfaceType
- o.AddChildren(t.trans(n.Methods))
-
- case *ast.KeyValueExpr:
- o.Type = KeyValueExpr
- o.AddChildren(t.trans(n.Key), t.trans(n.Value))
-
- case *ast.LabeledStmt:
- o.Type = LabeledStmt
- o.AddChildren(t.trans(n.Label), t.trans(n.Stmt))
-
- case *ast.MapType:
- o.Type = MapType
- o.AddChildren(t.trans(n.Key), t.trans(n.Value))
-
- case *ast.ParenExpr:
- o.Type = ParenExpr
- o.AddChildren(t.trans(n.X))
-
- case *ast.RangeStmt:
- o.Type = RangeStmt
- if n.Key != nil {
- o.AddChildren(t.trans(n.Key))
- }
- if n.Value != nil {
- o.AddChildren(t.trans(n.Value))
- }
- o.AddChildren(t.trans(n.X), t.trans(n.Body))
-
- case *ast.ReturnStmt:
- o.Type = ReturnStmt
- for _, e := range n.Results {
- o.AddChildren(t.trans(e))
- }
-
- case *ast.SelectStmt:
- o.Type = SelectStmt
- o.AddChildren(t.trans(n.Body))
-
- case *ast.SelectorExpr:
- o.Type = SelectorExpr
- o.AddChildren(t.trans(n.X), t.trans(n.Sel))
-
- case *ast.SendStmt:
- o.Type = SendStmt
- o.AddChildren(t.trans(n.Chan), t.trans(n.Value))
-
- case *ast.SliceExpr:
- o.Type = SliceExpr
- o.AddChildren(t.trans(n.X))
- if n.Low != nil {
- o.AddChildren(t.trans(n.Low))
- }
- if n.High != nil {
- o.AddChildren(t.trans(n.High))
- }
- if n.Max != nil {
- o.AddChildren(t.trans(n.Max))
- }
-
- case *ast.StarExpr:
- o.Type = StarExpr
- o.AddChildren(t.trans(n.X))
-
- case *ast.StructType:
- o.Type = StructType
- o.AddChildren(t.trans(n.Fields))
-
- case *ast.SwitchStmt:
- o.Type = SwitchStmt
- if n.Init != nil {
- o.AddChildren(t.trans(n.Init))
- }
- if n.Tag != nil {
- o.AddChildren(t.trans(n.Tag))
- }
- o.AddChildren(t.trans(n.Body))
-
- case *ast.TypeAssertExpr:
- o.Type = TypeAssertExpr
- o.AddChildren(t.trans(n.X))
- if n.Type != nil {
- o.AddChildren(t.trans(n.Type))
- }
-
- case *ast.TypeSpec:
- o.Type = TypeSpec
- o.AddChildren(t.trans(n.Name), t.trans(n.Type))
-
- case *ast.TypeSwitchStmt:
- o.Type = TypeSwitchStmt
- if n.Init != nil {
- o.AddChildren(t.trans(n.Init))
- }
- o.AddChildren(t.trans(n.Assign), t.trans(n.Body))
-
- case *ast.UnaryExpr:
- o.Type = UnaryExpr
- o.AddChildren(t.trans(n.X))
-
- case *ast.ValueSpec:
- o.Type = ValueSpec
- for _, name := range n.Names {
- o.AddChildren(t.trans(name))
- }
- if n.Type != nil {
- o.AddChildren(t.trans(n.Type))
- }
- for _, val := range n.Values {
- o.AddChildren(t.trans(val))
- }
-
- default:
- o.Type = BadNode
-
- }
-
- return o
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/syntax/syntax.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/syntax/syntax.go
deleted file mode 100644
index 9d737b68e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/mibk/dupl/syntax/syntax.go
+++ /dev/null
@@ -1,175 +0,0 @@
-package syntax
-
-import (
- "crypto/sha1"
-
- "github.com/mibk/dupl/suffixtree"
-)
-
-type Node struct {
- Type int
- Filename string
- Pos, End int
- Children []*Node
- Owns int
-}
-
-func NewNode() *Node {
- return &Node{}
-}
-
-func (n *Node) AddChildren(children ...*Node) {
- n.Children = append(n.Children, children...)
-}
-
-func (n *Node) Val() int {
- return n.Type
-}
-
-type Match struct {
- Hash string
- Frags [][]*Node
-}
-
-func Serialize(n *Node) []*Node {
- stream := make([]*Node, 0, 10)
- serial(n, &stream)
- return stream
-}
-
-func serial(n *Node, stream *[]*Node) int {
- *stream = append(*stream, n)
- var count int
- for _, child := range n.Children {
- count += serial(child, stream)
- }
- n.Owns = count
- return count + 1
-}
-
-// FindSyntaxUnits finds all complete syntax units in the match group and returns them
-// with the corresponding hash.
-func FindSyntaxUnits(data []*Node, m suffixtree.Match, threshold int) Match {
- if len(m.Ps) == 0 {
- return Match{}
- }
- firstSeq := data[m.Ps[0] : m.Ps[0]+m.Len]
- indexes := getUnitsIndexes(firstSeq, threshold)
-
- // TODO: is this really working?
- indexCnt := len(indexes)
- if indexCnt > 0 {
- lasti := indexes[indexCnt-1]
- firstn := firstSeq[lasti]
- for i := 1; i < len(m.Ps); i++ {
- n := data[int(m.Ps[i])+lasti]
- if firstn.Owns != n.Owns {
- indexes = indexes[:indexCnt-1]
- break
- }
- }
- }
- if len(indexes) == 0 || isCyclic(indexes, firstSeq) || spansMultipleFiles(indexes, firstSeq) {
- return Match{}
- }
-
- match := Match{Frags: make([][]*Node, len(m.Ps))}
- for i, pos := range m.Ps {
- match.Frags[i] = make([]*Node, len(indexes))
- for j, index := range indexes {
- match.Frags[i][j] = data[int(pos)+index]
- }
- }
-
- lastIndex := indexes[len(indexes)-1]
- match.Hash = hashSeq(firstSeq[indexes[0] : lastIndex+firstSeq[lastIndex].Owns])
- return match
-}
-
-func getUnitsIndexes(nodeSeq []*Node, threshold int) []int {
- var indexes []int
- var split bool
- for i := 0; i < len(nodeSeq); {
- n := nodeSeq[i]
- switch {
- case n.Owns >= len(nodeSeq)-i:
- // not complete syntax unit
- i++
- split = true
- continue
- case n.Owns+1 < threshold:
- split = true
- default:
- if split {
- indexes = indexes[:0]
- split = false
- }
- indexes = append(indexes, i)
- }
- i += n.Owns + 1
- }
- return indexes
-}
-
-// isCyclic finds out whether there is a repetive pattern in the found clone. If positive,
-// it return false to point out that the clone would be redundant.
-func isCyclic(indexes []int, nodes []*Node) bool {
- cnt := len(indexes)
- if cnt <= 1 {
- return false
- }
-
- alts := make(map[int]bool)
- for i := 1; i <= cnt/2; i++ {
- if cnt%i == 0 {
- alts[i] = true
- }
- }
-
- for i := 0; i < indexes[cnt/2]; i++ {
- nstart := nodes[i+indexes[0]]
- AltLoop:
- for alt := range alts {
- for j := alt; j < cnt; j += alt {
- index := i + indexes[j]
- if index < len(nodes) {
- nalt := nodes[index]
- if nstart.Owns == nalt.Owns && nstart.Type == nalt.Type {
- continue
- }
- } else if i >= indexes[alt] {
- return true
- }
- delete(alts, alt)
- continue AltLoop
- }
- }
- if len(alts) == 0 {
- return false
- }
- }
- return true
-}
-
-func spansMultipleFiles(indexes []int, nodes []*Node) bool {
- if len(indexes) < 2 {
- return false
- }
- f := nodes[indexes[0]].Filename
- for i := 1; i < len(indexes); i++ {
- if nodes[indexes[i]].Filename != f {
- return true
- }
- }
- return false
-}
-
-func hashSeq(nodes []*Node) string {
- h := sha1.New()
- bytes := make([]byte, len(nodes))
- for i, node := range nodes {
- bytes[i] = byte(node.Type)
- }
- h.Write(bytes)
- return string(h.Sum(nil))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/LICENSE
deleted file mode 100644
index 5a1774b8e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
-GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. {http://fsf.org/}
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- {one line to give the program's name and a brief idea of what it does.}
- Copyright (C) {year} {name of author}
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see {http://www.gnu.org/licenses/}.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- opennota Copyright (C) 2013 opennota
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-{http://www.gnu.org/licenses/}.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-{http://www.gnu.org/philosophy/why-not-lgpl.html}.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/aligncheck/aligncheck.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/aligncheck/aligncheck.go
deleted file mode 100644
index 8384d505f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/aligncheck/aligncheck.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-package main
-
-import (
- "flag"
- "fmt"
- "go/build"
- "log"
- "os"
- "sort"
- "unsafe"
-
- "github.com/kisielk/gotool"
- "golang.org/x/tools/go/loader"
- "go/types"
-)
-
-var stdSizes = types.StdSizes{
- WordSize: int64(unsafe.Sizeof(int(0))),
- MaxAlign: 8,
-}
-
-func main() {
- flag.Parse()
- exitStatus := 0
-
- importPaths := gotool.ImportPaths(flag.Args())
- if len(importPaths) == 0 {
- importPaths = []string{"."}
- }
-
- ctx := build.Default
- loadcfg := loader.Config{
- Build: &ctx,
- }
- rest, err := loadcfg.FromArgs(importPaths, false)
- if err != nil {
- log.Fatalf("could not parse arguments: %s", err)
- }
- if len(rest) > 0 {
- log.Fatalf("unhandled extra arguments: %v", rest)
- }
-
- program, err := loadcfg.Load()
- if err != nil {
- log.Fatalf("could not type check: %s", err)
- }
-
- var lines []string
-
- for _, pkgInfo := range program.InitialPackages() {
- for _, obj := range pkgInfo.Defs {
- if obj == nil {
- continue
- }
-
- if _, ok := obj.(*types.TypeName); !ok {
- continue
- }
-
- typ, ok := obj.Type().(*types.Named)
- if !ok {
- continue
- }
-
- strukt, ok := typ.Underlying().(*types.Struct)
- if !ok {
- continue
- }
-
- structAlign := int(stdSizes.Alignof(strukt))
- structSize := int(stdSizes.Sizeof(strukt))
- if structSize%structAlign != 0 {
- structSize += structAlign - structSize%structAlign
- }
-
- minSize := 0
- for i := 0; i < strukt.NumFields(); i++ {
- field := strukt.Field(i)
- fieldType := field.Type()
- typeSize := int(stdSizes.Sizeof(fieldType))
- minSize += typeSize
- }
- if minSize%structAlign != 0 {
- minSize += structAlign - minSize%structAlign
- }
-
- if minSize != structSize {
- pos := program.Fset.Position(obj.Pos())
- lines = append(lines, fmt.Sprintf(
- "%s: %s:%d:%d: struct %s could have size %d (currently %d)",
- obj.Pkg().Path(),
- pos.Filename,
- pos.Line,
- pos.Column,
- obj.Name(),
- minSize,
- structSize,
- ))
- exitStatus = 1
- }
- }
- }
-
- sort.Strings(lines)
- for _, line := range lines {
- fmt.Println(line)
- }
-
- os.Exit(exitStatus)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/structcheck/structcheck.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/structcheck/structcheck.go
deleted file mode 100644
index 9e91df53e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/structcheck/structcheck.go
+++ /dev/null
@@ -1,219 +0,0 @@
-// structcheck
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-package main
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/types"
- "os"
- "strings"
-
- "github.com/kisielk/gotool"
- "golang.org/x/tools/go/loader"
-)
-
-var (
- assignmentsOnly = flag.Bool("a", false, "Count assignments only")
- loadTestFiles = flag.Bool("t", false, "Load test files too")
- reportExported = flag.Bool("e", false, "Report exported fields")
- buildTags = flag.String("tags", "", "Build tags")
-)
-
-type visitor struct {
- prog *loader.Program
- pkg *loader.PackageInfo
- m map[types.Type]map[string]int
- skip map[types.Type]struct{}
-}
-
-func (v *visitor) decl(t types.Type, fieldName string) {
- if _, ok := v.m[t]; !ok {
- v.m[t] = make(map[string]int)
- }
- if _, ok := v.m[t][fieldName]; !ok {
- v.m[t][fieldName] = 0
- }
-}
-
-func (v *visitor) assignment(t types.Type, fieldName string) {
- if _, ok := v.m[t]; !ok {
- v.m[t] = make(map[string]int)
- }
- if _, ok := v.m[t][fieldName]; ok {
- v.m[t][fieldName]++
- } else {
- v.m[t][fieldName] = 1
- }
-}
-
-func (v *visitor) typeSpec(node *ast.TypeSpec) {
- if strukt, ok := node.Type.(*ast.StructType); ok {
- t := v.pkg.Info.Defs[node.Name].Type()
- for _, f := range strukt.Fields.List {
- if len(f.Names) > 0 {
- fieldName := f.Names[0].Name
- v.decl(t, fieldName)
- }
- }
- }
-}
-
-func (v *visitor) typeAndFieldName(expr *ast.SelectorExpr) (types.Type, string, bool) {
- selection := v.pkg.Info.Selections[expr]
- if selection == nil {
- return nil, "", false
- }
- recv := selection.Recv()
- if ptr, ok := recv.(*types.Pointer); ok {
- recv = ptr.Elem()
- }
- return recv, selection.Obj().Name(), true
-}
-
-func (v *visitor) assignStmt(node *ast.AssignStmt) {
- for _, lhs := range node.Lhs {
- var selector *ast.SelectorExpr
- switch expr := lhs.(type) {
- case *ast.SelectorExpr:
- selector = expr
- case *ast.IndexExpr:
- if expr, ok := expr.X.(*ast.SelectorExpr); ok {
- selector = expr
- }
- }
- if selector != nil {
- if t, fn, ok := v.typeAndFieldName(selector); ok {
- v.assignment(t, fn)
- }
- }
- }
-}
-
-func (v *visitor) compositeLiteral(node *ast.CompositeLit) {
- t := v.pkg.Info.Types[node.Type].Type
- for _, expr := range node.Elts {
- if kv, ok := expr.(*ast.KeyValueExpr); ok {
- if ident, ok := kv.Key.(*ast.Ident); ok {
- v.assignment(t, ident.Name)
- }
- } else {
- // Struct literal with positional values.
- // All the fields are assigned.
- v.skip[t] = struct{}{}
- break
- }
- }
-}
-
-func (v *visitor) Visit(node ast.Node) ast.Visitor {
- switch node := node.(type) {
- case *ast.TypeSpec:
- v.typeSpec(node)
-
- case *ast.AssignStmt:
- if *assignmentsOnly {
- v.assignStmt(node)
- }
-
- case *ast.SelectorExpr:
- if !*assignmentsOnly {
- if t, fn, ok := v.typeAndFieldName(node); ok {
- v.assignment(t, fn)
- }
- }
-
- case *ast.CompositeLit:
- v.compositeLiteral(node)
- }
-
- return v
-}
-
-func main() {
- flag.Parse()
- exitStatus := 0
- importPaths := gotool.ImportPaths(flag.Args())
- if len(importPaths) == 0 {
- importPaths = []string{"."}
- }
- ctx := build.Default
- if *buildTags != "" {
- ctx.BuildTags = strings.Split(*buildTags, ",")
- }
- loadcfg := loader.Config{
- Build: &ctx,
- }
- rest, err := loadcfg.FromArgs(importPaths, *loadTestFiles)
- if err != nil {
- fmt.Fprintf(os.Stderr, "could not parse arguments: %s", err)
- os.Exit(1)
- }
- if len(rest) > 0 {
- fmt.Fprintf(os.Stderr, "unhandled extra arguments: %v", rest)
- os.Exit(1)
- }
-
- program, err := loadcfg.Load()
- if err != nil {
- fmt.Fprintf(os.Stderr, "could not type check: %s", err)
- os.Exit(1)
- }
-
- for _, pkg := range program.InitialPackages() {
- visitor := &visitor{
- m: make(map[types.Type]map[string]int),
- skip: make(map[types.Type]struct{}),
- prog: program,
- pkg: pkg,
- }
- for _, f := range pkg.Files {
- ast.Walk(visitor, f)
- }
-
- for t := range visitor.m {
- if _, skip := visitor.skip[t]; skip {
- continue
- }
- for fieldName, v := range visitor.m[t] {
- if !*reportExported && ast.IsExported(fieldName) {
- continue
- }
- if v == 0 {
- field, _, _ := types.LookupFieldOrMethod(t, false, pkg.Pkg, fieldName)
- if field == nil {
- fmt.Printf("%s: unknown field or method: %s.%s\n", pkg.Pkg.Path(), t, fieldName)
- exitStatus = 1
- continue
- }
- if fieldName == "XMLName" {
- if named, ok := field.Type().(*types.Named); ok && named.Obj().Pkg().Path() == "encoding/xml" {
- continue
- }
- }
- pos := program.Fset.Position(field.Pos())
- fmt.Printf("%s: %s:%d:%d: %s.%s\n",
- pkg.Pkg.Path(), pos.Filename, pos.Line, pos.Column,
- types.TypeString(t, nil), fieldName,
- )
- exitStatus = 1
- }
- }
- }
- }
- os.Exit(exitStatus)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/varcheck/varcheck.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/varcheck/varcheck.go
deleted file mode 100644
index 761adfb93..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/cmd/varcheck/varcheck.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-package main
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/token"
- "log"
- "os"
- "sort"
- "strings"
-
- "github.com/kisielk/gotool"
- "golang.org/x/tools/go/loader"
- "go/types"
-)
-
-var (
- reportExported = flag.Bool("e", false, "Report exported variables and constants")
-)
-
-type object struct {
- pkgPath string
- name string
-}
-
-type visitor struct {
- prog *loader.Program
- pkg *loader.PackageInfo
- uses map[object]int
- positions map[object]token.Position
- insideFunc bool
-}
-
-func getKey(obj types.Object) object {
- if obj == nil {
- return object{}
- }
-
- pkg := obj.Pkg()
- pkgPath := ""
- if pkg != nil {
- pkgPath = pkg.Path()
- }
-
- return object{
- pkgPath: pkgPath,
- name: obj.Name(),
- }
-}
-
-func (v *visitor) decl(obj types.Object) {
- key := getKey(obj)
- if _, ok := v.uses[key]; !ok {
- v.uses[key] = 0
- }
- if _, ok := v.positions[key]; !ok {
- v.positions[key] = v.prog.Fset.Position(obj.Pos())
- }
-}
-
-func (v *visitor) use(obj types.Object) {
- key := getKey(obj)
- if _, ok := v.uses[key]; ok {
- v.uses[key]++
- } else {
- v.uses[key] = 1
- }
-}
-
-func isReserved(name string) bool {
- return name == "_" || strings.HasPrefix(strings.ToLower(name), "_cgo_")
-}
-
-func (v *visitor) Visit(node ast.Node) ast.Visitor {
- switch node := node.(type) {
- case *ast.Ident:
- v.use(v.pkg.Info.Uses[node])
-
- case *ast.ValueSpec:
- if !v.insideFunc {
- for _, ident := range node.Names {
- if !isReserved(ident.Name) {
- v.decl(v.pkg.Info.Defs[ident])
- }
- }
- }
- for _, val := range node.Values {
- ast.Walk(v, val)
- }
- if node.Type != nil {
- ast.Walk(v, node.Type)
- }
- return nil
-
- case *ast.FuncDecl:
- if node.Body != nil {
- v.insideFunc = true
- ast.Walk(v, node.Body)
- v.insideFunc = false
- }
-
- if node.Recv != nil {
- ast.Walk(v, node.Recv)
- }
- if node.Type != nil {
- ast.Walk(v, node.Type)
- }
-
- return nil
- }
-
- return v
-}
-
-func main() {
- flag.Parse()
- exitStatus := 0
- importPaths := gotool.ImportPaths(flag.Args())
- if len(importPaths) == 0 {
- importPaths = []string{"."}
- }
-
- ctx := build.Default
- loadcfg := loader.Config{
- Build: &ctx,
- }
- rest, err := loadcfg.FromArgs(importPaths, true)
- if err != nil {
- log.Fatalf("could not parse arguments: %s", err)
- }
- if len(rest) > 0 {
- log.Fatalf("unhandled extra arguments: %v", rest)
- }
-
- program, err := loadcfg.Load()
- if err != nil {
- log.Fatalf("could not type check: %s", err)
- }
-
- uses := make(map[object]int)
- positions := make(map[object]token.Position)
-
- for _, pkgInfo := range program.InitialPackages() {
- if pkgInfo.Pkg.Path() == "unsafe" {
- continue
- }
-
- v := &visitor{
- prog: program,
- pkg: pkgInfo,
- uses: uses,
- positions: positions,
- }
-
- for _, f := range v.pkg.Files {
- ast.Walk(v, f)
- }
- }
-
- var lines []string
-
- for obj, useCount := range uses {
- if useCount == 0 && (*reportExported || !ast.IsExported(obj.name)) {
- pos := positions[obj]
- lines = append(lines, fmt.Sprintf("%s: %s:%d:%d: %s", obj.pkgPath, pos.Filename, pos.Line, pos.Column, obj.name))
- exitStatus = 1
- }
- }
-
- sort.Strings(lines)
- for _, line := range lines {
- fmt.Println(line)
- }
-
- os.Exit(exitStatus)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/common.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/common.go
deleted file mode 100644
index 424d5ec59..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/opennota/check/common.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-
-package check
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/LICENSE
deleted file mode 100644
index adec63a55..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015- Stripe, Inc. (https://stripe.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/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/package15.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/package15.go
deleted file mode 100644
index 4c05efc12..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/package15.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build !go1.6
-
-package main
-
-import "os"
-
-var useVendor = os.Getenv("GO15VENDOREXPERIMENT") == "1"
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/package16.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/package16.go
deleted file mode 100644
index 409faafe1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/package16.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build go1.6
-
-package main
-
-import "os"
-
-var useVendor = os.Getenv("GO15VENDOREXPERIMENT") == "0" || os.Getenv("GO15VENDOREXPERIMENT") == ""
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/safesql.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/safesql.go
deleted file mode 100644
index 307187984..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/stripe/safesql/safesql.go
+++ /dev/null
@@ -1,248 +0,0 @@
-// Command safesql is a tool for performing static analysis on programs to
-// ensure that SQL injection attacks are not possible. It does this by ensuring
-// package database/sql is only used with compile-time constant queries.
-package main
-
-import (
- "flag"
- "fmt"
- "go/build"
- "go/types"
- "os"
- "path/filepath"
- "strings"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/pointer"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-func main() {
- var verbose, quiet bool
- flag.BoolVar(&verbose, "v", false, "Verbose mode")
- flag.BoolVar(&quiet, "q", false, "Only print on failure")
- flag.Usage = func() {
- fmt.Fprintf(os.Stderr, "Usage: %s [-q] [-v] package1 [package2 ...]\n", os.Args[0])
- flag.PrintDefaults()
- }
-
- flag.Parse()
- pkgs := flag.Args()
- if len(pkgs) == 0 {
- flag.Usage()
- os.Exit(2)
- }
-
- c := loader.Config{
- FindPackage: FindPackage,
- }
- c.Import("database/sql")
- for _, pkg := range pkgs {
- c.Import(pkg)
- }
- p, err := c.Load()
- if err != nil {
- fmt.Printf("error loading packages %v: %v\n", pkgs, err)
- os.Exit(2)
- }
- s := ssautil.CreateProgram(p, 0)
- s.Build()
-
- qms := FindQueryMethods(p.Package("database/sql").Pkg, s)
- if verbose {
- fmt.Println("database/sql functions that accept queries:")
- for _, m := range qms {
- fmt.Printf("- %s (param %d)\n", m.Func, m.Param)
- }
- fmt.Println()
- }
-
- mains := FindMains(p, s)
- if len(mains) == 0 {
- fmt.Println("Did not find any commands (i.e., main functions).")
- os.Exit(2)
- }
-
- res, err := pointer.Analyze(&pointer.Config{
- Mains: mains,
- BuildCallGraph: true,
- })
- if err != nil {
- fmt.Printf("error performing pointer analysis: %v\n", err)
- os.Exit(2)
- }
-
- bad := FindNonConstCalls(res.CallGraph, qms)
- if len(bad) == 0 {
- if !quiet {
- fmt.Println(`You're safe from SQL injection! Yay \o/`)
- }
- return
- }
-
- fmt.Printf("Found %d potentially unsafe SQL statements:\n", len(bad))
- for _, ci := range bad {
- pos := p.Fset.Position(ci.Pos())
- fmt.Printf("- %s\n", pos)
- }
- fmt.Println("Please ensure that all SQL queries you use are compile-time constants.")
- fmt.Println("You should always use parameterized queries or prepared statements")
- fmt.Println("instead of building queries from strings.")
- os.Exit(1)
-}
-
-// QueryMethod represents a method on a type which has a string parameter named
-// "query".
-type QueryMethod struct {
- Func *types.Func
- SSA *ssa.Function
- ArgCount int
- Param int
-}
-
-// FindQueryMethods locates all methods in the given package (assumed to be
-// package database/sql) with a string parameter named "query".
-func FindQueryMethods(sql *types.Package, ssa *ssa.Program) []*QueryMethod {
- methods := make([]*QueryMethod, 0)
- scope := sql.Scope()
- for _, name := range scope.Names() {
- o := scope.Lookup(name)
- if !o.Exported() {
- continue
- }
- if _, ok := o.(*types.TypeName); !ok {
- continue
- }
- n := o.Type().(*types.Named)
- for i := 0; i < n.NumMethods(); i++ {
- m := n.Method(i)
- if !m.Exported() {
- continue
- }
- s := m.Type().(*types.Signature)
- if num, ok := FuncHasQuery(s); ok {
- methods = append(methods, &QueryMethod{
- Func: m,
- SSA: ssa.FuncValue(m),
- ArgCount: s.Params().Len(),
- Param: num,
- })
- }
- }
- }
- return methods
-}
-
-var stringType types.Type = types.Typ[types.String]
-
-// FuncHasQuery returns the offset of the string parameter named "query", or
-// none if no such parameter exists.
-func FuncHasQuery(s *types.Signature) (offset int, ok bool) {
- params := s.Params()
- for i := 0; i < params.Len(); i++ {
- v := params.At(i)
- if v.Name() == "query" && v.Type() == stringType {
- return i, true
- }
- }
- return 0, false
-}
-
-// FindMains returns the set of all packages loaded into the given
-// loader.Program which contain main functions
-func FindMains(p *loader.Program, s *ssa.Program) []*ssa.Package {
- ips := p.InitialPackages()
- mains := make([]*ssa.Package, 0, len(ips))
- for _, info := range ips {
- ssaPkg := s.Package(info.Pkg)
- if ssaPkg.Func("main") != nil {
- mains = append(mains, ssaPkg)
- }
- }
- return mains
-}
-
-// FindNonConstCalls returns the set of callsites of the given set of methods
-// for which the "query" parameter is not a compile-time constant.
-func FindNonConstCalls(cg *callgraph.Graph, qms []*QueryMethod) []ssa.CallInstruction {
- cg.DeleteSyntheticNodes()
-
- // package database/sql has a couple helper functions which are thin
- // wrappers around other sensitive functions. Instead of handling the
- // general case by tracing down callsites of wrapper functions
- // recursively, let's just whitelist the functions we're already
- // tracking, since it happens to be good enough for our use case.
- okFuncs := make(map[*ssa.Function]struct{}, len(qms))
- for _, m := range qms {
- okFuncs[m.SSA] = struct{}{}
- }
-
- bad := make([]ssa.CallInstruction, 0)
- for _, m := range qms {
- node := cg.CreateNode(m.SSA)
- for _, edge := range node.In {
- if _, ok := okFuncs[edge.Site.Parent()]; ok {
- continue
- }
- cc := edge.Site.Common()
- args := cc.Args
- // The first parameter is occasionally the receiver.
- if len(args) == m.ArgCount+1 {
- args = args[1:]
- } else if len(args) != m.ArgCount {
- panic("arg count mismatch")
- }
- v := args[m.Param]
- if _, ok := v.(*ssa.Const); !ok {
- bad = append(bad, edge.Site)
- }
- }
- }
-
- return bad
-}
-
-// Deal with GO15VENDOREXPERIMENT
-func FindPackage(ctxt *build.Context, path, dir string, mode build.ImportMode) (*build.Package, error) {
- if !useVendor {
- return ctxt.Import(path, dir, mode)
- }
-
- // First, walk up the filesystem from dir looking for vendor directories
- var vendorDir string
- for tmp := dir; vendorDir == "" && tmp != "/"; tmp = filepath.Dir(tmp) {
- dname := filepath.Join(tmp, "vendor", filepath.FromSlash(path))
- fd, err := os.Open(dname)
- if err != nil {
- continue
- }
- // Directories are only valid if they contain at least one file
- // with suffix ".go" (this also ensures that the file descriptor
- // we have is in fact a directory)
- names, err := fd.Readdirnames(-1)
- if err != nil {
- continue
- }
- for _, name := range names {
- if strings.HasSuffix(name, ".go") {
- vendorDir = filepath.ToSlash(dname)
- break
- }
- }
- }
-
- if vendorDir != "" {
- pkg, err := ctxt.ImportDir(vendorDir, mode)
- if err != nil {
- return nil, err
- }
- // Go tries to derive a valid import path for the package, but
- // it's wrong (it includes "/vendor/"). Overwrite it here.
- pkg.ImportPath = path
- return pkg, nil
- }
-
- return ctxt.Import(path, dir, mode)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/tsenart/deadcode/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/tsenart/deadcode/LICENSE
deleted file mode 100644
index cc42dd45d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/tsenart/deadcode/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2012 Rémy Oudompheng. 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 Rémy Oudompheng 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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/tsenart/deadcode/deadcode.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/tsenart/deadcode/deadcode.go
deleted file mode 100644
index 25b0850c0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/tsenart/deadcode/deadcode.go
+++ /dev/null
@@ -1,179 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "os"
- "sort"
- "strings"
-)
-
-var exitCode int
-
-func main() {
- flag.Parse()
- if flag.NArg() == 0 {
- doDir(".")
- } else {
- for _, name := range flag.Args() {
- // Is it a directory?
- if fi, err := os.Stat(name); err == nil && fi.IsDir() {
- doDir(name)
- } else {
- errorf("not a directory: %s", name)
- }
- }
- }
- os.Exit(exitCode)
-}
-
-// error formats the error to standard error, adding program
-// identification and a newline
-func errorf(format string, args ...interface{}) {
- fmt.Fprintf(os.Stderr, "deadcode: "+format+"\n", args...)
- exitCode = 2
-}
-
-func doDir(name string) {
- notests := func(info os.FileInfo) bool {
- if !info.IsDir() && strings.HasSuffix(info.Name(), ".go") &&
- !strings.HasSuffix(info.Name(), "_test.go") {
- return true
- }
- return false
- }
- fs := token.NewFileSet()
- pkgs, err := parser.ParseDir(fs, name, notests, parser.Mode(0))
- if err != nil {
- errorf("%s", err)
- return
- }
- for _, pkg := range pkgs {
- doPackage(fs, pkg)
- }
-}
-
-type Package struct {
- p *ast.Package
- fs *token.FileSet
- decl map[string]ast.Node
- used map[string]bool
-}
-
-func doPackage(fs *token.FileSet, pkg *ast.Package) {
- p := &Package{
- p: pkg,
- fs: fs,
- decl: make(map[string]ast.Node),
- used: make(map[string]bool),
- }
- for _, file := range pkg.Files {
- for _, decl := range file.Decls {
- switch n := decl.(type) {
- case *ast.GenDecl:
- // var, const, types
- for _, spec := range n.Specs {
- switch s := spec.(type) {
- case *ast.ValueSpec:
- // constants and variables.
- for _, name := range s.Names {
- p.decl[name.Name] = n
- }
- case *ast.TypeSpec:
- // type definitions.
- p.decl[s.Name.Name] = n
- }
- }
- case *ast.FuncDecl:
- // function declarations
- // TODO(remy): do methods
- if n.Recv == nil {
- p.decl[n.Name.Name] = n
- }
- }
- }
- }
- // init() and _ are always used
- p.used["init"] = true
- p.used["_"] = true
- if pkg.Name != "main" {
- // exported names are marked used for non-main packages.
- for name := range p.decl {
- if ast.IsExported(name) {
- p.used[name] = true
- }
- }
- } else {
- // in main programs, main() is called.
- p.used["main"] = true
- }
- for _, file := range pkg.Files {
- // walk file looking for used nodes.
- ast.Walk(p, file)
- }
- // reports.
- reports := Reports(nil)
- for name, node := range p.decl {
- if !p.used[name] {
- reports = append(reports, Report{node.Pos(), name})
- }
- }
- sort.Sort(reports)
- for _, report := range reports {
- errorf("%s: %s is unused", fs.Position(report.pos), report.name)
- }
-}
-
-type Report struct {
- pos token.Pos
- name string
-}
-type Reports []Report
-
-func (l Reports) Len() int { return len(l) }
-func (l Reports) Less(i, j int) bool { return l[i].pos < l[j].pos }
-func (l Reports) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
-
-// Visits files for used nodes.
-func (p *Package) Visit(node ast.Node) ast.Visitor {
- u := usedWalker(*p) // hopefully p fields are references.
- switch n := node.(type) {
- // don't walk whole file, but only:
- case *ast.ValueSpec:
- // - variable initializers
- for _, value := range n.Values {
- ast.Walk(&u, value)
- }
- // variable types.
- if n.Type != nil {
- ast.Walk(&u, n.Type)
- }
- case *ast.BlockStmt:
- // - function bodies
- for _, stmt := range n.List {
- ast.Walk(&u, stmt)
- }
- case *ast.FuncDecl:
- // - function signatures
- ast.Walk(&u, n.Type)
- case *ast.TypeSpec:
- // - type declarations
- ast.Walk(&u, n.Type)
- }
- return p
-}
-
-type usedWalker Package
-
-// Walks through the AST marking used identifiers.
-func (p *usedWalker) Visit(node ast.Node) ast.Visitor {
- // just be stupid and mark all *ast.Ident
- switch n := node.(type) {
- case *ast.Ident:
- p.used[n.Name] = true
- }
- return p
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/LICENSE
deleted file mode 100644
index 0ff8731a3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2016 Fredrik Wallgren
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/cmd/lll/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/cmd/lll/main.go
deleted file mode 100644
index f4ce937ea..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/cmd/lll/main.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package main
-
-import (
- "bufio"
- "fmt"
- "os"
- "path/filepath"
- "regexp"
-
- "github.com/alexflint/go-arg"
-
- "github.com/walle/lll"
-)
-
-var args struct {
- MaxLength int `arg:"-l,env,help:max line length to check for"`
- TabWidth int `arg:"-w,env,help:tab width in spaces"`
- GoOnly bool `arg:"-g,env,help:only check .go files"`
- Input []string `arg:"positional"`
- SkipList []string `arg:"-s,env,help:list of dirs to skip"`
- Vendor bool `arg:"env,help:check files in vendor directory"`
- Files bool `arg:"help:read file names from stdin one at each line"`
- Exclude string `arg:"-e,env,help:exclude lines that matches this regex"`
-}
-
-func main() {
- args.MaxLength = 80
- args.TabWidth = 1
- args.SkipList = []string{".git", "vendor"}
- arg.MustParse(&args)
-
- var exclude *regexp.Regexp
- if args.Exclude != "" {
- e, err := regexp.Compile(args.Exclude)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Error compiling exclude regexp: %s\n", err)
- os.Exit(1)
- }
- exclude = e
- }
-
- // If we should include the vendor dir, attempt to remove it from the skip list
- if args.Vendor {
- for i, p := range args.SkipList {
- if p == "vendor" {
- args.SkipList = append(args.SkipList[:i], args.SkipList[:i]...)
- }
- }
- }
-
- // If we should read files from stdin, read each line and process the file
- if args.Files {
- s := bufio.NewScanner(os.Stdin)
- for s.Scan() {
- err := lll.ProcessFile(os.Stdout, s.Text(),
- args.MaxLength, args.TabWidth, exclude)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Error processing file: %s\n", err)
- }
- }
- os.Exit(0)
- }
-
- // Otherwise, walk the inputs recursively
- for _, d := range args.Input {
- err := filepath.Walk(d, func(p string, i os.FileInfo, e error) error {
- if i == nil {
- fmt.Fprintf(os.Stderr, "lll: %s no such file or directory\n", p)
- return nil
- }
- if e != nil {
- fmt.Fprintf(os.Stderr, "lll: %s\n", e)
- return nil
- }
- skip, ret := lll.ShouldSkip(p, i.IsDir(), args.SkipList, args.GoOnly)
- if skip {
- return ret
- }
-
- err := lll.ProcessFile(os.Stdout, p, args.MaxLength, args.TabWidth, exclude)
- return err
- })
-
- if err != nil {
- fmt.Fprintf(os.Stderr, "Error walking the file system: %s\n", err)
- os.Exit(1)
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/lll.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/lll.go
deleted file mode 100644
index 8f3d270b2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/lll.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// Package lll provides validation functions regarding line length
-package lll
-
-import (
- "bufio"
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "path/filepath"
- "regexp"
- "strings"
- "unicode/utf8"
-)
-
-// ShouldSkip checks the input and determines if the path should be skipped.
-// Use the SkipList to quickly skip paths.
-// All directories are skipped, only files are processed.
-// If GoOnly is supplied check that the file is a go file.
-// Otherwise check so the file is a "text file".
-func ShouldSkip(path string, isDir bool, skipList []string,
- goOnly bool) (bool, error) {
-
- name := filepath.Base(path)
- for _, d := range skipList {
- if name == d {
- if isDir {
- return true, filepath.SkipDir
- }
- return true, nil
- }
- }
- if isDir {
- return true, nil
- }
-
- if goOnly {
- if !strings.HasSuffix(path, ".go") {
- return true, nil
- }
- } else {
- b, err := ioutil.ReadFile(path)
- if err != nil {
- return true, err
- }
- m := http.DetectContentType(b)
- if !strings.Contains(m, "text/") {
- return true, nil
- }
- }
-
- return false, nil
-}
-
-// ProcessFile checks all lines in the file and writes an error if the line
-// length is greater than MaxLength.
-func ProcessFile(w io.Writer, path string, maxLength, tabWidth int,
- exclude *regexp.Regexp) error {
- f, err := os.Open(path)
- if err != nil {
- return err
- }
- defer func() {
- err := f.Close()
- if err != nil {
- fmt.Printf("Error closing file: %s\n", err)
- }
- }()
-
- return Process(f, w, path, maxLength, tabWidth, exclude)
-}
-
-// Process checks all lines in the reader and writes an error if the line length
-// is greater than MaxLength.
-func Process(r io.Reader, w io.Writer, path string, maxLength, tabWidth int,
- exclude *regexp.Regexp) error {
- spaces := strings.Repeat(" ", tabWidth)
- l := 1
- s := bufio.NewScanner(r)
- for s.Scan() {
- t := s.Text()
- t = strings.Replace(t, "\t", spaces, -1)
- c := utf8.RuneCountInString(t)
- if c > maxLength {
- if exclude != nil {
- if exclude.MatchString(t) {
- continue
- }
- }
- fmt.Fprintf(w, "%s:%d: line is %d characters\n", path, l, c)
- }
- l++
- }
-
- if err := s.Err(); err != nil {
- return err
- }
-
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/doc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/doc.go
deleted file mode 100644
index 500ec8301..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/doc.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Package arg parses command line arguments using the fields from a struct.
-//
-// For example,
-//
-// var args struct {
-// Iter int
-// Debug bool
-// }
-// arg.MustParse(&args)
-//
-// defines two command line arguments, which can be set using any of
-//
-// ./example --iter=1 --debug // debug is a boolean flag so its value is set to true
-// ./example -iter 1 // debug defaults to its zero value (false)
-// ./example --debug=true // iter defaults to its zero value (zero)
-//
-// The fastest way to see how to use go-arg is to read the examples below.
-//
-// Fields can be bool, string, any float type, or any signed or unsigned integer type.
-// They can also be slices of any of the above, or slices of pointers to any of the above.
-//
-// Tags can be specified using the `arg` package name:
-//
-// var args struct {
-// Input string `arg:"positional"`
-// Log string `arg:"positional,required"`
-// Debug bool `arg:"-d,help:turn on debug mode"`
-// RealMode bool `arg:"--real"
-// Wr io.Writer `arg:"-"`
-// }
-//
-// The valid tag strings are `positional`, `required`, and `help`. Further, any tag string
-// that starts with a single hyphen is the short form for an argument (e.g. `./example -d`),
-// and any tag string that starts with two hyphens is the long form for the argument
-// (instead of the field name). Fields can be excluded from processing with `arg:"-"`.
-package arg
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/parse.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/parse.go
deleted file mode 100644
index b08a29846..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/parse.go
+++ /dev/null
@@ -1,376 +0,0 @@
-package arg
-
-import (
- "errors"
- "fmt"
- "os"
- "path/filepath"
- "reflect"
- "strings"
-)
-
-// spec represents a command line option
-type spec struct {
- dest reflect.Value
- long string
- short string
- multiple bool
- required bool
- positional bool
- help string
- env string
- wasPresent bool
- boolean bool
- fieldName string // for generating helpful errors
-}
-
-// ErrHelp indicates that -h or --help were provided
-var ErrHelp = errors.New("help requested by user")
-
-// MustParse processes command line arguments and exits upon failure
-func MustParse(dest ...interface{}) *Parser {
- p, err := NewParser(Config{}, dest...)
- if err != nil {
- fmt.Println(err)
- os.Exit(-1)
- }
- err = p.Parse(os.Args[1:])
- if err == ErrHelp {
- p.WriteHelp(os.Stdout)
- os.Exit(0)
- }
- if err != nil {
- p.Fail(err.Error())
- }
- return p
-}
-
-// Parse processes command line arguments and stores them in dest
-func Parse(dest ...interface{}) error {
- p, err := NewParser(Config{}, dest...)
- if err != nil {
- return err
- }
- return p.Parse(os.Args[1:])
-}
-
-// Config represents configuration options for an argument parser
-type Config struct {
- Program string // Program is the name of the program used in the help text
-}
-
-// Parser represents a set of command line options with destination values
-type Parser struct {
- spec []*spec
- config Config
-}
-
-// NewParser constructs a parser from a list of destination structs
-func NewParser(config Config, dests ...interface{}) (*Parser, error) {
- var specs []*spec
- for _, dest := range dests {
- v := reflect.ValueOf(dest)
- if v.Kind() != reflect.Ptr {
- panic(fmt.Sprintf("%s is not a pointer (did you forget an ampersand?)", v.Type()))
- }
- v = v.Elem()
- if v.Kind() != reflect.Struct {
- panic(fmt.Sprintf("%T is not a struct pointer", dest))
- }
-
- t := v.Type()
- for i := 0; i < t.NumField(); i++ {
- // Check for the ignore switch in the tag
- field := t.Field(i)
- tag := field.Tag.Get("arg")
- if tag == "-" {
- continue
- }
-
- spec := spec{
- long: strings.ToLower(field.Name),
- dest: v.Field(i),
- fieldName: t.Name() + "." + field.Name,
- }
-
- // Check whether this field is supported. It's good to do this here rather than
- // wait until setScalar because it means that a program with invalid argument
- // fields will always fail regardless of whether the arguments it recieved happend
- // to exercise those fields.
- var parseable bool
- parseable, spec.boolean, spec.multiple = canParse(field.Type)
- if !parseable {
- return nil, fmt.Errorf("%s.%s: %s fields are not supported", t.Name(), field.Name, field.Type.String())
- }
-
- // Look at the tag
- if tag != "" {
- for _, key := range strings.Split(tag, ",") {
- var value string
- if pos := strings.Index(key, ":"); pos != -1 {
- value = key[pos+1:]
- key = key[:pos]
- }
-
- switch {
- case strings.HasPrefix(key, "--"):
- spec.long = key[2:]
- case strings.HasPrefix(key, "-"):
- if len(key) != 2 {
- return nil, fmt.Errorf("%s.%s: short arguments must be one character only", t.Name(), field.Name)
- }
- spec.short = key[1:]
- case key == "required":
- spec.required = true
- case key == "positional":
- spec.positional = true
- case key == "help":
- spec.help = value
- case key == "env":
- // Use override name if provided
- if value != "" {
- spec.env = value
- } else {
- spec.env = strings.ToUpper(field.Name)
- }
- default:
- return nil, fmt.Errorf("unrecognized tag '%s' on field %s", key, tag)
- }
- }
- }
- specs = append(specs, &spec)
- }
- }
- if config.Program == "" {
- config.Program = "program"
- if len(os.Args) > 0 {
- config.Program = filepath.Base(os.Args[0])
- }
- }
- return &Parser{
- spec: specs,
- config: config,
- }, nil
-}
-
-// Parse processes the given command line option, storing the results in the field
-// of the structs from which NewParser was constructed
-func (p *Parser) Parse(args []string) error {
- // If -h or --help were specified then print usage
- for _, arg := range args {
- if arg == "-h" || arg == "--help" {
- return ErrHelp
- }
- if arg == "--" {
- break
- }
- }
-
- // Process all command line arguments
- err := process(p.spec, args)
- if err != nil {
- return err
- }
-
- // Validate
- return validate(p.spec)
-}
-
-// process goes through arguments one-by-one, parses them, and assigns the result to
-// the underlying struct field
-func process(specs []*spec, args []string) error {
- // construct a map from --option to spec
- optionMap := make(map[string]*spec)
- for _, spec := range specs {
- if spec.positional {
- continue
- }
- if spec.long != "" {
- optionMap[spec.long] = spec
- }
- if spec.short != "" {
- optionMap[spec.short] = spec
- }
- if spec.env != "" {
- if value, found := os.LookupEnv(spec.env); found {
- err := setScalar(spec.dest, value)
- if err != nil {
- return fmt.Errorf("error processing environment variable %s: %v", spec.env, err)
- }
- spec.wasPresent = true
- }
- }
- }
-
- // process each string from the command line
- var allpositional bool
- var positionals []string
-
- // must use explicit for loop, not range, because we manipulate i inside the loop
- for i := 0; i < len(args); i++ {
- arg := args[i]
- if arg == "--" {
- allpositional = true
- continue
- }
-
- if !strings.HasPrefix(arg, "-") || allpositional {
- positionals = append(positionals, arg)
- continue
- }
-
- // check for an equals sign, as in "--foo=bar"
- var value string
- opt := strings.TrimLeft(arg, "-")
- if pos := strings.Index(opt, "="); pos != -1 {
- value = opt[pos+1:]
- opt = opt[:pos]
- }
-
- // lookup the spec for this option
- spec, ok := optionMap[opt]
- if !ok {
- return fmt.Errorf("unknown argument %s", arg)
- }
- spec.wasPresent = true
-
- // deal with the case of multiple values
- if spec.multiple {
- var values []string
- if value == "" {
- for i+1 < len(args) && !strings.HasPrefix(args[i+1], "-") {
- values = append(values, args[i+1])
- i++
- }
- } else {
- values = append(values, value)
- }
- err := setSlice(spec.dest, values)
- if err != nil {
- return fmt.Errorf("error processing %s: %v", arg, err)
- }
- continue
- }
-
- // if it's a flag and it has no value then set the value to true
- // use boolean because this takes account of TextUnmarshaler
- if spec.boolean && value == "" {
- value = "true"
- }
-
- // if we have something like "--foo" then the value is the next argument
- if value == "" {
- if i+1 == len(args) || strings.HasPrefix(args[i+1], "-") {
- return fmt.Errorf("missing value for %s", arg)
- }
- value = args[i+1]
- i++
- }
-
- err := setScalar(spec.dest, value)
- if err != nil {
- return fmt.Errorf("error processing %s: %v", arg, err)
- }
- }
-
- // process positionals
- for _, spec := range specs {
- if spec.positional {
- if spec.multiple {
- err := setSlice(spec.dest, positionals)
- if err != nil {
- return fmt.Errorf("error processing %s: %v", spec.long, err)
- }
- positionals = nil
- } else if len(positionals) > 0 {
- err := setScalar(spec.dest, positionals[0])
- if err != nil {
- return fmt.Errorf("error processing %s: %v", spec.long, err)
- }
- positionals = positionals[1:]
- } else if spec.required {
- return fmt.Errorf("%s is required", spec.long)
- }
- }
- }
- if len(positionals) > 0 {
- return fmt.Errorf("too many positional arguments at '%s'", positionals[0])
- }
- return nil
-}
-
-// validate an argument spec after arguments have been parse
-func validate(spec []*spec) error {
- for _, arg := range spec {
- if !arg.positional && arg.required && !arg.wasPresent {
- return fmt.Errorf("--%s is required", arg.long)
- }
- }
- return nil
-}
-
-// parse a value as the apropriate type and store it in the struct
-func setSlice(dest reflect.Value, values []string) error {
- if !dest.CanSet() {
- return fmt.Errorf("field is not writable")
- }
-
- var ptr bool
- elem := dest.Type().Elem()
- if elem.Kind() == reflect.Ptr {
- ptr = true
- elem = elem.Elem()
- }
-
- // Truncate the dest slice in case default values exist
- if !dest.IsNil() {
- dest.SetLen(0)
- }
-
- for _, s := range values {
- v := reflect.New(elem)
- if err := setScalar(v.Elem(), s); err != nil {
- return err
- }
- if !ptr {
- v = v.Elem()
- }
- dest.Set(reflect.Append(dest, v))
- }
- return nil
-}
-
-// canParse returns true if the type can be parsed from a string
-func canParse(t reflect.Type) (parseable, boolean, multiple bool) {
- parseable, boolean = isScalar(t)
- if parseable {
- return
- }
-
- // Look inside pointer types
- if t.Kind() == reflect.Ptr {
- t = t.Elem()
- }
- // Look inside slice types
- if t.Kind() == reflect.Slice {
- multiple = true
- t = t.Elem()
- }
-
- parseable, boolean = isScalar(t)
- if parseable {
- return
- }
-
- // Look inside pointer types (again, in case of []*Type)
- if t.Kind() == reflect.Ptr {
- t = t.Elem()
- }
-
- parseable, boolean = isScalar(t)
- if parseable {
- return
- }
-
- return false, false, false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/scalar.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/scalar.go
deleted file mode 100644
index e79b00214..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/scalar.go
+++ /dev/null
@@ -1,145 +0,0 @@
-package arg
-
-import (
- "encoding"
- "fmt"
- "net"
- "net/mail"
- "reflect"
- "strconv"
- "time"
-)
-
-// The reflected form of some special types
-var (
- textUnmarshalerType = reflect.TypeOf([]encoding.TextUnmarshaler{}).Elem()
- durationType = reflect.TypeOf(time.Duration(0))
- mailAddressType = reflect.TypeOf(mail.Address{})
- ipType = reflect.TypeOf(net.IP{})
- macType = reflect.TypeOf(net.HardwareAddr{})
-)
-
-// isScalar returns true if the type can be parsed from a single string
-func isScalar(t reflect.Type) (scalar, boolean bool) {
- // If it implements encoding.TextUnmarshaler then use that
- if t.Implements(textUnmarshalerType) {
- // scalar=YES, boolean=NO
- return true, false
- }
-
- // If we have a pointer then dereference it
- if t.Kind() == reflect.Ptr {
- t = t.Elem()
- }
-
- // Check for other special types
- switch t {
- case durationType, mailAddressType, ipType, macType:
- // scalar=YES, boolean=NO
- return true, false
- }
-
- // Fall back to checking the kind
- switch t.Kind() {
- case reflect.Bool:
- // scalar=YES, boolean=YES
- return true, true
- case reflect.String, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
- reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
- reflect.Float32, reflect.Float64:
- // scalar=YES, boolean=NO
- return true, false
- }
- // scalar=NO, boolean=NO
- return false, false
-}
-
-// set a value from a string
-func setScalar(v reflect.Value, s string) error {
- if !v.CanSet() {
- return fmt.Errorf("field is not exported")
- }
-
- // If we have a nil pointer then allocate a new object
- if v.Kind() == reflect.Ptr && v.IsNil() {
- v.Set(reflect.New(v.Type().Elem()))
- }
-
- // Get the object as an interface
- scalar := v.Interface()
-
- // If it implements encoding.TextUnmarshaler then use that
- if scalar, ok := scalar.(encoding.TextUnmarshaler); ok {
- return scalar.UnmarshalText([]byte(s))
- }
-
- // If we have a pointer then dereference it
- if v.Kind() == reflect.Ptr {
- v = v.Elem()
- }
-
- // Switch on concrete type
- switch scalar.(type) {
- case time.Duration:
- duration, err := time.ParseDuration(s)
- if err != nil {
- return err
- }
- v.Set(reflect.ValueOf(duration))
- return nil
- case mail.Address:
- addr, err := mail.ParseAddress(s)
- if err != nil {
- return err
- }
- v.Set(reflect.ValueOf(*addr))
- return nil
- case net.IP:
- ip := net.ParseIP(s)
- if ip == nil {
- return fmt.Errorf(`invalid IP address: "%s"`, s)
- }
- v.Set(reflect.ValueOf(ip))
- return nil
- case net.HardwareAddr:
- ip, err := net.ParseMAC(s)
- if err != nil {
- return err
- }
- v.Set(reflect.ValueOf(ip))
- return nil
- }
-
- // Switch on kind so that we can handle derived types
- switch v.Kind() {
- case reflect.String:
- v.SetString(s)
- case reflect.Bool:
- x, err := strconv.ParseBool(s)
- if err != nil {
- return err
- }
- v.SetBool(x)
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- x, err := strconv.ParseInt(s, 10, v.Type().Bits())
- if err != nil {
- return err
- }
- v.SetInt(x)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- x, err := strconv.ParseUint(s, 10, v.Type().Bits())
- if err != nil {
- return err
- }
- v.SetUint(x)
- case reflect.Float32, reflect.Float64:
- x, err := strconv.ParseFloat(s, v.Type().Bits())
- if err != nil {
- return err
- }
- v.SetFloat(x)
- default:
- return fmt.Errorf("cannot parse argument into %s", v.Type().String())
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/usage.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/usage.go
deleted file mode 100644
index 2ee39535b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/github.com/walle/lll/vendor/github.com/alexflint/go-arg/usage.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package arg
-
-import (
- "fmt"
- "io"
- "os"
- "reflect"
- "strings"
-)
-
-// the width of the left column
-const colWidth = 25
-
-// Fail prints usage information to stderr and exits with non-zero status
-func (p *Parser) Fail(msg string) {
- p.WriteUsage(os.Stderr)
- fmt.Fprintln(os.Stderr, "error:", msg)
- os.Exit(-1)
-}
-
-// WriteUsage writes usage information to the given writer
-func (p *Parser) WriteUsage(w io.Writer) {
- var positionals, options []*spec
- for _, spec := range p.spec {
- if spec.positional {
- positionals = append(positionals, spec)
- } else {
- options = append(options, spec)
- }
- }
-
- fmt.Fprintf(w, "usage: %s", p.config.Program)
-
- // write the option component of the usage message
- for _, spec := range options {
- // prefix with a space
- fmt.Fprint(w, " ")
- if !spec.required {
- fmt.Fprint(w, "[")
- }
- fmt.Fprint(w, synopsis(spec, "--"+spec.long))
- if !spec.required {
- fmt.Fprint(w, "]")
- }
- }
-
- // write the positional component of the usage message
- for _, spec := range positionals {
- // prefix with a space
- fmt.Fprint(w, " ")
- up := strings.ToUpper(spec.long)
- if spec.multiple {
- fmt.Fprintf(w, "[%s [%s ...]]", up, up)
- } else {
- fmt.Fprint(w, up)
- }
- }
- fmt.Fprint(w, "\n")
-}
-
-// WriteHelp writes the usage string followed by the full help string for each option
-func (p *Parser) WriteHelp(w io.Writer) {
- var positionals, options []*spec
- for _, spec := range p.spec {
- if spec.positional {
- positionals = append(positionals, spec)
- } else {
- options = append(options, spec)
- }
- }
-
- p.WriteUsage(w)
-
- // write the list of positionals
- if len(positionals) > 0 {
- fmt.Fprint(w, "\npositional arguments:\n")
- for _, spec := range positionals {
- left := " " + spec.long
- fmt.Fprint(w, left)
- if spec.help != "" {
- if len(left)+2 < colWidth {
- fmt.Fprint(w, strings.Repeat(" ", colWidth-len(left)))
- } else {
- fmt.Fprint(w, "\n"+strings.Repeat(" ", colWidth))
- }
- fmt.Fprint(w, spec.help)
- }
- fmt.Fprint(w, "\n")
- }
- }
-
- // write the list of options
- fmt.Fprint(w, "\noptions:\n")
- for _, spec := range options {
- printOption(w, spec)
- }
-
- // write the list of built in options
- printOption(w, &spec{boolean: true, long: "help", short: "h", help: "display this help and exit"})
-}
-
-func printOption(w io.Writer, spec *spec) {
- left := " " + synopsis(spec, "--"+spec.long)
- if spec.short != "" {
- left += ", " + synopsis(spec, "-"+spec.short)
- }
- fmt.Fprint(w, left)
- if spec.help != "" {
- if len(left)+2 < colWidth {
- fmt.Fprint(w, strings.Repeat(" ", colWidth-len(left)))
- } else {
- fmt.Fprint(w, "\n"+strings.Repeat(" ", colWidth))
- }
- fmt.Fprint(w, spec.help)
- }
- // If spec.dest is not the zero value then a default value has been added.
- v := spec.dest
- if v.IsValid() {
- z := reflect.Zero(v.Type())
- if (v.Type().Comparable() && z.Type().Comparable() && v.Interface() != z.Interface()) || v.Kind() == reflect.Slice && !v.IsNil() {
- fmt.Fprintf(w, " [default: %v]", v)
- }
- }
- fmt.Fprint(w, "\n")
-}
-
-func synopsis(spec *spec, form string) string {
- if spec.boolean {
- return form
- }
- return form + " " + strings.ToUpper(spec.long)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/code.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/code.go
deleted file mode 100644
index d7031b694..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/code.go
+++ /dev/null
@@ -1,351 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package 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)
- }
-}
-
-// 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 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, 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/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/gen.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/gen.go
deleted file mode 100644
index 2acb0355a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/gen/gen.go
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package 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"
- "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.
-
-package %s
-
-`
-
-// UnicodeVersion reports the requested Unicode version.
-func UnicodeVersion() string {
- return *unicodeVersion
-}
-
-// UnicodeVersion reports the requested CLDR version.
-func CLDRVersion() string {
- return *cldrVersion
-}
-
-// 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)
- }
-}
-
-// 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 string, b []byte) (n int, err error) {
- src := []byte(fmt.Sprintf(header, 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/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/compact.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/compact.go
deleted file mode 100644
index 397b975c1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/compact.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package 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/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/print.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/print.go
deleted file mode 100644
index 8d9f120bc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/print.go
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package 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/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/triegen.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/triegen.go
deleted file mode 100644
index adb010812..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/triegen/triegen.go
+++ /dev/null
@@ -1,494 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package 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/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/ucd/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/ucd/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/ucd/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/ucd/ucd.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/ucd/ucd.go
deleted file mode 100644
index 309e8d8b1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/internal/ucd/ucd.go
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package 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"
- "bytes"
- "errors"
- "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 []byte
- field [][]byte
- // parsedRange is needed in case Range(0) is called more than once for one
- // field. In some cases this requires scanning ahead.
- parsedRange bool
- rangeStart, rangeEnd rune
-
- partHandler func(p *Parser)
- commentHandler func(s string)
-}
-
-func (p *Parser) setError(err error) {
- if p.err == nil {
- p.err = err
- }
-}
-
-func (p *Parser) getField(i int) []byte {
- if i >= len(p.field) {
- return nil
- }
- 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 = nil
- p.field = p.field[:0]
- p.parsedRange = false
-
- for p.scanner.Scan() {
- b := p.scanner.Bytes()
- if len(b) == 0 {
- continue
- }
- if b[0] == '#' {
- if p.commentHandler != nil {
- p.commentHandler(strings.TrimSpace(string(b[1:])))
- }
- continue
- }
-
- // Parse line
- if i := bytes.IndexByte(b, '#'); i != -1 {
- p.comment = bytes.TrimSpace(b[i+1:])
- b = b[:i]
- }
- if b[0] == '@' {
- if p.partHandler != nil {
- p.field = append(p.field, bytes.TrimSpace(b[1:]))
- p.partHandler(p)
- p.field = p.field[:0]
- }
- p.comment = nil
- continue
- }
- for {
- i := bytes.IndexByte(b, ';')
- if i == -1 {
- p.field = append(p.field, bytes.TrimSpace(b))
- break
- }
- p.field = append(p.field, bytes.TrimSpace(b[:i]))
- b = b[i+1:]
- }
- if !p.keepRanges {
- p.rangeStart, p.rangeEnd = p.getRange(0)
- }
- return true
- }
- p.setError(p.scanner.Err())
- return false
-}
-
-func parseRune(b []byte) (rune, error) {
- if len(b) > 2 && b[0] == 'U' && b[1] == '+' {
- b = b[2:]
- }
- x, err := strconv.ParseUint(string(b), 16, 32)
- return rune(x), err
-}
-
-func (p *Parser) parseRune(b []byte) rune {
- x, err := parseRune(b)
- p.setError(err)
- 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(b []byte) {
- if b = bytes.TrimSpace(b); len(b) > 0 {
- runes = append(runes, p.parseRune(b))
- }
- }
- for b := p.getField(i); ; {
- i := bytes.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 := bytes.Index(b, []byte("..")); 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 && bytes.HasSuffix(p.field[1], []byte("First>")) {
- if p.parsedRange {
- return p.rangeStart, p.rangeEnd
- }
- mf := reRange.FindStringSubmatch(p.scanner.Text())
- 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.Bytes()[: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 {
- b := p.getField(i)
- for s, v := range bools {
- if bstrEq(b, s) {
- return v
- }
- }
- p.setError(strconv.ErrSyntax)
- 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)
- 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)
- 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)
- 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 {
- b := p.getField(i)
- for _, s := range enum {
- if bstrEq(b, s) {
- return s
- }
- }
- p.setError(errUndefinedEnum)
- return ""
-}
-
-func bstrEq(b []byte, s string) bool {
- if len(b) != len(s) {
- return false
- }
- for i, c := range b {
- if c != s[i] {
- return false
- }
- }
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/transform/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/transform/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/transform/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/transform/transform.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/transform/transform.go
deleted file mode 100644
index fe47b9b35..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/transform/transform.go
+++ /dev/null
@@ -1,705 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package 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/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/base.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/base.go
deleted file mode 100644
index 2382f4d6d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/base.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package 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 ""
-}
-
-// 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(`[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/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/cldr.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/cldr.go
deleted file mode 100644
index 2197f8ac2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/cldr.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//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/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/collate.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/collate.go
deleted file mode 100644
index 80ee28d79..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/collate.go
+++ /dev/null
@@ -1,359 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package 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
-// []
-// The starting should already be consumed.
-func parseSpecialAnchor(p RuleProcessor, s string) (tail string, err error) {
- i := strings.IndexByte(s, ']')
- if i == -1 {
- return "", errors.New("unmatched bracket")
- }
- a := strings.TrimSpace(s[:i])
- s = s[i+1:]
- if strings.HasPrefix(a, "before ") {
- l, err := strconv.ParseUint(skipSpace(a[len("before "):]), 10, 3)
- if err != nil {
- return s, err
- }
- return parseAnchor(p, int(l), s)
- }
- return s, p.Reset(fmt.Sprintf(specialAnchor, a), 0)
-}
-
-func parseAnchor(p RuleProcessor, level int, s string) (tail string, err error) {
- anchor, s, err := scanString(s)
- if err != nil {
- return s, err
- }
- return s, p.Reset(anchor, level)
-}
-
-func parseOrder(p RuleProcessor, level int, s string) (tail string, err error) {
- var value, context, extend string
- if value, s, err = scanString(s); err != nil {
- return s, err
- }
- if strings.HasPrefix(value, cldrIndex) {
- p.Index(value[len(cldrIndex):])
- return
- }
- if consume(&s, '|') {
- if context, s, err = scanString(s); err != nil {
- return s, errors.New("missing string after context")
- }
- }
- if consume(&s, '/') {
- if extend, s, err = scanString(s); err != nil {
- return s, errors.New("missing string after extension")
- }
- }
- return s, p.Insert(level, value, context, extend)
-}
-
-// scanString scans a single input string.
-func scanString(s string) (str, tail string, err error) {
- if s = skipSpace(s); s == "" {
- return s, s, errors.New("missing string")
- }
- buf := [16]byte{} // small but enough to hold most cases.
- value := buf[:0]
- for s != "" {
- if consume(&s, '\'') {
- i := strings.IndexByte(s, '\'')
- if i == -1 {
- return "", "", errors.New(`unmatched single quote`)
- }
- if i == 0 {
- value = append(value, '\'')
- } else {
- value = append(value, s[:i]...)
- }
- s = s[i+1:]
- continue
- }
- r, sz := utf8.DecodeRuneInString(s)
- if unicode.IsSpace(r) || strings.ContainsRune("&<=#", r) {
- break
- }
- value = append(value, s[:sz]...)
- s = s[sz:]
- }
- return string(value), skipSpace(s), nil
-}
-
-func parseSequence(p RuleProcessor, level int, s string) (tail string, err error) {
- if s = skipSpace(s); s == "" {
- return s, errors.New("empty sequence")
- }
- last := rune(0)
- for s != "" {
- r, sz := utf8.DecodeRuneInString(s)
- s = s[sz:]
-
- if r == '-' {
- // We have a range. The first element was already written.
- if last == 0 {
- return s, errors.New("range without starter value")
- }
- r, sz = utf8.DecodeRuneInString(s)
- s = s[sz:]
- if r == utf8.RuneError || r < last {
- return s, fmt.Errorf("invalid range %q-%q", last, r)
- }
- for i := last + 1; i <= r; i++ {
- if err := p.Insert(level, string(i), "", ""); err != nil {
- return s, err
- }
- }
- last = 0
- continue
- }
-
- if unicode.IsSpace(r) || unicode.IsPunct(r) {
- break
- }
-
- // normal case
- if err := p.Insert(level, string(r), "", ""); err != nil {
- return s, err
- }
- last = r
- }
- return s, nil
-}
-
-func skipSpace(s string) string {
- return strings.TrimLeftFunc(s, unicode.IsSpace)
-}
-
-// consumes returns whether the next byte is ch. If so, it gobbles it by
-// updating s.
-func consume(s *string, ch byte) (ok bool) {
- if *s == "" || (*s)[0] != ch {
- return false
- }
- *s = (*s)[1:]
- return true
-}
-
-// The following code parses Collation rules of CLDR version 24 and before.
-
-var lmap = map[byte]int{
- 'p': 1,
- 's': 2,
- 't': 3,
- 'i': 5,
-}
-
-type rulesElem struct {
- Rules struct {
- Common
- Any []*struct {
- XMLName xml.Name
- rule
- } `xml:",any"`
- } `xml:"rules"`
-}
-
-type rule struct {
- Value string `xml:",chardata"`
- Before string `xml:"before,attr"`
- Any []*struct {
- XMLName xml.Name
- rule
- } `xml:",any"`
-}
-
-var emptyValueError = errors.New("cldr: empty rule value")
-
-func (r *rule) value() (string, error) {
- // Convert hexadecimal Unicode codepoint notation to a string.
- s := charRe.ReplaceAllStringFunc(r.Value, replaceUnicode)
- r.Value = s
- if s == "" {
- if len(r.Any) != 1 {
- return "", emptyValueError
- }
- r.Value = fmt.Sprintf(specialAnchor, r.Any[0].XMLName.Local)
- r.Any = nil
- } else if len(r.Any) != 0 {
- return "", fmt.Errorf("cldr: XML elements found in collation rule: %v", r.Any)
- }
- return r.Value, nil
-}
-
-func (r rule) process(p RuleProcessor, name, context, extend string) error {
- v, err := r.value()
- if err != nil {
- return err
- }
- switch name {
- case "p", "s", "t", "i":
- if strings.HasPrefix(v, cldrIndex) {
- p.Index(v[len(cldrIndex):])
- return nil
- }
- if err := p.Insert(lmap[name[0]], v, context, extend); err != nil {
- return err
- }
- case "pc", "sc", "tc", "ic":
- level := lmap[name[0]]
- for _, s := range v {
- if err := p.Insert(level, string(s), context, extend); err != nil {
- return err
- }
- }
- default:
- return fmt.Errorf("cldr: unsupported tag: %q", name)
- }
- return nil
-}
-
-// processXML parses the format of CLDR versions 24 and older.
-func (c Collation) processXML(p RuleProcessor) (err error) {
- // Collation is generated and defined in xml.go.
- var v string
- for _, r := range c.Rules.Any {
- switch r.XMLName.Local {
- case "reset":
- level := 0
- switch r.Before {
- case "primary", "1":
- level = 1
- case "secondary", "2":
- level = 2
- case "tertiary", "3":
- level = 3
- case "":
- default:
- return fmt.Errorf("cldr: unknown level %q", r.Before)
- }
- v, err = r.value()
- if err == nil {
- err = p.Reset(v, level)
- }
- case "x":
- var context, extend string
- for _, r1 := range r.Any {
- v, err = r1.value()
- switch r1.XMLName.Local {
- case "context":
- context = v
- case "extend":
- extend = v
- }
- }
- for _, r1 := range r.Any {
- if t := r1.XMLName.Local; t == "context" || t == "extend" {
- continue
- }
- r1.rule.process(p, r1.XMLName.Local, context, extend)
- }
- default:
- err = r.rule.process(p, r.XMLName.Local, "", "")
- }
- if err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/decode.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/decode.go
deleted file mode 100644
index e5ee4aed1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/decode.go
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cldr
-
-import (
- "archive/zip"
- "bytes"
- "encoding/xml"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "regexp"
-)
-
-// A Decoder loads an archive of CLDR data.
-type Decoder struct {
- dirFilter []string
- sectionFilter []string
- loader Loader
- cldr *CLDR
- curLocale string
-}
-
-// SetSectionFilter takes a list top-level LDML element names to which
-// evaluation of LDML should be limited. It automatically calls SetDirFilter.
-func (d *Decoder) SetSectionFilter(filter ...string) {
- d.sectionFilter = filter
- // TODO: automatically set dir filter
-}
-
-// SetDirFilter limits the loading of LDML XML files of the specied directories.
-// Note that sections may be split across directories differently for different CLDR versions.
-// For more robust code, use SetSectionFilter.
-func (d *Decoder) SetDirFilter(dir ...string) {
- d.dirFilter = dir
-}
-
-// A Loader provides access to the files of a CLDR archive.
-type Loader interface {
- Len() int
- Path(i int) string
- Reader(i int) (io.ReadCloser, error)
-}
-
-var fileRe = regexp.MustCompile(".*/(.*)/(.*)\\.xml")
-
-// Decode loads and decodes the files represented by l.
-func (d *Decoder) Decode(l Loader) (cldr *CLDR, err error) {
- d.cldr = makeCLDR()
- for i := 0; i < l.Len(); i++ {
- fname := l.Path(i)
- if m := fileRe.FindStringSubmatch(fname); m != nil {
- if len(d.dirFilter) > 0 && !in(d.dirFilter, m[1]) {
- continue
- }
- var r io.Reader
- if r, err = l.Reader(i); err == nil {
- err = d.decode(m[1], m[2], r)
- }
- if err != nil {
- return nil, err
- }
- }
- }
- d.cldr.finalize(d.sectionFilter)
- return d.cldr, nil
-}
-
-func (d *Decoder) decode(dir, id string, r io.Reader) error {
- var v interface{}
- var l *LDML
- cldr := d.cldr
- switch {
- case dir == "supplemental":
- v = cldr.supp
- case dir == "transforms":
- return nil
- case dir == "bcp47":
- v = cldr.bcp47
- case dir == "validity":
- return nil
- default:
- ok := false
- if v, ok = cldr.locale[id]; !ok {
- l = &LDML{}
- v, cldr.locale[id] = l, l
- }
- }
- x := xml.NewDecoder(r)
- if err := x.Decode(v); err != nil {
- log.Printf("%s/%s: %v", dir, id, err)
- return err
- }
- if l != nil {
- if l.Identity == nil {
- return fmt.Errorf("%s/%s: missing identity element", dir, id)
- }
- // TODO: verify when CLDR bug http://unicode.org/cldr/trac/ticket/8970
- // is resolved.
- // path := strings.Split(id, "_")
- // if lang := l.Identity.Language.Type; lang != path[0] {
- // return fmt.Errorf("%s/%s: language was %s; want %s", dir, id, lang, path[0])
- // }
- }
- return nil
-}
-
-type pathLoader []string
-
-func makePathLoader(path string) (pl pathLoader, err error) {
- err = filepath.Walk(path, func(path string, _ os.FileInfo, err error) error {
- pl = append(pl, path)
- return err
- })
- return pl, err
-}
-
-func (pl pathLoader) Len() int {
- return len(pl)
-}
-
-func (pl pathLoader) Path(i int) string {
- return pl[i]
-}
-
-func (pl pathLoader) Reader(i int) (io.ReadCloser, error) {
- return os.Open(pl[i])
-}
-
-// DecodePath loads CLDR data from the given path.
-func (d *Decoder) DecodePath(path string) (cldr *CLDR, err error) {
- loader, err := makePathLoader(path)
- if err != nil {
- return nil, err
- }
- return d.Decode(loader)
-}
-
-type zipLoader struct {
- r *zip.Reader
-}
-
-func (zl zipLoader) Len() int {
- return len(zl.r.File)
-}
-
-func (zl zipLoader) Path(i int) string {
- return zl.r.File[i].Name
-}
-
-func (zl zipLoader) Reader(i int) (io.ReadCloser, error) {
- return zl.r.File[i].Open()
-}
-
-// DecodeZip loads CLDR data from the zip archive for which r is the source.
-func (d *Decoder) DecodeZip(r io.Reader) (cldr *CLDR, err error) {
- buffer, err := ioutil.ReadAll(r)
- if err != nil {
- return nil, err
- }
- archive, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer)))
- if err != nil {
- return nil, err
- }
- return d.Decode(zipLoader{archive})
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/makexml.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/makexml.go
deleted file mode 100644
index 6114d01cb..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/makexml.go
+++ /dev/null
@@ -1,400 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// This tool generates types for the various XML formats of CLDR.
-package main
-
-import (
- "archive/zip"
- "bytes"
- "encoding/xml"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "os"
- "regexp"
- "strings"
-
- "golang.org/x/text/internal/gen"
-)
-
-var outputFile = flag.String("output", "xml.go", "output file name")
-
-func main() {
- flag.Parse()
-
- r := gen.OpenCLDRCoreZip()
- buffer, err := ioutil.ReadAll(r)
- if err != nil {
- log.Fatal("Could not read zip file")
- }
- r.Close()
- z, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer)))
- if err != nil {
- log.Fatalf("Could not read zip archive: %v", err)
- }
-
- var buf bytes.Buffer
-
- version := gen.CLDRVersion()
-
- for _, dtd := range files {
- for _, f := range z.File {
- if strings.HasSuffix(f.Name, dtd.file+".dtd") {
- r, err := f.Open()
- failOnError(err)
-
- b := makeBuilder(&buf, dtd)
- b.parseDTD(r)
- b.resolve(b.index[dtd.top[0]])
- b.write()
- if b.version != "" && version != b.version {
- println(f.Name)
- log.Fatalf("main: inconsistent versions: found %s; want %s", b.version, version)
- }
- break
- }
- }
- }
- fmt.Fprintln(&buf, "// Version is the version of CLDR from which the XML definitions are generated.")
- fmt.Fprintf(&buf, "const Version = %q\n", version)
-
- gen.WriteGoFile(*outputFile, "cldr", buf.Bytes())
-}
-
-func failOnError(err error) {
- if err != nil {
- log.New(os.Stderr, "", log.Lshortfile).Output(2, err.Error())
- os.Exit(1)
- }
-}
-
-// configuration data per DTD type
-type dtd struct {
- file string // base file name
- root string // Go name of the root XML element
- top []string // create a different type for this section
-
- skipElem []string // hard-coded or deprecated elements
- skipAttr []string // attributes to exclude
- predefined []string // hard-coded elements exist of the form Elem
- forceRepeat []string // elements to make slices despite DTD
-}
-
-var files = []dtd{
- {
- file: "ldmlBCP47",
- root: "LDMLBCP47",
- top: []string{"ldmlBCP47"},
- skipElem: []string{
- "cldrVersion", // deprecated, not used
- },
- },
- {
- file: "ldmlSupplemental",
- root: "SupplementalData",
- top: []string{"supplementalData"},
- skipElem: []string{
- "cldrVersion", // deprecated, not used
- },
- forceRepeat: []string{
- "plurals", // data defined in plurals.xml and ordinals.xml
- },
- },
- {
- file: "ldml",
- root: "LDML",
- top: []string{
- "ldml", "collation", "calendar", "timeZoneNames", "localeDisplayNames", "numbers",
- },
- skipElem: []string{
- "cp", // not used anywhere
- "special", // not used anywhere
- "fallback", // deprecated, not used
- "alias", // in Common
- "default", // in Common
- },
- skipAttr: []string{
- "hiraganaQuarternary", // typo in DTD, correct version included as well
- },
- predefined: []string{"rules"},
- },
-}
-
-var comments = map[string]string{
- "ldmlBCP47": `
-// LDMLBCP47 holds information on allowable values for various variables in LDML.
-`,
- "supplementalData": `
-// SupplementalData holds information relevant for internationalization
-// and proper use of CLDR, but that is not contained in the locale hierarchy.
-`,
- "ldml": `
-// LDML is the top-level type for locale-specific data.
-`,
- "collation": `
-// Collation contains rules that specify a certain sort-order,
-// as a tailoring of the root order.
-// The parsed rules are obtained by passing a RuleProcessor to Collation's
-// Process method.
-`,
- "calendar": `
-// Calendar specifies the fields used for formatting and parsing dates and times.
-// The month and quarter names are identified numerically, starting at 1.
-// The day (of the week) names are identified with short strings, since there is
-// no universally-accepted numeric designation.
-`,
- "dates": `
-// Dates contains information regarding the format and parsing of dates and times.
-`,
- "localeDisplayNames": `
-// LocaleDisplayNames specifies localized display names for for scripts, languages,
-// countries, currencies, and variants.
-`,
- "numbers": `
-// Numbers supplies information for formatting and parsing numbers and currencies.
-`,
-}
-
-type element struct {
- name string // XML element name
- category string // elements contained by this element
- signature string // category + attrKey*
-
- attr []*attribute // attributes supported by this element.
- sub []struct { // parsed and evaluated sub elements of this element.
- e *element
- repeat bool // true if the element needs to be a slice
- }
-
- resolved bool // prevent multiple resolutions of this element.
-}
-
-type attribute struct {
- name string
- key string
- list []string
-
- tag string // Go tag
-}
-
-var (
- reHead = regexp.MustCompile(` *(\w+) +([\w\-]+)`)
- reAttr = regexp.MustCompile(` *(\w+) *(?:(\w+)|\(([\w\- \|]+)\)) *(?:#([A-Z]*) *(?:\"([\.\d+])\")?)? *("[\w\-:]*")?`)
- reElem = regexp.MustCompile(`^ *(EMPTY|ANY|\(.*\)[\*\+\?]?) *$`)
- reToken = regexp.MustCompile(`\w\-`)
-)
-
-// builder is used to read in the DTD files from CLDR and generate Go code
-// to be used with the encoding/xml package.
-type builder struct {
- w io.Writer
- index map[string]*element
- elem []*element
- info dtd
- version string
-}
-
-func makeBuilder(w io.Writer, d dtd) builder {
- return builder{
- w: w,
- index: make(map[string]*element),
- elem: []*element{},
- info: d,
- }
-}
-
-// parseDTD parses a DTD file.
-func (b *builder) parseDTD(r io.Reader) {
- for d := xml.NewDecoder(r); ; {
- t, err := d.Token()
- if t == nil {
- break
- }
- failOnError(err)
- dir, ok := t.(xml.Directive)
- if !ok {
- continue
- }
- m := reHead.FindSubmatch(dir)
- dir = dir[len(m[0]):]
- ename := string(m[2])
- el, elementFound := b.index[ename]
- switch string(m[1]) {
- case "ELEMENT":
- if elementFound {
- log.Fatal("parseDTD: duplicate entry for element %q", ename)
- }
- m := reElem.FindSubmatch(dir)
- if m == nil {
- log.Fatalf("parseDTD: invalid element %q", string(dir))
- }
- if len(m[0]) != len(dir) {
- log.Fatal("parseDTD: invalid element %q", string(dir), len(dir), len(m[0]), string(m[0]))
- }
- s := string(m[1])
- el = &element{
- name: ename,
- category: s,
- }
- b.index[ename] = el
- case "ATTLIST":
- if !elementFound {
- log.Fatalf("parseDTD: unknown element %q", ename)
- }
- s := string(dir)
- m := reAttr.FindStringSubmatch(s)
- if m == nil {
- log.Fatal(fmt.Errorf("parseDTD: invalid attribute %q", string(dir)))
- }
- if m[4] == "FIXED" {
- b.version = m[5]
- } else {
- switch m[1] {
- case "draft", "references", "alt", "validSubLocales", "standard" /* in Common */ :
- case "type", "choice":
- default:
- el.attr = append(el.attr, &attribute{
- name: m[1],
- key: s,
- list: reToken.FindAllString(m[3], -1),
- })
- el.signature = fmt.Sprintf("%s=%s+%s", el.signature, m[1], m[2])
- }
- }
- }
- }
-}
-
-var reCat = regexp.MustCompile(`[ ,\|]*(?:(\(|\)|\#?[\w_-]+)([\*\+\?]?))?`)
-
-// resolve takes a parsed element and converts it into structured data
-// that can be used to generate the XML code.
-func (b *builder) resolve(e *element) {
- if e.resolved {
- return
- }
- b.elem = append(b.elem, e)
- e.resolved = true
- s := e.category
- found := make(map[string]bool)
- sequenceStart := []int{}
- for len(s) > 0 {
- m := reCat.FindStringSubmatch(s)
- if m == nil {
- log.Fatalf("%s: invalid category string %q", e.name, s)
- }
- repeat := m[2] == "*" || m[2] == "+" || in(b.info.forceRepeat, m[1])
- switch m[1] {
- case "":
- case "(":
- sequenceStart = append(sequenceStart, len(e.sub))
- case ")":
- if len(sequenceStart) == 0 {
- log.Fatalf("%s: unmatched closing parenthesis", e.name)
- }
- for i := sequenceStart[len(sequenceStart)-1]; i < len(e.sub); i++ {
- e.sub[i].repeat = e.sub[i].repeat || repeat
- }
- sequenceStart = sequenceStart[:len(sequenceStart)-1]
- default:
- if in(b.info.skipElem, m[1]) {
- } else if sub, ok := b.index[m[1]]; ok {
- if !found[sub.name] {
- e.sub = append(e.sub, struct {
- e *element
- repeat bool
- }{sub, repeat})
- found[sub.name] = true
- b.resolve(sub)
- }
- } else if m[1] == "#PCDATA" || m[1] == "ANY" {
- } else if m[1] != "EMPTY" {
- log.Fatalf("resolve:%s: element %q not found", e.name, m[1])
- }
- }
- s = s[len(m[0]):]
- }
-}
-
-// return true if s is contained in set.
-func in(set []string, s string) bool {
- for _, v := range set {
- if v == s {
- return true
- }
- }
- return false
-}
-
-var repl = strings.NewReplacer("-", " ", "_", " ")
-
-// title puts the first character or each character following '_' in title case and
-// removes all occurrences of '_'.
-func title(s string) string {
- return strings.Replace(strings.Title(repl.Replace(s)), " ", "", -1)
-}
-
-// writeElem generates Go code for a single element, recursively.
-func (b *builder) writeElem(tab int, e *element) {
- p := func(f string, x ...interface{}) {
- f = strings.Replace(f, "\n", "\n"+strings.Repeat("\t", tab), -1)
- fmt.Fprintf(b.w, f, x...)
- }
- if len(e.sub) == 0 && len(e.attr) == 0 {
- p("Common")
- return
- }
- p("struct {")
- tab++
- p("\nCommon")
- for _, attr := range e.attr {
- if !in(b.info.skipAttr, attr.name) {
- p("\n%s string `xml:\"%s,attr\"`", title(attr.name), attr.name)
- }
- }
- for _, sub := range e.sub {
- if in(b.info.predefined, sub.e.name) {
- p("\n%sElem", sub.e.name)
- continue
- }
- if in(b.info.skipElem, sub.e.name) {
- continue
- }
- p("\n%s ", title(sub.e.name))
- if sub.repeat {
- p("[]")
- }
- p("*")
- if in(b.info.top, sub.e.name) {
- p(title(sub.e.name))
- } else {
- b.writeElem(tab, sub.e)
- }
- p(" `xml:\"%s\"`", sub.e.name)
- }
- tab--
- p("\n}")
-}
-
-// write generates the Go XML code.
-func (b *builder) write() {
- for i, name := range b.info.top {
- e := b.index[name]
- if e != nil {
- fmt.Fprintf(b.w, comments[name])
- name := title(e.name)
- if i == 0 {
- name = b.info.root
- }
- fmt.Fprintf(b.w, "type %s ", name)
- b.writeElem(0, e)
- fmt.Fprint(b.w, "\n")
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/resolve.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/resolve.go
deleted file mode 100644
index 691b5903f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/resolve.go
+++ /dev/null
@@ -1,602 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cldr
-
-// This file implements the various inheritance constructs defined by LDML.
-// See http://www.unicode.org/reports/tr35/#Inheritance_and_Validity
-// for more details.
-
-import (
- "fmt"
- "log"
- "reflect"
- "regexp"
- "sort"
- "strings"
-)
-
-// fieldIter iterates over fields in a struct. It includes
-// fields of embedded structs.
-type fieldIter struct {
- v reflect.Value
- index, n []int
-}
-
-func iter(v reflect.Value) fieldIter {
- if v.Kind() != reflect.Struct {
- log.Panicf("value %v must be a struct", v)
- }
- i := fieldIter{
- v: v,
- index: []int{0},
- n: []int{v.NumField()},
- }
- i.descent()
- return i
-}
-
-func (i *fieldIter) descent() {
- for f := i.field(); f.Anonymous && f.Type.NumField() > 0; f = i.field() {
- i.index = append(i.index, 0)
- i.n = append(i.n, f.Type.NumField())
- }
-}
-
-func (i *fieldIter) done() bool {
- return len(i.index) == 1 && i.index[0] >= i.n[0]
-}
-
-func skip(f reflect.StructField) bool {
- return !f.Anonymous && (f.Name[0] < 'A' || f.Name[0] > 'Z')
-}
-
-func (i *fieldIter) next() {
- for {
- k := len(i.index) - 1
- i.index[k]++
- if i.index[k] < i.n[k] {
- if !skip(i.field()) {
- break
- }
- } else {
- if k == 0 {
- return
- }
- i.index = i.index[:k]
- i.n = i.n[:k]
- }
- }
- i.descent()
-}
-
-func (i *fieldIter) value() reflect.Value {
- return i.v.FieldByIndex(i.index)
-}
-
-func (i *fieldIter) field() reflect.StructField {
- return i.v.Type().FieldByIndex(i.index)
-}
-
-type visitor func(v reflect.Value) error
-
-var stopDescent = fmt.Errorf("do not recurse")
-
-func (f visitor) visit(x interface{}) error {
- return f.visitRec(reflect.ValueOf(x))
-}
-
-// visit recursively calls f on all nodes in v.
-func (f visitor) visitRec(v reflect.Value) error {
- if v.Kind() == reflect.Ptr {
- if v.IsNil() {
- return nil
- }
- return f.visitRec(v.Elem())
- }
- if err := f(v); err != nil {
- if err == stopDescent {
- return nil
- }
- return err
- }
- switch v.Kind() {
- case reflect.Struct:
- for i := iter(v); !i.done(); i.next() {
- if err := f.visitRec(i.value()); err != nil {
- return err
- }
- }
- case reflect.Slice:
- for i := 0; i < v.Len(); i++ {
- if err := f.visitRec(v.Index(i)); err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-// getPath is used for error reporting purposes only.
-func getPath(e Elem) string {
- if e == nil {
- return ""
- }
- if e.enclosing() == nil {
- return e.GetCommon().name
- }
- if e.GetCommon().Type == "" {
- return fmt.Sprintf("%s.%s", getPath(e.enclosing()), e.GetCommon().name)
- }
- return fmt.Sprintf("%s.%s[type=%s]", getPath(e.enclosing()), e.GetCommon().name, e.GetCommon().Type)
-}
-
-// xmlName returns the xml name of the element or attribute
-func xmlName(f reflect.StructField) (name string, attr bool) {
- tags := strings.Split(f.Tag.Get("xml"), ",")
- for _, s := range tags {
- attr = attr || s == "attr"
- }
- return tags[0], attr
-}
-
-func findField(v reflect.Value, key string) (reflect.Value, error) {
- v = reflect.Indirect(v)
- for i := iter(v); !i.done(); i.next() {
- if n, _ := xmlName(i.field()); n == key {
- return i.value(), nil
- }
- }
- return reflect.Value{}, fmt.Errorf("cldr: no field %q in element %#v", key, v.Interface())
-}
-
-var xpathPart = regexp.MustCompile(`(\pL+)(?:\[@(\pL+)='([\w-]+)'\])?`)
-
-func walkXPath(e Elem, path string) (res Elem, err error) {
- for _, c := range strings.Split(path, "/") {
- if c == ".." {
- if e = e.enclosing(); e == nil {
- panic("path ..")
- return nil, fmt.Errorf(`cldr: ".." moves past root in path %q`, path)
- }
- continue
- } else if c == "" {
- continue
- }
- m := xpathPart.FindStringSubmatch(c)
- if len(m) == 0 || len(m[0]) != len(c) {
- return nil, fmt.Errorf("cldr: syntax error in path component %q", c)
- }
- v, err := findField(reflect.ValueOf(e), m[1])
- if err != nil {
- return nil, err
- }
- switch v.Kind() {
- case reflect.Slice:
- i := 0
- if m[2] != "" || v.Len() > 1 {
- if m[2] == "" {
- m[2] = "type"
- if m[3] = e.GetCommon().Default(); m[3] == "" {
- return nil, fmt.Errorf("cldr: type selector or default value needed for element %s", m[1])
- }
- }
- for ; i < v.Len(); i++ {
- vi := v.Index(i)
- key, err := findField(vi.Elem(), m[2])
- if err != nil {
- return nil, err
- }
- key = reflect.Indirect(key)
- if key.Kind() == reflect.String && key.String() == m[3] {
- break
- }
- }
- }
- if i == v.Len() || v.Index(i).IsNil() {
- return nil, fmt.Errorf("no %s found with %s==%s", m[1], m[2], m[3])
- }
- e = v.Index(i).Interface().(Elem)
- case reflect.Ptr:
- if v.IsNil() {
- return nil, fmt.Errorf("cldr: element %q not found within element %q", m[1], e.GetCommon().name)
- }
- var ok bool
- if e, ok = v.Interface().(Elem); !ok {
- return nil, fmt.Errorf("cldr: %q is not an XML element", m[1])
- } else if m[2] != "" || m[3] != "" {
- return nil, fmt.Errorf("cldr: no type selector allowed for element %s", m[1])
- }
- default:
- return nil, fmt.Errorf("cldr: %q is not an XML element", m[1])
- }
- }
- return e, nil
-}
-
-const absPrefix = "//ldml/"
-
-func (cldr *CLDR) resolveAlias(e Elem, src, path string) (res Elem, err error) {
- if src != "locale" {
- if !strings.HasPrefix(path, absPrefix) {
- return nil, fmt.Errorf("cldr: expected absolute path, found %q", path)
- }
- path = path[len(absPrefix):]
- if e, err = cldr.resolve(src); err != nil {
- return nil, err
- }
- }
- return walkXPath(e, path)
-}
-
-func (cldr *CLDR) resolveAndMergeAlias(e Elem) error {
- alias := e.GetCommon().Alias
- if alias == nil {
- return nil
- }
- a, err := cldr.resolveAlias(e, alias.Source, alias.Path)
- if err != nil {
- return fmt.Errorf("%v: error evaluating path %q: %v", getPath(e), alias.Path, err)
- }
- // Ensure alias node was already evaluated. TODO: avoid double evaluation.
- err = cldr.resolveAndMergeAlias(a)
- v := reflect.ValueOf(e).Elem()
- for i := iter(reflect.ValueOf(a).Elem()); !i.done(); i.next() {
- if vv := i.value(); vv.Kind() != reflect.Ptr || !vv.IsNil() {
- if _, attr := xmlName(i.field()); !attr {
- v.FieldByIndex(i.index).Set(vv)
- }
- }
- }
- return err
-}
-
-func (cldr *CLDR) aliasResolver() visitor {
- return func(v reflect.Value) (err error) {
- if e, ok := v.Addr().Interface().(Elem); ok {
- err = cldr.resolveAndMergeAlias(e)
- if err == nil && blocking[e.GetCommon().name] {
- return stopDescent
- }
- }
- return err
- }
-}
-
-// elements within blocking elements do not inherit.
-// Taken from CLDR's supplementalMetaData.xml.
-var blocking = map[string]bool{
- "identity": true,
- "supplementalData": true,
- "cldrTest": true,
- "collation": true,
- "transform": true,
-}
-
-// Distinguishing attributes affect inheritance; two elements with different
-// distinguishing attributes are treated as different for purposes of inheritance,
-// except when such attributes occur in the indicated elements.
-// Taken from CLDR's supplementalMetaData.xml.
-var distinguishing = map[string][]string{
- "key": nil,
- "request_id": nil,
- "id": nil,
- "registry": nil,
- "alt": nil,
- "iso4217": nil,
- "iso3166": nil,
- "mzone": nil,
- "from": nil,
- "to": nil,
- "type": []string{
- "abbreviationFallback",
- "default",
- "mapping",
- "measurementSystem",
- "preferenceOrdering",
- },
- "numberSystem": nil,
-}
-
-func in(set []string, s string) bool {
- for _, v := range set {
- if v == s {
- return true
- }
- }
- return false
-}
-
-// attrKey computes a key based on the distinguishable attributes of
-// an element and it's values.
-func attrKey(v reflect.Value, exclude ...string) string {
- parts := []string{}
- ename := v.Interface().(Elem).GetCommon().name
- v = v.Elem()
- for i := iter(v); !i.done(); i.next() {
- if name, attr := xmlName(i.field()); attr {
- if except, ok := distinguishing[name]; ok && !in(exclude, name) && !in(except, ename) {
- v := i.value()
- if v.Kind() == reflect.Ptr {
- v = v.Elem()
- }
- if v.IsValid() {
- parts = append(parts, fmt.Sprintf("%s=%s", name, v.String()))
- }
- }
- }
- }
- sort.Strings(parts)
- return strings.Join(parts, ";")
-}
-
-// Key returns a key for e derived from all distinguishing attributes
-// except those specified by exclude.
-func Key(e Elem, exclude ...string) string {
- return attrKey(reflect.ValueOf(e), exclude...)
-}
-
-// linkEnclosing sets the enclosing element as well as the name
-// for all sub-elements of child, recursively.
-func linkEnclosing(parent, child Elem) {
- child.setEnclosing(parent)
- v := reflect.ValueOf(child).Elem()
- for i := iter(v); !i.done(); i.next() {
- vf := i.value()
- if vf.Kind() == reflect.Slice {
- for j := 0; j < vf.Len(); j++ {
- linkEnclosing(child, vf.Index(j).Interface().(Elem))
- }
- } else if vf.Kind() == reflect.Ptr && !vf.IsNil() && vf.Elem().Kind() == reflect.Struct {
- linkEnclosing(child, vf.Interface().(Elem))
- }
- }
-}
-
-func setNames(e Elem, name string) {
- e.setName(name)
- v := reflect.ValueOf(e).Elem()
- for i := iter(v); !i.done(); i.next() {
- vf := i.value()
- name, _ = xmlName(i.field())
- if vf.Kind() == reflect.Slice {
- for j := 0; j < vf.Len(); j++ {
- setNames(vf.Index(j).Interface().(Elem), name)
- }
- } else if vf.Kind() == reflect.Ptr && !vf.IsNil() && vf.Elem().Kind() == reflect.Struct {
- setNames(vf.Interface().(Elem), name)
- }
- }
-}
-
-// deepCopy copies elements of v recursively. All elements of v that may
-// be modified by inheritance are explicitly copied.
-func deepCopy(v reflect.Value) reflect.Value {
- switch v.Kind() {
- case reflect.Ptr:
- if v.IsNil() || v.Elem().Kind() != reflect.Struct {
- return v
- }
- nv := reflect.New(v.Elem().Type())
- nv.Elem().Set(v.Elem())
- deepCopyRec(nv.Elem(), v.Elem())
- return nv
- case reflect.Slice:
- nv := reflect.MakeSlice(v.Type(), v.Len(), v.Len())
- for i := 0; i < v.Len(); i++ {
- deepCopyRec(nv.Index(i), v.Index(i))
- }
- return nv
- }
- panic("deepCopy: must be called with pointer or slice")
-}
-
-// deepCopyRec is only called by deepCopy.
-func deepCopyRec(nv, v reflect.Value) {
- if v.Kind() == reflect.Struct {
- t := v.Type()
- for i := 0; i < v.NumField(); i++ {
- if name, attr := xmlName(t.Field(i)); name != "" && !attr {
- deepCopyRec(nv.Field(i), v.Field(i))
- }
- }
- } else {
- nv.Set(deepCopy(v))
- }
-}
-
-// newNode is used to insert a missing node during inheritance.
-func (cldr *CLDR) newNode(v, enc reflect.Value) reflect.Value {
- n := reflect.New(v.Type())
- for i := iter(v); !i.done(); i.next() {
- if name, attr := xmlName(i.field()); name == "" || attr {
- n.Elem().FieldByIndex(i.index).Set(i.value())
- }
- }
- n.Interface().(Elem).GetCommon().setEnclosing(enc.Addr().Interface().(Elem))
- return n
-}
-
-// v, parent must be pointers to struct
-func (cldr *CLDR) inheritFields(v, parent reflect.Value) (res reflect.Value, err error) {
- t := v.Type()
- nv := reflect.New(t)
- nv.Elem().Set(v)
- for i := iter(v); !i.done(); i.next() {
- vf := i.value()
- f := i.field()
- name, attr := xmlName(f)
- if name == "" || attr {
- continue
- }
- pf := parent.FieldByIndex(i.index)
- if blocking[name] {
- if vf.IsNil() {
- vf = pf
- }
- nv.Elem().FieldByIndex(i.index).Set(deepCopy(vf))
- continue
- }
- switch f.Type.Kind() {
- case reflect.Ptr:
- if f.Type.Elem().Kind() == reflect.Struct {
- if !vf.IsNil() {
- if vf, err = cldr.inheritStructPtr(vf, pf); err != nil {
- return reflect.Value{}, err
- }
- vf.Interface().(Elem).setEnclosing(nv.Interface().(Elem))
- nv.Elem().FieldByIndex(i.index).Set(vf)
- } else if !pf.IsNil() {
- n := cldr.newNode(pf.Elem(), v)
- if vf, err = cldr.inheritStructPtr(n, pf); err != nil {
- return reflect.Value{}, err
- }
- vf.Interface().(Elem).setEnclosing(nv.Interface().(Elem))
- nv.Elem().FieldByIndex(i.index).Set(vf)
- }
- }
- case reflect.Slice:
- vf, err := cldr.inheritSlice(nv.Elem(), vf, pf)
- if err != nil {
- return reflect.Zero(t), err
- }
- nv.Elem().FieldByIndex(i.index).Set(vf)
- }
- }
- return nv, nil
-}
-
-func root(e Elem) *LDML {
- for ; e.enclosing() != nil; e = e.enclosing() {
- }
- return e.(*LDML)
-}
-
-// inheritStructPtr first merges possible aliases in with v and then inherits
-// any underspecified elements from parent.
-func (cldr *CLDR) inheritStructPtr(v, parent reflect.Value) (r reflect.Value, err error) {
- if !v.IsNil() {
- e := v.Interface().(Elem).GetCommon()
- alias := e.Alias
- if alias == nil && !parent.IsNil() {
- alias = parent.Interface().(Elem).GetCommon().Alias
- }
- if alias != nil {
- a, err := cldr.resolveAlias(v.Interface().(Elem), alias.Source, alias.Path)
- if a != nil {
- if v, err = cldr.inheritFields(v.Elem(), reflect.ValueOf(a).Elem()); err != nil {
- return reflect.Value{}, err
- }
- }
- }
- if !parent.IsNil() {
- return cldr.inheritFields(v.Elem(), parent.Elem())
- }
- } else if parent.IsNil() {
- panic("should not reach here")
- }
- return v, nil
-}
-
-// Must be slice of struct pointers.
-func (cldr *CLDR) inheritSlice(enc, v, parent reflect.Value) (res reflect.Value, err error) {
- t := v.Type()
- index := make(map[string]reflect.Value)
- if !v.IsNil() {
- for i := 0; i < v.Len(); i++ {
- vi := v.Index(i)
- key := attrKey(vi)
- index[key] = vi
- }
- }
- if !parent.IsNil() {
- for i := 0; i < parent.Len(); i++ {
- vi := parent.Index(i)
- key := attrKey(vi)
- if w, ok := index[key]; ok {
- index[key], err = cldr.inheritStructPtr(w, vi)
- } else {
- n := cldr.newNode(vi.Elem(), enc)
- index[key], err = cldr.inheritStructPtr(n, vi)
- }
- index[key].Interface().(Elem).setEnclosing(enc.Addr().Interface().(Elem))
- if err != nil {
- return v, err
- }
- }
- }
- keys := make([]string, 0, len(index))
- for k, _ := range index {
- keys = append(keys, k)
- }
- sort.Strings(keys)
- sl := reflect.MakeSlice(t, len(index), len(index))
- for i, k := range keys {
- sl.Index(i).Set(index[k])
- }
- return sl, nil
-}
-
-func parentLocale(loc string) string {
- parts := strings.Split(loc, "_")
- if len(parts) == 1 {
- return "root"
- }
- parts = parts[:len(parts)-1]
- key := strings.Join(parts, "_")
- return key
-}
-
-func (cldr *CLDR) resolve(loc string) (res *LDML, err error) {
- if r := cldr.resolved[loc]; r != nil {
- return r, nil
- }
- x := cldr.RawLDML(loc)
- if x == nil {
- return nil, fmt.Errorf("cldr: unknown locale %q", loc)
- }
- var v reflect.Value
- if loc == "root" {
- x = deepCopy(reflect.ValueOf(x)).Interface().(*LDML)
- linkEnclosing(nil, x)
- err = cldr.aliasResolver().visit(x)
- } else {
- key := parentLocale(loc)
- var parent *LDML
- for ; cldr.locale[key] == nil; key = parentLocale(key) {
- }
- if parent, err = cldr.resolve(key); err != nil {
- return nil, err
- }
- v, err = cldr.inheritFields(reflect.ValueOf(x).Elem(), reflect.ValueOf(parent).Elem())
- x = v.Interface().(*LDML)
- linkEnclosing(nil, x)
- }
- if err != nil {
- return nil, err
- }
- cldr.resolved[loc] = x
- return x, err
-}
-
-// finalize finalizes the initialization of the raw LDML structs. It also
-// removed unwanted fields, as specified by filter, so that they will not
-// be unnecessarily evaluated.
-func (cldr *CLDR) finalize(filter []string) {
- for _, x := range cldr.locale {
- if filter != nil {
- v := reflect.ValueOf(x).Elem()
- t := v.Type()
- for i := 0; i < v.NumField(); i++ {
- f := t.Field(i)
- name, _ := xmlName(f)
- if name != "" && name != "identity" && !in(filter, name) {
- v.Field(i).Set(reflect.Zero(f.Type))
- }
- }
- }
- linkEnclosing(nil, x) // for resolving aliases and paths
- setNames(x, "ldml")
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/slice.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/slice.go
deleted file mode 100644
index 388c983ff..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/slice.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cldr
-
-import (
- "fmt"
- "reflect"
- "sort"
-)
-
-// Slice provides utilities for modifying slices of elements.
-// It can be wrapped around any slice of which the element type implements
-// interface Elem.
-type Slice struct {
- ptr reflect.Value
- typ reflect.Type
-}
-
-// Value returns the reflect.Value of the underlying slice.
-func (s *Slice) Value() reflect.Value {
- return s.ptr.Elem()
-}
-
-// MakeSlice wraps a pointer to a slice of Elems.
-// It replaces the array pointed to by the slice so that subsequent modifications
-// do not alter the data in a CLDR type.
-// It panics if an incorrect type is passed.
-func MakeSlice(slicePtr interface{}) Slice {
- ptr := reflect.ValueOf(slicePtr)
- if ptr.Kind() != reflect.Ptr {
- panic(fmt.Sprintf("MakeSlice: argument must be pointer to slice, found %v", ptr.Type()))
- }
- sl := ptr.Elem()
- if sl.Kind() != reflect.Slice {
- panic(fmt.Sprintf("MakeSlice: argument must point to a slice, found %v", sl.Type()))
- }
- intf := reflect.TypeOf((*Elem)(nil)).Elem()
- if !sl.Type().Elem().Implements(intf) {
- panic(fmt.Sprintf("MakeSlice: element type of slice (%v) does not implement Elem", sl.Type().Elem()))
- }
- nsl := reflect.MakeSlice(sl.Type(), sl.Len(), sl.Len())
- reflect.Copy(nsl, sl)
- sl.Set(nsl)
- return Slice{
- ptr: ptr,
- typ: sl.Type().Elem().Elem(),
- }
-}
-
-func (s Slice) indexForAttr(a string) []int {
- for i := iter(reflect.Zero(s.typ)); !i.done(); i.next() {
- if n, _ := xmlName(i.field()); n == a {
- return i.index
- }
- }
- panic(fmt.Sprintf("MakeSlice: no attribute %q for type %v", a, s.typ))
-}
-
-// Filter filters s to only include elements for which fn returns true.
-func (s Slice) Filter(fn func(e Elem) bool) {
- k := 0
- sl := s.Value()
- for i := 0; i < sl.Len(); i++ {
- vi := sl.Index(i)
- if fn(vi.Interface().(Elem)) {
- sl.Index(k).Set(vi)
- k++
- }
- }
- sl.Set(sl.Slice(0, k))
-}
-
-// Group finds elements in s for which fn returns the same value and groups
-// them in a new Slice.
-func (s Slice) Group(fn func(e Elem) string) []Slice {
- m := make(map[string][]reflect.Value)
- sl := s.Value()
- for i := 0; i < sl.Len(); i++ {
- vi := sl.Index(i)
- key := fn(vi.Interface().(Elem))
- m[key] = append(m[key], vi)
- }
- keys := []string{}
- for k, _ := range m {
- keys = append(keys, k)
- }
- sort.Strings(keys)
- res := []Slice{}
- for _, k := range keys {
- nsl := reflect.New(sl.Type())
- nsl.Elem().Set(reflect.Append(nsl.Elem(), m[k]...))
- res = append(res, MakeSlice(nsl.Interface()))
- }
- return res
-}
-
-// SelectAnyOf filters s to contain only elements for which attr matches
-// any of the values.
-func (s Slice) SelectAnyOf(attr string, values ...string) {
- index := s.indexForAttr(attr)
- s.Filter(func(e Elem) bool {
- vf := reflect.ValueOf(e).Elem().FieldByIndex(index)
- return in(values, vf.String())
- })
-}
-
-// SelectOnePerGroup filters s to include at most one element e per group of
-// elements matching Key(attr), where e has an attribute a that matches any
-// the values in v.
-// If more than one element in a group matches a value in v preference
-// is given to the element that matches the first value in v.
-func (s Slice) SelectOnePerGroup(a string, v []string) {
- index := s.indexForAttr(a)
- grouped := s.Group(func(e Elem) string { return Key(e, a) })
- sl := s.Value()
- sl.Set(sl.Slice(0, 0))
- for _, g := range grouped {
- e := reflect.Value{}
- found := len(v)
- gsl := g.Value()
- for i := 0; i < gsl.Len(); i++ {
- vi := gsl.Index(i).Elem().FieldByIndex(index)
- j := 0
- for ; j < len(v) && v[j] != vi.String(); j++ {
- }
- if j < found {
- found = j
- e = gsl.Index(i)
- }
- }
- if found < len(v) {
- sl.Set(reflect.Append(sl, e))
- }
- }
-}
-
-// SelectDraft drops all elements from the list with a draft level smaller than d
-// and selects the highest draft level of the remaining.
-// This method assumes that the input CLDR is canonicalized.
-func (s Slice) SelectDraft(d Draft) {
- s.SelectOnePerGroup("draft", drafts[len(drafts)-2-int(d):])
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/xml.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/xml.go
deleted file mode 100644
index ce3203827..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/xml.go
+++ /dev/null
@@ -1,1487 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-package cldr
-
-// LDMLBCP47 holds information on allowable values for various variables in LDML.
-type LDMLBCP47 struct {
- Common
- Version *struct {
- Common
- Number string `xml:"number,attr"`
- } `xml:"version"`
- Generation *struct {
- Common
- Date string `xml:"date,attr"`
- } `xml:"generation"`
- Keyword []*struct {
- Common
- Key []*struct {
- Common
- Extension string `xml:"extension,attr"`
- Name string `xml:"name,attr"`
- Description string `xml:"description,attr"`
- Deprecated string `xml:"deprecated,attr"`
- Preferred string `xml:"preferred,attr"`
- Alias string `xml:"alias,attr"`
- ValueType string `xml:"valueType,attr"`
- Since string `xml:"since,attr"`
- Type []*struct {
- Common
- Name string `xml:"name,attr"`
- Description string `xml:"description,attr"`
- Deprecated string `xml:"deprecated,attr"`
- Preferred string `xml:"preferred,attr"`
- Alias string `xml:"alias,attr"`
- Since string `xml:"since,attr"`
- } `xml:"type"`
- } `xml:"key"`
- } `xml:"keyword"`
- Attribute []*struct {
- Common
- Name string `xml:"name,attr"`
- Description string `xml:"description,attr"`
- Deprecated string `xml:"deprecated,attr"`
- Preferred string `xml:"preferred,attr"`
- Since string `xml:"since,attr"`
- } `xml:"attribute"`
-}
-
-// SupplementalData holds information relevant for internationalization
-// and proper use of CLDR, but that is not contained in the locale hierarchy.
-type SupplementalData struct {
- Common
- Version *struct {
- Common
- Number string `xml:"number,attr"`
- } `xml:"version"`
- Generation *struct {
- Common
- Date string `xml:"date,attr"`
- } `xml:"generation"`
- CurrencyData *struct {
- Common
- Fractions []*struct {
- Common
- Info []*struct {
- Common
- Iso4217 string `xml:"iso4217,attr"`
- Digits string `xml:"digits,attr"`
- Rounding string `xml:"rounding,attr"`
- CashDigits string `xml:"cashDigits,attr"`
- CashRounding string `xml:"cashRounding,attr"`
- } `xml:"info"`
- } `xml:"fractions"`
- Region []*struct {
- Common
- Iso3166 string `xml:"iso3166,attr"`
- Currency []*struct {
- Common
- Before string `xml:"before,attr"`
- From string `xml:"from,attr"`
- To string `xml:"to,attr"`
- Iso4217 string `xml:"iso4217,attr"`
- Digits string `xml:"digits,attr"`
- Rounding string `xml:"rounding,attr"`
- CashRounding string `xml:"cashRounding,attr"`
- Tender string `xml:"tender,attr"`
- Alternate []*struct {
- Common
- Iso4217 string `xml:"iso4217,attr"`
- } `xml:"alternate"`
- } `xml:"currency"`
- } `xml:"region"`
- } `xml:"currencyData"`
- TerritoryContainment *struct {
- Common
- Group []*struct {
- Common
- Contains string `xml:"contains,attr"`
- Grouping string `xml:"grouping,attr"`
- Status string `xml:"status,attr"`
- } `xml:"group"`
- } `xml:"territoryContainment"`
- SubdivisionContainment *struct {
- Common
- Subgroup []*struct {
- Common
- Subtype string `xml:"subtype,attr"`
- Contains string `xml:"contains,attr"`
- } `xml:"subgroup"`
- } `xml:"subdivisionContainment"`
- LanguageData *struct {
- Common
- Language []*struct {
- Common
- Scripts string `xml:"scripts,attr"`
- Territories string `xml:"territories,attr"`
- Variants string `xml:"variants,attr"`
- } `xml:"language"`
- } `xml:"languageData"`
- TerritoryInfo *struct {
- Common
- Territory []*struct {
- Common
- Gdp string `xml:"gdp,attr"`
- LiteracyPercent string `xml:"literacyPercent,attr"`
- Population string `xml:"population,attr"`
- LanguagePopulation []*struct {
- Common
- LiteracyPercent string `xml:"literacyPercent,attr"`
- WritingPercent string `xml:"writingPercent,attr"`
- PopulationPercent string `xml:"populationPercent,attr"`
- OfficialStatus string `xml:"officialStatus,attr"`
- } `xml:"languagePopulation"`
- } `xml:"territory"`
- } `xml:"territoryInfo"`
- PostalCodeData *struct {
- Common
- PostCodeRegex []*struct {
- Common
- TerritoryId string `xml:"territoryId,attr"`
- } `xml:"postCodeRegex"`
- } `xml:"postalCodeData"`
- CalendarData *struct {
- Common
- Calendar []*struct {
- Common
- Territories string `xml:"territories,attr"`
- CalendarSystem *Common `xml:"calendarSystem"`
- Eras *struct {
- Common
- Era []*struct {
- Common
- Start string `xml:"start,attr"`
- End string `xml:"end,attr"`
- } `xml:"era"`
- } `xml:"eras"`
- } `xml:"calendar"`
- } `xml:"calendarData"`
- CalendarPreferenceData *struct {
- Common
- CalendarPreference []*struct {
- Common
- Territories string `xml:"territories,attr"`
- Ordering string `xml:"ordering,attr"`
- } `xml:"calendarPreference"`
- } `xml:"calendarPreferenceData"`
- WeekData *struct {
- Common
- MinDays []*struct {
- Common
- Count string `xml:"count,attr"`
- Territories string `xml:"territories,attr"`
- } `xml:"minDays"`
- FirstDay []*struct {
- Common
- Day string `xml:"day,attr"`
- Territories string `xml:"territories,attr"`
- } `xml:"firstDay"`
- WeekendStart []*struct {
- Common
- Day string `xml:"day,attr"`
- Territories string `xml:"territories,attr"`
- } `xml:"weekendStart"`
- WeekendEnd []*struct {
- Common
- Day string `xml:"day,attr"`
- Territories string `xml:"territories,attr"`
- } `xml:"weekendEnd"`
- WeekOfPreference []*struct {
- Common
- Locales string `xml:"locales,attr"`
- Ordering string `xml:"ordering,attr"`
- } `xml:"weekOfPreference"`
- } `xml:"weekData"`
- TimeData *struct {
- Common
- Hours []*struct {
- Common
- Allowed string `xml:"allowed,attr"`
- Preferred string `xml:"preferred,attr"`
- Regions string `xml:"regions,attr"`
- } `xml:"hours"`
- } `xml:"timeData"`
- MeasurementData *struct {
- Common
- MeasurementSystem []*struct {
- Common
- Category string `xml:"category,attr"`
- Territories string `xml:"territories,attr"`
- } `xml:"measurementSystem"`
- PaperSize []*struct {
- Common
- Territories string `xml:"territories,attr"`
- } `xml:"paperSize"`
- } `xml:"measurementData"`
- UnitPreferenceData *struct {
- Common
- UnitPreferences []*struct {
- Common
- Category string `xml:"category,attr"`
- Usage string `xml:"usage,attr"`
- Scope string `xml:"scope,attr"`
- UnitPreference []*struct {
- Common
- Regions string `xml:"regions,attr"`
- } `xml:"unitPreference"`
- } `xml:"unitPreferences"`
- } `xml:"unitPreferenceData"`
- TimezoneData *struct {
- Common
- MapTimezones []*struct {
- Common
- OtherVersion string `xml:"otherVersion,attr"`
- TypeVersion string `xml:"typeVersion,attr"`
- MapZone []*struct {
- Common
- Other string `xml:"other,attr"`
- Territory string `xml:"territory,attr"`
- } `xml:"mapZone"`
- } `xml:"mapTimezones"`
- ZoneFormatting []*struct {
- Common
- Multizone string `xml:"multizone,attr"`
- TzidVersion string `xml:"tzidVersion,attr"`
- ZoneItem []*struct {
- Common
- Territory string `xml:"territory,attr"`
- Aliases string `xml:"aliases,attr"`
- } `xml:"zoneItem"`
- } `xml:"zoneFormatting"`
- } `xml:"timezoneData"`
- Characters *struct {
- Common
- CharacterFallback []*struct {
- Common
- Character []*struct {
- Common
- Value string `xml:"value,attr"`
- Substitute []*Common `xml:"substitute"`
- } `xml:"character"`
- } `xml:"character-fallback"`
- } `xml:"characters"`
- Transforms *struct {
- Common
- Transform []*struct {
- Common
- Source string `xml:"source,attr"`
- Target string `xml:"target,attr"`
- Variant string `xml:"variant,attr"`
- Direction string `xml:"direction,attr"`
- Alias string `xml:"alias,attr"`
- BackwardAlias string `xml:"backwardAlias,attr"`
- Visibility string `xml:"visibility,attr"`
- Comment []*Common `xml:"comment"`
- TRule []*Common `xml:"tRule"`
- } `xml:"transform"`
- } `xml:"transforms"`
- Metadata *struct {
- Common
- AttributeOrder *Common `xml:"attributeOrder"`
- ElementOrder *Common `xml:"elementOrder"`
- SerialElements *Common `xml:"serialElements"`
- Suppress *struct {
- Common
- Attributes []*struct {
- Common
- Element string `xml:"element,attr"`
- Attribute string `xml:"attribute,attr"`
- AttributeValue string `xml:"attributeValue,attr"`
- } `xml:"attributes"`
- } `xml:"suppress"`
- Validity *struct {
- Common
- Variable []*struct {
- Common
- Id string `xml:"id,attr"`
- } `xml:"variable"`
- AttributeValues []*struct {
- Common
- Dtds string `xml:"dtds,attr"`
- Elements string `xml:"elements,attr"`
- Attributes string `xml:"attributes,attr"`
- Order string `xml:"order,attr"`
- } `xml:"attributeValues"`
- } `xml:"validity"`
- Alias *struct {
- Common
- LanguageAlias []*struct {
- Common
- Replacement string `xml:"replacement,attr"`
- Reason string `xml:"reason,attr"`
- } `xml:"languageAlias"`
- ScriptAlias []*struct {
- Common
- Replacement string `xml:"replacement,attr"`
- Reason string `xml:"reason,attr"`
- } `xml:"scriptAlias"`
- TerritoryAlias []*struct {
- Common
- Replacement string `xml:"replacement,attr"`
- Reason string `xml:"reason,attr"`
- } `xml:"territoryAlias"`
- SubdivisionAlias []*struct {
- Common
- Replacement string `xml:"replacement,attr"`
- Reason string `xml:"reason,attr"`
- } `xml:"subdivisionAlias"`
- VariantAlias []*struct {
- Common
- Replacement string `xml:"replacement,attr"`
- Reason string `xml:"reason,attr"`
- } `xml:"variantAlias"`
- ZoneAlias []*struct {
- Common
- Replacement string `xml:"replacement,attr"`
- Reason string `xml:"reason,attr"`
- } `xml:"zoneAlias"`
- } `xml:"alias"`
- Deprecated *struct {
- Common
- DeprecatedItems []*struct {
- Common
- Elements string `xml:"elements,attr"`
- Attributes string `xml:"attributes,attr"`
- Values string `xml:"values,attr"`
- } `xml:"deprecatedItems"`
- } `xml:"deprecated"`
- Distinguishing *struct {
- Common
- DistinguishingItems []*struct {
- Common
- Exclude string `xml:"exclude,attr"`
- Elements string `xml:"elements,attr"`
- Attributes string `xml:"attributes,attr"`
- } `xml:"distinguishingItems"`
- } `xml:"distinguishing"`
- Blocking *struct {
- Common
- BlockingItems []*struct {
- Common
- Elements string `xml:"elements,attr"`
- } `xml:"blockingItems"`
- } `xml:"blocking"`
- CoverageAdditions *struct {
- Common
- LanguageCoverage []*struct {
- Common
- Values string `xml:"values,attr"`
- } `xml:"languageCoverage"`
- ScriptCoverage []*struct {
- Common
- Values string `xml:"values,attr"`
- } `xml:"scriptCoverage"`
- TerritoryCoverage []*struct {
- Common
- Values string `xml:"values,attr"`
- } `xml:"territoryCoverage"`
- CurrencyCoverage []*struct {
- Common
- Values string `xml:"values,attr"`
- } `xml:"currencyCoverage"`
- TimezoneCoverage []*struct {
- Common
- Values string `xml:"values,attr"`
- } `xml:"timezoneCoverage"`
- } `xml:"coverageAdditions"`
- SkipDefaultLocale *struct {
- Common
- Services string `xml:"services,attr"`
- } `xml:"skipDefaultLocale"`
- DefaultContent *struct {
- Common
- Locales string `xml:"locales,attr"`
- } `xml:"defaultContent"`
- } `xml:"metadata"`
- CodeMappings *struct {
- Common
- LanguageCodes []*struct {
- Common
- Alpha3 string `xml:"alpha3,attr"`
- } `xml:"languageCodes"`
- TerritoryCodes []*struct {
- Common
- Numeric string `xml:"numeric,attr"`
- Alpha3 string `xml:"alpha3,attr"`
- Fips10 string `xml:"fips10,attr"`
- Internet string `xml:"internet,attr"`
- } `xml:"territoryCodes"`
- CurrencyCodes []*struct {
- Common
- Numeric string `xml:"numeric,attr"`
- } `xml:"currencyCodes"`
- } `xml:"codeMappings"`
- ParentLocales *struct {
- Common
- ParentLocale []*struct {
- Common
- Parent string `xml:"parent,attr"`
- Locales string `xml:"locales,attr"`
- } `xml:"parentLocale"`
- } `xml:"parentLocales"`
- LikelySubtags *struct {
- Common
- LikelySubtag []*struct {
- Common
- From string `xml:"from,attr"`
- To string `xml:"to,attr"`
- } `xml:"likelySubtag"`
- } `xml:"likelySubtags"`
- MetazoneInfo *struct {
- Common
- Timezone []*struct {
- Common
- UsesMetazone []*struct {
- Common
- From string `xml:"from,attr"`
- To string `xml:"to,attr"`
- Mzone string `xml:"mzone,attr"`
- } `xml:"usesMetazone"`
- } `xml:"timezone"`
- } `xml:"metazoneInfo"`
- Plurals []*struct {
- Common
- PluralRules []*struct {
- Common
- Locales string `xml:"locales,attr"`
- PluralRule []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"pluralRule"`
- } `xml:"pluralRules"`
- PluralRanges []*struct {
- Common
- Locales string `xml:"locales,attr"`
- PluralRange []*struct {
- Common
- Start string `xml:"start,attr"`
- End string `xml:"end,attr"`
- Result string `xml:"result,attr"`
- } `xml:"pluralRange"`
- } `xml:"pluralRanges"`
- } `xml:"plurals"`
- TelephoneCodeData *struct {
- Common
- CodesByTerritory []*struct {
- Common
- Territory string `xml:"territory,attr"`
- TelephoneCountryCode []*struct {
- Common
- Code string `xml:"code,attr"`
- From string `xml:"from,attr"`
- To string `xml:"to,attr"`
- } `xml:"telephoneCountryCode"`
- } `xml:"codesByTerritory"`
- } `xml:"telephoneCodeData"`
- NumberingSystems *struct {
- Common
- NumberingSystem []*struct {
- Common
- Id string `xml:"id,attr"`
- Radix string `xml:"radix,attr"`
- Digits string `xml:"digits,attr"`
- Rules string `xml:"rules,attr"`
- } `xml:"numberingSystem"`
- } `xml:"numberingSystems"`
- Bcp47KeywordMappings *struct {
- Common
- MapKeys *struct {
- Common
- KeyMap []*struct {
- Common
- Bcp47 string `xml:"bcp47,attr"`
- } `xml:"keyMap"`
- } `xml:"mapKeys"`
- MapTypes []*struct {
- Common
- TypeMap []*struct {
- Common
- Bcp47 string `xml:"bcp47,attr"`
- } `xml:"typeMap"`
- } `xml:"mapTypes"`
- } `xml:"bcp47KeywordMappings"`
- Gender *struct {
- Common
- PersonList []*struct {
- Common
- Locales string `xml:"locales,attr"`
- } `xml:"personList"`
- } `xml:"gender"`
- References *struct {
- Common
- Reference []*struct {
- Common
- Uri string `xml:"uri,attr"`
- } `xml:"reference"`
- } `xml:"references"`
- LanguageMatching *struct {
- Common
- LanguageMatches []*struct {
- Common
- ParadigmLocales []*struct {
- Common
- Locales string `xml:"locales,attr"`
- } `xml:"paradigmLocales"`
- MatchVariable []*struct {
- Common
- Id string `xml:"id,attr"`
- Value string `xml:"value,attr"`
- } `xml:"matchVariable"`
- LanguageMatch []*struct {
- Common
- Desired string `xml:"desired,attr"`
- Supported string `xml:"supported,attr"`
- Percent string `xml:"percent,attr"`
- Distance string `xml:"distance,attr"`
- Oneway string `xml:"oneway,attr"`
- } `xml:"languageMatch"`
- } `xml:"languageMatches"`
- } `xml:"languageMatching"`
- DayPeriodRuleSet []*struct {
- Common
- DayPeriodRules []*struct {
- Common
- Locales string `xml:"locales,attr"`
- DayPeriodRule []*struct {
- Common
- At string `xml:"at,attr"`
- After string `xml:"after,attr"`
- Before string `xml:"before,attr"`
- From string `xml:"from,attr"`
- To string `xml:"to,attr"`
- } `xml:"dayPeriodRule"`
- } `xml:"dayPeriodRules"`
- } `xml:"dayPeriodRuleSet"`
- MetaZones *struct {
- Common
- MetazoneInfo *struct {
- Common
- Timezone []*struct {
- Common
- UsesMetazone []*struct {
- Common
- From string `xml:"from,attr"`
- To string `xml:"to,attr"`
- Mzone string `xml:"mzone,attr"`
- } `xml:"usesMetazone"`
- } `xml:"timezone"`
- } `xml:"metazoneInfo"`
- MapTimezones *struct {
- Common
- OtherVersion string `xml:"otherVersion,attr"`
- TypeVersion string `xml:"typeVersion,attr"`
- MapZone []*struct {
- Common
- Other string `xml:"other,attr"`
- Territory string `xml:"territory,attr"`
- } `xml:"mapZone"`
- } `xml:"mapTimezones"`
- } `xml:"metaZones"`
- PrimaryZones *struct {
- Common
- PrimaryZone []*struct {
- Common
- Iso3166 string `xml:"iso3166,attr"`
- } `xml:"primaryZone"`
- } `xml:"primaryZones"`
- WindowsZones *struct {
- Common
- MapTimezones *struct {
- Common
- OtherVersion string `xml:"otherVersion,attr"`
- TypeVersion string `xml:"typeVersion,attr"`
- MapZone []*struct {
- Common
- Other string `xml:"other,attr"`
- Territory string `xml:"territory,attr"`
- } `xml:"mapZone"`
- } `xml:"mapTimezones"`
- } `xml:"windowsZones"`
- CoverageLevels *struct {
- Common
- ApprovalRequirements *struct {
- Common
- ApprovalRequirement []*struct {
- Common
- Votes string `xml:"votes,attr"`
- Locales string `xml:"locales,attr"`
- Paths string `xml:"paths,attr"`
- } `xml:"approvalRequirement"`
- } `xml:"approvalRequirements"`
- CoverageVariable []*struct {
- Common
- Key string `xml:"key,attr"`
- Value string `xml:"value,attr"`
- } `xml:"coverageVariable"`
- CoverageLevel []*struct {
- Common
- InLanguage string `xml:"inLanguage,attr"`
- InScript string `xml:"inScript,attr"`
- InTerritory string `xml:"inTerritory,attr"`
- Value string `xml:"value,attr"`
- Match string `xml:"match,attr"`
- } `xml:"coverageLevel"`
- } `xml:"coverageLevels"`
- IdValidity *struct {
- Common
- Id []*struct {
- Common
- IdStatus string `xml:"idStatus,attr"`
- } `xml:"id"`
- } `xml:"idValidity"`
- RgScope *struct {
- Common
- RgPath []*struct {
- Common
- Path string `xml:"path,attr"`
- } `xml:"rgPath"`
- } `xml:"rgScope"`
-}
-
-// LDML is the top-level type for locale-specific data.
-type LDML struct {
- Common
- Version string `xml:"version,attr"`
- Identity *struct {
- Common
- Version *struct {
- Common
- Number string `xml:"number,attr"`
- } `xml:"version"`
- Generation *struct {
- Common
- Date string `xml:"date,attr"`
- } `xml:"generation"`
- Language *Common `xml:"language"`
- Script *Common `xml:"script"`
- Territory *Common `xml:"territory"`
- Variant *Common `xml:"variant"`
- } `xml:"identity"`
- LocaleDisplayNames *LocaleDisplayNames `xml:"localeDisplayNames"`
- Layout *struct {
- Common
- Orientation []*struct {
- Common
- Characters string `xml:"characters,attr"`
- Lines string `xml:"lines,attr"`
- CharacterOrder []*Common `xml:"characterOrder"`
- LineOrder []*Common `xml:"lineOrder"`
- } `xml:"orientation"`
- InList []*struct {
- Common
- Casing string `xml:"casing,attr"`
- } `xml:"inList"`
- InText []*Common `xml:"inText"`
- } `xml:"layout"`
- ContextTransforms *struct {
- Common
- ContextTransformUsage []*struct {
- Common
- ContextTransform []*Common `xml:"contextTransform"`
- } `xml:"contextTransformUsage"`
- } `xml:"contextTransforms"`
- Characters *struct {
- Common
- ExemplarCharacters []*Common `xml:"exemplarCharacters"`
- Ellipsis []*Common `xml:"ellipsis"`
- MoreInformation []*Common `xml:"moreInformation"`
- Stopwords []*struct {
- Common
- StopwordList []*Common `xml:"stopwordList"`
- } `xml:"stopwords"`
- IndexLabels []*struct {
- Common
- IndexSeparator []*Common `xml:"indexSeparator"`
- CompressedIndexSeparator []*Common `xml:"compressedIndexSeparator"`
- IndexRangePattern []*Common `xml:"indexRangePattern"`
- IndexLabelBefore []*Common `xml:"indexLabelBefore"`
- IndexLabelAfter []*Common `xml:"indexLabelAfter"`
- IndexLabel []*struct {
- Common
- IndexSource string `xml:"indexSource,attr"`
- Priority string `xml:"priority,attr"`
- } `xml:"indexLabel"`
- } `xml:"indexLabels"`
- Mapping []*struct {
- Common
- Registry string `xml:"registry,attr"`
- } `xml:"mapping"`
- ParseLenients []*struct {
- Common
- Scope string `xml:"scope,attr"`
- Level string `xml:"level,attr"`
- ParseLenient []*struct {
- Common
- Sample string `xml:"sample,attr"`
- } `xml:"parseLenient"`
- } `xml:"parseLenients"`
- } `xml:"characters"`
- Delimiters *struct {
- Common
- QuotationStart []*Common `xml:"quotationStart"`
- QuotationEnd []*Common `xml:"quotationEnd"`
- AlternateQuotationStart []*Common `xml:"alternateQuotationStart"`
- AlternateQuotationEnd []*Common `xml:"alternateQuotationEnd"`
- } `xml:"delimiters"`
- Measurement *struct {
- Common
- MeasurementSystem []*Common `xml:"measurementSystem"`
- PaperSize []*struct {
- Common
- Height []*Common `xml:"height"`
- Width []*Common `xml:"width"`
- } `xml:"paperSize"`
- } `xml:"measurement"`
- Dates *struct {
- Common
- LocalizedPatternChars []*Common `xml:"localizedPatternChars"`
- DateRangePattern []*Common `xml:"dateRangePattern"`
- Calendars *struct {
- Common
- Calendar []*Calendar `xml:"calendar"`
- } `xml:"calendars"`
- Fields *struct {
- Common
- Field []*struct {
- Common
- DisplayName []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"displayName"`
- Relative []*Common `xml:"relative"`
- RelativeTime []*struct {
- Common
- RelativeTimePattern []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"relativeTimePattern"`
- } `xml:"relativeTime"`
- RelativePeriod []*Common `xml:"relativePeriod"`
- } `xml:"field"`
- } `xml:"fields"`
- TimeZoneNames *TimeZoneNames `xml:"timeZoneNames"`
- } `xml:"dates"`
- Numbers *Numbers `xml:"numbers"`
- Units *struct {
- Common
- Unit []*struct {
- Common
- DisplayName []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"displayName"`
- UnitPattern []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"unitPattern"`
- PerUnitPattern []*Common `xml:"perUnitPattern"`
- } `xml:"unit"`
- UnitLength []*struct {
- Common
- CompoundUnit []*struct {
- Common
- CompoundUnitPattern []*Common `xml:"compoundUnitPattern"`
- } `xml:"compoundUnit"`
- Unit []*struct {
- Common
- DisplayName []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"displayName"`
- UnitPattern []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"unitPattern"`
- PerUnitPattern []*Common `xml:"perUnitPattern"`
- } `xml:"unit"`
- CoordinateUnit []*struct {
- Common
- CoordinateUnitPattern []*Common `xml:"coordinateUnitPattern"`
- } `xml:"coordinateUnit"`
- } `xml:"unitLength"`
- DurationUnit []*struct {
- Common
- DurationUnitPattern []*Common `xml:"durationUnitPattern"`
- } `xml:"durationUnit"`
- } `xml:"units"`
- ListPatterns *struct {
- Common
- ListPattern []*struct {
- Common
- ListPatternPart []*Common `xml:"listPatternPart"`
- } `xml:"listPattern"`
- } `xml:"listPatterns"`
- Collations *struct {
- Common
- Version string `xml:"version,attr"`
- DefaultCollation *Common `xml:"defaultCollation"`
- Collation []*Collation `xml:"collation"`
- } `xml:"collations"`
- Posix *struct {
- Common
- Messages []*struct {
- Common
- Yesstr []*Common `xml:"yesstr"`
- Nostr []*Common `xml:"nostr"`
- Yesexpr []*Common `xml:"yesexpr"`
- Noexpr []*Common `xml:"noexpr"`
- } `xml:"messages"`
- } `xml:"posix"`
- CharacterLabels *struct {
- Common
- CharacterLabelPattern []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"characterLabelPattern"`
- CharacterLabel []*Common `xml:"characterLabel"`
- } `xml:"characterLabels"`
- Segmentations *struct {
- Common
- Segmentation []*struct {
- Common
- Variables *struct {
- Common
- Variable []*struct {
- Common
- Id string `xml:"id,attr"`
- } `xml:"variable"`
- } `xml:"variables"`
- SegmentRules *struct {
- Common
- Rule []*struct {
- Common
- Id string `xml:"id,attr"`
- } `xml:"rule"`
- } `xml:"segmentRules"`
- Exceptions *struct {
- Common
- Exception []*Common `xml:"exception"`
- } `xml:"exceptions"`
- Suppressions *struct {
- Common
- Suppression []*Common `xml:"suppression"`
- } `xml:"suppressions"`
- } `xml:"segmentation"`
- } `xml:"segmentations"`
- Rbnf *struct {
- Common
- RulesetGrouping []*struct {
- Common
- Ruleset []*struct {
- Common
- Access string `xml:"access,attr"`
- AllowsParsing string `xml:"allowsParsing,attr"`
- Rbnfrule []*struct {
- Common
- Value string `xml:"value,attr"`
- Radix string `xml:"radix,attr"`
- Decexp string `xml:"decexp,attr"`
- } `xml:"rbnfrule"`
- } `xml:"ruleset"`
- } `xml:"rulesetGrouping"`
- } `xml:"rbnf"`
- Annotations *struct {
- Common
- Annotation []*struct {
- Common
- Cp string `xml:"cp,attr"`
- Tts string `xml:"tts,attr"`
- } `xml:"annotation"`
- } `xml:"annotations"`
- Metadata *struct {
- Common
- CasingData *struct {
- Common
- CasingItem []*struct {
- Common
- Override string `xml:"override,attr"`
- ForceError string `xml:"forceError,attr"`
- } `xml:"casingItem"`
- } `xml:"casingData"`
- } `xml:"metadata"`
- References *struct {
- Common
- Reference []*struct {
- Common
- Uri string `xml:"uri,attr"`
- } `xml:"reference"`
- } `xml:"references"`
-}
-
-// Collation contains rules that specify a certain sort-order,
-// as a tailoring of the root order.
-// The parsed rules are obtained by passing a RuleProcessor to Collation's
-// Process method.
-type Collation struct {
- Common
- Visibility string `xml:"visibility,attr"`
- Base *Common `xml:"base"`
- Import []*struct {
- Common
- Source string `xml:"source,attr"`
- } `xml:"import"`
- Settings *struct {
- Common
- Strength string `xml:"strength,attr"`
- Alternate string `xml:"alternate,attr"`
- Backwards string `xml:"backwards,attr"`
- Normalization string `xml:"normalization,attr"`
- CaseLevel string `xml:"caseLevel,attr"`
- CaseFirst string `xml:"caseFirst,attr"`
- HiraganaQuaternary string `xml:"hiraganaQuaternary,attr"`
- MaxVariable string `xml:"maxVariable,attr"`
- Numeric string `xml:"numeric,attr"`
- Private string `xml:"private,attr"`
- VariableTop string `xml:"variableTop,attr"`
- Reorder string `xml:"reorder,attr"`
- } `xml:"settings"`
- SuppressContractions *Common `xml:"suppress_contractions"`
- Optimize *Common `xml:"optimize"`
- Cr []*Common `xml:"cr"`
- rulesElem
-}
-
-// Calendar specifies the fields used for formatting and parsing dates and times.
-// The month and quarter names are identified numerically, starting at 1.
-// The day (of the week) names are identified with short strings, since there is
-// no universally-accepted numeric designation.
-type Calendar struct {
- Common
- Months *struct {
- Common
- MonthContext []*struct {
- Common
- MonthWidth []*struct {
- Common
- Month []*struct {
- Common
- Yeartype string `xml:"yeartype,attr"`
- } `xml:"month"`
- } `xml:"monthWidth"`
- } `xml:"monthContext"`
- } `xml:"months"`
- MonthNames *struct {
- Common
- Month []*struct {
- Common
- Yeartype string `xml:"yeartype,attr"`
- } `xml:"month"`
- } `xml:"monthNames"`
- MonthAbbr *struct {
- Common
- Month []*struct {
- Common
- Yeartype string `xml:"yeartype,attr"`
- } `xml:"month"`
- } `xml:"monthAbbr"`
- MonthPatterns *struct {
- Common
- MonthPatternContext []*struct {
- Common
- MonthPatternWidth []*struct {
- Common
- MonthPattern []*Common `xml:"monthPattern"`
- } `xml:"monthPatternWidth"`
- } `xml:"monthPatternContext"`
- } `xml:"monthPatterns"`
- Days *struct {
- Common
- DayContext []*struct {
- Common
- DayWidth []*struct {
- Common
- Day []*Common `xml:"day"`
- } `xml:"dayWidth"`
- } `xml:"dayContext"`
- } `xml:"days"`
- DayNames *struct {
- Common
- Day []*Common `xml:"day"`
- } `xml:"dayNames"`
- DayAbbr *struct {
- Common
- Day []*Common `xml:"day"`
- } `xml:"dayAbbr"`
- Quarters *struct {
- Common
- QuarterContext []*struct {
- Common
- QuarterWidth []*struct {
- Common
- Quarter []*Common `xml:"quarter"`
- } `xml:"quarterWidth"`
- } `xml:"quarterContext"`
- } `xml:"quarters"`
- Week *struct {
- Common
- MinDays []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"minDays"`
- FirstDay []*struct {
- Common
- Day string `xml:"day,attr"`
- } `xml:"firstDay"`
- WeekendStart []*struct {
- Common
- Day string `xml:"day,attr"`
- Time string `xml:"time,attr"`
- } `xml:"weekendStart"`
- WeekendEnd []*struct {
- Common
- Day string `xml:"day,attr"`
- Time string `xml:"time,attr"`
- } `xml:"weekendEnd"`
- } `xml:"week"`
- Am []*Common `xml:"am"`
- Pm []*Common `xml:"pm"`
- DayPeriods *struct {
- Common
- DayPeriodContext []*struct {
- Common
- DayPeriodWidth []*struct {
- Common
- DayPeriod []*Common `xml:"dayPeriod"`
- } `xml:"dayPeriodWidth"`
- } `xml:"dayPeriodContext"`
- } `xml:"dayPeriods"`
- Eras *struct {
- Common
- EraNames *struct {
- Common
- Era []*Common `xml:"era"`
- } `xml:"eraNames"`
- EraAbbr *struct {
- Common
- Era []*Common `xml:"era"`
- } `xml:"eraAbbr"`
- EraNarrow *struct {
- Common
- Era []*Common `xml:"era"`
- } `xml:"eraNarrow"`
- } `xml:"eras"`
- CyclicNameSets *struct {
- Common
- CyclicNameSet []*struct {
- Common
- CyclicNameContext []*struct {
- Common
- CyclicNameWidth []*struct {
- Common
- CyclicName []*Common `xml:"cyclicName"`
- } `xml:"cyclicNameWidth"`
- } `xml:"cyclicNameContext"`
- } `xml:"cyclicNameSet"`
- } `xml:"cyclicNameSets"`
- DateFormats *struct {
- Common
- DateFormatLength []*struct {
- Common
- DateFormat []*struct {
- Common
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- DisplayName []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"displayName"`
- } `xml:"dateFormat"`
- } `xml:"dateFormatLength"`
- } `xml:"dateFormats"`
- TimeFormats *struct {
- Common
- TimeFormatLength []*struct {
- Common
- TimeFormat []*struct {
- Common
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- DisplayName []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"displayName"`
- } `xml:"timeFormat"`
- } `xml:"timeFormatLength"`
- } `xml:"timeFormats"`
- DateTimeFormats *struct {
- Common
- DateTimeFormatLength []*struct {
- Common
- DateTimeFormat []*struct {
- Common
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- DisplayName []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"displayName"`
- } `xml:"dateTimeFormat"`
- } `xml:"dateTimeFormatLength"`
- AvailableFormats []*struct {
- Common
- DateFormatItem []*struct {
- Common
- Id string `xml:"id,attr"`
- Count string `xml:"count,attr"`
- } `xml:"dateFormatItem"`
- } `xml:"availableFormats"`
- AppendItems []*struct {
- Common
- AppendItem []*struct {
- Common
- Request string `xml:"request,attr"`
- } `xml:"appendItem"`
- } `xml:"appendItems"`
- IntervalFormats []*struct {
- Common
- IntervalFormatFallback []*Common `xml:"intervalFormatFallback"`
- IntervalFormatItem []*struct {
- Common
- Id string `xml:"id,attr"`
- GreatestDifference []*struct {
- Common
- Id string `xml:"id,attr"`
- } `xml:"greatestDifference"`
- } `xml:"intervalFormatItem"`
- } `xml:"intervalFormats"`
- } `xml:"dateTimeFormats"`
- Fields []*struct {
- Common
- Field []*struct {
- Common
- DisplayName []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"displayName"`
- Relative []*Common `xml:"relative"`
- RelativeTime []*struct {
- Common
- RelativeTimePattern []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"relativeTimePattern"`
- } `xml:"relativeTime"`
- RelativePeriod []*Common `xml:"relativePeriod"`
- } `xml:"field"`
- } `xml:"fields"`
-}
-type TimeZoneNames struct {
- Common
- HourFormat []*Common `xml:"hourFormat"`
- HoursFormat []*Common `xml:"hoursFormat"`
- GmtFormat []*Common `xml:"gmtFormat"`
- GmtZeroFormat []*Common `xml:"gmtZeroFormat"`
- RegionFormat []*Common `xml:"regionFormat"`
- FallbackFormat []*Common `xml:"fallbackFormat"`
- FallbackRegionFormat []*Common `xml:"fallbackRegionFormat"`
- AbbreviationFallback []*Common `xml:"abbreviationFallback"`
- PreferenceOrdering []*Common `xml:"preferenceOrdering"`
- SingleCountries []*struct {
- Common
- List string `xml:"list,attr"`
- } `xml:"singleCountries"`
- Zone []*struct {
- Common
- Long []*struct {
- Common
- Generic []*Common `xml:"generic"`
- Standard []*Common `xml:"standard"`
- Daylight []*Common `xml:"daylight"`
- } `xml:"long"`
- Short []*struct {
- Common
- Generic []*Common `xml:"generic"`
- Standard []*Common `xml:"standard"`
- Daylight []*Common `xml:"daylight"`
- } `xml:"short"`
- CommonlyUsed []*struct {
- Common
- Used string `xml:"used,attr"`
- } `xml:"commonlyUsed"`
- ExemplarCity []*Common `xml:"exemplarCity"`
- } `xml:"zone"`
- Metazone []*struct {
- Common
- Long []*struct {
- Common
- Generic []*Common `xml:"generic"`
- Standard []*Common `xml:"standard"`
- Daylight []*Common `xml:"daylight"`
- } `xml:"long"`
- Short []*struct {
- Common
- Generic []*Common `xml:"generic"`
- Standard []*Common `xml:"standard"`
- Daylight []*Common `xml:"daylight"`
- } `xml:"short"`
- CommonlyUsed []*struct {
- Common
- Used string `xml:"used,attr"`
- } `xml:"commonlyUsed"`
- } `xml:"metazone"`
-}
-
-// LocaleDisplayNames specifies localized display names for for scripts, languages,
-// countries, currencies, and variants.
-type LocaleDisplayNames struct {
- Common
- LocaleDisplayPattern *struct {
- Common
- LocalePattern []*Common `xml:"localePattern"`
- LocaleSeparator []*Common `xml:"localeSeparator"`
- LocaleKeyTypePattern []*Common `xml:"localeKeyTypePattern"`
- } `xml:"localeDisplayPattern"`
- Languages *struct {
- Common
- Language []*Common `xml:"language"`
- } `xml:"languages"`
- Scripts *struct {
- Common
- Script []*Common `xml:"script"`
- } `xml:"scripts"`
- Territories *struct {
- Common
- Territory []*Common `xml:"territory"`
- } `xml:"territories"`
- Subdivisions *struct {
- Common
- Subdivision []*Common `xml:"subdivision"`
- } `xml:"subdivisions"`
- Variants *struct {
- Common
- Variant []*Common `xml:"variant"`
- } `xml:"variants"`
- Keys *struct {
- Common
- Key []*Common `xml:"key"`
- } `xml:"keys"`
- Types *struct {
- Common
- Type []*struct {
- Common
- Key string `xml:"key,attr"`
- } `xml:"type"`
- } `xml:"types"`
- TransformNames *struct {
- Common
- TransformName []*Common `xml:"transformName"`
- } `xml:"transformNames"`
- MeasurementSystemNames *struct {
- Common
- MeasurementSystemName []*Common `xml:"measurementSystemName"`
- } `xml:"measurementSystemNames"`
- CodePatterns *struct {
- Common
- CodePattern []*Common `xml:"codePattern"`
- } `xml:"codePatterns"`
-}
-
-// Numbers supplies information for formatting and parsing numbers and currencies.
-type Numbers struct {
- Common
- DefaultNumberingSystem []*Common `xml:"defaultNumberingSystem"`
- OtherNumberingSystems []*struct {
- Common
- Native []*Common `xml:"native"`
- Traditional []*Common `xml:"traditional"`
- Finance []*Common `xml:"finance"`
- } `xml:"otherNumberingSystems"`
- MinimumGroupingDigits []*Common `xml:"minimumGroupingDigits"`
- Symbols []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- Decimal []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"decimal"`
- Group []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"group"`
- List []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"list"`
- PercentSign []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"percentSign"`
- NativeZeroDigit []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"nativeZeroDigit"`
- PatternDigit []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"patternDigit"`
- PlusSign []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"plusSign"`
- MinusSign []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"minusSign"`
- Exponential []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"exponential"`
- SuperscriptingExponent []*Common `xml:"superscriptingExponent"`
- PerMille []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"perMille"`
- Infinity []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"infinity"`
- Nan []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"nan"`
- CurrencyDecimal []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"currencyDecimal"`
- CurrencyGroup []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"currencyGroup"`
- TimeSeparator []*Common `xml:"timeSeparator"`
- } `xml:"symbols"`
- DecimalFormats []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- DecimalFormatLength []*struct {
- Common
- DecimalFormat []*struct {
- Common
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- } `xml:"decimalFormat"`
- } `xml:"decimalFormatLength"`
- } `xml:"decimalFormats"`
- ScientificFormats []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- ScientificFormatLength []*struct {
- Common
- ScientificFormat []*struct {
- Common
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- } `xml:"scientificFormat"`
- } `xml:"scientificFormatLength"`
- } `xml:"scientificFormats"`
- PercentFormats []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- PercentFormatLength []*struct {
- Common
- PercentFormat []*struct {
- Common
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- } `xml:"percentFormat"`
- } `xml:"percentFormatLength"`
- } `xml:"percentFormats"`
- CurrencyFormats []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- CurrencySpacing []*struct {
- Common
- BeforeCurrency []*struct {
- Common
- CurrencyMatch []*Common `xml:"currencyMatch"`
- SurroundingMatch []*Common `xml:"surroundingMatch"`
- InsertBetween []*Common `xml:"insertBetween"`
- } `xml:"beforeCurrency"`
- AfterCurrency []*struct {
- Common
- CurrencyMatch []*Common `xml:"currencyMatch"`
- SurroundingMatch []*Common `xml:"surroundingMatch"`
- InsertBetween []*Common `xml:"insertBetween"`
- } `xml:"afterCurrency"`
- } `xml:"currencySpacing"`
- CurrencyFormatLength []*struct {
- Common
- CurrencyFormat []*struct {
- Common
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- } `xml:"currencyFormat"`
- } `xml:"currencyFormatLength"`
- UnitPattern []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"unitPattern"`
- } `xml:"currencyFormats"`
- Currencies *struct {
- Common
- Currency []*struct {
- Common
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- DisplayName []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"displayName"`
- Symbol []*Common `xml:"symbol"`
- Decimal []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"decimal"`
- Group []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- } `xml:"group"`
- } `xml:"currency"`
- } `xml:"currencies"`
- MiscPatterns []*struct {
- Common
- NumberSystem string `xml:"numberSystem,attr"`
- Pattern []*struct {
- Common
- Numbers string `xml:"numbers,attr"`
- Count string `xml:"count,attr"`
- } `xml:"pattern"`
- } `xml:"miscPatterns"`
- MinimalPairs []*struct {
- Common
- PluralMinimalPairs []*struct {
- Common
- Count string `xml:"count,attr"`
- } `xml:"pluralMinimalPairs"`
- OrdinalMinimalPairs []*struct {
- Common
- Ordinal string `xml:"ordinal,attr"`
- } `xml:"ordinalMinimalPairs"`
- } `xml:"minimalPairs"`
-}
-
-// Version is the version of CLDR from which the XML definitions are generated.
-const Version = "31"
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen.go
deleted file mode 100644
index 03d9f99ad..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// This program generates the trie for width operations. The generated table
-// includes width category information as well as the normalization mappings.
-package main
-
-import (
- "bytes"
- "fmt"
- "io"
- "log"
- "math"
- "unicode/utf8"
-
- "golang.org/x/text/internal/gen"
- "golang.org/x/text/internal/triegen"
-)
-
-// See gen_common.go for flags.
-
-func main() {
- gen.Init()
- genTables()
- genTests()
- gen.Repackage("gen_trieval.go", "trieval.go", "width")
- gen.Repackage("gen_common.go", "common_test.go", "width")
-}
-
-func genTables() {
- t := triegen.NewTrie("width")
- // fold and inverse mappings. See mapComment for a description of the format
- // of each entry. Add dummy value to make an index of 0 mean no mapping.
- inverse := [][4]byte{{}}
- mapping := map[[4]byte]int{[4]byte{}: 0}
-
- getWidthData(func(r rune, tag elem, alt rune) {
- idx := 0
- if alt != 0 {
- var buf [4]byte
- buf[0] = byte(utf8.EncodeRune(buf[1:], alt))
- s := string(r)
- buf[buf[0]] ^= s[len(s)-1]
- var ok bool
- if idx, ok = mapping[buf]; !ok {
- idx = len(mapping)
- if idx > math.MaxUint8 {
- log.Fatalf("Index %d does not fit in a byte.", idx)
- }
- mapping[buf] = idx
- inverse = append(inverse, buf)
- }
- }
- t.Insert(r, uint64(tag|elem(idx)))
- })
-
- w := &bytes.Buffer{}
- gen.WriteUnicodeVersion(w)
-
- sz, err := t.Gen(w)
- if err != nil {
- log.Fatal(err)
- }
-
- sz += writeMappings(w, inverse)
-
- fmt.Fprintf(w, "// Total table size %d bytes (%dKiB)\n", sz, sz/1024)
-
- gen.WriteGoFile(*outputFile, "width", w.Bytes())
-}
-
-const inverseDataComment = `
-// inverseData contains 4-byte entries of the following format:
-// <0 padding>
-// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the
-// UTF-8 encoding of the original rune. Mappings often have the following
-// pattern:
-// A -> A (U+FF21 -> U+0041)
-// B -> B (U+FF22 -> U+0042)
-// ...
-// By xor-ing the last byte the same entry can be shared by many mappings. This
-// reduces the total number of distinct entries by about two thirds.
-// The resulting entry for the aforementioned mappings is
-// { 0x01, 0xE0, 0x00, 0x00 }
-// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get
-// E0 ^ A1 = 41.
-// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get
-// E0 ^ A2 = 42.
-// Note that because of the xor-ing, the byte sequence stored in the entry is
-// not valid UTF-8.`
-
-func writeMappings(w io.Writer, data [][4]byte) int {
- fmt.Fprintln(w, inverseDataComment)
- fmt.Fprintf(w, "var inverseData = [%d][4]byte{\n", len(data))
- for _, x := range data {
- fmt.Fprintf(w, "{ 0x%02x, 0x%02x, 0x%02x, 0x%02x },\n", x[0], x[1], x[2], x[3])
- }
- fmt.Fprintln(w, "}")
- return len(data) * 4
-}
-
-func genTests() {
- w := &bytes.Buffer{}
- fmt.Fprintf(w, "\nvar mapRunes = map[rune]struct{r rune; e elem}{\n")
- getWidthData(func(r rune, tag elem, alt rune) {
- if alt != 0 {
- fmt.Fprintf(w, "\t0x%X: {0x%X, 0x%X},\n", r, alt, tag)
- }
- })
- fmt.Fprintln(w, "}")
- gen.WriteGoFile("runes_test.go", "width", w.Bytes())
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen_common.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen_common.go
deleted file mode 100644
index 601e75268..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen_common.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-// This code is shared between the main code generator and the test code.
-
-import (
- "flag"
- "log"
- "strconv"
- "strings"
-
- "golang.org/x/text/internal/gen"
- "golang.org/x/text/internal/ucd"
-)
-
-var (
- outputFile = flag.String("out", "tables.go", "output file")
-)
-
-var typeMap = map[string]elem{
- "A": tagAmbiguous,
- "N": tagNeutral,
- "Na": tagNarrow,
- "W": tagWide,
- "F": tagFullwidth,
- "H": tagHalfwidth,
-}
-
-// getWidthData calls f for every entry for which it is defined.
-//
-// f may be called multiple times for the same rune. The last call to f is the
-// correct value. f is not called for all runes. The default tag type is
-// Neutral.
-func getWidthData(f func(r rune, tag elem, alt rune)) {
- // Set the default values for Unified Ideographs. In line with Annex 11,
- // we encode full ranges instead of the defined runes in Unified_Ideograph.
- for _, b := range []struct{ lo, hi rune }{
- {0x4E00, 0x9FFF}, // the CJK Unified Ideographs block,
- {0x3400, 0x4DBF}, // the CJK Unified Ideographs Externsion A block,
- {0xF900, 0xFAFF}, // the CJK Compatibility Ideographs block,
- {0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane,
- {0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane,
- } {
- for r := b.lo; r <= b.hi; r++ {
- f(r, tagWide, 0)
- }
- }
-
- inverse := map[rune]rune{}
- maps := map[string]bool{
- "": true,
- "": true,
- }
-
- // We cannot reuse package norm's decomposition, as we need an unexpanded
- // decomposition. We make use of the opportunity to verify that the
- // decomposition type is as expected.
- ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) {
- r := p.Rune(0)
- s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2)
- if !maps[s[0]] {
- return
- }
- x, err := strconv.ParseUint(s[1], 16, 32)
- if err != nil {
- log.Fatalf("Error parsing rune %q", s[1])
- }
- if inverse[r] != 0 || inverse[rune(x)] != 0 {
- log.Fatalf("Circular dependency in mapping between %U and %U", r, x)
- }
- inverse[r] = rune(x)
- inverse[rune(x)] = r
- })
-
- // ;
- ucd.Parse(gen.OpenUCDFile("EastAsianWidth.txt"), func(p *ucd.Parser) {
- tag, ok := typeMap[p.String(1)]
- if !ok {
- log.Fatalf("Unknown width type %q", p.String(1))
- }
- r := p.Rune(0)
- alt, ok := inverse[r]
- if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign {
- tag |= tagNeedsFold
- if !ok {
- log.Fatalf("Narrow or wide rune %U has no decomposition", r)
- }
- }
- f(r, tag, alt)
- })
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen_trieval.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen_trieval.go
deleted file mode 100644
index c17334aa6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/gen_trieval.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-// elem is an entry of the width trie. The high byte is used to encode the type
-// of the rune. The low byte is used to store the index to a mapping entry in
-// the inverseData array.
-type elem uint16
-
-const (
- tagNeutral elem = iota << typeShift
- tagAmbiguous
- tagWide
- tagNarrow
- tagFullwidth
- tagHalfwidth
-)
-
-const (
- numTypeBits = 3
- typeShift = 16 - numTypeBits
-
- // tagNeedsFold is true for all fullwidth and halfwidth runes except for
- // the Won sign U+20A9.
- tagNeedsFold = 0x1000
-
- // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide
- // variant.
- wonSign rune = 0x20A9
-)
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/kind_string.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/kind_string.go
deleted file mode 100644
index 49bfbf726..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/kind_string.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Code generated by "stringer -type=Kind"; DO NOT EDIT.
-
-package width
-
-import "fmt"
-
-const _Kind_name = "NeutralEastAsianAmbiguousEastAsianWideEastAsianNarrowEastAsianFullwidthEastAsianHalfwidth"
-
-var _Kind_index = [...]uint8{0, 7, 25, 38, 53, 71, 89}
-
-func (i Kind) String() string {
- if i < 0 || i >= Kind(len(_Kind_index)-1) {
- return fmt.Sprintf("Kind(%d)", i)
- }
- return _Kind_name[_Kind_index[i]:_Kind_index[i+1]]
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/tables.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/tables.go
deleted file mode 100644
index e21f0b838..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/tables.go
+++ /dev/null
@@ -1,1284 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-package width
-
-// UnicodeVersion is the Unicode version from which the tables in this package are derived.
-const UnicodeVersion = "9.0.0"
-
-// lookup returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *widthTrie) lookup(s []byte) (v uint16, sz int) {
- c0 := s[0]
- switch {
- case c0 < 0x80: // is ASCII
- return widthValues[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 := widthIndex[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 := widthIndex[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 = widthIndex[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 := widthIndex[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 = widthIndex[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 = widthIndex[o]
- c3 := s[3]
- if c3 < 0x80 || 0xC0 <= c3 {
- return 0, 3 // Illegal UTF-8: not a continuation byte.
- }
- return t.lookupValue(uint32(i), c3), 4
- }
- // Illegal rune
- return 0, 1
-}
-
-// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *widthTrie) lookupUnsafe(s []byte) uint16 {
- c0 := s[0]
- if c0 < 0x80 { // is ASCII
- return widthValues[c0]
- }
- i := widthIndex[c0]
- if c0 < 0xE0 { // 2-byte UTF-8
- return t.lookupValue(uint32(i), s[1])
- }
- i = widthIndex[uint32(i)<<6+uint32(s[1])]
- if c0 < 0xF0 { // 3-byte UTF-8
- return t.lookupValue(uint32(i), s[2])
- }
- i = widthIndex[uint32(i)<<6+uint32(s[2])]
- if c0 < 0xF8 { // 4-byte UTF-8
- return t.lookupValue(uint32(i), s[3])
- }
- return 0
-}
-
-// lookupString returns the trie value for the first UTF-8 encoding in s and
-// the width in bytes of this encoding. The size will be 0 if s does not
-// hold enough bytes to complete the encoding. len(s) must be greater than 0.
-func (t *widthTrie) lookupString(s string) (v uint16, sz int) {
- c0 := s[0]
- switch {
- case c0 < 0x80: // is ASCII
- return widthValues[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 := widthIndex[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 := widthIndex[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 = widthIndex[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 := widthIndex[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 = widthIndex[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 = widthIndex[o]
- c3 := s[3]
- if c3 < 0x80 || 0xC0 <= c3 {
- return 0, 3 // Illegal UTF-8: not a continuation byte.
- }
- return t.lookupValue(uint32(i), c3), 4
- }
- // Illegal rune
- return 0, 1
-}
-
-// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
-// s must start with a full and valid UTF-8 encoded rune.
-func (t *widthTrie) lookupStringUnsafe(s string) uint16 {
- c0 := s[0]
- if c0 < 0x80 { // is ASCII
- return widthValues[c0]
- }
- i := widthIndex[c0]
- if c0 < 0xE0 { // 2-byte UTF-8
- return t.lookupValue(uint32(i), s[1])
- }
- i = widthIndex[uint32(i)<<6+uint32(s[1])]
- if c0 < 0xF0 { // 3-byte UTF-8
- return t.lookupValue(uint32(i), s[2])
- }
- i = widthIndex[uint32(i)<<6+uint32(s[2])]
- if c0 < 0xF8 { // 4-byte UTF-8
- return t.lookupValue(uint32(i), s[3])
- }
- return 0
-}
-
-// widthTrie. Total size: 14080 bytes (13.75 KiB). Checksum: 3b8aeb3dc03667a3.
-type widthTrie struct{}
-
-func newWidthTrie(i int) *widthTrie {
- return &widthTrie{}
-}
-
-// lookupValue determines the type of block n and looks up the value for b.
-func (t *widthTrie) lookupValue(n uint32, b byte) uint16 {
- switch {
- default:
- return uint16(widthValues[n<<6+uint32(b)])
- }
-}
-
-// widthValues: 99 blocks, 6336 entries, 12672 bytes
-// The third block is the zero block.
-var widthValues = [6336]uint16{
- // Block 0x0, offset 0x0
- 0x20: 0x6001, 0x21: 0x6002, 0x22: 0x6002, 0x23: 0x6002,
- 0x24: 0x6002, 0x25: 0x6002, 0x26: 0x6002, 0x27: 0x6002, 0x28: 0x6002, 0x29: 0x6002,
- 0x2a: 0x6002, 0x2b: 0x6002, 0x2c: 0x6002, 0x2d: 0x6002, 0x2e: 0x6002, 0x2f: 0x6002,
- 0x30: 0x6002, 0x31: 0x6002, 0x32: 0x6002, 0x33: 0x6002, 0x34: 0x6002, 0x35: 0x6002,
- 0x36: 0x6002, 0x37: 0x6002, 0x38: 0x6002, 0x39: 0x6002, 0x3a: 0x6002, 0x3b: 0x6002,
- 0x3c: 0x6002, 0x3d: 0x6002, 0x3e: 0x6002, 0x3f: 0x6002,
- // Block 0x1, offset 0x40
- 0x40: 0x6003, 0x41: 0x6003, 0x42: 0x6003, 0x43: 0x6003, 0x44: 0x6003, 0x45: 0x6003,
- 0x46: 0x6003, 0x47: 0x6003, 0x48: 0x6003, 0x49: 0x6003, 0x4a: 0x6003, 0x4b: 0x6003,
- 0x4c: 0x6003, 0x4d: 0x6003, 0x4e: 0x6003, 0x4f: 0x6003, 0x50: 0x6003, 0x51: 0x6003,
- 0x52: 0x6003, 0x53: 0x6003, 0x54: 0x6003, 0x55: 0x6003, 0x56: 0x6003, 0x57: 0x6003,
- 0x58: 0x6003, 0x59: 0x6003, 0x5a: 0x6003, 0x5b: 0x6003, 0x5c: 0x6003, 0x5d: 0x6003,
- 0x5e: 0x6003, 0x5f: 0x6003, 0x60: 0x6004, 0x61: 0x6004, 0x62: 0x6004, 0x63: 0x6004,
- 0x64: 0x6004, 0x65: 0x6004, 0x66: 0x6004, 0x67: 0x6004, 0x68: 0x6004, 0x69: 0x6004,
- 0x6a: 0x6004, 0x6b: 0x6004, 0x6c: 0x6004, 0x6d: 0x6004, 0x6e: 0x6004, 0x6f: 0x6004,
- 0x70: 0x6004, 0x71: 0x6004, 0x72: 0x6004, 0x73: 0x6004, 0x74: 0x6004, 0x75: 0x6004,
- 0x76: 0x6004, 0x77: 0x6004, 0x78: 0x6004, 0x79: 0x6004, 0x7a: 0x6004, 0x7b: 0x6004,
- 0x7c: 0x6004, 0x7d: 0x6004, 0x7e: 0x6004,
- // Block 0x2, offset 0x80
- // Block 0x3, offset 0xc0
- 0xe1: 0x2000, 0xe2: 0x6005, 0xe3: 0x6005,
- 0xe4: 0x2000, 0xe5: 0x6006, 0xe6: 0x6005, 0xe7: 0x2000, 0xe8: 0x2000,
- 0xea: 0x2000, 0xec: 0x6007, 0xed: 0x2000, 0xee: 0x2000, 0xef: 0x6008,
- 0xf0: 0x2000, 0xf1: 0x2000, 0xf2: 0x2000, 0xf3: 0x2000, 0xf4: 0x2000,
- 0xf6: 0x2000, 0xf7: 0x2000, 0xf8: 0x2000, 0xf9: 0x2000, 0xfa: 0x2000,
- 0xfc: 0x2000, 0xfd: 0x2000, 0xfe: 0x2000, 0xff: 0x2000,
- // Block 0x4, offset 0x100
- 0x106: 0x2000,
- 0x110: 0x2000,
- 0x117: 0x2000,
- 0x118: 0x2000,
- 0x11e: 0x2000, 0x11f: 0x2000, 0x120: 0x2000, 0x121: 0x2000,
- 0x126: 0x2000, 0x128: 0x2000, 0x129: 0x2000,
- 0x12a: 0x2000, 0x12c: 0x2000, 0x12d: 0x2000,
- 0x130: 0x2000, 0x132: 0x2000, 0x133: 0x2000,
- 0x137: 0x2000, 0x138: 0x2000, 0x139: 0x2000, 0x13a: 0x2000,
- 0x13c: 0x2000, 0x13e: 0x2000,
- // Block 0x5, offset 0x140
- 0x141: 0x2000,
- 0x151: 0x2000,
- 0x153: 0x2000,
- 0x15b: 0x2000,
- 0x166: 0x2000, 0x167: 0x2000,
- 0x16b: 0x2000,
- 0x171: 0x2000, 0x172: 0x2000, 0x173: 0x2000,
- 0x178: 0x2000,
- 0x17f: 0x2000,
- // Block 0x6, offset 0x180
- 0x180: 0x2000, 0x181: 0x2000, 0x182: 0x2000, 0x184: 0x2000,
- 0x188: 0x2000, 0x189: 0x2000, 0x18a: 0x2000, 0x18b: 0x2000,
- 0x18d: 0x2000,
- 0x192: 0x2000, 0x193: 0x2000,
- 0x1a6: 0x2000, 0x1a7: 0x2000,
- 0x1ab: 0x2000,
- // Block 0x7, offset 0x1c0
- 0x1ce: 0x2000, 0x1d0: 0x2000,
- 0x1d2: 0x2000, 0x1d4: 0x2000, 0x1d6: 0x2000,
- 0x1d8: 0x2000, 0x1da: 0x2000, 0x1dc: 0x2000,
- // Block 0x8, offset 0x200
- 0x211: 0x2000,
- 0x221: 0x2000,
- // Block 0x9, offset 0x240
- 0x244: 0x2000,
- 0x247: 0x2000, 0x249: 0x2000, 0x24a: 0x2000, 0x24b: 0x2000,
- 0x24d: 0x2000, 0x250: 0x2000,
- 0x258: 0x2000, 0x259: 0x2000, 0x25a: 0x2000, 0x25b: 0x2000, 0x25d: 0x2000,
- 0x25f: 0x2000,
- // Block 0xa, offset 0x280
- 0x280: 0x2000, 0x281: 0x2000, 0x282: 0x2000, 0x283: 0x2000, 0x284: 0x2000, 0x285: 0x2000,
- 0x286: 0x2000, 0x287: 0x2000, 0x288: 0x2000, 0x289: 0x2000, 0x28a: 0x2000, 0x28b: 0x2000,
- 0x28c: 0x2000, 0x28d: 0x2000, 0x28e: 0x2000, 0x28f: 0x2000, 0x290: 0x2000, 0x291: 0x2000,
- 0x292: 0x2000, 0x293: 0x2000, 0x294: 0x2000, 0x295: 0x2000, 0x296: 0x2000, 0x297: 0x2000,
- 0x298: 0x2000, 0x299: 0x2000, 0x29a: 0x2000, 0x29b: 0x2000, 0x29c: 0x2000, 0x29d: 0x2000,
- 0x29e: 0x2000, 0x29f: 0x2000, 0x2a0: 0x2000, 0x2a1: 0x2000, 0x2a2: 0x2000, 0x2a3: 0x2000,
- 0x2a4: 0x2000, 0x2a5: 0x2000, 0x2a6: 0x2000, 0x2a7: 0x2000, 0x2a8: 0x2000, 0x2a9: 0x2000,
- 0x2aa: 0x2000, 0x2ab: 0x2000, 0x2ac: 0x2000, 0x2ad: 0x2000, 0x2ae: 0x2000, 0x2af: 0x2000,
- 0x2b0: 0x2000, 0x2b1: 0x2000, 0x2b2: 0x2000, 0x2b3: 0x2000, 0x2b4: 0x2000, 0x2b5: 0x2000,
- 0x2b6: 0x2000, 0x2b7: 0x2000, 0x2b8: 0x2000, 0x2b9: 0x2000, 0x2ba: 0x2000, 0x2bb: 0x2000,
- 0x2bc: 0x2000, 0x2bd: 0x2000, 0x2be: 0x2000, 0x2bf: 0x2000,
- // Block 0xb, offset 0x2c0
- 0x2c0: 0x2000, 0x2c1: 0x2000, 0x2c2: 0x2000, 0x2c3: 0x2000, 0x2c4: 0x2000, 0x2c5: 0x2000,
- 0x2c6: 0x2000, 0x2c7: 0x2000, 0x2c8: 0x2000, 0x2c9: 0x2000, 0x2ca: 0x2000, 0x2cb: 0x2000,
- 0x2cc: 0x2000, 0x2cd: 0x2000, 0x2ce: 0x2000, 0x2cf: 0x2000, 0x2d0: 0x2000, 0x2d1: 0x2000,
- 0x2d2: 0x2000, 0x2d3: 0x2000, 0x2d4: 0x2000, 0x2d5: 0x2000, 0x2d6: 0x2000, 0x2d7: 0x2000,
- 0x2d8: 0x2000, 0x2d9: 0x2000, 0x2da: 0x2000, 0x2db: 0x2000, 0x2dc: 0x2000, 0x2dd: 0x2000,
- 0x2de: 0x2000, 0x2df: 0x2000, 0x2e0: 0x2000, 0x2e1: 0x2000, 0x2e2: 0x2000, 0x2e3: 0x2000,
- 0x2e4: 0x2000, 0x2e5: 0x2000, 0x2e6: 0x2000, 0x2e7: 0x2000, 0x2e8: 0x2000, 0x2e9: 0x2000,
- 0x2ea: 0x2000, 0x2eb: 0x2000, 0x2ec: 0x2000, 0x2ed: 0x2000, 0x2ee: 0x2000, 0x2ef: 0x2000,
- // Block 0xc, offset 0x300
- 0x311: 0x2000,
- 0x312: 0x2000, 0x313: 0x2000, 0x314: 0x2000, 0x315: 0x2000, 0x316: 0x2000, 0x317: 0x2000,
- 0x318: 0x2000, 0x319: 0x2000, 0x31a: 0x2000, 0x31b: 0x2000, 0x31c: 0x2000, 0x31d: 0x2000,
- 0x31e: 0x2000, 0x31f: 0x2000, 0x320: 0x2000, 0x321: 0x2000, 0x323: 0x2000,
- 0x324: 0x2000, 0x325: 0x2000, 0x326: 0x2000, 0x327: 0x2000, 0x328: 0x2000, 0x329: 0x2000,
- 0x331: 0x2000, 0x332: 0x2000, 0x333: 0x2000, 0x334: 0x2000, 0x335: 0x2000,
- 0x336: 0x2000, 0x337: 0x2000, 0x338: 0x2000, 0x339: 0x2000, 0x33a: 0x2000, 0x33b: 0x2000,
- 0x33c: 0x2000, 0x33d: 0x2000, 0x33e: 0x2000, 0x33f: 0x2000,
- // Block 0xd, offset 0x340
- 0x340: 0x2000, 0x341: 0x2000, 0x343: 0x2000, 0x344: 0x2000, 0x345: 0x2000,
- 0x346: 0x2000, 0x347: 0x2000, 0x348: 0x2000, 0x349: 0x2000,
- // Block 0xe, offset 0x380
- 0x381: 0x2000,
- 0x390: 0x2000, 0x391: 0x2000,
- 0x392: 0x2000, 0x393: 0x2000, 0x394: 0x2000, 0x395: 0x2000, 0x396: 0x2000, 0x397: 0x2000,
- 0x398: 0x2000, 0x399: 0x2000, 0x39a: 0x2000, 0x39b: 0x2000, 0x39c: 0x2000, 0x39d: 0x2000,
- 0x39e: 0x2000, 0x39f: 0x2000, 0x3a0: 0x2000, 0x3a1: 0x2000, 0x3a2: 0x2000, 0x3a3: 0x2000,
- 0x3a4: 0x2000, 0x3a5: 0x2000, 0x3a6: 0x2000, 0x3a7: 0x2000, 0x3a8: 0x2000, 0x3a9: 0x2000,
- 0x3aa: 0x2000, 0x3ab: 0x2000, 0x3ac: 0x2000, 0x3ad: 0x2000, 0x3ae: 0x2000, 0x3af: 0x2000,
- 0x3b0: 0x2000, 0x3b1: 0x2000, 0x3b2: 0x2000, 0x3b3: 0x2000, 0x3b4: 0x2000, 0x3b5: 0x2000,
- 0x3b6: 0x2000, 0x3b7: 0x2000, 0x3b8: 0x2000, 0x3b9: 0x2000, 0x3ba: 0x2000, 0x3bb: 0x2000,
- 0x3bc: 0x2000, 0x3bd: 0x2000, 0x3be: 0x2000, 0x3bf: 0x2000,
- // Block 0xf, offset 0x3c0
- 0x3c0: 0x2000, 0x3c1: 0x2000, 0x3c2: 0x2000, 0x3c3: 0x2000, 0x3c4: 0x2000, 0x3c5: 0x2000,
- 0x3c6: 0x2000, 0x3c7: 0x2000, 0x3c8: 0x2000, 0x3c9: 0x2000, 0x3ca: 0x2000, 0x3cb: 0x2000,
- 0x3cc: 0x2000, 0x3cd: 0x2000, 0x3ce: 0x2000, 0x3cf: 0x2000, 0x3d1: 0x2000,
- // Block 0x10, offset 0x400
- 0x400: 0x4000, 0x401: 0x4000, 0x402: 0x4000, 0x403: 0x4000, 0x404: 0x4000, 0x405: 0x4000,
- 0x406: 0x4000, 0x407: 0x4000, 0x408: 0x4000, 0x409: 0x4000, 0x40a: 0x4000, 0x40b: 0x4000,
- 0x40c: 0x4000, 0x40d: 0x4000, 0x40e: 0x4000, 0x40f: 0x4000, 0x410: 0x4000, 0x411: 0x4000,
- 0x412: 0x4000, 0x413: 0x4000, 0x414: 0x4000, 0x415: 0x4000, 0x416: 0x4000, 0x417: 0x4000,
- 0x418: 0x4000, 0x419: 0x4000, 0x41a: 0x4000, 0x41b: 0x4000, 0x41c: 0x4000, 0x41d: 0x4000,
- 0x41e: 0x4000, 0x41f: 0x4000, 0x420: 0x4000, 0x421: 0x4000, 0x422: 0x4000, 0x423: 0x4000,
- 0x424: 0x4000, 0x425: 0x4000, 0x426: 0x4000, 0x427: 0x4000, 0x428: 0x4000, 0x429: 0x4000,
- 0x42a: 0x4000, 0x42b: 0x4000, 0x42c: 0x4000, 0x42d: 0x4000, 0x42e: 0x4000, 0x42f: 0x4000,
- 0x430: 0x4000, 0x431: 0x4000, 0x432: 0x4000, 0x433: 0x4000, 0x434: 0x4000, 0x435: 0x4000,
- 0x436: 0x4000, 0x437: 0x4000, 0x438: 0x4000, 0x439: 0x4000, 0x43a: 0x4000, 0x43b: 0x4000,
- 0x43c: 0x4000, 0x43d: 0x4000, 0x43e: 0x4000, 0x43f: 0x4000,
- // Block 0x11, offset 0x440
- 0x440: 0x4000, 0x441: 0x4000, 0x442: 0x4000, 0x443: 0x4000, 0x444: 0x4000, 0x445: 0x4000,
- 0x446: 0x4000, 0x447: 0x4000, 0x448: 0x4000, 0x449: 0x4000, 0x44a: 0x4000, 0x44b: 0x4000,
- 0x44c: 0x4000, 0x44d: 0x4000, 0x44e: 0x4000, 0x44f: 0x4000, 0x450: 0x4000, 0x451: 0x4000,
- 0x452: 0x4000, 0x453: 0x4000, 0x454: 0x4000, 0x455: 0x4000, 0x456: 0x4000, 0x457: 0x4000,
- 0x458: 0x4000, 0x459: 0x4000, 0x45a: 0x4000, 0x45b: 0x4000, 0x45c: 0x4000, 0x45d: 0x4000,
- 0x45e: 0x4000, 0x45f: 0x4000,
- // Block 0x12, offset 0x480
- 0x490: 0x2000,
- 0x493: 0x2000, 0x494: 0x2000, 0x495: 0x2000, 0x496: 0x2000,
- 0x498: 0x2000, 0x499: 0x2000, 0x49c: 0x2000, 0x49d: 0x2000,
- 0x4a0: 0x2000, 0x4a1: 0x2000, 0x4a2: 0x2000,
- 0x4a4: 0x2000, 0x4a5: 0x2000, 0x4a6: 0x2000, 0x4a7: 0x2000,
- 0x4b0: 0x2000, 0x4b2: 0x2000, 0x4b3: 0x2000, 0x4b5: 0x2000,
- 0x4bb: 0x2000,
- 0x4be: 0x2000,
- // Block 0x13, offset 0x4c0
- 0x4f4: 0x2000,
- 0x4ff: 0x2000,
- // Block 0x14, offset 0x500
- 0x501: 0x2000, 0x502: 0x2000, 0x503: 0x2000, 0x504: 0x2000,
- 0x529: 0xa009,
- 0x52c: 0x2000,
- // Block 0x15, offset 0x540
- 0x543: 0x2000, 0x545: 0x2000,
- 0x549: 0x2000,
- 0x553: 0x2000, 0x556: 0x2000,
- 0x561: 0x2000, 0x562: 0x2000,
- 0x566: 0x2000,
- 0x56b: 0x2000,
- // Block 0x16, offset 0x580
- 0x593: 0x2000, 0x594: 0x2000,
- 0x59b: 0x2000, 0x59c: 0x2000, 0x59d: 0x2000,
- 0x59e: 0x2000, 0x5a0: 0x2000, 0x5a1: 0x2000, 0x5a2: 0x2000, 0x5a3: 0x2000,
- 0x5a4: 0x2000, 0x5a5: 0x2000, 0x5a6: 0x2000, 0x5a7: 0x2000, 0x5a8: 0x2000, 0x5a9: 0x2000,
- 0x5aa: 0x2000, 0x5ab: 0x2000,
- 0x5b0: 0x2000, 0x5b1: 0x2000, 0x5b2: 0x2000, 0x5b3: 0x2000, 0x5b4: 0x2000, 0x5b5: 0x2000,
- 0x5b6: 0x2000, 0x5b7: 0x2000, 0x5b8: 0x2000, 0x5b9: 0x2000,
- // Block 0x17, offset 0x5c0
- 0x5c9: 0x2000,
- 0x5d0: 0x200a, 0x5d1: 0x200b,
- 0x5d2: 0x200a, 0x5d3: 0x200c, 0x5d4: 0x2000, 0x5d5: 0x2000, 0x5d6: 0x2000, 0x5d7: 0x2000,
- 0x5d8: 0x2000, 0x5d9: 0x2000,
- 0x5f8: 0x2000, 0x5f9: 0x2000,
- // Block 0x18, offset 0x600
- 0x612: 0x2000, 0x614: 0x2000,
- 0x627: 0x2000,
- // Block 0x19, offset 0x640
- 0x640: 0x2000, 0x642: 0x2000, 0x643: 0x2000,
- 0x647: 0x2000, 0x648: 0x2000, 0x64b: 0x2000,
- 0x64f: 0x2000, 0x651: 0x2000,
- 0x655: 0x2000,
- 0x65a: 0x2000, 0x65d: 0x2000,
- 0x65e: 0x2000, 0x65f: 0x2000, 0x660: 0x2000, 0x663: 0x2000,
- 0x665: 0x2000, 0x667: 0x2000, 0x668: 0x2000, 0x669: 0x2000,
- 0x66a: 0x2000, 0x66b: 0x2000, 0x66c: 0x2000, 0x66e: 0x2000,
- 0x674: 0x2000, 0x675: 0x2000,
- 0x676: 0x2000, 0x677: 0x2000,
- 0x67c: 0x2000, 0x67d: 0x2000,
- // Block 0x1a, offset 0x680
- 0x688: 0x2000,
- 0x68c: 0x2000,
- 0x692: 0x2000,
- 0x6a0: 0x2000, 0x6a1: 0x2000,
- 0x6a4: 0x2000, 0x6a5: 0x2000, 0x6a6: 0x2000, 0x6a7: 0x2000,
- 0x6aa: 0x2000, 0x6ab: 0x2000, 0x6ae: 0x2000, 0x6af: 0x2000,
- // Block 0x1b, offset 0x6c0
- 0x6c2: 0x2000, 0x6c3: 0x2000,
- 0x6c6: 0x2000, 0x6c7: 0x2000,
- 0x6d5: 0x2000,
- 0x6d9: 0x2000,
- 0x6e5: 0x2000,
- 0x6ff: 0x2000,
- // Block 0x1c, offset 0x700
- 0x712: 0x2000,
- 0x71a: 0x4000, 0x71b: 0x4000,
- 0x729: 0x4000,
- 0x72a: 0x4000,
- // Block 0x1d, offset 0x740
- 0x769: 0x4000,
- 0x76a: 0x4000, 0x76b: 0x4000, 0x76c: 0x4000,
- 0x770: 0x4000, 0x773: 0x4000,
- // Block 0x1e, offset 0x780
- 0x7a0: 0x2000, 0x7a1: 0x2000, 0x7a2: 0x2000, 0x7a3: 0x2000,
- 0x7a4: 0x2000, 0x7a5: 0x2000, 0x7a6: 0x2000, 0x7a7: 0x2000, 0x7a8: 0x2000, 0x7a9: 0x2000,
- 0x7aa: 0x2000, 0x7ab: 0x2000, 0x7ac: 0x2000, 0x7ad: 0x2000, 0x7ae: 0x2000, 0x7af: 0x2000,
- 0x7b0: 0x2000, 0x7b1: 0x2000, 0x7b2: 0x2000, 0x7b3: 0x2000, 0x7b4: 0x2000, 0x7b5: 0x2000,
- 0x7b6: 0x2000, 0x7b7: 0x2000, 0x7b8: 0x2000, 0x7b9: 0x2000, 0x7ba: 0x2000, 0x7bb: 0x2000,
- 0x7bc: 0x2000, 0x7bd: 0x2000, 0x7be: 0x2000, 0x7bf: 0x2000,
- // Block 0x1f, offset 0x7c0
- 0x7c0: 0x2000, 0x7c1: 0x2000, 0x7c2: 0x2000, 0x7c3: 0x2000, 0x7c4: 0x2000, 0x7c5: 0x2000,
- 0x7c6: 0x2000, 0x7c7: 0x2000, 0x7c8: 0x2000, 0x7c9: 0x2000, 0x7ca: 0x2000, 0x7cb: 0x2000,
- 0x7cc: 0x2000, 0x7cd: 0x2000, 0x7ce: 0x2000, 0x7cf: 0x2000, 0x7d0: 0x2000, 0x7d1: 0x2000,
- 0x7d2: 0x2000, 0x7d3: 0x2000, 0x7d4: 0x2000, 0x7d5: 0x2000, 0x7d6: 0x2000, 0x7d7: 0x2000,
- 0x7d8: 0x2000, 0x7d9: 0x2000, 0x7da: 0x2000, 0x7db: 0x2000, 0x7dc: 0x2000, 0x7dd: 0x2000,
- 0x7de: 0x2000, 0x7df: 0x2000, 0x7e0: 0x2000, 0x7e1: 0x2000, 0x7e2: 0x2000, 0x7e3: 0x2000,
- 0x7e4: 0x2000, 0x7e5: 0x2000, 0x7e6: 0x2000, 0x7e7: 0x2000, 0x7e8: 0x2000, 0x7e9: 0x2000,
- 0x7eb: 0x2000, 0x7ec: 0x2000, 0x7ed: 0x2000, 0x7ee: 0x2000, 0x7ef: 0x2000,
- 0x7f0: 0x2000, 0x7f1: 0x2000, 0x7f2: 0x2000, 0x7f3: 0x2000, 0x7f4: 0x2000, 0x7f5: 0x2000,
- 0x7f6: 0x2000, 0x7f7: 0x2000, 0x7f8: 0x2000, 0x7f9: 0x2000, 0x7fa: 0x2000, 0x7fb: 0x2000,
- 0x7fc: 0x2000, 0x7fd: 0x2000, 0x7fe: 0x2000, 0x7ff: 0x2000,
- // Block 0x20, offset 0x800
- 0x800: 0x2000, 0x801: 0x2000, 0x802: 0x200d, 0x803: 0x2000, 0x804: 0x2000, 0x805: 0x2000,
- 0x806: 0x2000, 0x807: 0x2000, 0x808: 0x2000, 0x809: 0x2000, 0x80a: 0x2000, 0x80b: 0x2000,
- 0x80c: 0x2000, 0x80d: 0x2000, 0x80e: 0x2000, 0x80f: 0x2000, 0x810: 0x2000, 0x811: 0x2000,
- 0x812: 0x2000, 0x813: 0x2000, 0x814: 0x2000, 0x815: 0x2000, 0x816: 0x2000, 0x817: 0x2000,
- 0x818: 0x2000, 0x819: 0x2000, 0x81a: 0x2000, 0x81b: 0x2000, 0x81c: 0x2000, 0x81d: 0x2000,
- 0x81e: 0x2000, 0x81f: 0x2000, 0x820: 0x2000, 0x821: 0x2000, 0x822: 0x2000, 0x823: 0x2000,
- 0x824: 0x2000, 0x825: 0x2000, 0x826: 0x2000, 0x827: 0x2000, 0x828: 0x2000, 0x829: 0x2000,
- 0x82a: 0x2000, 0x82b: 0x2000, 0x82c: 0x2000, 0x82d: 0x2000, 0x82e: 0x2000, 0x82f: 0x2000,
- 0x830: 0x2000, 0x831: 0x2000, 0x832: 0x2000, 0x833: 0x2000, 0x834: 0x2000, 0x835: 0x2000,
- 0x836: 0x2000, 0x837: 0x2000, 0x838: 0x2000, 0x839: 0x2000, 0x83a: 0x2000, 0x83b: 0x2000,
- 0x83c: 0x2000, 0x83d: 0x2000, 0x83e: 0x2000, 0x83f: 0x2000,
- // Block 0x21, offset 0x840
- 0x840: 0x2000, 0x841: 0x2000, 0x842: 0x2000, 0x843: 0x2000, 0x844: 0x2000, 0x845: 0x2000,
- 0x846: 0x2000, 0x847: 0x2000, 0x848: 0x2000, 0x849: 0x2000, 0x84a: 0x2000, 0x84b: 0x2000,
- 0x850: 0x2000, 0x851: 0x2000,
- 0x852: 0x2000, 0x853: 0x2000, 0x854: 0x2000, 0x855: 0x2000, 0x856: 0x2000, 0x857: 0x2000,
- 0x858: 0x2000, 0x859: 0x2000, 0x85a: 0x2000, 0x85b: 0x2000, 0x85c: 0x2000, 0x85d: 0x2000,
- 0x85e: 0x2000, 0x85f: 0x2000, 0x860: 0x2000, 0x861: 0x2000, 0x862: 0x2000, 0x863: 0x2000,
- 0x864: 0x2000, 0x865: 0x2000, 0x866: 0x2000, 0x867: 0x2000, 0x868: 0x2000, 0x869: 0x2000,
- 0x86a: 0x2000, 0x86b: 0x2000, 0x86c: 0x2000, 0x86d: 0x2000, 0x86e: 0x2000, 0x86f: 0x2000,
- 0x870: 0x2000, 0x871: 0x2000, 0x872: 0x2000, 0x873: 0x2000,
- // Block 0x22, offset 0x880
- 0x880: 0x2000, 0x881: 0x2000, 0x882: 0x2000, 0x883: 0x2000, 0x884: 0x2000, 0x885: 0x2000,
- 0x886: 0x2000, 0x887: 0x2000, 0x888: 0x2000, 0x889: 0x2000, 0x88a: 0x2000, 0x88b: 0x2000,
- 0x88c: 0x2000, 0x88d: 0x2000, 0x88e: 0x2000, 0x88f: 0x2000,
- 0x892: 0x2000, 0x893: 0x2000, 0x894: 0x2000, 0x895: 0x2000,
- 0x8a0: 0x200e, 0x8a1: 0x2000, 0x8a3: 0x2000,
- 0x8a4: 0x2000, 0x8a5: 0x2000, 0x8a6: 0x2000, 0x8a7: 0x2000, 0x8a8: 0x2000, 0x8a9: 0x2000,
- 0x8b2: 0x2000, 0x8b3: 0x2000,
- 0x8b6: 0x2000, 0x8b7: 0x2000,
- 0x8bc: 0x2000, 0x8bd: 0x2000,
- // Block 0x23, offset 0x8c0
- 0x8c0: 0x2000, 0x8c1: 0x2000,
- 0x8c6: 0x2000, 0x8c7: 0x2000, 0x8c8: 0x2000, 0x8cb: 0x200f,
- 0x8ce: 0x2000, 0x8cf: 0x2000, 0x8d0: 0x2000, 0x8d1: 0x2000,
- 0x8e2: 0x2000, 0x8e3: 0x2000,
- 0x8e4: 0x2000, 0x8e5: 0x2000,
- 0x8ef: 0x2000,
- 0x8fd: 0x4000, 0x8fe: 0x4000,
- // Block 0x24, offset 0x900
- 0x905: 0x2000,
- 0x906: 0x2000, 0x909: 0x2000,
- 0x90e: 0x2000, 0x90f: 0x2000,
- 0x914: 0x4000, 0x915: 0x4000,
- 0x91c: 0x2000,
- 0x91e: 0x2000,
- // Block 0x25, offset 0x940
- 0x940: 0x2000, 0x942: 0x2000,
- 0x948: 0x4000, 0x949: 0x4000, 0x94a: 0x4000, 0x94b: 0x4000,
- 0x94c: 0x4000, 0x94d: 0x4000, 0x94e: 0x4000, 0x94f: 0x4000, 0x950: 0x4000, 0x951: 0x4000,
- 0x952: 0x4000, 0x953: 0x4000,
- 0x960: 0x2000, 0x961: 0x2000, 0x963: 0x2000,
- 0x964: 0x2000, 0x965: 0x2000, 0x967: 0x2000, 0x968: 0x2000, 0x969: 0x2000,
- 0x96a: 0x2000, 0x96c: 0x2000, 0x96d: 0x2000, 0x96f: 0x2000,
- 0x97f: 0x4000,
- // Block 0x26, offset 0x980
- 0x993: 0x4000,
- 0x99e: 0x2000, 0x99f: 0x2000, 0x9a1: 0x4000,
- 0x9aa: 0x4000, 0x9ab: 0x4000,
- 0x9bd: 0x4000, 0x9be: 0x4000, 0x9bf: 0x2000,
- // Block 0x27, offset 0x9c0
- 0x9c4: 0x4000, 0x9c5: 0x4000,
- 0x9c6: 0x2000, 0x9c7: 0x2000, 0x9c8: 0x2000, 0x9c9: 0x2000, 0x9ca: 0x2000, 0x9cb: 0x2000,
- 0x9cc: 0x2000, 0x9cd: 0x2000, 0x9ce: 0x4000, 0x9cf: 0x2000, 0x9d0: 0x2000, 0x9d1: 0x2000,
- 0x9d2: 0x2000, 0x9d3: 0x2000, 0x9d4: 0x4000, 0x9d5: 0x2000, 0x9d6: 0x2000, 0x9d7: 0x2000,
- 0x9d8: 0x2000, 0x9d9: 0x2000, 0x9da: 0x2000, 0x9db: 0x2000, 0x9dc: 0x2000, 0x9dd: 0x2000,
- 0x9de: 0x2000, 0x9df: 0x2000, 0x9e0: 0x2000, 0x9e1: 0x2000, 0x9e3: 0x2000,
- 0x9e8: 0x2000, 0x9e9: 0x2000,
- 0x9ea: 0x4000, 0x9eb: 0x2000, 0x9ec: 0x2000, 0x9ed: 0x2000, 0x9ee: 0x2000, 0x9ef: 0x2000,
- 0x9f0: 0x2000, 0x9f1: 0x2000, 0x9f2: 0x4000, 0x9f3: 0x4000, 0x9f4: 0x2000, 0x9f5: 0x4000,
- 0x9f6: 0x2000, 0x9f7: 0x2000, 0x9f8: 0x2000, 0x9f9: 0x2000, 0x9fa: 0x4000, 0x9fb: 0x2000,
- 0x9fc: 0x2000, 0x9fd: 0x4000, 0x9fe: 0x2000, 0x9ff: 0x2000,
- // Block 0x28, offset 0xa00
- 0xa05: 0x4000,
- 0xa0a: 0x4000, 0xa0b: 0x4000,
- 0xa28: 0x4000,
- 0xa3d: 0x2000,
- // Block 0x29, offset 0xa40
- 0xa4c: 0x4000, 0xa4e: 0x4000,
- 0xa53: 0x4000, 0xa54: 0x4000, 0xa55: 0x4000, 0xa57: 0x4000,
- 0xa76: 0x2000, 0xa77: 0x2000, 0xa78: 0x2000, 0xa79: 0x2000, 0xa7a: 0x2000, 0xa7b: 0x2000,
- 0xa7c: 0x2000, 0xa7d: 0x2000, 0xa7e: 0x2000, 0xa7f: 0x2000,
- // Block 0x2a, offset 0xa80
- 0xa95: 0x4000, 0xa96: 0x4000, 0xa97: 0x4000,
- 0xab0: 0x4000,
- 0xabf: 0x4000,
- // Block 0x2b, offset 0xac0
- 0xae6: 0x6000, 0xae7: 0x6000, 0xae8: 0x6000, 0xae9: 0x6000,
- 0xaea: 0x6000, 0xaeb: 0x6000, 0xaec: 0x6000, 0xaed: 0x6000,
- // Block 0x2c, offset 0xb00
- 0xb05: 0x6010,
- 0xb06: 0x6011,
- // Block 0x2d, offset 0xb40
- 0xb5b: 0x4000, 0xb5c: 0x4000,
- // Block 0x2e, offset 0xb80
- 0xb90: 0x4000,
- 0xb95: 0x4000, 0xb96: 0x2000, 0xb97: 0x2000,
- 0xb98: 0x2000, 0xb99: 0x2000,
- // Block 0x2f, offset 0xbc0
- 0xbc0: 0x4000, 0xbc1: 0x4000, 0xbc2: 0x4000, 0xbc3: 0x4000, 0xbc4: 0x4000, 0xbc5: 0x4000,
- 0xbc6: 0x4000, 0xbc7: 0x4000, 0xbc8: 0x4000, 0xbc9: 0x4000, 0xbca: 0x4000, 0xbcb: 0x4000,
- 0xbcc: 0x4000, 0xbcd: 0x4000, 0xbce: 0x4000, 0xbcf: 0x4000, 0xbd0: 0x4000, 0xbd1: 0x4000,
- 0xbd2: 0x4000, 0xbd3: 0x4000, 0xbd4: 0x4000, 0xbd5: 0x4000, 0xbd6: 0x4000, 0xbd7: 0x4000,
- 0xbd8: 0x4000, 0xbd9: 0x4000, 0xbdb: 0x4000, 0xbdc: 0x4000, 0xbdd: 0x4000,
- 0xbde: 0x4000, 0xbdf: 0x4000, 0xbe0: 0x4000, 0xbe1: 0x4000, 0xbe2: 0x4000, 0xbe3: 0x4000,
- 0xbe4: 0x4000, 0xbe5: 0x4000, 0xbe6: 0x4000, 0xbe7: 0x4000, 0xbe8: 0x4000, 0xbe9: 0x4000,
- 0xbea: 0x4000, 0xbeb: 0x4000, 0xbec: 0x4000, 0xbed: 0x4000, 0xbee: 0x4000, 0xbef: 0x4000,
- 0xbf0: 0x4000, 0xbf1: 0x4000, 0xbf2: 0x4000, 0xbf3: 0x4000, 0xbf4: 0x4000, 0xbf5: 0x4000,
- 0xbf6: 0x4000, 0xbf7: 0x4000, 0xbf8: 0x4000, 0xbf9: 0x4000, 0xbfa: 0x4000, 0xbfb: 0x4000,
- 0xbfc: 0x4000, 0xbfd: 0x4000, 0xbfe: 0x4000, 0xbff: 0x4000,
- // Block 0x30, offset 0xc00
- 0xc00: 0x4000, 0xc01: 0x4000, 0xc02: 0x4000, 0xc03: 0x4000, 0xc04: 0x4000, 0xc05: 0x4000,
- 0xc06: 0x4000, 0xc07: 0x4000, 0xc08: 0x4000, 0xc09: 0x4000, 0xc0a: 0x4000, 0xc0b: 0x4000,
- 0xc0c: 0x4000, 0xc0d: 0x4000, 0xc0e: 0x4000, 0xc0f: 0x4000, 0xc10: 0x4000, 0xc11: 0x4000,
- 0xc12: 0x4000, 0xc13: 0x4000, 0xc14: 0x4000, 0xc15: 0x4000, 0xc16: 0x4000, 0xc17: 0x4000,
- 0xc18: 0x4000, 0xc19: 0x4000, 0xc1a: 0x4000, 0xc1b: 0x4000, 0xc1c: 0x4000, 0xc1d: 0x4000,
- 0xc1e: 0x4000, 0xc1f: 0x4000, 0xc20: 0x4000, 0xc21: 0x4000, 0xc22: 0x4000, 0xc23: 0x4000,
- 0xc24: 0x4000, 0xc25: 0x4000, 0xc26: 0x4000, 0xc27: 0x4000, 0xc28: 0x4000, 0xc29: 0x4000,
- 0xc2a: 0x4000, 0xc2b: 0x4000, 0xc2c: 0x4000, 0xc2d: 0x4000, 0xc2e: 0x4000, 0xc2f: 0x4000,
- 0xc30: 0x4000, 0xc31: 0x4000, 0xc32: 0x4000, 0xc33: 0x4000,
- // Block 0x31, offset 0xc40
- 0xc40: 0x4000, 0xc41: 0x4000, 0xc42: 0x4000, 0xc43: 0x4000, 0xc44: 0x4000, 0xc45: 0x4000,
- 0xc46: 0x4000, 0xc47: 0x4000, 0xc48: 0x4000, 0xc49: 0x4000, 0xc4a: 0x4000, 0xc4b: 0x4000,
- 0xc4c: 0x4000, 0xc4d: 0x4000, 0xc4e: 0x4000, 0xc4f: 0x4000, 0xc50: 0x4000, 0xc51: 0x4000,
- 0xc52: 0x4000, 0xc53: 0x4000, 0xc54: 0x4000, 0xc55: 0x4000,
- 0xc70: 0x4000, 0xc71: 0x4000, 0xc72: 0x4000, 0xc73: 0x4000, 0xc74: 0x4000, 0xc75: 0x4000,
- 0xc76: 0x4000, 0xc77: 0x4000, 0xc78: 0x4000, 0xc79: 0x4000, 0xc7a: 0x4000, 0xc7b: 0x4000,
- // Block 0x32, offset 0xc80
- 0xc80: 0x9012, 0xc81: 0x4013, 0xc82: 0x4014, 0xc83: 0x4000, 0xc84: 0x4000, 0xc85: 0x4000,
- 0xc86: 0x4000, 0xc87: 0x4000, 0xc88: 0x4000, 0xc89: 0x4000, 0xc8a: 0x4000, 0xc8b: 0x4000,
- 0xc8c: 0x4015, 0xc8d: 0x4015, 0xc8e: 0x4000, 0xc8f: 0x4000, 0xc90: 0x4000, 0xc91: 0x4000,
- 0xc92: 0x4000, 0xc93: 0x4000, 0xc94: 0x4000, 0xc95: 0x4000, 0xc96: 0x4000, 0xc97: 0x4000,
- 0xc98: 0x4000, 0xc99: 0x4000, 0xc9a: 0x4000, 0xc9b: 0x4000, 0xc9c: 0x4000, 0xc9d: 0x4000,
- 0xc9e: 0x4000, 0xc9f: 0x4000, 0xca0: 0x4000, 0xca1: 0x4000, 0xca2: 0x4000, 0xca3: 0x4000,
- 0xca4: 0x4000, 0xca5: 0x4000, 0xca6: 0x4000, 0xca7: 0x4000, 0xca8: 0x4000, 0xca9: 0x4000,
- 0xcaa: 0x4000, 0xcab: 0x4000, 0xcac: 0x4000, 0xcad: 0x4000, 0xcae: 0x4000, 0xcaf: 0x4000,
- 0xcb0: 0x4000, 0xcb1: 0x4000, 0xcb2: 0x4000, 0xcb3: 0x4000, 0xcb4: 0x4000, 0xcb5: 0x4000,
- 0xcb6: 0x4000, 0xcb7: 0x4000, 0xcb8: 0x4000, 0xcb9: 0x4000, 0xcba: 0x4000, 0xcbb: 0x4000,
- 0xcbc: 0x4000, 0xcbd: 0x4000, 0xcbe: 0x4000,
- // Block 0x33, offset 0xcc0
- 0xcc1: 0x4000, 0xcc2: 0x4000, 0xcc3: 0x4000, 0xcc4: 0x4000, 0xcc5: 0x4000,
- 0xcc6: 0x4000, 0xcc7: 0x4000, 0xcc8: 0x4000, 0xcc9: 0x4000, 0xcca: 0x4000, 0xccb: 0x4000,
- 0xccc: 0x4000, 0xccd: 0x4000, 0xcce: 0x4000, 0xccf: 0x4000, 0xcd0: 0x4000, 0xcd1: 0x4000,
- 0xcd2: 0x4000, 0xcd3: 0x4000, 0xcd4: 0x4000, 0xcd5: 0x4000, 0xcd6: 0x4000, 0xcd7: 0x4000,
- 0xcd8: 0x4000, 0xcd9: 0x4000, 0xcda: 0x4000, 0xcdb: 0x4000, 0xcdc: 0x4000, 0xcdd: 0x4000,
- 0xcde: 0x4000, 0xcdf: 0x4000, 0xce0: 0x4000, 0xce1: 0x4000, 0xce2: 0x4000, 0xce3: 0x4000,
- 0xce4: 0x4000, 0xce5: 0x4000, 0xce6: 0x4000, 0xce7: 0x4000, 0xce8: 0x4000, 0xce9: 0x4000,
- 0xcea: 0x4000, 0xceb: 0x4000, 0xcec: 0x4000, 0xced: 0x4000, 0xcee: 0x4000, 0xcef: 0x4000,
- 0xcf0: 0x4000, 0xcf1: 0x4000, 0xcf2: 0x4000, 0xcf3: 0x4000, 0xcf4: 0x4000, 0xcf5: 0x4000,
- 0xcf6: 0x4000, 0xcf7: 0x4000, 0xcf8: 0x4000, 0xcf9: 0x4000, 0xcfa: 0x4000, 0xcfb: 0x4000,
- 0xcfc: 0x4000, 0xcfd: 0x4000, 0xcfe: 0x4000, 0xcff: 0x4000,
- // Block 0x34, offset 0xd00
- 0xd00: 0x4000, 0xd01: 0x4000, 0xd02: 0x4000, 0xd03: 0x4000, 0xd04: 0x4000, 0xd05: 0x4000,
- 0xd06: 0x4000, 0xd07: 0x4000, 0xd08: 0x4000, 0xd09: 0x4000, 0xd0a: 0x4000, 0xd0b: 0x4000,
- 0xd0c: 0x4000, 0xd0d: 0x4000, 0xd0e: 0x4000, 0xd0f: 0x4000, 0xd10: 0x4000, 0xd11: 0x4000,
- 0xd12: 0x4000, 0xd13: 0x4000, 0xd14: 0x4000, 0xd15: 0x4000, 0xd16: 0x4000,
- 0xd19: 0x4016, 0xd1a: 0x4017, 0xd1b: 0x4000, 0xd1c: 0x4000, 0xd1d: 0x4000,
- 0xd1e: 0x4000, 0xd1f: 0x4000, 0xd20: 0x4000, 0xd21: 0x4018, 0xd22: 0x4019, 0xd23: 0x401a,
- 0xd24: 0x401b, 0xd25: 0x401c, 0xd26: 0x401d, 0xd27: 0x401e, 0xd28: 0x401f, 0xd29: 0x4020,
- 0xd2a: 0x4021, 0xd2b: 0x4022, 0xd2c: 0x4000, 0xd2d: 0x4010, 0xd2e: 0x4000, 0xd2f: 0x4023,
- 0xd30: 0x4000, 0xd31: 0x4024, 0xd32: 0x4000, 0xd33: 0x4025, 0xd34: 0x4000, 0xd35: 0x4026,
- 0xd36: 0x4000, 0xd37: 0x401a, 0xd38: 0x4000, 0xd39: 0x4027, 0xd3a: 0x4000, 0xd3b: 0x4028,
- 0xd3c: 0x4000, 0xd3d: 0x4020, 0xd3e: 0x4000, 0xd3f: 0x4029,
- // Block 0x35, offset 0xd40
- 0xd40: 0x4000, 0xd41: 0x402a, 0xd42: 0x4000, 0xd43: 0x402b, 0xd44: 0x402c, 0xd45: 0x4000,
- 0xd46: 0x4017, 0xd47: 0x4000, 0xd48: 0x402d, 0xd49: 0x4000, 0xd4a: 0x402e, 0xd4b: 0x402f,
- 0xd4c: 0x4030, 0xd4d: 0x4017, 0xd4e: 0x4016, 0xd4f: 0x4017, 0xd50: 0x4000, 0xd51: 0x4000,
- 0xd52: 0x4031, 0xd53: 0x4000, 0xd54: 0x4000, 0xd55: 0x4031, 0xd56: 0x4000, 0xd57: 0x4000,
- 0xd58: 0x4032, 0xd59: 0x4000, 0xd5a: 0x4000, 0xd5b: 0x4032, 0xd5c: 0x4000, 0xd5d: 0x4000,
- 0xd5e: 0x4033, 0xd5f: 0x402e, 0xd60: 0x4034, 0xd61: 0x4035, 0xd62: 0x4034, 0xd63: 0x4036,
- 0xd64: 0x4037, 0xd65: 0x4024, 0xd66: 0x4035, 0xd67: 0x4025, 0xd68: 0x4038, 0xd69: 0x4038,
- 0xd6a: 0x4039, 0xd6b: 0x4039, 0xd6c: 0x403a, 0xd6d: 0x403a, 0xd6e: 0x4000, 0xd6f: 0x4035,
- 0xd70: 0x4000, 0xd71: 0x4000, 0xd72: 0x403b, 0xd73: 0x403c, 0xd74: 0x4000, 0xd75: 0x4000,
- 0xd76: 0x4000, 0xd77: 0x4000, 0xd78: 0x4000, 0xd79: 0x4000, 0xd7a: 0x4000, 0xd7b: 0x403d,
- 0xd7c: 0x401c, 0xd7d: 0x4000, 0xd7e: 0x4000, 0xd7f: 0x4000,
- // Block 0x36, offset 0xd80
- 0xd85: 0x4000,
- 0xd86: 0x4000, 0xd87: 0x4000, 0xd88: 0x4000, 0xd89: 0x4000, 0xd8a: 0x4000, 0xd8b: 0x4000,
- 0xd8c: 0x4000, 0xd8d: 0x4000, 0xd8e: 0x4000, 0xd8f: 0x4000, 0xd90: 0x4000, 0xd91: 0x4000,
- 0xd92: 0x4000, 0xd93: 0x4000, 0xd94: 0x4000, 0xd95: 0x4000, 0xd96: 0x4000, 0xd97: 0x4000,
- 0xd98: 0x4000, 0xd99: 0x4000, 0xd9a: 0x4000, 0xd9b: 0x4000, 0xd9c: 0x4000, 0xd9d: 0x4000,
- 0xd9e: 0x4000, 0xd9f: 0x4000, 0xda0: 0x4000, 0xda1: 0x4000, 0xda2: 0x4000, 0xda3: 0x4000,
- 0xda4: 0x4000, 0xda5: 0x4000, 0xda6: 0x4000, 0xda7: 0x4000, 0xda8: 0x4000, 0xda9: 0x4000,
- 0xdaa: 0x4000, 0xdab: 0x4000, 0xdac: 0x4000, 0xdad: 0x4000,
- 0xdb1: 0x403e, 0xdb2: 0x403e, 0xdb3: 0x403e, 0xdb4: 0x403e, 0xdb5: 0x403e,
- 0xdb6: 0x403e, 0xdb7: 0x403e, 0xdb8: 0x403e, 0xdb9: 0x403e, 0xdba: 0x403e, 0xdbb: 0x403e,
- 0xdbc: 0x403e, 0xdbd: 0x403e, 0xdbe: 0x403e, 0xdbf: 0x403e,
- // Block 0x37, offset 0xdc0
- 0xdc0: 0x4037, 0xdc1: 0x4037, 0xdc2: 0x4037, 0xdc3: 0x4037, 0xdc4: 0x4037, 0xdc5: 0x4037,
- 0xdc6: 0x4037, 0xdc7: 0x4037, 0xdc8: 0x4037, 0xdc9: 0x4037, 0xdca: 0x4037, 0xdcb: 0x4037,
- 0xdcc: 0x4037, 0xdcd: 0x4037, 0xdce: 0x4037, 0xdcf: 0x400e, 0xdd0: 0x403f, 0xdd1: 0x4040,
- 0xdd2: 0x4041, 0xdd3: 0x4040, 0xdd4: 0x403f, 0xdd5: 0x4042, 0xdd6: 0x4043, 0xdd7: 0x4044,
- 0xdd8: 0x4040, 0xdd9: 0x4041, 0xdda: 0x4040, 0xddb: 0x4045, 0xddc: 0x4009, 0xddd: 0x4045,
- 0xdde: 0x4046, 0xddf: 0x4045, 0xde0: 0x4047, 0xde1: 0x400b, 0xde2: 0x400a, 0xde3: 0x400c,
- 0xde4: 0x4048, 0xde5: 0x4000, 0xde6: 0x4000, 0xde7: 0x4000, 0xde8: 0x4000, 0xde9: 0x4000,
- 0xdea: 0x4000, 0xdeb: 0x4000, 0xdec: 0x4000, 0xded: 0x4000, 0xdee: 0x4000, 0xdef: 0x4000,
- 0xdf0: 0x4000, 0xdf1: 0x4000, 0xdf2: 0x4000, 0xdf3: 0x4000, 0xdf4: 0x4000, 0xdf5: 0x4000,
- 0xdf6: 0x4000, 0xdf7: 0x4000, 0xdf8: 0x4000, 0xdf9: 0x4000, 0xdfa: 0x4000, 0xdfb: 0x4000,
- 0xdfc: 0x4000, 0xdfd: 0x4000, 0xdfe: 0x4000, 0xdff: 0x4000,
- // Block 0x38, offset 0xe00
- 0xe00: 0x4000, 0xe01: 0x4000, 0xe02: 0x4000, 0xe03: 0x4000, 0xe04: 0x4000, 0xe05: 0x4000,
- 0xe06: 0x4000, 0xe07: 0x4000, 0xe08: 0x4000, 0xe09: 0x4000, 0xe0a: 0x4000, 0xe0b: 0x4000,
- 0xe0c: 0x4000, 0xe0d: 0x4000, 0xe0e: 0x4000, 0xe10: 0x4000, 0xe11: 0x4000,
- 0xe12: 0x4000, 0xe13: 0x4000, 0xe14: 0x4000, 0xe15: 0x4000, 0xe16: 0x4000, 0xe17: 0x4000,
- 0xe18: 0x4000, 0xe19: 0x4000, 0xe1a: 0x4000, 0xe1b: 0x4000, 0xe1c: 0x4000, 0xe1d: 0x4000,
- 0xe1e: 0x4000, 0xe1f: 0x4000, 0xe20: 0x4000, 0xe21: 0x4000, 0xe22: 0x4000, 0xe23: 0x4000,
- 0xe24: 0x4000, 0xe25: 0x4000, 0xe26: 0x4000, 0xe27: 0x4000, 0xe28: 0x4000, 0xe29: 0x4000,
- 0xe2a: 0x4000, 0xe2b: 0x4000, 0xe2c: 0x4000, 0xe2d: 0x4000, 0xe2e: 0x4000, 0xe2f: 0x4000,
- 0xe30: 0x4000, 0xe31: 0x4000, 0xe32: 0x4000, 0xe33: 0x4000, 0xe34: 0x4000, 0xe35: 0x4000,
- 0xe36: 0x4000, 0xe37: 0x4000, 0xe38: 0x4000, 0xe39: 0x4000, 0xe3a: 0x4000,
- // Block 0x39, offset 0xe40
- 0xe40: 0x4000, 0xe41: 0x4000, 0xe42: 0x4000, 0xe43: 0x4000, 0xe44: 0x4000, 0xe45: 0x4000,
- 0xe46: 0x4000, 0xe47: 0x4000, 0xe48: 0x4000, 0xe49: 0x4000, 0xe4a: 0x4000, 0xe4b: 0x4000,
- 0xe4c: 0x4000, 0xe4d: 0x4000, 0xe4e: 0x4000, 0xe4f: 0x4000, 0xe50: 0x4000, 0xe51: 0x4000,
- 0xe52: 0x4000, 0xe53: 0x4000, 0xe54: 0x4000, 0xe55: 0x4000, 0xe56: 0x4000, 0xe57: 0x4000,
- 0xe58: 0x4000, 0xe59: 0x4000, 0xe5a: 0x4000, 0xe5b: 0x4000, 0xe5c: 0x4000, 0xe5d: 0x4000,
- 0xe5e: 0x4000, 0xe5f: 0x4000, 0xe60: 0x4000, 0xe61: 0x4000, 0xe62: 0x4000, 0xe63: 0x4000,
- 0xe70: 0x4000, 0xe71: 0x4000, 0xe72: 0x4000, 0xe73: 0x4000, 0xe74: 0x4000, 0xe75: 0x4000,
- 0xe76: 0x4000, 0xe77: 0x4000, 0xe78: 0x4000, 0xe79: 0x4000, 0xe7a: 0x4000, 0xe7b: 0x4000,
- 0xe7c: 0x4000, 0xe7d: 0x4000, 0xe7e: 0x4000, 0xe7f: 0x4000,
- // Block 0x3a, offset 0xe80
- 0xe80: 0x4000, 0xe81: 0x4000, 0xe82: 0x4000, 0xe83: 0x4000, 0xe84: 0x4000, 0xe85: 0x4000,
- 0xe86: 0x4000, 0xe87: 0x4000, 0xe88: 0x4000, 0xe89: 0x4000, 0xe8a: 0x4000, 0xe8b: 0x4000,
- 0xe8c: 0x4000, 0xe8d: 0x4000, 0xe8e: 0x4000, 0xe8f: 0x4000, 0xe90: 0x4000, 0xe91: 0x4000,
- 0xe92: 0x4000, 0xe93: 0x4000, 0xe94: 0x4000, 0xe95: 0x4000, 0xe96: 0x4000, 0xe97: 0x4000,
- 0xe98: 0x4000, 0xe99: 0x4000, 0xe9a: 0x4000, 0xe9b: 0x4000, 0xe9c: 0x4000, 0xe9d: 0x4000,
- 0xe9e: 0x4000, 0xea0: 0x4000, 0xea1: 0x4000, 0xea2: 0x4000, 0xea3: 0x4000,
- 0xea4: 0x4000, 0xea5: 0x4000, 0xea6: 0x4000, 0xea7: 0x4000, 0xea8: 0x4000, 0xea9: 0x4000,
- 0xeaa: 0x4000, 0xeab: 0x4000, 0xeac: 0x4000, 0xead: 0x4000, 0xeae: 0x4000, 0xeaf: 0x4000,
- 0xeb0: 0x4000, 0xeb1: 0x4000, 0xeb2: 0x4000, 0xeb3: 0x4000, 0xeb4: 0x4000, 0xeb5: 0x4000,
- 0xeb6: 0x4000, 0xeb7: 0x4000, 0xeb8: 0x4000, 0xeb9: 0x4000, 0xeba: 0x4000, 0xebb: 0x4000,
- 0xebc: 0x4000, 0xebd: 0x4000, 0xebe: 0x4000, 0xebf: 0x4000,
- // Block 0x3b, offset 0xec0
- 0xec0: 0x4000, 0xec1: 0x4000, 0xec2: 0x4000, 0xec3: 0x4000, 0xec4: 0x4000, 0xec5: 0x4000,
- 0xec6: 0x4000, 0xec7: 0x4000, 0xec8: 0x2000, 0xec9: 0x2000, 0xeca: 0x2000, 0xecb: 0x2000,
- 0xecc: 0x2000, 0xecd: 0x2000, 0xece: 0x2000, 0xecf: 0x2000, 0xed0: 0x4000, 0xed1: 0x4000,
- 0xed2: 0x4000, 0xed3: 0x4000, 0xed4: 0x4000, 0xed5: 0x4000, 0xed6: 0x4000, 0xed7: 0x4000,
- 0xed8: 0x4000, 0xed9: 0x4000, 0xeda: 0x4000, 0xedb: 0x4000, 0xedc: 0x4000, 0xedd: 0x4000,
- 0xede: 0x4000, 0xedf: 0x4000, 0xee0: 0x4000, 0xee1: 0x4000, 0xee2: 0x4000, 0xee3: 0x4000,
- 0xee4: 0x4000, 0xee5: 0x4000, 0xee6: 0x4000, 0xee7: 0x4000, 0xee8: 0x4000, 0xee9: 0x4000,
- 0xeea: 0x4000, 0xeeb: 0x4000, 0xeec: 0x4000, 0xeed: 0x4000, 0xeee: 0x4000, 0xeef: 0x4000,
- 0xef0: 0x4000, 0xef1: 0x4000, 0xef2: 0x4000, 0xef3: 0x4000, 0xef4: 0x4000, 0xef5: 0x4000,
- 0xef6: 0x4000, 0xef7: 0x4000, 0xef8: 0x4000, 0xef9: 0x4000, 0xefa: 0x4000, 0xefb: 0x4000,
- 0xefc: 0x4000, 0xefd: 0x4000, 0xefe: 0x4000, 0xeff: 0x4000,
- // Block 0x3c, offset 0xf00
- 0xf00: 0x4000, 0xf01: 0x4000, 0xf02: 0x4000, 0xf03: 0x4000, 0xf04: 0x4000, 0xf05: 0x4000,
- 0xf06: 0x4000, 0xf07: 0x4000, 0xf08: 0x4000, 0xf09: 0x4000, 0xf0a: 0x4000, 0xf0b: 0x4000,
- 0xf0c: 0x4000, 0xf0d: 0x4000, 0xf0e: 0x4000, 0xf0f: 0x4000, 0xf10: 0x4000, 0xf11: 0x4000,
- 0xf12: 0x4000, 0xf13: 0x4000, 0xf14: 0x4000, 0xf15: 0x4000, 0xf16: 0x4000, 0xf17: 0x4000,
- 0xf18: 0x4000, 0xf19: 0x4000, 0xf1a: 0x4000, 0xf1b: 0x4000, 0xf1c: 0x4000, 0xf1d: 0x4000,
- 0xf1e: 0x4000, 0xf1f: 0x4000, 0xf20: 0x4000, 0xf21: 0x4000, 0xf22: 0x4000, 0xf23: 0x4000,
- 0xf24: 0x4000, 0xf25: 0x4000, 0xf26: 0x4000, 0xf27: 0x4000, 0xf28: 0x4000, 0xf29: 0x4000,
- 0xf2a: 0x4000, 0xf2b: 0x4000, 0xf2c: 0x4000, 0xf2d: 0x4000, 0xf2e: 0x4000, 0xf2f: 0x4000,
- 0xf30: 0x4000, 0xf31: 0x4000, 0xf32: 0x4000, 0xf33: 0x4000, 0xf34: 0x4000, 0xf35: 0x4000,
- 0xf36: 0x4000, 0xf37: 0x4000, 0xf38: 0x4000, 0xf39: 0x4000, 0xf3a: 0x4000, 0xf3b: 0x4000,
- 0xf3c: 0x4000, 0xf3d: 0x4000, 0xf3e: 0x4000,
- // Block 0x3d, offset 0xf40
- 0xf40: 0x4000, 0xf41: 0x4000, 0xf42: 0x4000, 0xf43: 0x4000, 0xf44: 0x4000, 0xf45: 0x4000,
- 0xf46: 0x4000, 0xf47: 0x4000, 0xf48: 0x4000, 0xf49: 0x4000, 0xf4a: 0x4000, 0xf4b: 0x4000,
- 0xf4c: 0x4000, 0xf50: 0x4000, 0xf51: 0x4000,
- 0xf52: 0x4000, 0xf53: 0x4000, 0xf54: 0x4000, 0xf55: 0x4000, 0xf56: 0x4000, 0xf57: 0x4000,
- 0xf58: 0x4000, 0xf59: 0x4000, 0xf5a: 0x4000, 0xf5b: 0x4000, 0xf5c: 0x4000, 0xf5d: 0x4000,
- 0xf5e: 0x4000, 0xf5f: 0x4000, 0xf60: 0x4000, 0xf61: 0x4000, 0xf62: 0x4000, 0xf63: 0x4000,
- 0xf64: 0x4000, 0xf65: 0x4000, 0xf66: 0x4000, 0xf67: 0x4000, 0xf68: 0x4000, 0xf69: 0x4000,
- 0xf6a: 0x4000, 0xf6b: 0x4000, 0xf6c: 0x4000, 0xf6d: 0x4000, 0xf6e: 0x4000, 0xf6f: 0x4000,
- 0xf70: 0x4000, 0xf71: 0x4000, 0xf72: 0x4000, 0xf73: 0x4000, 0xf74: 0x4000, 0xf75: 0x4000,
- 0xf76: 0x4000, 0xf77: 0x4000, 0xf78: 0x4000, 0xf79: 0x4000, 0xf7a: 0x4000, 0xf7b: 0x4000,
- 0xf7c: 0x4000, 0xf7d: 0x4000, 0xf7e: 0x4000, 0xf7f: 0x4000,
- // Block 0x3e, offset 0xf80
- 0xf80: 0x4000, 0xf81: 0x4000, 0xf82: 0x4000, 0xf83: 0x4000, 0xf84: 0x4000, 0xf85: 0x4000,
- 0xf86: 0x4000,
- // Block 0x3f, offset 0xfc0
- 0xfe0: 0x4000, 0xfe1: 0x4000, 0xfe2: 0x4000, 0xfe3: 0x4000,
- 0xfe4: 0x4000, 0xfe5: 0x4000, 0xfe6: 0x4000, 0xfe7: 0x4000, 0xfe8: 0x4000, 0xfe9: 0x4000,
- 0xfea: 0x4000, 0xfeb: 0x4000, 0xfec: 0x4000, 0xfed: 0x4000, 0xfee: 0x4000, 0xfef: 0x4000,
- 0xff0: 0x4000, 0xff1: 0x4000, 0xff2: 0x4000, 0xff3: 0x4000, 0xff4: 0x4000, 0xff5: 0x4000,
- 0xff6: 0x4000, 0xff7: 0x4000, 0xff8: 0x4000, 0xff9: 0x4000, 0xffa: 0x4000, 0xffb: 0x4000,
- 0xffc: 0x4000,
- // Block 0x40, offset 0x1000
- 0x1000: 0x4000, 0x1001: 0x4000, 0x1002: 0x4000, 0x1003: 0x4000, 0x1004: 0x4000, 0x1005: 0x4000,
- 0x1006: 0x4000, 0x1007: 0x4000, 0x1008: 0x4000, 0x1009: 0x4000, 0x100a: 0x4000, 0x100b: 0x4000,
- 0x100c: 0x4000, 0x100d: 0x4000, 0x100e: 0x4000, 0x100f: 0x4000, 0x1010: 0x4000, 0x1011: 0x4000,
- 0x1012: 0x4000, 0x1013: 0x4000, 0x1014: 0x4000, 0x1015: 0x4000, 0x1016: 0x4000, 0x1017: 0x4000,
- 0x1018: 0x4000, 0x1019: 0x4000, 0x101a: 0x4000, 0x101b: 0x4000, 0x101c: 0x4000, 0x101d: 0x4000,
- 0x101e: 0x4000, 0x101f: 0x4000, 0x1020: 0x4000, 0x1021: 0x4000, 0x1022: 0x4000, 0x1023: 0x4000,
- // Block 0x41, offset 0x1040
- 0x1040: 0x2000, 0x1041: 0x2000, 0x1042: 0x2000, 0x1043: 0x2000, 0x1044: 0x2000, 0x1045: 0x2000,
- 0x1046: 0x2000, 0x1047: 0x2000, 0x1048: 0x2000, 0x1049: 0x2000, 0x104a: 0x2000, 0x104b: 0x2000,
- 0x104c: 0x2000, 0x104d: 0x2000, 0x104e: 0x2000, 0x104f: 0x2000, 0x1050: 0x4000, 0x1051: 0x4000,
- 0x1052: 0x4000, 0x1053: 0x4000, 0x1054: 0x4000, 0x1055: 0x4000, 0x1056: 0x4000, 0x1057: 0x4000,
- 0x1058: 0x4000, 0x1059: 0x4000,
- 0x1070: 0x4000, 0x1071: 0x4000, 0x1072: 0x4000, 0x1073: 0x4000, 0x1074: 0x4000, 0x1075: 0x4000,
- 0x1076: 0x4000, 0x1077: 0x4000, 0x1078: 0x4000, 0x1079: 0x4000, 0x107a: 0x4000, 0x107b: 0x4000,
- 0x107c: 0x4000, 0x107d: 0x4000, 0x107e: 0x4000, 0x107f: 0x4000,
- // Block 0x42, offset 0x1080
- 0x1080: 0x4000, 0x1081: 0x4000, 0x1082: 0x4000, 0x1083: 0x4000, 0x1084: 0x4000, 0x1085: 0x4000,
- 0x1086: 0x4000, 0x1087: 0x4000, 0x1088: 0x4000, 0x1089: 0x4000, 0x108a: 0x4000, 0x108b: 0x4000,
- 0x108c: 0x4000, 0x108d: 0x4000, 0x108e: 0x4000, 0x108f: 0x4000, 0x1090: 0x4000, 0x1091: 0x4000,
- 0x1092: 0x4000, 0x1094: 0x4000, 0x1095: 0x4000, 0x1096: 0x4000, 0x1097: 0x4000,
- 0x1098: 0x4000, 0x1099: 0x4000, 0x109a: 0x4000, 0x109b: 0x4000, 0x109c: 0x4000, 0x109d: 0x4000,
- 0x109e: 0x4000, 0x109f: 0x4000, 0x10a0: 0x4000, 0x10a1: 0x4000, 0x10a2: 0x4000, 0x10a3: 0x4000,
- 0x10a4: 0x4000, 0x10a5: 0x4000, 0x10a6: 0x4000, 0x10a8: 0x4000, 0x10a9: 0x4000,
- 0x10aa: 0x4000, 0x10ab: 0x4000,
- // Block 0x43, offset 0x10c0
- 0x10c1: 0x9012, 0x10c2: 0x9012, 0x10c3: 0x9012, 0x10c4: 0x9012, 0x10c5: 0x9012,
- 0x10c6: 0x9012, 0x10c7: 0x9012, 0x10c8: 0x9012, 0x10c9: 0x9012, 0x10ca: 0x9012, 0x10cb: 0x9012,
- 0x10cc: 0x9012, 0x10cd: 0x9012, 0x10ce: 0x9012, 0x10cf: 0x9012, 0x10d0: 0x9012, 0x10d1: 0x9012,
- 0x10d2: 0x9012, 0x10d3: 0x9012, 0x10d4: 0x9012, 0x10d5: 0x9012, 0x10d6: 0x9012, 0x10d7: 0x9012,
- 0x10d8: 0x9012, 0x10d9: 0x9012, 0x10da: 0x9012, 0x10db: 0x9012, 0x10dc: 0x9012, 0x10dd: 0x9012,
- 0x10de: 0x9012, 0x10df: 0x9012, 0x10e0: 0x9049, 0x10e1: 0x9049, 0x10e2: 0x9049, 0x10e3: 0x9049,
- 0x10e4: 0x9049, 0x10e5: 0x9049, 0x10e6: 0x9049, 0x10e7: 0x9049, 0x10e8: 0x9049, 0x10e9: 0x9049,
- 0x10ea: 0x9049, 0x10eb: 0x9049, 0x10ec: 0x9049, 0x10ed: 0x9049, 0x10ee: 0x9049, 0x10ef: 0x9049,
- 0x10f0: 0x9049, 0x10f1: 0x9049, 0x10f2: 0x9049, 0x10f3: 0x9049, 0x10f4: 0x9049, 0x10f5: 0x9049,
- 0x10f6: 0x9049, 0x10f7: 0x9049, 0x10f8: 0x9049, 0x10f9: 0x9049, 0x10fa: 0x9049, 0x10fb: 0x9049,
- 0x10fc: 0x9049, 0x10fd: 0x9049, 0x10fe: 0x9049, 0x10ff: 0x9049,
- // Block 0x44, offset 0x1100
- 0x1100: 0x9049, 0x1101: 0x9049, 0x1102: 0x9049, 0x1103: 0x9049, 0x1104: 0x9049, 0x1105: 0x9049,
- 0x1106: 0x9049, 0x1107: 0x9049, 0x1108: 0x9049, 0x1109: 0x9049, 0x110a: 0x9049, 0x110b: 0x9049,
- 0x110c: 0x9049, 0x110d: 0x9049, 0x110e: 0x9049, 0x110f: 0x9049, 0x1110: 0x9049, 0x1111: 0x9049,
- 0x1112: 0x9049, 0x1113: 0x9049, 0x1114: 0x9049, 0x1115: 0x9049, 0x1116: 0x9049, 0x1117: 0x9049,
- 0x1118: 0x9049, 0x1119: 0x9049, 0x111a: 0x9049, 0x111b: 0x9049, 0x111c: 0x9049, 0x111d: 0x9049,
- 0x111e: 0x9049, 0x111f: 0x904a, 0x1120: 0x904b, 0x1121: 0xb04c, 0x1122: 0xb04d, 0x1123: 0xb04d,
- 0x1124: 0xb04e, 0x1125: 0xb04f, 0x1126: 0xb050, 0x1127: 0xb051, 0x1128: 0xb052, 0x1129: 0xb053,
- 0x112a: 0xb054, 0x112b: 0xb055, 0x112c: 0xb056, 0x112d: 0xb057, 0x112e: 0xb058, 0x112f: 0xb059,
- 0x1130: 0xb05a, 0x1131: 0xb05b, 0x1132: 0xb05c, 0x1133: 0xb05d, 0x1134: 0xb05e, 0x1135: 0xb05f,
- 0x1136: 0xb060, 0x1137: 0xb061, 0x1138: 0xb062, 0x1139: 0xb063, 0x113a: 0xb064, 0x113b: 0xb065,
- 0x113c: 0xb052, 0x113d: 0xb066, 0x113e: 0xb067, 0x113f: 0xb055,
- // Block 0x45, offset 0x1140
- 0x1140: 0xb068, 0x1141: 0xb069, 0x1142: 0xb06a, 0x1143: 0xb06b, 0x1144: 0xb05a, 0x1145: 0xb056,
- 0x1146: 0xb06c, 0x1147: 0xb06d, 0x1148: 0xb06b, 0x1149: 0xb06e, 0x114a: 0xb06b, 0x114b: 0xb06f,
- 0x114c: 0xb06f, 0x114d: 0xb070, 0x114e: 0xb070, 0x114f: 0xb071, 0x1150: 0xb056, 0x1151: 0xb072,
- 0x1152: 0xb073, 0x1153: 0xb072, 0x1154: 0xb074, 0x1155: 0xb073, 0x1156: 0xb075, 0x1157: 0xb075,
- 0x1158: 0xb076, 0x1159: 0xb076, 0x115a: 0xb077, 0x115b: 0xb077, 0x115c: 0xb073, 0x115d: 0xb078,
- 0x115e: 0xb079, 0x115f: 0xb067, 0x1160: 0xb07a, 0x1161: 0xb07b, 0x1162: 0xb07b, 0x1163: 0xb07b,
- 0x1164: 0xb07b, 0x1165: 0xb07b, 0x1166: 0xb07b, 0x1167: 0xb07b, 0x1168: 0xb07b, 0x1169: 0xb07b,
- 0x116a: 0xb07b, 0x116b: 0xb07b, 0x116c: 0xb07b, 0x116d: 0xb07b, 0x116e: 0xb07b, 0x116f: 0xb07b,
- 0x1170: 0xb07c, 0x1171: 0xb07c, 0x1172: 0xb07c, 0x1173: 0xb07c, 0x1174: 0xb07c, 0x1175: 0xb07c,
- 0x1176: 0xb07c, 0x1177: 0xb07c, 0x1178: 0xb07c, 0x1179: 0xb07c, 0x117a: 0xb07c, 0x117b: 0xb07c,
- 0x117c: 0xb07c, 0x117d: 0xb07c, 0x117e: 0xb07c,
- // Block 0x46, offset 0x1180
- 0x1182: 0xb07d, 0x1183: 0xb07e, 0x1184: 0xb07f, 0x1185: 0xb080,
- 0x1186: 0xb07f, 0x1187: 0xb07e, 0x118a: 0xb081, 0x118b: 0xb082,
- 0x118c: 0xb083, 0x118d: 0xb07f, 0x118e: 0xb080, 0x118f: 0xb07f,
- 0x1192: 0xb084, 0x1193: 0xb085, 0x1194: 0xb084, 0x1195: 0xb086, 0x1196: 0xb084, 0x1197: 0xb087,
- 0x119a: 0xb088, 0x119b: 0xb089, 0x119c: 0xb08a,
- 0x11a0: 0x908b, 0x11a1: 0x908b, 0x11a2: 0x908c, 0x11a3: 0x908d,
- 0x11a4: 0x908b, 0x11a5: 0x908e, 0x11a6: 0x908f, 0x11a8: 0xb090, 0x11a9: 0xb091,
- 0x11aa: 0xb092, 0x11ab: 0xb091, 0x11ac: 0xb093, 0x11ad: 0xb094, 0x11ae: 0xb095,
- 0x11bd: 0x2000,
- // Block 0x47, offset 0x11c0
- 0x11e0: 0x4000,
- // Block 0x48, offset 0x1200
- 0x1200: 0x4000, 0x1201: 0x4000, 0x1202: 0x4000, 0x1203: 0x4000, 0x1204: 0x4000, 0x1205: 0x4000,
- 0x1206: 0x4000, 0x1207: 0x4000, 0x1208: 0x4000, 0x1209: 0x4000, 0x120a: 0x4000, 0x120b: 0x4000,
- 0x120c: 0x4000, 0x120d: 0x4000, 0x120e: 0x4000, 0x120f: 0x4000, 0x1210: 0x4000, 0x1211: 0x4000,
- 0x1212: 0x4000, 0x1213: 0x4000, 0x1214: 0x4000, 0x1215: 0x4000, 0x1216: 0x4000, 0x1217: 0x4000,
- 0x1218: 0x4000, 0x1219: 0x4000, 0x121a: 0x4000, 0x121b: 0x4000, 0x121c: 0x4000, 0x121d: 0x4000,
- 0x121e: 0x4000, 0x121f: 0x4000, 0x1220: 0x4000, 0x1221: 0x4000, 0x1222: 0x4000, 0x1223: 0x4000,
- 0x1224: 0x4000, 0x1225: 0x4000, 0x1226: 0x4000, 0x1227: 0x4000, 0x1228: 0x4000, 0x1229: 0x4000,
- 0x122a: 0x4000, 0x122b: 0x4000, 0x122c: 0x4000,
- // Block 0x49, offset 0x1240
- 0x1240: 0x4000, 0x1241: 0x4000, 0x1242: 0x4000, 0x1243: 0x4000, 0x1244: 0x4000, 0x1245: 0x4000,
- 0x1246: 0x4000, 0x1247: 0x4000, 0x1248: 0x4000, 0x1249: 0x4000, 0x124a: 0x4000, 0x124b: 0x4000,
- 0x124c: 0x4000, 0x124d: 0x4000, 0x124e: 0x4000, 0x124f: 0x4000, 0x1250: 0x4000, 0x1251: 0x4000,
- 0x1252: 0x4000, 0x1253: 0x4000, 0x1254: 0x4000, 0x1255: 0x4000, 0x1256: 0x4000, 0x1257: 0x4000,
- 0x1258: 0x4000, 0x1259: 0x4000, 0x125a: 0x4000, 0x125b: 0x4000, 0x125c: 0x4000, 0x125d: 0x4000,
- 0x125e: 0x4000, 0x125f: 0x4000, 0x1260: 0x4000, 0x1261: 0x4000, 0x1262: 0x4000, 0x1263: 0x4000,
- 0x1264: 0x4000, 0x1265: 0x4000, 0x1266: 0x4000, 0x1267: 0x4000, 0x1268: 0x4000, 0x1269: 0x4000,
- 0x126a: 0x4000, 0x126b: 0x4000, 0x126c: 0x4000, 0x126d: 0x4000, 0x126e: 0x4000, 0x126f: 0x4000,
- 0x1270: 0x4000, 0x1271: 0x4000, 0x1272: 0x4000,
- // Block 0x4a, offset 0x1280
- 0x1280: 0x4000, 0x1281: 0x4000,
- // Block 0x4b, offset 0x12c0
- 0x12c4: 0x4000,
- // Block 0x4c, offset 0x1300
- 0x130f: 0x4000,
- // Block 0x4d, offset 0x1340
- 0x1340: 0x2000, 0x1341: 0x2000, 0x1342: 0x2000, 0x1343: 0x2000, 0x1344: 0x2000, 0x1345: 0x2000,
- 0x1346: 0x2000, 0x1347: 0x2000, 0x1348: 0x2000, 0x1349: 0x2000, 0x134a: 0x2000,
- 0x1350: 0x2000, 0x1351: 0x2000,
- 0x1352: 0x2000, 0x1353: 0x2000, 0x1354: 0x2000, 0x1355: 0x2000, 0x1356: 0x2000, 0x1357: 0x2000,
- 0x1358: 0x2000, 0x1359: 0x2000, 0x135a: 0x2000, 0x135b: 0x2000, 0x135c: 0x2000, 0x135d: 0x2000,
- 0x135e: 0x2000, 0x135f: 0x2000, 0x1360: 0x2000, 0x1361: 0x2000, 0x1362: 0x2000, 0x1363: 0x2000,
- 0x1364: 0x2000, 0x1365: 0x2000, 0x1366: 0x2000, 0x1367: 0x2000, 0x1368: 0x2000, 0x1369: 0x2000,
- 0x136a: 0x2000, 0x136b: 0x2000, 0x136c: 0x2000, 0x136d: 0x2000,
- 0x1370: 0x2000, 0x1371: 0x2000, 0x1372: 0x2000, 0x1373: 0x2000, 0x1374: 0x2000, 0x1375: 0x2000,
- 0x1376: 0x2000, 0x1377: 0x2000, 0x1378: 0x2000, 0x1379: 0x2000, 0x137a: 0x2000, 0x137b: 0x2000,
- 0x137c: 0x2000, 0x137d: 0x2000, 0x137e: 0x2000, 0x137f: 0x2000,
- // Block 0x4e, offset 0x1380
- 0x1380: 0x2000, 0x1381: 0x2000, 0x1382: 0x2000, 0x1383: 0x2000, 0x1384: 0x2000, 0x1385: 0x2000,
- 0x1386: 0x2000, 0x1387: 0x2000, 0x1388: 0x2000, 0x1389: 0x2000, 0x138a: 0x2000, 0x138b: 0x2000,
- 0x138c: 0x2000, 0x138d: 0x2000, 0x138e: 0x2000, 0x138f: 0x2000, 0x1390: 0x2000, 0x1391: 0x2000,
- 0x1392: 0x2000, 0x1393: 0x2000, 0x1394: 0x2000, 0x1395: 0x2000, 0x1396: 0x2000, 0x1397: 0x2000,
- 0x1398: 0x2000, 0x1399: 0x2000, 0x139a: 0x2000, 0x139b: 0x2000, 0x139c: 0x2000, 0x139d: 0x2000,
- 0x139e: 0x2000, 0x139f: 0x2000, 0x13a0: 0x2000, 0x13a1: 0x2000, 0x13a2: 0x2000, 0x13a3: 0x2000,
- 0x13a4: 0x2000, 0x13a5: 0x2000, 0x13a6: 0x2000, 0x13a7: 0x2000, 0x13a8: 0x2000, 0x13a9: 0x2000,
- 0x13b0: 0x2000, 0x13b1: 0x2000, 0x13b2: 0x2000, 0x13b3: 0x2000, 0x13b4: 0x2000, 0x13b5: 0x2000,
- 0x13b6: 0x2000, 0x13b7: 0x2000, 0x13b8: 0x2000, 0x13b9: 0x2000, 0x13ba: 0x2000, 0x13bb: 0x2000,
- 0x13bc: 0x2000, 0x13bd: 0x2000, 0x13be: 0x2000, 0x13bf: 0x2000,
- // Block 0x4f, offset 0x13c0
- 0x13c0: 0x2000, 0x13c1: 0x2000, 0x13c2: 0x2000, 0x13c3: 0x2000, 0x13c4: 0x2000, 0x13c5: 0x2000,
- 0x13c6: 0x2000, 0x13c7: 0x2000, 0x13c8: 0x2000, 0x13c9: 0x2000, 0x13ca: 0x2000, 0x13cb: 0x2000,
- 0x13cc: 0x2000, 0x13cd: 0x2000, 0x13ce: 0x4000, 0x13cf: 0x2000, 0x13d0: 0x2000, 0x13d1: 0x4000,
- 0x13d2: 0x4000, 0x13d3: 0x4000, 0x13d4: 0x4000, 0x13d5: 0x4000, 0x13d6: 0x4000, 0x13d7: 0x4000,
- 0x13d8: 0x4000, 0x13d9: 0x4000, 0x13da: 0x4000, 0x13db: 0x2000, 0x13dc: 0x2000, 0x13dd: 0x2000,
- 0x13de: 0x2000, 0x13df: 0x2000, 0x13e0: 0x2000, 0x13e1: 0x2000, 0x13e2: 0x2000, 0x13e3: 0x2000,
- 0x13e4: 0x2000, 0x13e5: 0x2000, 0x13e6: 0x2000, 0x13e7: 0x2000, 0x13e8: 0x2000, 0x13e9: 0x2000,
- 0x13ea: 0x2000, 0x13eb: 0x2000, 0x13ec: 0x2000,
- // Block 0x50, offset 0x1400
- 0x1400: 0x4000, 0x1401: 0x4000, 0x1402: 0x4000,
- 0x1410: 0x4000, 0x1411: 0x4000,
- 0x1412: 0x4000, 0x1413: 0x4000, 0x1414: 0x4000, 0x1415: 0x4000, 0x1416: 0x4000, 0x1417: 0x4000,
- 0x1418: 0x4000, 0x1419: 0x4000, 0x141a: 0x4000, 0x141b: 0x4000, 0x141c: 0x4000, 0x141d: 0x4000,
- 0x141e: 0x4000, 0x141f: 0x4000, 0x1420: 0x4000, 0x1421: 0x4000, 0x1422: 0x4000, 0x1423: 0x4000,
- 0x1424: 0x4000, 0x1425: 0x4000, 0x1426: 0x4000, 0x1427: 0x4000, 0x1428: 0x4000, 0x1429: 0x4000,
- 0x142a: 0x4000, 0x142b: 0x4000, 0x142c: 0x4000, 0x142d: 0x4000, 0x142e: 0x4000, 0x142f: 0x4000,
- 0x1430: 0x4000, 0x1431: 0x4000, 0x1432: 0x4000, 0x1433: 0x4000, 0x1434: 0x4000, 0x1435: 0x4000,
- 0x1436: 0x4000, 0x1437: 0x4000, 0x1438: 0x4000, 0x1439: 0x4000, 0x143a: 0x4000, 0x143b: 0x4000,
- // Block 0x51, offset 0x1440
- 0x1440: 0x4000, 0x1441: 0x4000, 0x1442: 0x4000, 0x1443: 0x4000, 0x1444: 0x4000, 0x1445: 0x4000,
- 0x1446: 0x4000, 0x1447: 0x4000, 0x1448: 0x4000,
- 0x1450: 0x4000, 0x1451: 0x4000,
- // Block 0x52, offset 0x1480
- 0x1480: 0x4000, 0x1481: 0x4000, 0x1482: 0x4000, 0x1483: 0x4000, 0x1484: 0x4000, 0x1485: 0x4000,
- 0x1486: 0x4000, 0x1487: 0x4000, 0x1488: 0x4000, 0x1489: 0x4000, 0x148a: 0x4000, 0x148b: 0x4000,
- 0x148c: 0x4000, 0x148d: 0x4000, 0x148e: 0x4000, 0x148f: 0x4000, 0x1490: 0x4000, 0x1491: 0x4000,
- 0x1492: 0x4000, 0x1493: 0x4000, 0x1494: 0x4000, 0x1495: 0x4000, 0x1496: 0x4000, 0x1497: 0x4000,
- 0x1498: 0x4000, 0x1499: 0x4000, 0x149a: 0x4000, 0x149b: 0x4000, 0x149c: 0x4000, 0x149d: 0x4000,
- 0x149e: 0x4000, 0x149f: 0x4000, 0x14a0: 0x4000,
- 0x14ad: 0x4000, 0x14ae: 0x4000, 0x14af: 0x4000,
- 0x14b0: 0x4000, 0x14b1: 0x4000, 0x14b2: 0x4000, 0x14b3: 0x4000, 0x14b4: 0x4000, 0x14b5: 0x4000,
- 0x14b7: 0x4000, 0x14b8: 0x4000, 0x14b9: 0x4000, 0x14ba: 0x4000, 0x14bb: 0x4000,
- 0x14bc: 0x4000, 0x14bd: 0x4000, 0x14be: 0x4000, 0x14bf: 0x4000,
- // Block 0x53, offset 0x14c0
- 0x14c0: 0x4000, 0x14c1: 0x4000, 0x14c2: 0x4000, 0x14c3: 0x4000, 0x14c4: 0x4000, 0x14c5: 0x4000,
- 0x14c6: 0x4000, 0x14c7: 0x4000, 0x14c8: 0x4000, 0x14c9: 0x4000, 0x14ca: 0x4000, 0x14cb: 0x4000,
- 0x14cc: 0x4000, 0x14cd: 0x4000, 0x14ce: 0x4000, 0x14cf: 0x4000, 0x14d0: 0x4000, 0x14d1: 0x4000,
- 0x14d2: 0x4000, 0x14d3: 0x4000, 0x14d4: 0x4000, 0x14d5: 0x4000, 0x14d6: 0x4000, 0x14d7: 0x4000,
- 0x14d8: 0x4000, 0x14d9: 0x4000, 0x14da: 0x4000, 0x14db: 0x4000, 0x14dc: 0x4000, 0x14dd: 0x4000,
- 0x14de: 0x4000, 0x14df: 0x4000, 0x14e0: 0x4000, 0x14e1: 0x4000, 0x14e2: 0x4000, 0x14e3: 0x4000,
- 0x14e4: 0x4000, 0x14e5: 0x4000, 0x14e6: 0x4000, 0x14e7: 0x4000, 0x14e8: 0x4000, 0x14e9: 0x4000,
- 0x14ea: 0x4000, 0x14eb: 0x4000, 0x14ec: 0x4000, 0x14ed: 0x4000, 0x14ee: 0x4000, 0x14ef: 0x4000,
- 0x14f0: 0x4000, 0x14f1: 0x4000, 0x14f2: 0x4000, 0x14f3: 0x4000, 0x14f4: 0x4000, 0x14f5: 0x4000,
- 0x14f6: 0x4000, 0x14f7: 0x4000, 0x14f8: 0x4000, 0x14f9: 0x4000, 0x14fa: 0x4000, 0x14fb: 0x4000,
- 0x14fc: 0x4000, 0x14fe: 0x4000, 0x14ff: 0x4000,
- // Block 0x54, offset 0x1500
- 0x1500: 0x4000, 0x1501: 0x4000, 0x1502: 0x4000, 0x1503: 0x4000, 0x1504: 0x4000, 0x1505: 0x4000,
- 0x1506: 0x4000, 0x1507: 0x4000, 0x1508: 0x4000, 0x1509: 0x4000, 0x150a: 0x4000, 0x150b: 0x4000,
- 0x150c: 0x4000, 0x150d: 0x4000, 0x150e: 0x4000, 0x150f: 0x4000, 0x1510: 0x4000, 0x1511: 0x4000,
- 0x1512: 0x4000, 0x1513: 0x4000,
- 0x1520: 0x4000, 0x1521: 0x4000, 0x1522: 0x4000, 0x1523: 0x4000,
- 0x1524: 0x4000, 0x1525: 0x4000, 0x1526: 0x4000, 0x1527: 0x4000, 0x1528: 0x4000, 0x1529: 0x4000,
- 0x152a: 0x4000, 0x152b: 0x4000, 0x152c: 0x4000, 0x152d: 0x4000, 0x152e: 0x4000, 0x152f: 0x4000,
- 0x1530: 0x4000, 0x1531: 0x4000, 0x1532: 0x4000, 0x1533: 0x4000, 0x1534: 0x4000, 0x1535: 0x4000,
- 0x1536: 0x4000, 0x1537: 0x4000, 0x1538: 0x4000, 0x1539: 0x4000, 0x153a: 0x4000, 0x153b: 0x4000,
- 0x153c: 0x4000, 0x153d: 0x4000, 0x153e: 0x4000, 0x153f: 0x4000,
- // Block 0x55, offset 0x1540
- 0x1540: 0x4000, 0x1541: 0x4000, 0x1542: 0x4000, 0x1543: 0x4000, 0x1544: 0x4000, 0x1545: 0x4000,
- 0x1546: 0x4000, 0x1547: 0x4000, 0x1548: 0x4000, 0x1549: 0x4000, 0x154a: 0x4000,
- 0x154f: 0x4000, 0x1550: 0x4000, 0x1551: 0x4000,
- 0x1552: 0x4000, 0x1553: 0x4000,
- 0x1560: 0x4000, 0x1561: 0x4000, 0x1562: 0x4000, 0x1563: 0x4000,
- 0x1564: 0x4000, 0x1565: 0x4000, 0x1566: 0x4000, 0x1567: 0x4000, 0x1568: 0x4000, 0x1569: 0x4000,
- 0x156a: 0x4000, 0x156b: 0x4000, 0x156c: 0x4000, 0x156d: 0x4000, 0x156e: 0x4000, 0x156f: 0x4000,
- 0x1570: 0x4000, 0x1574: 0x4000,
- 0x1578: 0x4000, 0x1579: 0x4000, 0x157a: 0x4000, 0x157b: 0x4000,
- 0x157c: 0x4000, 0x157d: 0x4000, 0x157e: 0x4000, 0x157f: 0x4000,
- // Block 0x56, offset 0x1580
- 0x1580: 0x4000, 0x1582: 0x4000, 0x1583: 0x4000, 0x1584: 0x4000, 0x1585: 0x4000,
- 0x1586: 0x4000, 0x1587: 0x4000, 0x1588: 0x4000, 0x1589: 0x4000, 0x158a: 0x4000, 0x158b: 0x4000,
- 0x158c: 0x4000, 0x158d: 0x4000, 0x158e: 0x4000, 0x158f: 0x4000, 0x1590: 0x4000, 0x1591: 0x4000,
- 0x1592: 0x4000, 0x1593: 0x4000, 0x1594: 0x4000, 0x1595: 0x4000, 0x1596: 0x4000, 0x1597: 0x4000,
- 0x1598: 0x4000, 0x1599: 0x4000, 0x159a: 0x4000, 0x159b: 0x4000, 0x159c: 0x4000, 0x159d: 0x4000,
- 0x159e: 0x4000, 0x159f: 0x4000, 0x15a0: 0x4000, 0x15a1: 0x4000, 0x15a2: 0x4000, 0x15a3: 0x4000,
- 0x15a4: 0x4000, 0x15a5: 0x4000, 0x15a6: 0x4000, 0x15a7: 0x4000, 0x15a8: 0x4000, 0x15a9: 0x4000,
- 0x15aa: 0x4000, 0x15ab: 0x4000, 0x15ac: 0x4000, 0x15ad: 0x4000, 0x15ae: 0x4000, 0x15af: 0x4000,
- 0x15b0: 0x4000, 0x15b1: 0x4000, 0x15b2: 0x4000, 0x15b3: 0x4000, 0x15b4: 0x4000, 0x15b5: 0x4000,
- 0x15b6: 0x4000, 0x15b7: 0x4000, 0x15b8: 0x4000, 0x15b9: 0x4000, 0x15ba: 0x4000, 0x15bb: 0x4000,
- 0x15bc: 0x4000, 0x15bd: 0x4000, 0x15be: 0x4000, 0x15bf: 0x4000,
- // Block 0x57, offset 0x15c0
- 0x15c0: 0x4000, 0x15c1: 0x4000, 0x15c2: 0x4000, 0x15c3: 0x4000, 0x15c4: 0x4000, 0x15c5: 0x4000,
- 0x15c6: 0x4000, 0x15c7: 0x4000, 0x15c8: 0x4000, 0x15c9: 0x4000, 0x15ca: 0x4000, 0x15cb: 0x4000,
- 0x15cc: 0x4000, 0x15cd: 0x4000, 0x15ce: 0x4000, 0x15cf: 0x4000, 0x15d0: 0x4000, 0x15d1: 0x4000,
- 0x15d2: 0x4000, 0x15d3: 0x4000, 0x15d4: 0x4000, 0x15d5: 0x4000, 0x15d6: 0x4000, 0x15d7: 0x4000,
- 0x15d8: 0x4000, 0x15d9: 0x4000, 0x15da: 0x4000, 0x15db: 0x4000, 0x15dc: 0x4000, 0x15dd: 0x4000,
- 0x15de: 0x4000, 0x15df: 0x4000, 0x15e0: 0x4000, 0x15e1: 0x4000, 0x15e2: 0x4000, 0x15e3: 0x4000,
- 0x15e4: 0x4000, 0x15e5: 0x4000, 0x15e6: 0x4000, 0x15e7: 0x4000, 0x15e8: 0x4000, 0x15e9: 0x4000,
- 0x15ea: 0x4000, 0x15eb: 0x4000, 0x15ec: 0x4000, 0x15ed: 0x4000, 0x15ee: 0x4000, 0x15ef: 0x4000,
- 0x15f0: 0x4000, 0x15f1: 0x4000, 0x15f2: 0x4000, 0x15f3: 0x4000, 0x15f4: 0x4000, 0x15f5: 0x4000,
- 0x15f6: 0x4000, 0x15f7: 0x4000, 0x15f8: 0x4000, 0x15f9: 0x4000, 0x15fa: 0x4000, 0x15fb: 0x4000,
- 0x15fc: 0x4000, 0x15ff: 0x4000,
- // Block 0x58, offset 0x1600
- 0x1600: 0x4000, 0x1601: 0x4000, 0x1602: 0x4000, 0x1603: 0x4000, 0x1604: 0x4000, 0x1605: 0x4000,
- 0x1606: 0x4000, 0x1607: 0x4000, 0x1608: 0x4000, 0x1609: 0x4000, 0x160a: 0x4000, 0x160b: 0x4000,
- 0x160c: 0x4000, 0x160d: 0x4000, 0x160e: 0x4000, 0x160f: 0x4000, 0x1610: 0x4000, 0x1611: 0x4000,
- 0x1612: 0x4000, 0x1613: 0x4000, 0x1614: 0x4000, 0x1615: 0x4000, 0x1616: 0x4000, 0x1617: 0x4000,
- 0x1618: 0x4000, 0x1619: 0x4000, 0x161a: 0x4000, 0x161b: 0x4000, 0x161c: 0x4000, 0x161d: 0x4000,
- 0x161e: 0x4000, 0x161f: 0x4000, 0x1620: 0x4000, 0x1621: 0x4000, 0x1622: 0x4000, 0x1623: 0x4000,
- 0x1624: 0x4000, 0x1625: 0x4000, 0x1626: 0x4000, 0x1627: 0x4000, 0x1628: 0x4000, 0x1629: 0x4000,
- 0x162a: 0x4000, 0x162b: 0x4000, 0x162c: 0x4000, 0x162d: 0x4000, 0x162e: 0x4000, 0x162f: 0x4000,
- 0x1630: 0x4000, 0x1631: 0x4000, 0x1632: 0x4000, 0x1633: 0x4000, 0x1634: 0x4000, 0x1635: 0x4000,
- 0x1636: 0x4000, 0x1637: 0x4000, 0x1638: 0x4000, 0x1639: 0x4000, 0x163a: 0x4000, 0x163b: 0x4000,
- 0x163c: 0x4000, 0x163d: 0x4000,
- // Block 0x59, offset 0x1640
- 0x164b: 0x4000,
- 0x164c: 0x4000, 0x164d: 0x4000, 0x164e: 0x4000, 0x1650: 0x4000, 0x1651: 0x4000,
- 0x1652: 0x4000, 0x1653: 0x4000, 0x1654: 0x4000, 0x1655: 0x4000, 0x1656: 0x4000, 0x1657: 0x4000,
- 0x1658: 0x4000, 0x1659: 0x4000, 0x165a: 0x4000, 0x165b: 0x4000, 0x165c: 0x4000, 0x165d: 0x4000,
- 0x165e: 0x4000, 0x165f: 0x4000, 0x1660: 0x4000, 0x1661: 0x4000, 0x1662: 0x4000, 0x1663: 0x4000,
- 0x1664: 0x4000, 0x1665: 0x4000, 0x1666: 0x4000, 0x1667: 0x4000,
- 0x167a: 0x4000,
- // Block 0x5a, offset 0x1680
- 0x1695: 0x4000, 0x1696: 0x4000,
- 0x16a4: 0x4000,
- // Block 0x5b, offset 0x16c0
- 0x16fb: 0x4000,
- 0x16fc: 0x4000, 0x16fd: 0x4000, 0x16fe: 0x4000, 0x16ff: 0x4000,
- // Block 0x5c, offset 0x1700
- 0x1700: 0x4000, 0x1701: 0x4000, 0x1702: 0x4000, 0x1703: 0x4000, 0x1704: 0x4000, 0x1705: 0x4000,
- 0x1706: 0x4000, 0x1707: 0x4000, 0x1708: 0x4000, 0x1709: 0x4000, 0x170a: 0x4000, 0x170b: 0x4000,
- 0x170c: 0x4000, 0x170d: 0x4000, 0x170e: 0x4000, 0x170f: 0x4000,
- // Block 0x5d, offset 0x1740
- 0x1740: 0x4000, 0x1741: 0x4000, 0x1742: 0x4000, 0x1743: 0x4000, 0x1744: 0x4000, 0x1745: 0x4000,
- 0x174c: 0x4000, 0x1750: 0x4000, 0x1751: 0x4000,
- 0x1752: 0x4000,
- 0x176b: 0x4000, 0x176c: 0x4000,
- 0x1774: 0x4000, 0x1775: 0x4000,
- 0x1776: 0x4000,
- // Block 0x5e, offset 0x1780
- 0x1790: 0x4000, 0x1791: 0x4000,
- 0x1792: 0x4000, 0x1793: 0x4000, 0x1794: 0x4000, 0x1795: 0x4000, 0x1796: 0x4000, 0x1797: 0x4000,
- 0x1798: 0x4000, 0x1799: 0x4000, 0x179a: 0x4000, 0x179b: 0x4000, 0x179c: 0x4000, 0x179d: 0x4000,
- 0x179e: 0x4000, 0x17a0: 0x4000, 0x17a1: 0x4000, 0x17a2: 0x4000, 0x17a3: 0x4000,
- 0x17a4: 0x4000, 0x17a5: 0x4000, 0x17a6: 0x4000, 0x17a7: 0x4000,
- 0x17b0: 0x4000, 0x17b3: 0x4000, 0x17b4: 0x4000, 0x17b5: 0x4000,
- 0x17b6: 0x4000, 0x17b7: 0x4000, 0x17b8: 0x4000, 0x17b9: 0x4000, 0x17ba: 0x4000, 0x17bb: 0x4000,
- 0x17bc: 0x4000, 0x17bd: 0x4000, 0x17be: 0x4000,
- // Block 0x5f, offset 0x17c0
- 0x17c0: 0x4000, 0x17c1: 0x4000, 0x17c2: 0x4000, 0x17c3: 0x4000, 0x17c4: 0x4000, 0x17c5: 0x4000,
- 0x17c6: 0x4000, 0x17c7: 0x4000, 0x17c8: 0x4000, 0x17c9: 0x4000, 0x17ca: 0x4000, 0x17cb: 0x4000,
- 0x17d0: 0x4000, 0x17d1: 0x4000,
- 0x17d2: 0x4000, 0x17d3: 0x4000, 0x17d4: 0x4000, 0x17d5: 0x4000, 0x17d6: 0x4000, 0x17d7: 0x4000,
- 0x17d8: 0x4000, 0x17d9: 0x4000, 0x17da: 0x4000, 0x17db: 0x4000, 0x17dc: 0x4000, 0x17dd: 0x4000,
- 0x17de: 0x4000,
- // Block 0x60, offset 0x1800
- 0x1800: 0x4000, 0x1801: 0x4000, 0x1802: 0x4000, 0x1803: 0x4000, 0x1804: 0x4000, 0x1805: 0x4000,
- 0x1806: 0x4000, 0x1807: 0x4000, 0x1808: 0x4000, 0x1809: 0x4000, 0x180a: 0x4000, 0x180b: 0x4000,
- 0x180c: 0x4000, 0x180d: 0x4000, 0x180e: 0x4000, 0x180f: 0x4000, 0x1810: 0x4000, 0x1811: 0x4000,
- // Block 0x61, offset 0x1840
- 0x1840: 0x4000,
- // Block 0x62, offset 0x1880
- 0x1880: 0x2000, 0x1881: 0x2000, 0x1882: 0x2000, 0x1883: 0x2000, 0x1884: 0x2000, 0x1885: 0x2000,
- 0x1886: 0x2000, 0x1887: 0x2000, 0x1888: 0x2000, 0x1889: 0x2000, 0x188a: 0x2000, 0x188b: 0x2000,
- 0x188c: 0x2000, 0x188d: 0x2000, 0x188e: 0x2000, 0x188f: 0x2000, 0x1890: 0x2000, 0x1891: 0x2000,
- 0x1892: 0x2000, 0x1893: 0x2000, 0x1894: 0x2000, 0x1895: 0x2000, 0x1896: 0x2000, 0x1897: 0x2000,
- 0x1898: 0x2000, 0x1899: 0x2000, 0x189a: 0x2000, 0x189b: 0x2000, 0x189c: 0x2000, 0x189d: 0x2000,
- 0x189e: 0x2000, 0x189f: 0x2000, 0x18a0: 0x2000, 0x18a1: 0x2000, 0x18a2: 0x2000, 0x18a3: 0x2000,
- 0x18a4: 0x2000, 0x18a5: 0x2000, 0x18a6: 0x2000, 0x18a7: 0x2000, 0x18a8: 0x2000, 0x18a9: 0x2000,
- 0x18aa: 0x2000, 0x18ab: 0x2000, 0x18ac: 0x2000, 0x18ad: 0x2000, 0x18ae: 0x2000, 0x18af: 0x2000,
- 0x18b0: 0x2000, 0x18b1: 0x2000, 0x18b2: 0x2000, 0x18b3: 0x2000, 0x18b4: 0x2000, 0x18b5: 0x2000,
- 0x18b6: 0x2000, 0x18b7: 0x2000, 0x18b8: 0x2000, 0x18b9: 0x2000, 0x18ba: 0x2000, 0x18bb: 0x2000,
- 0x18bc: 0x2000, 0x18bd: 0x2000,
-}
-
-// widthIndex: 22 blocks, 1408 entries, 1408 bytes
-// Block 0 is the zero block.
-var widthIndex = [1408]uint8{
- // Block 0x0, offset 0x0
- // Block 0x1, offset 0x40
- // Block 0x2, offset 0x80
- // Block 0x3, offset 0xc0
- 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05,
- 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b,
- 0xd0: 0x0c, 0xd1: 0x0d,
- 0xe1: 0x02, 0xe2: 0x03, 0xe3: 0x04, 0xe4: 0x05, 0xe5: 0x06, 0xe6: 0x06, 0xe7: 0x06,
- 0xe8: 0x06, 0xe9: 0x06, 0xea: 0x07, 0xeb: 0x06, 0xec: 0x06, 0xed: 0x08, 0xee: 0x09, 0xef: 0x0a,
- 0xf0: 0x0f, 0xf3: 0x12, 0xf4: 0x13,
- // Block 0x4, offset 0x100
- 0x104: 0x0e, 0x105: 0x0f,
- // Block 0x5, offset 0x140
- 0x140: 0x10, 0x141: 0x11, 0x142: 0x12, 0x144: 0x13, 0x145: 0x14, 0x146: 0x15, 0x147: 0x16,
- 0x148: 0x17, 0x149: 0x18, 0x14a: 0x19, 0x14c: 0x1a, 0x14f: 0x1b,
- 0x151: 0x1c, 0x152: 0x08, 0x153: 0x1d, 0x154: 0x1e, 0x155: 0x1f, 0x156: 0x20, 0x157: 0x21,
- 0x158: 0x22, 0x159: 0x23, 0x15a: 0x24, 0x15b: 0x25, 0x15c: 0x26, 0x15d: 0x27, 0x15e: 0x28, 0x15f: 0x29,
- 0x166: 0x2a,
- 0x16c: 0x2b, 0x16d: 0x2c,
- 0x17a: 0x2d, 0x17b: 0x2e, 0x17c: 0x0e, 0x17d: 0x0e, 0x17e: 0x0e, 0x17f: 0x2f,
- // Block 0x6, offset 0x180
- 0x180: 0x30, 0x181: 0x31, 0x182: 0x32, 0x183: 0x33, 0x184: 0x34, 0x185: 0x35, 0x186: 0x36, 0x187: 0x37,
- 0x188: 0x38, 0x189: 0x39, 0x18a: 0x0e, 0x18b: 0x3a, 0x18c: 0x0e, 0x18d: 0x0e, 0x18e: 0x0e, 0x18f: 0x0e,
- 0x190: 0x0e, 0x191: 0x0e, 0x192: 0x0e, 0x193: 0x0e, 0x194: 0x0e, 0x195: 0x0e, 0x196: 0x0e, 0x197: 0x0e,
- 0x198: 0x0e, 0x199: 0x0e, 0x19a: 0x0e, 0x19b: 0x0e, 0x19c: 0x0e, 0x19d: 0x0e, 0x19e: 0x0e, 0x19f: 0x0e,
- 0x1a0: 0x0e, 0x1a1: 0x0e, 0x1a2: 0x0e, 0x1a3: 0x0e, 0x1a4: 0x0e, 0x1a5: 0x0e, 0x1a6: 0x0e, 0x1a7: 0x0e,
- 0x1a8: 0x0e, 0x1a9: 0x0e, 0x1aa: 0x0e, 0x1ab: 0x0e, 0x1ac: 0x0e, 0x1ad: 0x0e, 0x1ae: 0x0e, 0x1af: 0x0e,
- 0x1b0: 0x0e, 0x1b1: 0x0e, 0x1b2: 0x0e, 0x1b3: 0x0e, 0x1b4: 0x0e, 0x1b5: 0x0e, 0x1b6: 0x0e, 0x1b7: 0x0e,
- 0x1b8: 0x0e, 0x1b9: 0x0e, 0x1ba: 0x0e, 0x1bb: 0x0e, 0x1bc: 0x0e, 0x1bd: 0x0e, 0x1be: 0x0e, 0x1bf: 0x0e,
- // Block 0x7, offset 0x1c0
- 0x1c0: 0x0e, 0x1c1: 0x0e, 0x1c2: 0x0e, 0x1c3: 0x0e, 0x1c4: 0x0e, 0x1c5: 0x0e, 0x1c6: 0x0e, 0x1c7: 0x0e,
- 0x1c8: 0x0e, 0x1c9: 0x0e, 0x1ca: 0x0e, 0x1cb: 0x0e, 0x1cc: 0x0e, 0x1cd: 0x0e, 0x1ce: 0x0e, 0x1cf: 0x0e,
- 0x1d0: 0x0e, 0x1d1: 0x0e, 0x1d2: 0x0e, 0x1d3: 0x0e, 0x1d4: 0x0e, 0x1d5: 0x0e, 0x1d6: 0x0e, 0x1d7: 0x0e,
- 0x1d8: 0x0e, 0x1d9: 0x0e, 0x1da: 0x0e, 0x1db: 0x0e, 0x1dc: 0x0e, 0x1dd: 0x0e, 0x1de: 0x0e, 0x1df: 0x0e,
- 0x1e0: 0x0e, 0x1e1: 0x0e, 0x1e2: 0x0e, 0x1e3: 0x0e, 0x1e4: 0x0e, 0x1e5: 0x0e, 0x1e6: 0x0e, 0x1e7: 0x0e,
- 0x1e8: 0x0e, 0x1e9: 0x0e, 0x1ea: 0x0e, 0x1eb: 0x0e, 0x1ec: 0x0e, 0x1ed: 0x0e, 0x1ee: 0x0e, 0x1ef: 0x0e,
- 0x1f0: 0x0e, 0x1f1: 0x0e, 0x1f2: 0x0e, 0x1f3: 0x0e, 0x1f4: 0x0e, 0x1f5: 0x0e, 0x1f6: 0x0e,
- 0x1f8: 0x0e, 0x1f9: 0x0e, 0x1fa: 0x0e, 0x1fb: 0x0e, 0x1fc: 0x0e, 0x1fd: 0x0e, 0x1fe: 0x0e, 0x1ff: 0x0e,
- // Block 0x8, offset 0x200
- 0x200: 0x0e, 0x201: 0x0e, 0x202: 0x0e, 0x203: 0x0e, 0x204: 0x0e, 0x205: 0x0e, 0x206: 0x0e, 0x207: 0x0e,
- 0x208: 0x0e, 0x209: 0x0e, 0x20a: 0x0e, 0x20b: 0x0e, 0x20c: 0x0e, 0x20d: 0x0e, 0x20e: 0x0e, 0x20f: 0x0e,
- 0x210: 0x0e, 0x211: 0x0e, 0x212: 0x0e, 0x213: 0x0e, 0x214: 0x0e, 0x215: 0x0e, 0x216: 0x0e, 0x217: 0x0e,
- 0x218: 0x0e, 0x219: 0x0e, 0x21a: 0x0e, 0x21b: 0x0e, 0x21c: 0x0e, 0x21d: 0x0e, 0x21e: 0x0e, 0x21f: 0x0e,
- 0x220: 0x0e, 0x221: 0x0e, 0x222: 0x0e, 0x223: 0x0e, 0x224: 0x0e, 0x225: 0x0e, 0x226: 0x0e, 0x227: 0x0e,
- 0x228: 0x0e, 0x229: 0x0e, 0x22a: 0x0e, 0x22b: 0x0e, 0x22c: 0x0e, 0x22d: 0x0e, 0x22e: 0x0e, 0x22f: 0x0e,
- 0x230: 0x0e, 0x231: 0x0e, 0x232: 0x0e, 0x233: 0x0e, 0x234: 0x0e, 0x235: 0x0e, 0x236: 0x0e, 0x237: 0x0e,
- 0x238: 0x0e, 0x239: 0x0e, 0x23a: 0x0e, 0x23b: 0x0e, 0x23c: 0x0e, 0x23d: 0x0e, 0x23e: 0x0e, 0x23f: 0x0e,
- // Block 0x9, offset 0x240
- 0x240: 0x0e, 0x241: 0x0e, 0x242: 0x0e, 0x243: 0x0e, 0x244: 0x0e, 0x245: 0x0e, 0x246: 0x0e, 0x247: 0x0e,
- 0x248: 0x0e, 0x249: 0x0e, 0x24a: 0x0e, 0x24b: 0x0e, 0x24c: 0x0e, 0x24d: 0x0e, 0x24e: 0x0e, 0x24f: 0x0e,
- 0x250: 0x0e, 0x251: 0x0e, 0x252: 0x3b, 0x253: 0x3c,
- 0x265: 0x3d,
- 0x270: 0x0e, 0x271: 0x0e, 0x272: 0x0e, 0x273: 0x0e, 0x274: 0x0e, 0x275: 0x0e, 0x276: 0x0e, 0x277: 0x0e,
- 0x278: 0x0e, 0x279: 0x0e, 0x27a: 0x0e, 0x27b: 0x0e, 0x27c: 0x0e, 0x27d: 0x0e, 0x27e: 0x0e, 0x27f: 0x0e,
- // Block 0xa, offset 0x280
- 0x280: 0x0e, 0x281: 0x0e, 0x282: 0x0e, 0x283: 0x0e, 0x284: 0x0e, 0x285: 0x0e, 0x286: 0x0e, 0x287: 0x0e,
- 0x288: 0x0e, 0x289: 0x0e, 0x28a: 0x0e, 0x28b: 0x0e, 0x28c: 0x0e, 0x28d: 0x0e, 0x28e: 0x0e, 0x28f: 0x0e,
- 0x290: 0x0e, 0x291: 0x0e, 0x292: 0x0e, 0x293: 0x0e, 0x294: 0x0e, 0x295: 0x0e, 0x296: 0x0e, 0x297: 0x0e,
- 0x298: 0x0e, 0x299: 0x0e, 0x29a: 0x0e, 0x29b: 0x0e, 0x29c: 0x0e, 0x29d: 0x0e, 0x29e: 0x3e,
- // Block 0xb, offset 0x2c0
- 0x2c0: 0x08, 0x2c1: 0x08, 0x2c2: 0x08, 0x2c3: 0x08, 0x2c4: 0x08, 0x2c5: 0x08, 0x2c6: 0x08, 0x2c7: 0x08,
- 0x2c8: 0x08, 0x2c9: 0x08, 0x2ca: 0x08, 0x2cb: 0x08, 0x2cc: 0x08, 0x2cd: 0x08, 0x2ce: 0x08, 0x2cf: 0x08,
- 0x2d0: 0x08, 0x2d1: 0x08, 0x2d2: 0x08, 0x2d3: 0x08, 0x2d4: 0x08, 0x2d5: 0x08, 0x2d6: 0x08, 0x2d7: 0x08,
- 0x2d8: 0x08, 0x2d9: 0x08, 0x2da: 0x08, 0x2db: 0x08, 0x2dc: 0x08, 0x2dd: 0x08, 0x2de: 0x08, 0x2df: 0x08,
- 0x2e0: 0x08, 0x2e1: 0x08, 0x2e2: 0x08, 0x2e3: 0x08, 0x2e4: 0x08, 0x2e5: 0x08, 0x2e6: 0x08, 0x2e7: 0x08,
- 0x2e8: 0x08, 0x2e9: 0x08, 0x2ea: 0x08, 0x2eb: 0x08, 0x2ec: 0x08, 0x2ed: 0x08, 0x2ee: 0x08, 0x2ef: 0x08,
- 0x2f0: 0x08, 0x2f1: 0x08, 0x2f2: 0x08, 0x2f3: 0x08, 0x2f4: 0x08, 0x2f5: 0x08, 0x2f6: 0x08, 0x2f7: 0x08,
- 0x2f8: 0x08, 0x2f9: 0x08, 0x2fa: 0x08, 0x2fb: 0x08, 0x2fc: 0x08, 0x2fd: 0x08, 0x2fe: 0x08, 0x2ff: 0x08,
- // Block 0xc, offset 0x300
- 0x300: 0x08, 0x301: 0x08, 0x302: 0x08, 0x303: 0x08, 0x304: 0x08, 0x305: 0x08, 0x306: 0x08, 0x307: 0x08,
- 0x308: 0x08, 0x309: 0x08, 0x30a: 0x08, 0x30b: 0x08, 0x30c: 0x08, 0x30d: 0x08, 0x30e: 0x08, 0x30f: 0x08,
- 0x310: 0x08, 0x311: 0x08, 0x312: 0x08, 0x313: 0x08, 0x314: 0x08, 0x315: 0x08, 0x316: 0x08, 0x317: 0x08,
- 0x318: 0x08, 0x319: 0x08, 0x31a: 0x08, 0x31b: 0x08, 0x31c: 0x08, 0x31d: 0x08, 0x31e: 0x08, 0x31f: 0x08,
- 0x320: 0x08, 0x321: 0x08, 0x322: 0x08, 0x323: 0x08, 0x324: 0x0e, 0x325: 0x0e, 0x326: 0x0e, 0x327: 0x0e,
- 0x328: 0x0e, 0x329: 0x0e, 0x32a: 0x0e, 0x32b: 0x0e,
- 0x338: 0x3f, 0x339: 0x40, 0x33c: 0x41, 0x33d: 0x42, 0x33e: 0x43, 0x33f: 0x44,
- // Block 0xd, offset 0x340
- 0x37f: 0x45,
- // Block 0xe, offset 0x380
- 0x380: 0x0e, 0x381: 0x0e, 0x382: 0x0e, 0x383: 0x0e, 0x384: 0x0e, 0x385: 0x0e, 0x386: 0x0e, 0x387: 0x0e,
- 0x388: 0x0e, 0x389: 0x0e, 0x38a: 0x0e, 0x38b: 0x0e, 0x38c: 0x0e, 0x38d: 0x0e, 0x38e: 0x0e, 0x38f: 0x0e,
- 0x390: 0x0e, 0x391: 0x0e, 0x392: 0x0e, 0x393: 0x0e, 0x394: 0x0e, 0x395: 0x0e, 0x396: 0x0e, 0x397: 0x0e,
- 0x398: 0x0e, 0x399: 0x0e, 0x39a: 0x0e, 0x39b: 0x0e, 0x39c: 0x0e, 0x39d: 0x0e, 0x39e: 0x0e, 0x39f: 0x46,
- 0x3a0: 0x0e, 0x3a1: 0x0e, 0x3a2: 0x0e, 0x3a3: 0x0e, 0x3a4: 0x0e, 0x3a5: 0x0e, 0x3a6: 0x0e, 0x3a7: 0x0e,
- 0x3a8: 0x0e, 0x3a9: 0x0e, 0x3aa: 0x0e, 0x3ab: 0x47,
- // Block 0xf, offset 0x3c0
- 0x3c0: 0x48,
- // Block 0x10, offset 0x400
- 0x400: 0x49, 0x403: 0x4a, 0x404: 0x4b, 0x405: 0x4c, 0x406: 0x4d,
- 0x408: 0x4e, 0x409: 0x4f, 0x40c: 0x50, 0x40d: 0x51, 0x40e: 0x52, 0x40f: 0x53,
- 0x410: 0x3a, 0x411: 0x54, 0x412: 0x0e, 0x413: 0x55, 0x414: 0x56, 0x415: 0x57, 0x416: 0x58, 0x417: 0x59,
- 0x418: 0x0e, 0x419: 0x5a, 0x41a: 0x0e, 0x41b: 0x5b,
- 0x424: 0x5c, 0x425: 0x5d, 0x426: 0x5e, 0x427: 0x5f,
- // Block 0x11, offset 0x440
- 0x456: 0x0b, 0x457: 0x06,
- 0x458: 0x0c, 0x45b: 0x0d, 0x45f: 0x0e,
- 0x460: 0x06, 0x461: 0x06, 0x462: 0x06, 0x463: 0x06, 0x464: 0x06, 0x465: 0x06, 0x466: 0x06, 0x467: 0x06,
- 0x468: 0x06, 0x469: 0x06, 0x46a: 0x06, 0x46b: 0x06, 0x46c: 0x06, 0x46d: 0x06, 0x46e: 0x06, 0x46f: 0x06,
- 0x470: 0x06, 0x471: 0x06, 0x472: 0x06, 0x473: 0x06, 0x474: 0x06, 0x475: 0x06, 0x476: 0x06, 0x477: 0x06,
- 0x478: 0x06, 0x479: 0x06, 0x47a: 0x06, 0x47b: 0x06, 0x47c: 0x06, 0x47d: 0x06, 0x47e: 0x06, 0x47f: 0x06,
- // Block 0x12, offset 0x480
- 0x484: 0x08, 0x485: 0x08, 0x486: 0x08, 0x487: 0x09,
- // Block 0x13, offset 0x4c0
- 0x4c0: 0x08, 0x4c1: 0x08, 0x4c2: 0x08, 0x4c3: 0x08, 0x4c4: 0x08, 0x4c5: 0x08, 0x4c6: 0x08, 0x4c7: 0x08,
- 0x4c8: 0x08, 0x4c9: 0x08, 0x4ca: 0x08, 0x4cb: 0x08, 0x4cc: 0x08, 0x4cd: 0x08, 0x4ce: 0x08, 0x4cf: 0x08,
- 0x4d0: 0x08, 0x4d1: 0x08, 0x4d2: 0x08, 0x4d3: 0x08, 0x4d4: 0x08, 0x4d5: 0x08, 0x4d6: 0x08, 0x4d7: 0x08,
- 0x4d8: 0x08, 0x4d9: 0x08, 0x4da: 0x08, 0x4db: 0x08, 0x4dc: 0x08, 0x4dd: 0x08, 0x4de: 0x08, 0x4df: 0x08,
- 0x4e0: 0x08, 0x4e1: 0x08, 0x4e2: 0x08, 0x4e3: 0x08, 0x4e4: 0x08, 0x4e5: 0x08, 0x4e6: 0x08, 0x4e7: 0x08,
- 0x4e8: 0x08, 0x4e9: 0x08, 0x4ea: 0x08, 0x4eb: 0x08, 0x4ec: 0x08, 0x4ed: 0x08, 0x4ee: 0x08, 0x4ef: 0x08,
- 0x4f0: 0x08, 0x4f1: 0x08, 0x4f2: 0x08, 0x4f3: 0x08, 0x4f4: 0x08, 0x4f5: 0x08, 0x4f6: 0x08, 0x4f7: 0x08,
- 0x4f8: 0x08, 0x4f9: 0x08, 0x4fa: 0x08, 0x4fb: 0x08, 0x4fc: 0x08, 0x4fd: 0x08, 0x4fe: 0x08, 0x4ff: 0x60,
- // Block 0x14, offset 0x500
- 0x520: 0x10,
- 0x530: 0x09, 0x531: 0x09, 0x532: 0x09, 0x533: 0x09, 0x534: 0x09, 0x535: 0x09, 0x536: 0x09, 0x537: 0x09,
- 0x538: 0x09, 0x539: 0x09, 0x53a: 0x09, 0x53b: 0x09, 0x53c: 0x09, 0x53d: 0x09, 0x53e: 0x09, 0x53f: 0x11,
- // Block 0x15, offset 0x540
- 0x540: 0x09, 0x541: 0x09, 0x542: 0x09, 0x543: 0x09, 0x544: 0x09, 0x545: 0x09, 0x546: 0x09, 0x547: 0x09,
- 0x548: 0x09, 0x549: 0x09, 0x54a: 0x09, 0x54b: 0x09, 0x54c: 0x09, 0x54d: 0x09, 0x54e: 0x09, 0x54f: 0x11,
-}
-
-// inverseData contains 4-byte entries of the following format:
-// <0 padding>
-// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the
-// UTF-8 encoding of the original rune. Mappings often have the following
-// pattern:
-// A -> A (U+FF21 -> U+0041)
-// B -> B (U+FF22 -> U+0042)
-// ...
-// By xor-ing the last byte the same entry can be shared by many mappings. This
-// reduces the total number of distinct entries by about two thirds.
-// The resulting entry for the aforementioned mappings is
-// { 0x01, 0xE0, 0x00, 0x00 }
-// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get
-// E0 ^ A1 = 41.
-// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get
-// E0 ^ A2 = 42.
-// Note that because of the xor-ing, the byte sequence stored in the entry is
-// not valid UTF-8.
-var inverseData = [150][4]byte{
- {0x00, 0x00, 0x00, 0x00},
- {0x03, 0xe3, 0x80, 0xa0},
- {0x03, 0xef, 0xbc, 0xa0},
- {0x03, 0xef, 0xbc, 0xe0},
- {0x03, 0xef, 0xbd, 0xe0},
- {0x03, 0xef, 0xbf, 0x02},
- {0x03, 0xef, 0xbf, 0x00},
- {0x03, 0xef, 0xbf, 0x0e},
- {0x03, 0xef, 0xbf, 0x0c},
- {0x03, 0xef, 0xbf, 0x0f},
- {0x03, 0xef, 0xbf, 0x39},
- {0x03, 0xef, 0xbf, 0x3b},
- {0x03, 0xef, 0xbf, 0x3f},
- {0x03, 0xef, 0xbf, 0x2a},
- {0x03, 0xef, 0xbf, 0x0d},
- {0x03, 0xef, 0xbf, 0x25},
- {0x03, 0xef, 0xbd, 0x1a},
- {0x03, 0xef, 0xbd, 0x26},
- {0x01, 0xa0, 0x00, 0x00},
- {0x03, 0xef, 0xbd, 0x25},
- {0x03, 0xef, 0xbd, 0x23},
- {0x03, 0xef, 0xbd, 0x2e},
- {0x03, 0xef, 0xbe, 0x07},
- {0x03, 0xef, 0xbe, 0x05},
- {0x03, 0xef, 0xbd, 0x06},
- {0x03, 0xef, 0xbd, 0x13},
- {0x03, 0xef, 0xbd, 0x0b},
- {0x03, 0xef, 0xbd, 0x16},
- {0x03, 0xef, 0xbd, 0x0c},
- {0x03, 0xef, 0xbd, 0x15},
- {0x03, 0xef, 0xbd, 0x0d},
- {0x03, 0xef, 0xbd, 0x1c},
- {0x03, 0xef, 0xbd, 0x02},
- {0x03, 0xef, 0xbd, 0x1f},
- {0x03, 0xef, 0xbd, 0x1d},
- {0x03, 0xef, 0xbd, 0x17},
- {0x03, 0xef, 0xbd, 0x08},
- {0x03, 0xef, 0xbd, 0x09},
- {0x03, 0xef, 0xbd, 0x0e},
- {0x03, 0xef, 0xbd, 0x04},
- {0x03, 0xef, 0xbd, 0x05},
- {0x03, 0xef, 0xbe, 0x3f},
- {0x03, 0xef, 0xbe, 0x00},
- {0x03, 0xef, 0xbd, 0x2c},
- {0x03, 0xef, 0xbe, 0x06},
- {0x03, 0xef, 0xbe, 0x0c},
- {0x03, 0xef, 0xbe, 0x0f},
- {0x03, 0xef, 0xbe, 0x0d},
- {0x03, 0xef, 0xbe, 0x0b},
- {0x03, 0xef, 0xbe, 0x19},
- {0x03, 0xef, 0xbe, 0x15},
- {0x03, 0xef, 0xbe, 0x11},
- {0x03, 0xef, 0xbe, 0x31},
- {0x03, 0xef, 0xbe, 0x33},
- {0x03, 0xef, 0xbd, 0x0f},
- {0x03, 0xef, 0xbe, 0x30},
- {0x03, 0xef, 0xbe, 0x3e},
- {0x03, 0xef, 0xbe, 0x32},
- {0x03, 0xef, 0xbe, 0x36},
- {0x03, 0xef, 0xbd, 0x14},
- {0x03, 0xef, 0xbe, 0x2e},
- {0x03, 0xef, 0xbd, 0x1e},
- {0x03, 0xef, 0xbe, 0x10},
- {0x03, 0xef, 0xbf, 0x13},
- {0x03, 0xef, 0xbf, 0x15},
- {0x03, 0xef, 0xbf, 0x17},
- {0x03, 0xef, 0xbf, 0x1f},
- {0x03, 0xef, 0xbf, 0x1d},
- {0x03, 0xef, 0xbf, 0x1b},
- {0x03, 0xef, 0xbf, 0x09},
- {0x03, 0xef, 0xbf, 0x0b},
- {0x03, 0xef, 0xbf, 0x37},
- {0x03, 0xef, 0xbe, 0x04},
- {0x01, 0xe0, 0x00, 0x00},
- {0x03, 0xe2, 0xa6, 0x1a},
- {0x03, 0xe2, 0xa6, 0x26},
- {0x03, 0xe3, 0x80, 0x23},
- {0x03, 0xe3, 0x80, 0x2e},
- {0x03, 0xe3, 0x80, 0x25},
- {0x03, 0xe3, 0x83, 0x1e},
- {0x03, 0xe3, 0x83, 0x14},
- {0x03, 0xe3, 0x82, 0x06},
- {0x03, 0xe3, 0x82, 0x0b},
- {0x03, 0xe3, 0x82, 0x0c},
- {0x03, 0xe3, 0x82, 0x0d},
- {0x03, 0xe3, 0x82, 0x02},
- {0x03, 0xe3, 0x83, 0x0f},
- {0x03, 0xe3, 0x83, 0x08},
- {0x03, 0xe3, 0x83, 0x09},
- {0x03, 0xe3, 0x83, 0x2c},
- {0x03, 0xe3, 0x83, 0x0c},
- {0x03, 0xe3, 0x82, 0x13},
- {0x03, 0xe3, 0x82, 0x16},
- {0x03, 0xe3, 0x82, 0x15},
- {0x03, 0xe3, 0x82, 0x1c},
- {0x03, 0xe3, 0x82, 0x1f},
- {0x03, 0xe3, 0x82, 0x1d},
- {0x03, 0xe3, 0x82, 0x1a},
- {0x03, 0xe3, 0x82, 0x17},
- {0x03, 0xe3, 0x82, 0x08},
- {0x03, 0xe3, 0x82, 0x09},
- {0x03, 0xe3, 0x82, 0x0e},
- {0x03, 0xe3, 0x82, 0x04},
- {0x03, 0xe3, 0x82, 0x05},
- {0x03, 0xe3, 0x82, 0x3f},
- {0x03, 0xe3, 0x83, 0x00},
- {0x03, 0xe3, 0x83, 0x06},
- {0x03, 0xe3, 0x83, 0x05},
- {0x03, 0xe3, 0x83, 0x0d},
- {0x03, 0xe3, 0x83, 0x0b},
- {0x03, 0xe3, 0x83, 0x07},
- {0x03, 0xe3, 0x83, 0x19},
- {0x03, 0xe3, 0x83, 0x15},
- {0x03, 0xe3, 0x83, 0x11},
- {0x03, 0xe3, 0x83, 0x31},
- {0x03, 0xe3, 0x83, 0x33},
- {0x03, 0xe3, 0x83, 0x30},
- {0x03, 0xe3, 0x83, 0x3e},
- {0x03, 0xe3, 0x83, 0x32},
- {0x03, 0xe3, 0x83, 0x36},
- {0x03, 0xe3, 0x83, 0x2e},
- {0x03, 0xe3, 0x82, 0x07},
- {0x03, 0xe3, 0x85, 0x04},
- {0x03, 0xe3, 0x84, 0x10},
- {0x03, 0xe3, 0x85, 0x30},
- {0x03, 0xe3, 0x85, 0x0d},
- {0x03, 0xe3, 0x85, 0x13},
- {0x03, 0xe3, 0x85, 0x15},
- {0x03, 0xe3, 0x85, 0x17},
- {0x03, 0xe3, 0x85, 0x1f},
- {0x03, 0xe3, 0x85, 0x1d},
- {0x03, 0xe3, 0x85, 0x1b},
- {0x03, 0xe3, 0x85, 0x09},
- {0x03, 0xe3, 0x85, 0x0f},
- {0x03, 0xe3, 0x85, 0x0b},
- {0x03, 0xe3, 0x85, 0x37},
- {0x03, 0xe3, 0x85, 0x3b},
- {0x03, 0xe3, 0x85, 0x39},
- {0x03, 0xe3, 0x85, 0x3f},
- {0x02, 0xc2, 0x02, 0x00},
- {0x02, 0xc2, 0x0e, 0x00},
- {0x02, 0xc2, 0x0c, 0x00},
- {0x02, 0xc2, 0x00, 0x00},
- {0x03, 0xe2, 0x82, 0x0f},
- {0x03, 0xe2, 0x94, 0x2a},
- {0x03, 0xe2, 0x86, 0x39},
- {0x03, 0xe2, 0x86, 0x3b},
- {0x03, 0xe2, 0x86, 0x3f},
- {0x03, 0xe2, 0x96, 0x0d},
- {0x03, 0xe2, 0x97, 0x25},
-}
-
-// Total table size 14680 bytes (14KiB)
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/transform.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/transform.go
deleted file mode 100644
index 0049f700a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/transform.go
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package width
-
-import (
- "unicode/utf8"
-
- "golang.org/x/text/transform"
-)
-
-type foldTransform struct {
- transform.NopResetter
-}
-
-func (foldTransform) Span(src []byte, atEOF bool) (n int, err error) {
- for n < len(src) {
- if src[n] < utf8.RuneSelf {
- // ASCII fast path.
- for n++; n < len(src) && src[n] < utf8.RuneSelf; n++ {
- }
- continue
- }
- v, size := trie.lookup(src[n:])
- if size == 0 { // incomplete UTF-8 encoding
- if !atEOF {
- err = transform.ErrShortSrc
- } else {
- n = len(src)
- }
- break
- }
- if elem(v)&tagNeedsFold != 0 {
- err = transform.ErrEndOfSpan
- break
- }
- n += size
- }
- return n, err
-}
-
-func (foldTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- for nSrc < len(src) {
- if src[nSrc] < utf8.RuneSelf {
- // ASCII fast path.
- start, end := nSrc, len(src)
- if d := len(dst) - nDst; d < end-start {
- end = nSrc + d
- }
- for nSrc++; nSrc < end && src[nSrc] < utf8.RuneSelf; nSrc++ {
- }
- n := copy(dst[nDst:], src[start:nSrc])
- if nDst += n; nDst == len(dst) {
- nSrc = start + n
- if nSrc == len(src) {
- return nDst, nSrc, nil
- }
- if src[nSrc] < utf8.RuneSelf {
- return nDst, nSrc, transform.ErrShortDst
- }
- }
- continue
- }
- v, size := trie.lookup(src[nSrc:])
- if size == 0 { // incomplete UTF-8 encoding
- if !atEOF {
- return nDst, nSrc, transform.ErrShortSrc
- }
- size = 1 // gobble 1 byte
- }
- if elem(v)&tagNeedsFold == 0 {
- if size != copy(dst[nDst:], src[nSrc:nSrc+size]) {
- return nDst, nSrc, transform.ErrShortDst
- }
- nDst += size
- } else {
- data := inverseData[byte(v)]
- if len(dst)-nDst < int(data[0]) {
- return nDst, nSrc, transform.ErrShortDst
- }
- i := 1
- for end := int(data[0]); i < end; i++ {
- dst[nDst] = data[i]
- nDst++
- }
- dst[nDst] = data[i] ^ src[nSrc+size-1]
- nDst++
- }
- nSrc += size
- }
- return nDst, nSrc, nil
-}
-
-type narrowTransform struct {
- transform.NopResetter
-}
-
-func (narrowTransform) Span(src []byte, atEOF bool) (n int, err error) {
- for n < len(src) {
- if src[n] < utf8.RuneSelf {
- // ASCII fast path.
- for n++; n < len(src) && src[n] < utf8.RuneSelf; n++ {
- }
- continue
- }
- v, size := trie.lookup(src[n:])
- if size == 0 { // incomplete UTF-8 encoding
- if !atEOF {
- err = transform.ErrShortSrc
- } else {
- n = len(src)
- }
- break
- }
- if k := elem(v).kind(); byte(v) == 0 || k != EastAsianFullwidth && k != EastAsianWide && k != EastAsianAmbiguous {
- } else {
- err = transform.ErrEndOfSpan
- break
- }
- n += size
- }
- return n, err
-}
-
-func (narrowTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- for nSrc < len(src) {
- if src[nSrc] < utf8.RuneSelf {
- // ASCII fast path.
- start, end := nSrc, len(src)
- if d := len(dst) - nDst; d < end-start {
- end = nSrc + d
- }
- for nSrc++; nSrc < end && src[nSrc] < utf8.RuneSelf; nSrc++ {
- }
- n := copy(dst[nDst:], src[start:nSrc])
- if nDst += n; nDst == len(dst) {
- nSrc = start + n
- if nSrc == len(src) {
- return nDst, nSrc, nil
- }
- if src[nSrc] < utf8.RuneSelf {
- return nDst, nSrc, transform.ErrShortDst
- }
- }
- continue
- }
- v, size := trie.lookup(src[nSrc:])
- if size == 0 { // incomplete UTF-8 encoding
- if !atEOF {
- return nDst, nSrc, transform.ErrShortSrc
- }
- size = 1 // gobble 1 byte
- }
- if k := elem(v).kind(); byte(v) == 0 || k != EastAsianFullwidth && k != EastAsianWide && k != EastAsianAmbiguous {
- if size != copy(dst[nDst:], src[nSrc:nSrc+size]) {
- return nDst, nSrc, transform.ErrShortDst
- }
- nDst += size
- } else {
- data := inverseData[byte(v)]
- if len(dst)-nDst < int(data[0]) {
- return nDst, nSrc, transform.ErrShortDst
- }
- i := 1
- for end := int(data[0]); i < end; i++ {
- dst[nDst] = data[i]
- nDst++
- }
- dst[nDst] = data[i] ^ src[nSrc+size-1]
- nDst++
- }
- nSrc += size
- }
- return nDst, nSrc, nil
-}
-
-type wideTransform struct {
- transform.NopResetter
-}
-
-func (wideTransform) Span(src []byte, atEOF bool) (n int, err error) {
- for n < len(src) {
- // TODO: Consider ASCII fast path. Special-casing ASCII handling can
- // reduce the ns/op of BenchmarkWideASCII by about 30%. This is probably
- // not enough to warrant the extra code and complexity.
- v, size := trie.lookup(src[n:])
- if size == 0 { // incomplete UTF-8 encoding
- if !atEOF {
- err = transform.ErrShortSrc
- } else {
- n = len(src)
- }
- break
- }
- if k := elem(v).kind(); byte(v) == 0 || k != EastAsianHalfwidth && k != EastAsianNarrow {
- } else {
- err = transform.ErrEndOfSpan
- break
- }
- n += size
- }
- return n, err
-}
-
-func (wideTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- for nSrc < len(src) {
- // TODO: Consider ASCII fast path. Special-casing ASCII handling can
- // reduce the ns/op of BenchmarkWideASCII by about 30%. This is probably
- // not enough to warrant the extra code and complexity.
- v, size := trie.lookup(src[nSrc:])
- if size == 0 { // incomplete UTF-8 encoding
- if !atEOF {
- return nDst, nSrc, transform.ErrShortSrc
- }
- size = 1 // gobble 1 byte
- }
- if k := elem(v).kind(); byte(v) == 0 || k != EastAsianHalfwidth && k != EastAsianNarrow {
- if size != copy(dst[nDst:], src[nSrc:nSrc+size]) {
- return nDst, nSrc, transform.ErrShortDst
- }
- nDst += size
- } else {
- data := inverseData[byte(v)]
- if len(dst)-nDst < int(data[0]) {
- return nDst, nSrc, transform.ErrShortDst
- }
- i := 1
- for end := int(data[0]); i < end; i++ {
- dst[nDst] = data[i]
- nDst++
- }
- dst[nDst] = data[i] ^ src[nSrc+size-1]
- nDst++
- }
- nSrc += size
- }
- return nDst, nSrc, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/trieval.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/trieval.go
deleted file mode 100644
index ca8e45fd1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/trieval.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-
-package width
-
-// elem is an entry of the width trie. The high byte is used to encode the type
-// of the rune. The low byte is used to store the index to a mapping entry in
-// the inverseData array.
-type elem uint16
-
-const (
- tagNeutral elem = iota << typeShift
- tagAmbiguous
- tagWide
- tagNarrow
- tagFullwidth
- tagHalfwidth
-)
-
-const (
- numTypeBits = 3
- typeShift = 16 - numTypeBits
-
- // tagNeedsFold is true for all fullwidth and halfwidth runes except for
- // the Won sign U+20A9.
- tagNeedsFold = 0x1000
-
- // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide
- // variant.
- wonSign rune = 0x20A9
-)
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/width.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/width.go
deleted file mode 100644
index f1639ca68..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/text/width/width.go
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate stringer -type=Kind
-//go:generate go run gen.go gen_common.go gen_trieval.go
-
-// Package width provides functionality for handling different widths in text.
-//
-// Wide characters behave like ideographs; they tend to allow line breaks after
-// each character and remain upright in vertical text layout. Narrow characters
-// are kept together in words or runs that are rotated sideways in vertical text
-// layout.
-//
-// For more information, see http://unicode.org/reports/tr11/.
-package width // import "golang.org/x/text/width"
-
-import (
- "unicode/utf8"
-
- "golang.org/x/text/transform"
-)
-
-// TODO
-// 1) Reduce table size by compressing blocks.
-// 2) API proposition for computing display length
-// (approximation, fixed pitch only).
-// 3) Implement display length.
-
-// Kind indicates the type of width property as defined in http://unicode.org/reports/tr11/.
-type Kind int
-
-const (
- // Neutral characters do not occur in legacy East Asian character sets.
- Neutral Kind = iota
-
- // EastAsianAmbiguous characters that can be sometimes wide and sometimes
- // narrow and require additional information not contained in the character
- // code to further resolve their width.
- EastAsianAmbiguous
-
- // EastAsianWide characters are wide in its usual form. They occur only in
- // the context of East Asian typography. These runes may have explicit
- // halfwidth counterparts.
- EastAsianWide
-
- // EastAsianNarrow characters are narrow in its usual form. They often have
- // fullwidth counterparts.
- EastAsianNarrow
-
- // Note: there exist Narrow runes that do not have fullwidth or wide
- // counterparts, despite what the definition says (e.g. U+27E6).
-
- // EastAsianFullwidth characters have a compatibility decompositions of type
- // wide that map to a narrow counterpart.
- EastAsianFullwidth
-
- // EastAsianHalfwidth characters have a compatibility decomposition of type
- // narrow that map to a wide or ambiguous counterpart, plus U+20A9 ₩ WON
- // SIGN.
- EastAsianHalfwidth
-
- // Note: there exist runes that have a halfwidth counterparts but that are
- // classified as Ambiguous, rather than wide (e.g. U+2190).
-)
-
-// TODO: the generated tries need to return size 1 for invalid runes for the
-// width to be computed correctly (each byte should render width 1)
-
-var trie = newWidthTrie(0)
-
-// Lookup reports the Properties of the first rune in b and the number of bytes
-// of its UTF-8 encoding.
-func Lookup(b []byte) (p Properties, size int) {
- v, sz := trie.lookup(b)
- return Properties{elem(v), b[sz-1]}, sz
-}
-
-// LookupString reports the Properties of the first rune in s and the number of
-// bytes of its UTF-8 encoding.
-func LookupString(s string) (p Properties, size int) {
- v, sz := trie.lookupString(s)
- return Properties{elem(v), s[sz-1]}, sz
-}
-
-// LookupRune reports the Properties of rune r.
-func LookupRune(r rune) Properties {
- var buf [4]byte
- n := utf8.EncodeRune(buf[:], r)
- v, _ := trie.lookup(buf[:n])
- last := byte(r)
- if r >= utf8.RuneSelf {
- last = 0x80 + byte(r&0x3f)
- }
- return Properties{elem(v), last}
-}
-
-// Properties provides access to width properties of a rune.
-type Properties struct {
- elem elem
- last byte
-}
-
-func (e elem) kind() Kind {
- return Kind(e >> typeShift)
-}
-
-// Kind returns the Kind of a rune as defined in Unicode TR #11.
-// See http://unicode.org/reports/tr11/ for more details.
-func (p Properties) Kind() Kind {
- return p.elem.kind()
-}
-
-// Folded returns the folded variant of a rune or 0 if the rune is canonical.
-func (p Properties) Folded() rune {
- if p.elem&tagNeedsFold != 0 {
- buf := inverseData[byte(p.elem)]
- buf[buf[0]] ^= p.last
- r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]])
- return r
- }
- return 0
-}
-
-// Narrow returns the narrow variant of a rune or 0 if the rune is already
-// narrow or doesn't have a narrow variant.
-func (p Properties) Narrow() rune {
- if k := p.elem.kind(); byte(p.elem) != 0 && (k == EastAsianFullwidth || k == EastAsianWide || k == EastAsianAmbiguous) {
- buf := inverseData[byte(p.elem)]
- buf[buf[0]] ^= p.last
- r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]])
- return r
- }
- return 0
-}
-
-// Wide returns the wide variant of a rune or 0 if the rune is already
-// wide or doesn't have a wide variant.
-func (p Properties) Wide() rune {
- if k := p.elem.kind(); byte(p.elem) != 0 && (k == EastAsianHalfwidth || k == EastAsianNarrow) {
- buf := inverseData[byte(p.elem)]
- buf[buf[0]] ^= p.last
- r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]])
- return r
- }
- return 0
-}
-
-// TODO for Properties:
-// - Add Fullwidth/Halfwidth or Inverted methods for computing variants
-// mapping.
-// - Add width information (including information on non-spacing runes).
-
-// Transformer implements the transform.Transformer interface.
-type Transformer struct {
- t transform.SpanningTransformer
-}
-
-// Reset implements the transform.Transformer interface.
-func (t Transformer) Reset() { t.t.Reset() }
-
-// Transform implements the transform.Transformer interface.
-func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- return t.t.Transform(dst, src, atEOF)
-}
-
-// Span implements the transform.SpanningTransformer interface.
-func (t Transformer) Span(src []byte, atEOF bool) (n int, err error) {
- return t.t.Span(src, atEOF)
-}
-
-// Bytes returns a new byte slice with the result of applying t to b.
-func (t Transformer) Bytes(b []byte) []byte {
- b, _, _ = transform.Bytes(t, b)
- return b
-}
-
-// String returns a string with the result of applying t to s.
-func (t Transformer) String(s string) string {
- s, _, _ = transform.String(t, s)
- return s
-}
-
-var (
- // Fold is a transform that maps all runes to their canonical width.
- //
- // Note that the NFKC and NFKD transforms in golang.org/x/text/unicode/norm
- // provide a more generic folding mechanism.
- Fold Transformer = Transformer{foldTransform{}}
-
- // Widen is a transform that maps runes to their wide variant, if
- // available.
- Widen Transformer = Transformer{wideTransform{}}
-
- // Narrow is a transform that maps runes to their narrow variant, if
- // available.
- Narrow Transformer = Transformer{narrowTransform{}}
-)
-
-// TODO: Consider the following options:
-// - Treat Ambiguous runes that have a halfwidth counterpart as wide, or some
-// generalized variant of this.
-// - Consider a wide Won character to be the default width (or some generalized
-// variant of this).
-// - Filter the set of characters that gets converted (the preferred approach is
-// to allow applying filters to transforms).
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/doc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/doc.go
deleted file mode 100644
index f5ca3a0a1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/doc.go
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-
-Command goimports updates your Go import lines,
-adding missing ones and removing unreferenced ones.
-
- $ go get golang.org/x/tools/cmd/goimports
-
-In addition to fixing imports, goimports also formats
-your code in the same style as gofmt so it can be used
-as a replacement for your editor's gofmt-on-save hook.
-
-For emacs, make sure you have the latest go-mode.el:
- https://github.com/dominikh/go-mode.el
-Then in your .emacs file:
- (setq gofmt-command "goimports")
- (add-to-list 'load-path "/home/you/somewhere/emacs/")
- (require 'go-mode-autoloads)
- (add-hook 'before-save-hook 'gofmt-before-save)
-
-For vim, set "gofmt_command" to "goimports":
- https://golang.org/change/39c724dd7f252
- https://golang.org/wiki/IDEsAndTextEditorPlugins
- etc
-
-For GoSublime, follow the steps described here:
- http://michaelwhatcott.com/gosublime-goimports/
-
-For other editors, you probably know what to do.
-
-To exclude directories in your $GOPATH from being scanned for Go
-files, goimports respects a configuration file at
-$GOPATH/src/.goimportsignore which may contain blank lines, comment
-lines (beginning with '#'), or lines naming a directory relative to
-the configuration file to ignore when scanning. No globbing or regex
-patterns are allowed. Use the "-v" verbose flag to verify it's
-working and see what goimports is doing.
-
-File bugs or feature requests at:
-
- https://golang.org/issues/new?title=x/tools/cmd/goimports:+
-
-Happy hacking!
-
-*/
-package main // import "golang.org/x/tools/cmd/goimports"
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports.go
deleted file mode 100644
index 16e30834f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports.go
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bufio"
- "bytes"
- "errors"
- "flag"
- "fmt"
- "go/scanner"
- "io"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "runtime/pprof"
- "strings"
-
- "golang.org/x/tools/imports"
-)
-
-var (
- // main operation modes
- list = flag.Bool("l", false, "list files whose formatting differs from goimport's")
- write = flag.Bool("w", false, "write result to (source) file instead of stdout")
- doDiff = flag.Bool("d", false, "display diffs instead of rewriting files")
- srcdir = flag.String("srcdir", "", "choose imports as if source code is from `dir`. When operating on a single file, dir may instead be the complete file name.")
- verbose bool // verbose logging
-
- cpuProfile = flag.String("cpuprofile", "", "CPU profile output")
- memProfile = flag.String("memprofile", "", "memory profile output")
- memProfileRate = flag.Int("memrate", 0, "if > 0, sets runtime.MemProfileRate")
-
- options = &imports.Options{
- TabWidth: 8,
- TabIndent: true,
- Comments: true,
- Fragment: true,
- }
- exitCode = 0
-)
-
-func init() {
- flag.BoolVar(&options.AllErrors, "e", false, "report all errors (not just the first 10 on different lines)")
- flag.StringVar(&imports.LocalPrefix, "local", "", "put imports beginning with this string after 3rd-party packages")
-}
-
-func report(err error) {
- scanner.PrintError(os.Stderr, err)
- exitCode = 2
-}
-
-func usage() {
- fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n")
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-func isGoFile(f os.FileInfo) bool {
- // ignore non-Go files
- name := f.Name()
- return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-// argumentType is which mode goimports was invoked as.
-type argumentType int
-
-const (
- // fromStdin means the user is piping their source into goimports.
- fromStdin argumentType = iota
-
- // singleArg is the common case from editors, when goimports is run on
- // a single file.
- singleArg
-
- // multipleArg is when the user ran "goimports file1.go file2.go"
- // or ran goimports on a directory tree.
- multipleArg
-)
-
-func processFile(filename string, in io.Reader, out io.Writer, argType argumentType) error {
- opt := options
- if argType == fromStdin {
- nopt := *options
- nopt.Fragment = true
- opt = &nopt
- }
-
- if in == nil {
- f, err := os.Open(filename)
- if err != nil {
- return err
- }
- defer f.Close()
- in = f
- }
-
- src, err := ioutil.ReadAll(in)
- if err != nil {
- return err
- }
-
- target := filename
- if *srcdir != "" {
- // Determine whether the provided -srcdirc is a directory or file
- // and then use it to override the target.
- //
- // See https://github.com/dominikh/go-mode.el/issues/146
- if isFile(*srcdir) {
- if argType == multipleArg {
- return errors.New("-srcdir value can't be a file when passing multiple arguments or when walking directories")
- }
- target = *srcdir
- } else if argType == singleArg && strings.HasSuffix(*srcdir, ".go") && !isDir(*srcdir) {
- // For a file which doesn't exist on disk yet, but might shortly.
- // e.g. user in editor opens $DIR/newfile.go and newfile.go doesn't yet exist on disk.
- // The goimports on-save hook writes the buffer to a temp file
- // first and runs goimports before the actual save to newfile.go.
- // The editor's buffer is named "newfile.go" so that is passed to goimports as:
- // goimports -srcdir=/gopath/src/pkg/newfile.go /tmp/gofmtXXXXXXXX.go
- // and then the editor reloads the result from the tmp file and writes
- // it to newfile.go.
- target = *srcdir
- } else {
- // Pretend that file is from *srcdir in order to decide
- // visible imports correctly.
- target = filepath.Join(*srcdir, filepath.Base(filename))
- }
- }
-
- res, err := imports.Process(target, src, opt)
- if err != nil {
- return err
- }
-
- if !bytes.Equal(src, res) {
- // formatting has changed
- if *list {
- fmt.Fprintln(out, filename)
- }
- if *write {
- if argType == fromStdin {
- // filename is ""
- return errors.New("can't use -w on stdin")
- }
- err = ioutil.WriteFile(filename, res, 0)
- if err != nil {
- return err
- }
- }
- if *doDiff {
- if argType == fromStdin {
- filename = "stdin.go" // because .orig looks silly
- }
- data, err := diff(src, res, filename)
- if err != nil {
- return fmt.Errorf("computing diff: %s", err)
- }
- fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
- out.Write(data)
- }
- }
-
- if !*list && !*write && !*doDiff {
- _, err = out.Write(res)
- }
-
- return err
-}
-
-func visitFile(path string, f os.FileInfo, err error) error {
- if err == nil && isGoFile(f) {
- err = processFile(path, nil, os.Stdout, multipleArg)
- }
- if err != nil {
- report(err)
- }
- return nil
-}
-
-func walkDir(path string) {
- filepath.Walk(path, visitFile)
-}
-
-func main() {
- runtime.GOMAXPROCS(runtime.NumCPU())
-
- // call gofmtMain in a separate function
- // so that it can use defer and have them
- // run before the exit.
- gofmtMain()
- os.Exit(exitCode)
-}
-
-// parseFlags parses command line flags and returns the paths to process.
-// It's a var so that custom implementations can replace it in other files.
-var parseFlags = func() []string {
- flag.BoolVar(&verbose, "v", false, "verbose logging")
-
- flag.Parse()
- return flag.Args()
-}
-
-func bufferedFileWriter(dest string) (w io.Writer, close func()) {
- f, err := os.Create(dest)
- if err != nil {
- log.Fatal(err)
- }
- bw := bufio.NewWriter(f)
- return bw, func() {
- if err := bw.Flush(); err != nil {
- log.Fatalf("error flushing %v: %v", dest, err)
- }
- if err := f.Close(); err != nil {
- log.Fatal(err)
- }
- }
-}
-
-func gofmtMain() {
- flag.Usage = usage
- paths := parseFlags()
-
- if *cpuProfile != "" {
- bw, flush := bufferedFileWriter(*cpuProfile)
- pprof.StartCPUProfile(bw)
- defer flush()
- defer pprof.StopCPUProfile()
- }
- // doTrace is a conditionally compiled wrapper around runtime/trace. It is
- // used to allow goimports to compile under gccgo, which does not support
- // runtime/trace. See https://golang.org/issue/15544.
- defer doTrace()()
- if *memProfileRate > 0 {
- runtime.MemProfileRate = *memProfileRate
- bw, flush := bufferedFileWriter(*memProfile)
- defer func() {
- runtime.GC() // materialize all statistics
- if err := pprof.WriteHeapProfile(bw); err != nil {
- log.Fatal(err)
- }
- flush()
- }()
- }
-
- if verbose {
- log.SetFlags(log.LstdFlags | log.Lmicroseconds)
- imports.Debug = true
- }
- if options.TabWidth < 0 {
- fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth)
- exitCode = 2
- return
- }
-
- if len(paths) == 0 {
- if err := processFile("", os.Stdin, os.Stdout, fromStdin); err != nil {
- report(err)
- }
- return
- }
-
- argType := singleArg
- if len(paths) > 1 {
- argType = multipleArg
- }
-
- for _, path := range paths {
- switch dir, err := os.Stat(path); {
- case err != nil:
- report(err)
- case dir.IsDir():
- walkDir(path)
- default:
- if err := processFile(path, nil, os.Stdout, argType); err != nil {
- report(err)
- }
- }
- }
-}
-
-func writeTempFile(dir, prefix string, data []byte) (string, error) {
- file, err := ioutil.TempFile(dir, prefix)
- if err != nil {
- return "", err
- }
- _, err = file.Write(data)
- if err1 := file.Close(); err == nil {
- err = err1
- }
- if err != nil {
- os.Remove(file.Name())
- return "", err
- }
- return file.Name(), nil
-}
-
-func diff(b1, b2 []byte, filename string) (data []byte, err error) {
- f1, err := writeTempFile("", "gofmt", b1)
- if err != nil {
- return
- }
- defer os.Remove(f1)
-
- f2, err := writeTempFile("", "gofmt", b2)
- if err != nil {
- return
- }
- defer os.Remove(f2)
-
- cmd := "diff"
- if runtime.GOOS == "plan9" {
- cmd = "/bin/ape/diff"
- }
-
- data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput()
- if len(data) > 0 {
- // diff exits with a non-zero status when the files don't match.
- // Ignore that failure as long as we get output.
- return replaceTempFilename(data, filename)
- }
- return
-}
-
-// replaceTempFilename replaces temporary filenames in diff with actual one.
-//
-// --- /tmp/gofmt316145376 2017-02-03 19:13:00.280468375 -0500
-// +++ /tmp/gofmt617882815 2017-02-03 19:13:00.280468375 -0500
-// ...
-// ->
-// --- path/to/file.go.orig 2017-02-03 19:13:00.280468375 -0500
-// +++ path/to/file.go 2017-02-03 19:13:00.280468375 -0500
-// ...
-func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
- bs := bytes.SplitN(diff, []byte{'\n'}, 3)
- if len(bs) < 3 {
- return nil, fmt.Errorf("got unexpected diff for %s", filename)
- }
- // Preserve timestamps.
- var t0, t1 []byte
- if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
- t0 = bs[0][i:]
- }
- if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
- t1 = bs[1][i:]
- }
- // Always print filepath with slash separator.
- f := filepath.ToSlash(filename)
- bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
- bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
- return bytes.Join(bs, []byte{'\n'}), nil
-}
-
-// isFile reports whether name is a file.
-func isFile(name string) bool {
- fi, err := os.Stat(name)
- return err == nil && fi.Mode().IsRegular()
-}
-
-// isDir reports whether name is a directory.
-func isDir(name string) bool {
- fi, err := os.Stat(name)
- return err == nil && fi.IsDir()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports_gc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports_gc.go
deleted file mode 100644
index 21d867eaa..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports_gc.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gc
-
-package main
-
-import (
- "flag"
- "runtime/trace"
-)
-
-var traceProfile = flag.String("trace", "", "trace profile output")
-
-func doTrace() func() {
- if *traceProfile != "" {
- bw, flush := bufferedFileWriter(*traceProfile)
- trace.Start(bw)
- return func() {
- flush()
- trace.Stop()
- }
- }
- return func() {}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports_not_gc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
deleted file mode 100644
index f5531ceb3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !gc
-
-package main
-
-func doTrace() func() {
- return func() {}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/gotype.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/gotype.go
deleted file mode 100644
index ed88e6354..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/gotype.go
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// gotype.go is a copy of the original source maintained
-// in $GOROOT/src/go/types/gotype.go, but with the call
-// to types.SizesFor factored out so we can provide a local
-// implementation when compiling against Go 1.8 and earlier.
-//
-// This code is here for the sole purpose of satisfying historic
-// references to this location, and for making gotype accessible
-// via 'go get'.
-//
-// Do NOT make changes to this version as they will not be maintained
-// (and possibly overwritten). Any changes should be made to the original
-// and then ported to here.
-
-/*
-The gotype command, like the front-end of a Go compiler, parses and
-type-checks a single Go package. Errors are reported if the analysis
-fails; otherwise gotype is quiet (unless -v is set).
-
-Without a list of paths, gotype reads from standard input, which
-must provide a single Go source file defining a complete package.
-
-With a single directory argument, gotype checks the Go files in
-that directory, comprising a single package. Use -t to include the
-(in-package) _test.go files. Use -x to type check only external
-test files.
-
-Otherwise, each path must be the filename of a Go file belonging
-to the same package.
-
-Imports are processed by importing directly from the source of
-imported packages (default), or by importing from compiled and
-installed packages (by setting -c to the respective compiler).
-
-The -c flag must be set to a compiler ("gc", "gccgo") when type-
-checking packages containing imports with relative import paths
-(import "./mypkg") because the source importer cannot know which
-files to include for such packages.
-
-Usage:
- gotype [flags] [path...]
-
-The flags are:
- -t
- include local test files in a directory (ignored if -x is provided)
- -x
- consider only external test files in a directory
- -e
- report all errors (not just the first 10)
- -v
- verbose mode
- -c
- compiler used for installed packages (gc, gccgo, or source); default: source
-
-Flags controlling additional output:
- -ast
- print AST (forces -seq)
- -trace
- print parse trace (forces -seq)
- -comments
- parse comments (ignored unless -ast or -trace is provided)
-
-Examples:
-
-To check the files a.go, b.go, and c.go:
-
- gotype a.go b.go c.go
-
-To check an entire package including (in-package) tests in the directory dir and print the processed files:
-
- gotype -t -v dir
-
-To check the external test package (if any) in the current directory, based on installed packages compiled with
-cmd/compile:
-
- gotype -c=gc -x .
-
-To verify the output of a pipe:
-
- echo "package foo" | gotype
-
-*/
-package main
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/importer"
- "go/parser"
- "go/scanner"
- "go/token"
- "go/types"
- "io/ioutil"
- "os"
- "path/filepath"
- "sync"
- "time"
-)
-
-var (
- // main operation modes
- testFiles = flag.Bool("t", false, "include in-package test files in a directory")
- xtestFiles = flag.Bool("x", false, "consider only external test files in a directory")
- allErrors = flag.Bool("e", false, "report all errors, not just the first 10")
- verbose = flag.Bool("v", false, "verbose mode")
- compiler = flag.String("c", defaultCompiler, "compiler used for installed packages (gc, gccgo, or source)")
-
- // additional output control
- printAST = flag.Bool("ast", false, "print AST (forces -seq)")
- printTrace = flag.Bool("trace", false, "print parse trace (forces -seq)")
- parseComments = flag.Bool("comments", false, "parse comments (ignored unless -ast or -trace is provided)")
-)
-
-var (
- fset = token.NewFileSet()
- errorCount = 0
- sequential = false
- parserMode parser.Mode
-)
-
-func initParserMode() {
- if *allErrors {
- parserMode |= parser.AllErrors
- }
- if *printAST {
- sequential = true
- }
- if *printTrace {
- parserMode |= parser.Trace
- sequential = true
- }
- if *parseComments && (*printAST || *printTrace) {
- parserMode |= parser.ParseComments
- }
-}
-
-const usageString = `usage: gotype [flags] [path ...]
-
-The gotype command, like the front-end of a Go compiler, parses and
-type-checks a single Go package. Errors are reported if the analysis
-fails; otherwise gotype is quiet (unless -v is set).
-
-Without a list of paths, gotype reads from standard input, which
-must provide a single Go source file defining a complete package.
-
-With a single directory argument, gotype checks the Go files in
-that directory, comprising a single package. Use -t to include the
-(in-package) _test.go files. Use -x to type check only external
-test files.
-
-Otherwise, each path must be the filename of a Go file belonging
-to the same package.
-
-Imports are processed by importing directly from the source of
-imported packages (default), or by importing from compiled and
-installed packages (by setting -c to the respective compiler).
-
-The -c flag must be set to a compiler ("gc", "gccgo") when type-
-checking packages containing imports with relative import paths
-(import "./mypkg") because the source importer cannot know which
-files to include for such packages.
-`
-
-func usage() {
- fmt.Fprintln(os.Stderr, usageString)
- flag.PrintDefaults()
- os.Exit(2)
-}
-
-func report(err error) {
- scanner.PrintError(os.Stderr, err)
- if list, ok := err.(scanner.ErrorList); ok {
- errorCount += len(list)
- return
- }
- errorCount++
-}
-
-// parse may be called concurrently
-func parse(filename string, src interface{}) (*ast.File, error) {
- if *verbose {
- fmt.Println(filename)
- }
- file, err := parser.ParseFile(fset, filename, src, parserMode) // ok to access fset concurrently
- if *printAST {
- ast.Print(fset, file)
- }
- return file, err
-}
-
-func parseStdin() (*ast.File, error) {
- src, err := ioutil.ReadAll(os.Stdin)
- if err != nil {
- return nil, err
- }
- return parse("", src)
-}
-
-func parseFiles(dir string, filenames []string) ([]*ast.File, error) {
- files := make([]*ast.File, len(filenames))
- errors := make([]error, len(filenames))
-
- var wg sync.WaitGroup
- for i, filename := range filenames {
- wg.Add(1)
- go func(i int, filepath string) {
- defer wg.Done()
- files[i], errors[i] = parse(filepath, nil)
- }(i, filepath.Join(dir, filename))
- if sequential {
- wg.Wait()
- }
- }
- wg.Wait()
-
- // if there are errors, return the first one for deterministic results
- for _, err := range errors {
- if err != nil {
- return nil, err
- }
- }
-
- return files, nil
-}
-
-func parseDir(dir string) ([]*ast.File, error) {
- ctxt := build.Default
- pkginfo, err := ctxt.ImportDir(dir, 0)
- if _, nogo := err.(*build.NoGoError); err != nil && !nogo {
- return nil, err
- }
-
- if *xtestFiles {
- return parseFiles(dir, pkginfo.XTestGoFiles)
- }
-
- filenames := append(pkginfo.GoFiles, pkginfo.CgoFiles...)
- if *testFiles {
- filenames = append(filenames, pkginfo.TestGoFiles...)
- }
- return parseFiles(dir, filenames)
-}
-
-func getPkgFiles(args []string) ([]*ast.File, error) {
- if len(args) == 0 {
- // stdin
- file, err := parseStdin()
- if err != nil {
- return nil, err
- }
- return []*ast.File{file}, nil
- }
-
- if len(args) == 1 {
- // possibly a directory
- path := args[0]
- info, err := os.Stat(path)
- if err != nil {
- return nil, err
- }
- if info.IsDir() {
- return parseDir(path)
- }
- }
-
- // list of files
- return parseFiles("", args)
-}
-
-func checkPkgFiles(files []*ast.File) {
- type bailout struct{}
-
- // if checkPkgFiles is called multiple times, set up conf only once
- conf := types.Config{
- FakeImportC: true,
- Error: func(err error) {
- if !*allErrors && errorCount >= 10 {
- panic(bailout{})
- }
- report(err)
- },
- Importer: importer.For(*compiler, nil),
- Sizes: SizesFor(build.Default.Compiler, build.Default.GOARCH),
- }
-
- defer func() {
- switch p := recover().(type) {
- case nil, bailout:
- // normal return or early exit
- default:
- // re-panic
- panic(p)
- }
- }()
-
- const path = "pkg" // any non-empty string will do for now
- conf.Check(path, fset, files, nil)
-}
-
-func printStats(d time.Duration) {
- fileCount := 0
- lineCount := 0
- fset.Iterate(func(f *token.File) bool {
- fileCount++
- lineCount += f.LineCount()
- return true
- })
-
- fmt.Printf(
- "%s (%d files, %d lines, %d lines/s)\n",
- d, fileCount, lineCount, int64(float64(lineCount)/d.Seconds()),
- )
-}
-
-func main() {
- flag.Usage = usage
- flag.Parse()
- initParserMode()
-
- start := time.Now()
-
- files, err := getPkgFiles(flag.Args())
- if err != nil {
- report(err)
- os.Exit(2)
- }
-
- checkPkgFiles(files)
- if errorCount > 0 {
- os.Exit(2)
- }
-
- if *verbose {
- printStats(time.Since(start))
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/sizesFor18.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/sizesFor18.go
deleted file mode 100644
index 94e817679..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/sizesFor18.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-
-// This file contains a copy of the implementation of types.SizesFor
-// since this function is not available in go/types before Go 1.9.
-
-package main
-
-import "go/types"
-
-const defaultCompiler = "gc"
-
-var gcArchSizes = map[string]*types.StdSizes{
- "386": {4, 4},
- "arm": {4, 4},
- "arm64": {8, 8},
- "amd64": {8, 8},
- "amd64p32": {4, 8},
- "mips": {4, 4},
- "mipsle": {4, 4},
- "mips64": {8, 8},
- "mips64le": {8, 8},
- "ppc64": {8, 8},
- "ppc64le": {8, 8},
- "s390x": {8, 8},
-}
-
-func SizesFor(compiler, arch string) types.Sizes {
- if compiler != "gc" {
- return nil
- }
- s, ok := gcArchSizes[arch]
- if !ok {
- return nil
- }
- return s
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/sizesFor19.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/sizesFor19.go
deleted file mode 100644
index 9e0b481c8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/cmd/gotype/sizesFor19.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package main
-
-import "go/types"
-
-const defaultCompiler = "source"
-
-func SizesFor(compiler, arch string) types.Sizes {
- return types.SizesFor(compiler, arch)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_amd64.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_amd64.go
deleted file mode 100644
index 99ea813d2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_amd64.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64,!appengine,!gccgo
-
-package intsets
-
-func popcnt(x word) int
-func havePOPCNT() bool
-
-var hasPOPCNT = havePOPCNT()
-
-// popcount returns the population count (number of set bits) of x.
-func popcount(x word) int {
- if hasPOPCNT {
- return popcnt(x)
- }
- return popcountTable(x) // faster than Hacker's Delight
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_amd64.s b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_amd64.s
deleted file mode 100644
index 05c3d6fb5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_amd64.s
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64,!appengine,!gccgo
-
-#include "textflag.h"
-
-// func havePOPCNT() bool
-TEXT ·havePOPCNT(SB),4,$0
- MOVQ $1, AX
- CPUID
- SHRQ $23, CX
- ANDQ $1, CX
- MOVB CX, ret+0(FP)
- RET
-
-// func popcnt(word) int
-TEXT ·popcnt(SB),NOSPLIT,$0-8
- XORQ AX, AX
- MOVQ x+0(FP), SI
- // POPCNT (SI), AX is not recognized by Go assembler,
- // so we assemble it ourselves.
- BYTE $0xf3
- BYTE $0x48
- BYTE $0x0f
- BYTE $0xb8
- BYTE $0xc6
- MOVQ AX, ret+8(FP)
- RET
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_gccgo.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_gccgo.go
deleted file mode 100644
index 82a8875c8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_gccgo.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gccgo
-
-package intsets
-
-func popcount(x word) int
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c
deleted file mode 100644
index 08abb32ec..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build gccgo
-
-#include
-#include
-#include
-
-#define _STRINGIFY2_(x) #x
-#define _STRINGIFY_(x) _STRINGIFY2_(x)
-#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__)
-
-extern intptr_t popcount(uintptr_t x) __asm__(GOSYM_PREFIX GOPKGPATH ".popcount");
-
-intptr_t popcount(uintptr_t x) {
- return __builtin_popcountl((unsigned long)(x));
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_generic.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_generic.go
deleted file mode 100644
index 3985a1da1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/popcnt_generic.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !amd64 appengine
-// +build !gccgo
-
-package intsets
-
-import "runtime"
-
-// We compared three algorithms---Hacker's Delight, table lookup,
-// and AMD64's SSE4.1 hardware POPCNT---on a 2.67GHz Xeon X5550.
-//
-// % GOARCH=amd64 go test -run=NONE -bench=Popcount
-// POPCNT 5.12 ns/op
-// Table 8.53 ns/op
-// HackersDelight 9.96 ns/op
-//
-// % GOARCH=386 go test -run=NONE -bench=Popcount
-// Table 10.4 ns/op
-// HackersDelight 5.23 ns/op
-//
-// (AMD64's ABM1 hardware supports ntz and nlz too,
-// but they aren't critical.)
-
-// popcount returns the population count (number of set bits) of x.
-func popcount(x word) int {
- if runtime.GOARCH == "386" {
- return popcountHD(uint32(x))
- }
- return popcountTable(x)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/sparse.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/sparse.go
deleted file mode 100644
index 5db01c1a4..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/sparse.go
+++ /dev/null
@@ -1,1091 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package intsets provides Sparse, a compact and fast representation
-// for sparse sets of int values.
-//
-// The time complexity of the operations Len, Insert, Remove and Has
-// is in O(n) but in practice those methods are faster and more
-// space-efficient than equivalent operations on sets based on the Go
-// map type. The IsEmpty, Min, Max, Clear and TakeMin operations
-// require constant time.
-//
-package intsets // import "golang.org/x/tools/container/intsets"
-
-// TODO(adonovan):
-// - Add InsertAll(...int), RemoveAll(...int)
-// - Add 'bool changed' results for {Intersection,Difference}With too.
-//
-// TODO(adonovan): implement Dense, a dense bit vector with a similar API.
-// The space usage would be proportional to Max(), not Len(), and the
-// implementation would be based upon big.Int.
-//
-// TODO(adonovan): opt: make UnionWith and Difference faster.
-// These are the hot-spots for go/pointer.
-
-import (
- "bytes"
- "fmt"
-)
-
-// A Sparse is a set of int values.
-// Sparse operations (even queries) are not concurrency-safe.
-//
-// The zero value for Sparse is a valid empty set.
-//
-// Sparse sets must be copied using the Copy method, not by assigning
-// a Sparse value.
-//
-type Sparse struct {
- // An uninitialized Sparse represents an empty set.
- // An empty set may also be represented by
- // root.next == root.prev == &root.
- //
- // The root is always the block with the smallest offset.
- // It can be empty, but only if it is the only block; in that case, offset is
- // MaxInt (which is not a valid offset).
- root block
-}
-
-type word uintptr
-
-const (
- _m = ^word(0)
- bitsPerWord = 8 << (_m>>8&1 + _m>>16&1 + _m>>32&1)
- bitsPerBlock = 256 // optimal value for go/pointer solver performance
- wordsPerBlock = bitsPerBlock / bitsPerWord
-)
-
-// Limit values of implementation-specific int type.
-const (
- MaxInt = int(^uint(0) >> 1)
- MinInt = -MaxInt - 1
-)
-
-// -- block ------------------------------------------------------------
-
-// A set is represented as a circular doubly-linked list of blocks,
-// each containing an offset and a bit array of fixed size
-// bitsPerBlock; the blocks are ordered by increasing offset.
-//
-// The set contains an element x iff the block whose offset is x - (x
-// mod bitsPerBlock) has the bit (x mod bitsPerBlock) set, where mod
-// is the Euclidean remainder.
-//
-// A block may only be empty transiently.
-//
-type block struct {
- offset int // offset mod bitsPerBlock == 0
- bits [wordsPerBlock]word // contains at least one set bit
- next, prev *block // doubly-linked list of blocks
-}
-
-// wordMask returns the word index (in block.bits)
-// and single-bit mask for the block's ith bit.
-func wordMask(i uint) (w uint, mask word) {
- w = i / bitsPerWord
- mask = 1 << (i % bitsPerWord)
- return
-}
-
-// insert sets the block b's ith bit and
-// returns true if it was not already set.
-//
-func (b *block) insert(i uint) bool {
- w, mask := wordMask(i)
- if b.bits[w]&mask == 0 {
- b.bits[w] |= mask
- return true
- }
- return false
-}
-
-// remove clears the block's ith bit and
-// returns true if the bit was previously set.
-// NB: may leave the block empty.
-//
-func (b *block) remove(i uint) bool {
- w, mask := wordMask(i)
- if b.bits[w]&mask != 0 {
- b.bits[w] &^= mask
- return true
- }
- return false
-}
-
-// has reports whether the block's ith bit is set.
-func (b *block) has(i uint) bool {
- w, mask := wordMask(i)
- return b.bits[w]&mask != 0
-}
-
-// empty reports whether b.len()==0, but more efficiently.
-func (b *block) empty() bool {
- for _, w := range b.bits {
- if w != 0 {
- return false
- }
- }
- return true
-}
-
-// len returns the number of set bits in block b.
-func (b *block) len() int {
- var l int
- for _, w := range b.bits {
- l += popcount(w)
- }
- return l
-}
-
-// max returns the maximum element of the block.
-// The block must not be empty.
-func (b *block) max() int {
- bi := b.offset + bitsPerBlock
- // Decrement bi by number of high zeros in last.bits.
- for i := len(b.bits) - 1; i >= 0; i-- {
- if w := b.bits[i]; w != 0 {
- return bi - nlz(w) - 1
- }
- bi -= bitsPerWord
- }
- panic("BUG: empty block")
-}
-
-// min returns the minimum element of the block,
-// and also removes it if take is set.
-// The block must not be initially empty.
-// NB: may leave the block empty.
-func (b *block) min(take bool) int {
- for i, w := range b.bits {
- if w != 0 {
- tz := ntz(w)
- if take {
- b.bits[i] = w &^ (1 << uint(tz))
- }
- return b.offset + int(i*bitsPerWord) + tz
- }
- }
- panic("BUG: empty block")
-}
-
-// lowerBound returns the smallest element of the block that is greater than or
-// equal to the element corresponding to the ith bit. If there is no such
-// element, the second return value is false.
-func (b *block) lowerBound(i uint) (int, bool) {
- w := i / bitsPerWord
- bit := i % bitsPerWord
-
- if val := b.bits[w] >> bit; val != 0 {
- return b.offset + int(i) + ntz(val), true
- }
-
- for w++; w < wordsPerBlock; w++ {
- if val := b.bits[w]; val != 0 {
- return b.offset + int(w*bitsPerWord) + ntz(val), true
- }
- }
-
- return 0, false
-}
-
-// forEach calls f for each element of block b.
-// f must not mutate b's enclosing Sparse.
-func (b *block) forEach(f func(int)) {
- for i, w := range b.bits {
- offset := b.offset + i*bitsPerWord
- for bi := 0; w != 0 && bi < bitsPerWord; bi++ {
- if w&1 != 0 {
- f(offset)
- }
- offset++
- w >>= 1
- }
- }
-}
-
-// offsetAndBitIndex returns the offset of the block that would
-// contain x and the bit index of x within that block.
-//
-func offsetAndBitIndex(x int) (int, uint) {
- mod := x % bitsPerBlock
- if mod < 0 {
- // Euclidean (non-negative) remainder
- mod += bitsPerBlock
- }
- return x - mod, uint(mod)
-}
-
-// -- Sparse --------------------------------------------------------------
-
-// none is a shared, empty, sentinel block that indicates the end of a block
-// list.
-var none block
-
-// Dummy type used to generate an implicit panic. This must be defined at the
-// package level; if it is defined inside a function, it prevents the inlining
-// of that function.
-type to_copy_a_sparse_you_must_call_its_Copy_method struct{}
-
-// init ensures s is properly initialized.
-func (s *Sparse) init() {
- root := &s.root
- if root.next == nil {
- root.offset = MaxInt
- root.next = root
- root.prev = root
- } else if root.next.prev != root {
- // Copying a Sparse x leads to pernicious corruption: the
- // new Sparse y shares the old linked list, but iteration
- // on y will never encounter &y.root so it goes into a
- // loop. Fail fast before this occurs.
- // We don't want to call panic here because it prevents the
- // inlining of this function.
- _ = (interface{}(nil)).(to_copy_a_sparse_you_must_call_its_Copy_method)
- }
-}
-
-func (s *Sparse) first() *block {
- s.init()
- if s.root.offset == MaxInt {
- return &none
- }
- return &s.root
-}
-
-// next returns the next block in the list, or end if b is the last block.
-func (s *Sparse) next(b *block) *block {
- if b.next == &s.root {
- return &none
- }
- return b.next
-}
-
-// prev returns the previous block in the list, or end if b is the first block.
-func (s *Sparse) prev(b *block) *block {
- if b.prev == &s.root {
- return &none
- }
- return b.prev
-}
-
-// IsEmpty reports whether the set s is empty.
-func (s *Sparse) IsEmpty() bool {
- return s.root.next == nil || s.root.offset == MaxInt
-}
-
-// Len returns the number of elements in the set s.
-func (s *Sparse) Len() int {
- var l int
- for b := s.first(); b != &none; b = s.next(b) {
- l += b.len()
- }
- return l
-}
-
-// Max returns the maximum element of the set s, or MinInt if s is empty.
-func (s *Sparse) Max() int {
- if s.IsEmpty() {
- return MinInt
- }
- return s.root.prev.max()
-}
-
-// Min returns the minimum element of the set s, or MaxInt if s is empty.
-func (s *Sparse) Min() int {
- if s.IsEmpty() {
- return MaxInt
- }
- return s.root.min(false)
-}
-
-// LowerBound returns the smallest element >= x, or MaxInt if there is no such
-// element.
-func (s *Sparse) LowerBound(x int) int {
- offset, i := offsetAndBitIndex(x)
- for b := s.first(); b != &none; b = s.next(b) {
- if b.offset > offset {
- return b.min(false)
- }
- if b.offset == offset {
- if y, ok := b.lowerBound(i); ok {
- return y
- }
- }
- }
- return MaxInt
-}
-
-// block returns the block that would contain offset,
-// or nil if s contains no such block.
-// Precondition: offset is a multiple of bitsPerBlock.
-func (s *Sparse) block(offset int) *block {
- for b := s.first(); b != &none && b.offset <= offset; b = s.next(b) {
- if b.offset == offset {
- return b
- }
- }
- return nil
-}
-
-// Insert adds x to the set s, and reports whether the set grew.
-func (s *Sparse) Insert(x int) bool {
- offset, i := offsetAndBitIndex(x)
-
- b := s.first()
- for ; b != &none && b.offset <= offset; b = s.next(b) {
- if b.offset == offset {
- return b.insert(i)
- }
- }
-
- // Insert new block before b.
- new := s.insertBlockBefore(b)
- new.offset = offset
- return new.insert(i)
-}
-
-// removeBlock removes a block and returns the block that followed it (or end if
-// it was the last block).
-func (s *Sparse) removeBlock(b *block) *block {
- if b != &s.root {
- b.prev.next = b.next
- b.next.prev = b.prev
- if b.next == &s.root {
- return &none
- }
- return b.next
- }
-
- first := s.root.next
- if first == &s.root {
- // This was the only block.
- s.Clear()
- return &none
- }
- s.root.offset = first.offset
- s.root.bits = first.bits
- if first.next == &s.root {
- // Single block remaining.
- s.root.next = &s.root
- s.root.prev = &s.root
- } else {
- s.root.next = first.next
- first.next.prev = &s.root
- }
- return &s.root
-}
-
-// Remove removes x from the set s, and reports whether the set shrank.
-func (s *Sparse) Remove(x int) bool {
- offset, i := offsetAndBitIndex(x)
- if b := s.block(offset); b != nil {
- if !b.remove(i) {
- return false
- }
- if b.empty() {
- s.removeBlock(b)
- }
- return true
- }
- return false
-}
-
-// Clear removes all elements from the set s.
-func (s *Sparse) Clear() {
- s.root = block{
- offset: MaxInt,
- next: &s.root,
- prev: &s.root,
- }
-}
-
-// If set s is non-empty, TakeMin sets *p to the minimum element of
-// the set s, removes that element from the set and returns true.
-// Otherwise, it returns false and *p is undefined.
-//
-// This method may be used for iteration over a worklist like so:
-//
-// var x int
-// for worklist.TakeMin(&x) { use(x) }
-//
-func (s *Sparse) TakeMin(p *int) bool {
- if s.IsEmpty() {
- return false
- }
- *p = s.root.min(true)
- if s.root.empty() {
- s.removeBlock(&s.root)
- }
- return true
-}
-
-// Has reports whether x is an element of the set s.
-func (s *Sparse) Has(x int) bool {
- offset, i := offsetAndBitIndex(x)
- if b := s.block(offset); b != nil {
- return b.has(i)
- }
- return false
-}
-
-// forEach applies function f to each element of the set s in order.
-//
-// f must not mutate s. Consequently, forEach is not safe to expose
-// to clients. In any case, using "range s.AppendTo()" allows more
-// natural control flow with continue/break/return.
-//
-func (s *Sparse) forEach(f func(int)) {
- for b := s.first(); b != &none; b = s.next(b) {
- b.forEach(f)
- }
-}
-
-// Copy sets s to the value of x.
-func (s *Sparse) Copy(x *Sparse) {
- if s == x {
- return
- }
-
- xb := x.first()
- sb := s.first()
- for xb != &none {
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
- sb.bits = xb.bits
- xb = x.next(xb)
- sb = s.next(sb)
- }
- s.discardTail(sb)
-}
-
-// insertBlockBefore returns a new block, inserting it before next.
-// If next is the root, the root is replaced. If next is end, the block is
-// inserted at the end.
-func (s *Sparse) insertBlockBefore(next *block) *block {
- if s.IsEmpty() {
- if next != &none {
- panic("BUG: passed block with empty set")
- }
- return &s.root
- }
-
- if next == &s.root {
- // Special case: we need to create a new block that will become the root
- // block.The old root block becomes the second block.
- second := s.root
- s.root = block{
- next: &second,
- }
- if second.next == &s.root {
- s.root.prev = &second
- } else {
- s.root.prev = second.prev
- second.next.prev = &second
- second.prev = &s.root
- }
- return &s.root
- }
- if next == &none {
- // Insert before root.
- next = &s.root
- }
- b := new(block)
- b.next = next
- b.prev = next.prev
- b.prev.next = b
- next.prev = b
- return b
-}
-
-// discardTail removes block b and all its successors from s.
-func (s *Sparse) discardTail(b *block) {
- if b != &none {
- if b == &s.root {
- s.Clear()
- } else {
- b.prev.next = &s.root
- s.root.prev = b.prev
- }
- }
-}
-
-// IntersectionWith sets s to the intersection s ∩ x.
-func (s *Sparse) IntersectionWith(x *Sparse) {
- if s == x {
- return
- }
-
- xb := x.first()
- sb := s.first()
- for xb != &none && sb != &none {
- switch {
- case xb.offset < sb.offset:
- xb = x.next(xb)
-
- case xb.offset > sb.offset:
- sb = s.removeBlock(sb)
-
- default:
- var sum word
- for i := range sb.bits {
- r := xb.bits[i] & sb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum != 0 {
- sb = s.next(sb)
- } else {
- // sb will be overwritten or removed
- }
-
- xb = x.next(xb)
- }
- }
-
- s.discardTail(sb)
-}
-
-// Intersection sets s to the intersection x ∩ y.
-func (s *Sparse) Intersection(x, y *Sparse) {
- switch {
- case s == x:
- s.IntersectionWith(y)
- return
- case s == y:
- s.IntersectionWith(x)
- return
- case x == y:
- s.Copy(x)
- return
- }
-
- xb := x.first()
- yb := y.first()
- sb := s.first()
- for xb != &none && yb != &none {
- switch {
- case xb.offset < yb.offset:
- xb = x.next(xb)
- continue
- case xb.offset > yb.offset:
- yb = y.next(yb)
- continue
- }
-
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
-
- var sum word
- for i := range sb.bits {
- r := xb.bits[i] & yb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum != 0 {
- sb = s.next(sb)
- } else {
- // sb will be overwritten or removed
- }
-
- xb = x.next(xb)
- yb = y.next(yb)
- }
-
- s.discardTail(sb)
-}
-
-// Intersects reports whether s ∩ x ≠ ∅.
-func (s *Sparse) Intersects(x *Sparse) bool {
- sb := s.first()
- xb := x.first()
- for sb != &none && xb != &none {
- switch {
- case xb.offset < sb.offset:
- xb = x.next(xb)
- case xb.offset > sb.offset:
- sb = s.next(sb)
- default:
- for i := range sb.bits {
- if sb.bits[i]&xb.bits[i] != 0 {
- return true
- }
- }
- sb = s.next(sb)
- xb = x.next(xb)
- }
- }
- return false
-}
-
-// UnionWith sets s to the union s ∪ x, and reports whether s grew.
-func (s *Sparse) UnionWith(x *Sparse) bool {
- if s == x {
- return false
- }
-
- var changed bool
- xb := x.first()
- sb := s.first()
- for xb != &none {
- if sb != &none && sb.offset == xb.offset {
- for i := range xb.bits {
- if sb.bits[i] != xb.bits[i] {
- sb.bits[i] |= xb.bits[i]
- changed = true
- }
- }
- xb = x.next(xb)
- } else if sb == &none || sb.offset > xb.offset {
- sb = s.insertBlockBefore(sb)
- sb.offset = xb.offset
- sb.bits = xb.bits
- changed = true
-
- xb = x.next(xb)
- }
- sb = s.next(sb)
- }
- return changed
-}
-
-// Union sets s to the union x ∪ y.
-func (s *Sparse) Union(x, y *Sparse) {
- switch {
- case x == y:
- s.Copy(x)
- return
- case s == x:
- s.UnionWith(y)
- return
- case s == y:
- s.UnionWith(x)
- return
- }
-
- xb := x.first()
- yb := y.first()
- sb := s.first()
- for xb != &none || yb != &none {
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- switch {
- case yb == &none || (xb != &none && xb.offset < yb.offset):
- sb.offset = xb.offset
- sb.bits = xb.bits
- xb = x.next(xb)
-
- case xb == &none || (yb != &none && yb.offset < xb.offset):
- sb.offset = yb.offset
- sb.bits = yb.bits
- yb = y.next(yb)
-
- default:
- sb.offset = xb.offset
- for i := range xb.bits {
- sb.bits[i] = xb.bits[i] | yb.bits[i]
- }
- xb = x.next(xb)
- yb = y.next(yb)
- }
- sb = s.next(sb)
- }
-
- s.discardTail(sb)
-}
-
-// DifferenceWith sets s to the difference s ∖ x.
-func (s *Sparse) DifferenceWith(x *Sparse) {
- if s == x {
- s.Clear()
- return
- }
-
- xb := x.first()
- sb := s.first()
- for xb != &none && sb != &none {
- switch {
- case xb.offset > sb.offset:
- sb = s.next(sb)
-
- case xb.offset < sb.offset:
- xb = x.next(xb)
-
- default:
- var sum word
- for i := range sb.bits {
- r := sb.bits[i] & ^xb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum == 0 {
- sb = s.removeBlock(sb)
- } else {
- sb = s.next(sb)
- }
- xb = x.next(xb)
- }
- }
-}
-
-// Difference sets s to the difference x ∖ y.
-func (s *Sparse) Difference(x, y *Sparse) {
- switch {
- case x == y:
- s.Clear()
- return
- case s == x:
- s.DifferenceWith(y)
- return
- case s == y:
- var y2 Sparse
- y2.Copy(y)
- s.Difference(x, &y2)
- return
- }
-
- xb := x.first()
- yb := y.first()
- sb := s.first()
- for xb != &none && yb != &none {
- if xb.offset > yb.offset {
- // y has block, x has &none
- yb = y.next(yb)
- continue
- }
-
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
-
- switch {
- case xb.offset < yb.offset:
- // x has block, y has &none
- sb.bits = xb.bits
-
- sb = s.next(sb)
-
- default:
- // x and y have corresponding blocks
- var sum word
- for i := range sb.bits {
- r := xb.bits[i] & ^yb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum != 0 {
- sb = s.next(sb)
- } else {
- // sb will be overwritten or removed
- }
-
- yb = y.next(yb)
- }
- xb = x.next(xb)
- }
-
- for xb != &none {
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
- sb.bits = xb.bits
- sb = s.next(sb)
-
- xb = x.next(xb)
- }
-
- s.discardTail(sb)
-}
-
-// SymmetricDifferenceWith sets s to the symmetric difference s ∆ x.
-func (s *Sparse) SymmetricDifferenceWith(x *Sparse) {
- if s == x {
- s.Clear()
- return
- }
-
- sb := s.first()
- xb := x.first()
- for xb != &none && sb != &none {
- switch {
- case sb.offset < xb.offset:
- sb = s.next(sb)
- case xb.offset < sb.offset:
- nb := s.insertBlockBefore(sb)
- nb.offset = xb.offset
- nb.bits = xb.bits
- xb = x.next(xb)
- default:
- var sum word
- for i := range sb.bits {
- r := sb.bits[i] ^ xb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum == 0 {
- sb = s.removeBlock(sb)
- } else {
- sb = s.next(sb)
- }
- xb = x.next(xb)
- }
- }
-
- for xb != &none { // append the tail of x to s
- sb = s.insertBlockBefore(sb)
- sb.offset = xb.offset
- sb.bits = xb.bits
- sb = s.next(sb)
- xb = x.next(xb)
- }
-}
-
-// SymmetricDifference sets s to the symmetric difference x ∆ y.
-func (s *Sparse) SymmetricDifference(x, y *Sparse) {
- switch {
- case x == y:
- s.Clear()
- return
- case s == x:
- s.SymmetricDifferenceWith(y)
- return
- case s == y:
- s.SymmetricDifferenceWith(x)
- return
- }
-
- sb := s.first()
- xb := x.first()
- yb := y.first()
- for xb != &none && yb != &none {
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- switch {
- case yb.offset < xb.offset:
- sb.offset = yb.offset
- sb.bits = yb.bits
- sb = s.next(sb)
- yb = y.next(yb)
- case xb.offset < yb.offset:
- sb.offset = xb.offset
- sb.bits = xb.bits
- sb = s.next(sb)
- xb = x.next(xb)
- default:
- var sum word
- for i := range sb.bits {
- r := xb.bits[i] ^ yb.bits[i]
- sb.bits[i] = r
- sum |= r
- }
- if sum != 0 {
- sb.offset = xb.offset
- sb = s.next(sb)
- }
- xb = x.next(xb)
- yb = y.next(yb)
- }
- }
-
- for xb != &none { // append the tail of x to s
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = xb.offset
- sb.bits = xb.bits
- sb = s.next(sb)
- xb = x.next(xb)
- }
-
- for yb != &none { // append the tail of y to s
- if sb == &none {
- sb = s.insertBlockBefore(sb)
- }
- sb.offset = yb.offset
- sb.bits = yb.bits
- sb = s.next(sb)
- yb = y.next(yb)
- }
-
- s.discardTail(sb)
-}
-
-// SubsetOf reports whether s ∖ x = ∅.
-func (s *Sparse) SubsetOf(x *Sparse) bool {
- if s == x {
- return true
- }
-
- sb := s.first()
- xb := x.first()
- for sb != &none {
- switch {
- case xb == &none || xb.offset > sb.offset:
- return false
- case xb.offset < sb.offset:
- xb = x.next(xb)
- default:
- for i := range sb.bits {
- if sb.bits[i]&^xb.bits[i] != 0 {
- return false
- }
- }
- sb = s.next(sb)
- xb = x.next(xb)
- }
- }
- return true
-}
-
-// Equals reports whether the sets s and t have the same elements.
-func (s *Sparse) Equals(t *Sparse) bool {
- if s == t {
- return true
- }
- sb := s.first()
- tb := t.first()
- for {
- switch {
- case sb == &none && tb == &none:
- return true
- case sb == &none || tb == &none:
- return false
- case sb.offset != tb.offset:
- return false
- case sb.bits != tb.bits:
- return false
- }
-
- sb = s.next(sb)
- tb = t.next(tb)
- }
-}
-
-// String returns a human-readable description of the set s.
-func (s *Sparse) String() string {
- var buf bytes.Buffer
- buf.WriteByte('{')
- s.forEach(func(x int) {
- if buf.Len() > 1 {
- buf.WriteByte(' ')
- }
- fmt.Fprintf(&buf, "%d", x)
- })
- buf.WriteByte('}')
- return buf.String()
-}
-
-// BitString returns the set as a string of 1s and 0s denoting the sum
-// of the i'th powers of 2, for each i in s. A radix point, always
-// preceded by a digit, appears if the sum is non-integral.
-//
-// Examples:
-// {}.BitString() = "0"
-// {4,5}.BitString() = "110000"
-// {-3}.BitString() = "0.001"
-// {-3,0,4,5}.BitString() = "110001.001"
-//
-func (s *Sparse) BitString() string {
- if s.IsEmpty() {
- return "0"
- }
-
- min, max := s.Min(), s.Max()
- var nbytes int
- if max > 0 {
- nbytes = max
- }
- nbytes++ // zero bit
- radix := nbytes
- if min < 0 {
- nbytes += len(".") - min
- }
-
- b := make([]byte, nbytes)
- for i := range b {
- b[i] = '0'
- }
- if radix < nbytes {
- b[radix] = '.'
- }
- s.forEach(func(x int) {
- if x >= 0 {
- x += len(".")
- }
- b[radix-x] = '1'
- })
- return string(b)
-}
-
-// GoString returns a string showing the internal representation of
-// the set s.
-//
-func (s *Sparse) GoString() string {
- var buf bytes.Buffer
- for b := s.first(); b != &none; b = s.next(b) {
- fmt.Fprintf(&buf, "block %p {offset=%d next=%p prev=%p",
- b, b.offset, b.next, b.prev)
- for _, w := range b.bits {
- fmt.Fprintf(&buf, " 0%016x", w)
- }
- fmt.Fprintf(&buf, "}\n")
- }
- return buf.String()
-}
-
-// AppendTo returns the result of appending the elements of s to slice
-// in order.
-func (s *Sparse) AppendTo(slice []int) []int {
- s.forEach(func(x int) {
- slice = append(slice, x)
- })
- return slice
-}
-
-// -- Testing/debugging ------------------------------------------------
-
-// check returns an error if the representation invariants of s are violated.
-func (s *Sparse) check() error {
- s.init()
- if s.root.empty() {
- // An empty set must have only the root block with offset MaxInt.
- if s.root.next != &s.root {
- return fmt.Errorf("multiple blocks with empty root block")
- }
- if s.root.offset != MaxInt {
- return fmt.Errorf("empty set has offset %d, should be MaxInt", s.root.offset)
- }
- return nil
- }
- for b := s.first(); ; b = s.next(b) {
- if b.offset%bitsPerBlock != 0 {
- return fmt.Errorf("bad offset modulo: %d", b.offset)
- }
- if b.empty() {
- return fmt.Errorf("empty block")
- }
- if b.prev.next != b {
- return fmt.Errorf("bad prev.next link")
- }
- if b.next.prev != b {
- return fmt.Errorf("bad next.prev link")
- }
- if b.next == &s.root {
- break
- }
- if b.offset >= b.next.offset {
- return fmt.Errorf("bad offset order: b.offset=%d, b.next.offset=%d",
- b.offset, b.next.offset)
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/util.go
deleted file mode 100644
index dd1db86b1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/container/intsets/util.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package intsets
-
-// From Hacker's Delight, fig 5.2.
-func popcountHD(x uint32) int {
- x -= (x >> 1) & 0x55555555
- x = (x & 0x33333333) + ((x >> 2) & 0x33333333)
- x = (x + (x >> 4)) & 0x0f0f0f0f
- x = x + (x >> 8)
- x = x + (x >> 16)
- return int(x & 0x0000003f)
-}
-
-var a [1 << 8]byte
-
-func init() {
- for i := range a {
- var n byte
- for x := i; x != 0; x >>= 1 {
- if x&1 != 0 {
- n++
- }
- }
- a[i] = n
- }
-}
-
-func popcountTable(x word) int {
- return int(a[byte(x>>(0*8))] +
- a[byte(x>>(1*8))] +
- a[byte(x>>(2*8))] +
- a[byte(x>>(3*8))] +
- a[byte(x>>(4*8))] +
- a[byte(x>>(5*8))] +
- a[byte(x>>(6*8))] +
- a[byte(x>>(7*8))])
-}
-
-// nlz returns the number of leading zeros of x.
-// From Hacker's Delight, fig 5.11.
-func nlz(x word) int {
- x |= (x >> 1)
- x |= (x >> 2)
- x |= (x >> 4)
- x |= (x >> 8)
- x |= (x >> 16)
- x |= (x >> 32)
- return popcount(^x)
-}
-
-// ntz returns the number of trailing zeros of x.
-// From Hacker's Delight, fig 5.13.
-func ntz(x word) int {
- if x == 0 {
- return bitsPerWord
- }
- n := 1
- if bitsPerWord == 64 {
- if (x & 0xffffffff) == 0 {
- n = n + 32
- x = x >> 32
- }
- }
- if (x & 0x0000ffff) == 0 {
- n = n + 16
- x = x >> 16
- }
- if (x & 0x000000ff) == 0 {
- n = n + 8
- x = x >> 8
- }
- if (x & 0x0000000f) == 0 {
- n = n + 4
- x = x >> 4
- }
- if (x & 0x00000003) == 0 {
- n = n + 2
- x = x >> 2
- }
- return n - int(x&1)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/enclosing.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/enclosing.go
deleted file mode 100644
index 6b7052b89..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/enclosing.go
+++ /dev/null
@@ -1,627 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil
-
-// This file defines utilities for working with source positions.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "sort"
-)
-
-// PathEnclosingInterval returns the node that encloses the source
-// interval [start, end), and all its ancestors up to the AST root.
-//
-// The definition of "enclosing" used by this function considers
-// additional whitespace abutting a node to be enclosed by it.
-// In this example:
-//
-// z := x + y // add them
-// <-A->
-// <----B----->
-//
-// the ast.BinaryExpr(+) node is considered to enclose interval B
-// even though its [Pos()..End()) is actually only interval A.
-// This behaviour makes user interfaces more tolerant of imperfect
-// input.
-//
-// This function treats tokens as nodes, though they are not included
-// in the result. e.g. PathEnclosingInterval("+") returns the
-// enclosing ast.BinaryExpr("x + y").
-//
-// If start==end, the 1-char interval following start is used instead.
-//
-// The 'exact' result is true if the interval contains only path[0]
-// and perhaps some adjacent whitespace. It is false if the interval
-// overlaps multiple children of path[0], or if it contains only
-// interior whitespace of path[0].
-// In this example:
-//
-// z := x + y // add them
-// <--C--> <---E-->
-// ^
-// D
-//
-// intervals C, D and E are inexact. C is contained by the
-// z-assignment statement, because it spans three of its children (:=,
-// x, +). So too is the 1-char interval D, because it contains only
-// interior whitespace of the assignment. E is considered interior
-// whitespace of the BlockStmt containing the assignment.
-//
-// Precondition: [start, end) both lie within the same file as root.
-// TODO(adonovan): return (nil, false) in this case and remove precond.
-// Requires FileSet; see loader.tokenFileContainsPos.
-//
-// Postcondition: path is never nil; it always contains at least 'root'.
-//
-func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) {
- // fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging
-
- // Precondition: node.[Pos..End) and adjoining whitespace contain [start, end).
- var visit func(node ast.Node) bool
- visit = func(node ast.Node) bool {
- path = append(path, node)
-
- nodePos := node.Pos()
- nodeEnd := node.End()
-
- // fmt.Printf("visit(%T, %d, %d)\n", node, nodePos, nodeEnd) // debugging
-
- // Intersect [start, end) with interval of node.
- if start < nodePos {
- start = nodePos
- }
- if end > nodeEnd {
- end = nodeEnd
- }
-
- // Find sole child that contains [start, end).
- children := childrenOf(node)
- l := len(children)
- for i, child := range children {
- // [childPos, childEnd) is unaugmented interval of child.
- childPos := child.Pos()
- childEnd := child.End()
-
- // [augPos, augEnd) is whitespace-augmented interval of child.
- augPos := childPos
- augEnd := childEnd
- if i > 0 {
- augPos = children[i-1].End() // start of preceding whitespace
- }
- if i < l-1 {
- nextChildPos := children[i+1].Pos()
- // Does [start, end) lie between child and next child?
- if start >= augEnd && end <= nextChildPos {
- return false // inexact match
- }
- augEnd = nextChildPos // end of following whitespace
- }
-
- // fmt.Printf("\tchild %d: [%d..%d)\tcontains interval [%d..%d)?\n",
- // i, augPos, augEnd, start, end) // debugging
-
- // Does augmented child strictly contain [start, end)?
- if augPos <= start && end <= augEnd {
- _, isToken := child.(tokenNode)
- return isToken || visit(child)
- }
-
- // Does [start, end) overlap multiple children?
- // i.e. left-augmented child contains start
- // but LR-augmented child does not contain end.
- if start < childEnd && end > augEnd {
- break
- }
- }
-
- // No single child contained [start, end),
- // so node is the result. Is it exact?
-
- // (It's tempting to put this condition before the
- // child loop, but it gives the wrong result in the
- // case where a node (e.g. ExprStmt) and its sole
- // child have equal intervals.)
- if start == nodePos && end == nodeEnd {
- return true // exact match
- }
-
- return false // inexact: overlaps multiple children
- }
-
- if start > end {
- start, end = end, start
- }
-
- if start < root.End() && end > root.Pos() {
- if start == end {
- end = start + 1 // empty interval => interval of size 1
- }
- exact = visit(root)
-
- // Reverse the path:
- for i, l := 0, len(path); i < l/2; i++ {
- path[i], path[l-1-i] = path[l-1-i], path[i]
- }
- } else {
- // Selection lies within whitespace preceding the
- // first (or following the last) declaration in the file.
- // The result nonetheless always includes the ast.File.
- path = append(path, root)
- }
-
- return
-}
-
-// tokenNode is a dummy implementation of ast.Node for a single token.
-// They are used transiently by PathEnclosingInterval but never escape
-// this package.
-//
-type tokenNode struct {
- pos token.Pos
- end token.Pos
-}
-
-func (n tokenNode) Pos() token.Pos {
- return n.pos
-}
-
-func (n tokenNode) End() token.Pos {
- return n.end
-}
-
-func tok(pos token.Pos, len int) ast.Node {
- return tokenNode{pos, pos + token.Pos(len)}
-}
-
-// childrenOf returns the direct non-nil children of ast.Node n.
-// It may include fake ast.Node implementations for bare tokens.
-// it is not safe to call (e.g.) ast.Walk on such nodes.
-//
-func childrenOf(n ast.Node) []ast.Node {
- var children []ast.Node
-
- // First add nodes for all true subtrees.
- ast.Inspect(n, func(node ast.Node) bool {
- if node == n { // push n
- return true // recur
- }
- if node != nil { // push child
- children = append(children, node)
- }
- return false // no recursion
- })
-
- // Then add fake Nodes for bare tokens.
- switch n := n.(type) {
- case *ast.ArrayType:
- children = append(children,
- tok(n.Lbrack, len("[")),
- tok(n.Elt.End(), len("]")))
-
- case *ast.AssignStmt:
- children = append(children,
- tok(n.TokPos, len(n.Tok.String())))
-
- case *ast.BasicLit:
- children = append(children,
- tok(n.ValuePos, len(n.Value)))
-
- case *ast.BinaryExpr:
- children = append(children, tok(n.OpPos, len(n.Op.String())))
-
- case *ast.BlockStmt:
- children = append(children,
- tok(n.Lbrace, len("{")),
- tok(n.Rbrace, len("}")))
-
- case *ast.BranchStmt:
- children = append(children,
- tok(n.TokPos, len(n.Tok.String())))
-
- case *ast.CallExpr:
- children = append(children,
- tok(n.Lparen, len("(")),
- tok(n.Rparen, len(")")))
- if n.Ellipsis != 0 {
- children = append(children, tok(n.Ellipsis, len("...")))
- }
-
- case *ast.CaseClause:
- if n.List == nil {
- children = append(children,
- tok(n.Case, len("default")))
- } else {
- children = append(children,
- tok(n.Case, len("case")))
- }
- children = append(children, tok(n.Colon, len(":")))
-
- case *ast.ChanType:
- switch n.Dir {
- case ast.RECV:
- children = append(children, tok(n.Begin, len("<-chan")))
- case ast.SEND:
- children = append(children, tok(n.Begin, len("chan<-")))
- case ast.RECV | ast.SEND:
- children = append(children, tok(n.Begin, len("chan")))
- }
-
- case *ast.CommClause:
- if n.Comm == nil {
- children = append(children,
- tok(n.Case, len("default")))
- } else {
- children = append(children,
- tok(n.Case, len("case")))
- }
- children = append(children, tok(n.Colon, len(":")))
-
- case *ast.Comment:
- // nop
-
- case *ast.CommentGroup:
- // nop
-
- case *ast.CompositeLit:
- children = append(children,
- tok(n.Lbrace, len("{")),
- tok(n.Rbrace, len("{")))
-
- case *ast.DeclStmt:
- // nop
-
- case *ast.DeferStmt:
- children = append(children,
- tok(n.Defer, len("defer")))
-
- case *ast.Ellipsis:
- children = append(children,
- tok(n.Ellipsis, len("...")))
-
- case *ast.EmptyStmt:
- // nop
-
- case *ast.ExprStmt:
- // nop
-
- case *ast.Field:
- // TODO(adonovan): Field.{Doc,Comment,Tag}?
-
- case *ast.FieldList:
- children = append(children,
- tok(n.Opening, len("(")),
- tok(n.Closing, len(")")))
-
- case *ast.File:
- // TODO test: Doc
- children = append(children,
- tok(n.Package, len("package")))
-
- case *ast.ForStmt:
- children = append(children,
- tok(n.For, len("for")))
-
- case *ast.FuncDecl:
- // TODO(adonovan): FuncDecl.Comment?
-
- // Uniquely, FuncDecl breaks the invariant that
- // preorder traversal yields tokens in lexical order:
- // in fact, FuncDecl.Recv precedes FuncDecl.Type.Func.
- //
- // As a workaround, we inline the case for FuncType
- // here and order things correctly.
- //
- children = nil // discard ast.Walk(FuncDecl) info subtrees
- children = append(children, tok(n.Type.Func, len("func")))
- if n.Recv != nil {
- children = append(children, n.Recv)
- }
- children = append(children, n.Name)
- if n.Type.Params != nil {
- children = append(children, n.Type.Params)
- }
- if n.Type.Results != nil {
- children = append(children, n.Type.Results)
- }
- if n.Body != nil {
- children = append(children, n.Body)
- }
-
- case *ast.FuncLit:
- // nop
-
- case *ast.FuncType:
- if n.Func != 0 {
- children = append(children,
- tok(n.Func, len("func")))
- }
-
- case *ast.GenDecl:
- children = append(children,
- tok(n.TokPos, len(n.Tok.String())))
- if n.Lparen != 0 {
- children = append(children,
- tok(n.Lparen, len("(")),
- tok(n.Rparen, len(")")))
- }
-
- case *ast.GoStmt:
- children = append(children,
- tok(n.Go, len("go")))
-
- case *ast.Ident:
- children = append(children,
- tok(n.NamePos, len(n.Name)))
-
- case *ast.IfStmt:
- children = append(children,
- tok(n.If, len("if")))
-
- case *ast.ImportSpec:
- // TODO(adonovan): ImportSpec.{Doc,EndPos}?
-
- case *ast.IncDecStmt:
- children = append(children,
- tok(n.TokPos, len(n.Tok.String())))
-
- case *ast.IndexExpr:
- children = append(children,
- tok(n.Lbrack, len("{")),
- tok(n.Rbrack, len("}")))
-
- case *ast.InterfaceType:
- children = append(children,
- tok(n.Interface, len("interface")))
-
- case *ast.KeyValueExpr:
- children = append(children,
- tok(n.Colon, len(":")))
-
- case *ast.LabeledStmt:
- children = append(children,
- tok(n.Colon, len(":")))
-
- case *ast.MapType:
- children = append(children,
- tok(n.Map, len("map")))
-
- case *ast.ParenExpr:
- children = append(children,
- tok(n.Lparen, len("(")),
- tok(n.Rparen, len(")")))
-
- case *ast.RangeStmt:
- children = append(children,
- tok(n.For, len("for")),
- tok(n.TokPos, len(n.Tok.String())))
-
- case *ast.ReturnStmt:
- children = append(children,
- tok(n.Return, len("return")))
-
- case *ast.SelectStmt:
- children = append(children,
- tok(n.Select, len("select")))
-
- case *ast.SelectorExpr:
- // nop
-
- case *ast.SendStmt:
- children = append(children,
- tok(n.Arrow, len("<-")))
-
- case *ast.SliceExpr:
- children = append(children,
- tok(n.Lbrack, len("[")),
- tok(n.Rbrack, len("]")))
-
- case *ast.StarExpr:
- children = append(children, tok(n.Star, len("*")))
-
- case *ast.StructType:
- children = append(children, tok(n.Struct, len("struct")))
-
- case *ast.SwitchStmt:
- children = append(children, tok(n.Switch, len("switch")))
-
- case *ast.TypeAssertExpr:
- children = append(children,
- tok(n.Lparen-1, len(".")),
- tok(n.Lparen, len("(")),
- tok(n.Rparen, len(")")))
-
- case *ast.TypeSpec:
- // TODO(adonovan): TypeSpec.{Doc,Comment}?
-
- case *ast.TypeSwitchStmt:
- children = append(children, tok(n.Switch, len("switch")))
-
- case *ast.UnaryExpr:
- children = append(children, tok(n.OpPos, len(n.Op.String())))
-
- case *ast.ValueSpec:
- // TODO(adonovan): ValueSpec.{Doc,Comment}?
-
- case *ast.BadDecl, *ast.BadExpr, *ast.BadStmt:
- // nop
- }
-
- // TODO(adonovan): opt: merge the logic of ast.Inspect() into
- // the switch above so we can make interleaved callbacks for
- // both Nodes and Tokens in the right order and avoid the need
- // to sort.
- sort.Sort(byPos(children))
-
- return children
-}
-
-type byPos []ast.Node
-
-func (sl byPos) Len() int {
- return len(sl)
-}
-func (sl byPos) Less(i, j int) bool {
- return sl[i].Pos() < sl[j].Pos()
-}
-func (sl byPos) Swap(i, j int) {
- sl[i], sl[j] = sl[j], sl[i]
-}
-
-// NodeDescription returns a description of the concrete type of n suitable
-// for a user interface.
-//
-// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident,
-// StarExpr) we could be much more specific given the path to the AST
-// root. Perhaps we should do that.
-//
-func NodeDescription(n ast.Node) string {
- switch n := n.(type) {
- case *ast.ArrayType:
- return "array type"
- case *ast.AssignStmt:
- return "assignment"
- case *ast.BadDecl:
- return "bad declaration"
- case *ast.BadExpr:
- return "bad expression"
- case *ast.BadStmt:
- return "bad statement"
- case *ast.BasicLit:
- return "basic literal"
- case *ast.BinaryExpr:
- return fmt.Sprintf("binary %s operation", n.Op)
- case *ast.BlockStmt:
- return "block"
- case *ast.BranchStmt:
- switch n.Tok {
- case token.BREAK:
- return "break statement"
- case token.CONTINUE:
- return "continue statement"
- case token.GOTO:
- return "goto statement"
- case token.FALLTHROUGH:
- return "fall-through statement"
- }
- case *ast.CallExpr:
- if len(n.Args) == 1 && !n.Ellipsis.IsValid() {
- return "function call (or conversion)"
- }
- return "function call"
- case *ast.CaseClause:
- return "case clause"
- case *ast.ChanType:
- return "channel type"
- case *ast.CommClause:
- return "communication clause"
- case *ast.Comment:
- return "comment"
- case *ast.CommentGroup:
- return "comment group"
- case *ast.CompositeLit:
- return "composite literal"
- case *ast.DeclStmt:
- return NodeDescription(n.Decl) + " statement"
- case *ast.DeferStmt:
- return "defer statement"
- case *ast.Ellipsis:
- return "ellipsis"
- case *ast.EmptyStmt:
- return "empty statement"
- case *ast.ExprStmt:
- return "expression statement"
- case *ast.Field:
- // Can be any of these:
- // struct {x, y int} -- struct field(s)
- // struct {T} -- anon struct field
- // interface {I} -- interface embedding
- // interface {f()} -- interface method
- // func (A) func(B) C -- receiver, param(s), result(s)
- return "field/method/parameter"
- case *ast.FieldList:
- return "field/method/parameter list"
- case *ast.File:
- return "source file"
- case *ast.ForStmt:
- return "for loop"
- case *ast.FuncDecl:
- return "function declaration"
- case *ast.FuncLit:
- return "function literal"
- case *ast.FuncType:
- return "function type"
- case *ast.GenDecl:
- switch n.Tok {
- case token.IMPORT:
- return "import declaration"
- case token.CONST:
- return "constant declaration"
- case token.TYPE:
- return "type declaration"
- case token.VAR:
- return "variable declaration"
- }
- case *ast.GoStmt:
- return "go statement"
- case *ast.Ident:
- return "identifier"
- case *ast.IfStmt:
- return "if statement"
- case *ast.ImportSpec:
- return "import specification"
- case *ast.IncDecStmt:
- if n.Tok == token.INC {
- return "increment statement"
- }
- return "decrement statement"
- case *ast.IndexExpr:
- return "index expression"
- case *ast.InterfaceType:
- return "interface type"
- case *ast.KeyValueExpr:
- return "key/value association"
- case *ast.LabeledStmt:
- return "statement label"
- case *ast.MapType:
- return "map type"
- case *ast.Package:
- return "package"
- case *ast.ParenExpr:
- return "parenthesized " + NodeDescription(n.X)
- case *ast.RangeStmt:
- return "range loop"
- case *ast.ReturnStmt:
- return "return statement"
- case *ast.SelectStmt:
- return "select statement"
- case *ast.SelectorExpr:
- return "selector"
- case *ast.SendStmt:
- return "channel send"
- case *ast.SliceExpr:
- return "slice expression"
- case *ast.StarExpr:
- return "*-operation" // load/store expr or pointer type
- case *ast.StructType:
- return "struct type"
- case *ast.SwitchStmt:
- return "switch statement"
- case *ast.TypeAssertExpr:
- return "type assertion"
- case *ast.TypeSpec:
- return "type specification"
- case *ast.TypeSwitchStmt:
- return "type switch"
- case *ast.UnaryExpr:
- return fmt.Sprintf("unary %s operation", n.Op)
- case *ast.ValueSpec:
- return "value specification"
-
- }
- panic(fmt.Sprintf("unexpected node type: %T", n))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/imports.go
deleted file mode 100644
index 83f196cd5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/imports.go
+++ /dev/null
@@ -1,470 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package astutil contains common utilities for working with the Go AST.
-package astutil // import "golang.org/x/tools/go/ast/astutil"
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "strconv"
- "strings"
-)
-
-// AddImport adds the import path to the file f, if absent.
-func AddImport(fset *token.FileSet, f *ast.File, ipath string) (added bool) {
- return AddNamedImport(fset, f, "", ipath)
-}
-
-// AddNamedImport adds the import path to the file f, if absent.
-// If name is not empty, it is used to rename the import.
-//
-// For example, calling
-// AddNamedImport(fset, f, "pathpkg", "path")
-// adds
-// import pathpkg "path"
-func AddNamedImport(fset *token.FileSet, f *ast.File, name, ipath string) (added bool) {
- if imports(f, ipath) {
- return false
- }
-
- newImport := &ast.ImportSpec{
- Path: &ast.BasicLit{
- Kind: token.STRING,
- Value: strconv.Quote(ipath),
- },
- }
- if name != "" {
- newImport.Name = &ast.Ident{Name: name}
- }
-
- // Find an import decl to add to.
- // The goal is to find an existing import
- // whose import path has the longest shared
- // prefix with ipath.
- var (
- bestMatch = -1 // length of longest shared prefix
- lastImport = -1 // index in f.Decls of the file's final import decl
- impDecl *ast.GenDecl // import decl containing the best match
- impIndex = -1 // spec index in impDecl containing the best match
-
- isThirdPartyPath = isThirdParty(ipath)
- )
- for i, decl := range f.Decls {
- gen, ok := decl.(*ast.GenDecl)
- if ok && gen.Tok == token.IMPORT {
- lastImport = i
- // Do not add to import "C", to avoid disrupting the
- // association with its doc comment, breaking cgo.
- if declImports(gen, "C") {
- continue
- }
-
- // Match an empty import decl if that's all that is available.
- if len(gen.Specs) == 0 && bestMatch == -1 {
- impDecl = gen
- }
-
- // Compute longest shared prefix with imports in this group and find best
- // matched import spec.
- // 1. Always prefer import spec with longest shared prefix.
- // 2. While match length is 0,
- // - for stdlib package: prefer first import spec.
- // - for third party package: prefer first third party import spec.
- // We cannot use last import spec as best match for third party package
- // because grouped imports are usually placed last by goimports -local
- // flag.
- // See issue #19190.
- seenAnyThirdParty := false
- for j, spec := range gen.Specs {
- impspec := spec.(*ast.ImportSpec)
- p := importPath(impspec)
- n := matchLen(p, ipath)
- if n > bestMatch || (bestMatch == 0 && !seenAnyThirdParty && isThirdPartyPath) {
- bestMatch = n
- impDecl = gen
- impIndex = j
- }
- seenAnyThirdParty = seenAnyThirdParty || isThirdParty(p)
- }
- }
- }
-
- // If no import decl found, add one after the last import.
- if impDecl == nil {
- impDecl = &ast.GenDecl{
- Tok: token.IMPORT,
- }
- if lastImport >= 0 {
- impDecl.TokPos = f.Decls[lastImport].End()
- } else {
- // There are no existing imports.
- // Our new import goes after the package declaration and after
- // the comment, if any, that starts on the same line as the
- // package declaration.
- impDecl.TokPos = f.Package
-
- file := fset.File(f.Package)
- pkgLine := file.Line(f.Package)
- for _, c := range f.Comments {
- if file.Line(c.Pos()) > pkgLine {
- break
- }
- impDecl.TokPos = c.End()
- }
- }
- f.Decls = append(f.Decls, nil)
- copy(f.Decls[lastImport+2:], f.Decls[lastImport+1:])
- f.Decls[lastImport+1] = impDecl
- }
-
- // Insert new import at insertAt.
- insertAt := 0
- if impIndex >= 0 {
- // insert after the found import
- insertAt = impIndex + 1
- }
- impDecl.Specs = append(impDecl.Specs, nil)
- copy(impDecl.Specs[insertAt+1:], impDecl.Specs[insertAt:])
- impDecl.Specs[insertAt] = newImport
- pos := impDecl.Pos()
- if insertAt > 0 {
- // If there is a comment after an existing import, preserve the comment
- // position by adding the new import after the comment.
- if spec, ok := impDecl.Specs[insertAt-1].(*ast.ImportSpec); ok && spec.Comment != nil {
- pos = spec.Comment.End()
- } else {
- // Assign same position as the previous import,
- // so that the sorter sees it as being in the same block.
- pos = impDecl.Specs[insertAt-1].Pos()
- }
- }
- if newImport.Name != nil {
- newImport.Name.NamePos = pos
- }
- newImport.Path.ValuePos = pos
- newImport.EndPos = pos
-
- // Clean up parens. impDecl contains at least one spec.
- if len(impDecl.Specs) == 1 {
- // Remove unneeded parens.
- impDecl.Lparen = token.NoPos
- } else if !impDecl.Lparen.IsValid() {
- // impDecl needs parens added.
- impDecl.Lparen = impDecl.Specs[0].Pos()
- }
-
- f.Imports = append(f.Imports, newImport)
-
- if len(f.Decls) <= 1 {
- return true
- }
-
- // Merge all the import declarations into the first one.
- var first *ast.GenDecl
- for i := 0; i < len(f.Decls); i++ {
- decl := f.Decls[i]
- gen, ok := decl.(*ast.GenDecl)
- if !ok || gen.Tok != token.IMPORT || declImports(gen, "C") {
- continue
- }
- if first == nil {
- first = gen
- continue // Don't touch the first one.
- }
- // We now know there is more than one package in this import
- // declaration. Ensure that it ends up parenthesized.
- first.Lparen = first.Pos()
- // Move the imports of the other import declaration to the first one.
- for _, spec := range gen.Specs {
- spec.(*ast.ImportSpec).Path.ValuePos = first.Pos()
- first.Specs = append(first.Specs, spec)
- }
- f.Decls = append(f.Decls[:i], f.Decls[i+1:]...)
- i--
- }
-
- return true
-}
-
-func isThirdParty(importPath string) bool {
- // Third party package import path usually contains "." (".com", ".org", ...)
- // This logic is taken from golang.org/x/tools/imports package.
- return strings.Contains(importPath, ".")
-}
-
-// DeleteImport deletes the import path from the file f, if present.
-func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) {
- return DeleteNamedImport(fset, f, "", path)
-}
-
-// DeleteNamedImport deletes the import with the given name and path from the file f, if present.
-func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) {
- var delspecs []*ast.ImportSpec
- var delcomments []*ast.CommentGroup
-
- // Find the import nodes that import path, if any.
- for i := 0; i < len(f.Decls); i++ {
- decl := f.Decls[i]
- gen, ok := decl.(*ast.GenDecl)
- if !ok || gen.Tok != token.IMPORT {
- continue
- }
- for j := 0; j < len(gen.Specs); j++ {
- spec := gen.Specs[j]
- impspec := spec.(*ast.ImportSpec)
- if impspec.Name == nil && name != "" {
- continue
- }
- if impspec.Name != nil && impspec.Name.Name != name {
- continue
- }
- if importPath(impspec) != path {
- continue
- }
-
- // We found an import spec that imports path.
- // Delete it.
- delspecs = append(delspecs, impspec)
- deleted = true
- copy(gen.Specs[j:], gen.Specs[j+1:])
- gen.Specs = gen.Specs[:len(gen.Specs)-1]
-
- // If this was the last import spec in this decl,
- // delete the decl, too.
- if len(gen.Specs) == 0 {
- copy(f.Decls[i:], f.Decls[i+1:])
- f.Decls = f.Decls[:len(f.Decls)-1]
- i--
- break
- } else if len(gen.Specs) == 1 {
- if impspec.Doc != nil {
- delcomments = append(delcomments, impspec.Doc)
- }
- if impspec.Comment != nil {
- delcomments = append(delcomments, impspec.Comment)
- }
- for _, cg := range f.Comments {
- // Found comment on the same line as the import spec.
- if cg.End() < impspec.Pos() && fset.Position(cg.End()).Line == fset.Position(impspec.Pos()).Line {
- delcomments = append(delcomments, cg)
- break
- }
- }
-
- spec := gen.Specs[0].(*ast.ImportSpec)
-
- // Move the documentation right after the import decl.
- if spec.Doc != nil {
- for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Doc.Pos()).Line {
- fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line)
- }
- }
- for _, cg := range f.Comments {
- if cg.End() < spec.Pos() && fset.Position(cg.End()).Line == fset.Position(spec.Pos()).Line {
- for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Pos()).Line {
- fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line)
- }
- break
- }
- }
- }
- if j > 0 {
- lastImpspec := gen.Specs[j-1].(*ast.ImportSpec)
- lastLine := fset.Position(lastImpspec.Path.ValuePos).Line
- line := fset.Position(impspec.Path.ValuePos).Line
-
- // We deleted an entry but now there may be
- // a blank line-sized hole where the import was.
- if line-lastLine > 1 {
- // There was a blank line immediately preceding the deleted import,
- // so there's no need to close the hole.
- // Do nothing.
- } else if line != fset.File(gen.Rparen).LineCount() {
- // There was no blank line. Close the hole.
- fset.File(gen.Rparen).MergeLine(line)
- }
- }
- j--
- }
- }
-
- // Delete imports from f.Imports.
- for i := 0; i < len(f.Imports); i++ {
- imp := f.Imports[i]
- for j, del := range delspecs {
- if imp == del {
- copy(f.Imports[i:], f.Imports[i+1:])
- f.Imports = f.Imports[:len(f.Imports)-1]
- copy(delspecs[j:], delspecs[j+1:])
- delspecs = delspecs[:len(delspecs)-1]
- i--
- break
- }
- }
- }
-
- // Delete comments from f.Comments.
- for i := 0; i < len(f.Comments); i++ {
- cg := f.Comments[i]
- for j, del := range delcomments {
- if cg == del {
- copy(f.Comments[i:], f.Comments[i+1:])
- f.Comments = f.Comments[:len(f.Comments)-1]
- copy(delcomments[j:], delcomments[j+1:])
- delcomments = delcomments[:len(delcomments)-1]
- i--
- break
- }
- }
- }
-
- if len(delspecs) > 0 {
- panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs))
- }
-
- return
-}
-
-// RewriteImport rewrites any import of path oldPath to path newPath.
-func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (rewrote bool) {
- for _, imp := range f.Imports {
- if importPath(imp) == oldPath {
- rewrote = true
- // record old End, because the default is to compute
- // it using the length of imp.Path.Value.
- imp.EndPos = imp.End()
- imp.Path.Value = strconv.Quote(newPath)
- }
- }
- return
-}
-
-// UsesImport reports whether a given import is used.
-func UsesImport(f *ast.File, path string) (used bool) {
- spec := importSpec(f, path)
- if spec == nil {
- return
- }
-
- name := spec.Name.String()
- switch name {
- case "":
- // If the package name is not explicitly specified,
- // make an educated guess. This is not guaranteed to be correct.
- lastSlash := strings.LastIndex(path, "/")
- if lastSlash == -1 {
- name = path
- } else {
- name = path[lastSlash+1:]
- }
- case "_", ".":
- // Not sure if this import is used - err on the side of caution.
- return true
- }
-
- ast.Walk(visitFn(func(n ast.Node) {
- sel, ok := n.(*ast.SelectorExpr)
- if ok && isTopName(sel.X, name) {
- used = true
- }
- }), f)
-
- return
-}
-
-type visitFn func(node ast.Node)
-
-func (fn visitFn) Visit(node ast.Node) ast.Visitor {
- fn(node)
- return fn
-}
-
-// imports returns true if f imports path.
-func imports(f *ast.File, path string) bool {
- return importSpec(f, path) != nil
-}
-
-// importSpec returns the import spec if f imports path,
-// or nil otherwise.
-func importSpec(f *ast.File, path string) *ast.ImportSpec {
- for _, s := range f.Imports {
- if importPath(s) == path {
- return s
- }
- }
- return nil
-}
-
-// importPath returns the unquoted import path of s,
-// or "" if the path is not properly quoted.
-func importPath(s *ast.ImportSpec) string {
- t, err := strconv.Unquote(s.Path.Value)
- if err == nil {
- return t
- }
- return ""
-}
-
-// declImports reports whether gen contains an import of path.
-func declImports(gen *ast.GenDecl, path string) bool {
- if gen.Tok != token.IMPORT {
- return false
- }
- for _, spec := range gen.Specs {
- impspec := spec.(*ast.ImportSpec)
- if importPath(impspec) == path {
- return true
- }
- }
- return false
-}
-
-// matchLen returns the length of the longest path segment prefix shared by x and y.
-func matchLen(x, y string) int {
- n := 0
- for i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ {
- if x[i] == '/' {
- n++
- }
- }
- return n
-}
-
-// isTopName returns true if n is a top-level unresolved identifier with the given name.
-func isTopName(n ast.Expr, name string) bool {
- id, ok := n.(*ast.Ident)
- return ok && id.Name == name && id.Obj == nil
-}
-
-// Imports returns the file imports grouped by paragraph.
-func Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec {
- var groups [][]*ast.ImportSpec
-
- for _, decl := range f.Decls {
- genDecl, ok := decl.(*ast.GenDecl)
- if !ok || genDecl.Tok != token.IMPORT {
- break
- }
-
- group := []*ast.ImportSpec{}
-
- var lastLine int
- for _, spec := range genDecl.Specs {
- importSpec := spec.(*ast.ImportSpec)
- pos := importSpec.Path.ValuePos
- line := fset.Position(pos).Line
- if lastLine > 0 && pos > 0 && line-lastLine > 1 {
- groups = append(groups, group)
- group = []*ast.ImportSpec{}
- }
- group = append(group, importSpec)
- lastLine = line
- }
- groups = append(groups, group)
- }
-
- return groups
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/util.go
deleted file mode 100644
index 763062982..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ast/astutil/util.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package astutil
-
-import "go/ast"
-
-// Unparen returns e with any enclosing parentheses stripped.
-func Unparen(e ast.Expr) ast.Expr {
- for {
- p, ok := e.(*ast.ParenExpr)
- if !ok {
- return e
- }
- e = p.X
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/allpackages.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/allpackages.go
deleted file mode 100644
index c0cb03e7b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/allpackages.go
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package buildutil provides utilities related to the go/build
-// package in the standard library.
-//
-// All I/O is done via the build.Context file system interface, which must
-// be concurrency-safe.
-package buildutil // import "golang.org/x/tools/go/buildutil"
-
-import (
- "go/build"
- "os"
- "path/filepath"
- "sort"
- "strings"
- "sync"
-)
-
-// AllPackages returns the package path of each Go package in any source
-// directory of the specified build context (e.g. $GOROOT or an element
-// of $GOPATH). Errors are ignored. The results are sorted.
-// All package paths are canonical, and thus may contain "/vendor/".
-//
-// The result may include import paths for directories that contain no
-// *.go files, such as "archive" (in $GOROOT/src).
-//
-// All I/O is done via the build.Context file system interface,
-// which must be concurrency-safe.
-//
-func AllPackages(ctxt *build.Context) []string {
- var list []string
- ForEachPackage(ctxt, func(pkg string, _ error) {
- list = append(list, pkg)
- })
- sort.Strings(list)
- return list
-}
-
-// ForEachPackage calls the found function with the package path of
-// each Go package it finds in any source directory of the specified
-// build context (e.g. $GOROOT or an element of $GOPATH).
-// All package paths are canonical, and thus may contain "/vendor/".
-//
-// If the package directory exists but could not be read, the second
-// argument to the found function provides the error.
-//
-// All I/O is done via the build.Context file system interface,
-// which must be concurrency-safe.
-//
-func ForEachPackage(ctxt *build.Context, found func(importPath string, err error)) {
- ch := make(chan item)
-
- var wg sync.WaitGroup
- for _, root := range ctxt.SrcDirs() {
- root := root
- wg.Add(1)
- go func() {
- allPackages(ctxt, root, ch)
- wg.Done()
- }()
- }
- go func() {
- wg.Wait()
- close(ch)
- }()
-
- // All calls to found occur in the caller's goroutine.
- for i := range ch {
- found(i.importPath, i.err)
- }
-}
-
-type item struct {
- importPath string
- err error // (optional)
-}
-
-// We use a process-wide counting semaphore to limit
-// the number of parallel calls to ReadDir.
-var ioLimit = make(chan bool, 20)
-
-func allPackages(ctxt *build.Context, root string, ch chan<- item) {
- root = filepath.Clean(root) + string(os.PathSeparator)
-
- var wg sync.WaitGroup
-
- var walkDir func(dir string)
- walkDir = func(dir string) {
- // Avoid .foo, _foo, and testdata directory trees.
- base := filepath.Base(dir)
- if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" {
- return
- }
-
- pkg := filepath.ToSlash(strings.TrimPrefix(dir, root))
-
- // Prune search if we encounter any of these import paths.
- switch pkg {
- case "builtin":
- return
- }
-
- ioLimit <- true
- files, err := ReadDir(ctxt, dir)
- <-ioLimit
- if pkg != "" || err != nil {
- ch <- item{pkg, err}
- }
- for _, fi := range files {
- fi := fi
- if fi.IsDir() {
- wg.Add(1)
- go func() {
- walkDir(filepath.Join(dir, fi.Name()))
- wg.Done()
- }()
- }
- }
- }
-
- walkDir(root)
- wg.Wait()
-}
-
-// ExpandPatterns returns the set of packages matched by patterns,
-// which may have the following forms:
-//
-// golang.org/x/tools/cmd/guru # a single package
-// golang.org/x/tools/... # all packages beneath dir
-// ... # the entire workspace.
-//
-// Order is significant: a pattern preceded by '-' removes matching
-// packages from the set. For example, these patterns match all encoding
-// packages except encoding/xml:
-//
-// encoding/... -encoding/xml
-//
-// A trailing slash in a pattern is ignored. (Path components of Go
-// package names are separated by slash, not the platform's path separator.)
-//
-func ExpandPatterns(ctxt *build.Context, patterns []string) map[string]bool {
- // TODO(adonovan): support other features of 'go list':
- // - "std"/"cmd"/"all" meta-packages
- // - "..." not at the end of a pattern
- // - relative patterns using "./" or "../" prefix
-
- pkgs := make(map[string]bool)
- doPkg := func(pkg string, neg bool) {
- if neg {
- delete(pkgs, pkg)
- } else {
- pkgs[pkg] = true
- }
- }
-
- // Scan entire workspace if wildcards are present.
- // TODO(adonovan): opt: scan only the necessary subtrees of the workspace.
- var all []string
- for _, arg := range patterns {
- if strings.HasSuffix(arg, "...") {
- all = AllPackages(ctxt)
- break
- }
- }
-
- for _, arg := range patterns {
- if arg == "" {
- continue
- }
-
- neg := arg[0] == '-'
- if neg {
- arg = arg[1:]
- }
-
- if arg == "..." {
- // ... matches all packages
- for _, pkg := range all {
- doPkg(pkg, neg)
- }
- } else if dir := strings.TrimSuffix(arg, "/..."); dir != arg {
- // dir/... matches all packages beneath dir
- for _, pkg := range all {
- if strings.HasPrefix(pkg, dir) &&
- (len(pkg) == len(dir) || pkg[len(dir)] == '/') {
- doPkg(pkg, neg)
- }
- }
- } else {
- // single package
- doPkg(strings.TrimSuffix(arg, "/"), neg)
- }
- }
-
- return pkgs
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/fakecontext.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/fakecontext.go
deleted file mode 100644
index 24cbcbea2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/fakecontext.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package buildutil
-
-import (
- "fmt"
- "go/build"
- "io"
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
- "sort"
- "strings"
- "time"
-)
-
-// FakeContext returns a build.Context for the fake file tree specified
-// by pkgs, which maps package import paths to a mapping from file base
-// names to contents.
-//
-// The fake Context has a GOROOT of "/go" and no GOPATH, and overrides
-// the necessary file access methods to read from memory instead of the
-// real file system.
-//
-// Unlike a real file tree, the fake one has only two levels---packages
-// and files---so ReadDir("/go/src/") returns all packages under
-// /go/src/ including, for instance, "math" and "math/big".
-// ReadDir("/go/src/math/big") would return all the files in the
-// "math/big" package.
-//
-func FakeContext(pkgs map[string]map[string]string) *build.Context {
- clean := func(filename string) string {
- f := path.Clean(filepath.ToSlash(filename))
- // Removing "/go/src" while respecting segment
- // boundaries has this unfortunate corner case:
- if f == "/go/src" {
- return ""
- }
- return strings.TrimPrefix(f, "/go/src/")
- }
-
- ctxt := build.Default // copy
- ctxt.GOROOT = "/go"
- ctxt.GOPATH = ""
- ctxt.IsDir = func(dir string) bool {
- dir = clean(dir)
- if dir == "" {
- return true // needed by (*build.Context).SrcDirs
- }
- return pkgs[dir] != nil
- }
- ctxt.ReadDir = func(dir string) ([]os.FileInfo, error) {
- dir = clean(dir)
- var fis []os.FileInfo
- if dir == "" {
- // enumerate packages
- for importPath := range pkgs {
- fis = append(fis, fakeDirInfo(importPath))
- }
- } else {
- // enumerate files of package
- for basename := range pkgs[dir] {
- fis = append(fis, fakeFileInfo(basename))
- }
- }
- sort.Sort(byName(fis))
- return fis, nil
- }
- ctxt.OpenFile = func(filename string) (io.ReadCloser, error) {
- filename = clean(filename)
- dir, base := path.Split(filename)
- content, ok := pkgs[path.Clean(dir)][base]
- if !ok {
- return nil, fmt.Errorf("file not found: %s", filename)
- }
- return ioutil.NopCloser(strings.NewReader(content)), nil
- }
- ctxt.IsAbsPath = func(path string) bool {
- path = filepath.ToSlash(path)
- // Don't rely on the default (filepath.Path) since on
- // Windows, it reports virtual paths as non-absolute.
- return strings.HasPrefix(path, "/")
- }
- return &ctxt
-}
-
-type byName []os.FileInfo
-
-func (s byName) Len() int { return len(s) }
-func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() }
-
-type fakeFileInfo string
-
-func (fi fakeFileInfo) Name() string { return string(fi) }
-func (fakeFileInfo) Sys() interface{} { return nil }
-func (fakeFileInfo) ModTime() time.Time { return time.Time{} }
-func (fakeFileInfo) IsDir() bool { return false }
-func (fakeFileInfo) Size() int64 { return 0 }
-func (fakeFileInfo) Mode() os.FileMode { return 0644 }
-
-type fakeDirInfo string
-
-func (fd fakeDirInfo) Name() string { return string(fd) }
-func (fakeDirInfo) Sys() interface{} { return nil }
-func (fakeDirInfo) ModTime() time.Time { return time.Time{} }
-func (fakeDirInfo) IsDir() bool { return true }
-func (fakeDirInfo) Size() int64 { return 0 }
-func (fakeDirInfo) Mode() os.FileMode { return 0755 }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/overlay.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/overlay.go
deleted file mode 100644
index 3f71c4fef..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/overlay.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/build"
- "io"
- "io/ioutil"
- "path/filepath"
- "strconv"
- "strings"
-)
-
-// OverlayContext overlays a build.Context with additional files from
-// a map. Files in the map take precedence over other files.
-//
-// In addition to plain string comparison, two file names are
-// considered equal if their base names match and their directory
-// components point at the same directory on the file system. That is,
-// symbolic links are followed for directories, but not files.
-//
-// A common use case for OverlayContext is to allow editors to pass in
-// a set of unsaved, modified files.
-//
-// Currently, only the Context.OpenFile function will respect the
-// overlay. This may change in the future.
-func OverlayContext(orig *build.Context, overlay map[string][]byte) *build.Context {
- // TODO(dominikh): Implement IsDir, HasSubdir and ReadDir
-
- rc := func(data []byte) (io.ReadCloser, error) {
- return ioutil.NopCloser(bytes.NewBuffer(data)), nil
- }
-
- copy := *orig // make a copy
- ctxt := ©
- ctxt.OpenFile = func(path string) (io.ReadCloser, error) {
- // Fast path: names match exactly.
- if content, ok := overlay[path]; ok {
- return rc(content)
- }
-
- // Slow path: check for same file under a different
- // alias, perhaps due to a symbolic link.
- for filename, content := range overlay {
- if sameFile(path, filename) {
- return rc(content)
- }
- }
-
- return OpenFile(orig, path)
- }
- return ctxt
-}
-
-// ParseOverlayArchive parses an archive containing Go files and their
-// contents. The result is intended to be used with OverlayContext.
-//
-//
-// Archive format
-//
-// The archive consists of a series of files. Each file consists of a
-// name, a decimal file size and the file contents, separated by
-// newlinews. No newline follows after the file contents.
-func ParseOverlayArchive(archive io.Reader) (map[string][]byte, error) {
- overlay := make(map[string][]byte)
- r := bufio.NewReader(archive)
- for {
- // Read file name.
- filename, err := r.ReadString('\n')
- if err != nil {
- if err == io.EOF {
- break // OK
- }
- return nil, fmt.Errorf("reading archive file name: %v", err)
- }
- filename = filepath.Clean(strings.TrimSpace(filename))
-
- // Read file size.
- sz, err := r.ReadString('\n')
- if err != nil {
- return nil, fmt.Errorf("reading size of archive file %s: %v", filename, err)
- }
- sz = strings.TrimSpace(sz)
- size, err := strconv.ParseUint(sz, 10, 32)
- if err != nil {
- return nil, fmt.Errorf("parsing size of archive file %s: %v", filename, err)
- }
-
- // Read file content.
- content := make([]byte, size)
- if _, err := io.ReadFull(r, content); err != nil {
- return nil, fmt.Errorf("reading archive file %s: %v", filename, err)
- }
- overlay[filename] = content
- }
-
- return overlay, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/tags.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/tags.go
deleted file mode 100644
index 486606f37..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/tags.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package buildutil
-
-// This logic was copied from stringsFlag from $GOROOT/src/cmd/go/build.go.
-
-import "fmt"
-
-const TagsFlagDoc = "a list of `build tags` to consider satisfied during the build. " +
- "For more information about build tags, see the description of " +
- "build constraints in the documentation for the go/build package"
-
-// TagsFlag is an implementation of the flag.Value and flag.Getter interfaces that parses
-// a flag value in the same manner as go build's -tags flag and
-// populates a []string slice.
-//
-// See $GOROOT/src/go/build/doc.go for description of build tags.
-// See $GOROOT/src/cmd/go/doc.go for description of 'go build -tags' flag.
-//
-// Example:
-// flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
-type TagsFlag []string
-
-func (v *TagsFlag) Set(s string) error {
- var err error
- *v, err = splitQuotedFields(s)
- if *v == nil {
- *v = []string{}
- }
- return err
-}
-
-func (v *TagsFlag) Get() interface{} { return *v }
-
-func splitQuotedFields(s string) ([]string, error) {
- // Split fields allowing '' or "" around elements.
- // Quotes further inside the string do not count.
- var f []string
- for len(s) > 0 {
- for len(s) > 0 && isSpaceByte(s[0]) {
- s = s[1:]
- }
- if len(s) == 0 {
- break
- }
- // Accepted quoted string. No unescaping inside.
- if s[0] == '"' || s[0] == '\'' {
- quote := s[0]
- s = s[1:]
- i := 0
- for i < len(s) && s[i] != quote {
- i++
- }
- if i >= len(s) {
- return nil, fmt.Errorf("unterminated %c string", quote)
- }
- f = append(f, s[:i])
- s = s[i+1:]
- continue
- }
- i := 0
- for i < len(s) && !isSpaceByte(s[i]) {
- i++
- }
- f = append(f, s[:i])
- s = s[i:]
- }
- return f, nil
-}
-
-func (v *TagsFlag) String() string {
- return ""
-}
-
-func isSpaceByte(c byte) bool {
- return c == ' ' || c == '\t' || c == '\n' || c == '\r'
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/util.go
deleted file mode 100644
index fc923d7a7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/buildutil/util.go
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "io"
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
- "strings"
-)
-
-// ParseFile behaves like parser.ParseFile,
-// but uses the build context's file system interface, if any.
-//
-// If file is not absolute (as defined by IsAbsPath), the (dir, file)
-// components are joined using JoinPath; dir must be absolute.
-//
-// The displayPath function, if provided, is used to transform the
-// filename that will be attached to the ASTs.
-//
-// TODO(adonovan): call this from go/loader.parseFiles when the tree thaws.
-//
-func ParseFile(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, file string, mode parser.Mode) (*ast.File, error) {
- if !IsAbsPath(ctxt, file) {
- file = JoinPath(ctxt, dir, file)
- }
- rd, err := OpenFile(ctxt, file)
- if err != nil {
- return nil, err
- }
- defer rd.Close() // ignore error
- if displayPath != nil {
- file = displayPath(file)
- }
- return parser.ParseFile(fset, file, rd, mode)
-}
-
-// ContainingPackage returns the package containing filename.
-//
-// If filename is not absolute, it is interpreted relative to working directory dir.
-// All I/O is via the build context's file system interface, if any.
-//
-// The '...Files []string' fields of the resulting build.Package are not
-// populated (build.FindOnly mode).
-//
-func ContainingPackage(ctxt *build.Context, dir, filename string) (*build.Package, error) {
- if !IsAbsPath(ctxt, filename) {
- filename = JoinPath(ctxt, dir, filename)
- }
-
- // We must not assume the file tree uses
- // "/" always,
- // `\` always,
- // or os.PathSeparator (which varies by platform),
- // but to make any progress, we are forced to assume that
- // paths will not use `\` unless the PathSeparator
- // is also `\`, thus we can rely on filepath.ToSlash for some sanity.
-
- dirSlash := path.Dir(filepath.ToSlash(filename)) + "/"
-
- // We assume that no source root (GOPATH[i] or GOROOT) contains any other.
- for _, srcdir := range ctxt.SrcDirs() {
- srcdirSlash := filepath.ToSlash(srcdir) + "/"
- if importPath, ok := HasSubdir(ctxt, srcdirSlash, dirSlash); ok {
- return ctxt.Import(importPath, dir, build.FindOnly)
- }
- }
-
- return nil, fmt.Errorf("can't find package containing %s", filename)
-}
-
-// -- Effective methods of file system interface -------------------------
-
-// (go/build.Context defines these as methods, but does not export them.)
-
-// hasSubdir calls ctxt.HasSubdir (if not nil) or else uses
-// the local file system to answer the question.
-func HasSubdir(ctxt *build.Context, root, dir string) (rel string, ok bool) {
- if f := ctxt.HasSubdir; f != nil {
- return f(root, dir)
- }
-
- // Try using paths we received.
- if rel, ok = hasSubdir(root, dir); ok {
- return
- }
-
- // Try expanding symlinks and comparing
- // expanded against unexpanded and
- // expanded against expanded.
- rootSym, _ := filepath.EvalSymlinks(root)
- dirSym, _ := filepath.EvalSymlinks(dir)
-
- if rel, ok = hasSubdir(rootSym, dir); ok {
- return
- }
- if rel, ok = hasSubdir(root, dirSym); ok {
- return
- }
- return hasSubdir(rootSym, dirSym)
-}
-
-func hasSubdir(root, dir string) (rel string, ok bool) {
- const sep = string(filepath.Separator)
- root = filepath.Clean(root)
- if !strings.HasSuffix(root, sep) {
- root += sep
- }
-
- dir = filepath.Clean(dir)
- if !strings.HasPrefix(dir, root) {
- return "", false
- }
-
- return filepath.ToSlash(dir[len(root):]), true
-}
-
-// FileExists returns true if the specified file exists,
-// using the build context's file system interface.
-func FileExists(ctxt *build.Context, path string) bool {
- if ctxt.OpenFile != nil {
- r, err := ctxt.OpenFile(path)
- if err != nil {
- return false
- }
- r.Close() // ignore error
- return true
- }
- _, err := os.Stat(path)
- return err == nil
-}
-
-// OpenFile behaves like os.Open,
-// but uses the build context's file system interface, if any.
-func OpenFile(ctxt *build.Context, path string) (io.ReadCloser, error) {
- if ctxt.OpenFile != nil {
- return ctxt.OpenFile(path)
- }
- return os.Open(path)
-}
-
-// IsAbsPath behaves like filepath.IsAbs,
-// but uses the build context's file system interface, if any.
-func IsAbsPath(ctxt *build.Context, path string) bool {
- if ctxt.IsAbsPath != nil {
- return ctxt.IsAbsPath(path)
- }
- return filepath.IsAbs(path)
-}
-
-// JoinPath behaves like filepath.Join,
-// but uses the build context's file system interface, if any.
-func JoinPath(ctxt *build.Context, path ...string) string {
- if ctxt.JoinPath != nil {
- return ctxt.JoinPath(path...)
- }
- return filepath.Join(path...)
-}
-
-// IsDir behaves like os.Stat plus IsDir,
-// but uses the build context's file system interface, if any.
-func IsDir(ctxt *build.Context, path string) bool {
- if ctxt.IsDir != nil {
- return ctxt.IsDir(path)
- }
- fi, err := os.Stat(path)
- return err == nil && fi.IsDir()
-}
-
-// ReadDir behaves like ioutil.ReadDir,
-// but uses the build context's file system interface, if any.
-func ReadDir(ctxt *build.Context, path string) ([]os.FileInfo, error) {
- if ctxt.ReadDir != nil {
- return ctxt.ReadDir(path)
- }
- return ioutil.ReadDir(path)
-}
-
-// SplitPathList behaves like filepath.SplitList,
-// but uses the build context's file system interface, if any.
-func SplitPathList(ctxt *build.Context, s string) []string {
- if ctxt.SplitPathList != nil {
- return ctxt.SplitPathList(s)
- }
- return filepath.SplitList(s)
-}
-
-// sameFile returns true if x and y have the same basename and denote
-// the same file.
-//
-func sameFile(x, y string) bool {
- if path.Clean(x) == path.Clean(y) {
- return true
- }
- if filepath.Base(x) == filepath.Base(y) { // (optimisation)
- if xi, err := os.Stat(x); err == nil {
- if yi, err := os.Stat(y); err == nil {
- return os.SameFile(xi, yi)
- }
- }
- }
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/callgraph.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/callgraph.go
deleted file mode 100644
index 707a31931..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/callgraph.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Package callgraph defines the call graph and various algorithms
-and utilities to operate on it.
-
-A call graph is a labelled directed graph whose nodes represent
-functions and whose edge labels represent syntactic function call
-sites. The presence of a labelled edge (caller, site, callee)
-indicates that caller may call callee at the specified call site.
-
-A call graph is a multigraph: it may contain multiple edges (caller,
-*, callee) connecting the same pair of nodes, so long as the edges
-differ by label; this occurs when one function calls another function
-from multiple call sites. Also, it may contain multiple edges
-(caller, site, *) that differ only by callee; this indicates a
-polymorphic call.
-
-A SOUND call graph is one that overapproximates the dynamic calling
-behaviors of the program in all possible executions. One call graph
-is more PRECISE than another if it is a smaller overapproximation of
-the dynamic behavior.
-
-All call graphs have a synthetic root node which is responsible for
-calling main() and init().
-
-Calls to built-in functions (e.g. panic, println) are not represented
-in the call graph; they are treated like built-in operators of the
-language.
-
-*/
-package callgraph // import "golang.org/x/tools/go/callgraph"
-
-// TODO(adonovan): add a function to eliminate wrappers from the
-// callgraph, preserving topology.
-// More generally, we could eliminate "uninteresting" nodes such as
-// nodes from packages we don't care about.
-
-import (
- "fmt"
- "go/token"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// A Graph represents a call graph.
-//
-// A graph may contain nodes that are not reachable from the root.
-// If the call graph is sound, such nodes indicate unreachable
-// functions.
-//
-type Graph struct {
- Root *Node // the distinguished root node
- Nodes map[*ssa.Function]*Node // all nodes by function
-}
-
-// New returns a new Graph with the specified root node.
-func New(root *ssa.Function) *Graph {
- g := &Graph{Nodes: make(map[*ssa.Function]*Node)}
- g.Root = g.CreateNode(root)
- return g
-}
-
-// CreateNode returns the Node for fn, creating it if not present.
-func (g *Graph) CreateNode(fn *ssa.Function) *Node {
- n, ok := g.Nodes[fn]
- if !ok {
- n = &Node{Func: fn, ID: len(g.Nodes)}
- g.Nodes[fn] = n
- }
- return n
-}
-
-// A Node represents a node in a call graph.
-type Node struct {
- Func *ssa.Function // the function this node represents
- ID int // 0-based sequence number
- In []*Edge // unordered set of incoming call edges (n.In[*].Callee == n)
- Out []*Edge // unordered set of outgoing call edges (n.Out[*].Caller == n)
-}
-
-func (n *Node) String() string {
- return fmt.Sprintf("n%d:%s", n.ID, n.Func)
-}
-
-// A Edge represents an edge in the call graph.
-//
-// Site is nil for edges originating in synthetic or intrinsic
-// functions, e.g. reflect.Call or the root of the call graph.
-type Edge struct {
- Caller *Node
- Site ssa.CallInstruction
- Callee *Node
-}
-
-func (e Edge) String() string {
- return fmt.Sprintf("%s --> %s", e.Caller, e.Callee)
-}
-
-func (e Edge) Description() string {
- var prefix string
- switch e.Site.(type) {
- case nil:
- return "synthetic call"
- case *ssa.Go:
- prefix = "concurrent "
- case *ssa.Defer:
- prefix = "deferred "
- }
- return prefix + e.Site.Common().Description()
-}
-
-func (e Edge) Pos() token.Pos {
- if e.Site == nil {
- return token.NoPos
- }
- return e.Site.Pos()
-}
-
-// AddEdge adds the edge (caller, site, callee) to the call graph.
-// Elimination of duplicate edges is the caller's responsibility.
-func AddEdge(caller *Node, site ssa.CallInstruction, callee *Node) {
- e := &Edge{caller, site, callee}
- callee.In = append(callee.In, e)
- caller.Out = append(caller.Out, e)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/cha/cha.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/cha/cha.go
deleted file mode 100644
index 68ffffebd..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/cha/cha.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package cha computes the call graph of a Go program using the Class
-// Hierarchy Analysis (CHA) algorithm.
-//
-// CHA was first described in "Optimization of Object-Oriented Programs
-// Using Static Class Hierarchy Analysis", Jeffrey Dean, David Grove,
-// and Craig Chambers, ECOOP'95.
-//
-// CHA is related to RTA (see go/callgraph/rta); the difference is that
-// CHA conservatively computes the entire "implements" relation between
-// interfaces and concrete types ahead of time, whereas RTA uses dynamic
-// programming to construct it on the fly as it encounters new functions
-// reachable from main. CHA may thus include spurious call edges for
-// types that haven't been instantiated yet, or types that are never
-// instantiated.
-//
-// Since CHA conservatively assumes that all functions are address-taken
-// and all concrete types are put into interfaces, it is sound to run on
-// partial programs, such as libraries without a main or test function.
-//
-package cha // import "golang.org/x/tools/go/callgraph/cha"
-
-import (
- "go/types"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// CallGraph computes the call graph of the specified program using the
-// Class Hierarchy Analysis algorithm.
-//
-func CallGraph(prog *ssa.Program) *callgraph.Graph {
- cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
-
- allFuncs := ssautil.AllFunctions(prog)
-
- // funcsBySig contains all functions, keyed by signature. It is
- // the effective set of address-taken functions used to resolve
- // a dynamic call of a particular signature.
- var funcsBySig typeutil.Map // value is []*ssa.Function
-
- // methodsByName contains all methods,
- // grouped by name for efficient lookup.
- methodsByName := make(map[string][]*ssa.Function)
-
- // methodsMemo records, for every abstract method call call I.f on
- // interface type I, the set of concrete methods C.f of all
- // types C that satisfy interface I.
- methodsMemo := make(map[*types.Func][]*ssa.Function)
- lookupMethods := func(m *types.Func) []*ssa.Function {
- methods, ok := methodsMemo[m]
- if !ok {
- I := m.Type().(*types.Signature).Recv().Type().Underlying().(*types.Interface)
- for _, f := range methodsByName[m.Name()] {
- C := f.Signature.Recv().Type() // named or *named
- if types.Implements(C, I) {
- methods = append(methods, f)
- }
- }
- methodsMemo[m] = methods
- }
- return methods
- }
-
- for f := range allFuncs {
- if f.Signature.Recv() == nil {
- // Package initializers can never be address-taken.
- if f.Name() == "init" && f.Synthetic == "package initializer" {
- continue
- }
- funcs, _ := funcsBySig.At(f.Signature).([]*ssa.Function)
- funcs = append(funcs, f)
- funcsBySig.Set(f.Signature, funcs)
- } else {
- methodsByName[f.Name()] = append(methodsByName[f.Name()], f)
- }
- }
-
- addEdge := func(fnode *callgraph.Node, site ssa.CallInstruction, g *ssa.Function) {
- gnode := cg.CreateNode(g)
- callgraph.AddEdge(fnode, site, gnode)
- }
-
- addEdges := func(fnode *callgraph.Node, site ssa.CallInstruction, callees []*ssa.Function) {
- // Because every call to a highly polymorphic and
- // frequently used abstract method such as
- // (io.Writer).Write is assumed to call every concrete
- // Write method in the program, the call graph can
- // contain a lot of duplication.
- //
- // TODO(adonovan): opt: consider factoring the callgraph
- // API so that the Callers component of each edge is a
- // slice of nodes, not a singleton.
- for _, g := range callees {
- addEdge(fnode, site, g)
- }
- }
-
- for f := range allFuncs {
- fnode := cg.CreateNode(f)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if site, ok := instr.(ssa.CallInstruction); ok {
- call := site.Common()
- if call.IsInvoke() {
- addEdges(fnode, site, lookupMethods(call.Method))
- } else if g := call.StaticCallee(); g != nil {
- addEdge(fnode, site, g)
- } else if _, ok := call.Value.(*ssa.Builtin); !ok {
- callees, _ := funcsBySig.At(call.Signature()).([]*ssa.Function)
- addEdges(fnode, site, callees)
- }
- }
- }
- }
- }
-
- return cg
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/rta/rta.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/rta/rta.go
deleted file mode 100644
index 1a2dadf57..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/rta/rta.go
+++ /dev/null
@@ -1,459 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This package provides Rapid Type Analysis (RTA) for Go, a fast
-// algorithm for call graph construction and discovery of reachable code
-// (and hence dead code) and runtime types. The algorithm was first
-// described in:
-//
-// David F. Bacon and Peter F. Sweeney. 1996.
-// Fast static analysis of C++ virtual function calls. (OOPSLA '96)
-// http://doi.acm.org/10.1145/236337.236371
-//
-// The algorithm uses dynamic programming to tabulate the cross-product
-// of the set of known "address taken" functions with the set of known
-// dynamic calls of the same type. As each new address-taken function
-// is discovered, call graph edges are added from each known callsite,
-// and as each new call site is discovered, call graph edges are added
-// from it to each known address-taken function.
-//
-// A similar approach is used for dynamic calls via interfaces: it
-// tabulates the cross-product of the set of known "runtime types",
-// i.e. types that may appear in an interface value, or be derived from
-// one via reflection, with the set of known "invoke"-mode dynamic
-// calls. As each new "runtime type" is discovered, call edges are
-// added from the known call sites, and as each new call site is
-// discovered, call graph edges are added to each compatible
-// method.
-//
-// In addition, we must consider all exported methods of any runtime type
-// as reachable, since they may be called via reflection.
-//
-// Each time a newly added call edge causes a new function to become
-// reachable, the code of that function is analyzed for more call sites,
-// address-taken functions, and runtime types. The process continues
-// until a fixed point is achieved.
-//
-// The resulting call graph is less precise than one produced by pointer
-// analysis, but the algorithm is much faster. For example, running the
-// cmd/callgraph tool on its own source takes ~2.1s for RTA and ~5.4s
-// for points-to analysis.
-//
-package rta // import "golang.org/x/tools/go/callgraph/rta"
-
-// TODO(adonovan): test it by connecting it to the interpreter and
-// replacing all "unreachable" functions by a special intrinsic, and
-// ensure that that intrinsic is never called.
-
-import (
- "fmt"
- "go/types"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// A Result holds the results of Rapid Type Analysis, which includes the
-// set of reachable functions/methods, runtime types, and the call graph.
-//
-type Result struct {
- // CallGraph is the discovered callgraph.
- // It does not include edges for calls made via reflection.
- CallGraph *callgraph.Graph
-
- // Reachable contains the set of reachable functions and methods.
- // This includes exported methods of runtime types, since
- // they may be accessed via reflection.
- // The value indicates whether the function is address-taken.
- //
- // (We wrap the bool in a struct to avoid inadvertent use of
- // "if Reachable[f] {" to test for set membership.)
- Reachable map[*ssa.Function]struct{ AddrTaken bool }
-
- // RuntimeTypes contains the set of types that are needed at
- // runtime, for interfaces or reflection.
- //
- // The value indicates whether the type is inaccessible to reflection.
- // Consider:
- // type A struct{B}
- // fmt.Println(new(A))
- // Types *A, A and B are accessible to reflection, but the unnamed
- // type struct{B} is not.
- RuntimeTypes typeutil.Map
-}
-
-// Working state of the RTA algorithm.
-type rta struct {
- result *Result
-
- prog *ssa.Program
-
- worklist []*ssa.Function // list of functions to visit
-
- // addrTakenFuncsBySig contains all address-taken *Functions, grouped by signature.
- // Keys are *types.Signature, values are map[*ssa.Function]bool sets.
- addrTakenFuncsBySig typeutil.Map
-
- // dynCallSites contains all dynamic "call"-mode call sites, grouped by signature.
- // Keys are *types.Signature, values are unordered []ssa.CallInstruction.
- dynCallSites typeutil.Map
-
- // invokeSites contains all "invoke"-mode call sites, grouped by interface.
- // Keys are *types.Interface (never *types.Named),
- // Values are unordered []ssa.CallInstruction sets.
- invokeSites typeutil.Map
-
- // The following two maps together define the subset of the
- // m:n "implements" relation needed by the algorithm.
-
- // concreteTypes maps each concrete type to the set of interfaces that it implements.
- // Keys are types.Type, values are unordered []*types.Interface.
- // Only concrete types used as MakeInterface operands are included.
- concreteTypes typeutil.Map
-
- // interfaceTypes maps each interface type to
- // the set of concrete types that implement it.
- // Keys are *types.Interface, values are unordered []types.Type.
- // Only interfaces used in "invoke"-mode CallInstructions are included.
- interfaceTypes typeutil.Map
-}
-
-// addReachable marks a function as potentially callable at run-time,
-// and ensures that it gets processed.
-func (r *rta) addReachable(f *ssa.Function, addrTaken bool) {
- reachable := r.result.Reachable
- n := len(reachable)
- v := reachable[f]
- if addrTaken {
- v.AddrTaken = true
- }
- reachable[f] = v
- if len(reachable) > n {
- // First time seeing f. Add it to the worklist.
- r.worklist = append(r.worklist, f)
- }
-}
-
-// addEdge adds the specified call graph edge, and marks it reachable.
-// addrTaken indicates whether to mark the callee as "address-taken".
-func (r *rta) addEdge(site ssa.CallInstruction, callee *ssa.Function, addrTaken bool) {
- r.addReachable(callee, addrTaken)
-
- if g := r.result.CallGraph; g != nil {
- if site.Parent() == nil {
- panic(site)
- }
- from := g.CreateNode(site.Parent())
- to := g.CreateNode(callee)
- callgraph.AddEdge(from, site, to)
- }
-}
-
-// ---------- addrTakenFuncs × dynCallSites ----------
-
-// visitAddrTakenFunc is called each time we encounter an address-taken function f.
-func (r *rta) visitAddrTakenFunc(f *ssa.Function) {
- // Create two-level map (Signature -> Function -> bool).
- S := f.Signature
- funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool)
- if funcs == nil {
- funcs = make(map[*ssa.Function]bool)
- r.addrTakenFuncsBySig.Set(S, funcs)
- }
- if !funcs[f] {
- // First time seeing f.
- funcs[f] = true
-
- // If we've seen any dyncalls of this type, mark it reachable,
- // and add call graph edges.
- sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction)
- for _, site := range sites {
- r.addEdge(site, f, true)
- }
- }
-}
-
-// visitDynCall is called each time we encounter a dynamic "call"-mode call.
-func (r *rta) visitDynCall(site ssa.CallInstruction) {
- S := site.Common().Signature()
-
- // Record the call site.
- sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction)
- r.dynCallSites.Set(S, append(sites, site))
-
- // For each function of signature S that we know is address-taken,
- // mark it reachable. We'll add the callgraph edges later.
- funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool)
- for g := range funcs {
- r.addEdge(site, g, true)
- }
-}
-
-// ---------- concrete types × invoke sites ----------
-
-// addInvokeEdge is called for each new pair (site, C) in the matrix.
-func (r *rta) addInvokeEdge(site ssa.CallInstruction, C types.Type) {
- // Ascertain the concrete method of C to be called.
- imethod := site.Common().Method
- cmethod := r.prog.MethodValue(r.prog.MethodSets.MethodSet(C).Lookup(imethod.Pkg(), imethod.Name()))
- r.addEdge(site, cmethod, true)
-}
-
-// visitInvoke is called each time the algorithm encounters an "invoke"-mode call.
-func (r *rta) visitInvoke(site ssa.CallInstruction) {
- I := site.Common().Value.Type().Underlying().(*types.Interface)
-
- // Record the invoke site.
- sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction)
- r.invokeSites.Set(I, append(sites, site))
-
- // Add callgraph edge for each existing
- // address-taken concrete type implementing I.
- for _, C := range r.implementations(I) {
- r.addInvokeEdge(site, C)
- }
-}
-
-// ---------- main algorithm ----------
-
-// visitFunc processes function f.
-func (r *rta) visitFunc(f *ssa.Function) {
- var space [32]*ssa.Value // preallocate space for common case
-
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- rands := instr.Operands(space[:0])
-
- switch instr := instr.(type) {
- case ssa.CallInstruction:
- call := instr.Common()
- if call.IsInvoke() {
- r.visitInvoke(instr)
- } else if g := call.StaticCallee(); g != nil {
- r.addEdge(instr, g, false)
- } else if _, ok := call.Value.(*ssa.Builtin); !ok {
- r.visitDynCall(instr)
- }
-
- // Ignore the call-position operand when
- // looking for address-taken Functions.
- // Hack: assume this is rands[0].
- rands = rands[1:]
-
- case *ssa.MakeInterface:
- r.addRuntimeType(instr.X.Type(), false)
- }
-
- // Process all address-taken functions.
- for _, op := range rands {
- if g, ok := (*op).(*ssa.Function); ok {
- r.visitAddrTakenFunc(g)
- }
- }
- }
- }
-}
-
-// Analyze performs Rapid Type Analysis, starting at the specified root
-// functions. It returns nil if no roots were specified.
-//
-// If buildCallGraph is true, Result.CallGraph will contain a call
-// graph; otherwise, only the other fields (reachable functions) are
-// populated.
-//
-func Analyze(roots []*ssa.Function, buildCallGraph bool) *Result {
- if len(roots) == 0 {
- return nil
- }
-
- r := &rta{
- result: &Result{Reachable: make(map[*ssa.Function]struct{ AddrTaken bool })},
- prog: roots[0].Prog,
- }
-
- if buildCallGraph {
- // TODO(adonovan): change callgraph API to eliminate the
- // notion of a distinguished root node. Some callgraphs
- // have many roots, or none.
- r.result.CallGraph = callgraph.New(roots[0])
- }
-
- hasher := typeutil.MakeHasher()
- r.result.RuntimeTypes.SetHasher(hasher)
- r.addrTakenFuncsBySig.SetHasher(hasher)
- r.dynCallSites.SetHasher(hasher)
- r.invokeSites.SetHasher(hasher)
- r.concreteTypes.SetHasher(hasher)
- r.interfaceTypes.SetHasher(hasher)
-
- // Visit functions, processing their instructions, and adding
- // new functions to the worklist, until a fixed point is
- // reached.
- var shadow []*ssa.Function // for efficiency, we double-buffer the worklist
- r.worklist = append(r.worklist, roots...)
- for len(r.worklist) > 0 {
- shadow, r.worklist = r.worklist, shadow[:0]
- for _, f := range shadow {
- r.visitFunc(f)
- }
- }
- return r.result
-}
-
-// interfaces(C) returns all currently known interfaces implemented by C.
-func (r *rta) interfaces(C types.Type) []*types.Interface {
- // Ascertain set of interfaces C implements
- // and update 'implements' relation.
- var ifaces []*types.Interface
- r.interfaceTypes.Iterate(func(I types.Type, concs interface{}) {
- if I := I.(*types.Interface); types.Implements(C, I) {
- concs, _ := concs.([]types.Type)
- r.interfaceTypes.Set(I, append(concs, C))
- ifaces = append(ifaces, I)
- }
- })
- r.concreteTypes.Set(C, ifaces)
- return ifaces
-}
-
-// implementations(I) returns all currently known concrete types that implement I.
-func (r *rta) implementations(I *types.Interface) []types.Type {
- var concs []types.Type
- if v := r.interfaceTypes.At(I); v != nil {
- concs = v.([]types.Type)
- } else {
- // First time seeing this interface.
- // Update the 'implements' relation.
- r.concreteTypes.Iterate(func(C types.Type, ifaces interface{}) {
- if types.Implements(C, I) {
- ifaces, _ := ifaces.([]*types.Interface)
- r.concreteTypes.Set(C, append(ifaces, I))
- concs = append(concs, C)
- }
- })
- r.interfaceTypes.Set(I, concs)
- }
- return concs
-}
-
-// addRuntimeType is called for each concrete type that can be the
-// dynamic type of some interface or reflect.Value.
-// Adapted from needMethods in go/ssa/builder.go
-//
-func (r *rta) addRuntimeType(T types.Type, skip bool) {
- if prev, ok := r.result.RuntimeTypes.At(T).(bool); ok {
- if skip && !prev {
- r.result.RuntimeTypes.Set(T, skip)
- }
- return
- }
- r.result.RuntimeTypes.Set(T, skip)
-
- mset := r.prog.MethodSets.MethodSet(T)
-
- if _, ok := T.Underlying().(*types.Interface); !ok {
- // T is a new concrete type.
- for i, n := 0, mset.Len(); i < n; i++ {
- sel := mset.At(i)
- m := sel.Obj()
-
- if m.Exported() {
- // Exported methods are always potentially callable via reflection.
- r.addReachable(r.prog.MethodValue(sel), true)
- }
- }
-
- // Add callgraph edge for each existing dynamic
- // "invoke"-mode call via that interface.
- for _, I := range r.interfaces(T) {
- sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction)
- for _, site := range sites {
- r.addInvokeEdge(site, T)
- }
- }
- }
-
- // Precondition: T is not a method signature (*Signature with Recv()!=nil).
- // Recursive case: skip => don't call makeMethods(T).
- // Each package maintains its own set of types it has visited.
-
- var n *types.Named
- switch T := T.(type) {
- case *types.Named:
- n = T
- case *types.Pointer:
- n, _ = T.Elem().(*types.Named)
- }
- if n != nil {
- owner := n.Obj().Pkg()
- if owner == nil {
- return // built-in error type
- }
- }
-
- // Recursion over signatures of each exported method.
- for i := 0; i < mset.Len(); i++ {
- if mset.At(i).Obj().Exported() {
- sig := mset.At(i).Type().(*types.Signature)
- r.addRuntimeType(sig.Params(), true) // skip the Tuple itself
- r.addRuntimeType(sig.Results(), true) // skip the Tuple itself
- }
- }
-
- switch t := T.(type) {
- case *types.Basic:
- // nop
-
- case *types.Interface:
- // nop---handled by recursion over method set.
-
- case *types.Pointer:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Slice:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Chan:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Map:
- r.addRuntimeType(t.Key(), false)
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Signature:
- if t.Recv() != nil {
- panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
- }
- r.addRuntimeType(t.Params(), true) // skip the Tuple itself
- r.addRuntimeType(t.Results(), true) // skip the Tuple itself
-
- case *types.Named:
- // A pointer-to-named type can be derived from a named
- // type via reflection. It may have methods too.
- r.addRuntimeType(types.NewPointer(T), false)
-
- // Consider 'type T struct{S}' where S has methods.
- // Reflection provides no way to get from T to struct{S},
- // only to S, so the method set of struct{S} is unwanted,
- // so set 'skip' flag during recursion.
- r.addRuntimeType(t.Underlying(), true)
-
- case *types.Array:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Struct:
- for i, n := 0, t.NumFields(); i < n; i++ {
- r.addRuntimeType(t.Field(i).Type(), false)
- }
-
- case *types.Tuple:
- for i, n := 0, t.Len(); i < n; i++ {
- r.addRuntimeType(t.At(i).Type(), false)
- }
-
- default:
- panic(T)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/static/static.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/static/static.go
deleted file mode 100644
index 709bb7b6b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/static/static.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Package static computes the call graph of a Go program containing
-// only static call edges.
-package static // import "golang.org/x/tools/go/callgraph/static"
-
-import (
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-)
-
-// CallGraph computes the call graph of the specified program
-// considering only static calls.
-//
-func CallGraph(prog *ssa.Program) *callgraph.Graph {
- cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
-
- // TODO(adonovan): opt: use only a single pass over the ssa.Program.
- // TODO(adonovan): opt: this is slower than RTA (perhaps because
- // the lower precision means so many edges are allocated)!
- for f := range ssautil.AllFunctions(prog) {
- fnode := cg.CreateNode(f)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if site, ok := instr.(ssa.CallInstruction); ok {
- if g := site.Common().StaticCallee(); g != nil {
- gnode := cg.CreateNode(g)
- callgraph.AddEdge(fnode, site, gnode)
- }
- }
- }
- }
- }
-
- return cg
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/util.go
deleted file mode 100644
index a8f89031c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/callgraph/util.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package callgraph
-
-import "golang.org/x/tools/go/ssa"
-
-// This file provides various utilities over call graphs, such as
-// visitation and path search.
-
-// CalleesOf returns a new set containing all direct callees of the
-// caller node.
-//
-func CalleesOf(caller *Node) map[*Node]bool {
- callees := make(map[*Node]bool)
- for _, e := range caller.Out {
- callees[e.Callee] = true
- }
- return callees
-}
-
-// GraphVisitEdges visits all the edges in graph g in depth-first order.
-// The edge function is called for each edge in postorder. If it
-// returns non-nil, visitation stops and GraphVisitEdges returns that
-// value.
-//
-func GraphVisitEdges(g *Graph, edge func(*Edge) error) error {
- seen := make(map[*Node]bool)
- var visit func(n *Node) error
- visit = func(n *Node) error {
- if !seen[n] {
- seen[n] = true
- for _, e := range n.Out {
- if err := visit(e.Callee); err != nil {
- return err
- }
- if err := edge(e); err != nil {
- return err
- }
- }
- }
- return nil
- }
- for _, n := range g.Nodes {
- if err := visit(n); err != nil {
- return err
- }
- }
- return nil
-}
-
-// PathSearch finds an arbitrary path starting at node start and
-// ending at some node for which isEnd() returns true. On success,
-// PathSearch returns the path as an ordered list of edges; on
-// failure, it returns nil.
-//
-func PathSearch(start *Node, isEnd func(*Node) bool) []*Edge {
- stack := make([]*Edge, 0, 32)
- seen := make(map[*Node]bool)
- var search func(n *Node) []*Edge
- search = func(n *Node) []*Edge {
- if !seen[n] {
- seen[n] = true
- if isEnd(n) {
- return stack
- }
- for _, e := range n.Out {
- stack = append(stack, e) // push
- if found := search(e.Callee); found != nil {
- return found
- }
- stack = stack[:len(stack)-1] // pop
- }
- }
- return nil
- }
- return search(start)
-}
-
-// DeleteSyntheticNodes removes from call graph g all nodes for
-// synthetic functions (except g.Root and package initializers),
-// preserving the topology. In effect, calls to synthetic wrappers
-// are "inlined".
-//
-func (g *Graph) DeleteSyntheticNodes() {
- // Measurements on the standard library and go.tools show that
- // resulting graph has ~15% fewer nodes and 4-8% fewer edges
- // than the input.
- //
- // Inlining a wrapper of in-degree m, out-degree n adds m*n
- // and removes m+n edges. Since most wrappers are monomorphic
- // (n=1) this results in a slight reduction. Polymorphic
- // wrappers (n>1), e.g. from embedding an interface value
- // inside a struct to satisfy some interface, cause an
- // increase in the graph, but they seem to be uncommon.
-
- // Hash all existing edges to avoid creating duplicates.
- edges := make(map[Edge]bool)
- for _, cgn := range g.Nodes {
- for _, e := range cgn.Out {
- edges[*e] = true
- }
- }
- for fn, cgn := range g.Nodes {
- if cgn == g.Root || fn.Synthetic == "" || isInit(cgn.Func) {
- continue // keep
- }
- for _, eIn := range cgn.In {
- for _, eOut := range cgn.Out {
- newEdge := Edge{eIn.Caller, eIn.Site, eOut.Callee}
- if edges[newEdge] {
- continue // don't add duplicate
- }
- AddEdge(eIn.Caller, eIn.Site, eOut.Callee)
- edges[newEdge] = true
- }
- }
- g.DeleteNode(cgn)
- }
-}
-
-func isInit(fn *ssa.Function) bool {
- return fn.Pkg != nil && fn.Pkg.Func("init") == fn
-}
-
-// DeleteNode removes node n and its edges from the graph g.
-// (NB: not efficient for batch deletion.)
-func (g *Graph) DeleteNode(n *Node) {
- n.deleteIns()
- n.deleteOuts()
- delete(g.Nodes, n.Func)
-}
-
-// deleteIns deletes all incoming edges to n.
-func (n *Node) deleteIns() {
- for _, e := range n.In {
- removeOutEdge(e)
- }
- n.In = nil
-}
-
-// deleteOuts deletes all outgoing edges from n.
-func (n *Node) deleteOuts() {
- for _, e := range n.Out {
- removeInEdge(e)
- }
- n.Out = nil
-}
-
-// removeOutEdge removes edge.Caller's outgoing edge 'edge'.
-func removeOutEdge(edge *Edge) {
- caller := edge.Caller
- n := len(caller.Out)
- for i, e := range caller.Out {
- if e == edge {
- // Replace it with the final element and shrink the slice.
- caller.Out[i] = caller.Out[n-1]
- caller.Out[n-1] = nil // aid GC
- caller.Out = caller.Out[:n-1]
- return
- }
- }
- panic("edge not found: " + edge.String())
-}
-
-// removeInEdge removes edge.Callee's incoming edge 'edge'.
-func removeInEdge(edge *Edge) {
- caller := edge.Callee
- n := len(caller.In)
- for i, e := range caller.In {
- if e == edge {
- // Replace it with the final element and shrink the slice.
- caller.In[i] = caller.In[n-1]
- caller.In[n-1] = nil // aid GC
- caller.In = caller.In[:n-1]
- return
- }
- }
- panic("edge not found: " + edge.String())
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/gcexportdata.go
deleted file mode 100644
index e53270e06..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/gcexportdata.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gcexportdata provides functions for locating, reading, and
-// writing export data files containing type information produced by the
-// gc compiler. This package supports go1.7 export data format and all
-// later versions.
-//
-// This package replaces the deprecated golang.org/x/tools/go/gcimporter15
-// package, which will be deleted in October 2017.
-//
-// Although it might seem convenient for this package to live alongside
-// go/types in the standard library, this would cause version skew
-// problems for developer tools that use it, since they must be able to
-// consume the outputs of the gc compiler both before and after a Go
-// update such as from Go 1.7 to Go 1.8. Because this package lives in
-// golang.org/x/tools, sites can update their version of this repo some
-// time before the Go 1.8 release and rebuild and redeploy their
-// developer tools, which will then be able to consume both Go 1.7 and
-// Go 1.8 export data files, so they will work before and after the
-// Go update. (See discussion at https://github.com/golang/go/issues/15651.)
-//
-package gcexportdata // import "golang.org/x/tools/go/gcexportdata"
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/token"
- "go/types"
- "io"
- "io/ioutil"
-
- gcimporter "golang.org/x/tools/go/gcimporter15"
-)
-
-// Find returns the name of an object (.o) or archive (.a) file
-// containing type information for the specified import path,
-// using the workspace layout conventions of go/build.
-// If no file was found, an empty filename is returned.
-//
-// A relative srcDir is interpreted relative to the current working directory.
-//
-// Find also returns the package's resolved (canonical) import path,
-// reflecting the effects of srcDir and vendoring on importPath.
-func Find(importPath, srcDir string) (filename, path string) {
- return gcimporter.FindPkg(importPath, srcDir)
-}
-
-// NewReader returns a reader for the export data section of an object
-// (.o) or archive (.a) file read from r. The new reader may provide
-// additional trailing data beyond the end of the export data.
-func NewReader(r io.Reader) (io.Reader, error) {
- buf := bufio.NewReader(r)
- _, err := gcimporter.FindExportData(buf)
- // If we ever switch to a zip-like archive format with the ToC
- // at the end, we can return the correct portion of export data,
- // but for now we must return the entire rest of the file.
- return buf, err
-}
-
-// Read reads export data from in, decodes it, and returns type
-// information for the package.
-// The package name is specified by path.
-// File position information is added to fset.
-//
-// Read may inspect and add to the imports map to ensure that references
-// within the export data to other packages are consistent. The caller
-// must ensure that imports[path] does not exist, or exists but is
-// incomplete (see types.Package.Complete), and Read inserts the
-// resulting package into this map entry.
-//
-// On return, the state of the reader is undefined.
-func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package, path string) (*types.Package, error) {
- data, err := ioutil.ReadAll(in)
- if err != nil {
- return nil, fmt.Errorf("reading export data for %q: %v", path, err)
- }
-
- if bytes.HasPrefix(data, []byte("!")) {
- return nil, fmt.Errorf("can't read export data for %q directly from an archive file (call gcexportdata.NewReader first to extract export data)", path)
- }
-
- // The App Engine Go runtime v1.6 uses the old export data format.
- // TODO(adonovan): delete once v1.7 has been around for a while.
- if bytes.HasPrefix(data, []byte("package ")) {
- return gcimporter.ImportData(imports, path, path, bytes.NewReader(data))
- }
-
- _, pkg, err := gcimporter.BImportData(fset, imports, data, path)
- return pkg, err
-}
-
-// Write writes encoded type information for the specified package to out.
-// The FileSet provides file position information for named objects.
-func Write(out io.Writer, fset *token.FileSet, pkg *types.Package) error {
- _, err := out.Write(gcimporter.BExportData(fset, pkg))
- return err
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/importer.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/importer.go
deleted file mode 100644
index efe221e7e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/importer.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gcexportdata
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "os"
-)
-
-// NewImporter returns a new instance of the types.Importer interface
-// that reads type information from export data files written by gc.
-// The Importer also satisfies types.ImporterFrom.
-//
-// Export data files are located using "go build" workspace conventions
-// and the build.Default context.
-//
-// Use this importer instead of go/importer.For("gc", ...) to avoid the
-// version-skew problems described in the documentation of this package,
-// or to control the FileSet or access the imports map populated during
-// package loading.
-//
-func NewImporter(fset *token.FileSet, imports map[string]*types.Package) types.ImporterFrom {
- return importer{fset, imports}
-}
-
-type importer struct {
- fset *token.FileSet
- imports map[string]*types.Package
-}
-
-func (imp importer) Import(importPath string) (*types.Package, error) {
- return imp.ImportFrom(importPath, "", 0)
-}
-
-func (imp importer) ImportFrom(importPath, srcDir string, mode types.ImportMode) (_ *types.Package, err error) {
- filename, path := Find(importPath, srcDir)
- if filename == "" {
- if importPath == "unsafe" {
- // Even for unsafe, call Find first in case
- // the package was vendored.
- return types.Unsafe, nil
- }
- return nil, fmt.Errorf("can't find import: %s", importPath)
- }
-
- if pkg, ok := imp.imports[path]; ok && pkg.Complete() {
- return pkg, nil // cache hit
- }
-
- // open file
- f, err := os.Open(filename)
- if err != nil {
- return nil, err
- }
- defer func() {
- f.Close()
- if err != nil {
- // add file name to error
- err = fmt.Errorf("reading export data: %s: %v", filename, err)
- }
- }()
-
- r, err := NewReader(f)
- if err != nil {
- return nil, err
- }
-
- return Read(r, imp.fset, imp.imports, path)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/main.go
deleted file mode 100644
index 106046c4c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcexportdata/main.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// The gcexportdata command is a diagnostic tool that displays the
-// contents of gc export data files.
-package main
-
-import (
- "flag"
- "fmt"
- "go/token"
- "go/types"
- "log"
- "os"
-
- "golang.org/x/tools/go/gcexportdata"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-func main() {
- log.SetPrefix("gcexportdata: ")
- log.SetFlags(0)
- flag.Usage = func() {
- fmt.Fprintln(os.Stderr, "usage: gcexportdata file.a")
- }
- flag.Parse()
- if flag.NArg() != 1 {
- flag.Usage()
- os.Exit(2)
- }
- filename := flag.Args()[0]
-
- f, err := os.Open(filename)
- if err != nil {
- log.Fatal(err)
- }
-
- r, err := gcexportdata.NewReader(f)
- if err != nil {
- log.Fatalf("%s: %s", filename, err)
- }
-
- // Decode the package.
- imports := make(map[string]*types.Package)
- fset := token.NewFileSet()
- pkg, err := gcexportdata.Read(r, fset, imports, "dummy")
- if err != nil {
- log.Fatal("%s: %s", filename, err)
- }
-
- // Print all package-level declarations, including non-exported ones.
- fmt.Printf("package %s\n", pkg.Name())
- for _, imp := range pkg.Imports() {
- fmt.Printf("import %q\n", imp.Path())
- }
- qual := func(p *types.Package) string {
- if pkg == p {
- return ""
- }
- return p.Name()
- }
- scope := pkg.Scope()
- for _, name := range scope.Names() {
- obj := scope.Lookup(name)
- fmt.Printf("%s: %s\n",
- fset.Position(obj.Pos()),
- types.ObjectString(obj, qual))
-
- // For types, print each method.
- if _, ok := obj.(*types.TypeName); ok {
- for _, method := range typeutil.IntuitiveMethodSet(obj.Type(), nil) {
- fmt.Printf("%s: %s\n",
- fset.Position(method.Obj().Pos()),
- types.SelectionString(method, qual))
- }
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/bexport.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/bexport.go
deleted file mode 100644
index cbf8bc00d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/bexport.go
+++ /dev/null
@@ -1,828 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Binary package export.
-// This file was derived from $GOROOT/src/cmd/compile/internal/gc/bexport.go;
-// see that file for specification of the format.
-
-package gcimporter
-
-import (
- "bytes"
- "encoding/binary"
- "fmt"
- "go/ast"
- "go/constant"
- "go/token"
- "go/types"
- "log"
- "math"
- "math/big"
- "sort"
- "strings"
-)
-
-// If debugFormat is set, each integer and string value is preceded by a marker
-// and position information in the encoding. This mechanism permits an importer
-// to recognize immediately when it is out of sync. The importer recognizes this
-// mode automatically (i.e., it can import export data produced with debugging
-// support even if debugFormat is not set at the time of import). This mode will
-// lead to massively larger export data (by a factor of 2 to 3) and should only
-// be enabled during development and debugging.
-//
-// NOTE: This flag is the first flag to enable if importing dies because of
-// (suspected) format errors, and whenever a change is made to the format.
-const debugFormat = false // default: false
-
-// If trace is set, debugging output is printed to std out.
-const trace = false // default: false
-
-// Current export format version. Increase with each format change.
-// 4: type name objects support type aliases, uses aliasTag
-// 3: Go1.8 encoding (same as version 2, aliasTag defined but never used)
-// 2: removed unused bool in ODCL export (compiler only)
-// 1: header format change (more regular), export package for _ struct fields
-// 0: Go1.7 encoding
-const exportVersion = 4
-
-// trackAllTypes enables cycle tracking for all types, not just named
-// types. The existing compiler invariants assume that unnamed types
-// that are not completely set up are not used, or else there are spurious
-// errors.
-// If disabled, only named types are tracked, possibly leading to slightly
-// less efficient encoding in rare cases. It also prevents the export of
-// some corner-case type declarations (but those are not handled correctly
-// with with the textual export format either).
-// TODO(gri) enable and remove once issues caused by it are fixed
-const trackAllTypes = false
-
-type exporter struct {
- fset *token.FileSet
- out bytes.Buffer
-
- // object -> index maps, indexed in order of serialization
- strIndex map[string]int
- pkgIndex map[*types.Package]int
- typIndex map[types.Type]int
-
- // position encoding
- posInfoFormat bool
- prevFile string
- prevLine int
-
- // debugging support
- written int // bytes written
- indent int // for trace
-}
-
-// BExportData returns binary export data for pkg.
-// If no file set is provided, position info will be missing.
-func BExportData(fset *token.FileSet, pkg *types.Package) []byte {
- p := exporter{
- fset: fset,
- strIndex: map[string]int{"": 0}, // empty string is mapped to 0
- pkgIndex: make(map[*types.Package]int),
- typIndex: make(map[types.Type]int),
- posInfoFormat: true, // TODO(gri) might become a flag, eventually
- }
-
- // write version info
- // The version string must start with "version %d" where %d is the version
- // number. Additional debugging information may follow after a blank; that
- // text is ignored by the importer.
- p.rawStringln(fmt.Sprintf("version %d", exportVersion))
- var debug string
- if debugFormat {
- debug = "debug"
- }
- p.rawStringln(debug) // cannot use p.bool since it's affected by debugFormat; also want to see this clearly
- p.bool(trackAllTypes)
- p.bool(p.posInfoFormat)
-
- // --- generic export data ---
-
- // populate type map with predeclared "known" types
- for index, typ := range predeclared {
- p.typIndex[typ] = index
- }
- if len(p.typIndex) != len(predeclared) {
- log.Fatalf("gcimporter: duplicate entries in type map?")
- }
-
- // write package data
- p.pkg(pkg, true)
- if trace {
- p.tracef("\n")
- }
-
- // write objects
- objcount := 0
- scope := pkg.Scope()
- for _, name := range scope.Names() {
- if !ast.IsExported(name) {
- continue
- }
- if trace {
- p.tracef("\n")
- }
- p.obj(scope.Lookup(name))
- objcount++
- }
-
- // indicate end of list
- if trace {
- p.tracef("\n")
- }
- p.tag(endTag)
-
- // for self-verification only (redundant)
- p.int(objcount)
-
- if trace {
- p.tracef("\n")
- }
-
- // --- end of export data ---
-
- return p.out.Bytes()
-}
-
-func (p *exporter) pkg(pkg *types.Package, emptypath bool) {
- if pkg == nil {
- log.Fatalf("gcimporter: unexpected nil pkg")
- }
-
- // if we saw the package before, write its index (>= 0)
- if i, ok := p.pkgIndex[pkg]; ok {
- p.index('P', i)
- return
- }
-
- // otherwise, remember the package, write the package tag (< 0) and package data
- if trace {
- p.tracef("P%d = { ", len(p.pkgIndex))
- defer p.tracef("} ")
- }
- p.pkgIndex[pkg] = len(p.pkgIndex)
-
- p.tag(packageTag)
- p.string(pkg.Name())
- if emptypath {
- p.string("")
- } else {
- p.string(pkg.Path())
- }
-}
-
-func (p *exporter) obj(obj types.Object) {
- switch obj := obj.(type) {
- case *types.Const:
- p.tag(constTag)
- p.pos(obj)
- p.qualifiedName(obj)
- p.typ(obj.Type())
- p.value(obj.Val())
-
- case *types.TypeName:
- if isAlias(obj) {
- p.tag(aliasTag)
- p.pos(obj)
- p.qualifiedName(obj)
- } else {
- p.tag(typeTag)
- }
- p.typ(obj.Type())
-
- case *types.Var:
- p.tag(varTag)
- p.pos(obj)
- p.qualifiedName(obj)
- p.typ(obj.Type())
-
- case *types.Func:
- p.tag(funcTag)
- p.pos(obj)
- p.qualifiedName(obj)
- sig := obj.Type().(*types.Signature)
- p.paramList(sig.Params(), sig.Variadic())
- p.paramList(sig.Results(), false)
-
- default:
- log.Fatalf("gcimporter: unexpected object %v (%T)", obj, obj)
- }
-}
-
-func (p *exporter) pos(obj types.Object) {
- if !p.posInfoFormat {
- return
- }
-
- file, line := p.fileLine(obj)
- if file == p.prevFile {
- // common case: write line delta
- // delta == 0 means different file or no line change
- delta := line - p.prevLine
- p.int(delta)
- if delta == 0 {
- p.int(-1) // -1 means no file change
- }
- } else {
- // different file
- p.int(0)
- // Encode filename as length of common prefix with previous
- // filename, followed by (possibly empty) suffix. Filenames
- // frequently share path prefixes, so this can save a lot
- // of space and make export data size less dependent on file
- // path length. The suffix is unlikely to be empty because
- // file names tend to end in ".go".
- n := commonPrefixLen(p.prevFile, file)
- p.int(n) // n >= 0
- p.string(file[n:]) // write suffix only
- p.prevFile = file
- p.int(line)
- }
- p.prevLine = line
-}
-
-func (p *exporter) fileLine(obj types.Object) (file string, line int) {
- if p.fset != nil {
- pos := p.fset.Position(obj.Pos())
- file = pos.Filename
- line = pos.Line
- }
- return
-}
-
-func commonPrefixLen(a, b string) int {
- if len(a) > len(b) {
- a, b = b, a
- }
- // len(a) <= len(b)
- i := 0
- for i < len(a) && a[i] == b[i] {
- i++
- }
- return i
-}
-
-func (p *exporter) qualifiedName(obj types.Object) {
- p.string(obj.Name())
- p.pkg(obj.Pkg(), false)
-}
-
-func (p *exporter) typ(t types.Type) {
- if t == nil {
- log.Fatalf("gcimporter: nil type")
- }
-
- // Possible optimization: Anonymous pointer types *T where
- // T is a named type are common. We could canonicalize all
- // such types *T to a single type PT = *T. This would lead
- // to at most one *T entry in typIndex, and all future *T's
- // would be encoded as the respective index directly. Would
- // save 1 byte (pointerTag) per *T and reduce the typIndex
- // size (at the cost of a canonicalization map). We can do
- // this later, without encoding format change.
-
- // if we saw the type before, write its index (>= 0)
- if i, ok := p.typIndex[t]; ok {
- p.index('T', i)
- return
- }
-
- // otherwise, remember the type, write the type tag (< 0) and type data
- if trackAllTypes {
- if trace {
- p.tracef("T%d = {>\n", len(p.typIndex))
- defer p.tracef("<\n} ")
- }
- p.typIndex[t] = len(p.typIndex)
- }
-
- switch t := t.(type) {
- case *types.Named:
- if !trackAllTypes {
- // if we don't track all types, track named types now
- p.typIndex[t] = len(p.typIndex)
- }
-
- p.tag(namedTag)
- p.pos(t.Obj())
- p.qualifiedName(t.Obj())
- p.typ(t.Underlying())
- if !types.IsInterface(t) {
- p.assocMethods(t)
- }
-
- case *types.Array:
- p.tag(arrayTag)
- p.int64(t.Len())
- p.typ(t.Elem())
-
- case *types.Slice:
- p.tag(sliceTag)
- p.typ(t.Elem())
-
- case *dddSlice:
- p.tag(dddTag)
- p.typ(t.elem)
-
- case *types.Struct:
- p.tag(structTag)
- p.fieldList(t)
-
- case *types.Pointer:
- p.tag(pointerTag)
- p.typ(t.Elem())
-
- case *types.Signature:
- p.tag(signatureTag)
- p.paramList(t.Params(), t.Variadic())
- p.paramList(t.Results(), false)
-
- case *types.Interface:
- p.tag(interfaceTag)
- p.iface(t)
-
- case *types.Map:
- p.tag(mapTag)
- p.typ(t.Key())
- p.typ(t.Elem())
-
- case *types.Chan:
- p.tag(chanTag)
- p.int(int(3 - t.Dir())) // hack
- p.typ(t.Elem())
-
- default:
- log.Fatalf("gcimporter: unexpected type %T: %s", t, t)
- }
-}
-
-func (p *exporter) assocMethods(named *types.Named) {
- // Sort methods (for determinism).
- var methods []*types.Func
- for i := 0; i < named.NumMethods(); i++ {
- methods = append(methods, named.Method(i))
- }
- sort.Sort(methodsByName(methods))
-
- p.int(len(methods))
-
- if trace && methods != nil {
- p.tracef("associated methods {>\n")
- }
-
- for i, m := range methods {
- if trace && i > 0 {
- p.tracef("\n")
- }
-
- p.pos(m)
- name := m.Name()
- p.string(name)
- if !exported(name) {
- p.pkg(m.Pkg(), false)
- }
-
- sig := m.Type().(*types.Signature)
- p.paramList(types.NewTuple(sig.Recv()), false)
- p.paramList(sig.Params(), sig.Variadic())
- p.paramList(sig.Results(), false)
- p.int(0) // dummy value for go:nointerface pragma - ignored by importer
- }
-
- if trace && methods != nil {
- p.tracef("<\n} ")
- }
-}
-
-type methodsByName []*types.Func
-
-func (x methodsByName) Len() int { return len(x) }
-func (x methodsByName) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x methodsByName) Less(i, j int) bool { return x[i].Name() < x[j].Name() }
-
-func (p *exporter) fieldList(t *types.Struct) {
- if trace && t.NumFields() > 0 {
- p.tracef("fields {>\n")
- defer p.tracef("<\n} ")
- }
-
- p.int(t.NumFields())
- for i := 0; i < t.NumFields(); i++ {
- if trace && i > 0 {
- p.tracef("\n")
- }
- p.field(t.Field(i))
- p.string(t.Tag(i))
- }
-}
-
-func (p *exporter) field(f *types.Var) {
- if !f.IsField() {
- log.Fatalf("gcimporter: field expected")
- }
-
- p.pos(f)
- p.fieldName(f)
- p.typ(f.Type())
-}
-
-func (p *exporter) iface(t *types.Interface) {
- // TODO(gri): enable importer to load embedded interfaces,
- // then emit Embeddeds and ExplicitMethods separately here.
- p.int(0)
-
- n := t.NumMethods()
- if trace && n > 0 {
- p.tracef("methods {>\n")
- defer p.tracef("<\n} ")
- }
- p.int(n)
- for i := 0; i < n; i++ {
- if trace && i > 0 {
- p.tracef("\n")
- }
- p.method(t.Method(i))
- }
-}
-
-func (p *exporter) method(m *types.Func) {
- sig := m.Type().(*types.Signature)
- if sig.Recv() == nil {
- log.Fatalf("gcimporter: method expected")
- }
-
- p.pos(m)
- p.string(m.Name())
- if m.Name() != "_" && !ast.IsExported(m.Name()) {
- p.pkg(m.Pkg(), false)
- }
-
- // interface method; no need to encode receiver.
- p.paramList(sig.Params(), sig.Variadic())
- p.paramList(sig.Results(), false)
-}
-
-func (p *exporter) fieldName(f *types.Var) {
- name := f.Name()
-
- if f.Anonymous() {
- // anonymous field - we distinguish between 3 cases:
- // 1) field name matches base type name and is exported
- // 2) field name matches base type name and is not exported
- // 3) field name doesn't match base type name (alias name)
- bname := basetypeName(f.Type())
- if name == bname {
- if ast.IsExported(name) {
- name = "" // 1) we don't need to know the field name or package
- } else {
- name = "?" // 2) use unexported name "?" to force package export
- }
- } else {
- // 3) indicate alias and export name as is
- // (this requires an extra "@" but this is a rare case)
- p.string("@")
- }
- }
-
- p.string(name)
- if name != "" && !ast.IsExported(name) {
- p.pkg(f.Pkg(), false)
- }
-}
-
-func basetypeName(typ types.Type) string {
- switch typ := deref(typ).(type) {
- case *types.Basic:
- return typ.Name()
- case *types.Named:
- return typ.Obj().Name()
- default:
- return "" // unnamed type
- }
-}
-
-func (p *exporter) paramList(params *types.Tuple, variadic bool) {
- // use negative length to indicate unnamed parameters
- // (look at the first parameter only since either all
- // names are present or all are absent)
- n := params.Len()
- if n > 0 && params.At(0).Name() == "" {
- n = -n
- }
- p.int(n)
- for i := 0; i < params.Len(); i++ {
- q := params.At(i)
- t := q.Type()
- if variadic && i == params.Len()-1 {
- t = &dddSlice{t.(*types.Slice).Elem()}
- }
- p.typ(t)
- if n > 0 {
- name := q.Name()
- p.string(name)
- if name != "_" {
- p.pkg(q.Pkg(), false)
- }
- }
- p.string("") // no compiler-specific info
- }
-}
-
-func (p *exporter) value(x constant.Value) {
- if trace {
- p.tracef("= ")
- }
-
- switch x.Kind() {
- case constant.Bool:
- tag := falseTag
- if constant.BoolVal(x) {
- tag = trueTag
- }
- p.tag(tag)
-
- case constant.Int:
- if v, exact := constant.Int64Val(x); exact {
- // common case: x fits into an int64 - use compact encoding
- p.tag(int64Tag)
- p.int64(v)
- return
- }
- // uncommon case: large x - use float encoding
- // (powers of 2 will be encoded efficiently with exponent)
- p.tag(floatTag)
- p.float(constant.ToFloat(x))
-
- case constant.Float:
- p.tag(floatTag)
- p.float(x)
-
- case constant.Complex:
- p.tag(complexTag)
- p.float(constant.Real(x))
- p.float(constant.Imag(x))
-
- case constant.String:
- p.tag(stringTag)
- p.string(constant.StringVal(x))
-
- case constant.Unknown:
- // package contains type errors
- p.tag(unknownTag)
-
- default:
- log.Fatalf("gcimporter: unexpected value %v (%T)", x, x)
- }
-}
-
-func (p *exporter) float(x constant.Value) {
- if x.Kind() != constant.Float {
- log.Fatalf("gcimporter: unexpected constant %v, want float", x)
- }
- // extract sign (there is no -0)
- sign := constant.Sign(x)
- if sign == 0 {
- // x == 0
- p.int(0)
- return
- }
- // x != 0
-
- var f big.Float
- if v, exact := constant.Float64Val(x); exact {
- // float64
- f.SetFloat64(v)
- } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int {
- // TODO(gri): add big.Rat accessor to constant.Value.
- r := valueToRat(num)
- f.SetRat(r.Quo(r, valueToRat(denom)))
- } else {
- // Value too large to represent as a fraction => inaccessible.
- // TODO(gri): add big.Float accessor to constant.Value.
- f.SetFloat64(math.MaxFloat64) // FIXME
- }
-
- // extract exponent such that 0.5 <= m < 1.0
- var m big.Float
- exp := f.MantExp(&m)
-
- // extract mantissa as *big.Int
- // - set exponent large enough so mant satisfies mant.IsInt()
- // - get *big.Int from mant
- m.SetMantExp(&m, int(m.MinPrec()))
- mant, acc := m.Int(nil)
- if acc != big.Exact {
- log.Fatalf("gcimporter: internal error")
- }
-
- p.int(sign)
- p.int(exp)
- p.string(string(mant.Bytes()))
-}
-
-func valueToRat(x constant.Value) *big.Rat {
- // Convert little-endian to big-endian.
- // I can't believe this is necessary.
- bytes := constant.Bytes(x)
- for i := 0; i < len(bytes)/2; i++ {
- bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i]
- }
- return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes))
-}
-
-func (p *exporter) bool(b bool) bool {
- if trace {
- p.tracef("[")
- defer p.tracef("= %v] ", b)
- }
-
- x := 0
- if b {
- x = 1
- }
- p.int(x)
- return b
-}
-
-// ----------------------------------------------------------------------------
-// Low-level encoders
-
-func (p *exporter) index(marker byte, index int) {
- if index < 0 {
- log.Fatalf("gcimporter: invalid index < 0")
- }
- if debugFormat {
- p.marker('t')
- }
- if trace {
- p.tracef("%c%d ", marker, index)
- }
- p.rawInt64(int64(index))
-}
-
-func (p *exporter) tag(tag int) {
- if tag >= 0 {
- log.Fatalf("gcimporter: invalid tag >= 0")
- }
- if debugFormat {
- p.marker('t')
- }
- if trace {
- p.tracef("%s ", tagString[-tag])
- }
- p.rawInt64(int64(tag))
-}
-
-func (p *exporter) int(x int) {
- p.int64(int64(x))
-}
-
-func (p *exporter) int64(x int64) {
- if debugFormat {
- p.marker('i')
- }
- if trace {
- p.tracef("%d ", x)
- }
- p.rawInt64(x)
-}
-
-func (p *exporter) string(s string) {
- if debugFormat {
- p.marker('s')
- }
- if trace {
- p.tracef("%q ", s)
- }
- // if we saw the string before, write its index (>= 0)
- // (the empty string is mapped to 0)
- if i, ok := p.strIndex[s]; ok {
- p.rawInt64(int64(i))
- return
- }
- // otherwise, remember string and write its negative length and bytes
- p.strIndex[s] = len(p.strIndex)
- p.rawInt64(-int64(len(s)))
- for i := 0; i < len(s); i++ {
- p.rawByte(s[i])
- }
-}
-
-// marker emits a marker byte and position information which makes
-// it easy for a reader to detect if it is "out of sync". Used for
-// debugFormat format only.
-func (p *exporter) marker(m byte) {
- p.rawByte(m)
- // Enable this for help tracking down the location
- // of an incorrect marker when running in debugFormat.
- if false && trace {
- p.tracef("#%d ", p.written)
- }
- p.rawInt64(int64(p.written))
-}
-
-// rawInt64 should only be used by low-level encoders.
-func (p *exporter) rawInt64(x int64) {
- var tmp [binary.MaxVarintLen64]byte
- n := binary.PutVarint(tmp[:], x)
- for i := 0; i < n; i++ {
- p.rawByte(tmp[i])
- }
-}
-
-// rawStringln should only be used to emit the initial version string.
-func (p *exporter) rawStringln(s string) {
- for i := 0; i < len(s); i++ {
- p.rawByte(s[i])
- }
- p.rawByte('\n')
-}
-
-// rawByte is the bottleneck interface to write to p.out.
-// rawByte escapes b as follows (any encoding does that
-// hides '$'):
-//
-// '$' => '|' 'S'
-// '|' => '|' '|'
-//
-// Necessary so other tools can find the end of the
-// export data by searching for "$$".
-// rawByte should only be used by low-level encoders.
-func (p *exporter) rawByte(b byte) {
- switch b {
- case '$':
- // write '$' as '|' 'S'
- b = 'S'
- fallthrough
- case '|':
- // write '|' as '|' '|'
- p.out.WriteByte('|')
- p.written++
- }
- p.out.WriteByte(b)
- p.written++
-}
-
-// tracef is like fmt.Printf but it rewrites the format string
-// to take care of indentation.
-func (p *exporter) tracef(format string, args ...interface{}) {
- if strings.ContainsAny(format, "<>\n") {
- var buf bytes.Buffer
- for i := 0; i < len(format); i++ {
- // no need to deal with runes
- ch := format[i]
- switch ch {
- case '>':
- p.indent++
- continue
- case '<':
- p.indent--
- continue
- }
- buf.WriteByte(ch)
- if ch == '\n' {
- for j := p.indent; j > 0; j-- {
- buf.WriteString(". ")
- }
- }
- }
- format = buf.String()
- }
- fmt.Printf(format, args...)
-}
-
-// Debugging support.
-// (tagString is only used when tracing is enabled)
-var tagString = [...]string{
- // Packages
- -packageTag: "package",
-
- // Types
- -namedTag: "named type",
- -arrayTag: "array",
- -sliceTag: "slice",
- -dddTag: "ddd",
- -structTag: "struct",
- -pointerTag: "pointer",
- -signatureTag: "signature",
- -interfaceTag: "interface",
- -mapTag: "map",
- -chanTag: "chan",
-
- // Values
- -falseTag: "false",
- -trueTag: "true",
- -int64Tag: "int64",
- -floatTag: "float",
- -fractionTag: "fraction",
- -complexTag: "complex",
- -stringTag: "string",
- -unknownTag: "unknown",
-
- // Type aliases
- -aliasTag: "alias",
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/bimport.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/bimport.go
deleted file mode 100644
index 1936a7f6c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/bimport.go
+++ /dev/null
@@ -1,993 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/bimport.go.
-
-package gcimporter
-
-import (
- "encoding/binary"
- "fmt"
- "go/constant"
- "go/token"
- "go/types"
- "sort"
- "strconv"
- "strings"
- "sync"
- "unicode"
- "unicode/utf8"
-)
-
-type importer struct {
- imports map[string]*types.Package
- data []byte
- importpath string
- buf []byte // for reading strings
- version int // export format version
-
- // object lists
- strList []string // in order of appearance
- pathList []string // in order of appearance
- pkgList []*types.Package // in order of appearance
- typList []types.Type // in order of appearance
- interfaceList []*types.Interface // for delayed completion only
- trackAllTypes bool
-
- // position encoding
- posInfoFormat bool
- prevFile string
- prevLine int
- fset *token.FileSet
- files map[string]*token.File
-
- // debugging support
- debugFormat bool
- read int // bytes read
-}
-
-// BImportData imports a package from the serialized package data
-// and returns the number of bytes consumed and a reference to the package.
-// If the export data version is not recognized or the format is otherwise
-// compromised, an error is returned.
-func BImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) {
- // catch panics and return them as errors
- defer func() {
- if e := recover(); e != nil {
- // The package (filename) causing the problem is added to this
- // error by a wrapper in the caller (Import in gcimporter.go).
- // Return a (possibly nil or incomplete) package unchanged (see #16088).
- err = fmt.Errorf("cannot import, possibly version skew (%v) - reinstall package", e)
- }
- }()
-
- p := importer{
- imports: imports,
- data: data,
- importpath: path,
- version: -1, // unknown version
- strList: []string{""}, // empty string is mapped to 0
- pathList: []string{""}, // empty string is mapped to 0
- fset: fset,
- files: make(map[string]*token.File),
- }
-
- // read version info
- var versionstr string
- if b := p.rawByte(); b == 'c' || b == 'd' {
- // Go1.7 encoding; first byte encodes low-level
- // encoding format (compact vs debug).
- // For backward-compatibility only (avoid problems with
- // old installed packages). Newly compiled packages use
- // the extensible format string.
- // TODO(gri) Remove this support eventually; after Go1.8.
- if b == 'd' {
- p.debugFormat = true
- }
- p.trackAllTypes = p.rawByte() == 'a'
- p.posInfoFormat = p.int() != 0
- versionstr = p.string()
- if versionstr == "v1" {
- p.version = 0
- }
- } else {
- // Go1.8 extensible encoding
- // read version string and extract version number (ignore anything after the version number)
- versionstr = p.rawStringln(b)
- if s := strings.SplitN(versionstr, " ", 3); len(s) >= 2 && s[0] == "version" {
- if v, err := strconv.Atoi(s[1]); err == nil && v > 0 {
- p.version = v
- }
- }
- }
-
- // read version specific flags - extend as necessary
- switch p.version {
- // case 6:
- // ...
- // fallthrough
- case 5, 4, 3, 2, 1:
- p.debugFormat = p.rawStringln(p.rawByte()) == "debug"
- p.trackAllTypes = p.int() != 0
- p.posInfoFormat = p.int() != 0
- case 0:
- // Go1.7 encoding format - nothing to do here
- default:
- errorf("unknown export format version %d (%q)", p.version, versionstr)
- }
-
- // --- generic export data ---
-
- // populate typList with predeclared "known" types
- p.typList = append(p.typList, predeclared...)
-
- // read package data
- pkg = p.pkg()
-
- // read objects of phase 1 only (see cmd/compiler/internal/gc/bexport.go)
- objcount := 0
- for {
- tag := p.tagOrIndex()
- if tag == endTag {
- break
- }
- p.obj(tag)
- objcount++
- }
-
- // self-verification
- if count := p.int(); count != objcount {
- errorf("got %d objects; want %d", objcount, count)
- }
-
- // ignore compiler-specific import data
-
- // complete interfaces
- // TODO(gri) re-investigate if we still need to do this in a delayed fashion
- for _, typ := range p.interfaceList {
- typ.Complete()
- }
-
- // record all referenced packages as imports
- list := append(([]*types.Package)(nil), p.pkgList[1:]...)
- sort.Sort(byPath(list))
- pkg.SetImports(list)
-
- // package was imported completely and without errors
- pkg.MarkComplete()
-
- return p.read, pkg, nil
-}
-
-func errorf(format string, args ...interface{}) {
- panic(fmt.Sprintf(format, args...))
-}
-
-func (p *importer) pkg() *types.Package {
- // if the package was seen before, i is its index (>= 0)
- i := p.tagOrIndex()
- if i >= 0 {
- return p.pkgList[i]
- }
-
- // otherwise, i is the package tag (< 0)
- if i != packageTag {
- errorf("unexpected package tag %d version %d", i, p.version)
- }
-
- // read package data
- name := p.string()
- var path string
- if p.version >= 5 {
- path = p.path()
- } else {
- path = p.string()
- }
-
- // we should never see an empty package name
- if name == "" {
- errorf("empty package name in import")
- }
-
- // an empty path denotes the package we are currently importing;
- // it must be the first package we see
- if (path == "") != (len(p.pkgList) == 0) {
- errorf("package path %q for pkg index %d", path, len(p.pkgList))
- }
-
- // if the package was imported before, use that one; otherwise create a new one
- if path == "" {
- path = p.importpath
- }
- pkg := p.imports[path]
- if pkg == nil {
- pkg = types.NewPackage(path, name)
- p.imports[path] = pkg
- } else if pkg.Name() != name {
- errorf("conflicting names %s and %s for package %q", pkg.Name(), name, path)
- }
- p.pkgList = append(p.pkgList, pkg)
-
- return pkg
-}
-
-// objTag returns the tag value for each object kind.
-func objTag(obj types.Object) int {
- switch obj.(type) {
- case *types.Const:
- return constTag
- case *types.TypeName:
- return typeTag
- case *types.Var:
- return varTag
- case *types.Func:
- return funcTag
- default:
- errorf("unexpected object: %v (%T)", obj, obj) // panics
- panic("unreachable")
- }
-}
-
-func sameObj(a, b types.Object) bool {
- // Because unnamed types are not canonicalized, we cannot simply compare types for
- // (pointer) identity.
- // Ideally we'd check equality of constant values as well, but this is good enough.
- return objTag(a) == objTag(b) && types.Identical(a.Type(), b.Type())
-}
-
-func (p *importer) declare(obj types.Object) {
- pkg := obj.Pkg()
- if alt := pkg.Scope().Insert(obj); alt != nil {
- // This can only trigger if we import a (non-type) object a second time.
- // Excluding type aliases, this cannot happen because 1) we only import a package
- // once; and b) we ignore compiler-specific export data which may contain
- // functions whose inlined function bodies refer to other functions that
- // were already imported.
- // However, type aliases require reexporting the original type, so we need
- // to allow it (see also the comment in cmd/compile/internal/gc/bimport.go,
- // method importer.obj, switch case importing functions).
- // TODO(gri) review/update this comment once the gc compiler handles type aliases.
- if !sameObj(obj, alt) {
- errorf("inconsistent import:\n\t%v\npreviously imported as:\n\t%v\n", obj, alt)
- }
- }
-}
-
-func (p *importer) obj(tag int) {
- switch tag {
- case constTag:
- pos := p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ(nil)
- val := p.value()
- p.declare(types.NewConst(pos, pkg, name, typ, val))
-
- case aliasTag:
- // TODO(gri) verify type alias hookup is correct
- pos := p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ(nil)
- p.declare(types.NewTypeName(pos, pkg, name, typ))
-
- case typeTag:
- p.typ(nil)
-
- case varTag:
- pos := p.pos()
- pkg, name := p.qualifiedName()
- typ := p.typ(nil)
- p.declare(types.NewVar(pos, pkg, name, typ))
-
- case funcTag:
- pos := p.pos()
- pkg, name := p.qualifiedName()
- params, isddd := p.paramList()
- result, _ := p.paramList()
- sig := types.NewSignature(nil, params, result, isddd)
- p.declare(types.NewFunc(pos, pkg, name, sig))
-
- default:
- errorf("unexpected object tag %d", tag)
- }
-}
-
-const deltaNewFile = -64 // see cmd/compile/internal/gc/bexport.go
-
-func (p *importer) pos() token.Pos {
- if !p.posInfoFormat {
- return token.NoPos
- }
-
- file := p.prevFile
- line := p.prevLine
- delta := p.int()
- line += delta
- if p.version >= 5 {
- if delta == deltaNewFile {
- if n := p.int(); n >= 0 {
- // file changed
- file = p.path()
- line = n
- }
- }
- } else {
- if delta == 0 {
- if n := p.int(); n >= 0 {
- // file changed
- file = p.prevFile[:n] + p.string()
- line = p.int()
- }
- }
- }
- p.prevFile = file
- p.prevLine = line
-
- // Synthesize a token.Pos
-
- // Since we don't know the set of needed file positions, we
- // reserve maxlines positions per file.
- const maxlines = 64 * 1024
- f := p.files[file]
- if f == nil {
- f = p.fset.AddFile(file, -1, maxlines)
- p.files[file] = f
- // Allocate the fake linebreak indices on first use.
- // TODO(adonovan): opt: save ~512KB using a more complex scheme?
- fakeLinesOnce.Do(func() {
- fakeLines = make([]int, maxlines)
- for i := range fakeLines {
- fakeLines[i] = i
- }
- })
- f.SetLines(fakeLines)
- }
-
- if line > maxlines {
- line = 1
- }
-
- // Treat the file as if it contained only newlines
- // and column=1: use the line number as the offset.
- return f.Pos(line - 1)
-}
-
-var (
- fakeLines []int
- fakeLinesOnce sync.Once
-)
-
-func (p *importer) qualifiedName() (pkg *types.Package, name string) {
- name = p.string()
- pkg = p.pkg()
- return
-}
-
-func (p *importer) record(t types.Type) {
- p.typList = append(p.typList, t)
-}
-
-// A dddSlice is a types.Type representing ...T parameters.
-// It only appears for parameter types and does not escape
-// the importer.
-type dddSlice struct {
- elem types.Type
-}
-
-func (t *dddSlice) Underlying() types.Type { return t }
-func (t *dddSlice) String() string { return "..." + t.elem.String() }
-
-// parent is the package which declared the type; parent == nil means
-// the package currently imported. The parent package is needed for
-// exported struct fields and interface methods which don't contain
-// explicit package information in the export data.
-func (p *importer) typ(parent *types.Package) types.Type {
- // if the type was seen before, i is its index (>= 0)
- i := p.tagOrIndex()
- if i >= 0 {
- return p.typList[i]
- }
-
- // otherwise, i is the type tag (< 0)
- switch i {
- case namedTag:
- // read type object
- pos := p.pos()
- parent, name := p.qualifiedName()
- scope := parent.Scope()
- obj := scope.Lookup(name)
-
- // if the object doesn't exist yet, create and insert it
- if obj == nil {
- obj = types.NewTypeName(pos, parent, name, nil)
- scope.Insert(obj)
- }
-
- if _, ok := obj.(*types.TypeName); !ok {
- errorf("pkg = %s, name = %s => %s", parent, name, obj)
- }
-
- // associate new named type with obj if it doesn't exist yet
- t0 := types.NewNamed(obj.(*types.TypeName), nil, nil)
-
- // but record the existing type, if any
- t := obj.Type().(*types.Named)
- p.record(t)
-
- // read underlying type
- t0.SetUnderlying(p.typ(parent))
-
- // interfaces don't have associated methods
- if types.IsInterface(t0) {
- return t
- }
-
- // read associated methods
- for i := p.int(); i > 0; i-- {
- // TODO(gri) replace this with something closer to fieldName
- pos := p.pos()
- name := p.string()
- if !exported(name) {
- p.pkg()
- }
-
- recv, _ := p.paramList() // TODO(gri) do we need a full param list for the receiver?
- params, isddd := p.paramList()
- result, _ := p.paramList()
- p.int() // go:nointerface pragma - discarded
-
- sig := types.NewSignature(recv.At(0), params, result, isddd)
- t0.AddMethod(types.NewFunc(pos, parent, name, sig))
- }
-
- return t
-
- case arrayTag:
- t := new(types.Array)
- if p.trackAllTypes {
- p.record(t)
- }
-
- n := p.int64()
- *t = *types.NewArray(p.typ(parent), n)
- return t
-
- case sliceTag:
- t := new(types.Slice)
- if p.trackAllTypes {
- p.record(t)
- }
-
- *t = *types.NewSlice(p.typ(parent))
- return t
-
- case dddTag:
- t := new(dddSlice)
- if p.trackAllTypes {
- p.record(t)
- }
-
- t.elem = p.typ(parent)
- return t
-
- case structTag:
- t := new(types.Struct)
- if p.trackAllTypes {
- p.record(t)
- }
-
- *t = *types.NewStruct(p.fieldList(parent))
- return t
-
- case pointerTag:
- t := new(types.Pointer)
- if p.trackAllTypes {
- p.record(t)
- }
-
- *t = *types.NewPointer(p.typ(parent))
- return t
-
- case signatureTag:
- t := new(types.Signature)
- if p.trackAllTypes {
- p.record(t)
- }
-
- params, isddd := p.paramList()
- result, _ := p.paramList()
- *t = *types.NewSignature(nil, params, result, isddd)
- return t
-
- case interfaceTag:
- // Create a dummy entry in the type list. This is safe because we
- // cannot expect the interface type to appear in a cycle, as any
- // such cycle must contain a named type which would have been
- // first defined earlier.
- n := len(p.typList)
- if p.trackAllTypes {
- p.record(nil)
- }
-
- var embeddeds []*types.Named
- for n := p.int(); n > 0; n-- {
- p.pos()
- embeddeds = append(embeddeds, p.typ(parent).(*types.Named))
- }
-
- t := types.NewInterface(p.methodList(parent), embeddeds)
- p.interfaceList = append(p.interfaceList, t)
- if p.trackAllTypes {
- p.typList[n] = t
- }
- return t
-
- case mapTag:
- t := new(types.Map)
- if p.trackAllTypes {
- p.record(t)
- }
-
- key := p.typ(parent)
- val := p.typ(parent)
- *t = *types.NewMap(key, val)
- return t
-
- case chanTag:
- t := new(types.Chan)
- if p.trackAllTypes {
- p.record(t)
- }
-
- var dir types.ChanDir
- // tag values must match the constants in cmd/compile/internal/gc/go.go
- switch d := p.int(); d {
- case 1 /* Crecv */ :
- dir = types.RecvOnly
- case 2 /* Csend */ :
- dir = types.SendOnly
- case 3 /* Cboth */ :
- dir = types.SendRecv
- default:
- errorf("unexpected channel dir %d", d)
- }
- val := p.typ(parent)
- *t = *types.NewChan(dir, val)
- return t
-
- default:
- errorf("unexpected type tag %d", i) // panics
- panic("unreachable")
- }
-}
-
-func (p *importer) fieldList(parent *types.Package) (fields []*types.Var, tags []string) {
- if n := p.int(); n > 0 {
- fields = make([]*types.Var, n)
- tags = make([]string, n)
- for i := range fields {
- fields[i], tags[i] = p.field(parent)
- }
- }
- return
-}
-
-func (p *importer) field(parent *types.Package) (*types.Var, string) {
- pos := p.pos()
- pkg, name, alias := p.fieldName(parent)
- typ := p.typ(parent)
- tag := p.string()
-
- anonymous := false
- if name == "" {
- // anonymous field - typ must be T or *T and T must be a type name
- switch typ := deref(typ).(type) {
- case *types.Basic: // basic types are named types
- pkg = nil // // objects defined in Universe scope have no package
- name = typ.Name()
- case *types.Named:
- name = typ.Obj().Name()
- default:
- errorf("named base type expected")
- }
- anonymous = true
- } else if alias {
- // anonymous field: we have an explicit name because it's an alias
- anonymous = true
- }
-
- return types.NewField(pos, pkg, name, typ, anonymous), tag
-}
-
-func (p *importer) methodList(parent *types.Package) (methods []*types.Func) {
- if n := p.int(); n > 0 {
- methods = make([]*types.Func, n)
- for i := range methods {
- methods[i] = p.method(parent)
- }
- }
- return
-}
-
-func (p *importer) method(parent *types.Package) *types.Func {
- pos := p.pos()
- pkg, name, _ := p.fieldName(parent)
- params, isddd := p.paramList()
- result, _ := p.paramList()
- sig := types.NewSignature(nil, params, result, isddd)
- return types.NewFunc(pos, pkg, name, sig)
-}
-
-func (p *importer) fieldName(parent *types.Package) (pkg *types.Package, name string, alias bool) {
- name = p.string()
- pkg = parent
- if pkg == nil {
- // use the imported package instead
- pkg = p.pkgList[0]
- }
- if p.version == 0 && name == "_" {
- // version 0 didn't export a package for _ fields
- return
- }
- switch name {
- case "":
- // 1) field name matches base type name and is exported: nothing to do
- case "?":
- // 2) field name matches base type name and is not exported: need package
- name = ""
- pkg = p.pkg()
- case "@":
- // 3) field name doesn't match type name (alias)
- name = p.string()
- alias = true
- fallthrough
- default:
- if !exported(name) {
- pkg = p.pkg()
- }
- }
- return
-}
-
-func (p *importer) paramList() (*types.Tuple, bool) {
- n := p.int()
- if n == 0 {
- return nil, false
- }
- // negative length indicates unnamed parameters
- named := true
- if n < 0 {
- n = -n
- named = false
- }
- // n > 0
- params := make([]*types.Var, n)
- isddd := false
- for i := range params {
- params[i], isddd = p.param(named)
- }
- return types.NewTuple(params...), isddd
-}
-
-func (p *importer) param(named bool) (*types.Var, bool) {
- t := p.typ(nil)
- td, isddd := t.(*dddSlice)
- if isddd {
- t = types.NewSlice(td.elem)
- }
-
- var pkg *types.Package
- var name string
- if named {
- name = p.string()
- if name == "" {
- errorf("expected named parameter")
- }
- if name != "_" {
- pkg = p.pkg()
- }
- if i := strings.Index(name, "·"); i > 0 {
- name = name[:i] // cut off gc-specific parameter numbering
- }
- }
-
- // read and discard compiler-specific info
- p.string()
-
- return types.NewVar(token.NoPos, pkg, name, t), isddd
-}
-
-func exported(name string) bool {
- ch, _ := utf8.DecodeRuneInString(name)
- return unicode.IsUpper(ch)
-}
-
-func (p *importer) value() constant.Value {
- switch tag := p.tagOrIndex(); tag {
- case falseTag:
- return constant.MakeBool(false)
- case trueTag:
- return constant.MakeBool(true)
- case int64Tag:
- return constant.MakeInt64(p.int64())
- case floatTag:
- return p.float()
- case complexTag:
- re := p.float()
- im := p.float()
- return constant.BinaryOp(re, token.ADD, constant.MakeImag(im))
- case stringTag:
- return constant.MakeString(p.string())
- case unknownTag:
- return constant.MakeUnknown()
- default:
- errorf("unexpected value tag %d", tag) // panics
- panic("unreachable")
- }
-}
-
-func (p *importer) float() constant.Value {
- sign := p.int()
- if sign == 0 {
- return constant.MakeInt64(0)
- }
-
- exp := p.int()
- mant := []byte(p.string()) // big endian
-
- // remove leading 0's if any
- for len(mant) > 0 && mant[0] == 0 {
- mant = mant[1:]
- }
-
- // convert to little endian
- // TODO(gri) go/constant should have a more direct conversion function
- // (e.g., once it supports a big.Float based implementation)
- for i, j := 0, len(mant)-1; i < j; i, j = i+1, j-1 {
- mant[i], mant[j] = mant[j], mant[i]
- }
-
- // adjust exponent (constant.MakeFromBytes creates an integer value,
- // but mant represents the mantissa bits such that 0.5 <= mant < 1.0)
- exp -= len(mant) << 3
- if len(mant) > 0 {
- for msd := mant[len(mant)-1]; msd&0x80 == 0; msd <<= 1 {
- exp++
- }
- }
-
- x := constant.MakeFromBytes(mant)
- switch {
- case exp < 0:
- d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp))
- x = constant.BinaryOp(x, token.QUO, d)
- case exp > 0:
- x = constant.Shift(x, token.SHL, uint(exp))
- }
-
- if sign < 0 {
- x = constant.UnaryOp(token.SUB, x, 0)
- }
- return x
-}
-
-// ----------------------------------------------------------------------------
-// Low-level decoders
-
-func (p *importer) tagOrIndex() int {
- if p.debugFormat {
- p.marker('t')
- }
-
- return int(p.rawInt64())
-}
-
-func (p *importer) int() int {
- x := p.int64()
- if int64(int(x)) != x {
- errorf("exported integer too large")
- }
- return int(x)
-}
-
-func (p *importer) int64() int64 {
- if p.debugFormat {
- p.marker('i')
- }
-
- return p.rawInt64()
-}
-
-func (p *importer) path() string {
- if p.debugFormat {
- p.marker('p')
- }
- // if the path was seen before, i is its index (>= 0)
- // (the empty string is at index 0)
- i := p.rawInt64()
- if i >= 0 {
- return p.pathList[i]
- }
- // otherwise, i is the negative path length (< 0)
- a := make([]string, -i)
- for n := range a {
- a[n] = p.string()
- }
- s := strings.Join(a, "/")
- p.pathList = append(p.pathList, s)
- return s
-}
-
-func (p *importer) string() string {
- if p.debugFormat {
- p.marker('s')
- }
- // if the string was seen before, i is its index (>= 0)
- // (the empty string is at index 0)
- i := p.rawInt64()
- if i >= 0 {
- return p.strList[i]
- }
- // otherwise, i is the negative string length (< 0)
- if n := int(-i); n <= cap(p.buf) {
- p.buf = p.buf[:n]
- } else {
- p.buf = make([]byte, n)
- }
- for i := range p.buf {
- p.buf[i] = p.rawByte()
- }
- s := string(p.buf)
- p.strList = append(p.strList, s)
- return s
-}
-
-func (p *importer) marker(want byte) {
- if got := p.rawByte(); got != want {
- errorf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.read)
- }
-
- pos := p.read
- if n := int(p.rawInt64()); n != pos {
- errorf("incorrect position: got %d; want %d", n, pos)
- }
-}
-
-// rawInt64 should only be used by low-level decoders.
-func (p *importer) rawInt64() int64 {
- i, err := binary.ReadVarint(p)
- if err != nil {
- errorf("read error: %v", err)
- }
- return i
-}
-
-// rawStringln should only be used to read the initial version string.
-func (p *importer) rawStringln(b byte) string {
- p.buf = p.buf[:0]
- for b != '\n' {
- p.buf = append(p.buf, b)
- b = p.rawByte()
- }
- return string(p.buf)
-}
-
-// needed for binary.ReadVarint in rawInt64
-func (p *importer) ReadByte() (byte, error) {
- return p.rawByte(), nil
-}
-
-// byte is the bottleneck interface for reading p.data.
-// It unescapes '|' 'S' to '$' and '|' '|' to '|'.
-// rawByte should only be used by low-level decoders.
-func (p *importer) rawByte() byte {
- b := p.data[0]
- r := 1
- if b == '|' {
- b = p.data[1]
- r = 2
- switch b {
- case 'S':
- b = '$'
- case '|':
- // nothing to do
- default:
- errorf("unexpected escape sequence in export data")
- }
- }
- p.data = p.data[r:]
- p.read += r
- return b
-
-}
-
-// ----------------------------------------------------------------------------
-// Export format
-
-// Tags. Must be < 0.
-const (
- // Objects
- packageTag = -(iota + 1)
- constTag
- typeTag
- varTag
- funcTag
- endTag
-
- // Types
- namedTag
- arrayTag
- sliceTag
- dddTag
- structTag
- pointerTag
- signatureTag
- interfaceTag
- mapTag
- chanTag
-
- // Values
- falseTag
- trueTag
- int64Tag
- floatTag
- fractionTag // not used by gc
- complexTag
- stringTag
- nilTag // only used by gc (appears in exported inlined function bodies)
- unknownTag // not used by gc (only appears in packages with errors)
-
- // Type aliases
- aliasTag
-)
-
-var predeclared = []types.Type{
- // basic types
- types.Typ[types.Bool],
- types.Typ[types.Int],
- types.Typ[types.Int8],
- types.Typ[types.Int16],
- types.Typ[types.Int32],
- types.Typ[types.Int64],
- types.Typ[types.Uint],
- types.Typ[types.Uint8],
- types.Typ[types.Uint16],
- types.Typ[types.Uint32],
- types.Typ[types.Uint64],
- types.Typ[types.Uintptr],
- types.Typ[types.Float32],
- types.Typ[types.Float64],
- types.Typ[types.Complex64],
- types.Typ[types.Complex128],
- types.Typ[types.String],
-
- // basic type aliases
- types.Universe.Lookup("byte").Type(),
- types.Universe.Lookup("rune").Type(),
-
- // error
- types.Universe.Lookup("error").Type(),
-
- // untyped types
- types.Typ[types.UntypedBool],
- types.Typ[types.UntypedInt],
- types.Typ[types.UntypedRune],
- types.Typ[types.UntypedFloat],
- types.Typ[types.UntypedComplex],
- types.Typ[types.UntypedString],
- types.Typ[types.UntypedNil],
-
- // package unsafe
- types.Typ[types.UnsafePointer],
-
- // invalid type
- types.Typ[types.Invalid], // only appears in packages with errors
-
- // used internally by gc; never used by this package or in .a files
- anyType{},
-}
-
-type anyType struct{}
-
-func (t anyType) Underlying() types.Type { return t }
-func (t anyType) String() string { return "any" }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/exportdata.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/exportdata.go
deleted file mode 100644
index f33dc5613..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/exportdata.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go.
-
-// This file implements FindExportData.
-
-package gcimporter
-
-import (
- "bufio"
- "fmt"
- "io"
- "strconv"
- "strings"
-)
-
-func readGopackHeader(r *bufio.Reader) (name string, size int, err error) {
- // See $GOROOT/include/ar.h.
- hdr := make([]byte, 16+12+6+6+8+10+2)
- _, err = io.ReadFull(r, hdr)
- if err != nil {
- return
- }
- // leave for debugging
- if false {
- fmt.Printf("header: %s", hdr)
- }
- s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10]))
- size, err = strconv.Atoi(s)
- if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' {
- err = fmt.Errorf("invalid archive header")
- return
- }
- name = strings.TrimSpace(string(hdr[:16]))
- return
-}
-
-// FindExportData positions the reader r at the beginning of the
-// export data section of an underlying GC-created object/archive
-// file by reading from it. The reader must be positioned at the
-// start of the file before calling this function. The hdr result
-// is the string before the export data, either "$$" or "$$B".
-//
-func FindExportData(r *bufio.Reader) (hdr string, err error) {
- // Read first line to make sure this is an object file.
- line, err := r.ReadSlice('\n')
- if err != nil {
- err = fmt.Errorf("can't find export data (%v)", err)
- return
- }
-
- if string(line) == "!\n" {
- // Archive file. Scan to __.PKGDEF.
- var name string
- if name, _, err = readGopackHeader(r); err != nil {
- return
- }
-
- // First entry should be __.PKGDEF.
- if name != "__.PKGDEF" {
- err = fmt.Errorf("go archive is missing __.PKGDEF")
- return
- }
-
- // Read first line of __.PKGDEF data, so that line
- // is once again the first line of the input.
- if line, err = r.ReadSlice('\n'); err != nil {
- err = fmt.Errorf("can't find export data (%v)", err)
- return
- }
- }
-
- // Now at __.PKGDEF in archive or still at beginning of file.
- // Either way, line should begin with "go object ".
- if !strings.HasPrefix(string(line), "go object ") {
- err = fmt.Errorf("not a Go object file")
- return
- }
-
- // Skip over object header to export data.
- // Begins after first line starting with $$.
- for line[0] != '$' {
- if line, err = r.ReadSlice('\n'); err != nil {
- err = fmt.Errorf("can't find export data (%v)", err)
- return
- }
- }
- hdr = string(line)
-
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/gcimporter.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/gcimporter.go
deleted file mode 100644
index 6fbc9d761..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/gcimporter.go
+++ /dev/null
@@ -1,1041 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/gcimporter.go,
-// but it also contains the original source-based importer code for Go1.6.
-// Once we stop supporting 1.6, we can remove that code.
-
-// Package gcimporter15 provides various functions for reading
-// gc-generated object files that can be used to implement the
-// Importer interface defined by the Go 1.5 standard library package.
-//
-// Deprecated: this package will be deleted in October 2017.
-// New code should use golang.org/x/tools/go/gcexportdata.
-//
-package gcimporter // import "golang.org/x/tools/go/gcimporter15"
-
-import (
- "bufio"
- "errors"
- "fmt"
- "go/build"
- exact "go/constant"
- "go/token"
- "go/types"
- "io"
- "io/ioutil"
- "os"
- "path/filepath"
- "sort"
- "strconv"
- "strings"
- "text/scanner"
-)
-
-// debugging/development support
-const debug = false
-
-var pkgExts = [...]string{".a", ".o"}
-
-// FindPkg returns the filename and unique package id for an import
-// path based on package information provided by build.Import (using
-// the build.Default build.Context). A relative srcDir is interpreted
-// relative to the current working directory.
-// If no file was found, an empty filename is returned.
-//
-func FindPkg(path, srcDir string) (filename, id string) {
- if path == "" {
- return
- }
-
- var noext string
- switch {
- default:
- // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
- // Don't require the source files to be present.
- if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
- srcDir = abs
- }
- bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
- if bp.PkgObj == "" {
- return
- }
- noext = strings.TrimSuffix(bp.PkgObj, ".a")
- id = bp.ImportPath
-
- case build.IsLocalImport(path):
- // "./x" -> "/this/directory/x.ext", "/this/directory/x"
- noext = filepath.Join(srcDir, path)
- id = noext
-
- case filepath.IsAbs(path):
- // for completeness only - go/build.Import
- // does not support absolute imports
- // "/x" -> "/x.ext", "/x"
- noext = path
- id = path
- }
-
- if false { // for debugging
- if path != id {
- fmt.Printf("%s -> %s\n", path, id)
- }
- }
-
- // try extensions
- for _, ext := range pkgExts {
- filename = noext + ext
- if f, err := os.Stat(filename); err == nil && !f.IsDir() {
- return
- }
- }
-
- filename = "" // not found
- return
-}
-
-// ImportData imports a package by reading the gc-generated export data,
-// adds the corresponding package object to the packages map indexed by id,
-// and returns the object.
-//
-// The packages map must contains all packages already imported. The data
-// reader position must be the beginning of the export data section. The
-// filename is only used in error messages.
-//
-// If packages[id] contains the completely imported package, that package
-// can be used directly, and there is no need to call this function (but
-// there is also no harm but for extra time used).
-//
-func ImportData(packages map[string]*types.Package, filename, id string, data io.Reader) (pkg *types.Package, err error) {
- // support for parser error handling
- defer func() {
- switch r := recover().(type) {
- case nil:
- // nothing to do
- case importError:
- err = r
- default:
- panic(r) // internal error
- }
- }()
-
- var p parser
- p.init(filename, id, data, packages)
- pkg = p.parseExport()
-
- return
-}
-
-// Import imports a gc-generated package given its import path and srcDir, adds
-// the corresponding package object to the packages map, and returns the object.
-// The packages map must contain all packages already imported.
-//
-func Import(packages map[string]*types.Package, path, srcDir string) (pkg *types.Package, err error) {
- filename, id := FindPkg(path, srcDir)
- if filename == "" {
- if path == "unsafe" {
- return types.Unsafe, nil
- }
- err = fmt.Errorf("can't find import: %s", id)
- return
- }
-
- // no need to re-import if the package was imported completely before
- if pkg = packages[id]; pkg != nil && pkg.Complete() {
- return
- }
-
- // open file
- f, err := os.Open(filename)
- if err != nil {
- return
- }
- defer func() {
- f.Close()
- if err != nil {
- // add file name to error
- err = fmt.Errorf("reading export data: %s: %v", filename, err)
- }
- }()
-
- var hdr string
- buf := bufio.NewReader(f)
- if hdr, err = FindExportData(buf); err != nil {
- return
- }
-
- switch hdr {
- case "$$\n":
- return ImportData(packages, filename, id, buf)
- case "$$B\n":
- var data []byte
- data, err = ioutil.ReadAll(buf)
- if err == nil {
- fset := token.NewFileSet()
- _, pkg, err = BImportData(fset, packages, data, id)
- return
- }
- default:
- err = fmt.Errorf("unknown export data header: %q", hdr)
- }
-
- return
-}
-
-// ----------------------------------------------------------------------------
-// Parser
-
-// TODO(gri) Imported objects don't have position information.
-// Ideally use the debug table line info; alternatively
-// create some fake position (or the position of the
-// import). That way error messages referring to imported
-// objects can print meaningful information.
-
-// parser parses the exports inside a gc compiler-produced
-// object/archive file and populates its scope with the results.
-type parser struct {
- scanner scanner.Scanner
- tok rune // current token
- lit string // literal string; only valid for Ident, Int, String tokens
- id string // package id of imported package
- sharedPkgs map[string]*types.Package // package id -> package object (across importer)
- localPkgs map[string]*types.Package // package id -> package object (just this package)
-}
-
-func (p *parser) init(filename, id string, src io.Reader, packages map[string]*types.Package) {
- p.scanner.Init(src)
- p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
- p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
- p.scanner.Whitespace = 1<<'\t' | 1<<' '
- p.scanner.Filename = filename // for good error messages
- p.next()
- p.id = id
- p.sharedPkgs = packages
- if debug {
- // check consistency of packages map
- for _, pkg := range packages {
- if pkg.Name() == "" {
- fmt.Printf("no package name for %s\n", pkg.Path())
- }
- }
- }
-}
-
-func (p *parser) next() {
- p.tok = p.scanner.Scan()
- switch p.tok {
- case scanner.Ident, scanner.Int, scanner.Char, scanner.String, '·':
- p.lit = p.scanner.TokenText()
- default:
- p.lit = ""
- }
- if debug {
- fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit)
- }
-}
-
-func declTypeName(pkg *types.Package, name string) *types.TypeName {
- scope := pkg.Scope()
- if obj := scope.Lookup(name); obj != nil {
- return obj.(*types.TypeName)
- }
- obj := types.NewTypeName(token.NoPos, pkg, name, nil)
- // a named type may be referred to before the underlying type
- // is known - set it up
- types.NewNamed(obj, nil, nil)
- scope.Insert(obj)
- return obj
-}
-
-// ----------------------------------------------------------------------------
-// Error handling
-
-// Internal errors are boxed as importErrors.
-type importError struct {
- pos scanner.Position
- err error
-}
-
-func (e importError) Error() string {
- return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err)
-}
-
-func (p *parser) error(err interface{}) {
- if s, ok := err.(string); ok {
- err = errors.New(s)
- }
- // panic with a runtime.Error if err is not an error
- panic(importError{p.scanner.Pos(), err.(error)})
-}
-
-func (p *parser) errorf(format string, args ...interface{}) {
- p.error(fmt.Sprintf(format, args...))
-}
-
-func (p *parser) expect(tok rune) string {
- lit := p.lit
- if p.tok != tok {
- p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit)
- }
- p.next()
- return lit
-}
-
-func (p *parser) expectSpecial(tok string) {
- sep := 'x' // not white space
- i := 0
- for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' {
- sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
- p.next()
- i++
- }
- if i < len(tok) {
- p.errorf("expected %q, got %q", tok, tok[0:i])
- }
-}
-
-func (p *parser) expectKeyword(keyword string) {
- lit := p.expect(scanner.Ident)
- if lit != keyword {
- p.errorf("expected keyword %s, got %q", keyword, lit)
- }
-}
-
-// ----------------------------------------------------------------------------
-// Qualified and unqualified names
-
-// PackageId = string_lit .
-//
-func (p *parser) parsePackageId() string {
- id, err := strconv.Unquote(p.expect(scanner.String))
- if err != nil {
- p.error(err)
- }
- // id == "" stands for the imported package id
- // (only known at time of package installation)
- if id == "" {
- id = p.id
- }
- return id
-}
-
-// PackageName = ident .
-//
-func (p *parser) parsePackageName() string {
- return p.expect(scanner.Ident)
-}
-
-// dotIdentifier = ( ident | '·' ) { ident | int | '·' } .
-func (p *parser) parseDotIdent() string {
- ident := ""
- if p.tok != scanner.Int {
- sep := 'x' // not white space
- for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' {
- ident += p.lit
- sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
- p.next()
- }
- }
- if ident == "" {
- p.expect(scanner.Ident) // use expect() for error handling
- }
- return ident
-}
-
-// QualifiedName = "@" PackageId "." ( "?" | dotIdentifier ) .
-//
-func (p *parser) parseQualifiedName() (id, name string) {
- p.expect('@')
- id = p.parsePackageId()
- p.expect('.')
- // Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields.
- if p.tok == '?' {
- p.next()
- } else {
- name = p.parseDotIdent()
- }
- return
-}
-
-// getPkg returns the package for a given id. If the package is
-// not found, create the package and add it to the p.localPkgs
-// and p.sharedPkgs maps. name is the (expected) name of the
-// package. If name == "", the package name is expected to be
-// set later via an import clause in the export data.
-//
-// id identifies a package, usually by a canonical package path like
-// "encoding/json" but possibly by a non-canonical import path like
-// "./json".
-//
-func (p *parser) getPkg(id, name string) *types.Package {
- // package unsafe is not in the packages maps - handle explicitly
- if id == "unsafe" {
- return types.Unsafe
- }
-
- pkg := p.localPkgs[id]
- if pkg == nil {
- // first import of id from this package
- pkg = p.sharedPkgs[id]
- if pkg == nil {
- // first import of id by this importer;
- // add (possibly unnamed) pkg to shared packages
- pkg = types.NewPackage(id, name)
- p.sharedPkgs[id] = pkg
- }
- // add (possibly unnamed) pkg to local packages
- if p.localPkgs == nil {
- p.localPkgs = make(map[string]*types.Package)
- }
- p.localPkgs[id] = pkg
- } else if name != "" {
- // package exists already and we have an expected package name;
- // make sure names match or set package name if necessary
- if pname := pkg.Name(); pname == "" {
- pkg.SetName(name)
- } else if pname != name {
- p.errorf("%s package name mismatch: %s (given) vs %s (expected)", id, pname, name)
- }
- }
- return pkg
-}
-
-// parseExportedName is like parseQualifiedName, but
-// the package id is resolved to an imported *types.Package.
-//
-func (p *parser) parseExportedName() (pkg *types.Package, name string) {
- id, name := p.parseQualifiedName()
- pkg = p.getPkg(id, "")
- return
-}
-
-// ----------------------------------------------------------------------------
-// Types
-
-// BasicType = identifier .
-//
-func (p *parser) parseBasicType() types.Type {
- id := p.expect(scanner.Ident)
- obj := types.Universe.Lookup(id)
- if obj, ok := obj.(*types.TypeName); ok {
- return obj.Type()
- }
- p.errorf("not a basic type: %s", id)
- return nil
-}
-
-// ArrayType = "[" int_lit "]" Type .
-//
-func (p *parser) parseArrayType(parent *types.Package) types.Type {
- // "[" already consumed and lookahead known not to be "]"
- lit := p.expect(scanner.Int)
- p.expect(']')
- elem := p.parseType(parent)
- n, err := strconv.ParseInt(lit, 10, 64)
- if err != nil {
- p.error(err)
- }
- return types.NewArray(elem, n)
-}
-
-// MapType = "map" "[" Type "]" Type .
-//
-func (p *parser) parseMapType(parent *types.Package) types.Type {
- p.expectKeyword("map")
- p.expect('[')
- key := p.parseType(parent)
- p.expect(']')
- elem := p.parseType(parent)
- return types.NewMap(key, elem)
-}
-
-// Name = identifier | "?" | QualifiedName .
-//
-// For unqualified and anonymous names, the returned package is the parent
-// package unless parent == nil, in which case the returned package is the
-// package being imported. (The parent package is not nil if the the name
-// is an unqualified struct field or interface method name belonging to a
-// type declared in another package.)
-//
-// For qualified names, the returned package is nil (and not created if
-// it doesn't exist yet) unless materializePkg is set (which creates an
-// unnamed package with valid package path). In the latter case, a
-// subsequent import clause is expected to provide a name for the package.
-//
-func (p *parser) parseName(parent *types.Package, materializePkg bool) (pkg *types.Package, name string) {
- pkg = parent
- if pkg == nil {
- pkg = p.sharedPkgs[p.id]
- }
- switch p.tok {
- case scanner.Ident:
- name = p.lit
- p.next()
- case '?':
- // anonymous
- p.next()
- case '@':
- // exported name prefixed with package path
- pkg = nil
- var id string
- id, name = p.parseQualifiedName()
- if materializePkg {
- pkg = p.getPkg(id, "")
- }
- default:
- p.error("name expected")
- }
- return
-}
-
-func deref(typ types.Type) types.Type {
- if p, _ := typ.(*types.Pointer); p != nil {
- return p.Elem()
- }
- return typ
-}
-
-// Field = Name Type [ string_lit ] .
-//
-func (p *parser) parseField(parent *types.Package) (*types.Var, string) {
- pkg, name := p.parseName(parent, true)
-
- if name == "_" {
- // Blank fields should be package-qualified because they
- // are unexported identifiers, but gc does not qualify them.
- // Assuming that the ident belongs to the current package
- // causes types to change during re-exporting, leading
- // to spurious "can't assign A to B" errors from go/types.
- // As a workaround, pretend all blank fields belong
- // to the same unique dummy package.
- const blankpkg = "<_>"
- pkg = p.getPkg(blankpkg, blankpkg)
- }
-
- typ := p.parseType(parent)
- anonymous := false
- if name == "" {
- // anonymous field - typ must be T or *T and T must be a type name
- switch typ := deref(typ).(type) {
- case *types.Basic: // basic types are named types
- pkg = nil // objects defined in Universe scope have no package
- name = typ.Name()
- case *types.Named:
- name = typ.Obj().Name()
- default:
- p.errorf("anonymous field expected")
- }
- anonymous = true
- }
- tag := ""
- if p.tok == scanner.String {
- s := p.expect(scanner.String)
- var err error
- tag, err = strconv.Unquote(s)
- if err != nil {
- p.errorf("invalid struct tag %s: %s", s, err)
- }
- }
- return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag
-}
-
-// StructType = "struct" "{" [ FieldList ] "}" .
-// FieldList = Field { ";" Field } .
-//
-func (p *parser) parseStructType(parent *types.Package) types.Type {
- var fields []*types.Var
- var tags []string
-
- p.expectKeyword("struct")
- p.expect('{')
- for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
- if i > 0 {
- p.expect(';')
- }
- fld, tag := p.parseField(parent)
- if tag != "" && tags == nil {
- tags = make([]string, i)
- }
- if tags != nil {
- tags = append(tags, tag)
- }
- fields = append(fields, fld)
- }
- p.expect('}')
-
- return types.NewStruct(fields, tags)
-}
-
-// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] .
-//
-func (p *parser) parseParameter() (par *types.Var, isVariadic bool) {
- _, name := p.parseName(nil, false)
- // remove gc-specific parameter numbering
- if i := strings.Index(name, "·"); i >= 0 {
- name = name[:i]
- }
- if p.tok == '.' {
- p.expectSpecial("...")
- isVariadic = true
- }
- typ := p.parseType(nil)
- if isVariadic {
- typ = types.NewSlice(typ)
- }
- // ignore argument tag (e.g. "noescape")
- if p.tok == scanner.String {
- p.next()
- }
- // TODO(gri) should we provide a package?
- par = types.NewVar(token.NoPos, nil, name, typ)
- return
-}
-
-// Parameters = "(" [ ParameterList ] ")" .
-// ParameterList = { Parameter "," } Parameter .
-//
-func (p *parser) parseParameters() (list []*types.Var, isVariadic bool) {
- p.expect('(')
- for p.tok != ')' && p.tok != scanner.EOF {
- if len(list) > 0 {
- p.expect(',')
- }
- par, variadic := p.parseParameter()
- list = append(list, par)
- if variadic {
- if isVariadic {
- p.error("... not on final argument")
- }
- isVariadic = true
- }
- }
- p.expect(')')
-
- return
-}
-
-// Signature = Parameters [ Result ] .
-// Result = Type | Parameters .
-//
-func (p *parser) parseSignature(recv *types.Var) *types.Signature {
- params, isVariadic := p.parseParameters()
-
- // optional result type
- var results []*types.Var
- if p.tok == '(' {
- var variadic bool
- results, variadic = p.parseParameters()
- if variadic {
- p.error("... not permitted on result type")
- }
- }
-
- return types.NewSignature(recv, types.NewTuple(params...), types.NewTuple(results...), isVariadic)
-}
-
-// InterfaceType = "interface" "{" [ MethodList ] "}" .
-// MethodList = Method { ";" Method } .
-// Method = Name Signature .
-//
-// The methods of embedded interfaces are always "inlined"
-// by the compiler and thus embedded interfaces are never
-// visible in the export data.
-//
-func (p *parser) parseInterfaceType(parent *types.Package) types.Type {
- var methods []*types.Func
-
- p.expectKeyword("interface")
- p.expect('{')
- for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
- if i > 0 {
- p.expect(';')
- }
- pkg, name := p.parseName(parent, true)
- sig := p.parseSignature(nil)
- methods = append(methods, types.NewFunc(token.NoPos, pkg, name, sig))
- }
- p.expect('}')
-
- // Complete requires the type's embedded interfaces to be fully defined,
- // but we do not define any
- return types.NewInterface(methods, nil).Complete()
-}
-
-// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type .
-//
-func (p *parser) parseChanType(parent *types.Package) types.Type {
- dir := types.SendRecv
- if p.tok == scanner.Ident {
- p.expectKeyword("chan")
- if p.tok == '<' {
- p.expectSpecial("<-")
- dir = types.SendOnly
- }
- } else {
- p.expectSpecial("<-")
- p.expectKeyword("chan")
- dir = types.RecvOnly
- }
- elem := p.parseType(parent)
- return types.NewChan(dir, elem)
-}
-
-// Type =
-// BasicType | TypeName | ArrayType | SliceType | StructType |
-// PointerType | FuncType | InterfaceType | MapType | ChanType |
-// "(" Type ")" .
-//
-// BasicType = ident .
-// TypeName = ExportedName .
-// SliceType = "[" "]" Type .
-// PointerType = "*" Type .
-// FuncType = "func" Signature .
-//
-func (p *parser) parseType(parent *types.Package) types.Type {
- switch p.tok {
- case scanner.Ident:
- switch p.lit {
- default:
- return p.parseBasicType()
- case "struct":
- return p.parseStructType(parent)
- case "func":
- // FuncType
- p.next()
- return p.parseSignature(nil)
- case "interface":
- return p.parseInterfaceType(parent)
- case "map":
- return p.parseMapType(parent)
- case "chan":
- return p.parseChanType(parent)
- }
- case '@':
- // TypeName
- pkg, name := p.parseExportedName()
- return declTypeName(pkg, name).Type()
- case '[':
- p.next() // look ahead
- if p.tok == ']' {
- // SliceType
- p.next()
- return types.NewSlice(p.parseType(parent))
- }
- return p.parseArrayType(parent)
- case '*':
- // PointerType
- p.next()
- return types.NewPointer(p.parseType(parent))
- case '<':
- return p.parseChanType(parent)
- case '(':
- // "(" Type ")"
- p.next()
- typ := p.parseType(parent)
- p.expect(')')
- return typ
- }
- p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit)
- return nil
-}
-
-// ----------------------------------------------------------------------------
-// Declarations
-
-// ImportDecl = "import" PackageName PackageId .
-//
-func (p *parser) parseImportDecl() {
- p.expectKeyword("import")
- name := p.parsePackageName()
- p.getPkg(p.parsePackageId(), name)
-}
-
-// int_lit = [ "+" | "-" ] { "0" ... "9" } .
-//
-func (p *parser) parseInt() string {
- s := ""
- switch p.tok {
- case '-':
- s = "-"
- p.next()
- case '+':
- p.next()
- }
- return s + p.expect(scanner.Int)
-}
-
-// number = int_lit [ "p" int_lit ] .
-//
-func (p *parser) parseNumber() (typ *types.Basic, val exact.Value) {
- // mantissa
- mant := exact.MakeFromLiteral(p.parseInt(), token.INT, 0)
- if mant == nil {
- panic("invalid mantissa")
- }
-
- if p.lit == "p" {
- // exponent (base 2)
- p.next()
- exp, err := strconv.ParseInt(p.parseInt(), 10, 0)
- if err != nil {
- p.error(err)
- }
- if exp < 0 {
- denom := exact.MakeInt64(1)
- denom = exact.Shift(denom, token.SHL, uint(-exp))
- typ = types.Typ[types.UntypedFloat]
- val = exact.BinaryOp(mant, token.QUO, denom)
- return
- }
- if exp > 0 {
- mant = exact.Shift(mant, token.SHL, uint(exp))
- }
- typ = types.Typ[types.UntypedFloat]
- val = mant
- return
- }
-
- typ = types.Typ[types.UntypedInt]
- val = mant
- return
-}
-
-// ConstDecl = "const" ExportedName [ Type ] "=" Literal .
-// Literal = bool_lit | int_lit | float_lit | complex_lit | rune_lit | string_lit .
-// bool_lit = "true" | "false" .
-// complex_lit = "(" float_lit "+" float_lit "i" ")" .
-// rune_lit = "(" int_lit "+" int_lit ")" .
-// string_lit = `"` { unicode_char } `"` .
-//
-func (p *parser) parseConstDecl() {
- p.expectKeyword("const")
- pkg, name := p.parseExportedName()
-
- var typ0 types.Type
- if p.tok != '=' {
- // constant types are never structured - no need for parent type
- typ0 = p.parseType(nil)
- }
-
- p.expect('=')
- var typ types.Type
- var val exact.Value
- switch p.tok {
- case scanner.Ident:
- // bool_lit
- if p.lit != "true" && p.lit != "false" {
- p.error("expected true or false")
- }
- typ = types.Typ[types.UntypedBool]
- val = exact.MakeBool(p.lit == "true")
- p.next()
-
- case '-', scanner.Int:
- // int_lit
- typ, val = p.parseNumber()
-
- case '(':
- // complex_lit or rune_lit
- p.next()
- if p.tok == scanner.Char {
- p.next()
- p.expect('+')
- typ = types.Typ[types.UntypedRune]
- _, val = p.parseNumber()
- p.expect(')')
- break
- }
- _, re := p.parseNumber()
- p.expect('+')
- _, im := p.parseNumber()
- p.expectKeyword("i")
- p.expect(')')
- typ = types.Typ[types.UntypedComplex]
- val = exact.BinaryOp(re, token.ADD, exact.MakeImag(im))
-
- case scanner.Char:
- // rune_lit
- typ = types.Typ[types.UntypedRune]
- val = exact.MakeFromLiteral(p.lit, token.CHAR, 0)
- p.next()
-
- case scanner.String:
- // string_lit
- typ = types.Typ[types.UntypedString]
- val = exact.MakeFromLiteral(p.lit, token.STRING, 0)
- p.next()
-
- default:
- p.errorf("expected literal got %s", scanner.TokenString(p.tok))
- }
-
- if typ0 == nil {
- typ0 = typ
- }
-
- pkg.Scope().Insert(types.NewConst(token.NoPos, pkg, name, typ0, val))
-}
-
-// TypeDecl = "type" ExportedName Type .
-//
-func (p *parser) parseTypeDecl() {
- p.expectKeyword("type")
- pkg, name := p.parseExportedName()
- obj := declTypeName(pkg, name)
-
- // The type object may have been imported before and thus already
- // have a type associated with it. We still need to parse the type
- // structure, but throw it away if the object already has a type.
- // This ensures that all imports refer to the same type object for
- // a given type declaration.
- typ := p.parseType(pkg)
-
- if name := obj.Type().(*types.Named); name.Underlying() == nil {
- name.SetUnderlying(typ)
- }
-}
-
-// VarDecl = "var" ExportedName Type .
-//
-func (p *parser) parseVarDecl() {
- p.expectKeyword("var")
- pkg, name := p.parseExportedName()
- typ := p.parseType(pkg)
- pkg.Scope().Insert(types.NewVar(token.NoPos, pkg, name, typ))
-}
-
-// Func = Signature [ Body ] .
-// Body = "{" ... "}" .
-//
-func (p *parser) parseFunc(recv *types.Var) *types.Signature {
- sig := p.parseSignature(recv)
- if p.tok == '{' {
- p.next()
- for i := 1; i > 0; p.next() {
- switch p.tok {
- case '{':
- i++
- case '}':
- i--
- }
- }
- }
- return sig
-}
-
-// MethodDecl = "func" Receiver Name Func .
-// Receiver = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" .
-//
-func (p *parser) parseMethodDecl() {
- // "func" already consumed
- p.expect('(')
- recv, _ := p.parseParameter() // receiver
- p.expect(')')
-
- // determine receiver base type object
- base := deref(recv.Type()).(*types.Named)
-
- // parse method name, signature, and possibly inlined body
- _, name := p.parseName(nil, false)
- sig := p.parseFunc(recv)
-
- // methods always belong to the same package as the base type object
- pkg := base.Obj().Pkg()
-
- // add method to type unless type was imported before
- // and method exists already
- // TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small.
- base.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig))
-}
-
-// FuncDecl = "func" ExportedName Func .
-//
-func (p *parser) parseFuncDecl() {
- // "func" already consumed
- pkg, name := p.parseExportedName()
- typ := p.parseFunc(nil)
- pkg.Scope().Insert(types.NewFunc(token.NoPos, pkg, name, typ))
-}
-
-// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" .
-//
-func (p *parser) parseDecl() {
- if p.tok == scanner.Ident {
- switch p.lit {
- case "import":
- p.parseImportDecl()
- case "const":
- p.parseConstDecl()
- case "type":
- p.parseTypeDecl()
- case "var":
- p.parseVarDecl()
- case "func":
- p.next() // look ahead
- if p.tok == '(' {
- p.parseMethodDecl()
- } else {
- p.parseFuncDecl()
- }
- }
- }
- p.expect('\n')
-}
-
-// ----------------------------------------------------------------------------
-// Export
-
-// Export = "PackageClause { Decl } "$$" .
-// PackageClause = "package" PackageName [ "safe" ] "\n" .
-//
-func (p *parser) parseExport() *types.Package {
- p.expectKeyword("package")
- name := p.parsePackageName()
- if p.tok == scanner.Ident && p.lit == "safe" {
- // package was compiled with -u option - ignore
- p.next()
- }
- p.expect('\n')
-
- pkg := p.getPkg(p.id, name)
-
- for p.tok != '$' && p.tok != scanner.EOF {
- p.parseDecl()
- }
-
- if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' {
- // don't call next()/expect() since reading past the
- // export data may cause scanner errors (e.g. NUL chars)
- p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch)
- }
-
- if n := p.scanner.ErrorCount; n != 0 {
- p.errorf("expected no scanner errors, got %d", n)
- }
-
- // Record all locally referenced packages as imports.
- var imports []*types.Package
- for id, pkg2 := range p.localPkgs {
- if pkg2.Name() == "" {
- p.errorf("%s package has no name", id)
- }
- if id == p.id {
- continue // avoid self-edge
- }
- imports = append(imports, pkg2)
- }
- sort.Sort(byPath(imports))
- pkg.SetImports(imports)
-
- // package was imported completely and without errors
- pkg.MarkComplete()
-
- return pkg
-}
-
-type byPath []*types.Package
-
-func (a byPath) Len() int { return len(a) }
-func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/isAlias18.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/isAlias18.go
deleted file mode 100644
index 225ffeedf..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/isAlias18.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.9
-
-package gcimporter
-
-import "go/types"
-
-func isAlias(obj *types.TypeName) bool {
- return false // there are no type aliases before Go 1.9
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/isAlias19.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/isAlias19.go
deleted file mode 100644
index c2025d84a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/gcimporter15/isAlias19.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.9
-
-package gcimporter
-
-import "go/types"
-
-func isAlias(obj *types.TypeName) bool {
- return obj.IsAlias()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/cgo.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/cgo.go
deleted file mode 100644
index 72c6f502d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/cgo.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-// This file handles cgo preprocessing of files containing `import "C"`.
-//
-// DESIGN
-//
-// The approach taken is to run the cgo processor on the package's
-// CgoFiles and parse the output, faking the filenames of the
-// resulting ASTs so that the synthetic file containing the C types is
-// called "C" (e.g. "~/go/src/net/C") and the preprocessed files
-// have their original names (e.g. "~/go/src/net/cgo_unix.go"),
-// not the names of the actual temporary files.
-//
-// The advantage of this approach is its fidelity to 'go build'. The
-// downside is that the token.Position.Offset for each AST node is
-// incorrect, being an offset within the temporary file. Line numbers
-// should still be correct because of the //line comments.
-//
-// The logic of this file is mostly plundered from the 'go build'
-// tool, which also invokes the cgo preprocessor.
-//
-//
-// REJECTED ALTERNATIVE
-//
-// An alternative approach that we explored is to extend go/types'
-// Importer mechanism to provide the identity of the importing package
-// so that each time `import "C"` appears it resolves to a different
-// synthetic package containing just the objects needed in that case.
-// The loader would invoke cgo but parse only the cgo_types.go file
-// defining the package-level objects, discarding the other files
-// resulting from preprocessing.
-//
-// The benefit of this approach would have been that source-level
-// syntax information would correspond exactly to the original cgo
-// file, with no preprocessing involved, making source tools like
-// godoc, guru, and eg happy. However, the approach was rejected
-// due to the additional complexity it would impose on go/types. (It
-// made for a beautiful demo, though.)
-//
-// cgo files, despite their *.go extension, are not legal Go source
-// files per the specification since they may refer to unexported
-// members of package "C" such as C.int. Also, a function such as
-// C.getpwent has in effect two types, one matching its C type and one
-// which additionally returns (errno C.int). The cgo preprocessor
-// uses name mangling to distinguish these two functions in the
-// processed code, but go/types would need to duplicate this logic in
-// its handling of function calls, analogous to the treatment of map
-// lookups in which y=m[k] and y,ok=m[k] are both legal.
-
-import (
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
- "strings"
-)
-
-// processCgoFiles invokes the cgo preprocessor on bp.CgoFiles, parses
-// the output and returns the resulting ASTs.
-//
-func processCgoFiles(bp *build.Package, fset *token.FileSet, DisplayPath func(path string) string, mode parser.Mode) ([]*ast.File, error) {
- tmpdir, err := ioutil.TempDir("", strings.Replace(bp.ImportPath, "/", "_", -1)+"_C")
- if err != nil {
- return nil, err
- }
- defer os.RemoveAll(tmpdir)
-
- pkgdir := bp.Dir
- if DisplayPath != nil {
- pkgdir = DisplayPath(pkgdir)
- }
-
- cgoFiles, cgoDisplayFiles, err := runCgo(bp, pkgdir, tmpdir)
- if err != nil {
- return nil, err
- }
- var files []*ast.File
- for i := range cgoFiles {
- rd, err := os.Open(cgoFiles[i])
- if err != nil {
- return nil, err
- }
- display := filepath.Join(bp.Dir, cgoDisplayFiles[i])
- f, err := parser.ParseFile(fset, display, rd, mode)
- rd.Close()
- if err != nil {
- return nil, err
- }
- files = append(files, f)
- }
- return files, nil
-}
-
-var cgoRe = regexp.MustCompile(`[/\\:]`)
-
-// runCgo invokes the cgo preprocessor on bp.CgoFiles and returns two
-// lists of files: the resulting processed files (in temporary
-// directory tmpdir) and the corresponding names of the unprocessed files.
-//
-// runCgo is adapted from (*builder).cgo in
-// $GOROOT/src/cmd/go/build.go, but these features are unsupported:
-// Objective C, CGOPKGPATH, CGO_FLAGS.
-//
-func runCgo(bp *build.Package, pkgdir, tmpdir string) (files, displayFiles []string, err error) {
- cgoCPPFLAGS, _, _, _ := cflags(bp, true)
- _, cgoexeCFLAGS, _, _ := cflags(bp, false)
-
- if len(bp.CgoPkgConfig) > 0 {
- pcCFLAGS, err := pkgConfigFlags(bp)
- if err != nil {
- return nil, nil, err
- }
- cgoCPPFLAGS = append(cgoCPPFLAGS, pcCFLAGS...)
- }
-
- // Allows including _cgo_export.h from .[ch] files in the package.
- cgoCPPFLAGS = append(cgoCPPFLAGS, "-I", tmpdir)
-
- // _cgo_gotypes.go (displayed "C") contains the type definitions.
- files = append(files, filepath.Join(tmpdir, "_cgo_gotypes.go"))
- displayFiles = append(displayFiles, "C")
- for _, fn := range bp.CgoFiles {
- // "foo.cgo1.go" (displayed "foo.go") is the processed Go source.
- f := cgoRe.ReplaceAllString(fn[:len(fn)-len("go")], "_")
- files = append(files, filepath.Join(tmpdir, f+"cgo1.go"))
- displayFiles = append(displayFiles, fn)
- }
-
- var cgoflags []string
- if bp.Goroot && bp.ImportPath == "runtime/cgo" {
- cgoflags = append(cgoflags, "-import_runtime_cgo=false")
- }
- if bp.Goroot && bp.ImportPath == "runtime/race" || bp.ImportPath == "runtime/cgo" {
- cgoflags = append(cgoflags, "-import_syscall=false")
- }
-
- args := stringList(
- "go", "tool", "cgo", "-objdir", tmpdir, cgoflags, "--",
- cgoCPPFLAGS, cgoexeCFLAGS, bp.CgoFiles,
- )
- if false {
- log.Printf("Running cgo for package %q: %s (dir=%s)", bp.ImportPath, args, pkgdir)
- }
- cmd := exec.Command(args[0], args[1:]...)
- cmd.Dir = pkgdir
- cmd.Stdout = os.Stderr
- cmd.Stderr = os.Stderr
- if err := cmd.Run(); err != nil {
- return nil, nil, fmt.Errorf("cgo failed: %s: %s", args, err)
- }
-
- return files, displayFiles, nil
-}
-
-// -- unmodified from 'go build' ---------------------------------------
-
-// Return the flags to use when invoking the C or C++ compilers, or cgo.
-func cflags(p *build.Package, def bool) (cppflags, cflags, cxxflags, ldflags []string) {
- var defaults string
- if def {
- defaults = "-g -O2"
- }
-
- cppflags = stringList(envList("CGO_CPPFLAGS", ""), p.CgoCPPFLAGS)
- cflags = stringList(envList("CGO_CFLAGS", defaults), p.CgoCFLAGS)
- cxxflags = stringList(envList("CGO_CXXFLAGS", defaults), p.CgoCXXFLAGS)
- ldflags = stringList(envList("CGO_LDFLAGS", defaults), p.CgoLDFLAGS)
- return
-}
-
-// envList returns the value of the given environment variable broken
-// into fields, using the default value when the variable is empty.
-func envList(key, def string) []string {
- v := os.Getenv(key)
- if v == "" {
- v = def
- }
- return strings.Fields(v)
-}
-
-// stringList's arguments should be a sequence of string or []string values.
-// stringList flattens them into a single []string.
-func stringList(args ...interface{}) []string {
- var x []string
- for _, arg := range args {
- switch arg := arg.(type) {
- case []string:
- x = append(x, arg...)
- case string:
- x = append(x, arg)
- default:
- panic("stringList: invalid argument")
- }
- }
- return x
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/cgo_pkgconfig.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/cgo_pkgconfig.go
deleted file mode 100644
index de57422df..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/cgo_pkgconfig.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-import (
- "errors"
- "fmt"
- "go/build"
- "os/exec"
- "strings"
-)
-
-// pkgConfig runs pkg-config with the specified arguments and returns the flags it prints.
-func pkgConfig(mode string, pkgs []string) (flags []string, err error) {
- cmd := exec.Command("pkg-config", append([]string{mode}, pkgs...)...)
- out, err := cmd.CombinedOutput()
- if err != nil {
- s := fmt.Sprintf("%s failed: %v", strings.Join(cmd.Args, " "), err)
- if len(out) > 0 {
- s = fmt.Sprintf("%s: %s", s, out)
- }
- return nil, errors.New(s)
- }
- if len(out) > 0 {
- flags = strings.Fields(string(out))
- }
- return
-}
-
-// pkgConfigFlags calls pkg-config if needed and returns the cflags
-// needed to build the package.
-func pkgConfigFlags(p *build.Package) (cflags []string, err error) {
- if len(p.CgoPkgConfig) == 0 {
- return nil, nil
- }
- return pkgConfig("--cflags", p.CgoPkgConfig)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/doc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/doc.go
deleted file mode 100644
index 9b51c9ecd..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/doc.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package loader loads a complete Go program from source code, parsing
-// and type-checking the initial packages plus their transitive closure
-// of dependencies. The ASTs and the derived facts are retained for
-// later use.
-//
-// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
-//
-// The package defines two primary types: Config, which specifies a
-// set of initial packages to load and various other options; and
-// Program, which is the result of successfully loading the packages
-// specified by a configuration.
-//
-// The configuration can be set directly, but *Config provides various
-// convenience methods to simplify the common cases, each of which can
-// be called any number of times. Finally, these are followed by a
-// call to Load() to actually load and type-check the program.
-//
-// var conf loader.Config
-//
-// // Use the command-line arguments to specify
-// // a set of initial packages to load from source.
-// // See FromArgsUsage for help.
-// rest, err := conf.FromArgs(os.Args[1:], wantTests)
-//
-// // Parse the specified files and create an ad hoc package with path "foo".
-// // All files must have the same 'package' declaration.
-// conf.CreateFromFilenames("foo", "foo.go", "bar.go")
-//
-// // Create an ad hoc package with path "foo" from
-// // the specified already-parsed files.
-// // All ASTs must have the same 'package' declaration.
-// conf.CreateFromFiles("foo", parsedFiles)
-//
-// // Add "runtime" to the set of packages to be loaded.
-// conf.Import("runtime")
-//
-// // Adds "fmt" and "fmt_test" to the set of packages
-// // to be loaded. "fmt" will include *_test.go files.
-// conf.ImportWithTests("fmt")
-//
-// // Finally, load all the packages specified by the configuration.
-// prog, err := conf.Load()
-//
-// See examples_test.go for examples of API usage.
-//
-//
-// CONCEPTS AND TERMINOLOGY
-//
-// The WORKSPACE is the set of packages accessible to the loader. The
-// workspace is defined by Config.Build, a *build.Context. The
-// default context treats subdirectories of $GOROOT and $GOPATH as
-// packages, but this behavior may be overridden.
-//
-// An AD HOC package is one specified as a set of source files on the
-// command line. In the simplest case, it may consist of a single file
-// such as $GOROOT/src/net/http/triv.go.
-//
-// EXTERNAL TEST packages are those comprised of a set of *_test.go
-// files all with the same 'package foo_test' declaration, all in the
-// same directory. (go/build.Package calls these files XTestFiles.)
-//
-// An IMPORTABLE package is one that can be referred to by some import
-// spec. Every importable package is uniquely identified by its
-// PACKAGE PATH or just PATH, a string such as "fmt", "encoding/json",
-// or "cmd/vendor/golang.org/x/arch/x86/x86asm". A package path
-// typically denotes a subdirectory of the workspace.
-//
-// An import declaration uses an IMPORT PATH to refer to a package.
-// Most import declarations use the package path as the import path.
-//
-// Due to VENDORING (https://golang.org/s/go15vendor), the
-// interpretation of an import path may depend on the directory in which
-// it appears. To resolve an import path to a package path, go/build
-// must search the enclosing directories for a subdirectory named
-// "vendor".
-//
-// ad hoc packages and external test packages are NON-IMPORTABLE. The
-// path of an ad hoc package is inferred from the package
-// declarations of its files and is therefore not a unique package key.
-// For example, Config.CreatePkgs may specify two initial ad hoc
-// packages, both with path "main".
-//
-// An AUGMENTED package is an importable package P plus all the
-// *_test.go files with same 'package foo' declaration as P.
-// (go/build.Package calls these files TestFiles.)
-//
-// The INITIAL packages are those specified in the configuration. A
-// DEPENDENCY is a package loaded to satisfy an import in an initial
-// package or another dependency.
-//
-package loader
-
-// IMPLEMENTATION NOTES
-//
-// 'go test', in-package test files, and import cycles
-// ---------------------------------------------------
-//
-// An external test package may depend upon members of the augmented
-// package that are not in the unaugmented package, such as functions
-// that expose internals. (See bufio/export_test.go for an example.)
-// So, the loader must ensure that for each external test package
-// it loads, it also augments the corresponding non-test package.
-//
-// The import graph over n unaugmented packages must be acyclic; the
-// import graph over n-1 unaugmented packages plus one augmented
-// package must also be acyclic. ('go test' relies on this.) But the
-// import graph over n augmented packages may contain cycles.
-//
-// First, all the (unaugmented) non-test packages and their
-// dependencies are imported in the usual way; the loader reports an
-// error if it detects an import cycle.
-//
-// Then, each package P for which testing is desired is augmented by
-// the list P' of its in-package test files, by calling
-// (*types.Checker).Files. This arrangement ensures that P' may
-// reference definitions within P, but P may not reference definitions
-// within P'. Furthermore, P' may import any other package, including
-// ones that depend upon P, without an import cycle error.
-//
-// Consider two packages A and B, both of which have lists of
-// in-package test files we'll call A' and B', and which have the
-// following import graph edges:
-// B imports A
-// B' imports A
-// A' imports B
-// This last edge would be expected to create an error were it not
-// for the special type-checking discipline above.
-// Cycles of size greater than two are possible. For example:
-// compress/bzip2/bzip2_test.go (package bzip2) imports "io/ioutil"
-// io/ioutil/tempfile_test.go (package ioutil) imports "regexp"
-// regexp/exec_test.go (package regexp) imports "compress/bzip2"
-//
-//
-// Concurrency
-// -----------
-//
-// Let us define the import dependency graph as follows. Each node is a
-// list of files passed to (Checker).Files at once. Many of these lists
-// are the production code of an importable Go package, so those nodes
-// are labelled by the package's path. The remaining nodes are
-// ad hoc packages and lists of in-package *_test.go files that augment
-// an importable package; those nodes have no label.
-//
-// The edges of the graph represent import statements appearing within a
-// file. An edge connects a node (a list of files) to the node it
-// imports, which is importable and thus always labelled.
-//
-// Loading is controlled by this dependency graph.
-//
-// To reduce I/O latency, we start loading a package's dependencies
-// asynchronously as soon as we've parsed its files and enumerated its
-// imports (scanImports). This performs a preorder traversal of the
-// import dependency graph.
-//
-// To exploit hardware parallelism, we type-check unrelated packages in
-// parallel, where "unrelated" means not ordered by the partial order of
-// the import dependency graph.
-//
-// We use a concurrency-safe non-blocking cache (importer.imported) to
-// record the results of type-checking, whether success or failure. An
-// entry is created in this cache by startLoad the first time the
-// package is imported. The first goroutine to request an entry becomes
-// responsible for completing the task and broadcasting completion to
-// subsequent requestors, which block until then.
-//
-// Type checking occurs in (parallel) postorder: we cannot type-check a
-// set of files until we have loaded and type-checked all of their
-// immediate dependencies (and thus all of their transitive
-// dependencies). If the input were guaranteed free of import cycles,
-// this would be trivial: we could simply wait for completion of the
-// dependencies and then invoke the typechecker.
-//
-// But as we saw in the 'go test' section above, some cycles in the
-// import graph over packages are actually legal, so long as the
-// cycle-forming edge originates in the in-package test files that
-// augment the package. This explains why the nodes of the import
-// dependency graph are not packages, but lists of files: the unlabelled
-// nodes avoid the cycles. Consider packages A and B where B imports A
-// and A's in-package tests AT import B. The naively constructed import
-// graph over packages would contain a cycle (A+AT) --> B --> (A+AT) but
-// the graph over lists of files is AT --> B --> A, where AT is an
-// unlabelled node.
-//
-// Awaiting completion of the dependencies in a cyclic graph would
-// deadlock, so we must materialize the import dependency graph (as
-// importer.graph) and check whether each import edge forms a cycle. If
-// x imports y, and the graph already contains a path from y to x, then
-// there is an import cycle, in which case the processing of x must not
-// wait for the completion of processing of y.
-//
-// When the type-checker makes a callback (doImport) to the loader for a
-// given import edge, there are two possible cases. In the normal case,
-// the dependency has already been completely type-checked; doImport
-// does a cache lookup and returns it. In the cyclic case, the entry in
-// the cache is still necessarily incomplete, indicating a cycle. We
-// perform the cycle check again to obtain the error message, and return
-// the error.
-//
-// The result of using concurrency is about a 2.5x speedup for stdlib_test.
-
-// TODO(adonovan): overhaul the package documentation.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/loader.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/loader.go
deleted file mode 100644
index de756f7fc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/loader.go
+++ /dev/null
@@ -1,1077 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-// See doc.go for package documentation and implementation notes.
-
-import (
- "errors"
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "go/types"
- "os"
- "path/filepath"
- "sort"
- "strings"
- "sync"
- "time"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-var ignoreVendor build.ImportMode
-
-const trace = false // show timing info for type-checking
-
-// Config specifies the configuration for loading a whole program from
-// Go source code.
-// The zero value for Config is a ready-to-use default configuration.
-type Config struct {
- // Fset is the file set for the parser to use when loading the
- // program. If nil, it may be lazily initialized by any
- // method of Config.
- Fset *token.FileSet
-
- // ParserMode specifies the mode to be used by the parser when
- // loading source packages.
- ParserMode parser.Mode
-
- // TypeChecker contains options relating to the type checker.
- //
- // The supplied IgnoreFuncBodies is not used; the effective
- // value comes from the TypeCheckFuncBodies func below.
- // The supplied Import function is not used either.
- TypeChecker types.Config
-
- // TypeCheckFuncBodies is a predicate over package paths.
- // A package for which the predicate is false will
- // have its package-level declarations type checked, but not
- // its function bodies; this can be used to quickly load
- // dependencies from source. If nil, all func bodies are type
- // checked.
- TypeCheckFuncBodies func(path string) bool
-
- // If Build is non-nil, it is used to locate source packages.
- // Otherwise &build.Default is used.
- //
- // By default, cgo is invoked to preprocess Go files that
- // import the fake package "C". This behaviour can be
- // disabled by setting CGO_ENABLED=0 in the environment prior
- // to startup, or by setting Build.CgoEnabled=false.
- Build *build.Context
-
- // The current directory, used for resolving relative package
- // references such as "./go/loader". If empty, os.Getwd will be
- // used instead.
- Cwd string
-
- // If DisplayPath is non-nil, it is used to transform each
- // file name obtained from Build.Import(). This can be used
- // to prevent a virtualized build.Config's file names from
- // leaking into the user interface.
- DisplayPath func(path string) string
-
- // If AllowErrors is true, Load will return a Program even
- // if some of the its packages contained I/O, parser or type
- // errors; such errors are accessible via PackageInfo.Errors. If
- // false, Load will fail if any package had an error.
- AllowErrors bool
-
- // CreatePkgs specifies a list of non-importable initial
- // packages to create. The resulting packages will appear in
- // the corresponding elements of the Program.Created slice.
- CreatePkgs []PkgSpec
-
- // ImportPkgs specifies a set of initial packages to load.
- // The map keys are package paths.
- //
- // The map value indicates whether to load tests. If true, Load
- // will add and type-check two lists of files to the package:
- // non-test files followed by in-package *_test.go files. In
- // addition, it will append the external test package (if any)
- // to Program.Created.
- ImportPkgs map[string]bool
-
- // FindPackage is called during Load to create the build.Package
- // for a given import path from a given directory.
- // If FindPackage is nil, (*build.Context).Import is used.
- // A client may use this hook to adapt to a proprietary build
- // system that does not follow the "go build" layout
- // conventions, for example.
- //
- // It must be safe to call concurrently from multiple goroutines.
- FindPackage func(ctxt *build.Context, importPath, fromDir string, mode build.ImportMode) (*build.Package, error)
-
- // AfterTypeCheck is called immediately after a list of files
- // has been type-checked and appended to info.Files.
- //
- // This optional hook function is the earliest opportunity for
- // the client to observe the output of the type checker,
- // which may be useful to reduce analysis latency when loading
- // a large program.
- //
- // The function is permitted to modify info.Info, for instance
- // to clear data structures that are no longer needed, which can
- // dramatically reduce peak memory consumption.
- //
- // The function may be called twice for the same PackageInfo:
- // once for the files of the package and again for the
- // in-package test files.
- //
- // It must be safe to call concurrently from multiple goroutines.
- AfterTypeCheck func(info *PackageInfo, files []*ast.File)
-}
-
-// A PkgSpec specifies a non-importable package to be created by Load.
-// Files are processed first, but typically only one of Files and
-// Filenames is provided. The path needn't be globally unique.
-//
-// For vendoring purposes, the package's directory is the one that
-// contains the first file.
-type PkgSpec struct {
- Path string // package path ("" => use package declaration)
- Files []*ast.File // ASTs of already-parsed files
- Filenames []string // names of files to be parsed
-}
-
-// A Program is a Go program loaded from source as specified by a Config.
-type Program struct {
- Fset *token.FileSet // the file set for this program
-
- // Created[i] contains the initial package whose ASTs or
- // filenames were supplied by Config.CreatePkgs[i], followed by
- // the external test package, if any, of each package in
- // Config.ImportPkgs ordered by ImportPath.
- //
- // NOTE: these files must not import "C". Cgo preprocessing is
- // only performed on imported packages, not ad hoc packages.
- //
- // TODO(adonovan): we need to copy and adapt the logic of
- // goFilesPackage (from $GOROOT/src/cmd/go/build.go) and make
- // Config.Import and Config.Create methods return the same kind
- // of entity, essentially a build.Package.
- // Perhaps we can even reuse that type directly.
- Created []*PackageInfo
-
- // Imported contains the initially imported packages,
- // as specified by Config.ImportPkgs.
- Imported map[string]*PackageInfo
-
- // AllPackages contains the PackageInfo of every package
- // encountered by Load: all initial packages and all
- // dependencies, including incomplete ones.
- AllPackages map[*types.Package]*PackageInfo
-
- // importMap is the canonical mapping of package paths to
- // packages. It contains all Imported initial packages, but not
- // Created ones, and all imported dependencies.
- importMap map[string]*types.Package
-}
-
-// PackageInfo holds the ASTs and facts derived by the type-checker
-// for a single package.
-//
-// Not mutated once exposed via the API.
-//
-type PackageInfo struct {
- Pkg *types.Package
- Importable bool // true if 'import "Pkg.Path()"' would resolve to this
- TransitivelyErrorFree bool // true if Pkg and all its dependencies are free of errors
- Files []*ast.File // syntax trees for the package's files
- Errors []error // non-nil if the package had errors
- types.Info // type-checker deductions.
- dir string // package directory
-
- checker *types.Checker // transient type-checker state
- errorFunc func(error)
-}
-
-func (info *PackageInfo) String() string { return info.Pkg.Path() }
-
-func (info *PackageInfo) appendError(err error) {
- if info.errorFunc != nil {
- info.errorFunc(err)
- } else {
- fmt.Fprintln(os.Stderr, err)
- }
- info.Errors = append(info.Errors, err)
-}
-
-func (conf *Config) fset() *token.FileSet {
- if conf.Fset == nil {
- conf.Fset = token.NewFileSet()
- }
- return conf.Fset
-}
-
-// ParseFile is a convenience function (intended for testing) that invokes
-// the parser using the Config's FileSet, which is initialized if nil.
-//
-// src specifies the parser input as a string, []byte, or io.Reader, and
-// filename is its apparent name. If src is nil, the contents of
-// filename are read from the file system.
-//
-func (conf *Config) ParseFile(filename string, src interface{}) (*ast.File, error) {
- // TODO(adonovan): use conf.build() etc like parseFiles does.
- return parser.ParseFile(conf.fset(), filename, src, conf.ParserMode)
-}
-
-// FromArgsUsage is a partial usage message that applications calling
-// FromArgs may wish to include in their -help output.
-const FromArgsUsage = `
- is a list of arguments denoting a set of initial packages.
-It may take one of two forms:
-
-1. A list of *.go source files.
-
- All of the specified files are loaded, parsed and type-checked
- as a single package. All the files must belong to the same directory.
-
-2. A list of import paths, each denoting a package.
-
- The package's directory is found relative to the $GOROOT and
- $GOPATH using similar logic to 'go build', and the *.go files in
- that directory are loaded, parsed and type-checked as a single
- package.
-
- In addition, all *_test.go files in the directory are then loaded
- and parsed. Those files whose package declaration equals that of
- the non-*_test.go files are included in the primary package. Test
- files whose package declaration ends with "_test" are type-checked
- as another package, the 'external' test package, so that a single
- import path may denote two packages. (Whether this behaviour is
- enabled is tool-specific, and may depend on additional flags.)
-
-A '--' argument terminates the list of packages.
-`
-
-// FromArgs interprets args as a set of initial packages to load from
-// source and updates the configuration. It returns the list of
-// unconsumed arguments.
-//
-// It is intended for use in command-line interfaces that require a
-// set of initial packages to be specified; see FromArgsUsage message
-// for details.
-//
-// Only superficial errors are reported at this stage; errors dependent
-// on I/O are detected during Load.
-//
-func (conf *Config) FromArgs(args []string, xtest bool) ([]string, error) {
- var rest []string
- for i, arg := range args {
- if arg == "--" {
- rest = args[i+1:]
- args = args[:i]
- break // consume "--" and return the remaining args
- }
- }
-
- if len(args) > 0 && strings.HasSuffix(args[0], ".go") {
- // Assume args is a list of a *.go files
- // denoting a single ad hoc package.
- for _, arg := range args {
- if !strings.HasSuffix(arg, ".go") {
- return nil, fmt.Errorf("named files must be .go files: %s", arg)
- }
- }
- conf.CreateFromFilenames("", args...)
- } else {
- // Assume args are directories each denoting a
- // package and (perhaps) an external test, iff xtest.
- for _, arg := range args {
- if xtest {
- conf.ImportWithTests(arg)
- } else {
- conf.Import(arg)
- }
- }
- }
-
- return rest, nil
-}
-
-// CreateFromFilenames is a convenience function that adds
-// a conf.CreatePkgs entry to create a package of the specified *.go
-// files.
-//
-func (conf *Config) CreateFromFilenames(path string, filenames ...string) {
- conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Filenames: filenames})
-}
-
-// CreateFromFiles is a convenience function that adds a conf.CreatePkgs
-// entry to create package of the specified path and parsed files.
-//
-func (conf *Config) CreateFromFiles(path string, files ...*ast.File) {
- conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Files: files})
-}
-
-// ImportWithTests is a convenience function that adds path to
-// ImportPkgs, the set of initial source packages located relative to
-// $GOPATH. The package will be augmented by any *_test.go files in
-// its directory that contain a "package x" (not "package x_test")
-// declaration.
-//
-// In addition, if any *_test.go files contain a "package x_test"
-// declaration, an additional package comprising just those files will
-// be added to CreatePkgs.
-//
-func (conf *Config) ImportWithTests(path string) { conf.addImport(path, true) }
-
-// Import is a convenience function that adds path to ImportPkgs, the
-// set of initial packages that will be imported from source.
-//
-func (conf *Config) Import(path string) { conf.addImport(path, false) }
-
-func (conf *Config) addImport(path string, tests bool) {
- if path == "C" {
- return // ignore; not a real package
- }
- if conf.ImportPkgs == nil {
- conf.ImportPkgs = make(map[string]bool)
- }
- conf.ImportPkgs[path] = conf.ImportPkgs[path] || tests
-}
-
-// PathEnclosingInterval returns the PackageInfo and ast.Node that
-// contain source interval [start, end), and all the node's ancestors
-// up to the AST root. It searches all ast.Files of all packages in prog.
-// exact is defined as for astutil.PathEnclosingInterval.
-//
-// The zero value is returned if not found.
-//
-func (prog *Program) PathEnclosingInterval(start, end token.Pos) (pkg *PackageInfo, path []ast.Node, exact bool) {
- for _, info := range prog.AllPackages {
- for _, f := range info.Files {
- if f.Pos() == token.NoPos {
- // This can happen if the parser saw
- // too many errors and bailed out.
- // (Use parser.AllErrors to prevent that.)
- continue
- }
- if !tokenFileContainsPos(prog.Fset.File(f.Pos()), start) {
- continue
- }
- if path, exact := astutil.PathEnclosingInterval(f, start, end); path != nil {
- return info, path, exact
- }
- }
- }
- return nil, nil, false
-}
-
-// InitialPackages returns a new slice containing the set of initial
-// packages (Created + Imported) in unspecified order.
-//
-func (prog *Program) InitialPackages() []*PackageInfo {
- infos := make([]*PackageInfo, 0, len(prog.Created)+len(prog.Imported))
- infos = append(infos, prog.Created...)
- for _, info := range prog.Imported {
- infos = append(infos, info)
- }
- return infos
-}
-
-// Package returns the ASTs and results of type checking for the
-// specified package.
-func (prog *Program) Package(path string) *PackageInfo {
- if info, ok := prog.AllPackages[prog.importMap[path]]; ok {
- return info
- }
- for _, info := range prog.Created {
- if path == info.Pkg.Path() {
- return info
- }
- }
- return nil
-}
-
-// ---------- Implementation ----------
-
-// importer holds the working state of the algorithm.
-type importer struct {
- conf *Config // the client configuration
- start time.Time // for logging
-
- progMu sync.Mutex // guards prog
- prog *Program // the resulting program
-
- // findpkg is a memoization of FindPackage.
- findpkgMu sync.Mutex // guards findpkg
- findpkg map[findpkgKey]*findpkgValue
-
- importedMu sync.Mutex // guards imported
- imported map[string]*importInfo // all imported packages (incl. failures) by import path
-
- // import dependency graph: graph[x][y] => x imports y
- //
- // Since non-importable packages cannot be cyclic, we ignore
- // their imports, thus we only need the subgraph over importable
- // packages. Nodes are identified by their import paths.
- graphMu sync.Mutex
- graph map[string]map[string]bool
-}
-
-type findpkgKey struct {
- importPath string
- fromDir string
- mode build.ImportMode
-}
-
-type findpkgValue struct {
- ready chan struct{} // closed to broadcast readiness
- bp *build.Package
- err error
-}
-
-// importInfo tracks the success or failure of a single import.
-//
-// Upon completion, exactly one of info and err is non-nil:
-// info on successful creation of a package, err otherwise.
-// A successful package may still contain type errors.
-//
-type importInfo struct {
- path string // import path
- info *PackageInfo // results of typechecking (including errors)
- complete chan struct{} // closed to broadcast that info is set.
-}
-
-// awaitCompletion blocks until ii is complete,
-// i.e. the info field is safe to inspect.
-func (ii *importInfo) awaitCompletion() {
- <-ii.complete // wait for close
-}
-
-// Complete marks ii as complete.
-// Its info and err fields will not be subsequently updated.
-func (ii *importInfo) Complete(info *PackageInfo) {
- if info == nil {
- panic("info == nil")
- }
- ii.info = info
- close(ii.complete)
-}
-
-type importError struct {
- path string // import path
- err error // reason for failure to create a package
-}
-
-// Load creates the initial packages specified by conf.{Create,Import}Pkgs,
-// loading their dependencies packages as needed.
-//
-// On success, Load returns a Program containing a PackageInfo for
-// each package. On failure, it returns an error.
-//
-// If AllowErrors is true, Load will return a Program even if some
-// packages contained I/O, parser or type errors, or if dependencies
-// were missing. (Such errors are accessible via PackageInfo.Errors. If
-// false, Load will fail if any package had an error.
-//
-// It is an error if no packages were loaded.
-//
-func (conf *Config) Load() (*Program, error) {
- // Create a simple default error handler for parse/type errors.
- if conf.TypeChecker.Error == nil {
- conf.TypeChecker.Error = func(e error) { fmt.Fprintln(os.Stderr, e) }
- }
-
- // Set default working directory for relative package references.
- if conf.Cwd == "" {
- var err error
- conf.Cwd, err = os.Getwd()
- if err != nil {
- return nil, err
- }
- }
-
- // Install default FindPackage hook using go/build logic.
- if conf.FindPackage == nil {
- conf.FindPackage = (*build.Context).Import
- }
-
- prog := &Program{
- Fset: conf.fset(),
- Imported: make(map[string]*PackageInfo),
- importMap: make(map[string]*types.Package),
- AllPackages: make(map[*types.Package]*PackageInfo),
- }
-
- imp := importer{
- conf: conf,
- prog: prog,
- findpkg: make(map[findpkgKey]*findpkgValue),
- imported: make(map[string]*importInfo),
- start: time.Now(),
- graph: make(map[string]map[string]bool),
- }
-
- // -- loading proper (concurrent phase) --------------------------------
-
- var errpkgs []string // packages that contained errors
-
- // Load the initially imported packages and their dependencies,
- // in parallel.
- // No vendor check on packages imported from the command line.
- infos, importErrors := imp.importAll("", conf.Cwd, conf.ImportPkgs, ignoreVendor)
- for _, ie := range importErrors {
- conf.TypeChecker.Error(ie.err) // failed to create package
- errpkgs = append(errpkgs, ie.path)
- }
- for _, info := range infos {
- prog.Imported[info.Pkg.Path()] = info
- }
-
- // Augment the designated initial packages by their tests.
- // Dependencies are loaded in parallel.
- var xtestPkgs []*build.Package
- for importPath, augment := range conf.ImportPkgs {
- if !augment {
- continue
- }
-
- // No vendor check on packages imported from command line.
- bp, err := imp.findPackage(importPath, conf.Cwd, ignoreVendor)
- if err != nil {
- // Package not found, or can't even parse package declaration.
- // Already reported by previous loop; ignore it.
- continue
- }
-
- // Needs external test package?
- if len(bp.XTestGoFiles) > 0 {
- xtestPkgs = append(xtestPkgs, bp)
- }
-
- // Consult the cache using the canonical package path.
- path := bp.ImportPath
- imp.importedMu.Lock() // (unnecessary, we're sequential here)
- ii, ok := imp.imported[path]
- // Paranoid checks added due to issue #11012.
- if !ok {
- // Unreachable.
- // The previous loop called importAll and thus
- // startLoad for each path in ImportPkgs, which
- // populates imp.imported[path] with a non-zero value.
- panic(fmt.Sprintf("imported[%q] not found", path))
- }
- if ii == nil {
- // Unreachable.
- // The ii values in this loop are the same as in
- // the previous loop, which enforced the invariant
- // that at least one of ii.err and ii.info is non-nil.
- panic(fmt.Sprintf("imported[%q] == nil", path))
- }
- if ii.info == nil {
- // Unreachable.
- // awaitCompletion has the postcondition
- // ii.info != nil.
- panic(fmt.Sprintf("imported[%q].info = nil", path))
- }
- info := ii.info
- imp.importedMu.Unlock()
-
- // Parse the in-package test files.
- files, errs := imp.conf.parsePackageFiles(bp, 't')
- for _, err := range errs {
- info.appendError(err)
- }
-
- // The test files augmenting package P cannot be imported,
- // but may import packages that import P,
- // so we must disable the cycle check.
- imp.addFiles(info, files, false)
- }
-
- createPkg := func(path, dir string, files []*ast.File, errs []error) {
- info := imp.newPackageInfo(path, dir)
- for _, err := range errs {
- info.appendError(err)
- }
-
- // Ad hoc packages are non-importable,
- // so no cycle check is needed.
- // addFiles loads dependencies in parallel.
- imp.addFiles(info, files, false)
- prog.Created = append(prog.Created, info)
- }
-
- // Create packages specified by conf.CreatePkgs.
- for _, cp := range conf.CreatePkgs {
- files, errs := parseFiles(conf.fset(), conf.build(), nil, conf.Cwd, cp.Filenames, conf.ParserMode)
- files = append(files, cp.Files...)
-
- path := cp.Path
- if path == "" {
- if len(files) > 0 {
- path = files[0].Name.Name
- } else {
- path = "(unnamed)"
- }
- }
-
- dir := conf.Cwd
- if len(files) > 0 && files[0].Pos().IsValid() {
- dir = filepath.Dir(conf.fset().File(files[0].Pos()).Name())
- }
- createPkg(path, dir, files, errs)
- }
-
- // Create external test packages.
- sort.Sort(byImportPath(xtestPkgs))
- for _, bp := range xtestPkgs {
- files, errs := imp.conf.parsePackageFiles(bp, 'x')
- createPkg(bp.ImportPath+"_test", bp.Dir, files, errs)
- }
-
- // -- finishing up (sequential) ----------------------------------------
-
- if len(prog.Imported)+len(prog.Created) == 0 {
- return nil, errors.New("no initial packages were loaded")
- }
-
- // Create infos for indirectly imported packages.
- // e.g. incomplete packages without syntax, loaded from export data.
- for _, obj := range prog.importMap {
- info := prog.AllPackages[obj]
- if info == nil {
- prog.AllPackages[obj] = &PackageInfo{Pkg: obj, Importable: true}
- } else {
- // finished
- info.checker = nil
- info.errorFunc = nil
- }
- }
-
- if !conf.AllowErrors {
- // Report errors in indirectly imported packages.
- for _, info := range prog.AllPackages {
- if len(info.Errors) > 0 {
- errpkgs = append(errpkgs, info.Pkg.Path())
- }
- }
- if errpkgs != nil {
- var more string
- if len(errpkgs) > 3 {
- more = fmt.Sprintf(" and %d more", len(errpkgs)-3)
- errpkgs = errpkgs[:3]
- }
- return nil, fmt.Errorf("couldn't load packages due to errors: %s%s",
- strings.Join(errpkgs, ", "), more)
- }
- }
-
- markErrorFreePackages(prog.AllPackages)
-
- return prog, nil
-}
-
-type byImportPath []*build.Package
-
-func (b byImportPath) Len() int { return len(b) }
-func (b byImportPath) Less(i, j int) bool { return b[i].ImportPath < b[j].ImportPath }
-func (b byImportPath) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
-
-// markErrorFreePackages sets the TransitivelyErrorFree flag on all
-// applicable packages.
-func markErrorFreePackages(allPackages map[*types.Package]*PackageInfo) {
- // Build the transpose of the import graph.
- importedBy := make(map[*types.Package]map[*types.Package]bool)
- for P := range allPackages {
- for _, Q := range P.Imports() {
- clients, ok := importedBy[Q]
- if !ok {
- clients = make(map[*types.Package]bool)
- importedBy[Q] = clients
- }
- clients[P] = true
- }
- }
-
- // Find all packages reachable from some error package.
- reachable := make(map[*types.Package]bool)
- var visit func(*types.Package)
- visit = func(p *types.Package) {
- if !reachable[p] {
- reachable[p] = true
- for q := range importedBy[p] {
- visit(q)
- }
- }
- }
- for _, info := range allPackages {
- if len(info.Errors) > 0 {
- visit(info.Pkg)
- }
- }
-
- // Mark the others as "transitively error-free".
- for _, info := range allPackages {
- if !reachable[info.Pkg] {
- info.TransitivelyErrorFree = true
- }
- }
-}
-
-// build returns the effective build context.
-func (conf *Config) build() *build.Context {
- if conf.Build != nil {
- return conf.Build
- }
- return &build.Default
-}
-
-// parsePackageFiles enumerates the files belonging to package path,
-// then loads, parses and returns them, plus a list of I/O or parse
-// errors that were encountered.
-//
-// 'which' indicates which files to include:
-// 'g': include non-test *.go source files (GoFiles + processed CgoFiles)
-// 't': include in-package *_test.go source files (TestGoFiles)
-// 'x': include external *_test.go source files. (XTestGoFiles)
-//
-func (conf *Config) parsePackageFiles(bp *build.Package, which rune) ([]*ast.File, []error) {
- if bp.ImportPath == "unsafe" {
- return nil, nil
- }
- var filenames []string
- switch which {
- case 'g':
- filenames = bp.GoFiles
- case 't':
- filenames = bp.TestGoFiles
- case 'x':
- filenames = bp.XTestGoFiles
- default:
- panic(which)
- }
-
- files, errs := parseFiles(conf.fset(), conf.build(), conf.DisplayPath, bp.Dir, filenames, conf.ParserMode)
-
- // Preprocess CgoFiles and parse the outputs (sequentially).
- if which == 'g' && bp.CgoFiles != nil {
- cgofiles, err := processCgoFiles(bp, conf.fset(), conf.DisplayPath, conf.ParserMode)
- if err != nil {
- errs = append(errs, err)
- } else {
- files = append(files, cgofiles...)
- }
- }
-
- return files, errs
-}
-
-// doImport imports the package denoted by path.
-// It implements the types.Importer signature.
-//
-// It returns an error if a package could not be created
-// (e.g. go/build or parse error), but type errors are reported via
-// the types.Config.Error callback (the first of which is also saved
-// in the package's PackageInfo).
-//
-// Idempotent.
-//
-func (imp *importer) doImport(from *PackageInfo, to string) (*types.Package, error) {
- if to == "C" {
- // This should be unreachable, but ad hoc packages are
- // not currently subject to cgo preprocessing.
- // See https://github.com/golang/go/issues/11627.
- return nil, fmt.Errorf(`the loader doesn't cgo-process ad hoc packages like %q; see Go issue 11627`,
- from.Pkg.Path())
- }
-
- bp, err := imp.findPackage(to, from.dir, 0)
- if err != nil {
- return nil, err
- }
-
- // The standard unsafe package is handled specially,
- // and has no PackageInfo.
- if bp.ImportPath == "unsafe" {
- return types.Unsafe, nil
- }
-
- // Look for the package in the cache using its canonical path.
- path := bp.ImportPath
- imp.importedMu.Lock()
- ii := imp.imported[path]
- imp.importedMu.Unlock()
- if ii == nil {
- panic("internal error: unexpected import: " + path)
- }
- if ii.info != nil {
- return ii.info.Pkg, nil
- }
-
- // Import of incomplete package: this indicates a cycle.
- fromPath := from.Pkg.Path()
- if cycle := imp.findPath(path, fromPath); cycle != nil {
- cycle = append([]string{fromPath}, cycle...)
- return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> "))
- }
-
- panic("internal error: import of incomplete (yet acyclic) package: " + fromPath)
-}
-
-// findPackage locates the package denoted by the importPath in the
-// specified directory.
-func (imp *importer) findPackage(importPath, fromDir string, mode build.ImportMode) (*build.Package, error) {
- // We use a non-blocking duplicate-suppressing cache (gopl.io §9.7)
- // to avoid holding the lock around FindPackage.
- key := findpkgKey{importPath, fromDir, mode}
- imp.findpkgMu.Lock()
- v, ok := imp.findpkg[key]
- if ok {
- // cache hit
- imp.findpkgMu.Unlock()
-
- <-v.ready // wait for entry to become ready
- } else {
- // Cache miss: this goroutine becomes responsible for
- // populating the map entry and broadcasting its readiness.
- v = &findpkgValue{ready: make(chan struct{})}
- imp.findpkg[key] = v
- imp.findpkgMu.Unlock()
-
- ioLimit <- true
- v.bp, v.err = imp.conf.FindPackage(imp.conf.build(), importPath, fromDir, mode)
- <-ioLimit
-
- if _, ok := v.err.(*build.NoGoError); ok {
- v.err = nil // empty directory is not an error
- }
-
- close(v.ready) // broadcast ready condition
- }
- return v.bp, v.err
-}
-
-// importAll loads, parses, and type-checks the specified packages in
-// parallel and returns their completed importInfos in unspecified order.
-//
-// fromPath is the package path of the importing package, if it is
-// importable, "" otherwise. It is used for cycle detection.
-//
-// fromDir is the directory containing the import declaration that
-// caused these imports.
-//
-func (imp *importer) importAll(fromPath, fromDir string, imports map[string]bool, mode build.ImportMode) (infos []*PackageInfo, errors []importError) {
- // TODO(adonovan): opt: do the loop in parallel once
- // findPackage is non-blocking.
- var pending []*importInfo
- for importPath := range imports {
- bp, err := imp.findPackage(importPath, fromDir, mode)
- if err != nil {
- errors = append(errors, importError{
- path: importPath,
- err: err,
- })
- continue
- }
- pending = append(pending, imp.startLoad(bp))
- }
-
- if fromPath != "" {
- // We're loading a set of imports.
- //
- // We must record graph edges from the importing package
- // to its dependencies, and check for cycles.
- imp.graphMu.Lock()
- deps, ok := imp.graph[fromPath]
- if !ok {
- deps = make(map[string]bool)
- imp.graph[fromPath] = deps
- }
- for _, ii := range pending {
- deps[ii.path] = true
- }
- imp.graphMu.Unlock()
- }
-
- for _, ii := range pending {
- if fromPath != "" {
- if cycle := imp.findPath(ii.path, fromPath); cycle != nil {
- // Cycle-forming import: we must not await its
- // completion since it would deadlock.
- //
- // We don't record the error in ii since
- // the error is really associated with the
- // cycle-forming edge, not the package itself.
- // (Also it would complicate the
- // invariants of importPath completion.)
- if trace {
- fmt.Fprintf(os.Stderr, "import cycle: %q\n", cycle)
- }
- continue
- }
- }
- ii.awaitCompletion()
- infos = append(infos, ii.info)
- }
-
- return infos, errors
-}
-
-// findPath returns an arbitrary path from 'from' to 'to' in the import
-// graph, or nil if there was none.
-func (imp *importer) findPath(from, to string) []string {
- imp.graphMu.Lock()
- defer imp.graphMu.Unlock()
-
- seen := make(map[string]bool)
- var search func(stack []string, importPath string) []string
- search = func(stack []string, importPath string) []string {
- if !seen[importPath] {
- seen[importPath] = true
- stack = append(stack, importPath)
- if importPath == to {
- return stack
- }
- for x := range imp.graph[importPath] {
- if p := search(stack, x); p != nil {
- return p
- }
- }
- }
- return nil
- }
- return search(make([]string, 0, 20), from)
-}
-
-// startLoad initiates the loading, parsing and type-checking of the
-// specified package and its dependencies, if it has not already begun.
-//
-// It returns an importInfo, not necessarily in a completed state. The
-// caller must call awaitCompletion() before accessing its info field.
-//
-// startLoad is concurrency-safe and idempotent.
-//
-func (imp *importer) startLoad(bp *build.Package) *importInfo {
- path := bp.ImportPath
- imp.importedMu.Lock()
- ii, ok := imp.imported[path]
- if !ok {
- ii = &importInfo{path: path, complete: make(chan struct{})}
- imp.imported[path] = ii
- go func() {
- info := imp.load(bp)
- ii.Complete(info)
- }()
- }
- imp.importedMu.Unlock()
-
- return ii
-}
-
-// load implements package loading by parsing Go source files
-// located by go/build.
-func (imp *importer) load(bp *build.Package) *PackageInfo {
- info := imp.newPackageInfo(bp.ImportPath, bp.Dir)
- info.Importable = true
- files, errs := imp.conf.parsePackageFiles(bp, 'g')
- for _, err := range errs {
- info.appendError(err)
- }
-
- imp.addFiles(info, files, true)
-
- imp.progMu.Lock()
- imp.prog.importMap[bp.ImportPath] = info.Pkg
- imp.progMu.Unlock()
-
- return info
-}
-
-// addFiles adds and type-checks the specified files to info, loading
-// their dependencies if needed. The order of files determines the
-// package initialization order. It may be called multiple times on the
-// same package. Errors are appended to the info.Errors field.
-//
-// cycleCheck determines whether the imports within files create
-// dependency edges that should be checked for potential cycles.
-//
-func (imp *importer) addFiles(info *PackageInfo, files []*ast.File, cycleCheck bool) {
- // Ensure the dependencies are loaded, in parallel.
- var fromPath string
- if cycleCheck {
- fromPath = info.Pkg.Path()
- }
- // TODO(adonovan): opt: make the caller do scanImports.
- // Callers with a build.Package can skip it.
- imp.importAll(fromPath, info.dir, scanImports(files), 0)
-
- if trace {
- fmt.Fprintf(os.Stderr, "%s: start %q (%d)\n",
- time.Since(imp.start), info.Pkg.Path(), len(files))
- }
-
- // Don't call checker.Files on Unsafe, even with zero files,
- // because it would mutate the package, which is a global.
- if info.Pkg == types.Unsafe {
- if len(files) > 0 {
- panic(`"unsafe" package contains unexpected files`)
- }
- } else {
- // Ignore the returned (first) error since we
- // already collect them all in the PackageInfo.
- info.checker.Files(files)
- info.Files = append(info.Files, files...)
- }
-
- if imp.conf.AfterTypeCheck != nil {
- imp.conf.AfterTypeCheck(info, files)
- }
-
- if trace {
- fmt.Fprintf(os.Stderr, "%s: stop %q\n",
- time.Since(imp.start), info.Pkg.Path())
- }
-}
-
-func (imp *importer) newPackageInfo(path, dir string) *PackageInfo {
- var pkg *types.Package
- if path == "unsafe" {
- pkg = types.Unsafe
- } else {
- pkg = types.NewPackage(path, "")
- }
- info := &PackageInfo{
- Pkg: pkg,
- Info: types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- },
- errorFunc: imp.conf.TypeChecker.Error,
- dir: dir,
- }
-
- // Copy the types.Config so we can vary it across PackageInfos.
- tc := imp.conf.TypeChecker
- tc.IgnoreFuncBodies = false
- if f := imp.conf.TypeCheckFuncBodies; f != nil {
- tc.IgnoreFuncBodies = !f(path)
- }
- tc.Importer = closure{imp, info}
- tc.Error = info.appendError // appendError wraps the user's Error function
-
- info.checker = types.NewChecker(&tc, imp.conf.fset(), pkg, &info.Info)
- imp.progMu.Lock()
- imp.prog.AllPackages[pkg] = info
- imp.progMu.Unlock()
- return info
-}
-
-type closure struct {
- imp *importer
- info *PackageInfo
-}
-
-func (c closure) Import(to string) (*types.Package, error) { return c.imp.doImport(c.info, to) }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/util.go
deleted file mode 100644
index 7f38dd740..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/loader/util.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-import (
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "io"
- "os"
- "strconv"
- "sync"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-// We use a counting semaphore to limit
-// the number of parallel I/O calls per process.
-var ioLimit = make(chan bool, 10)
-
-// parseFiles parses the Go source files within directory dir and
-// returns the ASTs of the ones that could be at least partially parsed,
-// along with a list of I/O and parse errors encountered.
-//
-// I/O is done via ctxt, which may specify a virtual file system.
-// displayPath is used to transform the filenames attached to the ASTs.
-//
-func parseFiles(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, files []string, mode parser.Mode) ([]*ast.File, []error) {
- if displayPath == nil {
- displayPath = func(path string) string { return path }
- }
- var wg sync.WaitGroup
- n := len(files)
- parsed := make([]*ast.File, n)
- errors := make([]error, n)
- for i, file := range files {
- if !buildutil.IsAbsPath(ctxt, file) {
- file = buildutil.JoinPath(ctxt, dir, file)
- }
- wg.Add(1)
- go func(i int, file string) {
- ioLimit <- true // wait
- defer func() {
- wg.Done()
- <-ioLimit // signal
- }()
- var rd io.ReadCloser
- var err error
- if ctxt.OpenFile != nil {
- rd, err = ctxt.OpenFile(file)
- } else {
- rd, err = os.Open(file)
- }
- if err != nil {
- errors[i] = err // open failed
- return
- }
-
- // ParseFile may return both an AST and an error.
- parsed[i], errors[i] = parser.ParseFile(fset, displayPath(file), rd, mode)
- rd.Close()
- }(i, file)
- }
- wg.Wait()
-
- // Eliminate nils, preserving order.
- var o int
- for _, f := range parsed {
- if f != nil {
- parsed[o] = f
- o++
- }
- }
- parsed = parsed[:o]
-
- o = 0
- for _, err := range errors {
- if err != nil {
- errors[o] = err
- o++
- }
- }
- errors = errors[:o]
-
- return parsed, errors
-}
-
-// scanImports returns the set of all import paths from all
-// import specs in the specified files.
-func scanImports(files []*ast.File) map[string]bool {
- imports := make(map[string]bool)
- for _, f := range files {
- for _, decl := range f.Decls {
- if decl, ok := decl.(*ast.GenDecl); ok && decl.Tok == token.IMPORT {
- for _, spec := range decl.Specs {
- spec := spec.(*ast.ImportSpec)
-
- // NB: do not assume the program is well-formed!
- path, err := strconv.Unquote(spec.Path.Value)
- if err != nil {
- continue // quietly ignore the error
- }
- if path == "C" {
- continue // skip pseudopackage
- }
- imports[path] = true
- }
- }
- }
- }
- return imports
-}
-
-// ---------- Internal helpers ----------
-
-// TODO(adonovan): make this a method: func (*token.File) Contains(token.Pos)
-func tokenFileContainsPos(f *token.File, pos token.Pos) bool {
- p := int(pos)
- base := f.Base()
- return base <= p && p < base+f.Size()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/analysis.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/analysis.go
deleted file mode 100644
index 0abb04dd8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/analysis.go
+++ /dev/null
@@ -1,452 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the main datatypes and Analyze function of the pointer analysis.
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "io"
- "os"
- "reflect"
- "runtime"
- "runtime/debug"
- "sort"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-const (
- // optimization options; enable all when committing
- optRenumber = true // enable renumbering optimization (makes logs hard to read)
- optHVN = true // enable pointer equivalence via Hash-Value Numbering
-
- // debugging options; disable all when committing
- debugHVN = false // enable assertions in HVN
- debugHVNVerbose = false // enable extra HVN logging
- debugHVNCrossCheck = false // run solver with/without HVN and compare (caveats below)
- debugTimers = false // show running time of each phase
-)
-
-// object.flags bitmask values.
-const (
- otTagged = 1 << iota // type-tagged object
- otIndirect // type-tagged object with indirect payload
- otFunction // function object
-)
-
-// An object represents a contiguous block of memory to which some
-// (generalized) pointer may point.
-//
-// (Note: most variables called 'obj' are not *objects but nodeids
-// such that a.nodes[obj].obj != nil.)
-//
-type object struct {
- // flags is a bitset of the node type (ot*) flags defined above.
- flags uint32
-
- // Number of following nodes belonging to the same "object"
- // allocation. Zero for all other nodes.
- size uint32
-
- // data describes this object; it has one of these types:
- //
- // ssa.Value for an object allocated by an SSA operation.
- // types.Type for an rtype instance object or *rtype-tagged object.
- // string for an instrinsic object, e.g. the array behind os.Args.
- // nil for an object allocated by an instrinsic.
- // (cgn provides the identity of the intrinsic.)
- data interface{}
-
- // The call-graph node (=context) in which this object was allocated.
- // May be nil for global objects: Global, Const, some Functions.
- cgn *cgnode
-}
-
-// nodeid denotes a node.
-// It is an index within analysis.nodes.
-// We use small integers, not *node pointers, for many reasons:
-// - they are smaller on 64-bit systems.
-// - sets of them can be represented compactly in bitvectors or BDDs.
-// - order matters; a field offset can be computed by simple addition.
-type nodeid uint32
-
-// A node is an equivalence class of memory locations.
-// Nodes may be pointers, pointed-to locations, neither, or both.
-//
-// Nodes that are pointed-to locations ("labels") have an enclosing
-// object (see analysis.enclosingObject).
-//
-type node struct {
- // If non-nil, this node is the start of an object
- // (addressable memory location).
- // The following obj.size nodes implicitly belong to the object;
- // they locate their object by scanning back.
- obj *object
-
- // The type of the field denoted by this node. Non-aggregate,
- // unless this is an tagged.T node (i.e. the thing
- // pointed to by an interface) in which case typ is that type.
- typ types.Type
-
- // subelement indicates which directly embedded subelement of
- // an object of aggregate type (struct, tuple, array) this is.
- subelement *fieldInfo // e.g. ".a.b[*].c"
-
- // Solver state for the canonical node of this pointer-
- // equivalence class. Each node is created with its own state
- // but they become shared after HVN.
- solve *solverState
-}
-
-// An analysis instance holds the state of a single pointer analysis problem.
-type analysis struct {
- config *Config // the client's control/observer interface
- prog *ssa.Program // the program being analyzed
- log io.Writer // log stream; nil to disable
- panicNode nodeid // sink for panic, source for recover
- nodes []*node // indexed by nodeid
- flattenMemo map[types.Type][]*fieldInfo // memoization of flatten()
- trackTypes map[types.Type]bool // memoization of shouldTrack()
- constraints []constraint // set of constraints
- cgnodes []*cgnode // all cgnodes
- genq []*cgnode // queue of functions to generate constraints for
- intrinsics map[*ssa.Function]intrinsic // non-nil values are summaries for intrinsic fns
- globalval map[ssa.Value]nodeid // node for each global ssa.Value
- globalobj map[ssa.Value]nodeid // maps v to sole member of pts(v), if singleton
- localval map[ssa.Value]nodeid // node for each local ssa.Value
- localobj map[ssa.Value]nodeid // maps v to sole member of pts(v), if singleton
- atFuncs map[*ssa.Function]bool // address-taken functions (for presolver)
- mapValues []nodeid // values of makemap objects (indirect in HVN)
- work nodeset // solver's worklist
- result *Result // results of the analysis
- track track // pointerlike types whose aliasing we track
- deltaSpace []int // working space for iterating over PTS deltas
-
- // Reflection & intrinsics:
- hasher typeutil.Hasher // cache of type hashes
- reflectValueObj types.Object // type symbol for reflect.Value (if present)
- reflectValueCall *ssa.Function // (reflect.Value).Call
- reflectRtypeObj types.Object // *types.TypeName for reflect.rtype (if present)
- reflectRtypePtr *types.Pointer // *reflect.rtype
- reflectType *types.Named // reflect.Type
- rtypes typeutil.Map // nodeid of canonical *rtype-tagged object for type T
- reflectZeros typeutil.Map // nodeid of canonical T-tagged object for zero value
- runtimeSetFinalizer *ssa.Function // runtime.SetFinalizer
-}
-
-// enclosingObj returns the first node of the addressable memory
-// object that encloses node id. Panic ensues if that node does not
-// belong to any object.
-func (a *analysis) enclosingObj(id nodeid) nodeid {
- // Find previous node with obj != nil.
- for i := id; i >= 0; i-- {
- n := a.nodes[i]
- if obj := n.obj; obj != nil {
- if i+nodeid(obj.size) <= id {
- break // out of bounds
- }
- return i
- }
- }
- panic("node has no enclosing object")
-}
-
-// labelFor returns the Label for node id.
-// Panic ensues if that node is not addressable.
-func (a *analysis) labelFor(id nodeid) *Label {
- return &Label{
- obj: a.nodes[a.enclosingObj(id)].obj,
- subelement: a.nodes[id].subelement,
- }
-}
-
-func (a *analysis) warnf(pos token.Pos, format string, args ...interface{}) {
- msg := fmt.Sprintf(format, args...)
- if a.log != nil {
- fmt.Fprintf(a.log, "%s: warning: %s\n", a.prog.Fset.Position(pos), msg)
- }
- a.result.Warnings = append(a.result.Warnings, Warning{pos, msg})
-}
-
-// computeTrackBits sets a.track to the necessary 'track' bits for the pointer queries.
-func (a *analysis) computeTrackBits() {
- if len(a.config.extendedQueries) != 0 {
- // TODO(dh): only track the types necessary for the query.
- a.track = trackAll
- return
- }
- var queryTypes []types.Type
- for v := range a.config.Queries {
- queryTypes = append(queryTypes, v.Type())
- }
- for v := range a.config.IndirectQueries {
- queryTypes = append(queryTypes, mustDeref(v.Type()))
- }
- for _, t := range queryTypes {
- switch t.Underlying().(type) {
- case *types.Chan:
- a.track |= trackChan
- case *types.Map:
- a.track |= trackMap
- case *types.Pointer:
- a.track |= trackPtr
- case *types.Slice:
- a.track |= trackSlice
- case *types.Interface:
- a.track = trackAll
- return
- }
- if rVObj := a.reflectValueObj; rVObj != nil && types.Identical(t, rVObj.Type()) {
- a.track = trackAll
- return
- }
- }
-}
-
-// Analyze runs the pointer analysis with the scope and options
-// specified by config, and returns the (synthetic) root of the callgraph.
-//
-// Pointer analysis of a transitively closed well-typed program should
-// always succeed. An error can occur only due to an internal bug.
-//
-func Analyze(config *Config) (result *Result, err error) {
- if config.Mains == nil {
- return nil, fmt.Errorf("no main/test packages to analyze (check $GOROOT/$GOPATH)")
- }
- defer func() {
- if p := recover(); p != nil {
- err = fmt.Errorf("internal error in pointer analysis: %v (please report this bug)", p)
- fmt.Fprintln(os.Stderr, "Internal panic in pointer analysis:")
- debug.PrintStack()
- }
- }()
-
- a := &analysis{
- config: config,
- log: config.Log,
- prog: config.prog(),
- globalval: make(map[ssa.Value]nodeid),
- globalobj: make(map[ssa.Value]nodeid),
- flattenMemo: make(map[types.Type][]*fieldInfo),
- trackTypes: make(map[types.Type]bool),
- atFuncs: make(map[*ssa.Function]bool),
- hasher: typeutil.MakeHasher(),
- intrinsics: make(map[*ssa.Function]intrinsic),
- result: &Result{
- Queries: make(map[ssa.Value]Pointer),
- IndirectQueries: make(map[ssa.Value]Pointer),
- },
- deltaSpace: make([]int, 0, 100),
- }
-
- if false {
- a.log = os.Stderr // for debugging crashes; extremely verbose
- }
-
- if a.log != nil {
- fmt.Fprintln(a.log, "==== Starting analysis")
- }
-
- // Pointer analysis requires a complete program for soundness.
- // Check to prevent accidental misconfiguration.
- for _, pkg := range a.prog.AllPackages() {
- // (This only checks that the package scope is complete,
- // not that func bodies exist, but it's a good signal.)
- if !pkg.Pkg.Complete() {
- return nil, fmt.Errorf(`pointer analysis requires a complete program yet package %q was incomplete`, pkg.Pkg.Path())
- }
- }
-
- if reflect := a.prog.ImportedPackage("reflect"); reflect != nil {
- rV := reflect.Pkg.Scope().Lookup("Value")
- a.reflectValueObj = rV
- a.reflectValueCall = a.prog.LookupMethod(rV.Type(), nil, "Call")
- a.reflectType = reflect.Pkg.Scope().Lookup("Type").Type().(*types.Named)
- a.reflectRtypeObj = reflect.Pkg.Scope().Lookup("rtype")
- a.reflectRtypePtr = types.NewPointer(a.reflectRtypeObj.Type())
-
- // Override flattening of reflect.Value, treating it like a basic type.
- tReflectValue := a.reflectValueObj.Type()
- a.flattenMemo[tReflectValue] = []*fieldInfo{{typ: tReflectValue}}
-
- // Override shouldTrack of reflect.Value and *reflect.rtype.
- // Always track pointers of these types.
- a.trackTypes[tReflectValue] = true
- a.trackTypes[a.reflectRtypePtr] = true
-
- a.rtypes.SetHasher(a.hasher)
- a.reflectZeros.SetHasher(a.hasher)
- }
- if runtime := a.prog.ImportedPackage("runtime"); runtime != nil {
- a.runtimeSetFinalizer = runtime.Func("SetFinalizer")
- }
- a.computeTrackBits()
-
- a.generate()
- a.showCounts()
-
- if optRenumber {
- a.renumber()
- }
-
- N := len(a.nodes) // excludes solver-created nodes
-
- if optHVN {
- if debugHVNCrossCheck {
- // Cross-check: run the solver once without
- // optimization, once with, and compare the
- // solutions.
- savedConstraints := a.constraints
-
- a.solve()
- a.dumpSolution("A.pts", N)
-
- // Restore.
- a.constraints = savedConstraints
- for _, n := range a.nodes {
- n.solve = new(solverState)
- }
- a.nodes = a.nodes[:N]
-
- // rtypes is effectively part of the solver state.
- a.rtypes = typeutil.Map{}
- a.rtypes.SetHasher(a.hasher)
- }
-
- a.hvn()
- }
-
- if debugHVNCrossCheck {
- runtime.GC()
- runtime.GC()
- }
-
- a.solve()
-
- // Compare solutions.
- if optHVN && debugHVNCrossCheck {
- a.dumpSolution("B.pts", N)
-
- if !diff("A.pts", "B.pts") {
- return nil, fmt.Errorf("internal error: optimization changed solution")
- }
- }
-
- // Create callgraph.Nodes in deterministic order.
- if cg := a.result.CallGraph; cg != nil {
- for _, caller := range a.cgnodes {
- cg.CreateNode(caller.fn)
- }
- }
-
- // Add dynamic edges to call graph.
- var space [100]int
- for _, caller := range a.cgnodes {
- for _, site := range caller.sites {
- for _, callee := range a.nodes[site.targets].solve.pts.AppendTo(space[:0]) {
- a.callEdge(caller, site, nodeid(callee))
- }
- }
- }
-
- return a.result, nil
-}
-
-// callEdge is called for each edge in the callgraph.
-// calleeid is the callee's object node (has otFunction flag).
-//
-func (a *analysis) callEdge(caller *cgnode, site *callsite, calleeid nodeid) {
- obj := a.nodes[calleeid].obj
- if obj.flags&otFunction == 0 {
- panic(fmt.Sprintf("callEdge %s -> n%d: not a function object", site, calleeid))
- }
- callee := obj.cgn
-
- if cg := a.result.CallGraph; cg != nil {
- // TODO(adonovan): opt: I would expect duplicate edges
- // (to wrappers) to arise due to the elimination of
- // context information, but I haven't observed any.
- // Understand this better.
- callgraph.AddEdge(cg.CreateNode(caller.fn), site.instr, cg.CreateNode(callee.fn))
- }
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\tcall edge %s -> %s\n", site, callee)
- }
-
- // Warn about calls to non-intrinsic external functions.
- // TODO(adonovan): de-dup these messages.
- if fn := callee.fn; fn.Blocks == nil && a.findIntrinsic(fn) == nil {
- a.warnf(site.pos(), "unsound call to unknown intrinsic: %s", fn)
- a.warnf(fn.Pos(), " (declared here)")
- }
-}
-
-// dumpSolution writes the PTS solution to the specified file.
-//
-// It only dumps the nodes that existed before solving. The order in
-// which solver-created nodes are created depends on pre-solver
-// optimization, so we can't include them in the cross-check.
-//
-func (a *analysis) dumpSolution(filename string, N int) {
- f, err := os.Create(filename)
- if err != nil {
- panic(err)
- }
- for id, n := range a.nodes[:N] {
- if _, err := fmt.Fprintf(f, "pts(n%d) = {", id); err != nil {
- panic(err)
- }
- var sep string
- for _, l := range n.solve.pts.AppendTo(a.deltaSpace) {
- if l >= N {
- break
- }
- fmt.Fprintf(f, "%s%d", sep, l)
- sep = " "
- }
- fmt.Fprintf(f, "} : %s\n", n.typ)
- }
- if err := f.Close(); err != nil {
- panic(err)
- }
-}
-
-// showCounts logs the size of the constraint system. A typical
-// optimized distribution is 65% copy, 13% load, 11% addr, 5%
-// offsetAddr, 4% store, 2% others.
-//
-func (a *analysis) showCounts() {
- if a.log != nil {
- counts := make(map[reflect.Type]int)
- for _, c := range a.constraints {
- counts[reflect.TypeOf(c)]++
- }
- fmt.Fprintf(a.log, "# constraints:\t%d\n", len(a.constraints))
- var lines []string
- for t, n := range counts {
- line := fmt.Sprintf("%7d (%2d%%)\t%s", n, 100*n/len(a.constraints), t)
- lines = append(lines, line)
- }
- sort.Sort(sort.Reverse(sort.StringSlice(lines)))
- for _, line := range lines {
- fmt.Fprintf(a.log, "\t%s\n", line)
- }
-
- fmt.Fprintf(a.log, "# nodes:\t%d\n", len(a.nodes))
-
- // Show number of pointer equivalence classes.
- m := make(map[*solverState]bool)
- for _, n := range a.nodes {
- m[n.solve] = true
- }
- fmt.Fprintf(a.log, "# ptsets:\t%d\n", len(m))
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/api.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/api.go
deleted file mode 100644
index 2b7e79e67..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/api.go
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
- "bytes"
- "fmt"
- "go/token"
- "io"
-
- "golang.org/x/tools/container/intsets"
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// A Config formulates a pointer analysis problem for Analyze. It is
-// only usable for a single invocation of Analyze and must not be
-// reused.
-type Config struct {
- // Mains contains the set of 'main' packages to analyze
- // Clients must provide the analysis with at least one
- // package defining a main() function.
- //
- // Non-main packages in the ssa.Program that are not
- // dependencies of any main package may still affect the
- // analysis result, because they contribute runtime types and
- // thus methods.
- // TODO(adonovan): investigate whether this is desirable.
- Mains []*ssa.Package
-
- // Reflection determines whether to handle reflection
- // operators soundly, which is currently rather slow since it
- // causes constraint to be generated during solving
- // proportional to the number of constraint variables, which
- // has not yet been reduced by presolver optimisation.
- Reflection bool
-
- // BuildCallGraph determines whether to construct a callgraph.
- // If enabled, the graph will be available in Result.CallGraph.
- BuildCallGraph bool
-
- // The client populates Queries[v] or IndirectQueries[v]
- // for each ssa.Value v of interest, to request that the
- // points-to sets pts(v) or pts(*v) be computed. If the
- // client needs both points-to sets, v may appear in both
- // maps.
- //
- // (IndirectQueries is typically used for Values corresponding
- // to source-level lvalues, e.g. an *ssa.Global.)
- //
- // The analysis populates the corresponding
- // Result.{Indirect,}Queries map when it creates the pointer
- // variable for v or *v. Upon completion the client can
- // inspect that map for the results.
- //
- // TODO(adonovan): this API doesn't scale well for batch tools
- // that want to dump the entire solution. Perhaps optionally
- // populate a map[*ssa.DebugRef]Pointer in the Result, one
- // entry per source expression.
- //
- Queries map[ssa.Value]struct{}
- IndirectQueries map[ssa.Value]struct{}
- extendedQueries map[ssa.Value][]*extendedQuery
-
- // If Log is non-nil, log messages are written to it.
- // Logging is extremely verbose.
- Log io.Writer
-}
-
-type track uint32
-
-const (
- trackChan track = 1 << iota // track 'chan' references
- trackMap // track 'map' references
- trackPtr // track regular pointers
- trackSlice // track slice references
-
- trackAll = ^track(0)
-)
-
-// AddQuery adds v to Config.Queries.
-// Precondition: CanPoint(v.Type()).
-func (c *Config) AddQuery(v ssa.Value) {
- if !CanPoint(v.Type()) {
- panic(fmt.Sprintf("%s is not a pointer-like value: %s", v, v.Type()))
- }
- if c.Queries == nil {
- c.Queries = make(map[ssa.Value]struct{})
- }
- c.Queries[v] = struct{}{}
-}
-
-// AddQuery adds v to Config.IndirectQueries.
-// Precondition: CanPoint(v.Type().Underlying().(*types.Pointer).Elem()).
-func (c *Config) AddIndirectQuery(v ssa.Value) {
- if c.IndirectQueries == nil {
- c.IndirectQueries = make(map[ssa.Value]struct{})
- }
- if !CanPoint(mustDeref(v.Type())) {
- panic(fmt.Sprintf("%s is not the address of a pointer-like value: %s", v, v.Type()))
- }
- c.IndirectQueries[v] = struct{}{}
-}
-
-// AddExtendedQuery adds an extended, AST-based query on v to the
-// analysis. The query, which must be a single Go expression, allows
-// destructuring the value.
-//
-// The query must operate on a variable named 'x', which represents
-// the value, and result in a pointer-like object. Only a subset of
-// Go expressions are permitted in queries, namely channel receives,
-// pointer dereferences, field selectors, array/slice/map/tuple
-// indexing and grouping with parentheses. The specific indices when
-// indexing arrays, slices and maps have no significance. Indices used
-// on tuples must be numeric and within bounds.
-//
-// All field selectors must be explicit, even ones usually elided
-// due to promotion of embedded fields.
-//
-// The query 'x' is identical to using AddQuery. The query '*x' is
-// identical to using AddIndirectQuery.
-//
-// On success, AddExtendedQuery returns a Pointer to the queried
-// value. This Pointer will be initialized during analysis. Using it
-// before analysis has finished has undefined behavior.
-//
-// Example:
-// // given v, which represents a function call to 'fn() (int, []*T)', and
-// // 'type T struct { F *int }', the following query will access the field F.
-// c.AddExtendedQuery(v, "x[1][0].F")
-func (c *Config) AddExtendedQuery(v ssa.Value, query string) (*Pointer, error) {
- ops, _, err := parseExtendedQuery(v.Type().Underlying(), query)
- if err != nil {
- return nil, fmt.Errorf("invalid query %q: %s", query, err)
- }
- if c.extendedQueries == nil {
- c.extendedQueries = make(map[ssa.Value][]*extendedQuery)
- }
-
- ptr := &Pointer{}
- c.extendedQueries[v] = append(c.extendedQueries[v], &extendedQuery{ops: ops, ptr: ptr})
- return ptr, nil
-}
-
-func (c *Config) prog() *ssa.Program {
- for _, main := range c.Mains {
- return main.Prog
- }
- panic("empty scope")
-}
-
-type Warning struct {
- Pos token.Pos
- Message string
-}
-
-// A Result contains the results of a pointer analysis.
-//
-// See Config for how to request the various Result components.
-//
-type Result struct {
- CallGraph *callgraph.Graph // discovered call graph
- Queries map[ssa.Value]Pointer // pts(v) for each v in Config.Queries.
- IndirectQueries map[ssa.Value]Pointer // pts(*v) for each v in Config.IndirectQueries.
- Warnings []Warning // warnings of unsoundness
-}
-
-// A Pointer is an equivalence class of pointer-like values.
-//
-// A Pointer doesn't have a unique type because pointers of distinct
-// types may alias the same object.
-//
-type Pointer struct {
- a *analysis
- n nodeid
-}
-
-// A PointsToSet is a set of labels (locations or allocations).
-type PointsToSet struct {
- a *analysis // may be nil if pts is nil
- pts *nodeset
-}
-
-func (s PointsToSet) String() string {
- var buf bytes.Buffer
- buf.WriteByte('[')
- if s.pts != nil {
- var space [50]int
- for i, l := range s.pts.AppendTo(space[:0]) {
- if i > 0 {
- buf.WriteString(", ")
- }
- buf.WriteString(s.a.labelFor(nodeid(l)).String())
- }
- }
- buf.WriteByte(']')
- return buf.String()
-}
-
-// PointsTo returns the set of labels that this points-to set
-// contains.
-func (s PointsToSet) Labels() []*Label {
- var labels []*Label
- if s.pts != nil {
- var space [50]int
- for _, l := range s.pts.AppendTo(space[:0]) {
- labels = append(labels, s.a.labelFor(nodeid(l)))
- }
- }
- return labels
-}
-
-// If this PointsToSet came from a Pointer of interface kind
-// or a reflect.Value, DynamicTypes returns the set of dynamic
-// types that it may contain. (For an interface, they will
-// always be concrete types.)
-//
-// The result is a mapping whose keys are the dynamic types to which
-// it may point. For each pointer-like key type, the corresponding
-// map value is the PointsToSet for pointers of that type.
-//
-// The result is empty unless CanHaveDynamicTypes(T).
-//
-func (s PointsToSet) DynamicTypes() *typeutil.Map {
- var tmap typeutil.Map
- tmap.SetHasher(s.a.hasher)
- if s.pts != nil {
- var space [50]int
- for _, x := range s.pts.AppendTo(space[:0]) {
- ifaceObjId := nodeid(x)
- if !s.a.isTaggedObject(ifaceObjId) {
- continue // !CanHaveDynamicTypes(tDyn)
- }
- tDyn, v, indirect := s.a.taggedValue(ifaceObjId)
- if indirect {
- panic("indirect tagged object") // implement later
- }
- pts, ok := tmap.At(tDyn).(PointsToSet)
- if !ok {
- pts = PointsToSet{s.a, new(nodeset)}
- tmap.Set(tDyn, pts)
- }
- pts.pts.addAll(&s.a.nodes[v].solve.pts)
- }
- }
- return &tmap
-}
-
-// Intersects reports whether this points-to set and the
-// argument points-to set contain common members.
-func (x PointsToSet) Intersects(y PointsToSet) bool {
- if x.pts == nil || y.pts == nil {
- return false
- }
- // This takes Θ(|x|+|y|) time.
- var z intsets.Sparse
- z.Intersection(&x.pts.Sparse, &y.pts.Sparse)
- return !z.IsEmpty()
-}
-
-func (p Pointer) String() string {
- return fmt.Sprintf("n%d", p.n)
-}
-
-// PointsTo returns the points-to set of this pointer.
-func (p Pointer) PointsTo() PointsToSet {
- if p.n == 0 {
- return PointsToSet{}
- }
- return PointsToSet{p.a, &p.a.nodes[p.n].solve.pts}
-}
-
-// MayAlias reports whether the receiver pointer may alias
-// the argument pointer.
-func (p Pointer) MayAlias(q Pointer) bool {
- return p.PointsTo().Intersects(q.PointsTo())
-}
-
-// DynamicTypes returns p.PointsTo().DynamicTypes().
-func (p Pointer) DynamicTypes() *typeutil.Map {
- return p.PointsTo().DynamicTypes()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/callgraph.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/callgraph.go
deleted file mode 100644
index 48e152e4a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/callgraph.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the internal (context-sensitive) call graph.
-
-import (
- "fmt"
- "go/token"
-
- "golang.org/x/tools/go/ssa"
-)
-
-type cgnode struct {
- fn *ssa.Function
- obj nodeid // start of this contour's object block
- sites []*callsite // ordered list of callsites within this function
- callersite *callsite // where called from, if known; nil for shared contours
-}
-
-// contour returns a description of this node's contour.
-func (n *cgnode) contour() string {
- if n.callersite == nil {
- return "shared contour"
- }
- if n.callersite.instr != nil {
- return fmt.Sprintf("as called from %s", n.callersite.instr.Parent())
- }
- return fmt.Sprintf("as called from intrinsic (targets=n%d)", n.callersite.targets)
-}
-
-func (n *cgnode) String() string {
- return fmt.Sprintf("cg%d:%s", n.obj, n.fn)
-}
-
-// A callsite represents a single call site within a cgnode;
-// it is implicitly context-sensitive.
-// callsites never represent calls to built-ins;
-// they are handled as intrinsics.
-//
-type callsite struct {
- targets nodeid // pts(·) contains objects for dynamically called functions
- instr ssa.CallInstruction // the call instruction; nil for synthetic/intrinsic
-}
-
-func (c *callsite) String() string {
- if c.instr != nil {
- return c.instr.Common().Description()
- }
- return "synthetic function call"
-}
-
-// pos returns the source position of this callsite, or token.NoPos if implicit.
-func (c *callsite) pos() token.Pos {
- if c.instr != nil {
- return c.instr.Pos()
- }
- return token.NoPos
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/constraint.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/constraint.go
deleted file mode 100644
index 54b54288a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/constraint.go
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import "go/types"
-
-type constraint interface {
- // For a complex constraint, returns the nodeid of the pointer
- // to which it is attached. For addr and copy, returns dst.
- ptr() nodeid
-
- // renumber replaces each nodeid n in the constraint by mapping[n].
- renumber(mapping []nodeid)
-
- // presolve is a hook for constraint-specific behaviour during
- // pre-solver optimization. Typical implementations mark as
- // indirect the set of nodes to which the solver will add copy
- // edges or PTS labels.
- presolve(h *hvn)
-
- // solve is called for complex constraints when the pts for
- // the node to which they are attached has changed.
- solve(a *analysis, delta *nodeset)
-
- String() string
-}
-
-// dst = &src
-// pts(dst) ⊇ {src}
-// A base constraint used to initialize the solver's pt sets
-type addrConstraint struct {
- dst nodeid // (ptr)
- src nodeid
-}
-
-func (c *addrConstraint) ptr() nodeid { return c.dst }
-func (c *addrConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = src
-// A simple constraint represented directly as a copyTo graph edge.
-type copyConstraint struct {
- dst nodeid // (ptr)
- src nodeid
-}
-
-func (c *copyConstraint) ptr() nodeid { return c.dst }
-func (c *copyConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = src[offset]
-// A complex constraint attached to src (the pointer)
-type loadConstraint struct {
- offset uint32
- dst nodeid
- src nodeid // (ptr)
-}
-
-func (c *loadConstraint) ptr() nodeid { return c.src }
-func (c *loadConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst[offset] = src
-// A complex constraint attached to dst (the pointer)
-type storeConstraint struct {
- offset uint32
- dst nodeid // (ptr)
- src nodeid
-}
-
-func (c *storeConstraint) ptr() nodeid { return c.dst }
-func (c *storeConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = &src.f or dst = &src[0]
-// A complex constraint attached to dst (the pointer)
-type offsetAddrConstraint struct {
- offset uint32
- dst nodeid
- src nodeid // (ptr)
-}
-
-func (c *offsetAddrConstraint) ptr() nodeid { return c.src }
-func (c *offsetAddrConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = src.(typ) where typ is an interface
-// A complex constraint attached to src (the interface).
-// No representation change: pts(dst) and pts(src) contains tagged objects.
-type typeFilterConstraint struct {
- typ types.Type // an interface type
- dst nodeid
- src nodeid // (ptr)
-}
-
-func (c *typeFilterConstraint) ptr() nodeid { return c.src }
-func (c *typeFilterConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// dst = src.(typ) where typ is a concrete type
-// A complex constraint attached to src (the interface).
-//
-// If exact, only tagged objects identical to typ are untagged.
-// If !exact, tagged objects assignable to typ are untagged too.
-// The latter is needed for various reflect operators, e.g. Send.
-//
-// This entails a representation change:
-// pts(src) contains tagged objects,
-// pts(dst) contains their payloads.
-type untagConstraint struct {
- typ types.Type // a concrete type
- dst nodeid
- src nodeid // (ptr)
- exact bool
-}
-
-func (c *untagConstraint) ptr() nodeid { return c.src }
-func (c *untagConstraint) renumber(mapping []nodeid) {
- c.dst = mapping[c.dst]
- c.src = mapping[c.src]
-}
-
-// src.method(params...)
-// A complex constraint attached to iface.
-type invokeConstraint struct {
- method *types.Func // the abstract method
- iface nodeid // (ptr) the interface
- params nodeid // the start of the identity/params/results block
-}
-
-func (c *invokeConstraint) ptr() nodeid { return c.iface }
-func (c *invokeConstraint) renumber(mapping []nodeid) {
- c.iface = mapping[c.iface]
- c.params = mapping[c.params]
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/doc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/doc.go
deleted file mode 100644
index 22e569cd0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/doc.go
+++ /dev/null
@@ -1,610 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Package pointer implements Andersen's analysis, an inclusion-based
-pointer analysis algorithm first described in (Andersen, 1994).
-
-A pointer analysis relates every pointer expression in a whole program
-to the set of memory locations to which it might point. This
-information can be used to construct a call graph of the program that
-precisely represents the destinations of dynamic function and method
-calls. It can also be used to determine, for example, which pairs of
-channel operations operate on the same channel.
-
-The package allows the client to request a set of expressions of
-interest for which the points-to information will be returned once the
-analysis is complete. In addition, the client may request that a
-callgraph is constructed. The example program in example_test.go
-demonstrates both of these features. Clients should not request more
-information than they need since it may increase the cost of the
-analysis significantly.
-
-
-CLASSIFICATION
-
-Our algorithm is INCLUSION-BASED: the points-to sets for x and y will
-be related by pts(y) ⊇ pts(x) if the program contains the statement
-y = x.
-
-It is FLOW-INSENSITIVE: it ignores all control flow constructs and the
-order of statements in a program. It is therefore a "MAY ALIAS"
-analysis: its facts are of the form "P may/may not point to L",
-not "P must point to L".
-
-It is FIELD-SENSITIVE: it builds separate points-to sets for distinct
-fields, such as x and y in struct { x, y *int }.
-
-It is mostly CONTEXT-INSENSITIVE: most functions are analyzed once,
-so values can flow in at one call to the function and return out at
-another. Only some smaller functions are analyzed with consideration
-of their calling context.
-
-It has a CONTEXT-SENSITIVE HEAP: objects are named by both allocation
-site and context, so the objects returned by two distinct calls to f:
- func f() *T { return new(T) }
-are distinguished up to the limits of the calling context.
-
-It is a WHOLE PROGRAM analysis: it requires SSA-form IR for the
-complete Go program and summaries for native code.
-
-See the (Hind, PASTE'01) survey paper for an explanation of these terms.
-
-
-SOUNDNESS
-
-The analysis is fully sound when invoked on pure Go programs that do not
-use reflection or unsafe.Pointer conversions. In other words, if there
-is any possible execution of the program in which pointer P may point to
-object O, the analysis will report that fact.
-
-
-REFLECTION
-
-By default, the "reflect" library is ignored by the analysis, as if all
-its functions were no-ops, but if the client enables the Reflection flag,
-the analysis will make a reasonable attempt to model the effects of
-calls into this library. However, this comes at a significant
-performance cost, and not all features of that library are yet
-implemented. In addition, some simplifying approximations must be made
-to ensure that the analysis terminates; for example, reflection can be
-used to construct an infinite set of types and values of those types,
-but the analysis arbitrarily bounds the depth of such types.
-
-Most but not all reflection operations are supported.
-In particular, addressable reflect.Values are not yet implemented, so
-operations such as (reflect.Value).Set have no analytic effect.
-
-
-UNSAFE POINTER CONVERSIONS
-
-The pointer analysis makes no attempt to understand aliasing between the
-operand x and result y of an unsafe.Pointer conversion:
- y = (*T)(unsafe.Pointer(x))
-It is as if the conversion allocated an entirely new object:
- y = new(T)
-
-
-NATIVE CODE
-
-The analysis cannot model the aliasing effects of functions written in
-languages other than Go, such as runtime intrinsics in C or assembly, or
-code accessed via cgo. The result is as if such functions are no-ops.
-However, various important intrinsics are understood by the analysis,
-along with built-ins such as append.
-
-The analysis currently provides no way for users to specify the aliasing
-effects of native code.
-
-------------------------------------------------------------------------
-
-IMPLEMENTATION
-
-The remaining documentation is intended for package maintainers and
-pointer analysis specialists. Maintainers should have a solid
-understanding of the referenced papers (especially those by H&L and PKH)
-before making making significant changes.
-
-The implementation is similar to that described in (Pearce et al,
-PASTE'04). Unlike many algorithms which interleave constraint
-generation and solving, constructing the callgraph as they go, this
-implementation for the most part observes a phase ordering (generation
-before solving), with only simple (copy) constraints being generated
-during solving. (The exception is reflection, which creates various
-constraints during solving as new types flow to reflect.Value
-operations.) This improves the traction of presolver optimisations,
-but imposes certain restrictions, e.g. potential context sensitivity
-is limited since all variants must be created a priori.
-
-
-TERMINOLOGY
-
-A type is said to be "pointer-like" if it is a reference to an object.
-Pointer-like types include pointers and also interfaces, maps, channels,
-functions and slices.
-
-We occasionally use C's x->f notation to distinguish the case where x
-is a struct pointer from x.f where is a struct value.
-
-Pointer analysis literature (and our comments) often uses the notation
-dst=*src+offset to mean something different than what it means in Go.
-It means: for each node index p in pts(src), the node index p+offset is
-in pts(dst). Similarly *dst+offset=src is used for store constraints
-and dst=src+offset for offset-address constraints.
-
-
-NODES
-
-Nodes are the key datastructure of the analysis, and have a dual role:
-they represent both constraint variables (equivalence classes of
-pointers) and members of points-to sets (things that can be pointed
-at, i.e. "labels").
-
-Nodes are naturally numbered. The numbering enables compact
-representations of sets of nodes such as bitvectors (or BDDs); and the
-ordering enables a very cheap way to group related nodes together. For
-example, passing n parameters consists of generating n parallel
-constraints from caller+i to callee+i for 0<=i y is added.
-
- ChangeInterface is a simple copy because the representation of
- tagged objects is independent of the interface type (in contrast
- to the "method tables" approach used by the gc runtime).
-
- y := Invoke x.m(...) is implemented by allocating contiguous P/R
- blocks for the callsite and adding a dynamic rule triggered by each
- tagged object added to pts(x). The rule adds param/results copy
- edges to/from each discovered concrete method.
-
- (Q. Why do we model an interface as a pointer to a pair of type and
- value, rather than as a pair of a pointer to type and a pointer to
- value?
- A. Control-flow joins would merge interfaces ({T1}, {V1}) and ({T2},
- {V2}) to make ({T1,T2}, {V1,V2}), leading to the infeasible and
- type-unsafe combination (T1,V2). Treating the value and its concrete
- type as inseparable makes the analysis type-safe.)
-
-reflect.Value
- A reflect.Value is modelled very similar to an interface{}, i.e. as
- a pointer exclusively to tagged objects, but with two generalizations.
-
- 1) a reflect.Value that represents an lvalue points to an indirect
- (obj.flags ⊇ {otIndirect}) tagged object, which has a similar
- layout to an tagged object except that the value is a pointer to
- the dynamic type. Indirect tagged objects preserve the correct
- aliasing so that mutations made by (reflect.Value).Set can be
- observed.
-
- Indirect objects only arise when an lvalue is derived from an
- rvalue by indirection, e.g. the following code:
-
- type S struct { X T }
- var s S
- var i interface{} = &s // i points to a *S-tagged object (from MakeInterface)
- v1 := reflect.ValueOf(i) // v1 points to same *S-tagged object as i
- v2 := v1.Elem() // v2 points to an indirect S-tagged object, pointing to s
- v3 := v2.FieldByName("X") // v3 points to an indirect int-tagged object, pointing to s.X
- v3.Set(y) // pts(s.X) ⊇ pts(y)
-
- Whether indirect or not, the concrete type of the tagged object
- corresponds to the user-visible dynamic type, and the existence
- of a pointer is an implementation detail.
-
- (NB: indirect tagged objects are not yet implemented)
-
- 2) The dynamic type tag of a tagged object pointed to by a
- reflect.Value may be an interface type; it need not be concrete.
-
- This arises in code such as this:
- tEface := reflect.TypeOf(new(interface{}).Elem() // interface{}
- eface := reflect.Zero(tEface)
- pts(eface) is a singleton containing an interface{}-tagged
- object. That tagged object's payload is an interface{} value,
- i.e. the pts of the payload contains only concrete-tagged
- objects, although in this example it's the zero interface{} value,
- so its pts is empty.
-
-reflect.Type
- Just as in the real "reflect" library, we represent a reflect.Type
- as an interface whose sole implementation is the concrete type,
- *reflect.rtype. (This choice is forced on us by go/types: clients
- cannot fabricate types with arbitrary method sets.)
-
- rtype instances are canonical: there is at most one per dynamic
- type. (rtypes are in fact large structs but since identity is all
- that matters, we represent them by a single node.)
-
- The payload of each *rtype-tagged object is an *rtype pointer that
- points to exactly one such canonical rtype object. We exploit this
- by setting the node.typ of the payload to the dynamic type, not
- '*rtype'. This saves us an indirection in each resolution rule. As
- an optimisation, *rtype-tagged objects are canonicalized too.
-
-
-Aggregate types:
-
-Aggregate types are treated as if all directly contained
-aggregates are recursively flattened out.
-
-Structs
- *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset.
-
- *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create
- simple edges for each struct discovered in pts(x).
-
- The nodes of a struct consist of a special 'identity' node (whose
- type is that of the struct itself), followed by the nodes for all
- the struct's fields, recursively flattened out. A pointer to the
- struct is a pointer to its identity node. That node allows us to
- distinguish a pointer to a struct from a pointer to its first field.
-
- Field offsets are logical field offsets (plus one for the identity
- node), so the sizes of the fields can be ignored by the analysis.
-
- (The identity node is non-traditional but enables the distiction
- described above, which is valuable for code comprehension tools.
- Typical pointer analyses for C, whose purpose is compiler
- optimization, must soundly model unsafe.Pointer (void*) conversions,
- and this requires fidelity to the actual memory layout using physical
- field offsets.)
-
- *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset.
-
- *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create
- simple edges for each struct discovered in pts(x).
-
-Arrays
- We model an array by an identity node (whose type is that of the
- array itself) followed by a node representing all the elements of
- the array; the analysis does not distinguish elements with different
- indices. Effectively, an array is treated like struct{elem T}, a
- load y=x[i] like y=x.elem, and a store x[i]=y like x.elem=y; the
- index i is ignored.
-
- A pointer to an array is pointer to its identity node. (A slice is
- also a pointer to an array's identity node.) The identity node
- allows us to distinguish a pointer to an array from a pointer to one
- of its elements, but it is rather costly because it introduces more
- offset constraints into the system. Furthermore, sound treatment of
- unsafe.Pointer would require us to dispense with this node.
-
- Arrays may be allocated by Alloc, by make([]T), by calls to append,
- and via reflection.
-
-Tuples (T, ...)
- Tuples are treated like structs with naturally numbered fields.
- *ssa.Extract is analogous to *ssa.Field.
-
- However, tuples have no identity field since by construction, they
- cannot be address-taken.
-
-
-FUNCTION CALLS
-
- There are three kinds of function call:
- (1) static "call"-mode calls of functions.
- (2) dynamic "call"-mode calls of functions.
- (3) dynamic "invoke"-mode calls of interface methods.
- Cases 1 and 2 apply equally to methods and standalone functions.
-
- Static calls.
- A static call consists three steps:
- - finding the function object of the callee;
- - creating copy edges from the actual parameter value nodes to the
- P-block in the function object (this includes the receiver if
- the callee is a method);
- - creating copy edges from the R-block in the function object to
- the value nodes for the result of the call.
-
- A static function call is little more than two struct value copies
- between the P/R blocks of caller and callee:
-
- callee.P = caller.P
- caller.R = callee.R
-
- Context sensitivity
-
- Static calls (alone) may be treated context sensitively,
- i.e. each callsite may cause a distinct re-analysis of the
- callee, improving precision. Our current context-sensitivity
- policy treats all intrinsics and getter/setter methods in this
- manner since such functions are small and seem like an obvious
- source of spurious confluences, though this has not yet been
- evaluated.
-
- Dynamic function calls
-
- Dynamic calls work in a similar manner except that the creation of
- copy edges occurs dynamically, in a similar fashion to a pair of
- struct copies in which the callee is indirect:
-
- callee->P = caller.P
- caller.R = callee->R
-
- (Recall that the function object's P- and R-blocks are contiguous.)
-
- Interface method invocation
-
- For invoke-mode calls, we create a params/results block for the
- callsite and attach a dynamic closure rule to the interface. For
- each new tagged object that flows to the interface, we look up
- the concrete method, find its function object, and connect its P/R
- blocks to the callsite's P/R blocks, adding copy edges to the graph
- during solving.
-
- Recording call targets
-
- The analysis notifies its clients of each callsite it encounters,
- passing a CallSite interface. Among other things, the CallSite
- contains a synthetic constraint variable ("targets") whose
- points-to solution includes the set of all function objects to
- which the call may dispatch.
-
- It is via this mechanism that the callgraph is made available.
- Clients may also elect to be notified of callgraph edges directly;
- internally this just iterates all "targets" variables' pts(·)s.
-
-
-PRESOLVER
-
-We implement Hash-Value Numbering (HVN), a pre-solver constraint
-optimization described in Hardekopf & Lin, SAS'07. This is documented
-in more detail in hvn.go. We intend to add its cousins HR and HU in
-future.
-
-
-SOLVER
-
-The solver is currently a naive Andersen-style implementation; it does
-not perform online cycle detection, though we plan to add solver
-optimisations such as Hybrid- and Lazy- Cycle Detection from (Hardekopf
-& Lin, PLDI'07).
-
-It uses difference propagation (Pearce et al, SQC'04) to avoid
-redundant re-triggering of closure rules for values already seen.
-
-Points-to sets are represented using sparse bit vectors (similar to
-those used in LLVM and gcc), which are more space- and time-efficient
-than sets based on Go's built-in map type or dense bit vectors.
-
-Nodes are permuted prior to solving so that object nodes (which may
-appear in points-to sets) are lower numbered than non-object (var)
-nodes. This improves the density of the set over which the PTSs
-range, and thus the efficiency of the representation.
-
-Partly thanks to avoiding map iteration, the execution of the solver is
-100% deterministic, a great help during debugging.
-
-
-FURTHER READING
-
-Andersen, L. O. 1994. Program analysis and specialization for the C
-programming language. Ph.D. dissertation. DIKU, University of
-Copenhagen.
-
-David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Efficient
-field-sensitive pointer analysis for C. In Proceedings of the 5th ACM
-SIGPLAN-SIGSOFT workshop on Program analysis for software tools and
-engineering (PASTE '04). ACM, New York, NY, USA, 37-42.
-http://doi.acm.org/10.1145/996821.996835
-
-David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Online
-Cycle Detection and Difference Propagation: Applications to Pointer
-Analysis. Software Quality Control 12, 4 (December 2004), 311-337.
-http://dx.doi.org/10.1023/B:SQJO.0000039791.93071.a2
-
-David Grove and Craig Chambers. 2001. A framework for call graph
-construction algorithms. ACM Trans. Program. Lang. Syst. 23, 6
-(November 2001), 685-746.
-http://doi.acm.org/10.1145/506315.506316
-
-Ben Hardekopf and Calvin Lin. 2007. The ant and the grasshopper: fast
-and accurate pointer analysis for millions of lines of code. In
-Proceedings of the 2007 ACM SIGPLAN conference on Programming language
-design and implementation (PLDI '07). ACM, New York, NY, USA, 290-299.
-http://doi.acm.org/10.1145/1250734.1250767
-
-Ben Hardekopf and Calvin Lin. 2007. Exploiting pointer and location
-equivalence to optimize pointer analysis. In Proceedings of the 14th
-international conference on Static Analysis (SAS'07), Hanne Riis
-Nielson and Gilberto Filé (Eds.). Springer-Verlag, Berlin, Heidelberg,
-265-280.
-
-Atanas Rountev and Satish Chandra. 2000. Off-line variable substitution
-for scaling points-to analysis. In Proceedings of the ACM SIGPLAN 2000
-conference on Programming language design and implementation (PLDI '00).
-ACM, New York, NY, USA, 47-56. DOI=10.1145/349299.349310
-http://doi.acm.org/10.1145/349299.349310
-
-*/
-package pointer // import "golang.org/x/tools/go/pointer"
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/gen.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/gen.go
deleted file mode 100644
index a111175c9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/gen.go
+++ /dev/null
@@ -1,1325 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the constraint generation phase.
-
-// TODO(adonovan): move the constraint definitions and the store() etc
-// functions which add them (and are also used by the solver) into a
-// new file, constraints.go.
-
-import (
- "fmt"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/ssa"
-)
-
-var (
- tEface = types.NewInterface(nil, nil).Complete()
- tInvalid = types.Typ[types.Invalid]
- tUnsafePtr = types.Typ[types.UnsafePointer]
-)
-
-// ---------- Node creation ----------
-
-// nextNode returns the index of the next unused node.
-func (a *analysis) nextNode() nodeid {
- return nodeid(len(a.nodes))
-}
-
-// addNodes creates nodes for all scalar elements in type typ, and
-// returns the id of the first one, or zero if the type was
-// analytically uninteresting.
-//
-// comment explains the origin of the nodes, as a debugging aid.
-//
-func (a *analysis) addNodes(typ types.Type, comment string) nodeid {
- id := a.nextNode()
- for _, fi := range a.flatten(typ) {
- a.addOneNode(fi.typ, comment, fi)
- }
- if id == a.nextNode() {
- return 0 // type contained no pointers
- }
- return id
-}
-
-// addOneNode creates a single node with type typ, and returns its id.
-//
-// typ should generally be scalar (except for tagged.T nodes
-// and struct/array identity nodes). Use addNodes for non-scalar types.
-//
-// comment explains the origin of the nodes, as a debugging aid.
-// subelement indicates the subelement, e.g. ".a.b[*].c".
-//
-func (a *analysis) addOneNode(typ types.Type, comment string, subelement *fieldInfo) nodeid {
- id := a.nextNode()
- a.nodes = append(a.nodes, &node{typ: typ, subelement: subelement, solve: new(solverState)})
- if a.log != nil {
- fmt.Fprintf(a.log, "\tcreate n%d %s for %s%s\n",
- id, typ, comment, subelement.path())
- }
- return id
-}
-
-// setValueNode associates node id with the value v.
-// cgn identifies the context iff v is a local variable.
-//
-func (a *analysis) setValueNode(v ssa.Value, id nodeid, cgn *cgnode) {
- if cgn != nil {
- a.localval[v] = id
- } else {
- a.globalval[v] = id
- }
- if a.log != nil {
- fmt.Fprintf(a.log, "\tval[%s] = n%d (%T)\n", v.Name(), id, v)
- }
-
- // Due to context-sensitivity, we may encounter the same Value
- // in many contexts. We merge them to a canonical node, since
- // that's what all clients want.
-
- // Record the (v, id) relation if the client has queried pts(v).
- if _, ok := a.config.Queries[v]; ok {
- t := v.Type()
- ptr, ok := a.result.Queries[v]
- if !ok {
- // First time? Create the canonical query node.
- ptr = Pointer{a, a.addNodes(t, "query")}
- a.result.Queries[v] = ptr
- }
- a.result.Queries[v] = ptr
- a.copy(ptr.n, id, a.sizeof(t))
- }
-
- // Record the (*v, id) relation if the client has queried pts(*v).
- if _, ok := a.config.IndirectQueries[v]; ok {
- t := v.Type()
- ptr, ok := a.result.IndirectQueries[v]
- if !ok {
- // First time? Create the canonical indirect query node.
- ptr = Pointer{a, a.addNodes(v.Type(), "query.indirect")}
- a.result.IndirectQueries[v] = ptr
- }
- a.genLoad(cgn, ptr.n, v, 0, a.sizeof(t))
- }
-
- for _, query := range a.config.extendedQueries[v] {
- t, nid := a.evalExtendedQuery(v.Type().Underlying(), id, query.ops)
-
- if query.ptr.a == nil {
- query.ptr.a = a
- query.ptr.n = a.addNodes(t, "query.extended")
- }
- a.copy(query.ptr.n, nid, a.sizeof(t))
- }
-}
-
-// endObject marks the end of a sequence of calls to addNodes denoting
-// a single object allocation.
-//
-// obj is the start node of the object, from a prior call to nextNode.
-// Its size, flags and optional data will be updated.
-//
-func (a *analysis) endObject(obj nodeid, cgn *cgnode, data interface{}) *object {
- // Ensure object is non-empty by padding;
- // the pad will be the object node.
- size := uint32(a.nextNode() - obj)
- if size == 0 {
- a.addOneNode(tInvalid, "padding", nil)
- }
- objNode := a.nodes[obj]
- o := &object{
- size: size, // excludes padding
- cgn: cgn,
- data: data,
- }
- objNode.obj = o
-
- return o
-}
-
-// makeFunctionObject creates and returns a new function object
-// (contour) for fn, and returns the id of its first node. It also
-// enqueues fn for subsequent constraint generation.
-//
-// For a context-sensitive contour, callersite identifies the sole
-// callsite; for shared contours, caller is nil.
-//
-func (a *analysis) makeFunctionObject(fn *ssa.Function, callersite *callsite) nodeid {
- if a.log != nil {
- fmt.Fprintf(a.log, "\t---- makeFunctionObject %s\n", fn)
- }
-
- // obj is the function object (identity, params, results).
- obj := a.nextNode()
- cgn := a.makeCGNode(fn, obj, callersite)
- sig := fn.Signature
- a.addOneNode(sig, "func.cgnode", nil) // (scalar with Signature type)
- if recv := sig.Recv(); recv != nil {
- a.addNodes(recv.Type(), "func.recv")
- }
- a.addNodes(sig.Params(), "func.params")
- a.addNodes(sig.Results(), "func.results")
- a.endObject(obj, cgn, fn).flags |= otFunction
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\t----\n")
- }
-
- // Queue it up for constraint processing.
- a.genq = append(a.genq, cgn)
-
- return obj
-}
-
-// makeTagged creates a tagged object of type typ.
-func (a *analysis) makeTagged(typ types.Type, cgn *cgnode, data interface{}) nodeid {
- obj := a.addOneNode(typ, "tagged.T", nil) // NB: type may be non-scalar!
- a.addNodes(typ, "tagged.v")
- a.endObject(obj, cgn, data).flags |= otTagged
- return obj
-}
-
-// makeRtype returns the canonical tagged object of type *rtype whose
-// payload points to the sole rtype object for T.
-//
-// TODO(adonovan): move to reflect.go; it's part of the solver really.
-//
-func (a *analysis) makeRtype(T types.Type) nodeid {
- if v := a.rtypes.At(T); v != nil {
- return v.(nodeid)
- }
-
- // Create the object for the reflect.rtype itself, which is
- // ordinarily a large struct but here a single node will do.
- obj := a.nextNode()
- a.addOneNode(T, "reflect.rtype", nil)
- a.endObject(obj, nil, T)
-
- id := a.makeTagged(a.reflectRtypePtr, nil, T)
- a.nodes[id+1].typ = T // trick (each *rtype tagged object is a singleton)
- a.addressOf(a.reflectRtypePtr, id+1, obj)
-
- a.rtypes.Set(T, id)
- return id
-}
-
-// rtypeValue returns the type of the *reflect.rtype-tagged object obj.
-func (a *analysis) rtypeTaggedValue(obj nodeid) types.Type {
- tDyn, t, _ := a.taggedValue(obj)
- if tDyn != a.reflectRtypePtr {
- panic(fmt.Sprintf("not a *reflect.rtype-tagged object: obj=n%d tag=%v payload=n%d", obj, tDyn, t))
- }
- return a.nodes[t].typ
-}
-
-// valueNode returns the id of the value node for v, creating it (and
-// the association) as needed. It may return zero for uninteresting
-// values containing no pointers.
-//
-func (a *analysis) valueNode(v ssa.Value) nodeid {
- // Value nodes for locals are created en masse by genFunc.
- if id, ok := a.localval[v]; ok {
- return id
- }
-
- // Value nodes for globals are created on demand.
- id, ok := a.globalval[v]
- if !ok {
- var comment string
- if a.log != nil {
- comment = v.String()
- }
- id = a.addNodes(v.Type(), comment)
- if obj := a.objectNode(nil, v); obj != 0 {
- a.addressOf(v.Type(), id, obj)
- }
- a.setValueNode(v, id, nil)
- }
- return id
-}
-
-// valueOffsetNode ascertains the node for tuple/struct value v,
-// then returns the node for its subfield #index.
-//
-func (a *analysis) valueOffsetNode(v ssa.Value, index int) nodeid {
- id := a.valueNode(v)
- if id == 0 {
- panic(fmt.Sprintf("cannot offset within n0: %s = %s", v.Name(), v))
- }
- return id + nodeid(a.offsetOf(v.Type(), index))
-}
-
-// isTaggedObject reports whether object obj is a tagged object.
-func (a *analysis) isTaggedObject(obj nodeid) bool {
- return a.nodes[obj].obj.flags&otTagged != 0
-}
-
-// taggedValue returns the dynamic type tag, the (first node of the)
-// payload, and the indirect flag of the tagged object starting at id.
-// Panic ensues if !isTaggedObject(id).
-//
-func (a *analysis) taggedValue(obj nodeid) (tDyn types.Type, v nodeid, indirect bool) {
- n := a.nodes[obj]
- flags := n.obj.flags
- if flags&otTagged == 0 {
- panic(fmt.Sprintf("not a tagged object: n%d", obj))
- }
- return n.typ, obj + 1, flags&otIndirect != 0
-}
-
-// funcParams returns the first node of the params (P) block of the
-// function whose object node (obj.flags&otFunction) is id.
-//
-func (a *analysis) funcParams(id nodeid) nodeid {
- n := a.nodes[id]
- if n.obj == nil || n.obj.flags&otFunction == 0 {
- panic(fmt.Sprintf("funcParams(n%d): not a function object block", id))
- }
- return id + 1
-}
-
-// funcResults returns the first node of the results (R) block of the
-// function whose object node (obj.flags&otFunction) is id.
-//
-func (a *analysis) funcResults(id nodeid) nodeid {
- n := a.nodes[id]
- if n.obj == nil || n.obj.flags&otFunction == 0 {
- panic(fmt.Sprintf("funcResults(n%d): not a function object block", id))
- }
- sig := n.typ.(*types.Signature)
- id += 1 + nodeid(a.sizeof(sig.Params()))
- if sig.Recv() != nil {
- id += nodeid(a.sizeof(sig.Recv().Type()))
- }
- return id
-}
-
-// ---------- Constraint creation ----------
-
-// copy creates a constraint of the form dst = src.
-// sizeof is the width (in logical fields) of the copied type.
-//
-func (a *analysis) copy(dst, src nodeid, sizeof uint32) {
- if src == dst || sizeof == 0 {
- return // trivial
- }
- if src == 0 || dst == 0 {
- panic(fmt.Sprintf("ill-typed copy dst=n%d src=n%d", dst, src))
- }
- for i := uint32(0); i < sizeof; i++ {
- a.addConstraint(©Constraint{dst, src})
- src++
- dst++
- }
-}
-
-// addressOf creates a constraint of the form id = &obj.
-// T is the type of the address.
-func (a *analysis) addressOf(T types.Type, id, obj nodeid) {
- if id == 0 {
- panic("addressOf: zero id")
- }
- if obj == 0 {
- panic("addressOf: zero obj")
- }
- if a.shouldTrack(T) {
- a.addConstraint(&addrConstraint{id, obj})
- }
-}
-
-// load creates a load constraint of the form dst = src[offset].
-// offset is the pointer offset in logical fields.
-// sizeof is the width (in logical fields) of the loaded type.
-//
-func (a *analysis) load(dst, src nodeid, offset, sizeof uint32) {
- if dst == 0 {
- return // load of non-pointerlike value
- }
- if src == 0 && dst == 0 {
- return // non-pointerlike operation
- }
- if src == 0 || dst == 0 {
- panic(fmt.Sprintf("ill-typed load dst=n%d src=n%d", dst, src))
- }
- for i := uint32(0); i < sizeof; i++ {
- a.addConstraint(&loadConstraint{offset, dst, src})
- offset++
- dst++
- }
-}
-
-// store creates a store constraint of the form dst[offset] = src.
-// offset is the pointer offset in logical fields.
-// sizeof is the width (in logical fields) of the stored type.
-//
-func (a *analysis) store(dst, src nodeid, offset uint32, sizeof uint32) {
- if src == 0 {
- return // store of non-pointerlike value
- }
- if src == 0 && dst == 0 {
- return // non-pointerlike operation
- }
- if src == 0 || dst == 0 {
- panic(fmt.Sprintf("ill-typed store dst=n%d src=n%d", dst, src))
- }
- for i := uint32(0); i < sizeof; i++ {
- a.addConstraint(&storeConstraint{offset, dst, src})
- offset++
- src++
- }
-}
-
-// offsetAddr creates an offsetAddr constraint of the form dst = &src.#offset.
-// offset is the field offset in logical fields.
-// T is the type of the address.
-//
-func (a *analysis) offsetAddr(T types.Type, dst, src nodeid, offset uint32) {
- if !a.shouldTrack(T) {
- return
- }
- if offset == 0 {
- // Simplify dst = &src->f0
- // to dst = src
- // (NB: this optimisation is defeated by the identity
- // field prepended to struct and array objects.)
- a.copy(dst, src, 1)
- } else {
- a.addConstraint(&offsetAddrConstraint{offset, dst, src})
- }
-}
-
-// typeAssert creates a typeFilter or untag constraint of the form dst = src.(T):
-// typeFilter for an interface, untag for a concrete type.
-// The exact flag is specified as for untagConstraint.
-//
-func (a *analysis) typeAssert(T types.Type, dst, src nodeid, exact bool) {
- if isInterface(T) {
- a.addConstraint(&typeFilterConstraint{T, dst, src})
- } else {
- a.addConstraint(&untagConstraint{T, dst, src, exact})
- }
-}
-
-// addConstraint adds c to the constraint set.
-func (a *analysis) addConstraint(c constraint) {
- a.constraints = append(a.constraints, c)
- if a.log != nil {
- fmt.Fprintf(a.log, "\t%s\n", c)
- }
-}
-
-// copyElems generates load/store constraints for *dst = *src,
-// where src and dst are slices or *arrays.
-//
-func (a *analysis) copyElems(cgn *cgnode, typ types.Type, dst, src ssa.Value) {
- tmp := a.addNodes(typ, "copy")
- sz := a.sizeof(typ)
- a.genLoad(cgn, tmp, src, 1, sz)
- a.genStore(cgn, dst, tmp, 1, sz)
-}
-
-// ---------- Constraint generation ----------
-
-// genConv generates constraints for the conversion operation conv.
-func (a *analysis) genConv(conv *ssa.Convert, cgn *cgnode) {
- res := a.valueNode(conv)
- if res == 0 {
- return // result is non-pointerlike
- }
-
- tSrc := conv.X.Type()
- tDst := conv.Type()
-
- switch utSrc := tSrc.Underlying().(type) {
- case *types.Slice:
- // []byte/[]rune -> string?
- return
-
- case *types.Pointer:
- // *T -> unsafe.Pointer?
- if tDst.Underlying() == tUnsafePtr {
- return // we don't model unsafe aliasing (unsound)
- }
-
- case *types.Basic:
- switch tDst.Underlying().(type) {
- case *types.Pointer:
- // Treat unsafe.Pointer->*T conversions like
- // new(T) and create an unaliased object.
- if utSrc == tUnsafePtr {
- obj := a.addNodes(mustDeref(tDst), "unsafe.Pointer conversion")
- a.endObject(obj, cgn, conv)
- a.addressOf(tDst, res, obj)
- return
- }
-
- case *types.Slice:
- // string -> []byte/[]rune (or named aliases)?
- if utSrc.Info()&types.IsString != 0 {
- obj := a.addNodes(sliceToArray(tDst), "convert")
- a.endObject(obj, cgn, conv)
- a.addressOf(tDst, res, obj)
- return
- }
-
- case *types.Basic:
- // All basic-to-basic type conversions are no-ops.
- // This includes uintptr<->unsafe.Pointer conversions,
- // which we (unsoundly) ignore.
- return
- }
- }
-
- panic(fmt.Sprintf("illegal *ssa.Convert %s -> %s: %s", tSrc, tDst, conv.Parent()))
-}
-
-// genAppend generates constraints for a call to append.
-func (a *analysis) genAppend(instr *ssa.Call, cgn *cgnode) {
- // Consider z = append(x, y). y is optional.
- // This may allocate a new [1]T array; call its object w.
- // We get the following constraints:
- // z = x
- // z = &w
- // *z = *y
-
- x := instr.Call.Args[0]
-
- z := instr
- a.copy(a.valueNode(z), a.valueNode(x), 1) // z = x
-
- if len(instr.Call.Args) == 1 {
- return // no allocation for z = append(x) or _ = append(x).
- }
-
- // TODO(adonovan): test append([]byte, ...string) []byte.
-
- y := instr.Call.Args[1]
- tArray := sliceToArray(instr.Call.Args[0].Type())
-
- var w nodeid
- w = a.nextNode()
- a.addNodes(tArray, "append")
- a.endObject(w, cgn, instr)
-
- a.copyElems(cgn, tArray.Elem(), z, y) // *z = *y
- a.addressOf(instr.Type(), a.valueNode(z), w) // z = &w
-}
-
-// genBuiltinCall generates contraints for a call to a built-in.
-func (a *analysis) genBuiltinCall(instr ssa.CallInstruction, cgn *cgnode) {
- call := instr.Common()
- switch call.Value.(*ssa.Builtin).Name() {
- case "append":
- // Safe cast: append cannot appear in a go or defer statement.
- a.genAppend(instr.(*ssa.Call), cgn)
-
- case "copy":
- tElem := call.Args[0].Type().Underlying().(*types.Slice).Elem()
- a.copyElems(cgn, tElem, call.Args[0], call.Args[1])
-
- case "panic":
- a.copy(a.panicNode, a.valueNode(call.Args[0]), 1)
-
- case "recover":
- if v := instr.Value(); v != nil {
- a.copy(a.valueNode(v), a.panicNode, 1)
- }
-
- case "print":
- // In the tests, the probe might be the sole reference
- // to its arg, so make sure we create nodes for it.
- if len(call.Args) > 0 {
- a.valueNode(call.Args[0])
- }
-
- case "ssa:wrapnilchk":
- a.copy(a.valueNode(instr.Value()), a.valueNode(call.Args[0]), 1)
-
- default:
- // No-ops: close len cap real imag complex print println delete.
- }
-}
-
-// shouldUseContext defines the context-sensitivity policy. It
-// returns true if we should analyse all static calls to fn anew.
-//
-// Obviously this interface rather limits how much freedom we have to
-// choose a policy. The current policy, rather arbitrarily, is true
-// for intrinsics and accessor methods (actually: short, single-block,
-// call-free functions). This is just a starting point.
-//
-func (a *analysis) shouldUseContext(fn *ssa.Function) bool {
- if a.findIntrinsic(fn) != nil {
- return true // treat intrinsics context-sensitively
- }
- if len(fn.Blocks) != 1 {
- return false // too expensive
- }
- blk := fn.Blocks[0]
- if len(blk.Instrs) > 10 {
- return false // too expensive
- }
- if fn.Synthetic != "" && (fn.Pkg == nil || fn != fn.Pkg.Func("init")) {
- return true // treat synthetic wrappers context-sensitively
- }
- for _, instr := range blk.Instrs {
- switch instr := instr.(type) {
- case ssa.CallInstruction:
- // Disallow function calls (except to built-ins)
- // because of the danger of unbounded recursion.
- if _, ok := instr.Common().Value.(*ssa.Builtin); !ok {
- return false
- }
- }
- }
- return true
-}
-
-// genStaticCall generates constraints for a statically dispatched function call.
-func (a *analysis) genStaticCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
- fn := call.StaticCallee()
-
- // Special cases for inlined intrinsics.
- switch fn {
- case a.runtimeSetFinalizer:
- // Inline SetFinalizer so the call appears direct.
- site.targets = a.addOneNode(tInvalid, "SetFinalizer.targets", nil)
- a.addConstraint(&runtimeSetFinalizerConstraint{
- targets: site.targets,
- x: a.valueNode(call.Args[0]),
- f: a.valueNode(call.Args[1]),
- })
- return
-
- case a.reflectValueCall:
- // Inline (reflect.Value).Call so the call appears direct.
- dotdotdot := false
- ret := reflectCallImpl(a, caller, site, a.valueNode(call.Args[0]), a.valueNode(call.Args[1]), dotdotdot)
- if result != 0 {
- a.addressOf(fn.Signature.Results().At(0).Type(), result, ret)
- }
- return
- }
-
- // Ascertain the context (contour/cgnode) for a particular call.
- var obj nodeid
- if a.shouldUseContext(fn) {
- obj = a.makeFunctionObject(fn, site) // new contour
- } else {
- obj = a.objectNode(nil, fn) // shared contour
- }
- a.callEdge(caller, site, obj)
-
- sig := call.Signature()
-
- // Copy receiver, if any.
- params := a.funcParams(obj)
- args := call.Args
- if sig.Recv() != nil {
- sz := a.sizeof(sig.Recv().Type())
- a.copy(params, a.valueNode(args[0]), sz)
- params += nodeid(sz)
- args = args[1:]
- }
-
- // Copy actual parameters into formal params block.
- // Must loop, since the actuals aren't contiguous.
- for i, arg := range args {
- sz := a.sizeof(sig.Params().At(i).Type())
- a.copy(params, a.valueNode(arg), sz)
- params += nodeid(sz)
- }
-
- // Copy formal results block to actual result.
- if result != 0 {
- a.copy(result, a.funcResults(obj), a.sizeof(sig.Results()))
- }
-}
-
-// genDynamicCall generates constraints for a dynamic function call.
-func (a *analysis) genDynamicCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
- // pts(targets) will be the set of possible call targets.
- site.targets = a.valueNode(call.Value)
-
- // We add dynamic closure rules that store the arguments into
- // the P-block and load the results from the R-block of each
- // function discovered in pts(targets).
-
- sig := call.Signature()
- var offset uint32 = 1 // P/R block starts at offset 1
- for i, arg := range call.Args {
- sz := a.sizeof(sig.Params().At(i).Type())
- a.genStore(caller, call.Value, a.valueNode(arg), offset, sz)
- offset += sz
- }
- if result != 0 {
- a.genLoad(caller, result, call.Value, offset, a.sizeof(sig.Results()))
- }
-}
-
-// genInvoke generates constraints for a dynamic method invocation.
-func (a *analysis) genInvoke(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
- if call.Value.Type() == a.reflectType {
- a.genInvokeReflectType(caller, site, call, result)
- return
- }
-
- sig := call.Signature()
-
- // Allocate a contiguous targets/params/results block for this call.
- block := a.nextNode()
- // pts(targets) will be the set of possible call targets
- site.targets = a.addOneNode(sig, "invoke.targets", nil)
- p := a.addNodes(sig.Params(), "invoke.params")
- r := a.addNodes(sig.Results(), "invoke.results")
-
- // Copy the actual parameters into the call's params block.
- for i, n := 0, sig.Params().Len(); i < n; i++ {
- sz := a.sizeof(sig.Params().At(i).Type())
- a.copy(p, a.valueNode(call.Args[i]), sz)
- p += nodeid(sz)
- }
- // Copy the call's results block to the actual results.
- if result != 0 {
- a.copy(result, r, a.sizeof(sig.Results()))
- }
-
- // We add a dynamic invoke constraint that will connect the
- // caller's and the callee's P/R blocks for each discovered
- // call target.
- a.addConstraint(&invokeConstraint{call.Method, a.valueNode(call.Value), block})
-}
-
-// genInvokeReflectType is a specialization of genInvoke where the
-// receiver type is a reflect.Type, under the assumption that there
-// can be at most one implementation of this interface, *reflect.rtype.
-//
-// (Though this may appear to be an instance of a pattern---method
-// calls on interfaces known to have exactly one implementation---in
-// practice it occurs rarely, so we special case for reflect.Type.)
-//
-// In effect we treat this:
-// var rt reflect.Type = ...
-// rt.F()
-// as this:
-// rt.(*reflect.rtype).F()
-//
-func (a *analysis) genInvokeReflectType(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
- // Unpack receiver into rtype
- rtype := a.addOneNode(a.reflectRtypePtr, "rtype.recv", nil)
- recv := a.valueNode(call.Value)
- a.typeAssert(a.reflectRtypePtr, rtype, recv, true)
-
- // Look up the concrete method.
- fn := a.prog.LookupMethod(a.reflectRtypePtr, call.Method.Pkg(), call.Method.Name())
-
- obj := a.makeFunctionObject(fn, site) // new contour for this call
- a.callEdge(caller, site, obj)
-
- // From now on, it's essentially a static call, but little is
- // gained by factoring together the code for both cases.
-
- sig := fn.Signature // concrete method
- targets := a.addOneNode(sig, "call.targets", nil)
- a.addressOf(sig, targets, obj) // (a singleton)
-
- // Copy receiver.
- params := a.funcParams(obj)
- a.copy(params, rtype, 1)
- params++
-
- // Copy actual parameters into formal P-block.
- // Must loop, since the actuals aren't contiguous.
- for i, arg := range call.Args {
- sz := a.sizeof(sig.Params().At(i).Type())
- a.copy(params, a.valueNode(arg), sz)
- params += nodeid(sz)
- }
-
- // Copy formal R-block to actual R-block.
- if result != 0 {
- a.copy(result, a.funcResults(obj), a.sizeof(sig.Results()))
- }
-}
-
-// genCall generates constraints for call instruction instr.
-func (a *analysis) genCall(caller *cgnode, instr ssa.CallInstruction) {
- call := instr.Common()
-
- // Intrinsic implementations of built-in functions.
- if _, ok := call.Value.(*ssa.Builtin); ok {
- a.genBuiltinCall(instr, caller)
- return
- }
-
- var result nodeid
- if v := instr.Value(); v != nil {
- result = a.valueNode(v)
- }
-
- site := &callsite{instr: instr}
- if call.StaticCallee() != nil {
- a.genStaticCall(caller, site, call, result)
- } else if call.IsInvoke() {
- a.genInvoke(caller, site, call, result)
- } else {
- a.genDynamicCall(caller, site, call, result)
- }
-
- caller.sites = append(caller.sites, site)
-
- if a.log != nil {
- // TODO(adonovan): debug: improve log message.
- fmt.Fprintf(a.log, "\t%s to targets %s from %s\n", site, site.targets, caller)
- }
-}
-
-// objectNode returns the object to which v points, if known.
-// In other words, if the points-to set of v is a singleton, it
-// returns the sole label, zero otherwise.
-//
-// We exploit this information to make the generated constraints less
-// dynamic. For example, a complex load constraint can be replaced by
-// a simple copy constraint when the sole destination is known a priori.
-//
-// Some SSA instructions always have singletons points-to sets:
-// Alloc, Function, Global, MakeChan, MakeClosure, MakeInterface, MakeMap, MakeSlice.
-// Others may be singletons depending on their operands:
-// FreeVar, Const, Convert, FieldAddr, IndexAddr, Slice.
-//
-// Idempotent. Objects are created as needed, possibly via recursion
-// down the SSA value graph, e.g IndexAddr(FieldAddr(Alloc))).
-//
-func (a *analysis) objectNode(cgn *cgnode, v ssa.Value) nodeid {
- switch v.(type) {
- case *ssa.Global, *ssa.Function, *ssa.Const, *ssa.FreeVar:
- // Global object.
- obj, ok := a.globalobj[v]
- if !ok {
- switch v := v.(type) {
- case *ssa.Global:
- obj = a.nextNode()
- a.addNodes(mustDeref(v.Type()), "global")
- a.endObject(obj, nil, v)
-
- case *ssa.Function:
- obj = a.makeFunctionObject(v, nil)
-
- case *ssa.Const:
- // not addressable
-
- case *ssa.FreeVar:
- // not addressable
- }
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\tglobalobj[%s] = n%d\n", v, obj)
- }
- a.globalobj[v] = obj
- }
- return obj
- }
-
- // Local object.
- obj, ok := a.localobj[v]
- if !ok {
- switch v := v.(type) {
- case *ssa.Alloc:
- obj = a.nextNode()
- a.addNodes(mustDeref(v.Type()), "alloc")
- a.endObject(obj, cgn, v)
-
- case *ssa.MakeSlice:
- obj = a.nextNode()
- a.addNodes(sliceToArray(v.Type()), "makeslice")
- a.endObject(obj, cgn, v)
-
- case *ssa.MakeChan:
- obj = a.nextNode()
- a.addNodes(v.Type().Underlying().(*types.Chan).Elem(), "makechan")
- a.endObject(obj, cgn, v)
-
- case *ssa.MakeMap:
- obj = a.nextNode()
- tmap := v.Type().Underlying().(*types.Map)
- a.addNodes(tmap.Key(), "makemap.key")
- elem := a.addNodes(tmap.Elem(), "makemap.value")
-
- // To update the value field, MapUpdate
- // generates store-with-offset constraints which
- // the presolver can't model, so we must mark
- // those nodes indirect.
- for id, end := elem, elem+nodeid(a.sizeof(tmap.Elem())); id < end; id++ {
- a.mapValues = append(a.mapValues, id)
- }
- a.endObject(obj, cgn, v)
-
- case *ssa.MakeInterface:
- tConc := v.X.Type()
- obj = a.makeTagged(tConc, cgn, v)
-
- // Copy the value into it, if nontrivial.
- if x := a.valueNode(v.X); x != 0 {
- a.copy(obj+1, x, a.sizeof(tConc))
- }
-
- case *ssa.FieldAddr:
- if xobj := a.objectNode(cgn, v.X); xobj != 0 {
- obj = xobj + nodeid(a.offsetOf(mustDeref(v.X.Type()), v.Field))
- }
-
- case *ssa.IndexAddr:
- if xobj := a.objectNode(cgn, v.X); xobj != 0 {
- obj = xobj + 1
- }
-
- case *ssa.Slice:
- obj = a.objectNode(cgn, v.X)
-
- case *ssa.Convert:
- // TODO(adonovan): opt: handle these cases too:
- // - unsafe.Pointer->*T conversion acts like Alloc
- // - string->[]byte/[]rune conversion acts like MakeSlice
- }
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\tlocalobj[%s] = n%d\n", v.Name(), obj)
- }
- a.localobj[v] = obj
- }
- return obj
-}
-
-// genLoad generates constraints for result = *(ptr + val).
-func (a *analysis) genLoad(cgn *cgnode, result nodeid, ptr ssa.Value, offset, sizeof uint32) {
- if obj := a.objectNode(cgn, ptr); obj != 0 {
- // Pre-apply loadConstraint.solve().
- a.copy(result, obj+nodeid(offset), sizeof)
- } else {
- a.load(result, a.valueNode(ptr), offset, sizeof)
- }
-}
-
-// genOffsetAddr generates constraints for a 'v=ptr.field' (FieldAddr)
-// or 'v=ptr[*]' (IndexAddr) instruction v.
-func (a *analysis) genOffsetAddr(cgn *cgnode, v ssa.Value, ptr nodeid, offset uint32) {
- dst := a.valueNode(v)
- if obj := a.objectNode(cgn, v); obj != 0 {
- // Pre-apply offsetAddrConstraint.solve().
- a.addressOf(v.Type(), dst, obj)
- } else {
- a.offsetAddr(v.Type(), dst, ptr, offset)
- }
-}
-
-// genStore generates constraints for *(ptr + offset) = val.
-func (a *analysis) genStore(cgn *cgnode, ptr ssa.Value, val nodeid, offset, sizeof uint32) {
- if obj := a.objectNode(cgn, ptr); obj != 0 {
- // Pre-apply storeConstraint.solve().
- a.copy(obj+nodeid(offset), val, sizeof)
- } else {
- a.store(a.valueNode(ptr), val, offset, sizeof)
- }
-}
-
-// genInstr generates constraints for instruction instr in context cgn.
-func (a *analysis) genInstr(cgn *cgnode, instr ssa.Instruction) {
- if a.log != nil {
- var prefix string
- if val, ok := instr.(ssa.Value); ok {
- prefix = val.Name() + " = "
- }
- fmt.Fprintf(a.log, "; %s%s\n", prefix, instr)
- }
-
- switch instr := instr.(type) {
- case *ssa.DebugRef:
- // no-op.
-
- case *ssa.UnOp:
- switch instr.Op {
- case token.ARROW: // <-x
- // We can ignore instr.CommaOk because the node we're
- // altering is always at zero offset relative to instr
- tElem := instr.X.Type().Underlying().(*types.Chan).Elem()
- a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(tElem))
-
- case token.MUL: // *x
- a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(instr.Type()))
-
- default:
- // NOT, SUB, XOR: no-op.
- }
-
- case *ssa.BinOp:
- // All no-ops.
-
- case ssa.CallInstruction: // *ssa.Call, *ssa.Go, *ssa.Defer
- a.genCall(cgn, instr)
-
- case *ssa.ChangeType:
- a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
- case *ssa.Convert:
- a.genConv(instr, cgn)
-
- case *ssa.Extract:
- a.copy(a.valueNode(instr),
- a.valueOffsetNode(instr.Tuple, instr.Index),
- a.sizeof(instr.Type()))
-
- case *ssa.FieldAddr:
- a.genOffsetAddr(cgn, instr, a.valueNode(instr.X),
- a.offsetOf(mustDeref(instr.X.Type()), instr.Field))
-
- case *ssa.IndexAddr:
- a.genOffsetAddr(cgn, instr, a.valueNode(instr.X), 1)
-
- case *ssa.Field:
- a.copy(a.valueNode(instr),
- a.valueOffsetNode(instr.X, instr.Field),
- a.sizeof(instr.Type()))
-
- case *ssa.Index:
- a.copy(a.valueNode(instr), 1+a.valueNode(instr.X), a.sizeof(instr.Type()))
-
- case *ssa.Select:
- recv := a.valueOffsetNode(instr, 2) // instr : (index, recvOk, recv0, ... recv_n-1)
- for _, st := range instr.States {
- elemSize := a.sizeof(st.Chan.Type().Underlying().(*types.Chan).Elem())
- switch st.Dir {
- case types.RecvOnly:
- a.genLoad(cgn, recv, st.Chan, 0, elemSize)
- recv += nodeid(elemSize)
-
- case types.SendOnly:
- a.genStore(cgn, st.Chan, a.valueNode(st.Send), 0, elemSize)
- }
- }
-
- case *ssa.Return:
- results := a.funcResults(cgn.obj)
- for _, r := range instr.Results {
- sz := a.sizeof(r.Type())
- a.copy(results, a.valueNode(r), sz)
- results += nodeid(sz)
- }
-
- case *ssa.Send:
- a.genStore(cgn, instr.Chan, a.valueNode(instr.X), 0, a.sizeof(instr.X.Type()))
-
- case *ssa.Store:
- a.genStore(cgn, instr.Addr, a.valueNode(instr.Val), 0, a.sizeof(instr.Val.Type()))
-
- case *ssa.Alloc, *ssa.MakeSlice, *ssa.MakeChan, *ssa.MakeMap, *ssa.MakeInterface:
- v := instr.(ssa.Value)
- a.addressOf(v.Type(), a.valueNode(v), a.objectNode(cgn, v))
-
- case *ssa.ChangeInterface:
- a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
- case *ssa.TypeAssert:
- a.typeAssert(instr.AssertedType, a.valueNode(instr), a.valueNode(instr.X), true)
-
- case *ssa.Slice:
- a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
- case *ssa.If, *ssa.Jump:
- // no-op.
-
- case *ssa.Phi:
- sz := a.sizeof(instr.Type())
- for _, e := range instr.Edges {
- a.copy(a.valueNode(instr), a.valueNode(e), sz)
- }
-
- case *ssa.MakeClosure:
- fn := instr.Fn.(*ssa.Function)
- a.copy(a.valueNode(instr), a.valueNode(fn), 1)
- // Free variables are treated like global variables.
- for i, b := range instr.Bindings {
- a.copy(a.valueNode(fn.FreeVars[i]), a.valueNode(b), a.sizeof(b.Type()))
- }
-
- case *ssa.RunDefers:
- // The analysis is flow insensitive, so we just "call"
- // defers as we encounter them.
-
- case *ssa.Range:
- // Do nothing. Next{Iter: *ssa.Range} handles this case.
-
- case *ssa.Next:
- if !instr.IsString { // map
- // Assumes that Next is always directly applied to a Range result.
- theMap := instr.Iter.(*ssa.Range).X
- tMap := theMap.Type().Underlying().(*types.Map)
-
- ksize := a.sizeof(tMap.Key())
- vsize := a.sizeof(tMap.Elem())
-
- // The k/v components of the Next tuple may each be invalid.
- tTuple := instr.Type().(*types.Tuple)
-
- // Load from the map's (k,v) into the tuple's (ok, k, v).
- osrc := uint32(0) // offset within map object
- odst := uint32(1) // offset within tuple (initially just after 'ok bool')
- sz := uint32(0) // amount to copy
-
- // Is key valid?
- if tTuple.At(1).Type() != tInvalid {
- sz += ksize
- } else {
- odst += ksize
- osrc += ksize
- }
-
- // Is value valid?
- if tTuple.At(2).Type() != tInvalid {
- sz += vsize
- }
-
- a.genLoad(cgn, a.valueNode(instr)+nodeid(odst), theMap, osrc, sz)
- }
-
- case *ssa.Lookup:
- if tMap, ok := instr.X.Type().Underlying().(*types.Map); ok {
- // CommaOk can be ignored: field 0 is a no-op.
- ksize := a.sizeof(tMap.Key())
- vsize := a.sizeof(tMap.Elem())
- a.genLoad(cgn, a.valueNode(instr), instr.X, ksize, vsize)
- }
-
- case *ssa.MapUpdate:
- tmap := instr.Map.Type().Underlying().(*types.Map)
- ksize := a.sizeof(tmap.Key())
- vsize := a.sizeof(tmap.Elem())
- a.genStore(cgn, instr.Map, a.valueNode(instr.Key), 0, ksize)
- a.genStore(cgn, instr.Map, a.valueNode(instr.Value), ksize, vsize)
-
- case *ssa.Panic:
- a.copy(a.panicNode, a.valueNode(instr.X), 1)
-
- default:
- panic(fmt.Sprintf("unimplemented: %T", instr))
- }
-}
-
-func (a *analysis) makeCGNode(fn *ssa.Function, obj nodeid, callersite *callsite) *cgnode {
- cgn := &cgnode{fn: fn, obj: obj, callersite: callersite}
- a.cgnodes = append(a.cgnodes, cgn)
- return cgn
-}
-
-// genRootCalls generates the synthetic root of the callgraph and the
-// initial calls from it to the analysis scope, such as main, a test
-// or a library.
-//
-func (a *analysis) genRootCalls() *cgnode {
- r := a.prog.NewFunction("", new(types.Signature), "root of callgraph")
- root := a.makeCGNode(r, 0, nil)
-
- // TODO(adonovan): make an ssa utility to construct an actual
- // root function so we don't need to special-case site-less
- // call edges.
-
- // For each main package, call main.init(), main.main().
- for _, mainPkg := range a.config.Mains {
- main := mainPkg.Func("main")
- if main == nil {
- panic(fmt.Sprintf("%s has no main function", mainPkg))
- }
-
- targets := a.addOneNode(main.Signature, "root.targets", nil)
- site := &callsite{targets: targets}
- root.sites = append(root.sites, site)
- for _, fn := range [2]*ssa.Function{mainPkg.Func("init"), main} {
- if a.log != nil {
- fmt.Fprintf(a.log, "\troot call to %s:\n", fn)
- }
- a.copy(targets, a.valueNode(fn), 1)
- }
- }
-
- return root
-}
-
-// genFunc generates constraints for function fn.
-func (a *analysis) genFunc(cgn *cgnode) {
- fn := cgn.fn
-
- impl := a.findIntrinsic(fn)
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\n\n==== Generating constraints for %s, %s\n", cgn, cgn.contour())
-
- // Hack: don't display body if intrinsic.
- if impl != nil {
- fn2 := *cgn.fn // copy
- fn2.Locals = nil
- fn2.Blocks = nil
- fn2.WriteTo(a.log)
- } else {
- cgn.fn.WriteTo(a.log)
- }
- }
-
- if impl != nil {
- impl(a, cgn)
- return
- }
-
- if fn.Blocks == nil {
- // External function with no intrinsic treatment.
- // We'll warn about calls to such functions at the end.
- return
- }
-
- if a.log != nil {
- fmt.Fprintln(a.log, "; Creating nodes for local values")
- }
-
- a.localval = make(map[ssa.Value]nodeid)
- a.localobj = make(map[ssa.Value]nodeid)
-
- // The value nodes for the params are in the func object block.
- params := a.funcParams(cgn.obj)
- for _, p := range fn.Params {
- a.setValueNode(p, params, cgn)
- params += nodeid(a.sizeof(p.Type()))
- }
-
- // Free variables have global cardinality:
- // the outer function sets them with MakeClosure;
- // the inner function accesses them with FreeVar.
- //
- // TODO(adonovan): treat free vars context-sensitively.
-
- // Create value nodes for all value instructions
- // since SSA may contain forward references.
- var space [10]*ssa.Value
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- switch instr := instr.(type) {
- case *ssa.Range:
- // do nothing: it has a funky type,
- // and *ssa.Next does all the work.
-
- case ssa.Value:
- var comment string
- if a.log != nil {
- comment = instr.Name()
- }
- id := a.addNodes(instr.Type(), comment)
- a.setValueNode(instr, id, cgn)
- }
-
- // Record all address-taken functions (for presolver).
- rands := instr.Operands(space[:0])
- if call, ok := instr.(ssa.CallInstruction); ok && !call.Common().IsInvoke() {
- // Skip CallCommon.Value in "call" mode.
- // TODO(adonovan): fix: relies on unspecified ordering. Specify it.
- rands = rands[1:]
- }
- for _, rand := range rands {
- if atf, ok := (*rand).(*ssa.Function); ok {
- a.atFuncs[atf] = true
- }
- }
- }
- }
-
- // Generate constraints for instructions.
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- a.genInstr(cgn, instr)
- }
- }
-
- a.localval = nil
- a.localobj = nil
-}
-
-// genMethodsOf generates nodes and constraints for all methods of type T.
-func (a *analysis) genMethodsOf(T types.Type) {
- itf := isInterface(T)
-
- // TODO(adonovan): can we skip this entirely if itf is true?
- // I think so, but the answer may depend on reflection.
- mset := a.prog.MethodSets.MethodSet(T)
- for i, n := 0, mset.Len(); i < n; i++ {
- m := a.prog.MethodValue(mset.At(i))
- a.valueNode(m)
-
- if !itf {
- // Methods of concrete types are address-taken functions.
- a.atFuncs[m] = true
- }
- }
-}
-
-// generate generates offline constraints for the entire program.
-func (a *analysis) generate() {
- start("Constraint generation")
- if a.log != nil {
- fmt.Fprintln(a.log, "==== Generating constraints")
- }
-
- // Create a dummy node since we use the nodeid 0 for
- // non-pointerlike variables.
- a.addNodes(tInvalid, "(zero)")
-
- // Create the global node for panic values.
- a.panicNode = a.addNodes(tEface, "panic")
-
- // Create nodes and constraints for all methods of reflect.rtype.
- // (Shared contours are used by dynamic calls to reflect.Type
- // methods---typically just String().)
- if rtype := a.reflectRtypePtr; rtype != nil {
- a.genMethodsOf(rtype)
- }
-
- root := a.genRootCalls()
-
- if a.config.BuildCallGraph {
- a.result.CallGraph = callgraph.New(root.fn)
- }
-
- // Create nodes and constraints for all methods of all types
- // that are dynamically accessible via reflection or interfaces.
- for _, T := range a.prog.RuntimeTypes() {
- a.genMethodsOf(T)
- }
-
- // Generate constraints for functions as they become reachable
- // from the roots. (No constraints are generated for functions
- // that are dead in this analysis scope.)
- for len(a.genq) > 0 {
- cgn := a.genq[0]
- a.genq = a.genq[1:]
- a.genFunc(cgn)
- }
-
- // The runtime magically allocates os.Args; so should we.
- if os := a.prog.ImportedPackage("os"); os != nil {
- // In effect: os.Args = new([1]string)[:]
- T := types.NewSlice(types.Typ[types.String])
- obj := a.addNodes(sliceToArray(T), "")
- a.endObject(obj, nil, "")
- a.addressOf(T, a.objectNode(nil, os.Var("Args")), obj)
- }
-
- // Discard generation state, to avoid confusion after node renumbering.
- a.panicNode = 0
- a.globalval = nil
- a.localval = nil
- a.localobj = nil
-
- stop("Constraint generation")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/hvn.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/hvn.go
deleted file mode 100644
index 48051ae7d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/hvn.go
+++ /dev/null
@@ -1,973 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file implements Hash-Value Numbering (HVN), a pre-solver
-// constraint optimization described in Hardekopf & Lin, SAS'07 (see
-// doc.go) that analyses the graph topology to determine which sets of
-// variables are "pointer equivalent" (PE), i.e. must have identical
-// points-to sets in the solution.
-//
-// A separate ("offline") graph is constructed. Its nodes are those of
-// the main-graph, plus an additional node *X for each pointer node X.
-// With this graph we can reason about the unknown points-to set of
-// dereferenced pointers. (We do not generalize this to represent
-// unknown fields x->f, perhaps because such fields would be numerous,
-// though it might be worth an experiment.)
-//
-// Nodes whose points-to relations are not entirely captured by the
-// graph are marked as "indirect": the *X nodes, the parameters of
-// address-taken functions (which includes all functions in method
-// sets), or nodes updated by the solver rules for reflection, etc.
-//
-// All addr (y=&x) nodes are initially assigned a pointer-equivalence
-// (PE) label equal to x's nodeid in the main graph. (These are the
-// only PE labels that are less than len(a.nodes).)
-//
-// All offsetAddr (y=&x.f) constraints are initially assigned a PE
-// label; such labels are memoized, keyed by (x, f), so that equivalent
-// nodes y as assigned the same label.
-//
-// Then we process each strongly connected component (SCC) of the graph
-// in topological order, assigning it a PE label based on the set P of
-// PE labels that flow to it from its immediate dependencies.
-//
-// If any node in P is "indirect", the entire SCC is assigned a fresh PE
-// label. Otherwise:
-//
-// |P|=0 if P is empty, all nodes in the SCC are non-pointers (e.g.
-// uninitialized variables, or formal params of dead functions)
-// and the SCC is assigned the PE label of zero.
-//
-// |P|=1 if P is a singleton, the SCC is assigned the same label as the
-// sole element of P.
-//
-// |P|>1 if P contains multiple labels, a unique label representing P is
-// invented and recorded in an hash table, so that other
-// equivalent SCCs may also be assigned this label, akin to
-// conventional hash-value numbering in a compiler.
-//
-// Finally, a renumbering is computed such that each node is replaced by
-// the lowest-numbered node with the same PE label. All constraints are
-// renumbered, and any resulting duplicates are eliminated.
-//
-// The only nodes that are not renumbered are the objects x in addr
-// (y=&x) constraints, since the ids of these nodes (and fields derived
-// from them via offsetAddr rules) are the elements of all points-to
-// sets, so they must remain as they are if we want the same solution.
-//
-// The solverStates (node.solve) for nodes in the same equivalence class
-// are linked together so that all nodes in the class have the same
-// solution. This avoids the need to renumber nodeids buried in
-// Queries, cgnodes, etc (like (*analysis).renumber() does) since only
-// the solution is needed.
-//
-// The result of HVN is that the number of distinct nodes and
-// constraints is reduced, but the solution is identical (almost---see
-// CROSS-CHECK below). In particular, both linear and cyclic chains of
-// copies are each replaced by a single node.
-//
-// Nodes and constraints created "online" (e.g. while solving reflection
-// constraints) are not subject to this optimization.
-//
-// PERFORMANCE
-//
-// In two benchmarks (guru and godoc), HVN eliminates about two thirds
-// of nodes, the majority accounted for by non-pointers: nodes of
-// non-pointer type, pointers that remain nil, formal parameters of dead
-// functions, nodes of untracked types, etc. It also reduces the number
-// of constraints, also by about two thirds, and the solving time by
-// 30--42%, although we must pay about 15% for the running time of HVN
-// itself. The benefit is greater for larger applications.
-//
-// There are many possible optimizations to improve the performance:
-// * Use fewer than 1:1 onodes to main graph nodes: many of the onodes
-// we create are not needed.
-// * HU (HVN with Union---see paper): coalesce "union" peLabels when
-// their expanded-out sets are equal.
-// * HR (HVN with deReference---see paper): this will require that we
-// apply HVN until fixed point, which may need more bookkeeping of the
-// correspondance of main nodes to onodes.
-// * Location Equivalence (see paper): have points-to sets contain not
-// locations but location-equivalence class labels, each representing
-// a set of locations.
-// * HVN with field-sensitive ref: model each of the fields of a
-// pointer-to-struct.
-//
-// CROSS-CHECK
-//
-// To verify the soundness of the optimization, when the
-// debugHVNCrossCheck option is enabled, we run the solver twice, once
-// before and once after running HVN, dumping the solution to disk, and
-// then we compare the results. If they are not identical, the analysis
-// panics.
-//
-// The solution dumped to disk includes only the N*N submatrix of the
-// complete solution where N is the number of nodes after generation.
-// In other words, we ignore pointer variables and objects created by
-// the solver itself, since their numbering depends on the solver order,
-// which is affected by the optimization. In any case, that's the only
-// part the client cares about.
-//
-// The cross-check is too strict and may fail spuriously. Although the
-// H&L paper describing HVN states that the solutions obtained should be
-// identical, this is not the case in practice because HVN can collapse
-// cycles involving *p even when pts(p)={}. Consider this example
-// distilled from testdata/hello.go:
-//
-// var x T
-// func f(p **T) {
-// t0 = *p
-// ...
-// t1 = φ(t0, &x)
-// *p = t1
-// }
-//
-// If f is dead code, we get:
-// unoptimized: pts(p)={} pts(t0)={} pts(t1)={&x}
-// optimized: pts(p)={} pts(t0)=pts(t1)=pts(*p)={&x}
-//
-// It's hard to argue that this is a bug: the result is sound and the
-// loss of precision is inconsequential---f is dead code, after all.
-// But unfortunately it limits the usefulness of the cross-check since
-// failures must be carefully analyzed. Ben Hardekopf suggests (in
-// personal correspondence) some approaches to mitigating it:
-//
-// If there is a node with an HVN points-to set that is a superset
-// of the NORM points-to set, then either it's a bug or it's a
-// result of this issue. If it's a result of this issue, then in
-// the offline constraint graph there should be a REF node inside
-// some cycle that reaches this node, and in the NORM solution the
-// pointer being dereferenced by that REF node should be the empty
-// set. If that isn't true then this is a bug. If it is true, then
-// you can further check that in the NORM solution the "extra"
-// points-to info in the HVN solution does in fact come from that
-// purported cycle (if it doesn't, then this is still a bug). If
-// you're doing the further check then you'll need to do it for
-// each "extra" points-to element in the HVN points-to set.
-//
-// There are probably ways to optimize these checks by taking
-// advantage of graph properties. For example, extraneous points-to
-// info will flow through the graph and end up in many
-// nodes. Rather than checking every node with extra info, you
-// could probably work out the "origin point" of the extra info and
-// just check there. Note that the check in the first bullet is
-// looking for soundness bugs, while the check in the second bullet
-// is looking for precision bugs; depending on your needs, you may
-// care more about one than the other.
-//
-// which we should evaluate. The cross-check is nonetheless invaluable
-// for all but one of the programs in the pointer_test suite.
-
-import (
- "fmt"
- "go/types"
- "io"
- "reflect"
-
- "golang.org/x/tools/container/intsets"
-)
-
-// A peLabel is a pointer-equivalence label: two nodes with the same
-// peLabel have identical points-to solutions.
-//
-// The numbers are allocated consecutively like so:
-// 0 not a pointer
-// 1..N-1 addrConstraints (equals the constraint's .src field, hence sparse)
-// ... offsetAddr constraints
-// ... SCCs (with indirect nodes or multiple inputs)
-//
-// Each PE label denotes a set of pointers containing a single addr, a
-// single offsetAddr, or some set of other PE labels.
-//
-type peLabel int
-
-type hvn struct {
- a *analysis
- N int // len(a.nodes) immediately after constraint generation
- log io.Writer // (optional) log of HVN lemmas
- onodes []*onode // nodes of the offline graph
- label peLabel // the next available PE label
- hvnLabel map[string]peLabel // hash-value numbering (PE label) for each set of onodeids
- stack []onodeid // DFS stack
- index int32 // next onode.index, from Tarjan's SCC algorithm
-
- // For each distinct offsetAddrConstraint (src, offset) pair,
- // offsetAddrLabels records a unique PE label >= N.
- offsetAddrLabels map[offsetAddr]peLabel
-}
-
-// The index of an node in the offline graph.
-// (Currently the first N align with the main nodes,
-// but this may change with HRU.)
-type onodeid uint32
-
-// An onode is a node in the offline constraint graph.
-// (Where ambiguous, members of analysis.nodes are referred to as
-// "main graph" nodes.)
-//
-// Edges in the offline constraint graph (edges and implicit) point to
-// the source, i.e. against the flow of values: they are dependencies.
-// Implicit edges are used for SCC computation, but not for gathering
-// incoming labels.
-//
-type onode struct {
- rep onodeid // index of representative of SCC in offline constraint graph
-
- edges intsets.Sparse // constraint edges X-->Y (this onode is X)
- implicit intsets.Sparse // implicit edges *X-->*Y (this onode is X)
- peLabels intsets.Sparse // set of peLabels are pointer-equivalent to this one
- indirect bool // node has points-to relations not represented in graph
-
- // Tarjan's SCC algorithm
- index, lowlink int32 // Tarjan numbering
- scc int32 // -ve => on stack; 0 => unvisited; +ve => node is root of a found SCC
-}
-
-type offsetAddr struct {
- ptr nodeid
- offset uint32
-}
-
-// nextLabel issues the next unused pointer-equivalence label.
-func (h *hvn) nextLabel() peLabel {
- h.label++
- return h.label
-}
-
-// ref(X) returns the index of the onode for *X.
-func (h *hvn) ref(id onodeid) onodeid {
- return id + onodeid(len(h.a.nodes))
-}
-
-// hvn computes pointer-equivalence labels (peLabels) using the Hash-based
-// Value Numbering (HVN) algorithm described in Hardekopf & Lin, SAS'07.
-//
-func (a *analysis) hvn() {
- start("HVN")
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\n\n==== Pointer equivalence optimization\n\n")
- }
-
- h := hvn{
- a: a,
- N: len(a.nodes),
- log: a.log,
- hvnLabel: make(map[string]peLabel),
- offsetAddrLabels: make(map[offsetAddr]peLabel),
- }
-
- if h.log != nil {
- fmt.Fprintf(h.log, "\nCreating offline graph nodes...\n")
- }
-
- // Create offline nodes. The first N nodes correspond to main
- // graph nodes; the next N are their corresponding ref() nodes.
- h.onodes = make([]*onode, 2*h.N)
- for id := range a.nodes {
- id := onodeid(id)
- h.onodes[id] = &onode{}
- h.onodes[h.ref(id)] = &onode{indirect: true}
- }
-
- // Each node initially represents just itself.
- for id, o := range h.onodes {
- o.rep = onodeid(id)
- }
-
- h.markIndirectNodes()
-
- // Reserve the first N PE labels for addrConstraints.
- h.label = peLabel(h.N)
-
- // Add offline constraint edges.
- if h.log != nil {
- fmt.Fprintf(h.log, "\nAdding offline graph edges...\n")
- }
- for _, c := range a.constraints {
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "; %s\n", c)
- }
- c.presolve(&h)
- }
-
- // Find and collapse SCCs.
- if h.log != nil {
- fmt.Fprintf(h.log, "\nFinding SCCs...\n")
- }
- h.index = 1
- for id, o := range h.onodes {
- if id > 0 && o.index == 0 {
- // Start depth-first search at each unvisited node.
- h.visit(onodeid(id))
- }
- }
-
- // Dump the solution
- // (NB: somewhat redundant with logging from simplify().)
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\nPointer equivalences:\n")
- for id, o := range h.onodes {
- if id == 0 {
- continue
- }
- if id == int(h.N) {
- fmt.Fprintf(h.log, "---\n")
- }
- fmt.Fprintf(h.log, "o%d\t", id)
- if o.rep != onodeid(id) {
- fmt.Fprintf(h.log, "rep=o%d", o.rep)
- } else {
- fmt.Fprintf(h.log, "p%d", o.peLabels.Min())
- if o.indirect {
- fmt.Fprint(h.log, " indirect")
- }
- }
- fmt.Fprintln(h.log)
- }
- }
-
- // Simplify the main constraint graph
- h.simplify()
-
- a.showCounts()
-
- stop("HVN")
-}
-
-// ---- constraint-specific rules ----
-
-// dst := &src
-func (c *addrConstraint) presolve(h *hvn) {
- // Each object (src) is an initial PE label.
- label := peLabel(c.src) // label < N
- if debugHVNVerbose && h.log != nil {
- // duplicate log messages are possible
- fmt.Fprintf(h.log, "\tcreate p%d: {&n%d}\n", label, c.src)
- }
- odst := onodeid(c.dst)
- osrc := onodeid(c.src)
-
- // Assign dst this label.
- h.onodes[odst].peLabels.Insert(int(label))
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d has p%d\n", odst, label)
- }
-
- h.addImplicitEdge(h.ref(odst), osrc) // *dst ~~> src.
-}
-
-// dst = src
-func (c *copyConstraint) presolve(h *hvn) {
- odst := onodeid(c.dst)
- osrc := onodeid(c.src)
- h.addEdge(odst, osrc) // dst --> src
- h.addImplicitEdge(h.ref(odst), h.ref(osrc)) // *dst ~~> *src
-}
-
-// dst = *src + offset
-func (c *loadConstraint) presolve(h *hvn) {
- odst := onodeid(c.dst)
- osrc := onodeid(c.src)
- if c.offset == 0 {
- h.addEdge(odst, h.ref(osrc)) // dst --> *src
- } else {
- // We don't interpret load-with-offset, e.g. results
- // of map value lookup, R-block of dynamic call, slice
- // copy/append, reflection.
- h.markIndirect(odst, "load with offset")
- }
-}
-
-// *dst + offset = src
-func (c *storeConstraint) presolve(h *hvn) {
- odst := onodeid(c.dst)
- osrc := onodeid(c.src)
- if c.offset == 0 {
- h.onodes[h.ref(odst)].edges.Insert(int(osrc)) // *dst --> src
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d --> o%d\n", h.ref(odst), osrc)
- }
- } else {
- // We don't interpret store-with-offset.
- // See discussion of soundness at markIndirectNodes.
- }
-}
-
-// dst = &src.offset
-func (c *offsetAddrConstraint) presolve(h *hvn) {
- // Give each distinct (addr, offset) pair a fresh PE label.
- // The cache performs CSE, effectively.
- key := offsetAddr{c.src, c.offset}
- label, ok := h.offsetAddrLabels[key]
- if !ok {
- label = h.nextLabel()
- h.offsetAddrLabels[key] = label
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tcreate p%d: {&n%d.#%d}\n",
- label, c.src, c.offset)
- }
- }
-
- // Assign dst this label.
- h.onodes[c.dst].peLabels.Insert(int(label))
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d has p%d\n", c.dst, label)
- }
-}
-
-// dst = src.(typ) where typ is an interface
-func (c *typeFilterConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.dst), "typeFilter result")
-}
-
-// dst = src.(typ) where typ is concrete
-func (c *untagConstraint) presolve(h *hvn) {
- odst := onodeid(c.dst)
- for end := odst + onodeid(h.a.sizeof(c.typ)); odst < end; odst++ {
- h.markIndirect(odst, "untag result")
- }
-}
-
-// dst = src.method(c.params...)
-func (c *invokeConstraint) presolve(h *hvn) {
- // All methods are address-taken functions, so
- // their formal P-blocks were already marked indirect.
-
- // Mark the caller's targets node as indirect.
- sig := c.method.Type().(*types.Signature)
- id := c.params
- h.markIndirect(onodeid(c.params), "invoke targets node")
- id++
-
- id += nodeid(h.a.sizeof(sig.Params()))
-
- // Mark the caller's R-block as indirect.
- end := id + nodeid(h.a.sizeof(sig.Results()))
- for id < end {
- h.markIndirect(onodeid(id), "invoke R-block")
- id++
- }
-}
-
-// markIndirectNodes marks as indirect nodes whose points-to relations
-// are not entirely captured by the offline graph, including:
-//
-// (a) All address-taken nodes (including the following nodes within
-// the same object). This is described in the paper.
-//
-// The most subtle cause of indirect nodes is the generation of
-// store-with-offset constraints since the offline graph doesn't
-// represent them. A global audit of constraint generation reveals the
-// following uses of store-with-offset:
-//
-// (b) genDynamicCall, for P-blocks of dynamically called functions,
-// to which dynamic copy edges will be added to them during
-// solving: from storeConstraint for standalone functions,
-// and from invokeConstraint for methods.
-// All such P-blocks must be marked indirect.
-// (c) MakeUpdate, to update the value part of a map object.
-// All MakeMap objects's value parts must be marked indirect.
-// (d) copyElems, to update the destination array.
-// All array elements must be marked indirect.
-//
-// Not all indirect marking happens here. ref() nodes are marked
-// indirect at construction, and each constraint's presolve() method may
-// mark additional nodes.
-//
-func (h *hvn) markIndirectNodes() {
- // (a) all address-taken nodes, plus all nodes following them
- // within the same object, since these may be indirectly
- // stored or address-taken.
- for _, c := range h.a.constraints {
- if c, ok := c.(*addrConstraint); ok {
- start := h.a.enclosingObj(c.src)
- end := start + nodeid(h.a.nodes[start].obj.size)
- for id := c.src; id < end; id++ {
- h.markIndirect(onodeid(id), "A-T object")
- }
- }
- }
-
- // (b) P-blocks of all address-taken functions.
- for id := 0; id < h.N; id++ {
- obj := h.a.nodes[id].obj
-
- // TODO(adonovan): opt: if obj.cgn.fn is a method and
- // obj.cgn is not its shared contour, this is an
- // "inlined" static method call. We needn't consider it
- // address-taken since no invokeConstraint will affect it.
-
- if obj != nil && obj.flags&otFunction != 0 && h.a.atFuncs[obj.cgn.fn] {
- // address-taken function
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "n%d is address-taken: %s\n", id, obj.cgn.fn)
- }
- h.markIndirect(onodeid(id), "A-T func identity")
- id++
- sig := obj.cgn.fn.Signature
- psize := h.a.sizeof(sig.Params())
- if sig.Recv() != nil {
- psize += h.a.sizeof(sig.Recv().Type())
- }
- for end := id + int(psize); id < end; id++ {
- h.markIndirect(onodeid(id), "A-T func P-block")
- }
- id--
- continue
- }
- }
-
- // (c) all map objects' value fields.
- for _, id := range h.a.mapValues {
- h.markIndirect(onodeid(id), "makemap.value")
- }
-
- // (d) all array element objects.
- // TODO(adonovan): opt: can we do better?
- for id := 0; id < h.N; id++ {
- // Identity node for an object of array type?
- if tArray, ok := h.a.nodes[id].typ.(*types.Array); ok {
- // Mark the array element nodes indirect.
- // (Skip past the identity field.)
- for range h.a.flatten(tArray.Elem()) {
- id++
- h.markIndirect(onodeid(id), "array elem")
- }
- }
- }
-}
-
-func (h *hvn) markIndirect(oid onodeid, comment string) {
- h.onodes[oid].indirect = true
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d is indirect: %s\n", oid, comment)
- }
-}
-
-// Adds an edge dst-->src.
-// Note the unusual convention: edges are dependency (contraflow) edges.
-func (h *hvn) addEdge(odst, osrc onodeid) {
- h.onodes[odst].edges.Insert(int(osrc))
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d --> o%d\n", odst, osrc)
- }
-}
-
-func (h *hvn) addImplicitEdge(odst, osrc onodeid) {
- h.onodes[odst].implicit.Insert(int(osrc))
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d ~~> o%d\n", odst, osrc)
- }
-}
-
-// visit implements the depth-first search of Tarjan's SCC algorithm.
-// Precondition: x is canonical.
-func (h *hvn) visit(x onodeid) {
- h.checkCanonical(x)
- xo := h.onodes[x]
- xo.index = h.index
- xo.lowlink = h.index
- h.index++
-
- h.stack = append(h.stack, x) // push
- assert(xo.scc == 0, "node revisited")
- xo.scc = -1
-
- var deps []int
- deps = xo.edges.AppendTo(deps)
- deps = xo.implicit.AppendTo(deps)
-
- for _, y := range deps {
- // Loop invariant: x is canonical.
-
- y := h.find(onodeid(y))
-
- if x == y {
- continue // nodes already coalesced
- }
-
- xo := h.onodes[x]
- yo := h.onodes[y]
-
- switch {
- case yo.scc > 0:
- // y is already a collapsed SCC
-
- case yo.scc < 0:
- // y is on the stack, and thus in the current SCC.
- if yo.index < xo.lowlink {
- xo.lowlink = yo.index
- }
-
- default:
- // y is unvisited; visit it now.
- h.visit(y)
- // Note: x and y are now non-canonical.
-
- x = h.find(onodeid(x))
-
- if yo.lowlink < xo.lowlink {
- xo.lowlink = yo.lowlink
- }
- }
- }
- h.checkCanonical(x)
-
- // Is x the root of an SCC?
- if xo.lowlink == xo.index {
- // Coalesce all nodes in the SCC.
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "scc o%d\n", x)
- }
- for {
- // Pop y from stack.
- i := len(h.stack) - 1
- y := h.stack[i]
- h.stack = h.stack[:i]
-
- h.checkCanonical(x)
- xo := h.onodes[x]
- h.checkCanonical(y)
- yo := h.onodes[y]
-
- if xo == yo {
- // SCC is complete.
- xo.scc = 1
- h.labelSCC(x)
- break
- }
- h.coalesce(x, y)
- }
- }
-}
-
-// Precondition: x is canonical.
-func (h *hvn) labelSCC(x onodeid) {
- h.checkCanonical(x)
- xo := h.onodes[x]
- xpe := &xo.peLabels
-
- // All indirect nodes get new labels.
- if xo.indirect {
- label := h.nextLabel()
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tcreate p%d: indirect SCC\n", label)
- fmt.Fprintf(h.log, "\to%d has p%d\n", x, label)
- }
-
- // Remove pre-labeling, in case a direct pre-labeled node was
- // merged with an indirect one.
- xpe.Clear()
- xpe.Insert(int(label))
-
- return
- }
-
- // Invariant: all peLabels sets are non-empty.
- // Those that are logically empty contain zero as their sole element.
- // No other sets contains zero.
-
- // Find all labels coming in to the coalesced SCC node.
- for _, y := range xo.edges.AppendTo(nil) {
- y := h.find(onodeid(y))
- if y == x {
- continue // already coalesced
- }
- ype := &h.onodes[y].peLabels
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tedge from o%d = %s\n", y, ype)
- }
-
- if ype.IsEmpty() {
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tnode has no PE label\n")
- }
- }
- assert(!ype.IsEmpty(), "incoming node has no PE label")
-
- if ype.Has(0) {
- // {0} represents a non-pointer.
- assert(ype.Len() == 1, "PE set contains {0, ...}")
- } else {
- xpe.UnionWith(ype)
- }
- }
-
- switch xpe.Len() {
- case 0:
- // SCC has no incoming non-zero PE labels: it is a non-pointer.
- xpe.Insert(0)
-
- case 1:
- // already a singleton
-
- default:
- // SCC has multiple incoming non-zero PE labels.
- // Find the canonical label representing this set.
- // We use String() as a fingerprint consistent with Equals().
- key := xpe.String()
- label, ok := h.hvnLabel[key]
- if !ok {
- label = h.nextLabel()
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tcreate p%d: union %s\n", label, xpe.String())
- }
- h.hvnLabel[key] = label
- }
- xpe.Clear()
- xpe.Insert(int(label))
- }
-
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\to%d has p%d\n", x, xpe.Min())
- }
-}
-
-// coalesce combines two nodes in the offline constraint graph.
-// Precondition: x and y are canonical.
-func (h *hvn) coalesce(x, y onodeid) {
- xo := h.onodes[x]
- yo := h.onodes[y]
-
- // x becomes y's canonical representative.
- yo.rep = x
-
- if debugHVNVerbose && h.log != nil {
- fmt.Fprintf(h.log, "\tcoalesce o%d into o%d\n", y, x)
- }
-
- // x accumulates y's edges.
- xo.edges.UnionWith(&yo.edges)
- yo.edges.Clear()
-
- // x accumulates y's implicit edges.
- xo.implicit.UnionWith(&yo.implicit)
- yo.implicit.Clear()
-
- // x accumulates y's pointer-equivalence labels.
- xo.peLabels.UnionWith(&yo.peLabels)
- yo.peLabels.Clear()
-
- // x accumulates y's indirect flag.
- if yo.indirect {
- xo.indirect = true
- }
-}
-
-// simplify computes a degenerate renumbering of nodeids from the PE
-// labels assigned by the hvn, and uses it to simplify the main
-// constraint graph, eliminating non-pointer nodes and duplicate
-// constraints.
-//
-func (h *hvn) simplify() {
- // canon maps each peLabel to its canonical main node.
- canon := make([]nodeid, h.label)
- for i := range canon {
- canon[i] = nodeid(h.N) // indicates "unset"
- }
-
- // mapping maps each main node index to the index of the canonical node.
- mapping := make([]nodeid, len(h.a.nodes))
-
- for id := range h.a.nodes {
- id := nodeid(id)
- if id == 0 {
- canon[0] = 0
- mapping[0] = 0
- continue
- }
- oid := h.find(onodeid(id))
- peLabels := &h.onodes[oid].peLabels
- assert(peLabels.Len() == 1, "PE class is not a singleton")
- label := peLabel(peLabels.Min())
-
- canonId := canon[label]
- if canonId == nodeid(h.N) {
- // id becomes the representative of the PE label.
- canonId = id
- canon[label] = canonId
-
- if h.a.log != nil {
- fmt.Fprintf(h.a.log, "\tpts(n%d) is canonical : \t(%s)\n",
- id, h.a.nodes[id].typ)
- }
-
- } else {
- // Link the solver states for the two nodes.
- assert(h.a.nodes[canonId].solve != nil, "missing solver state")
- h.a.nodes[id].solve = h.a.nodes[canonId].solve
-
- if h.a.log != nil {
- // TODO(adonovan): debug: reorganize the log so it prints
- // one line:
- // pe y = x1, ..., xn
- // for each canonical y. Requires allocation.
- fmt.Fprintf(h.a.log, "\tpts(n%d) = pts(n%d) : %s\n",
- id, canonId, h.a.nodes[id].typ)
- }
- }
-
- mapping[id] = canonId
- }
-
- // Renumber the constraints, eliminate duplicates, and eliminate
- // any containing non-pointers (n0).
- addrs := make(map[addrConstraint]bool)
- copys := make(map[copyConstraint]bool)
- loads := make(map[loadConstraint]bool)
- stores := make(map[storeConstraint]bool)
- offsetAddrs := make(map[offsetAddrConstraint]bool)
- untags := make(map[untagConstraint]bool)
- typeFilters := make(map[typeFilterConstraint]bool)
- invokes := make(map[invokeConstraint]bool)
-
- nbefore := len(h.a.constraints)
- cc := h.a.constraints[:0] // in-situ compaction
- for _, c := range h.a.constraints {
- // Renumber.
- switch c := c.(type) {
- case *addrConstraint:
- // Don't renumber c.src since it is the label of
- // an addressable object and will appear in PT sets.
- c.dst = mapping[c.dst]
- default:
- c.renumber(mapping)
- }
-
- if c.ptr() == 0 {
- continue // skip: constraint attached to non-pointer
- }
-
- var dup bool
- switch c := c.(type) {
- case *addrConstraint:
- _, dup = addrs[*c]
- addrs[*c] = true
-
- case *copyConstraint:
- if c.src == c.dst {
- continue // skip degenerate copies
- }
- if c.src == 0 {
- continue // skip copy from non-pointer
- }
- _, dup = copys[*c]
- copys[*c] = true
-
- case *loadConstraint:
- if c.src == 0 {
- continue // skip load from non-pointer
- }
- _, dup = loads[*c]
- loads[*c] = true
-
- case *storeConstraint:
- if c.src == 0 {
- continue // skip store from non-pointer
- }
- _, dup = stores[*c]
- stores[*c] = true
-
- case *offsetAddrConstraint:
- if c.src == 0 {
- continue // skip offset from non-pointer
- }
- _, dup = offsetAddrs[*c]
- offsetAddrs[*c] = true
-
- case *untagConstraint:
- if c.src == 0 {
- continue // skip untag of non-pointer
- }
- _, dup = untags[*c]
- untags[*c] = true
-
- case *typeFilterConstraint:
- if c.src == 0 {
- continue // skip filter of non-pointer
- }
- _, dup = typeFilters[*c]
- typeFilters[*c] = true
-
- case *invokeConstraint:
- if c.params == 0 {
- panic("non-pointer invoke.params")
- }
- if c.iface == 0 {
- continue // skip invoke on non-pointer
- }
- _, dup = invokes[*c]
- invokes[*c] = true
-
- default:
- // We don't bother de-duping advanced constraints
- // (e.g. reflection) since they are uncommon.
-
- // Eliminate constraints containing non-pointer nodeids.
- //
- // We use reflection to find the fields to avoid
- // adding yet another method to constraint.
- //
- // TODO(adonovan): experiment with a constraint
- // method that returns a slice of pointers to
- // nodeids fields to enable uniform iteration;
- // the renumber() method could be removed and
- // implemented using the new one.
- //
- // TODO(adonovan): opt: this is unsound since
- // some constraints still have an effect if one
- // of the operands is zero: rVCall, rVMapIndex,
- // rvSetMapIndex. Handle them specially.
- rtNodeid := reflect.TypeOf(nodeid(0))
- x := reflect.ValueOf(c).Elem()
- for i, nf := 0, x.NumField(); i < nf; i++ {
- f := x.Field(i)
- if f.Type() == rtNodeid {
- if f.Uint() == 0 {
- dup = true // skip it
- break
- }
- }
- }
- }
- if dup {
- continue // skip duplicates
- }
-
- cc = append(cc, c)
- }
- h.a.constraints = cc
-
- if h.log != nil {
- fmt.Fprintf(h.log, "#constraints: was %d, now %d\n", nbefore, len(h.a.constraints))
- }
-}
-
-// find returns the canonical onodeid for x.
-// (The onodes form a disjoint set forest.)
-func (h *hvn) find(x onodeid) onodeid {
- // TODO(adonovan): opt: this is a CPU hotspot. Try "union by rank".
- xo := h.onodes[x]
- rep := xo.rep
- if rep != x {
- rep = h.find(rep) // simple path compression
- xo.rep = rep
- }
- return rep
-}
-
-func (h *hvn) checkCanonical(x onodeid) {
- if debugHVN {
- assert(x == h.find(x), "not canonical")
- }
-}
-
-func assert(p bool, msg string) {
- if debugHVN && !p {
- panic("assertion failed: " + msg)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/intrinsics.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/intrinsics.go
deleted file mode 100644
index b7e2b1403..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/intrinsics.go
+++ /dev/null
@@ -1,361 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This package defines the treatment of intrinsics, i.e. library
-// functions requiring special analytical treatment.
-//
-// Most of these are C or assembly functions, but even some Go
-// functions require may special treatment if the analysis completely
-// replaces the implementation of an API such as reflection.
-
-// TODO(adonovan): support a means of writing analytic summaries in
-// the target code, so that users can summarise the effects of their
-// own C functions using a snippet of Go.
-
-import (
- "fmt"
- "go/types"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// Instances of 'intrinsic' generate analysis constraints for calls to
-// intrinsic functions.
-// Implementations may exploit information from the calling site
-// via cgn.callersite; for shared contours this is nil.
-type intrinsic func(a *analysis, cgn *cgnode)
-
-// Initialized in explicit init() to defeat (spurious) initialization
-// cycle error.
-var intrinsicsByName = make(map[string]intrinsic)
-
-func init() {
- // Key strings are from Function.String().
- // That little dot ۰ is an Arabic zero numeral (U+06F0),
- // categories [Nd].
- for name, fn := range map[string]intrinsic{
- // Other packages.
- "bytes.Equal": ext۰NoEffect,
- "bytes.IndexByte": ext۰NoEffect,
- "crypto/aes.decryptBlockAsm": ext۰NoEffect,
- "crypto/aes.encryptBlockAsm": ext۰NoEffect,
- "crypto/aes.expandKeyAsm": ext۰NoEffect,
- "crypto/aes.hasAsm": ext۰NoEffect,
- "crypto/md5.block": ext۰NoEffect,
- "crypto/rc4.xorKeyStream": ext۰NoEffect,
- "crypto/sha1.block": ext۰NoEffect,
- "crypto/sha256.block": ext۰NoEffect,
- "hash/crc32.castagnoliSSE42": ext۰NoEffect,
- "hash/crc32.haveSSE42": ext۰NoEffect,
- "math.Abs": ext۰NoEffect,
- "math.Acos": ext۰NoEffect,
- "math.Asin": ext۰NoEffect,
- "math.Atan": ext۰NoEffect,
- "math.Atan2": ext۰NoEffect,
- "math.Ceil": ext۰NoEffect,
- "math.Cos": ext۰NoEffect,
- "math.Dim": ext۰NoEffect,
- "math.Exp": ext۰NoEffect,
- "math.Exp2": ext۰NoEffect,
- "math.Expm1": ext۰NoEffect,
- "math.Float32bits": ext۰NoEffect,
- "math.Float32frombits": ext۰NoEffect,
- "math.Float64bits": ext۰NoEffect,
- "math.Float64frombits": ext۰NoEffect,
- "math.Floor": ext۰NoEffect,
- "math.Frexp": ext۰NoEffect,
- "math.Hypot": ext۰NoEffect,
- "math.Ldexp": ext۰NoEffect,
- "math.Log": ext۰NoEffect,
- "math.Log10": ext۰NoEffect,
- "math.Log1p": ext۰NoEffect,
- "math.Log2": ext۰NoEffect,
- "math.Max": ext۰NoEffect,
- "math.Min": ext۰NoEffect,
- "math.Mod": ext۰NoEffect,
- "math.Modf": ext۰NoEffect,
- "math.Remainder": ext۰NoEffect,
- "math.Sin": ext۰NoEffect,
- "math.Sincos": ext۰NoEffect,
- "math.Sqrt": ext۰NoEffect,
- "math.Tan": ext۰NoEffect,
- "math.Trunc": ext۰NoEffect,
- "math/big.addMulVVW": ext۰NoEffect,
- "math/big.addVV": ext۰NoEffect,
- "math/big.addVW": ext۰NoEffect,
- "math/big.bitLen": ext۰NoEffect,
- "math/big.divWVW": ext۰NoEffect,
- "math/big.divWW": ext۰NoEffect,
- "math/big.mulAddVWW": ext۰NoEffect,
- "math/big.mulWW": ext۰NoEffect,
- "math/big.shlVU": ext۰NoEffect,
- "math/big.shrVU": ext۰NoEffect,
- "math/big.subVV": ext۰NoEffect,
- "math/big.subVW": ext۰NoEffect,
- "net.runtime_Semacquire": ext۰NoEffect,
- "net.runtime_Semrelease": ext۰NoEffect,
- "net.runtime_pollClose": ext۰NoEffect,
- "net.runtime_pollOpen": ext۰NoEffect,
- "net.runtime_pollReset": ext۰NoEffect,
- "net.runtime_pollServerInit": ext۰NoEffect,
- "net.runtime_pollSetDeadline": ext۰NoEffect,
- "net.runtime_pollUnblock": ext۰NoEffect,
- "net.runtime_pollWait": ext۰NoEffect,
- "net.runtime_pollWaitCanceled": ext۰NoEffect,
- "os.epipecheck": ext۰NoEffect,
- // All other runtime functions are treated as NoEffect.
- "runtime.SetFinalizer": ext۰runtime۰SetFinalizer,
- "strings.IndexByte": ext۰NoEffect,
- "sync.runtime_Semacquire": ext۰NoEffect,
- "sync.runtime_Semrelease": ext۰NoEffect,
- "sync.runtime_Syncsemacquire": ext۰NoEffect,
- "sync.runtime_Syncsemcheck": ext۰NoEffect,
- "sync.runtime_Syncsemrelease": ext۰NoEffect,
- "sync.runtime_procPin": ext۰NoEffect,
- "sync.runtime_procUnpin": ext۰NoEffect,
- "sync.runtime_registerPool": ext۰NoEffect,
- "sync/atomic.AddInt32": ext۰NoEffect,
- "sync/atomic.AddInt64": ext۰NoEffect,
- "sync/atomic.AddUint32": ext۰NoEffect,
- "sync/atomic.AddUint64": ext۰NoEffect,
- "sync/atomic.AddUintptr": ext۰NoEffect,
- "sync/atomic.CompareAndSwapInt32": ext۰NoEffect,
- "sync/atomic.CompareAndSwapUint32": ext۰NoEffect,
- "sync/atomic.CompareAndSwapUint64": ext۰NoEffect,
- "sync/atomic.CompareAndSwapUintptr": ext۰NoEffect,
- "sync/atomic.LoadInt32": ext۰NoEffect,
- "sync/atomic.LoadInt64": ext۰NoEffect,
- "sync/atomic.LoadPointer": ext۰NoEffect, // ignore unsafe.Pointers
- "sync/atomic.LoadUint32": ext۰NoEffect,
- "sync/atomic.LoadUint64": ext۰NoEffect,
- "sync/atomic.LoadUintptr": ext۰NoEffect,
- "sync/atomic.StoreInt32": ext۰NoEffect,
- "sync/atomic.StorePointer": ext۰NoEffect, // ignore unsafe.Pointers
- "sync/atomic.StoreUint32": ext۰NoEffect,
- "sync/atomic.StoreUintptr": ext۰NoEffect,
- "syscall.Close": ext۰NoEffect,
- "syscall.Exit": ext۰NoEffect,
- "syscall.Getpid": ext۰NoEffect,
- "syscall.Getwd": ext۰NoEffect,
- "syscall.Kill": ext۰NoEffect,
- "syscall.RawSyscall": ext۰NoEffect,
- "syscall.RawSyscall6": ext۰NoEffect,
- "syscall.Syscall": ext۰NoEffect,
- "syscall.Syscall6": ext۰NoEffect,
- "syscall.runtime_AfterFork": ext۰NoEffect,
- "syscall.runtime_BeforeFork": ext۰NoEffect,
- "syscall.setenv_c": ext۰NoEffect,
- "time.Sleep": ext۰NoEffect,
- "time.now": ext۰NoEffect,
- "time.startTimer": ext۰time۰startTimer,
- "time.stopTimer": ext۰NoEffect,
- } {
- intrinsicsByName[name] = fn
- }
-}
-
-// findIntrinsic returns the constraint generation function for an
-// intrinsic function fn, or nil if the function should be handled normally.
-//
-func (a *analysis) findIntrinsic(fn *ssa.Function) intrinsic {
- // Consult the *Function-keyed cache.
- // A cached nil indicates a normal non-intrinsic function.
- impl, ok := a.intrinsics[fn]
- if !ok {
- impl = intrinsicsByName[fn.String()] // may be nil
-
- if a.isReflect(fn) {
- if !a.config.Reflection {
- impl = ext۰NoEffect // reflection disabled
- } else if impl == nil {
- // Ensure all "reflect" code is treated intrinsically.
- impl = ext۰NotYetImplemented
- }
- } else if impl == nil && fn.Pkg != nil && fn.Pkg.Pkg.Path() == "runtime" {
- // Ignore "runtime" (except SetFinalizer):
- // it has few interesting effects on aliasing
- // and is full of unsafe code we can't analyze.
- impl = ext۰NoEffect
- }
-
- a.intrinsics[fn] = impl
- }
- return impl
-}
-
-// isReflect reports whether fn belongs to the "reflect" package.
-func (a *analysis) isReflect(fn *ssa.Function) bool {
- if a.reflectValueObj == nil {
- return false // "reflect" package not loaded
- }
- reflectPackage := a.reflectValueObj.Pkg()
- if fn.Pkg != nil && fn.Pkg.Pkg == reflectPackage {
- return true
- }
- // Synthetic wrappers have a nil Pkg, so they slip through the
- // previous check. Check the receiver package.
- // TODO(adonovan): should synthetic wrappers have a non-nil Pkg?
- if recv := fn.Signature.Recv(); recv != nil {
- if named, ok := deref(recv.Type()).(*types.Named); ok {
- if named.Obj().Pkg() == reflectPackage {
- return true // e.g. wrapper of (reflect.Value).f
- }
- }
- }
- return false
-}
-
-// A trivial intrinsic suitable for any function that does not:
-// 1) induce aliases between its arguments or any global variables;
-// 2) call any functions; or
-// 3) create any labels.
-//
-// Many intrinsics (such as CompareAndSwapInt32) have a fourth kind of
-// effect: loading or storing through a pointer. Though these could
-// be significant, we deliberately ignore them because they are
-// generally not worth the effort.
-//
-// We sometimes violate condition #3 if the function creates only
-// non-function labels, as the control-flow graph is still sound.
-//
-func ext۰NoEffect(a *analysis, cgn *cgnode) {}
-
-func ext۰NotYetImplemented(a *analysis, cgn *cgnode) {
- fn := cgn.fn
- a.warnf(fn.Pos(), "unsound: intrinsic treatment of %s not yet implemented", fn)
-}
-
-// ---------- func runtime.SetFinalizer(x, f interface{}) ----------
-
-// runtime.SetFinalizer(x, f)
-type runtimeSetFinalizerConstraint struct {
- targets nodeid // (indirect)
- f nodeid // (ptr)
- x nodeid
-}
-
-func (c *runtimeSetFinalizerConstraint) ptr() nodeid { return c.f }
-func (c *runtimeSetFinalizerConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.targets), "SetFinalizer.targets")
-}
-func (c *runtimeSetFinalizerConstraint) renumber(mapping []nodeid) {
- c.targets = mapping[c.targets]
- c.f = mapping[c.f]
- c.x = mapping[c.x]
-}
-
-func (c *runtimeSetFinalizerConstraint) String() string {
- return fmt.Sprintf("runtime.SetFinalizer(n%d, n%d)", c.x, c.f)
-}
-
-func (c *runtimeSetFinalizerConstraint) solve(a *analysis, delta *nodeset) {
- for _, fObj := range delta.AppendTo(a.deltaSpace) {
- tDyn, f, indirect := a.taggedValue(nodeid(fObj))
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tSig, ok := tDyn.Underlying().(*types.Signature)
- if !ok {
- continue // not a function
- }
- if tSig.Recv() != nil {
- panic(tSig)
- }
- if tSig.Params().Len() != 1 {
- continue // not a unary function
- }
-
- // Extract x to tmp.
- tx := tSig.Params().At(0).Type()
- tmp := a.addNodes(tx, "SetFinalizer.tmp")
- a.typeAssert(tx, tmp, c.x, false)
-
- // Call f(tmp).
- a.store(f, tmp, 1, a.sizeof(tx))
-
- // Add dynamic call target.
- if a.onlineCopy(c.targets, f) {
- a.addWork(c.targets)
- }
- }
-}
-
-func ext۰runtime۰SetFinalizer(a *analysis, cgn *cgnode) {
- // This is the shared contour, used for dynamic calls.
- targets := a.addOneNode(tInvalid, "SetFinalizer.targets", nil)
- cgn.sites = append(cgn.sites, &callsite{targets: targets})
- params := a.funcParams(cgn.obj)
- a.addConstraint(&runtimeSetFinalizerConstraint{
- targets: targets,
- x: params,
- f: params + 1,
- })
-}
-
-// ---------- func time.startTimer(t *runtimeTimer) ----------
-
-// time.StartTimer(t)
-type timeStartTimerConstraint struct {
- targets nodeid // (indirect)
- t nodeid // (ptr)
-}
-
-func (c *timeStartTimerConstraint) ptr() nodeid { return c.t }
-func (c *timeStartTimerConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.targets), "StartTimer.targets")
-}
-func (c *timeStartTimerConstraint) renumber(mapping []nodeid) {
- c.targets = mapping[c.targets]
- c.t = mapping[c.t]
-}
-
-func (c *timeStartTimerConstraint) String() string {
- return fmt.Sprintf("time.startTimer(n%d)", c.t)
-}
-
-func (c *timeStartTimerConstraint) solve(a *analysis, delta *nodeset) {
- for _, tObj := range delta.AppendTo(a.deltaSpace) {
- t := nodeid(tObj)
-
- // We model startTimer as if it was defined thus:
- // func startTimer(t *runtimeTimer) { t.f(t.arg) }
-
- // We hard-code the field offsets of time.runtimeTimer:
- // type runtimeTimer struct {
- // 0 __identity__
- // 1 i int32
- // 2 when int64
- // 3 period int64
- // 4 f func(int64, interface{})
- // 5 arg interface{}
- // }
- f := t + 4
- arg := t + 5
-
- // store t.arg to t.f.params[0]
- // (offset 1 => skip identity)
- a.store(f, arg, 1, 1)
-
- // Add dynamic call target.
- if a.onlineCopy(c.targets, f) {
- a.addWork(c.targets)
- }
- }
-}
-
-func ext۰time۰startTimer(a *analysis, cgn *cgnode) {
- // This is the shared contour, used for dynamic calls.
- targets := a.addOneNode(tInvalid, "startTimer.targets", nil)
- cgn.sites = append(cgn.sites, &callsite{targets: targets})
- params := a.funcParams(cgn.obj)
- a.addConstraint(&timeStartTimerConstraint{
- targets: targets,
- t: params,
- })
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/labels.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/labels.go
deleted file mode 100644
index 7d64ef6a4..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/labels.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "strings"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// A Label is an entity that may be pointed to by a pointer, map,
-// channel, 'func', slice or interface.
-//
-// Labels include:
-// - functions
-// - globals
-// - tagged objects, representing interfaces and reflect.Values
-// - arrays created by conversions (e.g. []byte("foo"), []byte(s))
-// - stack- and heap-allocated variables (including composite literals)
-// - channels, maps and arrays created by make()
-// - intrinsic or reflective operations that allocate (e.g. append, reflect.New)
-// - intrinsic objects, e.g. the initial array behind os.Args.
-// - and their subelements, e.g. "alloc.y[*].z"
-//
-// Labels are so varied that they defy good generalizations;
-// some have no value, no callgraph node, or no position.
-// Many objects have types that are inexpressible in Go:
-// maps, channels, functions, tagged objects.
-//
-// At most one of Value() or ReflectType() may return non-nil.
-//
-type Label struct {
- obj *object // the addressable memory location containing this label
- subelement *fieldInfo // subelement path within obj, e.g. ".a.b[*].c"
-}
-
-// Value returns the ssa.Value that allocated this label's object, if any.
-func (l Label) Value() ssa.Value {
- val, _ := l.obj.data.(ssa.Value)
- return val
-}
-
-// ReflectType returns the type represented by this label if it is an
-// reflect.rtype instance object or *reflect.rtype-tagged object.
-//
-func (l Label) ReflectType() types.Type {
- rtype, _ := l.obj.data.(types.Type)
- return rtype
-}
-
-// Path returns the path to the subelement of the object containing
-// this label. For example, ".x[*].y".
-//
-func (l Label) Path() string {
- return l.subelement.path()
-}
-
-// Pos returns the position of this label, if known, zero otherwise.
-func (l Label) Pos() token.Pos {
- switch data := l.obj.data.(type) {
- case ssa.Value:
- return data.Pos()
- case types.Type:
- if nt, ok := deref(data).(*types.Named); ok {
- return nt.Obj().Pos()
- }
- }
- if cgn := l.obj.cgn; cgn != nil {
- return cgn.fn.Pos()
- }
- return token.NoPos
-}
-
-// String returns the printed form of this label.
-//
-// Examples: Object type:
-// x (a variable)
-// (sync.Mutex).Lock (a function)
-// convert (array created by conversion)
-// makemap (map allocated via make)
-// makechan (channel allocated via make)
-// makeinterface (tagged object allocated by makeinterface)
-// (allocation in instrinsic)
-// sync.Mutex (a reflect.rtype instance)
-// (an intrinsic object)
-//
-// Labels within compound objects have subelement paths:
-// x.y[*].z (a struct variable, x)
-// append.y[*].z (array allocated by append)
-// makeslice.y[*].z (array allocated via make)
-//
-// TODO(adonovan): expose func LabelString(*types.Package, Label).
-//
-func (l Label) String() string {
- var s string
- switch v := l.obj.data.(type) {
- case types.Type:
- return v.String()
-
- case string:
- s = v // an intrinsic object (e.g. os.Args[*])
-
- case nil:
- if l.obj.cgn != nil {
- // allocation by intrinsic or reflective operation
- s = fmt.Sprintf("", l.obj.cgn.fn)
- } else {
- s = "" // should be unreachable
- }
-
- case *ssa.Function:
- s = v.String()
-
- case *ssa.Global:
- s = v.String()
-
- case *ssa.Const:
- s = v.Name()
-
- case *ssa.Alloc:
- s = v.Comment
- if s == "" {
- s = "alloc"
- }
-
- case *ssa.Call:
- // Currently only calls to append can allocate objects.
- if v.Call.Value.(*ssa.Builtin).Object().Name() != "append" {
- panic("unhandled *ssa.Call label: " + v.Name())
- }
- s = "append"
-
- case *ssa.MakeMap, *ssa.MakeChan, *ssa.MakeSlice, *ssa.Convert:
- s = strings.ToLower(strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa."))
-
- case *ssa.MakeInterface:
- // MakeInterface is usually implicit in Go source (so
- // Pos()==0), and tagged objects may be allocated
- // synthetically (so no *MakeInterface data).
- s = "makeinterface:" + v.X.Type().String()
-
- default:
- panic(fmt.Sprintf("unhandled object data type: %T", v))
- }
-
- return s + l.subelement.path()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/opt.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/opt.go
deleted file mode 100644
index 81f80aa4f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/opt.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file implements renumbering, a pre-solver optimization to
-// improve the efficiency of the solver's points-to set representation.
-//
-// TODO(adonovan): rename file "renumber.go"
-
-import "fmt"
-
-// renumber permutes a.nodes so that all nodes within an addressable
-// object appear before all non-addressable nodes, maintaining the
-// order of nodes within the same object (as required by offsetAddr).
-//
-// renumber must update every nodeid in the analysis (constraints,
-// Pointers, callgraph, etc) to reflect the new ordering.
-//
-// This is an optimisation to increase the locality and efficiency of
-// sparse representations of points-to sets. (Typically only about
-// 20% of nodes are within an object.)
-//
-// NB: nodes added during solving (e.g. for reflection, SetFinalizer)
-// will be appended to the end.
-//
-// Renumbering makes the PTA log inscrutable. To aid debugging, later
-// phases (e.g. HVN) must not rely on it having occurred.
-//
-func (a *analysis) renumber() {
- if a.log != nil {
- fmt.Fprintf(a.log, "\n\n==== Renumbering\n\n")
- }
-
- N := nodeid(len(a.nodes))
- newNodes := make([]*node, N, N)
- renumbering := make([]nodeid, N, N) // maps old to new
-
- var i, j nodeid
-
- // The zero node is special.
- newNodes[j] = a.nodes[i]
- renumbering[i] = j
- i++
- j++
-
- // Pass 1: object nodes.
- for i < N {
- obj := a.nodes[i].obj
- if obj == nil {
- i++
- continue
- }
-
- end := i + nodeid(obj.size)
- for i < end {
- newNodes[j] = a.nodes[i]
- renumbering[i] = j
- i++
- j++
- }
- }
- nobj := j
-
- // Pass 2: non-object nodes.
- for i = 1; i < N; {
- obj := a.nodes[i].obj
- if obj != nil {
- i += nodeid(obj.size)
- continue
- }
-
- newNodes[j] = a.nodes[i]
- renumbering[i] = j
- i++
- j++
- }
-
- if j != N {
- panic(fmt.Sprintf("internal error: j=%d, N=%d", j, N))
- }
-
- // Log the remapping table.
- if a.log != nil {
- fmt.Fprintf(a.log, "Renumbering nodes to improve density:\n")
- fmt.Fprintf(a.log, "(%d object nodes of %d total)\n", nobj, N)
- for old, new := range renumbering {
- fmt.Fprintf(a.log, "\tn%d -> n%d\n", old, new)
- }
- }
-
- // Now renumber all existing nodeids to use the new node permutation.
- // It is critical that all reachable nodeids are accounted for!
-
- // Renumber nodeids in queried Pointers.
- for v, ptr := range a.result.Queries {
- ptr.n = renumbering[ptr.n]
- a.result.Queries[v] = ptr
- }
- for v, ptr := range a.result.IndirectQueries {
- ptr.n = renumbering[ptr.n]
- a.result.IndirectQueries[v] = ptr
- }
- for _, queries := range a.config.extendedQueries {
- for _, query := range queries {
- if query.ptr != nil {
- query.ptr.n = renumbering[query.ptr.n]
- }
- }
- }
-
- // Renumber nodeids in global objects.
- for v, id := range a.globalobj {
- a.globalobj[v] = renumbering[id]
- }
-
- // Renumber nodeids in constraints.
- for _, c := range a.constraints {
- c.renumber(renumbering)
- }
-
- // Renumber nodeids in the call graph.
- for _, cgn := range a.cgnodes {
- cgn.obj = renumbering[cgn.obj]
- for _, site := range cgn.sites {
- site.targets = renumbering[site.targets]
- }
- }
-
- a.nodes = newNodes
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/print.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/print.go
deleted file mode 100644
index 4f2f4c7ae..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/print.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import "fmt"
-
-func (c *addrConstraint) String() string {
- return fmt.Sprintf("addr n%d <- {&n%d}", c.dst, c.src)
-}
-
-func (c *copyConstraint) String() string {
- return fmt.Sprintf("copy n%d <- n%d", c.dst, c.src)
-}
-
-func (c *loadConstraint) String() string {
- return fmt.Sprintf("load n%d <- n%d[%d]", c.dst, c.src, c.offset)
-}
-
-func (c *storeConstraint) String() string {
- return fmt.Sprintf("store n%d[%d] <- n%d", c.dst, c.offset, c.src)
-}
-
-func (c *offsetAddrConstraint) String() string {
- return fmt.Sprintf("offsetAddr n%d <- n%d.#%d", c.dst, c.src, c.offset)
-}
-
-func (c *typeFilterConstraint) String() string {
- return fmt.Sprintf("typeFilter n%d <- n%d.(%s)", c.dst, c.src, c.typ)
-}
-
-func (c *untagConstraint) String() string {
- return fmt.Sprintf("untag n%d <- n%d.(%s)", c.dst, c.src, c.typ)
-}
-
-func (c *invokeConstraint) String() string {
- return fmt.Sprintf("invoke n%d.%s(n%d ...)", c.iface, c.method.Name(), c.params)
-}
-
-func (n nodeid) String() string {
- return fmt.Sprintf("n%d", n)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/query.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/query.go
deleted file mode 100644
index 1263d318e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/query.go
+++ /dev/null
@@ -1,221 +0,0 @@
-package pointer
-
-import (
- "errors"
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "strconv"
-)
-
-// An extendedQuery represents a sequence of destructuring operations
-// applied to an ssa.Value (denoted by "x").
-type extendedQuery struct {
- ops []interface{}
- ptr *Pointer
-}
-
-// indexValue returns the value of an integer literal used as an
-// index.
-func indexValue(expr ast.Expr) (int, error) {
- lit, ok := expr.(*ast.BasicLit)
- if !ok {
- return 0, fmt.Errorf("non-integer index (%T)", expr)
- }
- if lit.Kind != token.INT {
- return 0, fmt.Errorf("non-integer index %s", lit.Value)
- }
- return strconv.Atoi(lit.Value)
-}
-
-// parseExtendedQuery parses and validates a destructuring Go
-// expression and returns the sequence of destructuring operations.
-// See parseDestructuringExpr for details.
-func parseExtendedQuery(typ types.Type, query string) ([]interface{}, types.Type, error) {
- expr, err := parser.ParseExpr(query)
- if err != nil {
- return nil, nil, err
- }
- ops, typ, err := destructuringOps(typ, expr)
- if err != nil {
- return nil, nil, err
- }
- if len(ops) == 0 {
- return nil, nil, errors.New("invalid query: must not be empty")
- }
- if ops[0] != "x" {
- return nil, nil, fmt.Errorf("invalid query: query operand must be named x")
- }
- if !CanPoint(typ) {
- return nil, nil, fmt.Errorf("query does not describe a pointer-like value: %s", typ)
- }
- return ops, typ, nil
-}
-
-// destructuringOps parses a Go expression consisting only of an
-// identifier "x", field selections, indexing, channel receives, load
-// operations and parens---for example: "<-(*x[i])[key]"--- and
-// returns the sequence of destructuring operations on x.
-func destructuringOps(typ types.Type, expr ast.Expr) ([]interface{}, types.Type, error) {
- switch expr := expr.(type) {
- case *ast.SelectorExpr:
- out, typ, err := destructuringOps(typ, expr.X)
- if err != nil {
- return nil, nil, err
- }
-
- var structT *types.Struct
- switch typ := typ.(type) {
- case *types.Pointer:
- var ok bool
- structT, ok = typ.Elem().Underlying().(*types.Struct)
- if !ok {
- return nil, nil, fmt.Errorf("cannot access field %s of pointer to type %s", expr.Sel.Name, typ.Elem())
- }
-
- out = append(out, "load")
- case *types.Struct:
- structT = typ
- default:
- return nil, nil, fmt.Errorf("cannot access field %s of type %s", expr.Sel.Name, typ)
- }
-
- for i := 0; i < structT.NumFields(); i++ {
- field := structT.Field(i)
- if field.Name() == expr.Sel.Name {
- out = append(out, "field", i)
- return out, field.Type().Underlying(), nil
- }
- }
- // TODO(dh): supporting embedding would need something like
- // types.LookupFieldOrMethod, but without taking package
- // boundaries into account, because we may want to access
- // unexported fields. If we were only interested in one level
- // of unexported name, we could determine the appropriate
- // package and run LookupFieldOrMethod with that. However, a
- // single query may want to cross multiple package boundaries,
- // and at this point it's not really worth the complexity.
- return nil, nil, fmt.Errorf("no field %s in %s (embedded fields must be resolved manually)", expr.Sel.Name, structT)
- case *ast.Ident:
- return []interface{}{expr.Name}, typ, nil
- case *ast.BasicLit:
- return []interface{}{expr.Value}, nil, nil
- case *ast.IndexExpr:
- out, typ, err := destructuringOps(typ, expr.X)
- if err != nil {
- return nil, nil, err
- }
- switch typ := typ.(type) {
- case *types.Array:
- out = append(out, "arrayelem")
- return out, typ.Elem().Underlying(), nil
- case *types.Slice:
- out = append(out, "sliceelem")
- return out, typ.Elem().Underlying(), nil
- case *types.Map:
- out = append(out, "mapelem")
- return out, typ.Elem().Underlying(), nil
- case *types.Tuple:
- out = append(out, "index")
- idx, err := indexValue(expr.Index)
- if err != nil {
- return nil, nil, err
- }
- out = append(out, idx)
- if idx >= typ.Len() || idx < 0 {
- return nil, nil, fmt.Errorf("tuple index %d out of bounds", idx)
- }
- return out, typ.At(idx).Type().Underlying(), nil
- default:
- return nil, nil, fmt.Errorf("cannot index type %s", typ)
- }
-
- case *ast.UnaryExpr:
- if expr.Op != token.ARROW {
- return nil, nil, fmt.Errorf("unsupported unary operator %s", expr.Op)
- }
- out, typ, err := destructuringOps(typ, expr.X)
- if err != nil {
- return nil, nil, err
- }
- ch, ok := typ.(*types.Chan)
- if !ok {
- return nil, nil, fmt.Errorf("cannot receive from value of type %s", typ)
- }
- out = append(out, "recv")
- return out, ch.Elem().Underlying(), err
- case *ast.ParenExpr:
- return destructuringOps(typ, expr.X)
- case *ast.StarExpr:
- out, typ, err := destructuringOps(typ, expr.X)
- if err != nil {
- return nil, nil, err
- }
- ptr, ok := typ.(*types.Pointer)
- if !ok {
- return nil, nil, fmt.Errorf("cannot dereference type %s", typ)
- }
- out = append(out, "load")
- return out, ptr.Elem().Underlying(), err
- default:
- return nil, nil, fmt.Errorf("unsupported expression %T", expr)
- }
-}
-
-func (a *analysis) evalExtendedQuery(t types.Type, id nodeid, ops []interface{}) (types.Type, nodeid) {
- pid := id
- // TODO(dh): we're allocating intermediary nodes each time
- // evalExtendedQuery is called. We should probably only generate
- // them once per (v, ops) pair.
- for i := 1; i < len(ops); i++ {
- var nid nodeid
- switch ops[i] {
- case "recv":
- t = t.(*types.Chan).Elem().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.load(nid, pid, 0, a.sizeof(t))
- case "field":
- i++ // fetch field index
- tt := t.(*types.Struct)
- idx := ops[i].(int)
- offset := a.offsetOf(t, idx)
- t = tt.Field(idx).Type().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.copy(nid, pid+nodeid(offset), a.sizeof(t))
- case "arrayelem":
- t = t.(*types.Array).Elem().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.copy(nid, 1+pid, a.sizeof(t))
- case "sliceelem":
- t = t.(*types.Slice).Elem().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.load(nid, pid, 1, a.sizeof(t))
- case "mapelem":
- tt := t.(*types.Map)
- t = tt.Elem()
- ksize := a.sizeof(tt.Key())
- vsize := a.sizeof(tt.Elem())
- nid = a.addNodes(t, "query.extended")
- a.load(nid, pid, ksize, vsize)
- case "index":
- i++ // fetch index
- tt := t.(*types.Tuple)
- idx := ops[i].(int)
- t = tt.At(idx).Type().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.copy(nid, pid+nodeid(idx), a.sizeof(t))
- case "load":
- t = t.(*types.Pointer).Elem().Underlying()
- nid = a.addNodes(t, "query.extended")
- a.load(nid, pid, 0, a.sizeof(t))
- default:
- // shouldn't happen
- panic(fmt.Sprintf("unknown op %q", ops[i]))
- }
- pid = nid
- }
-
- return t, pid
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/reflect.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/reflect.go
deleted file mode 100644
index 3439a8965..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/reflect.go
+++ /dev/null
@@ -1,1975 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file implements the generation and resolution rules for
-// constraints arising from the use of reflection in the target
-// program. See doc.go for explanation of the representation.
-//
-// For consistency, the names of all parameters match those of the
-// actual functions in the "reflect" package.
-//
-// To avoid proliferation of equivalent labels, intrinsics should
-// memoize as much as possible, like TypeOf and Zero do for their
-// tagged objects.
-//
-// TODO(adonovan): this file is rather subtle. Explain how we derive
-// the implementation of each reflect operator from its spec,
-// including the subtleties of reflect.flag{Addr,RO,Indir}.
-// [Hint: our implementation is as if reflect.flagIndir was always
-// true, i.e. reflect.Values are pointers to tagged objects, there is
-// no inline allocation optimization; and indirect tagged objects (not
-// yet implemented) correspond to reflect.Values with
-// reflect.flagAddr.]
-// A picture would help too.
-//
-// TODO(adonovan): try factoring up the common parts of the majority of
-// these constraints that are single input, single output.
-
-import (
- "fmt"
- exact "go/constant"
- "go/types"
- "reflect"
-
- "golang.org/x/tools/go/ssa"
-)
-
-func init() {
- for name, fn := range map[string]intrinsic{
- // reflect.Value methods.
- "(reflect.Value).Addr": ext۰reflect۰Value۰Addr,
- "(reflect.Value).Bool": ext۰NoEffect,
- "(reflect.Value).Bytes": ext۰reflect۰Value۰Bytes,
- "(reflect.Value).Call": ext۰reflect۰Value۰Call,
- "(reflect.Value).CallSlice": ext۰reflect۰Value۰CallSlice,
- "(reflect.Value).CanAddr": ext۰NoEffect,
- "(reflect.Value).CanInterface": ext۰NoEffect,
- "(reflect.Value).CanSet": ext۰NoEffect,
- "(reflect.Value).Cap": ext۰NoEffect,
- "(reflect.Value).Close": ext۰NoEffect,
- "(reflect.Value).Complex": ext۰NoEffect,
- "(reflect.Value).Convert": ext۰reflect۰Value۰Convert,
- "(reflect.Value).Elem": ext۰reflect۰Value۰Elem,
- "(reflect.Value).Field": ext۰reflect۰Value۰Field,
- "(reflect.Value).FieldByIndex": ext۰reflect۰Value۰FieldByIndex,
- "(reflect.Value).FieldByName": ext۰reflect۰Value۰FieldByName,
- "(reflect.Value).FieldByNameFunc": ext۰reflect۰Value۰FieldByNameFunc,
- "(reflect.Value).Float": ext۰NoEffect,
- "(reflect.Value).Index": ext۰reflect۰Value۰Index,
- "(reflect.Value).Int": ext۰NoEffect,
- "(reflect.Value).Interface": ext۰reflect۰Value۰Interface,
- "(reflect.Value).InterfaceData": ext۰NoEffect,
- "(reflect.Value).IsNil": ext۰NoEffect,
- "(reflect.Value).IsValid": ext۰NoEffect,
- "(reflect.Value).Kind": ext۰NoEffect,
- "(reflect.Value).Len": ext۰NoEffect,
- "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex,
- "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys,
- "(reflect.Value).Method": ext۰reflect۰Value۰Method,
- "(reflect.Value).MethodByName": ext۰reflect۰Value۰MethodByName,
- "(reflect.Value).NumField": ext۰NoEffect,
- "(reflect.Value).NumMethod": ext۰NoEffect,
- "(reflect.Value).OverflowComplex": ext۰NoEffect,
- "(reflect.Value).OverflowFloat": ext۰NoEffect,
- "(reflect.Value).OverflowInt": ext۰NoEffect,
- "(reflect.Value).OverflowUint": ext۰NoEffect,
- "(reflect.Value).Pointer": ext۰NoEffect,
- "(reflect.Value).Recv": ext۰reflect۰Value۰Recv,
- "(reflect.Value).Send": ext۰reflect۰Value۰Send,
- "(reflect.Value).Set": ext۰reflect۰Value۰Set,
- "(reflect.Value).SetBool": ext۰NoEffect,
- "(reflect.Value).SetBytes": ext۰reflect۰Value۰SetBytes,
- "(reflect.Value).SetComplex": ext۰NoEffect,
- "(reflect.Value).SetFloat": ext۰NoEffect,
- "(reflect.Value).SetInt": ext۰NoEffect,
- "(reflect.Value).SetLen": ext۰NoEffect,
- "(reflect.Value).SetMapIndex": ext۰reflect۰Value۰SetMapIndex,
- "(reflect.Value).SetPointer": ext۰reflect۰Value۰SetPointer,
- "(reflect.Value).SetString": ext۰NoEffect,
- "(reflect.Value).SetUint": ext۰NoEffect,
- "(reflect.Value).Slice": ext۰reflect۰Value۰Slice,
- "(reflect.Value).String": ext۰NoEffect,
- "(reflect.Value).TryRecv": ext۰reflect۰Value۰Recv,
- "(reflect.Value).TrySend": ext۰reflect۰Value۰Send,
- "(reflect.Value).Type": ext۰NoEffect,
- "(reflect.Value).Uint": ext۰NoEffect,
- "(reflect.Value).UnsafeAddr": ext۰NoEffect,
-
- // Standalone reflect.* functions.
- "reflect.Append": ext۰reflect۰Append,
- "reflect.AppendSlice": ext۰reflect۰AppendSlice,
- "reflect.Copy": ext۰reflect۰Copy,
- "reflect.ChanOf": ext۰reflect۰ChanOf,
- "reflect.DeepEqual": ext۰NoEffect,
- "reflect.Indirect": ext۰reflect۰Indirect,
- "reflect.MakeChan": ext۰reflect۰MakeChan,
- "reflect.MakeFunc": ext۰reflect۰MakeFunc,
- "reflect.MakeMap": ext۰reflect۰MakeMap,
- "reflect.MakeSlice": ext۰reflect۰MakeSlice,
- "reflect.MapOf": ext۰reflect۰MapOf,
- "reflect.New": ext۰reflect۰New,
- "reflect.NewAt": ext۰reflect۰NewAt,
- "reflect.PtrTo": ext۰reflect۰PtrTo,
- "reflect.Select": ext۰reflect۰Select,
- "reflect.SliceOf": ext۰reflect۰SliceOf,
- "reflect.TypeOf": ext۰reflect۰TypeOf,
- "reflect.ValueOf": ext۰reflect۰ValueOf,
- "reflect.Zero": ext۰reflect۰Zero,
- "reflect.init": ext۰NoEffect,
-
- // *reflect.rtype methods
- "(*reflect.rtype).Align": ext۰NoEffect,
- "(*reflect.rtype).AssignableTo": ext۰NoEffect,
- "(*reflect.rtype).Bits": ext۰NoEffect,
- "(*reflect.rtype).ChanDir": ext۰NoEffect,
- "(*reflect.rtype).ConvertibleTo": ext۰NoEffect,
- "(*reflect.rtype).Elem": ext۰reflect۰rtype۰Elem,
- "(*reflect.rtype).Field": ext۰reflect۰rtype۰Field,
- "(*reflect.rtype).FieldAlign": ext۰NoEffect,
- "(*reflect.rtype).FieldByIndex": ext۰reflect۰rtype۰FieldByIndex,
- "(*reflect.rtype).FieldByName": ext۰reflect۰rtype۰FieldByName,
- "(*reflect.rtype).FieldByNameFunc": ext۰reflect۰rtype۰FieldByNameFunc,
- "(*reflect.rtype).Implements": ext۰NoEffect,
- "(*reflect.rtype).In": ext۰reflect۰rtype۰In,
- "(*reflect.rtype).IsVariadic": ext۰NoEffect,
- "(*reflect.rtype).Key": ext۰reflect۰rtype۰Key,
- "(*reflect.rtype).Kind": ext۰NoEffect,
- "(*reflect.rtype).Len": ext۰NoEffect,
- "(*reflect.rtype).Method": ext۰reflect۰rtype۰Method,
- "(*reflect.rtype).MethodByName": ext۰reflect۰rtype۰MethodByName,
- "(*reflect.rtype).Name": ext۰NoEffect,
- "(*reflect.rtype).NumField": ext۰NoEffect,
- "(*reflect.rtype).NumIn": ext۰NoEffect,
- "(*reflect.rtype).NumMethod": ext۰NoEffect,
- "(*reflect.rtype).NumOut": ext۰NoEffect,
- "(*reflect.rtype).Out": ext۰reflect۰rtype۰Out,
- "(*reflect.rtype).PkgPath": ext۰NoEffect,
- "(*reflect.rtype).Size": ext۰NoEffect,
- "(*reflect.rtype).String": ext۰NoEffect,
- } {
- intrinsicsByName[name] = fn
- }
-}
-
-// -------------------- (reflect.Value) --------------------
-
-func ext۰reflect۰Value۰Addr(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Bytes() Value ----------
-
-// result = v.Bytes()
-type rVBytesConstraint struct {
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVBytesConstraint) ptr() nodeid { return c.v }
-func (c *rVBytesConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVBytes.result")
-}
-func (c *rVBytesConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVBytesConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Bytes()", c.result, c.v)
-}
-
-func (c *rVBytesConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, slice, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tSlice, ok := tDyn.Underlying().(*types.Slice)
- if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) {
- if a.onlineCopy(c.result, slice) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Bytes(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVBytesConstraint{
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).Call(in []Value) []Value ----------
-
-// result = v.Call(in)
-type rVCallConstraint struct {
- cgn *cgnode
- targets nodeid // (indirect)
- v nodeid // (ptr)
- arg nodeid // = in[*]
- result nodeid // (indirect)
- dotdotdot bool // interpret last arg as a "..." slice
-}
-
-func (c *rVCallConstraint) ptr() nodeid { return c.v }
-func (c *rVCallConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.targets), "rVCall.targets")
- h.markIndirect(onodeid(c.result), "rVCall.result")
-}
-func (c *rVCallConstraint) renumber(mapping []nodeid) {
- c.targets = mapping[c.targets]
- c.v = mapping[c.v]
- c.arg = mapping[c.arg]
- c.result = mapping[c.result]
-}
-
-func (c *rVCallConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Call(n%d)", c.result, c.v, c.arg)
-}
-
-func (c *rVCallConstraint) solve(a *analysis, delta *nodeset) {
- if c.targets == 0 {
- panic("no targets")
- }
-
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, fn, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tSig, ok := tDyn.Underlying().(*types.Signature)
- if !ok {
- continue // not a function
- }
- if tSig.Recv() != nil {
- panic(tSig) // TODO(adonovan): rethink when we implement Method()
- }
-
- // Add dynamic call target.
- if a.onlineCopy(c.targets, fn) {
- a.addWork(c.targets)
- // TODO(adonovan): is 'else continue' a sound optimisation here?
- }
-
- // Allocate a P/R block.
- tParams := tSig.Params()
- tResults := tSig.Results()
- params := a.addNodes(tParams, "rVCall.params")
- results := a.addNodes(tResults, "rVCall.results")
-
- // Make a dynamic call to 'fn'.
- a.store(fn, params, 1, a.sizeof(tParams))
- a.load(results, fn, 1+a.sizeof(tParams), a.sizeof(tResults))
-
- // Populate P by type-asserting each actual arg (all merged in c.arg).
- for i, n := 0, tParams.Len(); i < n; i++ {
- T := tParams.At(i).Type()
- a.typeAssert(T, params, c.arg, false)
- params += nodeid(a.sizeof(T))
- }
-
- // Use R by tagging and copying each actual result to c.result.
- for i, n := 0, tResults.Len(); i < n; i++ {
- T := tResults.At(i).Type()
- // Convert from an arbitrary type to a reflect.Value
- // (like MakeInterface followed by reflect.ValueOf).
- if isInterface(T) {
- // (don't tag)
- if a.onlineCopy(c.result, results) {
- changed = true
- }
- } else {
- obj := a.makeTagged(T, c.cgn, nil)
- a.onlineCopyN(obj+1, results, a.sizeof(T))
- if a.addLabel(c.result, obj) { // (true)
- changed = true
- }
- }
- results += nodeid(a.sizeof(T))
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-// Common code for direct (inlined) and indirect calls to (reflect.Value).Call.
-func reflectCallImpl(a *analysis, cgn *cgnode, site *callsite, recv, arg nodeid, dotdotdot bool) nodeid {
- // Allocate []reflect.Value array for the result.
- ret := a.nextNode()
- a.addNodes(types.NewArray(a.reflectValueObj.Type(), 1), "rVCall.ret")
- a.endObject(ret, cgn, nil)
-
- // pts(targets) will be the set of possible call targets.
- site.targets = a.addOneNode(tInvalid, "rvCall.targets", nil)
-
- // All arguments are merged since they arrive in a slice.
- argelts := a.addOneNode(a.reflectValueObj.Type(), "rVCall.args", nil)
- a.load(argelts, arg, 1, 1) // slice elements
-
- a.addConstraint(&rVCallConstraint{
- cgn: cgn,
- targets: site.targets,
- v: recv,
- arg: argelts,
- result: ret + 1, // results go into elements of ret
- dotdotdot: dotdotdot,
- })
- return ret
-}
-
-func reflectCall(a *analysis, cgn *cgnode, dotdotdot bool) {
- // This is the shared contour implementation of (reflect.Value).Call
- // and CallSlice, as used by indirect calls (rare).
- // Direct calls are inlined in gen.go, eliding the
- // intermediate cgnode for Call.
- site := new(callsite)
- cgn.sites = append(cgn.sites, site)
- recv := a.funcParams(cgn.obj)
- arg := recv + 1
- ret := reflectCallImpl(a, cgn, site, recv, arg, dotdotdot)
- a.addressOf(cgn.fn.Signature.Results().At(0).Type(), a.funcResults(cgn.obj), ret)
-}
-
-func ext۰reflect۰Value۰Call(a *analysis, cgn *cgnode) {
- reflectCall(a, cgn, false)
-}
-
-func ext۰reflect۰Value۰CallSlice(a *analysis, cgn *cgnode) {
- // TODO(adonovan): implement. Also, inline direct calls in gen.go too.
- if false {
- reflectCall(a, cgn, true)
- }
-}
-
-func ext۰reflect۰Value۰Convert(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Elem() Value ----------
-
-// result = v.Elem()
-type rVElemConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVElemConstraint) ptr() nodeid { return c.v }
-func (c *rVElemConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVElem.result")
-}
-func (c *rVElemConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVElemConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Elem()", c.result, c.v)
-}
-
-func (c *rVElemConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, payload, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- switch t := tDyn.Underlying().(type) {
- case *types.Interface:
- if a.onlineCopy(c.result, payload) {
- changed = true
- }
-
- case *types.Pointer:
- obj := a.makeTagged(t.Elem(), c.cgn, nil)
- a.load(obj+1, payload, 0, a.sizeof(t.Elem()))
- if a.addLabel(c.result, obj) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Elem(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVElemConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰Value۰Field(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByIndex(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByName(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Index() Value ----------
-
-// result = v.Index()
-type rVIndexConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVIndexConstraint) ptr() nodeid { return c.v }
-func (c *rVIndexConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVIndex.result")
-}
-func (c *rVIndexConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVIndexConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Index()", c.result, c.v)
-}
-
-func (c *rVIndexConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, payload, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- var res nodeid
- switch t := tDyn.Underlying().(type) {
- case *types.Array:
- res = a.makeTagged(t.Elem(), c.cgn, nil)
- a.onlineCopyN(res+1, payload+1, a.sizeof(t.Elem()))
-
- case *types.Slice:
- res = a.makeTagged(t.Elem(), c.cgn, nil)
- a.load(res+1, payload, 1, a.sizeof(t.Elem()))
-
- case *types.Basic:
- if t.Kind() == types.String {
- res = a.makeTagged(types.Typ[types.Rune], c.cgn, nil)
- }
- }
- if res != 0 && a.addLabel(c.result, res) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Index(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVIndexConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).Interface() Value ----------
-
-// result = v.Interface()
-type rVInterfaceConstraint struct {
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVInterfaceConstraint) ptr() nodeid { return c.v }
-func (c *rVInterfaceConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVInterface.result")
-}
-func (c *rVInterfaceConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVInterfaceConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Interface()", c.result, c.v)
-}
-
-func (c *rVInterfaceConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, payload, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- if isInterface(tDyn) {
- if a.onlineCopy(c.result, payload) {
- a.addWork(c.result)
- }
- } else {
- if a.addLabel(c.result, vObj) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Interface(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVInterfaceConstraint{
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).MapIndex(Value) Value ----------
-
-// result = v.MapIndex(_)
-type rVMapIndexConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVMapIndexConstraint) ptr() nodeid { return c.v }
-func (c *rVMapIndexConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVMapIndex.result")
-}
-func (c *rVMapIndexConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVMapIndexConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.MapIndex(_)", c.result, c.v)
-}
-
-func (c *rVMapIndexConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, m, indirect := a.taggedValue(vObj)
- tMap, _ := tDyn.Underlying().(*types.Map)
- if tMap == nil {
- continue // not a map
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- obj := a.makeTagged(tMap.Elem(), c.cgn, nil)
- a.load(obj+1, m, a.sizeof(tMap.Key()), a.sizeof(tMap.Elem()))
- if a.addLabel(c.result, obj) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰MapIndex(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVMapIndexConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).MapKeys() []Value ----------
-
-// result = v.MapKeys()
-type rVMapKeysConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVMapKeysConstraint) ptr() nodeid { return c.v }
-func (c *rVMapKeysConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVMapKeys.result")
-}
-func (c *rVMapKeysConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVMapKeysConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.MapKeys()", c.result, c.v)
-}
-
-func (c *rVMapKeysConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, m, indirect := a.taggedValue(vObj)
- tMap, _ := tDyn.Underlying().(*types.Map)
- if tMap == nil {
- continue // not a map
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- kObj := a.makeTagged(tMap.Key(), c.cgn, nil)
- a.load(kObj+1, m, 0, a.sizeof(tMap.Key()))
- if a.addLabel(c.result, kObj) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰MapKeys(a *analysis, cgn *cgnode) {
- // Allocate an array for the result.
- obj := a.nextNode()
- T := types.NewSlice(a.reflectValueObj.Type())
- a.addNodes(sliceToArray(T), "reflect.MapKeys result")
- a.endObject(obj, cgn, nil)
- a.addressOf(T, a.funcResults(cgn.obj), obj)
-
- a.addConstraint(&rVMapKeysConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: obj + 1, // result is stored in array elems
- })
-}
-
-func ext۰reflect۰Value۰Method(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Value۰MethodByName(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Recv(Value) Value ----------
-
-// result, _ = v.Recv()
-type rVRecvConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVRecvConstraint) ptr() nodeid { return c.v }
-func (c *rVRecvConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVRecv.result")
-}
-func (c *rVRecvConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVRecvConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Recv()", c.result, c.v)
-}
-
-func (c *rVRecvConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, ch, indirect := a.taggedValue(vObj)
- tChan, _ := tDyn.Underlying().(*types.Chan)
- if tChan == nil {
- continue // not a channel
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tElem := tChan.Elem()
- elemObj := a.makeTagged(tElem, c.cgn, nil)
- a.load(elemObj+1, ch, 0, a.sizeof(tElem))
- if a.addLabel(c.result, elemObj) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Recv(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVRecvConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (Value).Send(Value) ----------
-
-// v.Send(x)
-type rVSendConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- x nodeid
-}
-
-func (c *rVSendConstraint) ptr() nodeid { return c.v }
-func (c *rVSendConstraint) presolve(*hvn) {}
-func (c *rVSendConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.x = mapping[c.x]
-}
-
-func (c *rVSendConstraint) String() string {
- return fmt.Sprintf("reflect n%d.Send(n%d)", c.v, c.x)
-}
-
-func (c *rVSendConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, ch, indirect := a.taggedValue(vObj)
- tChan, _ := tDyn.Underlying().(*types.Chan)
- if tChan == nil {
- continue // not a channel
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- // Extract x's payload to xtmp, then store to channel.
- tElem := tChan.Elem()
- xtmp := a.addNodes(tElem, "Send.xtmp")
- a.typeAssert(tElem, xtmp, c.x, false)
- a.store(ch, xtmp, 0, a.sizeof(tElem))
- }
-}
-
-func ext۰reflect۰Value۰Send(a *analysis, cgn *cgnode) {
- params := a.funcParams(cgn.obj)
- a.addConstraint(&rVSendConstraint{
- cgn: cgn,
- v: params,
- x: params + 1,
- })
-}
-
-func ext۰reflect۰Value۰Set(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).SetBytes(x []byte) ----------
-
-// v.SetBytes(x)
-type rVSetBytesConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- x nodeid
-}
-
-func (c *rVSetBytesConstraint) ptr() nodeid { return c.v }
-func (c *rVSetBytesConstraint) presolve(*hvn) {}
-func (c *rVSetBytesConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.x = mapping[c.x]
-}
-
-func (c *rVSetBytesConstraint) String() string {
- return fmt.Sprintf("reflect n%d.SetBytes(n%d)", c.v, c.x)
-}
-
-func (c *rVSetBytesConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, slice, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- tSlice, ok := tDyn.Underlying().(*types.Slice)
- if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) {
- if a.onlineCopy(slice, c.x) {
- a.addWork(slice)
- }
- }
- }
-}
-
-func ext۰reflect۰Value۰SetBytes(a *analysis, cgn *cgnode) {
- params := a.funcParams(cgn.obj)
- a.addConstraint(&rVSetBytesConstraint{
- cgn: cgn,
- v: params,
- x: params + 1,
- })
-}
-
-// ---------- func (Value).SetMapIndex(k Value, v Value) ----------
-
-// v.SetMapIndex(key, val)
-type rVSetMapIndexConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- key nodeid
- val nodeid
-}
-
-func (c *rVSetMapIndexConstraint) ptr() nodeid { return c.v }
-func (c *rVSetMapIndexConstraint) presolve(*hvn) {}
-func (c *rVSetMapIndexConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.key = mapping[c.key]
- c.val = mapping[c.val]
-}
-
-func (c *rVSetMapIndexConstraint) String() string {
- return fmt.Sprintf("reflect n%d.SetMapIndex(n%d, n%d)", c.v, c.key, c.val)
-}
-
-func (c *rVSetMapIndexConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, m, indirect := a.taggedValue(vObj)
- tMap, _ := tDyn.Underlying().(*types.Map)
- if tMap == nil {
- continue // not a map
- }
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- keysize := a.sizeof(tMap.Key())
-
- // Extract key's payload to keytmp, then store to map key.
- keytmp := a.addNodes(tMap.Key(), "SetMapIndex.keytmp")
- a.typeAssert(tMap.Key(), keytmp, c.key, false)
- a.store(m, keytmp, 0, keysize)
-
- // Extract val's payload to vtmp, then store to map value.
- valtmp := a.addNodes(tMap.Elem(), "SetMapIndex.valtmp")
- a.typeAssert(tMap.Elem(), valtmp, c.val, false)
- a.store(m, valtmp, keysize, a.sizeof(tMap.Elem()))
- }
-}
-
-func ext۰reflect۰Value۰SetMapIndex(a *analysis, cgn *cgnode) {
- params := a.funcParams(cgn.obj)
- a.addConstraint(&rVSetMapIndexConstraint{
- cgn: cgn,
- v: params,
- key: params + 1,
- val: params + 2,
- })
-}
-
-func ext۰reflect۰Value۰SetPointer(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Slice(v Value, i, j int) Value ----------
-
-// result = v.Slice(_, _)
-type rVSliceConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rVSliceConstraint) ptr() nodeid { return c.v }
-func (c *rVSliceConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rVSlice.result")
-}
-func (c *rVSliceConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *rVSliceConstraint) String() string {
- return fmt.Sprintf("n%d = reflect n%d.Slice(_, _)", c.result, c.v)
-}
-
-func (c *rVSliceConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, payload, indirect := a.taggedValue(vObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- var res nodeid
- switch t := tDyn.Underlying().(type) {
- case *types.Pointer:
- if tArr, ok := t.Elem().Underlying().(*types.Array); ok {
- // pointer to array
- res = a.makeTagged(types.NewSlice(tArr.Elem()), c.cgn, nil)
- if a.onlineCopy(res+1, payload) {
- a.addWork(res + 1)
- }
- }
-
- case *types.Array:
- // TODO(adonovan): implement addressable
- // arrays when we do indirect tagged objects.
-
- case *types.Slice:
- res = vObj
-
- case *types.Basic:
- if t == types.Typ[types.String] {
- res = vObj
- }
- }
-
- if res != 0 && a.addLabel(c.result, res) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Value۰Slice(a *analysis, cgn *cgnode) {
- a.addConstraint(&rVSliceConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// -------------------- Standalone reflect functions --------------------
-
-func ext۰reflect۰Append(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰AppendSlice(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Copy(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func ChanOf(ChanDir, Type) Type ----------
-
-// result = ChanOf(dir, t)
-type reflectChanOfConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
- dirs []types.ChanDir
-}
-
-func (c *reflectChanOfConstraint) ptr() nodeid { return c.t }
-func (c *reflectChanOfConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectChanOf.result")
-}
-func (c *reflectChanOfConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *reflectChanOfConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.ChanOf(n%d)", c.result, c.t)
-}
-
-func (c *reflectChanOfConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.rtypeTaggedValue(tObj)
-
- if typeTooHigh(T) {
- continue
- }
-
- for _, dir := range c.dirs {
- if a.addLabel(c.result, a.makeRtype(types.NewChan(dir, T))) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-// dirMap maps reflect.ChanDir to the set of channel types generated by ChanOf.
-var dirMap = [...][]types.ChanDir{
- 0: {types.SendOnly, types.RecvOnly, types.SendRecv}, // unknown
- reflect.RecvDir: {types.RecvOnly},
- reflect.SendDir: {types.SendOnly},
- reflect.BothDir: {types.SendRecv},
-}
-
-func ext۰reflect۰ChanOf(a *analysis, cgn *cgnode) {
- // If we have access to the callsite,
- // and the channel argument is a constant (as is usual),
- // only generate the requested direction.
- var dir reflect.ChanDir // unknown
- if site := cgn.callersite; site != nil {
- if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
- v, _ := exact.Int64Val(c.Value)
- if 0 <= v && v <= int64(reflect.BothDir) {
- dir = reflect.ChanDir(v)
- }
- }
- }
-
- params := a.funcParams(cgn.obj)
- a.addConstraint(&reflectChanOfConstraint{
- cgn: cgn,
- t: params + 1,
- result: a.funcResults(cgn.obj),
- dirs: dirMap[dir],
- })
-}
-
-// ---------- func Indirect(v Value) Value ----------
-
-// result = Indirect(v)
-type reflectIndirectConstraint struct {
- cgn *cgnode
- v nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectIndirectConstraint) ptr() nodeid { return c.v }
-func (c *reflectIndirectConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectIndirect.result")
-}
-func (c *reflectIndirectConstraint) renumber(mapping []nodeid) {
- c.v = mapping[c.v]
- c.result = mapping[c.result]
-}
-
-func (c *reflectIndirectConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.Indirect(n%d)", c.result, c.v)
-}
-
-func (c *reflectIndirectConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- vObj := nodeid(x)
- tDyn, _, _ := a.taggedValue(vObj)
- var res nodeid
- if tPtr, ok := tDyn.Underlying().(*types.Pointer); ok {
- // load the payload of the pointer's tagged object
- // into a new tagged object
- res = a.makeTagged(tPtr.Elem(), c.cgn, nil)
- a.load(res+1, vObj+1, 0, a.sizeof(tPtr.Elem()))
- } else {
- res = vObj
- }
-
- if a.addLabel(c.result, res) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Indirect(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectIndirectConstraint{
- cgn: cgn,
- v: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func MakeChan(Type) Value ----------
-
-// result = MakeChan(typ)
-type reflectMakeChanConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectMakeChanConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeChanConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectMakeChan.result")
-}
-func (c *reflectMakeChanConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectMakeChanConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.MakeChan(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeChanConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
- tChan, ok := T.Underlying().(*types.Chan)
- if !ok || tChan.Dir() != types.SendRecv {
- continue // not a bidirectional channel type
- }
-
- obj := a.nextNode()
- a.addNodes(tChan.Elem(), "reflect.MakeChan.value")
- a.endObject(obj, c.cgn, nil)
-
- // put its address in a new T-tagged object
- id := a.makeTagged(T, c.cgn, nil)
- a.addLabel(id+1, obj)
-
- // flow the T-tagged object to the result
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰MakeChan(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectMakeChanConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰MakeFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func MakeMap(Type) Value ----------
-
-// result = MakeMap(typ)
-type reflectMakeMapConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectMakeMapConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeMapConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectMakeMap.result")
-}
-func (c *reflectMakeMapConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectMakeMapConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.MakeMap(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeMapConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
- tMap, ok := T.Underlying().(*types.Map)
- if !ok {
- continue // not a map type
- }
-
- mapObj := a.nextNode()
- a.addNodes(tMap.Key(), "reflect.MakeMap.key")
- a.addNodes(tMap.Elem(), "reflect.MakeMap.value")
- a.endObject(mapObj, c.cgn, nil)
-
- // put its address in a new T-tagged object
- id := a.makeTagged(T, c.cgn, nil)
- a.addLabel(id+1, mapObj)
-
- // flow the T-tagged object to the result
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰MakeMap(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectMakeMapConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func MakeSlice(Type) Value ----------
-
-// result = MakeSlice(typ)
-type reflectMakeSliceConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectMakeSliceConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeSliceConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectMakeSlice.result")
-}
-func (c *reflectMakeSliceConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectMakeSliceConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.MakeSlice(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeSliceConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
- if _, ok := T.Underlying().(*types.Slice); !ok {
- continue // not a slice type
- }
-
- obj := a.nextNode()
- a.addNodes(sliceToArray(T), "reflect.MakeSlice")
- a.endObject(obj, c.cgn, nil)
-
- // put its address in a new T-tagged object
- id := a.makeTagged(T, c.cgn, nil)
- a.addLabel(id+1, obj)
-
- // flow the T-tagged object to the result
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰MakeSlice(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectMakeSliceConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰MapOf(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func New(Type) Value ----------
-
-// result = New(typ)
-type reflectNewConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectNewConstraint) ptr() nodeid { return c.typ }
-func (c *reflectNewConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectNew.result")
-}
-func (c *reflectNewConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectNewConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.New(n%d)", c.result, c.typ)
-}
-
-func (c *reflectNewConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
-
- // allocate new T object
- newObj := a.nextNode()
- a.addNodes(T, "reflect.New")
- a.endObject(newObj, c.cgn, nil)
-
- // put its address in a new *T-tagged object
- id := a.makeTagged(types.NewPointer(T), c.cgn, nil)
- a.addLabel(id+1, newObj)
-
- // flow the pointer to the result
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰New(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectNewConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰NewAt(a *analysis, cgn *cgnode) {
- ext۰reflect۰New(a, cgn)
-
- // TODO(adonovan): also report dynamic calls to unsound intrinsics.
- if site := cgn.callersite; site != nil {
- a.warnf(site.pos(), "unsound: %s contains a reflect.NewAt() call", site.instr.Parent())
- }
-}
-
-// ---------- func PtrTo(Type) Type ----------
-
-// result = PtrTo(t)
-type reflectPtrToConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectPtrToConstraint) ptr() nodeid { return c.t }
-func (c *reflectPtrToConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectPtrTo.result")
-}
-func (c *reflectPtrToConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *reflectPtrToConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.PtrTo(n%d)", c.result, c.t)
-}
-
-func (c *reflectPtrToConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.rtypeTaggedValue(tObj)
-
- if typeTooHigh(T) {
- continue
- }
-
- if a.addLabel(c.result, a.makeRtype(types.NewPointer(T))) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰PtrTo(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectPtrToConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰Select(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func SliceOf(Type) Type ----------
-
-// result = SliceOf(t)
-type reflectSliceOfConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectSliceOfConstraint) ptr() nodeid { return c.t }
-func (c *reflectSliceOfConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectSliceOf.result")
-}
-func (c *reflectSliceOfConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *reflectSliceOfConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.SliceOf(n%d)", c.result, c.t)
-}
-
-func (c *reflectSliceOfConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.rtypeTaggedValue(tObj)
-
- if typeTooHigh(T) {
- continue
- }
-
- if a.addLabel(c.result, a.makeRtype(types.NewSlice(T))) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰SliceOf(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectSliceOfConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func TypeOf(v Value) Type ----------
-
-// result = TypeOf(i)
-type reflectTypeOfConstraint struct {
- cgn *cgnode
- i nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectTypeOfConstraint) ptr() nodeid { return c.i }
-func (c *reflectTypeOfConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectTypeOf.result")
-}
-func (c *reflectTypeOfConstraint) renumber(mapping []nodeid) {
- c.i = mapping[c.i]
- c.result = mapping[c.result]
-}
-
-func (c *reflectTypeOfConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.TypeOf(n%d)", c.result, c.i)
-}
-
-func (c *reflectTypeOfConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- iObj := nodeid(x)
- tDyn, _, _ := a.taggedValue(iObj)
- if a.addLabel(c.result, a.makeRtype(tDyn)) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰TypeOf(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectTypeOfConstraint{
- cgn: cgn,
- i: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func ValueOf(interface{}) Value ----------
-
-func ext۰reflect۰ValueOf(a *analysis, cgn *cgnode) {
- // TODO(adonovan): when we start creating indirect tagged
- // objects, we'll need to handle them specially here since
- // they must never appear in the PTS of an interface{}.
- a.copy(a.funcResults(cgn.obj), a.funcParams(cgn.obj), 1)
-}
-
-// ---------- func Zero(Type) Value ----------
-
-// result = Zero(typ)
-type reflectZeroConstraint struct {
- cgn *cgnode
- typ nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *reflectZeroConstraint) ptr() nodeid { return c.typ }
-func (c *reflectZeroConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "reflectZero.result")
-}
-func (c *reflectZeroConstraint) renumber(mapping []nodeid) {
- c.typ = mapping[c.typ]
- c.result = mapping[c.result]
-}
-
-func (c *reflectZeroConstraint) String() string {
- return fmt.Sprintf("n%d = reflect.Zero(n%d)", c.result, c.typ)
-}
-
-func (c *reflectZeroConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- typObj := nodeid(x)
- T := a.rtypeTaggedValue(typObj)
-
- // TODO(adonovan): if T is an interface type, we need
- // to create an indirect tagged object containing
- // new(T). To avoid updates of such shared values,
- // we'll need another flag on indirect tagged objects
- // that marks whether they are addressable or
- // readonly, just like the reflect package does.
-
- // memoize using a.reflectZeros[T]
- var id nodeid
- if z := a.reflectZeros.At(T); false && z != nil {
- id = z.(nodeid)
- } else {
- id = a.makeTagged(T, c.cgn, nil)
- a.reflectZeros.Set(T, id)
- }
- if a.addLabel(c.result, id) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰Zero(a *analysis, cgn *cgnode) {
- a.addConstraint(&reflectZeroConstraint{
- cgn: cgn,
- typ: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// -------------------- (*reflect.rtype) methods --------------------
-
-// ---------- func (*rtype) Elem() Type ----------
-
-// result = Elem(t)
-type rtypeElemConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rtypeElemConstraint) ptr() nodeid { return c.t }
-func (c *rtypeElemConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rtypeElem.result")
-}
-func (c *rtypeElemConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeElemConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).Elem(n%d)", c.result, c.t)
-}
-
-func (c *rtypeElemConstraint) solve(a *analysis, delta *nodeset) {
- // Implemented by *types.{Map,Chan,Array,Slice,Pointer}.
- type hasElem interface {
- Elem() types.Type
- }
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
- if tHasElem, ok := T.Underlying().(hasElem); ok {
- if a.addLabel(c.result, a.makeRtype(tHasElem.Elem())) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰rtype۰Elem(a *analysis, cgn *cgnode) {
- a.addConstraint(&rtypeElemConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (*rtype) Field(int) StructField ----------
-// ---------- func (*rtype) FieldByName(string) (StructField, bool) ----------
-
-// result = FieldByName(t, name)
-// result = Field(t, _)
-type rtypeFieldByNameConstraint struct {
- cgn *cgnode
- name string // name of field; "" for unknown
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rtypeFieldByNameConstraint) ptr() nodeid { return c.t }
-func (c *rtypeFieldByNameConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result+3), "rtypeFieldByName.result.Type")
-}
-func (c *rtypeFieldByNameConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeFieldByNameConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).FieldByName(n%d, %q)", c.result, c.t, c.name)
-}
-
-func (c *rtypeFieldByNameConstraint) solve(a *analysis, delta *nodeset) {
- // type StructField struct {
- // 0 __identity__
- // 1 Name string
- // 2 PkgPath string
- // 3 Type Type
- // 4 Tag StructTag
- // 5 Offset uintptr
- // 6 Index []int
- // 7 Anonymous bool
- // }
-
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
- tStruct, ok := T.Underlying().(*types.Struct)
- if !ok {
- continue // not a struct type
- }
-
- n := tStruct.NumFields()
- for i := 0; i < n; i++ {
- f := tStruct.Field(i)
- if c.name == "" || c.name == f.Name() {
-
- // a.offsetOf(Type) is 3.
- if id := c.result + 3; a.addLabel(id, a.makeRtype(f.Type())) {
- a.addWork(id)
- }
- // TODO(adonovan): StructField.Index should be non-nil.
- }
- }
- }
-}
-
-func ext۰reflect۰rtype۰FieldByName(a *analysis, cgn *cgnode) {
- // If we have access to the callsite,
- // and the argument is a string constant,
- // return only that field.
- var name string
- if site := cgn.callersite; site != nil {
- if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
- name = exact.StringVal(c.Value)
- }
- }
-
- a.addConstraint(&rtypeFieldByNameConstraint{
- cgn: cgn,
- name: name,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰rtype۰Field(a *analysis, cgn *cgnode) {
- // No-one ever calls Field with a constant argument,
- // so we don't specialize that case.
- a.addConstraint(&rtypeFieldByNameConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰rtype۰FieldByIndex(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰rtype۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (*rtype) In/Out(i int) Type ----------
-
-// result = In/Out(t, i)
-type rtypeInOutConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
- out bool
- i int // -ve if not a constant
-}
-
-func (c *rtypeInOutConstraint) ptr() nodeid { return c.t }
-func (c *rtypeInOutConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rtypeInOut.result")
-}
-func (c *rtypeInOutConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeInOutConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).InOut(n%d, %d)", c.result, c.t, c.i)
-}
-
-func (c *rtypeInOutConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
- sig, ok := T.Underlying().(*types.Signature)
- if !ok {
- continue // not a func type
- }
-
- tuple := sig.Params()
- if c.out {
- tuple = sig.Results()
- }
- for i, n := 0, tuple.Len(); i < n; i++ {
- if c.i < 0 || c.i == i {
- if a.addLabel(c.result, a.makeRtype(tuple.At(i).Type())) {
- changed = true
- }
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰rtype۰InOut(a *analysis, cgn *cgnode, out bool) {
- // If we have access to the callsite,
- // and the argument is an int constant,
- // return only that parameter.
- index := -1
- if site := cgn.callersite; site != nil {
- if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
- v, _ := exact.Int64Val(c.Value)
- index = int(v)
- }
- }
- a.addConstraint(&rtypeInOutConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- out: out,
- i: index,
- })
-}
-
-func ext۰reflect۰rtype۰In(a *analysis, cgn *cgnode) {
- ext۰reflect۰rtype۰InOut(a, cgn, false)
-}
-
-func ext۰reflect۰rtype۰Out(a *analysis, cgn *cgnode) {
- ext۰reflect۰rtype۰InOut(a, cgn, true)
-}
-
-// ---------- func (*rtype) Key() Type ----------
-
-// result = Key(t)
-type rtypeKeyConstraint struct {
- cgn *cgnode
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rtypeKeyConstraint) ptr() nodeid { return c.t }
-func (c *rtypeKeyConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result), "rtypeKey.result")
-}
-func (c *rtypeKeyConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeKeyConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).Key(n%d)", c.result, c.t)
-}
-
-func (c *rtypeKeyConstraint) solve(a *analysis, delta *nodeset) {
- changed := false
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
- if tMap, ok := T.Underlying().(*types.Map); ok {
- if a.addLabel(c.result, a.makeRtype(tMap.Key())) {
- changed = true
- }
- }
- }
- if changed {
- a.addWork(c.result)
- }
-}
-
-func ext۰reflect۰rtype۰Key(a *analysis, cgn *cgnode) {
- a.addConstraint(&rtypeKeyConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// ---------- func (*rtype) Method(int) (Method, bool) ----------
-// ---------- func (*rtype) MethodByName(string) (Method, bool) ----------
-
-// result = MethodByName(t, name)
-// result = Method(t, _)
-type rtypeMethodByNameConstraint struct {
- cgn *cgnode
- name string // name of method; "" for unknown
- t nodeid // (ptr)
- result nodeid // (indirect)
-}
-
-func (c *rtypeMethodByNameConstraint) ptr() nodeid { return c.t }
-func (c *rtypeMethodByNameConstraint) presolve(h *hvn) {
- h.markIndirect(onodeid(c.result+3), "rtypeMethodByName.result.Type")
- h.markIndirect(onodeid(c.result+4), "rtypeMethodByName.result.Func")
-}
-func (c *rtypeMethodByNameConstraint) renumber(mapping []nodeid) {
- c.t = mapping[c.t]
- c.result = mapping[c.result]
-}
-
-func (c *rtypeMethodByNameConstraint) String() string {
- return fmt.Sprintf("n%d = (*reflect.rtype).MethodByName(n%d, %q)", c.result, c.t, c.name)
-}
-
-// changeRecv returns sig with Recv prepended to Params().
-func changeRecv(sig *types.Signature) *types.Signature {
- params := sig.Params()
- n := params.Len()
- p2 := make([]*types.Var, n+1)
- p2[0] = sig.Recv()
- for i := 0; i < n; i++ {
- p2[i+1] = params.At(i)
- }
- return types.NewSignature(nil, types.NewTuple(p2...), sig.Results(), sig.Variadic())
-}
-
-func (c *rtypeMethodByNameConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- tObj := nodeid(x)
- T := a.nodes[tObj].obj.data.(types.Type)
-
- isIface := isInterface(T)
-
- // We don't use Lookup(c.name) when c.name != "" to avoid
- // ambiguity: >1 unexported methods could match.
- mset := a.prog.MethodSets.MethodSet(T)
- for i, n := 0, mset.Len(); i < n; i++ {
- sel := mset.At(i)
- if c.name == "" || c.name == sel.Obj().Name() {
- // type Method struct {
- // 0 __identity__
- // 1 Name string
- // 2 PkgPath string
- // 3 Type Type
- // 4 Func Value
- // 5 Index int
- // }
-
- var sig *types.Signature
- var fn *ssa.Function
- if isIface {
- sig = sel.Type().(*types.Signature)
- } else {
- fn = a.prog.MethodValue(sel)
- // move receiver to params[0]
- sig = changeRecv(fn.Signature)
- }
-
- // a.offsetOf(Type) is 3.
- if id := c.result + 3; a.addLabel(id, a.makeRtype(sig)) {
- a.addWork(id)
- }
- if fn != nil {
- // a.offsetOf(Func) is 4.
- if id := c.result + 4; a.addLabel(id, a.objectNode(nil, fn)) {
- a.addWork(id)
- }
- }
- }
- }
- }
-}
-
-func ext۰reflect۰rtype۰MethodByName(a *analysis, cgn *cgnode) {
- // If we have access to the callsite,
- // and the argument is a string constant,
- // return only that method.
- var name string
- if site := cgn.callersite; site != nil {
- if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
- name = exact.StringVal(c.Value)
- }
- }
-
- a.addConstraint(&rtypeMethodByNameConstraint{
- cgn: cgn,
- name: name,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-func ext۰reflect۰rtype۰Method(a *analysis, cgn *cgnode) {
- // No-one ever calls Method with a constant argument,
- // so we don't specialize that case.
- a.addConstraint(&rtypeMethodByNameConstraint{
- cgn: cgn,
- t: a.funcParams(cgn.obj),
- result: a.funcResults(cgn.obj),
- })
-}
-
-// typeHeight returns the "height" of the type, which is roughly
-// speaking the number of chan, map, pointer and slice type constructors
-// at the root of T; these are the four type kinds that can be created
-// via reflection. Chan and map constructors are counted as double the
-// height of slice and pointer constructors since they are less often
-// deeply nested.
-//
-// The solver rules for type constructors must somehow bound the set of
-// types they create to ensure termination of the algorithm in cases
-// where the output of a type constructor flows to its input, e.g.
-//
-// func f(t reflect.Type) {
-// f(reflect.PtrTo(t))
-// }
-//
-// It does this by limiting the type height to k, but this still leaves
-// a potentially exponential (4^k) number of of types that may be
-// enumerated in pathological cases.
-//
-func typeHeight(T types.Type) int {
- switch T := T.(type) {
- case *types.Chan:
- return 2 + typeHeight(T.Elem())
- case *types.Map:
- k := typeHeight(T.Key())
- v := typeHeight(T.Elem())
- if v > k {
- k = v // max(k, v)
- }
- return 2 + k
- case *types.Slice:
- return 1 + typeHeight(T.Elem())
- case *types.Pointer:
- return 1 + typeHeight(T.Elem())
- }
- return 0
-}
-
-func typeTooHigh(T types.Type) bool {
- return typeHeight(T) > 3
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/solve.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/solve.go
deleted file mode 100644
index 0fdd098b0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/solve.go
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines a naive Andersen-style solver for the inclusion
-// constraint system.
-
-import (
- "fmt"
- "go/types"
-)
-
-type solverState struct {
- complex []constraint // complex constraints attached to this node
- copyTo nodeset // simple copy constraint edges
- pts nodeset // points-to set of this node
- prevPTS nodeset // pts(n) in previous iteration (for difference propagation)
-}
-
-func (a *analysis) solve() {
- start("Solving")
- if a.log != nil {
- fmt.Fprintf(a.log, "\n\n==== Solving constraints\n\n")
- }
-
- // Solver main loop.
- var delta nodeset
- for {
- // Add new constraints to the graph:
- // static constraints from SSA on round 1,
- // dynamic constraints from reflection thereafter.
- a.processNewConstraints()
-
- var x int
- if !a.work.TakeMin(&x) {
- break // empty
- }
- id := nodeid(x)
- if a.log != nil {
- fmt.Fprintf(a.log, "\tnode n%d\n", id)
- }
-
- n := a.nodes[id]
-
- // Difference propagation.
- delta.Difference(&n.solve.pts.Sparse, &n.solve.prevPTS.Sparse)
- if delta.IsEmpty() {
- continue
- }
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\tpts(n%d : %s) = %s + %s\n",
- id, n.typ, &delta, &n.solve.prevPTS)
- }
- n.solve.prevPTS.Copy(&n.solve.pts.Sparse)
-
- // Apply all resolution rules attached to n.
- a.solveConstraints(n, &delta)
-
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\tpts(n%d) = %s\n", id, &n.solve.pts)
- }
- }
-
- if !a.nodes[0].solve.pts.IsEmpty() {
- panic(fmt.Sprintf("pts(0) is nonempty: %s", &a.nodes[0].solve.pts))
- }
-
- // Release working state (but keep final PTS).
- for _, n := range a.nodes {
- n.solve.complex = nil
- n.solve.copyTo.Clear()
- n.solve.prevPTS.Clear()
- }
-
- if a.log != nil {
- fmt.Fprintf(a.log, "Solver done\n")
-
- // Dump solution.
- for i, n := range a.nodes {
- if !n.solve.pts.IsEmpty() {
- fmt.Fprintf(a.log, "pts(n%d) = %s : %s\n", i, &n.solve.pts, n.typ)
- }
- }
- }
- stop("Solving")
-}
-
-// processNewConstraints takes the new constraints from a.constraints
-// and adds them to the graph, ensuring
-// that new constraints are applied to pre-existing labels and
-// that pre-existing constraints are applied to new labels.
-//
-func (a *analysis) processNewConstraints() {
- // Take the slice of new constraints.
- // (May grow during call to solveConstraints.)
- constraints := a.constraints
- a.constraints = nil
-
- // Initialize points-to sets from addr-of (base) constraints.
- for _, c := range constraints {
- if c, ok := c.(*addrConstraint); ok {
- dst := a.nodes[c.dst]
- dst.solve.pts.add(c.src)
-
- // Populate the worklist with nodes that point to
- // something initially (due to addrConstraints) and
- // have other constraints attached.
- // (A no-op in round 1.)
- if !dst.solve.copyTo.IsEmpty() || len(dst.solve.complex) > 0 {
- a.addWork(c.dst)
- }
- }
- }
-
- // Attach simple (copy) and complex constraints to nodes.
- var stale nodeset
- for _, c := range constraints {
- var id nodeid
- switch c := c.(type) {
- case *addrConstraint:
- // base constraints handled in previous loop
- continue
- case *copyConstraint:
- // simple (copy) constraint
- id = c.src
- a.nodes[id].solve.copyTo.add(c.dst)
- default:
- // complex constraint
- id = c.ptr()
- solve := a.nodes[id].solve
- solve.complex = append(solve.complex, c)
- }
-
- if n := a.nodes[id]; !n.solve.pts.IsEmpty() {
- if !n.solve.prevPTS.IsEmpty() {
- stale.add(id)
- }
- a.addWork(id)
- }
- }
- // Apply new constraints to pre-existing PTS labels.
- var space [50]int
- for _, id := range stale.AppendTo(space[:0]) {
- n := a.nodes[nodeid(id)]
- a.solveConstraints(n, &n.solve.prevPTS)
- }
-}
-
-// solveConstraints applies each resolution rule attached to node n to
-// the set of labels delta. It may generate new constraints in
-// a.constraints.
-//
-func (a *analysis) solveConstraints(n *node, delta *nodeset) {
- if delta.IsEmpty() {
- return
- }
-
- // Process complex constraints dependent on n.
- for _, c := range n.solve.complex {
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\tconstraint %s\n", c)
- }
- c.solve(a, delta)
- }
-
- // Process copy constraints.
- var copySeen nodeset
- for _, x := range n.solve.copyTo.AppendTo(a.deltaSpace) {
- mid := nodeid(x)
- if copySeen.add(mid) {
- if a.nodes[mid].solve.pts.addAll(delta) {
- a.addWork(mid)
- }
- }
- }
-}
-
-// addLabel adds label to the points-to set of ptr and reports whether the set grew.
-func (a *analysis) addLabel(ptr, label nodeid) bool {
- b := a.nodes[ptr].solve.pts.add(label)
- if b && a.log != nil {
- fmt.Fprintf(a.log, "\t\tpts(n%d) += n%d\n", ptr, label)
- }
- return b
-}
-
-func (a *analysis) addWork(id nodeid) {
- a.work.Insert(int(id))
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\twork: n%d\n", id)
- }
-}
-
-// onlineCopy adds a copy edge. It is called online, i.e. during
-// solving, so it adds edges and pts members directly rather than by
-// instantiating a 'constraint'.
-//
-// The size of the copy is implicitly 1.
-// It returns true if pts(dst) changed.
-//
-func (a *analysis) onlineCopy(dst, src nodeid) bool {
- if dst != src {
- if nsrc := a.nodes[src]; nsrc.solve.copyTo.add(dst) {
- if a.log != nil {
- fmt.Fprintf(a.log, "\t\t\tdynamic copy n%d <- n%d\n", dst, src)
- }
- // TODO(adonovan): most calls to onlineCopy
- // are followed by addWork, possibly batched
- // via a 'changed' flag; see if there's a
- // noticeable penalty to calling addWork here.
- return a.nodes[dst].solve.pts.addAll(&nsrc.solve.pts)
- }
- }
- return false
-}
-
-// Returns sizeof.
-// Implicitly adds nodes to worklist.
-//
-// TODO(adonovan): now that we support a.copy() during solving, we
-// could eliminate onlineCopyN, but it's much slower. Investigate.
-//
-func (a *analysis) onlineCopyN(dst, src nodeid, sizeof uint32) uint32 {
- for i := uint32(0); i < sizeof; i++ {
- if a.onlineCopy(dst, src) {
- a.addWork(dst)
- }
- src++
- dst++
- }
- return sizeof
-}
-
-func (c *loadConstraint) solve(a *analysis, delta *nodeset) {
- var changed bool
- for _, x := range delta.AppendTo(a.deltaSpace) {
- k := nodeid(x)
- koff := k + nodeid(c.offset)
- if a.onlineCopy(c.dst, koff) {
- changed = true
- }
- }
- if changed {
- a.addWork(c.dst)
- }
-}
-
-func (c *storeConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- k := nodeid(x)
- koff := k + nodeid(c.offset)
- if a.onlineCopy(koff, c.src) {
- a.addWork(koff)
- }
- }
-}
-
-func (c *offsetAddrConstraint) solve(a *analysis, delta *nodeset) {
- dst := a.nodes[c.dst]
- for _, x := range delta.AppendTo(a.deltaSpace) {
- k := nodeid(x)
- if dst.solve.pts.add(k + nodeid(c.offset)) {
- a.addWork(c.dst)
- }
- }
-}
-
-func (c *typeFilterConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- ifaceObj := nodeid(x)
- tDyn, _, indirect := a.taggedValue(ifaceObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- if types.AssignableTo(tDyn, c.typ) {
- if a.addLabel(c.dst, ifaceObj) {
- a.addWork(c.dst)
- }
- }
- }
-}
-
-func (c *untagConstraint) solve(a *analysis, delta *nodeset) {
- predicate := types.AssignableTo
- if c.exact {
- predicate = types.Identical
- }
- for _, x := range delta.AppendTo(a.deltaSpace) {
- ifaceObj := nodeid(x)
- tDyn, v, indirect := a.taggedValue(ifaceObj)
- if indirect {
- // TODO(adonovan): we'll need to implement this
- // when we start creating indirect tagged objects.
- panic("indirect tagged object")
- }
-
- if predicate(tDyn, c.typ) {
- // Copy payload sans tag to dst.
- //
- // TODO(adonovan): opt: if tDyn is
- // nonpointerlike we can skip this entire
- // constraint, perhaps. We only care about
- // pointers among the fields.
- a.onlineCopyN(c.dst, v, a.sizeof(tDyn))
- }
- }
-}
-
-func (c *invokeConstraint) solve(a *analysis, delta *nodeset) {
- for _, x := range delta.AppendTo(a.deltaSpace) {
- ifaceObj := nodeid(x)
- tDyn, v, indirect := a.taggedValue(ifaceObj)
- if indirect {
- // TODO(adonovan): we may need to implement this if
- // we ever apply invokeConstraints to reflect.Value PTSs,
- // e.g. for (reflect.Value).Call.
- panic("indirect tagged object")
- }
-
- // Look up the concrete method.
- fn := a.prog.LookupMethod(tDyn, c.method.Pkg(), c.method.Name())
- if fn == nil {
- panic(fmt.Sprintf("n%d: no ssa.Function for %s", c.iface, c.method))
- }
- sig := fn.Signature
-
- fnObj := a.globalobj[fn] // dynamic calls use shared contour
- if fnObj == 0 {
- // a.objectNode(fn) was not called during gen phase.
- panic(fmt.Sprintf("a.globalobj[%s]==nil", fn))
- }
-
- // Make callsite's fn variable point to identity of
- // concrete method. (There's no need to add it to
- // worklist since it never has attached constraints.)
- a.addLabel(c.params, fnObj)
-
- // Extract value and connect to method's receiver.
- // Copy payload to method's receiver param (arg0).
- arg0 := a.funcParams(fnObj)
- recvSize := a.sizeof(sig.Recv().Type())
- a.onlineCopyN(arg0, v, recvSize)
-
- src := c.params + 1 // skip past identity
- dst := arg0 + nodeid(recvSize)
-
- // Copy caller's argument block to method formal parameters.
- paramsSize := a.sizeof(sig.Params())
- a.onlineCopyN(dst, src, paramsSize)
- src += nodeid(paramsSize)
- dst += nodeid(paramsSize)
-
- // Copy method results to caller's result block.
- resultsSize := a.sizeof(sig.Results())
- a.onlineCopyN(src, dst, resultsSize)
- }
-}
-
-func (c *addrConstraint) solve(a *analysis, delta *nodeset) {
- panic("addr is not a complex constraint")
-}
-
-func (c *copyConstraint) solve(a *analysis, delta *nodeset) {
- panic("copy is not a complex constraint")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/util.go
deleted file mode 100644
index 683fddddc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/pointer/util.go
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "log"
- "os"
- "os/exec"
- "runtime"
- "time"
-
- "golang.org/x/tools/container/intsets"
-)
-
-// CanPoint reports whether the type T is pointerlike,
-// for the purposes of this analysis.
-func CanPoint(T types.Type) bool {
- switch T := T.(type) {
- case *types.Named:
- if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" {
- return true // treat reflect.Value like interface{}
- }
- return CanPoint(T.Underlying())
- case *types.Pointer, *types.Interface, *types.Map, *types.Chan, *types.Signature, *types.Slice:
- return true
- }
-
- return false // array struct tuple builtin basic
-}
-
-// CanHaveDynamicTypes reports whether the type T can "hold" dynamic types,
-// i.e. is an interface (incl. reflect.Type) or a reflect.Value.
-//
-func CanHaveDynamicTypes(T types.Type) bool {
- switch T := T.(type) {
- case *types.Named:
- if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" {
- return true // reflect.Value
- }
- return CanHaveDynamicTypes(T.Underlying())
- case *types.Interface:
- return true
- }
- return false
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-// mustDeref returns the element type of its argument, which must be a
-// pointer; panic ensues otherwise.
-func mustDeref(typ types.Type) types.Type {
- return typ.Underlying().(*types.Pointer).Elem()
-}
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-// A fieldInfo describes one subelement (node) of the flattening-out
-// of a type T: the subelement's type and its path from the root of T.
-//
-// For example, for this type:
-// type line struct{ points []struct{x, y int} }
-// flatten() of the inner struct yields the following []fieldInfo:
-// struct{ x, y int } ""
-// int ".x"
-// int ".y"
-// and flatten(line) yields:
-// struct{ points []struct{x, y int} } ""
-// struct{ x, y int } ".points[*]"
-// int ".points[*].x
-// int ".points[*].y"
-//
-type fieldInfo struct {
- typ types.Type
-
- // op and tail describe the path to the element (e.g. ".a#2.b[*].c").
- op interface{} // *Array: true; *Tuple: int; *Struct: *types.Var; *Named: nil
- tail *fieldInfo
-}
-
-// path returns a user-friendly string describing the subelement path.
-//
-func (fi *fieldInfo) path() string {
- var buf bytes.Buffer
- for p := fi; p != nil; p = p.tail {
- switch op := p.op.(type) {
- case bool:
- fmt.Fprintf(&buf, "[*]")
- case int:
- fmt.Fprintf(&buf, "#%d", op)
- case *types.Var:
- fmt.Fprintf(&buf, ".%s", op.Name())
- }
- }
- return buf.String()
-}
-
-// flatten returns a list of directly contained fields in the preorder
-// traversal of the type tree of t. The resulting elements are all
-// scalars (basic types or pointerlike types), except for struct/array
-// "identity" nodes, whose type is that of the aggregate.
-//
-// reflect.Value is considered pointerlike, similar to interface{}.
-//
-// Callers must not mutate the result.
-//
-func (a *analysis) flatten(t types.Type) []*fieldInfo {
- fl, ok := a.flattenMemo[t]
- if !ok {
- switch t := t.(type) {
- case *types.Named:
- u := t.Underlying()
- if isInterface(u) {
- // Debuggability hack: don't remove
- // the named type from interfaces as
- // they're very verbose.
- fl = append(fl, &fieldInfo{typ: t})
- } else {
- fl = a.flatten(u)
- }
-
- case *types.Basic,
- *types.Signature,
- *types.Chan,
- *types.Map,
- *types.Interface,
- *types.Slice,
- *types.Pointer:
- fl = append(fl, &fieldInfo{typ: t})
-
- case *types.Array:
- fl = append(fl, &fieldInfo{typ: t}) // identity node
- for _, fi := range a.flatten(t.Elem()) {
- fl = append(fl, &fieldInfo{typ: fi.typ, op: true, tail: fi})
- }
-
- case *types.Struct:
- fl = append(fl, &fieldInfo{typ: t}) // identity node
- for i, n := 0, t.NumFields(); i < n; i++ {
- f := t.Field(i)
- for _, fi := range a.flatten(f.Type()) {
- fl = append(fl, &fieldInfo{typ: fi.typ, op: f, tail: fi})
- }
- }
-
- case *types.Tuple:
- // No identity node: tuples are never address-taken.
- n := t.Len()
- if n == 1 {
- // Don't add a fieldInfo link for singletons,
- // e.g. in params/results.
- fl = append(fl, a.flatten(t.At(0).Type())...)
- } else {
- for i := 0; i < n; i++ {
- f := t.At(i)
- for _, fi := range a.flatten(f.Type()) {
- fl = append(fl, &fieldInfo{typ: fi.typ, op: i, tail: fi})
- }
- }
- }
-
- default:
- panic(fmt.Sprintf("cannot flatten unsupported type %T", t))
- }
-
- a.flattenMemo[t] = fl
- }
-
- return fl
-}
-
-// sizeof returns the number of pointerlike abstractions (nodes) in the type t.
-func (a *analysis) sizeof(t types.Type) uint32 {
- return uint32(len(a.flatten(t)))
-}
-
-// shouldTrack reports whether object type T contains (recursively)
-// any fields whose addresses should be tracked.
-func (a *analysis) shouldTrack(T types.Type) bool {
- if a.track == trackAll {
- return true // fast path
- }
- track, ok := a.trackTypes[T]
- if !ok {
- a.trackTypes[T] = true // break cycles conservatively
- // NB: reflect.Value, reflect.Type are pre-populated to true.
- for _, fi := range a.flatten(T) {
- switch ft := fi.typ.Underlying().(type) {
- case *types.Interface, *types.Signature:
- track = true // needed for callgraph
- case *types.Basic:
- // no-op
- case *types.Chan:
- track = a.track&trackChan != 0 || a.shouldTrack(ft.Elem())
- case *types.Map:
- track = a.track&trackMap != 0 || a.shouldTrack(ft.Key()) || a.shouldTrack(ft.Elem())
- case *types.Slice:
- track = a.track&trackSlice != 0 || a.shouldTrack(ft.Elem())
- case *types.Pointer:
- track = a.track&trackPtr != 0 || a.shouldTrack(ft.Elem())
- case *types.Array, *types.Struct:
- // No need to look at field types since they will follow (flattened).
- default:
- // Includes *types.Tuple, which are never address-taken.
- panic(ft)
- }
- if track {
- break
- }
- }
- a.trackTypes[T] = track
- if !track && a.log != nil {
- fmt.Fprintf(a.log, "\ttype not tracked: %s\n", T)
- }
- }
- return track
-}
-
-// offsetOf returns the (abstract) offset of field index within struct
-// or tuple typ.
-func (a *analysis) offsetOf(typ types.Type, index int) uint32 {
- var offset uint32
- switch t := typ.Underlying().(type) {
- case *types.Tuple:
- for i := 0; i < index; i++ {
- offset += a.sizeof(t.At(i).Type())
- }
- case *types.Struct:
- offset++ // the node for the struct itself
- for i := 0; i < index; i++ {
- offset += a.sizeof(t.Field(i).Type())
- }
- default:
- panic(fmt.Sprintf("offsetOf(%s : %T)", typ, typ))
- }
- return offset
-}
-
-// sliceToArray returns the type representing the arrays to which
-// slice type slice points.
-func sliceToArray(slice types.Type) *types.Array {
- return types.NewArray(slice.Underlying().(*types.Slice).Elem(), 1)
-}
-
-// Node set -------------------------------------------------------------------
-
-type nodeset struct {
- intsets.Sparse
-}
-
-func (ns *nodeset) String() string {
- var buf bytes.Buffer
- buf.WriteRune('{')
- var space [50]int
- for i, n := range ns.AppendTo(space[:0]) {
- if i > 0 {
- buf.WriteString(", ")
- }
- buf.WriteRune('n')
- fmt.Fprintf(&buf, "%d", n)
- }
- buf.WriteRune('}')
- return buf.String()
-}
-
-func (ns *nodeset) add(n nodeid) bool {
- return ns.Sparse.Insert(int(n))
-}
-
-func (x *nodeset) addAll(y *nodeset) bool {
- return x.UnionWith(&y.Sparse)
-}
-
-// Profiling & debugging -------------------------------------------------------
-
-var timers = make(map[string]time.Time)
-
-func start(name string) {
- if debugTimers {
- timers[name] = time.Now()
- log.Printf("%s...\n", name)
- }
-}
-
-func stop(name string) {
- if debugTimers {
- log.Printf("%s took %s\n", name, time.Since(timers[name]))
- }
-}
-
-// diff runs the command "diff a b" and reports its success.
-func diff(a, b string) bool {
- var cmd *exec.Cmd
- switch runtime.GOOS {
- case "plan9":
- cmd = exec.Command("/bin/diff", "-c", a, b)
- default:
- cmd = exec.Command("/usr/bin/diff", "-u", a, b)
- }
- cmd.Stdout = os.Stderr
- cmd.Stderr = os.Stderr
- return cmd.Run() == nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/blockopt.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/blockopt.go
deleted file mode 100644
index e79260a21..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/blockopt.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// Simple block optimizations to simplify the control flow graph.
-
-// TODO(adonovan): opt: instead of creating several "unreachable" blocks
-// per function in the Builder, reuse a single one (e.g. at Blocks[1])
-// to reduce garbage.
-
-import (
- "fmt"
- "os"
-)
-
-// If true, perform sanity checking and show progress at each
-// successive iteration of optimizeBlocks. Very verbose.
-const debugBlockOpt = false
-
-// markReachable sets Index=-1 for all blocks reachable from b.
-func markReachable(b *BasicBlock) {
- b.Index = -1
- for _, succ := range b.Succs {
- if succ.Index == 0 {
- markReachable(succ)
- }
- }
-}
-
-// deleteUnreachableBlocks marks all reachable blocks of f and
-// eliminates (nils) all others, including possibly cyclic subgraphs.
-//
-func deleteUnreachableBlocks(f *Function) {
- const white, black = 0, -1
- // We borrow b.Index temporarily as the mark bit.
- for _, b := range f.Blocks {
- b.Index = white
- }
- markReachable(f.Blocks[0])
- if f.Recover != nil {
- markReachable(f.Recover)
- }
- for i, b := range f.Blocks {
- if b.Index == white {
- for _, c := range b.Succs {
- if c.Index == black {
- c.removePred(b) // delete white->black edge
- }
- }
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "unreachable", b)
- }
- f.Blocks[i] = nil // delete b
- }
- }
- f.removeNilBlocks()
-}
-
-// jumpThreading attempts to apply simple jump-threading to block b,
-// in which a->b->c become a->c if b is just a Jump.
-// The result is true if the optimization was applied.
-//
-func jumpThreading(f *Function, b *BasicBlock) bool {
- if b.Index == 0 {
- return false // don't apply to entry block
- }
- if b.Instrs == nil {
- return false
- }
- if _, ok := b.Instrs[0].(*Jump); !ok {
- return false // not just a jump
- }
- c := b.Succs[0]
- if c == b {
- return false // don't apply to degenerate jump-to-self.
- }
- if c.hasPhi() {
- return false // not sound without more effort
- }
- for j, a := range b.Preds {
- a.replaceSucc(b, c)
-
- // If a now has two edges to c, replace its degenerate If by Jump.
- if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c {
- jump := new(Jump)
- jump.setBlock(a)
- a.Instrs[len(a.Instrs)-1] = jump
- a.Succs = a.Succs[:1]
- c.removePred(b)
- } else {
- if j == 0 {
- c.replacePred(b, a)
- } else {
- c.Preds = append(c.Preds, a)
- }
- }
-
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c)
- }
- }
- f.Blocks[b.Index] = nil // delete b
- return true
-}
-
-// fuseBlocks attempts to apply the block fusion optimization to block
-// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1.
-// The result is true if the optimization was applied.
-//
-func fuseBlocks(f *Function, a *BasicBlock) bool {
- if len(a.Succs) != 1 {
- return false
- }
- b := a.Succs[0]
- if len(b.Preds) != 1 {
- return false
- }
-
- // Degenerate &&/|| ops may result in a straight-line CFG
- // containing φ-nodes. (Ideally we'd replace such them with
- // their sole operand but that requires Referrers, built later.)
- if b.hasPhi() {
- return false // not sound without further effort
- }
-
- // Eliminate jump at end of A, then copy all of B across.
- a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...)
- for _, instr := range b.Instrs {
- instr.setBlock(a)
- }
-
- // A inherits B's successors
- a.Succs = append(a.succs2[:0], b.Succs...)
-
- // Fix up Preds links of all successors of B.
- for _, c := range b.Succs {
- c.replacePred(b, a)
- }
-
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "fuseBlocks", a, b)
- }
-
- f.Blocks[b.Index] = nil // delete b
- return true
-}
-
-// optimizeBlocks() performs some simple block optimizations on a
-// completed function: dead block elimination, block fusion, jump
-// threading.
-//
-func optimizeBlocks(f *Function) {
- deleteUnreachableBlocks(f)
-
- // Loop until no further progress.
- changed := true
- for changed {
- changed = false
-
- if debugBlockOpt {
- f.WriteTo(os.Stderr)
- mustSanityCheck(f, nil)
- }
-
- for _, b := range f.Blocks {
- // f.Blocks will temporarily contain nils to indicate
- // deleted blocks; we remove them at the end.
- if b == nil {
- continue
- }
-
- // Fuse blocks. b->c becomes bc.
- if fuseBlocks(f, b) {
- changed = true
- }
-
- // a->b->c becomes a->c if b contains only a Jump.
- if jumpThreading(f, b) {
- changed = true
- continue // (b was disconnected)
- }
- }
- }
- f.removeNilBlocks()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/builder.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/builder.go
deleted file mode 100644
index 9390c398f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/builder.go
+++ /dev/null
@@ -1,2379 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the BUILD phase of SSA construction.
-//
-// SSA construction has two phases, CREATE and BUILD. In the CREATE phase
-// (create.go), all packages are constructed and type-checked and
-// definitions of all package members are created, method-sets are
-// computed, and wrapper methods are synthesized.
-// ssa.Packages are created in arbitrary order.
-//
-// In the BUILD phase (builder.go), the builder traverses the AST of
-// each Go source function and generates SSA instructions for the
-// function body. Initializer expressions for package-level variables
-// are emitted to the package's init() function in the order specified
-// by go/types.Info.InitOrder, then code for each function in the
-// package is generated in lexical order.
-// The BUILD phases for distinct packages are independent and are
-// executed in parallel.
-//
-// TODO(adonovan): indeed, building functions is now embarrassingly parallel.
-// Audit for concurrency then benchmark using more goroutines.
-//
-// The builder's and Program's indices (maps) are populated and
-// mutated during the CREATE phase, but during the BUILD phase they
-// remain constant. The sole exception is Prog.methodSets and its
-// related maps, which are protected by a dedicated mutex.
-
-import (
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "os"
- "sync"
-)
-
-type opaqueType struct {
- types.Type
- name string
-}
-
-func (t *opaqueType) String() string { return t.name }
-
-var (
- varOk = newVar("ok", tBool)
- varIndex = newVar("index", tInt)
-
- // Type constants.
- tBool = types.Typ[types.Bool]
- tByte = types.Typ[types.Byte]
- tInt = types.Typ[types.Int]
- tInvalid = types.Typ[types.Invalid]
- tString = types.Typ[types.String]
- tUntypedNil = types.Typ[types.UntypedNil]
- tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators
- tEface = new(types.Interface)
-
- // SSA Value constants.
- vZero = intConst(0)
- vOne = intConst(1)
- vTrue = NewConst(exact.MakeBool(true), tBool)
-)
-
-// builder holds state associated with the package currently being built.
-// Its methods contain all the logic for AST-to-SSA conversion.
-type builder struct{}
-
-// cond emits to fn code to evaluate boolean condition e and jump
-// to t or f depending on its value, performing various simplifications.
-//
-// Postcondition: fn.currentBlock is nil.
-//
-func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) {
- switch e := e.(type) {
- case *ast.ParenExpr:
- b.cond(fn, e.X, t, f)
- return
-
- case *ast.BinaryExpr:
- switch e.Op {
- case token.LAND:
- ltrue := fn.newBasicBlock("cond.true")
- b.cond(fn, e.X, ltrue, f)
- fn.currentBlock = ltrue
- b.cond(fn, e.Y, t, f)
- return
-
- case token.LOR:
- lfalse := fn.newBasicBlock("cond.false")
- b.cond(fn, e.X, t, lfalse)
- fn.currentBlock = lfalse
- b.cond(fn, e.Y, t, f)
- return
- }
-
- case *ast.UnaryExpr:
- if e.Op == token.NOT {
- b.cond(fn, e.X, f, t)
- return
- }
- }
-
- // A traditional compiler would simplify "if false" (etc) here
- // but we do not, for better fidelity to the source code.
- //
- // The value of a constant condition may be platform-specific,
- // and may cause blocks that are reachable in some configuration
- // to be hidden from subsequent analyses such as bug-finding tools.
- emitIf(fn, b.expr(fn, e), t, f)
-}
-
-// logicalBinop emits code to fn to evaluate e, a &&- or
-// ||-expression whose reified boolean value is wanted.
-// The value is returned.
-//
-func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value {
- rhs := fn.newBasicBlock("binop.rhs")
- done := fn.newBasicBlock("binop.done")
-
- // T(e) = T(e.X) = T(e.Y) after untyped constants have been
- // eliminated.
- // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool.
- t := fn.Pkg.typeOf(e)
-
- var short Value // value of the short-circuit path
- switch e.Op {
- case token.LAND:
- b.cond(fn, e.X, rhs, done)
- short = NewConst(exact.MakeBool(false), t)
-
- case token.LOR:
- b.cond(fn, e.X, done, rhs)
- short = NewConst(exact.MakeBool(true), t)
- }
-
- // Is rhs unreachable?
- if rhs.Preds == nil {
- // Simplify false&&y to false, true||y to true.
- fn.currentBlock = done
- return short
- }
-
- // Is done unreachable?
- if done.Preds == nil {
- // Simplify true&&y (or false||y) to y.
- fn.currentBlock = rhs
- return b.expr(fn, e.Y)
- }
-
- // All edges from e.X to done carry the short-circuit value.
- var edges []Value
- for range done.Preds {
- edges = append(edges, short)
- }
-
- // The edge from e.Y to done carries the value of e.Y.
- fn.currentBlock = rhs
- edges = append(edges, b.expr(fn, e.Y))
- emitJump(fn, done)
- fn.currentBlock = done
-
- phi := &Phi{Edges: edges, Comment: e.Op.String()}
- phi.pos = e.OpPos
- phi.typ = t
- return done.emit(phi)
-}
-
-// exprN lowers a multi-result expression e to SSA form, emitting code
-// to fn and returning a single Value whose type is a *types.Tuple.
-// The caller must access the components via Extract.
-//
-// Multi-result expressions include CallExprs in a multi-value
-// assignment or return statement, and "value,ok" uses of
-// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op
-// is token.ARROW).
-//
-func (b *builder) exprN(fn *Function, e ast.Expr) Value {
- typ := fn.Pkg.typeOf(e).(*types.Tuple)
- switch e := e.(type) {
- case *ast.ParenExpr:
- return b.exprN(fn, e.X)
-
- case *ast.CallExpr:
- // Currently, no built-in function nor type conversion
- // has multiple results, so we can avoid some of the
- // cases for single-valued CallExpr.
- var c Call
- b.setCall(fn, e, &c.Call)
- c.typ = typ
- return fn.emit(&c)
-
- case *ast.IndexExpr:
- mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
- lookup := &Lookup{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
- CommaOk: true,
- }
- lookup.setType(typ)
- lookup.setPos(e.Lbrack)
- return fn.emit(lookup)
-
- case *ast.TypeAssertExpr:
- return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen)
-
- case *ast.UnaryExpr: // must be receive <-
- unop := &UnOp{
- Op: token.ARROW,
- X: b.expr(fn, e.X),
- CommaOk: true,
- }
- unop.setType(typ)
- unop.setPos(e.OpPos)
- return fn.emit(unop)
- }
- panic(fmt.Sprintf("exprN(%T) in %s", e, fn))
-}
-
-// builtin emits to fn SSA instructions to implement a call to the
-// built-in function obj with the specified arguments
-// and return type. It returns the value defined by the result.
-//
-// The result is nil if no special handling was required; in this case
-// the caller should treat this like an ordinary library function
-// call.
-//
-func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value {
- switch obj.Name() {
- case "make":
- switch typ.Underlying().(type) {
- case *types.Slice:
- n := b.expr(fn, args[1])
- m := n
- if len(args) == 3 {
- m = b.expr(fn, args[2])
- }
- if m, ok := m.(*Const); ok {
- // treat make([]T, n, m) as new([m]T)[:n]
- cap := m.Int64()
- at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap)
- alloc := emitNew(fn, at, pos)
- alloc.Comment = "makeslice"
- v := &Slice{
- X: alloc,
- High: n,
- }
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
- }
- v := &MakeSlice{
- Len: n,
- Cap: m,
- }
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
-
- case *types.Map:
- var res Value
- if len(args) == 2 {
- res = b.expr(fn, args[1])
- }
- v := &MakeMap{Reserve: res}
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
-
- case *types.Chan:
- var sz Value = vZero
- if len(args) == 2 {
- sz = b.expr(fn, args[1])
- }
- v := &MakeChan{Size: sz}
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
- }
-
- case "new":
- alloc := emitNew(fn, deref(typ), pos)
- alloc.Comment = "new"
- return alloc
-
- case "len", "cap":
- // Special case: len or cap of an array or *array is
- // based on the type, not the value which may be nil.
- // We must still evaluate the value, though. (If it
- // was side-effect free, the whole call would have
- // been constant-folded.)
- t := deref(fn.Pkg.typeOf(args[0])).Underlying()
- if at, ok := t.(*types.Array); ok {
- b.expr(fn, args[0]) // for effects only
- return intConst(at.Len())
- }
- // Otherwise treat as normal.
-
- case "panic":
- fn.emit(&Panic{
- X: emitConv(fn, b.expr(fn, args[0]), tEface),
- pos: pos,
- })
- fn.currentBlock = fn.newBasicBlock("unreachable")
- return vTrue // any non-nil Value will do
- }
- return nil // treat all others as a regular function call
-}
-
-// addr lowers a single-result addressable expression e to SSA form,
-// emitting code to fn and returning the location (an lvalue) defined
-// by the expression.
-//
-// If escaping is true, addr marks the base variable of the
-// addressable expression e as being a potentially escaping pointer
-// value. For example, in this code:
-//
-// a := A{
-// b: [1]B{B{c: 1}}
-// }
-// return &a.b[0].c
-//
-// the application of & causes a.b[0].c to have its address taken,
-// which means that ultimately the local variable a must be
-// heap-allocated. This is a simple but very conservative escape
-// analysis.
-//
-// Operations forming potentially escaping pointers include:
-// - &x, including when implicit in method call or composite literals.
-// - a[:] iff a is an array (not *array)
-// - references to variables in lexically enclosing functions.
-//
-func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue {
- switch e := e.(type) {
- case *ast.Ident:
- if isBlankIdent(e) {
- return blank{}
- }
- obj := fn.Pkg.objectOf(e)
- v := fn.Prog.packageLevelValue(obj) // var (address)
- if v == nil {
- v = fn.lookup(obj, escaping)
- }
- return &address{addr: v, pos: e.Pos(), expr: e}
-
- case *ast.CompositeLit:
- t := deref(fn.Pkg.typeOf(e))
- var v *Alloc
- if escaping {
- v = emitNew(fn, t, e.Lbrace)
- } else {
- v = fn.addLocal(t, e.Lbrace)
- }
- v.Comment = "complit"
- var sb storebuf
- b.compLit(fn, v, e, true, &sb)
- sb.emit(fn)
- return &address{addr: v, pos: e.Lbrace, expr: e}
-
- case *ast.ParenExpr:
- return b.addr(fn, e.X, escaping)
-
- case *ast.SelectorExpr:
- sel, ok := fn.Pkg.info.Selections[e]
- if !ok {
- // qualified identifier
- return b.addr(fn, e.Sel, escaping)
- }
- if sel.Kind() != types.FieldVal {
- panic(sel)
- }
- wantAddr := true
- v := b.receiver(fn, e.X, wantAddr, escaping, sel)
- last := len(sel.Index()) - 1
- return &address{
- addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel),
- pos: e.Sel.Pos(),
- expr: e.Sel,
- }
-
- case *ast.IndexExpr:
- var x Value
- var et types.Type
- switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- x = b.addr(fn, e.X, escaping).address(fn)
- et = types.NewPointer(t.Elem())
- case *types.Pointer: // *array
- x = b.expr(fn, e.X)
- et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())
- case *types.Slice:
- x = b.expr(fn, e.X)
- et = types.NewPointer(t.Elem())
- case *types.Map:
- return &element{
- m: b.expr(fn, e.X),
- k: emitConv(fn, b.expr(fn, e.Index), t.Key()),
- t: t.Elem(),
- pos: e.Lbrack,
- }
- default:
- panic("unexpected container type in IndexExpr: " + t.String())
- }
- v := &IndexAddr{
- X: x,
- Index: emitConv(fn, b.expr(fn, e.Index), tInt),
- }
- v.setPos(e.Lbrack)
- v.setType(et)
- return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e}
-
- case *ast.StarExpr:
- return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e}
- }
-
- panic(fmt.Sprintf("unexpected address expression: %T", e))
-}
-
-type store struct {
- lhs lvalue
- rhs Value
-}
-
-type storebuf struct{ stores []store }
-
-func (sb *storebuf) store(lhs lvalue, rhs Value) {
- sb.stores = append(sb.stores, store{lhs, rhs})
-}
-
-func (sb *storebuf) emit(fn *Function) {
- for _, s := range sb.stores {
- s.lhs.store(fn, s.rhs)
- }
-}
-
-// assign emits to fn code to initialize the lvalue loc with the value
-// of expression e. If isZero is true, assign assumes that loc holds
-// the zero value for its type.
-//
-// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate
-// better code in some cases, e.g., for composite literals in an
-// addressable location.
-//
-// If sb is not nil, assign generates code to evaluate expression e, but
-// not to update loc. Instead, the necessary stores are appended to the
-// storebuf sb so that they can be executed later. This allows correct
-// in-place update of existing variables when the RHS is a composite
-// literal that may reference parts of the LHS.
-//
-func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) {
- // Can we initialize it in place?
- if e, ok := unparen(e).(*ast.CompositeLit); ok {
- // A CompositeLit never evaluates to a pointer,
- // so if the type of the location is a pointer,
- // an &-operation is implied.
- if _, ok := loc.(blank); !ok { // avoid calling blank.typ()
- if isPointer(loc.typ()) {
- ptr := b.addr(fn, e, true).address(fn)
- // copy address
- if sb != nil {
- sb.store(loc, ptr)
- } else {
- loc.store(fn, ptr)
- }
- return
- }
- }
-
- if _, ok := loc.(*address); ok {
- if isInterface(loc.typ()) {
- // e.g. var x interface{} = T{...}
- // Can't in-place initialize an interface value.
- // Fall back to copying.
- } else {
- // x = T{...} or x := T{...}
- addr := loc.address(fn)
- if sb != nil {
- b.compLit(fn, addr, e, isZero, sb)
- } else {
- var sb storebuf
- b.compLit(fn, addr, e, isZero, &sb)
- sb.emit(fn)
- }
-
- // Subtle: emit debug ref for aggregate types only;
- // slice and map are handled by store ops in compLit.
- switch loc.typ().Underlying().(type) {
- case *types.Struct, *types.Array:
- emitDebugRef(fn, e, addr, true)
- }
-
- return
- }
- }
- }
-
- // simple case: just copy
- rhs := b.expr(fn, e)
- if sb != nil {
- sb.store(loc, rhs)
- } else {
- loc.store(fn, rhs)
- }
-}
-
-// expr lowers a single-result expression e to SSA form, emitting code
-// to fn and returning the Value defined by the expression.
-//
-func (b *builder) expr(fn *Function, e ast.Expr) Value {
- e = unparen(e)
-
- tv := fn.Pkg.info.Types[e]
-
- // Is expression a constant?
- if tv.Value != nil {
- return NewConst(tv.Value, tv.Type)
- }
-
- var v Value
- if tv.Addressable() {
- // Prefer pointer arithmetic ({Index,Field}Addr) followed
- // by Load over subelement extraction (e.g. Index, Field),
- // to avoid large copies.
- v = b.addr(fn, e, false).load(fn)
- } else {
- v = b.expr0(fn, e, tv)
- }
- if fn.debugInfo() {
- emitDebugRef(fn, e, v, false)
- }
- return v
-}
-
-func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value {
- switch e := e.(type) {
- case *ast.BasicLit:
- panic("non-constant BasicLit") // unreachable
-
- case *ast.FuncLit:
- fn2 := &Function{
- name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)),
- Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature),
- pos: e.Type.Func,
- parent: fn,
- Pkg: fn.Pkg,
- Prog: fn.Prog,
- syntax: e,
- }
- fn.AnonFuncs = append(fn.AnonFuncs, fn2)
- b.buildFunction(fn2)
- if fn2.FreeVars == nil {
- return fn2
- }
- v := &MakeClosure{Fn: fn2}
- v.setType(tv.Type)
- for _, fv := range fn2.FreeVars {
- v.Bindings = append(v.Bindings, fv.outer)
- fv.outer = nil
- }
- return fn.emit(v)
-
- case *ast.TypeAssertExpr: // single-result form only
- return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen)
-
- case *ast.CallExpr:
- if fn.Pkg.info.Types[e.Fun].IsType() {
- // Explicit type conversion, e.g. string(x) or big.Int(x)
- x := b.expr(fn, e.Args[0])
- y := emitConv(fn, x, tv.Type)
- if y != x {
- switch y := y.(type) {
- case *Convert:
- y.pos = e.Lparen
- case *ChangeType:
- y.pos = e.Lparen
- case *MakeInterface:
- y.pos = e.Lparen
- }
- }
- return y
- }
- // Call to "intrinsic" built-ins, e.g. new, make, panic.
- if id, ok := unparen(e.Fun).(*ast.Ident); ok {
- if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok {
- if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil {
- return v
- }
- }
- }
- // Regular function call.
- var v Call
- b.setCall(fn, e, &v.Call)
- v.setType(tv.Type)
- return fn.emit(&v)
-
- case *ast.UnaryExpr:
- switch e.Op {
- case token.AND: // &X --- potentially escaping.
- addr := b.addr(fn, e.X, true)
- if _, ok := unparen(e.X).(*ast.StarExpr); ok {
- // &*p must panic if p is nil (http://golang.org/s/go12nil).
- // For simplicity, we'll just (suboptimally) rely
- // on the side effects of a load.
- // TODO(adonovan): emit dedicated nilcheck.
- addr.load(fn)
- }
- return addr.address(fn)
- case token.ADD:
- return b.expr(fn, e.X)
- case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^
- v := &UnOp{
- Op: e.Op,
- X: b.expr(fn, e.X),
- }
- v.setPos(e.OpPos)
- v.setType(tv.Type)
- return fn.emit(v)
- default:
- panic(e.Op)
- }
-
- case *ast.BinaryExpr:
- switch e.Op {
- case token.LAND, token.LOR:
- return b.logicalBinop(fn, e)
- case token.SHL, token.SHR:
- fallthrough
- case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
- return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos)
-
- case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ:
- cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos)
- // The type of x==y may be UntypedBool.
- return emitConv(fn, cmp, DefaultType(tv.Type))
- default:
- panic("illegal op in BinaryExpr: " + e.Op.String())
- }
-
- case *ast.SliceExpr:
- var low, high, max Value
- var x Value
- switch fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- // Potentially escaping.
- x = b.addr(fn, e.X, true).address(fn)
- case *types.Basic, *types.Slice, *types.Pointer: // *array
- x = b.expr(fn, e.X)
- default:
- panic("unreachable")
- }
- if e.High != nil {
- high = b.expr(fn, e.High)
- }
- if e.Low != nil {
- low = b.expr(fn, e.Low)
- }
- if e.Slice3 {
- max = b.expr(fn, e.Max)
- }
- v := &Slice{
- X: x,
- Low: low,
- High: high,
- Max: max,
- }
- v.setPos(e.Lbrack)
- v.setType(tv.Type)
- return fn.emit(v)
-
- case *ast.Ident:
- obj := fn.Pkg.info.Uses[e]
- // Universal built-in or nil?
- switch obj := obj.(type) {
- case *types.Builtin:
- return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)}
- case *types.Nil:
- return nilConst(tv.Type)
- }
- // Package-level func or var?
- if v := fn.Prog.packageLevelValue(obj); v != nil {
- if _, ok := obj.(*types.Var); ok {
- return emitLoad(fn, v) // var (address)
- }
- return v // (func)
- }
- // Local var.
- return emitLoad(fn, fn.lookup(obj, false)) // var (address)
-
- case *ast.SelectorExpr:
- sel, ok := fn.Pkg.info.Selections[e]
- if !ok {
- // qualified identifier
- return b.expr(fn, e.Sel)
- }
- switch sel.Kind() {
- case types.MethodExpr:
- // (*T).f or T.f, the method f from the method-set of type T.
- // The result is a "thunk".
- return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type)
-
- case types.MethodVal:
- // e.f where e is an expression and f is a method.
- // The result is a "bound".
- obj := sel.Obj().(*types.Func)
- rt := recvType(obj)
- wantAddr := isPointer(rt)
- escaping := true
- v := b.receiver(fn, e.X, wantAddr, escaping, sel)
- if isInterface(rt) {
- // If v has interface type I,
- // we must emit a check that v is non-nil.
- // We use: typeassert v.(I).
- emitTypeAssert(fn, v, rt, token.NoPos)
- }
- c := &MakeClosure{
- Fn: makeBound(fn.Prog, obj),
- Bindings: []Value{v},
- }
- c.setPos(e.Sel.Pos())
- c.setType(tv.Type)
- return fn.emit(c)
-
- case types.FieldVal:
- indices := sel.Index()
- last := len(indices) - 1
- v := b.expr(fn, e.X)
- v = emitImplicitSelections(fn, v, indices[:last])
- v = emitFieldSelection(fn, v, indices[last], false, e.Sel)
- return v
- }
-
- panic("unexpected expression-relative selector")
-
- case *ast.IndexExpr:
- switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- // Non-addressable array (in a register).
- v := &Index{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), tInt),
- }
- v.setPos(e.Lbrack)
- v.setType(t.Elem())
- return fn.emit(v)
-
- case *types.Map:
- // Maps are not addressable.
- mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
- v := &Lookup{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
- }
- v.setPos(e.Lbrack)
- v.setType(mapt.Elem())
- return fn.emit(v)
-
- case *types.Basic: // => string
- // Strings are not addressable.
- v := &Lookup{
- X: b.expr(fn, e.X),
- Index: b.expr(fn, e.Index),
- }
- v.setPos(e.Lbrack)
- v.setType(tByte)
- return fn.emit(v)
-
- case *types.Slice, *types.Pointer: // *array
- // Addressable slice/array; use IndexAddr and Load.
- return b.addr(fn, e, false).load(fn)
-
- default:
- panic("unexpected container type in IndexExpr: " + t.String())
- }
-
- case *ast.CompositeLit, *ast.StarExpr:
- // Addressable types (lvalues)
- return b.addr(fn, e, false).load(fn)
- }
-
- panic(fmt.Sprintf("unexpected expr: %T", e))
-}
-
-// stmtList emits to fn code for all statements in list.
-func (b *builder) stmtList(fn *Function, list []ast.Stmt) {
- for _, s := range list {
- b.stmt(fn, s)
- }
-}
-
-// receiver emits to fn code for expression e in the "receiver"
-// position of selection e.f (where f may be a field or a method) and
-// returns the effective receiver after applying the implicit field
-// selections of sel.
-//
-// wantAddr requests that the result is an an address. If
-// !sel.Indirect(), this may require that e be built in addr() mode; it
-// must thus be addressable.
-//
-// escaping is defined as per builder.addr().
-//
-func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value {
- var v Value
- if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) {
- v = b.addr(fn, e, escaping).address(fn)
- } else {
- v = b.expr(fn, e)
- }
-
- last := len(sel.Index()) - 1
- v = emitImplicitSelections(fn, v, sel.Index()[:last])
- if !wantAddr && isPointer(v.Type()) {
- v = emitLoad(fn, v)
- }
- return v
-}
-
-// setCallFunc populates the function parts of a CallCommon structure
-// (Func, Method, Recv, Args[0]) based on the kind of invocation
-// occurring in e.
-//
-func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) {
- c.pos = e.Lparen
-
- // Is this a method call?
- if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok {
- sel, ok := fn.Pkg.info.Selections[selector]
- if ok && sel.Kind() == types.MethodVal {
- obj := sel.Obj().(*types.Func)
- recv := recvType(obj)
- wantAddr := isPointer(recv)
- escaping := true
- v := b.receiver(fn, selector.X, wantAddr, escaping, sel)
- if isInterface(recv) {
- // Invoke-mode call.
- c.Value = v
- c.Method = obj
- } else {
- // "Call"-mode call.
- c.Value = fn.Prog.declaredFunc(obj)
- c.Args = append(c.Args, v)
- }
- return
- }
-
- // sel.Kind()==MethodExpr indicates T.f() or (*T).f():
- // a statically dispatched call to the method f in the
- // method-set of T or *T. T may be an interface.
- //
- // e.Fun would evaluate to a concrete method, interface
- // wrapper function, or promotion wrapper.
- //
- // For now, we evaluate it in the usual way.
- //
- // TODO(adonovan): opt: inline expr() here, to make the
- // call static and to avoid generation of wrappers.
- // It's somewhat tricky as it may consume the first
- // actual parameter if the call is "invoke" mode.
- //
- // Examples:
- // type T struct{}; func (T) f() {} // "call" mode
- // type T interface { f() } // "invoke" mode
- //
- // type S struct{ T }
- //
- // var s S
- // S.f(s)
- // (*S).f(&s)
- //
- // Suggested approach:
- // - consume the first actual parameter expression
- // and build it with b.expr().
- // - apply implicit field selections.
- // - use MethodVal logic to populate fields of c.
- }
-
- // Evaluate the function operand in the usual way.
- c.Value = b.expr(fn, e.Fun)
-}
-
-// emitCallArgs emits to f code for the actual parameters of call e to
-// a (possibly built-in) function of effective type sig.
-// The argument values are appended to args, which is then returned.
-//
-func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value {
- // f(x, y, z...): pass slice z straight through.
- if e.Ellipsis != 0 {
- for i, arg := range e.Args {
- v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type())
- args = append(args, v)
- }
- return args
- }
-
- offset := len(args) // 1 if call has receiver, 0 otherwise
-
- // Evaluate actual parameter expressions.
- //
- // If this is a chained call of the form f(g()) where g has
- // multiple return values (MRV), they are flattened out into
- // args; a suffix of them may end up in a varargs slice.
- for _, arg := range e.Args {
- v := b.expr(fn, arg)
- if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain
- for i, n := 0, ttuple.Len(); i < n; i++ {
- args = append(args, emitExtract(fn, v, i))
- }
- } else {
- args = append(args, v)
- }
- }
-
- // Actual->formal assignability conversions for normal parameters.
- np := sig.Params().Len() // number of normal parameters
- if sig.Variadic() {
- np--
- }
- for i := 0; i < np; i++ {
- args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type())
- }
-
- // Actual->formal assignability conversions for variadic parameter,
- // and construction of slice.
- if sig.Variadic() {
- varargs := args[offset+np:]
- st := sig.Params().At(np).Type().(*types.Slice)
- vt := st.Elem()
- if len(varargs) == 0 {
- args = append(args, nilConst(st))
- } else {
- // Replace a suffix of args with a slice containing it.
- at := types.NewArray(vt, int64(len(varargs)))
- a := emitNew(fn, at, token.NoPos)
- a.setPos(e.Rparen)
- a.Comment = "varargs"
- for i, arg := range varargs {
- iaddr := &IndexAddr{
- X: a,
- Index: intConst(int64(i)),
- }
- iaddr.setType(types.NewPointer(vt))
- fn.emit(iaddr)
- emitStore(fn, iaddr, arg, arg.Pos())
- }
- s := &Slice{X: a}
- s.setType(st)
- args[offset+np] = fn.emit(s)
- args = args[:offset+np+1]
- }
- }
- return args
-}
-
-// setCall emits to fn code to evaluate all the parameters of a function
-// call e, and populates *c with those values.
-//
-func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) {
- // First deal with the f(...) part and optional receiver.
- b.setCallFunc(fn, e, c)
-
- // Then append the other actual parameters.
- sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature)
- if sig == nil {
- panic(fmt.Sprintf("no signature for call of %s", e.Fun))
- }
- c.Args = b.emitCallArgs(fn, sig, e, c.Args)
-}
-
-// assignOp emits to fn code to perform loc += incr or loc -= incr.
-func (b *builder) assignOp(fn *Function, loc lvalue, incr Value, op token.Token) {
- oldv := loc.load(fn)
- loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, incr, oldv.Type()), loc.typ(), token.NoPos))
-}
-
-// localValueSpec emits to fn code to define all of the vars in the
-// function-local ValueSpec, spec.
-//
-func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) {
- switch {
- case len(spec.Values) == len(spec.Names):
- // e.g. var x, y = 0, 1
- // 1:1 assignment
- for i, id := range spec.Names {
- if !isBlankIdent(id) {
- fn.addLocalForIdent(id)
- }
- lval := b.addr(fn, id, false) // non-escaping
- b.assign(fn, lval, spec.Values[i], true, nil)
- }
-
- case len(spec.Values) == 0:
- // e.g. var x, y int
- // Locals are implicitly zero-initialized.
- for _, id := range spec.Names {
- if !isBlankIdent(id) {
- lhs := fn.addLocalForIdent(id)
- if fn.debugInfo() {
- emitDebugRef(fn, id, lhs, true)
- }
- }
- }
-
- default:
- // e.g. var x, y = pos()
- tuple := b.exprN(fn, spec.Values[0])
- for i, id := range spec.Names {
- if !isBlankIdent(id) {
- fn.addLocalForIdent(id)
- lhs := b.addr(fn, id, false) // non-escaping
- lhs.store(fn, emitExtract(fn, tuple, i))
- }
- }
- }
-}
-
-// assignStmt emits code to fn for a parallel assignment of rhss to lhss.
-// isDef is true if this is a short variable declaration (:=).
-//
-// Note the similarity with localValueSpec.
-//
-func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) {
- // Side effects of all LHSs and RHSs must occur in left-to-right order.
- lvals := make([]lvalue, len(lhss))
- isZero := make([]bool, len(lhss))
- for i, lhs := range lhss {
- var lval lvalue = blank{}
- if !isBlankIdent(lhs) {
- if isDef {
- if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil {
- fn.addNamedLocal(obj)
- isZero[i] = true
- }
- }
- lval = b.addr(fn, lhs, false) // non-escaping
- }
- lvals[i] = lval
- }
- if len(lhss) == len(rhss) {
- // Simple assignment: x = f() (!isDef)
- // Parallel assignment: x, y = f(), g() (!isDef)
- // or short var decl: x, y := f(), g() (isDef)
- //
- // In all cases, the RHSs may refer to the LHSs,
- // so we need a storebuf.
- var sb storebuf
- for i := range rhss {
- b.assign(fn, lvals[i], rhss[i], isZero[i], &sb)
- }
- sb.emit(fn)
- } else {
- // e.g. x, y = pos()
- tuple := b.exprN(fn, rhss[0])
- emitDebugRef(fn, rhss[0], tuple, false)
- for i, lval := range lvals {
- lval.store(fn, emitExtract(fn, tuple, i))
- }
- }
-}
-
-// arrayLen returns the length of the array whose composite literal elements are elts.
-func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 {
- var max int64 = -1
- var i int64 = -1
- for _, e := range elts {
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- i = b.expr(fn, kv.Key).(*Const).Int64()
- } else {
- i++
- }
- if i > max {
- max = i
- }
- }
- return max + 1
-}
-
-// compLit emits to fn code to initialize a composite literal e at
-// address addr with type typ.
-//
-// Nested composite literals are recursively initialized in place
-// where possible. If isZero is true, compLit assumes that addr
-// holds the zero value for typ.
-//
-// Because the elements of a composite literal may refer to the
-// variables being updated, as in the second line below,
-// x := T{a: 1}
-// x = T{a: x.a}
-// all the reads must occur before all the writes. Thus all stores to
-// loc are emitted to the storebuf sb for later execution.
-//
-// A CompositeLit may have pointer type only in the recursive (nested)
-// case when the type name is implicit. e.g. in []*T{{}}, the inner
-// literal has type *T behaves like &T{}.
-// In that case, addr must hold a T, not a *T.
-//
-func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) {
- typ := deref(fn.Pkg.typeOf(e))
- switch t := typ.Underlying().(type) {
- case *types.Struct:
- if !isZero && len(e.Elts) != t.NumFields() {
- // memclear
- sb.store(&address{addr, e.Lbrace, nil},
- zeroValue(fn, deref(addr.Type())))
- isZero = true
- }
- for i, e := range e.Elts {
- fieldIndex := i
- pos := e.Pos()
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- fname := kv.Key.(*ast.Ident).Name
- for i, n := 0, t.NumFields(); i < n; i++ {
- sf := t.Field(i)
- if sf.Name() == fname {
- fieldIndex = i
- pos = kv.Colon
- e = kv.Value
- break
- }
- }
- }
- sf := t.Field(fieldIndex)
- faddr := &FieldAddr{
- X: addr,
- Field: fieldIndex,
- }
- faddr.setType(types.NewPointer(sf.Type()))
- fn.emit(faddr)
- b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb)
- }
-
- case *types.Array, *types.Slice:
- var at *types.Array
- var array Value
- switch t := t.(type) {
- case *types.Slice:
- at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts))
- alloc := emitNew(fn, at, e.Lbrace)
- alloc.Comment = "slicelit"
- array = alloc
- case *types.Array:
- at = t
- array = addr
-
- if !isZero && int64(len(e.Elts)) != at.Len() {
- // memclear
- sb.store(&address{array, e.Lbrace, nil},
- zeroValue(fn, deref(array.Type())))
- }
- }
-
- var idx *Const
- for _, e := range e.Elts {
- pos := e.Pos()
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- idx = b.expr(fn, kv.Key).(*Const)
- pos = kv.Colon
- e = kv.Value
- } else {
- var idxval int64
- if idx != nil {
- idxval = idx.Int64() + 1
- }
- idx = intConst(idxval)
- }
- iaddr := &IndexAddr{
- X: array,
- Index: idx,
- }
- iaddr.setType(types.NewPointer(at.Elem()))
- fn.emit(iaddr)
- if t != at { // slice
- // backing array is unaliased => storebuf not needed.
- b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil)
- } else {
- b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb)
- }
- }
-
- if t != at { // slice
- s := &Slice{X: array}
- s.setPos(e.Lbrace)
- s.setType(typ)
- sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s))
- }
-
- case *types.Map:
- m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))}
- m.setPos(e.Lbrace)
- m.setType(typ)
- fn.emit(m)
- for _, e := range e.Elts {
- e := e.(*ast.KeyValueExpr)
-
- // If a key expression in a map literal is itself a
- // composite literal, the type may be omitted.
- // For example:
- // map[*struct{}]bool{{}: true}
- // An &-operation may be implied:
- // map[*struct{}]bool{&struct{}{}: true}
- var key Value
- if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) {
- // A CompositeLit never evaluates to a pointer,
- // so if the type of the location is a pointer,
- // an &-operation is implied.
- key = b.addr(fn, e.Key, true).address(fn)
- } else {
- key = b.expr(fn, e.Key)
- }
-
- loc := element{
- m: m,
- k: emitConv(fn, key, t.Key()),
- t: t.Elem(),
- pos: e.Colon,
- }
-
- // We call assign() only because it takes care
- // of any &-operation required in the recursive
- // case, e.g.,
- // map[int]*struct{}{0: {}} implies &struct{}{}.
- // In-place update is of course impossible,
- // and no storebuf is needed.
- b.assign(fn, &loc, e.Value, true, nil)
- }
- sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m)
-
- default:
- panic("unexpected CompositeLit type: " + t.String())
- }
-}
-
-// switchStmt emits to fn code for the switch statement s, optionally
-// labelled by label.
-//
-func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) {
- // We treat SwitchStmt like a sequential if-else chain.
- // Multiway dispatch can be recovered later by ssautil.Switches()
- // to those cases that are free of side effects.
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- var tag Value = vTrue
- if s.Tag != nil {
- tag = b.expr(fn, s.Tag)
- }
- done := fn.newBasicBlock("switch.done")
- if label != nil {
- label._break = done
- }
- // We pull the default case (if present) down to the end.
- // But each fallthrough label must point to the next
- // body block in source order, so we preallocate a
- // body block (fallthru) for the next case.
- // Unfortunately this makes for a confusing block order.
- var dfltBody *[]ast.Stmt
- var dfltFallthrough *BasicBlock
- var fallthru, dfltBlock *BasicBlock
- ncases := len(s.Body.List)
- for i, clause := range s.Body.List {
- body := fallthru
- if body == nil {
- body = fn.newBasicBlock("switch.body") // first case only
- }
-
- // Preallocate body block for the next case.
- fallthru = done
- if i+1 < ncases {
- fallthru = fn.newBasicBlock("switch.body")
- }
-
- cc := clause.(*ast.CaseClause)
- if cc.List == nil {
- // Default case.
- dfltBody = &cc.Body
- dfltFallthrough = fallthru
- dfltBlock = body
- continue
- }
-
- var nextCond *BasicBlock
- for _, cond := range cc.List {
- nextCond = fn.newBasicBlock("switch.next")
- // TODO(adonovan): opt: when tag==vTrue, we'd
- // get better code if we use b.cond(cond)
- // instead of BinOp(EQL, tag, b.expr(cond))
- // followed by If. Don't forget conversions
- // though.
- cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), token.NoPos)
- emitIf(fn, cond, body, nextCond)
- fn.currentBlock = nextCond
- }
- fn.currentBlock = body
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _fallthrough: fallthru,
- }
- b.stmtList(fn, cc.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = nextCond
- }
- if dfltBlock != nil {
- emitJump(fn, dfltBlock)
- fn.currentBlock = dfltBlock
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _fallthrough: dfltFallthrough,
- }
- b.stmtList(fn, *dfltBody)
- fn.targets = fn.targets.tail
- }
- emitJump(fn, done)
- fn.currentBlock = done
-}
-
-// typeSwitchStmt emits to fn code for the type switch statement s, optionally
-// labelled by label.
-//
-func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) {
- // We treat TypeSwitchStmt like a sequential if-else chain.
- // Multiway dispatch can be recovered later by ssautil.Switches().
-
- // Typeswitch lowering:
- //
- // var x X
- // switch y := x.(type) {
- // case T1, T2: S1 // >1 (y := x)
- // case nil: SN // nil (y := x)
- // default: SD // 0 types (y := x)
- // case T3: S3 // 1 type (y := x.(T3))
- // }
- //
- // ...s.Init...
- // x := eval x
- // .caseT1:
- // t1, ok1 := typeswitch,ok x
- // if ok1 then goto S1 else goto .caseT2
- // .caseT2:
- // t2, ok2 := typeswitch,ok x
- // if ok2 then goto S1 else goto .caseNil
- // .S1:
- // y := x
- // ...S1...
- // goto done
- // .caseNil:
- // if t2, ok2 := typeswitch,ok x
- // if x == nil then goto SN else goto .caseT3
- // .SN:
- // y := x
- // ...SN...
- // goto done
- // .caseT3:
- // t3, ok3 := typeswitch,ok x
- // if ok3 then goto S3 else goto default
- // .S3:
- // y := t3
- // ...S3...
- // goto done
- // .default:
- // y := x
- // ...SD...
- // goto done
- // .done:
-
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
-
- var x Value
- switch ass := s.Assign.(type) {
- case *ast.ExprStmt: // x.(type)
- x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X)
- case *ast.AssignStmt: // y := x.(type)
- x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
- }
-
- done := fn.newBasicBlock("typeswitch.done")
- if label != nil {
- label._break = done
- }
- var default_ *ast.CaseClause
- for _, clause := range s.Body.List {
- cc := clause.(*ast.CaseClause)
- if cc.List == nil {
- default_ = cc
- continue
- }
- body := fn.newBasicBlock("typeswitch.body")
- var next *BasicBlock
- var casetype types.Type
- var ti Value // ti, ok := typeassert,ok x
- for _, cond := range cc.List {
- next = fn.newBasicBlock("typeswitch.next")
- casetype = fn.Pkg.typeOf(cond)
- var condv Value
- if casetype == tUntypedNil {
- condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos)
- ti = x
- } else {
- yok := emitTypeTest(fn, x, casetype, cc.Case)
- ti = emitExtract(fn, yok, 0)
- condv = emitExtract(fn, yok, 1)
- }
- emitIf(fn, condv, body, next)
- fn.currentBlock = next
- }
- if len(cc.List) != 1 {
- ti = x
- }
- fn.currentBlock = body
- b.typeCaseBody(fn, cc, ti, done)
- fn.currentBlock = next
- }
- if default_ != nil {
- b.typeCaseBody(fn, default_, x, done)
- } else {
- emitJump(fn, done)
- }
- fn.currentBlock = done
-}
-
-func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) {
- if obj := fn.Pkg.info.Implicits[cc]; obj != nil {
- // In a switch y := x.(type), each case clause
- // implicitly declares a distinct object y.
- // In a single-type case, y has that type.
- // In multi-type cases, 'case nil' and default,
- // y has the same type as the interface operand.
- emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos())
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, cc.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
-}
-
-// selectStmt emits to fn code for the select statement s, optionally
-// labelled by label.
-//
-func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) {
- // A blocking select of a single case degenerates to a
- // simple send or receive.
- // TODO(adonovan): opt: is this optimization worth its weight?
- if len(s.Body.List) == 1 {
- clause := s.Body.List[0].(*ast.CommClause)
- if clause.Comm != nil {
- b.stmt(fn, clause.Comm)
- done := fn.newBasicBlock("select.done")
- if label != nil {
- label._break = done
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, clause.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = done
- return
- }
- }
-
- // First evaluate all channels in all cases, and find
- // the directions of each state.
- var states []*SelectState
- blocking := true
- debugInfo := fn.debugInfo()
- for _, clause := range s.Body.List {
- var st *SelectState
- switch comm := clause.(*ast.CommClause).Comm.(type) {
- case nil: // default case
- blocking = false
- continue
-
- case *ast.SendStmt: // ch<- i
- ch := b.expr(fn, comm.Chan)
- st = &SelectState{
- Dir: types.SendOnly,
- Chan: ch,
- Send: emitConv(fn, b.expr(fn, comm.Value),
- ch.Type().Underlying().(*types.Chan).Elem()),
- Pos: comm.Arrow,
- }
- if debugInfo {
- st.DebugNode = comm
- }
-
- case *ast.AssignStmt: // x := <-ch
- recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr)
- st = &SelectState{
- Dir: types.RecvOnly,
- Chan: b.expr(fn, recv.X),
- Pos: recv.OpPos,
- }
- if debugInfo {
- st.DebugNode = recv
- }
-
- case *ast.ExprStmt: // <-ch
- recv := unparen(comm.X).(*ast.UnaryExpr)
- st = &SelectState{
- Dir: types.RecvOnly,
- Chan: b.expr(fn, recv.X),
- Pos: recv.OpPos,
- }
- if debugInfo {
- st.DebugNode = recv
- }
- }
- states = append(states, st)
- }
-
- // We dispatch on the (fair) result of Select using a
- // sequential if-else chain, in effect:
- //
- // idx, recvOk, r0...r_n-1 := select(...)
- // if idx == 0 { // receive on channel 0 (first receive => r0)
- // x, ok := r0, recvOk
- // ...state0...
- // } else if v == 1 { // send on channel 1
- // ...state1...
- // } else {
- // ...default...
- // }
- sel := &Select{
- States: states,
- Blocking: blocking,
- }
- sel.setPos(s.Select)
- var vars []*types.Var
- vars = append(vars, varIndex, varOk)
- for _, st := range states {
- if st.Dir == types.RecvOnly {
- tElem := st.Chan.Type().Underlying().(*types.Chan).Elem()
- vars = append(vars, anonVar(tElem))
- }
- }
- sel.setType(types.NewTuple(vars...))
-
- fn.emit(sel)
- idx := emitExtract(fn, sel, 0)
-
- done := fn.newBasicBlock("select.done")
- if label != nil {
- label._break = done
- }
-
- var defaultBody *[]ast.Stmt
- state := 0
- r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV
- for _, cc := range s.Body.List {
- clause := cc.(*ast.CommClause)
- if clause.Comm == nil {
- defaultBody = &clause.Body
- continue
- }
- body := fn.newBasicBlock("select.body")
- next := fn.newBasicBlock("select.next")
- emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next)
- fn.currentBlock = body
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- switch comm := clause.Comm.(type) {
- case *ast.ExprStmt: // <-ch
- if debugInfo {
- v := emitExtract(fn, sel, r)
- emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
- }
- r++
-
- case *ast.AssignStmt: // x := <-states[state].Chan
- if comm.Tok == token.DEFINE {
- fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident))
- }
- x := b.addr(fn, comm.Lhs[0], false) // non-escaping
- v := emitExtract(fn, sel, r)
- if debugInfo {
- emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
- }
- x.store(fn, v)
-
- if len(comm.Lhs) == 2 { // x, ok := ...
- if comm.Tok == token.DEFINE {
- fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident))
- }
- ok := b.addr(fn, comm.Lhs[1], false) // non-escaping
- ok.store(fn, emitExtract(fn, sel, 1))
- }
- r++
- }
- b.stmtList(fn, clause.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = next
- state++
- }
- if defaultBody != nil {
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, *defaultBody)
- fn.targets = fn.targets.tail
- } else {
- // A blocking select must match some case.
- // (This should really be a runtime.errorString, not a string.)
- fn.emit(&Panic{
- X: emitConv(fn, stringConst("blocking select matched no case"), tEface),
- })
- fn.currentBlock = fn.newBasicBlock("unreachable")
- }
- emitJump(fn, done)
- fn.currentBlock = done
-}
-
-// forStmt emits to fn code for the for statement s, optionally
-// labelled by label.
-//
-func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) {
- // ...init...
- // jump loop
- // loop:
- // if cond goto body else done
- // body:
- // ...body...
- // jump post
- // post: (target of continue)
- // ...post...
- // jump loop
- // done: (target of break)
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- body := fn.newBasicBlock("for.body")
- done := fn.newBasicBlock("for.done") // target of 'break'
- loop := body // target of back-edge
- if s.Cond != nil {
- loop = fn.newBasicBlock("for.loop")
- }
- cont := loop // target of 'continue'
- if s.Post != nil {
- cont = fn.newBasicBlock("for.post")
- }
- if label != nil {
- label._break = done
- label._continue = cont
- }
- emitJump(fn, loop)
- fn.currentBlock = loop
- if loop != body {
- b.cond(fn, s.Cond, body, done)
- fn.currentBlock = body
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _continue: cont,
- }
- b.stmt(fn, s.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, cont)
-
- if s.Post != nil {
- fn.currentBlock = cont
- b.stmt(fn, s.Post)
- emitJump(fn, loop) // back-edge
- }
- fn.currentBlock = done
-}
-
-// rangeIndexed emits to fn the header for an integer-indexed loop
-// over array, *array or slice value x.
-// The v result is defined only if tv is non-nil.
-// forPos is the position of the "for" token.
-//
-func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
- //
- // length = len(x)
- // index = -1
- // loop: (target of continue)
- // index++
- // if index < length goto body else done
- // body:
- // k = index
- // v = x[index]
- // ...body...
- // jump loop
- // done: (target of break)
-
- // Determine number of iterations.
- var length Value
- if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok {
- // For array or *array, the number of iterations is
- // known statically thanks to the type. We avoid a
- // data dependence upon x, permitting later dead-code
- // elimination if x is pure, static unrolling, etc.
- // Ranging over a nil *array may have >0 iterations.
- // We still generate code for x, in case it has effects.
- length = intConst(arr.Len())
- } else {
- // length = len(x).
- var c Call
- c.Call.Value = makeLen(x.Type())
- c.Call.Args = []Value{x}
- c.setType(tInt)
- length = fn.emit(&c)
- }
-
- index := fn.addLocal(tInt, token.NoPos)
- emitStore(fn, index, intConst(-1), pos)
-
- loop = fn.newBasicBlock("rangeindex.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
-
- incr := &BinOp{
- Op: token.ADD,
- X: emitLoad(fn, index),
- Y: vOne,
- }
- incr.setType(tInt)
- emitStore(fn, index, fn.emit(incr), pos)
-
- body := fn.newBasicBlock("rangeindex.body")
- done = fn.newBasicBlock("rangeindex.done")
- emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done)
- fn.currentBlock = body
-
- k = emitLoad(fn, index)
- if tv != nil {
- switch t := x.Type().Underlying().(type) {
- case *types.Array:
- instr := &Index{
- X: x,
- Index: k,
- }
- instr.setType(t.Elem())
- v = fn.emit(instr)
-
- case *types.Pointer: // *array
- instr := &IndexAddr{
- X: x,
- Index: k,
- }
- instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()))
- v = emitLoad(fn, fn.emit(instr))
-
- case *types.Slice:
- instr := &IndexAddr{
- X: x,
- Index: k,
- }
- instr.setType(types.NewPointer(t.Elem()))
- v = emitLoad(fn, fn.emit(instr))
-
- default:
- panic("rangeIndexed x:" + t.String())
- }
- }
- return
-}
-
-// rangeIter emits to fn the header for a loop using
-// Range/Next/Extract to iterate over map or string value x.
-// tk and tv are the types of the key/value results k and v, or nil
-// if the respective component is not wanted.
-//
-func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
- //
- // it = range x
- // loop: (target of continue)
- // okv = next it (ok, key, value)
- // ok = extract okv #0
- // if ok goto body else done
- // body:
- // k = extract okv #1
- // v = extract okv #2
- // ...body...
- // jump loop
- // done: (target of break)
- //
-
- if tk == nil {
- tk = tInvalid
- }
- if tv == nil {
- tv = tInvalid
- }
-
- rng := &Range{X: x}
- rng.setPos(pos)
- rng.setType(tRangeIter)
- it := fn.emit(rng)
-
- loop = fn.newBasicBlock("rangeiter.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
-
- _, isString := x.Type().Underlying().(*types.Basic)
-
- okv := &Next{
- Iter: it,
- IsString: isString,
- }
- okv.setType(types.NewTuple(
- varOk,
- newVar("k", tk),
- newVar("v", tv),
- ))
- fn.emit(okv)
-
- body := fn.newBasicBlock("rangeiter.body")
- done = fn.newBasicBlock("rangeiter.done")
- emitIf(fn, emitExtract(fn, okv, 0), body, done)
- fn.currentBlock = body
-
- if tk != tInvalid {
- k = emitExtract(fn, okv, 1)
- }
- if tv != tInvalid {
- v = emitExtract(fn, okv, 2)
- }
- return
-}
-
-// rangeChan emits to fn the header for a loop that receives from
-// channel x until it fails.
-// tk is the channel's element type, or nil if the k result is
-// not wanted
-// pos is the position of the '=' or ':=' token.
-//
-func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) {
- //
- // loop: (target of continue)
- // ko = <-x (key, ok)
- // ok = extract ko #1
- // if ok goto body else done
- // body:
- // k = extract ko #0
- // ...
- // goto loop
- // done: (target of break)
-
- loop = fn.newBasicBlock("rangechan.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
- recv := &UnOp{
- Op: token.ARROW,
- X: x,
- CommaOk: true,
- }
- recv.setPos(pos)
- recv.setType(types.NewTuple(
- newVar("k", x.Type().Underlying().(*types.Chan).Elem()),
- varOk,
- ))
- ko := fn.emit(recv)
- body := fn.newBasicBlock("rangechan.body")
- done = fn.newBasicBlock("rangechan.done")
- emitIf(fn, emitExtract(fn, ko, 1), body, done)
- fn.currentBlock = body
- if tk != nil {
- k = emitExtract(fn, ko, 0)
- }
- return
-}
-
-// rangeStmt emits to fn code for the range statement s, optionally
-// labelled by label.
-//
-func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) {
- var tk, tv types.Type
- if s.Key != nil && !isBlankIdent(s.Key) {
- tk = fn.Pkg.typeOf(s.Key)
- }
- if s.Value != nil && !isBlankIdent(s.Value) {
- tv = fn.Pkg.typeOf(s.Value)
- }
-
- // If iteration variables are defined (:=), this
- // occurs once outside the loop.
- //
- // Unlike a short variable declaration, a RangeStmt
- // using := never redeclares an existing variable; it
- // always creates a new one.
- if s.Tok == token.DEFINE {
- if tk != nil {
- fn.addLocalForIdent(s.Key.(*ast.Ident))
- }
- if tv != nil {
- fn.addLocalForIdent(s.Value.(*ast.Ident))
- }
- }
-
- x := b.expr(fn, s.X)
-
- var k, v Value
- var loop, done *BasicBlock
- switch rt := x.Type().Underlying().(type) {
- case *types.Slice, *types.Array, *types.Pointer: // *array
- k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For)
-
- case *types.Chan:
- k, loop, done = b.rangeChan(fn, x, tk, s.For)
-
- case *types.Map, *types.Basic: // string
- k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For)
-
- default:
- panic("Cannot range over: " + rt.String())
- }
-
- // Evaluate both LHS expressions before we update either.
- var kl, vl lvalue
- if tk != nil {
- kl = b.addr(fn, s.Key, false) // non-escaping
- }
- if tv != nil {
- vl = b.addr(fn, s.Value, false) // non-escaping
- }
- if tk != nil {
- kl.store(fn, k)
- }
- if tv != nil {
- vl.store(fn, v)
- }
-
- if label != nil {
- label._break = done
- label._continue = loop
- }
-
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _continue: loop,
- }
- b.stmt(fn, s.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, loop) // back-edge
- fn.currentBlock = done
-}
-
-// stmt lowers statement s to SSA form, emitting code to fn.
-func (b *builder) stmt(fn *Function, _s ast.Stmt) {
- // The label of the current statement. If non-nil, its _goto
- // target is always set; its _break and _continue are set only
- // within the body of switch/typeswitch/select/for/range.
- // It is effectively an additional default-nil parameter of stmt().
- var label *lblock
-start:
- switch s := _s.(type) {
- case *ast.EmptyStmt:
- // ignore. (Usually removed by gofmt.)
-
- case *ast.DeclStmt: // Con, Var or Typ
- d := s.Decl.(*ast.GenDecl)
- if d.Tok == token.VAR {
- for _, spec := range d.Specs {
- if vs, ok := spec.(*ast.ValueSpec); ok {
- b.localValueSpec(fn, vs)
- }
- }
- }
-
- case *ast.LabeledStmt:
- label = fn.labelledBlock(s.Label)
- emitJump(fn, label._goto)
- fn.currentBlock = label._goto
- _s = s.Stmt
- goto start // effectively: tailcall stmt(fn, s.Stmt, label)
-
- case *ast.ExprStmt:
- b.expr(fn, s.X)
-
- case *ast.SendStmt:
- fn.emit(&Send{
- Chan: b.expr(fn, s.Chan),
- X: emitConv(fn, b.expr(fn, s.Value),
- fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()),
- pos: s.Arrow,
- })
-
- case *ast.IncDecStmt:
- op := token.ADD
- if s.Tok == token.DEC {
- op = token.SUB
- }
- loc := b.addr(fn, s.X, false)
- b.assignOp(fn, loc, NewConst(exact.MakeInt64(1), loc.typ()), op)
-
- case *ast.AssignStmt:
- switch s.Tok {
- case token.ASSIGN, token.DEFINE:
- b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE)
-
- default: // +=, etc.
- op := s.Tok + token.ADD - token.ADD_ASSIGN
- b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op)
- }
-
- case *ast.GoStmt:
- // The "intrinsics" new/make/len/cap are forbidden here.
- // panic is treated like an ordinary function call.
- v := Go{pos: s.Go}
- b.setCall(fn, s.Call, &v.Call)
- fn.emit(&v)
-
- case *ast.DeferStmt:
- // The "intrinsics" new/make/len/cap are forbidden here.
- // panic is treated like an ordinary function call.
- v := Defer{pos: s.Defer}
- b.setCall(fn, s.Call, &v.Call)
- fn.emit(&v)
-
- // A deferred call can cause recovery from panic,
- // and control resumes at the Recover block.
- createRecoverBlock(fn)
-
- case *ast.ReturnStmt:
- var results []Value
- if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 {
- // Return of one expression in a multi-valued function.
- tuple := b.exprN(fn, s.Results[0])
- ttuple := tuple.Type().(*types.Tuple)
- for i, n := 0, ttuple.Len(); i < n; i++ {
- results = append(results,
- emitConv(fn, emitExtract(fn, tuple, i),
- fn.Signature.Results().At(i).Type()))
- }
- } else {
- // 1:1 return, or no-arg return in non-void function.
- for i, r := range s.Results {
- v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type())
- results = append(results, v)
- }
- }
- if fn.namedResults != nil {
- // Function has named result parameters (NRPs).
- // Perform parallel assignment of return operands to NRPs.
- for i, r := range results {
- emitStore(fn, fn.namedResults[i], r, s.Return)
- }
- }
- // Run function calls deferred in this
- // function when explicitly returning from it.
- fn.emit(new(RunDefers))
- if fn.namedResults != nil {
- // Reload NRPs to form the result tuple.
- results = results[:0]
- for _, r := range fn.namedResults {
- results = append(results, emitLoad(fn, r))
- }
- }
- fn.emit(&Return{Results: results, pos: s.Return})
- fn.currentBlock = fn.newBasicBlock("unreachable")
-
- case *ast.BranchStmt:
- var block *BasicBlock
- switch s.Tok {
- case token.BREAK:
- if s.Label != nil {
- block = fn.labelledBlock(s.Label)._break
- } else {
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._break
- }
- }
-
- case token.CONTINUE:
- if s.Label != nil {
- block = fn.labelledBlock(s.Label)._continue
- } else {
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._continue
- }
- }
-
- case token.FALLTHROUGH:
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._fallthrough
- }
-
- case token.GOTO:
- block = fn.labelledBlock(s.Label)._goto
- }
- emitJump(fn, block)
- fn.currentBlock = fn.newBasicBlock("unreachable")
-
- case *ast.BlockStmt:
- b.stmtList(fn, s.List)
-
- case *ast.IfStmt:
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- then := fn.newBasicBlock("if.then")
- done := fn.newBasicBlock("if.done")
- els := done
- if s.Else != nil {
- els = fn.newBasicBlock("if.else")
- }
- b.cond(fn, s.Cond, then, els)
- fn.currentBlock = then
- b.stmt(fn, s.Body)
- emitJump(fn, done)
-
- if s.Else != nil {
- fn.currentBlock = els
- b.stmt(fn, s.Else)
- emitJump(fn, done)
- }
-
- fn.currentBlock = done
-
- case *ast.SwitchStmt:
- b.switchStmt(fn, s, label)
-
- case *ast.TypeSwitchStmt:
- b.typeSwitchStmt(fn, s, label)
-
- case *ast.SelectStmt:
- b.selectStmt(fn, s, label)
-
- case *ast.ForStmt:
- b.forStmt(fn, s, label)
-
- case *ast.RangeStmt:
- b.rangeStmt(fn, s, label)
-
- default:
- panic(fmt.Sprintf("unexpected statement kind: %T", s))
- }
-}
-
-// buildFunction builds SSA code for the body of function fn. Idempotent.
-func (b *builder) buildFunction(fn *Function) {
- if fn.Blocks != nil {
- return // building already started
- }
-
- var recvField *ast.FieldList
- var body *ast.BlockStmt
- var functype *ast.FuncType
- switch n := fn.syntax.(type) {
- case nil:
- return // not a Go source function. (Synthetic, or from object file.)
- case *ast.FuncDecl:
- functype = n.Type
- recvField = n.Recv
- body = n.Body
- case *ast.FuncLit:
- functype = n.Type
- body = n.Body
- default:
- panic(n)
- }
-
- if body == nil {
- // External function.
- if fn.Params == nil {
- // This condition ensures we add a non-empty
- // params list once only, but we may attempt
- // the degenerate empty case repeatedly.
- // TODO(adonovan): opt: don't do that.
-
- // We set Function.Params even though there is no body
- // code to reference them. This simplifies clients.
- if recv := fn.Signature.Recv(); recv != nil {
- fn.addParamObj(recv)
- }
- params := fn.Signature.Params()
- for i, n := 0, params.Len(); i < n; i++ {
- fn.addParamObj(params.At(i))
- }
- }
- return
- }
- if fn.Prog.mode&LogSource != 0 {
- defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))()
- }
- fn.startBody()
- fn.createSyntacticParams(recvField, functype)
- b.stmt(fn, body)
- if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) {
- // Control fell off the end of the function's body block.
- //
- // Block optimizations eliminate the current block, if
- // unreachable. It is a builder invariant that
- // if this no-arg return is ill-typed for
- // fn.Signature.Results, this block must be
- // unreachable. The sanity checker checks this.
- fn.emit(new(RunDefers))
- fn.emit(new(Return))
- }
- fn.finishBody()
-}
-
-// buildFuncDecl builds SSA code for the function or method declared
-// by decl in package pkg.
-//
-func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) {
- id := decl.Name
- if isBlankIdent(id) {
- return // discard
- }
- fn := pkg.values[pkg.info.Defs[id]].(*Function)
- if decl.Recv == nil && id.Name == "init" {
- var v Call
- v.Call.Value = fn
- v.setType(types.NewTuple())
- pkg.init.emit(&v)
- }
- b.buildFunction(fn)
-}
-
-// Build calls Package.Build for each package in prog.
-// Building occurs in parallel unless the BuildSerially mode flag was set.
-//
-// Build is intended for whole-program analysis; a typical compiler
-// need only build a single package.
-//
-// Build is idempotent and thread-safe.
-//
-func (prog *Program) Build() {
- var wg sync.WaitGroup
- for _, p := range prog.packages {
- if prog.mode&BuildSerially != 0 {
- p.Build()
- } else {
- wg.Add(1)
- go func(p *Package) {
- p.Build()
- wg.Done()
- }(p)
- }
- }
- wg.Wait()
-}
-
-// Build builds SSA code for all functions and vars in package p.
-//
-// Precondition: CreatePackage must have been called for all of p's
-// direct imports (and hence its direct imports must have been
-// error-free).
-//
-// Build is idempotent and thread-safe.
-//
-func (p *Package) Build() { p.buildOnce.Do(p.build) }
-
-func (p *Package) build() {
- if p.info == nil {
- return // synthetic package, e.g. "testmain"
- }
-
- // Ensure we have runtime type info for all exported members.
- // TODO(adonovan): ideally belongs in memberFromObject, but
- // that would require package creation in topological order.
- for name, mem := range p.Members {
- if ast.IsExported(name) {
- p.Prog.needMethodsOf(mem.Type())
- }
- }
- if p.Prog.mode&LogSource != 0 {
- defer logStack("build %s", p)()
- }
- init := p.init
- init.startBody()
-
- var done *BasicBlock
-
- if p.Prog.mode&BareInits == 0 {
- // Make init() skip if package is already initialized.
- initguard := p.Var("init$guard")
- doinit := init.newBasicBlock("init.start")
- done = init.newBasicBlock("init.done")
- emitIf(init, emitLoad(init, initguard), done, doinit)
- init.currentBlock = doinit
- emitStore(init, initguard, vTrue, token.NoPos)
-
- // Call the init() function of each package we import.
- for _, pkg := range p.Pkg.Imports() {
- prereq := p.Prog.packages[pkg]
- if prereq == nil {
- panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path()))
- }
- var v Call
- v.Call.Value = prereq.init
- v.Call.pos = init.pos
- v.setType(types.NewTuple())
- init.emit(&v)
- }
- }
-
- var b builder
-
- // Initialize package-level vars in correct order.
- for _, varinit := range p.info.InitOrder {
- if init.Prog.mode&LogSource != 0 {
- fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n",
- varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos()))
- }
- if len(varinit.Lhs) == 1 {
- // 1:1 initialization: var x, y = a(), b()
- var lval lvalue
- if v := varinit.Lhs[0]; v.Name() != "_" {
- lval = &address{addr: p.values[v].(*Global), pos: v.Pos()}
- } else {
- lval = blank{}
- }
- b.assign(init, lval, varinit.Rhs, true, nil)
- } else {
- // n:1 initialization: var x, y := f()
- tuple := b.exprN(init, varinit.Rhs)
- for i, v := range varinit.Lhs {
- if v.Name() == "_" {
- continue
- }
- emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos())
- }
- }
- }
-
- // Build all package-level functions, init functions
- // and methods, including unreachable/blank ones.
- // We build them in source order, but it's not significant.
- for _, file := range p.files {
- for _, decl := range file.Decls {
- if decl, ok := decl.(*ast.FuncDecl); ok {
- b.buildFuncDecl(p, decl)
- }
- }
- }
-
- // Finish up init().
- if p.Prog.mode&BareInits == 0 {
- emitJump(init, done)
- init.currentBlock = done
- }
- init.emit(new(Return))
- init.finishBody()
-
- p.info = nil // We no longer need ASTs or go/types deductions.
-
- if p.Prog.mode&SanityCheckFunctions != 0 {
- sanityCheckPackage(p)
- }
-}
-
-// Like ObjectOf, but panics instead of returning nil.
-// Only valid during p's create and build phases.
-func (p *Package) objectOf(id *ast.Ident) types.Object {
- if o := p.info.ObjectOf(id); o != nil {
- return o
- }
- panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s",
- id.Name, p.Prog.Fset.Position(id.Pos())))
-}
-
-// Like TypeOf, but panics instead of returning nil.
-// Only valid during p's create and build phases.
-func (p *Package) typeOf(e ast.Expr) types.Type {
- if T := p.info.TypeOf(e); T != nil {
- return T
- }
- panic(fmt.Sprintf("no type for %T @ %s",
- e, p.Prog.Fset.Position(e.Pos())))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/const.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/const.go
deleted file mode 100644
index 2870eea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/const.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the Const SSA value type.
-
-import (
- "fmt"
- exact "go/constant"
- "go/token"
- "go/types"
- "strconv"
-)
-
-// NewConst returns a new constant of the specified value and type.
-// val must be valid according to the specification of Const.Value.
-//
-func NewConst(val exact.Value, typ types.Type) *Const {
- return &Const{typ, val}
-}
-
-// intConst returns an 'int' constant that evaluates to i.
-// (i is an int64 in case the host is narrower than the target.)
-func intConst(i int64) *Const {
- return NewConst(exact.MakeInt64(i), tInt)
-}
-
-// nilConst returns a nil constant of the specified type, which may
-// be any reference type, including interfaces.
-//
-func nilConst(typ types.Type) *Const {
- return NewConst(nil, typ)
-}
-
-// stringConst returns a 'string' constant that evaluates to s.
-func stringConst(s string) *Const {
- return NewConst(exact.MakeString(s), tString)
-}
-
-// zeroConst returns a new "zero" constant of the specified type,
-// which must not be an array or struct type: the zero values of
-// aggregates are well-defined but cannot be represented by Const.
-//
-func zeroConst(t types.Type) *Const {
- switch t := t.(type) {
- case *types.Basic:
- switch {
- case t.Info()&types.IsBoolean != 0:
- return NewConst(exact.MakeBool(false), t)
- case t.Info()&types.IsNumeric != 0:
- return NewConst(exact.MakeInt64(0), t)
- case t.Info()&types.IsString != 0:
- return NewConst(exact.MakeString(""), t)
- case t.Kind() == types.UnsafePointer:
- fallthrough
- case t.Kind() == types.UntypedNil:
- return nilConst(t)
- default:
- panic(fmt.Sprint("zeroConst for unexpected type:", t))
- }
- case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature:
- return nilConst(t)
- case *types.Named:
- return NewConst(zeroConst(t.Underlying()).Value, t)
- case *types.Array, *types.Struct, *types.Tuple:
- panic(fmt.Sprint("zeroConst applied to aggregate:", t))
- }
- panic(fmt.Sprint("zeroConst: unexpected ", t))
-}
-
-func (c *Const) RelString(from *types.Package) string {
- var s string
- if c.Value == nil {
- s = "nil"
- } else if c.Value.Kind() == exact.String {
- s = exact.StringVal(c.Value)
- const max = 20
- // TODO(adonovan): don't cut a rune in half.
- if len(s) > max {
- s = s[:max-3] + "..." // abbreviate
- }
- s = strconv.Quote(s)
- } else {
- s = c.Value.String()
- }
- return s + ":" + relType(c.Type(), from)
-}
-
-func (c *Const) Name() string {
- return c.RelString(nil)
-}
-
-func (c *Const) String() string {
- return c.Name()
-}
-
-func (c *Const) Type() types.Type {
- return c.typ
-}
-
-func (c *Const) Referrers() *[]Instruction {
- return nil
-}
-
-func (c *Const) Parent() *Function { return nil }
-
-func (c *Const) Pos() token.Pos {
- return token.NoPos
-}
-
-// IsNil returns true if this constant represents a typed or untyped nil value.
-func (c *Const) IsNil() bool {
- return c.Value == nil
-}
-
-// TODO(adonovan): move everything below into golang.org/x/tools/go/ssa/interp.
-
-// Int64 returns the numeric value of this constant truncated to fit
-// a signed 64-bit integer.
-//
-func (c *Const) Int64() int64 {
- switch x := exact.ToInt(c.Value); x.Kind() {
- case exact.Int:
- if i, ok := exact.Int64Val(x); ok {
- return i
- }
- return 0
- case exact.Float:
- f, _ := exact.Float64Val(x)
- return int64(f)
- }
- panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Uint64 returns the numeric value of this constant truncated to fit
-// an unsigned 64-bit integer.
-//
-func (c *Const) Uint64() uint64 {
- switch x := exact.ToInt(c.Value); x.Kind() {
- case exact.Int:
- if u, ok := exact.Uint64Val(x); ok {
- return u
- }
- return 0
- case exact.Float:
- f, _ := exact.Float64Val(x)
- return uint64(f)
- }
- panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Float64 returns the numeric value of this constant truncated to fit
-// a float64.
-//
-func (c *Const) Float64() float64 {
- f, _ := exact.Float64Val(c.Value)
- return f
-}
-
-// Complex128 returns the complex value of this constant truncated to
-// fit a complex128.
-//
-func (c *Const) Complex128() complex128 {
- re, _ := exact.Float64Val(exact.Real(c.Value))
- im, _ := exact.Float64Val(exact.Imag(c.Value))
- return complex(re, im)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/create.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/create.go
deleted file mode 100644
index 69ac12b1b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/create.go
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the CREATE phase of SSA construction.
-// See builder.go for explanation.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "os"
- "sync"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// NewProgram returns a new SSA Program.
-//
-// mode controls diagnostics and checking during SSA construction.
-//
-func NewProgram(fset *token.FileSet, mode BuilderMode) *Program {
- prog := &Program{
- Fset: fset,
- imported: make(map[string]*Package),
- packages: make(map[*types.Package]*Package),
- thunks: make(map[selectionKey]*Function),
- bounds: make(map[*types.Func]*Function),
- mode: mode,
- }
-
- h := typeutil.MakeHasher() // protected by methodsMu, in effect
- prog.methodSets.SetHasher(h)
- prog.canon.SetHasher(h)
-
- return prog
-}
-
-// memberFromObject populates package pkg with a member for the
-// typechecker object obj.
-//
-// For objects from Go source code, syntax is the associated syntax
-// tree (for funcs and vars only); it will be used during the build
-// phase.
-//
-func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
- name := obj.Name()
- switch obj := obj.(type) {
- case *types.Builtin:
- if pkg.Pkg != types.Unsafe {
- panic("unexpected builtin object: " + obj.String())
- }
-
- case *types.TypeName:
- pkg.Members[name] = &Type{
- object: obj,
- pkg: pkg,
- }
-
- case *types.Const:
- c := &NamedConst{
- object: obj,
- Value: NewConst(obj.Val(), obj.Type()),
- pkg: pkg,
- }
- pkg.values[obj] = c.Value
- pkg.Members[name] = c
-
- case *types.Var:
- g := &Global{
- Pkg: pkg,
- name: name,
- object: obj,
- typ: types.NewPointer(obj.Type()), // address
- pos: obj.Pos(),
- }
- pkg.values[obj] = g
- pkg.Members[name] = g
-
- case *types.Func:
- sig := obj.Type().(*types.Signature)
- if sig.Recv() == nil && name == "init" {
- pkg.ninit++
- name = fmt.Sprintf("init#%d", pkg.ninit)
- }
- fn := &Function{
- name: name,
- object: obj,
- Signature: sig,
- syntax: syntax,
- pos: obj.Pos(),
- Pkg: pkg,
- Prog: pkg.Prog,
- }
- if syntax == nil {
- fn.Synthetic = "loaded from gc object file"
- }
-
- pkg.values[obj] = fn
- if sig.Recv() == nil {
- pkg.Members[name] = fn // package-level function
- }
-
- default: // (incl. *types.Package)
- panic("unexpected Object type: " + obj.String())
- }
-}
-
-// membersFromDecl populates package pkg with members for each
-// typechecker object (var, func, const or type) associated with the
-// specified decl.
-//
-func membersFromDecl(pkg *Package, decl ast.Decl) {
- switch decl := decl.(type) {
- case *ast.GenDecl: // import, const, type or var
- switch decl.Tok {
- case token.CONST:
- for _, spec := range decl.Specs {
- for _, id := range spec.(*ast.ValueSpec).Names {
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], nil)
- }
- }
- }
-
- case token.VAR:
- for _, spec := range decl.Specs {
- for _, id := range spec.(*ast.ValueSpec).Names {
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], spec)
- }
- }
- }
-
- case token.TYPE:
- for _, spec := range decl.Specs {
- id := spec.(*ast.TypeSpec).Name
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], nil)
- }
- }
- }
-
- case *ast.FuncDecl:
- id := decl.Name
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], decl)
- }
- }
-}
-
-// CreatePackage constructs and returns an SSA Package from the
-// specified type-checked, error-free file ASTs, and populates its
-// Members mapping.
-//
-// importable determines whether this package should be returned by a
-// subsequent call to ImportedPackage(pkg.Path()).
-//
-// The real work of building SSA form for each function is not done
-// until a subsequent call to Package.Build().
-//
-func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package {
- p := &Package{
- Prog: prog,
- Members: make(map[string]Member),
- values: make(map[types.Object]Value),
- Pkg: pkg,
- info: info, // transient (CREATE and BUILD phases)
- files: files, // transient (CREATE and BUILD phases)
- }
-
- // Add init() function.
- p.init = &Function{
- name: "init",
- Signature: new(types.Signature),
- Synthetic: "package initializer",
- Pkg: p,
- Prog: prog,
- }
- p.Members[p.init.name] = p.init
-
- // CREATE phase.
- // Allocate all package members: vars, funcs, consts and types.
- if len(files) > 0 {
- // Go source package.
- for _, file := range files {
- for _, decl := range file.Decls {
- membersFromDecl(p, decl)
- }
- }
- } else {
- // GC-compiled binary package (or "unsafe")
- // No code.
- // No position information.
- scope := p.Pkg.Scope()
- for _, name := range scope.Names() {
- obj := scope.Lookup(name)
- memberFromObject(p, obj, nil)
- if obj, ok := obj.(*types.TypeName); ok {
- if named, ok := obj.Type().(*types.Named); ok {
- for i, n := 0, named.NumMethods(); i < n; i++ {
- memberFromObject(p, named.Method(i), nil)
- }
- }
- }
- }
- }
-
- if prog.mode&BareInits == 0 {
- // Add initializer guard variable.
- initguard := &Global{
- Pkg: p,
- name: "init$guard",
- typ: types.NewPointer(tBool),
- }
- p.Members[initguard.Name()] = initguard
- }
-
- if prog.mode&GlobalDebug != 0 {
- p.SetDebugMode(true)
- }
-
- if prog.mode&PrintPackages != 0 {
- printMu.Lock()
- p.WriteTo(os.Stdout)
- printMu.Unlock()
- }
-
- if importable {
- prog.imported[p.Pkg.Path()] = p
- }
- prog.packages[p.Pkg] = p
-
- return p
-}
-
-// printMu serializes printing of Packages/Functions to stdout.
-var printMu sync.Mutex
-
-// AllPackages returns a new slice containing all packages in the
-// program prog in unspecified order.
-//
-func (prog *Program) AllPackages() []*Package {
- pkgs := make([]*Package, 0, len(prog.packages))
- for _, pkg := range prog.packages {
- pkgs = append(pkgs, pkg)
- }
- return pkgs
-}
-
-// ImportedPackage returns the importable SSA Package whose import
-// path is path, or nil if no such SSA package has been created.
-//
-// Not all packages are importable. For example, no import
-// declaration can resolve to the x_test package created by 'go test'
-// or the ad-hoc main package created 'go build foo.go'.
-//
-func (prog *Program) ImportedPackage(path string) *Package {
- return prog.imported[path]
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/doc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/doc.go
deleted file mode 100644
index 2aa04f436..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/doc.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ssa defines a representation of the elements of Go programs
-// (packages, types, functions, variables and constants) using a
-// static single-assignment (SSA) form intermediate representation
-// (IR) for the bodies of functions.
-//
-// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
-//
-// For an introduction to SSA form, see
-// http://en.wikipedia.org/wiki/Static_single_assignment_form.
-// This page provides a broader reading list:
-// http://www.dcs.gla.ac.uk/~jsinger/ssa.html.
-//
-// The level of abstraction of the SSA form is intentionally close to
-// the source language to facilitate construction of source analysis
-// tools. It is not intended for machine code generation.
-//
-// All looping, branching and switching constructs are replaced with
-// unstructured control flow. Higher-level control flow constructs
-// such as multi-way branch can be reconstructed as needed; see
-// ssautil.Switches() for an example.
-//
-// To construct an SSA-form program, call ssautil.CreateProgram on a
-// loader.Program, a set of type-checked packages created from
-// parsed Go source files. The resulting ssa.Program contains all the
-// packages and their members, but SSA code is not created for
-// function bodies until a subsequent call to (*Package).Build.
-//
-// The builder initially builds a naive SSA form in which all local
-// variables are addresses of stack locations with explicit loads and
-// stores. Registerisation of eligible locals and φ-node insertion
-// using dominance and dataflow are then performed as a second pass
-// called "lifting" to improve the accuracy and performance of
-// subsequent analyses; this pass can be skipped by setting the
-// NaiveForm builder flag.
-//
-// The primary interfaces of this package are:
-//
-// - Member: a named member of a Go package.
-// - Value: an expression that yields a value.
-// - Instruction: a statement that consumes values and performs computation.
-// - Node: a Value or Instruction (emphasizing its membership in the SSA value graph)
-//
-// A computation that yields a result implements both the Value and
-// Instruction interfaces. The following table shows for each
-// concrete type which of these interfaces it implements.
-//
-// Value? Instruction? Member?
-// *Alloc ✔ ✔
-// *BinOp ✔ ✔
-// *Builtin ✔
-// *Call ✔ ✔
-// *ChangeInterface ✔ ✔
-// *ChangeType ✔ ✔
-// *Const ✔
-// *Convert ✔ ✔
-// *DebugRef ✔
-// *Defer ✔
-// *Extract ✔ ✔
-// *Field ✔ ✔
-// *FieldAddr ✔ ✔
-// *FreeVar ✔
-// *Function ✔ ✔ (func)
-// *Global ✔ ✔ (var)
-// *Go ✔
-// *If ✔
-// *Index ✔ ✔
-// *IndexAddr ✔ ✔
-// *Jump ✔
-// *Lookup ✔ ✔
-// *MakeChan ✔ ✔
-// *MakeClosure ✔ ✔
-// *MakeInterface ✔ ✔
-// *MakeMap ✔ ✔
-// *MakeSlice ✔ ✔
-// *MapUpdate ✔
-// *NamedConst ✔ (const)
-// *Next ✔ ✔
-// *Panic ✔
-// *Parameter ✔
-// *Phi ✔ ✔
-// *Range ✔ ✔
-// *Return ✔
-// *RunDefers ✔
-// *Select ✔ ✔
-// *Send ✔
-// *Slice ✔ ✔
-// *Store ✔
-// *Type ✔ (type)
-// *TypeAssert ✔ ✔
-// *UnOp ✔ ✔
-//
-// Other key types in this package include: Program, Package, Function
-// and BasicBlock.
-//
-// The program representation constructed by this package is fully
-// resolved internally, i.e. it does not rely on the names of Values,
-// Packages, Functions, Types or BasicBlocks for the correct
-// interpretation of the program. Only the identities of objects and
-// the topology of the SSA and type graphs are semantically
-// significant. (There is one exception: Ids, used to identify field
-// and method names, contain strings.) Avoidance of name-based
-// operations simplifies the implementation of subsequent passes and
-// can make them very efficient. Many objects are nonetheless named
-// to aid in debugging, but it is not essential that the names be
-// either accurate or unambiguous. The public API exposes a number of
-// name-based maps for client convenience.
-//
-// The ssa/ssautil package provides various utilities that depend only
-// on the public API of this package.
-//
-// TODO(adonovan): Consider the exceptional control-flow implications
-// of defer and recover().
-//
-// TODO(adonovan): write a how-to document for all the various cases
-// of trying to determine corresponding elements across the four
-// domains of source locations, ast.Nodes, types.Objects,
-// ssa.Values/Instructions.
-//
-package ssa // import "golang.org/x/tools/go/ssa"
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/dom.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/dom.go
deleted file mode 100644
index 12ef4308f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/dom.go
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines algorithms related to dominance.
-
-// Dominator tree construction ----------------------------------------
-//
-// We use the algorithm described in Lengauer & Tarjan. 1979. A fast
-// algorithm for finding dominators in a flowgraph.
-// http://doi.acm.org/10.1145/357062.357071
-//
-// We also apply the optimizations to SLT described in Georgiadis et
-// al, Finding Dominators in Practice, JGAA 2006,
-// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf
-// to avoid the need for buckets of size > 1.
-
-import (
- "bytes"
- "fmt"
- "math/big"
- "os"
- "sort"
-)
-
-// Idom returns the block that immediately dominates b:
-// its parent in the dominator tree, if any.
-// Neither the entry node (b.Index==0) nor recover node
-// (b==b.Parent().Recover()) have a parent.
-//
-func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom }
-
-// Dominees returns the list of blocks that b immediately dominates:
-// its children in the dominator tree.
-//
-func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children }
-
-// Dominates reports whether b dominates c.
-func (b *BasicBlock) Dominates(c *BasicBlock) bool {
- return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post
-}
-
-type byDomPreorder []*BasicBlock
-
-func (a byDomPreorder) Len() int { return len(a) }
-func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre }
-
-// DomPreorder returns a new slice containing the blocks of f in
-// dominator tree preorder.
-//
-func (f *Function) DomPreorder() []*BasicBlock {
- n := len(f.Blocks)
- order := make(byDomPreorder, n, n)
- copy(order, f.Blocks)
- sort.Sort(order)
- return order
-}
-
-// domInfo contains a BasicBlock's dominance information.
-type domInfo struct {
- idom *BasicBlock // immediate dominator (parent in domtree)
- children []*BasicBlock // nodes immediately dominated by this one
- pre, post int32 // pre- and post-order numbering within domtree
-}
-
-// ltState holds the working state for Lengauer-Tarjan algorithm
-// (during which domInfo.pre is repurposed for CFG DFS preorder number).
-type ltState struct {
- // Each slice is indexed by b.Index.
- sdom []*BasicBlock // b's semidominator
- parent []*BasicBlock // b's parent in DFS traversal of CFG
- ancestor []*BasicBlock // b's ancestor with least sdom
-}
-
-// dfs implements the depth-first search part of the LT algorithm.
-func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 {
- preorder[i] = v
- v.dom.pre = i // For now: DFS preorder of spanning tree of CFG
- i++
- lt.sdom[v.Index] = v
- lt.link(nil, v)
- for _, w := range v.Succs {
- if lt.sdom[w.Index] == nil {
- lt.parent[w.Index] = v
- i = lt.dfs(w, i, preorder)
- }
- }
- return i
-}
-
-// eval implements the EVAL part of the LT algorithm.
-func (lt *ltState) eval(v *BasicBlock) *BasicBlock {
- // TODO(adonovan): opt: do path compression per simple LT.
- u := v
- for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] {
- if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre {
- u = v
- }
- }
- return u
-}
-
-// link implements the LINK part of the LT algorithm.
-func (lt *ltState) link(v, w *BasicBlock) {
- lt.ancestor[w.Index] = v
-}
-
-// buildDomTree computes the dominator tree of f using the LT algorithm.
-// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run).
-//
-func buildDomTree(f *Function) {
- // The step numbers refer to the original LT paper; the
- // reordering is due to Georgiadis.
-
- // Clear any previous domInfo.
- for _, b := range f.Blocks {
- b.dom = domInfo{}
- }
-
- n := len(f.Blocks)
- // Allocate space for 5 contiguous [n]*BasicBlock arrays:
- // sdom, parent, ancestor, preorder, buckets.
- space := make([]*BasicBlock, 5*n, 5*n)
- lt := ltState{
- sdom: space[0:n],
- parent: space[n : 2*n],
- ancestor: space[2*n : 3*n],
- }
-
- // Step 1. Number vertices by depth-first preorder.
- preorder := space[3*n : 4*n]
- root := f.Blocks[0]
- prenum := lt.dfs(root, 0, preorder)
- recover := f.Recover
- if recover != nil {
- lt.dfs(recover, prenum, preorder)
- }
-
- buckets := space[4*n : 5*n]
- copy(buckets, preorder)
-
- // In reverse preorder...
- for i := int32(n) - 1; i > 0; i-- {
- w := preorder[i]
-
- // Step 3. Implicitly define the immediate dominator of each node.
- for v := buckets[i]; v != w; v = buckets[v.dom.pre] {
- u := lt.eval(v)
- if lt.sdom[u.Index].dom.pre < i {
- v.dom.idom = u
- } else {
- v.dom.idom = w
- }
- }
-
- // Step 2. Compute the semidominators of all nodes.
- lt.sdom[w.Index] = lt.parent[w.Index]
- for _, v := range w.Preds {
- u := lt.eval(v)
- if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre {
- lt.sdom[w.Index] = lt.sdom[u.Index]
- }
- }
-
- lt.link(lt.parent[w.Index], w)
-
- if lt.parent[w.Index] == lt.sdom[w.Index] {
- w.dom.idom = lt.parent[w.Index]
- } else {
- buckets[i] = buckets[lt.sdom[w.Index].dom.pre]
- buckets[lt.sdom[w.Index].dom.pre] = w
- }
- }
-
- // The final 'Step 3' is now outside the loop.
- for v := buckets[0]; v != root; v = buckets[v.dom.pre] {
- v.dom.idom = root
- }
-
- // Step 4. Explicitly define the immediate dominator of each
- // node, in preorder.
- for _, w := range preorder[1:] {
- if w == root || w == recover {
- w.dom.idom = nil
- } else {
- if w.dom.idom != lt.sdom[w.Index] {
- w.dom.idom = w.dom.idom.dom.idom
- }
- // Calculate Children relation as inverse of Idom.
- w.dom.idom.dom.children = append(w.dom.idom.dom.children, w)
- }
- }
-
- pre, post := numberDomTree(root, 0, 0)
- if recover != nil {
- numberDomTree(recover, pre, post)
- }
-
- // printDomTreeDot(os.Stderr, f) // debugging
- // printDomTreeText(os.Stderr, root, 0) // debugging
-
- if f.Prog.mode&SanityCheckFunctions != 0 {
- sanityCheckDomTree(f)
- }
-}
-
-// numberDomTree sets the pre- and post-order numbers of a depth-first
-// traversal of the dominator tree rooted at v. These are used to
-// answer dominance queries in constant time.
-//
-func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) {
- v.dom.pre = pre
- pre++
- for _, child := range v.dom.children {
- pre, post = numberDomTree(child, pre, post)
- }
- v.dom.post = post
- post++
- return pre, post
-}
-
-// Testing utilities ----------------------------------------
-
-// sanityCheckDomTree checks the correctness of the dominator tree
-// computed by the LT algorithm by comparing against the dominance
-// relation computed by a naive Kildall-style forward dataflow
-// analysis (Algorithm 10.16 from the "Dragon" book).
-//
-func sanityCheckDomTree(f *Function) {
- n := len(f.Blocks)
-
- // D[i] is the set of blocks that dominate f.Blocks[i],
- // represented as a bit-set of block indices.
- D := make([]big.Int, n)
-
- one := big.NewInt(1)
-
- // all is the set of all blocks; constant.
- var all big.Int
- all.Set(one).Lsh(&all, uint(n)).Sub(&all, one)
-
- // Initialization.
- for i, b := range f.Blocks {
- if i == 0 || b == f.Recover {
- // A root is dominated only by itself.
- D[i].SetBit(&D[0], 0, 1)
- } else {
- // All other blocks are (initially) dominated
- // by every block.
- D[i].Set(&all)
- }
- }
-
- // Iteration until fixed point.
- for changed := true; changed; {
- changed = false
- for i, b := range f.Blocks {
- if i == 0 || b == f.Recover {
- continue
- }
- // Compute intersection across predecessors.
- var x big.Int
- x.Set(&all)
- for _, pred := range b.Preds {
- x.And(&x, &D[pred.Index])
- }
- x.SetBit(&x, i, 1) // a block always dominates itself.
- if D[i].Cmp(&x) != 0 {
- D[i].Set(&x)
- changed = true
- }
- }
- }
-
- // Check the entire relation. O(n^2).
- // The Recover block (if any) must be treated specially so we skip it.
- ok := true
- for i := 0; i < n; i++ {
- for j := 0; j < n; j++ {
- b, c := f.Blocks[i], f.Blocks[j]
- if c == f.Recover {
- continue
- }
- actual := b.Dominates(c)
- expected := D[j].Bit(i) == 1
- if actual != expected {
- fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected)
- ok = false
- }
- }
- }
-
- preorder := f.DomPreorder()
- for _, b := range f.Blocks {
- if got := preorder[b.dom.pre]; got != b {
- fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b)
- ok = false
- }
- }
-
- if !ok {
- panic("sanityCheckDomTree failed for " + f.String())
- }
-
-}
-
-// Printing functions ----------------------------------------
-
-// printDomTree prints the dominator tree as text, using indentation.
-func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) {
- fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v)
- for _, child := range v.dom.children {
- printDomTreeText(buf, child, indent+1)
- }
-}
-
-// printDomTreeDot prints the dominator tree of f in AT&T GraphViz
-// (.dot) format.
-func printDomTreeDot(buf *bytes.Buffer, f *Function) {
- fmt.Fprintln(buf, "//", f)
- fmt.Fprintln(buf, "digraph domtree {")
- for i, b := range f.Blocks {
- v := b.dom
- fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post)
- // TODO(adonovan): improve appearance of edges
- // belonging to both dominator tree and CFG.
-
- // Dominator tree edge.
- if i != 0 {
- fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre)
- }
- // CFG edges.
- for _, pred := range b.Preds {
- fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre)
- }
- }
- fmt.Fprintln(buf, "}")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/emit.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/emit.go
deleted file mode 100644
index 1036988ad..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/emit.go
+++ /dev/null
@@ -1,468 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// Helpers for emitting SSA instructions.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
-)
-
-// emitNew emits to f a new (heap Alloc) instruction allocating an
-// object of type typ. pos is the optional source location.
-//
-func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc {
- v := &Alloc{Heap: true}
- v.setType(types.NewPointer(typ))
- v.setPos(pos)
- f.emit(v)
- return v
-}
-
-// emitLoad emits to f an instruction to load the address addr into a
-// new temporary, and returns the value so defined.
-//
-func emitLoad(f *Function, addr Value) *UnOp {
- v := &UnOp{Op: token.MUL, X: addr}
- v.setType(deref(addr.Type()))
- f.emit(v)
- return v
-}
-
-// emitDebugRef emits to f a DebugRef pseudo-instruction associating
-// expression e with value v.
-//
-func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) {
- if !f.debugInfo() {
- return // debugging not enabled
- }
- if v == nil || e == nil {
- panic("nil")
- }
- var obj types.Object
- e = unparen(e)
- if id, ok := e.(*ast.Ident); ok {
- if isBlankIdent(id) {
- return
- }
- obj = f.Pkg.objectOf(id)
- switch obj.(type) {
- case *types.Nil, *types.Const, *types.Builtin:
- return
- }
- }
- f.emit(&DebugRef{
- X: v,
- Expr: e,
- IsAddr: isAddr,
- object: obj,
- })
-}
-
-// emitArith emits to f code to compute the binary operation op(x, y)
-// where op is an eager shift, logical or arithmetic operation.
-// (Use emitCompare() for comparisons and Builder.logicalBinop() for
-// non-eager operations.)
-//
-func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value {
- switch op {
- case token.SHL, token.SHR:
- x = emitConv(f, x, t)
- // y may be signed or an 'untyped' constant.
- // TODO(adonovan): whence signed values?
- if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 {
- y = emitConv(f, y, types.Typ[types.Uint64])
- }
-
- case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
- x = emitConv(f, x, t)
- y = emitConv(f, y, t)
-
- default:
- panic("illegal op in emitArith: " + op.String())
-
- }
- v := &BinOp{
- Op: op,
- X: x,
- Y: y,
- }
- v.setPos(pos)
- v.setType(t)
- return f.emit(v)
-}
-
-// emitCompare emits to f code compute the boolean result of
-// comparison comparison 'x op y'.
-//
-func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value {
- xt := x.Type().Underlying()
- yt := y.Type().Underlying()
-
- // Special case to optimise a tagless SwitchStmt so that
- // these are equivalent
- // switch { case e: ...}
- // switch true { case e: ... }
- // if e==true { ... }
- // even in the case when e's type is an interface.
- // TODO(adonovan): opt: generalise to x==true, false!=y, etc.
- if x == vTrue && op == token.EQL {
- if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 {
- return y
- }
- }
-
- if types.Identical(xt, yt) {
- // no conversion necessary
- } else if _, ok := xt.(*types.Interface); ok {
- y = emitConv(f, y, x.Type())
- } else if _, ok := yt.(*types.Interface); ok {
- x = emitConv(f, x, y.Type())
- } else if _, ok := x.(*Const); ok {
- x = emitConv(f, x, y.Type())
- } else if _, ok := y.(*Const); ok {
- y = emitConv(f, y, x.Type())
- } else {
- // other cases, e.g. channels. No-op.
- }
-
- v := &BinOp{
- Op: op,
- X: x,
- Y: y,
- }
- v.setPos(pos)
- v.setType(tBool)
- return f.emit(v)
-}
-
-// isValuePreserving returns true if a conversion from ut_src to
-// ut_dst is value-preserving, i.e. just a change of type.
-// Precondition: neither argument is a named type.
-//
-func isValuePreserving(ut_src, ut_dst types.Type) bool {
- // Identical underlying types?
- if structTypesIdentical(ut_dst, ut_src) {
- return true
- }
-
- switch ut_dst.(type) {
- case *types.Chan:
- // Conversion between channel types?
- _, ok := ut_src.(*types.Chan)
- return ok
-
- case *types.Pointer:
- // Conversion between pointers with identical base types?
- _, ok := ut_src.(*types.Pointer)
- return ok
- }
- return false
-}
-
-// emitConv emits to f code to convert Value val to exactly type typ,
-// and returns the converted value. Implicit conversions are required
-// by language assignability rules in assignments, parameter passing,
-// etc. Conversions cannot fail dynamically.
-//
-func emitConv(f *Function, val Value, typ types.Type) Value {
- t_src := val.Type()
-
- // Identical types? Conversion is a no-op.
- if types.Identical(t_src, typ) {
- return val
- }
-
- ut_dst := typ.Underlying()
- ut_src := t_src.Underlying()
-
- // Just a change of type, but not value or representation?
- if isValuePreserving(ut_src, ut_dst) {
- c := &ChangeType{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- // Conversion to, or construction of a value of, an interface type?
- if _, ok := ut_dst.(*types.Interface); ok {
- // Assignment from one interface type to another?
- if _, ok := ut_src.(*types.Interface); ok {
- c := &ChangeInterface{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- // Untyped nil constant? Return interface-typed nil constant.
- if ut_src == tUntypedNil {
- return nilConst(typ)
- }
-
- // Convert (non-nil) "untyped" literals to their default type.
- if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 {
- val = emitConv(f, val, DefaultType(ut_src))
- }
-
- f.Pkg.Prog.needMethodsOf(val.Type())
- mi := &MakeInterface{X: val}
- mi.setType(typ)
- return f.emit(mi)
- }
-
- // Conversion of a compile-time constant value?
- if c, ok := val.(*Const); ok {
- if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() {
- // Conversion of a compile-time constant to
- // another constant type results in a new
- // constant of the destination type and
- // (initially) the same abstract value.
- // We don't truncate the value yet.
- return NewConst(c.Value, typ)
- }
-
- // We're converting from constant to non-constant type,
- // e.g. string -> []byte/[]rune.
- }
-
- // A representation-changing conversion?
- // At least one of {ut_src,ut_dst} must be *Basic.
- // (The other may be []byte or []rune.)
- _, ok1 := ut_src.(*types.Basic)
- _, ok2 := ut_dst.(*types.Basic)
- if ok1 || ok2 {
- c := &Convert{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ))
-}
-
-// emitStore emits to f an instruction to store value val at location
-// addr, applying implicit conversions as required by assignability rules.
-//
-func emitStore(f *Function, addr, val Value, pos token.Pos) *Store {
- s := &Store{
- Addr: addr,
- Val: emitConv(f, val, deref(addr.Type())),
- pos: pos,
- }
- f.emit(s)
- return s
-}
-
-// emitJump emits to f a jump to target, and updates the control-flow graph.
-// Postcondition: f.currentBlock is nil.
-//
-func emitJump(f *Function, target *BasicBlock) {
- b := f.currentBlock
- b.emit(new(Jump))
- addEdge(b, target)
- f.currentBlock = nil
-}
-
-// emitIf emits to f a conditional jump to tblock or fblock based on
-// cond, and updates the control-flow graph.
-// Postcondition: f.currentBlock is nil.
-//
-func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) {
- b := f.currentBlock
- b.emit(&If{Cond: cond})
- addEdge(b, tblock)
- addEdge(b, fblock)
- f.currentBlock = nil
-}
-
-// emitExtract emits to f an instruction to extract the index'th
-// component of tuple. It returns the extracted value.
-//
-func emitExtract(f *Function, tuple Value, index int) Value {
- e := &Extract{Tuple: tuple, Index: index}
- e.setType(tuple.Type().(*types.Tuple).At(index).Type())
- return f.emit(e)
-}
-
-// emitTypeAssert emits to f a type assertion value := x.(t) and
-// returns the value. x.Type() must be an interface.
-//
-func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value {
- a := &TypeAssert{X: x, AssertedType: t}
- a.setPos(pos)
- a.setType(t)
- return f.emit(a)
-}
-
-// emitTypeTest emits to f a type test value,ok := x.(t) and returns
-// a (value, ok) tuple. x.Type() must be an interface.
-//
-func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value {
- a := &TypeAssert{
- X: x,
- AssertedType: t,
- CommaOk: true,
- }
- a.setPos(pos)
- a.setType(types.NewTuple(
- newVar("value", t),
- varOk,
- ))
- return f.emit(a)
-}
-
-// emitTailCall emits to f a function call in tail position. The
-// caller is responsible for all fields of 'call' except its type.
-// Intended for wrapper methods.
-// Precondition: f does/will not use deferred procedure calls.
-// Postcondition: f.currentBlock is nil.
-//
-func emitTailCall(f *Function, call *Call) {
- tresults := f.Signature.Results()
- nr := tresults.Len()
- if nr == 1 {
- call.typ = tresults.At(0).Type()
- } else {
- call.typ = tresults
- }
- tuple := f.emit(call)
- var ret Return
- switch nr {
- case 0:
- // no-op
- case 1:
- ret.Results = []Value{tuple}
- default:
- for i := 0; i < nr; i++ {
- v := emitExtract(f, tuple, i)
- // TODO(adonovan): in principle, this is required:
- // v = emitConv(f, o.Type, f.Signature.Results[i].Type)
- // but in practice emitTailCall is only used when
- // the types exactly match.
- ret.Results = append(ret.Results, v)
- }
- }
- f.emit(&ret)
- f.currentBlock = nil
-}
-
-// emitImplicitSelections emits to f code to apply the sequence of
-// implicit field selections specified by indices to base value v, and
-// returns the selected value.
-//
-// If v is the address of a struct, the result will be the address of
-// a field; if it is the value of a struct, the result will be the
-// value of a field.
-//
-func emitImplicitSelections(f *Function, v Value, indices []int) Value {
- for _, index := range indices {
- fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
-
- if isPointer(v.Type()) {
- instr := &FieldAddr{
- X: v,
- Field: index,
- }
- instr.setType(types.NewPointer(fld.Type()))
- v = f.emit(instr)
- // Load the field's value iff indirectly embedded.
- if isPointer(fld.Type()) {
- v = emitLoad(f, v)
- }
- } else {
- instr := &Field{
- X: v,
- Field: index,
- }
- instr.setType(fld.Type())
- v = f.emit(instr)
- }
- }
- return v
-}
-
-// emitFieldSelection emits to f code to select the index'th field of v.
-//
-// If wantAddr, the input must be a pointer-to-struct and the result
-// will be the field's address; otherwise the result will be the
-// field's value.
-// Ident id is used for position and debug info.
-//
-func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value {
- fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
- if isPointer(v.Type()) {
- instr := &FieldAddr{
- X: v,
- Field: index,
- }
- instr.setPos(id.Pos())
- instr.setType(types.NewPointer(fld.Type()))
- v = f.emit(instr)
- // Load the field's value iff we don't want its address.
- if !wantAddr {
- v = emitLoad(f, v)
- }
- } else {
- instr := &Field{
- X: v,
- Field: index,
- }
- instr.setPos(id.Pos())
- instr.setType(fld.Type())
- v = f.emit(instr)
- }
- emitDebugRef(f, id, v, wantAddr)
- return v
-}
-
-// zeroValue emits to f code to produce a zero value of type t,
-// and returns it.
-//
-func zeroValue(f *Function, t types.Type) Value {
- switch t.Underlying().(type) {
- case *types.Struct, *types.Array:
- return emitLoad(f, f.addLocal(t, token.NoPos))
- default:
- return zeroConst(t)
- }
-}
-
-// createRecoverBlock emits to f a block of code to return after a
-// recovered panic, and sets f.Recover to it.
-//
-// If f's result parameters are named, the code loads and returns
-// their current values, otherwise it returns the zero values of their
-// type.
-//
-// Idempotent.
-//
-func createRecoverBlock(f *Function) {
- if f.Recover != nil {
- return // already created
- }
- saved := f.currentBlock
-
- f.Recover = f.newBasicBlock("recover")
- f.currentBlock = f.Recover
-
- var results []Value
- if f.namedResults != nil {
- // Reload NRPs to form value tuple.
- for _, r := range f.namedResults {
- results = append(results, emitLoad(f, r))
- }
- } else {
- R := f.Signature.Results()
- for i, n := 0, R.Len(); i < n; i++ {
- T := R.At(i).Type()
-
- // Return zero value of each result type.
- results = append(results, zeroValue(f, T))
- }
- }
- f.emit(&Return{Results: results})
-
- f.currentBlock = saved
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/func.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/func.go
deleted file mode 100644
index b21ff4e52..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/func.go
+++ /dev/null
@@ -1,689 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the Function and BasicBlock types.
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "io"
- "os"
- "strings"
-)
-
-// addEdge adds a control-flow graph edge from from to to.
-func addEdge(from, to *BasicBlock) {
- from.Succs = append(from.Succs, to)
- to.Preds = append(to.Preds, from)
-}
-
-// Parent returns the function that contains block b.
-func (b *BasicBlock) Parent() *Function { return b.parent }
-
-// String returns a human-readable label of this block.
-// It is not guaranteed unique within the function.
-//
-func (b *BasicBlock) String() string {
- return fmt.Sprintf("%d", b.Index)
-}
-
-// emit appends an instruction to the current basic block.
-// If the instruction defines a Value, it is returned.
-//
-func (b *BasicBlock) emit(i Instruction) Value {
- i.setBlock(b)
- b.Instrs = append(b.Instrs, i)
- v, _ := i.(Value)
- return v
-}
-
-// predIndex returns the i such that b.Preds[i] == c or panics if
-// there is none.
-func (b *BasicBlock) predIndex(c *BasicBlock) int {
- for i, pred := range b.Preds {
- if pred == c {
- return i
- }
- }
- panic(fmt.Sprintf("no edge %s -> %s", c, b))
-}
-
-// hasPhi returns true if b.Instrs contains φ-nodes.
-func (b *BasicBlock) hasPhi() bool {
- _, ok := b.Instrs[0].(*Phi)
- return ok
-}
-
-// phis returns the prefix of b.Instrs containing all the block's φ-nodes.
-func (b *BasicBlock) phis() []Instruction {
- for i, instr := range b.Instrs {
- if _, ok := instr.(*Phi); !ok {
- return b.Instrs[:i]
- }
- }
- return nil // unreachable in well-formed blocks
-}
-
-// replacePred replaces all occurrences of p in b's predecessor list with q.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) replacePred(p, q *BasicBlock) {
- for i, pred := range b.Preds {
- if pred == p {
- b.Preds[i] = q
- }
- }
-}
-
-// replaceSucc replaces all occurrences of p in b's successor list with q.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) replaceSucc(p, q *BasicBlock) {
- for i, succ := range b.Succs {
- if succ == p {
- b.Succs[i] = q
- }
- }
-}
-
-// removePred removes all occurrences of p in b's
-// predecessor list and φ-nodes.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) removePred(p *BasicBlock) {
- phis := b.phis()
-
- // We must preserve edge order for φ-nodes.
- j := 0
- for i, pred := range b.Preds {
- if pred != p {
- b.Preds[j] = b.Preds[i]
- // Strike out φ-edge too.
- for _, instr := range phis {
- phi := instr.(*Phi)
- phi.Edges[j] = phi.Edges[i]
- }
- j++
- }
- }
- // Nil out b.Preds[j:] and φ-edges[j:] to aid GC.
- for i := j; i < len(b.Preds); i++ {
- b.Preds[i] = nil
- for _, instr := range phis {
- instr.(*Phi).Edges[i] = nil
- }
- }
- b.Preds = b.Preds[:j]
- for _, instr := range phis {
- phi := instr.(*Phi)
- phi.Edges = phi.Edges[:j]
- }
-}
-
-// Destinations associated with unlabelled for/switch/select stmts.
-// We push/pop one of these as we enter/leave each construct and for
-// each BranchStmt we scan for the innermost target of the right type.
-//
-type targets struct {
- tail *targets // rest of stack
- _break *BasicBlock
- _continue *BasicBlock
- _fallthrough *BasicBlock
-}
-
-// Destinations associated with a labelled block.
-// We populate these as labels are encountered in forward gotos or
-// labelled statements.
-//
-type lblock struct {
- _goto *BasicBlock
- _break *BasicBlock
- _continue *BasicBlock
-}
-
-// labelledBlock returns the branch target associated with the
-// specified label, creating it if needed.
-//
-func (f *Function) labelledBlock(label *ast.Ident) *lblock {
- lb := f.lblocks[label.Obj]
- if lb == nil {
- lb = &lblock{_goto: f.newBasicBlock(label.Name)}
- if f.lblocks == nil {
- f.lblocks = make(map[*ast.Object]*lblock)
- }
- f.lblocks[label.Obj] = lb
- }
- return lb
-}
-
-// addParam adds a (non-escaping) parameter to f.Params of the
-// specified name, type and source position.
-//
-func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter {
- v := &Parameter{
- name: name,
- typ: typ,
- pos: pos,
- parent: f,
- }
- f.Params = append(f.Params, v)
- return v
-}
-
-func (f *Function) addParamObj(obj types.Object) *Parameter {
- name := obj.Name()
- if name == "" {
- name = fmt.Sprintf("arg%d", len(f.Params))
- }
- param := f.addParam(name, obj.Type(), obj.Pos())
- param.object = obj
- return param
-}
-
-// addSpilledParam declares a parameter that is pre-spilled to the
-// stack; the function body will load/store the spilled location.
-// Subsequent lifting will eliminate spills where possible.
-//
-func (f *Function) addSpilledParam(obj types.Object) {
- param := f.addParamObj(obj)
- spill := &Alloc{Comment: obj.Name()}
- spill.setType(types.NewPointer(obj.Type()))
- spill.setPos(obj.Pos())
- f.objects[obj] = spill
- f.Locals = append(f.Locals, spill)
- f.emit(spill)
- f.emit(&Store{Addr: spill, Val: param})
-}
-
-// startBody initializes the function prior to generating SSA code for its body.
-// Precondition: f.Type() already set.
-//
-func (f *Function) startBody() {
- f.currentBlock = f.newBasicBlock("entry")
- f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init
-}
-
-// createSyntacticParams populates f.Params and generates code (spills
-// and named result locals) for all the parameters declared in the
-// syntax. In addition it populates the f.objects mapping.
-//
-// Preconditions:
-// f.startBody() was called.
-// Postcondition:
-// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0)
-//
-func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) {
- // Receiver (at most one inner iteration).
- if recv != nil {
- for _, field := range recv.List {
- for _, n := range field.Names {
- f.addSpilledParam(f.Pkg.info.Defs[n])
- }
- // Anonymous receiver? No need to spill.
- if field.Names == nil {
- f.addParamObj(f.Signature.Recv())
- }
- }
- }
-
- // Parameters.
- if functype.Params != nil {
- n := len(f.Params) // 1 if has recv, 0 otherwise
- for _, field := range functype.Params.List {
- for _, n := range field.Names {
- f.addSpilledParam(f.Pkg.info.Defs[n])
- }
- // Anonymous parameter? No need to spill.
- if field.Names == nil {
- f.addParamObj(f.Signature.Params().At(len(f.Params) - n))
- }
- }
- }
-
- // Named results.
- if functype.Results != nil {
- for _, field := range functype.Results.List {
- // Implicit "var" decl of locals for named results.
- for _, n := range field.Names {
- f.namedResults = append(f.namedResults, f.addLocalForIdent(n))
- }
- }
- }
-}
-
-// numberRegisters assigns numbers to all SSA registers
-// (value-defining Instructions) in f, to aid debugging.
-// (Non-Instruction Values are named at construction.)
-//
-func numberRegisters(f *Function) {
- v := 0
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- switch instr.(type) {
- case Value:
- instr.(interface {
- setNum(int)
- }).setNum(v)
- v++
- }
- }
- }
-}
-
-// buildReferrers populates the def/use information in all non-nil
-// Value.Referrers slice.
-// Precondition: all such slices are initially empty.
-func buildReferrers(f *Function) {
- var rands []*Value
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- rands = instr.Operands(rands[:0]) // recycle storage
- for _, rand := range rands {
- if r := *rand; r != nil {
- if ref := r.Referrers(); ref != nil {
- *ref = append(*ref, instr)
- }
- }
- }
- }
- }
-}
-
-// finishBody() finalizes the function after SSA code generation of its body.
-func (f *Function) finishBody() {
- f.objects = nil
- f.currentBlock = nil
- f.lblocks = nil
-
- // Don't pin the AST in memory (except in debug mode).
- if n := f.syntax; n != nil && !f.debugInfo() {
- f.syntax = extentNode{n.Pos(), n.End()}
- }
-
- // Remove from f.Locals any Allocs that escape to the heap.
- j := 0
- for _, l := range f.Locals {
- if !l.Heap {
- f.Locals[j] = l
- j++
- }
- }
- // Nil out f.Locals[j:] to aid GC.
- for i := j; i < len(f.Locals); i++ {
- f.Locals[i] = nil
- }
- f.Locals = f.Locals[:j]
-
- optimizeBlocks(f)
-
- buildReferrers(f)
-
- buildDomTree(f)
-
- if f.Prog.mode&NaiveForm == 0 {
- // For debugging pre-state of lifting pass:
- // numberRegisters(f)
- // f.WriteTo(os.Stderr)
- lift(f)
- }
-
- f.namedResults = nil // (used by lifting)
-
- numberRegisters(f)
-
- if f.Prog.mode&PrintFunctions != 0 {
- printMu.Lock()
- f.WriteTo(os.Stdout)
- printMu.Unlock()
- }
-
- if f.Prog.mode&SanityCheckFunctions != 0 {
- mustSanityCheck(f, nil)
- }
-}
-
-// removeNilBlocks eliminates nils from f.Blocks and updates each
-// BasicBlock.Index. Use this after any pass that may delete blocks.
-//
-func (f *Function) removeNilBlocks() {
- j := 0
- for _, b := range f.Blocks {
- if b != nil {
- b.Index = j
- f.Blocks[j] = b
- j++
- }
- }
- // Nil out f.Blocks[j:] to aid GC.
- for i := j; i < len(f.Blocks); i++ {
- f.Blocks[i] = nil
- }
- f.Blocks = f.Blocks[:j]
-}
-
-// SetDebugMode sets the debug mode for package pkg. If true, all its
-// functions will include full debug info. This greatly increases the
-// size of the instruction stream, and causes Functions to depend upon
-// the ASTs, potentially keeping them live in memory for longer.
-//
-func (pkg *Package) SetDebugMode(debug bool) {
- // TODO(adonovan): do we want ast.File granularity?
- pkg.debug = debug
-}
-
-// debugInfo reports whether debug info is wanted for this function.
-func (f *Function) debugInfo() bool {
- return f.Pkg != nil && f.Pkg.debug
-}
-
-// addNamedLocal creates a local variable, adds it to function f and
-// returns it. Its name and type are taken from obj. Subsequent
-// calls to f.lookup(obj) will return the same local.
-//
-func (f *Function) addNamedLocal(obj types.Object) *Alloc {
- l := f.addLocal(obj.Type(), obj.Pos())
- l.Comment = obj.Name()
- f.objects[obj] = l
- return l
-}
-
-func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc {
- return f.addNamedLocal(f.Pkg.info.Defs[id])
-}
-
-// addLocal creates an anonymous local variable of type typ, adds it
-// to function f and returns it. pos is the optional source location.
-//
-func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc {
- v := &Alloc{}
- v.setType(types.NewPointer(typ))
- v.setPos(pos)
- f.Locals = append(f.Locals, v)
- f.emit(v)
- return v
-}
-
-// lookup returns the address of the named variable identified by obj
-// that is local to function f or one of its enclosing functions.
-// If escaping, the reference comes from a potentially escaping pointer
-// expression and the referent must be heap-allocated.
-//
-func (f *Function) lookup(obj types.Object, escaping bool) Value {
- if v, ok := f.objects[obj]; ok {
- if alloc, ok := v.(*Alloc); ok && escaping {
- alloc.Heap = true
- }
- return v // function-local var (address)
- }
-
- // Definition must be in an enclosing function;
- // plumb it through intervening closures.
- if f.parent == nil {
- panic("no ssa.Value for " + obj.String())
- }
- outer := f.parent.lookup(obj, true) // escaping
- v := &FreeVar{
- name: obj.Name(),
- typ: outer.Type(),
- pos: outer.Pos(),
- outer: outer,
- parent: f,
- }
- f.objects[obj] = v
- f.FreeVars = append(f.FreeVars, v)
- return v
-}
-
-// emit emits the specified instruction to function f.
-func (f *Function) emit(instr Instruction) Value {
- return f.currentBlock.emit(instr)
-}
-
-// RelString returns the full name of this function, qualified by
-// package name, receiver type, etc.
-//
-// The specific formatting rules are not guaranteed and may change.
-//
-// Examples:
-// "math.IsNaN" // a package-level function
-// "(*bytes.Buffer).Bytes" // a declared method or a wrapper
-// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0)
-// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure)
-// "main.main$1" // an anonymous function in main
-// "main.init#1" // a declared init function
-// "main.init" // the synthesized package initializer
-//
-// When these functions are referred to from within the same package
-// (i.e. from == f.Pkg.Object), they are rendered without the package path.
-// For example: "IsNaN", "(*Buffer).Bytes", etc.
-//
-// All non-synthetic functions have distinct package-qualified names.
-// (But two methods may have the same name "(T).f" if one is a synthetic
-// wrapper promoting a non-exported method "f" from another package; in
-// that case, the strings are equal but the identifiers "f" are distinct.)
-//
-func (f *Function) RelString(from *types.Package) string {
- // Anonymous?
- if f.parent != nil {
- // An anonymous function's Name() looks like "parentName$1",
- // but its String() should include the type/package/etc.
- parent := f.parent.RelString(from)
- for i, anon := range f.parent.AnonFuncs {
- if anon == f {
- return fmt.Sprintf("%s$%d", parent, 1+i)
- }
- }
-
- return f.name // should never happen
- }
-
- // Method (declared or wrapper)?
- if recv := f.Signature.Recv(); recv != nil {
- return f.relMethod(from, recv.Type())
- }
-
- // Thunk?
- if f.method != nil {
- return f.relMethod(from, f.method.Recv())
- }
-
- // Bound?
- if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") {
- return f.relMethod(from, f.FreeVars[0].Type())
- }
-
- // Package-level function?
- // Prefix with package name for cross-package references only.
- if p := f.pkg(); p != nil && p != from {
- return fmt.Sprintf("%s.%s", p.Path(), f.name)
- }
-
- // Unknown.
- return f.name
-}
-
-func (f *Function) relMethod(from *types.Package, recv types.Type) string {
- return fmt.Sprintf("(%s).%s", relType(recv, from), f.name)
-}
-
-// writeSignature writes to buf the signature sig in declaration syntax.
-func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) {
- buf.WriteString("func ")
- if recv := sig.Recv(); recv != nil {
- buf.WriteString("(")
- if n := params[0].Name(); n != "" {
- buf.WriteString(n)
- buf.WriteString(" ")
- }
- types.WriteType(buf, params[0].Type(), types.RelativeTo(from))
- buf.WriteString(") ")
- }
- buf.WriteString(name)
- types.WriteSignature(buf, sig, types.RelativeTo(from))
-}
-
-func (f *Function) pkg() *types.Package {
- if f.Pkg != nil {
- return f.Pkg.Pkg
- }
- return nil
-}
-
-var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer
-
-func (f *Function) WriteTo(w io.Writer) (int64, error) {
- var buf bytes.Buffer
- WriteFunction(&buf, f)
- n, err := w.Write(buf.Bytes())
- return int64(n), err
-}
-
-// WriteFunction writes to buf a human-readable "disassembly" of f.
-func WriteFunction(buf *bytes.Buffer, f *Function) {
- fmt.Fprintf(buf, "# Name: %s\n", f.String())
- if f.Pkg != nil {
- fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path())
- }
- if syn := f.Synthetic; syn != "" {
- fmt.Fprintln(buf, "# Synthetic:", syn)
- }
- if pos := f.Pos(); pos.IsValid() {
- fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos))
- }
-
- if f.parent != nil {
- fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name())
- }
-
- if f.Recover != nil {
- fmt.Fprintf(buf, "# Recover: %s\n", f.Recover)
- }
-
- from := f.pkg()
-
- if f.FreeVars != nil {
- buf.WriteString("# Free variables:\n")
- for i, fv := range f.FreeVars {
- fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from))
- }
- }
-
- if len(f.Locals) > 0 {
- buf.WriteString("# Locals:\n")
- for i, l := range f.Locals {
- fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from))
- }
- }
- writeSignature(buf, from, f.Name(), f.Signature, f.Params)
- buf.WriteString(":\n")
-
- if f.Blocks == nil {
- buf.WriteString("\t(external)\n")
- }
-
- // NB. column calculations are confused by non-ASCII
- // characters and assume 8-space tabs.
- const punchcard = 80 // for old time's sake.
- const tabwidth = 8
- for _, b := range f.Blocks {
- if b == nil {
- // Corrupt CFG.
- fmt.Fprintf(buf, ".nil:\n")
- continue
- }
- n, _ := fmt.Fprintf(buf, "%d:", b.Index)
- bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs))
- fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg)
-
- if false { // CFG debugging
- fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs)
- }
- for _, instr := range b.Instrs {
- buf.WriteString("\t")
- switch v := instr.(type) {
- case Value:
- l := punchcard - tabwidth
- // Left-align the instruction.
- if name := v.Name(); name != "" {
- n, _ := fmt.Fprintf(buf, "%s = ", name)
- l -= n
- }
- n, _ := buf.WriteString(instr.String())
- l -= n
- // Right-align the type if there's space.
- if t := v.Type(); t != nil {
- buf.WriteByte(' ')
- ts := relType(t, from)
- l -= len(ts) + len(" ") // (spaces before and after type)
- if l > 0 {
- fmt.Fprintf(buf, "%*s", l, "")
- }
- buf.WriteString(ts)
- }
- case nil:
- // Be robust against bad transforms.
- buf.WriteString("")
- default:
- buf.WriteString(instr.String())
- }
- buf.WriteString("\n")
- }
- }
- fmt.Fprintf(buf, "\n")
-}
-
-// newBasicBlock adds to f a new basic block and returns it. It does
-// not automatically become the current block for subsequent calls to emit.
-// comment is an optional string for more readable debugging output.
-//
-func (f *Function) newBasicBlock(comment string) *BasicBlock {
- b := &BasicBlock{
- Index: len(f.Blocks),
- Comment: comment,
- parent: f,
- }
- b.Succs = b.succs2[:0]
- f.Blocks = append(f.Blocks, b)
- return b
-}
-
-// NewFunction returns a new synthetic Function instance belonging to
-// prog, with its name and signature fields set as specified.
-//
-// The caller is responsible for initializing the remaining fields of
-// the function object, e.g. Pkg, Params, Blocks.
-//
-// It is practically impossible for clients to construct well-formed
-// SSA functions/packages/programs directly, so we assume this is the
-// job of the Builder alone. NewFunction exists to provide clients a
-// little flexibility. For example, analysis tools may wish to
-// construct fake Functions for the root of the callgraph, a fake
-// "reflect" package, etc.
-//
-// TODO(adonovan): think harder about the API here.
-//
-func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function {
- return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance}
-}
-
-type extentNode [2]token.Pos
-
-func (n extentNode) Pos() token.Pos { return n[0] }
-func (n extentNode) End() token.Pos { return n[1] }
-
-// Syntax returns an ast.Node whose Pos/End methods provide the
-// lexical extent of the function if it was defined by Go source code
-// (f.Synthetic==""), or nil otherwise.
-//
-// If f was built with debug information (see Package.SetDebugRef),
-// the result is the *ast.FuncDecl or *ast.FuncLit that declared the
-// function. Otherwise, it is an opaque Node providing only position
-// information; this avoids pinning the AST in memory.
-//
-func (f *Function) Syntax() ast.Node { return f.syntax }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/identical.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/identical.go
deleted file mode 100644
index 53cbee107..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/identical.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build go1.8
-
-package ssa
-
-import "go/types"
-
-var structTypesIdentical = types.IdenticalIgnoreTags
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/identical_17.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/identical_17.go
deleted file mode 100644
index da89d3339..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/identical_17.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build !go1.8
-
-package ssa
-
-import "go/types"
-
-var structTypesIdentical = types.Identical
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external.go
deleted file mode 100644
index 181ffa419..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external.go
+++ /dev/null
@@ -1,551 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Emulated functions that we cannot interpret because they are
-// external or because they use "unsafe" or "reflect" operations.
-
-import (
- "go/types"
- "math"
- "os"
- "runtime"
- "strings"
- "sync/atomic"
- "time"
- "unsafe"
-
- "golang.org/x/tools/go/ssa"
-)
-
-type externalFn func(fr *frame, args []value) value
-
-// TODO(adonovan): fix: reflect.Value abstracts an lvalue or an
-// rvalue; Set() causes mutations that can be observed via aliases.
-// We have not captured that correctly here.
-
-// Key strings are from Function.String().
-var externals = make(map[string]externalFn)
-
-func init() {
- // That little dot ۰ is an Arabic zero numeral (U+06F0), categories [Nd].
- for k, v := range map[string]externalFn{
- "(*sync.Pool).Get": ext۰sync۰Pool۰Get,
- "(*sync.Pool).Put": ext۰nop,
- "(reflect.Value).Bool": ext۰reflect۰Value۰Bool,
- "(reflect.Value).CanAddr": ext۰reflect۰Value۰CanAddr,
- "(reflect.Value).CanInterface": ext۰reflect۰Value۰CanInterface,
- "(reflect.Value).Elem": ext۰reflect۰Value۰Elem,
- "(reflect.Value).Field": ext۰reflect۰Value۰Field,
- "(reflect.Value).Float": ext۰reflect۰Value۰Float,
- "(reflect.Value).Index": ext۰reflect۰Value۰Index,
- "(reflect.Value).Int": ext۰reflect۰Value۰Int,
- "(reflect.Value).Interface": ext۰reflect۰Value۰Interface,
- "(reflect.Value).IsNil": ext۰reflect۰Value۰IsNil,
- "(reflect.Value).IsValid": ext۰reflect۰Value۰IsValid,
- "(reflect.Value).Kind": ext۰reflect۰Value۰Kind,
- "(reflect.Value).Len": ext۰reflect۰Value۰Len,
- "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex,
- "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys,
- "(reflect.Value).NumField": ext۰reflect۰Value۰NumField,
- "(reflect.Value).NumMethod": ext۰reflect۰Value۰NumMethod,
- "(reflect.Value).Pointer": ext۰reflect۰Value۰Pointer,
- "(reflect.Value).Set": ext۰reflect۰Value۰Set,
- "(reflect.Value).String": ext۰reflect۰Value۰String,
- "(reflect.Value).Type": ext۰reflect۰Value۰Type,
- "(reflect.Value).Uint": ext۰reflect۰Value۰Uint,
- "(reflect.error).Error": ext۰reflect۰error۰Error,
- "(reflect.rtype).Bits": ext۰reflect۰rtype۰Bits,
- "(reflect.rtype).Elem": ext۰reflect۰rtype۰Elem,
- "(reflect.rtype).Field": ext۰reflect۰rtype۰Field,
- "(reflect.rtype).In": ext۰reflect۰rtype۰In,
- "(reflect.rtype).Kind": ext۰reflect۰rtype۰Kind,
- "(reflect.rtype).NumField": ext۰reflect۰rtype۰NumField,
- "(reflect.rtype).NumIn": ext۰reflect۰rtype۰NumIn,
- "(reflect.rtype).NumMethod": ext۰reflect۰rtype۰NumMethod,
- "(reflect.rtype).NumOut": ext۰reflect۰rtype۰NumOut,
- "(reflect.rtype).Out": ext۰reflect۰rtype۰Out,
- "(reflect.rtype).Size": ext۰reflect۰rtype۰Size,
- "(reflect.rtype).String": ext۰reflect۰rtype۰String,
- "bytes.init": ext۰nop, // avoid asm dependency
- "bytes.Equal": ext۰bytes۰Equal,
- "bytes.IndexByte": ext۰bytes۰IndexByte,
- "hash/crc32.haveSSE42": ext۰crc32۰haveSSE42,
- "internal/cpu.cpuid": ext۰cpu۰cpuid,
- "math.Abs": ext۰math۰Abs,
- "math.Exp": ext۰math۰Exp,
- "math.Float32bits": ext۰math۰Float32bits,
- "math.Float32frombits": ext۰math۰Float32frombits,
- "math.Float64bits": ext۰math۰Float64bits,
- "math.Float64frombits": ext۰math۰Float64frombits,
- "math.Ldexp": ext۰math۰Ldexp,
- "math.Log": ext۰math۰Log,
- "math.Min": ext۰math۰Min,
- "math.hasSSE4": ext۰math۰hasSSE4,
- "os.runtime_args": ext۰os۰runtime_args,
- "os.runtime_beforeExit": ext۰nop,
- "os/signal.init": ext۰nop,
- "reflect.New": ext۰reflect۰New,
- "reflect.SliceOf": ext۰reflect۰SliceOf,
- "reflect.TypeOf": ext۰reflect۰TypeOf,
- "reflect.ValueOf": ext۰reflect۰ValueOf,
- "reflect.Zero": ext۰reflect۰Zero,
- "reflect.init": ext۰reflect۰Init,
- "reflect.valueInterface": ext۰reflect۰valueInterface,
- "runtime.Breakpoint": ext۰runtime۰Breakpoint,
- "runtime.Caller": ext۰runtime۰Caller,
- "runtime.Callers": ext۰runtime۰Callers,
- "runtime.FuncForPC": ext۰runtime۰FuncForPC,
- "runtime.GC": ext۰runtime۰GC,
- "runtime.GOMAXPROCS": ext۰runtime۰GOMAXPROCS,
- "runtime.Goexit": ext۰runtime۰Goexit,
- "runtime.Gosched": ext۰runtime۰Gosched,
- "runtime.init": ext۰nop,
- "runtime.KeepAlive": ext۰nop,
- "runtime.NumCPU": ext۰runtime۰NumCPU,
- "runtime.NumGoroutine": ext۰runtime۰NumGoroutine,
- "runtime.ReadMemStats": ext۰runtime۰ReadMemStats,
- "runtime.SetFinalizer": ext۰nop, // ignore
- "(*runtime.Func).Entry": ext۰runtime۰Func۰Entry,
- "(*runtime.Func).FileLine": ext۰runtime۰Func۰FileLine,
- "(*runtime.Func).Name": ext۰runtime۰Func۰Name,
- "runtime.environ": ext۰runtime۰environ,
- "runtime.getgoroot": ext۰runtime۰getgoroot,
- "strings.init": ext۰nop, // avoid asm dependency
- "strings.Count": ext۰strings۰Count,
- "strings.Index": ext۰strings۰Index,
- "strings.IndexByte": ext۰strings۰IndexByte,
- "sync.runtime_Semacquire": ext۰nop, // unimplementable
- "sync.runtime_Semrelease": ext۰nop, // unimplementable
- "sync.runtime_Syncsemcheck": ext۰nop, // unimplementable
- "sync.runtime_notifyListCheck": ext۰nop,
- "sync.runtime_registerPoolCleanup": ext۰nop,
- "sync/atomic.AddInt32": ext۰atomic۰AddInt32,
- "sync/atomic.AddUint32": ext۰atomic۰AddUint32,
- "sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32,
- "sync/atomic.CompareAndSwapUint32": ext۰atomic۰CompareAndSwapUint32,
- "sync/atomic.LoadInt32": ext۰atomic۰LoadInt32,
- "sync/atomic.LoadUint32": ext۰atomic۰LoadUint32,
- "sync/atomic.StoreInt32": ext۰atomic۰StoreInt32,
- "sync/atomic.StoreUint32": ext۰atomic۰StoreUint32,
- "sync/atomic.AddInt64": ext۰atomic۰AddInt64,
- "sync/atomic.AddUint64": ext۰atomic۰AddUint64,
- "sync/atomic.CompareAndSwapInt64": ext۰atomic۰CompareAndSwapInt64,
- "sync/atomic.CompareAndSwapUint64": ext۰atomic۰CompareAndSwapUint64,
- "sync/atomic.LoadInt64": ext۰atomic۰LoadInt64,
- "sync/atomic.LoadUint64": ext۰atomic۰LoadUint64,
- "sync/atomic.StoreInt64": ext۰atomic۰StoreInt64,
- "sync/atomic.StoreUint64": ext۰atomic۰StoreUint64,
- "testing.callerEntry": ext۰testing۰callerEntry,
- "testing.runExample": ext۰testing۰runExample,
- "time.Sleep": ext۰time۰Sleep,
- "time.now": ext۰time۰now,
- } {
- externals[k] = v
- }
-}
-
-// wrapError returns an interpreted 'error' interface value for err.
-func wrapError(err error) value {
- if err == nil {
- return iface{}
- }
- return iface{t: errorType, v: err.Error()}
-}
-
-func ext۰nop(fr *frame, args []value) value { return nil }
-
-func ext۰sync۰Pool۰Get(fr *frame, args []value) value {
- Pool := fr.i.prog.ImportedPackage("sync").Type("Pool").Object()
- _, newIndex, _ := types.LookupFieldOrMethod(Pool.Type(), false, Pool.Pkg(), "New")
-
- if New := (*args[0].(*value)).(structure)[newIndex[0]]; New != nil {
- return call(fr.i, fr, 0, New, nil)
- }
- return nil
-}
-
-func ext۰bytes۰Equal(fr *frame, args []value) value {
- // func Equal(a, b []byte) bool
- a := args[0].([]value)
- b := args[1].([]value)
- if len(a) != len(b) {
- return false
- }
- for i := range a {
- if a[i] != b[i] {
- return false
- }
- }
- return true
-}
-
-func ext۰bytes۰IndexByte(fr *frame, args []value) value {
- // func IndexByte(s []byte, c byte) int
- s := args[0].([]value)
- c := args[1].(byte)
- for i, b := range s {
- if b.(byte) == c {
- return i
- }
- }
- return -1
-}
-
-func ext۰crc32۰haveSSE42(fr *frame, args []value) value {
- return false
-}
-
-func ext۰math۰Float64frombits(fr *frame, args []value) value {
- return math.Float64frombits(args[0].(uint64))
-}
-
-func ext۰math۰Float64bits(fr *frame, args []value) value {
- return math.Float64bits(args[0].(float64))
-}
-
-func ext۰math۰Float32frombits(fr *frame, args []value) value {
- return math.Float32frombits(args[0].(uint32))
-}
-
-func ext۰math۰Abs(fr *frame, args []value) value {
- return math.Abs(args[0].(float64))
-}
-
-func ext۰math۰Exp(fr *frame, args []value) value {
- return math.Exp(args[0].(float64))
-}
-
-func ext۰math۰Float32bits(fr *frame, args []value) value {
- return math.Float32bits(args[0].(float32))
-}
-
-func ext۰math۰Min(fr *frame, args []value) value {
- return math.Min(args[0].(float64), args[1].(float64))
-}
-
-func ext۰math۰hasSSE4(fr *frame, args []value) value {
- return false
-}
-
-func ext۰math۰Ldexp(fr *frame, args []value) value {
- return math.Ldexp(args[0].(float64), args[1].(int))
-}
-
-func ext۰math۰Log(fr *frame, args []value) value {
- return math.Log(args[0].(float64))
-}
-
-func ext۰os۰runtime_args(fr *frame, args []value) value {
- return fr.i.osArgs
-}
-
-func ext۰runtime۰Breakpoint(fr *frame, args []value) value {
- runtime.Breakpoint()
- return nil
-}
-
-func ext۰runtime۰Caller(fr *frame, args []value) value {
- // func Caller(skip int) (pc uintptr, file string, line int, ok bool)
- skip := 1 + args[0].(int)
- for i := 0; i < skip; i++ {
- if fr != nil {
- fr = fr.caller
- }
- }
- var pc uintptr
- var file string
- var line int
- var ok bool
- if fr != nil {
- fn := fr.fn
- // TODO(adonovan): use pc/posn of current instruction, not start of fn.
- // (Required to interpret the log package's tests.)
- pc = uintptr(unsafe.Pointer(fn))
- posn := fn.Prog.Fset.Position(fn.Pos())
- file = posn.Filename
- line = posn.Line
- ok = true
- }
- return tuple{pc, file, line, ok}
-}
-
-func ext۰runtime۰Callers(fr *frame, args []value) value {
- // Callers(skip int, pc []uintptr) int
- skip := args[0].(int)
- pc := args[1].([]value)
- for i := 0; i < skip; i++ {
- if fr != nil {
- fr = fr.caller
- }
- }
- i := 0
- for fr != nil && i < len(pc) {
- pc[i] = uintptr(unsafe.Pointer(fr.fn))
- i++
- fr = fr.caller
- }
- return i
-}
-
-func ext۰runtime۰FuncForPC(fr *frame, args []value) value {
- // FuncForPC(pc uintptr) *Func
- pc := args[0].(uintptr)
- var fn *ssa.Function
- if pc != 0 {
- fn = (*ssa.Function)(unsafe.Pointer(pc)) // indeed unsafe!
- }
- var Func value
- Func = structure{fn} // a runtime.Func
- return &Func
-}
-
-func ext۰runtime۰environ(fr *frame, args []value) value {
- // This function also implements syscall.runtime_envs.
- return environ
-}
-
-func ext۰runtime۰getgoroot(fr *frame, args []value) value {
- return os.Getenv("GOROOT")
-}
-
-func ext۰strings۰Count(fr *frame, args []value) value {
- // Call compiled version to avoid asm dependency.
- return strings.Count(args[0].(string), args[1].(string))
-}
-
-func ext۰strings۰IndexByte(fr *frame, args []value) value {
- // Call compiled version to avoid asm dependency.
- return strings.IndexByte(args[0].(string), args[1].(byte))
-}
-
-func ext۰strings۰Index(fr *frame, args []value) value {
- // Call compiled version to avoid asm dependency.
- return strings.Index(args[0].(string), args[1].(string))
-}
-
-func ext۰runtime۰GOMAXPROCS(fr *frame, args []value) value {
- // Ignore args[0]; don't let the interpreted program
- // set the interpreter's GOMAXPROCS!
- return runtime.GOMAXPROCS(0)
-}
-
-func ext۰runtime۰Goexit(fr *frame, args []value) value {
- // TODO(adonovan): don't kill the interpreter's main goroutine.
- runtime.Goexit()
- return nil
-}
-
-func ext۰runtime۰GC(fr *frame, args []value) value {
- runtime.GC()
- return nil
-}
-
-func ext۰runtime۰Gosched(fr *frame, args []value) value {
- runtime.Gosched()
- return nil
-}
-
-func ext۰runtime۰NumCPU(fr *frame, args []value) value {
- return runtime.NumCPU()
-}
-
-func ext۰runtime۰NumGoroutine(fr *frame, args []value) value {
- return int(atomic.LoadInt32(&fr.i.goroutines))
-}
-
-func ext۰runtime۰ReadMemStats(fr *frame, args []value) value {
- // TODO(adonovan): populate args[0].(Struct)
- return nil
-}
-
-func ext۰atomic۰LoadUint32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- return (*args[0].(*value)).(uint32)
-}
-
-func ext۰atomic۰StoreUint32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- *args[0].(*value) = args[1].(uint32)
- return nil
-}
-
-func ext۰atomic۰LoadInt32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- return (*args[0].(*value)).(int32)
-}
-
-func ext۰atomic۰StoreInt32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- *args[0].(*value) = args[1].(int32)
- return nil
-}
-
-func ext۰atomic۰CompareAndSwapInt32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- if (*p).(int32) == args[1].(int32) {
- *p = args[2].(int32)
- return true
- }
- return false
-}
-
-func ext۰atomic۰CompareAndSwapUint32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- if (*p).(uint32) == args[1].(uint32) {
- *p = args[2].(uint32)
- return true
- }
- return false
-}
-
-func ext۰atomic۰AddInt32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- newv := (*p).(int32) + args[1].(int32)
- *p = newv
- return newv
-}
-
-func ext۰atomic۰AddUint32(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- newv := (*p).(uint32) + args[1].(uint32)
- *p = newv
- return newv
-}
-
-func ext۰atomic۰LoadUint64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- return (*args[0].(*value)).(uint64)
-}
-
-func ext۰atomic۰StoreUint64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- *args[0].(*value) = args[1].(uint64)
- return nil
-}
-
-func ext۰atomic۰LoadInt64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- return (*args[0].(*value)).(int64)
-}
-
-func ext۰atomic۰StoreInt64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- *args[0].(*value) = args[1].(int64)
- return nil
-}
-
-func ext۰atomic۰CompareAndSwapInt64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- if (*p).(int64) == args[1].(int64) {
- *p = args[2].(int64)
- return true
- }
- return false
-}
-
-func ext۰atomic۰CompareAndSwapUint64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- if (*p).(uint64) == args[1].(uint64) {
- *p = args[2].(uint64)
- return true
- }
- return false
-}
-
-func ext۰atomic۰AddInt64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- newv := (*p).(int64) + args[1].(int64)
- *p = newv
- return newv
-}
-
-func ext۰atomic۰AddUint64(fr *frame, args []value) value {
- // TODO(adonovan): fix: not atomic!
- p := args[0].(*value)
- newv := (*p).(uint64) + args[1].(uint64)
- *p = newv
- return newv
-}
-
-func ext۰cpu۰cpuid(fr *frame, args []value) value {
- return tuple{uint32(0), uint32(0), uint32(0), uint32(0)}
-}
-
-// Pretend: type runtime.Func struct { entry *ssa.Function }
-
-func ext۰runtime۰Func۰FileLine(fr *frame, args []value) value {
- // func (*runtime.Func) FileLine(uintptr) (string, int)
- f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
- pc := args[1].(uintptr)
- _ = pc
- if f != nil {
- // TODO(adonovan): use position of current instruction, not fn.
- posn := f.Prog.Fset.Position(f.Pos())
- return tuple{posn.Filename, posn.Line}
- }
- return tuple{"", 0}
-}
-
-func ext۰runtime۰Func۰Name(fr *frame, args []value) value {
- // func (*runtime.Func) Name() string
- f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
- if f != nil {
- return f.String()
- }
- return ""
-}
-
-func ext۰runtime۰Func۰Entry(fr *frame, args []value) value {
- // func (*runtime.Func) Entry() uintptr
- f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
- return uintptr(unsafe.Pointer(f))
-}
-
-// This is a workaround for a bug in go/ssa/testmain.go: it creates
-// InternalExamples even for Example functions with no Output comment.
-// TODO(adonovan): fix (and redesign) testmain.go..
-func ext۰testing۰runExample(fr *frame, args []value) value {
- // This is a stripped down runExample that simply calls the function.
- // It does not capture and compare output nor recover from panic.
- //
- // func runExample(eg testing.InternalExample) bool {
- // eg.F()
- // return true
- // }
- F := args[0].(structure)[1]
- call(fr.i, fr, 0, F, nil)
- return true
-}
-
-func ext۰testing۰callerEntry(fr *frame, args []value) value {
- return uintptr(0) // bogus implementation for now
-}
-
-func ext۰time۰now(fr *frame, args []value) value {
- nano := time.Now().UnixNano()
- return tuple{int64(nano / 1e9), int32(nano % 1e9), int64(0)}
-}
-
-func ext۰time۰Sleep(fr *frame, args []value) value {
- time.Sleep(time.Duration(args[0].(int64)))
- return nil
-}
-
-func valueToBytes(v value) []byte {
- in := v.([]value)
- b := make([]byte, len(in))
- for i := range in {
- b[i] = in[i].(byte)
- }
- return b
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external_darwin.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external_darwin.go
deleted file mode 100644
index 471300930..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external_darwin.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package interp
-
-import "syscall"
-
-func init() {
- externals["syscall.Sysctl"] = ext۰syscall۰Sysctl
-
- fillStat = func(st *syscall.Stat_t, stat structure) {
- stat[0] = st.Dev
- stat[1] = st.Mode
- stat[2] = st.Nlink
- stat[3] = st.Ino
- stat[4] = st.Uid
- stat[5] = st.Gid
- stat[6] = st.Rdev
- // TODO(adonovan): fix: copy Timespecs.
- // stat[8] = st.Atim
- // stat[9] = st.Mtim
- // stat[10] = st.Ctim
- stat[12] = st.Size
- stat[13] = st.Blocks
- stat[14] = st.Blksize
- }
-}
-
-func ext۰syscall۰Sysctl(fr *frame, args []value) value {
- r, err := syscall.Sysctl(args[0].(string))
- return tuple{r, wrapError(err)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external_unix.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external_unix.go
deleted file mode 100644
index bfa39f68a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external_unix.go
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin linux
-
-package interp
-
-import "syscall"
-
-func init() {
- for k, v := range map[string]externalFn{
- "os.Pipe": ext۰os۰Pipe,
- "syscall.Close": ext۰syscall۰Close,
- "syscall.Exit": ext۰syscall۰Exit,
- "syscall.Fchown": ext۰syscall۰Fchown,
- "syscall.Fstat": ext۰syscall۰Fstat,
- "syscall.Ftruncate": ext۰syscall۰Ftruncate,
- "syscall.Getpid": ext۰syscall۰Getpid,
- "syscall.Getwd": ext۰syscall۰Getwd,
- "syscall.Kill": ext۰syscall۰Kill,
- "syscall.Link": ext۰syscall۰Link,
- "syscall.Lstat": ext۰syscall۰Lstat,
- "syscall.Mkdir": ext۰syscall۰Mkdir,
- "syscall.Open": ext۰syscall۰Open,
- "syscall.ParseDirent": ext۰syscall۰ParseDirent,
- "syscall.RawSyscall": ext۰syscall۰RawSyscall,
- "syscall.Read": ext۰syscall۰Read,
- "syscall.ReadDirent": ext۰syscall۰ReadDirent,
- "syscall.Readlink": ext۰syscall۰Readlink,
- "syscall.Rmdir": ext۰syscall۰Rmdir,
- "syscall.Seek": ext۰syscall۰Seek,
- "syscall.Stat": ext۰syscall۰Stat,
- "syscall.Symlink": ext۰syscall۰Symlink,
- "syscall.Write": ext۰syscall۰Write,
- "syscall.Unlink": ext۰syscall۰Unlink,
- "syscall۰UtimesNano": ext۰syscall۰UtimesNano,
- "syscall.setenv_c": ext۰nop,
- "syscall.unsetenv_c": ext۰nop,
- "syscall.runtime_envs": ext۰runtime۰environ,
- } {
- externals[k] = v
- }
-
- syswrite = syscall.Write
-}
-
-func ext۰os۰Pipe(fr *frame, args []value) value {
- // func os.Pipe() (r *File, w *File, err error)
-
- // The portable POSIX pipe(2) call is good enough for our needs.
- var p [2]int
- if err := syscall.Pipe(p[:]); err != nil {
- // TODO(adonovan): fix: return an *os.SyscallError.
- return tuple{nil, nil, wrapError(err)}
- }
-
- NewFile := fr.i.prog.ImportedPackage("os").Func("NewFile")
- r := call(fr.i, fr, 0, NewFile, []value{uintptr(p[0]), "|0"})
- w := call(fr.i, fr, 0, NewFile, []value{uintptr(p[1]), "|1"})
- return tuple{r, w, wrapError(nil)}
-}
-
-// overridden on darwin
-var fillStat = func(st *syscall.Stat_t, stat structure) {
- stat[0] = st.Dev
- stat[1] = st.Ino
- stat[2] = st.Nlink
- stat[3] = st.Mode
- stat[4] = st.Uid
- stat[5] = st.Gid
- stat[7] = st.Rdev
- stat[8] = st.Size
- stat[9] = st.Blksize
- stat[10] = st.Blocks
- // TODO(adonovan): fix: copy Timespecs.
- // stat[11] = st.Atim
- // stat[12] = st.Mtim
- // stat[13] = st.Ctim
-}
-
-func ext۰syscall۰Close(fr *frame, args []value) value {
- // func Close(fd int) (err error)
- return wrapError(syscall.Close(args[0].(int)))
-}
-
-func ext۰syscall۰Exit(fr *frame, args []value) value {
- panic(exitPanic(args[0].(int)))
-}
-
-func ext۰syscall۰Fchown(fr *frame, args []value) value {
- fd := args[0].(int)
- uid := args[1].(int)
- gid := args[2].(int)
- return wrapError(syscall.Fchown(fd, uid, gid))
-}
-
-func ext۰syscall۰Fstat(fr *frame, args []value) value {
- // func Fstat(fd int, stat *Stat_t) (err error)
- fd := args[0].(int)
- stat := (*args[1].(*value)).(structure)
-
- var st syscall.Stat_t
- err := syscall.Fstat(fd, &st)
- fillStat(&st, stat)
- return wrapError(err)
-}
-
-func ext۰syscall۰Ftruncate(fr *frame, args []value) value {
- fd := args[0].(int)
- length := args[1].(int64)
- return wrapError(syscall.Ftruncate(fd, length))
-}
-
-func ext۰syscall۰Getpid(fr *frame, args []value) value {
- return syscall.Getpid()
-}
-
-func ext۰syscall۰Getwd(fr *frame, args []value) value {
- s, err := syscall.Getwd()
- return tuple{s, wrapError(err)}
-}
-
-func ext۰syscall۰Kill(fr *frame, args []value) value {
- // func Kill(pid int, sig Signal) (err error)
- return wrapError(syscall.Kill(args[0].(int), syscall.Signal(args[1].(int))))
-}
-
-func ext۰syscall۰Link(fr *frame, args []value) value {
- path := args[0].(string)
- link := args[1].(string)
- return wrapError(syscall.Link(path, link))
-}
-
-func ext۰syscall۰Lstat(fr *frame, args []value) value {
- // func Lstat(name string, stat *Stat_t) (err error)
- name := args[0].(string)
- stat := (*args[1].(*value)).(structure)
-
- var st syscall.Stat_t
- err := syscall.Lstat(name, &st)
- fillStat(&st, stat)
- return wrapError(err)
-}
-
-func ext۰syscall۰Mkdir(fr *frame, args []value) value {
- path := args[0].(string)
- mode := args[1].(uint32)
- return wrapError(syscall.Mkdir(path, mode))
-}
-
-func ext۰syscall۰Open(fr *frame, args []value) value {
- // func Open(path string, mode int, perm uint32) (fd int, err error) {
- path := args[0].(string)
- mode := args[1].(int)
- perm := args[2].(uint32)
- fd, err := syscall.Open(path, mode, perm)
- return tuple{fd, wrapError(err)}
-}
-
-func ext۰syscall۰ParseDirent(fr *frame, args []value) value {
- // func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string)
- max := args[1].(int)
- var names []string
- for _, iname := range args[2].([]value) {
- names = append(names, iname.(string))
- }
- consumed, count, newnames := syscall.ParseDirent(valueToBytes(args[0]), max, names)
- var inewnames []value
- for _, newname := range newnames {
- inewnames = append(inewnames, newname)
- }
- return tuple{consumed, count, inewnames}
-}
-
-func ext۰syscall۰RawSyscall(fr *frame, args []value) value {
- return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)}
-}
-
-func ext۰syscall۰Read(fr *frame, args []value) value {
- // func Read(fd int, p []byte) (n int, err error)
- fd := args[0].(int)
- p := args[1].([]value)
- b := make([]byte, len(p))
- n, err := syscall.Read(fd, b)
- for i := 0; i < n; i++ {
- p[i] = b[i]
- }
- return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰ReadDirent(fr *frame, args []value) value {
- // func ReadDirent(fd int, buf []byte) (n int, err error)
- fd := args[0].(int)
- p := args[1].([]value)
- b := make([]byte, len(p))
- n, err := syscall.ReadDirent(fd, b)
- for i := 0; i < n; i++ {
- p[i] = b[i]
- }
- return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰Readlink(fr *frame, args []value) value {
- path := args[0].(string)
- buf := valueToBytes(args[1])
- n, err := syscall.Readlink(path, buf)
- return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰Rmdir(fr *frame, args []value) value {
- return wrapError(syscall.Rmdir(args[0].(string)))
-}
-
-func ext۰syscall۰Seek(fr *frame, args []value) value {
- fd := args[0].(int)
- offset := args[1].(int64)
- whence := args[2].(int)
- new, err := syscall.Seek(fd, offset, whence)
- return tuple{new, wrapError(err)}
-}
-
-func ext۰syscall۰Stat(fr *frame, args []value) value {
- // func Stat(name string, stat *Stat_t) (err error)
- name := args[0].(string)
- stat := (*args[1].(*value)).(structure)
-
- var st syscall.Stat_t
- err := syscall.Stat(name, &st)
- fillStat(&st, stat)
- return wrapError(err)
-}
-
-func ext۰syscall۰Symlink(fr *frame, args []value) value {
- path := args[0].(string)
- link := args[1].(string)
- return wrapError(syscall.Symlink(path, link))
-}
-
-func ext۰syscall۰Unlink(fr *frame, args []value) value {
- return wrapError(syscall.Unlink(args[0].(string)))
-}
-
-func ext۰syscall۰UtimesNano(fr *frame, args []value) value {
- path := args[0].(string)
- var ts [2]syscall.Timespec
- err := syscall.UtimesNano(path, ts[:])
- // TODO(adonovan): copy the Timespecs into args[1]
- return wrapError(err)
-}
-
-func ext۰syscall۰Write(fr *frame, args []value) value {
- // func Write(fd int, p []byte) (n int, err error)
- n, err := write(args[0].(int), valueToBytes(args[1]))
- return tuple{n, wrapError(err)}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/interp.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/interp.go
deleted file mode 100644
index 4c8602dce..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/interp.go
+++ /dev/null
@@ -1,762 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ssa/interp defines an interpreter for the SSA
-// representation of Go programs.
-//
-// This interpreter is provided as an adjunct for testing the SSA
-// construction algorithm. Its purpose is to provide a minimal
-// metacircular implementation of the dynamic semantics of each SSA
-// instruction. It is not, and will never be, a production-quality Go
-// interpreter.
-//
-// The following is a partial list of Go features that are currently
-// unsupported or incomplete in the interpreter.
-//
-// * Unsafe operations, including all uses of unsafe.Pointer, are
-// impossible to support given the "boxed" value representation we
-// have chosen.
-//
-// * The reflect package is only partially implemented.
-//
-// * "sync/atomic" operations are not currently atomic due to the
-// "boxed" value representation: it is not possible to read, modify
-// and write an interface value atomically. As a consequence, Mutexes
-// are currently broken. TODO(adonovan): provide a metacircular
-// implementation of Mutex avoiding the broken atomic primitives.
-//
-// * recover is only partially implemented. Also, the interpreter
-// makes no attempt to distinguish target panics from interpreter
-// crashes.
-//
-// * map iteration is asymptotically inefficient.
-//
-// * the sizes of the int, uint and uintptr types in the target
-// program are assumed to be the same as those of the interpreter
-// itself.
-//
-// * all values occupy space, even those of types defined by the spec
-// to have zero size, e.g. struct{}. This can cause asymptotic
-// performance degradation.
-//
-// * os.Exit is implemented using panic, causing deferred functions to
-// run.
-package interp // import "golang.org/x/tools/go/ssa/interp"
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "os"
- "reflect"
- "runtime"
- "sync/atomic"
-
- "golang.org/x/tools/go/ssa"
-)
-
-type continuation int
-
-const (
- kNext continuation = iota
- kReturn
- kJump
-)
-
-// Mode is a bitmask of options affecting the interpreter.
-type Mode uint
-
-const (
- DisableRecover Mode = 1 << iota // Disable recover() in target programs; show interpreter crash instead.
- EnableTracing // Print a trace of all instructions as they are interpreted.
-)
-
-type methodSet map[string]*ssa.Function
-
-// State shared between all interpreted goroutines.
-type interpreter struct {
- osArgs []value // the value of os.Args
- prog *ssa.Program // the SSA program
- globals map[ssa.Value]*value // addresses of global variables (immutable)
- mode Mode // interpreter options
- reflectPackage *ssa.Package // the fake reflect package
- errorMethods methodSet // the method set of reflect.error, which implements the error interface.
- rtypeMethods methodSet // the method set of rtype, which implements the reflect.Type interface.
- runtimeErrorString types.Type // the runtime.errorString type
- sizes types.Sizes // the effective type-sizing function
- goroutines int32 // atomically updated
-}
-
-type deferred struct {
- fn value
- args []value
- instr *ssa.Defer
- tail *deferred
-}
-
-type frame struct {
- i *interpreter
- caller *frame
- fn *ssa.Function
- block, prevBlock *ssa.BasicBlock
- env map[ssa.Value]value // dynamic values of SSA variables
- locals []value
- defers *deferred
- result value
- panicking bool
- panic interface{}
-}
-
-func (fr *frame) get(key ssa.Value) value {
- switch key := key.(type) {
- case nil:
- // Hack; simplifies handling of optional attributes
- // such as ssa.Slice.{Low,High}.
- return nil
- case *ssa.Function, *ssa.Builtin:
- return key
- case *ssa.Const:
- return constValue(key)
- case *ssa.Global:
- if r, ok := fr.i.globals[key]; ok {
- return r
- }
- }
- if r, ok := fr.env[key]; ok {
- return r
- }
- panic(fmt.Sprintf("get: no value for %T: %v", key, key.Name()))
-}
-
-// runDefer runs a deferred call d.
-// It always returns normally, but may set or clear fr.panic.
-//
-func (fr *frame) runDefer(d *deferred) {
- if fr.i.mode&EnableTracing != 0 {
- fmt.Fprintf(os.Stderr, "%s: invoking deferred function call\n",
- fr.i.prog.Fset.Position(d.instr.Pos()))
- }
- var ok bool
- defer func() {
- if !ok {
- // Deferred call created a new state of panic.
- fr.panicking = true
- fr.panic = recover()
- }
- }()
- call(fr.i, fr, d.instr.Pos(), d.fn, d.args)
- ok = true
-}
-
-// runDefers executes fr's deferred function calls in LIFO order.
-//
-// On entry, fr.panicking indicates a state of panic; if
-// true, fr.panic contains the panic value.
-//
-// On completion, if a deferred call started a panic, or if no
-// deferred call recovered from a previous state of panic, then
-// runDefers itself panics after the last deferred call has run.
-//
-// If there was no initial state of panic, or it was recovered from,
-// runDefers returns normally.
-//
-func (fr *frame) runDefers() {
- for d := fr.defers; d != nil; d = d.tail {
- fr.runDefer(d)
- }
- fr.defers = nil
- if fr.panicking {
- panic(fr.panic) // new panic, or still panicking
- }
-}
-
-// lookupMethod returns the method set for type typ, which may be one
-// of the interpreter's fake types.
-func lookupMethod(i *interpreter, typ types.Type, meth *types.Func) *ssa.Function {
- switch typ {
- case rtypeType:
- return i.rtypeMethods[meth.Id()]
- case errorType:
- return i.errorMethods[meth.Id()]
- }
- return i.prog.LookupMethod(typ, meth.Pkg(), meth.Name())
-}
-
-// visitInstr interprets a single ssa.Instruction within the activation
-// record frame. It returns a continuation value indicating where to
-// read the next instruction from.
-func visitInstr(fr *frame, instr ssa.Instruction) continuation {
- switch instr := instr.(type) {
- case *ssa.DebugRef:
- // no-op
-
- case *ssa.UnOp:
- fr.env[instr] = unop(instr, fr.get(instr.X))
-
- case *ssa.BinOp:
- fr.env[instr] = binop(instr.Op, instr.X.Type(), fr.get(instr.X), fr.get(instr.Y))
-
- case *ssa.Call:
- fn, args := prepareCall(fr, &instr.Call)
- fr.env[instr] = call(fr.i, fr, instr.Pos(), fn, args)
-
- case *ssa.ChangeInterface:
- fr.env[instr] = fr.get(instr.X)
-
- case *ssa.ChangeType:
- fr.env[instr] = fr.get(instr.X) // (can't fail)
-
- case *ssa.Convert:
- fr.env[instr] = conv(instr.Type(), instr.X.Type(), fr.get(instr.X))
-
- case *ssa.MakeInterface:
- fr.env[instr] = iface{t: instr.X.Type(), v: fr.get(instr.X)}
-
- case *ssa.Extract:
- fr.env[instr] = fr.get(instr.Tuple).(tuple)[instr.Index]
-
- case *ssa.Slice:
- fr.env[instr] = slice(fr.get(instr.X), fr.get(instr.Low), fr.get(instr.High), fr.get(instr.Max))
-
- case *ssa.Return:
- switch len(instr.Results) {
- case 0:
- case 1:
- fr.result = fr.get(instr.Results[0])
- default:
- var res []value
- for _, r := range instr.Results {
- res = append(res, fr.get(r))
- }
- fr.result = tuple(res)
- }
- fr.block = nil
- return kReturn
-
- case *ssa.RunDefers:
- fr.runDefers()
-
- case *ssa.Panic:
- panic(targetPanic{fr.get(instr.X)})
-
- case *ssa.Send:
- fr.get(instr.Chan).(chan value) <- fr.get(instr.X)
-
- case *ssa.Store:
- store(deref(instr.Addr.Type()), fr.get(instr.Addr).(*value), fr.get(instr.Val))
-
- case *ssa.If:
- succ := 1
- if fr.get(instr.Cond).(bool) {
- succ = 0
- }
- fr.prevBlock, fr.block = fr.block, fr.block.Succs[succ]
- return kJump
-
- case *ssa.Jump:
- fr.prevBlock, fr.block = fr.block, fr.block.Succs[0]
- return kJump
-
- case *ssa.Defer:
- fn, args := prepareCall(fr, &instr.Call)
- fr.defers = &deferred{
- fn: fn,
- args: args,
- instr: instr,
- tail: fr.defers,
- }
-
- case *ssa.Go:
- fn, args := prepareCall(fr, &instr.Call)
- atomic.AddInt32(&fr.i.goroutines, 1)
- go func() {
- call(fr.i, nil, instr.Pos(), fn, args)
- atomic.AddInt32(&fr.i.goroutines, -1)
- }()
-
- case *ssa.MakeChan:
- fr.env[instr] = make(chan value, asInt(fr.get(instr.Size)))
-
- case *ssa.Alloc:
- var addr *value
- if instr.Heap {
- // new
- addr = new(value)
- fr.env[instr] = addr
- } else {
- // local
- addr = fr.env[instr].(*value)
- }
- *addr = zero(deref(instr.Type()))
-
- case *ssa.MakeSlice:
- slice := make([]value, asInt(fr.get(instr.Cap)))
- tElt := instr.Type().Underlying().(*types.Slice).Elem()
- for i := range slice {
- slice[i] = zero(tElt)
- }
- fr.env[instr] = slice[:asInt(fr.get(instr.Len))]
-
- case *ssa.MakeMap:
- reserve := 0
- if instr.Reserve != nil {
- reserve = asInt(fr.get(instr.Reserve))
- }
- fr.env[instr] = makeMap(instr.Type().Underlying().(*types.Map).Key(), reserve)
-
- case *ssa.Range:
- fr.env[instr] = rangeIter(fr.get(instr.X), instr.X.Type())
-
- case *ssa.Next:
- fr.env[instr] = fr.get(instr.Iter).(iter).next()
-
- case *ssa.FieldAddr:
- fr.env[instr] = &(*fr.get(instr.X).(*value)).(structure)[instr.Field]
-
- case *ssa.Field:
- fr.env[instr] = fr.get(instr.X).(structure)[instr.Field]
-
- case *ssa.IndexAddr:
- x := fr.get(instr.X)
- idx := fr.get(instr.Index)
- switch x := x.(type) {
- case []value:
- fr.env[instr] = &x[asInt(idx)]
- case *value: // *array
- fr.env[instr] = &(*x).(array)[asInt(idx)]
- default:
- panic(fmt.Sprintf("unexpected x type in IndexAddr: %T", x))
- }
-
- case *ssa.Index:
- fr.env[instr] = fr.get(instr.X).(array)[asInt(fr.get(instr.Index))]
-
- case *ssa.Lookup:
- fr.env[instr] = lookup(instr, fr.get(instr.X), fr.get(instr.Index))
-
- case *ssa.MapUpdate:
- m := fr.get(instr.Map)
- key := fr.get(instr.Key)
- v := fr.get(instr.Value)
- switch m := m.(type) {
- case map[value]value:
- m[key] = v
- case *hashmap:
- m.insert(key.(hashable), v)
- default:
- panic(fmt.Sprintf("illegal map type: %T", m))
- }
-
- case *ssa.TypeAssert:
- fr.env[instr] = typeAssert(fr.i, instr, fr.get(instr.X).(iface))
-
- case *ssa.MakeClosure:
- var bindings []value
- for _, binding := range instr.Bindings {
- bindings = append(bindings, fr.get(binding))
- }
- fr.env[instr] = &closure{instr.Fn.(*ssa.Function), bindings}
-
- case *ssa.Phi:
- for i, pred := range instr.Block().Preds {
- if fr.prevBlock == pred {
- fr.env[instr] = fr.get(instr.Edges[i])
- break
- }
- }
-
- case *ssa.Select:
- var cases []reflect.SelectCase
- if !instr.Blocking {
- cases = append(cases, reflect.SelectCase{
- Dir: reflect.SelectDefault,
- })
- }
- for _, state := range instr.States {
- var dir reflect.SelectDir
- if state.Dir == types.RecvOnly {
- dir = reflect.SelectRecv
- } else {
- dir = reflect.SelectSend
- }
- var send reflect.Value
- if state.Send != nil {
- send = reflect.ValueOf(fr.get(state.Send))
- }
- cases = append(cases, reflect.SelectCase{
- Dir: dir,
- Chan: reflect.ValueOf(fr.get(state.Chan)),
- Send: send,
- })
- }
- chosen, recv, recvOk := reflect.Select(cases)
- if !instr.Blocking {
- chosen-- // default case should have index -1.
- }
- r := tuple{chosen, recvOk}
- for i, st := range instr.States {
- if st.Dir == types.RecvOnly {
- var v value
- if i == chosen && recvOk {
- // No need to copy since send makes an unaliased copy.
- v = recv.Interface().(value)
- } else {
- v = zero(st.Chan.Type().Underlying().(*types.Chan).Elem())
- }
- r = append(r, v)
- }
- }
- fr.env[instr] = r
-
- default:
- panic(fmt.Sprintf("unexpected instruction: %T", instr))
- }
-
- // if val, ok := instr.(ssa.Value); ok {
- // fmt.Println(toString(fr.env[val])) // debugging
- // }
-
- return kNext
-}
-
-// prepareCall determines the function value and argument values for a
-// function call in a Call, Go or Defer instruction, performing
-// interface method lookup if needed.
-//
-func prepareCall(fr *frame, call *ssa.CallCommon) (fn value, args []value) {
- v := fr.get(call.Value)
- if call.Method == nil {
- // Function call.
- fn = v
- } else {
- // Interface method invocation.
- recv := v.(iface)
- if recv.t == nil {
- panic("method invoked on nil interface")
- }
- if f := lookupMethod(fr.i, recv.t, call.Method); f == nil {
- // Unreachable in well-typed programs.
- panic(fmt.Sprintf("method set for dynamic type %v does not contain %s", recv.t, call.Method))
- } else {
- fn = f
- }
- args = append(args, recv.v)
- }
- for _, arg := range call.Args {
- args = append(args, fr.get(arg))
- }
- return
-}
-
-// call interprets a call to a function (function, builtin or closure)
-// fn with arguments args, returning its result.
-// callpos is the position of the callsite.
-//
-func call(i *interpreter, caller *frame, callpos token.Pos, fn value, args []value) value {
- switch fn := fn.(type) {
- case *ssa.Function:
- if fn == nil {
- panic("call of nil function") // nil of func type
- }
- return callSSA(i, caller, callpos, fn, args, nil)
- case *closure:
- return callSSA(i, caller, callpos, fn.Fn, args, fn.Env)
- case *ssa.Builtin:
- return callBuiltin(caller, callpos, fn, args)
- }
- panic(fmt.Sprintf("cannot call %T", fn))
-}
-
-func loc(fset *token.FileSet, pos token.Pos) string {
- if pos == token.NoPos {
- return ""
- }
- return " at " + fset.Position(pos).String()
-}
-
-// callSSA interprets a call to function fn with arguments args,
-// and lexical environment env, returning its result.
-// callpos is the position of the callsite.
-//
-func callSSA(i *interpreter, caller *frame, callpos token.Pos, fn *ssa.Function, args []value, env []value) value {
- if i.mode&EnableTracing != 0 {
- fset := fn.Prog.Fset
- // TODO(adonovan): fix: loc() lies for external functions.
- fmt.Fprintf(os.Stderr, "Entering %s%s.\n", fn, loc(fset, fn.Pos()))
- suffix := ""
- if caller != nil {
- suffix = ", resuming " + caller.fn.String() + loc(fset, callpos)
- }
- defer fmt.Fprintf(os.Stderr, "Leaving %s%s.\n", fn, suffix)
- }
- fr := &frame{
- i: i,
- caller: caller, // for panic/recover
- fn: fn,
- }
- if fn.Parent() == nil {
- name := fn.String()
- if ext := externals[name]; ext != nil {
- if i.mode&EnableTracing != 0 {
- fmt.Fprintln(os.Stderr, "\t(external)")
- }
- return ext(fr, args)
- }
- if fn.Blocks == nil {
- panic("no code for function: " + name)
- }
- }
- fr.env = make(map[ssa.Value]value)
- fr.block = fn.Blocks[0]
- fr.locals = make([]value, len(fn.Locals))
- for i, l := range fn.Locals {
- fr.locals[i] = zero(deref(l.Type()))
- fr.env[l] = &fr.locals[i]
- }
- for i, p := range fn.Params {
- fr.env[p] = args[i]
- }
- for i, fv := range fn.FreeVars {
- fr.env[fv] = env[i]
- }
- for fr.block != nil {
- runFrame(fr)
- }
- // Destroy the locals to avoid accidental use after return.
- for i := range fn.Locals {
- fr.locals[i] = bad{}
- }
- return fr.result
-}
-
-// runFrame executes SSA instructions starting at fr.block and
-// continuing until a return, a panic, or a recovered panic.
-//
-// After a panic, runFrame panics.
-//
-// After a normal return, fr.result contains the result of the call
-// and fr.block is nil.
-//
-// A recovered panic in a function without named return parameters
-// (NRPs) becomes a normal return of the zero value of the function's
-// result type.
-//
-// After a recovered panic in a function with NRPs, fr.result is
-// undefined and fr.block contains the block at which to resume
-// control.
-//
-func runFrame(fr *frame) {
- defer func() {
- if fr.block == nil {
- return // normal return
- }
- if fr.i.mode&DisableRecover != 0 {
- return // let interpreter crash
- }
- fr.panicking = true
- fr.panic = recover()
- if fr.i.mode&EnableTracing != 0 {
- fmt.Fprintf(os.Stderr, "Panicking: %T %v.\n", fr.panic, fr.panic)
- }
- fr.runDefers()
- fr.block = fr.fn.Recover
- }()
-
- for {
- if fr.i.mode&EnableTracing != 0 {
- fmt.Fprintf(os.Stderr, ".%s:\n", fr.block)
- }
- block:
- for _, instr := range fr.block.Instrs {
- if fr.i.mode&EnableTracing != 0 {
- if v, ok := instr.(ssa.Value); ok {
- fmt.Fprintln(os.Stderr, "\t", v.Name(), "=", instr)
- } else {
- fmt.Fprintln(os.Stderr, "\t", instr)
- }
- }
- switch visitInstr(fr, instr) {
- case kReturn:
- return
- case kNext:
- // no-op
- case kJump:
- break block
- }
- }
- }
-}
-
-// doRecover implements the recover() built-in.
-func doRecover(caller *frame) value {
- // recover() must be exactly one level beneath the deferred
- // function (two levels beneath the panicking function) to
- // have any effect. Thus we ignore both "defer recover()" and
- // "defer f() -> g() -> recover()".
- if caller.i.mode&DisableRecover == 0 &&
- caller != nil && !caller.panicking &&
- caller.caller != nil && caller.caller.panicking {
- caller.caller.panicking = false
- p := caller.caller.panic
- caller.caller.panic = nil
-
- // TODO(adonovan): support runtime.Goexit.
- switch p := p.(type) {
- case targetPanic:
- // The target program explicitly called panic().
- return p.v
- case runtime.Error:
- // The interpreter encountered a runtime error.
- return iface{caller.i.runtimeErrorString, p.Error()}
- case string:
- // The interpreter explicitly called panic().
- return iface{caller.i.runtimeErrorString, p}
- default:
- panic(fmt.Sprintf("unexpected panic type %T in target call to recover()", p))
- }
- }
- return iface{}
-}
-
-// setGlobal sets the value of a system-initialized global variable.
-func setGlobal(i *interpreter, pkg *ssa.Package, name string, v value) {
- if g, ok := i.globals[pkg.Var(name)]; ok {
- *g = v
- return
- }
- panic("no global variable: " + pkg.Pkg.Path() + "." + name)
-}
-
-var environ []value
-
-func init() {
- for _, s := range os.Environ() {
- environ = append(environ, s)
- }
- environ = append(environ, "GOSSAINTERP=1")
- environ = append(environ, "GOARCH="+runtime.GOARCH)
-}
-
-// deleteBodies delete the bodies of all standalone functions except the
-// specified ones. A missing intrinsic leads to a clear runtime error.
-func deleteBodies(pkg *ssa.Package, except ...string) {
- keep := make(map[string]bool)
- for _, e := range except {
- keep[e] = true
- }
- for _, mem := range pkg.Members {
- if fn, ok := mem.(*ssa.Function); ok && !keep[fn.Name()] {
- fn.Blocks = nil
- }
- }
-}
-
-// Interpret interprets the Go program whose main package is mainpkg.
-// mode specifies various interpreter options. filename and args are
-// the initial values of os.Args for the target program. sizes is the
-// effective type-sizing function for this program.
-//
-// Interpret returns the exit code of the program: 2 for panic (like
-// gc does), or the argument to os.Exit for normal termination.
-//
-// The SSA program must include the "runtime" package.
-//
-func Interpret(mainpkg *ssa.Package, mode Mode, sizes types.Sizes, filename string, args []string) (exitCode int) {
- if syswrite == nil {
- fmt.Fprintln(os.Stderr, "Interpret: unsupported platform.")
- return 1
- }
-
- i := &interpreter{
- prog: mainpkg.Prog,
- globals: make(map[ssa.Value]*value),
- mode: mode,
- sizes: sizes,
- goroutines: 1,
- }
- runtimePkg := i.prog.ImportedPackage("runtime")
- if runtimePkg == nil {
- panic("ssa.Program doesn't include runtime package")
- }
- i.runtimeErrorString = runtimePkg.Type("errorString").Object().Type()
-
- initReflect(i)
-
- i.osArgs = append(i.osArgs, filename)
- for _, arg := range args {
- i.osArgs = append(i.osArgs, arg)
- }
-
- for _, pkg := range i.prog.AllPackages() {
- // Initialize global storage.
- for _, m := range pkg.Members {
- switch v := m.(type) {
- case *ssa.Global:
- cell := zero(deref(v.Type()))
- i.globals[v] = &cell
- }
- }
-
- // Ad-hoc initialization for magic system variables.
- switch pkg.Pkg.Path() {
- case "syscall":
- setGlobal(i, pkg, "envs", environ)
-
- case "reflect":
- deleteBodies(pkg, "DeepEqual", "deepValueEqual")
-
- case "runtime":
- sz := sizes.Sizeof(pkg.Pkg.Scope().Lookup("MemStats").Type())
- setGlobal(i, pkg, "sizeof_C_MStats", uintptr(sz))
- deleteBodies(pkg, "GOROOT", "gogetenv")
- }
- }
-
- // Top-level error handler.
- exitCode = 2
- defer func() {
- if exitCode != 2 || i.mode&DisableRecover != 0 {
- return
- }
- switch p := recover().(type) {
- case exitPanic:
- exitCode = int(p)
- return
- case targetPanic:
- fmt.Fprintln(os.Stderr, "panic:", toString(p.v))
- case runtime.Error:
- fmt.Fprintln(os.Stderr, "panic:", p.Error())
- case string:
- fmt.Fprintln(os.Stderr, "panic:", p)
- default:
- fmt.Fprintf(os.Stderr, "panic: unexpected type: %T: %v\n", p, p)
- }
-
- // TODO(adonovan): dump panicking interpreter goroutine?
- // buf := make([]byte, 0x10000)
- // runtime.Stack(buf, false)
- // fmt.Fprintln(os.Stderr, string(buf))
- // (Or dump panicking target goroutine?)
- }()
-
- // Run!
- call(i, nil, token.NoPos, mainpkg.Func("init"), nil)
- if mainFn := mainpkg.Func("main"); mainFn != nil {
- call(i, nil, token.NoPos, mainFn, nil)
- exitCode = 0
- } else {
- fmt.Fprintln(os.Stderr, "No main function.")
- exitCode = 1
- }
- return
-}
-
-// deref returns a pointer's element type; otherwise it returns typ.
-// TODO(adonovan): Import from ssa?
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/map.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/map.go
deleted file mode 100644
index 92ccf9034..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/map.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Custom hashtable atop map.
-// For use when the key's equivalence relation is not consistent with ==.
-
-// The Go specification doesn't address the atomicity of map operations.
-// The FAQ states that an implementation is permitted to crash on
-// concurrent map access.
-
-import (
- "go/types"
-)
-
-type hashable interface {
- hash(t types.Type) int
- eq(t types.Type, x interface{}) bool
-}
-
-type entry struct {
- key hashable
- value value
- next *entry
-}
-
-// A hashtable atop the built-in map. Since each bucket contains
-// exactly one hash value, there's no need to perform hash-equality
-// tests when walking the linked list. Rehashing is done by the
-// underlying map.
-type hashmap struct {
- keyType types.Type
- table map[int]*entry
- length int // number of entries in map
-}
-
-// makeMap returns an empty initialized map of key type kt,
-// preallocating space for reserve elements.
-func makeMap(kt types.Type, reserve int) value {
- if usesBuiltinMap(kt) {
- return make(map[value]value, reserve)
- }
- return &hashmap{keyType: kt, table: make(map[int]*entry, reserve)}
-}
-
-// delete removes the association for key k, if any.
-func (m *hashmap) delete(k hashable) {
- if m != nil {
- hash := k.hash(m.keyType)
- head := m.table[hash]
- if head != nil {
- if k.eq(m.keyType, head.key) {
- m.table[hash] = head.next
- m.length--
- return
- }
- prev := head
- for e := head.next; e != nil; e = e.next {
- if k.eq(m.keyType, e.key) {
- prev.next = e.next
- m.length--
- return
- }
- prev = e
- }
- }
- }
-}
-
-// lookup returns the value associated with key k, if present, or
-// value(nil) otherwise.
-func (m *hashmap) lookup(k hashable) value {
- if m != nil {
- hash := k.hash(m.keyType)
- for e := m.table[hash]; e != nil; e = e.next {
- if k.eq(m.keyType, e.key) {
- return e.value
- }
- }
- }
- return nil
-}
-
-// insert updates the map to associate key k with value v. If there
-// was already an association for an eq() (though not necessarily ==)
-// k, the previous key remains in the map and its associated value is
-// updated.
-func (m *hashmap) insert(k hashable, v value) {
- hash := k.hash(m.keyType)
- head := m.table[hash]
- for e := head; e != nil; e = e.next {
- if k.eq(m.keyType, e.key) {
- e.value = v
- return
- }
- }
- m.table[hash] = &entry{
- key: k,
- value: v,
- next: head,
- }
- m.length++
-}
-
-// len returns the number of key/value associations in the map.
-func (m *hashmap) len() int {
- if m != nil {
- return m.length
- }
- return 0
-}
-
-// entries returns a rangeable map of entries.
-func (m *hashmap) entries() map[int]*entry {
- if m != nil {
- return m.table
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/ops.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/ops.go
deleted file mode 100644
index f3419ec48..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/ops.go
+++ /dev/null
@@ -1,1396 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-import (
- "bytes"
- "fmt"
- exact "go/constant"
- "go/token"
- "go/types"
- "strings"
- "sync"
- "unsafe"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// If the target program panics, the interpreter panics with this type.
-type targetPanic struct {
- v value
-}
-
-func (p targetPanic) String() string {
- return toString(p.v)
-}
-
-// If the target program calls exit, the interpreter panics with this type.
-type exitPanic int
-
-// constValue returns the value of the constant with the
-// dynamic type tag appropriate for c.Type().
-func constValue(c *ssa.Const) value {
- if c.IsNil() {
- return zero(c.Type()) // typed nil
- }
-
- if t, ok := c.Type().Underlying().(*types.Basic); ok {
- // TODO(adonovan): eliminate untyped constants from SSA form.
- switch t.Kind() {
- case types.Bool, types.UntypedBool:
- return exact.BoolVal(c.Value)
- case types.Int, types.UntypedInt:
- // Assume sizeof(int) is same on host and target.
- return int(c.Int64())
- case types.Int8:
- return int8(c.Int64())
- case types.Int16:
- return int16(c.Int64())
- case types.Int32, types.UntypedRune:
- return int32(c.Int64())
- case types.Int64:
- return c.Int64()
- case types.Uint:
- // Assume sizeof(uint) is same on host and target.
- return uint(c.Uint64())
- case types.Uint8:
- return uint8(c.Uint64())
- case types.Uint16:
- return uint16(c.Uint64())
- case types.Uint32:
- return uint32(c.Uint64())
- case types.Uint64:
- return c.Uint64()
- case types.Uintptr:
- // Assume sizeof(uintptr) is same on host and target.
- return uintptr(c.Uint64())
- case types.Float32:
- return float32(c.Float64())
- case types.Float64, types.UntypedFloat:
- return c.Float64()
- case types.Complex64:
- return complex64(c.Complex128())
- case types.Complex128, types.UntypedComplex:
- return c.Complex128()
- case types.String, types.UntypedString:
- if c.Value.Kind() == exact.String {
- return exact.StringVal(c.Value)
- }
- return string(rune(c.Int64()))
- }
- }
-
- panic(fmt.Sprintf("constValue: %s", c))
-}
-
-// asInt converts x, which must be an integer, to an int suitable for
-// use as a slice or array index or operand to make().
-func asInt(x value) int {
- switch x := x.(type) {
- case int:
- return x
- case int8:
- return int(x)
- case int16:
- return int(x)
- case int32:
- return int(x)
- case int64:
- return int(x)
- case uint:
- return int(x)
- case uint8:
- return int(x)
- case uint16:
- return int(x)
- case uint32:
- return int(x)
- case uint64:
- return int(x)
- case uintptr:
- return int(x)
- }
- panic(fmt.Sprintf("cannot convert %T to int", x))
-}
-
-// asUint64 converts x, which must be an unsigned integer, to a uint64
-// suitable for use as a bitwise shift count.
-func asUint64(x value) uint64 {
- switch x := x.(type) {
- case uint:
- return uint64(x)
- case uint8:
- return uint64(x)
- case uint16:
- return uint64(x)
- case uint32:
- return uint64(x)
- case uint64:
- return x
- case uintptr:
- return uint64(x)
- }
- panic(fmt.Sprintf("cannot convert %T to uint64", x))
-}
-
-// zero returns a new "zero" value of the specified type.
-func zero(t types.Type) value {
- switch t := t.(type) {
- case *types.Basic:
- if t.Kind() == types.UntypedNil {
- panic("untyped nil has no zero value")
- }
- if t.Info()&types.IsUntyped != 0 {
- // TODO(adonovan): make it an invariant that
- // this is unreachable. Currently some
- // constants have 'untyped' types when they
- // should be defaulted by the typechecker.
- t = ssa.DefaultType(t).(*types.Basic)
- }
- switch t.Kind() {
- case types.Bool:
- return false
- case types.Int:
- return int(0)
- case types.Int8:
- return int8(0)
- case types.Int16:
- return int16(0)
- case types.Int32:
- return int32(0)
- case types.Int64:
- return int64(0)
- case types.Uint:
- return uint(0)
- case types.Uint8:
- return uint8(0)
- case types.Uint16:
- return uint16(0)
- case types.Uint32:
- return uint32(0)
- case types.Uint64:
- return uint64(0)
- case types.Uintptr:
- return uintptr(0)
- case types.Float32:
- return float32(0)
- case types.Float64:
- return float64(0)
- case types.Complex64:
- return complex64(0)
- case types.Complex128:
- return complex128(0)
- case types.String:
- return ""
- case types.UnsafePointer:
- return unsafe.Pointer(nil)
- default:
- panic(fmt.Sprint("zero for unexpected type:", t))
- }
- case *types.Pointer:
- return (*value)(nil)
- case *types.Array:
- a := make(array, t.Len())
- for i := range a {
- a[i] = zero(t.Elem())
- }
- return a
- case *types.Named:
- return zero(t.Underlying())
- case *types.Interface:
- return iface{} // nil type, methodset and value
- case *types.Slice:
- return []value(nil)
- case *types.Struct:
- s := make(structure, t.NumFields())
- for i := range s {
- s[i] = zero(t.Field(i).Type())
- }
- return s
- case *types.Tuple:
- if t.Len() == 1 {
- return zero(t.At(0).Type())
- }
- s := make(tuple, t.Len())
- for i := range s {
- s[i] = zero(t.At(i).Type())
- }
- return s
- case *types.Chan:
- return chan value(nil)
- case *types.Map:
- if usesBuiltinMap(t.Key()) {
- return map[value]value(nil)
- }
- return (*hashmap)(nil)
- case *types.Signature:
- return (*ssa.Function)(nil)
- }
- panic(fmt.Sprint("zero: unexpected ", t))
-}
-
-// slice returns x[lo:hi:max]. Any of lo, hi and max may be nil.
-func slice(x, lo, hi, max value) value {
- var Len, Cap int
- switch x := x.(type) {
- case string:
- Len = len(x)
- case []value:
- Len = len(x)
- Cap = cap(x)
- case *value: // *array
- a := (*x).(array)
- Len = len(a)
- Cap = cap(a)
- }
-
- l := 0
- if lo != nil {
- l = asInt(lo)
- }
-
- h := Len
- if hi != nil {
- h = asInt(hi)
- }
-
- m := Cap
- if max != nil {
- m = asInt(max)
- }
-
- switch x := x.(type) {
- case string:
- return x[l:h]
- case []value:
- return x[l:h:m]
- case *value: // *array
- a := (*x).(array)
- return []value(a)[l:h:m]
- }
- panic(fmt.Sprintf("slice: unexpected X type: %T", x))
-}
-
-// lookup returns x[idx] where x is a map or string.
-func lookup(instr *ssa.Lookup, x, idx value) value {
- switch x := x.(type) { // map or string
- case map[value]value, *hashmap:
- var v value
- var ok bool
- switch x := x.(type) {
- case map[value]value:
- v, ok = x[idx]
- case *hashmap:
- v = x.lookup(idx.(hashable))
- ok = v != nil
- }
- if !ok {
- v = zero(instr.X.Type().Underlying().(*types.Map).Elem())
- }
- if instr.CommaOk {
- v = tuple{v, ok}
- }
- return v
- case string:
- return x[asInt(idx)]
- }
- panic(fmt.Sprintf("unexpected x type in Lookup: %T", x))
-}
-
-// binop implements all arithmetic and logical binary operators for
-// numeric datatypes and strings. Both operands must have identical
-// dynamic type.
-//
-func binop(op token.Token, t types.Type, x, y value) value {
- switch op {
- case token.ADD:
- switch x.(type) {
- case int:
- return x.(int) + y.(int)
- case int8:
- return x.(int8) + y.(int8)
- case int16:
- return x.(int16) + y.(int16)
- case int32:
- return x.(int32) + y.(int32)
- case int64:
- return x.(int64) + y.(int64)
- case uint:
- return x.(uint) + y.(uint)
- case uint8:
- return x.(uint8) + y.(uint8)
- case uint16:
- return x.(uint16) + y.(uint16)
- case uint32:
- return x.(uint32) + y.(uint32)
- case uint64:
- return x.(uint64) + y.(uint64)
- case uintptr:
- return x.(uintptr) + y.(uintptr)
- case float32:
- return x.(float32) + y.(float32)
- case float64:
- return x.(float64) + y.(float64)
- case complex64:
- return x.(complex64) + y.(complex64)
- case complex128:
- return x.(complex128) + y.(complex128)
- case string:
- return x.(string) + y.(string)
- }
-
- case token.SUB:
- switch x.(type) {
- case int:
- return x.(int) - y.(int)
- case int8:
- return x.(int8) - y.(int8)
- case int16:
- return x.(int16) - y.(int16)
- case int32:
- return x.(int32) - y.(int32)
- case int64:
- return x.(int64) - y.(int64)
- case uint:
- return x.(uint) - y.(uint)
- case uint8:
- return x.(uint8) - y.(uint8)
- case uint16:
- return x.(uint16) - y.(uint16)
- case uint32:
- return x.(uint32) - y.(uint32)
- case uint64:
- return x.(uint64) - y.(uint64)
- case uintptr:
- return x.(uintptr) - y.(uintptr)
- case float32:
- return x.(float32) - y.(float32)
- case float64:
- return x.(float64) - y.(float64)
- case complex64:
- return x.(complex64) - y.(complex64)
- case complex128:
- return x.(complex128) - y.(complex128)
- }
-
- case token.MUL:
- switch x.(type) {
- case int:
- return x.(int) * y.(int)
- case int8:
- return x.(int8) * y.(int8)
- case int16:
- return x.(int16) * y.(int16)
- case int32:
- return x.(int32) * y.(int32)
- case int64:
- return x.(int64) * y.(int64)
- case uint:
- return x.(uint) * y.(uint)
- case uint8:
- return x.(uint8) * y.(uint8)
- case uint16:
- return x.(uint16) * y.(uint16)
- case uint32:
- return x.(uint32) * y.(uint32)
- case uint64:
- return x.(uint64) * y.(uint64)
- case uintptr:
- return x.(uintptr) * y.(uintptr)
- case float32:
- return x.(float32) * y.(float32)
- case float64:
- return x.(float64) * y.(float64)
- case complex64:
- return x.(complex64) * y.(complex64)
- case complex128:
- return x.(complex128) * y.(complex128)
- }
-
- case token.QUO:
- switch x.(type) {
- case int:
- return x.(int) / y.(int)
- case int8:
- return x.(int8) / y.(int8)
- case int16:
- return x.(int16) / y.(int16)
- case int32:
- return x.(int32) / y.(int32)
- case int64:
- return x.(int64) / y.(int64)
- case uint:
- return x.(uint) / y.(uint)
- case uint8:
- return x.(uint8) / y.(uint8)
- case uint16:
- return x.(uint16) / y.(uint16)
- case uint32:
- return x.(uint32) / y.(uint32)
- case uint64:
- return x.(uint64) / y.(uint64)
- case uintptr:
- return x.(uintptr) / y.(uintptr)
- case float32:
- return x.(float32) / y.(float32)
- case float64:
- return x.(float64) / y.(float64)
- case complex64:
- return x.(complex64) / y.(complex64)
- case complex128:
- return x.(complex128) / y.(complex128)
- }
-
- case token.REM:
- switch x.(type) {
- case int:
- return x.(int) % y.(int)
- case int8:
- return x.(int8) % y.(int8)
- case int16:
- return x.(int16) % y.(int16)
- case int32:
- return x.(int32) % y.(int32)
- case int64:
- return x.(int64) % y.(int64)
- case uint:
- return x.(uint) % y.(uint)
- case uint8:
- return x.(uint8) % y.(uint8)
- case uint16:
- return x.(uint16) % y.(uint16)
- case uint32:
- return x.(uint32) % y.(uint32)
- case uint64:
- return x.(uint64) % y.(uint64)
- case uintptr:
- return x.(uintptr) % y.(uintptr)
- }
-
- case token.AND:
- switch x.(type) {
- case int:
- return x.(int) & y.(int)
- case int8:
- return x.(int8) & y.(int8)
- case int16:
- return x.(int16) & y.(int16)
- case int32:
- return x.(int32) & y.(int32)
- case int64:
- return x.(int64) & y.(int64)
- case uint:
- return x.(uint) & y.(uint)
- case uint8:
- return x.(uint8) & y.(uint8)
- case uint16:
- return x.(uint16) & y.(uint16)
- case uint32:
- return x.(uint32) & y.(uint32)
- case uint64:
- return x.(uint64) & y.(uint64)
- case uintptr:
- return x.(uintptr) & y.(uintptr)
- }
-
- case token.OR:
- switch x.(type) {
- case int:
- return x.(int) | y.(int)
- case int8:
- return x.(int8) | y.(int8)
- case int16:
- return x.(int16) | y.(int16)
- case int32:
- return x.(int32) | y.(int32)
- case int64:
- return x.(int64) | y.(int64)
- case uint:
- return x.(uint) | y.(uint)
- case uint8:
- return x.(uint8) | y.(uint8)
- case uint16:
- return x.(uint16) | y.(uint16)
- case uint32:
- return x.(uint32) | y.(uint32)
- case uint64:
- return x.(uint64) | y.(uint64)
- case uintptr:
- return x.(uintptr) | y.(uintptr)
- }
-
- case token.XOR:
- switch x.(type) {
- case int:
- return x.(int) ^ y.(int)
- case int8:
- return x.(int8) ^ y.(int8)
- case int16:
- return x.(int16) ^ y.(int16)
- case int32:
- return x.(int32) ^ y.(int32)
- case int64:
- return x.(int64) ^ y.(int64)
- case uint:
- return x.(uint) ^ y.(uint)
- case uint8:
- return x.(uint8) ^ y.(uint8)
- case uint16:
- return x.(uint16) ^ y.(uint16)
- case uint32:
- return x.(uint32) ^ y.(uint32)
- case uint64:
- return x.(uint64) ^ y.(uint64)
- case uintptr:
- return x.(uintptr) ^ y.(uintptr)
- }
-
- case token.AND_NOT:
- switch x.(type) {
- case int:
- return x.(int) &^ y.(int)
- case int8:
- return x.(int8) &^ y.(int8)
- case int16:
- return x.(int16) &^ y.(int16)
- case int32:
- return x.(int32) &^ y.(int32)
- case int64:
- return x.(int64) &^ y.(int64)
- case uint:
- return x.(uint) &^ y.(uint)
- case uint8:
- return x.(uint8) &^ y.(uint8)
- case uint16:
- return x.(uint16) &^ y.(uint16)
- case uint32:
- return x.(uint32) &^ y.(uint32)
- case uint64:
- return x.(uint64) &^ y.(uint64)
- case uintptr:
- return x.(uintptr) &^ y.(uintptr)
- }
-
- case token.SHL:
- y := asUint64(y)
- switch x.(type) {
- case int:
- return x.(int) << y
- case int8:
- return x.(int8) << y
- case int16:
- return x.(int16) << y
- case int32:
- return x.(int32) << y
- case int64:
- return x.(int64) << y
- case uint:
- return x.(uint) << y
- case uint8:
- return x.(uint8) << y
- case uint16:
- return x.(uint16) << y
- case uint32:
- return x.(uint32) << y
- case uint64:
- return x.(uint64) << y
- case uintptr:
- return x.(uintptr) << y
- }
-
- case token.SHR:
- y := asUint64(y)
- switch x.(type) {
- case int:
- return x.(int) >> y
- case int8:
- return x.(int8) >> y
- case int16:
- return x.(int16) >> y
- case int32:
- return x.(int32) >> y
- case int64:
- return x.(int64) >> y
- case uint:
- return x.(uint) >> y
- case uint8:
- return x.(uint8) >> y
- case uint16:
- return x.(uint16) >> y
- case uint32:
- return x.(uint32) >> y
- case uint64:
- return x.(uint64) >> y
- case uintptr:
- return x.(uintptr) >> y
- }
-
- case token.LSS:
- switch x.(type) {
- case int:
- return x.(int) < y.(int)
- case int8:
- return x.(int8) < y.(int8)
- case int16:
- return x.(int16) < y.(int16)
- case int32:
- return x.(int32) < y.(int32)
- case int64:
- return x.(int64) < y.(int64)
- case uint:
- return x.(uint) < y.(uint)
- case uint8:
- return x.(uint8) < y.(uint8)
- case uint16:
- return x.(uint16) < y.(uint16)
- case uint32:
- return x.(uint32) < y.(uint32)
- case uint64:
- return x.(uint64) < y.(uint64)
- case uintptr:
- return x.(uintptr) < y.(uintptr)
- case float32:
- return x.(float32) < y.(float32)
- case float64:
- return x.(float64) < y.(float64)
- case string:
- return x.(string) < y.(string)
- }
-
- case token.LEQ:
- switch x.(type) {
- case int:
- return x.(int) <= y.(int)
- case int8:
- return x.(int8) <= y.(int8)
- case int16:
- return x.(int16) <= y.(int16)
- case int32:
- return x.(int32) <= y.(int32)
- case int64:
- return x.(int64) <= y.(int64)
- case uint:
- return x.(uint) <= y.(uint)
- case uint8:
- return x.(uint8) <= y.(uint8)
- case uint16:
- return x.(uint16) <= y.(uint16)
- case uint32:
- return x.(uint32) <= y.(uint32)
- case uint64:
- return x.(uint64) <= y.(uint64)
- case uintptr:
- return x.(uintptr) <= y.(uintptr)
- case float32:
- return x.(float32) <= y.(float32)
- case float64:
- return x.(float64) <= y.(float64)
- case string:
- return x.(string) <= y.(string)
- }
-
- case token.EQL:
- return eqnil(t, x, y)
-
- case token.NEQ:
- return !eqnil(t, x, y)
-
- case token.GTR:
- switch x.(type) {
- case int:
- return x.(int) > y.(int)
- case int8:
- return x.(int8) > y.(int8)
- case int16:
- return x.(int16) > y.(int16)
- case int32:
- return x.(int32) > y.(int32)
- case int64:
- return x.(int64) > y.(int64)
- case uint:
- return x.(uint) > y.(uint)
- case uint8:
- return x.(uint8) > y.(uint8)
- case uint16:
- return x.(uint16) > y.(uint16)
- case uint32:
- return x.(uint32) > y.(uint32)
- case uint64:
- return x.(uint64) > y.(uint64)
- case uintptr:
- return x.(uintptr) > y.(uintptr)
- case float32:
- return x.(float32) > y.(float32)
- case float64:
- return x.(float64) > y.(float64)
- case string:
- return x.(string) > y.(string)
- }
-
- case token.GEQ:
- switch x.(type) {
- case int:
- return x.(int) >= y.(int)
- case int8:
- return x.(int8) >= y.(int8)
- case int16:
- return x.(int16) >= y.(int16)
- case int32:
- return x.(int32) >= y.(int32)
- case int64:
- return x.(int64) >= y.(int64)
- case uint:
- return x.(uint) >= y.(uint)
- case uint8:
- return x.(uint8) >= y.(uint8)
- case uint16:
- return x.(uint16) >= y.(uint16)
- case uint32:
- return x.(uint32) >= y.(uint32)
- case uint64:
- return x.(uint64) >= y.(uint64)
- case uintptr:
- return x.(uintptr) >= y.(uintptr)
- case float32:
- return x.(float32) >= y.(float32)
- case float64:
- return x.(float64) >= y.(float64)
- case string:
- return x.(string) >= y.(string)
- }
- }
- panic(fmt.Sprintf("invalid binary op: %T %s %T", x, op, y))
-}
-
-// eqnil returns the comparison x == y using the equivalence relation
-// appropriate for type t.
-// If t is a reference type, at most one of x or y may be a nil value
-// of that type.
-//
-func eqnil(t types.Type, x, y value) bool {
- switch t.Underlying().(type) {
- case *types.Map, *types.Signature, *types.Slice:
- // Since these types don't support comparison,
- // one of the operands must be a literal nil.
- switch x := x.(type) {
- case *hashmap:
- return (x != nil) == (y.(*hashmap) != nil)
- case map[value]value:
- return (x != nil) == (y.(map[value]value) != nil)
- case *ssa.Function:
- switch y := y.(type) {
- case *ssa.Function:
- return (x != nil) == (y != nil)
- case *closure:
- return true
- }
- case *closure:
- return (x != nil) == (y.(*ssa.Function) != nil)
- case []value:
- return (x != nil) == (y.([]value) != nil)
- }
- panic(fmt.Sprintf("eqnil(%s): illegal dynamic type: %T", t, x))
- }
-
- return equals(t, x, y)
-}
-
-func unop(instr *ssa.UnOp, x value) value {
- switch instr.Op {
- case token.ARROW: // receive
- v, ok := <-x.(chan value)
- if !ok {
- v = zero(instr.X.Type().Underlying().(*types.Chan).Elem())
- }
- if instr.CommaOk {
- v = tuple{v, ok}
- }
- return v
- case token.SUB:
- switch x := x.(type) {
- case int:
- return -x
- case int8:
- return -x
- case int16:
- return -x
- case int32:
- return -x
- case int64:
- return -x
- case uint:
- return -x
- case uint8:
- return -x
- case uint16:
- return -x
- case uint32:
- return -x
- case uint64:
- return -x
- case uintptr:
- return -x
- case float32:
- return -x
- case float64:
- return -x
- case complex64:
- return -x
- case complex128:
- return -x
- }
- case token.MUL:
- return load(deref(instr.X.Type()), x.(*value))
- case token.NOT:
- return !x.(bool)
- case token.XOR:
- switch x := x.(type) {
- case int:
- return ^x
- case int8:
- return ^x
- case int16:
- return ^x
- case int32:
- return ^x
- case int64:
- return ^x
- case uint:
- return ^x
- case uint8:
- return ^x
- case uint16:
- return ^x
- case uint32:
- return ^x
- case uint64:
- return ^x
- case uintptr:
- return ^x
- }
- }
- panic(fmt.Sprintf("invalid unary op %s %T", instr.Op, x))
-}
-
-// typeAssert checks whether dynamic type of itf is instr.AssertedType.
-// It returns the extracted value on success, and panics on failure,
-// unless instr.CommaOk, in which case it always returns a "value,ok" tuple.
-//
-func typeAssert(i *interpreter, instr *ssa.TypeAssert, itf iface) value {
- var v value
- err := ""
- if itf.t == nil {
- err = fmt.Sprintf("interface conversion: interface is nil, not %s", instr.AssertedType)
-
- } else if idst, ok := instr.AssertedType.Underlying().(*types.Interface); ok {
- v = itf
- err = checkInterface(i, idst, itf)
-
- } else if types.Identical(itf.t, instr.AssertedType) {
- v = itf.v // extract value
-
- } else {
- err = fmt.Sprintf("interface conversion: interface is %s, not %s", itf.t, instr.AssertedType)
- }
-
- if err != "" {
- if !instr.CommaOk {
- panic(err)
- }
- return tuple{zero(instr.AssertedType), false}
- }
- if instr.CommaOk {
- return tuple{v, true}
- }
- return v
-}
-
-// If CapturedOutput is non-nil, all writes by the interpreted program
-// to file descriptors 1 and 2 will also be written to CapturedOutput.
-//
-// (The $GOROOT/test system requires that the test be considered a
-// failure if "BUG" appears in the combined stdout/stderr output, even
-// if it exits zero. This is a global variable shared by all
-// interpreters in the same process.)
-//
-var CapturedOutput *bytes.Buffer
-var capturedOutputMu sync.Mutex
-
-// write writes bytes b to the target program's file descriptor fd.
-// The print/println built-ins and the write() system call funnel
-// through here so they can be captured by the test driver.
-func write(fd int, b []byte) (int, error) {
- // TODO(adonovan): fix: on Windows, std{out,err} are not 1, 2.
- if CapturedOutput != nil && (fd == 1 || fd == 2) {
- capturedOutputMu.Lock()
- CapturedOutput.Write(b) // ignore errors
- capturedOutputMu.Unlock()
- }
- return syswrite(fd, b)
-}
-
-var syswrite func(int, []byte) (int, error) // set on darwin/linux only
-
-// callBuiltin interprets a call to builtin fn with arguments args,
-// returning its result.
-func callBuiltin(caller *frame, callpos token.Pos, fn *ssa.Builtin, args []value) value {
- switch fn.Name() {
- case "append":
- if len(args) == 1 {
- return args[0]
- }
- if s, ok := args[1].(string); ok {
- // append([]byte, ...string) []byte
- arg0 := args[0].([]value)
- for i := 0; i < len(s); i++ {
- arg0 = append(arg0, s[i])
- }
- return arg0
- }
- // append([]T, ...[]T) []T
- return append(args[0].([]value), args[1].([]value)...)
-
- case "copy": // copy([]T, []T) int or copy([]byte, string) int
- src := args[1]
- if _, ok := src.(string); ok {
- params := fn.Type().(*types.Signature).Params()
- src = conv(params.At(0).Type(), params.At(1).Type(), src)
- }
- return copy(args[0].([]value), src.([]value))
-
- case "close": // close(chan T)
- close(args[0].(chan value))
- return nil
-
- case "delete": // delete(map[K]value, K)
- switch m := args[0].(type) {
- case map[value]value:
- delete(m, args[1])
- case *hashmap:
- m.delete(args[1].(hashable))
- default:
- panic(fmt.Sprintf("illegal map type: %T", m))
- }
- return nil
-
- case "print", "println": // print(any, ...)
- ln := fn.Name() == "println"
- var buf bytes.Buffer
- for i, arg := range args {
- if i > 0 && ln {
- buf.WriteRune(' ')
- }
- buf.WriteString(toString(arg))
- }
- if ln {
- buf.WriteRune('\n')
- }
- write(1, buf.Bytes())
- return nil
-
- case "len":
- switch x := args[0].(type) {
- case string:
- return len(x)
- case array:
- return len(x)
- case *value:
- return len((*x).(array))
- case []value:
- return len(x)
- case map[value]value:
- return len(x)
- case *hashmap:
- return x.len()
- case chan value:
- return len(x)
- default:
- panic(fmt.Sprintf("len: illegal operand: %T", x))
- }
-
- case "cap":
- switch x := args[0].(type) {
- case array:
- return cap(x)
- case *value:
- return cap((*x).(array))
- case []value:
- return cap(x)
- case chan value:
- return cap(x)
- default:
- panic(fmt.Sprintf("cap: illegal operand: %T", x))
- }
-
- case "real":
- switch c := args[0].(type) {
- case complex64:
- return real(c)
- case complex128:
- return real(c)
- default:
- panic(fmt.Sprintf("real: illegal operand: %T", c))
- }
-
- case "imag":
- switch c := args[0].(type) {
- case complex64:
- return imag(c)
- case complex128:
- return imag(c)
- default:
- panic(fmt.Sprintf("imag: illegal operand: %T", c))
- }
-
- case "complex":
- switch f := args[0].(type) {
- case float32:
- return complex(f, args[1].(float32))
- case float64:
- return complex(f, args[1].(float64))
- default:
- panic(fmt.Sprintf("complex: illegal operand: %T", f))
- }
-
- case "panic":
- // ssa.Panic handles most cases; this is only for "go
- // panic" or "defer panic".
- panic(targetPanic{args[0]})
-
- case "recover":
- return doRecover(caller)
-
- case "ssa:wrapnilchk":
- recv := args[0]
- if recv.(*value) == nil {
- recvType := args[1]
- methodName := args[2]
- panic(fmt.Sprintf("value method (%s).%s called using nil *%s pointer",
- recvType, methodName, recvType))
- }
- return recv
- }
-
- panic("unknown built-in: " + fn.Name())
-}
-
-func rangeIter(x value, t types.Type) iter {
- switch x := x.(type) {
- case map[value]value:
- // TODO(adonovan): fix: leaks goroutines and channels
- // on each incomplete map iteration. We need to open
- // up an iteration interface using the
- // reflect.(Value).MapKeys machinery.
- it := make(mapIter)
- go func() {
- for k, v := range x {
- it <- [2]value{k, v}
- }
- close(it)
- }()
- return it
- case *hashmap:
- // TODO(adonovan): fix: leaks goroutines and channels
- // on each incomplete map iteration. We need to open
- // up an iteration interface using the
- // reflect.(Value).MapKeys machinery.
- it := make(mapIter)
- go func() {
- for _, e := range x.entries() {
- for e != nil {
- it <- [2]value{e.key, e.value}
- e = e.next
- }
- }
- close(it)
- }()
- return it
- case string:
- return &stringIter{Reader: strings.NewReader(x)}
- }
- panic(fmt.Sprintf("cannot range over %T", x))
-}
-
-// widen widens a basic typed value x to the widest type of its
-// category, one of:
-// bool, int64, uint64, float64, complex128, string.
-// This is inefficient but reduces the size of the cross-product of
-// cases we have to consider.
-//
-func widen(x value) value {
- switch y := x.(type) {
- case bool, int64, uint64, float64, complex128, string, unsafe.Pointer:
- return x
- case int:
- return int64(y)
- case int8:
- return int64(y)
- case int16:
- return int64(y)
- case int32:
- return int64(y)
- case uint:
- return uint64(y)
- case uint8:
- return uint64(y)
- case uint16:
- return uint64(y)
- case uint32:
- return uint64(y)
- case uintptr:
- return uint64(y)
- case float32:
- return float64(y)
- case complex64:
- return complex128(y)
- }
- panic(fmt.Sprintf("cannot widen %T", x))
-}
-
-// conv converts the value x of type t_src to type t_dst and returns
-// the result.
-// Possible cases are described with the ssa.Convert operator.
-//
-func conv(t_dst, t_src types.Type, x value) value {
- ut_src := t_src.Underlying()
- ut_dst := t_dst.Underlying()
-
- // Destination type is not an "untyped" type.
- if b, ok := ut_dst.(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
- panic("oops: conversion to 'untyped' type: " + b.String())
- }
-
- // Nor is it an interface type.
- if _, ok := ut_dst.(*types.Interface); ok {
- if _, ok := ut_src.(*types.Interface); ok {
- panic("oops: Convert should be ChangeInterface")
- } else {
- panic("oops: Convert should be MakeInterface")
- }
- }
-
- // Remaining conversions:
- // + untyped string/number/bool constant to a specific
- // representation.
- // + conversions between non-complex numeric types.
- // + conversions between complex numeric types.
- // + integer/[]byte/[]rune -> string.
- // + string -> []byte/[]rune.
- //
- // All are treated the same: first we extract the value to the
- // widest representation (int64, uint64, float64, complex128,
- // or string), then we convert it to the desired type.
-
- switch ut_src := ut_src.(type) {
- case *types.Pointer:
- switch ut_dst := ut_dst.(type) {
- case *types.Basic:
- // *value to unsafe.Pointer?
- if ut_dst.Kind() == types.UnsafePointer {
- return unsafe.Pointer(x.(*value))
- }
- }
-
- case *types.Slice:
- // []byte or []rune -> string
- // TODO(adonovan): fix: type B byte; conv([]B -> string).
- switch ut_src.Elem().(*types.Basic).Kind() {
- case types.Byte:
- x := x.([]value)
- b := make([]byte, 0, len(x))
- for i := range x {
- b = append(b, x[i].(byte))
- }
- return string(b)
-
- case types.Rune:
- x := x.([]value)
- r := make([]rune, 0, len(x))
- for i := range x {
- r = append(r, x[i].(rune))
- }
- return string(r)
- }
-
- case *types.Basic:
- x = widen(x)
-
- // integer -> string?
- // TODO(adonovan): fix: test integer -> named alias of string.
- if ut_src.Info()&types.IsInteger != 0 {
- if ut_dst, ok := ut_dst.(*types.Basic); ok && ut_dst.Kind() == types.String {
- return string(asInt(x))
- }
- }
-
- // string -> []rune, []byte or string?
- if s, ok := x.(string); ok {
- switch ut_dst := ut_dst.(type) {
- case *types.Slice:
- var res []value
- // TODO(adonovan): fix: test named alias of rune, byte.
- switch ut_dst.Elem().(*types.Basic).Kind() {
- case types.Rune:
- for _, r := range []rune(s) {
- res = append(res, r)
- }
- return res
- case types.Byte:
- for _, b := range []byte(s) {
- res = append(res, b)
- }
- return res
- }
- case *types.Basic:
- if ut_dst.Kind() == types.String {
- return x.(string)
- }
- }
- break // fail: no other conversions for string
- }
-
- // unsafe.Pointer -> *value
- if ut_src.Kind() == types.UnsafePointer {
- // TODO(adonovan): this is wrong and cannot
- // really be fixed with the current design.
- //
- // return (*value)(x.(unsafe.Pointer))
- // creates a new pointer of a different
- // type but the underlying interface value
- // knows its "true" type and so cannot be
- // meaningfully used through the new pointer.
- //
- // To make this work, the interpreter needs to
- // simulate the memory layout of a real
- // compiled implementation.
- //
- // To at least preserve type-safety, we'll
- // just return the zero value of the
- // destination type.
- return zero(t_dst)
- }
-
- // Conversions between complex numeric types?
- if ut_src.Info()&types.IsComplex != 0 {
- switch ut_dst.(*types.Basic).Kind() {
- case types.Complex64:
- return complex64(x.(complex128))
- case types.Complex128:
- return x.(complex128)
- }
- break // fail: no other conversions for complex
- }
-
- // Conversions between non-complex numeric types?
- if ut_src.Info()&types.IsNumeric != 0 {
- kind := ut_dst.(*types.Basic).Kind()
- switch x := x.(type) {
- case int64: // signed integer -> numeric?
- switch kind {
- case types.Int:
- return int(x)
- case types.Int8:
- return int8(x)
- case types.Int16:
- return int16(x)
- case types.Int32:
- return int32(x)
- case types.Int64:
- return int64(x)
- case types.Uint:
- return uint(x)
- case types.Uint8:
- return uint8(x)
- case types.Uint16:
- return uint16(x)
- case types.Uint32:
- return uint32(x)
- case types.Uint64:
- return uint64(x)
- case types.Uintptr:
- return uintptr(x)
- case types.Float32:
- return float32(x)
- case types.Float64:
- return float64(x)
- }
-
- case uint64: // unsigned integer -> numeric?
- switch kind {
- case types.Int:
- return int(x)
- case types.Int8:
- return int8(x)
- case types.Int16:
- return int16(x)
- case types.Int32:
- return int32(x)
- case types.Int64:
- return int64(x)
- case types.Uint:
- return uint(x)
- case types.Uint8:
- return uint8(x)
- case types.Uint16:
- return uint16(x)
- case types.Uint32:
- return uint32(x)
- case types.Uint64:
- return uint64(x)
- case types.Uintptr:
- return uintptr(x)
- case types.Float32:
- return float32(x)
- case types.Float64:
- return float64(x)
- }
-
- case float64: // floating point -> numeric?
- switch kind {
- case types.Int:
- return int(x)
- case types.Int8:
- return int8(x)
- case types.Int16:
- return int16(x)
- case types.Int32:
- return int32(x)
- case types.Int64:
- return int64(x)
- case types.Uint:
- return uint(x)
- case types.Uint8:
- return uint8(x)
- case types.Uint16:
- return uint16(x)
- case types.Uint32:
- return uint32(x)
- case types.Uint64:
- return uint64(x)
- case types.Uintptr:
- return uintptr(x)
- case types.Float32:
- return float32(x)
- case types.Float64:
- return float64(x)
- }
- }
- }
- }
-
- panic(fmt.Sprintf("unsupported conversion: %s -> %s, dynamic type %T", t_src, t_dst, x))
-}
-
-// checkInterface checks that the method set of x implements the
-// interface itype.
-// On success it returns "", on failure, an error message.
-//
-func checkInterface(i *interpreter, itype *types.Interface, x iface) string {
- if meth, _ := types.MissingMethod(x.t, itype, true); meth != nil {
- return fmt.Sprintf("interface conversion: %v is not %v: missing method %s",
- x.t, itype, meth.Name())
- }
- return "" // ok
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/reflect.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/reflect.go
deleted file mode 100644
index 2b8289968..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/reflect.go
+++ /dev/null
@@ -1,574 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Emulated "reflect" package.
-//
-// We completely replace the built-in "reflect" package.
-// The only thing clients can depend upon are that reflect.Type is an
-// interface and reflect.Value is an (opaque) struct.
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "reflect"
- "unsafe"
-
- "golang.org/x/tools/go/ssa"
-)
-
-type opaqueType struct {
- types.Type
- name string
-}
-
-func (t *opaqueType) String() string { return t.name }
-
-// A bogus "reflect" type-checker package. Shared across interpreters.
-var reflectTypesPackage = types.NewPackage("reflect", "reflect")
-
-// rtype is the concrete type the interpreter uses to implement the
-// reflect.Type interface.
-//
-// type rtype
-var rtypeType = makeNamedType("rtype", &opaqueType{nil, "rtype"})
-
-// error is an (interpreted) named type whose underlying type is string.
-// The interpreter uses it for all implementations of the built-in error
-// interface that it creates.
-// We put it in the "reflect" package for expedience.
-//
-// type error string
-var errorType = makeNamedType("error", &opaqueType{nil, "error"})
-
-func makeNamedType(name string, underlying types.Type) *types.Named {
- obj := types.NewTypeName(token.NoPos, reflectTypesPackage, name, nil)
- return types.NewNamed(obj, underlying, nil)
-}
-
-func makeReflectValue(t types.Type, v value) value {
- return structure{rtype{t}, v}
-}
-
-// Given a reflect.Value, returns its rtype.
-func rV2T(v value) rtype {
- return v.(structure)[0].(rtype)
-}
-
-// Given a reflect.Value, returns the underlying interpreter value.
-func rV2V(v value) value {
- return v.(structure)[1]
-}
-
-// makeReflectType boxes up an rtype in a reflect.Type interface.
-func makeReflectType(rt rtype) value {
- return iface{rtypeType, rt}
-}
-
-func ext۰reflect۰Init(fr *frame, args []value) value {
- // Signature: func()
- return nil
-}
-
-func ext۰reflect۰rtype۰Bits(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- rt := args[0].(rtype).t
- basic, ok := rt.Underlying().(*types.Basic)
- if !ok {
- panic(fmt.Sprintf("reflect.Type.Bits(%T): non-basic type", rt))
- }
- return int(fr.i.sizes.Sizeof(basic)) * 8
-}
-
-func ext۰reflect۰rtype۰Elem(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) reflect.Type
- return makeReflectType(rtype{args[0].(rtype).t.Underlying().(interface {
- Elem() types.Type
- }).Elem()})
-}
-
-func ext۰reflect۰rtype۰Field(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype, i int) reflect.StructField
- st := args[0].(rtype).t.Underlying().(*types.Struct)
- i := args[1].(int)
- f := st.Field(i)
- return structure{
- f.Name(),
- f.Pkg().Path(),
- makeReflectType(rtype{f.Type()}),
- st.Tag(i),
- 0, // TODO(adonovan): offset
- []value{}, // TODO(adonovan): indices
- f.Anonymous(),
- }
-}
-
-func ext۰reflect۰rtype۰In(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype, i int) int
- i := args[1].(int)
- return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Params().At(i).Type()})
-}
-
-func ext۰reflect۰rtype۰Kind(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) uint
- return uint(reflectKind(args[0].(rtype).t))
-}
-
-func ext۰reflect۰rtype۰NumField(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- return args[0].(rtype).t.Underlying().(*types.Struct).NumFields()
-}
-
-func ext۰reflect۰rtype۰NumIn(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- return args[0].(rtype).t.(*types.Signature).Params().Len()
-}
-
-func ext۰reflect۰rtype۰NumMethod(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- return fr.i.prog.MethodSets.MethodSet(args[0].(rtype).t).Len()
-}
-
-func ext۰reflect۰rtype۰NumOut(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) int
- return args[0].(rtype).t.(*types.Signature).Results().Len()
-}
-
-func ext۰reflect۰rtype۰Out(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype, i int) int
- i := args[1].(int)
- return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Results().At(i).Type()})
-}
-
-func ext۰reflect۰rtype۰Size(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) uintptr
- return uintptr(fr.i.sizes.Sizeof(args[0].(rtype).t))
-}
-
-func ext۰reflect۰rtype۰String(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) string
- return args[0].(rtype).t.String()
-}
-
-func ext۰reflect۰New(fr *frame, args []value) value {
- // Signature: func (t reflect.Type) reflect.Value
- t := args[0].(iface).v.(rtype).t
- alloc := zero(t)
- return makeReflectValue(types.NewPointer(t), &alloc)
-}
-
-func ext۰reflect۰SliceOf(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) Type
- return makeReflectType(rtype{types.NewSlice(args[0].(iface).v.(rtype).t)})
-}
-
-func ext۰reflect۰TypeOf(fr *frame, args []value) value {
- // Signature: func (t reflect.rtype) Type
- return makeReflectType(rtype{args[0].(iface).t})
-}
-
-func ext۰reflect۰ValueOf(fr *frame, args []value) value {
- // Signature: func (interface{}) reflect.Value
- itf := args[0].(iface)
- return makeReflectValue(itf.t, itf.v)
-}
-
-func ext۰reflect۰Zero(fr *frame, args []value) value {
- // Signature: func (t reflect.Type) reflect.Value
- t := args[0].(iface).v.(rtype).t
- return makeReflectValue(t, zero(t))
-}
-
-func reflectKind(t types.Type) reflect.Kind {
- switch t := t.(type) {
- case *types.Named:
- return reflectKind(t.Underlying())
- case *types.Basic:
- switch t.Kind() {
- case types.Bool:
- return reflect.Bool
- case types.Int:
- return reflect.Int
- case types.Int8:
- return reflect.Int8
- case types.Int16:
- return reflect.Int16
- case types.Int32:
- return reflect.Int32
- case types.Int64:
- return reflect.Int64
- case types.Uint:
- return reflect.Uint
- case types.Uint8:
- return reflect.Uint8
- case types.Uint16:
- return reflect.Uint16
- case types.Uint32:
- return reflect.Uint32
- case types.Uint64:
- return reflect.Uint64
- case types.Uintptr:
- return reflect.Uintptr
- case types.Float32:
- return reflect.Float32
- case types.Float64:
- return reflect.Float64
- case types.Complex64:
- return reflect.Complex64
- case types.Complex128:
- return reflect.Complex128
- case types.String:
- return reflect.String
- case types.UnsafePointer:
- return reflect.UnsafePointer
- }
- case *types.Array:
- return reflect.Array
- case *types.Chan:
- return reflect.Chan
- case *types.Signature:
- return reflect.Func
- case *types.Interface:
- return reflect.Interface
- case *types.Map:
- return reflect.Map
- case *types.Pointer:
- return reflect.Ptr
- case *types.Slice:
- return reflect.Slice
- case *types.Struct:
- return reflect.Struct
- }
- panic(fmt.Sprint("unexpected type: ", t))
-}
-
-func ext۰reflect۰Value۰Kind(fr *frame, args []value) value {
- // Signature: func (reflect.Value) uint
- return uint(reflectKind(rV2T(args[0]).t))
-}
-
-func ext۰reflect۰Value۰String(fr *frame, args []value) value {
- // Signature: func (reflect.Value) string
- return toString(rV2V(args[0]))
-}
-
-func ext۰reflect۰Value۰Type(fr *frame, args []value) value {
- // Signature: func (reflect.Value) reflect.Type
- return makeReflectType(rV2T(args[0]))
-}
-
-func ext۰reflect۰Value۰Uint(fr *frame, args []value) value {
- // Signature: func (reflect.Value) uint64
- switch v := rV2V(args[0]).(type) {
- case uint:
- return uint64(v)
- case uint8:
- return uint64(v)
- case uint16:
- return uint64(v)
- case uint32:
- return uint64(v)
- case uint64:
- return uint64(v)
- case uintptr:
- return uint64(v)
- }
- panic("reflect.Value.Uint")
-}
-
-func ext۰reflect۰Value۰Len(fr *frame, args []value) value {
- // Signature: func (reflect.Value) int
- switch v := rV2V(args[0]).(type) {
- case string:
- return len(v)
- case array:
- return len(v)
- case chan value:
- return cap(v)
- case []value:
- return len(v)
- case *hashmap:
- return v.len()
- case map[value]value:
- return len(v)
- default:
- panic(fmt.Sprintf("reflect.(Value).Len(%v)", v))
- }
-}
-
-func ext۰reflect۰Value۰MapIndex(fr *frame, args []value) value {
- // Signature: func (reflect.Value) Value
- tValue := rV2T(args[0]).t.Underlying().(*types.Map).Key()
- k := rV2V(args[1])
- switch m := rV2V(args[0]).(type) {
- case map[value]value:
- if v, ok := m[k]; ok {
- return makeReflectValue(tValue, v)
- }
-
- case *hashmap:
- if v := m.lookup(k.(hashable)); v != nil {
- return makeReflectValue(tValue, v)
- }
-
- default:
- panic(fmt.Sprintf("(reflect.Value).MapIndex(%T, %T)", m, k))
- }
- return makeReflectValue(nil, nil)
-}
-
-func ext۰reflect۰Value۰MapKeys(fr *frame, args []value) value {
- // Signature: func (reflect.Value) []Value
- var keys []value
- tKey := rV2T(args[0]).t.Underlying().(*types.Map).Key()
- switch v := rV2V(args[0]).(type) {
- case map[value]value:
- for k := range v {
- keys = append(keys, makeReflectValue(tKey, k))
- }
-
- case *hashmap:
- for _, e := range v.entries() {
- for ; e != nil; e = e.next {
- keys = append(keys, makeReflectValue(tKey, e.key))
- }
- }
-
- default:
- panic(fmt.Sprintf("(reflect.Value).MapKeys(%T)", v))
- }
- return keys
-}
-
-func ext۰reflect۰Value۰NumField(fr *frame, args []value) value {
- // Signature: func (reflect.Value) int
- return len(rV2V(args[0]).(structure))
-}
-
-func ext۰reflect۰Value۰NumMethod(fr *frame, args []value) value {
- // Signature: func (reflect.Value) int
- return fr.i.prog.MethodSets.MethodSet(rV2T(args[0]).t).Len()
-}
-
-func ext۰reflect۰Value۰Pointer(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) uintptr
- switch v := rV2V(args[0]).(type) {
- case *value:
- return uintptr(unsafe.Pointer(v))
- case chan value:
- return reflect.ValueOf(v).Pointer()
- case []value:
- return reflect.ValueOf(v).Pointer()
- case *hashmap:
- return reflect.ValueOf(v.entries()).Pointer()
- case map[value]value:
- return reflect.ValueOf(v).Pointer()
- case *ssa.Function:
- return uintptr(unsafe.Pointer(v))
- case *closure:
- return uintptr(unsafe.Pointer(v))
- default:
- panic(fmt.Sprintf("reflect.(Value).Pointer(%T)", v))
- }
-}
-
-func ext۰reflect۰Value۰Index(fr *frame, args []value) value {
- // Signature: func (v reflect.Value, i int) Value
- i := args[1].(int)
- t := rV2T(args[0]).t.Underlying()
- switch v := rV2V(args[0]).(type) {
- case array:
- return makeReflectValue(t.(*types.Array).Elem(), v[i])
- case []value:
- return makeReflectValue(t.(*types.Slice).Elem(), v[i])
- default:
- panic(fmt.Sprintf("reflect.(Value).Index(%T)", v))
- }
-}
-
-func ext۰reflect۰Value۰Bool(fr *frame, args []value) value {
- // Signature: func (reflect.Value) bool
- return rV2V(args[0]).(bool)
-}
-
-func ext۰reflect۰Value۰CanAddr(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) bool
- // Always false for our representation.
- return false
-}
-
-func ext۰reflect۰Value۰CanInterface(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) bool
- // Always true for our representation.
- return true
-}
-
-func ext۰reflect۰Value۰Elem(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) reflect.Value
- switch x := rV2V(args[0]).(type) {
- case iface:
- return makeReflectValue(x.t, x.v)
- case *value:
- return makeReflectValue(rV2T(args[0]).t.Underlying().(*types.Pointer).Elem(), *x)
- default:
- panic(fmt.Sprintf("reflect.(Value).Elem(%T)", x))
- }
-}
-
-func ext۰reflect۰Value۰Field(fr *frame, args []value) value {
- // Signature: func (v reflect.Value, i int) reflect.Value
- v := args[0]
- i := args[1].(int)
- return makeReflectValue(rV2T(v).t.Underlying().(*types.Struct).Field(i).Type(), rV2V(v).(structure)[i])
-}
-
-func ext۰reflect۰Value۰Float(fr *frame, args []value) value {
- // Signature: func (reflect.Value) float64
- switch v := rV2V(args[0]).(type) {
- case float32:
- return float64(v)
- case float64:
- return float64(v)
- }
- panic("reflect.Value.Float")
-}
-
-func ext۰reflect۰Value۰Interface(fr *frame, args []value) value {
- // Signature: func (v reflect.Value) interface{}
- return ext۰reflect۰valueInterface(fr, args)
-}
-
-func ext۰reflect۰Value۰Int(fr *frame, args []value) value {
- // Signature: func (reflect.Value) int64
- switch x := rV2V(args[0]).(type) {
- case int:
- return int64(x)
- case int8:
- return int64(x)
- case int16:
- return int64(x)
- case int32:
- return int64(x)
- case int64:
- return x
- default:
- panic(fmt.Sprintf("reflect.(Value).Int(%T)", x))
- }
-}
-
-func ext۰reflect۰Value۰IsNil(fr *frame, args []value) value {
- // Signature: func (reflect.Value) bool
- switch x := rV2V(args[0]).(type) {
- case *value:
- return x == nil
- case chan value:
- return x == nil
- case map[value]value:
- return x == nil
- case *hashmap:
- return x == nil
- case iface:
- return x.t == nil
- case []value:
- return x == nil
- case *ssa.Function:
- return x == nil
- case *ssa.Builtin:
- return x == nil
- case *closure:
- return x == nil
- default:
- panic(fmt.Sprintf("reflect.(Value).IsNil(%T)", x))
- }
-}
-
-func ext۰reflect۰Value۰IsValid(fr *frame, args []value) value {
- // Signature: func (reflect.Value) bool
- return rV2V(args[0]) != nil
-}
-
-func ext۰reflect۰Value۰Set(fr *frame, args []value) value {
- // TODO(adonovan): implement.
- return nil
-}
-
-func ext۰reflect۰valueInterface(fr *frame, args []value) value {
- // Signature: func (v reflect.Value, safe bool) interface{}
- v := args[0].(structure)
- return iface{rV2T(v).t, rV2V(v)}
-}
-
-func ext۰reflect۰error۰Error(fr *frame, args []value) value {
- return args[0]
-}
-
-// newMethod creates a new method of the specified name, package and receiver type.
-func newMethod(pkg *ssa.Package, recvType types.Type, name string) *ssa.Function {
- // TODO(adonovan): fix: hack: currently the only part of Signature
- // that is needed is the "pointerness" of Recv.Type, and for
- // now, we'll set it to always be false since we're only
- // concerned with rtype. Encapsulate this better.
- sig := types.NewSignature(types.NewVar(token.NoPos, nil, "recv", recvType), nil, nil, false)
- fn := pkg.Prog.NewFunction(name, sig, "fake reflect method")
- fn.Pkg = pkg
- return fn
-}
-
-func initReflect(i *interpreter) {
- i.reflectPackage = &ssa.Package{
- Prog: i.prog,
- Pkg: reflectTypesPackage,
- Members: make(map[string]ssa.Member),
- }
-
- // Clobber the type-checker's notion of reflect.Value's
- // underlying type so that it more closely matches the fake one
- // (at least in the number of fields---we lie about the type of
- // the rtype field).
- //
- // We must ensure that calls to (ssa.Value).Type() return the
- // fake type so that correct "shape" is used when allocating
- // variables, making zero values, loading, and storing.
- //
- // TODO(adonovan): obviously this is a hack. We need a cleaner
- // way to fake the reflect package (almost---DeepEqual is fine).
- // One approach would be not to even load its source code, but
- // provide fake source files. This would guarantee that no bad
- // information leaks into other packages.
- if r := i.prog.ImportedPackage("reflect"); r != nil {
- rV := r.Pkg.Scope().Lookup("Value").Type().(*types.Named)
-
- // delete bodies of the old methods
- mset := i.prog.MethodSets.MethodSet(rV)
- for j := 0; j < mset.Len(); j++ {
- i.prog.MethodValue(mset.At(j)).Blocks = nil
- }
-
- tEface := types.NewInterface(nil, nil).Complete()
- rV.SetUnderlying(types.NewStruct([]*types.Var{
- types.NewField(token.NoPos, r.Pkg, "t", tEface, false), // a lie
- types.NewField(token.NoPos, r.Pkg, "v", tEface, false),
- }, nil))
- }
-
- i.rtypeMethods = methodSet{
- "Bits": newMethod(i.reflectPackage, rtypeType, "Bits"),
- "Elem": newMethod(i.reflectPackage, rtypeType, "Elem"),
- "Field": newMethod(i.reflectPackage, rtypeType, "Field"),
- "In": newMethod(i.reflectPackage, rtypeType, "In"),
- "Kind": newMethod(i.reflectPackage, rtypeType, "Kind"),
- "NumField": newMethod(i.reflectPackage, rtypeType, "NumField"),
- "NumIn": newMethod(i.reflectPackage, rtypeType, "NumIn"),
- "NumMethod": newMethod(i.reflectPackage, rtypeType, "NumMethod"),
- "NumOut": newMethod(i.reflectPackage, rtypeType, "NumOut"),
- "Out": newMethod(i.reflectPackage, rtypeType, "Out"),
- "Size": newMethod(i.reflectPackage, rtypeType, "Size"),
- "String": newMethod(i.reflectPackage, rtypeType, "String"),
- }
- i.errorMethods = methodSet{
- "Error": newMethod(i.reflectPackage, errorType, "Error"),
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/value.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/value.go
deleted file mode 100644
index 4faa7b8f9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/value.go
+++ /dev/null
@@ -1,497 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Values
-//
-// All interpreter values are "boxed" in the empty interface, value.
-// The range of possible dynamic types within value are:
-//
-// - bool
-// - numbers (all built-in int/float/complex types are distinguished)
-// - string
-// - map[value]value --- maps for which usesBuiltinMap(keyType)
-// *hashmap --- maps for which !usesBuiltinMap(keyType)
-// - chan value
-// - []value --- slices
-// - iface --- interfaces.
-// - structure --- structs. Fields are ordered and accessed by numeric indices.
-// - array --- arrays.
-// - *value --- pointers. Careful: *value is a distinct type from *array etc.
-// - *ssa.Function \
-// *ssa.Builtin } --- functions. A nil 'func' is always of type *ssa.Function.
-// *closure /
-// - tuple --- as returned by Return, Next, "value,ok" modes, etc.
-// - iter --- iterators from 'range' over map or string.
-// - bad --- a poison pill for locals that have gone out of scope.
-// - rtype -- the interpreter's concrete implementation of reflect.Type
-//
-// Note that nil is not on this list.
-//
-// Pay close attention to whether or not the dynamic type is a pointer.
-// The compiler cannot help you since value is an empty interface.
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "io"
- "reflect"
- "strings"
- "sync"
- "unsafe"
-
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-type value interface{}
-
-type tuple []value
-
-type array []value
-
-type iface struct {
- t types.Type // never an "untyped" type
- v value
-}
-
-type structure []value
-
-// For map, array, *array, slice, string or channel.
-type iter interface {
- // next returns a Tuple (key, value, ok).
- // key and value are unaliased, e.g. copies of the sequence element.
- next() tuple
-}
-
-type closure struct {
- Fn *ssa.Function
- Env []value
-}
-
-type bad struct{}
-
-type rtype struct {
- t types.Type
-}
-
-// Hash functions and equivalence relation:
-
-// hashString computes the FNV hash of s.
-func hashString(s string) int {
- var h uint32
- for i := 0; i < len(s); i++ {
- h ^= uint32(s[i])
- h *= 16777619
- }
- return int(h)
-}
-
-var (
- mu sync.Mutex
- hasher = typeutil.MakeHasher()
-)
-
-// hashType returns a hash for t such that
-// types.Identical(x, y) => hashType(x) == hashType(y).
-func hashType(t types.Type) int {
- mu.Lock()
- h := int(hasher.Hash(t))
- mu.Unlock()
- return h
-}
-
-// usesBuiltinMap returns true if the built-in hash function and
-// equivalence relation for type t are consistent with those of the
-// interpreter's representation of type t. Such types are: all basic
-// types (bool, numbers, string), pointers and channels.
-//
-// usesBuiltinMap returns false for types that require a custom map
-// implementation: interfaces, arrays and structs.
-//
-// Panic ensues if t is an invalid map key type: function, map or slice.
-func usesBuiltinMap(t types.Type) bool {
- switch t := t.(type) {
- case *types.Basic, *types.Chan, *types.Pointer:
- return true
- case *types.Named:
- return usesBuiltinMap(t.Underlying())
- case *types.Interface, *types.Array, *types.Struct:
- return false
- }
- panic(fmt.Sprintf("invalid map key type: %T", t))
-}
-
-func (x array) eq(t types.Type, _y interface{}) bool {
- y := _y.(array)
- tElt := t.Underlying().(*types.Array).Elem()
- for i, xi := range x {
- if !equals(tElt, xi, y[i]) {
- return false
- }
- }
- return true
-}
-
-func (x array) hash(t types.Type) int {
- h := 0
- tElt := t.Underlying().(*types.Array).Elem()
- for _, xi := range x {
- h += hash(tElt, xi)
- }
- return h
-}
-
-func (x structure) eq(t types.Type, _y interface{}) bool {
- y := _y.(structure)
- tStruct := t.Underlying().(*types.Struct)
- for i, n := 0, tStruct.NumFields(); i < n; i++ {
- if f := tStruct.Field(i); !f.Anonymous() {
- if !equals(f.Type(), x[i], y[i]) {
- return false
- }
- }
- }
- return true
-}
-
-func (x structure) hash(t types.Type) int {
- tStruct := t.Underlying().(*types.Struct)
- h := 0
- for i, n := 0, tStruct.NumFields(); i < n; i++ {
- if f := tStruct.Field(i); !f.Anonymous() {
- h += hash(f.Type(), x[i])
- }
- }
- return h
-}
-
-// nil-tolerant variant of types.Identical.
-func sameType(x, y types.Type) bool {
- if x == nil {
- return y == nil
- }
- return y != nil && types.Identical(x, y)
-}
-
-func (x iface) eq(t types.Type, _y interface{}) bool {
- y := _y.(iface)
- return sameType(x.t, y.t) && (x.t == nil || equals(x.t, x.v, y.v))
-}
-
-func (x iface) hash(_ types.Type) int {
- return hashType(x.t)*8581 + hash(x.t, x.v)
-}
-
-func (x rtype) hash(_ types.Type) int {
- return hashType(x.t)
-}
-
-func (x rtype) eq(_ types.Type, y interface{}) bool {
- return types.Identical(x.t, y.(rtype).t)
-}
-
-// equals returns true iff x and y are equal according to Go's
-// linguistic equivalence relation for type t.
-// In a well-typed program, the dynamic types of x and y are
-// guaranteed equal.
-func equals(t types.Type, x, y value) bool {
- switch x := x.(type) {
- case bool:
- return x == y.(bool)
- case int:
- return x == y.(int)
- case int8:
- return x == y.(int8)
- case int16:
- return x == y.(int16)
- case int32:
- return x == y.(int32)
- case int64:
- return x == y.(int64)
- case uint:
- return x == y.(uint)
- case uint8:
- return x == y.(uint8)
- case uint16:
- return x == y.(uint16)
- case uint32:
- return x == y.(uint32)
- case uint64:
- return x == y.(uint64)
- case uintptr:
- return x == y.(uintptr)
- case float32:
- return x == y.(float32)
- case float64:
- return x == y.(float64)
- case complex64:
- return x == y.(complex64)
- case complex128:
- return x == y.(complex128)
- case string:
- return x == y.(string)
- case *value:
- return x == y.(*value)
- case chan value:
- return x == y.(chan value)
- case structure:
- return x.eq(t, y)
- case array:
- return x.eq(t, y)
- case iface:
- return x.eq(t, y)
- case rtype:
- return x.eq(t, y)
- }
-
- // Since map, func and slice don't support comparison, this
- // case is only reachable if one of x or y is literally nil
- // (handled in eqnil) or via interface{} values.
- panic(fmt.Sprintf("comparing uncomparable type %s", t))
-}
-
-// Returns an integer hash of x such that equals(x, y) => hash(x) == hash(y).
-func hash(t types.Type, x value) int {
- switch x := x.(type) {
- case bool:
- if x {
- return 1
- }
- return 0
- case int:
- return x
- case int8:
- return int(x)
- case int16:
- return int(x)
- case int32:
- return int(x)
- case int64:
- return int(x)
- case uint:
- return int(x)
- case uint8:
- return int(x)
- case uint16:
- return int(x)
- case uint32:
- return int(x)
- case uint64:
- return int(x)
- case uintptr:
- return int(x)
- case float32:
- return int(x)
- case float64:
- return int(x)
- case complex64:
- return int(real(x))
- case complex128:
- return int(real(x))
- case string:
- return hashString(x)
- case *value:
- return int(uintptr(unsafe.Pointer(x)))
- case chan value:
- return int(uintptr(reflect.ValueOf(x).Pointer()))
- case structure:
- return x.hash(t)
- case array:
- return x.hash(t)
- case iface:
- return x.hash(t)
- case rtype:
- return x.hash(t)
- }
- panic(fmt.Sprintf("%T is unhashable", x))
-}
-
-// reflect.Value struct values don't have a fixed shape, since the
-// payload can be a scalar or an aggregate depending on the instance.
-// So store (and load) can't simply use recursion over the shape of the
-// rhs value, or the lhs, to copy the value; we need the static type
-// information. (We can't make reflect.Value a new basic data type
-// because its "structness" is exposed to Go programs.)
-
-// load returns the value of type T in *addr.
-func load(T types.Type, addr *value) value {
- switch T := T.Underlying().(type) {
- case *types.Struct:
- v := (*addr).(structure)
- a := make(structure, len(v))
- for i := range a {
- a[i] = load(T.Field(i).Type(), &v[i])
- }
- return a
- case *types.Array:
- v := (*addr).(array)
- a := make(array, len(v))
- for i := range a {
- a[i] = load(T.Elem(), &v[i])
- }
- return a
- default:
- return *addr
- }
-}
-
-// store stores value v of type T into *addr.
-func store(T types.Type, addr *value, v value) {
- switch T := T.Underlying().(type) {
- case *types.Struct:
- lhs := (*addr).(structure)
- rhs := v.(structure)
- for i := range lhs {
- store(T.Field(i).Type(), &lhs[i], rhs[i])
- }
- case *types.Array:
- lhs := (*addr).(array)
- rhs := v.(array)
- for i := range lhs {
- store(T.Elem(), &lhs[i], rhs[i])
- }
- default:
- *addr = v
- }
-}
-
-// Prints in the style of built-in println.
-// (More or less; in gc println is actually a compiler intrinsic and
-// can distinguish println(1) from println(interface{}(1)).)
-func writeValue(buf *bytes.Buffer, v value) {
- switch v := v.(type) {
- case nil, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string:
- fmt.Fprintf(buf, "%v", v)
-
- case map[value]value:
- buf.WriteString("map[")
- sep := ""
- for k, e := range v {
- buf.WriteString(sep)
- sep = " "
- writeValue(buf, k)
- buf.WriteString(":")
- writeValue(buf, e)
- }
- buf.WriteString("]")
-
- case *hashmap:
- buf.WriteString("map[")
- sep := " "
- for _, e := range v.entries() {
- for e != nil {
- buf.WriteString(sep)
- sep = " "
- writeValue(buf, e.key)
- buf.WriteString(":")
- writeValue(buf, e.value)
- e = e.next
- }
- }
- buf.WriteString("]")
-
- case chan value:
- fmt.Fprintf(buf, "%v", v) // (an address)
-
- case *value:
- if v == nil {
- buf.WriteString("")
- } else {
- fmt.Fprintf(buf, "%p", v)
- }
-
- case iface:
- fmt.Fprintf(buf, "(%s, ", v.t)
- writeValue(buf, v.v)
- buf.WriteString(")")
-
- case structure:
- buf.WriteString("{")
- for i, e := range v {
- if i > 0 {
- buf.WriteString(" ")
- }
- writeValue(buf, e)
- }
- buf.WriteString("}")
-
- case array:
- buf.WriteString("[")
- for i, e := range v {
- if i > 0 {
- buf.WriteString(" ")
- }
- writeValue(buf, e)
- }
- buf.WriteString("]")
-
- case []value:
- buf.WriteString("[")
- for i, e := range v {
- if i > 0 {
- buf.WriteString(" ")
- }
- writeValue(buf, e)
- }
- buf.WriteString("]")
-
- case *ssa.Function, *ssa.Builtin, *closure:
- fmt.Fprintf(buf, "%p", v) // (an address)
-
- case rtype:
- buf.WriteString(v.t.String())
-
- case tuple:
- // Unreachable in well-formed Go programs
- buf.WriteString("(")
- for i, e := range v {
- if i > 0 {
- buf.WriteString(", ")
- }
- writeValue(buf, e)
- }
- buf.WriteString(")")
-
- default:
- fmt.Fprintf(buf, "<%T>", v)
- }
-}
-
-// Implements printing of Go values in the style of built-in println.
-func toString(v value) string {
- var b bytes.Buffer
- writeValue(&b, v)
- return b.String()
-}
-
-// ------------------------------------------------------------------------
-// Iterators
-
-type stringIter struct {
- *strings.Reader
- i int
-}
-
-func (it *stringIter) next() tuple {
- okv := make(tuple, 3)
- ch, n, err := it.ReadRune()
- ok := err != io.EOF
- okv[0] = ok
- if ok {
- okv[1] = it.i
- okv[2] = ch
- }
- it.i += n
- return okv
-}
-
-type mapIter chan [2]value
-
-func (it mapIter) next() tuple {
- kv, ok := <-it
- return tuple{ok, kv[0], kv[1]}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/lift.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/lift.go
deleted file mode 100644
index 048e9b032..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/lift.go
+++ /dev/null
@@ -1,653 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the lifting pass which tries to "lift" Alloc
-// cells (new/local variables) into SSA registers, replacing loads
-// with the dominating stored value, eliminating loads and stores, and
-// inserting φ-nodes as needed.
-
-// Cited papers and resources:
-//
-// Ron Cytron et al. 1991. Efficiently computing SSA form...
-// http://doi.acm.org/10.1145/115372.115320
-//
-// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm.
-// Software Practice and Experience 2001, 4:1-10.
-// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf
-//
-// Daniel Berlin, llvmdev mailing list, 2012.
-// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html
-// (Be sure to expand the whole thread.)
-
-// TODO(adonovan): opt: there are many optimizations worth evaluating, and
-// the conventional wisdom for SSA construction is that a simple
-// algorithm well engineered often beats those of better asymptotic
-// complexity on all but the most egregious inputs.
-//
-// Danny Berlin suggests that the Cooper et al. algorithm for
-// computing the dominance frontier is superior to Cytron et al.
-// Furthermore he recommends that rather than computing the DF for the
-// whole function then renaming all alloc cells, it may be cheaper to
-// compute the DF for each alloc cell separately and throw it away.
-//
-// Consider exploiting liveness information to avoid creating dead
-// φ-nodes which we then immediately remove.
-//
-// Also see many other "TODO: opt" suggestions in the code.
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "math/big"
- "os"
-)
-
-// If true, show diagnostic information at each step of lifting.
-// Very verbose.
-const debugLifting = false
-
-// domFrontier maps each block to the set of blocks in its dominance
-// frontier. The outer slice is conceptually a map keyed by
-// Block.Index. The inner slice is conceptually a set, possibly
-// containing duplicates.
-//
-// TODO(adonovan): opt: measure impact of dups; consider a packed bit
-// representation, e.g. big.Int, and bitwise parallel operations for
-// the union step in the Children loop.
-//
-// domFrontier's methods mutate the slice's elements but not its
-// length, so their receivers needn't be pointers.
-//
-type domFrontier [][]*BasicBlock
-
-func (df domFrontier) add(u, v *BasicBlock) {
- p := &df[u.Index]
- *p = append(*p, v)
-}
-
-// build builds the dominance frontier df for the dominator (sub)tree
-// rooted at u, using the Cytron et al. algorithm.
-//
-// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA
-// by pruning the entire IDF computation, rather than merely pruning
-// the DF -> IDF step.
-func (df domFrontier) build(u *BasicBlock) {
- // Encounter each node u in postorder of dom tree.
- for _, child := range u.dom.children {
- df.build(child)
- }
- for _, vb := range u.Succs {
- if v := vb.dom; v.idom != u {
- df.add(u, vb)
- }
- }
- for _, w := range u.dom.children {
- for _, vb := range df[w.Index] {
- // TODO(adonovan): opt: use word-parallel bitwise union.
- if v := vb.dom; v.idom != u {
- df.add(u, vb)
- }
- }
- }
-}
-
-func buildDomFrontier(fn *Function) domFrontier {
- df := make(domFrontier, len(fn.Blocks))
- df.build(fn.Blocks[0])
- if fn.Recover != nil {
- df.build(fn.Recover)
- }
- return df
-}
-
-func removeInstr(refs []Instruction, instr Instruction) []Instruction {
- i := 0
- for _, ref := range refs {
- if ref == instr {
- continue
- }
- refs[i] = ref
- i++
- }
- for j := i; j != len(refs); j++ {
- refs[j] = nil // aid GC
- }
- return refs[:i]
-}
-
-// lift replaces local and new Allocs accessed only with
-// load/store by SSA registers, inserting φ-nodes where necessary.
-// The result is a program in classical pruned SSA form.
-//
-// Preconditions:
-// - fn has no dead blocks (blockopt has run).
-// - Def/use info (Operands and Referrers) is up-to-date.
-// - The dominator tree is up-to-date.
-//
-func lift(fn *Function) {
- // TODO(adonovan): opt: lots of little optimizations may be
- // worthwhile here, especially if they cause us to avoid
- // buildDomFrontier. For example:
- //
- // - Alloc never loaded? Eliminate.
- // - Alloc never stored? Replace all loads with a zero constant.
- // - Alloc stored once? Replace loads with dominating store;
- // don't forget that an Alloc is itself an effective store
- // of zero.
- // - Alloc used only within a single block?
- // Use degenerate algorithm avoiding φ-nodes.
- // - Consider synergy with scalar replacement of aggregates (SRA).
- // e.g. *(&x.f) where x is an Alloc.
- // Perhaps we'd get better results if we generated this as x.f
- // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)).
- // Unclear.
- //
- // But we will start with the simplest correct code.
- df := buildDomFrontier(fn)
-
- if debugLifting {
- title := false
- for i, blocks := range df {
- if blocks != nil {
- if !title {
- fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn)
- title = true
- }
- fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks)
- }
- }
- }
-
- newPhis := make(newPhiMap)
-
- // During this pass we will replace some BasicBlock.Instrs
- // (allocs, loads and stores) with nil, keeping a count in
- // BasicBlock.gaps. At the end we will reset Instrs to the
- // concatenation of all non-dead newPhis and non-nil Instrs
- // for the block, reusing the original array if space permits.
-
- // While we're here, we also eliminate 'rundefers'
- // instructions in functions that contain no 'defer'
- // instructions.
- usesDefer := false
-
- // A counter used to generate ~unique ids for Phi nodes, as an
- // aid to debugging. We use large numbers to make them highly
- // visible. All nodes are renumbered later.
- fresh := 1000
-
- // Determine which allocs we can lift and number them densely.
- // The renaming phase uses this numbering for compact maps.
- numAllocs := 0
- for _, b := range fn.Blocks {
- b.gaps = 0
- b.rundefers = 0
- for _, instr := range b.Instrs {
- switch instr := instr.(type) {
- case *Alloc:
- index := -1
- if liftAlloc(df, instr, newPhis, &fresh) {
- index = numAllocs
- numAllocs++
- }
- instr.index = index
- case *Defer:
- usesDefer = true
- case *RunDefers:
- b.rundefers++
- }
- }
- }
-
- // renaming maps an alloc (keyed by index) to its replacement
- // value. Initially the renaming contains nil, signifying the
- // zero constant of the appropriate type; we construct the
- // Const lazily at most once on each path through the domtree.
- // TODO(adonovan): opt: cache per-function not per subtree.
- renaming := make([]Value, numAllocs)
-
- // Renaming.
- rename(fn.Blocks[0], renaming, newPhis)
-
- // Eliminate dead φ-nodes.
- removeDeadPhis(fn.Blocks, newPhis)
-
- // Prepend remaining live φ-nodes to each block.
- for _, b := range fn.Blocks {
- nps := newPhis[b]
- j := len(nps)
-
- rundefersToKill := b.rundefers
- if usesDefer {
- rundefersToKill = 0
- }
-
- if j+b.gaps+rundefersToKill == 0 {
- continue // fast path: no new phis or gaps
- }
-
- // Compact nps + non-nil Instrs into a new slice.
- // TODO(adonovan): opt: compact in situ (rightwards)
- // if Instrs has sufficient space or slack.
- dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill)
- for i, np := range nps {
- dst[i] = np.phi
- }
- for _, instr := range b.Instrs {
- if instr == nil {
- continue
- }
- if !usesDefer {
- if _, ok := instr.(*RunDefers); ok {
- continue
- }
- }
- dst[j] = instr
- j++
- }
- b.Instrs = dst
- }
-
- // Remove any fn.Locals that were lifted.
- j := 0
- for _, l := range fn.Locals {
- if l.index < 0 {
- fn.Locals[j] = l
- j++
- }
- }
- // Nil out fn.Locals[j:] to aid GC.
- for i := j; i < len(fn.Locals); i++ {
- fn.Locals[i] = nil
- }
- fn.Locals = fn.Locals[:j]
-}
-
-// removeDeadPhis removes φ-nodes not transitively needed by a
-// non-Phi, non-DebugRef instruction.
-func removeDeadPhis(blocks []*BasicBlock, newPhis newPhiMap) {
- // First pass: find the set of "live" φ-nodes: those reachable
- // from some non-Phi instruction.
- //
- // We compute reachability in reverse, starting from each φ,
- // rather than forwards, starting from each live non-Phi
- // instruction, because this way visits much less of the
- // Value graph.
- livePhis := make(map[*Phi]bool)
- for _, npList := range newPhis {
- for _, np := range npList {
- phi := np.phi
- if !livePhis[phi] && phiHasDirectReferrer(phi) {
- markLivePhi(livePhis, phi)
- }
- }
- }
-
- // Existing φ-nodes due to && and || operators
- // are all considered live (see Go issue 19622).
- for _, b := range blocks {
- for _, phi := range b.phis() {
- markLivePhi(livePhis, phi.(*Phi))
- }
- }
-
- // Second pass: eliminate unused phis from newPhis.
- for block, npList := range newPhis {
- j := 0
- for _, np := range npList {
- if livePhis[np.phi] {
- npList[j] = np
- j++
- } else {
- // discard it, first removing it from referrers
- for _, val := range np.phi.Edges {
- if refs := val.Referrers(); refs != nil {
- *refs = removeInstr(*refs, np.phi)
- }
- }
- np.phi.block = nil
- }
- }
- newPhis[block] = npList[:j]
- }
-}
-
-// markLivePhi marks phi, and all φ-nodes transitively reachable via
-// its Operands, live.
-func markLivePhi(livePhis map[*Phi]bool, phi *Phi) {
- livePhis[phi] = true
- for _, rand := range phi.Operands(nil) {
- if q, ok := (*rand).(*Phi); ok {
- if !livePhis[q] {
- markLivePhi(livePhis, q)
- }
- }
- }
-}
-
-// phiHasDirectReferrer reports whether phi is directly referred to by
-// a non-Phi instruction. Such instructions are the
-// roots of the liveness traversal.
-func phiHasDirectReferrer(phi *Phi) bool {
- for _, instr := range *phi.Referrers() {
- if _, ok := instr.(*Phi); !ok {
- return true
- }
- }
- return false
-}
-
-type blockSet struct{ big.Int } // (inherit methods from Int)
-
-// add adds b to the set and returns true if the set changed.
-func (s *blockSet) add(b *BasicBlock) bool {
- i := b.Index
- if s.Bit(i) != 0 {
- return false
- }
- s.SetBit(&s.Int, i, 1)
- return true
-}
-
-// take removes an arbitrary element from a set s and
-// returns its index, or returns -1 if empty.
-func (s *blockSet) take() int {
- l := s.BitLen()
- for i := 0; i < l; i++ {
- if s.Bit(i) == 1 {
- s.SetBit(&s.Int, i, 0)
- return i
- }
- }
- return -1
-}
-
-// newPhi is a pair of a newly introduced φ-node and the lifted Alloc
-// it replaces.
-type newPhi struct {
- phi *Phi
- alloc *Alloc
-}
-
-// newPhiMap records for each basic block, the set of newPhis that
-// must be prepended to the block.
-type newPhiMap map[*BasicBlock][]newPhi
-
-// liftAlloc determines whether alloc can be lifted into registers,
-// and if so, it populates newPhis with all the φ-nodes it may require
-// and returns true.
-//
-// fresh is a source of fresh ids for phi nodes.
-//
-func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap, fresh *int) bool {
- // Don't lift aggregates into registers, because we don't have
- // a way to express their zero-constants.
- switch deref(alloc.Type()).Underlying().(type) {
- case *types.Array, *types.Struct:
- return false
- }
-
- // Don't lift named return values in functions that defer
- // calls that may recover from panic.
- if fn := alloc.Parent(); fn.Recover != nil {
- for _, nr := range fn.namedResults {
- if nr == alloc {
- return false
- }
- }
- }
-
- // Compute defblocks, the set of blocks containing a
- // definition of the alloc cell.
- var defblocks blockSet
- for _, instr := range *alloc.Referrers() {
- // Bail out if we discover the alloc is not liftable;
- // the only operations permitted to use the alloc are
- // loads/stores into the cell, and DebugRef.
- switch instr := instr.(type) {
- case *Store:
- if instr.Val == alloc {
- return false // address used as value
- }
- if instr.Addr != alloc {
- panic("Alloc.Referrers is inconsistent")
- }
- defblocks.add(instr.Block())
- case *UnOp:
- if instr.Op != token.MUL {
- return false // not a load
- }
- if instr.X != alloc {
- panic("Alloc.Referrers is inconsistent")
- }
- case *DebugRef:
- // ok
- default:
- return false // some other instruction
- }
- }
- // The Alloc itself counts as a (zero) definition of the cell.
- defblocks.add(alloc.Block())
-
- if debugLifting {
- fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name())
- }
-
- fn := alloc.Parent()
-
- // Φ-insertion.
- //
- // What follows is the body of the main loop of the insert-φ
- // function described by Cytron et al, but instead of using
- // counter tricks, we just reset the 'hasAlready' and 'work'
- // sets each iteration. These are bitmaps so it's pretty cheap.
- //
- // TODO(adonovan): opt: recycle slice storage for W,
- // hasAlready, defBlocks across liftAlloc calls.
- var hasAlready blockSet
-
- // Initialize W and work to defblocks.
- var work blockSet = defblocks // blocks seen
- var W blockSet // blocks to do
- W.Set(&defblocks.Int)
-
- // Traverse iterated dominance frontier, inserting φ-nodes.
- for i := W.take(); i != -1; i = W.take() {
- u := fn.Blocks[i]
- for _, v := range df[u.Index] {
- if hasAlready.add(v) {
- // Create φ-node.
- // It will be prepended to v.Instrs later, if needed.
- phi := &Phi{
- Edges: make([]Value, len(v.Preds)),
- Comment: alloc.Comment,
- }
- // This is merely a debugging aid:
- phi.setNum(*fresh)
- *fresh++
-
- phi.pos = alloc.Pos()
- phi.setType(deref(alloc.Type()))
- phi.block = v
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v)
- }
- newPhis[v] = append(newPhis[v], newPhi{phi, alloc})
-
- if work.add(v) {
- W.add(v)
- }
- }
- }
- }
-
- return true
-}
-
-// replaceAll replaces all intraprocedural uses of x with y,
-// updating x.Referrers and y.Referrers.
-// Precondition: x.Referrers() != nil, i.e. x must be local to some function.
-//
-func replaceAll(x, y Value) {
- var rands []*Value
- pxrefs := x.Referrers()
- pyrefs := y.Referrers()
- for _, instr := range *pxrefs {
- rands = instr.Operands(rands[:0]) // recycle storage
- for _, rand := range rands {
- if *rand != nil {
- if *rand == x {
- *rand = y
- }
- }
- }
- if pyrefs != nil {
- *pyrefs = append(*pyrefs, instr) // dups ok
- }
- }
- *pxrefs = nil // x is now unreferenced
-}
-
-// renamed returns the value to which alloc is being renamed,
-// constructing it lazily if it's the implicit zero initialization.
-//
-func renamed(renaming []Value, alloc *Alloc) Value {
- v := renaming[alloc.index]
- if v == nil {
- v = zeroConst(deref(alloc.Type()))
- renaming[alloc.index] = v
- }
- return v
-}
-
-// rename implements the (Cytron et al) SSA renaming algorithm, a
-// preorder traversal of the dominator tree replacing all loads of
-// Alloc cells with the value stored to that cell by the dominating
-// store instruction. For lifting, we need only consider loads,
-// stores and φ-nodes.
-//
-// renaming is a map from *Alloc (keyed by index number) to its
-// dominating stored value; newPhis[x] is the set of new φ-nodes to be
-// prepended to block x.
-//
-func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) {
- // Each φ-node becomes the new name for its associated Alloc.
- for _, np := range newPhis[u] {
- phi := np.phi
- alloc := np.alloc
- renaming[alloc.index] = phi
- }
-
- // Rename loads and stores of allocs.
- for i, instr := range u.Instrs {
- switch instr := instr.(type) {
- case *Alloc:
- if instr.index >= 0 { // store of zero to Alloc cell
- // Replace dominated loads by the zero value.
- renaming[instr.index] = nil
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr)
- }
- // Delete the Alloc.
- u.Instrs[i] = nil
- u.gaps++
- }
-
- case *Store:
- if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell
- // Replace dominated loads by the stored value.
- renaming[alloc.index] = instr.Val
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n",
- instr, instr.Val.Name())
- }
- // Remove the store from the referrer list of the stored value.
- if refs := instr.Val.Referrers(); refs != nil {
- *refs = removeInstr(*refs, instr)
- }
- // Delete the Store.
- u.Instrs[i] = nil
- u.gaps++
- }
-
- case *UnOp:
- if instr.Op == token.MUL {
- if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell
- newval := renamed(renaming, alloc)
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n",
- instr.Name(), instr, newval.Name())
- }
- // Replace all references to
- // the loaded value by the
- // dominating stored value.
- replaceAll(instr, newval)
- // Delete the Load.
- u.Instrs[i] = nil
- u.gaps++
- }
- }
-
- case *DebugRef:
- if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell
- if instr.IsAddr {
- instr.X = renamed(renaming, alloc)
- instr.IsAddr = false
-
- // Add DebugRef to instr.X's referrers.
- if refs := instr.X.Referrers(); refs != nil {
- *refs = append(*refs, instr)
- }
- } else {
- // A source expression denotes the address
- // of an Alloc that was optimized away.
- instr.X = nil
-
- // Delete the DebugRef.
- u.Instrs[i] = nil
- u.gaps++
- }
- }
- }
- }
-
- // For each φ-node in a CFG successor, rename the edge.
- for _, v := range u.Succs {
- phis := newPhis[v]
- if len(phis) == 0 {
- continue
- }
- i := v.predIndex(u)
- for _, np := range phis {
- phi := np.phi
- alloc := np.alloc
- newval := renamed(renaming, alloc)
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n",
- phi.Name(), u, v, i, alloc.Name(), newval.Name())
- }
- phi.Edges[i] = newval
- if prefs := newval.Referrers(); prefs != nil {
- *prefs = append(*prefs, phi)
- }
- }
- }
-
- // Continue depth-first recursion over domtree, pushing a
- // fresh copy of the renaming map for each subtree.
- for i, v := range u.dom.children {
- r := renaming
- if i < len(u.dom.children)-1 {
- // On all but the final iteration, we must make
- // a copy to avoid destructive update.
- r = make([]Value, len(renaming))
- copy(r, renaming)
- }
- rename(v, r, newPhis)
- }
-
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/lvalue.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/lvalue.go
deleted file mode 100644
index 4d85be3ec..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/lvalue.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// lvalues are the union of addressable expressions and map-index
-// expressions.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-)
-
-// An lvalue represents an assignable location that may appear on the
-// left-hand side of an assignment. This is a generalization of a
-// pointer to permit updates to elements of maps.
-//
-type lvalue interface {
- store(fn *Function, v Value) // stores v into the location
- load(fn *Function) Value // loads the contents of the location
- address(fn *Function) Value // address of the location
- typ() types.Type // returns the type of the location
-}
-
-// An address is an lvalue represented by a true pointer.
-type address struct {
- addr Value
- pos token.Pos // source position
- expr ast.Expr // source syntax of the value (not address) [debug mode]
-}
-
-func (a *address) load(fn *Function) Value {
- load := emitLoad(fn, a.addr)
- load.pos = a.pos
- return load
-}
-
-func (a *address) store(fn *Function, v Value) {
- store := emitStore(fn, a.addr, v, a.pos)
- if a.expr != nil {
- // store.Val is v, converted for assignability.
- emitDebugRef(fn, a.expr, store.Val, false)
- }
-}
-
-func (a *address) address(fn *Function) Value {
- if a.expr != nil {
- emitDebugRef(fn, a.expr, a.addr, true)
- }
- return a.addr
-}
-
-func (a *address) typ() types.Type {
- return deref(a.addr.Type())
-}
-
-// An element is an lvalue represented by m[k], the location of an
-// element of a map or string. These locations are not addressable
-// since pointers cannot be formed from them, but they do support
-// load(), and in the case of maps, store().
-//
-type element struct {
- m, k Value // map or string
- t types.Type // map element type or string byte type
- pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v)
-}
-
-func (e *element) load(fn *Function) Value {
- l := &Lookup{
- X: e.m,
- Index: e.k,
- }
- l.setPos(e.pos)
- l.setType(e.t)
- return fn.emit(l)
-}
-
-func (e *element) store(fn *Function, v Value) {
- up := &MapUpdate{
- Map: e.m,
- Key: e.k,
- Value: emitConv(fn, v, e.t),
- }
- up.pos = e.pos
- fn.emit(up)
-}
-
-func (e *element) address(fn *Function) Value {
- panic("map/string elements are not addressable")
-}
-
-func (e *element) typ() types.Type {
- return e.t
-}
-
-// A blank is a dummy variable whose name is "_".
-// It is not reified: loads are illegal and stores are ignored.
-//
-type blank struct{}
-
-func (bl blank) load(fn *Function) Value {
- panic("blank.load is illegal")
-}
-
-func (bl blank) store(fn *Function, v Value) {
- // no-op
-}
-
-func (bl blank) address(fn *Function) Value {
- panic("blank var is not addressable")
-}
-
-func (bl blank) typ() types.Type {
- // This should be the type of the blank Ident; the typechecker
- // doesn't provide this yet, but fortunately, we don't need it
- // yet either.
- panic("blank.typ is unimplemented")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/methods.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/methods.go
deleted file mode 100644
index 080dca968..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/methods.go
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines utilities for population of method sets.
-
-import (
- "fmt"
- "go/types"
-)
-
-// MethodValue returns the Function implementing method sel, building
-// wrapper methods on demand. It returns nil if sel denotes an
-// abstract (interface) method.
-//
-// Precondition: sel.Kind() == MethodVal.
-//
-// Thread-safe.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) MethodValue(sel *types.Selection) *Function {
- if sel.Kind() != types.MethodVal {
- panic(fmt.Sprintf("Method(%s) kind != MethodVal", sel))
- }
- T := sel.Recv()
- if isInterface(T) {
- return nil // abstract method
- }
- if prog.mode&LogSource != 0 {
- defer logStack("Method %s %v", T, sel)()
- }
-
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- return prog.addMethod(prog.createMethodSet(T), sel)
-}
-
-// LookupMethod returns the implementation of the method of type T
-// identified by (pkg, name). It returns nil if the method exists but
-// is abstract, and panics if T has no such method.
-//
-func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function {
- sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name)
- if sel == nil {
- panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name)))
- }
- return prog.MethodValue(sel)
-}
-
-// methodSet contains the (concrete) methods of a non-interface type.
-type methodSet struct {
- mapping map[string]*Function // populated lazily
- complete bool // mapping contains all methods
-}
-
-// Precondition: !isInterface(T).
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-func (prog *Program) createMethodSet(T types.Type) *methodSet {
- mset, ok := prog.methodSets.At(T).(*methodSet)
- if !ok {
- mset = &methodSet{mapping: make(map[string]*Function)}
- prog.methodSets.Set(T, mset)
- }
- return mset
-}
-
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function {
- if sel.Kind() == types.MethodExpr {
- panic(sel)
- }
- id := sel.Obj().Id()
- fn := mset.mapping[id]
- if fn == nil {
- obj := sel.Obj().(*types.Func)
-
- needsPromotion := len(sel.Index()) > 1
- needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv())
- if needsPromotion || needsIndirection {
- fn = makeWrapper(prog, sel)
- } else {
- fn = prog.declaredFunc(obj)
- }
- if fn.Signature.Recv() == nil {
- panic(fn) // missing receiver
- }
- mset.mapping[id] = fn
- }
- return fn
-}
-
-// RuntimeTypes returns a new unordered slice containing all
-// concrete types in the program for which a complete (non-empty)
-// method set is required at run-time.
-//
-// Thread-safe.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) RuntimeTypes() []types.Type {
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- var res []types.Type
- prog.methodSets.Iterate(func(T types.Type, v interface{}) {
- if v.(*methodSet).complete {
- res = append(res, T)
- }
- })
- return res
-}
-
-// declaredFunc returns the concrete function/method denoted by obj.
-// Panic ensues if there is none.
-//
-func (prog *Program) declaredFunc(obj *types.Func) *Function {
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Function)
- }
- panic("no concrete method: " + obj.String())
-}
-
-// needMethodsOf ensures that runtime type information (including the
-// complete method set) is available for the specified type T and all
-// its subcomponents.
-//
-// needMethodsOf must be called for at least every type that is an
-// operand of some MakeInterface instruction, and for the type of
-// every exported package member.
-//
-// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-//
-// Thread-safe. (Called via emitConv from multiple builder goroutines.)
-//
-// TODO(adonovan): make this faster. It accounts for 20% of SSA build time.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) needMethodsOf(T types.Type) {
- prog.methodsMu.Lock()
- prog.needMethods(T, false)
- prog.methodsMu.Unlock()
-}
-
-// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-// Recursive case: skip => don't create methods for T.
-//
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-//
-func (prog *Program) needMethods(T types.Type, skip bool) {
- // Each package maintains its own set of types it has visited.
- if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok {
- // needMethods(T) was previously called
- if !prevSkip || skip {
- return // already seen, with same or false 'skip' value
- }
- }
- prog.runtimeTypes.Set(T, skip)
-
- tmset := prog.MethodSets.MethodSet(T)
-
- if !skip && !isInterface(T) && tmset.Len() > 0 {
- // Create methods of T.
- mset := prog.createMethodSet(T)
- if !mset.complete {
- mset.complete = true
- n := tmset.Len()
- for i := 0; i < n; i++ {
- prog.addMethod(mset, tmset.At(i))
- }
- }
- }
-
- // Recursion over signatures of each method.
- for i := 0; i < tmset.Len(); i++ {
- sig := tmset.At(i).Type().(*types.Signature)
- prog.needMethods(sig.Params(), false)
- prog.needMethods(sig.Results(), false)
- }
-
- switch t := T.(type) {
- case *types.Basic:
- // nop
-
- case *types.Interface:
- // nop---handled by recursion over method set.
-
- case *types.Pointer:
- prog.needMethods(t.Elem(), false)
-
- case *types.Slice:
- prog.needMethods(t.Elem(), false)
-
- case *types.Chan:
- prog.needMethods(t.Elem(), false)
-
- case *types.Map:
- prog.needMethods(t.Key(), false)
- prog.needMethods(t.Elem(), false)
-
- case *types.Signature:
- if t.Recv() != nil {
- panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
- }
- prog.needMethods(t.Params(), false)
- prog.needMethods(t.Results(), false)
-
- case *types.Named:
- // A pointer-to-named type can be derived from a named
- // type via reflection. It may have methods too.
- prog.needMethods(types.NewPointer(T), false)
-
- // Consider 'type T struct{S}' where S has methods.
- // Reflection provides no way to get from T to struct{S},
- // only to S, so the method set of struct{S} is unwanted,
- // so set 'skip' flag during recursion.
- prog.needMethods(t.Underlying(), true)
-
- case *types.Array:
- prog.needMethods(t.Elem(), false)
-
- case *types.Struct:
- for i, n := 0, t.NumFields(); i < n; i++ {
- prog.needMethods(t.Field(i).Type(), false)
- }
-
- case *types.Tuple:
- for i, n := 0, t.Len(); i < n; i++ {
- prog.needMethods(t.At(i).Type(), false)
- }
-
- default:
- panic(T)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/mode.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/mode.go
deleted file mode 100644
index d2a269893..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/mode.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the BuilderMode type and its command-line flag.
-
-import (
- "bytes"
- "fmt"
-)
-
-// BuilderMode is a bitmask of options for diagnostics and checking.
-//
-// *BuilderMode satisfies the flag.Value interface. Example:
-//
-// var mode = ssa.BuilderMode(0)
-// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) }
-//
-type BuilderMode uint
-
-const (
- PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout
- PrintFunctions // Print function SSA code to stdout
- LogSource // Log source locations as SSA builder progresses
- SanityCheckFunctions // Perform sanity checking of function bodies
- NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers
- BuildSerially // Build packages serially, not in parallel.
- GlobalDebug // Enable debug info for all packages
- BareInits // Build init functions without guards or calls to dependent inits
-)
-
-const BuilderModeDoc = `Options controlling the SSA builder.
-The value is a sequence of zero or more of these letters:
-C perform sanity [C]hecking of the SSA form.
-D include [D]ebug info for every function.
-P print [P]ackage inventory.
-F print [F]unction SSA code.
-S log [S]ource locations as SSA builder progresses.
-L build distinct packages seria[L]ly instead of in parallel.
-N build [N]aive SSA form: don't replace local loads/stores with registers.
-I build bare [I]nit functions: no init guards or calls to dependent inits.
-`
-
-func (m BuilderMode) String() string {
- var buf bytes.Buffer
- if m&GlobalDebug != 0 {
- buf.WriteByte('D')
- }
- if m&PrintPackages != 0 {
- buf.WriteByte('P')
- }
- if m&PrintFunctions != 0 {
- buf.WriteByte('F')
- }
- if m&LogSource != 0 {
- buf.WriteByte('S')
- }
- if m&SanityCheckFunctions != 0 {
- buf.WriteByte('C')
- }
- if m&NaiveForm != 0 {
- buf.WriteByte('N')
- }
- if m&BuildSerially != 0 {
- buf.WriteByte('L')
- }
- return buf.String()
-}
-
-// Set parses the flag characters in s and updates *m.
-func (m *BuilderMode) Set(s string) error {
- var mode BuilderMode
- for _, c := range s {
- switch c {
- case 'D':
- mode |= GlobalDebug
- case 'P':
- mode |= PrintPackages
- case 'F':
- mode |= PrintFunctions
- case 'S':
- mode |= LogSource | BuildSerially
- case 'C':
- mode |= SanityCheckFunctions
- case 'N':
- mode |= NaiveForm
- case 'L':
- mode |= BuildSerially
- default:
- return fmt.Errorf("unknown BuilderMode option: %q", c)
- }
- }
- *m = mode
- return nil
-}
-
-// Get returns m.
-func (m BuilderMode) Get() interface{} { return m }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/print.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/print.go
deleted file mode 100644
index 3333ba41a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/print.go
+++ /dev/null
@@ -1,431 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the String() methods for all Value and
-// Instruction types.
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "io"
- "reflect"
- "sort"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// relName returns the name of v relative to i.
-// In most cases, this is identical to v.Name(), but references to
-// Functions (including methods) and Globals use RelString and
-// all types are displayed with relType, so that only cross-package
-// references are package-qualified.
-//
-func relName(v Value, i Instruction) string {
- var from *types.Package
- if i != nil {
- from = i.Parent().pkg()
- }
- switch v := v.(type) {
- case Member: // *Function or *Global
- return v.RelString(from)
- case *Const:
- return v.RelString(from)
- }
- return v.Name()
-}
-
-func relType(t types.Type, from *types.Package) string {
- return types.TypeString(t, types.RelativeTo(from))
-}
-
-func relString(m Member, from *types.Package) string {
- // NB: not all globals have an Object (e.g. init$guard),
- // so use Package().Object not Object.Package().
- if pkg := m.Package().Pkg; pkg != nil && pkg != from {
- return fmt.Sprintf("%s.%s", pkg.Path(), m.Name())
- }
- return m.Name()
-}
-
-// Value.String()
-//
-// This method is provided only for debugging.
-// It never appears in disassembly, which uses Value.Name().
-
-func (v *Parameter) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from))
-}
-
-func (v *FreeVar) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from))
-}
-
-func (v *Builtin) String() string {
- return fmt.Sprintf("builtin %s", v.Name())
-}
-
-// Instruction.String()
-
-func (v *Alloc) String() string {
- op := "local"
- if v.Heap {
- op = "new"
- }
- from := v.Parent().pkg()
- return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment)
-}
-
-func (v *Phi) String() string {
- var b bytes.Buffer
- b.WriteString("phi [")
- for i, edge := range v.Edges {
- if i > 0 {
- b.WriteString(", ")
- }
- // Be robust against malformed CFG.
- if v.block == nil {
- b.WriteString("??")
- continue
- }
- block := -1
- if i < len(v.block.Preds) {
- block = v.block.Preds[i].Index
- }
- fmt.Fprintf(&b, "%d: ", block)
- edgeVal := "" // be robust
- if edge != nil {
- edgeVal = relName(edge, v)
- }
- b.WriteString(edgeVal)
- }
- b.WriteString("]")
- if v.Comment != "" {
- b.WriteString(" #")
- b.WriteString(v.Comment)
- }
- return b.String()
-}
-
-func printCall(v *CallCommon, prefix string, instr Instruction) string {
- var b bytes.Buffer
- b.WriteString(prefix)
- if !v.IsInvoke() {
- b.WriteString(relName(v.Value, instr))
- } else {
- fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name())
- }
- b.WriteString("(")
- for i, arg := range v.Args {
- if i > 0 {
- b.WriteString(", ")
- }
- b.WriteString(relName(arg, instr))
- }
- if v.Signature().Variadic() {
- b.WriteString("...")
- }
- b.WriteString(")")
- return b.String()
-}
-
-func (c *CallCommon) String() string {
- return printCall(c, "", nil)
-}
-
-func (v *Call) String() string {
- return printCall(&v.Call, "", v)
-}
-
-func (v *BinOp) String() string {
- return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v))
-}
-
-func (v *UnOp) String() string {
- return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk))
-}
-
-func printConv(prefix string, v, x Value) string {
- from := v.Parent().pkg()
- return fmt.Sprintf("%s %s <- %s (%s)",
- prefix,
- relType(v.Type(), from),
- relType(x.Type(), from),
- relName(x, v.(Instruction)))
-}
-
-func (v *ChangeType) String() string { return printConv("changetype", v, v.X) }
-func (v *Convert) String() string { return printConv("convert", v, v.X) }
-func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) }
-func (v *MakeInterface) String() string { return printConv("make", v, v.X) }
-
-func (v *MakeClosure) String() string {
- var b bytes.Buffer
- fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v))
- if v.Bindings != nil {
- b.WriteString(" [")
- for i, c := range v.Bindings {
- if i > 0 {
- b.WriteString(", ")
- }
- b.WriteString(relName(c, v))
- }
- b.WriteString("]")
- }
- return b.String()
-}
-
-func (v *MakeSlice) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s %s",
- relType(v.Type(), from),
- relName(v.Len, v),
- relName(v.Cap, v))
-}
-
-func (v *Slice) String() string {
- var b bytes.Buffer
- b.WriteString("slice ")
- b.WriteString(relName(v.X, v))
- b.WriteString("[")
- if v.Low != nil {
- b.WriteString(relName(v.Low, v))
- }
- b.WriteString(":")
- if v.High != nil {
- b.WriteString(relName(v.High, v))
- }
- if v.Max != nil {
- b.WriteString(":")
- b.WriteString(relName(v.Max, v))
- }
- b.WriteString("]")
- return b.String()
-}
-
-func (v *MakeMap) String() string {
- res := ""
- if v.Reserve != nil {
- res = relName(v.Reserve, v)
- }
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s", relType(v.Type(), from), res)
-}
-
-func (v *MakeChan) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v))
-}
-
-func (v *FieldAddr) String() string {
- st := deref(v.X.Type()).Underlying().(*types.Struct)
- // Be robust against a bad index.
- name := "?"
- if 0 <= v.Field && v.Field < st.NumFields() {
- name = st.Field(v.Field).Name()
- }
- return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field)
-}
-
-func (v *Field) String() string {
- st := v.X.Type().Underlying().(*types.Struct)
- // Be robust against a bad index.
- name := "?"
- if 0 <= v.Field && v.Field < st.NumFields() {
- name = st.Field(v.Field).Name()
- }
- return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field)
-}
-
-func (v *IndexAddr) String() string {
- return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v))
-}
-
-func (v *Index) String() string {
- return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v))
-}
-
-func (v *Lookup) String() string {
- return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk))
-}
-
-func (v *Range) String() string {
- return "range " + relName(v.X, v)
-}
-
-func (v *Next) String() string {
- return "next " + relName(v.Iter, v)
-}
-
-func (v *TypeAssert) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from))
-}
-
-func (v *Extract) String() string {
- return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index)
-}
-
-func (s *Jump) String() string {
- // Be robust against malformed CFG.
- block := -1
- if s.block != nil && len(s.block.Succs) == 1 {
- block = s.block.Succs[0].Index
- }
- return fmt.Sprintf("jump %d", block)
-}
-
-func (s *If) String() string {
- // Be robust against malformed CFG.
- tblock, fblock := -1, -1
- if s.block != nil && len(s.block.Succs) == 2 {
- tblock = s.block.Succs[0].Index
- fblock = s.block.Succs[1].Index
- }
- return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock)
-}
-
-func (s *Go) String() string {
- return printCall(&s.Call, "go ", s)
-}
-
-func (s *Panic) String() string {
- return "panic " + relName(s.X, s)
-}
-
-func (s *Return) String() string {
- var b bytes.Buffer
- b.WriteString("return")
- for i, r := range s.Results {
- if i == 0 {
- b.WriteString(" ")
- } else {
- b.WriteString(", ")
- }
- b.WriteString(relName(r, s))
- }
- return b.String()
-}
-
-func (*RunDefers) String() string {
- return "rundefers"
-}
-
-func (s *Send) String() string {
- return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s))
-}
-
-func (s *Defer) String() string {
- return printCall(&s.Call, "defer ", s)
-}
-
-func (s *Select) String() string {
- var b bytes.Buffer
- for i, st := range s.States {
- if i > 0 {
- b.WriteString(", ")
- }
- if st.Dir == types.RecvOnly {
- b.WriteString("<-")
- b.WriteString(relName(st.Chan, s))
- } else {
- b.WriteString(relName(st.Chan, s))
- b.WriteString("<-")
- b.WriteString(relName(st.Send, s))
- }
- }
- non := ""
- if !s.Blocking {
- non = "non"
- }
- return fmt.Sprintf("select %sblocking [%s]", non, b.String())
-}
-
-func (s *Store) String() string {
- return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s))
-}
-
-func (s *MapUpdate) String() string {
- return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s))
-}
-
-func (s *DebugRef) String() string {
- p := s.Parent().Prog.Fset.Position(s.Pos())
- var descr interface{}
- if s.object != nil {
- descr = s.object // e.g. "var x int"
- } else {
- descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr"
- }
- var addr string
- if s.IsAddr {
- addr = "address of "
- }
- return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name())
-}
-
-func (p *Package) String() string {
- return "package " + p.Pkg.Path()
-}
-
-var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer
-
-func (p *Package) WriteTo(w io.Writer) (int64, error) {
- var buf bytes.Buffer
- WritePackage(&buf, p)
- n, err := w.Write(buf.Bytes())
- return int64(n), err
-}
-
-// WritePackage writes to buf a human-readable summary of p.
-func WritePackage(buf *bytes.Buffer, p *Package) {
- fmt.Fprintf(buf, "%s:\n", p)
-
- var names []string
- maxname := 0
- for name := range p.Members {
- if l := len(name); l > maxname {
- maxname = l
- }
- names = append(names, name)
- }
-
- from := p.Pkg
- sort.Strings(names)
- for _, name := range names {
- switch mem := p.Members[name].(type) {
- case *NamedConst:
- fmt.Fprintf(buf, " const %-*s %s = %s\n",
- maxname, name, mem.Name(), mem.Value.RelString(from))
-
- case *Function:
- fmt.Fprintf(buf, " func %-*s %s\n",
- maxname, name, relType(mem.Type(), from))
-
- case *Type:
- fmt.Fprintf(buf, " type %-*s %s\n",
- maxname, name, relType(mem.Type().Underlying(), from))
- for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
- fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from)))
- }
-
- case *Global:
- fmt.Fprintf(buf, " var %-*s %s\n",
- maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
- }
- }
-
- fmt.Fprintf(buf, "\n")
-}
-
-func commaOk(x bool) string {
- if x {
- return ",ok"
- }
- return ""
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/sanity.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/sanity.go
deleted file mode 100644
index b15ad9fb1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/sanity.go
+++ /dev/null
@@ -1,521 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// An optional pass for sanity-checking invariants of the SSA representation.
-// Currently it checks CFG invariants but little at the instruction level.
-
-import (
- "fmt"
- "go/types"
- "io"
- "os"
- "strings"
-)
-
-type sanity struct {
- reporter io.Writer
- fn *Function
- block *BasicBlock
- instrs map[Instruction]struct{}
- insane bool
-}
-
-// sanityCheck performs integrity checking of the SSA representation
-// of the function fn and returns true if it was valid. Diagnostics
-// are written to reporter if non-nil, os.Stderr otherwise. Some
-// diagnostics are only warnings and do not imply a negative result.
-//
-// Sanity-checking is intended to facilitate the debugging of code
-// transformation passes.
-//
-func sanityCheck(fn *Function, reporter io.Writer) bool {
- if reporter == nil {
- reporter = os.Stderr
- }
- return (&sanity{reporter: reporter}).checkFunction(fn)
-}
-
-// mustSanityCheck is like sanityCheck but panics instead of returning
-// a negative result.
-//
-func mustSanityCheck(fn *Function, reporter io.Writer) {
- if !sanityCheck(fn, reporter) {
- fn.WriteTo(os.Stderr)
- panic("SanityCheck failed")
- }
-}
-
-func (s *sanity) diagnostic(prefix, format string, args ...interface{}) {
- fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn)
- if s.block != nil {
- fmt.Fprintf(s.reporter, ", block %s", s.block)
- }
- io.WriteString(s.reporter, ": ")
- fmt.Fprintf(s.reporter, format, args...)
- io.WriteString(s.reporter, "\n")
-}
-
-func (s *sanity) errorf(format string, args ...interface{}) {
- s.insane = true
- s.diagnostic("Error", format, args...)
-}
-
-func (s *sanity) warnf(format string, args ...interface{}) {
- s.diagnostic("Warning", format, args...)
-}
-
-// findDuplicate returns an arbitrary basic block that appeared more
-// than once in blocks, or nil if all were unique.
-func findDuplicate(blocks []*BasicBlock) *BasicBlock {
- if len(blocks) < 2 {
- return nil
- }
- if blocks[0] == blocks[1] {
- return blocks[0]
- }
- // Slow path:
- m := make(map[*BasicBlock]bool)
- for _, b := range blocks {
- if m[b] {
- return b
- }
- m[b] = true
- }
- return nil
-}
-
-func (s *sanity) checkInstr(idx int, instr Instruction) {
- switch instr := instr.(type) {
- case *If, *Jump, *Return, *Panic:
- s.errorf("control flow instruction not at end of block")
- case *Phi:
- if idx == 0 {
- // It suffices to apply this check to just the first phi node.
- if dup := findDuplicate(s.block.Preds); dup != nil {
- s.errorf("phi node in block with duplicate predecessor %s", dup)
- }
- } else {
- prev := s.block.Instrs[idx-1]
- if _, ok := prev.(*Phi); !ok {
- s.errorf("Phi instruction follows a non-Phi: %T", prev)
- }
- }
- if ne, np := len(instr.Edges), len(s.block.Preds); ne != np {
- s.errorf("phi node has %d edges but %d predecessors", ne, np)
-
- } else {
- for i, e := range instr.Edges {
- if e == nil {
- s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i])
- }
- }
- }
-
- case *Alloc:
- if !instr.Heap {
- found := false
- for _, l := range s.fn.Locals {
- if l == instr {
- found = true
- break
- }
- }
- if !found {
- s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr)
- }
- }
-
- case *BinOp:
- case *Call:
- case *ChangeInterface:
- case *ChangeType:
- case *Convert:
- if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok {
- if _, ok := instr.Type().Underlying().(*types.Basic); !ok {
- s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type())
- }
- }
-
- case *Defer:
- case *Extract:
- case *Field:
- case *FieldAddr:
- case *Go:
- case *Index:
- case *IndexAddr:
- case *Lookup:
- case *MakeChan:
- case *MakeClosure:
- numFree := len(instr.Fn.(*Function).FreeVars)
- numBind := len(instr.Bindings)
- if numFree != numBind {
- s.errorf("MakeClosure has %d Bindings for function %s with %d free vars",
- numBind, instr.Fn, numFree)
-
- }
- if recv := instr.Type().(*types.Signature).Recv(); recv != nil {
- s.errorf("MakeClosure's type includes receiver %s", recv.Type())
- }
-
- case *MakeInterface:
- case *MakeMap:
- case *MakeSlice:
- case *MapUpdate:
- case *Next:
- case *Range:
- case *RunDefers:
- case *Select:
- case *Send:
- case *Slice:
- case *Store:
- case *TypeAssert:
- case *UnOp:
- case *DebugRef:
- // TODO(adonovan): implement checks.
- default:
- panic(fmt.Sprintf("Unknown instruction type: %T", instr))
- }
-
- if call, ok := instr.(CallInstruction); ok {
- if call.Common().Signature() == nil {
- s.errorf("nil signature: %s", call)
- }
- }
-
- // Check that value-defining instructions have valid types
- // and a valid referrer list.
- if v, ok := instr.(Value); ok {
- t := v.Type()
- if t == nil {
- s.errorf("no type: %s = %s", v.Name(), v)
- } else if t == tRangeIter {
- // not a proper type; ignore.
- } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
- s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t)
- }
- s.checkReferrerList(v)
- }
-
- // Untyped constants are legal as instruction Operands(),
- // for example:
- // _ = "foo"[0]
- // or:
- // if wordsize==64 {...}
-
- // All other non-Instruction Values can be found via their
- // enclosing Function or Package.
-}
-
-func (s *sanity) checkFinalInstr(idx int, instr Instruction) {
- switch instr := instr.(type) {
- case *If:
- if nsuccs := len(s.block.Succs); nsuccs != 2 {
- s.errorf("If-terminated block has %d successors; expected 2", nsuccs)
- return
- }
- if s.block.Succs[0] == s.block.Succs[1] {
- s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0])
- return
- }
-
- case *Jump:
- if nsuccs := len(s.block.Succs); nsuccs != 1 {
- s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs)
- return
- }
-
- case *Return:
- if nsuccs := len(s.block.Succs); nsuccs != 0 {
- s.errorf("Return-terminated block has %d successors; expected none", nsuccs)
- return
- }
- if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na {
- s.errorf("%d-ary return in %d-ary function", na, nf)
- }
-
- case *Panic:
- if nsuccs := len(s.block.Succs); nsuccs != 0 {
- s.errorf("Panic-terminated block has %d successors; expected none", nsuccs)
- return
- }
-
- default:
- s.errorf("non-control flow instruction at end of block")
- }
-}
-
-func (s *sanity) checkBlock(b *BasicBlock, index int) {
- s.block = b
-
- if b.Index != index {
- s.errorf("block has incorrect Index %d", b.Index)
- }
- if b.parent != s.fn {
- s.errorf("block has incorrect parent %s", b.parent)
- }
-
- // Check all blocks are reachable.
- // (The entry block is always implicitly reachable,
- // as is the Recover block, if any.)
- if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 {
- s.warnf("unreachable block")
- if b.Instrs == nil {
- // Since this block is about to be pruned,
- // tolerating transient problems in it
- // simplifies other optimizations.
- return
- }
- }
-
- // Check predecessor and successor relations are dual,
- // and that all blocks in CFG belong to same function.
- for _, a := range b.Preds {
- found := false
- for _, bb := range a.Succs {
- if bb == b {
- found = true
- break
- }
- }
- if !found {
- s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs)
- }
- if a.parent != s.fn {
- s.errorf("predecessor %s belongs to different function %s", a, a.parent)
- }
- }
- for _, c := range b.Succs {
- found := false
- for _, bb := range c.Preds {
- if bb == b {
- found = true
- break
- }
- }
- if !found {
- s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds)
- }
- if c.parent != s.fn {
- s.errorf("successor %s belongs to different function %s", c, c.parent)
- }
- }
-
- // Check each instruction is sane.
- n := len(b.Instrs)
- if n == 0 {
- s.errorf("basic block contains no instructions")
- }
- var rands [10]*Value // reuse storage
- for j, instr := range b.Instrs {
- if instr == nil {
- s.errorf("nil instruction at index %d", j)
- continue
- }
- if b2 := instr.Block(); b2 == nil {
- s.errorf("nil Block() for instruction at index %d", j)
- continue
- } else if b2 != b {
- s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j)
- continue
- }
- if j < n-1 {
- s.checkInstr(j, instr)
- } else {
- s.checkFinalInstr(j, instr)
- }
-
- // Check Instruction.Operands.
- operands:
- for i, op := range instr.Operands(rands[:0]) {
- if op == nil {
- s.errorf("nil operand pointer %d of %s", i, instr)
- continue
- }
- val := *op
- if val == nil {
- continue // a nil operand is ok
- }
-
- // Check that "untyped" types only appear on constant operands.
- if _, ok := (*op).(*Const); !ok {
- if basic, ok := (*op).Type().(*types.Basic); ok {
- if basic.Info()&types.IsUntyped != 0 {
- s.errorf("operand #%d of %s is untyped: %s", i, instr, basic)
- }
- }
- }
-
- // Check that Operands that are also Instructions belong to same function.
- // TODO(adonovan): also check their block dominates block b.
- if val, ok := val.(Instruction); ok {
- if val.Block() == nil {
- s.errorf("operand %d of %s is an instruction (%s) that belongs to no block", i, instr, val)
- } else if val.Parent() != s.fn {
- s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent())
- }
- }
-
- // Check that each function-local operand of
- // instr refers back to instr. (NB: quadratic)
- switch val := val.(type) {
- case *Const, *Global, *Builtin:
- continue // not local
- case *Function:
- if val.parent == nil {
- continue // only anon functions are local
- }
- }
-
- // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined.
-
- if refs := val.Referrers(); refs != nil {
- for _, ref := range *refs {
- if ref == instr {
- continue operands
- }
- }
- s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val)
- } else {
- s.errorf("operand %d of %s (%s) has no referrers", i, instr, val)
- }
- }
- }
-}
-
-func (s *sanity) checkReferrerList(v Value) {
- refs := v.Referrers()
- if refs == nil {
- s.errorf("%s has missing referrer list", v.Name())
- return
- }
- for i, ref := range *refs {
- if _, ok := s.instrs[ref]; !ok {
- s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref)
- }
- }
-}
-
-func (s *sanity) checkFunction(fn *Function) bool {
- // TODO(adonovan): check Function invariants:
- // - check params match signature
- // - check transient fields are nil
- // - warn if any fn.Locals do not appear among block instructions.
- s.fn = fn
- if fn.Prog == nil {
- s.errorf("nil Prog")
- }
-
- fn.String() // must not crash
- fn.RelString(fn.pkg()) // must not crash
-
- // All functions have a package, except delegates (which are
- // shared across packages, or duplicated as weak symbols in a
- // separate-compilation model), and error.Error.
- if fn.Pkg == nil {
- if strings.HasPrefix(fn.Synthetic, "wrapper ") ||
- strings.HasPrefix(fn.Synthetic, "bound ") ||
- strings.HasPrefix(fn.Synthetic, "thunk ") ||
- strings.HasSuffix(fn.name, "Error") {
- // ok
- } else {
- s.errorf("nil Pkg")
- }
- }
- if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn {
- s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
- }
- for i, l := range fn.Locals {
- if l.Parent() != fn {
- s.errorf("Local %s at index %d has wrong parent", l.Name(), i)
- }
- if l.Heap {
- s.errorf("Local %s at index %d has Heap flag set", l.Name(), i)
- }
- }
- // Build the set of valid referrers.
- s.instrs = make(map[Instruction]struct{})
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- s.instrs[instr] = struct{}{}
- }
- }
- for i, p := range fn.Params {
- if p.Parent() != fn {
- s.errorf("Param %s at index %d has wrong parent", p.Name(), i)
- }
- s.checkReferrerList(p)
- }
- for i, fv := range fn.FreeVars {
- if fv.Parent() != fn {
- s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i)
- }
- s.checkReferrerList(fv)
- }
-
- if fn.Blocks != nil && len(fn.Blocks) == 0 {
- // Function _had_ blocks (so it's not external) but
- // they were "optimized" away, even the entry block.
- s.errorf("Blocks slice is non-nil but empty")
- }
- for i, b := range fn.Blocks {
- if b == nil {
- s.warnf("nil *BasicBlock at f.Blocks[%d]", i)
- continue
- }
- s.checkBlock(b, i)
- }
- if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover {
- s.errorf("Recover block is not in Blocks slice")
- }
-
- s.block = nil
- for i, anon := range fn.AnonFuncs {
- if anon.Parent() != fn {
- s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent())
- }
- }
- s.fn = nil
- return !s.insane
-}
-
-// sanityCheckPackage checks invariants of packages upon creation.
-// It does not require that the package is built.
-// Unlike sanityCheck (for functions), it just panics at the first error.
-func sanityCheckPackage(pkg *Package) {
- if pkg.Pkg == nil {
- panic(fmt.Sprintf("Package %s has no Object", pkg))
- }
- pkg.String() // must not crash
-
- for name, mem := range pkg.Members {
- if name != mem.Name() {
- panic(fmt.Sprintf("%s: %T.Name() = %s, want %s",
- pkg.Pkg.Path(), mem, mem.Name(), name))
- }
- obj := mem.Object()
- if obj == nil {
- // This check is sound because fields
- // {Global,Function}.object have type
- // types.Object. (If they were declared as
- // *types.{Var,Func}, we'd have a non-empty
- // interface containing a nil pointer.)
-
- continue // not all members have typechecker objects
- }
- if obj.Name() != name {
- if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") {
- // Ok. The name of a declared init function varies between
- // its types.Func ("init") and its ssa.Function ("init#%d").
- } else {
- panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s",
- pkg.Pkg.Path(), mem, obj.Name(), name))
- }
- }
- if obj.Pos() != mem.Pos() {
- panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos()))
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/source.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/source.go
deleted file mode 100644
index 6d2223eda..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/source.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines utilities for working with source positions
-// or source-level named entities ("objects").
-
-// TODO(adonovan): test that {Value,Instruction}.Pos() positions match
-// the originating syntax, as specified.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-)
-
-// EnclosingFunction returns the function that contains the syntax
-// node denoted by path.
-//
-// Syntax associated with package-level variable specifications is
-// enclosed by the package's init() function.
-//
-// Returns nil if not found; reasons might include:
-// - the node is not enclosed by any function.
-// - the node is within an anonymous function (FuncLit) and
-// its SSA function has not been created yet
-// (pkg.Build() has not yet been called).
-//
-func EnclosingFunction(pkg *Package, path []ast.Node) *Function {
- // Start with package-level function...
- fn := findEnclosingPackageLevelFunction(pkg, path)
- if fn == nil {
- return nil // not in any function
- }
-
- // ...then walk down the nested anonymous functions.
- n := len(path)
-outer:
- for i := range path {
- if lit, ok := path[n-1-i].(*ast.FuncLit); ok {
- for _, anon := range fn.AnonFuncs {
- if anon.Pos() == lit.Type.Func {
- fn = anon
- continue outer
- }
- }
- // SSA function not found:
- // - package not yet built, or maybe
- // - builder skipped FuncLit in dead block
- // (in principle; but currently the Builder
- // generates even dead FuncLits).
- return nil
- }
- }
- return fn
-}
-
-// HasEnclosingFunction returns true if the AST node denoted by path
-// is contained within the declaration of some function or
-// package-level variable.
-//
-// Unlike EnclosingFunction, the behaviour of this function does not
-// depend on whether SSA code for pkg has been built, so it can be
-// used to quickly reject check inputs that will cause
-// EnclosingFunction to fail, prior to SSA building.
-//
-func HasEnclosingFunction(pkg *Package, path []ast.Node) bool {
- return findEnclosingPackageLevelFunction(pkg, path) != nil
-}
-
-// findEnclosingPackageLevelFunction returns the Function
-// corresponding to the package-level function enclosing path.
-//
-func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function {
- if n := len(path); n >= 2 { // [... {Gen,Func}Decl File]
- switch decl := path[n-2].(type) {
- case *ast.GenDecl:
- if decl.Tok == token.VAR && n >= 3 {
- // Package-level 'var' initializer.
- return pkg.init
- }
-
- case *ast.FuncDecl:
- if decl.Recv == nil && decl.Name.Name == "init" {
- // Explicit init() function.
- for _, b := range pkg.init.Blocks {
- for _, instr := range b.Instrs {
- if instr, ok := instr.(*Call); ok {
- if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos {
- return callee
- }
- }
- }
- }
- // Hack: return non-nil when SSA is not yet
- // built so that HasEnclosingFunction works.
- return pkg.init
- }
- // Declared function/method.
- return findNamedFunc(pkg, decl.Name.NamePos)
- }
- }
- return nil // not in any function
-}
-
-// findNamedFunc returns the named function whose FuncDecl.Ident is at
-// position pos.
-//
-func findNamedFunc(pkg *Package, pos token.Pos) *Function {
- // Look at all package members and method sets of named types.
- // Not very efficient.
- for _, mem := range pkg.Members {
- switch mem := mem.(type) {
- case *Function:
- if mem.Pos() == pos {
- return mem
- }
- case *Type:
- mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
- for i, n := 0, mset.Len(); i < n; i++ {
- // Don't call Program.Method: avoid creating wrappers.
- obj := mset.At(i).Obj().(*types.Func)
- if obj.Pos() == pos {
- return pkg.values[obj].(*Function)
- }
- }
- }
- }
- return nil
-}
-
-// ValueForExpr returns the SSA Value that corresponds to non-constant
-// expression e.
-//
-// It returns nil if no value was found, e.g.
-// - the expression is not lexically contained within f;
-// - f was not built with debug information; or
-// - e is a constant expression. (For efficiency, no debug
-// information is stored for constants. Use
-// go/types.Info.Types[e].Value instead.)
-// - e is a reference to nil or a built-in function.
-// - the value was optimised away.
-//
-// If e is an addressable expression used in an lvalue context,
-// value is the address denoted by e, and isAddr is true.
-//
-// The types of e (or &e, if isAddr) and the result are equal
-// (modulo "untyped" bools resulting from comparisons).
-//
-// (Tip: to find the ssa.Value given a source position, use
-// importer.PathEnclosingInterval to locate the ast.Node, then
-// EnclosingFunction to locate the Function, then ValueForExpr to find
-// the ssa.Value.)
-//
-func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) {
- if f.debugInfo() { // (opt)
- e = unparen(e)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if ref, ok := instr.(*DebugRef); ok {
- if ref.Expr == e {
- return ref.X, ref.IsAddr
- }
- }
- }
- }
- }
- return
-}
-
-// --- Lookup functions for source-level named entities (types.Objects) ---
-
-// Package returns the SSA Package corresponding to the specified
-// type-checker package object.
-// It returns nil if no such SSA package has been created.
-//
-func (prog *Program) Package(obj *types.Package) *Package {
- return prog.packages[obj]
-}
-
-// packageLevelValue returns the package-level value corresponding to
-// the specified named object, which may be a package-level const
-// (*Const), var (*Global) or func (*Function) of some package in
-// prog. It returns nil if the object is not found.
-//
-func (prog *Program) packageLevelValue(obj types.Object) Value {
- if pkg, ok := prog.packages[obj.Pkg()]; ok {
- return pkg.values[obj]
- }
- return nil
-}
-
-// FuncValue returns the concrete Function denoted by the source-level
-// named function obj, or nil if obj denotes an interface method.
-//
-// TODO(adonovan): check the invariant that obj.Type() matches the
-// result's Signature, both in the params/results and in the receiver.
-//
-func (prog *Program) FuncValue(obj *types.Func) *Function {
- fn, _ := prog.packageLevelValue(obj).(*Function)
- return fn
-}
-
-// ConstValue returns the SSA Value denoted by the source-level named
-// constant obj.
-//
-func (prog *Program) ConstValue(obj *types.Const) *Const {
- // TODO(adonovan): opt: share (don't reallocate)
- // Consts for const objects and constant ast.Exprs.
-
- // Universal constant? {true,false,nil}
- if obj.Parent() == types.Universe {
- return NewConst(obj.Val(), obj.Type())
- }
- // Package-level named constant?
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Const)
- }
- return NewConst(obj.Val(), obj.Type())
-}
-
-// VarValue returns the SSA Value that corresponds to a specific
-// identifier denoting the source-level named variable obj.
-//
-// VarValue returns nil if a local variable was not found, perhaps
-// because its package was not built, the debug information was not
-// requested during SSA construction, or the value was optimized away.
-//
-// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval),
-// and that ident must resolve to obj.
-//
-// pkg is the package enclosing the reference. (A reference to a var
-// always occurs within a function, so we need to know where to find it.)
-//
-// If the identifier is a field selector and its base expression is
-// non-addressable, then VarValue returns the value of that field.
-// For example:
-// func f() struct {x int}
-// f().x // VarValue(x) returns a *Field instruction of type int
-//
-// All other identifiers denote addressable locations (variables).
-// For them, VarValue may return either the variable's address or its
-// value, even when the expression is evaluated only for its value; the
-// situation is reported by isAddr, the second component of the result.
-//
-// If !isAddr, the returned value is the one associated with the
-// specific identifier. For example,
-// var x int // VarValue(x) returns Const 0 here
-// x = 1 // VarValue(x) returns Const 1 here
-//
-// It is not specified whether the value or the address is returned in
-// any particular case, as it may depend upon optimizations performed
-// during SSA code generation, such as registerization, constant
-// folding, avoidance of materialization of subexpressions, etc.
-//
-func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) {
- // All references to a var are local to some function, possibly init.
- fn := EnclosingFunction(pkg, ref)
- if fn == nil {
- return // e.g. def of struct field; SSA not built?
- }
-
- id := ref[0].(*ast.Ident)
-
- // Defining ident of a parameter?
- if id.Pos() == obj.Pos() {
- for _, param := range fn.Params {
- if param.Object() == obj {
- return param, false
- }
- }
- }
-
- // Other ident?
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- if dr, ok := instr.(*DebugRef); ok {
- if dr.Pos() == id.Pos() {
- return dr.X, dr.IsAddr
- }
- }
- }
- }
-
- // Defining ident of package-level var?
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Global), true
- }
-
- return // e.g. debug info not requested, or var optimized away
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssa.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssa.go
deleted file mode 100644
index e8350f1c7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssa.go
+++ /dev/null
@@ -1,1696 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This package defines a high-level intermediate representation for
-// Go programs using static single-assignment (SSA) form.
-
-import (
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "sync"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// A Program is a partial or complete Go program converted to SSA form.
-type Program struct {
- Fset *token.FileSet // position information for the files of this Program
- imported map[string]*Package // all importable Packages, keyed by import path
- packages map[*types.Package]*Package // all loaded Packages, keyed by object
- mode BuilderMode // set of mode bits for SSA construction
- MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets
-
- methodsMu sync.Mutex // guards the following maps:
- methodSets typeutil.Map // maps type to its concrete methodSet
- runtimeTypes typeutil.Map // types for which rtypes are needed
- canon typeutil.Map // type canonicalization map
- bounds map[*types.Func]*Function // bounds for curried x.Method closures
- thunks map[selectionKey]*Function // thunks for T.Method expressions
-}
-
-// A Package is a single analyzed Go package containing Members for
-// all package-level functions, variables, constants and types it
-// declares. These may be accessed directly via Members, or via the
-// type-specific accessor methods Func, Type, Var and Const.
-//
-// Members also contains entries for "init" (the synthetic package
-// initializer) and "init#%d", the nth declared init function,
-// and unspecified other things too.
-//
-type Package struct {
- Prog *Program // the owning program
- Pkg *types.Package // the corresponding go/types.Package
- Members map[string]Member // all package members keyed by name (incl. init and init#%d)
- values map[types.Object]Value // package members (incl. types and methods), keyed by object
- init *Function // Func("init"); the package's init function
- debug bool // include full debug info in this package
-
- // The following fields are set transiently, then cleared
- // after building.
- buildOnce sync.Once // ensures package building occurs once
- ninit int32 // number of init functions
- info *types.Info // package type information
- files []*ast.File // package ASTs
-}
-
-// A Member is a member of a Go package, implemented by *NamedConst,
-// *Global, *Function, or *Type; they are created by package-level
-// const, var, func and type declarations respectively.
-//
-type Member interface {
- Name() string // declared name of the package member
- String() string // package-qualified name of the package member
- RelString(*types.Package) string // like String, but relative refs are unqualified
- Object() types.Object // typechecker's object for this member, if any
- Pos() token.Pos // position of member's declaration, if known
- Type() types.Type // type of the package member
- Token() token.Token // token.{VAR,FUNC,CONST,TYPE}
- Package() *Package // the containing package
-}
-
-// A Type is a Member of a Package representing a package-level named type.
-type Type struct {
- object *types.TypeName
- pkg *Package
-}
-
-// A NamedConst is a Member of a Package representing a package-level
-// named constant.
-//
-// Pos() returns the position of the declaring ast.ValueSpec.Names[*]
-// identifier.
-//
-// NB: a NamedConst is not a Value; it contains a constant Value, which
-// it augments with the name and position of its 'const' declaration.
-//
-type NamedConst struct {
- object *types.Const
- Value *Const
- pkg *Package
-}
-
-// A Value is an SSA value that can be referenced by an instruction.
-type Value interface {
- // Name returns the name of this value, and determines how
- // this Value appears when used as an operand of an
- // Instruction.
- //
- // This is the same as the source name for Parameters,
- // Builtins, Functions, FreeVars, Globals.
- // For constants, it is a representation of the constant's value
- // and type. For all other Values this is the name of the
- // virtual register defined by the instruction.
- //
- // The name of an SSA Value is not semantically significant,
- // and may not even be unique within a function.
- Name() string
-
- // If this value is an Instruction, String returns its
- // disassembled form; otherwise it returns unspecified
- // human-readable information about the Value, such as its
- // kind, name and type.
- String() string
-
- // Type returns the type of this value. Many instructions
- // (e.g. IndexAddr) change their behaviour depending on the
- // types of their operands.
- Type() types.Type
-
- // Parent returns the function to which this Value belongs.
- // It returns nil for named Functions, Builtin, Const and Global.
- Parent() *Function
-
- // Referrers returns the list of instructions that have this
- // value as one of their operands; it may contain duplicates
- // if an instruction has a repeated operand.
- //
- // Referrers actually returns a pointer through which the
- // caller may perform mutations to the object's state.
- //
- // Referrers is currently only defined if Parent()!=nil,
- // i.e. for the function-local values FreeVar, Parameter,
- // Functions (iff anonymous) and all value-defining instructions.
- // It returns nil for named Functions, Builtin, Const and Global.
- //
- // Instruction.Operands contains the inverse of this relation.
- Referrers() *[]Instruction
-
- // Pos returns the location of the AST token most closely
- // associated with the operation that gave rise to this value,
- // or token.NoPos if it was not explicit in the source.
- //
- // For each ast.Node type, a particular token is designated as
- // the closest location for the expression, e.g. the Lparen
- // for an *ast.CallExpr. This permits a compact but
- // approximate mapping from Values to source positions for use
- // in diagnostic messages, for example.
- //
- // (Do not use this position to determine which Value
- // corresponds to an ast.Expr; use Function.ValueForExpr
- // instead. NB: it requires that the function was built with
- // debug information.)
- Pos() token.Pos
-}
-
-// An Instruction is an SSA instruction that computes a new Value or
-// has some effect.
-//
-// An Instruction that defines a value (e.g. BinOp) also implements
-// the Value interface; an Instruction that only has an effect (e.g. Store)
-// does not.
-//
-type Instruction interface {
- // String returns the disassembled form of this value.
- //
- // Examples of Instructions that are Values:
- // "x + y" (BinOp)
- // "len([])" (Call)
- // Note that the name of the Value is not printed.
- //
- // Examples of Instructions that are not Values:
- // "return x" (Return)
- // "*y = x" (Store)
- //
- // (The separation Value.Name() from Value.String() is useful
- // for some analyses which distinguish the operation from the
- // value it defines, e.g., 'y = local int' is both an allocation
- // of memory 'local int' and a definition of a pointer y.)
- String() string
-
- // Parent returns the function to which this instruction
- // belongs.
- Parent() *Function
-
- // Block returns the basic block to which this instruction
- // belongs.
- Block() *BasicBlock
-
- // setBlock sets the basic block to which this instruction belongs.
- setBlock(*BasicBlock)
-
- // Operands returns the operands of this instruction: the
- // set of Values it references.
- //
- // Specifically, it appends their addresses to rands, a
- // user-provided slice, and returns the resulting slice,
- // permitting avoidance of memory allocation.
- //
- // The operands are appended in undefined order, but the order
- // is consistent for a given Instruction; the addresses are
- // always non-nil but may point to a nil Value. Clients may
- // store through the pointers, e.g. to effect a value
- // renaming.
- //
- // Value.Referrers is a subset of the inverse of this
- // relation. (Referrers are not tracked for all types of
- // Values.)
- Operands(rands []*Value) []*Value
-
- // Pos returns the location of the AST token most closely
- // associated with the operation that gave rise to this
- // instruction, or token.NoPos if it was not explicit in the
- // source.
- //
- // For each ast.Node type, a particular token is designated as
- // the closest location for the expression, e.g. the Go token
- // for an *ast.GoStmt. This permits a compact but approximate
- // mapping from Instructions to source positions for use in
- // diagnostic messages, for example.
- //
- // (Do not use this position to determine which Instruction
- // corresponds to an ast.Expr; see the notes for Value.Pos.
- // This position may be used to determine which non-Value
- // Instruction corresponds to some ast.Stmts, but not all: If
- // and Jump instructions have no Pos(), for example.)
- Pos() token.Pos
-}
-
-// A Node is a node in the SSA value graph. Every concrete type that
-// implements Node is also either a Value, an Instruction, or both.
-//
-// Node contains the methods common to Value and Instruction, plus the
-// Operands and Referrers methods generalized to return nil for
-// non-Instructions and non-Values, respectively.
-//
-// Node is provided to simplify SSA graph algorithms. Clients should
-// use the more specific and informative Value or Instruction
-// interfaces where appropriate.
-//
-type Node interface {
- // Common methods:
- String() string
- Pos() token.Pos
- Parent() *Function
-
- // Partial methods:
- Operands(rands []*Value) []*Value // nil for non-Instructions
- Referrers() *[]Instruction // nil for non-Values
-}
-
-// Function represents the parameters, results, and code of a function
-// or method.
-//
-// If Blocks is nil, this indicates an external function for which no
-// Go source code is available. In this case, FreeVars and Locals
-// are nil too. Clients performing whole-program analysis must
-// handle external functions specially.
-//
-// Blocks contains the function's control-flow graph (CFG).
-// Blocks[0] is the function entry point; block order is not otherwise
-// semantically significant, though it may affect the readability of
-// the disassembly.
-// To iterate over the blocks in dominance order, use DomPreorder().
-//
-// Recover is an optional second entry point to which control resumes
-// after a recovered panic. The Recover block may contain only a return
-// statement, preceded by a load of the function's named return
-// parameters, if any.
-//
-// A nested function (Parent()!=nil) that refers to one or more
-// lexically enclosing local variables ("free variables") has FreeVars.
-// Such functions cannot be called directly but require a
-// value created by MakeClosure which, via its Bindings, supplies
-// values for these parameters.
-//
-// If the function is a method (Signature.Recv() != nil) then the first
-// element of Params is the receiver parameter.
-//
-// A Go package may declare many functions called "init".
-// For each one, Object().Name() returns "init" but Name() returns
-// "init#1", etc, in declaration order.
-//
-// Pos() returns the declaring ast.FuncLit.Type.Func or the position
-// of the ast.FuncDecl.Name, if the function was explicit in the
-// source. Synthetic wrappers, for which Synthetic != "", may share
-// the same position as the function they wrap.
-// Syntax.Pos() always returns the position of the declaring "func" token.
-//
-// Type() returns the function's Signature.
-//
-type Function struct {
- name string
- object types.Object // a declared *types.Func or one of its wrappers
- method *types.Selection // info about provenance of synthetic methods
- Signature *types.Signature
- pos token.Pos
-
- Synthetic string // provenance of synthetic function; "" for true source functions
- syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode
- parent *Function // enclosing function if anon; nil if global
- Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error)
- Prog *Program // enclosing program
- Params []*Parameter // function parameters; for methods, includes receiver
- FreeVars []*FreeVar // free variables whose values must be supplied by closure
- Locals []*Alloc // local variables of this function
- Blocks []*BasicBlock // basic blocks of the function; nil => external
- Recover *BasicBlock // optional; control transfers here after recovered panic
- AnonFuncs []*Function // anonymous functions directly beneath this one
- referrers []Instruction // referring instructions (iff Parent() != nil)
-
- // The following fields are set transiently during building,
- // then cleared.
- currentBlock *BasicBlock // where to emit code
- objects map[types.Object]Value // addresses of local variables
- namedResults []*Alloc // tuple of named results
- targets *targets // linked stack of branch targets
- lblocks map[*ast.Object]*lblock // labelled blocks
-}
-
-// BasicBlock represents an SSA basic block.
-//
-// The final element of Instrs is always an explicit transfer of
-// control (If, Jump, Return, or Panic).
-//
-// A block may contain no Instructions only if it is unreachable,
-// i.e., Preds is nil. Empty blocks are typically pruned.
-//
-// BasicBlocks and their Preds/Succs relation form a (possibly cyclic)
-// graph independent of the SSA Value graph: the control-flow graph or
-// CFG. It is illegal for multiple edges to exist between the same
-// pair of blocks.
-//
-// Each BasicBlock is also a node in the dominator tree of the CFG.
-// The tree may be navigated using Idom()/Dominees() and queried using
-// Dominates().
-//
-// The order of Preds and Succs is significant (to Phi and If
-// instructions, respectively).
-//
-type BasicBlock struct {
- Index int // index of this block within Parent().Blocks
- Comment string // optional label; no semantic significance
- parent *Function // parent function
- Instrs []Instruction // instructions in order
- Preds, Succs []*BasicBlock // predecessors and successors
- succs2 [2]*BasicBlock // initial space for Succs
- dom domInfo // dominator tree info
- gaps int // number of nil Instrs (transient)
- rundefers int // number of rundefers (transient)
-}
-
-// Pure values ----------------------------------------
-
-// A FreeVar represents a free variable of the function to which it
-// belongs.
-//
-// FreeVars are used to implement anonymous functions, whose free
-// variables are lexically captured in a closure formed by
-// MakeClosure. The value of such a free var is an Alloc or another
-// FreeVar and is considered a potentially escaping heap address, with
-// pointer type.
-//
-// FreeVars are also used to implement bound method closures. Such a
-// free var represents the receiver value and may be of any type that
-// has concrete methods.
-//
-// Pos() returns the position of the value that was captured, which
-// belongs to an enclosing function.
-//
-type FreeVar struct {
- name string
- typ types.Type
- pos token.Pos
- parent *Function
- referrers []Instruction
-
- // Transiently needed during building.
- outer Value // the Value captured from the enclosing context.
-}
-
-// A Parameter represents an input parameter of a function.
-//
-type Parameter struct {
- name string
- object types.Object // a *types.Var; nil for non-source locals
- typ types.Type
- pos token.Pos
- parent *Function
- referrers []Instruction
-}
-
-// A Const represents the value of a constant expression.
-//
-// The underlying type of a constant may be any boolean, numeric, or
-// string type. In addition, a Const may represent the nil value of
-// any reference type---interface, map, channel, pointer, slice, or
-// function---but not "untyped nil".
-//
-// All source-level constant expressions are represented by a Const
-// of the same type and value.
-//
-// Value holds the exact value of the constant, independent of its
-// Type(), using the same representation as package go/exact uses for
-// constants, or nil for a typed nil value.
-//
-// Pos() returns token.NoPos.
-//
-// Example printed form:
-// 42:int
-// "hello":untyped string
-// 3+4i:MyComplex
-//
-type Const struct {
- typ types.Type
- Value exact.Value
-}
-
-// A Global is a named Value holding the address of a package-level
-// variable.
-//
-// Pos() returns the position of the ast.ValueSpec.Names[*]
-// identifier.
-//
-type Global struct {
- name string
- object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard
- typ types.Type
- pos token.Pos
-
- Pkg *Package
-}
-
-// A Builtin represents a specific use of a built-in function, e.g. len.
-//
-// Builtins are immutable values. Builtins do not have addresses.
-// Builtins can only appear in CallCommon.Func.
-//
-// Name() indicates the function: one of the built-in functions from the
-// Go spec (excluding "make" and "new") or one of these ssa-defined
-// intrinsics:
-//
-// // wrapnilchk returns ptr if non-nil, panics otherwise.
-// // (For use in indirection wrappers.)
-// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T
-//
-// Object() returns a *types.Builtin for built-ins defined by the spec,
-// nil for others.
-//
-// Type() returns a *types.Signature representing the effective
-// signature of the built-in for this call.
-//
-type Builtin struct {
- name string
- sig *types.Signature
-}
-
-// Value-defining instructions ----------------------------------------
-
-// The Alloc instruction reserves space for a variable of the given type,
-// zero-initializes it, and yields its address.
-//
-// Alloc values are always addresses, and have pointer types, so the
-// type of the allocated variable is actually
-// Type().Underlying().(*types.Pointer).Elem().
-//
-// If Heap is false, Alloc allocates space in the function's
-// activation record (frame); we refer to an Alloc(Heap=false) as a
-// "local" alloc. Each local Alloc returns the same address each time
-// it is executed within the same activation; the space is
-// re-initialized to zero.
-//
-// If Heap is true, Alloc allocates space in the heap; we
-// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc
-// returns a different address each time it is executed.
-//
-// When Alloc is applied to a channel, map or slice type, it returns
-// the address of an uninitialized (nil) reference of that kind; store
-// the result of MakeSlice, MakeMap or MakeChan in that location to
-// instantiate these types.
-//
-// Pos() returns the ast.CompositeLit.Lbrace for a composite literal,
-// or the ast.CallExpr.Rparen for a call to new() or for a call that
-// allocates a varargs slice.
-//
-// Example printed form:
-// t0 = local int
-// t1 = new int
-//
-type Alloc struct {
- register
- Comment string
- Heap bool
- index int // dense numbering; for lifting
-}
-
-// The Phi instruction represents an SSA φ-node, which combines values
-// that differ across incoming control-flow edges and yields a new
-// value. Within a block, all φ-nodes must appear before all non-φ
-// nodes.
-//
-// Pos() returns the position of the && or || for short-circuit
-// control-flow joins, or that of the *Alloc for φ-nodes inserted
-// during SSA renaming.
-//
-// Example printed form:
-// t2 = phi [0: t0, 1: t1]
-//
-type Phi struct {
- register
- Comment string // a hint as to its purpose
- Edges []Value // Edges[i] is value for Block().Preds[i]
-}
-
-// The Call instruction represents a function or method call.
-//
-// The Call instruction yields the function result if there is exactly
-// one. Otherwise it returns a tuple, the components of which are
-// accessed via Extract.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.CallExpr.Lparen, if explicit in the source.
-//
-// Example printed form:
-// t2 = println(t0, t1)
-// t4 = t3()
-// t7 = invoke t5.Println(...t6)
-//
-type Call struct {
- register
- Call CallCommon
-}
-
-// The BinOp instruction yields the result of binary operation X Op Y.
-//
-// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source.
-//
-// Example printed form:
-// t1 = t0 + 1:int
-//
-type BinOp struct {
- register
- // One of:
- // ADD SUB MUL QUO REM + - * / %
- // AND OR XOR SHL SHR AND_NOT & | ^ << >> &~
- // EQL LSS GTR NEQ LEQ GEQ == != < <= < >=
- Op token.Token
- X, Y Value
-}
-
-// The UnOp instruction yields the result of Op X.
-// ARROW is channel receive.
-// MUL is pointer indirection (load).
-// XOR is bitwise complement.
-// SUB is negation.
-// NOT is logical negation.
-//
-// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above
-// and a boolean indicating the success of the receive. The
-// components of the tuple are accessed using Extract.
-//
-// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source.
-// For receive operations (ARROW) implicit in ranging over a channel,
-// Pos() returns the ast.RangeStmt.For.
-// For implicit memory loads (STAR), Pos() returns the position of the
-// most closely associated source-level construct; the details are not
-// specified.
-//
-// Example printed form:
-// t0 = *x
-// t2 = <-t1,ok
-//
-type UnOp struct {
- register
- Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^
- X Value
- CommaOk bool
-}
-
-// The ChangeType instruction applies to X a value-preserving type
-// change to Type().
-//
-// Type changes are permitted:
-// - between a named type and its underlying type.
-// - between two named types of the same underlying type.
-// - between (possibly named) pointers to identical base types.
-// - from a bidirectional channel to a read- or write-channel,
-// optionally adding/removing a name.
-//
-// This operation cannot fail dynamically.
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = changetype *int <- IntPtr (t0)
-//
-type ChangeType struct {
- register
- X Value
-}
-
-// The Convert instruction yields the conversion of value X to type
-// Type(). One or both of those types is basic (but possibly named).
-//
-// A conversion may change the value and representation of its operand.
-// Conversions are permitted:
-// - between real numeric types.
-// - between complex numeric types.
-// - between string and []byte or []rune.
-// - between pointers and unsafe.Pointer.
-// - between unsafe.Pointer and uintptr.
-// - from (Unicode) integer to (UTF-8) string.
-// A conversion may imply a type name change also.
-//
-// This operation cannot fail dynamically.
-//
-// Conversions of untyped string/number/bool constants to a specific
-// representation are eliminated during SSA construction.
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = convert []byte <- string (t0)
-//
-type Convert struct {
- register
- X Value
-}
-
-// ChangeInterface constructs a value of one interface type from a
-// value of another interface type known to be assignable to it.
-// This operation cannot fail.
-//
-// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
-// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
-// instruction arose from an explicit e.(T) operation; or token.NoPos
-// otherwise.
-//
-// Example printed form:
-// t1 = change interface interface{} <- I (t0)
-//
-type ChangeInterface struct {
- register
- X Value
-}
-
-// MakeInterface constructs an instance of an interface type from a
-// value of a concrete type.
-//
-// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set
-// of X, and Program.Method(m) to find the implementation of a method.
-//
-// To construct the zero value of an interface type T, use:
-// NewConst(exact.MakeNil(), T, pos)
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = make interface{} <- int (42:int)
-// t2 = make Stringer <- t0
-//
-type MakeInterface struct {
- register
- X Value
-}
-
-// The MakeClosure instruction yields a closure value whose code is
-// Fn and whose free variables' values are supplied by Bindings.
-//
-// Type() returns a (possibly named) *types.Signature.
-//
-// Pos() returns the ast.FuncLit.Type.Func for a function literal
-// closure or the ast.SelectorExpr.Sel for a bound method closure.
-//
-// Example printed form:
-// t0 = make closure anon@1.2 [x y z]
-// t1 = make closure bound$(main.I).add [i]
-//
-type MakeClosure struct {
- register
- Fn Value // always a *Function
- Bindings []Value // values for each free variable in Fn.FreeVars
-}
-
-// The MakeMap instruction creates a new hash-table-based map object
-// and yields a value of kind map.
-//
-// Type() returns a (possibly named) *types.Map.
-//
-// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or
-// the ast.CompositeLit.Lbrack if created by a literal.
-//
-// Example printed form:
-// t1 = make map[string]int t0
-// t1 = make StringIntMap t0
-//
-type MakeMap struct {
- register
- Reserve Value // initial space reservation; nil => default
-}
-
-// The MakeChan instruction creates a new channel object and yields a
-// value of kind chan.
-//
-// Type() returns a (possibly named) *types.Chan.
-//
-// Pos() returns the ast.CallExpr.Lparen for the make(chan) that
-// created it.
-//
-// Example printed form:
-// t0 = make chan int 0
-// t0 = make IntChan 0
-//
-type MakeChan struct {
- register
- Size Value // int; size of buffer; zero => synchronous.
-}
-
-// The MakeSlice instruction yields a slice of length Len backed by a
-// newly allocated array of length Cap.
-//
-// Both Len and Cap must be non-nil Values of integer type.
-//
-// (Alloc(types.Array) followed by Slice will not suffice because
-// Alloc can only create arrays of constant length.)
-//
-// Type() returns a (possibly named) *types.Slice.
-//
-// Pos() returns the ast.CallExpr.Lparen for the make([]T) that
-// created it.
-//
-// Example printed form:
-// t1 = make []string 1:int t0
-// t1 = make StringSlice 1:int t0
-//
-type MakeSlice struct {
- register
- Len Value
- Cap Value
-}
-
-// The Slice instruction yields a slice of an existing string, slice
-// or *array X between optional integer bounds Low and High.
-//
-// Dynamically, this instruction panics if X evaluates to a nil *array
-// pointer.
-//
-// Type() returns string if the type of X was string, otherwise a
-// *types.Slice with the same element type as X.
-//
-// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice
-// operation, the ast.CompositeLit.Lbrace if created by a literal, or
-// NoPos if not explicit in the source (e.g. a variadic argument slice).
-//
-// Example printed form:
-// t1 = slice t0[1:]
-//
-type Slice struct {
- register
- X Value // slice, string, or *array
- Low, High, Max Value // each may be nil
-}
-
-// The FieldAddr instruction yields the address of Field of *struct X.
-//
-// The field is identified by its index within the field list of the
-// struct type of X.
-//
-// Dynamically, this instruction panics if X evaluates to a nil
-// pointer.
-//
-// Type() returns a (possibly named) *types.Pointer.
-//
-// Pos() returns the position of the ast.SelectorExpr.Sel for the
-// field, if explicit in the source.
-//
-// Example printed form:
-// t1 = &t0.name [#1]
-//
-type FieldAddr struct {
- register
- X Value // *struct
- Field int // index into X.Type().Deref().(*types.Struct).Fields
-}
-
-// The Field instruction yields the Field of struct X.
-//
-// The field is identified by its index within the field list of the
-// struct type of X; by using numeric indices we avoid ambiguity of
-// package-local identifiers and permit compact representations.
-//
-// Pos() returns the position of the ast.SelectorExpr.Sel for the
-// field, if explicit in the source.
-//
-// Example printed form:
-// t1 = t0.name [#1]
-//
-type Field struct {
- register
- X Value // struct
- Field int // index into X.Type().(*types.Struct).Fields
-}
-
-// The IndexAddr instruction yields the address of the element at
-// index Index of collection X. Index is an integer expression.
-//
-// The elements of maps and strings are not addressable; use Lookup or
-// MapUpdate instead.
-//
-// Dynamically, this instruction panics if X evaluates to a nil *array
-// pointer.
-//
-// Type() returns a (possibly named) *types.Pointer.
-//
-// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
-// explicit in the source.
-//
-// Example printed form:
-// t2 = &t0[t1]
-//
-type IndexAddr struct {
- register
- X Value // slice or *array,
- Index Value // numeric index
-}
-
-// The Index instruction yields element Index of array X.
-//
-// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
-// explicit in the source.
-//
-// Example printed form:
-// t2 = t0[t1]
-//
-type Index struct {
- register
- X Value // array
- Index Value // integer index
-}
-
-// The Lookup instruction yields element Index of collection X, a map
-// or string. Index is an integer expression if X is a string or the
-// appropriate key type if X is a map.
-//
-// If CommaOk, the result is a 2-tuple of the value above and a
-// boolean indicating the result of a map membership test for the key.
-// The components of the tuple are accessed using Extract.
-//
-// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source.
-//
-// Example printed form:
-// t2 = t0[t1]
-// t5 = t3[t4],ok
-//
-type Lookup struct {
- register
- X Value // string or map
- Index Value // numeric or key-typed index
- CommaOk bool // return a value,ok pair
-}
-
-// SelectState is a helper for Select.
-// It represents one goal state and its corresponding communication.
-//
-type SelectState struct {
- Dir types.ChanDir // direction of case (SendOnly or RecvOnly)
- Chan Value // channel to use (for send or receive)
- Send Value // value to send (for send)
- Pos token.Pos // position of token.ARROW
- DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode]
-}
-
-// The Select instruction tests whether (or blocks until) one
-// of the specified sent or received states is entered.
-//
-// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator.
-}
-
-// The TypeAssert instruction tests whether interface value X has type
-// AssertedType.
-//
-// If !CommaOk, on success it returns v, the result of the conversion
-// (defined below); on failure it panics.
-//
-// If CommaOk: on success it returns a pair (v, true) where v is the
-// result of the conversion; on failure it returns (z, false) where z
-// is AssertedType's zero value. The components of the pair must be
-// accessed using the Extract instruction.
-//
-// If AssertedType is a concrete type, TypeAssert checks whether the
-// dynamic type in interface X is equal to it, and if so, the result
-// of the conversion is a copy of the value in the interface.
-//
-// If AssertedType is an interface, TypeAssert checks whether the
-// dynamic type of the interface is assignable to it, and if so, the
-// result of the conversion is a copy of the interface value X.
-// If AssertedType is a superinterface of X.Type(), the operation will
-// fail iff the operand is nil. (Contrast with ChangeInterface, which
-// performs no nil-check.)
-//
-// Type() reflects the actual type of the result, possibly a
-// 2-types.Tuple; AssertedType is the asserted type.
-//
-// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
-// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
-// instruction arose from an explicit e.(T) operation; or the
-// ast.CaseClause.Case if the instruction arose from a case of a
-// type-switch statement.
-//
-// Example printed form:
-// t1 = typeassert t0.(int)
-// t3 = typeassert,ok t2.(T)
-//
-type TypeAssert struct {
- register
- X Value
- AssertedType types.Type
- CommaOk bool
-}
-
-// The Extract instruction yields component Index of Tuple.
-//
-// This is used to access the results of instructions with multiple
-// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and
-// IndexExpr(Map).
-//
-// Example printed form:
-// t1 = extract t0 #1
-//
-type Extract struct {
- register
- Tuple Value
- Index int
-}
-
-// Instructions executed for effect. They do not yield a value. --------------------
-
-// The Jump instruction transfers control to the sole successor of its
-// owning block.
-//
-// A Jump must be the last instruction of its containing BasicBlock.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// jump done
-//
-type Jump struct {
- anInstruction
-}
-
-// The If instruction transfers control to one of the two successors
-// of its owning block, depending on the boolean Cond: the first if
-// true, the second if false.
-//
-// An If instruction must be the last instruction of its containing
-// BasicBlock.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// if t0 goto done else body
-//
-type If struct {
- anInstruction
- Cond Value
-}
-
-// The Return instruction returns values and control back to the calling
-// function.
-//
-// len(Results) is always equal to the number of results in the
-// function's signature.
-//
-// If len(Results) > 1, Return returns a tuple value with the specified
-// components which the caller must access using Extract instructions.
-//
-// There is no instruction to return a ready-made tuple like those
-// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or
-// a tail-call to a function with multiple result parameters.
-//
-// Return must be the last instruction of its containing BasicBlock.
-// Such a block has no successors.
-//
-// Pos() returns the ast.ReturnStmt.Return, if explicit in the source.
-//
-// Example printed form:
-// return
-// return nil:I, 2:int
-//
-type Return struct {
- anInstruction
- Results []Value
- pos token.Pos
-}
-
-// The RunDefers instruction pops and invokes the entire stack of
-// procedure calls pushed by Defer instructions in this function.
-//
-// It is legal to encounter multiple 'rundefers' instructions in a
-// single control-flow path through a function; this is useful in
-// the combined init() function, for example.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// rundefers
-//
-type RunDefers struct {
- anInstruction
-}
-
-// The Panic instruction initiates a panic with value X.
-//
-// A Panic instruction must be the last instruction of its containing
-// BasicBlock, which must have no successors.
-//
-// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction;
-// they are treated as calls to a built-in function.
-//
-// Pos() returns the ast.CallExpr.Lparen if this panic was explicit
-// in the source.
-//
-// Example printed form:
-// panic t0
-//
-type Panic struct {
- anInstruction
- X Value // an interface{}
- pos token.Pos
-}
-
-// The Go instruction creates a new goroutine and calls the specified
-// function within it.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.GoStmt.Go.
-//
-// Example printed form:
-// go println(t0, t1)
-// go t3()
-// go invoke t5.Println(...t6)
-//
-type Go struct {
- anInstruction
- Call CallCommon
- pos token.Pos
-}
-
-// The Defer instruction pushes the specified call onto a stack of
-// functions to be called by a RunDefers instruction or by a panic.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.DeferStmt.Defer.
-//
-// Example printed form:
-// defer println(t0, t1)
-// defer t3()
-// defer invoke t5.Println(...t6)
-//
-type Defer struct {
- anInstruction
- Call CallCommon
- pos token.Pos
-}
-
-// The Send instruction sends X on channel Chan.
-//
-// Pos() returns the ast.SendStmt.Arrow, if explicit in the source.
-//
-// Example printed form:
-// send t0 <- t1
-//
-type Send struct {
- anInstruction
- Chan, X Value
- pos token.Pos
-}
-
-// The Store instruction stores Val at address Addr.
-// Stores can be of arbitrary types.
-//
-// Pos() returns the position of the source-level construct most closely
-// associated with the memory store operation.
-// Since implicit memory stores are numerous and varied and depend upon
-// implementation choices, the details are not specified.
-//
-// Example printed form:
-// *x = y
-//
-type Store struct {
- anInstruction
- Addr Value
- Val Value
- pos token.Pos
-}
-
-// The MapUpdate instruction updates the association of Map[Key] to
-// Value.
-//
-// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack,
-// if explicit in the source.
-//
-// Example printed form:
-// t0[t1] = t2
-//
-type MapUpdate struct {
- anInstruction
- Map Value
- Key Value
- Value Value
- pos token.Pos
-}
-
-// A DebugRef instruction maps a source-level expression Expr to the
-// SSA value X that represents the value (!IsAddr) or address (IsAddr)
-// of that expression.
-//
-// DebugRef is a pseudo-instruction: it has no dynamic effect.
-//
-// Pos() returns Expr.Pos(), the start position of the source-level
-// expression. This is not the same as the "designated" token as
-// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the
-// position of the ("designated") Lparen token.
-//
-// If Expr is an *ast.Ident denoting a var or func, Object() returns
-// the object; though this information can be obtained from the type
-// checker, including it here greatly facilitates debugging.
-// For non-Ident expressions, Object() returns nil.
-//
-// DebugRefs are generated only for functions built with debugging
-// enabled; see Package.SetDebugMode() and the GlobalDebug builder
-// mode flag.
-//
-// DebugRefs are not emitted for ast.Idents referring to constants or
-// predeclared identifiers, since they are trivial and numerous.
-// Nor are they emitted for ast.ParenExprs.
-//
-// (By representing these as instructions, rather than out-of-band,
-// consistency is maintained during transformation passes by the
-// ordinary SSA renaming machinery.)
-//
-// Example printed form:
-// ; *ast.CallExpr @ 102:9 is t5
-// ; var x float64 @ 109:72 is x
-// ; address of *ast.CompositeLit @ 216:10 is t0
-//
-type DebugRef struct {
- anInstruction
- Expr ast.Expr // the referring expression (never *ast.ParenExpr)
- object types.Object // the identity of the source var/func
- IsAddr bool // Expr is addressable and X is the address it denotes
- X Value // the value or address of Expr
-}
-
-// Embeddable mix-ins and helpers for common parts of other structs. -----------
-
-// register is a mix-in embedded by all SSA values that are also
-// instructions, i.e. virtual registers, and provides a uniform
-// implementation of most of the Value interface: Value.Name() is a
-// numbered register (e.g. "t0"); the other methods are field accessors.
-//
-// Temporary names are automatically assigned to each register on
-// completion of building a function in SSA form.
-//
-// Clients must not assume that the 'id' value (and the Name() derived
-// from it) is unique within a function. As always in this API,
-// semantics are determined only by identity; names exist only to
-// facilitate debugging.
-//
-type register struct {
- anInstruction
- num int // "name" of virtual register, e.g. "t0". Not guaranteed unique.
- typ types.Type // type of virtual register
- pos token.Pos // position of source expression, or NoPos
- referrers []Instruction
-}
-
-// anInstruction is a mix-in embedded by all Instructions.
-// It provides the implementations of the Block and setBlock methods.
-type anInstruction struct {
- block *BasicBlock // the basic block of this instruction
-}
-
-// CallCommon is contained by Go, Defer and Call to hold the
-// common parts of a function or method call.
-//
-// Each CallCommon exists in one of two modes, function call and
-// interface method invocation, or "call" and "invoke" for short.
-//
-// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon
-// represents an ordinary function call of the value in Value,
-// which may be a *Builtin, a *Function or any other value of kind
-// 'func'.
-//
-// Value may be one of:
-// (a) a *Function, indicating a statically dispatched call
-// to a package-level function, an anonymous function, or
-// a method of a named type.
-// (b) a *MakeClosure, indicating an immediately applied
-// function literal with free variables.
-// (c) a *Builtin, indicating a statically dispatched call
-// to a built-in function.
-// (d) any other value, indicating a dynamically dispatched
-// function call.
-// StaticCallee returns the identity of the callee in cases
-// (a) and (b), nil otherwise.
-//
-// Args contains the arguments to the call. If Value is a method,
-// Args[0] contains the receiver parameter.
-//
-// Example printed form:
-// t2 = println(t0, t1)
-// go t3()
-// defer t5(...t6)
-//
-// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon
-// represents a dynamically dispatched call to an interface method.
-// In this mode, Value is the interface value and Method is the
-// interface's abstract method. Note: an abstract method may be
-// shared by multiple interfaces due to embedding; Value.Type()
-// provides the specific interface used for this call.
-//
-// Value is implicitly supplied to the concrete method implementation
-// as the receiver parameter; in other words, Args[0] holds not the
-// receiver but the first true argument.
-//
-// Example printed form:
-// t1 = invoke t0.String()
-// go invoke t3.Run(t2)
-// defer invoke t4.Handle(...t5)
-//
-// For all calls to variadic functions (Signature().Variadic()),
-// the last element of Args is a slice.
-//
-type CallCommon struct {
- Value Value // receiver (invoke mode) or func value (call mode)
- Method *types.Func // abstract method (invoke mode)
- Args []Value // actual parameters (in static method call, includes receiver)
- pos token.Pos // position of CallExpr.Lparen, iff explicit in source
-}
-
-// IsInvoke returns true if this call has "invoke" (not "call") mode.
-func (c *CallCommon) IsInvoke() bool {
- return c.Method != nil
-}
-
-func (c *CallCommon) Pos() token.Pos { return c.pos }
-
-// Signature returns the signature of the called function.
-//
-// For an "invoke"-mode call, the signature of the interface method is
-// returned.
-//
-// In either "call" or "invoke" mode, if the callee is a method, its
-// receiver is represented by sig.Recv, not sig.Params().At(0).
-//
-func (c *CallCommon) Signature() *types.Signature {
- if c.Method != nil {
- return c.Method.Type().(*types.Signature)
- }
- return c.Value.Type().Underlying().(*types.Signature)
-}
-
-// StaticCallee returns the callee if this is a trivially static
-// "call"-mode call to a function.
-func (c *CallCommon) StaticCallee() *Function {
- switch fn := c.Value.(type) {
- case *Function:
- return fn
- case *MakeClosure:
- return fn.Fn.(*Function)
- }
- return nil
-}
-
-// Description returns a description of the mode of this call suitable
-// for a user interface, e.g., "static method call".
-func (c *CallCommon) Description() string {
- switch fn := c.Value.(type) {
- case *Builtin:
- return "built-in function call"
- case *MakeClosure:
- return "static function closure call"
- case *Function:
- if fn.Signature.Recv() != nil {
- return "static method call"
- }
- return "static function call"
- }
- if c.IsInvoke() {
- return "dynamic method call" // ("invoke" mode)
- }
- return "dynamic function call"
-}
-
-// The CallInstruction interface, implemented by *Go, *Defer and *Call,
-// exposes the common parts of function-calling instructions,
-// yet provides a way back to the Value defined by *Call alone.
-//
-type CallInstruction interface {
- Instruction
- Common() *CallCommon // returns the common parts of the call
- Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer)
-}
-
-func (s *Call) Common() *CallCommon { return &s.Call }
-func (s *Defer) Common() *CallCommon { return &s.Call }
-func (s *Go) Common() *CallCommon { return &s.Call }
-
-func (s *Call) Value() *Call { return s }
-func (s *Defer) Value() *Call { return nil }
-func (s *Go) Value() *Call { return nil }
-
-func (v *Builtin) Type() types.Type { return v.sig }
-func (v *Builtin) Name() string { return v.name }
-func (*Builtin) Referrers() *[]Instruction { return nil }
-func (v *Builtin) Pos() token.Pos { return token.NoPos }
-func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) }
-func (v *Builtin) Parent() *Function { return nil }
-
-func (v *FreeVar) Type() types.Type { return v.typ }
-func (v *FreeVar) Name() string { return v.name }
-func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers }
-func (v *FreeVar) Pos() token.Pos { return v.pos }
-func (v *FreeVar) Parent() *Function { return v.parent }
-
-func (v *Global) Type() types.Type { return v.typ }
-func (v *Global) Name() string { return v.name }
-func (v *Global) Parent() *Function { return nil }
-func (v *Global) Pos() token.Pos { return v.pos }
-func (v *Global) Referrers() *[]Instruction { return nil }
-func (v *Global) Token() token.Token { return token.VAR }
-func (v *Global) Object() types.Object { return v.object }
-func (v *Global) String() string { return v.RelString(nil) }
-func (v *Global) Package() *Package { return v.Pkg }
-func (v *Global) RelString(from *types.Package) string { return relString(v, from) }
-
-func (v *Function) Name() string { return v.name }
-func (v *Function) Type() types.Type { return v.Signature }
-func (v *Function) Pos() token.Pos { return v.pos }
-func (v *Function) Token() token.Token { return token.FUNC }
-func (v *Function) Object() types.Object { return v.object }
-func (v *Function) String() string { return v.RelString(nil) }
-func (v *Function) Package() *Package { return v.Pkg }
-func (v *Function) Parent() *Function { return v.parent }
-func (v *Function) Referrers() *[]Instruction {
- if v.parent != nil {
- return &v.referrers
- }
- return nil
-}
-
-func (v *Parameter) Type() types.Type { return v.typ }
-func (v *Parameter) Name() string { return v.name }
-func (v *Parameter) Object() types.Object { return v.object }
-func (v *Parameter) Referrers() *[]Instruction { return &v.referrers }
-func (v *Parameter) Pos() token.Pos { return v.pos }
-func (v *Parameter) Parent() *Function { return v.parent }
-
-func (v *Alloc) Type() types.Type { return v.typ }
-func (v *Alloc) Referrers() *[]Instruction { return &v.referrers }
-func (v *Alloc) Pos() token.Pos { return v.pos }
-
-func (v *register) Type() types.Type { return v.typ }
-func (v *register) setType(typ types.Type) { v.typ = typ }
-func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) }
-func (v *register) setNum(num int) { v.num = num }
-func (v *register) Referrers() *[]Instruction { return &v.referrers }
-func (v *register) Pos() token.Pos { return v.pos }
-func (v *register) setPos(pos token.Pos) { v.pos = pos }
-
-func (v *anInstruction) Parent() *Function { return v.block.parent }
-func (v *anInstruction) Block() *BasicBlock { return v.block }
-func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block }
-func (v *anInstruction) Referrers() *[]Instruction { return nil }
-
-func (t *Type) Name() string { return t.object.Name() }
-func (t *Type) Pos() token.Pos { return t.object.Pos() }
-func (t *Type) Type() types.Type { return t.object.Type() }
-func (t *Type) Token() token.Token { return token.TYPE }
-func (t *Type) Object() types.Object { return t.object }
-func (t *Type) String() string { return t.RelString(nil) }
-func (t *Type) Package() *Package { return t.pkg }
-func (t *Type) RelString(from *types.Package) string { return relString(t, from) }
-
-func (c *NamedConst) Name() string { return c.object.Name() }
-func (c *NamedConst) Pos() token.Pos { return c.object.Pos() }
-func (c *NamedConst) String() string { return c.RelString(nil) }
-func (c *NamedConst) Type() types.Type { return c.object.Type() }
-func (c *NamedConst) Token() token.Token { return token.CONST }
-func (c *NamedConst) Object() types.Object { return c.object }
-func (c *NamedConst) Package() *Package { return c.pkg }
-func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) }
-
-// Func returns the package-level function of the specified name,
-// or nil if not found.
-//
-func (p *Package) Func(name string) (f *Function) {
- f, _ = p.Members[name].(*Function)
- return
-}
-
-// Var returns the package-level variable of the specified name,
-// or nil if not found.
-//
-func (p *Package) Var(name string) (g *Global) {
- g, _ = p.Members[name].(*Global)
- return
-}
-
-// Const returns the package-level constant of the specified name,
-// or nil if not found.
-//
-func (p *Package) Const(name string) (c *NamedConst) {
- c, _ = p.Members[name].(*NamedConst)
- return
-}
-
-// Type returns the package-level type of the specified name,
-// or nil if not found.
-//
-func (p *Package) Type(name string) (t *Type) {
- t, _ = p.Members[name].(*Type)
- return
-}
-
-func (v *Call) Pos() token.Pos { return v.Call.pos }
-func (s *Defer) Pos() token.Pos { return s.pos }
-func (s *Go) Pos() token.Pos { return s.pos }
-func (s *MapUpdate) Pos() token.Pos { return s.pos }
-func (s *Panic) Pos() token.Pos { return s.pos }
-func (s *Return) Pos() token.Pos { return s.pos }
-func (s *Send) Pos() token.Pos { return s.pos }
-func (s *Store) Pos() token.Pos { return s.pos }
-func (s *If) Pos() token.Pos { return token.NoPos }
-func (s *Jump) Pos() token.Pos { return token.NoPos }
-func (s *RunDefers) Pos() token.Pos { return token.NoPos }
-func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() }
-
-// Operands.
-
-func (v *Alloc) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *BinOp) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Y)
-}
-
-func (c *CallCommon) Operands(rands []*Value) []*Value {
- rands = append(rands, &c.Value)
- for i := range c.Args {
- rands = append(rands, &c.Args[i])
- }
- return rands
-}
-
-func (s *Go) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (s *Call) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (s *Defer) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (v *ChangeInterface) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *ChangeType) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *Convert) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *DebugRef) Operands(rands []*Value) []*Value {
- return append(rands, &s.X)
-}
-
-func (v *Extract) Operands(rands []*Value) []*Value {
- return append(rands, &v.Tuple)
-}
-
-func (v *Field) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *FieldAddr) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *If) Operands(rands []*Value) []*Value {
- return append(rands, &s.Cond)
-}
-
-func (v *Index) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (v *IndexAddr) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (*Jump) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *Lookup) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (v *MakeChan) Operands(rands []*Value) []*Value {
- return append(rands, &v.Size)
-}
-
-func (v *MakeClosure) Operands(rands []*Value) []*Value {
- rands = append(rands, &v.Fn)
- for i := range v.Bindings {
- rands = append(rands, &v.Bindings[i])
- }
- return rands
-}
-
-func (v *MakeInterface) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *MakeMap) Operands(rands []*Value) []*Value {
- return append(rands, &v.Reserve)
-}
-
-func (v *MakeSlice) Operands(rands []*Value) []*Value {
- return append(rands, &v.Len, &v.Cap)
-}
-
-func (v *MapUpdate) Operands(rands []*Value) []*Value {
- return append(rands, &v.Map, &v.Key, &v.Value)
-}
-
-func (v *Next) Operands(rands []*Value) []*Value {
- return append(rands, &v.Iter)
-}
-
-func (s *Panic) Operands(rands []*Value) []*Value {
- return append(rands, &s.X)
-}
-
-func (v *Phi) Operands(rands []*Value) []*Value {
- for i := range v.Edges {
- rands = append(rands, &v.Edges[i])
- }
- return rands
-}
-
-func (v *Range) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *Return) Operands(rands []*Value) []*Value {
- for i := range s.Results {
- rands = append(rands, &s.Results[i])
- }
- return rands
-}
-
-func (*RunDefers) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *Select) Operands(rands []*Value) []*Value {
- for i := range v.States {
- rands = append(rands, &v.States[i].Chan, &v.States[i].Send)
- }
- return rands
-}
-
-func (s *Send) Operands(rands []*Value) []*Value {
- return append(rands, &s.Chan, &s.X)
-}
-
-func (v *Slice) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Low, &v.High, &v.Max)
-}
-
-func (s *Store) Operands(rands []*Value) []*Value {
- return append(rands, &s.Addr, &s.Val)
-}
-
-func (v *TypeAssert) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *UnOp) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-// Non-Instruction Values:
-func (v *Builtin) Operands(rands []*Value) []*Value { return rands }
-func (v *FreeVar) Operands(rands []*Value) []*Value { return rands }
-func (v *Const) Operands(rands []*Value) []*Value { return rands }
-func (v *Function) Operands(rands []*Value) []*Value { return rands }
-func (v *Global) Operands(rands []*Value) []*Value { return rands }
-func (v *Parameter) Operands(rands []*Value) []*Value { return rands }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/load.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/load.go
deleted file mode 100644
index 30b8053c7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/load.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil
-
-// This file defines utility functions for constructing programs in SSA form.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
-)
-
-// CreateProgram returns a new program in SSA form, given a program
-// loaded from source. An SSA package is created for each transitively
-// error-free package of lprog.
-//
-// Code for bodies of functions is not built until Build is called
-// on the result.
-//
-// mode controls diagnostics and checking during SSA construction.
-//
-func CreateProgram(lprog *loader.Program, mode ssa.BuilderMode) *ssa.Program {
- prog := ssa.NewProgram(lprog.Fset, mode)
-
- for _, info := range lprog.AllPackages {
- if info.TransitivelyErrorFree {
- prog.CreatePackage(info.Pkg, info.Files, &info.Info, info.Importable)
- }
- }
-
- return prog
-}
-
-// BuildPackage builds an SSA program with IR for a single package.
-//
-// It populates pkg by type-checking the specified file ASTs. All
-// dependencies are loaded using the importer specified by tc, which
-// typically loads compiler export data; SSA code cannot be built for
-// those packages. BuildPackage then constructs an ssa.Program with all
-// dependency packages created, and builds and returns the SSA package
-// corresponding to pkg.
-//
-// The caller must have set pkg.Path() to the import path.
-//
-// The operation fails if there were any type-checking or import errors.
-//
-// See ../ssa/example_test.go for an example.
-//
-func BuildPackage(tc *types.Config, fset *token.FileSet, pkg *types.Package, files []*ast.File, mode ssa.BuilderMode) (*ssa.Package, *types.Info, error) {
- if fset == nil {
- panic("no token.FileSet")
- }
- if pkg.Path() == "" {
- panic("package has no import path")
- }
-
- info := &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- }
- if err := types.NewChecker(tc, fset, pkg, info).Files(files); err != nil {
- return nil, nil, err
- }
-
- prog := ssa.NewProgram(fset, mode)
-
- // Create SSA packages for all imports.
- // Order is not significant.
- created := make(map[*types.Package]bool)
- var createAll func(pkgs []*types.Package)
- createAll = func(pkgs []*types.Package) {
- for _, p := range pkgs {
- if !created[p] {
- created[p] = true
- prog.CreatePackage(p, nil, nil, true)
- createAll(p.Imports())
- }
- }
- }
- createAll(pkg.Imports())
-
- // Create and build the primary package.
- ssapkg := prog.CreatePackage(pkg, files, info, false)
- ssapkg.Build()
- return ssapkg, info, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/switch.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/switch.go
deleted file mode 100644
index db03bf555..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/switch.go
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil
-
-// This file implements discovery of switch and type-switch constructs
-// from low-level control flow.
-//
-// Many techniques exist for compiling a high-level switch with
-// constant cases to efficient machine code. The optimal choice will
-// depend on the data type, the specific case values, the code in the
-// body of each case, and the hardware.
-// Some examples:
-// - a lookup table (for a switch that maps constants to constants)
-// - a computed goto
-// - a binary tree
-// - a perfect hash
-// - a two-level switch (to partition constant strings by their first byte).
-
-import (
- "bytes"
- "fmt"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/go/ssa"
-)
-
-// A ConstCase represents a single constant comparison.
-// It is part of a Switch.
-type ConstCase struct {
- Block *ssa.BasicBlock // block performing the comparison
- Body *ssa.BasicBlock // body of the case
- Value *ssa.Const // case comparand
-}
-
-// A TypeCase represents a single type assertion.
-// It is part of a Switch.
-type TypeCase struct {
- Block *ssa.BasicBlock // block performing the type assert
- Body *ssa.BasicBlock // body of the case
- Type types.Type // case type
- Binding ssa.Value // value bound by this case
-}
-
-// A Switch is a logical high-level control flow operation
-// (a multiway branch) discovered by analysis of a CFG containing
-// only if/else chains. It is not part of the ssa.Instruction set.
-//
-// One of ConstCases and TypeCases has length >= 2;
-// the other is nil.
-//
-// In a value switch, the list of cases may contain duplicate constants.
-// A type switch may contain duplicate types, or types assignable
-// to an interface type also in the list.
-// TODO(adonovan): eliminate such duplicates.
-//
-type Switch struct {
- Start *ssa.BasicBlock // block containing start of if/else chain
- X ssa.Value // the switch operand
- ConstCases []ConstCase // ordered list of constant comparisons
- TypeCases []TypeCase // ordered list of type assertions
- Default *ssa.BasicBlock // successor if all comparisons fail
-}
-
-func (sw *Switch) String() string {
- // We represent each block by the String() of its
- // first Instruction, e.g. "print(42:int)".
- var buf bytes.Buffer
- if sw.ConstCases != nil {
- fmt.Fprintf(&buf, "switch %s {\n", sw.X.Name())
- for _, c := range sw.ConstCases {
- fmt.Fprintf(&buf, "case %s: %s\n", c.Value, c.Body.Instrs[0])
- }
- } else {
- fmt.Fprintf(&buf, "switch %s.(type) {\n", sw.X.Name())
- for _, c := range sw.TypeCases {
- fmt.Fprintf(&buf, "case %s %s: %s\n",
- c.Binding.Name(), c.Type, c.Body.Instrs[0])
- }
- }
- if sw.Default != nil {
- fmt.Fprintf(&buf, "default: %s\n", sw.Default.Instrs[0])
- }
- fmt.Fprintf(&buf, "}")
- return buf.String()
-}
-
-// Switches examines the control-flow graph of fn and returns the
-// set of inferred value and type switches. A value switch tests an
-// ssa.Value for equality against two or more compile-time constant
-// values. Switches involving link-time constants (addresses) are
-// ignored. A type switch type-asserts an ssa.Value against two or
-// more types.
-//
-// The switches are returned in dominance order.
-//
-// The resulting switches do not necessarily correspond to uses of the
-// 'switch' keyword in the source: for example, a single source-level
-// switch statement with non-constant cases may result in zero, one or
-// many Switches, one per plural sequence of constant cases.
-// Switches may even be inferred from if/else- or goto-based control flow.
-// (In general, the control flow constructs of the source program
-// cannot be faithfully reproduced from the SSA representation.)
-//
-func Switches(fn *ssa.Function) []Switch {
- // Traverse the CFG in dominance order, so we don't
- // enter an if/else-chain in the middle.
- var switches []Switch
- seen := make(map[*ssa.BasicBlock]bool) // TODO(adonovan): opt: use ssa.blockSet
- for _, b := range fn.DomPreorder() {
- if x, k := isComparisonBlock(b); x != nil {
- // Block b starts a switch.
- sw := Switch{Start: b, X: x}
- valueSwitch(&sw, k, seen)
- if len(sw.ConstCases) > 1 {
- switches = append(switches, sw)
- }
- }
-
- if y, x, T := isTypeAssertBlock(b); y != nil {
- // Block b starts a type switch.
- sw := Switch{Start: b, X: x}
- typeSwitch(&sw, y, T, seen)
- if len(sw.TypeCases) > 1 {
- switches = append(switches, sw)
- }
- }
- }
- return switches
-}
-
-func valueSwitch(sw *Switch, k *ssa.Const, seen map[*ssa.BasicBlock]bool) {
- b := sw.Start
- x := sw.X
- for x == sw.X {
- if seen[b] {
- break
- }
- seen[b] = true
-
- sw.ConstCases = append(sw.ConstCases, ConstCase{
- Block: b,
- Body: b.Succs[0],
- Value: k,
- })
- b = b.Succs[1]
- if len(b.Instrs) > 2 {
- // Block b contains not just 'if x == k',
- // so it may have side effects that
- // make it unsafe to elide.
- break
- }
- if len(b.Preds) != 1 {
- // Block b has multiple predecessors,
- // so it cannot be treated as a case.
- break
- }
- x, k = isComparisonBlock(b)
- }
- sw.Default = b
-}
-
-func typeSwitch(sw *Switch, y ssa.Value, T types.Type, seen map[*ssa.BasicBlock]bool) {
- b := sw.Start
- x := sw.X
- for x == sw.X {
- if seen[b] {
- break
- }
- seen[b] = true
-
- sw.TypeCases = append(sw.TypeCases, TypeCase{
- Block: b,
- Body: b.Succs[0],
- Type: T,
- Binding: y,
- })
- b = b.Succs[1]
- if len(b.Instrs) > 4 {
- // Block b contains not just
- // {TypeAssert; Extract #0; Extract #1; If}
- // so it may have side effects that
- // make it unsafe to elide.
- break
- }
- if len(b.Preds) != 1 {
- // Block b has multiple predecessors,
- // so it cannot be treated as a case.
- break
- }
- y, x, T = isTypeAssertBlock(b)
- }
- sw.Default = b
-}
-
-// isComparisonBlock returns the operands (v, k) if a block ends with
-// a comparison v==k, where k is a compile-time constant.
-//
-func isComparisonBlock(b *ssa.BasicBlock) (v ssa.Value, k *ssa.Const) {
- if n := len(b.Instrs); n >= 2 {
- if i, ok := b.Instrs[n-1].(*ssa.If); ok {
- if binop, ok := i.Cond.(*ssa.BinOp); ok && binop.Block() == b && binop.Op == token.EQL {
- if k, ok := binop.Y.(*ssa.Const); ok {
- return binop.X, k
- }
- if k, ok := binop.X.(*ssa.Const); ok {
- return binop.Y, k
- }
- }
- }
- }
- return
-}
-
-// isTypeAssertBlock returns the operands (y, x, T) if a block ends with
-// a type assertion "if y, ok := x.(T); ok {".
-//
-func isTypeAssertBlock(b *ssa.BasicBlock) (y, x ssa.Value, T types.Type) {
- if n := len(b.Instrs); n >= 4 {
- if i, ok := b.Instrs[n-1].(*ssa.If); ok {
- if ext1, ok := i.Cond.(*ssa.Extract); ok && ext1.Block() == b && ext1.Index == 1 {
- if ta, ok := ext1.Tuple.(*ssa.TypeAssert); ok && ta.Block() == b {
- // hack: relies upon instruction ordering.
- if ext0, ok := b.Instrs[n-3].(*ssa.Extract); ok {
- return ext0, ta.X, ta.AssertedType
- }
- }
- }
- }
- }
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/visit.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/visit.go
deleted file mode 100644
index 3424e8a30..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/ssautil/visit.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil // import "golang.org/x/tools/go/ssa/ssautil"
-
-import "golang.org/x/tools/go/ssa"
-
-// This file defines utilities for visiting the SSA representation of
-// a Program.
-//
-// TODO(adonovan): test coverage.
-
-// AllFunctions finds and returns the set of functions potentially
-// needed by program prog, as determined by a simple linker-style
-// reachability algorithm starting from the members and method-sets of
-// each package. The result may include anonymous functions and
-// synthetic wrappers.
-//
-// Precondition: all packages are built.
-//
-func AllFunctions(prog *ssa.Program) map[*ssa.Function]bool {
- visit := visitor{
- prog: prog,
- seen: make(map[*ssa.Function]bool),
- }
- visit.program()
- return visit.seen
-}
-
-type visitor struct {
- prog *ssa.Program
- seen map[*ssa.Function]bool
-}
-
-func (visit *visitor) program() {
- for _, pkg := range visit.prog.AllPackages() {
- for _, mem := range pkg.Members {
- if fn, ok := mem.(*ssa.Function); ok {
- visit.function(fn)
- }
- }
- }
- for _, T := range visit.prog.RuntimeTypes() {
- mset := visit.prog.MethodSets.MethodSet(T)
- for i, n := 0, mset.Len(); i < n; i++ {
- visit.function(visit.prog.MethodValue(mset.At(i)))
- }
- }
-}
-
-func (visit *visitor) function(fn *ssa.Function) {
- if !visit.seen[fn] {
- visit.seen[fn] = true
- var buf [10]*ssa.Value // avoid alloc in common case
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- for _, op := range instr.Operands(buf[:0]) {
- if fn, ok := (*op).(*ssa.Function); ok {
- visit.function(fn)
- }
- }
- }
- }
- }
-}
-
-// MainPackages returns the subset of the specified packages
-// named "main" that define a main function.
-// The result may include synthetic "testmain" packages.
-func MainPackages(pkgs []*ssa.Package) []*ssa.Package {
- var mains []*ssa.Package
- for _, pkg := range pkgs {
- if pkg.Pkg.Name() == "main" && pkg.Func("main") != nil {
- mains = append(mains, pkg)
- }
- }
- return mains
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/testmain.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/testmain.go
deleted file mode 100644
index 8391f26d6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/testmain.go
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// CreateTestMainPackage synthesizes a main package that runs all the
-// tests of the supplied packages.
-// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing.
-//
-// TODO(adonovan): this file no longer needs to live in the ssa package.
-// Move it to ssautil.
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/types"
- "log"
- "os"
- "strings"
- "text/template"
-)
-
-// FindTests returns the Test, Benchmark, and Example functions
-// (as defined by "go test") defined in the specified package,
-// and its TestMain function, if any.
-func FindTests(pkg *Package) (tests, benchmarks, examples []*Function, main *Function) {
- prog := pkg.Prog
-
- // The first two of these may be nil: if the program doesn't import "testing",
- // it can't contain any tests, but it may yet contain Examples.
- var testSig *types.Signature // func(*testing.T)
- var benchmarkSig *types.Signature // func(*testing.B)
- var exampleSig = types.NewSignature(nil, nil, nil, false) // func()
-
- // Obtain the types from the parameters of testing.MainStart.
- if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
- mainStart := testingPkg.Func("MainStart")
- params := mainStart.Signature.Params()
- testSig = funcField(params.At(1).Type())
- benchmarkSig = funcField(params.At(2).Type())
-
- // Does the package define this function?
- // func TestMain(*testing.M)
- if f := pkg.Func("TestMain"); f != nil {
- sig := f.Type().(*types.Signature)
- starM := mainStart.Signature.Results().At(0).Type() // *testing.M
- if sig.Results().Len() == 0 &&
- sig.Params().Len() == 1 &&
- types.Identical(sig.Params().At(0).Type(), starM) {
- main = f
- }
- }
- }
-
- // TODO(adonovan): use a stable order, e.g. lexical.
- for _, mem := range pkg.Members {
- if f, ok := mem.(*Function); ok &&
- ast.IsExported(f.Name()) &&
- strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") {
-
- switch {
- case testSig != nil && isTestSig(f, "Test", testSig):
- tests = append(tests, f)
- case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig):
- benchmarks = append(benchmarks, f)
- case isTestSig(f, "Example", exampleSig):
- examples = append(examples, f)
- default:
- continue
- }
- }
- }
- return
-}
-
-// Like isTest, but checks the signature too.
-func isTestSig(f *Function, prefix string, sig *types.Signature) bool {
- return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig)
-}
-
-// Given the type of one of the three slice parameters of testing.Main,
-// returns the function type.
-func funcField(slice types.Type) *types.Signature {
- return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature)
-}
-
-// 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.
-// Plundered from $GOROOT/src/cmd/go/test.go
-func isTest(name, prefix string) bool {
- if !strings.HasPrefix(name, prefix) {
- return false
- }
- if len(name) == len(prefix) { // "Test" is ok
- return true
- }
- return ast.IsExported(name[len(prefix):])
-}
-
-// CreateTestMainPackage creates and returns a synthetic "testmain"
-// package for the specified package if it defines tests, benchmarks or
-// executable examples, or nil otherwise. The new package is named
-// "main" and provides a function named "main" that runs the tests,
-// similar to the one that would be created by the 'go test' tool.
-//
-// Subsequent calls to prog.AllPackages include the new package.
-// The package pkg must belong to the program prog.
-func (prog *Program) CreateTestMainPackage(pkg *Package) *Package {
- if pkg.Prog != prog {
- log.Fatal("Package does not belong to Program")
- }
-
- // Template data
- var data struct {
- Pkg *Package
- Tests, Benchmarks, Examples []*Function
- Main *Function
- Go18 bool
- }
- data.Pkg = pkg
-
- // Enumerate tests.
- data.Tests, data.Benchmarks, data.Examples, data.Main = FindTests(pkg)
- if data.Main == nil &&
- data.Tests == nil && data.Benchmarks == nil && data.Examples == nil {
- return nil
- }
-
- // Synthesize source for testmain package.
- path := pkg.Pkg.Path() + "$testmain"
- tmpl := testmainTmpl
- if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
- // In Go 1.8, testing.MainStart's first argument is an interface, not a func.
- data.Go18 = types.IsInterface(testingPkg.Func("MainStart").Signature.Params().At(0).Type())
- } else {
- // The program does not import "testing", but FindTests
- // returned non-nil, which must mean there were Examples
- // but no Test, Benchmark, or TestMain functions.
-
- // We'll simply call them from testmain.main; this will
- // ensure they don't panic, but will not check any
- // "Output:" comments.
- // (We should not execute an Example that has no
- // "Output:" comment, but it's impossible to tell here.)
- tmpl = examplesOnlyTmpl
- }
- var buf bytes.Buffer
- if err := tmpl.Execute(&buf, data); err != nil {
- log.Fatalf("internal error expanding template for %s: %v", path, err)
- }
- if false { // debugging
- fmt.Fprintln(os.Stderr, buf.String())
- }
-
- // Parse and type-check the testmain package.
- f, err := parser.ParseFile(prog.Fset, path+".go", &buf, parser.Mode(0))
- if err != nil {
- log.Fatalf("internal error parsing %s: %v", path, err)
- }
- conf := types.Config{
- DisableUnusedImportCheck: true,
- Importer: importer{pkg},
- }
- files := []*ast.File{f}
- info := &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- }
- testmainPkg, err := conf.Check(path, prog.Fset, files, info)
- if err != nil {
- log.Fatalf("internal error type-checking %s: %v", path, err)
- }
-
- // Create and build SSA code.
- testmain := prog.CreatePackage(testmainPkg, files, info, false)
- testmain.SetDebugMode(false)
- testmain.Build()
- testmain.Func("main").Synthetic = "test main function"
- testmain.Func("init").Synthetic = "package initializer"
- return testmain
-}
-
-// An implementation of types.Importer for an already loaded SSA program.
-type importer struct {
- pkg *Package // package under test; may be non-importable
-}
-
-func (imp importer) Import(path string) (*types.Package, error) {
- if p := imp.pkg.Prog.ImportedPackage(path); p != nil {
- return p.Pkg, nil
- }
- if path == imp.pkg.Pkg.Path() {
- return imp.pkg.Pkg, nil
- }
- return nil, fmt.Errorf("not found") // can't happen
-}
-
-var testmainTmpl = template.Must(template.New("testmain").Parse(`
-package main
-
-import "io"
-import "os"
-import "testing"
-import p {{printf "%q" .Pkg.Pkg.Path}}
-
-{{if .Go18}}
-type deps struct{}
-
-func (deps) MatchString(pat, str string) (bool, error) { return true, nil }
-func (deps) StartCPUProfile(io.Writer) error { return nil }
-func (deps) StopCPUProfile() {}
-func (deps) WriteHeapProfile(io.Writer) error { return nil }
-func (deps) WriteProfileTo(string, io.Writer, int) error { return nil }
-func (deps) ImportPath() string { return "" }
-
-var match deps
-{{else}}
-func match(_, _ string) (bool, error) { return true, nil }
-{{end}}
-
-func main() {
- tests := []testing.InternalTest{
-{{range .Tests}}
- { {{printf "%q" .Name}}, p.{{.Name}} },
-{{end}}
- }
- benchmarks := []testing.InternalBenchmark{
-{{range .Benchmarks}}
- { {{printf "%q" .Name}}, p.{{.Name}} },
-{{end}}
- }
- examples := []testing.InternalExample{
-{{range .Examples}}
- {Name: {{printf "%q" .Name}}, F: p.{{.Name}}},
-{{end}}
- }
- m := testing.MainStart(match, tests, benchmarks, examples)
-{{with .Main}}
- p.{{.Name}}(m)
-{{else}}
- os.Exit(m.Run())
-{{end}}
-}
-
-`))
-
-var examplesOnlyTmpl = template.Must(template.New("examples").Parse(`
-package main
-
-import p {{printf "%q" .Pkg.Pkg.Path}}
-
-func main() {
-{{range .Examples}}
- p.{{.Name}}()
-{{end}}
-}
-`))
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/util.go
deleted file mode 100644
index ddb118460..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/util.go
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines a number of miscellaneous utility functions.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "io"
- "os"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-//// AST utilities
-
-func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
-
-// isBlankIdent returns true iff e is an Ident with name "_".
-// They have no associated types.Object, and thus no type.
-//
-func isBlankIdent(e ast.Expr) bool {
- id, ok := e.(*ast.Ident)
- return ok && id.Name == "_"
-}
-
-//// Type utilities. Some of these belong in go/types.
-
-// isPointer returns true for types whose underlying type is a pointer.
-func isPointer(typ types.Type) bool {
- _, ok := typ.Underlying().(*types.Pointer)
- return ok
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-// recvType returns the receiver type of method obj.
-func recvType(obj *types.Func) types.Type {
- return obj.Type().(*types.Signature).Recv().Type()
-}
-
-// DefaultType returns the default "typed" type for an "untyped" type;
-// it returns the incoming type for all other types. The default type
-// for untyped nil is untyped nil.
-//
-// Exported to ssa/interp.
-//
-// TODO(adonovan): use go/types.DefaultType after 1.8.
-//
-func DefaultType(typ types.Type) types.Type {
- if t, ok := typ.(*types.Basic); ok {
- k := t.Kind()
- switch k {
- case types.UntypedBool:
- k = types.Bool
- case types.UntypedInt:
- k = types.Int
- case types.UntypedRune:
- k = types.Rune
- case types.UntypedFloat:
- k = types.Float64
- case types.UntypedComplex:
- k = types.Complex128
- case types.UntypedString:
- k = types.String
- }
- typ = types.Typ[k]
- }
- return typ
-}
-
-// logStack prints the formatted "start" message to stderr and
-// returns a closure that prints the corresponding "end" message.
-// Call using 'defer logStack(...)()' to show builder stack on panic.
-// Don't forget trailing parens!
-//
-func logStack(format string, args ...interface{}) func() {
- msg := fmt.Sprintf(format, args...)
- io.WriteString(os.Stderr, msg)
- io.WriteString(os.Stderr, "\n")
- return func() {
- io.WriteString(os.Stderr, msg)
- io.WriteString(os.Stderr, " end\n")
- }
-}
-
-// newVar creates a 'var' for use in a types.Tuple.
-func newVar(name string, typ types.Type) *types.Var {
- return types.NewParam(token.NoPos, nil, name, typ)
-}
-
-// anonVar creates an anonymous 'var' for use in a types.Tuple.
-func anonVar(typ types.Type) *types.Var {
- return newVar("", typ)
-}
-
-var lenResults = types.NewTuple(anonVar(tInt))
-
-// makeLen returns the len builtin specialized to type func(T)int.
-func makeLen(T types.Type) *Builtin {
- lenParams := types.NewTuple(anonVar(T))
- return &Builtin{
- name: "len",
- sig: types.NewSignature(nil, lenParams, lenResults, false),
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/wrappers.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/wrappers.go
deleted file mode 100644
index 701dd90d7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/wrappers.go
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines synthesis of Functions that delegate to declared
-// methods; they come in three kinds:
-//
-// (1) wrappers: methods that wrap declared methods, performing
-// implicit pointer indirections and embedded field selections.
-//
-// (2) thunks: funcs that wrap declared methods. Like wrappers,
-// thunks perform indirections and field selections. The thunk's
-// first parameter is used as the receiver for the method call.
-//
-// (3) bounds: funcs that wrap declared methods. The bound's sole
-// free variable, supplied by a closure, is used as the receiver
-// for the method call. No indirections or field selections are
-// performed since they can be done before the call.
-
-import (
- "fmt"
-
- "go/types"
-)
-
-// -- wrappers -----------------------------------------------------------
-
-// makeWrapper returns a synthetic method that delegates to the
-// declared method denoted by meth.Obj(), first performing any
-// necessary pointer indirections or field selections implied by meth.
-//
-// The resulting method's receiver type is meth.Recv().
-//
-// This function is versatile but quite subtle! Consider the
-// following axes of variation when making changes:
-// - optional receiver indirection
-// - optional implicit field selections
-// - meth.Obj() may denote a concrete or an interface method
-// - the result may be a thunk or a wrapper.
-//
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-//
-func makeWrapper(prog *Program, sel *types.Selection) *Function {
- obj := sel.Obj().(*types.Func) // the declared function
- sig := sel.Type().(*types.Signature) // type of this wrapper
-
- var recv *types.Var // wrapper's receiver or thunk's params[0]
- name := obj.Name()
- var description string
- var start int // first regular param
- if sel.Kind() == types.MethodExpr {
- name += "$thunk"
- description = "thunk"
- recv = sig.Params().At(0)
- start = 1
- } else {
- description = "wrapper"
- recv = sig.Recv()
- }
-
- description = fmt.Sprintf("%s for %s", description, sel.Obj())
- if prog.mode&LogSource != 0 {
- defer logStack("make %s to (%s)", description, recv.Type())()
- }
- fn := &Function{
- name: name,
- method: sel,
- object: obj,
- Signature: sig,
- Synthetic: description,
- Prog: prog,
- pos: obj.Pos(),
- }
- fn.startBody()
- fn.addSpilledParam(recv)
- createParams(fn, start)
-
- indices := sel.Index()
-
- var v Value = fn.Locals[0] // spilled receiver
- if isPointer(sel.Recv()) {
- v = emitLoad(fn, v)
-
- // For simple indirection wrappers, perform an informative nil-check:
- // "value method (T).f called using nil *T pointer"
- if len(indices) == 1 && !isPointer(recvType(obj)) {
- var c Call
- c.Call.Value = &Builtin{
- name: "ssa:wrapnilchk",
- sig: types.NewSignature(nil,
- types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)),
- types.NewTuple(anonVar(sel.Recv())), false),
- }
- c.Call.Args = []Value{
- v,
- stringConst(deref(sel.Recv()).String()),
- stringConst(sel.Obj().Name()),
- }
- c.setType(v.Type())
- v = fn.emit(&c)
- }
- }
-
- // Invariant: v is a pointer, either
- // value of *A receiver param, or
- // address of A spilled receiver.
-
- // We use pointer arithmetic (FieldAddr possibly followed by
- // Load) in preference to value extraction (Field possibly
- // preceded by Load).
-
- v = emitImplicitSelections(fn, v, indices[:len(indices)-1])
-
- // Invariant: v is a pointer, either
- // value of implicit *C field, or
- // address of implicit C field.
-
- var c Call
- if r := recvType(obj); !isInterface(r) { // concrete method
- if !isPointer(r) {
- v = emitLoad(fn, v)
- }
- c.Call.Value = prog.declaredFunc(obj)
- c.Call.Args = append(c.Call.Args, v)
- } else {
- c.Call.Method = obj
- c.Call.Value = emitLoad(fn, v)
- }
- for _, arg := range fn.Params[1:] {
- c.Call.Args = append(c.Call.Args, arg)
- }
- emitTailCall(fn, &c)
- fn.finishBody()
- return fn
-}
-
-// createParams creates parameters for wrapper method fn based on its
-// Signature.Params, which do not include the receiver.
-// start is the index of the first regular parameter to use.
-//
-func createParams(fn *Function, start int) {
- var last *Parameter
- tparams := fn.Signature.Params()
- for i, n := start, tparams.Len(); i < n; i++ {
- last = fn.addParamObj(tparams.At(i))
- }
- if fn.Signature.Variadic() {
- last.typ = types.NewSlice(last.typ)
- }
-}
-
-// -- bounds -----------------------------------------------------------
-
-// makeBound returns a bound method wrapper (or "bound"), a synthetic
-// function that delegates to a concrete or interface method denoted
-// by obj. The resulting function has no receiver, but has one free
-// variable which will be used as the method's receiver in the
-// tail-call.
-//
-// Use MakeClosure with such a wrapper to construct a bound method
-// closure. e.g.:
-//
-// type T int or: type T interface { meth() }
-// func (t T) meth()
-// var t T
-// f := t.meth
-// f() // calls t.meth()
-//
-// f is a closure of a synthetic wrapper defined as if by:
-//
-// f := func() { return t.meth() }
-//
-// Unlike makeWrapper, makeBound need perform no indirection or field
-// selections because that can be done before the closure is
-// constructed.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
-//
-func makeBound(prog *Program, obj *types.Func) *Function {
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
- fn, ok := prog.bounds[obj]
- if !ok {
- description := fmt.Sprintf("bound method wrapper for %s", obj)
- if prog.mode&LogSource != 0 {
- defer logStack("%s", description)()
- }
- fn = &Function{
- name: obj.Name() + "$bound",
- object: obj,
- Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver
- Synthetic: description,
- Prog: prog,
- pos: obj.Pos(),
- }
-
- fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn}
- fn.FreeVars = []*FreeVar{fv}
- fn.startBody()
- createParams(fn, 0)
- var c Call
-
- if !isInterface(recvType(obj)) { // concrete
- c.Call.Value = prog.declaredFunc(obj)
- c.Call.Args = []Value{fv}
- } else {
- c.Call.Value = fv
- c.Call.Method = obj
- }
- for _, arg := range fn.Params {
- c.Call.Args = append(c.Call.Args, arg)
- }
- emitTailCall(fn, &c)
- fn.finishBody()
-
- prog.bounds[obj] = fn
- }
- return fn
-}
-
-// -- thunks -----------------------------------------------------------
-
-// makeThunk returns a thunk, a synthetic function that delegates to a
-// concrete or interface method denoted by sel.Obj(). The resulting
-// function has no receiver, but has an additional (first) regular
-// parameter.
-//
-// Precondition: sel.Kind() == types.MethodExpr.
-//
-// type T int or: type T interface { meth() }
-// func (t T) meth()
-// f := T.meth
-// var t T
-// f(t) // calls t.meth()
-//
-// f is a synthetic wrapper defined as if by:
-//
-// f := func(t T) { return t.meth() }
-//
-// TODO(adonovan): opt: currently the stub is created even when used
-// directly in a function call: C.f(i, 0). This is less efficient
-// than inlining the stub.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
-//
-func makeThunk(prog *Program, sel *types.Selection) *Function {
- if sel.Kind() != types.MethodExpr {
- panic(sel)
- }
-
- key := selectionKey{
- kind: sel.Kind(),
- recv: sel.Recv(),
- obj: sel.Obj(),
- index: fmt.Sprint(sel.Index()),
- indirect: sel.Indirect(),
- }
-
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- // Canonicalize key.recv to avoid constructing duplicate thunks.
- canonRecv, ok := prog.canon.At(key.recv).(types.Type)
- if !ok {
- canonRecv = key.recv
- prog.canon.Set(key.recv, canonRecv)
- }
- key.recv = canonRecv
-
- fn, ok := prog.thunks[key]
- if !ok {
- fn = makeWrapper(prog, sel)
- if fn.Signature.Recv() != nil {
- panic(fn) // unexpected receiver
- }
- prog.thunks[key] = fn
- }
- return fn
-}
-
-func changeRecv(s *types.Signature, recv *types.Var) *types.Signature {
- return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic())
-}
-
-// selectionKey is like types.Selection but a usable map key.
-type selectionKey struct {
- kind types.SelectionKind
- recv types.Type // canonicalized via Program.canon
- obj types.Object
- index string
- indirect bool
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/imports.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/imports.go
deleted file mode 100644
index 9c441dba9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/imports.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil
-
-import "go/types"
-
-// Dependencies returns all dependencies of the specified packages.
-//
-// Dependent packages appear in topological order: if package P imports
-// package Q, Q appears earlier than P in the result.
-// The algorithm follows import statements in the order they
-// appear in the source code, so the result is a total order.
-//
-func Dependencies(pkgs ...*types.Package) []*types.Package {
- var result []*types.Package
- seen := make(map[*types.Package]bool)
- var visit func(pkgs []*types.Package)
- visit = func(pkgs []*types.Package) {
- for _, p := range pkgs {
- if !seen[p] {
- seen[p] = true
- visit(p.Imports())
- result = append(result, p)
- }
- }
- }
- visit(pkgs)
- return result
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/map.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/map.go
deleted file mode 100644
index c7f754500..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/map.go
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package typeutil defines various utilities for types, such as Map,
-// a mapping from types.Type to interface{} values.
-package typeutil // import "golang.org/x/tools/go/types/typeutil"
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "reflect"
-)
-
-// Map is a hash-table-based mapping from types (types.Type) to
-// arbitrary interface{} values. The concrete types that implement
-// the Type interface are pointers. Since they are not canonicalized,
-// == cannot be used to check for equivalence, and thus we cannot
-// simply use a Go map.
-//
-// Just as with map[K]V, a nil *Map is a valid empty map.
-//
-// Not thread-safe.
-//
-type Map struct {
- hasher Hasher // shared by many Maps
- table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused
- length int // number of map entries
-}
-
-// entry is an entry (key/value association) in a hash bucket.
-type entry struct {
- key types.Type
- value interface{}
-}
-
-// SetHasher sets the hasher used by Map.
-//
-// All Hashers are functionally equivalent but contain internal state
-// used to cache the results of hashing previously seen types.
-//
-// A single Hasher created by MakeHasher() may be shared among many
-// Maps. This is recommended if the instances have many keys in
-// common, as it will amortize the cost of hash computation.
-//
-// A Hasher may grow without bound as new types are seen. Even when a
-// type is deleted from the map, the Hasher never shrinks, since other
-// types in the map may reference the deleted type indirectly.
-//
-// Hashers are not thread-safe, and read-only operations such as
-// Map.Lookup require updates to the hasher, so a full Mutex lock (not a
-// read-lock) is require around all Map operations if a shared
-// hasher is accessed from multiple threads.
-//
-// If SetHasher is not called, the Map will create a private hasher at
-// the first call to Insert.
-//
-func (m *Map) SetHasher(hasher Hasher) {
- m.hasher = hasher
-}
-
-// Delete removes the entry with the given key, if any.
-// It returns true if the entry was found.
-//
-func (m *Map) Delete(key types.Type) bool {
- if m != nil && m.table != nil {
- hash := m.hasher.Hash(key)
- bucket := m.table[hash]
- for i, e := range bucket {
- if e.key != nil && types.Identical(key, e.key) {
- // We can't compact the bucket as it
- // would disturb iterators.
- bucket[i] = entry{}
- m.length--
- return true
- }
- }
- }
- return false
-}
-
-// At returns the map entry for the given key.
-// The result is nil if the entry is not present.
-//
-func (m *Map) At(key types.Type) interface{} {
- if m != nil && m.table != nil {
- for _, e := range m.table[m.hasher.Hash(key)] {
- if e.key != nil && types.Identical(key, e.key) {
- return e.value
- }
- }
- }
- return nil
-}
-
-// Set sets the map entry for key to val,
-// and returns the previous entry, if any.
-func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) {
- if m.table != nil {
- hash := m.hasher.Hash(key)
- bucket := m.table[hash]
- var hole *entry
- for i, e := range bucket {
- if e.key == nil {
- hole = &bucket[i]
- } else if types.Identical(key, e.key) {
- prev = e.value
- bucket[i].value = value
- return
- }
- }
-
- if hole != nil {
- *hole = entry{key, value} // overwrite deleted entry
- } else {
- m.table[hash] = append(bucket, entry{key, value})
- }
- } else {
- if m.hasher.memo == nil {
- m.hasher = MakeHasher()
- }
- hash := m.hasher.Hash(key)
- m.table = map[uint32][]entry{hash: {entry{key, value}}}
- }
-
- m.length++
- return
-}
-
-// Len returns the number of map entries.
-func (m *Map) Len() int {
- if m != nil {
- return m.length
- }
- return 0
-}
-
-// Iterate calls function f on each entry in the map in unspecified order.
-//
-// If f should mutate the map, Iterate provides the same guarantees as
-// Go maps: if f deletes a map entry that Iterate has not yet reached,
-// f will not be invoked for it, but if f inserts a map entry that
-// Iterate has not yet reached, whether or not f will be invoked for
-// it is unspecified.
-//
-func (m *Map) Iterate(f func(key types.Type, value interface{})) {
- if m != nil {
- for _, bucket := range m.table {
- for _, e := range bucket {
- if e.key != nil {
- f(e.key, e.value)
- }
- }
- }
- }
-}
-
-// Keys returns a new slice containing the set of map keys.
-// The order is unspecified.
-func (m *Map) Keys() []types.Type {
- keys := make([]types.Type, 0, m.Len())
- m.Iterate(func(key types.Type, _ interface{}) {
- keys = append(keys, key)
- })
- return keys
-}
-
-func (m *Map) toString(values bool) string {
- if m == nil {
- return "{}"
- }
- var buf bytes.Buffer
- fmt.Fprint(&buf, "{")
- sep := ""
- m.Iterate(func(key types.Type, value interface{}) {
- fmt.Fprint(&buf, sep)
- sep = ", "
- fmt.Fprint(&buf, key)
- if values {
- fmt.Fprintf(&buf, ": %q", value)
- }
- })
- fmt.Fprint(&buf, "}")
- return buf.String()
-}
-
-// String returns a string representation of the map's entries.
-// Values are printed using fmt.Sprintf("%v", v).
-// Order is unspecified.
-//
-func (m *Map) String() string {
- return m.toString(true)
-}
-
-// KeysString returns a string representation of the map's key set.
-// Order is unspecified.
-//
-func (m *Map) KeysString() string {
- return m.toString(false)
-}
-
-////////////////////////////////////////////////////////////////////////
-// Hasher
-
-// A Hasher maps each type to its hash value.
-// For efficiency, a hasher uses memoization; thus its memory
-// footprint grows monotonically over time.
-// Hashers are not thread-safe.
-// Hashers have reference semantics.
-// Call MakeHasher to create a Hasher.
-type Hasher struct {
- memo map[types.Type]uint32
-}
-
-// MakeHasher returns a new Hasher instance.
-func MakeHasher() Hasher {
- return Hasher{make(map[types.Type]uint32)}
-}
-
-// Hash computes a hash value for the given type t such that
-// Identical(t, t') => Hash(t) == Hash(t').
-func (h Hasher) Hash(t types.Type) uint32 {
- hash, ok := h.memo[t]
- if !ok {
- hash = h.hashFor(t)
- h.memo[t] = hash
- }
- return hash
-}
-
-// hashString computes the Fowler–Noll–Vo hash of s.
-func hashString(s string) uint32 {
- var h uint32
- for i := 0; i < len(s); i++ {
- h ^= uint32(s[i])
- h *= 16777619
- }
- return h
-}
-
-// hashFor computes the hash of t.
-func (h Hasher) hashFor(t types.Type) uint32 {
- // See Identical for rationale.
- switch t := t.(type) {
- case *types.Basic:
- return uint32(t.Kind())
-
- case *types.Array:
- return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem())
-
- case *types.Slice:
- return 9049 + 2*h.Hash(t.Elem())
-
- case *types.Struct:
- var hash uint32 = 9059
- for i, n := 0, t.NumFields(); i < n; i++ {
- f := t.Field(i)
- if f.Anonymous() {
- hash += 8861
- }
- hash += hashString(t.Tag(i))
- hash += hashString(f.Name()) // (ignore f.Pkg)
- hash += h.Hash(f.Type())
- }
- return hash
-
- case *types.Pointer:
- return 9067 + 2*h.Hash(t.Elem())
-
- case *types.Signature:
- var hash uint32 = 9091
- if t.Variadic() {
- hash *= 8863
- }
- return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results())
-
- case *types.Interface:
- var hash uint32 = 9103
- for i, n := 0, t.NumMethods(); i < n; i++ {
- // See go/types.identicalMethods for rationale.
- // Method order is not significant.
- // Ignore m.Pkg().
- m := t.Method(i)
- hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type())
- }
- return hash
-
- case *types.Map:
- return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem())
-
- case *types.Chan:
- return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem())
-
- case *types.Named:
- // Not safe with a copying GC; objects may move.
- return uint32(reflect.ValueOf(t.Obj()).Pointer())
-
- case *types.Tuple:
- return h.hashTuple(t)
- }
- panic(t)
-}
-
-func (h Hasher) hashTuple(tuple *types.Tuple) uint32 {
- // See go/types.identicalTypes for rationale.
- n := tuple.Len()
- var hash uint32 = 9137 + 2*uint32(n)
- for i := 0; i < n; i++ {
- hash += 3 * h.Hash(tuple.At(i).Type())
- }
- return hash
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/methodsetcache.go
deleted file mode 100644
index 32084610f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/methodsetcache.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements a cache of method sets.
-
-package typeutil
-
-import (
- "go/types"
- "sync"
-)
-
-// A MethodSetCache records the method set of each type T for which
-// MethodSet(T) is called so that repeat queries are fast.
-// The zero value is a ready-to-use cache instance.
-type MethodSetCache struct {
- mu sync.Mutex
- named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N
- others map[types.Type]*types.MethodSet // all other types
-}
-
-// MethodSet returns the method set of type T. It is thread-safe.
-//
-// If cache is nil, this function is equivalent to types.NewMethodSet(T).
-// Utility functions can thus expose an optional *MethodSetCache
-// parameter to clients that care about performance.
-//
-func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet {
- if cache == nil {
- return types.NewMethodSet(T)
- }
- cache.mu.Lock()
- defer cache.mu.Unlock()
-
- switch T := T.(type) {
- case *types.Named:
- return cache.lookupNamed(T).value
-
- case *types.Pointer:
- if N, ok := T.Elem().(*types.Named); ok {
- return cache.lookupNamed(N).pointer
- }
- }
-
- // all other types
- // (The map uses pointer equivalence, not type identity.)
- mset := cache.others[T]
- if mset == nil {
- mset = types.NewMethodSet(T)
- if cache.others == nil {
- cache.others = make(map[types.Type]*types.MethodSet)
- }
- cache.others[T] = mset
- }
- return mset
-}
-
-func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } {
- if cache.named == nil {
- cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet })
- }
- // Avoid recomputing mset(*T) for each distinct Pointer
- // instance whose underlying type is a named type.
- msets, ok := cache.named[named]
- if !ok {
- msets.value = types.NewMethodSet(named)
- msets.pointer = types.NewMethodSet(types.NewPointer(named))
- cache.named[named] = msets
- }
- return msets
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/ui.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/ui.go
deleted file mode 100644
index 9849c24ce..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/types/typeutil/ui.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil
-
-// This file defines utilities for user interfaces that display types.
-
-import "go/types"
-
-// IntuitiveMethodSet returns the intuitive method set of a type T,
-// which is the set of methods you can call on an addressable value of
-// that type.
-//
-// The result always contains MethodSet(T), and is exactly MethodSet(T)
-// for interface types and for pointer-to-concrete types.
-// For all other concrete types T, the result additionally
-// contains each method belonging to *T if there is no identically
-// named method on T itself.
-//
-// This corresponds to user intuition about method sets;
-// this function is intended only for user interfaces.
-//
-// The order of the result is as for types.MethodSet(T).
-//
-func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection {
- isPointerToConcrete := func(T types.Type) bool {
- ptr, ok := T.(*types.Pointer)
- return ok && !types.IsInterface(ptr.Elem())
- }
-
- var result []*types.Selection
- mset := msets.MethodSet(T)
- if types.IsInterface(T) || isPointerToConcrete(T) {
- for i, n := 0, mset.Len(); i < n; i++ {
- result = append(result, mset.At(i))
- }
- } else {
- // T is some other concrete type.
- // Report methods of T and *T, preferring those of T.
- pmset := msets.MethodSet(types.NewPointer(T))
- for i, n := 0, pmset.Len(); i < n; i++ {
- meth := pmset.At(i)
- if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil {
- meth = m
- }
- result = append(result, meth)
- }
-
- }
- return result
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk.go
deleted file mode 100644
index 31e6e27b0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// A faster implementation of filepath.Walk.
-//
-// filepath.Walk's design necessarily calls os.Lstat on each file,
-// even if the caller needs less info. And goimports only need to know
-// the type of each file. The kernel interface provides the type in
-// the Readdir call but the standard library ignored it.
-// fastwalk_unix.go contains a fork of the syscall routines.
-//
-// See golang.org/issue/16399
-
-package imports
-
-import (
- "errors"
- "os"
- "path/filepath"
- "runtime"
- "sync"
-)
-
-// traverseLink is a sentinel error for fastWalk, similar to filepath.SkipDir.
-var traverseLink = errors.New("traverse symlink, assuming target is a directory")
-
-// fastWalk walks the file tree rooted at root, calling walkFn for
-// each file or directory in the tree, including root.
-//
-// If fastWalk returns filepath.SkipDir, the directory is skipped.
-//
-// Unlike filepath.Walk:
-// * file stat calls must be done by the user.
-// The only provided metadata is the file type, which does not include
-// any permission bits.
-// * multiple goroutines stat the filesystem concurrently. The provided
-// walkFn must be safe for concurrent use.
-// * fastWalk can follow symlinks if walkFn returns the traverseLink
-// sentinel error. It is the walkFn's responsibility to prevent
-// fastWalk from going into symlink cycles.
-func fastWalk(root string, walkFn func(path string, typ os.FileMode) error) error {
- // TODO(bradfitz): make numWorkers configurable? We used a
- // minimum of 4 to give the kernel more info about multiple
- // things we want, in hopes its I/O scheduling can take
- // advantage of that. Hopefully most are in cache. Maybe 4 is
- // even too low of a minimum. Profile more.
- numWorkers := 4
- if n := runtime.NumCPU(); n > numWorkers {
- numWorkers = n
- }
-
- // Make sure to wait for all workers to finish, otherwise
- // walkFn could still be called after returning. This Wait call
- // runs after close(e.donec) below.
- var wg sync.WaitGroup
- defer wg.Wait()
-
- w := &walker{
- fn: walkFn,
- enqueuec: make(chan walkItem, numWorkers), // buffered for performance
- workc: make(chan walkItem, numWorkers), // buffered for performance
- donec: make(chan struct{}),
-
- // buffered for correctness & not leaking goroutines:
- resc: make(chan error, numWorkers),
- }
- defer close(w.donec)
-
- for i := 0; i < numWorkers; i++ {
- wg.Add(1)
- go w.doWork(&wg)
- }
- todo := []walkItem{{dir: root}}
- out := 0
- for {
- workc := w.workc
- var workItem walkItem
- if len(todo) == 0 {
- workc = nil
- } else {
- workItem = todo[len(todo)-1]
- }
- select {
- case workc <- workItem:
- todo = todo[:len(todo)-1]
- out++
- case it := <-w.enqueuec:
- todo = append(todo, it)
- case err := <-w.resc:
- out--
- if err != nil {
- return err
- }
- if out == 0 && len(todo) == 0 {
- // It's safe to quit here, as long as the buffered
- // enqueue channel isn't also readable, which might
- // happen if the worker sends both another unit of
- // work and its result before the other select was
- // scheduled and both w.resc and w.enqueuec were
- // readable.
- select {
- case it := <-w.enqueuec:
- todo = append(todo, it)
- default:
- return nil
- }
- }
- }
- }
-}
-
-// doWork reads directories as instructed (via workc) and runs the
-// user's callback function.
-func (w *walker) doWork(wg *sync.WaitGroup) {
- defer wg.Done()
- for {
- select {
- case <-w.donec:
- return
- case it := <-w.workc:
- select {
- case <-w.donec:
- return
- case w.resc <- w.walk(it.dir, !it.callbackDone):
- }
- }
- }
-}
-
-type walker struct {
- fn func(path string, typ os.FileMode) error
-
- donec chan struct{} // closed on fastWalk's return
- workc chan walkItem // to workers
- enqueuec chan walkItem // from workers
- resc chan error // from workers
-}
-
-type walkItem struct {
- dir string
- callbackDone bool // callback already called; don't do it again
-}
-
-func (w *walker) enqueue(it walkItem) {
- select {
- case w.enqueuec <- it:
- case <-w.donec:
- }
-}
-
-func (w *walker) onDirEnt(dirName, baseName string, typ os.FileMode) error {
- joined := dirName + string(os.PathSeparator) + baseName
- if typ == os.ModeDir {
- w.enqueue(walkItem{dir: joined})
- return nil
- }
-
- err := w.fn(joined, typ)
- if typ == os.ModeSymlink {
- if err == traverseLink {
- // Set callbackDone so we don't call it twice for both the
- // symlink-as-symlink and the symlink-as-directory later:
- w.enqueue(walkItem{dir: joined, callbackDone: true})
- return nil
- }
- if err == filepath.SkipDir {
- // Permit SkipDir on symlinks too.
- return nil
- }
- }
- return err
-}
-
-func (w *walker) walk(root string, runUserCallback bool) error {
- if runUserCallback {
- err := w.fn(root, os.ModeDir)
- if err == filepath.SkipDir {
- return nil
- }
- if err != nil {
- return err
- }
- }
-
- return readDir(root, w.onDirEnt)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_dirent_fileno.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_dirent_fileno.go
deleted file mode 100644
index f1fd64949..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_dirent_fileno.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd openbsd netbsd
-
-package imports
-
-import "syscall"
-
-func direntInode(dirent *syscall.Dirent) uint64 {
- return uint64(dirent.Fileno)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_dirent_ino.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_dirent_ino.go
deleted file mode 100644
index 9fc6de038..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_dirent_ino.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux darwin
-// +build !appengine
-
-package imports
-
-import "syscall"
-
-func direntInode(dirent *syscall.Dirent) uint64 {
- return uint64(dirent.Ino)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_portable.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_portable.go
deleted file mode 100644
index 6c2658347..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_portable.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build appengine !linux,!darwin,!freebsd,!openbsd,!netbsd
-
-package imports
-
-import (
- "io/ioutil"
- "os"
-)
-
-// readDir calls fn for each directory entry in dirName.
-// It does not descend into directories or follow symlinks.
-// If fn returns a non-nil error, readDir returns with that error
-// immediately.
-func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error {
- fis, err := ioutil.ReadDir(dirName)
- if err != nil {
- return err
- }
- for _, fi := range fis {
- if err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_unix.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_unix.go
deleted file mode 100644
index db6ee8daf..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fastwalk_unix.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux darwin freebsd openbsd netbsd
-// +build !appengine
-
-package imports
-
-import (
- "bytes"
- "fmt"
- "os"
- "syscall"
- "unsafe"
-)
-
-const blockSize = 8 << 10
-
-// unknownFileMode is a sentinel (and bogus) os.FileMode
-// value used to represent a syscall.DT_UNKNOWN Dirent.Type.
-const unknownFileMode os.FileMode = os.ModeNamedPipe | os.ModeSocket | os.ModeDevice
-
-func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error {
- fd, err := syscall.Open(dirName, 0, 0)
- if err != nil {
- return err
- }
- defer syscall.Close(fd)
-
- // The buffer must be at least a block long.
- buf := make([]byte, blockSize) // stack-allocated; doesn't escape
- bufp := 0 // starting read position in buf
- nbuf := 0 // end valid data in buf
- for {
- if bufp >= nbuf {
- bufp = 0
- nbuf, err = syscall.ReadDirent(fd, buf)
- if err != nil {
- return os.NewSyscallError("readdirent", err)
- }
- if nbuf <= 0 {
- return nil
- }
- }
- consumed, name, typ := parseDirEnt(buf[bufp:nbuf])
- bufp += consumed
- if name == "" || name == "." || name == ".." {
- continue
- }
- // Fallback for filesystems (like old XFS) that don't
- // support Dirent.Type and have DT_UNKNOWN (0) there
- // instead.
- if typ == unknownFileMode {
- fi, err := os.Lstat(dirName + "/" + name)
- if err != nil {
- // It got deleted in the meantime.
- if os.IsNotExist(err) {
- continue
- }
- return err
- }
- typ = fi.Mode() & os.ModeType
- }
- if err := fn(dirName, name, typ); err != nil {
- return err
- }
- }
-}
-
-func parseDirEnt(buf []byte) (consumed int, name string, typ os.FileMode) {
- // golang.org/issue/15653
- dirent := (*syscall.Dirent)(unsafe.Pointer(&buf[0]))
- if v := unsafe.Offsetof(dirent.Reclen) + unsafe.Sizeof(dirent.Reclen); uintptr(len(buf)) < v {
- panic(fmt.Sprintf("buf size of %d smaller than dirent header size %d", len(buf), v))
- }
- if len(buf) < int(dirent.Reclen) {
- panic(fmt.Sprintf("buf size %d < record length %d", len(buf), dirent.Reclen))
- }
- consumed = int(dirent.Reclen)
- if direntInode(dirent) == 0 { // File absent in directory.
- return
- }
- switch dirent.Type {
- case syscall.DT_REG:
- typ = 0
- case syscall.DT_DIR:
- typ = os.ModeDir
- case syscall.DT_LNK:
- typ = os.ModeSymlink
- case syscall.DT_BLK:
- typ = os.ModeDevice
- case syscall.DT_FIFO:
- typ = os.ModeNamedPipe
- case syscall.DT_SOCK:
- typ = os.ModeSocket
- case syscall.DT_UNKNOWN:
- typ = unknownFileMode
- default:
- // Skip weird things.
- // It's probably a DT_WHT (http://lwn.net/Articles/325369/)
- // or something. Revisit if/when this package is moved outside
- // of goimports. goimports only cares about regular files,
- // symlinks, and directories.
- return
- }
-
- nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0]))
- nameLen := bytes.IndexByte(nameBuf[:], 0)
- if nameLen < 0 {
- panic("failed to find terminating 0 byte in dirent")
- }
-
- // Special cases for common things:
- if nameLen == 1 && nameBuf[0] == '.' {
- name = "."
- } else if nameLen == 2 && nameBuf[0] == '.' && nameBuf[1] == '.' {
- name = ".."
- } else {
- name = string(nameBuf[:nameLen])
- }
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fix.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fix.go
deleted file mode 100644
index e24608497..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/fix.go
+++ /dev/null
@@ -1,1008 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package imports
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/ast"
- "go/build"
- "go/parser"
- "go/token"
- "io/ioutil"
- "log"
- "os"
- "path"
- "path/filepath"
- "sort"
- "strings"
- "sync"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-// Debug controls verbose logging.
-var Debug = false
-
-var (
- inTests = false // set true by fix_test.go; if false, no need to use testMu
- testMu sync.RWMutex // guards globals reset by tests; used only if inTests
-)
-
-// LocalPrefix, if set, instructs Process to sort import paths with the given
-// prefix into another group after 3rd-party packages.
-var LocalPrefix string
-
-// importToGroup is a list of functions which map from an import path to
-// a group number.
-var importToGroup = []func(importPath string) (num int, ok bool){
- func(importPath string) (num int, ok bool) {
- if LocalPrefix != "" && strings.HasPrefix(importPath, LocalPrefix) {
- return 3, true
- }
- return
- },
- func(importPath string) (num int, ok bool) {
- if strings.HasPrefix(importPath, "appengine") {
- return 2, true
- }
- return
- },
- func(importPath string) (num int, ok bool) {
- if strings.Contains(importPath, ".") {
- return 1, true
- }
- return
- },
-}
-
-func importGroup(importPath string) int {
- for _, fn := range importToGroup {
- if n, ok := fn(importPath); ok {
- return n
- }
- }
- return 0
-}
-
-// importInfo is a summary of information about one import.
-type importInfo struct {
- Path string // full import path (e.g. "crypto/rand")
- Alias string // import alias, if present (e.g. "crand")
-}
-
-// packageInfo is a summary of features found in a package.
-type packageInfo struct {
- Globals map[string]bool // symbol => true
- Imports map[string]importInfo // pkg base name or alias => info
-}
-
-// dirPackageInfo exposes the dirPackageInfoFile function so that it can be overridden.
-var dirPackageInfo = dirPackageInfoFile
-
-// dirPackageInfoFile gets information from other files in the package.
-func dirPackageInfoFile(pkgName, srcDir, filename string) (*packageInfo, error) {
- considerTests := strings.HasSuffix(filename, "_test.go")
-
- // Handle file from stdin
- if _, err := os.Stat(filename); err != nil {
- if os.IsNotExist(err) {
- return &packageInfo{}, nil
- }
- return nil, err
- }
-
- fileBase := filepath.Base(filename)
- packageFileInfos, err := ioutil.ReadDir(srcDir)
- if err != nil {
- return nil, err
- }
-
- info := &packageInfo{Globals: make(map[string]bool), Imports: make(map[string]importInfo)}
- for _, fi := range packageFileInfos {
- if fi.Name() == fileBase || !strings.HasSuffix(fi.Name(), ".go") {
- continue
- }
- if !considerTests && strings.HasSuffix(fi.Name(), "_test.go") {
- continue
- }
-
- fileSet := token.NewFileSet()
- root, err := parser.ParseFile(fileSet, filepath.Join(srcDir, fi.Name()), nil, 0)
- if err != nil {
- continue
- }
-
- for _, decl := range root.Decls {
- genDecl, ok := decl.(*ast.GenDecl)
- if !ok {
- continue
- }
-
- for _, spec := range genDecl.Specs {
- valueSpec, ok := spec.(*ast.ValueSpec)
- if !ok {
- continue
- }
- info.Globals[valueSpec.Names[0].Name] = true
- }
- }
-
- for _, imp := range root.Imports {
- impInfo := importInfo{Path: strings.Trim(imp.Path.Value, `"`)}
- name := path.Base(impInfo.Path)
- if imp.Name != nil {
- name = strings.Trim(imp.Name.Name, `"`)
- impInfo.Alias = name
- }
- info.Imports[name] = impInfo
- }
- }
- return info, nil
-}
-
-func fixImports(fset *token.FileSet, f *ast.File, filename string) (added []string, err error) {
- // refs are a set of possible package references currently unsatisfied by imports.
- // first key: either base package (e.g. "fmt") or renamed package
- // second key: referenced package symbol (e.g. "Println")
- refs := make(map[string]map[string]bool)
-
- // decls are the current package imports. key is base package or renamed package.
- decls := make(map[string]*ast.ImportSpec)
-
- abs, err := filepath.Abs(filename)
- if err != nil {
- return nil, err
- }
- srcDir := filepath.Dir(abs)
- if Debug {
- log.Printf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir)
- }
-
- var packageInfo *packageInfo
- var loadedPackageInfo bool
-
- // collect potential uses of packages.
- var visitor visitFn
- visitor = visitFn(func(node ast.Node) ast.Visitor {
- if node == nil {
- return visitor
- }
- switch v := node.(type) {
- case *ast.ImportSpec:
- if v.Name != nil {
- decls[v.Name.Name] = v
- break
- }
- ipath := strings.Trim(v.Path.Value, `"`)
- if ipath == "C" {
- break
- }
- local := importPathToName(ipath, srcDir)
- decls[local] = v
- case *ast.SelectorExpr:
- xident, ok := v.X.(*ast.Ident)
- if !ok {
- break
- }
- if xident.Obj != nil {
- // if the parser can resolve it, it's not a package ref
- break
- }
- pkgName := xident.Name
- if refs[pkgName] == nil {
- refs[pkgName] = make(map[string]bool)
- }
- if !loadedPackageInfo {
- loadedPackageInfo = true
- packageInfo, _ = dirPackageInfo(f.Name.Name, srcDir, filename)
- }
- if decls[pkgName] == nil && (packageInfo == nil || !packageInfo.Globals[pkgName]) {
- refs[pkgName][v.Sel.Name] = true
- }
- }
- return visitor
- })
- ast.Walk(visitor, f)
-
- // Nil out any unused ImportSpecs, to be removed in following passes
- unusedImport := map[string]string{}
- for pkg, is := range decls {
- if refs[pkg] == nil && pkg != "_" && pkg != "." {
- name := ""
- if is.Name != nil {
- name = is.Name.Name
- }
- unusedImport[strings.Trim(is.Path.Value, `"`)] = name
- }
- }
- for ipath, name := range unusedImport {
- if ipath == "C" {
- // Don't remove cgo stuff.
- continue
- }
- astutil.DeleteNamedImport(fset, f, name, ipath)
- }
-
- for pkgName, symbols := range refs {
- if len(symbols) == 0 {
- // skip over packages already imported
- delete(refs, pkgName)
- }
- }
-
- // Fast path, all references already imported.
- if len(refs) == 0 {
- return nil, nil
- }
-
- // Can assume this will be necessary in all cases now.
- if !loadedPackageInfo {
- packageInfo, _ = dirPackageInfo(f.Name.Name, srcDir, filename)
- }
-
- // Search for imports matching potential package references.
- searches := 0
- type result struct {
- ipath string // import path (if err == nil)
- name string // optional name to rename import as
- err error
- }
- results := make(chan result)
- for pkgName, symbols := range refs {
- go func(pkgName string, symbols map[string]bool) {
- if packageInfo != nil {
- sibling := packageInfo.Imports[pkgName]
- if sibling.Path != "" {
- results <- result{ipath: sibling.Path, name: sibling.Alias}
- return
- }
- }
- ipath, rename, err := findImport(pkgName, symbols, filename)
- r := result{ipath: ipath, err: err}
- if rename {
- r.name = pkgName
- }
- results <- r
- }(pkgName, symbols)
- searches++
- }
- for i := 0; i < searches; i++ {
- result := <-results
- if result.err != nil {
- return nil, result.err
- }
- if result.ipath != "" {
- if result.name != "" {
- astutil.AddNamedImport(fset, f, result.name, result.ipath)
- } else {
- astutil.AddImport(fset, f, result.ipath)
- }
- added = append(added, result.ipath)
- }
- }
-
- return added, nil
-}
-
-// importPathToName returns the package name for the given import path.
-var importPathToName func(importPath, srcDir string) (packageName string) = importPathToNameGoPath
-
-// importPathToNameBasic assumes the package name is the base of import path.
-func importPathToNameBasic(importPath, srcDir string) (packageName string) {
- return path.Base(importPath)
-}
-
-// importPathToNameGoPath finds out the actual package name, as declared in its .go files.
-// If there's a problem, it falls back to using importPathToNameBasic.
-func importPathToNameGoPath(importPath, srcDir string) (packageName string) {
- // Fast path for standard library without going to disk.
- if pkg, ok := stdImportPackage[importPath]; ok {
- return pkg
- }
-
- pkgName, err := importPathToNameGoPathParse(importPath, srcDir)
- if Debug {
- log.Printf("importPathToNameGoPathParse(%q, srcDir=%q) = %q, %v", importPath, srcDir, pkgName, err)
- }
- if err == nil {
- return pkgName
- }
- return importPathToNameBasic(importPath, srcDir)
-}
-
-// importPathToNameGoPathParse is a faster version of build.Import if
-// the only thing desired is the package name. It uses build.FindOnly
-// to find the directory and then only parses one file in the package,
-// trusting that the files in the directory are consistent.
-func importPathToNameGoPathParse(importPath, srcDir string) (packageName string, err error) {
- buildPkg, err := build.Import(importPath, srcDir, build.FindOnly)
- if err != nil {
- return "", err
- }
- d, err := os.Open(buildPkg.Dir)
- if err != nil {
- return "", err
- }
- names, err := d.Readdirnames(-1)
- d.Close()
- if err != nil {
- return "", err
- }
- sort.Strings(names) // to have predictable behavior
- var lastErr error
- var nfile int
- for _, name := range names {
- if !strings.HasSuffix(name, ".go") {
- continue
- }
- if strings.HasSuffix(name, "_test.go") {
- continue
- }
- nfile++
- fullFile := filepath.Join(buildPkg.Dir, name)
-
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, fullFile, nil, parser.PackageClauseOnly)
- if err != nil {
- lastErr = err
- continue
- }
- pkgName := f.Name.Name
- if pkgName == "documentation" {
- // Special case from go/build.ImportDir, not
- // handled by ctx.MatchFile.
- continue
- }
- if pkgName == "main" {
- // Also skip package main, assuming it's a +build ignore generator or example.
- // Since you can't import a package main anyway, there's no harm here.
- continue
- }
- return pkgName, nil
- }
- if lastErr != nil {
- return "", lastErr
- }
- return "", fmt.Errorf("no importable package found in %d Go files", nfile)
-}
-
-var stdImportPackage = map[string]string{} // "net/http" => "http"
-
-func init() {
- // Nothing in the standard library has a package name not
- // matching its import base name.
- for _, pkg := range stdlib {
- if _, ok := stdImportPackage[pkg]; !ok {
- stdImportPackage[pkg] = path.Base(pkg)
- }
- }
-}
-
-// Directory-scanning state.
-var (
- // scanGoRootOnce guards calling scanGoRoot (for $GOROOT)
- scanGoRootOnce sync.Once
- // scanGoPathOnce guards calling scanGoPath (for $GOPATH)
- scanGoPathOnce sync.Once
-
- // populateIgnoreOnce guards calling populateIgnore
- populateIgnoreOnce sync.Once
- ignoredDirs []os.FileInfo
-
- dirScanMu sync.RWMutex
- dirScan map[string]*pkg // abs dir path => *pkg
-)
-
-type pkg struct {
- dir string // absolute file path to pkg directory ("/usr/lib/go/src/net/http")
- importPath string // full pkg import path ("net/http", "foo/bar/vendor/a/b")
- importPathShort string // vendorless import path ("net/http", "a/b")
-}
-
-// byImportPathShortLength sorts by the short import path length, breaking ties on the
-// import string itself.
-type byImportPathShortLength []*pkg
-
-func (s byImportPathShortLength) Len() int { return len(s) }
-func (s byImportPathShortLength) Less(i, j int) bool {
- vi, vj := s[i].importPathShort, s[j].importPathShort
- return len(vi) < len(vj) || (len(vi) == len(vj) && vi < vj)
-
-}
-func (s byImportPathShortLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// guarded by populateIgnoreOnce; populates ignoredDirs.
-func populateIgnore() {
- for _, srcDir := range build.Default.SrcDirs() {
- if srcDir == filepath.Join(build.Default.GOROOT, "src") {
- continue
- }
- populateIgnoredDirs(srcDir)
- }
-}
-
-// populateIgnoredDirs reads an optional config file at /.goimportsignore
-// of relative directories to ignore when scanning for go files.
-// The provided path is one of the $GOPATH entries with "src" appended.
-func populateIgnoredDirs(path string) {
- file := filepath.Join(path, ".goimportsignore")
- slurp, err := ioutil.ReadFile(file)
- if Debug {
- if err != nil {
- log.Print(err)
- } else {
- log.Printf("Read %s", file)
- }
- }
- if err != nil {
- return
- }
- bs := bufio.NewScanner(bytes.NewReader(slurp))
- for bs.Scan() {
- line := strings.TrimSpace(bs.Text())
- if line == "" || strings.HasPrefix(line, "#") {
- continue
- }
- full := filepath.Join(path, line)
- if fi, err := os.Stat(full); err == nil {
- ignoredDirs = append(ignoredDirs, fi)
- if Debug {
- log.Printf("Directory added to ignore list: %s", full)
- }
- } else if Debug {
- log.Printf("Error statting entry in .goimportsignore: %v", err)
- }
- }
-}
-
-func skipDir(fi os.FileInfo) bool {
- for _, ignoredDir := range ignoredDirs {
- if os.SameFile(fi, ignoredDir) {
- return true
- }
- }
- return false
-}
-
-// shouldTraverse reports whether the symlink fi should, found in dir,
-// should be followed. It makes sure symlinks were never visited
-// before to avoid symlink loops.
-func shouldTraverse(dir string, fi os.FileInfo) bool {
- path := filepath.Join(dir, fi.Name())
- target, err := filepath.EvalSymlinks(path)
- if err != nil {
- if !os.IsNotExist(err) {
- fmt.Fprintln(os.Stderr, err)
- }
- return false
- }
- ts, err := os.Stat(target)
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- return false
- }
- if !ts.IsDir() {
- return false
- }
- if skipDir(ts) {
- return false
- }
- // Check for symlink loops by statting each directory component
- // and seeing if any are the same file as ts.
- for {
- parent := filepath.Dir(path)
- if parent == path {
- // Made it to the root without seeing a cycle.
- // Use this symlink.
- return true
- }
- parentInfo, err := os.Stat(parent)
- if err != nil {
- return false
- }
- if os.SameFile(ts, parentInfo) {
- // Cycle. Don't traverse.
- return false
- }
- path = parent
- }
-
-}
-
-var testHookScanDir = func(dir string) {}
-
-var scanGoRootDone = make(chan struct{}) // closed when scanGoRoot is done
-
-func scanGoRoot() {
- go func() {
- scanGoDirs(true)
- close(scanGoRootDone)
- }()
-}
-
-func scanGoPath() { scanGoDirs(false) }
-
-func scanGoDirs(goRoot bool) {
- if Debug {
- which := "$GOROOT"
- if !goRoot {
- which = "$GOPATH"
- }
- log.Printf("scanning " + which)
- defer log.Printf("scanned " + which)
- }
- dirScanMu.Lock()
- if dirScan == nil {
- dirScan = make(map[string]*pkg)
- }
- dirScanMu.Unlock()
-
- for _, srcDir := range build.Default.SrcDirs() {
- isGoroot := srcDir == filepath.Join(build.Default.GOROOT, "src")
- if isGoroot != goRoot {
- continue
- }
- testHookScanDir(srcDir)
- walkFn := func(path string, typ os.FileMode) error {
- dir := filepath.Dir(path)
- if typ.IsRegular() {
- if dir == srcDir {
- // Doesn't make sense to have regular files
- // directly in your $GOPATH/src or $GOROOT/src.
- return nil
- }
- if !strings.HasSuffix(path, ".go") {
- return nil
- }
- dirScanMu.Lock()
- if _, dup := dirScan[dir]; !dup {
- importpath := filepath.ToSlash(dir[len(srcDir)+len("/"):])
- dirScan[dir] = &pkg{
- importPath: importpath,
- importPathShort: vendorlessImportPath(importpath),
- dir: dir,
- }
- }
- dirScanMu.Unlock()
- return nil
- }
- if typ == os.ModeDir {
- base := filepath.Base(path)
- if base == "" || base[0] == '.' || base[0] == '_' ||
- base == "testdata" || base == "node_modules" {
- return filepath.SkipDir
- }
- fi, err := os.Lstat(path)
- if err == nil && skipDir(fi) {
- if Debug {
- log.Printf("skipping directory %q under %s", fi.Name(), dir)
- }
- return filepath.SkipDir
- }
- return nil
- }
- if typ == os.ModeSymlink {
- base := filepath.Base(path)
- if strings.HasPrefix(base, ".#") {
- // Emacs noise.
- return nil
- }
- fi, err := os.Lstat(path)
- if err != nil {
- // Just ignore it.
- return nil
- }
- if shouldTraverse(dir, fi) {
- return traverseLink
- }
- }
- return nil
- }
- if err := fastWalk(srcDir, walkFn); err != nil {
- log.Printf("goimports: scanning directory %v: %v", srcDir, err)
- }
- }
-}
-
-// vendorlessImportPath returns the devendorized version of the provided import path.
-// e.g. "foo/bar/vendor/a/b" => "a/b"
-func vendorlessImportPath(ipath string) string {
- // Devendorize for use in import statement.
- if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 {
- return ipath[i+len("/vendor/"):]
- }
- if strings.HasPrefix(ipath, "vendor/") {
- return ipath[len("vendor/"):]
- }
- return ipath
-}
-
-// loadExports returns the set of exported symbols in the package at dir.
-// It returns nil on error or if the package name in dir does not match expectPackage.
-var loadExports func(expectPackage, dir string) map[string]bool = loadExportsGoPath
-
-func loadExportsGoPath(expectPackage, dir string) map[string]bool {
- if Debug {
- log.Printf("loading exports in dir %s (seeking package %s)", dir, expectPackage)
- }
- exports := make(map[string]bool)
-
- ctx := build.Default
-
- // ReadDir is like ioutil.ReadDir, but only returns *.go files
- // and filters out _test.go files since they're not relevant
- // and only slow things down.
- ctx.ReadDir = func(dir string) (notTests []os.FileInfo, err error) {
- all, err := ioutil.ReadDir(dir)
- if err != nil {
- return nil, err
- }
- notTests = all[:0]
- for _, fi := range all {
- name := fi.Name()
- if strings.HasSuffix(name, ".go") && !strings.HasSuffix(name, "_test.go") {
- notTests = append(notTests, fi)
- }
- }
- return notTests, nil
- }
-
- files, err := ctx.ReadDir(dir)
- if err != nil {
- log.Print(err)
- return nil
- }
-
- fset := token.NewFileSet()
-
- for _, fi := range files {
- match, err := ctx.MatchFile(dir, fi.Name())
- if err != nil || !match {
- continue
- }
- fullFile := filepath.Join(dir, fi.Name())
- f, err := parser.ParseFile(fset, fullFile, nil, 0)
- if err != nil {
- if Debug {
- log.Printf("Parsing %s: %v", fullFile, err)
- }
- return nil
- }
- pkgName := f.Name.Name
- if pkgName == "documentation" {
- // Special case from go/build.ImportDir, not
- // handled by ctx.MatchFile.
- continue
- }
- if pkgName != expectPackage {
- if Debug {
- log.Printf("scan of dir %v is not expected package %v (actually %v)", dir, expectPackage, pkgName)
- }
- return nil
- }
- for name := range f.Scope.Objects {
- if ast.IsExported(name) {
- exports[name] = true
- }
- }
- }
-
- if Debug {
- exportList := make([]string, 0, len(exports))
- for k := range exports {
- exportList = append(exportList, k)
- }
- sort.Strings(exportList)
- log.Printf("loaded exports in dir %v (package %v): %v", dir, expectPackage, strings.Join(exportList, ", "))
- }
- return exports
-}
-
-// findImport searches for a package with the given symbols.
-// If no package is found, findImport returns ("", false, nil)
-//
-// This is declared as a variable rather than a function so goimports
-// can be easily extended by adding a file with an init function.
-//
-// The rename value tells goimports whether to use the package name as
-// a local qualifier in an import. For example, if findImports("pkg",
-// "X") returns ("foo/bar", rename=true), then goimports adds the
-// import line:
-// import pkg "foo/bar"
-// to satisfy uses of pkg.X in the file.
-var findImport func(pkgName string, symbols map[string]bool, filename string) (foundPkg string, rename bool, err error) = findImportGoPath
-
-// findImportGoPath is the normal implementation of findImport.
-// (Some companies have their own internally.)
-func findImportGoPath(pkgName string, symbols map[string]bool, filename string) (foundPkg string, rename bool, err error) {
- if inTests {
- testMu.RLock()
- defer testMu.RUnlock()
- }
-
- // Fast path for the standard library.
- // In the common case we hopefully never have to scan the GOPATH, which can
- // be slow with moving disks.
- if pkg, rename, ok := findImportStdlib(pkgName, symbols); ok {
- return pkg, rename, nil
- }
- if pkgName == "rand" && symbols["Read"] {
- // Special-case rand.Read.
- //
- // If findImportStdlib didn't find it above, don't go
- // searching for it, lest it find and pick math/rand
- // in GOROOT (new as of Go 1.6)
- //
- // crypto/rand is the safer choice.
- return "", false, nil
- }
-
- // TODO(sameer): look at the import lines for other Go files in the
- // local directory, since the user is likely to import the same packages
- // in the current Go file. Return rename=true when the other Go files
- // use a renamed package that's also used in the current file.
-
- // Read all the $GOPATH/src/.goimportsignore files before scanning directories.
- populateIgnoreOnce.Do(populateIgnore)
-
- // Start scanning the $GOROOT asynchronously, then run the
- // GOPATH scan synchronously if needed, and then wait for the
- // $GOROOT to finish.
- //
- // TODO(bradfitz): run each $GOPATH entry async. But nobody
- // really has more than one anyway, so low priority.
- scanGoRootOnce.Do(scanGoRoot) // async
- if !fileInDir(filename, build.Default.GOROOT) {
- scanGoPathOnce.Do(scanGoPath) // blocking
- }
- <-scanGoRootDone
-
- // Find candidate packages, looking only at their directory names first.
- var candidates []*pkg
- for _, pkg := range dirScan {
- if pkgIsCandidate(filename, pkgName, pkg) {
- candidates = append(candidates, pkg)
- }
- }
-
- // Sort the candidates by their import package length,
- // assuming that shorter package names are better than long
- // ones. Note that this sorts by the de-vendored name, so
- // there's no "penalty" for vendoring.
- sort.Sort(byImportPathShortLength(candidates))
- if Debug {
- for i, pkg := range candidates {
- log.Printf("%s candidate %d/%d: %v in %v", pkgName, i+1, len(candidates), pkg.importPathShort, pkg.dir)
- }
- }
-
- // Collect exports for packages with matching names.
-
- done := make(chan struct{}) // closed when we find the answer
- defer close(done)
-
- rescv := make([]chan *pkg, len(candidates))
- for i := range candidates {
- rescv[i] = make(chan *pkg)
- }
- const maxConcurrentPackageImport = 4
- loadExportsSem := make(chan struct{}, maxConcurrentPackageImport)
-
- go func() {
- for i, pkg := range candidates {
- select {
- case loadExportsSem <- struct{}{}:
- select {
- case <-done:
- return
- default:
- }
- case <-done:
- return
- }
- pkg := pkg
- resc := rescv[i]
- go func() {
- if inTests {
- testMu.RLock()
- defer testMu.RUnlock()
- }
- defer func() { <-loadExportsSem }()
- exports := loadExports(pkgName, pkg.dir)
-
- // If it doesn't have the right
- // symbols, send nil to mean no match.
- for symbol := range symbols {
- if !exports[symbol] {
- pkg = nil
- break
- }
- }
- select {
- case resc <- pkg:
- case <-done:
- }
- }()
- }
- }()
- for _, resc := range rescv {
- pkg := <-resc
- if pkg == nil {
- continue
- }
- // If the package name in the source doesn't match the import path's base,
- // return true so the rewriter adds a name (import foo "github.com/bar/go-foo")
- needsRename := path.Base(pkg.importPath) != pkgName
- return pkg.importPathShort, needsRename, nil
- }
- return "", false, nil
-}
-
-// pkgIsCandidate reports whether pkg is a candidate for satisfying the
-// finding which package pkgIdent in the file named by filename is trying
-// to refer to.
-//
-// This check is purely lexical and is meant to be as fast as possible
-// because it's run over all $GOPATH directories to filter out poor
-// candidates in order to limit the CPU and I/O later parsing the
-// exports in candidate packages.
-//
-// filename is the file being formatted.
-// pkgIdent is the package being searched for, like "client" (if
-// searching for "client.New")
-func pkgIsCandidate(filename, pkgIdent string, pkg *pkg) bool {
- // Check "internal" and "vendor" visibility:
- if !canUse(filename, pkg.dir) {
- return false
- }
-
- // Speed optimization to minimize disk I/O:
- // the last two components on disk must contain the
- // package name somewhere.
- //
- // This permits mismatch naming like directory
- // "go-foo" being package "foo", or "pkg.v3" being "pkg",
- // or directory "google.golang.org/api/cloudbilling/v1"
- // being package "cloudbilling", but doesn't
- // permit a directory "foo" to be package
- // "bar", which is strongly discouraged
- // anyway. There's no reason goimports needs
- // to be slow just to accomodate that.
- lastTwo := lastTwoComponents(pkg.importPathShort)
- if strings.Contains(lastTwo, pkgIdent) {
- return true
- }
- if hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(pkgIdent) {
- lastTwo = lowerASCIIAndRemoveHyphen(lastTwo)
- if strings.Contains(lastTwo, pkgIdent) {
- return true
- }
- }
-
- return false
-}
-
-func hasHyphenOrUpperASCII(s string) bool {
- for i := 0; i < len(s); i++ {
- b := s[i]
- if b == '-' || ('A' <= b && b <= 'Z') {
- return true
- }
- }
- return false
-}
-
-func lowerASCIIAndRemoveHyphen(s string) (ret string) {
- buf := make([]byte, 0, len(s))
- for i := 0; i < len(s); i++ {
- b := s[i]
- switch {
- case b == '-':
- continue
- case 'A' <= b && b <= 'Z':
- buf = append(buf, b+('a'-'A'))
- default:
- buf = append(buf, b)
- }
- }
- return string(buf)
-}
-
-// canUse reports whether the package in dir is usable from filename,
-// respecting the Go "internal" and "vendor" visibility rules.
-func canUse(filename, dir string) bool {
- // Fast path check, before any allocations. If it doesn't contain vendor
- // or internal, it's not tricky:
- // Note that this can false-negative on directories like "notinternal",
- // but we check it correctly below. This is just a fast path.
- if !strings.Contains(dir, "vendor") && !strings.Contains(dir, "internal") {
- return true
- }
-
- dirSlash := filepath.ToSlash(dir)
- if !strings.Contains(dirSlash, "/vendor/") && !strings.Contains(dirSlash, "/internal/") && !strings.HasSuffix(dirSlash, "/internal") {
- return true
- }
- // Vendor or internal directory only visible from children of parent.
- // That means the path from the current directory to the target directory
- // can contain ../vendor or ../internal but not ../foo/vendor or ../foo/internal
- // or bar/vendor or bar/internal.
- // After stripping all the leading ../, the only okay place to see vendor or internal
- // is at the very beginning of the path.
- absfile, err := filepath.Abs(filename)
- if err != nil {
- return false
- }
- absdir, err := filepath.Abs(dir)
- if err != nil {
- return false
- }
- rel, err := filepath.Rel(absfile, absdir)
- if err != nil {
- return false
- }
- relSlash := filepath.ToSlash(rel)
- if i := strings.LastIndex(relSlash, "../"); i >= 0 {
- relSlash = relSlash[i+len("../"):]
- }
- return !strings.Contains(relSlash, "/vendor/") && !strings.Contains(relSlash, "/internal/") && !strings.HasSuffix(relSlash, "/internal")
-}
-
-// lastTwoComponents returns at most the last two path components
-// of v, using either / or \ as the path separator.
-func lastTwoComponents(v string) string {
- nslash := 0
- for i := len(v) - 1; i >= 0; i-- {
- if v[i] == '/' || v[i] == '\\' {
- nslash++
- if nslash == 2 {
- return v[i:]
- }
- }
- }
- return v
-}
-
-type visitFn func(node ast.Node) ast.Visitor
-
-func (fn visitFn) Visit(node ast.Node) ast.Visitor {
- return fn(node)
-}
-
-func findImportStdlib(shortPkg string, symbols map[string]bool) (importPath string, rename, ok bool) {
- for symbol := range symbols {
- key := shortPkg + "." + symbol
- path := stdlib[key]
- if path == "" {
- if key == "rand.Read" {
- continue
- }
- return "", false, false
- }
- if importPath != "" && importPath != path {
- // Ambiguous. Symbols pointed to different things.
- return "", false, false
- }
- importPath = path
- }
- if importPath == "" && shortPkg == "rand" && symbols["Read"] {
- return "crypto/rand", false, true
- }
- return importPath, false, importPath != ""
-}
-
-// fileInDir reports whether the provided file path looks like
-// it's in dir. (without hitting the filesystem)
-func fileInDir(file, dir string) bool {
- rest := strings.TrimPrefix(file, dir)
- if len(rest) == len(file) {
- // dir is not a prefix of file.
- return false
- }
- // Check for boundary: either nothing (file == dir), or a slash.
- return len(rest) == 0 || rest[0] == '/' || rest[0] == '\\'
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/imports.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/imports.go
deleted file mode 100644
index 67573f497..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/imports.go
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run mkstdlib.go
-
-// Package imports implements a Go pretty-printer (like package "go/format")
-// that also adds or removes import statements as necessary.
-package imports // import "golang.org/x/tools/imports"
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/ast"
- "go/format"
- "go/parser"
- "go/printer"
- "go/token"
- "io"
- "regexp"
- "strconv"
- "strings"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-// Options specifies options for processing files.
-type Options struct {
- Fragment bool // Accept fragment of a source file (no package statement)
- AllErrors bool // Report all errors (not just the first 10 on different lines)
-
- Comments bool // Print comments (true if nil *Options provided)
- TabIndent bool // Use tabs for indent (true if nil *Options provided)
- TabWidth int // Tab width (8 if nil *Options provided)
-
- FormatOnly bool // Disable the insertion and deletion of imports
-}
-
-// Process formats and adjusts imports for the provided file.
-// If opt is nil the defaults are used.
-//
-// Note that filename's directory influences which imports can be chosen,
-// so it is important that filename be accurate.
-// To process data ``as if'' it were in filename, pass the data as a non-nil src.
-func Process(filename string, src []byte, opt *Options) ([]byte, error) {
- if opt == nil {
- opt = &Options{Comments: true, TabIndent: true, TabWidth: 8}
- }
-
- fileSet := token.NewFileSet()
- file, adjust, err := parse(fileSet, filename, src, opt)
- if err != nil {
- return nil, err
- }
-
- if !opt.FormatOnly {
- _, err = fixImports(fileSet, file, filename)
- if err != nil {
- return nil, err
- }
- }
-
- sortImports(fileSet, file)
- imps := astutil.Imports(fileSet, file)
-
- var spacesBefore []string // import paths we need spaces before
- for _, impSection := range imps {
- // Within each block of contiguous imports, see if any
- // import lines are in different group numbers. If so,
- // we'll need to put a space between them so it's
- // compatible with gofmt.
- lastGroup := -1
- for _, importSpec := range impSection {
- importPath, _ := strconv.Unquote(importSpec.Path.Value)
- groupNum := importGroup(importPath)
- if groupNum != lastGroup && lastGroup != -1 {
- spacesBefore = append(spacesBefore, importPath)
- }
- lastGroup = groupNum
- }
-
- }
-
- printerMode := printer.UseSpaces
- if opt.TabIndent {
- printerMode |= printer.TabIndent
- }
- printConfig := &printer.Config{Mode: printerMode, Tabwidth: opt.TabWidth}
-
- var buf bytes.Buffer
- err = printConfig.Fprint(&buf, fileSet, file)
- if err != nil {
- return nil, err
- }
- out := buf.Bytes()
- if adjust != nil {
- out = adjust(src, out)
- }
- if len(spacesBefore) > 0 {
- out = addImportSpaces(bytes.NewReader(out), spacesBefore)
- }
-
- out, err = format.Source(out)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-// parse parses src, which was read from filename,
-// as a Go source file or statement list.
-func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) {
- parserMode := parser.Mode(0)
- if opt.Comments {
- parserMode |= parser.ParseComments
- }
- if opt.AllErrors {
- parserMode |= parser.AllErrors
- }
-
- // Try as whole source file.
- file, err := parser.ParseFile(fset, filename, src, parserMode)
- if err == nil {
- return file, nil, nil
- }
- // If the error is that the source file didn't begin with a
- // package line and we accept fragmented input, fall through to
- // try as a source fragment. Stop and return on any other error.
- if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") {
- return nil, nil, err
- }
-
- // If this is a declaration list, make it a source file
- // by inserting a package clause.
- // Insert using a ;, not a newline, so that the line numbers
- // in psrc match the ones in src.
- psrc := append([]byte("package main;"), src...)
- file, err = parser.ParseFile(fset, filename, psrc, parserMode)
- if err == nil {
- // If a main function exists, we will assume this is a main
- // package and leave the file.
- if containsMainFunc(file) {
- return file, nil, nil
- }
-
- adjust := func(orig, src []byte) []byte {
- // Remove the package clause.
- // Gofmt has turned the ; into a \n.
- src = src[len("package main\n"):]
- return matchSpace(orig, src)
- }
- return file, adjust, nil
- }
- // If the error is that the source file didn't begin with a
- // declaration, fall through to try as a statement list.
- // Stop and return on any other error.
- if !strings.Contains(err.Error(), "expected declaration") {
- return nil, nil, err
- }
-
- // If this is a statement list, make it a source file
- // by inserting a package clause and turning the list
- // into a function body. This handles expressions too.
- // Insert using a ;, not a newline, so that the line numbers
- // in fsrc match the ones in src.
- fsrc := append(append([]byte("package p; func _() {"), src...), '}')
- file, err = parser.ParseFile(fset, filename, fsrc, parserMode)
- if err == nil {
- adjust := func(orig, src []byte) []byte {
- // Remove the wrapping.
- // Gofmt has turned the ; into a \n\n.
- src = src[len("package p\n\nfunc _() {"):]
- src = src[:len(src)-len("}\n")]
- // Gofmt has also indented the function body one level.
- // Remove that indent.
- src = bytes.Replace(src, []byte("\n\t"), []byte("\n"), -1)
- return matchSpace(orig, src)
- }
- return file, adjust, nil
- }
-
- // Failed, and out of options.
- return nil, nil, err
-}
-
-// containsMainFunc checks if a file contains a function declaration with the
-// function signature 'func main()'
-func containsMainFunc(file *ast.File) bool {
- for _, decl := range file.Decls {
- if f, ok := decl.(*ast.FuncDecl); ok {
- if f.Name.Name != "main" {
- continue
- }
-
- if len(f.Type.Params.List) != 0 {
- continue
- }
-
- if f.Type.Results != nil && len(f.Type.Results.List) != 0 {
- continue
- }
-
- return true
- }
- }
-
- return false
-}
-
-func cutSpace(b []byte) (before, middle, after []byte) {
- i := 0
- for i < len(b) && (b[i] == ' ' || b[i] == '\t' || b[i] == '\n') {
- i++
- }
- j := len(b)
- for j > 0 && (b[j-1] == ' ' || b[j-1] == '\t' || b[j-1] == '\n') {
- j--
- }
- if i <= j {
- return b[:i], b[i:j], b[j:]
- }
- return nil, nil, b[j:]
-}
-
-// matchSpace reformats src to use the same space context as orig.
-// 1) If orig begins with blank lines, matchSpace inserts them at the beginning of src.
-// 2) matchSpace copies the indentation of the first non-blank line in orig
-// to every non-blank line in src.
-// 3) matchSpace copies the trailing space from orig and uses it in place
-// of src's trailing space.
-func matchSpace(orig []byte, src []byte) []byte {
- before, _, after := cutSpace(orig)
- i := bytes.LastIndex(before, []byte{'\n'})
- before, indent := before[:i+1], before[i+1:]
-
- _, src, _ = cutSpace(src)
-
- var b bytes.Buffer
- b.Write(before)
- for len(src) > 0 {
- line := src
- if i := bytes.IndexByte(line, '\n'); i >= 0 {
- line, src = line[:i+1], line[i+1:]
- } else {
- src = nil
- }
- if len(line) > 0 && line[0] != '\n' { // not blank
- b.Write(indent)
- }
- b.Write(line)
- }
- b.Write(after)
- return b.Bytes()
-}
-
-var impLine = regexp.MustCompile(`^\s+(?:[\w\.]+\s+)?"(.+)"`)
-
-func addImportSpaces(r io.Reader, breaks []string) []byte {
- var out bytes.Buffer
- sc := bufio.NewScanner(r)
- inImports := false
- done := false
- for sc.Scan() {
- s := sc.Text()
-
- if !inImports && !done && strings.HasPrefix(s, "import") {
- inImports = true
- }
- if inImports && (strings.HasPrefix(s, "var") ||
- strings.HasPrefix(s, "func") ||
- strings.HasPrefix(s, "const") ||
- strings.HasPrefix(s, "type")) {
- done = true
- inImports = false
- }
- if inImports && len(breaks) > 0 {
- if m := impLine.FindStringSubmatch(s); m != nil {
- if m[1] == breaks[0] {
- out.WriteByte('\n')
- breaks = breaks[1:]
- }
- }
- }
-
- fmt.Fprintln(&out, s)
- }
- return out.Bytes()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/mkindex.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/mkindex.go
deleted file mode 100644
index 755e2394f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/mkindex.go
+++ /dev/null
@@ -1,173 +0,0 @@
-// +build ignore
-
-// 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.
-
-// Command mkindex creates the file "pkgindex.go" containing an index of the Go
-// standard library. The file is intended to be built as part of the imports
-// package, so that the package may be used in environments where a GOROOT is
-// not available (such as App Engine).
-package main
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/build"
- "go/format"
- "go/parser"
- "go/token"
- "io/ioutil"
- "log"
- "os"
- "path"
- "path/filepath"
- "strings"
-)
-
-var (
- pkgIndex = make(map[string][]pkg)
- exports = make(map[string]map[string]bool)
-)
-
-func main() {
- // Don't use GOPATH.
- ctx := build.Default
- ctx.GOPATH = ""
-
- // Populate pkgIndex global from GOROOT.
- for _, path := range ctx.SrcDirs() {
- f, err := os.Open(path)
- if err != nil {
- log.Print(err)
- continue
- }
- children, err := f.Readdir(-1)
- f.Close()
- if err != nil {
- log.Print(err)
- continue
- }
- for _, child := range children {
- if child.IsDir() {
- loadPkg(path, child.Name())
- }
- }
- }
- // Populate exports global.
- for _, ps := range pkgIndex {
- for _, p := range ps {
- e := loadExports(p.dir)
- if e != nil {
- exports[p.dir] = e
- }
- }
- }
-
- // Construct source file.
- var buf bytes.Buffer
- fmt.Fprint(&buf, pkgIndexHead)
- fmt.Fprintf(&buf, "var pkgIndexMaster = %#v\n", pkgIndex)
- fmt.Fprintf(&buf, "var exportsMaster = %#v\n", exports)
- src := buf.Bytes()
-
- // Replace main.pkg type name with pkg.
- src = bytes.Replace(src, []byte("main.pkg"), []byte("pkg"), -1)
- // Replace actual GOROOT with "/go".
- src = bytes.Replace(src, []byte(ctx.GOROOT), []byte("/go"), -1)
- // Add some line wrapping.
- src = bytes.Replace(src, []byte("}, "), []byte("},\n"), -1)
- src = bytes.Replace(src, []byte("true, "), []byte("true,\n"), -1)
-
- var err error
- src, err = format.Source(src)
- if err != nil {
- log.Fatal(err)
- }
-
- // Write out source file.
- err = ioutil.WriteFile("pkgindex.go", src, 0644)
- if err != nil {
- log.Fatal(err)
- }
-}
-
-const pkgIndexHead = `package imports
-
-func init() {
- pkgIndexOnce.Do(func() {
- pkgIndex.m = pkgIndexMaster
- })
- loadExports = func(dir string) map[string]bool {
- return exportsMaster[dir]
- }
-}
-`
-
-type pkg struct {
- importpath string // full pkg import path, e.g. "net/http"
- dir string // absolute file path to pkg directory e.g. "/usr/lib/go/src/fmt"
-}
-
-var fset = token.NewFileSet()
-
-func loadPkg(root, importpath string) {
- shortName := path.Base(importpath)
- if shortName == "testdata" {
- return
- }
-
- dir := filepath.Join(root, importpath)
- pkgIndex[shortName] = append(pkgIndex[shortName], pkg{
- importpath: importpath,
- dir: dir,
- })
-
- pkgDir, err := os.Open(dir)
- if err != nil {
- return
- }
- children, err := pkgDir.Readdir(-1)
- pkgDir.Close()
- if err != nil {
- return
- }
- for _, child := range children {
- name := child.Name()
- if name == "" {
- continue
- }
- if c := name[0]; c == '.' || ('0' <= c && c <= '9') {
- continue
- }
- if child.IsDir() {
- loadPkg(root, filepath.Join(importpath, name))
- }
- }
-}
-
-func loadExports(dir string) map[string]bool {
- exports := make(map[string]bool)
- buildPkg, err := build.ImportDir(dir, 0)
- if err != nil {
- if strings.Contains(err.Error(), "no buildable Go source files in") {
- return nil
- }
- log.Printf("could not import %q: %v", dir, err)
- return nil
- }
- for _, file := range buildPkg.GoFiles {
- f, err := parser.ParseFile(fset, filepath.Join(dir, file), nil, 0)
- if err != nil {
- log.Printf("could not parse %q: %v", file, err)
- continue
- }
- for name := range f.Scope.Objects {
- if ast.IsExported(name) {
- exports[name] = true
- }
- }
- }
- return exports
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/mkstdlib.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/mkstdlib.go
deleted file mode 100644
index 6e6e1d6dc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/mkstdlib.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// +build ignore
-
-// mkstdlib generates the zstdlib.go file, containing the Go standard
-// library API symbols. It's baked into the binary to avoid scanning
-// GOPATH in the common case.
-package main
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "go/format"
- "io"
- "io/ioutil"
- "log"
- "os"
- "path"
- "path/filepath"
- "regexp"
- "sort"
- "strings"
-)
-
-func mustOpen(name string) io.Reader {
- f, err := os.Open(name)
- if err != nil {
- log.Fatal(err)
- }
- return f
-}
-
-func api(base string) string {
- return filepath.Join(os.Getenv("GOROOT"), "api", base)
-}
-
-var sym = regexp.MustCompile(`^pkg (\S+).*?, (?:var|func|type|const) ([A-Z]\w*)`)
-
-func main() {
- var buf bytes.Buffer
- outf := func(format string, args ...interface{}) {
- fmt.Fprintf(&buf, format, args...)
- }
- outf("// Code generated by mkstdlib.go. DO NOT EDIT.\n\n")
- outf("package imports\n")
- outf("var stdlib = map[string]string{\n")
- f := io.MultiReader(
- mustOpen(api("go1.txt")),
- mustOpen(api("go1.1.txt")),
- mustOpen(api("go1.2.txt")),
- mustOpen(api("go1.3.txt")),
- mustOpen(api("go1.4.txt")),
- mustOpen(api("go1.5.txt")),
- mustOpen(api("go1.6.txt")),
- mustOpen(api("go1.7.txt")),
- mustOpen(api("go1.8.txt")),
- mustOpen(api("go1.9.txt")),
- )
- sc := bufio.NewScanner(f)
- fullImport := map[string]string{} // "zip.NewReader" => "archive/zip"
- ambiguous := map[string]bool{}
- var keys []string
- for sc.Scan() {
- l := sc.Text()
- has := func(v string) bool { return strings.Contains(l, v) }
- if has("struct, ") || has("interface, ") || has(", method (") {
- continue
- }
- if m := sym.FindStringSubmatch(l); m != nil {
- full := m[1]
- key := path.Base(full) + "." + m[2]
- if exist, ok := fullImport[key]; ok {
- if exist != full {
- ambiguous[key] = true
- }
- } else {
- fullImport[key] = full
- keys = append(keys, key)
- }
- }
- }
- if err := sc.Err(); err != nil {
- log.Fatal(err)
- }
- sort.Strings(keys)
- for _, key := range keys {
- if ambiguous[key] {
- outf("\t// %q is ambiguous\n", key)
- } else {
- outf("\t%q: %q,\n", key, fullImport[key])
- }
- }
- outf("\n")
- for _, sym := range [...]string{"Alignof", "ArbitraryType", "Offsetof", "Pointer", "Sizeof"} {
- outf("\t%q: %q,\n", "unsafe."+sym, "unsafe")
- }
- outf("}\n")
- fmtbuf, err := format.Source(buf.Bytes())
- if err != nil {
- log.Fatal(err)
- }
- err = ioutil.WriteFile("zstdlib.go", fmtbuf, 0666)
- if err != nil {
- log.Fatal(err)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/sortimports.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/sortimports.go
deleted file mode 100644
index 653afc517..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/sortimports.go
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Hacked up copy of go/ast/import.go
-
-package imports
-
-import (
- "go/ast"
- "go/token"
- "sort"
- "strconv"
-)
-
-// sortImports sorts runs of consecutive import lines in import blocks in f.
-// It also removes duplicate imports when it is possible to do so without data loss.
-func sortImports(fset *token.FileSet, f *ast.File) {
- for i, d := range f.Decls {
- d, ok := d.(*ast.GenDecl)
- if !ok || d.Tok != token.IMPORT {
- // Not an import declaration, so we're done.
- // Imports are always first.
- break
- }
-
- if len(d.Specs) == 0 {
- // Empty import block, remove it.
- f.Decls = append(f.Decls[:i], f.Decls[i+1:]...)
- }
-
- if !d.Lparen.IsValid() {
- // Not a block: sorted by default.
- continue
- }
-
- // Identify and sort runs of specs on successive lines.
- i := 0
- specs := d.Specs[:0]
- for j, s := range d.Specs {
- if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line {
- // j begins a new run. End this one.
- specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...)
- i = j
- }
- }
- specs = append(specs, sortSpecs(fset, f, d.Specs[i:])...)
- d.Specs = specs
-
- // Deduping can leave a blank line before the rparen; clean that up.
- if len(d.Specs) > 0 {
- lastSpec := d.Specs[len(d.Specs)-1]
- lastLine := fset.Position(lastSpec.Pos()).Line
- if rParenLine := fset.Position(d.Rparen).Line; rParenLine > lastLine+1 {
- fset.File(d.Rparen).MergeLine(rParenLine - 1)
- }
- }
- }
-}
-
-func importPath(s ast.Spec) string {
- t, err := strconv.Unquote(s.(*ast.ImportSpec).Path.Value)
- if err == nil {
- return t
- }
- return ""
-}
-
-func importName(s ast.Spec) string {
- n := s.(*ast.ImportSpec).Name
- if n == nil {
- return ""
- }
- return n.Name
-}
-
-func importComment(s ast.Spec) string {
- c := s.(*ast.ImportSpec).Comment
- if c == nil {
- return ""
- }
- return c.Text()
-}
-
-// collapse indicates whether prev may be removed, leaving only next.
-func collapse(prev, next ast.Spec) bool {
- if importPath(next) != importPath(prev) || importName(next) != importName(prev) {
- return false
- }
- return prev.(*ast.ImportSpec).Comment == nil
-}
-
-type posSpan struct {
- Start token.Pos
- End token.Pos
-}
-
-func sortSpecs(fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec {
- // Can't short-circuit here even if specs are already sorted,
- // since they might yet need deduplication.
- // A lone import, however, may be safely ignored.
- if len(specs) <= 1 {
- return specs
- }
-
- // Record positions for specs.
- pos := make([]posSpan, len(specs))
- for i, s := range specs {
- pos[i] = posSpan{s.Pos(), s.End()}
- }
-
- // Identify comments in this range.
- // Any comment from pos[0].Start to the final line counts.
- lastLine := fset.Position(pos[len(pos)-1].End).Line
- cstart := len(f.Comments)
- cend := len(f.Comments)
- for i, g := range f.Comments {
- if g.Pos() < pos[0].Start {
- continue
- }
- if i < cstart {
- cstart = i
- }
- if fset.Position(g.End()).Line > lastLine {
- cend = i
- break
- }
- }
- comments := f.Comments[cstart:cend]
-
- // Assign each comment to the import spec preceding it.
- importComment := map[*ast.ImportSpec][]*ast.CommentGroup{}
- specIndex := 0
- for _, g := range comments {
- for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() {
- specIndex++
- }
- s := specs[specIndex].(*ast.ImportSpec)
- importComment[s] = append(importComment[s], g)
- }
-
- // Sort the import specs by import path.
- // Remove duplicates, when possible without data loss.
- // Reassign the import paths to have the same position sequence.
- // Reassign each comment to abut the end of its spec.
- // Sort the comments by new position.
- sort.Sort(byImportSpec(specs))
-
- // Dedup. Thanks to our sorting, we can just consider
- // adjacent pairs of imports.
- deduped := specs[:0]
- for i, s := range specs {
- if i == len(specs)-1 || !collapse(s, specs[i+1]) {
- deduped = append(deduped, s)
- } else {
- p := s.Pos()
- fset.File(p).MergeLine(fset.Position(p).Line)
- }
- }
- specs = deduped
-
- // Fix up comment positions
- for i, s := range specs {
- s := s.(*ast.ImportSpec)
- if s.Name != nil {
- s.Name.NamePos = pos[i].Start
- }
- s.Path.ValuePos = pos[i].Start
- s.EndPos = pos[i].End
- for _, g := range importComment[s] {
- for _, c := range g.List {
- c.Slash = pos[i].End
- }
- }
- }
-
- sort.Sort(byCommentPos(comments))
-
- return specs
-}
-
-type byImportSpec []ast.Spec // slice of *ast.ImportSpec
-
-func (x byImportSpec) Len() int { return len(x) }
-func (x byImportSpec) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x byImportSpec) Less(i, j int) bool {
- ipath := importPath(x[i])
- jpath := importPath(x[j])
-
- igroup := importGroup(ipath)
- jgroup := importGroup(jpath)
- if igroup != jgroup {
- return igroup < jgroup
- }
-
- if ipath != jpath {
- return ipath < jpath
- }
- iname := importName(x[i])
- jname := importName(x[j])
-
- if iname != jname {
- return iname < jname
- }
- return importComment(x[i]) < importComment(x[j])
-}
-
-type byCommentPos []*ast.CommentGroup
-
-func (x byCommentPos) Len() int { return len(x) }
-func (x byCommentPos) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x byCommentPos) Less(i, j int) bool { return x[i].Pos() < x[j].Pos() }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/zstdlib.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/zstdlib.go
deleted file mode 100644
index 974c2d040..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/imports/zstdlib.go
+++ /dev/null
@@ -1,9448 +0,0 @@
-// Code generated by mkstdlib.go. DO NOT EDIT.
-
-package imports
-
-var stdlib = map[string]string{
- "adler32.Checksum": "hash/adler32",
- "adler32.New": "hash/adler32",
- "adler32.Size": "hash/adler32",
- "aes.BlockSize": "crypto/aes",
- "aes.KeySizeError": "crypto/aes",
- "aes.NewCipher": "crypto/aes",
- "ascii85.CorruptInputError": "encoding/ascii85",
- "ascii85.Decode": "encoding/ascii85",
- "ascii85.Encode": "encoding/ascii85",
- "ascii85.MaxEncodedLen": "encoding/ascii85",
- "ascii85.NewDecoder": "encoding/ascii85",
- "ascii85.NewEncoder": "encoding/ascii85",
- "asn1.BitString": "encoding/asn1",
- "asn1.ClassApplication": "encoding/asn1",
- "asn1.ClassContextSpecific": "encoding/asn1",
- "asn1.ClassPrivate": "encoding/asn1",
- "asn1.ClassUniversal": "encoding/asn1",
- "asn1.Enumerated": "encoding/asn1",
- "asn1.Flag": "encoding/asn1",
- "asn1.Marshal": "encoding/asn1",
- "asn1.NullBytes": "encoding/asn1",
- "asn1.NullRawValue": "encoding/asn1",
- "asn1.ObjectIdentifier": "encoding/asn1",
- "asn1.RawContent": "encoding/asn1",
- "asn1.RawValue": "encoding/asn1",
- "asn1.StructuralError": "encoding/asn1",
- "asn1.SyntaxError": "encoding/asn1",
- "asn1.TagBitString": "encoding/asn1",
- "asn1.TagBoolean": "encoding/asn1",
- "asn1.TagEnum": "encoding/asn1",
- "asn1.TagGeneralString": "encoding/asn1",
- "asn1.TagGeneralizedTime": "encoding/asn1",
- "asn1.TagIA5String": "encoding/asn1",
- "asn1.TagInteger": "encoding/asn1",
- "asn1.TagNull": "encoding/asn1",
- "asn1.TagOID": "encoding/asn1",
- "asn1.TagOctetString": "encoding/asn1",
- "asn1.TagPrintableString": "encoding/asn1",
- "asn1.TagSequence": "encoding/asn1",
- "asn1.TagSet": "encoding/asn1",
- "asn1.TagT61String": "encoding/asn1",
- "asn1.TagUTCTime": "encoding/asn1",
- "asn1.TagUTF8String": "encoding/asn1",
- "asn1.Unmarshal": "encoding/asn1",
- "asn1.UnmarshalWithParams": "encoding/asn1",
- "ast.ArrayType": "go/ast",
- "ast.AssignStmt": "go/ast",
- "ast.Bad": "go/ast",
- "ast.BadDecl": "go/ast",
- "ast.BadExpr": "go/ast",
- "ast.BadStmt": "go/ast",
- "ast.BasicLit": "go/ast",
- "ast.BinaryExpr": "go/ast",
- "ast.BlockStmt": "go/ast",
- "ast.BranchStmt": "go/ast",
- "ast.CallExpr": "go/ast",
- "ast.CaseClause": "go/ast",
- "ast.ChanDir": "go/ast",
- "ast.ChanType": "go/ast",
- "ast.CommClause": "go/ast",
- "ast.Comment": "go/ast",
- "ast.CommentGroup": "go/ast",
- "ast.CommentMap": "go/ast",
- "ast.CompositeLit": "go/ast",
- "ast.Con": "go/ast",
- "ast.DeclStmt": "go/ast",
- "ast.DeferStmt": "go/ast",
- "ast.Ellipsis": "go/ast",
- "ast.EmptyStmt": "go/ast",
- "ast.ExprStmt": "go/ast",
- "ast.Field": "go/ast",
- "ast.FieldFilter": "go/ast",
- "ast.FieldList": "go/ast",
- "ast.File": "go/ast",
- "ast.FileExports": "go/ast",
- "ast.Filter": "go/ast",
- "ast.FilterDecl": "go/ast",
- "ast.FilterFile": "go/ast",
- "ast.FilterFuncDuplicates": "go/ast",
- "ast.FilterImportDuplicates": "go/ast",
- "ast.FilterPackage": "go/ast",
- "ast.FilterUnassociatedComments": "go/ast",
- "ast.ForStmt": "go/ast",
- "ast.Fprint": "go/ast",
- "ast.Fun": "go/ast",
- "ast.FuncDecl": "go/ast",
- "ast.FuncLit": "go/ast",
- "ast.FuncType": "go/ast",
- "ast.GenDecl": "go/ast",
- "ast.GoStmt": "go/ast",
- "ast.Ident": "go/ast",
- "ast.IfStmt": "go/ast",
- "ast.ImportSpec": "go/ast",
- "ast.Importer": "go/ast",
- "ast.IncDecStmt": "go/ast",
- "ast.IndexExpr": "go/ast",
- "ast.Inspect": "go/ast",
- "ast.InterfaceType": "go/ast",
- "ast.IsExported": "go/ast",
- "ast.KeyValueExpr": "go/ast",
- "ast.LabeledStmt": "go/ast",
- "ast.Lbl": "go/ast",
- "ast.MapType": "go/ast",
- "ast.MergeMode": "go/ast",
- "ast.MergePackageFiles": "go/ast",
- "ast.NewCommentMap": "go/ast",
- "ast.NewIdent": "go/ast",
- "ast.NewObj": "go/ast",
- "ast.NewPackage": "go/ast",
- "ast.NewScope": "go/ast",
- "ast.Node": "go/ast",
- "ast.NotNilFilter": "go/ast",
- "ast.ObjKind": "go/ast",
- "ast.Object": "go/ast",
- "ast.Package": "go/ast",
- "ast.PackageExports": "go/ast",
- "ast.ParenExpr": "go/ast",
- "ast.Pkg": "go/ast",
- "ast.Print": "go/ast",
- "ast.RECV": "go/ast",
- "ast.RangeStmt": "go/ast",
- "ast.ReturnStmt": "go/ast",
- "ast.SEND": "go/ast",
- "ast.Scope": "go/ast",
- "ast.SelectStmt": "go/ast",
- "ast.SelectorExpr": "go/ast",
- "ast.SendStmt": "go/ast",
- "ast.SliceExpr": "go/ast",
- "ast.SortImports": "go/ast",
- "ast.StarExpr": "go/ast",
- "ast.StructType": "go/ast",
- "ast.SwitchStmt": "go/ast",
- "ast.Typ": "go/ast",
- "ast.TypeAssertExpr": "go/ast",
- "ast.TypeSpec": "go/ast",
- "ast.TypeSwitchStmt": "go/ast",
- "ast.UnaryExpr": "go/ast",
- "ast.ValueSpec": "go/ast",
- "ast.Var": "go/ast",
- "ast.Visitor": "go/ast",
- "ast.Walk": "go/ast",
- "atomic.AddInt32": "sync/atomic",
- "atomic.AddInt64": "sync/atomic",
- "atomic.AddUint32": "sync/atomic",
- "atomic.AddUint64": "sync/atomic",
- "atomic.AddUintptr": "sync/atomic",
- "atomic.CompareAndSwapInt32": "sync/atomic",
- "atomic.CompareAndSwapInt64": "sync/atomic",
- "atomic.CompareAndSwapPointer": "sync/atomic",
- "atomic.CompareAndSwapUint32": "sync/atomic",
- "atomic.CompareAndSwapUint64": "sync/atomic",
- "atomic.CompareAndSwapUintptr": "sync/atomic",
- "atomic.LoadInt32": "sync/atomic",
- "atomic.LoadInt64": "sync/atomic",
- "atomic.LoadPointer": "sync/atomic",
- "atomic.LoadUint32": "sync/atomic",
- "atomic.LoadUint64": "sync/atomic",
- "atomic.LoadUintptr": "sync/atomic",
- "atomic.StoreInt32": "sync/atomic",
- "atomic.StoreInt64": "sync/atomic",
- "atomic.StorePointer": "sync/atomic",
- "atomic.StoreUint32": "sync/atomic",
- "atomic.StoreUint64": "sync/atomic",
- "atomic.StoreUintptr": "sync/atomic",
- "atomic.SwapInt32": "sync/atomic",
- "atomic.SwapInt64": "sync/atomic",
- "atomic.SwapPointer": "sync/atomic",
- "atomic.SwapUint32": "sync/atomic",
- "atomic.SwapUint64": "sync/atomic",
- "atomic.SwapUintptr": "sync/atomic",
- "atomic.Value": "sync/atomic",
- "base32.CorruptInputError": "encoding/base32",
- "base32.Encoding": "encoding/base32",
- "base32.HexEncoding": "encoding/base32",
- "base32.NewDecoder": "encoding/base32",
- "base32.NewEncoder": "encoding/base32",
- "base32.NewEncoding": "encoding/base32",
- "base32.NoPadding": "encoding/base32",
- "base32.StdEncoding": "encoding/base32",
- "base32.StdPadding": "encoding/base32",
- "base64.CorruptInputError": "encoding/base64",
- "base64.Encoding": "encoding/base64",
- "base64.NewDecoder": "encoding/base64",
- "base64.NewEncoder": "encoding/base64",
- "base64.NewEncoding": "encoding/base64",
- "base64.NoPadding": "encoding/base64",
- "base64.RawStdEncoding": "encoding/base64",
- "base64.RawURLEncoding": "encoding/base64",
- "base64.StdEncoding": "encoding/base64",
- "base64.StdPadding": "encoding/base64",
- "base64.URLEncoding": "encoding/base64",
- "big.Above": "math/big",
- "big.Accuracy": "math/big",
- "big.AwayFromZero": "math/big",
- "big.Below": "math/big",
- "big.ErrNaN": "math/big",
- "big.Exact": "math/big",
- "big.Float": "math/big",
- "big.Int": "math/big",
- "big.Jacobi": "math/big",
- "big.MaxBase": "math/big",
- "big.MaxExp": "math/big",
- "big.MaxPrec": "math/big",
- "big.MinExp": "math/big",
- "big.NewFloat": "math/big",
- "big.NewInt": "math/big",
- "big.NewRat": "math/big",
- "big.ParseFloat": "math/big",
- "big.Rat": "math/big",
- "big.RoundingMode": "math/big",
- "big.ToNearestAway": "math/big",
- "big.ToNearestEven": "math/big",
- "big.ToNegativeInf": "math/big",
- "big.ToPositiveInf": "math/big",
- "big.ToZero": "math/big",
- "big.Word": "math/big",
- "binary.BigEndian": "encoding/binary",
- "binary.ByteOrder": "encoding/binary",
- "binary.LittleEndian": "encoding/binary",
- "binary.MaxVarintLen16": "encoding/binary",
- "binary.MaxVarintLen32": "encoding/binary",
- "binary.MaxVarintLen64": "encoding/binary",
- "binary.PutUvarint": "encoding/binary",
- "binary.PutVarint": "encoding/binary",
- "binary.Read": "encoding/binary",
- "binary.ReadUvarint": "encoding/binary",
- "binary.ReadVarint": "encoding/binary",
- "binary.Size": "encoding/binary",
- "binary.Uvarint": "encoding/binary",
- "binary.Varint": "encoding/binary",
- "binary.Write": "encoding/binary",
- "bits.LeadingZeros": "math/bits",
- "bits.LeadingZeros16": "math/bits",
- "bits.LeadingZeros32": "math/bits",
- "bits.LeadingZeros64": "math/bits",
- "bits.LeadingZeros8": "math/bits",
- "bits.Len": "math/bits",
- "bits.Len16": "math/bits",
- "bits.Len32": "math/bits",
- "bits.Len64": "math/bits",
- "bits.Len8": "math/bits",
- "bits.OnesCount": "math/bits",
- "bits.OnesCount16": "math/bits",
- "bits.OnesCount32": "math/bits",
- "bits.OnesCount64": "math/bits",
- "bits.OnesCount8": "math/bits",
- "bits.Reverse": "math/bits",
- "bits.Reverse16": "math/bits",
- "bits.Reverse32": "math/bits",
- "bits.Reverse64": "math/bits",
- "bits.Reverse8": "math/bits",
- "bits.ReverseBytes": "math/bits",
- "bits.ReverseBytes16": "math/bits",
- "bits.ReverseBytes32": "math/bits",
- "bits.ReverseBytes64": "math/bits",
- "bits.RotateLeft": "math/bits",
- "bits.RotateLeft16": "math/bits",
- "bits.RotateLeft32": "math/bits",
- "bits.RotateLeft64": "math/bits",
- "bits.RotateLeft8": "math/bits",
- "bits.TrailingZeros": "math/bits",
- "bits.TrailingZeros16": "math/bits",
- "bits.TrailingZeros32": "math/bits",
- "bits.TrailingZeros64": "math/bits",
- "bits.TrailingZeros8": "math/bits",
- "bits.UintSize": "math/bits",
- "bufio.ErrAdvanceTooFar": "bufio",
- "bufio.ErrBufferFull": "bufio",
- "bufio.ErrFinalToken": "bufio",
- "bufio.ErrInvalidUnreadByte": "bufio",
- "bufio.ErrInvalidUnreadRune": "bufio",
- "bufio.ErrNegativeAdvance": "bufio",
- "bufio.ErrNegativeCount": "bufio",
- "bufio.ErrTooLong": "bufio",
- "bufio.MaxScanTokenSize": "bufio",
- "bufio.NewReadWriter": "bufio",
- "bufio.NewReader": "bufio",
- "bufio.NewReaderSize": "bufio",
- "bufio.NewScanner": "bufio",
- "bufio.NewWriter": "bufio",
- "bufio.NewWriterSize": "bufio",
- "bufio.ReadWriter": "bufio",
- "bufio.Reader": "bufio",
- "bufio.ScanBytes": "bufio",
- "bufio.ScanLines": "bufio",
- "bufio.ScanRunes": "bufio",
- "bufio.ScanWords": "bufio",
- "bufio.Scanner": "bufio",
- "bufio.SplitFunc": "bufio",
- "bufio.Writer": "bufio",
- "build.AllowBinary": "go/build",
- "build.ArchChar": "go/build",
- "build.Context": "go/build",
- "build.Default": "go/build",
- "build.FindOnly": "go/build",
- "build.IgnoreVendor": "go/build",
- "build.Import": "go/build",
- "build.ImportComment": "go/build",
- "build.ImportDir": "go/build",
- "build.ImportMode": "go/build",
- "build.IsLocalImport": "go/build",
- "build.MultiplePackageError": "go/build",
- "build.NoGoError": "go/build",
- "build.Package": "go/build",
- "build.ToolDir": "go/build",
- "bytes.Buffer": "bytes",
- "bytes.Compare": "bytes",
- "bytes.Contains": "bytes",
- "bytes.ContainsAny": "bytes",
- "bytes.ContainsRune": "bytes",
- "bytes.Count": "bytes",
- "bytes.Equal": "bytes",
- "bytes.EqualFold": "bytes",
- "bytes.ErrTooLarge": "bytes",
- "bytes.Fields": "bytes",
- "bytes.FieldsFunc": "bytes",
- "bytes.HasPrefix": "bytes",
- "bytes.HasSuffix": "bytes",
- "bytes.Index": "bytes",
- "bytes.IndexAny": "bytes",
- "bytes.IndexByte": "bytes",
- "bytes.IndexFunc": "bytes",
- "bytes.IndexRune": "bytes",
- "bytes.Join": "bytes",
- "bytes.LastIndex": "bytes",
- "bytes.LastIndexAny": "bytes",
- "bytes.LastIndexByte": "bytes",
- "bytes.LastIndexFunc": "bytes",
- "bytes.Map": "bytes",
- "bytes.MinRead": "bytes",
- "bytes.NewBuffer": "bytes",
- "bytes.NewBufferString": "bytes",
- "bytes.NewReader": "bytes",
- "bytes.Reader": "bytes",
- "bytes.Repeat": "bytes",
- "bytes.Replace": "bytes",
- "bytes.Runes": "bytes",
- "bytes.Split": "bytes",
- "bytes.SplitAfter": "bytes",
- "bytes.SplitAfterN": "bytes",
- "bytes.SplitN": "bytes",
- "bytes.Title": "bytes",
- "bytes.ToLower": "bytes",
- "bytes.ToLowerSpecial": "bytes",
- "bytes.ToTitle": "bytes",
- "bytes.ToTitleSpecial": "bytes",
- "bytes.ToUpper": "bytes",
- "bytes.ToUpperSpecial": "bytes",
- "bytes.Trim": "bytes",
- "bytes.TrimFunc": "bytes",
- "bytes.TrimLeft": "bytes",
- "bytes.TrimLeftFunc": "bytes",
- "bytes.TrimPrefix": "bytes",
- "bytes.TrimRight": "bytes",
- "bytes.TrimRightFunc": "bytes",
- "bytes.TrimSpace": "bytes",
- "bytes.TrimSuffix": "bytes",
- "bzip2.NewReader": "compress/bzip2",
- "bzip2.StructuralError": "compress/bzip2",
- "cgi.Handler": "net/http/cgi",
- "cgi.Request": "net/http/cgi",
- "cgi.RequestFromMap": "net/http/cgi",
- "cgi.Serve": "net/http/cgi",
- "cipher.AEAD": "crypto/cipher",
- "cipher.Block": "crypto/cipher",
- "cipher.BlockMode": "crypto/cipher",
- "cipher.NewCBCDecrypter": "crypto/cipher",
- "cipher.NewCBCEncrypter": "crypto/cipher",
- "cipher.NewCFBDecrypter": "crypto/cipher",
- "cipher.NewCFBEncrypter": "crypto/cipher",
- "cipher.NewCTR": "crypto/cipher",
- "cipher.NewGCM": "crypto/cipher",
- "cipher.NewGCMWithNonceSize": "crypto/cipher",
- "cipher.NewOFB": "crypto/cipher",
- "cipher.Stream": "crypto/cipher",
- "cipher.StreamReader": "crypto/cipher",
- "cipher.StreamWriter": "crypto/cipher",
- "cmplx.Abs": "math/cmplx",
- "cmplx.Acos": "math/cmplx",
- "cmplx.Acosh": "math/cmplx",
- "cmplx.Asin": "math/cmplx",
- "cmplx.Asinh": "math/cmplx",
- "cmplx.Atan": "math/cmplx",
- "cmplx.Atanh": "math/cmplx",
- "cmplx.Conj": "math/cmplx",
- "cmplx.Cos": "math/cmplx",
- "cmplx.Cosh": "math/cmplx",
- "cmplx.Cot": "math/cmplx",
- "cmplx.Exp": "math/cmplx",
- "cmplx.Inf": "math/cmplx",
- "cmplx.IsInf": "math/cmplx",
- "cmplx.IsNaN": "math/cmplx",
- "cmplx.Log": "math/cmplx",
- "cmplx.Log10": "math/cmplx",
- "cmplx.NaN": "math/cmplx",
- "cmplx.Phase": "math/cmplx",
- "cmplx.Polar": "math/cmplx",
- "cmplx.Pow": "math/cmplx",
- "cmplx.Rect": "math/cmplx",
- "cmplx.Sin": "math/cmplx",
- "cmplx.Sinh": "math/cmplx",
- "cmplx.Sqrt": "math/cmplx",
- "cmplx.Tan": "math/cmplx",
- "cmplx.Tanh": "math/cmplx",
- "color.Alpha": "image/color",
- "color.Alpha16": "image/color",
- "color.Alpha16Model": "image/color",
- "color.AlphaModel": "image/color",
- "color.Black": "image/color",
- "color.CMYK": "image/color",
- "color.CMYKModel": "image/color",
- "color.CMYKToRGB": "image/color",
- "color.Color": "image/color",
- "color.Gray": "image/color",
- "color.Gray16": "image/color",
- "color.Gray16Model": "image/color",
- "color.GrayModel": "image/color",
- "color.Model": "image/color",
- "color.ModelFunc": "image/color",
- "color.NRGBA": "image/color",
- "color.NRGBA64": "image/color",
- "color.NRGBA64Model": "image/color",
- "color.NRGBAModel": "image/color",
- "color.NYCbCrA": "image/color",
- "color.NYCbCrAModel": "image/color",
- "color.Opaque": "image/color",
- "color.Palette": "image/color",
- "color.RGBA": "image/color",
- "color.RGBA64": "image/color",
- "color.RGBA64Model": "image/color",
- "color.RGBAModel": "image/color",
- "color.RGBToCMYK": "image/color",
- "color.RGBToYCbCr": "image/color",
- "color.Transparent": "image/color",
- "color.White": "image/color",
- "color.YCbCr": "image/color",
- "color.YCbCrModel": "image/color",
- "color.YCbCrToRGB": "image/color",
- "constant.BinaryOp": "go/constant",
- "constant.BitLen": "go/constant",
- "constant.Bool": "go/constant",
- "constant.BoolVal": "go/constant",
- "constant.Bytes": "go/constant",
- "constant.Compare": "go/constant",
- "constant.Complex": "go/constant",
- "constant.Denom": "go/constant",
- "constant.Float": "go/constant",
- "constant.Float32Val": "go/constant",
- "constant.Float64Val": "go/constant",
- "constant.Imag": "go/constant",
- "constant.Int": "go/constant",
- "constant.Int64Val": "go/constant",
- "constant.Kind": "go/constant",
- "constant.MakeBool": "go/constant",
- "constant.MakeFloat64": "go/constant",
- "constant.MakeFromBytes": "go/constant",
- "constant.MakeFromLiteral": "go/constant",
- "constant.MakeImag": "go/constant",
- "constant.MakeInt64": "go/constant",
- "constant.MakeString": "go/constant",
- "constant.MakeUint64": "go/constant",
- "constant.MakeUnknown": "go/constant",
- "constant.Num": "go/constant",
- "constant.Real": "go/constant",
- "constant.Shift": "go/constant",
- "constant.Sign": "go/constant",
- "constant.String": "go/constant",
- "constant.StringVal": "go/constant",
- "constant.ToComplex": "go/constant",
- "constant.ToFloat": "go/constant",
- "constant.ToInt": "go/constant",
- "constant.Uint64Val": "go/constant",
- "constant.UnaryOp": "go/constant",
- "constant.Unknown": "go/constant",
- "context.Background": "context",
- "context.CancelFunc": "context",
- "context.Canceled": "context",
- "context.Context": "context",
- "context.DeadlineExceeded": "context",
- "context.TODO": "context",
- "context.WithCancel": "context",
- "context.WithDeadline": "context",
- "context.WithTimeout": "context",
- "context.WithValue": "context",
- "cookiejar.Jar": "net/http/cookiejar",
- "cookiejar.New": "net/http/cookiejar",
- "cookiejar.Options": "net/http/cookiejar",
- "cookiejar.PublicSuffixList": "net/http/cookiejar",
- "crc32.Castagnoli": "hash/crc32",
- "crc32.Checksum": "hash/crc32",
- "crc32.ChecksumIEEE": "hash/crc32",
- "crc32.IEEE": "hash/crc32",
- "crc32.IEEETable": "hash/crc32",
- "crc32.Koopman": "hash/crc32",
- "crc32.MakeTable": "hash/crc32",
- "crc32.New": "hash/crc32",
- "crc32.NewIEEE": "hash/crc32",
- "crc32.Size": "hash/crc32",
- "crc32.Table": "hash/crc32",
- "crc32.Update": "hash/crc32",
- "crc64.Checksum": "hash/crc64",
- "crc64.ECMA": "hash/crc64",
- "crc64.ISO": "hash/crc64",
- "crc64.MakeTable": "hash/crc64",
- "crc64.New": "hash/crc64",
- "crc64.Size": "hash/crc64",
- "crc64.Table": "hash/crc64",
- "crc64.Update": "hash/crc64",
- "crypto.BLAKE2b_256": "crypto",
- "crypto.BLAKE2b_384": "crypto",
- "crypto.BLAKE2b_512": "crypto",
- "crypto.BLAKE2s_256": "crypto",
- "crypto.Decrypter": "crypto",
- "crypto.DecrypterOpts": "crypto",
- "crypto.Hash": "crypto",
- "crypto.MD4": "crypto",
- "crypto.MD5": "crypto",
- "crypto.MD5SHA1": "crypto",
- "crypto.PrivateKey": "crypto",
- "crypto.PublicKey": "crypto",
- "crypto.RIPEMD160": "crypto",
- "crypto.RegisterHash": "crypto",
- "crypto.SHA1": "crypto",
- "crypto.SHA224": "crypto",
- "crypto.SHA256": "crypto",
- "crypto.SHA384": "crypto",
- "crypto.SHA3_224": "crypto",
- "crypto.SHA3_256": "crypto",
- "crypto.SHA3_384": "crypto",
- "crypto.SHA3_512": "crypto",
- "crypto.SHA512": "crypto",
- "crypto.SHA512_224": "crypto",
- "crypto.SHA512_256": "crypto",
- "crypto.Signer": "crypto",
- "crypto.SignerOpts": "crypto",
- "csv.ErrBareQuote": "encoding/csv",
- "csv.ErrFieldCount": "encoding/csv",
- "csv.ErrQuote": "encoding/csv",
- "csv.ErrTrailingComma": "encoding/csv",
- "csv.NewReader": "encoding/csv",
- "csv.NewWriter": "encoding/csv",
- "csv.ParseError": "encoding/csv",
- "csv.Reader": "encoding/csv",
- "csv.Writer": "encoding/csv",
- "debug.FreeOSMemory": "runtime/debug",
- "debug.GCStats": "runtime/debug",
- "debug.PrintStack": "runtime/debug",
- "debug.ReadGCStats": "runtime/debug",
- "debug.SetGCPercent": "runtime/debug",
- "debug.SetMaxStack": "runtime/debug",
- "debug.SetMaxThreads": "runtime/debug",
- "debug.SetPanicOnFault": "runtime/debug",
- "debug.SetTraceback": "runtime/debug",
- "debug.Stack": "runtime/debug",
- "debug.WriteHeapDump": "runtime/debug",
- "des.BlockSize": "crypto/des",
- "des.KeySizeError": "crypto/des",
- "des.NewCipher": "crypto/des",
- "des.NewTripleDESCipher": "crypto/des",
- "doc.AllDecls": "go/doc",
- "doc.AllMethods": "go/doc",
- "doc.Example": "go/doc",
- "doc.Examples": "go/doc",
- "doc.Filter": "go/doc",
- "doc.Func": "go/doc",
- "doc.IllegalPrefixes": "go/doc",
- "doc.IsPredeclared": "go/doc",
- "doc.Mode": "go/doc",
- "doc.New": "go/doc",
- "doc.Note": "go/doc",
- "doc.Package": "go/doc",
- "doc.Synopsis": "go/doc",
- "doc.ToHTML": "go/doc",
- "doc.ToText": "go/doc",
- "doc.Type": "go/doc",
- "doc.Value": "go/doc",
- "draw.Draw": "image/draw",
- "draw.DrawMask": "image/draw",
- "draw.Drawer": "image/draw",
- "draw.FloydSteinberg": "image/draw",
- "draw.Image": "image/draw",
- "draw.Op": "image/draw",
- "draw.Over": "image/draw",
- "draw.Quantizer": "image/draw",
- "draw.Src": "image/draw",
- "driver.Bool": "database/sql/driver",
- "driver.ColumnConverter": "database/sql/driver",
- "driver.Conn": "database/sql/driver",
- "driver.ConnBeginTx": "database/sql/driver",
- "driver.ConnPrepareContext": "database/sql/driver",
- "driver.DefaultParameterConverter": "database/sql/driver",
- "driver.Driver": "database/sql/driver",
- "driver.ErrBadConn": "database/sql/driver",
- "driver.ErrRemoveArgument": "database/sql/driver",
- "driver.ErrSkip": "database/sql/driver",
- "driver.Execer": "database/sql/driver",
- "driver.ExecerContext": "database/sql/driver",
- "driver.Int32": "database/sql/driver",
- "driver.IsScanValue": "database/sql/driver",
- "driver.IsValue": "database/sql/driver",
- "driver.IsolationLevel": "database/sql/driver",
- "driver.NamedValue": "database/sql/driver",
- "driver.NamedValueChecker": "database/sql/driver",
- "driver.NotNull": "database/sql/driver",
- "driver.Null": "database/sql/driver",
- "driver.Pinger": "database/sql/driver",
- "driver.Queryer": "database/sql/driver",
- "driver.QueryerContext": "database/sql/driver",
- "driver.Result": "database/sql/driver",
- "driver.ResultNoRows": "database/sql/driver",
- "driver.Rows": "database/sql/driver",
- "driver.RowsAffected": "database/sql/driver",
- "driver.RowsColumnTypeDatabaseTypeName": "database/sql/driver",
- "driver.RowsColumnTypeLength": "database/sql/driver",
- "driver.RowsColumnTypeNullable": "database/sql/driver",
- "driver.RowsColumnTypePrecisionScale": "database/sql/driver",
- "driver.RowsColumnTypeScanType": "database/sql/driver",
- "driver.RowsNextResultSet": "database/sql/driver",
- "driver.Stmt": "database/sql/driver",
- "driver.StmtExecContext": "database/sql/driver",
- "driver.StmtQueryContext": "database/sql/driver",
- "driver.String": "database/sql/driver",
- "driver.Tx": "database/sql/driver",
- "driver.TxOptions": "database/sql/driver",
- "driver.Value": "database/sql/driver",
- "driver.ValueConverter": "database/sql/driver",
- "driver.Valuer": "database/sql/driver",
- "dsa.ErrInvalidPublicKey": "crypto/dsa",
- "dsa.GenerateKey": "crypto/dsa",
- "dsa.GenerateParameters": "crypto/dsa",
- "dsa.L1024N160": "crypto/dsa",
- "dsa.L2048N224": "crypto/dsa",
- "dsa.L2048N256": "crypto/dsa",
- "dsa.L3072N256": "crypto/dsa",
- "dsa.ParameterSizes": "crypto/dsa",
- "dsa.Parameters": "crypto/dsa",
- "dsa.PrivateKey": "crypto/dsa",
- "dsa.PublicKey": "crypto/dsa",
- "dsa.Sign": "crypto/dsa",
- "dsa.Verify": "crypto/dsa",
- "dwarf.AddrType": "debug/dwarf",
- "dwarf.ArrayType": "debug/dwarf",
- "dwarf.Attr": "debug/dwarf",
- "dwarf.AttrAbstractOrigin": "debug/dwarf",
- "dwarf.AttrAccessibility": "debug/dwarf",
- "dwarf.AttrAddrClass": "debug/dwarf",
- "dwarf.AttrAllocated": "debug/dwarf",
- "dwarf.AttrArtificial": "debug/dwarf",
- "dwarf.AttrAssociated": "debug/dwarf",
- "dwarf.AttrBaseTypes": "debug/dwarf",
- "dwarf.AttrBitOffset": "debug/dwarf",
- "dwarf.AttrBitSize": "debug/dwarf",
- "dwarf.AttrByteSize": "debug/dwarf",
- "dwarf.AttrCallColumn": "debug/dwarf",
- "dwarf.AttrCallFile": "debug/dwarf",
- "dwarf.AttrCallLine": "debug/dwarf",
- "dwarf.AttrCalling": "debug/dwarf",
- "dwarf.AttrCommonRef": "debug/dwarf",
- "dwarf.AttrCompDir": "debug/dwarf",
- "dwarf.AttrConstValue": "debug/dwarf",
- "dwarf.AttrContainingType": "debug/dwarf",
- "dwarf.AttrCount": "debug/dwarf",
- "dwarf.AttrDataLocation": "debug/dwarf",
- "dwarf.AttrDataMemberLoc": "debug/dwarf",
- "dwarf.AttrDeclColumn": "debug/dwarf",
- "dwarf.AttrDeclFile": "debug/dwarf",
- "dwarf.AttrDeclLine": "debug/dwarf",
- "dwarf.AttrDeclaration": "debug/dwarf",
- "dwarf.AttrDefaultValue": "debug/dwarf",
- "dwarf.AttrDescription": "debug/dwarf",
- "dwarf.AttrDiscr": "debug/dwarf",
- "dwarf.AttrDiscrList": "debug/dwarf",
- "dwarf.AttrDiscrValue": "debug/dwarf",
- "dwarf.AttrEncoding": "debug/dwarf",
- "dwarf.AttrEntrypc": "debug/dwarf",
- "dwarf.AttrExtension": "debug/dwarf",
- "dwarf.AttrExternal": "debug/dwarf",
- "dwarf.AttrFrameBase": "debug/dwarf",
- "dwarf.AttrFriend": "debug/dwarf",
- "dwarf.AttrHighpc": "debug/dwarf",
- "dwarf.AttrIdentifierCase": "debug/dwarf",
- "dwarf.AttrImport": "debug/dwarf",
- "dwarf.AttrInline": "debug/dwarf",
- "dwarf.AttrIsOptional": "debug/dwarf",
- "dwarf.AttrLanguage": "debug/dwarf",
- "dwarf.AttrLocation": "debug/dwarf",
- "dwarf.AttrLowerBound": "debug/dwarf",
- "dwarf.AttrLowpc": "debug/dwarf",
- "dwarf.AttrMacroInfo": "debug/dwarf",
- "dwarf.AttrName": "debug/dwarf",
- "dwarf.AttrNamelistItem": "debug/dwarf",
- "dwarf.AttrOrdering": "debug/dwarf",
- "dwarf.AttrPriority": "debug/dwarf",
- "dwarf.AttrProducer": "debug/dwarf",
- "dwarf.AttrPrototyped": "debug/dwarf",
- "dwarf.AttrRanges": "debug/dwarf",
- "dwarf.AttrReturnAddr": "debug/dwarf",
- "dwarf.AttrSegment": "debug/dwarf",
- "dwarf.AttrSibling": "debug/dwarf",
- "dwarf.AttrSpecification": "debug/dwarf",
- "dwarf.AttrStartScope": "debug/dwarf",
- "dwarf.AttrStaticLink": "debug/dwarf",
- "dwarf.AttrStmtList": "debug/dwarf",
- "dwarf.AttrStride": "debug/dwarf",
- "dwarf.AttrStrideSize": "debug/dwarf",
- "dwarf.AttrStringLength": "debug/dwarf",
- "dwarf.AttrTrampoline": "debug/dwarf",
- "dwarf.AttrType": "debug/dwarf",
- "dwarf.AttrUpperBound": "debug/dwarf",
- "dwarf.AttrUseLocation": "debug/dwarf",
- "dwarf.AttrUseUTF8": "debug/dwarf",
- "dwarf.AttrVarParam": "debug/dwarf",
- "dwarf.AttrVirtuality": "debug/dwarf",
- "dwarf.AttrVisibility": "debug/dwarf",
- "dwarf.AttrVtableElemLoc": "debug/dwarf",
- "dwarf.BasicType": "debug/dwarf",
- "dwarf.BoolType": "debug/dwarf",
- "dwarf.CharType": "debug/dwarf",
- "dwarf.Class": "debug/dwarf",
- "dwarf.ClassAddress": "debug/dwarf",
- "dwarf.ClassBlock": "debug/dwarf",
- "dwarf.ClassConstant": "debug/dwarf",
- "dwarf.ClassExprLoc": "debug/dwarf",
- "dwarf.ClassFlag": "debug/dwarf",
- "dwarf.ClassLinePtr": "debug/dwarf",
- "dwarf.ClassLocListPtr": "debug/dwarf",
- "dwarf.ClassMacPtr": "debug/dwarf",
- "dwarf.ClassRangeListPtr": "debug/dwarf",
- "dwarf.ClassReference": "debug/dwarf",
- "dwarf.ClassReferenceAlt": "debug/dwarf",
- "dwarf.ClassReferenceSig": "debug/dwarf",
- "dwarf.ClassString": "debug/dwarf",
- "dwarf.ClassStringAlt": "debug/dwarf",
- "dwarf.ClassUnknown": "debug/dwarf",
- "dwarf.CommonType": "debug/dwarf",
- "dwarf.ComplexType": "debug/dwarf",
- "dwarf.Data": "debug/dwarf",
- "dwarf.DecodeError": "debug/dwarf",
- "dwarf.DotDotDotType": "debug/dwarf",
- "dwarf.Entry": "debug/dwarf",
- "dwarf.EnumType": "debug/dwarf",
- "dwarf.EnumValue": "debug/dwarf",
- "dwarf.ErrUnknownPC": "debug/dwarf",
- "dwarf.Field": "debug/dwarf",
- "dwarf.FloatType": "debug/dwarf",
- "dwarf.FuncType": "debug/dwarf",
- "dwarf.IntType": "debug/dwarf",
- "dwarf.LineEntry": "debug/dwarf",
- "dwarf.LineFile": "debug/dwarf",
- "dwarf.LineReader": "debug/dwarf",
- "dwarf.LineReaderPos": "debug/dwarf",
- "dwarf.New": "debug/dwarf",
- "dwarf.Offset": "debug/dwarf",
- "dwarf.PtrType": "debug/dwarf",
- "dwarf.QualType": "debug/dwarf",
- "dwarf.Reader": "debug/dwarf",
- "dwarf.StructField": "debug/dwarf",
- "dwarf.StructType": "debug/dwarf",
- "dwarf.Tag": "debug/dwarf",
- "dwarf.TagAccessDeclaration": "debug/dwarf",
- "dwarf.TagArrayType": "debug/dwarf",
- "dwarf.TagBaseType": "debug/dwarf",
- "dwarf.TagCatchDwarfBlock": "debug/dwarf",
- "dwarf.TagClassType": "debug/dwarf",
- "dwarf.TagCommonDwarfBlock": "debug/dwarf",
- "dwarf.TagCommonInclusion": "debug/dwarf",
- "dwarf.TagCompileUnit": "debug/dwarf",
- "dwarf.TagCondition": "debug/dwarf",
- "dwarf.TagConstType": "debug/dwarf",
- "dwarf.TagConstant": "debug/dwarf",
- "dwarf.TagDwarfProcedure": "debug/dwarf",
- "dwarf.TagEntryPoint": "debug/dwarf",
- "dwarf.TagEnumerationType": "debug/dwarf",
- "dwarf.TagEnumerator": "debug/dwarf",
- "dwarf.TagFileType": "debug/dwarf",
- "dwarf.TagFormalParameter": "debug/dwarf",
- "dwarf.TagFriend": "debug/dwarf",
- "dwarf.TagImportedDeclaration": "debug/dwarf",
- "dwarf.TagImportedModule": "debug/dwarf",
- "dwarf.TagImportedUnit": "debug/dwarf",
- "dwarf.TagInheritance": "debug/dwarf",
- "dwarf.TagInlinedSubroutine": "debug/dwarf",
- "dwarf.TagInterfaceType": "debug/dwarf",
- "dwarf.TagLabel": "debug/dwarf",
- "dwarf.TagLexDwarfBlock": "debug/dwarf",
- "dwarf.TagMember": "debug/dwarf",
- "dwarf.TagModule": "debug/dwarf",
- "dwarf.TagMutableType": "debug/dwarf",
- "dwarf.TagNamelist": "debug/dwarf",
- "dwarf.TagNamelistItem": "debug/dwarf",
- "dwarf.TagNamespace": "debug/dwarf",
- "dwarf.TagPackedType": "debug/dwarf",
- "dwarf.TagPartialUnit": "debug/dwarf",
- "dwarf.TagPointerType": "debug/dwarf",
- "dwarf.TagPtrToMemberType": "debug/dwarf",
- "dwarf.TagReferenceType": "debug/dwarf",
- "dwarf.TagRestrictType": "debug/dwarf",
- "dwarf.TagRvalueReferenceType": "debug/dwarf",
- "dwarf.TagSetType": "debug/dwarf",
- "dwarf.TagSharedType": "debug/dwarf",
- "dwarf.TagStringType": "debug/dwarf",
- "dwarf.TagStructType": "debug/dwarf",
- "dwarf.TagSubprogram": "debug/dwarf",
- "dwarf.TagSubrangeType": "debug/dwarf",
- "dwarf.TagSubroutineType": "debug/dwarf",
- "dwarf.TagTemplateAlias": "debug/dwarf",
- "dwarf.TagTemplateTypeParameter": "debug/dwarf",
- "dwarf.TagTemplateValueParameter": "debug/dwarf",
- "dwarf.TagThrownType": "debug/dwarf",
- "dwarf.TagTryDwarfBlock": "debug/dwarf",
- "dwarf.TagTypeUnit": "debug/dwarf",
- "dwarf.TagTypedef": "debug/dwarf",
- "dwarf.TagUnionType": "debug/dwarf",
- "dwarf.TagUnspecifiedParameters": "debug/dwarf",
- "dwarf.TagUnspecifiedType": "debug/dwarf",
- "dwarf.TagVariable": "debug/dwarf",
- "dwarf.TagVariant": "debug/dwarf",
- "dwarf.TagVariantPart": "debug/dwarf",
- "dwarf.TagVolatileType": "debug/dwarf",
- "dwarf.TagWithStmt": "debug/dwarf",
- "dwarf.Type": "debug/dwarf",
- "dwarf.TypedefType": "debug/dwarf",
- "dwarf.UcharType": "debug/dwarf",
- "dwarf.UintType": "debug/dwarf",
- "dwarf.UnspecifiedType": "debug/dwarf",
- "dwarf.VoidType": "debug/dwarf",
- "ecdsa.GenerateKey": "crypto/ecdsa",
- "ecdsa.PrivateKey": "crypto/ecdsa",
- "ecdsa.PublicKey": "crypto/ecdsa",
- "ecdsa.Sign": "crypto/ecdsa",
- "ecdsa.Verify": "crypto/ecdsa",
- "elf.ARM_MAGIC_TRAMP_NUMBER": "debug/elf",
- "elf.COMPRESS_HIOS": "debug/elf",
- "elf.COMPRESS_HIPROC": "debug/elf",
- "elf.COMPRESS_LOOS": "debug/elf",
- "elf.COMPRESS_LOPROC": "debug/elf",
- "elf.COMPRESS_ZLIB": "debug/elf",
- "elf.Chdr32": "debug/elf",
- "elf.Chdr64": "debug/elf",
- "elf.Class": "debug/elf",
- "elf.CompressionType": "debug/elf",
- "elf.DF_BIND_NOW": "debug/elf",
- "elf.DF_ORIGIN": "debug/elf",
- "elf.DF_STATIC_TLS": "debug/elf",
- "elf.DF_SYMBOLIC": "debug/elf",
- "elf.DF_TEXTREL": "debug/elf",
- "elf.DT_BIND_NOW": "debug/elf",
- "elf.DT_DEBUG": "debug/elf",
- "elf.DT_ENCODING": "debug/elf",
- "elf.DT_FINI": "debug/elf",
- "elf.DT_FINI_ARRAY": "debug/elf",
- "elf.DT_FINI_ARRAYSZ": "debug/elf",
- "elf.DT_FLAGS": "debug/elf",
- "elf.DT_HASH": "debug/elf",
- "elf.DT_HIOS": "debug/elf",
- "elf.DT_HIPROC": "debug/elf",
- "elf.DT_INIT": "debug/elf",
- "elf.DT_INIT_ARRAY": "debug/elf",
- "elf.DT_INIT_ARRAYSZ": "debug/elf",
- "elf.DT_JMPREL": "debug/elf",
- "elf.DT_LOOS": "debug/elf",
- "elf.DT_LOPROC": "debug/elf",
- "elf.DT_NEEDED": "debug/elf",
- "elf.DT_NULL": "debug/elf",
- "elf.DT_PLTGOT": "debug/elf",
- "elf.DT_PLTREL": "debug/elf",
- "elf.DT_PLTRELSZ": "debug/elf",
- "elf.DT_PREINIT_ARRAY": "debug/elf",
- "elf.DT_PREINIT_ARRAYSZ": "debug/elf",
- "elf.DT_REL": "debug/elf",
- "elf.DT_RELA": "debug/elf",
- "elf.DT_RELAENT": "debug/elf",
- "elf.DT_RELASZ": "debug/elf",
- "elf.DT_RELENT": "debug/elf",
- "elf.DT_RELSZ": "debug/elf",
- "elf.DT_RPATH": "debug/elf",
- "elf.DT_RUNPATH": "debug/elf",
- "elf.DT_SONAME": "debug/elf",
- "elf.DT_STRSZ": "debug/elf",
- "elf.DT_STRTAB": "debug/elf",
- "elf.DT_SYMBOLIC": "debug/elf",
- "elf.DT_SYMENT": "debug/elf",
- "elf.DT_SYMTAB": "debug/elf",
- "elf.DT_TEXTREL": "debug/elf",
- "elf.DT_VERNEED": "debug/elf",
- "elf.DT_VERNEEDNUM": "debug/elf",
- "elf.DT_VERSYM": "debug/elf",
- "elf.Data": "debug/elf",
- "elf.Dyn32": "debug/elf",
- "elf.Dyn64": "debug/elf",
- "elf.DynFlag": "debug/elf",
- "elf.DynTag": "debug/elf",
- "elf.EI_ABIVERSION": "debug/elf",
- "elf.EI_CLASS": "debug/elf",
- "elf.EI_DATA": "debug/elf",
- "elf.EI_NIDENT": "debug/elf",
- "elf.EI_OSABI": "debug/elf",
- "elf.EI_PAD": "debug/elf",
- "elf.EI_VERSION": "debug/elf",
- "elf.ELFCLASS32": "debug/elf",
- "elf.ELFCLASS64": "debug/elf",
- "elf.ELFCLASSNONE": "debug/elf",
- "elf.ELFDATA2LSB": "debug/elf",
- "elf.ELFDATA2MSB": "debug/elf",
- "elf.ELFDATANONE": "debug/elf",
- "elf.ELFMAG": "debug/elf",
- "elf.ELFOSABI_86OPEN": "debug/elf",
- "elf.ELFOSABI_AIX": "debug/elf",
- "elf.ELFOSABI_ARM": "debug/elf",
- "elf.ELFOSABI_FREEBSD": "debug/elf",
- "elf.ELFOSABI_HPUX": "debug/elf",
- "elf.ELFOSABI_HURD": "debug/elf",
- "elf.ELFOSABI_IRIX": "debug/elf",
- "elf.ELFOSABI_LINUX": "debug/elf",
- "elf.ELFOSABI_MODESTO": "debug/elf",
- "elf.ELFOSABI_NETBSD": "debug/elf",
- "elf.ELFOSABI_NONE": "debug/elf",
- "elf.ELFOSABI_NSK": "debug/elf",
- "elf.ELFOSABI_OPENBSD": "debug/elf",
- "elf.ELFOSABI_OPENVMS": "debug/elf",
- "elf.ELFOSABI_SOLARIS": "debug/elf",
- "elf.ELFOSABI_STANDALONE": "debug/elf",
- "elf.ELFOSABI_TRU64": "debug/elf",
- "elf.EM_386": "debug/elf",
- "elf.EM_486": "debug/elf",
- "elf.EM_68HC12": "debug/elf",
- "elf.EM_68K": "debug/elf",
- "elf.EM_860": "debug/elf",
- "elf.EM_88K": "debug/elf",
- "elf.EM_960": "debug/elf",
- "elf.EM_AARCH64": "debug/elf",
- "elf.EM_ALPHA": "debug/elf",
- "elf.EM_ALPHA_STD": "debug/elf",
- "elf.EM_ARC": "debug/elf",
- "elf.EM_ARM": "debug/elf",
- "elf.EM_COLDFIRE": "debug/elf",
- "elf.EM_FR20": "debug/elf",
- "elf.EM_H8S": "debug/elf",
- "elf.EM_H8_300": "debug/elf",
- "elf.EM_H8_300H": "debug/elf",
- "elf.EM_H8_500": "debug/elf",
- "elf.EM_IA_64": "debug/elf",
- "elf.EM_M32": "debug/elf",
- "elf.EM_ME16": "debug/elf",
- "elf.EM_MIPS": "debug/elf",
- "elf.EM_MIPS_RS3_LE": "debug/elf",
- "elf.EM_MIPS_RS4_BE": "debug/elf",
- "elf.EM_MIPS_X": "debug/elf",
- "elf.EM_MMA": "debug/elf",
- "elf.EM_NCPU": "debug/elf",
- "elf.EM_NDR1": "debug/elf",
- "elf.EM_NONE": "debug/elf",
- "elf.EM_PARISC": "debug/elf",
- "elf.EM_PCP": "debug/elf",
- "elf.EM_PPC": "debug/elf",
- "elf.EM_PPC64": "debug/elf",
- "elf.EM_RCE": "debug/elf",
- "elf.EM_RH32": "debug/elf",
- "elf.EM_S370": "debug/elf",
- "elf.EM_S390": "debug/elf",
- "elf.EM_SH": "debug/elf",
- "elf.EM_SPARC": "debug/elf",
- "elf.EM_SPARC32PLUS": "debug/elf",
- "elf.EM_SPARCV9": "debug/elf",
- "elf.EM_ST100": "debug/elf",
- "elf.EM_STARCORE": "debug/elf",
- "elf.EM_TINYJ": "debug/elf",
- "elf.EM_TRICORE": "debug/elf",
- "elf.EM_V800": "debug/elf",
- "elf.EM_VPP500": "debug/elf",
- "elf.EM_X86_64": "debug/elf",
- "elf.ET_CORE": "debug/elf",
- "elf.ET_DYN": "debug/elf",
- "elf.ET_EXEC": "debug/elf",
- "elf.ET_HIOS": "debug/elf",
- "elf.ET_HIPROC": "debug/elf",
- "elf.ET_LOOS": "debug/elf",
- "elf.ET_LOPROC": "debug/elf",
- "elf.ET_NONE": "debug/elf",
- "elf.ET_REL": "debug/elf",
- "elf.EV_CURRENT": "debug/elf",
- "elf.EV_NONE": "debug/elf",
- "elf.ErrNoSymbols": "debug/elf",
- "elf.File": "debug/elf",
- "elf.FileHeader": "debug/elf",
- "elf.FormatError": "debug/elf",
- "elf.Header32": "debug/elf",
- "elf.Header64": "debug/elf",
- "elf.ImportedSymbol": "debug/elf",
- "elf.Machine": "debug/elf",
- "elf.NT_FPREGSET": "debug/elf",
- "elf.NT_PRPSINFO": "debug/elf",
- "elf.NT_PRSTATUS": "debug/elf",
- "elf.NType": "debug/elf",
- "elf.NewFile": "debug/elf",
- "elf.OSABI": "debug/elf",
- "elf.Open": "debug/elf",
- "elf.PF_MASKOS": "debug/elf",
- "elf.PF_MASKPROC": "debug/elf",
- "elf.PF_R": "debug/elf",
- "elf.PF_W": "debug/elf",
- "elf.PF_X": "debug/elf",
- "elf.PT_DYNAMIC": "debug/elf",
- "elf.PT_HIOS": "debug/elf",
- "elf.PT_HIPROC": "debug/elf",
- "elf.PT_INTERP": "debug/elf",
- "elf.PT_LOAD": "debug/elf",
- "elf.PT_LOOS": "debug/elf",
- "elf.PT_LOPROC": "debug/elf",
- "elf.PT_NOTE": "debug/elf",
- "elf.PT_NULL": "debug/elf",
- "elf.PT_PHDR": "debug/elf",
- "elf.PT_SHLIB": "debug/elf",
- "elf.PT_TLS": "debug/elf",
- "elf.Prog": "debug/elf",
- "elf.Prog32": "debug/elf",
- "elf.Prog64": "debug/elf",
- "elf.ProgFlag": "debug/elf",
- "elf.ProgHeader": "debug/elf",
- "elf.ProgType": "debug/elf",
- "elf.R_386": "debug/elf",
- "elf.R_386_32": "debug/elf",
- "elf.R_386_COPY": "debug/elf",
- "elf.R_386_GLOB_DAT": "debug/elf",
- "elf.R_386_GOT32": "debug/elf",
- "elf.R_386_GOTOFF": "debug/elf",
- "elf.R_386_GOTPC": "debug/elf",
- "elf.R_386_JMP_SLOT": "debug/elf",
- "elf.R_386_NONE": "debug/elf",
- "elf.R_386_PC32": "debug/elf",
- "elf.R_386_PLT32": "debug/elf",
- "elf.R_386_RELATIVE": "debug/elf",
- "elf.R_386_TLS_DTPMOD32": "debug/elf",
- "elf.R_386_TLS_DTPOFF32": "debug/elf",
- "elf.R_386_TLS_GD": "debug/elf",
- "elf.R_386_TLS_GD_32": "debug/elf",
- "elf.R_386_TLS_GD_CALL": "debug/elf",
- "elf.R_386_TLS_GD_POP": "debug/elf",
- "elf.R_386_TLS_GD_PUSH": "debug/elf",
- "elf.R_386_TLS_GOTIE": "debug/elf",
- "elf.R_386_TLS_IE": "debug/elf",
- "elf.R_386_TLS_IE_32": "debug/elf",
- "elf.R_386_TLS_LDM": "debug/elf",
- "elf.R_386_TLS_LDM_32": "debug/elf",
- "elf.R_386_TLS_LDM_CALL": "debug/elf",
- "elf.R_386_TLS_LDM_POP": "debug/elf",
- "elf.R_386_TLS_LDM_PUSH": "debug/elf",
- "elf.R_386_TLS_LDO_32": "debug/elf",
- "elf.R_386_TLS_LE": "debug/elf",
- "elf.R_386_TLS_LE_32": "debug/elf",
- "elf.R_386_TLS_TPOFF": "debug/elf",
- "elf.R_386_TLS_TPOFF32": "debug/elf",
- "elf.R_390": "debug/elf",
- "elf.R_390_12": "debug/elf",
- "elf.R_390_16": "debug/elf",
- "elf.R_390_20": "debug/elf",
- "elf.R_390_32": "debug/elf",
- "elf.R_390_64": "debug/elf",
- "elf.R_390_8": "debug/elf",
- "elf.R_390_COPY": "debug/elf",
- "elf.R_390_GLOB_DAT": "debug/elf",
- "elf.R_390_GOT12": "debug/elf",
- "elf.R_390_GOT16": "debug/elf",
- "elf.R_390_GOT20": "debug/elf",
- "elf.R_390_GOT32": "debug/elf",
- "elf.R_390_GOT64": "debug/elf",
- "elf.R_390_GOTENT": "debug/elf",
- "elf.R_390_GOTOFF": "debug/elf",
- "elf.R_390_GOTOFF16": "debug/elf",
- "elf.R_390_GOTOFF64": "debug/elf",
- "elf.R_390_GOTPC": "debug/elf",
- "elf.R_390_GOTPCDBL": "debug/elf",
- "elf.R_390_GOTPLT12": "debug/elf",
- "elf.R_390_GOTPLT16": "debug/elf",
- "elf.R_390_GOTPLT20": "debug/elf",
- "elf.R_390_GOTPLT32": "debug/elf",
- "elf.R_390_GOTPLT64": "debug/elf",
- "elf.R_390_GOTPLTENT": "debug/elf",
- "elf.R_390_GOTPLTOFF16": "debug/elf",
- "elf.R_390_GOTPLTOFF32": "debug/elf",
- "elf.R_390_GOTPLTOFF64": "debug/elf",
- "elf.R_390_JMP_SLOT": "debug/elf",
- "elf.R_390_NONE": "debug/elf",
- "elf.R_390_PC16": "debug/elf",
- "elf.R_390_PC16DBL": "debug/elf",
- "elf.R_390_PC32": "debug/elf",
- "elf.R_390_PC32DBL": "debug/elf",
- "elf.R_390_PC64": "debug/elf",
- "elf.R_390_PLT16DBL": "debug/elf",
- "elf.R_390_PLT32": "debug/elf",
- "elf.R_390_PLT32DBL": "debug/elf",
- "elf.R_390_PLT64": "debug/elf",
- "elf.R_390_RELATIVE": "debug/elf",
- "elf.R_390_TLS_DTPMOD": "debug/elf",
- "elf.R_390_TLS_DTPOFF": "debug/elf",
- "elf.R_390_TLS_GD32": "debug/elf",
- "elf.R_390_TLS_GD64": "debug/elf",
- "elf.R_390_TLS_GDCALL": "debug/elf",
- "elf.R_390_TLS_GOTIE12": "debug/elf",
- "elf.R_390_TLS_GOTIE20": "debug/elf",
- "elf.R_390_TLS_GOTIE32": "debug/elf",
- "elf.R_390_TLS_GOTIE64": "debug/elf",
- "elf.R_390_TLS_IE32": "debug/elf",
- "elf.R_390_TLS_IE64": "debug/elf",
- "elf.R_390_TLS_IEENT": "debug/elf",
- "elf.R_390_TLS_LDCALL": "debug/elf",
- "elf.R_390_TLS_LDM32": "debug/elf",
- "elf.R_390_TLS_LDM64": "debug/elf",
- "elf.R_390_TLS_LDO32": "debug/elf",
- "elf.R_390_TLS_LDO64": "debug/elf",
- "elf.R_390_TLS_LE32": "debug/elf",
- "elf.R_390_TLS_LE64": "debug/elf",
- "elf.R_390_TLS_LOAD": "debug/elf",
- "elf.R_390_TLS_TPOFF": "debug/elf",
- "elf.R_AARCH64": "debug/elf",
- "elf.R_AARCH64_ABS16": "debug/elf",
- "elf.R_AARCH64_ABS32": "debug/elf",
- "elf.R_AARCH64_ABS64": "debug/elf",
- "elf.R_AARCH64_ADD_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_ADR_GOT_PAGE": "debug/elf",
- "elf.R_AARCH64_ADR_PREL_LO21": "debug/elf",
- "elf.R_AARCH64_ADR_PREL_PG_HI21": "debug/elf",
- "elf.R_AARCH64_ADR_PREL_PG_HI21_NC": "debug/elf",
- "elf.R_AARCH64_CALL26": "debug/elf",
- "elf.R_AARCH64_CONDBR19": "debug/elf",
- "elf.R_AARCH64_COPY": "debug/elf",
- "elf.R_AARCH64_GLOB_DAT": "debug/elf",
- "elf.R_AARCH64_GOT_LD_PREL19": "debug/elf",
- "elf.R_AARCH64_IRELATIVE": "debug/elf",
- "elf.R_AARCH64_JUMP26": "debug/elf",
- "elf.R_AARCH64_JUMP_SLOT": "debug/elf",
- "elf.R_AARCH64_LD64_GOT_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST128_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST16_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST32_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST64_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LDST8_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_LD_PREL_LO19": "debug/elf",
- "elf.R_AARCH64_MOVW_SABS_G0": "debug/elf",
- "elf.R_AARCH64_MOVW_SABS_G1": "debug/elf",
- "elf.R_AARCH64_MOVW_SABS_G2": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G0": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G0_NC": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G1": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G1_NC": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G2": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G2_NC": "debug/elf",
- "elf.R_AARCH64_MOVW_UABS_G3": "debug/elf",
- "elf.R_AARCH64_NONE": "debug/elf",
- "elf.R_AARCH64_NULL": "debug/elf",
- "elf.R_AARCH64_P32_ABS16": "debug/elf",
- "elf.R_AARCH64_P32_ABS32": "debug/elf",
- "elf.R_AARCH64_P32_ADD_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_ADR_GOT_PAGE": "debug/elf",
- "elf.R_AARCH64_P32_ADR_PREL_LO21": "debug/elf",
- "elf.R_AARCH64_P32_ADR_PREL_PG_HI21": "debug/elf",
- "elf.R_AARCH64_P32_CALL26": "debug/elf",
- "elf.R_AARCH64_P32_CONDBR19": "debug/elf",
- "elf.R_AARCH64_P32_COPY": "debug/elf",
- "elf.R_AARCH64_P32_GLOB_DAT": "debug/elf",
- "elf.R_AARCH64_P32_GOT_LD_PREL19": "debug/elf",
- "elf.R_AARCH64_P32_IRELATIVE": "debug/elf",
- "elf.R_AARCH64_P32_JUMP26": "debug/elf",
- "elf.R_AARCH64_P32_JUMP_SLOT": "debug/elf",
- "elf.R_AARCH64_P32_LD32_GOT_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST128_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST16_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST32_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST64_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LDST8_ABS_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_LD_PREL_LO19": "debug/elf",
- "elf.R_AARCH64_P32_MOVW_SABS_G0": "debug/elf",
- "elf.R_AARCH64_P32_MOVW_UABS_G0": "debug/elf",
- "elf.R_AARCH64_P32_MOVW_UABS_G0_NC": "debug/elf",
- "elf.R_AARCH64_P32_MOVW_UABS_G1": "debug/elf",
- "elf.R_AARCH64_P32_PREL16": "debug/elf",
- "elf.R_AARCH64_P32_PREL32": "debug/elf",
- "elf.R_AARCH64_P32_RELATIVE": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_ADD_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_ADR_PAGE21": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_ADR_PREL21": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_CALL": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_LD32_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSDESC_LD_PREL19": "debug/elf",
- "elf.R_AARCH64_P32_TLSGD_ADD_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSGD_ADR_PAGE21": "debug/elf",
- "elf.R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21": "debug/elf",
- "elf.R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_HI12": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC": "debug/elf",
- "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G1": "debug/elf",
- "elf.R_AARCH64_P32_TLS_DTPMOD": "debug/elf",
- "elf.R_AARCH64_P32_TLS_DTPREL": "debug/elf",
- "elf.R_AARCH64_P32_TLS_TPREL": "debug/elf",
- "elf.R_AARCH64_P32_TSTBR14": "debug/elf",
- "elf.R_AARCH64_PREL16": "debug/elf",
- "elf.R_AARCH64_PREL32": "debug/elf",
- "elf.R_AARCH64_PREL64": "debug/elf",
- "elf.R_AARCH64_RELATIVE": "debug/elf",
- "elf.R_AARCH64_TLSDESC": "debug/elf",
- "elf.R_AARCH64_TLSDESC_ADD": "debug/elf",
- "elf.R_AARCH64_TLSDESC_ADD_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSDESC_ADR_PAGE21": "debug/elf",
- "elf.R_AARCH64_TLSDESC_ADR_PREL21": "debug/elf",
- "elf.R_AARCH64_TLSDESC_CALL": "debug/elf",
- "elf.R_AARCH64_TLSDESC_LD64_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSDESC_LDR": "debug/elf",
- "elf.R_AARCH64_TLSDESC_LD_PREL19": "debug/elf",
- "elf.R_AARCH64_TLSDESC_OFF_G0_NC": "debug/elf",
- "elf.R_AARCH64_TLSDESC_OFF_G1": "debug/elf",
- "elf.R_AARCH64_TLSGD_ADD_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSGD_ADR_PAGE21": "debug/elf",
- "elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21": "debug/elf",
- "elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSIE_LD_GOTTPREL_PREL19": "debug/elf",
- "elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC": "debug/elf",
- "elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G1": "debug/elf",
- "elf.R_AARCH64_TLSLE_ADD_TPREL_HI12": "debug/elf",
- "elf.R_AARCH64_TLSLE_ADD_TPREL_LO12": "debug/elf",
- "elf.R_AARCH64_TLSLE_ADD_TPREL_LO12_NC": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G0": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G0_NC": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G1": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G1_NC": "debug/elf",
- "elf.R_AARCH64_TLSLE_MOVW_TPREL_G2": "debug/elf",
- "elf.R_AARCH64_TLS_DTPMOD64": "debug/elf",
- "elf.R_AARCH64_TLS_DTPREL64": "debug/elf",
- "elf.R_AARCH64_TLS_TPREL64": "debug/elf",
- "elf.R_AARCH64_TSTBR14": "debug/elf",
- "elf.R_ALPHA": "debug/elf",
- "elf.R_ALPHA_BRADDR": "debug/elf",
- "elf.R_ALPHA_COPY": "debug/elf",
- "elf.R_ALPHA_GLOB_DAT": "debug/elf",
- "elf.R_ALPHA_GPDISP": "debug/elf",
- "elf.R_ALPHA_GPREL32": "debug/elf",
- "elf.R_ALPHA_GPRELHIGH": "debug/elf",
- "elf.R_ALPHA_GPRELLOW": "debug/elf",
- "elf.R_ALPHA_GPVALUE": "debug/elf",
- "elf.R_ALPHA_HINT": "debug/elf",
- "elf.R_ALPHA_IMMED_BR_HI32": "debug/elf",
- "elf.R_ALPHA_IMMED_GP_16": "debug/elf",
- "elf.R_ALPHA_IMMED_GP_HI32": "debug/elf",
- "elf.R_ALPHA_IMMED_LO32": "debug/elf",
- "elf.R_ALPHA_IMMED_SCN_HI32": "debug/elf",
- "elf.R_ALPHA_JMP_SLOT": "debug/elf",
- "elf.R_ALPHA_LITERAL": "debug/elf",
- "elf.R_ALPHA_LITUSE": "debug/elf",
- "elf.R_ALPHA_NONE": "debug/elf",
- "elf.R_ALPHA_OP_PRSHIFT": "debug/elf",
- "elf.R_ALPHA_OP_PSUB": "debug/elf",
- "elf.R_ALPHA_OP_PUSH": "debug/elf",
- "elf.R_ALPHA_OP_STORE": "debug/elf",
- "elf.R_ALPHA_REFLONG": "debug/elf",
- "elf.R_ALPHA_REFQUAD": "debug/elf",
- "elf.R_ALPHA_RELATIVE": "debug/elf",
- "elf.R_ALPHA_SREL16": "debug/elf",
- "elf.R_ALPHA_SREL32": "debug/elf",
- "elf.R_ALPHA_SREL64": "debug/elf",
- "elf.R_ARM": "debug/elf",
- "elf.R_ARM_ABS12": "debug/elf",
- "elf.R_ARM_ABS16": "debug/elf",
- "elf.R_ARM_ABS32": "debug/elf",
- "elf.R_ARM_ABS8": "debug/elf",
- "elf.R_ARM_AMP_VCALL9": "debug/elf",
- "elf.R_ARM_COPY": "debug/elf",
- "elf.R_ARM_GLOB_DAT": "debug/elf",
- "elf.R_ARM_GNU_VTENTRY": "debug/elf",
- "elf.R_ARM_GNU_VTINHERIT": "debug/elf",
- "elf.R_ARM_GOT32": "debug/elf",
- "elf.R_ARM_GOTOFF": "debug/elf",
- "elf.R_ARM_GOTPC": "debug/elf",
- "elf.R_ARM_JUMP_SLOT": "debug/elf",
- "elf.R_ARM_NONE": "debug/elf",
- "elf.R_ARM_PC13": "debug/elf",
- "elf.R_ARM_PC24": "debug/elf",
- "elf.R_ARM_PLT32": "debug/elf",
- "elf.R_ARM_RABS32": "debug/elf",
- "elf.R_ARM_RBASE": "debug/elf",
- "elf.R_ARM_REL32": "debug/elf",
- "elf.R_ARM_RELATIVE": "debug/elf",
- "elf.R_ARM_RPC24": "debug/elf",
- "elf.R_ARM_RREL32": "debug/elf",
- "elf.R_ARM_RSBREL32": "debug/elf",
- "elf.R_ARM_SBREL32": "debug/elf",
- "elf.R_ARM_SWI24": "debug/elf",
- "elf.R_ARM_THM_ABS5": "debug/elf",
- "elf.R_ARM_THM_PC22": "debug/elf",
- "elf.R_ARM_THM_PC8": "debug/elf",
- "elf.R_ARM_THM_RPC22": "debug/elf",
- "elf.R_ARM_THM_SWI8": "debug/elf",
- "elf.R_ARM_THM_XPC22": "debug/elf",
- "elf.R_ARM_XPC25": "debug/elf",
- "elf.R_INFO": "debug/elf",
- "elf.R_INFO32": "debug/elf",
- "elf.R_MIPS": "debug/elf",
- "elf.R_MIPS_16": "debug/elf",
- "elf.R_MIPS_26": "debug/elf",
- "elf.R_MIPS_32": "debug/elf",
- "elf.R_MIPS_64": "debug/elf",
- "elf.R_MIPS_ADD_IMMEDIATE": "debug/elf",
- "elf.R_MIPS_CALL16": "debug/elf",
- "elf.R_MIPS_CALL_HI16": "debug/elf",
- "elf.R_MIPS_CALL_LO16": "debug/elf",
- "elf.R_MIPS_DELETE": "debug/elf",
- "elf.R_MIPS_GOT16": "debug/elf",
- "elf.R_MIPS_GOT_DISP": "debug/elf",
- "elf.R_MIPS_GOT_HI16": "debug/elf",
- "elf.R_MIPS_GOT_LO16": "debug/elf",
- "elf.R_MIPS_GOT_OFST": "debug/elf",
- "elf.R_MIPS_GOT_PAGE": "debug/elf",
- "elf.R_MIPS_GPREL16": "debug/elf",
- "elf.R_MIPS_GPREL32": "debug/elf",
- "elf.R_MIPS_HI16": "debug/elf",
- "elf.R_MIPS_HIGHER": "debug/elf",
- "elf.R_MIPS_HIGHEST": "debug/elf",
- "elf.R_MIPS_INSERT_A": "debug/elf",
- "elf.R_MIPS_INSERT_B": "debug/elf",
- "elf.R_MIPS_JALR": "debug/elf",
- "elf.R_MIPS_LITERAL": "debug/elf",
- "elf.R_MIPS_LO16": "debug/elf",
- "elf.R_MIPS_NONE": "debug/elf",
- "elf.R_MIPS_PC16": "debug/elf",
- "elf.R_MIPS_PJUMP": "debug/elf",
- "elf.R_MIPS_REL16": "debug/elf",
- "elf.R_MIPS_REL32": "debug/elf",
- "elf.R_MIPS_RELGOT": "debug/elf",
- "elf.R_MIPS_SCN_DISP": "debug/elf",
- "elf.R_MIPS_SHIFT5": "debug/elf",
- "elf.R_MIPS_SHIFT6": "debug/elf",
- "elf.R_MIPS_SUB": "debug/elf",
- "elf.R_MIPS_TLS_DTPMOD32": "debug/elf",
- "elf.R_MIPS_TLS_DTPMOD64": "debug/elf",
- "elf.R_MIPS_TLS_DTPREL32": "debug/elf",
- "elf.R_MIPS_TLS_DTPREL64": "debug/elf",
- "elf.R_MIPS_TLS_DTPREL_HI16": "debug/elf",
- "elf.R_MIPS_TLS_DTPREL_LO16": "debug/elf",
- "elf.R_MIPS_TLS_GD": "debug/elf",
- "elf.R_MIPS_TLS_GOTTPREL": "debug/elf",
- "elf.R_MIPS_TLS_LDM": "debug/elf",
- "elf.R_MIPS_TLS_TPREL32": "debug/elf",
- "elf.R_MIPS_TLS_TPREL64": "debug/elf",
- "elf.R_MIPS_TLS_TPREL_HI16": "debug/elf",
- "elf.R_MIPS_TLS_TPREL_LO16": "debug/elf",
- "elf.R_PPC": "debug/elf",
- "elf.R_PPC64": "debug/elf",
- "elf.R_PPC64_ADDR14": "debug/elf",
- "elf.R_PPC64_ADDR14_BRNTAKEN": "debug/elf",
- "elf.R_PPC64_ADDR14_BRTAKEN": "debug/elf",
- "elf.R_PPC64_ADDR16": "debug/elf",
- "elf.R_PPC64_ADDR16_DS": "debug/elf",
- "elf.R_PPC64_ADDR16_HA": "debug/elf",
- "elf.R_PPC64_ADDR16_HI": "debug/elf",
- "elf.R_PPC64_ADDR16_HIGHER": "debug/elf",
- "elf.R_PPC64_ADDR16_HIGHERA": "debug/elf",
- "elf.R_PPC64_ADDR16_HIGHEST": "debug/elf",
- "elf.R_PPC64_ADDR16_HIGHESTA": "debug/elf",
- "elf.R_PPC64_ADDR16_LO": "debug/elf",
- "elf.R_PPC64_ADDR16_LO_DS": "debug/elf",
- "elf.R_PPC64_ADDR24": "debug/elf",
- "elf.R_PPC64_ADDR32": "debug/elf",
- "elf.R_PPC64_ADDR64": "debug/elf",
- "elf.R_PPC64_DTPMOD64": "debug/elf",
- "elf.R_PPC64_DTPREL16": "debug/elf",
- "elf.R_PPC64_DTPREL16_DS": "debug/elf",
- "elf.R_PPC64_DTPREL16_HA": "debug/elf",
- "elf.R_PPC64_DTPREL16_HI": "debug/elf",
- "elf.R_PPC64_DTPREL16_HIGHER": "debug/elf",
- "elf.R_PPC64_DTPREL16_HIGHERA": "debug/elf",
- "elf.R_PPC64_DTPREL16_HIGHEST": "debug/elf",
- "elf.R_PPC64_DTPREL16_HIGHESTA": "debug/elf",
- "elf.R_PPC64_DTPREL16_LO": "debug/elf",
- "elf.R_PPC64_DTPREL16_LO_DS": "debug/elf",
- "elf.R_PPC64_DTPREL64": "debug/elf",
- "elf.R_PPC64_GOT16": "debug/elf",
- "elf.R_PPC64_GOT16_DS": "debug/elf",
- "elf.R_PPC64_GOT16_HA": "debug/elf",
- "elf.R_PPC64_GOT16_HI": "debug/elf",
- "elf.R_PPC64_GOT16_LO": "debug/elf",
- "elf.R_PPC64_GOT16_LO_DS": "debug/elf",
- "elf.R_PPC64_GOT_DTPREL16_DS": "debug/elf",
- "elf.R_PPC64_GOT_DTPREL16_HA": "debug/elf",
- "elf.R_PPC64_GOT_DTPREL16_HI": "debug/elf",
- "elf.R_PPC64_GOT_DTPREL16_LO_DS": "debug/elf",
- "elf.R_PPC64_GOT_TLSGD16": "debug/elf",
- "elf.R_PPC64_GOT_TLSGD16_HA": "debug/elf",
- "elf.R_PPC64_GOT_TLSGD16_HI": "debug/elf",
- "elf.R_PPC64_GOT_TLSGD16_LO": "debug/elf",
- "elf.R_PPC64_GOT_TLSLD16": "debug/elf",
- "elf.R_PPC64_GOT_TLSLD16_HA": "debug/elf",
- "elf.R_PPC64_GOT_TLSLD16_HI": "debug/elf",
- "elf.R_PPC64_GOT_TLSLD16_LO": "debug/elf",
- "elf.R_PPC64_GOT_TPREL16_DS": "debug/elf",
- "elf.R_PPC64_GOT_TPREL16_HA": "debug/elf",
- "elf.R_PPC64_GOT_TPREL16_HI": "debug/elf",
- "elf.R_PPC64_GOT_TPREL16_LO_DS": "debug/elf",
- "elf.R_PPC64_JMP_SLOT": "debug/elf",
- "elf.R_PPC64_NONE": "debug/elf",
- "elf.R_PPC64_REL14": "debug/elf",
- "elf.R_PPC64_REL14_BRNTAKEN": "debug/elf",
- "elf.R_PPC64_REL14_BRTAKEN": "debug/elf",
- "elf.R_PPC64_REL16": "debug/elf",
- "elf.R_PPC64_REL16_HA": "debug/elf",
- "elf.R_PPC64_REL16_HI": "debug/elf",
- "elf.R_PPC64_REL16_LO": "debug/elf",
- "elf.R_PPC64_REL24": "debug/elf",
- "elf.R_PPC64_REL32": "debug/elf",
- "elf.R_PPC64_REL64": "debug/elf",
- "elf.R_PPC64_TLS": "debug/elf",
- "elf.R_PPC64_TLSGD": "debug/elf",
- "elf.R_PPC64_TLSLD": "debug/elf",
- "elf.R_PPC64_TOC": "debug/elf",
- "elf.R_PPC64_TOC16": "debug/elf",
- "elf.R_PPC64_TOC16_DS": "debug/elf",
- "elf.R_PPC64_TOC16_HA": "debug/elf",
- "elf.R_PPC64_TOC16_HI": "debug/elf",
- "elf.R_PPC64_TOC16_LO": "debug/elf",
- "elf.R_PPC64_TOC16_LO_DS": "debug/elf",
- "elf.R_PPC64_TPREL16": "debug/elf",
- "elf.R_PPC64_TPREL16_DS": "debug/elf",
- "elf.R_PPC64_TPREL16_HA": "debug/elf",
- "elf.R_PPC64_TPREL16_HI": "debug/elf",
- "elf.R_PPC64_TPREL16_HIGHER": "debug/elf",
- "elf.R_PPC64_TPREL16_HIGHERA": "debug/elf",
- "elf.R_PPC64_TPREL16_HIGHEST": "debug/elf",
- "elf.R_PPC64_TPREL16_HIGHESTA": "debug/elf",
- "elf.R_PPC64_TPREL16_LO": "debug/elf",
- "elf.R_PPC64_TPREL16_LO_DS": "debug/elf",
- "elf.R_PPC64_TPREL64": "debug/elf",
- "elf.R_PPC_ADDR14": "debug/elf",
- "elf.R_PPC_ADDR14_BRNTAKEN": "debug/elf",
- "elf.R_PPC_ADDR14_BRTAKEN": "debug/elf",
- "elf.R_PPC_ADDR16": "debug/elf",
- "elf.R_PPC_ADDR16_HA": "debug/elf",
- "elf.R_PPC_ADDR16_HI": "debug/elf",
- "elf.R_PPC_ADDR16_LO": "debug/elf",
- "elf.R_PPC_ADDR24": "debug/elf",
- "elf.R_PPC_ADDR32": "debug/elf",
- "elf.R_PPC_COPY": "debug/elf",
- "elf.R_PPC_DTPMOD32": "debug/elf",
- "elf.R_PPC_DTPREL16": "debug/elf",
- "elf.R_PPC_DTPREL16_HA": "debug/elf",
- "elf.R_PPC_DTPREL16_HI": "debug/elf",
- "elf.R_PPC_DTPREL16_LO": "debug/elf",
- "elf.R_PPC_DTPREL32": "debug/elf",
- "elf.R_PPC_EMB_BIT_FLD": "debug/elf",
- "elf.R_PPC_EMB_MRKREF": "debug/elf",
- "elf.R_PPC_EMB_NADDR16": "debug/elf",
- "elf.R_PPC_EMB_NADDR16_HA": "debug/elf",
- "elf.R_PPC_EMB_NADDR16_HI": "debug/elf",
- "elf.R_PPC_EMB_NADDR16_LO": "debug/elf",
- "elf.R_PPC_EMB_NADDR32": "debug/elf",
- "elf.R_PPC_EMB_RELSDA": "debug/elf",
- "elf.R_PPC_EMB_RELSEC16": "debug/elf",
- "elf.R_PPC_EMB_RELST_HA": "debug/elf",
- "elf.R_PPC_EMB_RELST_HI": "debug/elf",
- "elf.R_PPC_EMB_RELST_LO": "debug/elf",
- "elf.R_PPC_EMB_SDA21": "debug/elf",
- "elf.R_PPC_EMB_SDA2I16": "debug/elf",
- "elf.R_PPC_EMB_SDA2REL": "debug/elf",
- "elf.R_PPC_EMB_SDAI16": "debug/elf",
- "elf.R_PPC_GLOB_DAT": "debug/elf",
- "elf.R_PPC_GOT16": "debug/elf",
- "elf.R_PPC_GOT16_HA": "debug/elf",
- "elf.R_PPC_GOT16_HI": "debug/elf",
- "elf.R_PPC_GOT16_LO": "debug/elf",
- "elf.R_PPC_GOT_TLSGD16": "debug/elf",
- "elf.R_PPC_GOT_TLSGD16_HA": "debug/elf",
- "elf.R_PPC_GOT_TLSGD16_HI": "debug/elf",
- "elf.R_PPC_GOT_TLSGD16_LO": "debug/elf",
- "elf.R_PPC_GOT_TLSLD16": "debug/elf",
- "elf.R_PPC_GOT_TLSLD16_HA": "debug/elf",
- "elf.R_PPC_GOT_TLSLD16_HI": "debug/elf",
- "elf.R_PPC_GOT_TLSLD16_LO": "debug/elf",
- "elf.R_PPC_GOT_TPREL16": "debug/elf",
- "elf.R_PPC_GOT_TPREL16_HA": "debug/elf",
- "elf.R_PPC_GOT_TPREL16_HI": "debug/elf",
- "elf.R_PPC_GOT_TPREL16_LO": "debug/elf",
- "elf.R_PPC_JMP_SLOT": "debug/elf",
- "elf.R_PPC_LOCAL24PC": "debug/elf",
- "elf.R_PPC_NONE": "debug/elf",
- "elf.R_PPC_PLT16_HA": "debug/elf",
- "elf.R_PPC_PLT16_HI": "debug/elf",
- "elf.R_PPC_PLT16_LO": "debug/elf",
- "elf.R_PPC_PLT32": "debug/elf",
- "elf.R_PPC_PLTREL24": "debug/elf",
- "elf.R_PPC_PLTREL32": "debug/elf",
- "elf.R_PPC_REL14": "debug/elf",
- "elf.R_PPC_REL14_BRNTAKEN": "debug/elf",
- "elf.R_PPC_REL14_BRTAKEN": "debug/elf",
- "elf.R_PPC_REL24": "debug/elf",
- "elf.R_PPC_REL32": "debug/elf",
- "elf.R_PPC_RELATIVE": "debug/elf",
- "elf.R_PPC_SDAREL16": "debug/elf",
- "elf.R_PPC_SECTOFF": "debug/elf",
- "elf.R_PPC_SECTOFF_HA": "debug/elf",
- "elf.R_PPC_SECTOFF_HI": "debug/elf",
- "elf.R_PPC_SECTOFF_LO": "debug/elf",
- "elf.R_PPC_TLS": "debug/elf",
- "elf.R_PPC_TPREL16": "debug/elf",
- "elf.R_PPC_TPREL16_HA": "debug/elf",
- "elf.R_PPC_TPREL16_HI": "debug/elf",
- "elf.R_PPC_TPREL16_LO": "debug/elf",
- "elf.R_PPC_TPREL32": "debug/elf",
- "elf.R_PPC_UADDR16": "debug/elf",
- "elf.R_PPC_UADDR32": "debug/elf",
- "elf.R_SPARC": "debug/elf",
- "elf.R_SPARC_10": "debug/elf",
- "elf.R_SPARC_11": "debug/elf",
- "elf.R_SPARC_13": "debug/elf",
- "elf.R_SPARC_16": "debug/elf",
- "elf.R_SPARC_22": "debug/elf",
- "elf.R_SPARC_32": "debug/elf",
- "elf.R_SPARC_5": "debug/elf",
- "elf.R_SPARC_6": "debug/elf",
- "elf.R_SPARC_64": "debug/elf",
- "elf.R_SPARC_7": "debug/elf",
- "elf.R_SPARC_8": "debug/elf",
- "elf.R_SPARC_COPY": "debug/elf",
- "elf.R_SPARC_DISP16": "debug/elf",
- "elf.R_SPARC_DISP32": "debug/elf",
- "elf.R_SPARC_DISP64": "debug/elf",
- "elf.R_SPARC_DISP8": "debug/elf",
- "elf.R_SPARC_GLOB_DAT": "debug/elf",
- "elf.R_SPARC_GLOB_JMP": "debug/elf",
- "elf.R_SPARC_GOT10": "debug/elf",
- "elf.R_SPARC_GOT13": "debug/elf",
- "elf.R_SPARC_GOT22": "debug/elf",
- "elf.R_SPARC_H44": "debug/elf",
- "elf.R_SPARC_HH22": "debug/elf",
- "elf.R_SPARC_HI22": "debug/elf",
- "elf.R_SPARC_HIPLT22": "debug/elf",
- "elf.R_SPARC_HIX22": "debug/elf",
- "elf.R_SPARC_HM10": "debug/elf",
- "elf.R_SPARC_JMP_SLOT": "debug/elf",
- "elf.R_SPARC_L44": "debug/elf",
- "elf.R_SPARC_LM22": "debug/elf",
- "elf.R_SPARC_LO10": "debug/elf",
- "elf.R_SPARC_LOPLT10": "debug/elf",
- "elf.R_SPARC_LOX10": "debug/elf",
- "elf.R_SPARC_M44": "debug/elf",
- "elf.R_SPARC_NONE": "debug/elf",
- "elf.R_SPARC_OLO10": "debug/elf",
- "elf.R_SPARC_PC10": "debug/elf",
- "elf.R_SPARC_PC22": "debug/elf",
- "elf.R_SPARC_PCPLT10": "debug/elf",
- "elf.R_SPARC_PCPLT22": "debug/elf",
- "elf.R_SPARC_PCPLT32": "debug/elf",
- "elf.R_SPARC_PC_HH22": "debug/elf",
- "elf.R_SPARC_PC_HM10": "debug/elf",
- "elf.R_SPARC_PC_LM22": "debug/elf",
- "elf.R_SPARC_PLT32": "debug/elf",
- "elf.R_SPARC_PLT64": "debug/elf",
- "elf.R_SPARC_REGISTER": "debug/elf",
- "elf.R_SPARC_RELATIVE": "debug/elf",
- "elf.R_SPARC_UA16": "debug/elf",
- "elf.R_SPARC_UA32": "debug/elf",
- "elf.R_SPARC_UA64": "debug/elf",
- "elf.R_SPARC_WDISP16": "debug/elf",
- "elf.R_SPARC_WDISP19": "debug/elf",
- "elf.R_SPARC_WDISP22": "debug/elf",
- "elf.R_SPARC_WDISP30": "debug/elf",
- "elf.R_SPARC_WPLT30": "debug/elf",
- "elf.R_SYM32": "debug/elf",
- "elf.R_SYM64": "debug/elf",
- "elf.R_TYPE32": "debug/elf",
- "elf.R_TYPE64": "debug/elf",
- "elf.R_X86_64": "debug/elf",
- "elf.R_X86_64_16": "debug/elf",
- "elf.R_X86_64_32": "debug/elf",
- "elf.R_X86_64_32S": "debug/elf",
- "elf.R_X86_64_64": "debug/elf",
- "elf.R_X86_64_8": "debug/elf",
- "elf.R_X86_64_COPY": "debug/elf",
- "elf.R_X86_64_DTPMOD64": "debug/elf",
- "elf.R_X86_64_DTPOFF32": "debug/elf",
- "elf.R_X86_64_DTPOFF64": "debug/elf",
- "elf.R_X86_64_GLOB_DAT": "debug/elf",
- "elf.R_X86_64_GOT32": "debug/elf",
- "elf.R_X86_64_GOTPCREL": "debug/elf",
- "elf.R_X86_64_GOTTPOFF": "debug/elf",
- "elf.R_X86_64_JMP_SLOT": "debug/elf",
- "elf.R_X86_64_NONE": "debug/elf",
- "elf.R_X86_64_PC16": "debug/elf",
- "elf.R_X86_64_PC32": "debug/elf",
- "elf.R_X86_64_PC8": "debug/elf",
- "elf.R_X86_64_PLT32": "debug/elf",
- "elf.R_X86_64_RELATIVE": "debug/elf",
- "elf.R_X86_64_TLSGD": "debug/elf",
- "elf.R_X86_64_TLSLD": "debug/elf",
- "elf.R_X86_64_TPOFF32": "debug/elf",
- "elf.R_X86_64_TPOFF64": "debug/elf",
- "elf.Rel32": "debug/elf",
- "elf.Rel64": "debug/elf",
- "elf.Rela32": "debug/elf",
- "elf.Rela64": "debug/elf",
- "elf.SHF_ALLOC": "debug/elf",
- "elf.SHF_COMPRESSED": "debug/elf",
- "elf.SHF_EXECINSTR": "debug/elf",
- "elf.SHF_GROUP": "debug/elf",
- "elf.SHF_INFO_LINK": "debug/elf",
- "elf.SHF_LINK_ORDER": "debug/elf",
- "elf.SHF_MASKOS": "debug/elf",
- "elf.SHF_MASKPROC": "debug/elf",
- "elf.SHF_MERGE": "debug/elf",
- "elf.SHF_OS_NONCONFORMING": "debug/elf",
- "elf.SHF_STRINGS": "debug/elf",
- "elf.SHF_TLS": "debug/elf",
- "elf.SHF_WRITE": "debug/elf",
- "elf.SHN_ABS": "debug/elf",
- "elf.SHN_COMMON": "debug/elf",
- "elf.SHN_HIOS": "debug/elf",
- "elf.SHN_HIPROC": "debug/elf",
- "elf.SHN_HIRESERVE": "debug/elf",
- "elf.SHN_LOOS": "debug/elf",
- "elf.SHN_LOPROC": "debug/elf",
- "elf.SHN_LORESERVE": "debug/elf",
- "elf.SHN_UNDEF": "debug/elf",
- "elf.SHN_XINDEX": "debug/elf",
- "elf.SHT_DYNAMIC": "debug/elf",
- "elf.SHT_DYNSYM": "debug/elf",
- "elf.SHT_FINI_ARRAY": "debug/elf",
- "elf.SHT_GNU_ATTRIBUTES": "debug/elf",
- "elf.SHT_GNU_HASH": "debug/elf",
- "elf.SHT_GNU_LIBLIST": "debug/elf",
- "elf.SHT_GNU_VERDEF": "debug/elf",
- "elf.SHT_GNU_VERNEED": "debug/elf",
- "elf.SHT_GNU_VERSYM": "debug/elf",
- "elf.SHT_GROUP": "debug/elf",
- "elf.SHT_HASH": "debug/elf",
- "elf.SHT_HIOS": "debug/elf",
- "elf.SHT_HIPROC": "debug/elf",
- "elf.SHT_HIUSER": "debug/elf",
- "elf.SHT_INIT_ARRAY": "debug/elf",
- "elf.SHT_LOOS": "debug/elf",
- "elf.SHT_LOPROC": "debug/elf",
- "elf.SHT_LOUSER": "debug/elf",
- "elf.SHT_NOBITS": "debug/elf",
- "elf.SHT_NOTE": "debug/elf",
- "elf.SHT_NULL": "debug/elf",
- "elf.SHT_PREINIT_ARRAY": "debug/elf",
- "elf.SHT_PROGBITS": "debug/elf",
- "elf.SHT_REL": "debug/elf",
- "elf.SHT_RELA": "debug/elf",
- "elf.SHT_SHLIB": "debug/elf",
- "elf.SHT_STRTAB": "debug/elf",
- "elf.SHT_SYMTAB": "debug/elf",
- "elf.SHT_SYMTAB_SHNDX": "debug/elf",
- "elf.STB_GLOBAL": "debug/elf",
- "elf.STB_HIOS": "debug/elf",
- "elf.STB_HIPROC": "debug/elf",
- "elf.STB_LOCAL": "debug/elf",
- "elf.STB_LOOS": "debug/elf",
- "elf.STB_LOPROC": "debug/elf",
- "elf.STB_WEAK": "debug/elf",
- "elf.STT_COMMON": "debug/elf",
- "elf.STT_FILE": "debug/elf",
- "elf.STT_FUNC": "debug/elf",
- "elf.STT_HIOS": "debug/elf",
- "elf.STT_HIPROC": "debug/elf",
- "elf.STT_LOOS": "debug/elf",
- "elf.STT_LOPROC": "debug/elf",
- "elf.STT_NOTYPE": "debug/elf",
- "elf.STT_OBJECT": "debug/elf",
- "elf.STT_SECTION": "debug/elf",
- "elf.STT_TLS": "debug/elf",
- "elf.STV_DEFAULT": "debug/elf",
- "elf.STV_HIDDEN": "debug/elf",
- "elf.STV_INTERNAL": "debug/elf",
- "elf.STV_PROTECTED": "debug/elf",
- "elf.ST_BIND": "debug/elf",
- "elf.ST_INFO": "debug/elf",
- "elf.ST_TYPE": "debug/elf",
- "elf.ST_VISIBILITY": "debug/elf",
- "elf.Section": "debug/elf",
- "elf.Section32": "debug/elf",
- "elf.Section64": "debug/elf",
- "elf.SectionFlag": "debug/elf",
- "elf.SectionHeader": "debug/elf",
- "elf.SectionIndex": "debug/elf",
- "elf.SectionType": "debug/elf",
- "elf.Sym32": "debug/elf",
- "elf.Sym32Size": "debug/elf",
- "elf.Sym64": "debug/elf",
- "elf.Sym64Size": "debug/elf",
- "elf.SymBind": "debug/elf",
- "elf.SymType": "debug/elf",
- "elf.SymVis": "debug/elf",
- "elf.Symbol": "debug/elf",
- "elf.Type": "debug/elf",
- "elf.Version": "debug/elf",
- "elliptic.Curve": "crypto/elliptic",
- "elliptic.CurveParams": "crypto/elliptic",
- "elliptic.GenerateKey": "crypto/elliptic",
- "elliptic.Marshal": "crypto/elliptic",
- "elliptic.P224": "crypto/elliptic",
- "elliptic.P256": "crypto/elliptic",
- "elliptic.P384": "crypto/elliptic",
- "elliptic.P521": "crypto/elliptic",
- "elliptic.Unmarshal": "crypto/elliptic",
- "encoding.BinaryMarshaler": "encoding",
- "encoding.BinaryUnmarshaler": "encoding",
- "encoding.TextMarshaler": "encoding",
- "encoding.TextUnmarshaler": "encoding",
- "errors.New": "errors",
- "exec.Cmd": "os/exec",
- "exec.Command": "os/exec",
- "exec.CommandContext": "os/exec",
- "exec.ErrNotFound": "os/exec",
- "exec.Error": "os/exec",
- "exec.ExitError": "os/exec",
- "exec.LookPath": "os/exec",
- "expvar.Do": "expvar",
- "expvar.Float": "expvar",
- "expvar.Func": "expvar",
- "expvar.Get": "expvar",
- "expvar.Handler": "expvar",
- "expvar.Int": "expvar",
- "expvar.KeyValue": "expvar",
- "expvar.Map": "expvar",
- "expvar.NewFloat": "expvar",
- "expvar.NewInt": "expvar",
- "expvar.NewMap": "expvar",
- "expvar.NewString": "expvar",
- "expvar.Publish": "expvar",
- "expvar.String": "expvar",
- "expvar.Var": "expvar",
- "fcgi.ErrConnClosed": "net/http/fcgi",
- "fcgi.ErrRequestAborted": "net/http/fcgi",
- "fcgi.ProcessEnv": "net/http/fcgi",
- "fcgi.Serve": "net/http/fcgi",
- "filepath.Abs": "path/filepath",
- "filepath.Base": "path/filepath",
- "filepath.Clean": "path/filepath",
- "filepath.Dir": "path/filepath",
- "filepath.ErrBadPattern": "path/filepath",
- "filepath.EvalSymlinks": "path/filepath",
- "filepath.Ext": "path/filepath",
- "filepath.FromSlash": "path/filepath",
- "filepath.Glob": "path/filepath",
- "filepath.HasPrefix": "path/filepath",
- "filepath.IsAbs": "path/filepath",
- "filepath.Join": "path/filepath",
- "filepath.ListSeparator": "path/filepath",
- "filepath.Match": "path/filepath",
- "filepath.Rel": "path/filepath",
- "filepath.Separator": "path/filepath",
- "filepath.SkipDir": "path/filepath",
- "filepath.Split": "path/filepath",
- "filepath.SplitList": "path/filepath",
- "filepath.ToSlash": "path/filepath",
- "filepath.VolumeName": "path/filepath",
- "filepath.Walk": "path/filepath",
- "filepath.WalkFunc": "path/filepath",
- "flag.Arg": "flag",
- "flag.Args": "flag",
- "flag.Bool": "flag",
- "flag.BoolVar": "flag",
- "flag.CommandLine": "flag",
- "flag.ContinueOnError": "flag",
- "flag.Duration": "flag",
- "flag.DurationVar": "flag",
- "flag.ErrHelp": "flag",
- "flag.ErrorHandling": "flag",
- "flag.ExitOnError": "flag",
- "flag.Flag": "flag",
- "flag.FlagSet": "flag",
- "flag.Float64": "flag",
- "flag.Float64Var": "flag",
- "flag.Getter": "flag",
- "flag.Int": "flag",
- "flag.Int64": "flag",
- "flag.Int64Var": "flag",
- "flag.IntVar": "flag",
- "flag.Lookup": "flag",
- "flag.NArg": "flag",
- "flag.NFlag": "flag",
- "flag.NewFlagSet": "flag",
- "flag.PanicOnError": "flag",
- "flag.Parse": "flag",
- "flag.Parsed": "flag",
- "flag.PrintDefaults": "flag",
- "flag.Set": "flag",
- "flag.String": "flag",
- "flag.StringVar": "flag",
- "flag.Uint": "flag",
- "flag.Uint64": "flag",
- "flag.Uint64Var": "flag",
- "flag.UintVar": "flag",
- "flag.UnquoteUsage": "flag",
- "flag.Usage": "flag",
- "flag.Value": "flag",
- "flag.Var": "flag",
- "flag.Visit": "flag",
- "flag.VisitAll": "flag",
- "flate.BestCompression": "compress/flate",
- "flate.BestSpeed": "compress/flate",
- "flate.CorruptInputError": "compress/flate",
- "flate.DefaultCompression": "compress/flate",
- "flate.HuffmanOnly": "compress/flate",
- "flate.InternalError": "compress/flate",
- "flate.NewReader": "compress/flate",
- "flate.NewReaderDict": "compress/flate",
- "flate.NewWriter": "compress/flate",
- "flate.NewWriterDict": "compress/flate",
- "flate.NoCompression": "compress/flate",
- "flate.ReadError": "compress/flate",
- "flate.Reader": "compress/flate",
- "flate.Resetter": "compress/flate",
- "flate.WriteError": "compress/flate",
- "flate.Writer": "compress/flate",
- "fmt.Errorf": "fmt",
- "fmt.Formatter": "fmt",
- "fmt.Fprint": "fmt",
- "fmt.Fprintf": "fmt",
- "fmt.Fprintln": "fmt",
- "fmt.Fscan": "fmt",
- "fmt.Fscanf": "fmt",
- "fmt.Fscanln": "fmt",
- "fmt.GoStringer": "fmt",
- "fmt.Print": "fmt",
- "fmt.Printf": "fmt",
- "fmt.Println": "fmt",
- "fmt.Scan": "fmt",
- "fmt.ScanState": "fmt",
- "fmt.Scanf": "fmt",
- "fmt.Scanln": "fmt",
- "fmt.Scanner": "fmt",
- "fmt.Sprint": "fmt",
- "fmt.Sprintf": "fmt",
- "fmt.Sprintln": "fmt",
- "fmt.Sscan": "fmt",
- "fmt.Sscanf": "fmt",
- "fmt.Sscanln": "fmt",
- "fmt.State": "fmt",
- "fmt.Stringer": "fmt",
- "fnv.New128": "hash/fnv",
- "fnv.New128a": "hash/fnv",
- "fnv.New32": "hash/fnv",
- "fnv.New32a": "hash/fnv",
- "fnv.New64": "hash/fnv",
- "fnv.New64a": "hash/fnv",
- "format.Node": "go/format",
- "format.Source": "go/format",
- "gif.Decode": "image/gif",
- "gif.DecodeAll": "image/gif",
- "gif.DecodeConfig": "image/gif",
- "gif.DisposalBackground": "image/gif",
- "gif.DisposalNone": "image/gif",
- "gif.DisposalPrevious": "image/gif",
- "gif.Encode": "image/gif",
- "gif.EncodeAll": "image/gif",
- "gif.GIF": "image/gif",
- "gif.Options": "image/gif",
- "gob.CommonType": "encoding/gob",
- "gob.Decoder": "encoding/gob",
- "gob.Encoder": "encoding/gob",
- "gob.GobDecoder": "encoding/gob",
- "gob.GobEncoder": "encoding/gob",
- "gob.NewDecoder": "encoding/gob",
- "gob.NewEncoder": "encoding/gob",
- "gob.Register": "encoding/gob",
- "gob.RegisterName": "encoding/gob",
- "gosym.DecodingError": "debug/gosym",
- "gosym.Func": "debug/gosym",
- "gosym.LineTable": "debug/gosym",
- "gosym.NewLineTable": "debug/gosym",
- "gosym.NewTable": "debug/gosym",
- "gosym.Obj": "debug/gosym",
- "gosym.Sym": "debug/gosym",
- "gosym.Table": "debug/gosym",
- "gosym.UnknownFileError": "debug/gosym",
- "gosym.UnknownLineError": "debug/gosym",
- "gzip.BestCompression": "compress/gzip",
- "gzip.BestSpeed": "compress/gzip",
- "gzip.DefaultCompression": "compress/gzip",
- "gzip.ErrChecksum": "compress/gzip",
- "gzip.ErrHeader": "compress/gzip",
- "gzip.Header": "compress/gzip",
- "gzip.HuffmanOnly": "compress/gzip",
- "gzip.NewReader": "compress/gzip",
- "gzip.NewWriter": "compress/gzip",
- "gzip.NewWriterLevel": "compress/gzip",
- "gzip.NoCompression": "compress/gzip",
- "gzip.Reader": "compress/gzip",
- "gzip.Writer": "compress/gzip",
- "hash.Hash": "hash",
- "hash.Hash32": "hash",
- "hash.Hash64": "hash",
- "heap.Fix": "container/heap",
- "heap.Init": "container/heap",
- "heap.Interface": "container/heap",
- "heap.Pop": "container/heap",
- "heap.Push": "container/heap",
- "heap.Remove": "container/heap",
- "hex.Decode": "encoding/hex",
- "hex.DecodeString": "encoding/hex",
- "hex.DecodedLen": "encoding/hex",
- "hex.Dump": "encoding/hex",
- "hex.Dumper": "encoding/hex",
- "hex.Encode": "encoding/hex",
- "hex.EncodeToString": "encoding/hex",
- "hex.EncodedLen": "encoding/hex",
- "hex.ErrLength": "encoding/hex",
- "hex.InvalidByteError": "encoding/hex",
- "hmac.Equal": "crypto/hmac",
- "hmac.New": "crypto/hmac",
- "html.EscapeString": "html",
- "html.UnescapeString": "html",
- "http.CanonicalHeaderKey": "net/http",
- "http.Client": "net/http",
- "http.CloseNotifier": "net/http",
- "http.ConnState": "net/http",
- "http.Cookie": "net/http",
- "http.CookieJar": "net/http",
- "http.DefaultClient": "net/http",
- "http.DefaultMaxHeaderBytes": "net/http",
- "http.DefaultMaxIdleConnsPerHost": "net/http",
- "http.DefaultServeMux": "net/http",
- "http.DefaultTransport": "net/http",
- "http.DetectContentType": "net/http",
- "http.Dir": "net/http",
- "http.ErrAbortHandler": "net/http",
- "http.ErrBodyNotAllowed": "net/http",
- "http.ErrBodyReadAfterClose": "net/http",
- "http.ErrContentLength": "net/http",
- "http.ErrHandlerTimeout": "net/http",
- "http.ErrHeaderTooLong": "net/http",
- "http.ErrHijacked": "net/http",
- "http.ErrLineTooLong": "net/http",
- "http.ErrMissingBoundary": "net/http",
- "http.ErrMissingContentLength": "net/http",
- "http.ErrMissingFile": "net/http",
- "http.ErrNoCookie": "net/http",
- "http.ErrNoLocation": "net/http",
- "http.ErrNotMultipart": "net/http",
- "http.ErrNotSupported": "net/http",
- "http.ErrServerClosed": "net/http",
- "http.ErrShortBody": "net/http",
- "http.ErrSkipAltProtocol": "net/http",
- "http.ErrUnexpectedTrailer": "net/http",
- "http.ErrUseLastResponse": "net/http",
- "http.ErrWriteAfterFlush": "net/http",
- "http.Error": "net/http",
- "http.File": "net/http",
- "http.FileServer": "net/http",
- "http.FileSystem": "net/http",
- "http.Flusher": "net/http",
- "http.Get": "net/http",
- "http.Handle": "net/http",
- "http.HandleFunc": "net/http",
- "http.Handler": "net/http",
- "http.HandlerFunc": "net/http",
- "http.Head": "net/http",
- "http.Header": "net/http",
- "http.Hijacker": "net/http",
- "http.ListenAndServe": "net/http",
- "http.ListenAndServeTLS": "net/http",
- "http.LocalAddrContextKey": "net/http",
- "http.MaxBytesReader": "net/http",
- "http.MethodConnect": "net/http",
- "http.MethodDelete": "net/http",
- "http.MethodGet": "net/http",
- "http.MethodHead": "net/http",
- "http.MethodOptions": "net/http",
- "http.MethodPatch": "net/http",
- "http.MethodPost": "net/http",
- "http.MethodPut": "net/http",
- "http.MethodTrace": "net/http",
- "http.NewFileTransport": "net/http",
- "http.NewRequest": "net/http",
- "http.NewServeMux": "net/http",
- "http.NoBody": "net/http",
- "http.NotFound": "net/http",
- "http.NotFoundHandler": "net/http",
- "http.ParseHTTPVersion": "net/http",
- "http.ParseTime": "net/http",
- "http.Post": "net/http",
- "http.PostForm": "net/http",
- "http.ProtocolError": "net/http",
- "http.ProxyFromEnvironment": "net/http",
- "http.ProxyURL": "net/http",
- "http.PushOptions": "net/http",
- "http.Pusher": "net/http",
- "http.ReadRequest": "net/http",
- "http.ReadResponse": "net/http",
- "http.Redirect": "net/http",
- "http.RedirectHandler": "net/http",
- "http.Request": "net/http",
- "http.Response": "net/http",
- "http.ResponseWriter": "net/http",
- "http.RoundTripper": "net/http",
- "http.Serve": "net/http",
- "http.ServeContent": "net/http",
- "http.ServeFile": "net/http",
- "http.ServeMux": "net/http",
- "http.ServeTLS": "net/http",
- "http.Server": "net/http",
- "http.ServerContextKey": "net/http",
- "http.SetCookie": "net/http",
- "http.StateActive": "net/http",
- "http.StateClosed": "net/http",
- "http.StateHijacked": "net/http",
- "http.StateIdle": "net/http",
- "http.StateNew": "net/http",
- "http.StatusAccepted": "net/http",
- "http.StatusAlreadyReported": "net/http",
- "http.StatusBadGateway": "net/http",
- "http.StatusBadRequest": "net/http",
- "http.StatusConflict": "net/http",
- "http.StatusContinue": "net/http",
- "http.StatusCreated": "net/http",
- "http.StatusExpectationFailed": "net/http",
- "http.StatusFailedDependency": "net/http",
- "http.StatusForbidden": "net/http",
- "http.StatusFound": "net/http",
- "http.StatusGatewayTimeout": "net/http",
- "http.StatusGone": "net/http",
- "http.StatusHTTPVersionNotSupported": "net/http",
- "http.StatusIMUsed": "net/http",
- "http.StatusInsufficientStorage": "net/http",
- "http.StatusInternalServerError": "net/http",
- "http.StatusLengthRequired": "net/http",
- "http.StatusLocked": "net/http",
- "http.StatusLoopDetected": "net/http",
- "http.StatusMethodNotAllowed": "net/http",
- "http.StatusMovedPermanently": "net/http",
- "http.StatusMultiStatus": "net/http",
- "http.StatusMultipleChoices": "net/http",
- "http.StatusNetworkAuthenticationRequired": "net/http",
- "http.StatusNoContent": "net/http",
- "http.StatusNonAuthoritativeInfo": "net/http",
- "http.StatusNotAcceptable": "net/http",
- "http.StatusNotExtended": "net/http",
- "http.StatusNotFound": "net/http",
- "http.StatusNotImplemented": "net/http",
- "http.StatusNotModified": "net/http",
- "http.StatusOK": "net/http",
- "http.StatusPartialContent": "net/http",
- "http.StatusPaymentRequired": "net/http",
- "http.StatusPermanentRedirect": "net/http",
- "http.StatusPreconditionFailed": "net/http",
- "http.StatusPreconditionRequired": "net/http",
- "http.StatusProcessing": "net/http",
- "http.StatusProxyAuthRequired": "net/http",
- "http.StatusRequestEntityTooLarge": "net/http",
- "http.StatusRequestHeaderFieldsTooLarge": "net/http",
- "http.StatusRequestTimeout": "net/http",
- "http.StatusRequestURITooLong": "net/http",
- "http.StatusRequestedRangeNotSatisfiable": "net/http",
- "http.StatusResetContent": "net/http",
- "http.StatusSeeOther": "net/http",
- "http.StatusServiceUnavailable": "net/http",
- "http.StatusSwitchingProtocols": "net/http",
- "http.StatusTeapot": "net/http",
- "http.StatusTemporaryRedirect": "net/http",
- "http.StatusText": "net/http",
- "http.StatusTooManyRequests": "net/http",
- "http.StatusUnauthorized": "net/http",
- "http.StatusUnavailableForLegalReasons": "net/http",
- "http.StatusUnprocessableEntity": "net/http",
- "http.StatusUnsupportedMediaType": "net/http",
- "http.StatusUpgradeRequired": "net/http",
- "http.StatusUseProxy": "net/http",
- "http.StatusVariantAlsoNegotiates": "net/http",
- "http.StripPrefix": "net/http",
- "http.TimeFormat": "net/http",
- "http.TimeoutHandler": "net/http",
- "http.TrailerPrefix": "net/http",
- "http.Transport": "net/http",
- "httptest.DefaultRemoteAddr": "net/http/httptest",
- "httptest.NewRecorder": "net/http/httptest",
- "httptest.NewRequest": "net/http/httptest",
- "httptest.NewServer": "net/http/httptest",
- "httptest.NewTLSServer": "net/http/httptest",
- "httptest.NewUnstartedServer": "net/http/httptest",
- "httptest.ResponseRecorder": "net/http/httptest",
- "httptest.Server": "net/http/httptest",
- "httptrace.ClientTrace": "net/http/httptrace",
- "httptrace.ContextClientTrace": "net/http/httptrace",
- "httptrace.DNSDoneInfo": "net/http/httptrace",
- "httptrace.DNSStartInfo": "net/http/httptrace",
- "httptrace.GotConnInfo": "net/http/httptrace",
- "httptrace.WithClientTrace": "net/http/httptrace",
- "httptrace.WroteRequestInfo": "net/http/httptrace",
- "httputil.BufferPool": "net/http/httputil",
- "httputil.ClientConn": "net/http/httputil",
- "httputil.DumpRequest": "net/http/httputil",
- "httputil.DumpRequestOut": "net/http/httputil",
- "httputil.DumpResponse": "net/http/httputil",
- "httputil.ErrClosed": "net/http/httputil",
- "httputil.ErrLineTooLong": "net/http/httputil",
- "httputil.ErrPersistEOF": "net/http/httputil",
- "httputil.ErrPipeline": "net/http/httputil",
- "httputil.NewChunkedReader": "net/http/httputil",
- "httputil.NewChunkedWriter": "net/http/httputil",
- "httputil.NewClientConn": "net/http/httputil",
- "httputil.NewProxyClientConn": "net/http/httputil",
- "httputil.NewServerConn": "net/http/httputil",
- "httputil.NewSingleHostReverseProxy": "net/http/httputil",
- "httputil.ReverseProxy": "net/http/httputil",
- "httputil.ServerConn": "net/http/httputil",
- "image.Alpha": "image",
- "image.Alpha16": "image",
- "image.Black": "image",
- "image.CMYK": "image",
- "image.Config": "image",
- "image.Decode": "image",
- "image.DecodeConfig": "image",
- "image.ErrFormat": "image",
- "image.Gray": "image",
- "image.Gray16": "image",
- "image.Image": "image",
- "image.NRGBA": "image",
- "image.NRGBA64": "image",
- "image.NYCbCrA": "image",
- "image.NewAlpha": "image",
- "image.NewAlpha16": "image",
- "image.NewCMYK": "image",
- "image.NewGray": "image",
- "image.NewGray16": "image",
- "image.NewNRGBA": "image",
- "image.NewNRGBA64": "image",
- "image.NewNYCbCrA": "image",
- "image.NewPaletted": "image",
- "image.NewRGBA": "image",
- "image.NewRGBA64": "image",
- "image.NewUniform": "image",
- "image.NewYCbCr": "image",
- "image.Opaque": "image",
- "image.Paletted": "image",
- "image.PalettedImage": "image",
- "image.Point": "image",
- "image.Pt": "image",
- "image.RGBA": "image",
- "image.RGBA64": "image",
- "image.Rect": "image",
- "image.Rectangle": "image",
- "image.RegisterFormat": "image",
- "image.Transparent": "image",
- "image.Uniform": "image",
- "image.White": "image",
- "image.YCbCr": "image",
- "image.YCbCrSubsampleRatio": "image",
- "image.YCbCrSubsampleRatio410": "image",
- "image.YCbCrSubsampleRatio411": "image",
- "image.YCbCrSubsampleRatio420": "image",
- "image.YCbCrSubsampleRatio422": "image",
- "image.YCbCrSubsampleRatio440": "image",
- "image.YCbCrSubsampleRatio444": "image",
- "image.ZP": "image",
- "image.ZR": "image",
- "importer.Default": "go/importer",
- "importer.For": "go/importer",
- "importer.Lookup": "go/importer",
- "io.ByteReader": "io",
- "io.ByteScanner": "io",
- "io.ByteWriter": "io",
- "io.Closer": "io",
- "io.Copy": "io",
- "io.CopyBuffer": "io",
- "io.CopyN": "io",
- "io.EOF": "io",
- "io.ErrClosedPipe": "io",
- "io.ErrNoProgress": "io",
- "io.ErrShortBuffer": "io",
- "io.ErrShortWrite": "io",
- "io.ErrUnexpectedEOF": "io",
- "io.LimitReader": "io",
- "io.LimitedReader": "io",
- "io.MultiReader": "io",
- "io.MultiWriter": "io",
- "io.NewSectionReader": "io",
- "io.Pipe": "io",
- "io.PipeReader": "io",
- "io.PipeWriter": "io",
- "io.ReadAtLeast": "io",
- "io.ReadCloser": "io",
- "io.ReadFull": "io",
- "io.ReadSeeker": "io",
- "io.ReadWriteCloser": "io",
- "io.ReadWriteSeeker": "io",
- "io.ReadWriter": "io",
- "io.Reader": "io",
- "io.ReaderAt": "io",
- "io.ReaderFrom": "io",
- "io.RuneReader": "io",
- "io.RuneScanner": "io",
- "io.SectionReader": "io",
- "io.SeekCurrent": "io",
- "io.SeekEnd": "io",
- "io.SeekStart": "io",
- "io.Seeker": "io",
- "io.TeeReader": "io",
- "io.WriteCloser": "io",
- "io.WriteSeeker": "io",
- "io.WriteString": "io",
- "io.Writer": "io",
- "io.WriterAt": "io",
- "io.WriterTo": "io",
- "iotest.DataErrReader": "testing/iotest",
- "iotest.ErrTimeout": "testing/iotest",
- "iotest.HalfReader": "testing/iotest",
- "iotest.NewReadLogger": "testing/iotest",
- "iotest.NewWriteLogger": "testing/iotest",
- "iotest.OneByteReader": "testing/iotest",
- "iotest.TimeoutReader": "testing/iotest",
- "iotest.TruncateWriter": "testing/iotest",
- "ioutil.Discard": "io/ioutil",
- "ioutil.NopCloser": "io/ioutil",
- "ioutil.ReadAll": "io/ioutil",
- "ioutil.ReadDir": "io/ioutil",
- "ioutil.ReadFile": "io/ioutil",
- "ioutil.TempDir": "io/ioutil",
- "ioutil.TempFile": "io/ioutil",
- "ioutil.WriteFile": "io/ioutil",
- "jpeg.Decode": "image/jpeg",
- "jpeg.DecodeConfig": "image/jpeg",
- "jpeg.DefaultQuality": "image/jpeg",
- "jpeg.Encode": "image/jpeg",
- "jpeg.FormatError": "image/jpeg",
- "jpeg.Options": "image/jpeg",
- "jpeg.Reader": "image/jpeg",
- "jpeg.UnsupportedError": "image/jpeg",
- "json.Compact": "encoding/json",
- "json.Decoder": "encoding/json",
- "json.Delim": "encoding/json",
- "json.Encoder": "encoding/json",
- "json.HTMLEscape": "encoding/json",
- "json.Indent": "encoding/json",
- "json.InvalidUTF8Error": "encoding/json",
- "json.InvalidUnmarshalError": "encoding/json",
- "json.Marshal": "encoding/json",
- "json.MarshalIndent": "encoding/json",
- "json.Marshaler": "encoding/json",
- "json.MarshalerError": "encoding/json",
- "json.NewDecoder": "encoding/json",
- "json.NewEncoder": "encoding/json",
- "json.Number": "encoding/json",
- "json.RawMessage": "encoding/json",
- "json.SyntaxError": "encoding/json",
- "json.Token": "encoding/json",
- "json.Unmarshal": "encoding/json",
- "json.UnmarshalFieldError": "encoding/json",
- "json.UnmarshalTypeError": "encoding/json",
- "json.Unmarshaler": "encoding/json",
- "json.UnsupportedTypeError": "encoding/json",
- "json.UnsupportedValueError": "encoding/json",
- "json.Valid": "encoding/json",
- "jsonrpc.Dial": "net/rpc/jsonrpc",
- "jsonrpc.NewClient": "net/rpc/jsonrpc",
- "jsonrpc.NewClientCodec": "net/rpc/jsonrpc",
- "jsonrpc.NewServerCodec": "net/rpc/jsonrpc",
- "jsonrpc.ServeConn": "net/rpc/jsonrpc",
- "list.Element": "container/list",
- "list.List": "container/list",
- "list.New": "container/list",
- "log.Fatal": "log",
- "log.Fatalf": "log",
- "log.Fatalln": "log",
- "log.Flags": "log",
- "log.LUTC": "log",
- "log.Ldate": "log",
- "log.Llongfile": "log",
- "log.Lmicroseconds": "log",
- "log.Logger": "log",
- "log.Lshortfile": "log",
- "log.LstdFlags": "log",
- "log.Ltime": "log",
- "log.New": "log",
- "log.Output": "log",
- "log.Panic": "log",
- "log.Panicf": "log",
- "log.Panicln": "log",
- "log.Prefix": "log",
- "log.Print": "log",
- "log.Printf": "log",
- "log.Println": "log",
- "log.SetFlags": "log",
- "log.SetOutput": "log",
- "log.SetPrefix": "log",
- "lzw.LSB": "compress/lzw",
- "lzw.MSB": "compress/lzw",
- "lzw.NewReader": "compress/lzw",
- "lzw.NewWriter": "compress/lzw",
- "lzw.Order": "compress/lzw",
- "macho.Cpu": "debug/macho",
- "macho.Cpu386": "debug/macho",
- "macho.CpuAmd64": "debug/macho",
- "macho.CpuArm": "debug/macho",
- "macho.CpuPpc": "debug/macho",
- "macho.CpuPpc64": "debug/macho",
- "macho.Dylib": "debug/macho",
- "macho.DylibCmd": "debug/macho",
- "macho.Dysymtab": "debug/macho",
- "macho.DysymtabCmd": "debug/macho",
- "macho.ErrNotFat": "debug/macho",
- "macho.FatArch": "debug/macho",
- "macho.FatArchHeader": "debug/macho",
- "macho.FatFile": "debug/macho",
- "macho.File": "debug/macho",
- "macho.FileHeader": "debug/macho",
- "macho.FormatError": "debug/macho",
- "macho.Load": "debug/macho",
- "macho.LoadBytes": "debug/macho",
- "macho.LoadCmd": "debug/macho",
- "macho.LoadCmdDylib": "debug/macho",
- "macho.LoadCmdDylinker": "debug/macho",
- "macho.LoadCmdDysymtab": "debug/macho",
- "macho.LoadCmdSegment": "debug/macho",
- "macho.LoadCmdSegment64": "debug/macho",
- "macho.LoadCmdSymtab": "debug/macho",
- "macho.LoadCmdThread": "debug/macho",
- "macho.LoadCmdUnixThread": "debug/macho",
- "macho.Magic32": "debug/macho",
- "macho.Magic64": "debug/macho",
- "macho.MagicFat": "debug/macho",
- "macho.NewFatFile": "debug/macho",
- "macho.NewFile": "debug/macho",
- "macho.Nlist32": "debug/macho",
- "macho.Nlist64": "debug/macho",
- "macho.Open": "debug/macho",
- "macho.OpenFat": "debug/macho",
- "macho.Regs386": "debug/macho",
- "macho.RegsAMD64": "debug/macho",
- "macho.Section": "debug/macho",
- "macho.Section32": "debug/macho",
- "macho.Section64": "debug/macho",
- "macho.SectionHeader": "debug/macho",
- "macho.Segment": "debug/macho",
- "macho.Segment32": "debug/macho",
- "macho.Segment64": "debug/macho",
- "macho.SegmentHeader": "debug/macho",
- "macho.Symbol": "debug/macho",
- "macho.Symtab": "debug/macho",
- "macho.SymtabCmd": "debug/macho",
- "macho.Thread": "debug/macho",
- "macho.Type": "debug/macho",
- "macho.TypeBundle": "debug/macho",
- "macho.TypeDylib": "debug/macho",
- "macho.TypeExec": "debug/macho",
- "macho.TypeObj": "debug/macho",
- "mail.Address": "net/mail",
- "mail.AddressParser": "net/mail",
- "mail.ErrHeaderNotPresent": "net/mail",
- "mail.Header": "net/mail",
- "mail.Message": "net/mail",
- "mail.ParseAddress": "net/mail",
- "mail.ParseAddressList": "net/mail",
- "mail.ParseDate": "net/mail",
- "mail.ReadMessage": "net/mail",
- "math.Abs": "math",
- "math.Acos": "math",
- "math.Acosh": "math",
- "math.Asin": "math",
- "math.Asinh": "math",
- "math.Atan": "math",
- "math.Atan2": "math",
- "math.Atanh": "math",
- "math.Cbrt": "math",
- "math.Ceil": "math",
- "math.Copysign": "math",
- "math.Cos": "math",
- "math.Cosh": "math",
- "math.Dim": "math",
- "math.E": "math",
- "math.Erf": "math",
- "math.Erfc": "math",
- "math.Exp": "math",
- "math.Exp2": "math",
- "math.Expm1": "math",
- "math.Float32bits": "math",
- "math.Float32frombits": "math",
- "math.Float64bits": "math",
- "math.Float64frombits": "math",
- "math.Floor": "math",
- "math.Frexp": "math",
- "math.Gamma": "math",
- "math.Hypot": "math",
- "math.Ilogb": "math",
- "math.Inf": "math",
- "math.IsInf": "math",
- "math.IsNaN": "math",
- "math.J0": "math",
- "math.J1": "math",
- "math.Jn": "math",
- "math.Ldexp": "math",
- "math.Lgamma": "math",
- "math.Ln10": "math",
- "math.Ln2": "math",
- "math.Log": "math",
- "math.Log10": "math",
- "math.Log10E": "math",
- "math.Log1p": "math",
- "math.Log2": "math",
- "math.Log2E": "math",
- "math.Logb": "math",
- "math.Max": "math",
- "math.MaxFloat32": "math",
- "math.MaxFloat64": "math",
- "math.MaxInt16": "math",
- "math.MaxInt32": "math",
- "math.MaxInt64": "math",
- "math.MaxInt8": "math",
- "math.MaxUint16": "math",
- "math.MaxUint32": "math",
- "math.MaxUint64": "math",
- "math.MaxUint8": "math",
- "math.Min": "math",
- "math.MinInt16": "math",
- "math.MinInt32": "math",
- "math.MinInt64": "math",
- "math.MinInt8": "math",
- "math.Mod": "math",
- "math.Modf": "math",
- "math.NaN": "math",
- "math.Nextafter": "math",
- "math.Nextafter32": "math",
- "math.Phi": "math",
- "math.Pi": "math",
- "math.Pow": "math",
- "math.Pow10": "math",
- "math.Remainder": "math",
- "math.Signbit": "math",
- "math.Sin": "math",
- "math.Sincos": "math",
- "math.Sinh": "math",
- "math.SmallestNonzeroFloat32": "math",
- "math.SmallestNonzeroFloat64": "math",
- "math.Sqrt": "math",
- "math.Sqrt2": "math",
- "math.SqrtE": "math",
- "math.SqrtPhi": "math",
- "math.SqrtPi": "math",
- "math.Tan": "math",
- "math.Tanh": "math",
- "math.Trunc": "math",
- "math.Y0": "math",
- "math.Y1": "math",
- "math.Yn": "math",
- "md5.BlockSize": "crypto/md5",
- "md5.New": "crypto/md5",
- "md5.Size": "crypto/md5",
- "md5.Sum": "crypto/md5",
- "mime.AddExtensionType": "mime",
- "mime.BEncoding": "mime",
- "mime.ErrInvalidMediaParameter": "mime",
- "mime.ExtensionsByType": "mime",
- "mime.FormatMediaType": "mime",
- "mime.ParseMediaType": "mime",
- "mime.QEncoding": "mime",
- "mime.TypeByExtension": "mime",
- "mime.WordDecoder": "mime",
- "mime.WordEncoder": "mime",
- "multipart.ErrMessageTooLarge": "mime/multipart",
- "multipart.File": "mime/multipart",
- "multipart.FileHeader": "mime/multipart",
- "multipart.Form": "mime/multipart",
- "multipart.NewReader": "mime/multipart",
- "multipart.NewWriter": "mime/multipart",
- "multipart.Part": "mime/multipart",
- "multipart.Reader": "mime/multipart",
- "multipart.Writer": "mime/multipart",
- "net.Addr": "net",
- "net.AddrError": "net",
- "net.Buffers": "net",
- "net.CIDRMask": "net",
- "net.Conn": "net",
- "net.DNSConfigError": "net",
- "net.DNSError": "net",
- "net.DefaultResolver": "net",
- "net.Dial": "net",
- "net.DialIP": "net",
- "net.DialTCP": "net",
- "net.DialTimeout": "net",
- "net.DialUDP": "net",
- "net.DialUnix": "net",
- "net.Dialer": "net",
- "net.ErrWriteToConnected": "net",
- "net.Error": "net",
- "net.FileConn": "net",
- "net.FileListener": "net",
- "net.FilePacketConn": "net",
- "net.FlagBroadcast": "net",
- "net.FlagLoopback": "net",
- "net.FlagMulticast": "net",
- "net.FlagPointToPoint": "net",
- "net.FlagUp": "net",
- "net.Flags": "net",
- "net.HardwareAddr": "net",
- "net.IP": "net",
- "net.IPAddr": "net",
- "net.IPConn": "net",
- "net.IPMask": "net",
- "net.IPNet": "net",
- "net.IPv4": "net",
- "net.IPv4Mask": "net",
- "net.IPv4allrouter": "net",
- "net.IPv4allsys": "net",
- "net.IPv4bcast": "net",
- "net.IPv4len": "net",
- "net.IPv4zero": "net",
- "net.IPv6interfacelocalallnodes": "net",
- "net.IPv6len": "net",
- "net.IPv6linklocalallnodes": "net",
- "net.IPv6linklocalallrouters": "net",
- "net.IPv6loopback": "net",
- "net.IPv6unspecified": "net",
- "net.IPv6zero": "net",
- "net.Interface": "net",
- "net.InterfaceAddrs": "net",
- "net.InterfaceByIndex": "net",
- "net.InterfaceByName": "net",
- "net.Interfaces": "net",
- "net.InvalidAddrError": "net",
- "net.JoinHostPort": "net",
- "net.Listen": "net",
- "net.ListenIP": "net",
- "net.ListenMulticastUDP": "net",
- "net.ListenPacket": "net",
- "net.ListenTCP": "net",
- "net.ListenUDP": "net",
- "net.ListenUnix": "net",
- "net.ListenUnixgram": "net",
- "net.Listener": "net",
- "net.LookupAddr": "net",
- "net.LookupCNAME": "net",
- "net.LookupHost": "net",
- "net.LookupIP": "net",
- "net.LookupMX": "net",
- "net.LookupNS": "net",
- "net.LookupPort": "net",
- "net.LookupSRV": "net",
- "net.LookupTXT": "net",
- "net.MX": "net",
- "net.NS": "net",
- "net.OpError": "net",
- "net.PacketConn": "net",
- "net.ParseCIDR": "net",
- "net.ParseError": "net",
- "net.ParseIP": "net",
- "net.ParseMAC": "net",
- "net.Pipe": "net",
- "net.ResolveIPAddr": "net",
- "net.ResolveTCPAddr": "net",
- "net.ResolveUDPAddr": "net",
- "net.ResolveUnixAddr": "net",
- "net.Resolver": "net",
- "net.SRV": "net",
- "net.SplitHostPort": "net",
- "net.TCPAddr": "net",
- "net.TCPConn": "net",
- "net.TCPListener": "net",
- "net.UDPAddr": "net",
- "net.UDPConn": "net",
- "net.UnixAddr": "net",
- "net.UnixConn": "net",
- "net.UnixListener": "net",
- "net.UnknownNetworkError": "net",
- "os.Args": "os",
- "os.Chdir": "os",
- "os.Chmod": "os",
- "os.Chown": "os",
- "os.Chtimes": "os",
- "os.Clearenv": "os",
- "os.Create": "os",
- "os.DevNull": "os",
- "os.Environ": "os",
- "os.ErrClosed": "os",
- "os.ErrExist": "os",
- "os.ErrInvalid": "os",
- "os.ErrNotExist": "os",
- "os.ErrPermission": "os",
- "os.Executable": "os",
- "os.Exit": "os",
- "os.Expand": "os",
- "os.ExpandEnv": "os",
- "os.File": "os",
- "os.FileInfo": "os",
- "os.FileMode": "os",
- "os.FindProcess": "os",
- "os.Getegid": "os",
- "os.Getenv": "os",
- "os.Geteuid": "os",
- "os.Getgid": "os",
- "os.Getgroups": "os",
- "os.Getpagesize": "os",
- "os.Getpid": "os",
- "os.Getppid": "os",
- "os.Getuid": "os",
- "os.Getwd": "os",
- "os.Hostname": "os",
- "os.Interrupt": "os",
- "os.IsExist": "os",
- "os.IsNotExist": "os",
- "os.IsPathSeparator": "os",
- "os.IsPermission": "os",
- "os.Kill": "os",
- "os.Lchown": "os",
- "os.Link": "os",
- "os.LinkError": "os",
- "os.LookupEnv": "os",
- "os.Lstat": "os",
- "os.Mkdir": "os",
- "os.MkdirAll": "os",
- "os.ModeAppend": "os",
- "os.ModeCharDevice": "os",
- "os.ModeDevice": "os",
- "os.ModeDir": "os",
- "os.ModeExclusive": "os",
- "os.ModeNamedPipe": "os",
- "os.ModePerm": "os",
- "os.ModeSetgid": "os",
- "os.ModeSetuid": "os",
- "os.ModeSocket": "os",
- "os.ModeSticky": "os",
- "os.ModeSymlink": "os",
- "os.ModeTemporary": "os",
- "os.ModeType": "os",
- "os.NewFile": "os",
- "os.NewSyscallError": "os",
- "os.O_APPEND": "os",
- "os.O_CREATE": "os",
- "os.O_EXCL": "os",
- "os.O_RDONLY": "os",
- "os.O_RDWR": "os",
- "os.O_SYNC": "os",
- "os.O_TRUNC": "os",
- "os.O_WRONLY": "os",
- "os.Open": "os",
- "os.OpenFile": "os",
- "os.PathError": "os",
- "os.PathListSeparator": "os",
- "os.PathSeparator": "os",
- "os.Pipe": "os",
- "os.ProcAttr": "os",
- "os.Process": "os",
- "os.ProcessState": "os",
- "os.Readlink": "os",
- "os.Remove": "os",
- "os.RemoveAll": "os",
- "os.Rename": "os",
- "os.SEEK_CUR": "os",
- "os.SEEK_END": "os",
- "os.SEEK_SET": "os",
- "os.SameFile": "os",
- "os.Setenv": "os",
- "os.Signal": "os",
- "os.StartProcess": "os",
- "os.Stat": "os",
- "os.Stderr": "os",
- "os.Stdin": "os",
- "os.Stdout": "os",
- "os.Symlink": "os",
- "os.SyscallError": "os",
- "os.TempDir": "os",
- "os.Truncate": "os",
- "os.Unsetenv": "os",
- "palette.Plan9": "image/color/palette",
- "palette.WebSafe": "image/color/palette",
- "parse.ActionNode": "text/template/parse",
- "parse.BoolNode": "text/template/parse",
- "parse.BranchNode": "text/template/parse",
- "parse.ChainNode": "text/template/parse",
- "parse.CommandNode": "text/template/parse",
- "parse.DotNode": "text/template/parse",
- "parse.FieldNode": "text/template/parse",
- "parse.IdentifierNode": "text/template/parse",
- "parse.IfNode": "text/template/parse",
- "parse.IsEmptyTree": "text/template/parse",
- "parse.ListNode": "text/template/parse",
- "parse.New": "text/template/parse",
- "parse.NewIdentifier": "text/template/parse",
- "parse.NilNode": "text/template/parse",
- "parse.Node": "text/template/parse",
- "parse.NodeAction": "text/template/parse",
- "parse.NodeBool": "text/template/parse",
- "parse.NodeChain": "text/template/parse",
- "parse.NodeCommand": "text/template/parse",
- "parse.NodeDot": "text/template/parse",
- "parse.NodeField": "text/template/parse",
- "parse.NodeIdentifier": "text/template/parse",
- "parse.NodeIf": "text/template/parse",
- "parse.NodeList": "text/template/parse",
- "parse.NodeNil": "text/template/parse",
- "parse.NodeNumber": "text/template/parse",
- "parse.NodePipe": "text/template/parse",
- "parse.NodeRange": "text/template/parse",
- "parse.NodeString": "text/template/parse",
- "parse.NodeTemplate": "text/template/parse",
- "parse.NodeText": "text/template/parse",
- "parse.NodeType": "text/template/parse",
- "parse.NodeVariable": "text/template/parse",
- "parse.NodeWith": "text/template/parse",
- "parse.NumberNode": "text/template/parse",
- "parse.Parse": "text/template/parse",
- "parse.PipeNode": "text/template/parse",
- "parse.Pos": "text/template/parse",
- "parse.RangeNode": "text/template/parse",
- "parse.StringNode": "text/template/parse",
- "parse.TemplateNode": "text/template/parse",
- "parse.TextNode": "text/template/parse",
- "parse.Tree": "text/template/parse",
- "parse.VariableNode": "text/template/parse",
- "parse.WithNode": "text/template/parse",
- "parser.AllErrors": "go/parser",
- "parser.DeclarationErrors": "go/parser",
- "parser.ImportsOnly": "go/parser",
- "parser.Mode": "go/parser",
- "parser.PackageClauseOnly": "go/parser",
- "parser.ParseComments": "go/parser",
- "parser.ParseDir": "go/parser",
- "parser.ParseExpr": "go/parser",
- "parser.ParseExprFrom": "go/parser",
- "parser.ParseFile": "go/parser",
- "parser.SpuriousErrors": "go/parser",
- "parser.Trace": "go/parser",
- "path.Base": "path",
- "path.Clean": "path",
- "path.Dir": "path",
- "path.ErrBadPattern": "path",
- "path.Ext": "path",
- "path.IsAbs": "path",
- "path.Join": "path",
- "path.Match": "path",
- "path.Split": "path",
- "pe.COFFSymbol": "debug/pe",
- "pe.COFFSymbolSize": "debug/pe",
- "pe.DataDirectory": "debug/pe",
- "pe.File": "debug/pe",
- "pe.FileHeader": "debug/pe",
- "pe.FormatError": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_AM33": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_AMD64": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_ARM": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_EBC": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_I386": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_IA64": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_M32R": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_MIPS16": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_MIPSFPU": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_MIPSFPU16": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_POWERPC": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_POWERPCFP": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_R4000": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_SH3": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_SH3DSP": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_SH4": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_SH5": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_THUMB": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_UNKNOWN": "debug/pe",
- "pe.IMAGE_FILE_MACHINE_WCEMIPSV2": "debug/pe",
- "pe.ImportDirectory": "debug/pe",
- "pe.NewFile": "debug/pe",
- "pe.Open": "debug/pe",
- "pe.OptionalHeader32": "debug/pe",
- "pe.OptionalHeader64": "debug/pe",
- "pe.Reloc": "debug/pe",
- "pe.Section": "debug/pe",
- "pe.SectionHeader": "debug/pe",
- "pe.SectionHeader32": "debug/pe",
- "pe.StringTable": "debug/pe",
- "pe.Symbol": "debug/pe",
- "pem.Block": "encoding/pem",
- "pem.Decode": "encoding/pem",
- "pem.Encode": "encoding/pem",
- "pem.EncodeToMemory": "encoding/pem",
- "pkix.AlgorithmIdentifier": "crypto/x509/pkix",
- "pkix.AttributeTypeAndValue": "crypto/x509/pkix",
- "pkix.AttributeTypeAndValueSET": "crypto/x509/pkix",
- "pkix.CertificateList": "crypto/x509/pkix",
- "pkix.Extension": "crypto/x509/pkix",
- "pkix.Name": "crypto/x509/pkix",
- "pkix.RDNSequence": "crypto/x509/pkix",
- "pkix.RelativeDistinguishedNameSET": "crypto/x509/pkix",
- "pkix.RevokedCertificate": "crypto/x509/pkix",
- "pkix.TBSCertificateList": "crypto/x509/pkix",
- "plan9obj.File": "debug/plan9obj",
- "plan9obj.FileHeader": "debug/plan9obj",
- "plan9obj.Magic386": "debug/plan9obj",
- "plan9obj.Magic64": "debug/plan9obj",
- "plan9obj.MagicAMD64": "debug/plan9obj",
- "plan9obj.MagicARM": "debug/plan9obj",
- "plan9obj.NewFile": "debug/plan9obj",
- "plan9obj.Open": "debug/plan9obj",
- "plan9obj.Section": "debug/plan9obj",
- "plan9obj.SectionHeader": "debug/plan9obj",
- "plan9obj.Sym": "debug/plan9obj",
- "plugin.Open": "plugin",
- "plugin.Plugin": "plugin",
- "plugin.Symbol": "plugin",
- "png.BestCompression": "image/png",
- "png.BestSpeed": "image/png",
- "png.CompressionLevel": "image/png",
- "png.Decode": "image/png",
- "png.DecodeConfig": "image/png",
- "png.DefaultCompression": "image/png",
- "png.Encode": "image/png",
- "png.Encoder": "image/png",
- "png.EncoderBuffer": "image/png",
- "png.EncoderBufferPool": "image/png",
- "png.FormatError": "image/png",
- "png.NoCompression": "image/png",
- "png.UnsupportedError": "image/png",
- "pprof.Cmdline": "net/http/pprof",
- "pprof.Do": "runtime/pprof",
- "pprof.ForLabels": "runtime/pprof",
- "pprof.Handler": "net/http/pprof",
- "pprof.Index": "net/http/pprof",
- "pprof.Label": "runtime/pprof",
- "pprof.LabelSet": "runtime/pprof",
- "pprof.Labels": "runtime/pprof",
- "pprof.Lookup": "runtime/pprof",
- "pprof.NewProfile": "runtime/pprof",
- // "pprof.Profile" is ambiguous
- "pprof.Profiles": "runtime/pprof",
- "pprof.SetGoroutineLabels": "runtime/pprof",
- "pprof.StartCPUProfile": "runtime/pprof",
- "pprof.StopCPUProfile": "runtime/pprof",
- "pprof.Symbol": "net/http/pprof",
- "pprof.Trace": "net/http/pprof",
- "pprof.WithLabels": "runtime/pprof",
- "pprof.WriteHeapProfile": "runtime/pprof",
- "printer.CommentedNode": "go/printer",
- "printer.Config": "go/printer",
- "printer.Fprint": "go/printer",
- "printer.Mode": "go/printer",
- "printer.RawFormat": "go/printer",
- "printer.SourcePos": "go/printer",
- "printer.TabIndent": "go/printer",
- "printer.UseSpaces": "go/printer",
- "quick.Check": "testing/quick",
- "quick.CheckEqual": "testing/quick",
- "quick.CheckEqualError": "testing/quick",
- "quick.CheckError": "testing/quick",
- "quick.Config": "testing/quick",
- "quick.Generator": "testing/quick",
- "quick.SetupError": "testing/quick",
- "quick.Value": "testing/quick",
- "quotedprintable.NewReader": "mime/quotedprintable",
- "quotedprintable.NewWriter": "mime/quotedprintable",
- "quotedprintable.Reader": "mime/quotedprintable",
- "quotedprintable.Writer": "mime/quotedprintable",
- "rand.ExpFloat64": "math/rand",
- "rand.Float32": "math/rand",
- "rand.Float64": "math/rand",
- // "rand.Int" is ambiguous
- "rand.Int31": "math/rand",
- "rand.Int31n": "math/rand",
- "rand.Int63": "math/rand",
- "rand.Int63n": "math/rand",
- "rand.Intn": "math/rand",
- "rand.New": "math/rand",
- "rand.NewSource": "math/rand",
- "rand.NewZipf": "math/rand",
- "rand.NormFloat64": "math/rand",
- "rand.Perm": "math/rand",
- "rand.Prime": "crypto/rand",
- "rand.Rand": "math/rand",
- // "rand.Read" is ambiguous
- "rand.Reader": "crypto/rand",
- "rand.Seed": "math/rand",
- "rand.Source": "math/rand",
- "rand.Source64": "math/rand",
- "rand.Uint32": "math/rand",
- "rand.Uint64": "math/rand",
- "rand.Zipf": "math/rand",
- "rc4.Cipher": "crypto/rc4",
- "rc4.KeySizeError": "crypto/rc4",
- "rc4.NewCipher": "crypto/rc4",
- "reflect.Append": "reflect",
- "reflect.AppendSlice": "reflect",
- "reflect.Array": "reflect",
- "reflect.ArrayOf": "reflect",
- "reflect.Bool": "reflect",
- "reflect.BothDir": "reflect",
- "reflect.Chan": "reflect",
- "reflect.ChanDir": "reflect",
- "reflect.ChanOf": "reflect",
- "reflect.Complex128": "reflect",
- "reflect.Complex64": "reflect",
- "reflect.Copy": "reflect",
- "reflect.DeepEqual": "reflect",
- "reflect.Float32": "reflect",
- "reflect.Float64": "reflect",
- "reflect.Func": "reflect",
- "reflect.FuncOf": "reflect",
- "reflect.Indirect": "reflect",
- "reflect.Int": "reflect",
- "reflect.Int16": "reflect",
- "reflect.Int32": "reflect",
- "reflect.Int64": "reflect",
- "reflect.Int8": "reflect",
- "reflect.Interface": "reflect",
- "reflect.Invalid": "reflect",
- "reflect.Kind": "reflect",
- "reflect.MakeChan": "reflect",
- "reflect.MakeFunc": "reflect",
- "reflect.MakeMap": "reflect",
- "reflect.MakeMapWithSize": "reflect",
- "reflect.MakeSlice": "reflect",
- "reflect.Map": "reflect",
- "reflect.MapOf": "reflect",
- "reflect.Method": "reflect",
- "reflect.New": "reflect",
- "reflect.NewAt": "reflect",
- "reflect.Ptr": "reflect",
- "reflect.PtrTo": "reflect",
- "reflect.RecvDir": "reflect",
- "reflect.Select": "reflect",
- "reflect.SelectCase": "reflect",
- "reflect.SelectDefault": "reflect",
- "reflect.SelectDir": "reflect",
- "reflect.SelectRecv": "reflect",
- "reflect.SelectSend": "reflect",
- "reflect.SendDir": "reflect",
- "reflect.Slice": "reflect",
- "reflect.SliceHeader": "reflect",
- "reflect.SliceOf": "reflect",
- "reflect.String": "reflect",
- "reflect.StringHeader": "reflect",
- "reflect.Struct": "reflect",
- "reflect.StructField": "reflect",
- "reflect.StructOf": "reflect",
- "reflect.StructTag": "reflect",
- "reflect.Swapper": "reflect",
- "reflect.TypeOf": "reflect",
- "reflect.Uint": "reflect",
- "reflect.Uint16": "reflect",
- "reflect.Uint32": "reflect",
- "reflect.Uint64": "reflect",
- "reflect.Uint8": "reflect",
- "reflect.Uintptr": "reflect",
- "reflect.UnsafePointer": "reflect",
- "reflect.Value": "reflect",
- "reflect.ValueError": "reflect",
- "reflect.ValueOf": "reflect",
- "reflect.Zero": "reflect",
- "regexp.Compile": "regexp",
- "regexp.CompilePOSIX": "regexp",
- "regexp.Match": "regexp",
- "regexp.MatchReader": "regexp",
- "regexp.MatchString": "regexp",
- "regexp.MustCompile": "regexp",
- "regexp.MustCompilePOSIX": "regexp",
- "regexp.QuoteMeta": "regexp",
- "regexp.Regexp": "regexp",
- "ring.New": "container/ring",
- "ring.Ring": "container/ring",
- "rpc.Accept": "net/rpc",
- "rpc.Call": "net/rpc",
- "rpc.Client": "net/rpc",
- "rpc.ClientCodec": "net/rpc",
- "rpc.DefaultDebugPath": "net/rpc",
- "rpc.DefaultRPCPath": "net/rpc",
- "rpc.DefaultServer": "net/rpc",
- "rpc.Dial": "net/rpc",
- "rpc.DialHTTP": "net/rpc",
- "rpc.DialHTTPPath": "net/rpc",
- "rpc.ErrShutdown": "net/rpc",
- "rpc.HandleHTTP": "net/rpc",
- "rpc.NewClient": "net/rpc",
- "rpc.NewClientWithCodec": "net/rpc",
- "rpc.NewServer": "net/rpc",
- "rpc.Register": "net/rpc",
- "rpc.RegisterName": "net/rpc",
- "rpc.Request": "net/rpc",
- "rpc.Response": "net/rpc",
- "rpc.ServeCodec": "net/rpc",
- "rpc.ServeConn": "net/rpc",
- "rpc.ServeRequest": "net/rpc",
- "rpc.Server": "net/rpc",
- "rpc.ServerCodec": "net/rpc",
- "rpc.ServerError": "net/rpc",
- "rsa.CRTValue": "crypto/rsa",
- "rsa.DecryptOAEP": "crypto/rsa",
- "rsa.DecryptPKCS1v15": "crypto/rsa",
- "rsa.DecryptPKCS1v15SessionKey": "crypto/rsa",
- "rsa.EncryptOAEP": "crypto/rsa",
- "rsa.EncryptPKCS1v15": "crypto/rsa",
- "rsa.ErrDecryption": "crypto/rsa",
- "rsa.ErrMessageTooLong": "crypto/rsa",
- "rsa.ErrVerification": "crypto/rsa",
- "rsa.GenerateKey": "crypto/rsa",
- "rsa.GenerateMultiPrimeKey": "crypto/rsa",
- "rsa.OAEPOptions": "crypto/rsa",
- "rsa.PKCS1v15DecryptOptions": "crypto/rsa",
- "rsa.PSSOptions": "crypto/rsa",
- "rsa.PSSSaltLengthAuto": "crypto/rsa",
- "rsa.PSSSaltLengthEqualsHash": "crypto/rsa",
- "rsa.PrecomputedValues": "crypto/rsa",
- "rsa.PrivateKey": "crypto/rsa",
- "rsa.PublicKey": "crypto/rsa",
- "rsa.SignPKCS1v15": "crypto/rsa",
- "rsa.SignPSS": "crypto/rsa",
- "rsa.VerifyPKCS1v15": "crypto/rsa",
- "rsa.VerifyPSS": "crypto/rsa",
- "runtime.BlockProfile": "runtime",
- "runtime.BlockProfileRecord": "runtime",
- "runtime.Breakpoint": "runtime",
- "runtime.CPUProfile": "runtime",
- "runtime.Caller": "runtime",
- "runtime.Callers": "runtime",
- "runtime.CallersFrames": "runtime",
- "runtime.Compiler": "runtime",
- "runtime.Error": "runtime",
- "runtime.Frame": "runtime",
- "runtime.Frames": "runtime",
- "runtime.Func": "runtime",
- "runtime.FuncForPC": "runtime",
- "runtime.GC": "runtime",
- "runtime.GOARCH": "runtime",
- "runtime.GOMAXPROCS": "runtime",
- "runtime.GOOS": "runtime",
- "runtime.GOROOT": "runtime",
- "runtime.Goexit": "runtime",
- "runtime.GoroutineProfile": "runtime",
- "runtime.Gosched": "runtime",
- "runtime.KeepAlive": "runtime",
- "runtime.LockOSThread": "runtime",
- "runtime.MemProfile": "runtime",
- "runtime.MemProfileRate": "runtime",
- "runtime.MemProfileRecord": "runtime",
- "runtime.MemStats": "runtime",
- "runtime.MutexProfile": "runtime",
- "runtime.NumCPU": "runtime",
- "runtime.NumCgoCall": "runtime",
- "runtime.NumGoroutine": "runtime",
- "runtime.ReadMemStats": "runtime",
- "runtime.ReadTrace": "runtime",
- "runtime.SetBlockProfileRate": "runtime",
- "runtime.SetCPUProfileRate": "runtime",
- "runtime.SetCgoTraceback": "runtime",
- "runtime.SetFinalizer": "runtime",
- "runtime.SetMutexProfileFraction": "runtime",
- "runtime.Stack": "runtime",
- "runtime.StackRecord": "runtime",
- "runtime.StartTrace": "runtime",
- "runtime.StopTrace": "runtime",
- "runtime.ThreadCreateProfile": "runtime",
- "runtime.TypeAssertionError": "runtime",
- "runtime.UnlockOSThread": "runtime",
- "runtime.Version": "runtime",
- "scanner.Char": "text/scanner",
- "scanner.Comment": "text/scanner",
- "scanner.EOF": "text/scanner",
- "scanner.Error": "go/scanner",
- "scanner.ErrorHandler": "go/scanner",
- "scanner.ErrorList": "go/scanner",
- "scanner.Float": "text/scanner",
- "scanner.GoTokens": "text/scanner",
- "scanner.GoWhitespace": "text/scanner",
- "scanner.Ident": "text/scanner",
- "scanner.Int": "text/scanner",
- "scanner.Mode": "go/scanner",
- "scanner.Position": "text/scanner",
- "scanner.PrintError": "go/scanner",
- "scanner.RawString": "text/scanner",
- "scanner.ScanChars": "text/scanner",
- // "scanner.ScanComments" is ambiguous
- "scanner.ScanFloats": "text/scanner",
- "scanner.ScanIdents": "text/scanner",
- "scanner.ScanInts": "text/scanner",
- "scanner.ScanRawStrings": "text/scanner",
- "scanner.ScanStrings": "text/scanner",
- // "scanner.Scanner" is ambiguous
- "scanner.SkipComments": "text/scanner",
- "scanner.String": "text/scanner",
- "scanner.TokenString": "text/scanner",
- "sha1.BlockSize": "crypto/sha1",
- "sha1.New": "crypto/sha1",
- "sha1.Size": "crypto/sha1",
- "sha1.Sum": "crypto/sha1",
- "sha256.BlockSize": "crypto/sha256",
- "sha256.New": "crypto/sha256",
- "sha256.New224": "crypto/sha256",
- "sha256.Size": "crypto/sha256",
- "sha256.Size224": "crypto/sha256",
- "sha256.Sum224": "crypto/sha256",
- "sha256.Sum256": "crypto/sha256",
- "sha512.BlockSize": "crypto/sha512",
- "sha512.New": "crypto/sha512",
- "sha512.New384": "crypto/sha512",
- "sha512.New512_224": "crypto/sha512",
- "sha512.New512_256": "crypto/sha512",
- "sha512.Size": "crypto/sha512",
- "sha512.Size224": "crypto/sha512",
- "sha512.Size256": "crypto/sha512",
- "sha512.Size384": "crypto/sha512",
- "sha512.Sum384": "crypto/sha512",
- "sha512.Sum512": "crypto/sha512",
- "sha512.Sum512_224": "crypto/sha512",
- "sha512.Sum512_256": "crypto/sha512",
- "signal.Ignore": "os/signal",
- "signal.Notify": "os/signal",
- "signal.Reset": "os/signal",
- "signal.Stop": "os/signal",
- "smtp.Auth": "net/smtp",
- "smtp.CRAMMD5Auth": "net/smtp",
- "smtp.Client": "net/smtp",
- "smtp.Dial": "net/smtp",
- "smtp.NewClient": "net/smtp",
- "smtp.PlainAuth": "net/smtp",
- "smtp.SendMail": "net/smtp",
- "smtp.ServerInfo": "net/smtp",
- "sort.Float64Slice": "sort",
- "sort.Float64s": "sort",
- "sort.Float64sAreSorted": "sort",
- "sort.IntSlice": "sort",
- "sort.Interface": "sort",
- "sort.Ints": "sort",
- "sort.IntsAreSorted": "sort",
- "sort.IsSorted": "sort",
- "sort.Reverse": "sort",
- "sort.Search": "sort",
- "sort.SearchFloat64s": "sort",
- "sort.SearchInts": "sort",
- "sort.SearchStrings": "sort",
- "sort.Slice": "sort",
- "sort.SliceIsSorted": "sort",
- "sort.SliceStable": "sort",
- "sort.Sort": "sort",
- "sort.Stable": "sort",
- "sort.StringSlice": "sort",
- "sort.Strings": "sort",
- "sort.StringsAreSorted": "sort",
- "sql.ColumnType": "database/sql",
- "sql.Conn": "database/sql",
- "sql.DB": "database/sql",
- "sql.DBStats": "database/sql",
- "sql.Drivers": "database/sql",
- "sql.ErrConnDone": "database/sql",
- "sql.ErrNoRows": "database/sql",
- "sql.ErrTxDone": "database/sql",
- "sql.IsolationLevel": "database/sql",
- "sql.LevelDefault": "database/sql",
- "sql.LevelLinearizable": "database/sql",
- "sql.LevelReadCommitted": "database/sql",
- "sql.LevelReadUncommitted": "database/sql",
- "sql.LevelRepeatableRead": "database/sql",
- "sql.LevelSerializable": "database/sql",
- "sql.LevelSnapshot": "database/sql",
- "sql.LevelWriteCommitted": "database/sql",
- "sql.Named": "database/sql",
- "sql.NamedArg": "database/sql",
- "sql.NullBool": "database/sql",
- "sql.NullFloat64": "database/sql",
- "sql.NullInt64": "database/sql",
- "sql.NullString": "database/sql",
- "sql.Open": "database/sql",
- "sql.Out": "database/sql",
- "sql.RawBytes": "database/sql",
- "sql.Register": "database/sql",
- "sql.Result": "database/sql",
- "sql.Row": "database/sql",
- "sql.Rows": "database/sql",
- "sql.Scanner": "database/sql",
- "sql.Stmt": "database/sql",
- "sql.Tx": "database/sql",
- "sql.TxOptions": "database/sql",
- "strconv.AppendBool": "strconv",
- "strconv.AppendFloat": "strconv",
- "strconv.AppendInt": "strconv",
- "strconv.AppendQuote": "strconv",
- "strconv.AppendQuoteRune": "strconv",
- "strconv.AppendQuoteRuneToASCII": "strconv",
- "strconv.AppendQuoteRuneToGraphic": "strconv",
- "strconv.AppendQuoteToASCII": "strconv",
- "strconv.AppendQuoteToGraphic": "strconv",
- "strconv.AppendUint": "strconv",
- "strconv.Atoi": "strconv",
- "strconv.CanBackquote": "strconv",
- "strconv.ErrRange": "strconv",
- "strconv.ErrSyntax": "strconv",
- "strconv.FormatBool": "strconv",
- "strconv.FormatFloat": "strconv",
- "strconv.FormatInt": "strconv",
- "strconv.FormatUint": "strconv",
- "strconv.IntSize": "strconv",
- "strconv.IsGraphic": "strconv",
- "strconv.IsPrint": "strconv",
- "strconv.Itoa": "strconv",
- "strconv.NumError": "strconv",
- "strconv.ParseBool": "strconv",
- "strconv.ParseFloat": "strconv",
- "strconv.ParseInt": "strconv",
- "strconv.ParseUint": "strconv",
- "strconv.Quote": "strconv",
- "strconv.QuoteRune": "strconv",
- "strconv.QuoteRuneToASCII": "strconv",
- "strconv.QuoteRuneToGraphic": "strconv",
- "strconv.QuoteToASCII": "strconv",
- "strconv.QuoteToGraphic": "strconv",
- "strconv.Unquote": "strconv",
- "strconv.UnquoteChar": "strconv",
- "strings.Compare": "strings",
- "strings.Contains": "strings",
- "strings.ContainsAny": "strings",
- "strings.ContainsRune": "strings",
- "strings.Count": "strings",
- "strings.EqualFold": "strings",
- "strings.Fields": "strings",
- "strings.FieldsFunc": "strings",
- "strings.HasPrefix": "strings",
- "strings.HasSuffix": "strings",
- "strings.Index": "strings",
- "strings.IndexAny": "strings",
- "strings.IndexByte": "strings",
- "strings.IndexFunc": "strings",
- "strings.IndexRune": "strings",
- "strings.Join": "strings",
- "strings.LastIndex": "strings",
- "strings.LastIndexAny": "strings",
- "strings.LastIndexByte": "strings",
- "strings.LastIndexFunc": "strings",
- "strings.Map": "strings",
- "strings.NewReader": "strings",
- "strings.NewReplacer": "strings",
- "strings.Reader": "strings",
- "strings.Repeat": "strings",
- "strings.Replace": "strings",
- "strings.Replacer": "strings",
- "strings.Split": "strings",
- "strings.SplitAfter": "strings",
- "strings.SplitAfterN": "strings",
- "strings.SplitN": "strings",
- "strings.Title": "strings",
- "strings.ToLower": "strings",
- "strings.ToLowerSpecial": "strings",
- "strings.ToTitle": "strings",
- "strings.ToTitleSpecial": "strings",
- "strings.ToUpper": "strings",
- "strings.ToUpperSpecial": "strings",
- "strings.Trim": "strings",
- "strings.TrimFunc": "strings",
- "strings.TrimLeft": "strings",
- "strings.TrimLeftFunc": "strings",
- "strings.TrimPrefix": "strings",
- "strings.TrimRight": "strings",
- "strings.TrimRightFunc": "strings",
- "strings.TrimSpace": "strings",
- "strings.TrimSuffix": "strings",
- "subtle.ConstantTimeByteEq": "crypto/subtle",
- "subtle.ConstantTimeCompare": "crypto/subtle",
- "subtle.ConstantTimeCopy": "crypto/subtle",
- "subtle.ConstantTimeEq": "crypto/subtle",
- "subtle.ConstantTimeLessOrEq": "crypto/subtle",
- "subtle.ConstantTimeSelect": "crypto/subtle",
- "suffixarray.Index": "index/suffixarray",
- "suffixarray.New": "index/suffixarray",
- "sync.Cond": "sync",
- "sync.Locker": "sync",
- "sync.Map": "sync",
- "sync.Mutex": "sync",
- "sync.NewCond": "sync",
- "sync.Once": "sync",
- "sync.Pool": "sync",
- "sync.RWMutex": "sync",
- "sync.WaitGroup": "sync",
- "syntax.ClassNL": "regexp/syntax",
- "syntax.Compile": "regexp/syntax",
- "syntax.DotNL": "regexp/syntax",
- "syntax.EmptyBeginLine": "regexp/syntax",
- "syntax.EmptyBeginText": "regexp/syntax",
- "syntax.EmptyEndLine": "regexp/syntax",
- "syntax.EmptyEndText": "regexp/syntax",
- "syntax.EmptyNoWordBoundary": "regexp/syntax",
- "syntax.EmptyOp": "regexp/syntax",
- "syntax.EmptyOpContext": "regexp/syntax",
- "syntax.EmptyWordBoundary": "regexp/syntax",
- "syntax.ErrInternalError": "regexp/syntax",
- "syntax.ErrInvalidCharClass": "regexp/syntax",
- "syntax.ErrInvalidCharRange": "regexp/syntax",
- "syntax.ErrInvalidEscape": "regexp/syntax",
- "syntax.ErrInvalidNamedCapture": "regexp/syntax",
- "syntax.ErrInvalidPerlOp": "regexp/syntax",
- "syntax.ErrInvalidRepeatOp": "regexp/syntax",
- "syntax.ErrInvalidRepeatSize": "regexp/syntax",
- "syntax.ErrInvalidUTF8": "regexp/syntax",
- "syntax.ErrMissingBracket": "regexp/syntax",
- "syntax.ErrMissingParen": "regexp/syntax",
- "syntax.ErrMissingRepeatArgument": "regexp/syntax",
- "syntax.ErrTrailingBackslash": "regexp/syntax",
- "syntax.ErrUnexpectedParen": "regexp/syntax",
- "syntax.Error": "regexp/syntax",
- "syntax.ErrorCode": "regexp/syntax",
- "syntax.Flags": "regexp/syntax",
- "syntax.FoldCase": "regexp/syntax",
- "syntax.Inst": "regexp/syntax",
- "syntax.InstAlt": "regexp/syntax",
- "syntax.InstAltMatch": "regexp/syntax",
- "syntax.InstCapture": "regexp/syntax",
- "syntax.InstEmptyWidth": "regexp/syntax",
- "syntax.InstFail": "regexp/syntax",
- "syntax.InstMatch": "regexp/syntax",
- "syntax.InstNop": "regexp/syntax",
- "syntax.InstOp": "regexp/syntax",
- "syntax.InstRune": "regexp/syntax",
- "syntax.InstRune1": "regexp/syntax",
- "syntax.InstRuneAny": "regexp/syntax",
- "syntax.InstRuneAnyNotNL": "regexp/syntax",
- "syntax.IsWordChar": "regexp/syntax",
- "syntax.Literal": "regexp/syntax",
- "syntax.MatchNL": "regexp/syntax",
- "syntax.NonGreedy": "regexp/syntax",
- "syntax.OneLine": "regexp/syntax",
- "syntax.Op": "regexp/syntax",
- "syntax.OpAlternate": "regexp/syntax",
- "syntax.OpAnyChar": "regexp/syntax",
- "syntax.OpAnyCharNotNL": "regexp/syntax",
- "syntax.OpBeginLine": "regexp/syntax",
- "syntax.OpBeginText": "regexp/syntax",
- "syntax.OpCapture": "regexp/syntax",
- "syntax.OpCharClass": "regexp/syntax",
- "syntax.OpConcat": "regexp/syntax",
- "syntax.OpEmptyMatch": "regexp/syntax",
- "syntax.OpEndLine": "regexp/syntax",
- "syntax.OpEndText": "regexp/syntax",
- "syntax.OpLiteral": "regexp/syntax",
- "syntax.OpNoMatch": "regexp/syntax",
- "syntax.OpNoWordBoundary": "regexp/syntax",
- "syntax.OpPlus": "regexp/syntax",
- "syntax.OpQuest": "regexp/syntax",
- "syntax.OpRepeat": "regexp/syntax",
- "syntax.OpStar": "regexp/syntax",
- "syntax.OpWordBoundary": "regexp/syntax",
- "syntax.POSIX": "regexp/syntax",
- "syntax.Parse": "regexp/syntax",
- "syntax.Perl": "regexp/syntax",
- "syntax.PerlX": "regexp/syntax",
- "syntax.Prog": "regexp/syntax",
- "syntax.Regexp": "regexp/syntax",
- "syntax.Simple": "regexp/syntax",
- "syntax.UnicodeGroups": "regexp/syntax",
- "syntax.WasDollar": "regexp/syntax",
- "syscall.AF_ALG": "syscall",
- "syscall.AF_APPLETALK": "syscall",
- "syscall.AF_ARP": "syscall",
- "syscall.AF_ASH": "syscall",
- "syscall.AF_ATM": "syscall",
- "syscall.AF_ATMPVC": "syscall",
- "syscall.AF_ATMSVC": "syscall",
- "syscall.AF_AX25": "syscall",
- "syscall.AF_BLUETOOTH": "syscall",
- "syscall.AF_BRIDGE": "syscall",
- "syscall.AF_CAIF": "syscall",
- "syscall.AF_CAN": "syscall",
- "syscall.AF_CCITT": "syscall",
- "syscall.AF_CHAOS": "syscall",
- "syscall.AF_CNT": "syscall",
- "syscall.AF_COIP": "syscall",
- "syscall.AF_DATAKIT": "syscall",
- "syscall.AF_DECnet": "syscall",
- "syscall.AF_DLI": "syscall",
- "syscall.AF_E164": "syscall",
- "syscall.AF_ECMA": "syscall",
- "syscall.AF_ECONET": "syscall",
- "syscall.AF_ENCAP": "syscall",
- "syscall.AF_FILE": "syscall",
- "syscall.AF_HYLINK": "syscall",
- "syscall.AF_IEEE80211": "syscall",
- "syscall.AF_IEEE802154": "syscall",
- "syscall.AF_IMPLINK": "syscall",
- "syscall.AF_INET": "syscall",
- "syscall.AF_INET6": "syscall",
- "syscall.AF_INET6_SDP": "syscall",
- "syscall.AF_INET_SDP": "syscall",
- "syscall.AF_IPX": "syscall",
- "syscall.AF_IRDA": "syscall",
- "syscall.AF_ISDN": "syscall",
- "syscall.AF_ISO": "syscall",
- "syscall.AF_IUCV": "syscall",
- "syscall.AF_KEY": "syscall",
- "syscall.AF_LAT": "syscall",
- "syscall.AF_LINK": "syscall",
- "syscall.AF_LLC": "syscall",
- "syscall.AF_LOCAL": "syscall",
- "syscall.AF_MAX": "syscall",
- "syscall.AF_MPLS": "syscall",
- "syscall.AF_NATM": "syscall",
- "syscall.AF_NDRV": "syscall",
- "syscall.AF_NETBEUI": "syscall",
- "syscall.AF_NETBIOS": "syscall",
- "syscall.AF_NETGRAPH": "syscall",
- "syscall.AF_NETLINK": "syscall",
- "syscall.AF_NETROM": "syscall",
- "syscall.AF_NS": "syscall",
- "syscall.AF_OROUTE": "syscall",
- "syscall.AF_OSI": "syscall",
- "syscall.AF_PACKET": "syscall",
- "syscall.AF_PHONET": "syscall",
- "syscall.AF_PPP": "syscall",
- "syscall.AF_PPPOX": "syscall",
- "syscall.AF_PUP": "syscall",
- "syscall.AF_RDS": "syscall",
- "syscall.AF_RESERVED_36": "syscall",
- "syscall.AF_ROSE": "syscall",
- "syscall.AF_ROUTE": "syscall",
- "syscall.AF_RXRPC": "syscall",
- "syscall.AF_SCLUSTER": "syscall",
- "syscall.AF_SECURITY": "syscall",
- "syscall.AF_SIP": "syscall",
- "syscall.AF_SLOW": "syscall",
- "syscall.AF_SNA": "syscall",
- "syscall.AF_SYSTEM": "syscall",
- "syscall.AF_TIPC": "syscall",
- "syscall.AF_UNIX": "syscall",
- "syscall.AF_UNSPEC": "syscall",
- "syscall.AF_VENDOR00": "syscall",
- "syscall.AF_VENDOR01": "syscall",
- "syscall.AF_VENDOR02": "syscall",
- "syscall.AF_VENDOR03": "syscall",
- "syscall.AF_VENDOR04": "syscall",
- "syscall.AF_VENDOR05": "syscall",
- "syscall.AF_VENDOR06": "syscall",
- "syscall.AF_VENDOR07": "syscall",
- "syscall.AF_VENDOR08": "syscall",
- "syscall.AF_VENDOR09": "syscall",
- "syscall.AF_VENDOR10": "syscall",
- "syscall.AF_VENDOR11": "syscall",
- "syscall.AF_VENDOR12": "syscall",
- "syscall.AF_VENDOR13": "syscall",
- "syscall.AF_VENDOR14": "syscall",
- "syscall.AF_VENDOR15": "syscall",
- "syscall.AF_VENDOR16": "syscall",
- "syscall.AF_VENDOR17": "syscall",
- "syscall.AF_VENDOR18": "syscall",
- "syscall.AF_VENDOR19": "syscall",
- "syscall.AF_VENDOR20": "syscall",
- "syscall.AF_VENDOR21": "syscall",
- "syscall.AF_VENDOR22": "syscall",
- "syscall.AF_VENDOR23": "syscall",
- "syscall.AF_VENDOR24": "syscall",
- "syscall.AF_VENDOR25": "syscall",
- "syscall.AF_VENDOR26": "syscall",
- "syscall.AF_VENDOR27": "syscall",
- "syscall.AF_VENDOR28": "syscall",
- "syscall.AF_VENDOR29": "syscall",
- "syscall.AF_VENDOR30": "syscall",
- "syscall.AF_VENDOR31": "syscall",
- "syscall.AF_VENDOR32": "syscall",
- "syscall.AF_VENDOR33": "syscall",
- "syscall.AF_VENDOR34": "syscall",
- "syscall.AF_VENDOR35": "syscall",
- "syscall.AF_VENDOR36": "syscall",
- "syscall.AF_VENDOR37": "syscall",
- "syscall.AF_VENDOR38": "syscall",
- "syscall.AF_VENDOR39": "syscall",
- "syscall.AF_VENDOR40": "syscall",
- "syscall.AF_VENDOR41": "syscall",
- "syscall.AF_VENDOR42": "syscall",
- "syscall.AF_VENDOR43": "syscall",
- "syscall.AF_VENDOR44": "syscall",
- "syscall.AF_VENDOR45": "syscall",
- "syscall.AF_VENDOR46": "syscall",
- "syscall.AF_VENDOR47": "syscall",
- "syscall.AF_WANPIPE": "syscall",
- "syscall.AF_X25": "syscall",
- "syscall.AI_CANONNAME": "syscall",
- "syscall.AI_NUMERICHOST": "syscall",
- "syscall.AI_PASSIVE": "syscall",
- "syscall.APPLICATION_ERROR": "syscall",
- "syscall.ARPHRD_ADAPT": "syscall",
- "syscall.ARPHRD_APPLETLK": "syscall",
- "syscall.ARPHRD_ARCNET": "syscall",
- "syscall.ARPHRD_ASH": "syscall",
- "syscall.ARPHRD_ATM": "syscall",
- "syscall.ARPHRD_AX25": "syscall",
- "syscall.ARPHRD_BIF": "syscall",
- "syscall.ARPHRD_CHAOS": "syscall",
- "syscall.ARPHRD_CISCO": "syscall",
- "syscall.ARPHRD_CSLIP": "syscall",
- "syscall.ARPHRD_CSLIP6": "syscall",
- "syscall.ARPHRD_DDCMP": "syscall",
- "syscall.ARPHRD_DLCI": "syscall",
- "syscall.ARPHRD_ECONET": "syscall",
- "syscall.ARPHRD_EETHER": "syscall",
- "syscall.ARPHRD_ETHER": "syscall",
- "syscall.ARPHRD_EUI64": "syscall",
- "syscall.ARPHRD_FCAL": "syscall",
- "syscall.ARPHRD_FCFABRIC": "syscall",
- "syscall.ARPHRD_FCPL": "syscall",
- "syscall.ARPHRD_FCPP": "syscall",
- "syscall.ARPHRD_FDDI": "syscall",
- "syscall.ARPHRD_FRAD": "syscall",
- "syscall.ARPHRD_FRELAY": "syscall",
- "syscall.ARPHRD_HDLC": "syscall",
- "syscall.ARPHRD_HIPPI": "syscall",
- "syscall.ARPHRD_HWX25": "syscall",
- "syscall.ARPHRD_IEEE1394": "syscall",
- "syscall.ARPHRD_IEEE802": "syscall",
- "syscall.ARPHRD_IEEE80211": "syscall",
- "syscall.ARPHRD_IEEE80211_PRISM": "syscall",
- "syscall.ARPHRD_IEEE80211_RADIOTAP": "syscall",
- "syscall.ARPHRD_IEEE802154": "syscall",
- "syscall.ARPHRD_IEEE802154_PHY": "syscall",
- "syscall.ARPHRD_IEEE802_TR": "syscall",
- "syscall.ARPHRD_INFINIBAND": "syscall",
- "syscall.ARPHRD_IPDDP": "syscall",
- "syscall.ARPHRD_IPGRE": "syscall",
- "syscall.ARPHRD_IRDA": "syscall",
- "syscall.ARPHRD_LAPB": "syscall",
- "syscall.ARPHRD_LOCALTLK": "syscall",
- "syscall.ARPHRD_LOOPBACK": "syscall",
- "syscall.ARPHRD_METRICOM": "syscall",
- "syscall.ARPHRD_NETROM": "syscall",
- "syscall.ARPHRD_NONE": "syscall",
- "syscall.ARPHRD_PIMREG": "syscall",
- "syscall.ARPHRD_PPP": "syscall",
- "syscall.ARPHRD_PRONET": "syscall",
- "syscall.ARPHRD_RAWHDLC": "syscall",
- "syscall.ARPHRD_ROSE": "syscall",
- "syscall.ARPHRD_RSRVD": "syscall",
- "syscall.ARPHRD_SIT": "syscall",
- "syscall.ARPHRD_SKIP": "syscall",
- "syscall.ARPHRD_SLIP": "syscall",
- "syscall.ARPHRD_SLIP6": "syscall",
- "syscall.ARPHRD_STRIP": "syscall",
- "syscall.ARPHRD_TUNNEL": "syscall",
- "syscall.ARPHRD_TUNNEL6": "syscall",
- "syscall.ARPHRD_VOID": "syscall",
- "syscall.ARPHRD_X25": "syscall",
- "syscall.AUTHTYPE_CLIENT": "syscall",
- "syscall.AUTHTYPE_SERVER": "syscall",
- "syscall.Accept": "syscall",
- "syscall.Accept4": "syscall",
- "syscall.AcceptEx": "syscall",
- "syscall.Access": "syscall",
- "syscall.Acct": "syscall",
- "syscall.AddrinfoW": "syscall",
- "syscall.Adjtime": "syscall",
- "syscall.Adjtimex": "syscall",
- "syscall.AttachLsf": "syscall",
- "syscall.B0": "syscall",
- "syscall.B1000000": "syscall",
- "syscall.B110": "syscall",
- "syscall.B115200": "syscall",
- "syscall.B1152000": "syscall",
- "syscall.B1200": "syscall",
- "syscall.B134": "syscall",
- "syscall.B14400": "syscall",
- "syscall.B150": "syscall",
- "syscall.B1500000": "syscall",
- "syscall.B1800": "syscall",
- "syscall.B19200": "syscall",
- "syscall.B200": "syscall",
- "syscall.B2000000": "syscall",
- "syscall.B230400": "syscall",
- "syscall.B2400": "syscall",
- "syscall.B2500000": "syscall",
- "syscall.B28800": "syscall",
- "syscall.B300": "syscall",
- "syscall.B3000000": "syscall",
- "syscall.B3500000": "syscall",
- "syscall.B38400": "syscall",
- "syscall.B4000000": "syscall",
- "syscall.B460800": "syscall",
- "syscall.B4800": "syscall",
- "syscall.B50": "syscall",
- "syscall.B500000": "syscall",
- "syscall.B57600": "syscall",
- "syscall.B576000": "syscall",
- "syscall.B600": "syscall",
- "syscall.B7200": "syscall",
- "syscall.B75": "syscall",
- "syscall.B76800": "syscall",
- "syscall.B921600": "syscall",
- "syscall.B9600": "syscall",
- "syscall.BASE_PROTOCOL": "syscall",
- "syscall.BIOCFEEDBACK": "syscall",
- "syscall.BIOCFLUSH": "syscall",
- "syscall.BIOCGBLEN": "syscall",
- "syscall.BIOCGDIRECTION": "syscall",
- "syscall.BIOCGDIRFILT": "syscall",
- "syscall.BIOCGDLT": "syscall",
- "syscall.BIOCGDLTLIST": "syscall",
- "syscall.BIOCGETBUFMODE": "syscall",
- "syscall.BIOCGETIF": "syscall",
- "syscall.BIOCGETZMAX": "syscall",
- "syscall.BIOCGFEEDBACK": "syscall",
- "syscall.BIOCGFILDROP": "syscall",
- "syscall.BIOCGHDRCMPLT": "syscall",
- "syscall.BIOCGRSIG": "syscall",
- "syscall.BIOCGRTIMEOUT": "syscall",
- "syscall.BIOCGSEESENT": "syscall",
- "syscall.BIOCGSTATS": "syscall",
- "syscall.BIOCGSTATSOLD": "syscall",
- "syscall.BIOCGTSTAMP": "syscall",
- "syscall.BIOCIMMEDIATE": "syscall",
- "syscall.BIOCLOCK": "syscall",
- "syscall.BIOCPROMISC": "syscall",
- "syscall.BIOCROTZBUF": "syscall",
- "syscall.BIOCSBLEN": "syscall",
- "syscall.BIOCSDIRECTION": "syscall",
- "syscall.BIOCSDIRFILT": "syscall",
- "syscall.BIOCSDLT": "syscall",
- "syscall.BIOCSETBUFMODE": "syscall",
- "syscall.BIOCSETF": "syscall",
- "syscall.BIOCSETFNR": "syscall",
- "syscall.BIOCSETIF": "syscall",
- "syscall.BIOCSETWF": "syscall",
- "syscall.BIOCSETZBUF": "syscall",
- "syscall.BIOCSFEEDBACK": "syscall",
- "syscall.BIOCSFILDROP": "syscall",
- "syscall.BIOCSHDRCMPLT": "syscall",
- "syscall.BIOCSRSIG": "syscall",
- "syscall.BIOCSRTIMEOUT": "syscall",
- "syscall.BIOCSSEESENT": "syscall",
- "syscall.BIOCSTCPF": "syscall",
- "syscall.BIOCSTSTAMP": "syscall",
- "syscall.BIOCSUDPF": "syscall",
- "syscall.BIOCVERSION": "syscall",
- "syscall.BPF_A": "syscall",
- "syscall.BPF_ABS": "syscall",
- "syscall.BPF_ADD": "syscall",
- "syscall.BPF_ALIGNMENT": "syscall",
- "syscall.BPF_ALIGNMENT32": "syscall",
- "syscall.BPF_ALU": "syscall",
- "syscall.BPF_AND": "syscall",
- "syscall.BPF_B": "syscall",
- "syscall.BPF_BUFMODE_BUFFER": "syscall",
- "syscall.BPF_BUFMODE_ZBUF": "syscall",
- "syscall.BPF_DFLTBUFSIZE": "syscall",
- "syscall.BPF_DIRECTION_IN": "syscall",
- "syscall.BPF_DIRECTION_OUT": "syscall",
- "syscall.BPF_DIV": "syscall",
- "syscall.BPF_H": "syscall",
- "syscall.BPF_IMM": "syscall",
- "syscall.BPF_IND": "syscall",
- "syscall.BPF_JA": "syscall",
- "syscall.BPF_JEQ": "syscall",
- "syscall.BPF_JGE": "syscall",
- "syscall.BPF_JGT": "syscall",
- "syscall.BPF_JMP": "syscall",
- "syscall.BPF_JSET": "syscall",
- "syscall.BPF_K": "syscall",
- "syscall.BPF_LD": "syscall",
- "syscall.BPF_LDX": "syscall",
- "syscall.BPF_LEN": "syscall",
- "syscall.BPF_LSH": "syscall",
- "syscall.BPF_MAJOR_VERSION": "syscall",
- "syscall.BPF_MAXBUFSIZE": "syscall",
- "syscall.BPF_MAXINSNS": "syscall",
- "syscall.BPF_MEM": "syscall",
- "syscall.BPF_MEMWORDS": "syscall",
- "syscall.BPF_MINBUFSIZE": "syscall",
- "syscall.BPF_MINOR_VERSION": "syscall",
- "syscall.BPF_MISC": "syscall",
- "syscall.BPF_MSH": "syscall",
- "syscall.BPF_MUL": "syscall",
- "syscall.BPF_NEG": "syscall",
- "syscall.BPF_OR": "syscall",
- "syscall.BPF_RELEASE": "syscall",
- "syscall.BPF_RET": "syscall",
- "syscall.BPF_RSH": "syscall",
- "syscall.BPF_ST": "syscall",
- "syscall.BPF_STX": "syscall",
- "syscall.BPF_SUB": "syscall",
- "syscall.BPF_TAX": "syscall",
- "syscall.BPF_TXA": "syscall",
- "syscall.BPF_T_BINTIME": "syscall",
- "syscall.BPF_T_BINTIME_FAST": "syscall",
- "syscall.BPF_T_BINTIME_MONOTONIC": "syscall",
- "syscall.BPF_T_BINTIME_MONOTONIC_FAST": "syscall",
- "syscall.BPF_T_FAST": "syscall",
- "syscall.BPF_T_FLAG_MASK": "syscall",
- "syscall.BPF_T_FORMAT_MASK": "syscall",
- "syscall.BPF_T_MICROTIME": "syscall",
- "syscall.BPF_T_MICROTIME_FAST": "syscall",
- "syscall.BPF_T_MICROTIME_MONOTONIC": "syscall",
- "syscall.BPF_T_MICROTIME_MONOTONIC_FAST": "syscall",
- "syscall.BPF_T_MONOTONIC": "syscall",
- "syscall.BPF_T_MONOTONIC_FAST": "syscall",
- "syscall.BPF_T_NANOTIME": "syscall",
- "syscall.BPF_T_NANOTIME_FAST": "syscall",
- "syscall.BPF_T_NANOTIME_MONOTONIC": "syscall",
- "syscall.BPF_T_NANOTIME_MONOTONIC_FAST": "syscall",
- "syscall.BPF_T_NONE": "syscall",
- "syscall.BPF_T_NORMAL": "syscall",
- "syscall.BPF_W": "syscall",
- "syscall.BPF_X": "syscall",
- "syscall.BRKINT": "syscall",
- "syscall.Bind": "syscall",
- "syscall.BindToDevice": "syscall",
- "syscall.BpfBuflen": "syscall",
- "syscall.BpfDatalink": "syscall",
- "syscall.BpfHdr": "syscall",
- "syscall.BpfHeadercmpl": "syscall",
- "syscall.BpfInsn": "syscall",
- "syscall.BpfInterface": "syscall",
- "syscall.BpfJump": "syscall",
- "syscall.BpfProgram": "syscall",
- "syscall.BpfStat": "syscall",
- "syscall.BpfStats": "syscall",
- "syscall.BpfStmt": "syscall",
- "syscall.BpfTimeout": "syscall",
- "syscall.BpfTimeval": "syscall",
- "syscall.BpfVersion": "syscall",
- "syscall.BpfZbuf": "syscall",
- "syscall.BpfZbufHeader": "syscall",
- "syscall.ByHandleFileInformation": "syscall",
- "syscall.BytePtrFromString": "syscall",
- "syscall.ByteSliceFromString": "syscall",
- "syscall.CCR0_FLUSH": "syscall",
- "syscall.CERT_CHAIN_POLICY_AUTHENTICODE": "syscall",
- "syscall.CERT_CHAIN_POLICY_AUTHENTICODE_TS": "syscall",
- "syscall.CERT_CHAIN_POLICY_BASE": "syscall",
- "syscall.CERT_CHAIN_POLICY_BASIC_CONSTRAINTS": "syscall",
- "syscall.CERT_CHAIN_POLICY_EV": "syscall",
- "syscall.CERT_CHAIN_POLICY_MICROSOFT_ROOT": "syscall",
- "syscall.CERT_CHAIN_POLICY_NT_AUTH": "syscall",
- "syscall.CERT_CHAIN_POLICY_SSL": "syscall",
- "syscall.CERT_E_CN_NO_MATCH": "syscall",
- "syscall.CERT_E_EXPIRED": "syscall",
- "syscall.CERT_E_PURPOSE": "syscall",
- "syscall.CERT_E_ROLE": "syscall",
- "syscall.CERT_E_UNTRUSTEDROOT": "syscall",
- "syscall.CERT_STORE_ADD_ALWAYS": "syscall",
- "syscall.CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG": "syscall",
- "syscall.CERT_STORE_PROV_MEMORY": "syscall",
- "syscall.CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT": "syscall",
- "syscall.CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT": "syscall",
- "syscall.CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT": "syscall",
- "syscall.CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT": "syscall",
- "syscall.CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT": "syscall",
- "syscall.CERT_TRUST_INVALID_BASIC_CONSTRAINTS": "syscall",
- "syscall.CERT_TRUST_INVALID_EXTENSION": "syscall",
- "syscall.CERT_TRUST_INVALID_NAME_CONSTRAINTS": "syscall",
- "syscall.CERT_TRUST_INVALID_POLICY_CONSTRAINTS": "syscall",
- "syscall.CERT_TRUST_IS_CYCLIC": "syscall",
- "syscall.CERT_TRUST_IS_EXPLICIT_DISTRUST": "syscall",
- "syscall.CERT_TRUST_IS_NOT_SIGNATURE_VALID": "syscall",
- "syscall.CERT_TRUST_IS_NOT_TIME_VALID": "syscall",
- "syscall.CERT_TRUST_IS_NOT_VALID_FOR_USAGE": "syscall",
- "syscall.CERT_TRUST_IS_OFFLINE_REVOCATION": "syscall",
- "syscall.CERT_TRUST_IS_REVOKED": "syscall",
- "syscall.CERT_TRUST_IS_UNTRUSTED_ROOT": "syscall",
- "syscall.CERT_TRUST_NO_ERROR": "syscall",
- "syscall.CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY": "syscall",
- "syscall.CERT_TRUST_REVOCATION_STATUS_UNKNOWN": "syscall",
- "syscall.CFLUSH": "syscall",
- "syscall.CLOCAL": "syscall",
- "syscall.CLONE_CHILD_CLEARTID": "syscall",
- "syscall.CLONE_CHILD_SETTID": "syscall",
- "syscall.CLONE_CSIGNAL": "syscall",
- "syscall.CLONE_DETACHED": "syscall",
- "syscall.CLONE_FILES": "syscall",
- "syscall.CLONE_FS": "syscall",
- "syscall.CLONE_IO": "syscall",
- "syscall.CLONE_NEWIPC": "syscall",
- "syscall.CLONE_NEWNET": "syscall",
- "syscall.CLONE_NEWNS": "syscall",
- "syscall.CLONE_NEWPID": "syscall",
- "syscall.CLONE_NEWUSER": "syscall",
- "syscall.CLONE_NEWUTS": "syscall",
- "syscall.CLONE_PARENT": "syscall",
- "syscall.CLONE_PARENT_SETTID": "syscall",
- "syscall.CLONE_PID": "syscall",
- "syscall.CLONE_PTRACE": "syscall",
- "syscall.CLONE_SETTLS": "syscall",
- "syscall.CLONE_SIGHAND": "syscall",
- "syscall.CLONE_SYSVSEM": "syscall",
- "syscall.CLONE_THREAD": "syscall",
- "syscall.CLONE_UNTRACED": "syscall",
- "syscall.CLONE_VFORK": "syscall",
- "syscall.CLONE_VM": "syscall",
- "syscall.CPUID_CFLUSH": "syscall",
- "syscall.CREAD": "syscall",
- "syscall.CREATE_ALWAYS": "syscall",
- "syscall.CREATE_NEW": "syscall",
- "syscall.CREATE_NEW_PROCESS_GROUP": "syscall",
- "syscall.CREATE_UNICODE_ENVIRONMENT": "syscall",
- "syscall.CRYPT_DEFAULT_CONTAINER_OPTIONAL": "syscall",
- "syscall.CRYPT_DELETEKEYSET": "syscall",
- "syscall.CRYPT_MACHINE_KEYSET": "syscall",
- "syscall.CRYPT_NEWKEYSET": "syscall",
- "syscall.CRYPT_SILENT": "syscall",
- "syscall.CRYPT_VERIFYCONTEXT": "syscall",
- "syscall.CS5": "syscall",
- "syscall.CS6": "syscall",
- "syscall.CS7": "syscall",
- "syscall.CS8": "syscall",
- "syscall.CSIZE": "syscall",
- "syscall.CSTART": "syscall",
- "syscall.CSTATUS": "syscall",
- "syscall.CSTOP": "syscall",
- "syscall.CSTOPB": "syscall",
- "syscall.CSUSP": "syscall",
- "syscall.CTL_MAXNAME": "syscall",
- "syscall.CTL_NET": "syscall",
- "syscall.CTL_QUERY": "syscall",
- "syscall.CTRL_BREAK_EVENT": "syscall",
- "syscall.CTRL_C_EVENT": "syscall",
- "syscall.CancelIo": "syscall",
- "syscall.CancelIoEx": "syscall",
- "syscall.CertAddCertificateContextToStore": "syscall",
- "syscall.CertChainContext": "syscall",
- "syscall.CertChainElement": "syscall",
- "syscall.CertChainPara": "syscall",
- "syscall.CertChainPolicyPara": "syscall",
- "syscall.CertChainPolicyStatus": "syscall",
- "syscall.CertCloseStore": "syscall",
- "syscall.CertContext": "syscall",
- "syscall.CertCreateCertificateContext": "syscall",
- "syscall.CertEnhKeyUsage": "syscall",
- "syscall.CertEnumCertificatesInStore": "syscall",
- "syscall.CertFreeCertificateChain": "syscall",
- "syscall.CertFreeCertificateContext": "syscall",
- "syscall.CertGetCertificateChain": "syscall",
- "syscall.CertOpenStore": "syscall",
- "syscall.CertOpenSystemStore": "syscall",
- "syscall.CertRevocationInfo": "syscall",
- "syscall.CertSimpleChain": "syscall",
- "syscall.CertTrustStatus": "syscall",
- "syscall.CertUsageMatch": "syscall",
- "syscall.CertVerifyCertificateChainPolicy": "syscall",
- "syscall.Chdir": "syscall",
- "syscall.CheckBpfVersion": "syscall",
- "syscall.Chflags": "syscall",
- "syscall.Chmod": "syscall",
- "syscall.Chown": "syscall",
- "syscall.Chroot": "syscall",
- "syscall.Clearenv": "syscall",
- "syscall.Close": "syscall",
- "syscall.CloseHandle": "syscall",
- "syscall.CloseOnExec": "syscall",
- "syscall.Closesocket": "syscall",
- "syscall.CmsgLen": "syscall",
- "syscall.CmsgSpace": "syscall",
- "syscall.Cmsghdr": "syscall",
- "syscall.CommandLineToArgv": "syscall",
- "syscall.ComputerName": "syscall",
- "syscall.Conn": "syscall",
- "syscall.Connect": "syscall",
- "syscall.ConnectEx": "syscall",
- "syscall.ConvertSidToStringSid": "syscall",
- "syscall.ConvertStringSidToSid": "syscall",
- "syscall.CopySid": "syscall",
- "syscall.Creat": "syscall",
- "syscall.CreateDirectory": "syscall",
- "syscall.CreateFile": "syscall",
- "syscall.CreateFileMapping": "syscall",
- "syscall.CreateHardLink": "syscall",
- "syscall.CreateIoCompletionPort": "syscall",
- "syscall.CreatePipe": "syscall",
- "syscall.CreateProcess": "syscall",
- "syscall.CreateSymbolicLink": "syscall",
- "syscall.CreateToolhelp32Snapshot": "syscall",
- "syscall.Credential": "syscall",
- "syscall.CryptAcquireContext": "syscall",
- "syscall.CryptGenRandom": "syscall",
- "syscall.CryptReleaseContext": "syscall",
- "syscall.DIOCBSFLUSH": "syscall",
- "syscall.DIOCOSFPFLUSH": "syscall",
- "syscall.DLL": "syscall",
- "syscall.DLLError": "syscall",
- "syscall.DLT_A429": "syscall",
- "syscall.DLT_A653_ICM": "syscall",
- "syscall.DLT_AIRONET_HEADER": "syscall",
- "syscall.DLT_AOS": "syscall",
- "syscall.DLT_APPLE_IP_OVER_IEEE1394": "syscall",
- "syscall.DLT_ARCNET": "syscall",
- "syscall.DLT_ARCNET_LINUX": "syscall",
- "syscall.DLT_ATM_CLIP": "syscall",
- "syscall.DLT_ATM_RFC1483": "syscall",
- "syscall.DLT_AURORA": "syscall",
- "syscall.DLT_AX25": "syscall",
- "syscall.DLT_AX25_KISS": "syscall",
- "syscall.DLT_BACNET_MS_TP": "syscall",
- "syscall.DLT_BLUETOOTH_HCI_H4": "syscall",
- "syscall.DLT_BLUETOOTH_HCI_H4_WITH_PHDR": "syscall",
- "syscall.DLT_CAN20B": "syscall",
- "syscall.DLT_CAN_SOCKETCAN": "syscall",
- "syscall.DLT_CHAOS": "syscall",
- "syscall.DLT_CHDLC": "syscall",
- "syscall.DLT_CISCO_IOS": "syscall",
- "syscall.DLT_C_HDLC": "syscall",
- "syscall.DLT_C_HDLC_WITH_DIR": "syscall",
- "syscall.DLT_DBUS": "syscall",
- "syscall.DLT_DECT": "syscall",
- "syscall.DLT_DOCSIS": "syscall",
- "syscall.DLT_DVB_CI": "syscall",
- "syscall.DLT_ECONET": "syscall",
- "syscall.DLT_EN10MB": "syscall",
- "syscall.DLT_EN3MB": "syscall",
- "syscall.DLT_ENC": "syscall",
- "syscall.DLT_ERF": "syscall",
- "syscall.DLT_ERF_ETH": "syscall",
- "syscall.DLT_ERF_POS": "syscall",
- "syscall.DLT_FC_2": "syscall",
- "syscall.DLT_FC_2_WITH_FRAME_DELIMS": "syscall",
- "syscall.DLT_FDDI": "syscall",
- "syscall.DLT_FLEXRAY": "syscall",
- "syscall.DLT_FRELAY": "syscall",
- "syscall.DLT_FRELAY_WITH_DIR": "syscall",
- "syscall.DLT_GCOM_SERIAL": "syscall",
- "syscall.DLT_GCOM_T1E1": "syscall",
- "syscall.DLT_GPF_F": "syscall",
- "syscall.DLT_GPF_T": "syscall",
- "syscall.DLT_GPRS_LLC": "syscall",
- "syscall.DLT_GSMTAP_ABIS": "syscall",
- "syscall.DLT_GSMTAP_UM": "syscall",
- "syscall.DLT_HDLC": "syscall",
- "syscall.DLT_HHDLC": "syscall",
- "syscall.DLT_HIPPI": "syscall",
- "syscall.DLT_IBM_SN": "syscall",
- "syscall.DLT_IBM_SP": "syscall",
- "syscall.DLT_IEEE802": "syscall",
- "syscall.DLT_IEEE802_11": "syscall",
- "syscall.DLT_IEEE802_11_RADIO": "syscall",
- "syscall.DLT_IEEE802_11_RADIO_AVS": "syscall",
- "syscall.DLT_IEEE802_15_4": "syscall",
- "syscall.DLT_IEEE802_15_4_LINUX": "syscall",
- "syscall.DLT_IEEE802_15_4_NOFCS": "syscall",
- "syscall.DLT_IEEE802_15_4_NONASK_PHY": "syscall",
- "syscall.DLT_IEEE802_16_MAC_CPS": "syscall",
- "syscall.DLT_IEEE802_16_MAC_CPS_RADIO": "syscall",
- "syscall.DLT_IPFILTER": "syscall",
- "syscall.DLT_IPMB": "syscall",
- "syscall.DLT_IPMB_LINUX": "syscall",
- "syscall.DLT_IPNET": "syscall",
- "syscall.DLT_IPOIB": "syscall",
- "syscall.DLT_IPV4": "syscall",
- "syscall.DLT_IPV6": "syscall",
- "syscall.DLT_IP_OVER_FC": "syscall",
- "syscall.DLT_JUNIPER_ATM1": "syscall",
- "syscall.DLT_JUNIPER_ATM2": "syscall",
- "syscall.DLT_JUNIPER_ATM_CEMIC": "syscall",
- "syscall.DLT_JUNIPER_CHDLC": "syscall",
- "syscall.DLT_JUNIPER_ES": "syscall",
- "syscall.DLT_JUNIPER_ETHER": "syscall",
- "syscall.DLT_JUNIPER_FIBRECHANNEL": "syscall",
- "syscall.DLT_JUNIPER_FRELAY": "syscall",
- "syscall.DLT_JUNIPER_GGSN": "syscall",
- "syscall.DLT_JUNIPER_ISM": "syscall",
- "syscall.DLT_JUNIPER_MFR": "syscall",
- "syscall.DLT_JUNIPER_MLFR": "syscall",
- "syscall.DLT_JUNIPER_MLPPP": "syscall",
- "syscall.DLT_JUNIPER_MONITOR": "syscall",
- "syscall.DLT_JUNIPER_PIC_PEER": "syscall",
- "syscall.DLT_JUNIPER_PPP": "syscall",
- "syscall.DLT_JUNIPER_PPPOE": "syscall",
- "syscall.DLT_JUNIPER_PPPOE_ATM": "syscall",
- "syscall.DLT_JUNIPER_SERVICES": "syscall",
- "syscall.DLT_JUNIPER_SRX_E2E": "syscall",
- "syscall.DLT_JUNIPER_ST": "syscall",
- "syscall.DLT_JUNIPER_VP": "syscall",
- "syscall.DLT_JUNIPER_VS": "syscall",
- "syscall.DLT_LAPB_WITH_DIR": "syscall",
- "syscall.DLT_LAPD": "syscall",
- "syscall.DLT_LIN": "syscall",
- "syscall.DLT_LINUX_EVDEV": "syscall",
- "syscall.DLT_LINUX_IRDA": "syscall",
- "syscall.DLT_LINUX_LAPD": "syscall",
- "syscall.DLT_LINUX_PPP_WITHDIRECTION": "syscall",
- "syscall.DLT_LINUX_SLL": "syscall",
- "syscall.DLT_LOOP": "syscall",
- "syscall.DLT_LTALK": "syscall",
- "syscall.DLT_MATCHING_MAX": "syscall",
- "syscall.DLT_MATCHING_MIN": "syscall",
- "syscall.DLT_MFR": "syscall",
- "syscall.DLT_MOST": "syscall",
- "syscall.DLT_MPEG_2_TS": "syscall",
- "syscall.DLT_MPLS": "syscall",
- "syscall.DLT_MTP2": "syscall",
- "syscall.DLT_MTP2_WITH_PHDR": "syscall",
- "syscall.DLT_MTP3": "syscall",
- "syscall.DLT_MUX27010": "syscall",
- "syscall.DLT_NETANALYZER": "syscall",
- "syscall.DLT_NETANALYZER_TRANSPARENT": "syscall",
- "syscall.DLT_NFC_LLCP": "syscall",
- "syscall.DLT_NFLOG": "syscall",
- "syscall.DLT_NG40": "syscall",
- "syscall.DLT_NULL": "syscall",
- "syscall.DLT_PCI_EXP": "syscall",
- "syscall.DLT_PFLOG": "syscall",
- "syscall.DLT_PFSYNC": "syscall",
- "syscall.DLT_PPI": "syscall",
- "syscall.DLT_PPP": "syscall",
- "syscall.DLT_PPP_BSDOS": "syscall",
- "syscall.DLT_PPP_ETHER": "syscall",
- "syscall.DLT_PPP_PPPD": "syscall",
- "syscall.DLT_PPP_SERIAL": "syscall",
- "syscall.DLT_PPP_WITH_DIR": "syscall",
- "syscall.DLT_PPP_WITH_DIRECTION": "syscall",
- "syscall.DLT_PRISM_HEADER": "syscall",
- "syscall.DLT_PRONET": "syscall",
- "syscall.DLT_RAIF1": "syscall",
- "syscall.DLT_RAW": "syscall",
- "syscall.DLT_RAWAF_MASK": "syscall",
- "syscall.DLT_RIO": "syscall",
- "syscall.DLT_SCCP": "syscall",
- "syscall.DLT_SITA": "syscall",
- "syscall.DLT_SLIP": "syscall",
- "syscall.DLT_SLIP_BSDOS": "syscall",
- "syscall.DLT_STANAG_5066_D_PDU": "syscall",
- "syscall.DLT_SUNATM": "syscall",
- "syscall.DLT_SYMANTEC_FIREWALL": "syscall",
- "syscall.DLT_TZSP": "syscall",
- "syscall.DLT_USB": "syscall",
- "syscall.DLT_USB_LINUX": "syscall",
- "syscall.DLT_USB_LINUX_MMAPPED": "syscall",
- "syscall.DLT_USER0": "syscall",
- "syscall.DLT_USER1": "syscall",
- "syscall.DLT_USER10": "syscall",
- "syscall.DLT_USER11": "syscall",
- "syscall.DLT_USER12": "syscall",
- "syscall.DLT_USER13": "syscall",
- "syscall.DLT_USER14": "syscall",
- "syscall.DLT_USER15": "syscall",
- "syscall.DLT_USER2": "syscall",
- "syscall.DLT_USER3": "syscall",
- "syscall.DLT_USER4": "syscall",
- "syscall.DLT_USER5": "syscall",
- "syscall.DLT_USER6": "syscall",
- "syscall.DLT_USER7": "syscall",
- "syscall.DLT_USER8": "syscall",
- "syscall.DLT_USER9": "syscall",
- "syscall.DLT_WIHART": "syscall",
- "syscall.DLT_X2E_SERIAL": "syscall",
- "syscall.DLT_X2E_XORAYA": "syscall",
- "syscall.DNSMXData": "syscall",
- "syscall.DNSPTRData": "syscall",
- "syscall.DNSRecord": "syscall",
- "syscall.DNSSRVData": "syscall",
- "syscall.DNSTXTData": "syscall",
- "syscall.DNS_INFO_NO_RECORDS": "syscall",
- "syscall.DNS_TYPE_A": "syscall",
- "syscall.DNS_TYPE_A6": "syscall",
- "syscall.DNS_TYPE_AAAA": "syscall",
- "syscall.DNS_TYPE_ADDRS": "syscall",
- "syscall.DNS_TYPE_AFSDB": "syscall",
- "syscall.DNS_TYPE_ALL": "syscall",
- "syscall.DNS_TYPE_ANY": "syscall",
- "syscall.DNS_TYPE_ATMA": "syscall",
- "syscall.DNS_TYPE_AXFR": "syscall",
- "syscall.DNS_TYPE_CERT": "syscall",
- "syscall.DNS_TYPE_CNAME": "syscall",
- "syscall.DNS_TYPE_DHCID": "syscall",
- "syscall.DNS_TYPE_DNAME": "syscall",
- "syscall.DNS_TYPE_DNSKEY": "syscall",
- "syscall.DNS_TYPE_DS": "syscall",
- "syscall.DNS_TYPE_EID": "syscall",
- "syscall.DNS_TYPE_GID": "syscall",
- "syscall.DNS_TYPE_GPOS": "syscall",
- "syscall.DNS_TYPE_HINFO": "syscall",
- "syscall.DNS_TYPE_ISDN": "syscall",
- "syscall.DNS_TYPE_IXFR": "syscall",
- "syscall.DNS_TYPE_KEY": "syscall",
- "syscall.DNS_TYPE_KX": "syscall",
- "syscall.DNS_TYPE_LOC": "syscall",
- "syscall.DNS_TYPE_MAILA": "syscall",
- "syscall.DNS_TYPE_MAILB": "syscall",
- "syscall.DNS_TYPE_MB": "syscall",
- "syscall.DNS_TYPE_MD": "syscall",
- "syscall.DNS_TYPE_MF": "syscall",
- "syscall.DNS_TYPE_MG": "syscall",
- "syscall.DNS_TYPE_MINFO": "syscall",
- "syscall.DNS_TYPE_MR": "syscall",
- "syscall.DNS_TYPE_MX": "syscall",
- "syscall.DNS_TYPE_NAPTR": "syscall",
- "syscall.DNS_TYPE_NBSTAT": "syscall",
- "syscall.DNS_TYPE_NIMLOC": "syscall",
- "syscall.DNS_TYPE_NS": "syscall",
- "syscall.DNS_TYPE_NSAP": "syscall",
- "syscall.DNS_TYPE_NSAPPTR": "syscall",
- "syscall.DNS_TYPE_NSEC": "syscall",
- "syscall.DNS_TYPE_NULL": "syscall",
- "syscall.DNS_TYPE_NXT": "syscall",
- "syscall.DNS_TYPE_OPT": "syscall",
- "syscall.DNS_TYPE_PTR": "syscall",
- "syscall.DNS_TYPE_PX": "syscall",
- "syscall.DNS_TYPE_RP": "syscall",
- "syscall.DNS_TYPE_RRSIG": "syscall",
- "syscall.DNS_TYPE_RT": "syscall",
- "syscall.DNS_TYPE_SIG": "syscall",
- "syscall.DNS_TYPE_SINK": "syscall",
- "syscall.DNS_TYPE_SOA": "syscall",
- "syscall.DNS_TYPE_SRV": "syscall",
- "syscall.DNS_TYPE_TEXT": "syscall",
- "syscall.DNS_TYPE_TKEY": "syscall",
- "syscall.DNS_TYPE_TSIG": "syscall",
- "syscall.DNS_TYPE_UID": "syscall",
- "syscall.DNS_TYPE_UINFO": "syscall",
- "syscall.DNS_TYPE_UNSPEC": "syscall",
- "syscall.DNS_TYPE_WINS": "syscall",
- "syscall.DNS_TYPE_WINSR": "syscall",
- "syscall.DNS_TYPE_WKS": "syscall",
- "syscall.DNS_TYPE_X25": "syscall",
- "syscall.DT_BLK": "syscall",
- "syscall.DT_CHR": "syscall",
- "syscall.DT_DIR": "syscall",
- "syscall.DT_FIFO": "syscall",
- "syscall.DT_LNK": "syscall",
- "syscall.DT_REG": "syscall",
- "syscall.DT_SOCK": "syscall",
- "syscall.DT_UNKNOWN": "syscall",
- "syscall.DT_WHT": "syscall",
- "syscall.DUPLICATE_CLOSE_SOURCE": "syscall",
- "syscall.DUPLICATE_SAME_ACCESS": "syscall",
- "syscall.DeleteFile": "syscall",
- "syscall.DetachLsf": "syscall",
- "syscall.DeviceIoControl": "syscall",
- "syscall.Dirent": "syscall",
- "syscall.DnsNameCompare": "syscall",
- "syscall.DnsQuery": "syscall",
- "syscall.DnsRecordListFree": "syscall",
- "syscall.DnsSectionAdditional": "syscall",
- "syscall.DnsSectionAnswer": "syscall",
- "syscall.DnsSectionAuthority": "syscall",
- "syscall.DnsSectionQuestion": "syscall",
- "syscall.Dup": "syscall",
- "syscall.Dup2": "syscall",
- "syscall.Dup3": "syscall",
- "syscall.DuplicateHandle": "syscall",
- "syscall.E2BIG": "syscall",
- "syscall.EACCES": "syscall",
- "syscall.EADDRINUSE": "syscall",
- "syscall.EADDRNOTAVAIL": "syscall",
- "syscall.EADV": "syscall",
- "syscall.EAFNOSUPPORT": "syscall",
- "syscall.EAGAIN": "syscall",
- "syscall.EALREADY": "syscall",
- "syscall.EAUTH": "syscall",
- "syscall.EBADARCH": "syscall",
- "syscall.EBADE": "syscall",
- "syscall.EBADEXEC": "syscall",
- "syscall.EBADF": "syscall",
- "syscall.EBADFD": "syscall",
- "syscall.EBADMACHO": "syscall",
- "syscall.EBADMSG": "syscall",
- "syscall.EBADR": "syscall",
- "syscall.EBADRPC": "syscall",
- "syscall.EBADRQC": "syscall",
- "syscall.EBADSLT": "syscall",
- "syscall.EBFONT": "syscall",
- "syscall.EBUSY": "syscall",
- "syscall.ECANCELED": "syscall",
- "syscall.ECAPMODE": "syscall",
- "syscall.ECHILD": "syscall",
- "syscall.ECHO": "syscall",
- "syscall.ECHOCTL": "syscall",
- "syscall.ECHOE": "syscall",
- "syscall.ECHOK": "syscall",
- "syscall.ECHOKE": "syscall",
- "syscall.ECHONL": "syscall",
- "syscall.ECHOPRT": "syscall",
- "syscall.ECHRNG": "syscall",
- "syscall.ECOMM": "syscall",
- "syscall.ECONNABORTED": "syscall",
- "syscall.ECONNREFUSED": "syscall",
- "syscall.ECONNRESET": "syscall",
- "syscall.EDEADLK": "syscall",
- "syscall.EDEADLOCK": "syscall",
- "syscall.EDESTADDRREQ": "syscall",
- "syscall.EDEVERR": "syscall",
- "syscall.EDOM": "syscall",
- "syscall.EDOOFUS": "syscall",
- "syscall.EDOTDOT": "syscall",
- "syscall.EDQUOT": "syscall",
- "syscall.EEXIST": "syscall",
- "syscall.EFAULT": "syscall",
- "syscall.EFBIG": "syscall",
- "syscall.EFER_LMA": "syscall",
- "syscall.EFER_LME": "syscall",
- "syscall.EFER_NXE": "syscall",
- "syscall.EFER_SCE": "syscall",
- "syscall.EFTYPE": "syscall",
- "syscall.EHOSTDOWN": "syscall",
- "syscall.EHOSTUNREACH": "syscall",
- "syscall.EHWPOISON": "syscall",
- "syscall.EIDRM": "syscall",
- "syscall.EILSEQ": "syscall",
- "syscall.EINPROGRESS": "syscall",
- "syscall.EINTR": "syscall",
- "syscall.EINVAL": "syscall",
- "syscall.EIO": "syscall",
- "syscall.EIPSEC": "syscall",
- "syscall.EISCONN": "syscall",
- "syscall.EISDIR": "syscall",
- "syscall.EISNAM": "syscall",
- "syscall.EKEYEXPIRED": "syscall",
- "syscall.EKEYREJECTED": "syscall",
- "syscall.EKEYREVOKED": "syscall",
- "syscall.EL2HLT": "syscall",
- "syscall.EL2NSYNC": "syscall",
- "syscall.EL3HLT": "syscall",
- "syscall.EL3RST": "syscall",
- "syscall.ELAST": "syscall",
- "syscall.ELF_NGREG": "syscall",
- "syscall.ELF_PRARGSZ": "syscall",
- "syscall.ELIBACC": "syscall",
- "syscall.ELIBBAD": "syscall",
- "syscall.ELIBEXEC": "syscall",
- "syscall.ELIBMAX": "syscall",
- "syscall.ELIBSCN": "syscall",
- "syscall.ELNRNG": "syscall",
- "syscall.ELOOP": "syscall",
- "syscall.EMEDIUMTYPE": "syscall",
- "syscall.EMFILE": "syscall",
- "syscall.EMLINK": "syscall",
- "syscall.EMSGSIZE": "syscall",
- "syscall.EMT_TAGOVF": "syscall",
- "syscall.EMULTIHOP": "syscall",
- "syscall.EMUL_ENABLED": "syscall",
- "syscall.EMUL_LINUX": "syscall",
- "syscall.EMUL_LINUX32": "syscall",
- "syscall.EMUL_MAXID": "syscall",
- "syscall.EMUL_NATIVE": "syscall",
- "syscall.ENAMETOOLONG": "syscall",
- "syscall.ENAVAIL": "syscall",
- "syscall.ENDRUNDISC": "syscall",
- "syscall.ENEEDAUTH": "syscall",
- "syscall.ENETDOWN": "syscall",
- "syscall.ENETRESET": "syscall",
- "syscall.ENETUNREACH": "syscall",
- "syscall.ENFILE": "syscall",
- "syscall.ENOANO": "syscall",
- "syscall.ENOATTR": "syscall",
- "syscall.ENOBUFS": "syscall",
- "syscall.ENOCSI": "syscall",
- "syscall.ENODATA": "syscall",
- "syscall.ENODEV": "syscall",
- "syscall.ENOENT": "syscall",
- "syscall.ENOEXEC": "syscall",
- "syscall.ENOKEY": "syscall",
- "syscall.ENOLCK": "syscall",
- "syscall.ENOLINK": "syscall",
- "syscall.ENOMEDIUM": "syscall",
- "syscall.ENOMEM": "syscall",
- "syscall.ENOMSG": "syscall",
- "syscall.ENONET": "syscall",
- "syscall.ENOPKG": "syscall",
- "syscall.ENOPOLICY": "syscall",
- "syscall.ENOPROTOOPT": "syscall",
- "syscall.ENOSPC": "syscall",
- "syscall.ENOSR": "syscall",
- "syscall.ENOSTR": "syscall",
- "syscall.ENOSYS": "syscall",
- "syscall.ENOTBLK": "syscall",
- "syscall.ENOTCAPABLE": "syscall",
- "syscall.ENOTCONN": "syscall",
- "syscall.ENOTDIR": "syscall",
- "syscall.ENOTEMPTY": "syscall",
- "syscall.ENOTNAM": "syscall",
- "syscall.ENOTRECOVERABLE": "syscall",
- "syscall.ENOTSOCK": "syscall",
- "syscall.ENOTSUP": "syscall",
- "syscall.ENOTTY": "syscall",
- "syscall.ENOTUNIQ": "syscall",
- "syscall.ENXIO": "syscall",
- "syscall.EN_SW_CTL_INF": "syscall",
- "syscall.EN_SW_CTL_PREC": "syscall",
- "syscall.EN_SW_CTL_ROUND": "syscall",
- "syscall.EN_SW_DATACHAIN": "syscall",
- "syscall.EN_SW_DENORM": "syscall",
- "syscall.EN_SW_INVOP": "syscall",
- "syscall.EN_SW_OVERFLOW": "syscall",
- "syscall.EN_SW_PRECLOSS": "syscall",
- "syscall.EN_SW_UNDERFLOW": "syscall",
- "syscall.EN_SW_ZERODIV": "syscall",
- "syscall.EOPNOTSUPP": "syscall",
- "syscall.EOVERFLOW": "syscall",
- "syscall.EOWNERDEAD": "syscall",
- "syscall.EPERM": "syscall",
- "syscall.EPFNOSUPPORT": "syscall",
- "syscall.EPIPE": "syscall",
- "syscall.EPOLLERR": "syscall",
- "syscall.EPOLLET": "syscall",
- "syscall.EPOLLHUP": "syscall",
- "syscall.EPOLLIN": "syscall",
- "syscall.EPOLLMSG": "syscall",
- "syscall.EPOLLONESHOT": "syscall",
- "syscall.EPOLLOUT": "syscall",
- "syscall.EPOLLPRI": "syscall",
- "syscall.EPOLLRDBAND": "syscall",
- "syscall.EPOLLRDHUP": "syscall",
- "syscall.EPOLLRDNORM": "syscall",
- "syscall.EPOLLWRBAND": "syscall",
- "syscall.EPOLLWRNORM": "syscall",
- "syscall.EPOLL_CLOEXEC": "syscall",
- "syscall.EPOLL_CTL_ADD": "syscall",
- "syscall.EPOLL_CTL_DEL": "syscall",
- "syscall.EPOLL_CTL_MOD": "syscall",
- "syscall.EPOLL_NONBLOCK": "syscall",
- "syscall.EPROCLIM": "syscall",
- "syscall.EPROCUNAVAIL": "syscall",
- "syscall.EPROGMISMATCH": "syscall",
- "syscall.EPROGUNAVAIL": "syscall",
- "syscall.EPROTO": "syscall",
- "syscall.EPROTONOSUPPORT": "syscall",
- "syscall.EPROTOTYPE": "syscall",
- "syscall.EPWROFF": "syscall",
- "syscall.ERANGE": "syscall",
- "syscall.EREMCHG": "syscall",
- "syscall.EREMOTE": "syscall",
- "syscall.EREMOTEIO": "syscall",
- "syscall.ERESTART": "syscall",
- "syscall.ERFKILL": "syscall",
- "syscall.EROFS": "syscall",
- "syscall.ERPCMISMATCH": "syscall",
- "syscall.ERROR_ACCESS_DENIED": "syscall",
- "syscall.ERROR_ALREADY_EXISTS": "syscall",
- "syscall.ERROR_BROKEN_PIPE": "syscall",
- "syscall.ERROR_BUFFER_OVERFLOW": "syscall",
- "syscall.ERROR_DIR_NOT_EMPTY": "syscall",
- "syscall.ERROR_ENVVAR_NOT_FOUND": "syscall",
- "syscall.ERROR_FILE_EXISTS": "syscall",
- "syscall.ERROR_FILE_NOT_FOUND": "syscall",
- "syscall.ERROR_HANDLE_EOF": "syscall",
- "syscall.ERROR_INSUFFICIENT_BUFFER": "syscall",
- "syscall.ERROR_IO_PENDING": "syscall",
- "syscall.ERROR_MOD_NOT_FOUND": "syscall",
- "syscall.ERROR_MORE_DATA": "syscall",
- "syscall.ERROR_NETNAME_DELETED": "syscall",
- "syscall.ERROR_NOT_FOUND": "syscall",
- "syscall.ERROR_NO_MORE_FILES": "syscall",
- "syscall.ERROR_OPERATION_ABORTED": "syscall",
- "syscall.ERROR_PATH_NOT_FOUND": "syscall",
- "syscall.ERROR_PRIVILEGE_NOT_HELD": "syscall",
- "syscall.ERROR_PROC_NOT_FOUND": "syscall",
- "syscall.ESHLIBVERS": "syscall",
- "syscall.ESHUTDOWN": "syscall",
- "syscall.ESOCKTNOSUPPORT": "syscall",
- "syscall.ESPIPE": "syscall",
- "syscall.ESRCH": "syscall",
- "syscall.ESRMNT": "syscall",
- "syscall.ESTALE": "syscall",
- "syscall.ESTRPIPE": "syscall",
- "syscall.ETHERCAP_JUMBO_MTU": "syscall",
- "syscall.ETHERCAP_VLAN_HWTAGGING": "syscall",
- "syscall.ETHERCAP_VLAN_MTU": "syscall",
- "syscall.ETHERMIN": "syscall",
- "syscall.ETHERMTU": "syscall",
- "syscall.ETHERMTU_JUMBO": "syscall",
- "syscall.ETHERTYPE_8023": "syscall",
- "syscall.ETHERTYPE_AARP": "syscall",
- "syscall.ETHERTYPE_ACCTON": "syscall",
- "syscall.ETHERTYPE_AEONIC": "syscall",
- "syscall.ETHERTYPE_ALPHA": "syscall",
- "syscall.ETHERTYPE_AMBER": "syscall",
- "syscall.ETHERTYPE_AMOEBA": "syscall",
- "syscall.ETHERTYPE_AOE": "syscall",
- "syscall.ETHERTYPE_APOLLO": "syscall",
- "syscall.ETHERTYPE_APOLLODOMAIN": "syscall",
- "syscall.ETHERTYPE_APPLETALK": "syscall",
- "syscall.ETHERTYPE_APPLITEK": "syscall",
- "syscall.ETHERTYPE_ARGONAUT": "syscall",
- "syscall.ETHERTYPE_ARP": "syscall",
- "syscall.ETHERTYPE_AT": "syscall",
- "syscall.ETHERTYPE_ATALK": "syscall",
- "syscall.ETHERTYPE_ATOMIC": "syscall",
- "syscall.ETHERTYPE_ATT": "syscall",
- "syscall.ETHERTYPE_ATTSTANFORD": "syscall",
- "syscall.ETHERTYPE_AUTOPHON": "syscall",
- "syscall.ETHERTYPE_AXIS": "syscall",
- "syscall.ETHERTYPE_BCLOOP": "syscall",
- "syscall.ETHERTYPE_BOFL": "syscall",
- "syscall.ETHERTYPE_CABLETRON": "syscall",
- "syscall.ETHERTYPE_CHAOS": "syscall",
- "syscall.ETHERTYPE_COMDESIGN": "syscall",
- "syscall.ETHERTYPE_COMPUGRAPHIC": "syscall",
- "syscall.ETHERTYPE_COUNTERPOINT": "syscall",
- "syscall.ETHERTYPE_CRONUS": "syscall",
- "syscall.ETHERTYPE_CRONUSVLN": "syscall",
- "syscall.ETHERTYPE_DCA": "syscall",
- "syscall.ETHERTYPE_DDE": "syscall",
- "syscall.ETHERTYPE_DEBNI": "syscall",
- "syscall.ETHERTYPE_DECAM": "syscall",
- "syscall.ETHERTYPE_DECCUST": "syscall",
- "syscall.ETHERTYPE_DECDIAG": "syscall",
- "syscall.ETHERTYPE_DECDNS": "syscall",
- "syscall.ETHERTYPE_DECDTS": "syscall",
- "syscall.ETHERTYPE_DECEXPER": "syscall",
- "syscall.ETHERTYPE_DECLAST": "syscall",
- "syscall.ETHERTYPE_DECLTM": "syscall",
- "syscall.ETHERTYPE_DECMUMPS": "syscall",
- "syscall.ETHERTYPE_DECNETBIOS": "syscall",
- "syscall.ETHERTYPE_DELTACON": "syscall",
- "syscall.ETHERTYPE_DIDDLE": "syscall",
- "syscall.ETHERTYPE_DLOG1": "syscall",
- "syscall.ETHERTYPE_DLOG2": "syscall",
- "syscall.ETHERTYPE_DN": "syscall",
- "syscall.ETHERTYPE_DOGFIGHT": "syscall",
- "syscall.ETHERTYPE_DSMD": "syscall",
- "syscall.ETHERTYPE_ECMA": "syscall",
- "syscall.ETHERTYPE_ENCRYPT": "syscall",
- "syscall.ETHERTYPE_ES": "syscall",
- "syscall.ETHERTYPE_EXCELAN": "syscall",
- "syscall.ETHERTYPE_EXPERDATA": "syscall",
- "syscall.ETHERTYPE_FLIP": "syscall",
- "syscall.ETHERTYPE_FLOWCONTROL": "syscall",
- "syscall.ETHERTYPE_FRARP": "syscall",
- "syscall.ETHERTYPE_GENDYN": "syscall",
- "syscall.ETHERTYPE_HAYES": "syscall",
- "syscall.ETHERTYPE_HIPPI_FP": "syscall",
- "syscall.ETHERTYPE_HITACHI": "syscall",
- "syscall.ETHERTYPE_HP": "syscall",
- "syscall.ETHERTYPE_IEEEPUP": "syscall",
- "syscall.ETHERTYPE_IEEEPUPAT": "syscall",
- "syscall.ETHERTYPE_IMLBL": "syscall",
- "syscall.ETHERTYPE_IMLBLDIAG": "syscall",
- "syscall.ETHERTYPE_IP": "syscall",
- "syscall.ETHERTYPE_IPAS": "syscall",
- "syscall.ETHERTYPE_IPV6": "syscall",
- "syscall.ETHERTYPE_IPX": "syscall",
- "syscall.ETHERTYPE_IPXNEW": "syscall",
- "syscall.ETHERTYPE_KALPANA": "syscall",
- "syscall.ETHERTYPE_LANBRIDGE": "syscall",
- "syscall.ETHERTYPE_LANPROBE": "syscall",
- "syscall.ETHERTYPE_LAT": "syscall",
- "syscall.ETHERTYPE_LBACK": "syscall",
- "syscall.ETHERTYPE_LITTLE": "syscall",
- "syscall.ETHERTYPE_LLDP": "syscall",
- "syscall.ETHERTYPE_LOGICRAFT": "syscall",
- "syscall.ETHERTYPE_LOOPBACK": "syscall",
- "syscall.ETHERTYPE_MATRA": "syscall",
- "syscall.ETHERTYPE_MAX": "syscall",
- "syscall.ETHERTYPE_MERIT": "syscall",
- "syscall.ETHERTYPE_MICP": "syscall",
- "syscall.ETHERTYPE_MOPDL": "syscall",
- "syscall.ETHERTYPE_MOPRC": "syscall",
- "syscall.ETHERTYPE_MOTOROLA": "syscall",
- "syscall.ETHERTYPE_MPLS": "syscall",
- "syscall.ETHERTYPE_MPLS_MCAST": "syscall",
- "syscall.ETHERTYPE_MUMPS": "syscall",
- "syscall.ETHERTYPE_NBPCC": "syscall",
- "syscall.ETHERTYPE_NBPCLAIM": "syscall",
- "syscall.ETHERTYPE_NBPCLREQ": "syscall",
- "syscall.ETHERTYPE_NBPCLRSP": "syscall",
- "syscall.ETHERTYPE_NBPCREQ": "syscall",
- "syscall.ETHERTYPE_NBPCRSP": "syscall",
- "syscall.ETHERTYPE_NBPDG": "syscall",
- "syscall.ETHERTYPE_NBPDGB": "syscall",
- "syscall.ETHERTYPE_NBPDLTE": "syscall",
- "syscall.ETHERTYPE_NBPRAR": "syscall",
- "syscall.ETHERTYPE_NBPRAS": "syscall",
- "syscall.ETHERTYPE_NBPRST": "syscall",
- "syscall.ETHERTYPE_NBPSCD": "syscall",
- "syscall.ETHERTYPE_NBPVCD": "syscall",
- "syscall.ETHERTYPE_NBS": "syscall",
- "syscall.ETHERTYPE_NCD": "syscall",
- "syscall.ETHERTYPE_NESTAR": "syscall",
- "syscall.ETHERTYPE_NETBEUI": "syscall",
- "syscall.ETHERTYPE_NOVELL": "syscall",
- "syscall.ETHERTYPE_NS": "syscall",
- "syscall.ETHERTYPE_NSAT": "syscall",
- "syscall.ETHERTYPE_NSCOMPAT": "syscall",
- "syscall.ETHERTYPE_NTRAILER": "syscall",
- "syscall.ETHERTYPE_OS9": "syscall",
- "syscall.ETHERTYPE_OS9NET": "syscall",
- "syscall.ETHERTYPE_PACER": "syscall",
- "syscall.ETHERTYPE_PAE": "syscall",
- "syscall.ETHERTYPE_PCS": "syscall",
- "syscall.ETHERTYPE_PLANNING": "syscall",
- "syscall.ETHERTYPE_PPP": "syscall",
- "syscall.ETHERTYPE_PPPOE": "syscall",
- "syscall.ETHERTYPE_PPPOEDISC": "syscall",
- "syscall.ETHERTYPE_PRIMENTS": "syscall",
- "syscall.ETHERTYPE_PUP": "syscall",
- "syscall.ETHERTYPE_PUPAT": "syscall",
- "syscall.ETHERTYPE_QINQ": "syscall",
- "syscall.ETHERTYPE_RACAL": "syscall",
- "syscall.ETHERTYPE_RATIONAL": "syscall",
- "syscall.ETHERTYPE_RAWFR": "syscall",
- "syscall.ETHERTYPE_RCL": "syscall",
- "syscall.ETHERTYPE_RDP": "syscall",
- "syscall.ETHERTYPE_RETIX": "syscall",
- "syscall.ETHERTYPE_REVARP": "syscall",
- "syscall.ETHERTYPE_SCA": "syscall",
- "syscall.ETHERTYPE_SECTRA": "syscall",
- "syscall.ETHERTYPE_SECUREDATA": "syscall",
- "syscall.ETHERTYPE_SGITW": "syscall",
- "syscall.ETHERTYPE_SG_BOUNCE": "syscall",
- "syscall.ETHERTYPE_SG_DIAG": "syscall",
- "syscall.ETHERTYPE_SG_NETGAMES": "syscall",
- "syscall.ETHERTYPE_SG_RESV": "syscall",
- "syscall.ETHERTYPE_SIMNET": "syscall",
- "syscall.ETHERTYPE_SLOW": "syscall",
- "syscall.ETHERTYPE_SLOWPROTOCOLS": "syscall",
- "syscall.ETHERTYPE_SNA": "syscall",
- "syscall.ETHERTYPE_SNMP": "syscall",
- "syscall.ETHERTYPE_SONIX": "syscall",
- "syscall.ETHERTYPE_SPIDER": "syscall",
- "syscall.ETHERTYPE_SPRITE": "syscall",
- "syscall.ETHERTYPE_STP": "syscall",
- "syscall.ETHERTYPE_TALARIS": "syscall",
- "syscall.ETHERTYPE_TALARISMC": "syscall",
- "syscall.ETHERTYPE_TCPCOMP": "syscall",
- "syscall.ETHERTYPE_TCPSM": "syscall",
- "syscall.ETHERTYPE_TEC": "syscall",
- "syscall.ETHERTYPE_TIGAN": "syscall",
- "syscall.ETHERTYPE_TRAIL": "syscall",
- "syscall.ETHERTYPE_TRANSETHER": "syscall",
- "syscall.ETHERTYPE_TYMSHARE": "syscall",
- "syscall.ETHERTYPE_UBBST": "syscall",
- "syscall.ETHERTYPE_UBDEBUG": "syscall",
- "syscall.ETHERTYPE_UBDIAGLOOP": "syscall",
- "syscall.ETHERTYPE_UBDL": "syscall",
- "syscall.ETHERTYPE_UBNIU": "syscall",
- "syscall.ETHERTYPE_UBNMC": "syscall",
- "syscall.ETHERTYPE_VALID": "syscall",
- "syscall.ETHERTYPE_VARIAN": "syscall",
- "syscall.ETHERTYPE_VAXELN": "syscall",
- "syscall.ETHERTYPE_VEECO": "syscall",
- "syscall.ETHERTYPE_VEXP": "syscall",
- "syscall.ETHERTYPE_VGLAB": "syscall",
- "syscall.ETHERTYPE_VINES": "syscall",
- "syscall.ETHERTYPE_VINESECHO": "syscall",
- "syscall.ETHERTYPE_VINESLOOP": "syscall",
- "syscall.ETHERTYPE_VITAL": "syscall",
- "syscall.ETHERTYPE_VLAN": "syscall",
- "syscall.ETHERTYPE_VLTLMAN": "syscall",
- "syscall.ETHERTYPE_VPROD": "syscall",
- "syscall.ETHERTYPE_VURESERVED": "syscall",
- "syscall.ETHERTYPE_WATERLOO": "syscall",
- "syscall.ETHERTYPE_WELLFLEET": "syscall",
- "syscall.ETHERTYPE_X25": "syscall",
- "syscall.ETHERTYPE_X75": "syscall",
- "syscall.ETHERTYPE_XNSSM": "syscall",
- "syscall.ETHERTYPE_XTP": "syscall",
- "syscall.ETHER_ADDR_LEN": "syscall",
- "syscall.ETHER_ALIGN": "syscall",
- "syscall.ETHER_CRC_LEN": "syscall",
- "syscall.ETHER_CRC_POLY_BE": "syscall",
- "syscall.ETHER_CRC_POLY_LE": "syscall",
- "syscall.ETHER_HDR_LEN": "syscall",
- "syscall.ETHER_MAX_DIX_LEN": "syscall",
- "syscall.ETHER_MAX_LEN": "syscall",
- "syscall.ETHER_MAX_LEN_JUMBO": "syscall",
- "syscall.ETHER_MIN_LEN": "syscall",
- "syscall.ETHER_PPPOE_ENCAP_LEN": "syscall",
- "syscall.ETHER_TYPE_LEN": "syscall",
- "syscall.ETHER_VLAN_ENCAP_LEN": "syscall",
- "syscall.ETH_P_1588": "syscall",
- "syscall.ETH_P_8021Q": "syscall",
- "syscall.ETH_P_802_2": "syscall",
- "syscall.ETH_P_802_3": "syscall",
- "syscall.ETH_P_AARP": "syscall",
- "syscall.ETH_P_ALL": "syscall",
- "syscall.ETH_P_AOE": "syscall",
- "syscall.ETH_P_ARCNET": "syscall",
- "syscall.ETH_P_ARP": "syscall",
- "syscall.ETH_P_ATALK": "syscall",
- "syscall.ETH_P_ATMFATE": "syscall",
- "syscall.ETH_P_ATMMPOA": "syscall",
- "syscall.ETH_P_AX25": "syscall",
- "syscall.ETH_P_BPQ": "syscall",
- "syscall.ETH_P_CAIF": "syscall",
- "syscall.ETH_P_CAN": "syscall",
- "syscall.ETH_P_CONTROL": "syscall",
- "syscall.ETH_P_CUST": "syscall",
- "syscall.ETH_P_DDCMP": "syscall",
- "syscall.ETH_P_DEC": "syscall",
- "syscall.ETH_P_DIAG": "syscall",
- "syscall.ETH_P_DNA_DL": "syscall",
- "syscall.ETH_P_DNA_RC": "syscall",
- "syscall.ETH_P_DNA_RT": "syscall",
- "syscall.ETH_P_DSA": "syscall",
- "syscall.ETH_P_ECONET": "syscall",
- "syscall.ETH_P_EDSA": "syscall",
- "syscall.ETH_P_FCOE": "syscall",
- "syscall.ETH_P_FIP": "syscall",
- "syscall.ETH_P_HDLC": "syscall",
- "syscall.ETH_P_IEEE802154": "syscall",
- "syscall.ETH_P_IEEEPUP": "syscall",
- "syscall.ETH_P_IEEEPUPAT": "syscall",
- "syscall.ETH_P_IP": "syscall",
- "syscall.ETH_P_IPV6": "syscall",
- "syscall.ETH_P_IPX": "syscall",
- "syscall.ETH_P_IRDA": "syscall",
- "syscall.ETH_P_LAT": "syscall",
- "syscall.ETH_P_LINK_CTL": "syscall",
- "syscall.ETH_P_LOCALTALK": "syscall",
- "syscall.ETH_P_LOOP": "syscall",
- "syscall.ETH_P_MOBITEX": "syscall",
- "syscall.ETH_P_MPLS_MC": "syscall",
- "syscall.ETH_P_MPLS_UC": "syscall",
- "syscall.ETH_P_PAE": "syscall",
- "syscall.ETH_P_PAUSE": "syscall",
- "syscall.ETH_P_PHONET": "syscall",
- "syscall.ETH_P_PPPTALK": "syscall",
- "syscall.ETH_P_PPP_DISC": "syscall",
- "syscall.ETH_P_PPP_MP": "syscall",
- "syscall.ETH_P_PPP_SES": "syscall",
- "syscall.ETH_P_PUP": "syscall",
- "syscall.ETH_P_PUPAT": "syscall",
- "syscall.ETH_P_RARP": "syscall",
- "syscall.ETH_P_SCA": "syscall",
- "syscall.ETH_P_SLOW": "syscall",
- "syscall.ETH_P_SNAP": "syscall",
- "syscall.ETH_P_TEB": "syscall",
- "syscall.ETH_P_TIPC": "syscall",
- "syscall.ETH_P_TRAILER": "syscall",
- "syscall.ETH_P_TR_802_2": "syscall",
- "syscall.ETH_P_WAN_PPP": "syscall",
- "syscall.ETH_P_WCCP": "syscall",
- "syscall.ETH_P_X25": "syscall",
- "syscall.ETIME": "syscall",
- "syscall.ETIMEDOUT": "syscall",
- "syscall.ETOOMANYREFS": "syscall",
- "syscall.ETXTBSY": "syscall",
- "syscall.EUCLEAN": "syscall",
- "syscall.EUNATCH": "syscall",
- "syscall.EUSERS": "syscall",
- "syscall.EVFILT_AIO": "syscall",
- "syscall.EVFILT_FS": "syscall",
- "syscall.EVFILT_LIO": "syscall",
- "syscall.EVFILT_MACHPORT": "syscall",
- "syscall.EVFILT_PROC": "syscall",
- "syscall.EVFILT_READ": "syscall",
- "syscall.EVFILT_SIGNAL": "syscall",
- "syscall.EVFILT_SYSCOUNT": "syscall",
- "syscall.EVFILT_THREADMARKER": "syscall",
- "syscall.EVFILT_TIMER": "syscall",
- "syscall.EVFILT_USER": "syscall",
- "syscall.EVFILT_VM": "syscall",
- "syscall.EVFILT_VNODE": "syscall",
- "syscall.EVFILT_WRITE": "syscall",
- "syscall.EV_ADD": "syscall",
- "syscall.EV_CLEAR": "syscall",
- "syscall.EV_DELETE": "syscall",
- "syscall.EV_DISABLE": "syscall",
- "syscall.EV_DISPATCH": "syscall",
- "syscall.EV_DROP": "syscall",
- "syscall.EV_ENABLE": "syscall",
- "syscall.EV_EOF": "syscall",
- "syscall.EV_ERROR": "syscall",
- "syscall.EV_FLAG0": "syscall",
- "syscall.EV_FLAG1": "syscall",
- "syscall.EV_ONESHOT": "syscall",
- "syscall.EV_OOBAND": "syscall",
- "syscall.EV_POLL": "syscall",
- "syscall.EV_RECEIPT": "syscall",
- "syscall.EV_SYSFLAGS": "syscall",
- "syscall.EWINDOWS": "syscall",
- "syscall.EWOULDBLOCK": "syscall",
- "syscall.EXDEV": "syscall",
- "syscall.EXFULL": "syscall",
- "syscall.EXTA": "syscall",
- "syscall.EXTB": "syscall",
- "syscall.EXTPROC": "syscall",
- "syscall.Environ": "syscall",
- "syscall.EpollCreate": "syscall",
- "syscall.EpollCreate1": "syscall",
- "syscall.EpollCtl": "syscall",
- "syscall.EpollEvent": "syscall",
- "syscall.EpollWait": "syscall",
- "syscall.Errno": "syscall",
- "syscall.EscapeArg": "syscall",
- "syscall.Exchangedata": "syscall",
- "syscall.Exec": "syscall",
- "syscall.Exit": "syscall",
- "syscall.ExitProcess": "syscall",
- "syscall.FD_CLOEXEC": "syscall",
- "syscall.FD_SETSIZE": "syscall",
- "syscall.FILE_ACTION_ADDED": "syscall",
- "syscall.FILE_ACTION_MODIFIED": "syscall",
- "syscall.FILE_ACTION_REMOVED": "syscall",
- "syscall.FILE_ACTION_RENAMED_NEW_NAME": "syscall",
- "syscall.FILE_ACTION_RENAMED_OLD_NAME": "syscall",
- "syscall.FILE_APPEND_DATA": "syscall",
- "syscall.FILE_ATTRIBUTE_ARCHIVE": "syscall",
- "syscall.FILE_ATTRIBUTE_DIRECTORY": "syscall",
- "syscall.FILE_ATTRIBUTE_HIDDEN": "syscall",
- "syscall.FILE_ATTRIBUTE_NORMAL": "syscall",
- "syscall.FILE_ATTRIBUTE_READONLY": "syscall",
- "syscall.FILE_ATTRIBUTE_REPARSE_POINT": "syscall",
- "syscall.FILE_ATTRIBUTE_SYSTEM": "syscall",
- "syscall.FILE_BEGIN": "syscall",
- "syscall.FILE_CURRENT": "syscall",
- "syscall.FILE_END": "syscall",
- "syscall.FILE_FLAG_BACKUP_SEMANTICS": "syscall",
- "syscall.FILE_FLAG_OPEN_REPARSE_POINT": "syscall",
- "syscall.FILE_FLAG_OVERLAPPED": "syscall",
- "syscall.FILE_LIST_DIRECTORY": "syscall",
- "syscall.FILE_MAP_COPY": "syscall",
- "syscall.FILE_MAP_EXECUTE": "syscall",
- "syscall.FILE_MAP_READ": "syscall",
- "syscall.FILE_MAP_WRITE": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_CREATION": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_DIR_NAME": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_FILE_NAME": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_LAST_WRITE": "syscall",
- "syscall.FILE_NOTIFY_CHANGE_SIZE": "syscall",
- "syscall.FILE_SHARE_DELETE": "syscall",
- "syscall.FILE_SHARE_READ": "syscall",
- "syscall.FILE_SHARE_WRITE": "syscall",
- "syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS": "syscall",
- "syscall.FILE_SKIP_SET_EVENT_ON_HANDLE": "syscall",
- "syscall.FILE_TYPE_CHAR": "syscall",
- "syscall.FILE_TYPE_DISK": "syscall",
- "syscall.FILE_TYPE_PIPE": "syscall",
- "syscall.FILE_TYPE_REMOTE": "syscall",
- "syscall.FILE_TYPE_UNKNOWN": "syscall",
- "syscall.FILE_WRITE_ATTRIBUTES": "syscall",
- "syscall.FLUSHO": "syscall",
- "syscall.FORMAT_MESSAGE_ALLOCATE_BUFFER": "syscall",
- "syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY": "syscall",
- "syscall.FORMAT_MESSAGE_FROM_HMODULE": "syscall",
- "syscall.FORMAT_MESSAGE_FROM_STRING": "syscall",
- "syscall.FORMAT_MESSAGE_FROM_SYSTEM": "syscall",
- "syscall.FORMAT_MESSAGE_IGNORE_INSERTS": "syscall",
- "syscall.FORMAT_MESSAGE_MAX_WIDTH_MASK": "syscall",
- "syscall.FSCTL_GET_REPARSE_POINT": "syscall",
- "syscall.F_ADDFILESIGS": "syscall",
- "syscall.F_ADDSIGS": "syscall",
- "syscall.F_ALLOCATEALL": "syscall",
- "syscall.F_ALLOCATECONTIG": "syscall",
- "syscall.F_CANCEL": "syscall",
- "syscall.F_CHKCLEAN": "syscall",
- "syscall.F_CLOSEM": "syscall",
- "syscall.F_DUP2FD": "syscall",
- "syscall.F_DUP2FD_CLOEXEC": "syscall",
- "syscall.F_DUPFD": "syscall",
- "syscall.F_DUPFD_CLOEXEC": "syscall",
- "syscall.F_EXLCK": "syscall",
- "syscall.F_FLUSH_DATA": "syscall",
- "syscall.F_FREEZE_FS": "syscall",
- "syscall.F_FSCTL": "syscall",
- "syscall.F_FSDIRMASK": "syscall",
- "syscall.F_FSIN": "syscall",
- "syscall.F_FSINOUT": "syscall",
- "syscall.F_FSOUT": "syscall",
- "syscall.F_FSPRIV": "syscall",
- "syscall.F_FSVOID": "syscall",
- "syscall.F_FULLFSYNC": "syscall",
- "syscall.F_GETFD": "syscall",
- "syscall.F_GETFL": "syscall",
- "syscall.F_GETLEASE": "syscall",
- "syscall.F_GETLK": "syscall",
- "syscall.F_GETLK64": "syscall",
- "syscall.F_GETLKPID": "syscall",
- "syscall.F_GETNOSIGPIPE": "syscall",
- "syscall.F_GETOWN": "syscall",
- "syscall.F_GETOWN_EX": "syscall",
- "syscall.F_GETPATH": "syscall",
- "syscall.F_GETPATH_MTMINFO": "syscall",
- "syscall.F_GETPIPE_SZ": "syscall",
- "syscall.F_GETPROTECTIONCLASS": "syscall",
- "syscall.F_GETSIG": "syscall",
- "syscall.F_GLOBAL_NOCACHE": "syscall",
- "syscall.F_LOCK": "syscall",
- "syscall.F_LOG2PHYS": "syscall",
- "syscall.F_LOG2PHYS_EXT": "syscall",
- "syscall.F_MARKDEPENDENCY": "syscall",
- "syscall.F_MAXFD": "syscall",
- "syscall.F_NOCACHE": "syscall",
- "syscall.F_NODIRECT": "syscall",
- "syscall.F_NOTIFY": "syscall",
- "syscall.F_OGETLK": "syscall",
- "syscall.F_OK": "syscall",
- "syscall.F_OSETLK": "syscall",
- "syscall.F_OSETLKW": "syscall",
- "syscall.F_PARAM_MASK": "syscall",
- "syscall.F_PARAM_MAX": "syscall",
- "syscall.F_PATHPKG_CHECK": "syscall",
- "syscall.F_PEOFPOSMODE": "syscall",
- "syscall.F_PREALLOCATE": "syscall",
- "syscall.F_RDADVISE": "syscall",
- "syscall.F_RDAHEAD": "syscall",
- "syscall.F_RDLCK": "syscall",
- "syscall.F_READAHEAD": "syscall",
- "syscall.F_READBOOTSTRAP": "syscall",
- "syscall.F_SETBACKINGSTORE": "syscall",
- "syscall.F_SETFD": "syscall",
- "syscall.F_SETFL": "syscall",
- "syscall.F_SETLEASE": "syscall",
- "syscall.F_SETLK": "syscall",
- "syscall.F_SETLK64": "syscall",
- "syscall.F_SETLKW": "syscall",
- "syscall.F_SETLKW64": "syscall",
- "syscall.F_SETLK_REMOTE": "syscall",
- "syscall.F_SETNOSIGPIPE": "syscall",
- "syscall.F_SETOWN": "syscall",
- "syscall.F_SETOWN_EX": "syscall",
- "syscall.F_SETPIPE_SZ": "syscall",
- "syscall.F_SETPROTECTIONCLASS": "syscall",
- "syscall.F_SETSIG": "syscall",
- "syscall.F_SETSIZE": "syscall",
- "syscall.F_SHLCK": "syscall",
- "syscall.F_TEST": "syscall",
- "syscall.F_THAW_FS": "syscall",
- "syscall.F_TLOCK": "syscall",
- "syscall.F_ULOCK": "syscall",
- "syscall.F_UNLCK": "syscall",
- "syscall.F_UNLCKSYS": "syscall",
- "syscall.F_VOLPOSMODE": "syscall",
- "syscall.F_WRITEBOOTSTRAP": "syscall",
- "syscall.F_WRLCK": "syscall",
- "syscall.Faccessat": "syscall",
- "syscall.Fallocate": "syscall",
- "syscall.Fbootstraptransfer_t": "syscall",
- "syscall.Fchdir": "syscall",
- "syscall.Fchflags": "syscall",
- "syscall.Fchmod": "syscall",
- "syscall.Fchmodat": "syscall",
- "syscall.Fchown": "syscall",
- "syscall.Fchownat": "syscall",
- "syscall.FcntlFlock": "syscall",
- "syscall.FdSet": "syscall",
- "syscall.Fdatasync": "syscall",
- "syscall.FileNotifyInformation": "syscall",
- "syscall.Filetime": "syscall",
- "syscall.FindClose": "syscall",
- "syscall.FindFirstFile": "syscall",
- "syscall.FindNextFile": "syscall",
- "syscall.Flock": "syscall",
- "syscall.Flock_t": "syscall",
- "syscall.FlushBpf": "syscall",
- "syscall.FlushFileBuffers": "syscall",
- "syscall.FlushViewOfFile": "syscall",
- "syscall.ForkExec": "syscall",
- "syscall.ForkLock": "syscall",
- "syscall.FormatMessage": "syscall",
- "syscall.Fpathconf": "syscall",
- "syscall.FreeAddrInfoW": "syscall",
- "syscall.FreeEnvironmentStrings": "syscall",
- "syscall.FreeLibrary": "syscall",
- "syscall.Fsid": "syscall",
- "syscall.Fstat": "syscall",
- "syscall.Fstatfs": "syscall",
- "syscall.Fstore_t": "syscall",
- "syscall.Fsync": "syscall",
- "syscall.Ftruncate": "syscall",
- "syscall.FullPath": "syscall",
- "syscall.Futimes": "syscall",
- "syscall.Futimesat": "syscall",
- "syscall.GENERIC_ALL": "syscall",
- "syscall.GENERIC_EXECUTE": "syscall",
- "syscall.GENERIC_READ": "syscall",
- "syscall.GENERIC_WRITE": "syscall",
- "syscall.GUID": "syscall",
- "syscall.GetAcceptExSockaddrs": "syscall",
- "syscall.GetAdaptersInfo": "syscall",
- "syscall.GetAddrInfoW": "syscall",
- "syscall.GetCommandLine": "syscall",
- "syscall.GetComputerName": "syscall",
- "syscall.GetConsoleMode": "syscall",
- "syscall.GetCurrentDirectory": "syscall",
- "syscall.GetCurrentProcess": "syscall",
- "syscall.GetEnvironmentStrings": "syscall",
- "syscall.GetEnvironmentVariable": "syscall",
- "syscall.GetExitCodeProcess": "syscall",
- "syscall.GetFileAttributes": "syscall",
- "syscall.GetFileAttributesEx": "syscall",
- "syscall.GetFileExInfoStandard": "syscall",
- "syscall.GetFileExMaxInfoLevel": "syscall",
- "syscall.GetFileInformationByHandle": "syscall",
- "syscall.GetFileType": "syscall",
- "syscall.GetFullPathName": "syscall",
- "syscall.GetHostByName": "syscall",
- "syscall.GetIfEntry": "syscall",
- "syscall.GetLastError": "syscall",
- "syscall.GetLengthSid": "syscall",
- "syscall.GetLongPathName": "syscall",
- "syscall.GetProcAddress": "syscall",
- "syscall.GetProcessTimes": "syscall",
- "syscall.GetProtoByName": "syscall",
- "syscall.GetQueuedCompletionStatus": "syscall",
- "syscall.GetServByName": "syscall",
- "syscall.GetShortPathName": "syscall",
- "syscall.GetStartupInfo": "syscall",
- "syscall.GetStdHandle": "syscall",
- "syscall.GetSystemTimeAsFileTime": "syscall",
- "syscall.GetTempPath": "syscall",
- "syscall.GetTimeZoneInformation": "syscall",
- "syscall.GetTokenInformation": "syscall",
- "syscall.GetUserNameEx": "syscall",
- "syscall.GetUserProfileDirectory": "syscall",
- "syscall.GetVersion": "syscall",
- "syscall.Getcwd": "syscall",
- "syscall.Getdents": "syscall",
- "syscall.Getdirentries": "syscall",
- "syscall.Getdtablesize": "syscall",
- "syscall.Getegid": "syscall",
- "syscall.Getenv": "syscall",
- "syscall.Geteuid": "syscall",
- "syscall.Getfsstat": "syscall",
- "syscall.Getgid": "syscall",
- "syscall.Getgroups": "syscall",
- "syscall.Getpagesize": "syscall",
- "syscall.Getpeername": "syscall",
- "syscall.Getpgid": "syscall",
- "syscall.Getpgrp": "syscall",
- "syscall.Getpid": "syscall",
- "syscall.Getppid": "syscall",
- "syscall.Getpriority": "syscall",
- "syscall.Getrlimit": "syscall",
- "syscall.Getrusage": "syscall",
- "syscall.Getsid": "syscall",
- "syscall.Getsockname": "syscall",
- "syscall.Getsockopt": "syscall",
- "syscall.GetsockoptByte": "syscall",
- "syscall.GetsockoptICMPv6Filter": "syscall",
- "syscall.GetsockoptIPMreq": "syscall",
- "syscall.GetsockoptIPMreqn": "syscall",
- "syscall.GetsockoptIPv6MTUInfo": "syscall",
- "syscall.GetsockoptIPv6Mreq": "syscall",
- "syscall.GetsockoptInet4Addr": "syscall",
- "syscall.GetsockoptInt": "syscall",
- "syscall.GetsockoptUcred": "syscall",
- "syscall.Gettid": "syscall",
- "syscall.Gettimeofday": "syscall",
- "syscall.Getuid": "syscall",
- "syscall.Getwd": "syscall",
- "syscall.Getxattr": "syscall",
- "syscall.HANDLE_FLAG_INHERIT": "syscall",
- "syscall.HKEY_CLASSES_ROOT": "syscall",
- "syscall.HKEY_CURRENT_CONFIG": "syscall",
- "syscall.HKEY_CURRENT_USER": "syscall",
- "syscall.HKEY_DYN_DATA": "syscall",
- "syscall.HKEY_LOCAL_MACHINE": "syscall",
- "syscall.HKEY_PERFORMANCE_DATA": "syscall",
- "syscall.HKEY_USERS": "syscall",
- "syscall.HUPCL": "syscall",
- "syscall.Handle": "syscall",
- "syscall.Hostent": "syscall",
- "syscall.ICANON": "syscall",
- "syscall.ICMP6_FILTER": "syscall",
- "syscall.ICMPV6_FILTER": "syscall",
- "syscall.ICMPv6Filter": "syscall",
- "syscall.ICRNL": "syscall",
- "syscall.IEXTEN": "syscall",
- "syscall.IFAN_ARRIVAL": "syscall",
- "syscall.IFAN_DEPARTURE": "syscall",
- "syscall.IFA_ADDRESS": "syscall",
- "syscall.IFA_ANYCAST": "syscall",
- "syscall.IFA_BROADCAST": "syscall",
- "syscall.IFA_CACHEINFO": "syscall",
- "syscall.IFA_F_DADFAILED": "syscall",
- "syscall.IFA_F_DEPRECATED": "syscall",
- "syscall.IFA_F_HOMEADDRESS": "syscall",
- "syscall.IFA_F_NODAD": "syscall",
- "syscall.IFA_F_OPTIMISTIC": "syscall",
- "syscall.IFA_F_PERMANENT": "syscall",
- "syscall.IFA_F_SECONDARY": "syscall",
- "syscall.IFA_F_TEMPORARY": "syscall",
- "syscall.IFA_F_TENTATIVE": "syscall",
- "syscall.IFA_LABEL": "syscall",
- "syscall.IFA_LOCAL": "syscall",
- "syscall.IFA_MAX": "syscall",
- "syscall.IFA_MULTICAST": "syscall",
- "syscall.IFA_ROUTE": "syscall",
- "syscall.IFA_UNSPEC": "syscall",
- "syscall.IFF_ALLMULTI": "syscall",
- "syscall.IFF_ALTPHYS": "syscall",
- "syscall.IFF_AUTOMEDIA": "syscall",
- "syscall.IFF_BROADCAST": "syscall",
- "syscall.IFF_CANTCHANGE": "syscall",
- "syscall.IFF_CANTCONFIG": "syscall",
- "syscall.IFF_DEBUG": "syscall",
- "syscall.IFF_DRV_OACTIVE": "syscall",
- "syscall.IFF_DRV_RUNNING": "syscall",
- "syscall.IFF_DYING": "syscall",
- "syscall.IFF_DYNAMIC": "syscall",
- "syscall.IFF_LINK0": "syscall",
- "syscall.IFF_LINK1": "syscall",
- "syscall.IFF_LINK2": "syscall",
- "syscall.IFF_LOOPBACK": "syscall",
- "syscall.IFF_MASTER": "syscall",
- "syscall.IFF_MONITOR": "syscall",
- "syscall.IFF_MULTICAST": "syscall",
- "syscall.IFF_NOARP": "syscall",
- "syscall.IFF_NOTRAILERS": "syscall",
- "syscall.IFF_NO_PI": "syscall",
- "syscall.IFF_OACTIVE": "syscall",
- "syscall.IFF_ONE_QUEUE": "syscall",
- "syscall.IFF_POINTOPOINT": "syscall",
- "syscall.IFF_POINTTOPOINT": "syscall",
- "syscall.IFF_PORTSEL": "syscall",
- "syscall.IFF_PPROMISC": "syscall",
- "syscall.IFF_PROMISC": "syscall",
- "syscall.IFF_RENAMING": "syscall",
- "syscall.IFF_RUNNING": "syscall",
- "syscall.IFF_SIMPLEX": "syscall",
- "syscall.IFF_SLAVE": "syscall",
- "syscall.IFF_SMART": "syscall",
- "syscall.IFF_STATICARP": "syscall",
- "syscall.IFF_TAP": "syscall",
- "syscall.IFF_TUN": "syscall",
- "syscall.IFF_TUN_EXCL": "syscall",
- "syscall.IFF_UP": "syscall",
- "syscall.IFF_VNET_HDR": "syscall",
- "syscall.IFLA_ADDRESS": "syscall",
- "syscall.IFLA_BROADCAST": "syscall",
- "syscall.IFLA_COST": "syscall",
- "syscall.IFLA_IFALIAS": "syscall",
- "syscall.IFLA_IFNAME": "syscall",
- "syscall.IFLA_LINK": "syscall",
- "syscall.IFLA_LINKINFO": "syscall",
- "syscall.IFLA_LINKMODE": "syscall",
- "syscall.IFLA_MAP": "syscall",
- "syscall.IFLA_MASTER": "syscall",
- "syscall.IFLA_MAX": "syscall",
- "syscall.IFLA_MTU": "syscall",
- "syscall.IFLA_NET_NS_PID": "syscall",
- "syscall.IFLA_OPERSTATE": "syscall",
- "syscall.IFLA_PRIORITY": "syscall",
- "syscall.IFLA_PROTINFO": "syscall",
- "syscall.IFLA_QDISC": "syscall",
- "syscall.IFLA_STATS": "syscall",
- "syscall.IFLA_TXQLEN": "syscall",
- "syscall.IFLA_UNSPEC": "syscall",
- "syscall.IFLA_WEIGHT": "syscall",
- "syscall.IFLA_WIRELESS": "syscall",
- "syscall.IFNAMSIZ": "syscall",
- "syscall.IFT_1822": "syscall",
- "syscall.IFT_A12MPPSWITCH": "syscall",
- "syscall.IFT_AAL2": "syscall",
- "syscall.IFT_AAL5": "syscall",
- "syscall.IFT_ADSL": "syscall",
- "syscall.IFT_AFLANE8023": "syscall",
- "syscall.IFT_AFLANE8025": "syscall",
- "syscall.IFT_ARAP": "syscall",
- "syscall.IFT_ARCNET": "syscall",
- "syscall.IFT_ARCNETPLUS": "syscall",
- "syscall.IFT_ASYNC": "syscall",
- "syscall.IFT_ATM": "syscall",
- "syscall.IFT_ATMDXI": "syscall",
- "syscall.IFT_ATMFUNI": "syscall",
- "syscall.IFT_ATMIMA": "syscall",
- "syscall.IFT_ATMLOGICAL": "syscall",
- "syscall.IFT_ATMRADIO": "syscall",
- "syscall.IFT_ATMSUBINTERFACE": "syscall",
- "syscall.IFT_ATMVCIENDPT": "syscall",
- "syscall.IFT_ATMVIRTUAL": "syscall",
- "syscall.IFT_BGPPOLICYACCOUNTING": "syscall",
- "syscall.IFT_BLUETOOTH": "syscall",
- "syscall.IFT_BRIDGE": "syscall",
- "syscall.IFT_BSC": "syscall",
- "syscall.IFT_CARP": "syscall",
- "syscall.IFT_CCTEMUL": "syscall",
- "syscall.IFT_CELLULAR": "syscall",
- "syscall.IFT_CEPT": "syscall",
- "syscall.IFT_CES": "syscall",
- "syscall.IFT_CHANNEL": "syscall",
- "syscall.IFT_CNR": "syscall",
- "syscall.IFT_COFFEE": "syscall",
- "syscall.IFT_COMPOSITELINK": "syscall",
- "syscall.IFT_DCN": "syscall",
- "syscall.IFT_DIGITALPOWERLINE": "syscall",
- "syscall.IFT_DIGITALWRAPPEROVERHEADCHANNEL": "syscall",
- "syscall.IFT_DLSW": "syscall",
- "syscall.IFT_DOCSCABLEDOWNSTREAM": "syscall",
- "syscall.IFT_DOCSCABLEMACLAYER": "syscall",
- "syscall.IFT_DOCSCABLEUPSTREAM": "syscall",
- "syscall.IFT_DOCSCABLEUPSTREAMCHANNEL": "syscall",
- "syscall.IFT_DS0": "syscall",
- "syscall.IFT_DS0BUNDLE": "syscall",
- "syscall.IFT_DS1FDL": "syscall",
- "syscall.IFT_DS3": "syscall",
- "syscall.IFT_DTM": "syscall",
- "syscall.IFT_DUMMY": "syscall",
- "syscall.IFT_DVBASILN": "syscall",
- "syscall.IFT_DVBASIOUT": "syscall",
- "syscall.IFT_DVBRCCDOWNSTREAM": "syscall",
- "syscall.IFT_DVBRCCMACLAYER": "syscall",
- "syscall.IFT_DVBRCCUPSTREAM": "syscall",
- "syscall.IFT_ECONET": "syscall",
- "syscall.IFT_ENC": "syscall",
- "syscall.IFT_EON": "syscall",
- "syscall.IFT_EPLRS": "syscall",
- "syscall.IFT_ESCON": "syscall",
- "syscall.IFT_ETHER": "syscall",
- "syscall.IFT_FAITH": "syscall",
- "syscall.IFT_FAST": "syscall",
- "syscall.IFT_FASTETHER": "syscall",
- "syscall.IFT_FASTETHERFX": "syscall",
- "syscall.IFT_FDDI": "syscall",
- "syscall.IFT_FIBRECHANNEL": "syscall",
- "syscall.IFT_FRAMERELAYINTERCONNECT": "syscall",
- "syscall.IFT_FRAMERELAYMPI": "syscall",
- "syscall.IFT_FRDLCIENDPT": "syscall",
- "syscall.IFT_FRELAY": "syscall",
- "syscall.IFT_FRELAYDCE": "syscall",
- "syscall.IFT_FRF16MFRBUNDLE": "syscall",
- "syscall.IFT_FRFORWARD": "syscall",
- "syscall.IFT_G703AT2MB": "syscall",
- "syscall.IFT_G703AT64K": "syscall",
- "syscall.IFT_GIF": "syscall",
- "syscall.IFT_GIGABITETHERNET": "syscall",
- "syscall.IFT_GR303IDT": "syscall",
- "syscall.IFT_GR303RDT": "syscall",
- "syscall.IFT_H323GATEKEEPER": "syscall",
- "syscall.IFT_H323PROXY": "syscall",
- "syscall.IFT_HDH1822": "syscall",
- "syscall.IFT_HDLC": "syscall",
- "syscall.IFT_HDSL2": "syscall",
- "syscall.IFT_HIPERLAN2": "syscall",
- "syscall.IFT_HIPPI": "syscall",
- "syscall.IFT_HIPPIINTERFACE": "syscall",
- "syscall.IFT_HOSTPAD": "syscall",
- "syscall.IFT_HSSI": "syscall",
- "syscall.IFT_HY": "syscall",
- "syscall.IFT_IBM370PARCHAN": "syscall",
- "syscall.IFT_IDSL": "syscall",
- "syscall.IFT_IEEE1394": "syscall",
- "syscall.IFT_IEEE80211": "syscall",
- "syscall.IFT_IEEE80212": "syscall",
- "syscall.IFT_IEEE8023ADLAG": "syscall",
- "syscall.IFT_IFGSN": "syscall",
- "syscall.IFT_IMT": "syscall",
- "syscall.IFT_INFINIBAND": "syscall",
- "syscall.IFT_INTERLEAVE": "syscall",
- "syscall.IFT_IP": "syscall",
- "syscall.IFT_IPFORWARD": "syscall",
- "syscall.IFT_IPOVERATM": "syscall",
- "syscall.IFT_IPOVERCDLC": "syscall",
- "syscall.IFT_IPOVERCLAW": "syscall",
- "syscall.IFT_IPSWITCH": "syscall",
- "syscall.IFT_IPXIP": "syscall",
- "syscall.IFT_ISDN": "syscall",
- "syscall.IFT_ISDNBASIC": "syscall",
- "syscall.IFT_ISDNPRIMARY": "syscall",
- "syscall.IFT_ISDNS": "syscall",
- "syscall.IFT_ISDNU": "syscall",
- "syscall.IFT_ISO88022LLC": "syscall",
- "syscall.IFT_ISO88023": "syscall",
- "syscall.IFT_ISO88024": "syscall",
- "syscall.IFT_ISO88025": "syscall",
- "syscall.IFT_ISO88025CRFPINT": "syscall",
- "syscall.IFT_ISO88025DTR": "syscall",
- "syscall.IFT_ISO88025FIBER": "syscall",
- "syscall.IFT_ISO88026": "syscall",
- "syscall.IFT_ISUP": "syscall",
- "syscall.IFT_L2VLAN": "syscall",
- "syscall.IFT_L3IPVLAN": "syscall",
- "syscall.IFT_L3IPXVLAN": "syscall",
- "syscall.IFT_LAPB": "syscall",
- "syscall.IFT_LAPD": "syscall",
- "syscall.IFT_LAPF": "syscall",
- "syscall.IFT_LINEGROUP": "syscall",
- "syscall.IFT_LOCALTALK": "syscall",
- "syscall.IFT_LOOP": "syscall",
- "syscall.IFT_MEDIAMAILOVERIP": "syscall",
- "syscall.IFT_MFSIGLINK": "syscall",
- "syscall.IFT_MIOX25": "syscall",
- "syscall.IFT_MODEM": "syscall",
- "syscall.IFT_MPC": "syscall",
- "syscall.IFT_MPLS": "syscall",
- "syscall.IFT_MPLSTUNNEL": "syscall",
- "syscall.IFT_MSDSL": "syscall",
- "syscall.IFT_MVL": "syscall",
- "syscall.IFT_MYRINET": "syscall",
- "syscall.IFT_NFAS": "syscall",
- "syscall.IFT_NSIP": "syscall",
- "syscall.IFT_OPTICALCHANNEL": "syscall",
- "syscall.IFT_OPTICALTRANSPORT": "syscall",
- "syscall.IFT_OTHER": "syscall",
- "syscall.IFT_P10": "syscall",
- "syscall.IFT_P80": "syscall",
- "syscall.IFT_PARA": "syscall",
- "syscall.IFT_PDP": "syscall",
- "syscall.IFT_PFLOG": "syscall",
- "syscall.IFT_PFLOW": "syscall",
- "syscall.IFT_PFSYNC": "syscall",
- "syscall.IFT_PLC": "syscall",
- "syscall.IFT_PON155": "syscall",
- "syscall.IFT_PON622": "syscall",
- "syscall.IFT_POS": "syscall",
- "syscall.IFT_PPP": "syscall",
- "syscall.IFT_PPPMULTILINKBUNDLE": "syscall",
- "syscall.IFT_PROPATM": "syscall",
- "syscall.IFT_PROPBWAP2MP": "syscall",
- "syscall.IFT_PROPCNLS": "syscall",
- "syscall.IFT_PROPDOCSWIRELESSDOWNSTREAM": "syscall",
- "syscall.IFT_PROPDOCSWIRELESSMACLAYER": "syscall",
- "syscall.IFT_PROPDOCSWIRELESSUPSTREAM": "syscall",
- "syscall.IFT_PROPMUX": "syscall",
- "syscall.IFT_PROPVIRTUAL": "syscall",
- "syscall.IFT_PROPWIRELESSP2P": "syscall",
- "syscall.IFT_PTPSERIAL": "syscall",
- "syscall.IFT_PVC": "syscall",
- "syscall.IFT_Q2931": "syscall",
- "syscall.IFT_QLLC": "syscall",
- "syscall.IFT_RADIOMAC": "syscall",
- "syscall.IFT_RADSL": "syscall",
- "syscall.IFT_REACHDSL": "syscall",
- "syscall.IFT_RFC1483": "syscall",
- "syscall.IFT_RS232": "syscall",
- "syscall.IFT_RSRB": "syscall",
- "syscall.IFT_SDLC": "syscall",
- "syscall.IFT_SDSL": "syscall",
- "syscall.IFT_SHDSL": "syscall",
- "syscall.IFT_SIP": "syscall",
- "syscall.IFT_SIPSIG": "syscall",
- "syscall.IFT_SIPTG": "syscall",
- "syscall.IFT_SLIP": "syscall",
- "syscall.IFT_SMDSDXI": "syscall",
- "syscall.IFT_SMDSICIP": "syscall",
- "syscall.IFT_SONET": "syscall",
- "syscall.IFT_SONETOVERHEADCHANNEL": "syscall",
- "syscall.IFT_SONETPATH": "syscall",
- "syscall.IFT_SONETVT": "syscall",
- "syscall.IFT_SRP": "syscall",
- "syscall.IFT_SS7SIGLINK": "syscall",
- "syscall.IFT_STACKTOSTACK": "syscall",
- "syscall.IFT_STARLAN": "syscall",
- "syscall.IFT_STF": "syscall",
- "syscall.IFT_T1": "syscall",
- "syscall.IFT_TDLC": "syscall",
- "syscall.IFT_TELINK": "syscall",
- "syscall.IFT_TERMPAD": "syscall",
- "syscall.IFT_TR008": "syscall",
- "syscall.IFT_TRANSPHDLC": "syscall",
- "syscall.IFT_TUNNEL": "syscall",
- "syscall.IFT_ULTRA": "syscall",
- "syscall.IFT_USB": "syscall",
- "syscall.IFT_V11": "syscall",
- "syscall.IFT_V35": "syscall",
- "syscall.IFT_V36": "syscall",
- "syscall.IFT_V37": "syscall",
- "syscall.IFT_VDSL": "syscall",
- "syscall.IFT_VIRTUALIPADDRESS": "syscall",
- "syscall.IFT_VIRTUALTG": "syscall",
- "syscall.IFT_VOICEDID": "syscall",
- "syscall.IFT_VOICEEM": "syscall",
- "syscall.IFT_VOICEEMFGD": "syscall",
- "syscall.IFT_VOICEENCAP": "syscall",
- "syscall.IFT_VOICEFGDEANA": "syscall",
- "syscall.IFT_VOICEFXO": "syscall",
- "syscall.IFT_VOICEFXS": "syscall",
- "syscall.IFT_VOICEOVERATM": "syscall",
- "syscall.IFT_VOICEOVERCABLE": "syscall",
- "syscall.IFT_VOICEOVERFRAMERELAY": "syscall",
- "syscall.IFT_VOICEOVERIP": "syscall",
- "syscall.IFT_X213": "syscall",
- "syscall.IFT_X25": "syscall",
- "syscall.IFT_X25DDN": "syscall",
- "syscall.IFT_X25HUNTGROUP": "syscall",
- "syscall.IFT_X25MLP": "syscall",
- "syscall.IFT_X25PLE": "syscall",
- "syscall.IFT_XETHER": "syscall",
- "syscall.IGNBRK": "syscall",
- "syscall.IGNCR": "syscall",
- "syscall.IGNORE": "syscall",
- "syscall.IGNPAR": "syscall",
- "syscall.IMAXBEL": "syscall",
- "syscall.INFINITE": "syscall",
- "syscall.INLCR": "syscall",
- "syscall.INPCK": "syscall",
- "syscall.INVALID_FILE_ATTRIBUTES": "syscall",
- "syscall.IN_ACCESS": "syscall",
- "syscall.IN_ALL_EVENTS": "syscall",
- "syscall.IN_ATTRIB": "syscall",
- "syscall.IN_CLASSA_HOST": "syscall",
- "syscall.IN_CLASSA_MAX": "syscall",
- "syscall.IN_CLASSA_NET": "syscall",
- "syscall.IN_CLASSA_NSHIFT": "syscall",
- "syscall.IN_CLASSB_HOST": "syscall",
- "syscall.IN_CLASSB_MAX": "syscall",
- "syscall.IN_CLASSB_NET": "syscall",
- "syscall.IN_CLASSB_NSHIFT": "syscall",
- "syscall.IN_CLASSC_HOST": "syscall",
- "syscall.IN_CLASSC_NET": "syscall",
- "syscall.IN_CLASSC_NSHIFT": "syscall",
- "syscall.IN_CLASSD_HOST": "syscall",
- "syscall.IN_CLASSD_NET": "syscall",
- "syscall.IN_CLASSD_NSHIFT": "syscall",
- "syscall.IN_CLOEXEC": "syscall",
- "syscall.IN_CLOSE": "syscall",
- "syscall.IN_CLOSE_NOWRITE": "syscall",
- "syscall.IN_CLOSE_WRITE": "syscall",
- "syscall.IN_CREATE": "syscall",
- "syscall.IN_DELETE": "syscall",
- "syscall.IN_DELETE_SELF": "syscall",
- "syscall.IN_DONT_FOLLOW": "syscall",
- "syscall.IN_EXCL_UNLINK": "syscall",
- "syscall.IN_IGNORED": "syscall",
- "syscall.IN_ISDIR": "syscall",
- "syscall.IN_LINKLOCALNETNUM": "syscall",
- "syscall.IN_LOOPBACKNET": "syscall",
- "syscall.IN_MASK_ADD": "syscall",
- "syscall.IN_MODIFY": "syscall",
- "syscall.IN_MOVE": "syscall",
- "syscall.IN_MOVED_FROM": "syscall",
- "syscall.IN_MOVED_TO": "syscall",
- "syscall.IN_MOVE_SELF": "syscall",
- "syscall.IN_NONBLOCK": "syscall",
- "syscall.IN_ONESHOT": "syscall",
- "syscall.IN_ONLYDIR": "syscall",
- "syscall.IN_OPEN": "syscall",
- "syscall.IN_Q_OVERFLOW": "syscall",
- "syscall.IN_RFC3021_HOST": "syscall",
- "syscall.IN_RFC3021_MASK": "syscall",
- "syscall.IN_RFC3021_NET": "syscall",
- "syscall.IN_RFC3021_NSHIFT": "syscall",
- "syscall.IN_UNMOUNT": "syscall",
- "syscall.IOC_IN": "syscall",
- "syscall.IOC_INOUT": "syscall",
- "syscall.IOC_OUT": "syscall",
- "syscall.IOC_VENDOR": "syscall",
- "syscall.IOC_WS2": "syscall",
- "syscall.IO_REPARSE_TAG_SYMLINK": "syscall",
- "syscall.IPMreq": "syscall",
- "syscall.IPMreqn": "syscall",
- "syscall.IPPROTO_3PC": "syscall",
- "syscall.IPPROTO_ADFS": "syscall",
- "syscall.IPPROTO_AH": "syscall",
- "syscall.IPPROTO_AHIP": "syscall",
- "syscall.IPPROTO_APES": "syscall",
- "syscall.IPPROTO_ARGUS": "syscall",
- "syscall.IPPROTO_AX25": "syscall",
- "syscall.IPPROTO_BHA": "syscall",
- "syscall.IPPROTO_BLT": "syscall",
- "syscall.IPPROTO_BRSATMON": "syscall",
- "syscall.IPPROTO_CARP": "syscall",
- "syscall.IPPROTO_CFTP": "syscall",
- "syscall.IPPROTO_CHAOS": "syscall",
- "syscall.IPPROTO_CMTP": "syscall",
- "syscall.IPPROTO_COMP": "syscall",
- "syscall.IPPROTO_CPHB": "syscall",
- "syscall.IPPROTO_CPNX": "syscall",
- "syscall.IPPROTO_DCCP": "syscall",
- "syscall.IPPROTO_DDP": "syscall",
- "syscall.IPPROTO_DGP": "syscall",
- "syscall.IPPROTO_DIVERT": "syscall",
- "syscall.IPPROTO_DIVERT_INIT": "syscall",
- "syscall.IPPROTO_DIVERT_RESP": "syscall",
- "syscall.IPPROTO_DONE": "syscall",
- "syscall.IPPROTO_DSTOPTS": "syscall",
- "syscall.IPPROTO_EGP": "syscall",
- "syscall.IPPROTO_EMCON": "syscall",
- "syscall.IPPROTO_ENCAP": "syscall",
- "syscall.IPPROTO_EON": "syscall",
- "syscall.IPPROTO_ESP": "syscall",
- "syscall.IPPROTO_ETHERIP": "syscall",
- "syscall.IPPROTO_FRAGMENT": "syscall",
- "syscall.IPPROTO_GGP": "syscall",
- "syscall.IPPROTO_GMTP": "syscall",
- "syscall.IPPROTO_GRE": "syscall",
- "syscall.IPPROTO_HELLO": "syscall",
- "syscall.IPPROTO_HMP": "syscall",
- "syscall.IPPROTO_HOPOPTS": "syscall",
- "syscall.IPPROTO_ICMP": "syscall",
- "syscall.IPPROTO_ICMPV6": "syscall",
- "syscall.IPPROTO_IDP": "syscall",
- "syscall.IPPROTO_IDPR": "syscall",
- "syscall.IPPROTO_IDRP": "syscall",
- "syscall.IPPROTO_IGMP": "syscall",
- "syscall.IPPROTO_IGP": "syscall",
- "syscall.IPPROTO_IGRP": "syscall",
- "syscall.IPPROTO_IL": "syscall",
- "syscall.IPPROTO_INLSP": "syscall",
- "syscall.IPPROTO_INP": "syscall",
- "syscall.IPPROTO_IP": "syscall",
- "syscall.IPPROTO_IPCOMP": "syscall",
- "syscall.IPPROTO_IPCV": "syscall",
- "syscall.IPPROTO_IPEIP": "syscall",
- "syscall.IPPROTO_IPIP": "syscall",
- "syscall.IPPROTO_IPPC": "syscall",
- "syscall.IPPROTO_IPV4": "syscall",
- "syscall.IPPROTO_IPV6": "syscall",
- "syscall.IPPROTO_IPV6_ICMP": "syscall",
- "syscall.IPPROTO_IRTP": "syscall",
- "syscall.IPPROTO_KRYPTOLAN": "syscall",
- "syscall.IPPROTO_LARP": "syscall",
- "syscall.IPPROTO_LEAF1": "syscall",
- "syscall.IPPROTO_LEAF2": "syscall",
- "syscall.IPPROTO_MAX": "syscall",
- "syscall.IPPROTO_MAXID": "syscall",
- "syscall.IPPROTO_MEAS": "syscall",
- "syscall.IPPROTO_MH": "syscall",
- "syscall.IPPROTO_MHRP": "syscall",
- "syscall.IPPROTO_MICP": "syscall",
- "syscall.IPPROTO_MOBILE": "syscall",
- "syscall.IPPROTO_MPLS": "syscall",
- "syscall.IPPROTO_MTP": "syscall",
- "syscall.IPPROTO_MUX": "syscall",
- "syscall.IPPROTO_ND": "syscall",
- "syscall.IPPROTO_NHRP": "syscall",
- "syscall.IPPROTO_NONE": "syscall",
- "syscall.IPPROTO_NSP": "syscall",
- "syscall.IPPROTO_NVPII": "syscall",
- "syscall.IPPROTO_OLD_DIVERT": "syscall",
- "syscall.IPPROTO_OSPFIGP": "syscall",
- "syscall.IPPROTO_PFSYNC": "syscall",
- "syscall.IPPROTO_PGM": "syscall",
- "syscall.IPPROTO_PIGP": "syscall",
- "syscall.IPPROTO_PIM": "syscall",
- "syscall.IPPROTO_PRM": "syscall",
- "syscall.IPPROTO_PUP": "syscall",
- "syscall.IPPROTO_PVP": "syscall",
- "syscall.IPPROTO_RAW": "syscall",
- "syscall.IPPROTO_RCCMON": "syscall",
- "syscall.IPPROTO_RDP": "syscall",
- "syscall.IPPROTO_ROUTING": "syscall",
- "syscall.IPPROTO_RSVP": "syscall",
- "syscall.IPPROTO_RVD": "syscall",
- "syscall.IPPROTO_SATEXPAK": "syscall",
- "syscall.IPPROTO_SATMON": "syscall",
- "syscall.IPPROTO_SCCSP": "syscall",
- "syscall.IPPROTO_SCTP": "syscall",
- "syscall.IPPROTO_SDRP": "syscall",
- "syscall.IPPROTO_SEND": "syscall",
- "syscall.IPPROTO_SEP": "syscall",
- "syscall.IPPROTO_SKIP": "syscall",
- "syscall.IPPROTO_SPACER": "syscall",
- "syscall.IPPROTO_SRPC": "syscall",
- "syscall.IPPROTO_ST": "syscall",
- "syscall.IPPROTO_SVMTP": "syscall",
- "syscall.IPPROTO_SWIPE": "syscall",
- "syscall.IPPROTO_TCF": "syscall",
- "syscall.IPPROTO_TCP": "syscall",
- "syscall.IPPROTO_TLSP": "syscall",
- "syscall.IPPROTO_TP": "syscall",
- "syscall.IPPROTO_TPXX": "syscall",
- "syscall.IPPROTO_TRUNK1": "syscall",
- "syscall.IPPROTO_TRUNK2": "syscall",
- "syscall.IPPROTO_TTP": "syscall",
- "syscall.IPPROTO_UDP": "syscall",
- "syscall.IPPROTO_UDPLITE": "syscall",
- "syscall.IPPROTO_VINES": "syscall",
- "syscall.IPPROTO_VISA": "syscall",
- "syscall.IPPROTO_VMTP": "syscall",
- "syscall.IPPROTO_VRRP": "syscall",
- "syscall.IPPROTO_WBEXPAK": "syscall",
- "syscall.IPPROTO_WBMON": "syscall",
- "syscall.IPPROTO_WSN": "syscall",
- "syscall.IPPROTO_XNET": "syscall",
- "syscall.IPPROTO_XTP": "syscall",
- "syscall.IPV6_2292DSTOPTS": "syscall",
- "syscall.IPV6_2292HOPLIMIT": "syscall",
- "syscall.IPV6_2292HOPOPTS": "syscall",
- "syscall.IPV6_2292NEXTHOP": "syscall",
- "syscall.IPV6_2292PKTINFO": "syscall",
- "syscall.IPV6_2292PKTOPTIONS": "syscall",
- "syscall.IPV6_2292RTHDR": "syscall",
- "syscall.IPV6_ADDRFORM": "syscall",
- "syscall.IPV6_ADD_MEMBERSHIP": "syscall",
- "syscall.IPV6_AUTHHDR": "syscall",
- "syscall.IPV6_AUTH_LEVEL": "syscall",
- "syscall.IPV6_AUTOFLOWLABEL": "syscall",
- "syscall.IPV6_BINDANY": "syscall",
- "syscall.IPV6_BINDV6ONLY": "syscall",
- "syscall.IPV6_BOUND_IF": "syscall",
- "syscall.IPV6_CHECKSUM": "syscall",
- "syscall.IPV6_DEFAULT_MULTICAST_HOPS": "syscall",
- "syscall.IPV6_DEFAULT_MULTICAST_LOOP": "syscall",
- "syscall.IPV6_DEFHLIM": "syscall",
- "syscall.IPV6_DONTFRAG": "syscall",
- "syscall.IPV6_DROP_MEMBERSHIP": "syscall",
- "syscall.IPV6_DSTOPTS": "syscall",
- "syscall.IPV6_ESP_NETWORK_LEVEL": "syscall",
- "syscall.IPV6_ESP_TRANS_LEVEL": "syscall",
- "syscall.IPV6_FAITH": "syscall",
- "syscall.IPV6_FLOWINFO_MASK": "syscall",
- "syscall.IPV6_FLOWLABEL_MASK": "syscall",
- "syscall.IPV6_FRAGTTL": "syscall",
- "syscall.IPV6_FW_ADD": "syscall",
- "syscall.IPV6_FW_DEL": "syscall",
- "syscall.IPV6_FW_FLUSH": "syscall",
- "syscall.IPV6_FW_GET": "syscall",
- "syscall.IPV6_FW_ZERO": "syscall",
- "syscall.IPV6_HLIMDEC": "syscall",
- "syscall.IPV6_HOPLIMIT": "syscall",
- "syscall.IPV6_HOPOPTS": "syscall",
- "syscall.IPV6_IPCOMP_LEVEL": "syscall",
- "syscall.IPV6_IPSEC_POLICY": "syscall",
- "syscall.IPV6_JOIN_ANYCAST": "syscall",
- "syscall.IPV6_JOIN_GROUP": "syscall",
- "syscall.IPV6_LEAVE_ANYCAST": "syscall",
- "syscall.IPV6_LEAVE_GROUP": "syscall",
- "syscall.IPV6_MAXHLIM": "syscall",
- "syscall.IPV6_MAXOPTHDR": "syscall",
- "syscall.IPV6_MAXPACKET": "syscall",
- "syscall.IPV6_MAX_GROUP_SRC_FILTER": "syscall",
- "syscall.IPV6_MAX_MEMBERSHIPS": "syscall",
- "syscall.IPV6_MAX_SOCK_SRC_FILTER": "syscall",
- "syscall.IPV6_MIN_MEMBERSHIPS": "syscall",
- "syscall.IPV6_MMTU": "syscall",
- "syscall.IPV6_MSFILTER": "syscall",
- "syscall.IPV6_MTU": "syscall",
- "syscall.IPV6_MTU_DISCOVER": "syscall",
- "syscall.IPV6_MULTICAST_HOPS": "syscall",
- "syscall.IPV6_MULTICAST_IF": "syscall",
- "syscall.IPV6_MULTICAST_LOOP": "syscall",
- "syscall.IPV6_NEXTHOP": "syscall",
- "syscall.IPV6_OPTIONS": "syscall",
- "syscall.IPV6_PATHMTU": "syscall",
- "syscall.IPV6_PIPEX": "syscall",
- "syscall.IPV6_PKTINFO": "syscall",
- "syscall.IPV6_PMTUDISC_DO": "syscall",
- "syscall.IPV6_PMTUDISC_DONT": "syscall",
- "syscall.IPV6_PMTUDISC_PROBE": "syscall",
- "syscall.IPV6_PMTUDISC_WANT": "syscall",
- "syscall.IPV6_PORTRANGE": "syscall",
- "syscall.IPV6_PORTRANGE_DEFAULT": "syscall",
- "syscall.IPV6_PORTRANGE_HIGH": "syscall",
- "syscall.IPV6_PORTRANGE_LOW": "syscall",
- "syscall.IPV6_PREFER_TEMPADDR": "syscall",
- "syscall.IPV6_RECVDSTOPTS": "syscall",
- "syscall.IPV6_RECVDSTPORT": "syscall",
- "syscall.IPV6_RECVERR": "syscall",
- "syscall.IPV6_RECVHOPLIMIT": "syscall",
- "syscall.IPV6_RECVHOPOPTS": "syscall",
- "syscall.IPV6_RECVPATHMTU": "syscall",
- "syscall.IPV6_RECVPKTINFO": "syscall",
- "syscall.IPV6_RECVRTHDR": "syscall",
- "syscall.IPV6_RECVTCLASS": "syscall",
- "syscall.IPV6_ROUTER_ALERT": "syscall",
- "syscall.IPV6_RTABLE": "syscall",
- "syscall.IPV6_RTHDR": "syscall",
- "syscall.IPV6_RTHDRDSTOPTS": "syscall",
- "syscall.IPV6_RTHDR_LOOSE": "syscall",
- "syscall.IPV6_RTHDR_STRICT": "syscall",
- "syscall.IPV6_RTHDR_TYPE_0": "syscall",
- "syscall.IPV6_RXDSTOPTS": "syscall",
- "syscall.IPV6_RXHOPOPTS": "syscall",
- "syscall.IPV6_SOCKOPT_RESERVED1": "syscall",
- "syscall.IPV6_TCLASS": "syscall",
- "syscall.IPV6_UNICAST_HOPS": "syscall",
- "syscall.IPV6_USE_MIN_MTU": "syscall",
- "syscall.IPV6_V6ONLY": "syscall",
- "syscall.IPV6_VERSION": "syscall",
- "syscall.IPV6_VERSION_MASK": "syscall",
- "syscall.IPV6_XFRM_POLICY": "syscall",
- "syscall.IP_ADD_MEMBERSHIP": "syscall",
- "syscall.IP_ADD_SOURCE_MEMBERSHIP": "syscall",
- "syscall.IP_AUTH_LEVEL": "syscall",
- "syscall.IP_BINDANY": "syscall",
- "syscall.IP_BLOCK_SOURCE": "syscall",
- "syscall.IP_BOUND_IF": "syscall",
- "syscall.IP_DEFAULT_MULTICAST_LOOP": "syscall",
- "syscall.IP_DEFAULT_MULTICAST_TTL": "syscall",
- "syscall.IP_DF": "syscall",
- "syscall.IP_DIVERTFL": "syscall",
- "syscall.IP_DONTFRAG": "syscall",
- "syscall.IP_DROP_MEMBERSHIP": "syscall",
- "syscall.IP_DROP_SOURCE_MEMBERSHIP": "syscall",
- "syscall.IP_DUMMYNET3": "syscall",
- "syscall.IP_DUMMYNET_CONFIGURE": "syscall",
- "syscall.IP_DUMMYNET_DEL": "syscall",
- "syscall.IP_DUMMYNET_FLUSH": "syscall",
- "syscall.IP_DUMMYNET_GET": "syscall",
- "syscall.IP_EF": "syscall",
- "syscall.IP_ERRORMTU": "syscall",
- "syscall.IP_ESP_NETWORK_LEVEL": "syscall",
- "syscall.IP_ESP_TRANS_LEVEL": "syscall",
- "syscall.IP_FAITH": "syscall",
- "syscall.IP_FREEBIND": "syscall",
- "syscall.IP_FW3": "syscall",
- "syscall.IP_FW_ADD": "syscall",
- "syscall.IP_FW_DEL": "syscall",
- "syscall.IP_FW_FLUSH": "syscall",
- "syscall.IP_FW_GET": "syscall",
- "syscall.IP_FW_NAT_CFG": "syscall",
- "syscall.IP_FW_NAT_DEL": "syscall",
- "syscall.IP_FW_NAT_GET_CONFIG": "syscall",
- "syscall.IP_FW_NAT_GET_LOG": "syscall",
- "syscall.IP_FW_RESETLOG": "syscall",
- "syscall.IP_FW_TABLE_ADD": "syscall",
- "syscall.IP_FW_TABLE_DEL": "syscall",
- "syscall.IP_FW_TABLE_FLUSH": "syscall",
- "syscall.IP_FW_TABLE_GETSIZE": "syscall",
- "syscall.IP_FW_TABLE_LIST": "syscall",
- "syscall.IP_FW_ZERO": "syscall",
- "syscall.IP_HDRINCL": "syscall",
- "syscall.IP_IPCOMP_LEVEL": "syscall",
- "syscall.IP_IPSECFLOWINFO": "syscall",
- "syscall.IP_IPSEC_LOCAL_AUTH": "syscall",
- "syscall.IP_IPSEC_LOCAL_CRED": "syscall",
- "syscall.IP_IPSEC_LOCAL_ID": "syscall",
- "syscall.IP_IPSEC_POLICY": "syscall",
- "syscall.IP_IPSEC_REMOTE_AUTH": "syscall",
- "syscall.IP_IPSEC_REMOTE_CRED": "syscall",
- "syscall.IP_IPSEC_REMOTE_ID": "syscall",
- "syscall.IP_MAXPACKET": "syscall",
- "syscall.IP_MAX_GROUP_SRC_FILTER": "syscall",
- "syscall.IP_MAX_MEMBERSHIPS": "syscall",
- "syscall.IP_MAX_SOCK_MUTE_FILTER": "syscall",
- "syscall.IP_MAX_SOCK_SRC_FILTER": "syscall",
- "syscall.IP_MAX_SOURCE_FILTER": "syscall",
- "syscall.IP_MF": "syscall",
- "syscall.IP_MINFRAGSIZE": "syscall",
- "syscall.IP_MINTTL": "syscall",
- "syscall.IP_MIN_MEMBERSHIPS": "syscall",
- "syscall.IP_MSFILTER": "syscall",
- "syscall.IP_MSS": "syscall",
- "syscall.IP_MTU": "syscall",
- "syscall.IP_MTU_DISCOVER": "syscall",
- "syscall.IP_MULTICAST_IF": "syscall",
- "syscall.IP_MULTICAST_IFINDEX": "syscall",
- "syscall.IP_MULTICAST_LOOP": "syscall",
- "syscall.IP_MULTICAST_TTL": "syscall",
- "syscall.IP_MULTICAST_VIF": "syscall",
- "syscall.IP_NAT__XXX": "syscall",
- "syscall.IP_OFFMASK": "syscall",
- "syscall.IP_OLD_FW_ADD": "syscall",
- "syscall.IP_OLD_FW_DEL": "syscall",
- "syscall.IP_OLD_FW_FLUSH": "syscall",
- "syscall.IP_OLD_FW_GET": "syscall",
- "syscall.IP_OLD_FW_RESETLOG": "syscall",
- "syscall.IP_OLD_FW_ZERO": "syscall",
- "syscall.IP_ONESBCAST": "syscall",
- "syscall.IP_OPTIONS": "syscall",
- "syscall.IP_ORIGDSTADDR": "syscall",
- "syscall.IP_PASSSEC": "syscall",
- "syscall.IP_PIPEX": "syscall",
- "syscall.IP_PKTINFO": "syscall",
- "syscall.IP_PKTOPTIONS": "syscall",
- "syscall.IP_PMTUDISC": "syscall",
- "syscall.IP_PMTUDISC_DO": "syscall",
- "syscall.IP_PMTUDISC_DONT": "syscall",
- "syscall.IP_PMTUDISC_PROBE": "syscall",
- "syscall.IP_PMTUDISC_WANT": "syscall",
- "syscall.IP_PORTRANGE": "syscall",
- "syscall.IP_PORTRANGE_DEFAULT": "syscall",
- "syscall.IP_PORTRANGE_HIGH": "syscall",
- "syscall.IP_PORTRANGE_LOW": "syscall",
- "syscall.IP_RECVDSTADDR": "syscall",
- "syscall.IP_RECVDSTPORT": "syscall",
- "syscall.IP_RECVERR": "syscall",
- "syscall.IP_RECVIF": "syscall",
- "syscall.IP_RECVOPTS": "syscall",
- "syscall.IP_RECVORIGDSTADDR": "syscall",
- "syscall.IP_RECVPKTINFO": "syscall",
- "syscall.IP_RECVRETOPTS": "syscall",
- "syscall.IP_RECVRTABLE": "syscall",
- "syscall.IP_RECVTOS": "syscall",
- "syscall.IP_RECVTTL": "syscall",
- "syscall.IP_RETOPTS": "syscall",
- "syscall.IP_RF": "syscall",
- "syscall.IP_ROUTER_ALERT": "syscall",
- "syscall.IP_RSVP_OFF": "syscall",
- "syscall.IP_RSVP_ON": "syscall",
- "syscall.IP_RSVP_VIF_OFF": "syscall",
- "syscall.IP_RSVP_VIF_ON": "syscall",
- "syscall.IP_RTABLE": "syscall",
- "syscall.IP_SENDSRCADDR": "syscall",
- "syscall.IP_STRIPHDR": "syscall",
- "syscall.IP_TOS": "syscall",
- "syscall.IP_TRAFFIC_MGT_BACKGROUND": "syscall",
- "syscall.IP_TRANSPARENT": "syscall",
- "syscall.IP_TTL": "syscall",
- "syscall.IP_UNBLOCK_SOURCE": "syscall",
- "syscall.IP_XFRM_POLICY": "syscall",
- "syscall.IPv6MTUInfo": "syscall",
- "syscall.IPv6Mreq": "syscall",
- "syscall.ISIG": "syscall",
- "syscall.ISTRIP": "syscall",
- "syscall.IUCLC": "syscall",
- "syscall.IUTF8": "syscall",
- "syscall.IXANY": "syscall",
- "syscall.IXOFF": "syscall",
- "syscall.IXON": "syscall",
- "syscall.IfAddrmsg": "syscall",
- "syscall.IfAnnounceMsghdr": "syscall",
- "syscall.IfData": "syscall",
- "syscall.IfInfomsg": "syscall",
- "syscall.IfMsghdr": "syscall",
- "syscall.IfaMsghdr": "syscall",
- "syscall.IfmaMsghdr": "syscall",
- "syscall.IfmaMsghdr2": "syscall",
- "syscall.ImplementsGetwd": "syscall",
- "syscall.Inet4Pktinfo": "syscall",
- "syscall.Inet6Pktinfo": "syscall",
- "syscall.InotifyAddWatch": "syscall",
- "syscall.InotifyEvent": "syscall",
- "syscall.InotifyInit": "syscall",
- "syscall.InotifyInit1": "syscall",
- "syscall.InotifyRmWatch": "syscall",
- "syscall.InterfaceAddrMessage": "syscall",
- "syscall.InterfaceAnnounceMessage": "syscall",
- "syscall.InterfaceInfo": "syscall",
- "syscall.InterfaceMessage": "syscall",
- "syscall.InterfaceMulticastAddrMessage": "syscall",
- "syscall.InvalidHandle": "syscall",
- "syscall.Ioperm": "syscall",
- "syscall.Iopl": "syscall",
- "syscall.Iovec": "syscall",
- "syscall.IpAdapterInfo": "syscall",
- "syscall.IpAddrString": "syscall",
- "syscall.IpAddressString": "syscall",
- "syscall.IpMaskString": "syscall",
- "syscall.Issetugid": "syscall",
- "syscall.KEY_ALL_ACCESS": "syscall",
- "syscall.KEY_CREATE_LINK": "syscall",
- "syscall.KEY_CREATE_SUB_KEY": "syscall",
- "syscall.KEY_ENUMERATE_SUB_KEYS": "syscall",
- "syscall.KEY_EXECUTE": "syscall",
- "syscall.KEY_NOTIFY": "syscall",
- "syscall.KEY_QUERY_VALUE": "syscall",
- "syscall.KEY_READ": "syscall",
- "syscall.KEY_SET_VALUE": "syscall",
- "syscall.KEY_WOW64_32KEY": "syscall",
- "syscall.KEY_WOW64_64KEY": "syscall",
- "syscall.KEY_WRITE": "syscall",
- "syscall.Kevent": "syscall",
- "syscall.Kevent_t": "syscall",
- "syscall.Kill": "syscall",
- "syscall.Klogctl": "syscall",
- "syscall.Kqueue": "syscall",
- "syscall.LANG_ENGLISH": "syscall",
- "syscall.LAYERED_PROTOCOL": "syscall",
- "syscall.LCNT_OVERLOAD_FLUSH": "syscall",
- "syscall.LINUX_REBOOT_CMD_CAD_OFF": "syscall",
- "syscall.LINUX_REBOOT_CMD_CAD_ON": "syscall",
- "syscall.LINUX_REBOOT_CMD_HALT": "syscall",
- "syscall.LINUX_REBOOT_CMD_KEXEC": "syscall",
- "syscall.LINUX_REBOOT_CMD_POWER_OFF": "syscall",
- "syscall.LINUX_REBOOT_CMD_RESTART": "syscall",
- "syscall.LINUX_REBOOT_CMD_RESTART2": "syscall",
- "syscall.LINUX_REBOOT_CMD_SW_SUSPEND": "syscall",
- "syscall.LINUX_REBOOT_MAGIC1": "syscall",
- "syscall.LINUX_REBOOT_MAGIC2": "syscall",
- "syscall.LOCK_EX": "syscall",
- "syscall.LOCK_NB": "syscall",
- "syscall.LOCK_SH": "syscall",
- "syscall.LOCK_UN": "syscall",
- "syscall.LazyDLL": "syscall",
- "syscall.LazyProc": "syscall",
- "syscall.Lchown": "syscall",
- "syscall.Linger": "syscall",
- "syscall.Link": "syscall",
- "syscall.Listen": "syscall",
- "syscall.Listxattr": "syscall",
- "syscall.LoadCancelIoEx": "syscall",
- "syscall.LoadConnectEx": "syscall",
- "syscall.LoadCreateSymbolicLink": "syscall",
- "syscall.LoadDLL": "syscall",
- "syscall.LoadGetAddrInfo": "syscall",
- "syscall.LoadLibrary": "syscall",
- "syscall.LoadSetFileCompletionNotificationModes": "syscall",
- "syscall.LocalFree": "syscall",
- "syscall.Log2phys_t": "syscall",
- "syscall.LookupAccountName": "syscall",
- "syscall.LookupAccountSid": "syscall",
- "syscall.LookupSID": "syscall",
- "syscall.LsfJump": "syscall",
- "syscall.LsfSocket": "syscall",
- "syscall.LsfStmt": "syscall",
- "syscall.Lstat": "syscall",
- "syscall.MADV_AUTOSYNC": "syscall",
- "syscall.MADV_CAN_REUSE": "syscall",
- "syscall.MADV_CORE": "syscall",
- "syscall.MADV_DOFORK": "syscall",
- "syscall.MADV_DONTFORK": "syscall",
- "syscall.MADV_DONTNEED": "syscall",
- "syscall.MADV_FREE": "syscall",
- "syscall.MADV_FREE_REUSABLE": "syscall",
- "syscall.MADV_FREE_REUSE": "syscall",
- "syscall.MADV_HUGEPAGE": "syscall",
- "syscall.MADV_HWPOISON": "syscall",
- "syscall.MADV_MERGEABLE": "syscall",
- "syscall.MADV_NOCORE": "syscall",
- "syscall.MADV_NOHUGEPAGE": "syscall",
- "syscall.MADV_NORMAL": "syscall",
- "syscall.MADV_NOSYNC": "syscall",
- "syscall.MADV_PROTECT": "syscall",
- "syscall.MADV_RANDOM": "syscall",
- "syscall.MADV_REMOVE": "syscall",
- "syscall.MADV_SEQUENTIAL": "syscall",
- "syscall.MADV_SPACEAVAIL": "syscall",
- "syscall.MADV_UNMERGEABLE": "syscall",
- "syscall.MADV_WILLNEED": "syscall",
- "syscall.MADV_ZERO_WIRED_PAGES": "syscall",
- "syscall.MAP_32BIT": "syscall",
- "syscall.MAP_ALIGNED_SUPER": "syscall",
- "syscall.MAP_ALIGNMENT_16MB": "syscall",
- "syscall.MAP_ALIGNMENT_1TB": "syscall",
- "syscall.MAP_ALIGNMENT_256TB": "syscall",
- "syscall.MAP_ALIGNMENT_4GB": "syscall",
- "syscall.MAP_ALIGNMENT_64KB": "syscall",
- "syscall.MAP_ALIGNMENT_64PB": "syscall",
- "syscall.MAP_ALIGNMENT_MASK": "syscall",
- "syscall.MAP_ALIGNMENT_SHIFT": "syscall",
- "syscall.MAP_ANON": "syscall",
- "syscall.MAP_ANONYMOUS": "syscall",
- "syscall.MAP_COPY": "syscall",
- "syscall.MAP_DENYWRITE": "syscall",
- "syscall.MAP_EXECUTABLE": "syscall",
- "syscall.MAP_FILE": "syscall",
- "syscall.MAP_FIXED": "syscall",
- "syscall.MAP_FLAGMASK": "syscall",
- "syscall.MAP_GROWSDOWN": "syscall",
- "syscall.MAP_HASSEMAPHORE": "syscall",
- "syscall.MAP_HUGETLB": "syscall",
- "syscall.MAP_INHERIT": "syscall",
- "syscall.MAP_INHERIT_COPY": "syscall",
- "syscall.MAP_INHERIT_DEFAULT": "syscall",
- "syscall.MAP_INHERIT_DONATE_COPY": "syscall",
- "syscall.MAP_INHERIT_NONE": "syscall",
- "syscall.MAP_INHERIT_SHARE": "syscall",
- "syscall.MAP_JIT": "syscall",
- "syscall.MAP_LOCKED": "syscall",
- "syscall.MAP_NOCACHE": "syscall",
- "syscall.MAP_NOCORE": "syscall",
- "syscall.MAP_NOEXTEND": "syscall",
- "syscall.MAP_NONBLOCK": "syscall",
- "syscall.MAP_NORESERVE": "syscall",
- "syscall.MAP_NOSYNC": "syscall",
- "syscall.MAP_POPULATE": "syscall",
- "syscall.MAP_PREFAULT_READ": "syscall",
- "syscall.MAP_PRIVATE": "syscall",
- "syscall.MAP_RENAME": "syscall",
- "syscall.MAP_RESERVED0080": "syscall",
- "syscall.MAP_RESERVED0100": "syscall",
- "syscall.MAP_SHARED": "syscall",
- "syscall.MAP_STACK": "syscall",
- "syscall.MAP_TRYFIXED": "syscall",
- "syscall.MAP_TYPE": "syscall",
- "syscall.MAP_WIRED": "syscall",
- "syscall.MAXIMUM_REPARSE_DATA_BUFFER_SIZE": "syscall",
- "syscall.MAXLEN_IFDESCR": "syscall",
- "syscall.MAXLEN_PHYSADDR": "syscall",
- "syscall.MAX_ADAPTER_ADDRESS_LENGTH": "syscall",
- "syscall.MAX_ADAPTER_DESCRIPTION_LENGTH": "syscall",
- "syscall.MAX_ADAPTER_NAME_LENGTH": "syscall",
- "syscall.MAX_COMPUTERNAME_LENGTH": "syscall",
- "syscall.MAX_INTERFACE_NAME_LEN": "syscall",
- "syscall.MAX_LONG_PATH": "syscall",
- "syscall.MAX_PATH": "syscall",
- "syscall.MAX_PROTOCOL_CHAIN": "syscall",
- "syscall.MCL_CURRENT": "syscall",
- "syscall.MCL_FUTURE": "syscall",
- "syscall.MNT_DETACH": "syscall",
- "syscall.MNT_EXPIRE": "syscall",
- "syscall.MNT_FORCE": "syscall",
- "syscall.MSG_BCAST": "syscall",
- "syscall.MSG_CMSG_CLOEXEC": "syscall",
- "syscall.MSG_COMPAT": "syscall",
- "syscall.MSG_CONFIRM": "syscall",
- "syscall.MSG_CONTROLMBUF": "syscall",
- "syscall.MSG_CTRUNC": "syscall",
- "syscall.MSG_DONTROUTE": "syscall",
- "syscall.MSG_DONTWAIT": "syscall",
- "syscall.MSG_EOF": "syscall",
- "syscall.MSG_EOR": "syscall",
- "syscall.MSG_ERRQUEUE": "syscall",
- "syscall.MSG_FASTOPEN": "syscall",
- "syscall.MSG_FIN": "syscall",
- "syscall.MSG_FLUSH": "syscall",
- "syscall.MSG_HAVEMORE": "syscall",
- "syscall.MSG_HOLD": "syscall",
- "syscall.MSG_IOVUSRSPACE": "syscall",
- "syscall.MSG_LENUSRSPACE": "syscall",
- "syscall.MSG_MCAST": "syscall",
- "syscall.MSG_MORE": "syscall",
- "syscall.MSG_NAMEMBUF": "syscall",
- "syscall.MSG_NBIO": "syscall",
- "syscall.MSG_NEEDSA": "syscall",
- "syscall.MSG_NOSIGNAL": "syscall",
- "syscall.MSG_NOTIFICATION": "syscall",
- "syscall.MSG_OOB": "syscall",
- "syscall.MSG_PEEK": "syscall",
- "syscall.MSG_PROXY": "syscall",
- "syscall.MSG_RCVMORE": "syscall",
- "syscall.MSG_RST": "syscall",
- "syscall.MSG_SEND": "syscall",
- "syscall.MSG_SYN": "syscall",
- "syscall.MSG_TRUNC": "syscall",
- "syscall.MSG_TRYHARD": "syscall",
- "syscall.MSG_USERFLAGS": "syscall",
- "syscall.MSG_WAITALL": "syscall",
- "syscall.MSG_WAITFORONE": "syscall",
- "syscall.MSG_WAITSTREAM": "syscall",
- "syscall.MS_ACTIVE": "syscall",
- "syscall.MS_ASYNC": "syscall",
- "syscall.MS_BIND": "syscall",
- "syscall.MS_DEACTIVATE": "syscall",
- "syscall.MS_DIRSYNC": "syscall",
- "syscall.MS_INVALIDATE": "syscall",
- "syscall.MS_I_VERSION": "syscall",
- "syscall.MS_KERNMOUNT": "syscall",
- "syscall.MS_KILLPAGES": "syscall",
- "syscall.MS_MANDLOCK": "syscall",
- "syscall.MS_MGC_MSK": "syscall",
- "syscall.MS_MGC_VAL": "syscall",
- "syscall.MS_MOVE": "syscall",
- "syscall.MS_NOATIME": "syscall",
- "syscall.MS_NODEV": "syscall",
- "syscall.MS_NODIRATIME": "syscall",
- "syscall.MS_NOEXEC": "syscall",
- "syscall.MS_NOSUID": "syscall",
- "syscall.MS_NOUSER": "syscall",
- "syscall.MS_POSIXACL": "syscall",
- "syscall.MS_PRIVATE": "syscall",
- "syscall.MS_RDONLY": "syscall",
- "syscall.MS_REC": "syscall",
- "syscall.MS_RELATIME": "syscall",
- "syscall.MS_REMOUNT": "syscall",
- "syscall.MS_RMT_MASK": "syscall",
- "syscall.MS_SHARED": "syscall",
- "syscall.MS_SILENT": "syscall",
- "syscall.MS_SLAVE": "syscall",
- "syscall.MS_STRICTATIME": "syscall",
- "syscall.MS_SYNC": "syscall",
- "syscall.MS_SYNCHRONOUS": "syscall",
- "syscall.MS_UNBINDABLE": "syscall",
- "syscall.Madvise": "syscall",
- "syscall.MapViewOfFile": "syscall",
- "syscall.MaxTokenInfoClass": "syscall",
- "syscall.Mclpool": "syscall",
- "syscall.MibIfRow": "syscall",
- "syscall.Mkdir": "syscall",
- "syscall.Mkdirat": "syscall",
- "syscall.Mkfifo": "syscall",
- "syscall.Mknod": "syscall",
- "syscall.Mknodat": "syscall",
- "syscall.Mlock": "syscall",
- "syscall.Mlockall": "syscall",
- "syscall.Mmap": "syscall",
- "syscall.Mount": "syscall",
- "syscall.MoveFile": "syscall",
- "syscall.Mprotect": "syscall",
- "syscall.Msghdr": "syscall",
- "syscall.Munlock": "syscall",
- "syscall.Munlockall": "syscall",
- "syscall.Munmap": "syscall",
- "syscall.MustLoadDLL": "syscall",
- "syscall.NAME_MAX": "syscall",
- "syscall.NETLINK_ADD_MEMBERSHIP": "syscall",
- "syscall.NETLINK_AUDIT": "syscall",
- "syscall.NETLINK_BROADCAST_ERROR": "syscall",
- "syscall.NETLINK_CONNECTOR": "syscall",
- "syscall.NETLINK_DNRTMSG": "syscall",
- "syscall.NETLINK_DROP_MEMBERSHIP": "syscall",
- "syscall.NETLINK_ECRYPTFS": "syscall",
- "syscall.NETLINK_FIB_LOOKUP": "syscall",
- "syscall.NETLINK_FIREWALL": "syscall",
- "syscall.NETLINK_GENERIC": "syscall",
- "syscall.NETLINK_INET_DIAG": "syscall",
- "syscall.NETLINK_IP6_FW": "syscall",
- "syscall.NETLINK_ISCSI": "syscall",
- "syscall.NETLINK_KOBJECT_UEVENT": "syscall",
- "syscall.NETLINK_NETFILTER": "syscall",
- "syscall.NETLINK_NFLOG": "syscall",
- "syscall.NETLINK_NO_ENOBUFS": "syscall",
- "syscall.NETLINK_PKTINFO": "syscall",
- "syscall.NETLINK_RDMA": "syscall",
- "syscall.NETLINK_ROUTE": "syscall",
- "syscall.NETLINK_SCSITRANSPORT": "syscall",
- "syscall.NETLINK_SELINUX": "syscall",
- "syscall.NETLINK_UNUSED": "syscall",
- "syscall.NETLINK_USERSOCK": "syscall",
- "syscall.NETLINK_XFRM": "syscall",
- "syscall.NET_RT_DUMP": "syscall",
- "syscall.NET_RT_DUMP2": "syscall",
- "syscall.NET_RT_FLAGS": "syscall",
- "syscall.NET_RT_IFLIST": "syscall",
- "syscall.NET_RT_IFLIST2": "syscall",
- "syscall.NET_RT_IFLISTL": "syscall",
- "syscall.NET_RT_IFMALIST": "syscall",
- "syscall.NET_RT_MAXID": "syscall",
- "syscall.NET_RT_OIFLIST": "syscall",
- "syscall.NET_RT_OOIFLIST": "syscall",
- "syscall.NET_RT_STAT": "syscall",
- "syscall.NET_RT_STATS": "syscall",
- "syscall.NET_RT_TABLE": "syscall",
- "syscall.NET_RT_TRASH": "syscall",
- "syscall.NLA_ALIGNTO": "syscall",
- "syscall.NLA_F_NESTED": "syscall",
- "syscall.NLA_F_NET_BYTEORDER": "syscall",
- "syscall.NLA_HDRLEN": "syscall",
- "syscall.NLMSG_ALIGNTO": "syscall",
- "syscall.NLMSG_DONE": "syscall",
- "syscall.NLMSG_ERROR": "syscall",
- "syscall.NLMSG_HDRLEN": "syscall",
- "syscall.NLMSG_MIN_TYPE": "syscall",
- "syscall.NLMSG_NOOP": "syscall",
- "syscall.NLMSG_OVERRUN": "syscall",
- "syscall.NLM_F_ACK": "syscall",
- "syscall.NLM_F_APPEND": "syscall",
- "syscall.NLM_F_ATOMIC": "syscall",
- "syscall.NLM_F_CREATE": "syscall",
- "syscall.NLM_F_DUMP": "syscall",
- "syscall.NLM_F_ECHO": "syscall",
- "syscall.NLM_F_EXCL": "syscall",
- "syscall.NLM_F_MATCH": "syscall",
- "syscall.NLM_F_MULTI": "syscall",
- "syscall.NLM_F_REPLACE": "syscall",
- "syscall.NLM_F_REQUEST": "syscall",
- "syscall.NLM_F_ROOT": "syscall",
- "syscall.NOFLSH": "syscall",
- "syscall.NOTE_ABSOLUTE": "syscall",
- "syscall.NOTE_ATTRIB": "syscall",
- "syscall.NOTE_CHILD": "syscall",
- "syscall.NOTE_DELETE": "syscall",
- "syscall.NOTE_EOF": "syscall",
- "syscall.NOTE_EXEC": "syscall",
- "syscall.NOTE_EXIT": "syscall",
- "syscall.NOTE_EXITSTATUS": "syscall",
- "syscall.NOTE_EXTEND": "syscall",
- "syscall.NOTE_FFAND": "syscall",
- "syscall.NOTE_FFCOPY": "syscall",
- "syscall.NOTE_FFCTRLMASK": "syscall",
- "syscall.NOTE_FFLAGSMASK": "syscall",
- "syscall.NOTE_FFNOP": "syscall",
- "syscall.NOTE_FFOR": "syscall",
- "syscall.NOTE_FORK": "syscall",
- "syscall.NOTE_LINK": "syscall",
- "syscall.NOTE_LOWAT": "syscall",
- "syscall.NOTE_NONE": "syscall",
- "syscall.NOTE_NSECONDS": "syscall",
- "syscall.NOTE_PCTRLMASK": "syscall",
- "syscall.NOTE_PDATAMASK": "syscall",
- "syscall.NOTE_REAP": "syscall",
- "syscall.NOTE_RENAME": "syscall",
- "syscall.NOTE_RESOURCEEND": "syscall",
- "syscall.NOTE_REVOKE": "syscall",
- "syscall.NOTE_SECONDS": "syscall",
- "syscall.NOTE_SIGNAL": "syscall",
- "syscall.NOTE_TRACK": "syscall",
- "syscall.NOTE_TRACKERR": "syscall",
- "syscall.NOTE_TRIGGER": "syscall",
- "syscall.NOTE_TRUNCATE": "syscall",
- "syscall.NOTE_USECONDS": "syscall",
- "syscall.NOTE_VM_ERROR": "syscall",
- "syscall.NOTE_VM_PRESSURE": "syscall",
- "syscall.NOTE_VM_PRESSURE_SUDDEN_TERMINATE": "syscall",
- "syscall.NOTE_VM_PRESSURE_TERMINATE": "syscall",
- "syscall.NOTE_WRITE": "syscall",
- "syscall.NameCanonical": "syscall",
- "syscall.NameCanonicalEx": "syscall",
- "syscall.NameDisplay": "syscall",
- "syscall.NameDnsDomain": "syscall",
- "syscall.NameFullyQualifiedDN": "syscall",
- "syscall.NameSamCompatible": "syscall",
- "syscall.NameServicePrincipal": "syscall",
- "syscall.NameUniqueId": "syscall",
- "syscall.NameUnknown": "syscall",
- "syscall.NameUserPrincipal": "syscall",
- "syscall.Nanosleep": "syscall",
- "syscall.NetApiBufferFree": "syscall",
- "syscall.NetGetJoinInformation": "syscall",
- "syscall.NetSetupDomainName": "syscall",
- "syscall.NetSetupUnjoined": "syscall",
- "syscall.NetSetupUnknownStatus": "syscall",
- "syscall.NetSetupWorkgroupName": "syscall",
- "syscall.NetUserGetInfo": "syscall",
- "syscall.NetlinkMessage": "syscall",
- "syscall.NetlinkRIB": "syscall",
- "syscall.NetlinkRouteAttr": "syscall",
- "syscall.NetlinkRouteRequest": "syscall",
- "syscall.NewCallback": "syscall",
- "syscall.NewCallbackCDecl": "syscall",
- "syscall.NewLazyDLL": "syscall",
- "syscall.NlAttr": "syscall",
- "syscall.NlMsgerr": "syscall",
- "syscall.NlMsghdr": "syscall",
- "syscall.NsecToFiletime": "syscall",
- "syscall.NsecToTimespec": "syscall",
- "syscall.NsecToTimeval": "syscall",
- "syscall.Ntohs": "syscall",
- "syscall.OCRNL": "syscall",
- "syscall.OFDEL": "syscall",
- "syscall.OFILL": "syscall",
- "syscall.OFIOGETBMAP": "syscall",
- "syscall.OID_PKIX_KP_SERVER_AUTH": "syscall",
- "syscall.OID_SERVER_GATED_CRYPTO": "syscall",
- "syscall.OID_SGC_NETSCAPE": "syscall",
- "syscall.OLCUC": "syscall",
- "syscall.ONLCR": "syscall",
- "syscall.ONLRET": "syscall",
- "syscall.ONOCR": "syscall",
- "syscall.ONOEOT": "syscall",
- "syscall.OPEN_ALWAYS": "syscall",
- "syscall.OPEN_EXISTING": "syscall",
- "syscall.OPOST": "syscall",
- "syscall.O_ACCMODE": "syscall",
- "syscall.O_ALERT": "syscall",
- "syscall.O_ALT_IO": "syscall",
- "syscall.O_APPEND": "syscall",
- "syscall.O_ASYNC": "syscall",
- "syscall.O_CLOEXEC": "syscall",
- "syscall.O_CREAT": "syscall",
- "syscall.O_DIRECT": "syscall",
- "syscall.O_DIRECTORY": "syscall",
- "syscall.O_DSYNC": "syscall",
- "syscall.O_EVTONLY": "syscall",
- "syscall.O_EXCL": "syscall",
- "syscall.O_EXEC": "syscall",
- "syscall.O_EXLOCK": "syscall",
- "syscall.O_FSYNC": "syscall",
- "syscall.O_LARGEFILE": "syscall",
- "syscall.O_NDELAY": "syscall",
- "syscall.O_NOATIME": "syscall",
- "syscall.O_NOCTTY": "syscall",
- "syscall.O_NOFOLLOW": "syscall",
- "syscall.O_NONBLOCK": "syscall",
- "syscall.O_NOSIGPIPE": "syscall",
- "syscall.O_POPUP": "syscall",
- "syscall.O_RDONLY": "syscall",
- "syscall.O_RDWR": "syscall",
- "syscall.O_RSYNC": "syscall",
- "syscall.O_SHLOCK": "syscall",
- "syscall.O_SYMLINK": "syscall",
- "syscall.O_SYNC": "syscall",
- "syscall.O_TRUNC": "syscall",
- "syscall.O_TTY_INIT": "syscall",
- "syscall.O_WRONLY": "syscall",
- "syscall.Open": "syscall",
- "syscall.OpenCurrentProcessToken": "syscall",
- "syscall.OpenProcess": "syscall",
- "syscall.OpenProcessToken": "syscall",
- "syscall.Openat": "syscall",
- "syscall.Overlapped": "syscall",
- "syscall.PACKET_ADD_MEMBERSHIP": "syscall",
- "syscall.PACKET_BROADCAST": "syscall",
- "syscall.PACKET_DROP_MEMBERSHIP": "syscall",
- "syscall.PACKET_FASTROUTE": "syscall",
- "syscall.PACKET_HOST": "syscall",
- "syscall.PACKET_LOOPBACK": "syscall",
- "syscall.PACKET_MR_ALLMULTI": "syscall",
- "syscall.PACKET_MR_MULTICAST": "syscall",
- "syscall.PACKET_MR_PROMISC": "syscall",
- "syscall.PACKET_MULTICAST": "syscall",
- "syscall.PACKET_OTHERHOST": "syscall",
- "syscall.PACKET_OUTGOING": "syscall",
- "syscall.PACKET_RECV_OUTPUT": "syscall",
- "syscall.PACKET_RX_RING": "syscall",
- "syscall.PACKET_STATISTICS": "syscall",
- "syscall.PAGE_EXECUTE_READ": "syscall",
- "syscall.PAGE_EXECUTE_READWRITE": "syscall",
- "syscall.PAGE_EXECUTE_WRITECOPY": "syscall",
- "syscall.PAGE_READONLY": "syscall",
- "syscall.PAGE_READWRITE": "syscall",
- "syscall.PAGE_WRITECOPY": "syscall",
- "syscall.PARENB": "syscall",
- "syscall.PARMRK": "syscall",
- "syscall.PARODD": "syscall",
- "syscall.PENDIN": "syscall",
- "syscall.PFL_HIDDEN": "syscall",
- "syscall.PFL_MATCHES_PROTOCOL_ZERO": "syscall",
- "syscall.PFL_MULTIPLE_PROTO_ENTRIES": "syscall",
- "syscall.PFL_NETWORKDIRECT_PROVIDER": "syscall",
- "syscall.PFL_RECOMMENDED_PROTO_ENTRY": "syscall",
- "syscall.PF_FLUSH": "syscall",
- "syscall.PKCS_7_ASN_ENCODING": "syscall",
- "syscall.PMC5_PIPELINE_FLUSH": "syscall",
- "syscall.PRIO_PGRP": "syscall",
- "syscall.PRIO_PROCESS": "syscall",
- "syscall.PRIO_USER": "syscall",
- "syscall.PRI_IOFLUSH": "syscall",
- "syscall.PROCESS_QUERY_INFORMATION": "syscall",
- "syscall.PROCESS_TERMINATE": "syscall",
- "syscall.PROT_EXEC": "syscall",
- "syscall.PROT_GROWSDOWN": "syscall",
- "syscall.PROT_GROWSUP": "syscall",
- "syscall.PROT_NONE": "syscall",
- "syscall.PROT_READ": "syscall",
- "syscall.PROT_WRITE": "syscall",
- "syscall.PROV_DH_SCHANNEL": "syscall",
- "syscall.PROV_DSS": "syscall",
- "syscall.PROV_DSS_DH": "syscall",
- "syscall.PROV_EC_ECDSA_FULL": "syscall",
- "syscall.PROV_EC_ECDSA_SIG": "syscall",
- "syscall.PROV_EC_ECNRA_FULL": "syscall",
- "syscall.PROV_EC_ECNRA_SIG": "syscall",
- "syscall.PROV_FORTEZZA": "syscall",
- "syscall.PROV_INTEL_SEC": "syscall",
- "syscall.PROV_MS_EXCHANGE": "syscall",
- "syscall.PROV_REPLACE_OWF": "syscall",
- "syscall.PROV_RNG": "syscall",
- "syscall.PROV_RSA_AES": "syscall",
- "syscall.PROV_RSA_FULL": "syscall",
- "syscall.PROV_RSA_SCHANNEL": "syscall",
- "syscall.PROV_RSA_SIG": "syscall",
- "syscall.PROV_SPYRUS_LYNKS": "syscall",
- "syscall.PROV_SSL": "syscall",
- "syscall.PR_CAPBSET_DROP": "syscall",
- "syscall.PR_CAPBSET_READ": "syscall",
- "syscall.PR_CLEAR_SECCOMP_FILTER": "syscall",
- "syscall.PR_ENDIAN_BIG": "syscall",
- "syscall.PR_ENDIAN_LITTLE": "syscall",
- "syscall.PR_ENDIAN_PPC_LITTLE": "syscall",
- "syscall.PR_FPEMU_NOPRINT": "syscall",
- "syscall.PR_FPEMU_SIGFPE": "syscall",
- "syscall.PR_FP_EXC_ASYNC": "syscall",
- "syscall.PR_FP_EXC_DISABLED": "syscall",
- "syscall.PR_FP_EXC_DIV": "syscall",
- "syscall.PR_FP_EXC_INV": "syscall",
- "syscall.PR_FP_EXC_NONRECOV": "syscall",
- "syscall.PR_FP_EXC_OVF": "syscall",
- "syscall.PR_FP_EXC_PRECISE": "syscall",
- "syscall.PR_FP_EXC_RES": "syscall",
- "syscall.PR_FP_EXC_SW_ENABLE": "syscall",
- "syscall.PR_FP_EXC_UND": "syscall",
- "syscall.PR_GET_DUMPABLE": "syscall",
- "syscall.PR_GET_ENDIAN": "syscall",
- "syscall.PR_GET_FPEMU": "syscall",
- "syscall.PR_GET_FPEXC": "syscall",
- "syscall.PR_GET_KEEPCAPS": "syscall",
- "syscall.PR_GET_NAME": "syscall",
- "syscall.PR_GET_PDEATHSIG": "syscall",
- "syscall.PR_GET_SECCOMP": "syscall",
- "syscall.PR_GET_SECCOMP_FILTER": "syscall",
- "syscall.PR_GET_SECUREBITS": "syscall",
- "syscall.PR_GET_TIMERSLACK": "syscall",
- "syscall.PR_GET_TIMING": "syscall",
- "syscall.PR_GET_TSC": "syscall",
- "syscall.PR_GET_UNALIGN": "syscall",
- "syscall.PR_MCE_KILL": "syscall",
- "syscall.PR_MCE_KILL_CLEAR": "syscall",
- "syscall.PR_MCE_KILL_DEFAULT": "syscall",
- "syscall.PR_MCE_KILL_EARLY": "syscall",
- "syscall.PR_MCE_KILL_GET": "syscall",
- "syscall.PR_MCE_KILL_LATE": "syscall",
- "syscall.PR_MCE_KILL_SET": "syscall",
- "syscall.PR_SECCOMP_FILTER_EVENT": "syscall",
- "syscall.PR_SECCOMP_FILTER_SYSCALL": "syscall",
- "syscall.PR_SET_DUMPABLE": "syscall",
- "syscall.PR_SET_ENDIAN": "syscall",
- "syscall.PR_SET_FPEMU": "syscall",
- "syscall.PR_SET_FPEXC": "syscall",
- "syscall.PR_SET_KEEPCAPS": "syscall",
- "syscall.PR_SET_NAME": "syscall",
- "syscall.PR_SET_PDEATHSIG": "syscall",
- "syscall.PR_SET_PTRACER": "syscall",
- "syscall.PR_SET_SECCOMP": "syscall",
- "syscall.PR_SET_SECCOMP_FILTER": "syscall",
- "syscall.PR_SET_SECUREBITS": "syscall",
- "syscall.PR_SET_TIMERSLACK": "syscall",
- "syscall.PR_SET_TIMING": "syscall",
- "syscall.PR_SET_TSC": "syscall",
- "syscall.PR_SET_UNALIGN": "syscall",
- "syscall.PR_TASK_PERF_EVENTS_DISABLE": "syscall",
- "syscall.PR_TASK_PERF_EVENTS_ENABLE": "syscall",
- "syscall.PR_TIMING_STATISTICAL": "syscall",
- "syscall.PR_TIMING_TIMESTAMP": "syscall",
- "syscall.PR_TSC_ENABLE": "syscall",
- "syscall.PR_TSC_SIGSEGV": "syscall",
- "syscall.PR_UNALIGN_NOPRINT": "syscall",
- "syscall.PR_UNALIGN_SIGBUS": "syscall",
- "syscall.PTRACE_ARCH_PRCTL": "syscall",
- "syscall.PTRACE_ATTACH": "syscall",
- "syscall.PTRACE_CONT": "syscall",
- "syscall.PTRACE_DETACH": "syscall",
- "syscall.PTRACE_EVENT_CLONE": "syscall",
- "syscall.PTRACE_EVENT_EXEC": "syscall",
- "syscall.PTRACE_EVENT_EXIT": "syscall",
- "syscall.PTRACE_EVENT_FORK": "syscall",
- "syscall.PTRACE_EVENT_VFORK": "syscall",
- "syscall.PTRACE_EVENT_VFORK_DONE": "syscall",
- "syscall.PTRACE_GETCRUNCHREGS": "syscall",
- "syscall.PTRACE_GETEVENTMSG": "syscall",
- "syscall.PTRACE_GETFPREGS": "syscall",
- "syscall.PTRACE_GETFPXREGS": "syscall",
- "syscall.PTRACE_GETHBPREGS": "syscall",
- "syscall.PTRACE_GETREGS": "syscall",
- "syscall.PTRACE_GETREGSET": "syscall",
- "syscall.PTRACE_GETSIGINFO": "syscall",
- "syscall.PTRACE_GETVFPREGS": "syscall",
- "syscall.PTRACE_GETWMMXREGS": "syscall",
- "syscall.PTRACE_GET_THREAD_AREA": "syscall",
- "syscall.PTRACE_KILL": "syscall",
- "syscall.PTRACE_OLDSETOPTIONS": "syscall",
- "syscall.PTRACE_O_MASK": "syscall",
- "syscall.PTRACE_O_TRACECLONE": "syscall",
- "syscall.PTRACE_O_TRACEEXEC": "syscall",
- "syscall.PTRACE_O_TRACEEXIT": "syscall",
- "syscall.PTRACE_O_TRACEFORK": "syscall",
- "syscall.PTRACE_O_TRACESYSGOOD": "syscall",
- "syscall.PTRACE_O_TRACEVFORK": "syscall",
- "syscall.PTRACE_O_TRACEVFORKDONE": "syscall",
- "syscall.PTRACE_PEEKDATA": "syscall",
- "syscall.PTRACE_PEEKTEXT": "syscall",
- "syscall.PTRACE_PEEKUSR": "syscall",
- "syscall.PTRACE_POKEDATA": "syscall",
- "syscall.PTRACE_POKETEXT": "syscall",
- "syscall.PTRACE_POKEUSR": "syscall",
- "syscall.PTRACE_SETCRUNCHREGS": "syscall",
- "syscall.PTRACE_SETFPREGS": "syscall",
- "syscall.PTRACE_SETFPXREGS": "syscall",
- "syscall.PTRACE_SETHBPREGS": "syscall",
- "syscall.PTRACE_SETOPTIONS": "syscall",
- "syscall.PTRACE_SETREGS": "syscall",
- "syscall.PTRACE_SETREGSET": "syscall",
- "syscall.PTRACE_SETSIGINFO": "syscall",
- "syscall.PTRACE_SETVFPREGS": "syscall",
- "syscall.PTRACE_SETWMMXREGS": "syscall",
- "syscall.PTRACE_SET_SYSCALL": "syscall",
- "syscall.PTRACE_SET_THREAD_AREA": "syscall",
- "syscall.PTRACE_SINGLEBLOCK": "syscall",
- "syscall.PTRACE_SINGLESTEP": "syscall",
- "syscall.PTRACE_SYSCALL": "syscall",
- "syscall.PTRACE_SYSEMU": "syscall",
- "syscall.PTRACE_SYSEMU_SINGLESTEP": "syscall",
- "syscall.PTRACE_TRACEME": "syscall",
- "syscall.PT_ATTACH": "syscall",
- "syscall.PT_ATTACHEXC": "syscall",
- "syscall.PT_CONTINUE": "syscall",
- "syscall.PT_DATA_ADDR": "syscall",
- "syscall.PT_DENY_ATTACH": "syscall",
- "syscall.PT_DETACH": "syscall",
- "syscall.PT_FIRSTMACH": "syscall",
- "syscall.PT_FORCEQUOTA": "syscall",
- "syscall.PT_KILL": "syscall",
- "syscall.PT_MASK": "syscall",
- "syscall.PT_READ_D": "syscall",
- "syscall.PT_READ_I": "syscall",
- "syscall.PT_READ_U": "syscall",
- "syscall.PT_SIGEXC": "syscall",
- "syscall.PT_STEP": "syscall",
- "syscall.PT_TEXT_ADDR": "syscall",
- "syscall.PT_TEXT_END_ADDR": "syscall",
- "syscall.PT_THUPDATE": "syscall",
- "syscall.PT_TRACE_ME": "syscall",
- "syscall.PT_WRITE_D": "syscall",
- "syscall.PT_WRITE_I": "syscall",
- "syscall.PT_WRITE_U": "syscall",
- "syscall.ParseDirent": "syscall",
- "syscall.ParseNetlinkMessage": "syscall",
- "syscall.ParseNetlinkRouteAttr": "syscall",
- "syscall.ParseRoutingMessage": "syscall",
- "syscall.ParseRoutingSockaddr": "syscall",
- "syscall.ParseSocketControlMessage": "syscall",
- "syscall.ParseUnixCredentials": "syscall",
- "syscall.ParseUnixRights": "syscall",
- "syscall.PathMax": "syscall",
- "syscall.Pathconf": "syscall",
- "syscall.Pause": "syscall",
- "syscall.Pipe": "syscall",
- "syscall.Pipe2": "syscall",
- "syscall.PivotRoot": "syscall",
- "syscall.PostQueuedCompletionStatus": "syscall",
- "syscall.Pread": "syscall",
- "syscall.Proc": "syscall",
- "syscall.ProcAttr": "syscall",
- "syscall.Process32First": "syscall",
- "syscall.Process32Next": "syscall",
- "syscall.ProcessEntry32": "syscall",
- "syscall.ProcessInformation": "syscall",
- "syscall.Protoent": "syscall",
- "syscall.PtraceAttach": "syscall",
- "syscall.PtraceCont": "syscall",
- "syscall.PtraceDetach": "syscall",
- "syscall.PtraceGetEventMsg": "syscall",
- "syscall.PtraceGetRegs": "syscall",
- "syscall.PtracePeekData": "syscall",
- "syscall.PtracePeekText": "syscall",
- "syscall.PtracePokeData": "syscall",
- "syscall.PtracePokeText": "syscall",
- "syscall.PtraceRegs": "syscall",
- "syscall.PtraceSetOptions": "syscall",
- "syscall.PtraceSetRegs": "syscall",
- "syscall.PtraceSingleStep": "syscall",
- "syscall.PtraceSyscall": "syscall",
- "syscall.Pwrite": "syscall",
- "syscall.REG_BINARY": "syscall",
- "syscall.REG_DWORD": "syscall",
- "syscall.REG_DWORD_BIG_ENDIAN": "syscall",
- "syscall.REG_DWORD_LITTLE_ENDIAN": "syscall",
- "syscall.REG_EXPAND_SZ": "syscall",
- "syscall.REG_FULL_RESOURCE_DESCRIPTOR": "syscall",
- "syscall.REG_LINK": "syscall",
- "syscall.REG_MULTI_SZ": "syscall",
- "syscall.REG_NONE": "syscall",
- "syscall.REG_QWORD": "syscall",
- "syscall.REG_QWORD_LITTLE_ENDIAN": "syscall",
- "syscall.REG_RESOURCE_LIST": "syscall",
- "syscall.REG_RESOURCE_REQUIREMENTS_LIST": "syscall",
- "syscall.REG_SZ": "syscall",
- "syscall.RLIMIT_AS": "syscall",
- "syscall.RLIMIT_CORE": "syscall",
- "syscall.RLIMIT_CPU": "syscall",
- "syscall.RLIMIT_DATA": "syscall",
- "syscall.RLIMIT_FSIZE": "syscall",
- "syscall.RLIMIT_NOFILE": "syscall",
- "syscall.RLIMIT_STACK": "syscall",
- "syscall.RLIM_INFINITY": "syscall",
- "syscall.RTAX_ADVMSS": "syscall",
- "syscall.RTAX_AUTHOR": "syscall",
- "syscall.RTAX_BRD": "syscall",
- "syscall.RTAX_CWND": "syscall",
- "syscall.RTAX_DST": "syscall",
- "syscall.RTAX_FEATURES": "syscall",
- "syscall.RTAX_FEATURE_ALLFRAG": "syscall",
- "syscall.RTAX_FEATURE_ECN": "syscall",
- "syscall.RTAX_FEATURE_SACK": "syscall",
- "syscall.RTAX_FEATURE_TIMESTAMP": "syscall",
- "syscall.RTAX_GATEWAY": "syscall",
- "syscall.RTAX_GENMASK": "syscall",
- "syscall.RTAX_HOPLIMIT": "syscall",
- "syscall.RTAX_IFA": "syscall",
- "syscall.RTAX_IFP": "syscall",
- "syscall.RTAX_INITCWND": "syscall",
- "syscall.RTAX_INITRWND": "syscall",
- "syscall.RTAX_LABEL": "syscall",
- "syscall.RTAX_LOCK": "syscall",
- "syscall.RTAX_MAX": "syscall",
- "syscall.RTAX_MTU": "syscall",
- "syscall.RTAX_NETMASK": "syscall",
- "syscall.RTAX_REORDERING": "syscall",
- "syscall.RTAX_RTO_MIN": "syscall",
- "syscall.RTAX_RTT": "syscall",
- "syscall.RTAX_RTTVAR": "syscall",
- "syscall.RTAX_SRC": "syscall",
- "syscall.RTAX_SRCMASK": "syscall",
- "syscall.RTAX_SSTHRESH": "syscall",
- "syscall.RTAX_TAG": "syscall",
- "syscall.RTAX_UNSPEC": "syscall",
- "syscall.RTAX_WINDOW": "syscall",
- "syscall.RTA_ALIGNTO": "syscall",
- "syscall.RTA_AUTHOR": "syscall",
- "syscall.RTA_BRD": "syscall",
- "syscall.RTA_CACHEINFO": "syscall",
- "syscall.RTA_DST": "syscall",
- "syscall.RTA_FLOW": "syscall",
- "syscall.RTA_GATEWAY": "syscall",
- "syscall.RTA_GENMASK": "syscall",
- "syscall.RTA_IFA": "syscall",
- "syscall.RTA_IFP": "syscall",
- "syscall.RTA_IIF": "syscall",
- "syscall.RTA_LABEL": "syscall",
- "syscall.RTA_MAX": "syscall",
- "syscall.RTA_METRICS": "syscall",
- "syscall.RTA_MULTIPATH": "syscall",
- "syscall.RTA_NETMASK": "syscall",
- "syscall.RTA_OIF": "syscall",
- "syscall.RTA_PREFSRC": "syscall",
- "syscall.RTA_PRIORITY": "syscall",
- "syscall.RTA_SRC": "syscall",
- "syscall.RTA_SRCMASK": "syscall",
- "syscall.RTA_TABLE": "syscall",
- "syscall.RTA_TAG": "syscall",
- "syscall.RTA_UNSPEC": "syscall",
- "syscall.RTCF_DIRECTSRC": "syscall",
- "syscall.RTCF_DOREDIRECT": "syscall",
- "syscall.RTCF_LOG": "syscall",
- "syscall.RTCF_MASQ": "syscall",
- "syscall.RTCF_NAT": "syscall",
- "syscall.RTCF_VALVE": "syscall",
- "syscall.RTF_ADDRCLASSMASK": "syscall",
- "syscall.RTF_ADDRCONF": "syscall",
- "syscall.RTF_ALLONLINK": "syscall",
- "syscall.RTF_ANNOUNCE": "syscall",
- "syscall.RTF_BLACKHOLE": "syscall",
- "syscall.RTF_BROADCAST": "syscall",
- "syscall.RTF_CACHE": "syscall",
- "syscall.RTF_CLONED": "syscall",
- "syscall.RTF_CLONING": "syscall",
- "syscall.RTF_CONDEMNED": "syscall",
- "syscall.RTF_DEFAULT": "syscall",
- "syscall.RTF_DELCLONE": "syscall",
- "syscall.RTF_DONE": "syscall",
- "syscall.RTF_DYNAMIC": "syscall",
- "syscall.RTF_FLOW": "syscall",
- "syscall.RTF_FMASK": "syscall",
- "syscall.RTF_GATEWAY": "syscall",
- "syscall.RTF_GWFLAG_COMPAT": "syscall",
- "syscall.RTF_HOST": "syscall",
- "syscall.RTF_IFREF": "syscall",
- "syscall.RTF_IFSCOPE": "syscall",
- "syscall.RTF_INTERFACE": "syscall",
- "syscall.RTF_IRTT": "syscall",
- "syscall.RTF_LINKRT": "syscall",
- "syscall.RTF_LLDATA": "syscall",
- "syscall.RTF_LLINFO": "syscall",
- "syscall.RTF_LOCAL": "syscall",
- "syscall.RTF_MASK": "syscall",
- "syscall.RTF_MODIFIED": "syscall",
- "syscall.RTF_MPATH": "syscall",
- "syscall.RTF_MPLS": "syscall",
- "syscall.RTF_MSS": "syscall",
- "syscall.RTF_MTU": "syscall",
- "syscall.RTF_MULTICAST": "syscall",
- "syscall.RTF_NAT": "syscall",
- "syscall.RTF_NOFORWARD": "syscall",
- "syscall.RTF_NONEXTHOP": "syscall",
- "syscall.RTF_NOPMTUDISC": "syscall",
- "syscall.RTF_PERMANENT_ARP": "syscall",
- "syscall.RTF_PINNED": "syscall",
- "syscall.RTF_POLICY": "syscall",
- "syscall.RTF_PRCLONING": "syscall",
- "syscall.RTF_PROTO1": "syscall",
- "syscall.RTF_PROTO2": "syscall",
- "syscall.RTF_PROTO3": "syscall",
- "syscall.RTF_REINSTATE": "syscall",
- "syscall.RTF_REJECT": "syscall",
- "syscall.RTF_RNH_LOCKED": "syscall",
- "syscall.RTF_SOURCE": "syscall",
- "syscall.RTF_SRC": "syscall",
- "syscall.RTF_STATIC": "syscall",
- "syscall.RTF_STICKY": "syscall",
- "syscall.RTF_THROW": "syscall",
- "syscall.RTF_TUNNEL": "syscall",
- "syscall.RTF_UP": "syscall",
- "syscall.RTF_USETRAILERS": "syscall",
- "syscall.RTF_WASCLONED": "syscall",
- "syscall.RTF_WINDOW": "syscall",
- "syscall.RTF_XRESOLVE": "syscall",
- "syscall.RTM_ADD": "syscall",
- "syscall.RTM_BASE": "syscall",
- "syscall.RTM_CHANGE": "syscall",
- "syscall.RTM_CHGADDR": "syscall",
- "syscall.RTM_DELACTION": "syscall",
- "syscall.RTM_DELADDR": "syscall",
- "syscall.RTM_DELADDRLABEL": "syscall",
- "syscall.RTM_DELETE": "syscall",
- "syscall.RTM_DELLINK": "syscall",
- "syscall.RTM_DELMADDR": "syscall",
- "syscall.RTM_DELNEIGH": "syscall",
- "syscall.RTM_DELQDISC": "syscall",
- "syscall.RTM_DELROUTE": "syscall",
- "syscall.RTM_DELRULE": "syscall",
- "syscall.RTM_DELTCLASS": "syscall",
- "syscall.RTM_DELTFILTER": "syscall",
- "syscall.RTM_DESYNC": "syscall",
- "syscall.RTM_F_CLONED": "syscall",
- "syscall.RTM_F_EQUALIZE": "syscall",
- "syscall.RTM_F_NOTIFY": "syscall",
- "syscall.RTM_F_PREFIX": "syscall",
- "syscall.RTM_GET": "syscall",
- "syscall.RTM_GET2": "syscall",
- "syscall.RTM_GETACTION": "syscall",
- "syscall.RTM_GETADDR": "syscall",
- "syscall.RTM_GETADDRLABEL": "syscall",
- "syscall.RTM_GETANYCAST": "syscall",
- "syscall.RTM_GETDCB": "syscall",
- "syscall.RTM_GETLINK": "syscall",
- "syscall.RTM_GETMULTICAST": "syscall",
- "syscall.RTM_GETNEIGH": "syscall",
- "syscall.RTM_GETNEIGHTBL": "syscall",
- "syscall.RTM_GETQDISC": "syscall",
- "syscall.RTM_GETROUTE": "syscall",
- "syscall.RTM_GETRULE": "syscall",
- "syscall.RTM_GETTCLASS": "syscall",
- "syscall.RTM_GETTFILTER": "syscall",
- "syscall.RTM_IEEE80211": "syscall",
- "syscall.RTM_IFANNOUNCE": "syscall",
- "syscall.RTM_IFINFO": "syscall",
- "syscall.RTM_IFINFO2": "syscall",
- "syscall.RTM_LLINFO_UPD": "syscall",
- "syscall.RTM_LOCK": "syscall",
- "syscall.RTM_LOSING": "syscall",
- "syscall.RTM_MAX": "syscall",
- "syscall.RTM_MAXSIZE": "syscall",
- "syscall.RTM_MISS": "syscall",
- "syscall.RTM_NEWACTION": "syscall",
- "syscall.RTM_NEWADDR": "syscall",
- "syscall.RTM_NEWADDRLABEL": "syscall",
- "syscall.RTM_NEWLINK": "syscall",
- "syscall.RTM_NEWMADDR": "syscall",
- "syscall.RTM_NEWMADDR2": "syscall",
- "syscall.RTM_NEWNDUSEROPT": "syscall",
- "syscall.RTM_NEWNEIGH": "syscall",
- "syscall.RTM_NEWNEIGHTBL": "syscall",
- "syscall.RTM_NEWPREFIX": "syscall",
- "syscall.RTM_NEWQDISC": "syscall",
- "syscall.RTM_NEWROUTE": "syscall",
- "syscall.RTM_NEWRULE": "syscall",
- "syscall.RTM_NEWTCLASS": "syscall",
- "syscall.RTM_NEWTFILTER": "syscall",
- "syscall.RTM_NR_FAMILIES": "syscall",
- "syscall.RTM_NR_MSGTYPES": "syscall",
- "syscall.RTM_OIFINFO": "syscall",
- "syscall.RTM_OLDADD": "syscall",
- "syscall.RTM_OLDDEL": "syscall",
- "syscall.RTM_OOIFINFO": "syscall",
- "syscall.RTM_REDIRECT": "syscall",
- "syscall.RTM_RESOLVE": "syscall",
- "syscall.RTM_RTTUNIT": "syscall",
- "syscall.RTM_SETDCB": "syscall",
- "syscall.RTM_SETGATE": "syscall",
- "syscall.RTM_SETLINK": "syscall",
- "syscall.RTM_SETNEIGHTBL": "syscall",
- "syscall.RTM_VERSION": "syscall",
- "syscall.RTNH_ALIGNTO": "syscall",
- "syscall.RTNH_F_DEAD": "syscall",
- "syscall.RTNH_F_ONLINK": "syscall",
- "syscall.RTNH_F_PERVASIVE": "syscall",
- "syscall.RTNLGRP_IPV4_IFADDR": "syscall",
- "syscall.RTNLGRP_IPV4_MROUTE": "syscall",
- "syscall.RTNLGRP_IPV4_ROUTE": "syscall",
- "syscall.RTNLGRP_IPV4_RULE": "syscall",
- "syscall.RTNLGRP_IPV6_IFADDR": "syscall",
- "syscall.RTNLGRP_IPV6_IFINFO": "syscall",
- "syscall.RTNLGRP_IPV6_MROUTE": "syscall",
- "syscall.RTNLGRP_IPV6_PREFIX": "syscall",
- "syscall.RTNLGRP_IPV6_ROUTE": "syscall",
- "syscall.RTNLGRP_IPV6_RULE": "syscall",
- "syscall.RTNLGRP_LINK": "syscall",
- "syscall.RTNLGRP_ND_USEROPT": "syscall",
- "syscall.RTNLGRP_NEIGH": "syscall",
- "syscall.RTNLGRP_NONE": "syscall",
- "syscall.RTNLGRP_NOTIFY": "syscall",
- "syscall.RTNLGRP_TC": "syscall",
- "syscall.RTN_ANYCAST": "syscall",
- "syscall.RTN_BLACKHOLE": "syscall",
- "syscall.RTN_BROADCAST": "syscall",
- "syscall.RTN_LOCAL": "syscall",
- "syscall.RTN_MAX": "syscall",
- "syscall.RTN_MULTICAST": "syscall",
- "syscall.RTN_NAT": "syscall",
- "syscall.RTN_PROHIBIT": "syscall",
- "syscall.RTN_THROW": "syscall",
- "syscall.RTN_UNICAST": "syscall",
- "syscall.RTN_UNREACHABLE": "syscall",
- "syscall.RTN_UNSPEC": "syscall",
- "syscall.RTN_XRESOLVE": "syscall",
- "syscall.RTPROT_BIRD": "syscall",
- "syscall.RTPROT_BOOT": "syscall",
- "syscall.RTPROT_DHCP": "syscall",
- "syscall.RTPROT_DNROUTED": "syscall",
- "syscall.RTPROT_GATED": "syscall",
- "syscall.RTPROT_KERNEL": "syscall",
- "syscall.RTPROT_MRT": "syscall",
- "syscall.RTPROT_NTK": "syscall",
- "syscall.RTPROT_RA": "syscall",
- "syscall.RTPROT_REDIRECT": "syscall",
- "syscall.RTPROT_STATIC": "syscall",
- "syscall.RTPROT_UNSPEC": "syscall",
- "syscall.RTPROT_XORP": "syscall",
- "syscall.RTPROT_ZEBRA": "syscall",
- "syscall.RTV_EXPIRE": "syscall",
- "syscall.RTV_HOPCOUNT": "syscall",
- "syscall.RTV_MTU": "syscall",
- "syscall.RTV_RPIPE": "syscall",
- "syscall.RTV_RTT": "syscall",
- "syscall.RTV_RTTVAR": "syscall",
- "syscall.RTV_SPIPE": "syscall",
- "syscall.RTV_SSTHRESH": "syscall",
- "syscall.RTV_WEIGHT": "syscall",
- "syscall.RT_CACHING_CONTEXT": "syscall",
- "syscall.RT_CLASS_DEFAULT": "syscall",
- "syscall.RT_CLASS_LOCAL": "syscall",
- "syscall.RT_CLASS_MAIN": "syscall",
- "syscall.RT_CLASS_MAX": "syscall",
- "syscall.RT_CLASS_UNSPEC": "syscall",
- "syscall.RT_DEFAULT_FIB": "syscall",
- "syscall.RT_NORTREF": "syscall",
- "syscall.RT_SCOPE_HOST": "syscall",
- "syscall.RT_SCOPE_LINK": "syscall",
- "syscall.RT_SCOPE_NOWHERE": "syscall",
- "syscall.RT_SCOPE_SITE": "syscall",
- "syscall.RT_SCOPE_UNIVERSE": "syscall",
- "syscall.RT_TABLEID_MAX": "syscall",
- "syscall.RT_TABLE_COMPAT": "syscall",
- "syscall.RT_TABLE_DEFAULT": "syscall",
- "syscall.RT_TABLE_LOCAL": "syscall",
- "syscall.RT_TABLE_MAIN": "syscall",
- "syscall.RT_TABLE_MAX": "syscall",
- "syscall.RT_TABLE_UNSPEC": "syscall",
- "syscall.RUSAGE_CHILDREN": "syscall",
- "syscall.RUSAGE_SELF": "syscall",
- "syscall.RUSAGE_THREAD": "syscall",
- "syscall.Radvisory_t": "syscall",
- "syscall.RawConn": "syscall",
- "syscall.RawSockaddr": "syscall",
- "syscall.RawSockaddrAny": "syscall",
- "syscall.RawSockaddrDatalink": "syscall",
- "syscall.RawSockaddrInet4": "syscall",
- "syscall.RawSockaddrInet6": "syscall",
- "syscall.RawSockaddrLinklayer": "syscall",
- "syscall.RawSockaddrNetlink": "syscall",
- "syscall.RawSockaddrUnix": "syscall",
- "syscall.RawSyscall": "syscall",
- "syscall.RawSyscall6": "syscall",
- "syscall.Read": "syscall",
- "syscall.ReadConsole": "syscall",
- "syscall.ReadDirectoryChanges": "syscall",
- "syscall.ReadDirent": "syscall",
- "syscall.ReadFile": "syscall",
- "syscall.Readlink": "syscall",
- "syscall.Reboot": "syscall",
- "syscall.Recvfrom": "syscall",
- "syscall.Recvmsg": "syscall",
- "syscall.RegCloseKey": "syscall",
- "syscall.RegEnumKeyEx": "syscall",
- "syscall.RegOpenKeyEx": "syscall",
- "syscall.RegQueryInfoKey": "syscall",
- "syscall.RegQueryValueEx": "syscall",
- "syscall.RemoveDirectory": "syscall",
- "syscall.Removexattr": "syscall",
- "syscall.Rename": "syscall",
- "syscall.Renameat": "syscall",
- "syscall.Revoke": "syscall",
- "syscall.Rlimit": "syscall",
- "syscall.Rmdir": "syscall",
- "syscall.RouteMessage": "syscall",
- "syscall.RouteRIB": "syscall",
- "syscall.RtAttr": "syscall",
- "syscall.RtGenmsg": "syscall",
- "syscall.RtMetrics": "syscall",
- "syscall.RtMsg": "syscall",
- "syscall.RtMsghdr": "syscall",
- "syscall.RtNexthop": "syscall",
- "syscall.Rusage": "syscall",
- "syscall.SCM_BINTIME": "syscall",
- "syscall.SCM_CREDENTIALS": "syscall",
- "syscall.SCM_CREDS": "syscall",
- "syscall.SCM_RIGHTS": "syscall",
- "syscall.SCM_TIMESTAMP": "syscall",
- "syscall.SCM_TIMESTAMPING": "syscall",
- "syscall.SCM_TIMESTAMPNS": "syscall",
- "syscall.SCM_TIMESTAMP_MONOTONIC": "syscall",
- "syscall.SHUT_RD": "syscall",
- "syscall.SHUT_RDWR": "syscall",
- "syscall.SHUT_WR": "syscall",
- "syscall.SID": "syscall",
- "syscall.SIDAndAttributes": "syscall",
- "syscall.SIGABRT": "syscall",
- "syscall.SIGALRM": "syscall",
- "syscall.SIGBUS": "syscall",
- "syscall.SIGCHLD": "syscall",
- "syscall.SIGCLD": "syscall",
- "syscall.SIGCONT": "syscall",
- "syscall.SIGEMT": "syscall",
- "syscall.SIGFPE": "syscall",
- "syscall.SIGHUP": "syscall",
- "syscall.SIGILL": "syscall",
- "syscall.SIGINFO": "syscall",
- "syscall.SIGINT": "syscall",
- "syscall.SIGIO": "syscall",
- "syscall.SIGIOT": "syscall",
- "syscall.SIGKILL": "syscall",
- "syscall.SIGLIBRT": "syscall",
- "syscall.SIGLWP": "syscall",
- "syscall.SIGPIPE": "syscall",
- "syscall.SIGPOLL": "syscall",
- "syscall.SIGPROF": "syscall",
- "syscall.SIGPWR": "syscall",
- "syscall.SIGQUIT": "syscall",
- "syscall.SIGSEGV": "syscall",
- "syscall.SIGSTKFLT": "syscall",
- "syscall.SIGSTOP": "syscall",
- "syscall.SIGSYS": "syscall",
- "syscall.SIGTERM": "syscall",
- "syscall.SIGTHR": "syscall",
- "syscall.SIGTRAP": "syscall",
- "syscall.SIGTSTP": "syscall",
- "syscall.SIGTTIN": "syscall",
- "syscall.SIGTTOU": "syscall",
- "syscall.SIGUNUSED": "syscall",
- "syscall.SIGURG": "syscall",
- "syscall.SIGUSR1": "syscall",
- "syscall.SIGUSR2": "syscall",
- "syscall.SIGVTALRM": "syscall",
- "syscall.SIGWINCH": "syscall",
- "syscall.SIGXCPU": "syscall",
- "syscall.SIGXFSZ": "syscall",
- "syscall.SIOCADDDLCI": "syscall",
- "syscall.SIOCADDMULTI": "syscall",
- "syscall.SIOCADDRT": "syscall",
- "syscall.SIOCAIFADDR": "syscall",
- "syscall.SIOCAIFGROUP": "syscall",
- "syscall.SIOCALIFADDR": "syscall",
- "syscall.SIOCARPIPLL": "syscall",
- "syscall.SIOCATMARK": "syscall",
- "syscall.SIOCAUTOADDR": "syscall",
- "syscall.SIOCAUTONETMASK": "syscall",
- "syscall.SIOCBRDGADD": "syscall",
- "syscall.SIOCBRDGADDS": "syscall",
- "syscall.SIOCBRDGARL": "syscall",
- "syscall.SIOCBRDGDADDR": "syscall",
- "syscall.SIOCBRDGDEL": "syscall",
- "syscall.SIOCBRDGDELS": "syscall",
- "syscall.SIOCBRDGFLUSH": "syscall",
- "syscall.SIOCBRDGFRL": "syscall",
- "syscall.SIOCBRDGGCACHE": "syscall",
- "syscall.SIOCBRDGGFD": "syscall",
- "syscall.SIOCBRDGGHT": "syscall",
- "syscall.SIOCBRDGGIFFLGS": "syscall",
- "syscall.SIOCBRDGGMA": "syscall",
- "syscall.SIOCBRDGGPARAM": "syscall",
- "syscall.SIOCBRDGGPRI": "syscall",
- "syscall.SIOCBRDGGRL": "syscall",
- "syscall.SIOCBRDGGSIFS": "syscall",
- "syscall.SIOCBRDGGTO": "syscall",
- "syscall.SIOCBRDGIFS": "syscall",
- "syscall.SIOCBRDGRTS": "syscall",
- "syscall.SIOCBRDGSADDR": "syscall",
- "syscall.SIOCBRDGSCACHE": "syscall",
- "syscall.SIOCBRDGSFD": "syscall",
- "syscall.SIOCBRDGSHT": "syscall",
- "syscall.SIOCBRDGSIFCOST": "syscall",
- "syscall.SIOCBRDGSIFFLGS": "syscall",
- "syscall.SIOCBRDGSIFPRIO": "syscall",
- "syscall.SIOCBRDGSMA": "syscall",
- "syscall.SIOCBRDGSPRI": "syscall",
- "syscall.SIOCBRDGSPROTO": "syscall",
- "syscall.SIOCBRDGSTO": "syscall",
- "syscall.SIOCBRDGSTXHC": "syscall",
- "syscall.SIOCDARP": "syscall",
- "syscall.SIOCDELDLCI": "syscall",
- "syscall.SIOCDELMULTI": "syscall",
- "syscall.SIOCDELRT": "syscall",
- "syscall.SIOCDEVPRIVATE": "syscall",
- "syscall.SIOCDIFADDR": "syscall",
- "syscall.SIOCDIFGROUP": "syscall",
- "syscall.SIOCDIFPHYADDR": "syscall",
- "syscall.SIOCDLIFADDR": "syscall",
- "syscall.SIOCDRARP": "syscall",
- "syscall.SIOCGARP": "syscall",
- "syscall.SIOCGDRVSPEC": "syscall",
- "syscall.SIOCGETKALIVE": "syscall",
- "syscall.SIOCGETLABEL": "syscall",
- "syscall.SIOCGETPFLOW": "syscall",
- "syscall.SIOCGETPFSYNC": "syscall",
- "syscall.SIOCGETSGCNT": "syscall",
- "syscall.SIOCGETVIFCNT": "syscall",
- "syscall.SIOCGETVLAN": "syscall",
- "syscall.SIOCGHIWAT": "syscall",
- "syscall.SIOCGIFADDR": "syscall",
- "syscall.SIOCGIFADDRPREF": "syscall",
- "syscall.SIOCGIFALIAS": "syscall",
- "syscall.SIOCGIFALTMTU": "syscall",
- "syscall.SIOCGIFASYNCMAP": "syscall",
- "syscall.SIOCGIFBOND": "syscall",
- "syscall.SIOCGIFBR": "syscall",
- "syscall.SIOCGIFBRDADDR": "syscall",
- "syscall.SIOCGIFCAP": "syscall",
- "syscall.SIOCGIFCONF": "syscall",
- "syscall.SIOCGIFCOUNT": "syscall",
- "syscall.SIOCGIFDATA": "syscall",
- "syscall.SIOCGIFDESCR": "syscall",
- "syscall.SIOCGIFDEVMTU": "syscall",
- "syscall.SIOCGIFDLT": "syscall",
- "syscall.SIOCGIFDSTADDR": "syscall",
- "syscall.SIOCGIFENCAP": "syscall",
- "syscall.SIOCGIFFIB": "syscall",
- "syscall.SIOCGIFFLAGS": "syscall",
- "syscall.SIOCGIFGATTR": "syscall",
- "syscall.SIOCGIFGENERIC": "syscall",
- "syscall.SIOCGIFGMEMB": "syscall",
- "syscall.SIOCGIFGROUP": "syscall",
- "syscall.SIOCGIFHARDMTU": "syscall",
- "syscall.SIOCGIFHWADDR": "syscall",
- "syscall.SIOCGIFINDEX": "syscall",
- "syscall.SIOCGIFKPI": "syscall",
- "syscall.SIOCGIFMAC": "syscall",
- "syscall.SIOCGIFMAP": "syscall",
- "syscall.SIOCGIFMEDIA": "syscall",
- "syscall.SIOCGIFMEM": "syscall",
- "syscall.SIOCGIFMETRIC": "syscall",
- "syscall.SIOCGIFMTU": "syscall",
- "syscall.SIOCGIFNAME": "syscall",
- "syscall.SIOCGIFNETMASK": "syscall",
- "syscall.SIOCGIFPDSTADDR": "syscall",
- "syscall.SIOCGIFPFLAGS": "syscall",
- "syscall.SIOCGIFPHYS": "syscall",
- "syscall.SIOCGIFPRIORITY": "syscall",
- "syscall.SIOCGIFPSRCADDR": "syscall",
- "syscall.SIOCGIFRDOMAIN": "syscall",
- "syscall.SIOCGIFRTLABEL": "syscall",
- "syscall.SIOCGIFSLAVE": "syscall",
- "syscall.SIOCGIFSTATUS": "syscall",
- "syscall.SIOCGIFTIMESLOT": "syscall",
- "syscall.SIOCGIFTXQLEN": "syscall",
- "syscall.SIOCGIFVLAN": "syscall",
- "syscall.SIOCGIFWAKEFLAGS": "syscall",
- "syscall.SIOCGIFXFLAGS": "syscall",
- "syscall.SIOCGLIFADDR": "syscall",
- "syscall.SIOCGLIFPHYADDR": "syscall",
- "syscall.SIOCGLIFPHYRTABLE": "syscall",
- "syscall.SIOCGLIFPHYTTL": "syscall",
- "syscall.SIOCGLINKSTR": "syscall",
- "syscall.SIOCGLOWAT": "syscall",
- "syscall.SIOCGPGRP": "syscall",
- "syscall.SIOCGPRIVATE_0": "syscall",
- "syscall.SIOCGPRIVATE_1": "syscall",
- "syscall.SIOCGRARP": "syscall",
- "syscall.SIOCGSPPPPARAMS": "syscall",
- "syscall.SIOCGSTAMP": "syscall",
- "syscall.SIOCGSTAMPNS": "syscall",
- "syscall.SIOCGVH": "syscall",
- "syscall.SIOCGVNETID": "syscall",
- "syscall.SIOCIFCREATE": "syscall",
- "syscall.SIOCIFCREATE2": "syscall",
- "syscall.SIOCIFDESTROY": "syscall",
- "syscall.SIOCIFGCLONERS": "syscall",
- "syscall.SIOCINITIFADDR": "syscall",
- "syscall.SIOCPROTOPRIVATE": "syscall",
- "syscall.SIOCRSLVMULTI": "syscall",
- "syscall.SIOCRTMSG": "syscall",
- "syscall.SIOCSARP": "syscall",
- "syscall.SIOCSDRVSPEC": "syscall",
- "syscall.SIOCSETKALIVE": "syscall",
- "syscall.SIOCSETLABEL": "syscall",
- "syscall.SIOCSETPFLOW": "syscall",
- "syscall.SIOCSETPFSYNC": "syscall",
- "syscall.SIOCSETVLAN": "syscall",
- "syscall.SIOCSHIWAT": "syscall",
- "syscall.SIOCSIFADDR": "syscall",
- "syscall.SIOCSIFADDRPREF": "syscall",
- "syscall.SIOCSIFALTMTU": "syscall",
- "syscall.SIOCSIFASYNCMAP": "syscall",
- "syscall.SIOCSIFBOND": "syscall",
- "syscall.SIOCSIFBR": "syscall",
- "syscall.SIOCSIFBRDADDR": "syscall",
- "syscall.SIOCSIFCAP": "syscall",
- "syscall.SIOCSIFDESCR": "syscall",
- "syscall.SIOCSIFDSTADDR": "syscall",
- "syscall.SIOCSIFENCAP": "syscall",
- "syscall.SIOCSIFFIB": "syscall",
- "syscall.SIOCSIFFLAGS": "syscall",
- "syscall.SIOCSIFGATTR": "syscall",
- "syscall.SIOCSIFGENERIC": "syscall",
- "syscall.SIOCSIFHWADDR": "syscall",
- "syscall.SIOCSIFHWBROADCAST": "syscall",
- "syscall.SIOCSIFKPI": "syscall",
- "syscall.SIOCSIFLINK": "syscall",
- "syscall.SIOCSIFLLADDR": "syscall",
- "syscall.SIOCSIFMAC": "syscall",
- "syscall.SIOCSIFMAP": "syscall",
- "syscall.SIOCSIFMEDIA": "syscall",
- "syscall.SIOCSIFMEM": "syscall",
- "syscall.SIOCSIFMETRIC": "syscall",
- "syscall.SIOCSIFMTU": "syscall",
- "syscall.SIOCSIFNAME": "syscall",
- "syscall.SIOCSIFNETMASK": "syscall",
- "syscall.SIOCSIFPFLAGS": "syscall",
- "syscall.SIOCSIFPHYADDR": "syscall",
- "syscall.SIOCSIFPHYS": "syscall",
- "syscall.SIOCSIFPRIORITY": "syscall",
- "syscall.SIOCSIFRDOMAIN": "syscall",
- "syscall.SIOCSIFRTLABEL": "syscall",
- "syscall.SIOCSIFRVNET": "syscall",
- "syscall.SIOCSIFSLAVE": "syscall",
- "syscall.SIOCSIFTIMESLOT": "syscall",
- "syscall.SIOCSIFTXQLEN": "syscall",
- "syscall.SIOCSIFVLAN": "syscall",
- "syscall.SIOCSIFVNET": "syscall",
- "syscall.SIOCSIFXFLAGS": "syscall",
- "syscall.SIOCSLIFPHYADDR": "syscall",
- "syscall.SIOCSLIFPHYRTABLE": "syscall",
- "syscall.SIOCSLIFPHYTTL": "syscall",
- "syscall.SIOCSLINKSTR": "syscall",
- "syscall.SIOCSLOWAT": "syscall",
- "syscall.SIOCSPGRP": "syscall",
- "syscall.SIOCSRARP": "syscall",
- "syscall.SIOCSSPPPPARAMS": "syscall",
- "syscall.SIOCSVH": "syscall",
- "syscall.SIOCSVNETID": "syscall",
- "syscall.SIOCZIFDATA": "syscall",
- "syscall.SIO_GET_EXTENSION_FUNCTION_POINTER": "syscall",
- "syscall.SIO_GET_INTERFACE_LIST": "syscall",
- "syscall.SIO_KEEPALIVE_VALS": "syscall",
- "syscall.SIO_UDP_CONNRESET": "syscall",
- "syscall.SOCK_CLOEXEC": "syscall",
- "syscall.SOCK_DCCP": "syscall",
- "syscall.SOCK_DGRAM": "syscall",
- "syscall.SOCK_FLAGS_MASK": "syscall",
- "syscall.SOCK_MAXADDRLEN": "syscall",
- "syscall.SOCK_NONBLOCK": "syscall",
- "syscall.SOCK_NOSIGPIPE": "syscall",
- "syscall.SOCK_PACKET": "syscall",
- "syscall.SOCK_RAW": "syscall",
- "syscall.SOCK_RDM": "syscall",
- "syscall.SOCK_SEQPACKET": "syscall",
- "syscall.SOCK_STREAM": "syscall",
- "syscall.SOL_AAL": "syscall",
- "syscall.SOL_ATM": "syscall",
- "syscall.SOL_DECNET": "syscall",
- "syscall.SOL_ICMPV6": "syscall",
- "syscall.SOL_IP": "syscall",
- "syscall.SOL_IPV6": "syscall",
- "syscall.SOL_IRDA": "syscall",
- "syscall.SOL_PACKET": "syscall",
- "syscall.SOL_RAW": "syscall",
- "syscall.SOL_SOCKET": "syscall",
- "syscall.SOL_TCP": "syscall",
- "syscall.SOL_X25": "syscall",
- "syscall.SOMAXCONN": "syscall",
- "syscall.SO_ACCEPTCONN": "syscall",
- "syscall.SO_ACCEPTFILTER": "syscall",
- "syscall.SO_ATTACH_FILTER": "syscall",
- "syscall.SO_BINDANY": "syscall",
- "syscall.SO_BINDTODEVICE": "syscall",
- "syscall.SO_BINTIME": "syscall",
- "syscall.SO_BROADCAST": "syscall",
- "syscall.SO_BSDCOMPAT": "syscall",
- "syscall.SO_DEBUG": "syscall",
- "syscall.SO_DETACH_FILTER": "syscall",
- "syscall.SO_DOMAIN": "syscall",
- "syscall.SO_DONTROUTE": "syscall",
- "syscall.SO_DONTTRUNC": "syscall",
- "syscall.SO_ERROR": "syscall",
- "syscall.SO_KEEPALIVE": "syscall",
- "syscall.SO_LABEL": "syscall",
- "syscall.SO_LINGER": "syscall",
- "syscall.SO_LINGER_SEC": "syscall",
- "syscall.SO_LISTENINCQLEN": "syscall",
- "syscall.SO_LISTENQLEN": "syscall",
- "syscall.SO_LISTENQLIMIT": "syscall",
- "syscall.SO_MARK": "syscall",
- "syscall.SO_NETPROC": "syscall",
- "syscall.SO_NKE": "syscall",
- "syscall.SO_NOADDRERR": "syscall",
- "syscall.SO_NOHEADER": "syscall",
- "syscall.SO_NOSIGPIPE": "syscall",
- "syscall.SO_NOTIFYCONFLICT": "syscall",
- "syscall.SO_NO_CHECK": "syscall",
- "syscall.SO_NO_DDP": "syscall",
- "syscall.SO_NO_OFFLOAD": "syscall",
- "syscall.SO_NP_EXTENSIONS": "syscall",
- "syscall.SO_NREAD": "syscall",
- "syscall.SO_NWRITE": "syscall",
- "syscall.SO_OOBINLINE": "syscall",
- "syscall.SO_OVERFLOWED": "syscall",
- "syscall.SO_PASSCRED": "syscall",
- "syscall.SO_PASSSEC": "syscall",
- "syscall.SO_PEERCRED": "syscall",
- "syscall.SO_PEERLABEL": "syscall",
- "syscall.SO_PEERNAME": "syscall",
- "syscall.SO_PEERSEC": "syscall",
- "syscall.SO_PRIORITY": "syscall",
- "syscall.SO_PROTOCOL": "syscall",
- "syscall.SO_PROTOTYPE": "syscall",
- "syscall.SO_RANDOMPORT": "syscall",
- "syscall.SO_RCVBUF": "syscall",
- "syscall.SO_RCVBUFFORCE": "syscall",
- "syscall.SO_RCVLOWAT": "syscall",
- "syscall.SO_RCVTIMEO": "syscall",
- "syscall.SO_RESTRICTIONS": "syscall",
- "syscall.SO_RESTRICT_DENYIN": "syscall",
- "syscall.SO_RESTRICT_DENYOUT": "syscall",
- "syscall.SO_RESTRICT_DENYSET": "syscall",
- "syscall.SO_REUSEADDR": "syscall",
- "syscall.SO_REUSEPORT": "syscall",
- "syscall.SO_REUSESHAREUID": "syscall",
- "syscall.SO_RTABLE": "syscall",
- "syscall.SO_RXQ_OVFL": "syscall",
- "syscall.SO_SECURITY_AUTHENTICATION": "syscall",
- "syscall.SO_SECURITY_ENCRYPTION_NETWORK": "syscall",
- "syscall.SO_SECURITY_ENCRYPTION_TRANSPORT": "syscall",
- "syscall.SO_SETFIB": "syscall",
- "syscall.SO_SNDBUF": "syscall",
- "syscall.SO_SNDBUFFORCE": "syscall",
- "syscall.SO_SNDLOWAT": "syscall",
- "syscall.SO_SNDTIMEO": "syscall",
- "syscall.SO_SPLICE": "syscall",
- "syscall.SO_TIMESTAMP": "syscall",
- "syscall.SO_TIMESTAMPING": "syscall",
- "syscall.SO_TIMESTAMPNS": "syscall",
- "syscall.SO_TIMESTAMP_MONOTONIC": "syscall",
- "syscall.SO_TYPE": "syscall",
- "syscall.SO_UPCALLCLOSEWAIT": "syscall",
- "syscall.SO_UPDATE_ACCEPT_CONTEXT": "syscall",
- "syscall.SO_UPDATE_CONNECT_CONTEXT": "syscall",
- "syscall.SO_USELOOPBACK": "syscall",
- "syscall.SO_USER_COOKIE": "syscall",
- "syscall.SO_VENDOR": "syscall",
- "syscall.SO_WANTMORE": "syscall",
- "syscall.SO_WANTOOBFLAG": "syscall",
- "syscall.SSLExtraCertChainPolicyPara": "syscall",
- "syscall.STANDARD_RIGHTS_ALL": "syscall",
- "syscall.STANDARD_RIGHTS_EXECUTE": "syscall",
- "syscall.STANDARD_RIGHTS_READ": "syscall",
- "syscall.STANDARD_RIGHTS_REQUIRED": "syscall",
- "syscall.STANDARD_RIGHTS_WRITE": "syscall",
- "syscall.STARTF_USESHOWWINDOW": "syscall",
- "syscall.STARTF_USESTDHANDLES": "syscall",
- "syscall.STD_ERROR_HANDLE": "syscall",
- "syscall.STD_INPUT_HANDLE": "syscall",
- "syscall.STD_OUTPUT_HANDLE": "syscall",
- "syscall.SUBLANG_ENGLISH_US": "syscall",
- "syscall.SW_FORCEMINIMIZE": "syscall",
- "syscall.SW_HIDE": "syscall",
- "syscall.SW_MAXIMIZE": "syscall",
- "syscall.SW_MINIMIZE": "syscall",
- "syscall.SW_NORMAL": "syscall",
- "syscall.SW_RESTORE": "syscall",
- "syscall.SW_SHOW": "syscall",
- "syscall.SW_SHOWDEFAULT": "syscall",
- "syscall.SW_SHOWMAXIMIZED": "syscall",
- "syscall.SW_SHOWMINIMIZED": "syscall",
- "syscall.SW_SHOWMINNOACTIVE": "syscall",
- "syscall.SW_SHOWNA": "syscall",
- "syscall.SW_SHOWNOACTIVATE": "syscall",
- "syscall.SW_SHOWNORMAL": "syscall",
- "syscall.SYMBOLIC_LINK_FLAG_DIRECTORY": "syscall",
- "syscall.SYNCHRONIZE": "syscall",
- "syscall.SYSCTL_VERSION": "syscall",
- "syscall.SYSCTL_VERS_0": "syscall",
- "syscall.SYSCTL_VERS_1": "syscall",
- "syscall.SYSCTL_VERS_MASK": "syscall",
- "syscall.SYS_ABORT2": "syscall",
- "syscall.SYS_ACCEPT": "syscall",
- "syscall.SYS_ACCEPT4": "syscall",
- "syscall.SYS_ACCEPT_NOCANCEL": "syscall",
- "syscall.SYS_ACCESS": "syscall",
- "syscall.SYS_ACCESS_EXTENDED": "syscall",
- "syscall.SYS_ACCT": "syscall",
- "syscall.SYS_ADD_KEY": "syscall",
- "syscall.SYS_ADD_PROFIL": "syscall",
- "syscall.SYS_ADJFREQ": "syscall",
- "syscall.SYS_ADJTIME": "syscall",
- "syscall.SYS_ADJTIMEX": "syscall",
- "syscall.SYS_AFS_SYSCALL": "syscall",
- "syscall.SYS_AIO_CANCEL": "syscall",
- "syscall.SYS_AIO_ERROR": "syscall",
- "syscall.SYS_AIO_FSYNC": "syscall",
- "syscall.SYS_AIO_READ": "syscall",
- "syscall.SYS_AIO_RETURN": "syscall",
- "syscall.SYS_AIO_SUSPEND": "syscall",
- "syscall.SYS_AIO_SUSPEND_NOCANCEL": "syscall",
- "syscall.SYS_AIO_WRITE": "syscall",
- "syscall.SYS_ALARM": "syscall",
- "syscall.SYS_ARCH_PRCTL": "syscall",
- "syscall.SYS_ARM_FADVISE64_64": "syscall",
- "syscall.SYS_ARM_SYNC_FILE_RANGE": "syscall",
- "syscall.SYS_ATGETMSG": "syscall",
- "syscall.SYS_ATPGETREQ": "syscall",
- "syscall.SYS_ATPGETRSP": "syscall",
- "syscall.SYS_ATPSNDREQ": "syscall",
- "syscall.SYS_ATPSNDRSP": "syscall",
- "syscall.SYS_ATPUTMSG": "syscall",
- "syscall.SYS_ATSOCKET": "syscall",
- "syscall.SYS_AUDIT": "syscall",
- "syscall.SYS_AUDITCTL": "syscall",
- "syscall.SYS_AUDITON": "syscall",
- "syscall.SYS_AUDIT_SESSION_JOIN": "syscall",
- "syscall.SYS_AUDIT_SESSION_PORT": "syscall",
- "syscall.SYS_AUDIT_SESSION_SELF": "syscall",
- "syscall.SYS_BDFLUSH": "syscall",
- "syscall.SYS_BIND": "syscall",
- "syscall.SYS_BINDAT": "syscall",
- "syscall.SYS_BREAK": "syscall",
- "syscall.SYS_BRK": "syscall",
- "syscall.SYS_BSDTHREAD_CREATE": "syscall",
- "syscall.SYS_BSDTHREAD_REGISTER": "syscall",
- "syscall.SYS_BSDTHREAD_TERMINATE": "syscall",
- "syscall.SYS_CAPGET": "syscall",
- "syscall.SYS_CAPSET": "syscall",
- "syscall.SYS_CAP_ENTER": "syscall",
- "syscall.SYS_CAP_FCNTLS_GET": "syscall",
- "syscall.SYS_CAP_FCNTLS_LIMIT": "syscall",
- "syscall.SYS_CAP_GETMODE": "syscall",
- "syscall.SYS_CAP_GETRIGHTS": "syscall",
- "syscall.SYS_CAP_IOCTLS_GET": "syscall",
- "syscall.SYS_CAP_IOCTLS_LIMIT": "syscall",
- "syscall.SYS_CAP_NEW": "syscall",
- "syscall.SYS_CAP_RIGHTS_GET": "syscall",
- "syscall.SYS_CAP_RIGHTS_LIMIT": "syscall",
- "syscall.SYS_CHDIR": "syscall",
- "syscall.SYS_CHFLAGS": "syscall",
- "syscall.SYS_CHFLAGSAT": "syscall",
- "syscall.SYS_CHMOD": "syscall",
- "syscall.SYS_CHMOD_EXTENDED": "syscall",
- "syscall.SYS_CHOWN": "syscall",
- "syscall.SYS_CHOWN32": "syscall",
- "syscall.SYS_CHROOT": "syscall",
- "syscall.SYS_CHUD": "syscall",
- "syscall.SYS_CLOCK_ADJTIME": "syscall",
- "syscall.SYS_CLOCK_GETCPUCLOCKID2": "syscall",
- "syscall.SYS_CLOCK_GETRES": "syscall",
- "syscall.SYS_CLOCK_GETTIME": "syscall",
- "syscall.SYS_CLOCK_NANOSLEEP": "syscall",
- "syscall.SYS_CLOCK_SETTIME": "syscall",
- "syscall.SYS_CLONE": "syscall",
- "syscall.SYS_CLOSE": "syscall",
- "syscall.SYS_CLOSEFROM": "syscall",
- "syscall.SYS_CLOSE_NOCANCEL": "syscall",
- "syscall.SYS_CONNECT": "syscall",
- "syscall.SYS_CONNECTAT": "syscall",
- "syscall.SYS_CONNECT_NOCANCEL": "syscall",
- "syscall.SYS_COPYFILE": "syscall",
- "syscall.SYS_CPUSET": "syscall",
- "syscall.SYS_CPUSET_GETAFFINITY": "syscall",
- "syscall.SYS_CPUSET_GETID": "syscall",
- "syscall.SYS_CPUSET_SETAFFINITY": "syscall",
- "syscall.SYS_CPUSET_SETID": "syscall",
- "syscall.SYS_CREAT": "syscall",
- "syscall.SYS_CREATE_MODULE": "syscall",
- "syscall.SYS_CSOPS": "syscall",
- "syscall.SYS_DELETE": "syscall",
- "syscall.SYS_DELETE_MODULE": "syscall",
- "syscall.SYS_DUP": "syscall",
- "syscall.SYS_DUP2": "syscall",
- "syscall.SYS_DUP3": "syscall",
- "syscall.SYS_EACCESS": "syscall",
- "syscall.SYS_EPOLL_CREATE": "syscall",
- "syscall.SYS_EPOLL_CREATE1": "syscall",
- "syscall.SYS_EPOLL_CTL": "syscall",
- "syscall.SYS_EPOLL_CTL_OLD": "syscall",
- "syscall.SYS_EPOLL_PWAIT": "syscall",
- "syscall.SYS_EPOLL_WAIT": "syscall",
- "syscall.SYS_EPOLL_WAIT_OLD": "syscall",
- "syscall.SYS_EVENTFD": "syscall",
- "syscall.SYS_EVENTFD2": "syscall",
- "syscall.SYS_EXCHANGEDATA": "syscall",
- "syscall.SYS_EXECVE": "syscall",
- "syscall.SYS_EXIT": "syscall",
- "syscall.SYS_EXIT_GROUP": "syscall",
- "syscall.SYS_EXTATTRCTL": "syscall",
- "syscall.SYS_EXTATTR_DELETE_FD": "syscall",
- "syscall.SYS_EXTATTR_DELETE_FILE": "syscall",
- "syscall.SYS_EXTATTR_DELETE_LINK": "syscall",
- "syscall.SYS_EXTATTR_GET_FD": "syscall",
- "syscall.SYS_EXTATTR_GET_FILE": "syscall",
- "syscall.SYS_EXTATTR_GET_LINK": "syscall",
- "syscall.SYS_EXTATTR_LIST_FD": "syscall",
- "syscall.SYS_EXTATTR_LIST_FILE": "syscall",
- "syscall.SYS_EXTATTR_LIST_LINK": "syscall",
- "syscall.SYS_EXTATTR_SET_FD": "syscall",
- "syscall.SYS_EXTATTR_SET_FILE": "syscall",
- "syscall.SYS_EXTATTR_SET_LINK": "syscall",
- "syscall.SYS_FACCESSAT": "syscall",
- "syscall.SYS_FADVISE64": "syscall",
- "syscall.SYS_FADVISE64_64": "syscall",
- "syscall.SYS_FALLOCATE": "syscall",
- "syscall.SYS_FANOTIFY_INIT": "syscall",
- "syscall.SYS_FANOTIFY_MARK": "syscall",
- "syscall.SYS_FCHDIR": "syscall",
- "syscall.SYS_FCHFLAGS": "syscall",
- "syscall.SYS_FCHMOD": "syscall",
- "syscall.SYS_FCHMODAT": "syscall",
- "syscall.SYS_FCHMOD_EXTENDED": "syscall",
- "syscall.SYS_FCHOWN": "syscall",
- "syscall.SYS_FCHOWN32": "syscall",
- "syscall.SYS_FCHOWNAT": "syscall",
- "syscall.SYS_FCHROOT": "syscall",
- "syscall.SYS_FCNTL": "syscall",
- "syscall.SYS_FCNTL64": "syscall",
- "syscall.SYS_FCNTL_NOCANCEL": "syscall",
- "syscall.SYS_FDATASYNC": "syscall",
- "syscall.SYS_FEXECVE": "syscall",
- "syscall.SYS_FFCLOCK_GETCOUNTER": "syscall",
- "syscall.SYS_FFCLOCK_GETESTIMATE": "syscall",
- "syscall.SYS_FFCLOCK_SETESTIMATE": "syscall",
- "syscall.SYS_FFSCTL": "syscall",
- "syscall.SYS_FGETATTRLIST": "syscall",
- "syscall.SYS_FGETXATTR": "syscall",
- "syscall.SYS_FHOPEN": "syscall",
- "syscall.SYS_FHSTAT": "syscall",
- "syscall.SYS_FHSTATFS": "syscall",
- "syscall.SYS_FILEPORT_MAKEFD": "syscall",
- "syscall.SYS_FILEPORT_MAKEPORT": "syscall",
- "syscall.SYS_FKTRACE": "syscall",
- "syscall.SYS_FLISTXATTR": "syscall",
- "syscall.SYS_FLOCK": "syscall",
- "syscall.SYS_FORK": "syscall",
- "syscall.SYS_FPATHCONF": "syscall",
- "syscall.SYS_FREEBSD6_FTRUNCATE": "syscall",
- "syscall.SYS_FREEBSD6_LSEEK": "syscall",
- "syscall.SYS_FREEBSD6_MMAP": "syscall",
- "syscall.SYS_FREEBSD6_PREAD": "syscall",
- "syscall.SYS_FREEBSD6_PWRITE": "syscall",
- "syscall.SYS_FREEBSD6_TRUNCATE": "syscall",
- "syscall.SYS_FREMOVEXATTR": "syscall",
- "syscall.SYS_FSCTL": "syscall",
- "syscall.SYS_FSETATTRLIST": "syscall",
- "syscall.SYS_FSETXATTR": "syscall",
- "syscall.SYS_FSGETPATH": "syscall",
- "syscall.SYS_FSTAT": "syscall",
- "syscall.SYS_FSTAT64": "syscall",
- "syscall.SYS_FSTAT64_EXTENDED": "syscall",
- "syscall.SYS_FSTATAT": "syscall",
- "syscall.SYS_FSTATAT64": "syscall",
- "syscall.SYS_FSTATFS": "syscall",
- "syscall.SYS_FSTATFS64": "syscall",
- "syscall.SYS_FSTATV": "syscall",
- "syscall.SYS_FSTATVFS1": "syscall",
- "syscall.SYS_FSTAT_EXTENDED": "syscall",
- "syscall.SYS_FSYNC": "syscall",
- "syscall.SYS_FSYNC_NOCANCEL": "syscall",
- "syscall.SYS_FSYNC_RANGE": "syscall",
- "syscall.SYS_FTIME": "syscall",
- "syscall.SYS_FTRUNCATE": "syscall",
- "syscall.SYS_FTRUNCATE64": "syscall",
- "syscall.SYS_FUTEX": "syscall",
- "syscall.SYS_FUTIMENS": "syscall",
- "syscall.SYS_FUTIMES": "syscall",
- "syscall.SYS_FUTIMESAT": "syscall",
- "syscall.SYS_GETATTRLIST": "syscall",
- "syscall.SYS_GETAUDIT": "syscall",
- "syscall.SYS_GETAUDIT_ADDR": "syscall",
- "syscall.SYS_GETAUID": "syscall",
- "syscall.SYS_GETCONTEXT": "syscall",
- "syscall.SYS_GETCPU": "syscall",
- "syscall.SYS_GETCWD": "syscall",
- "syscall.SYS_GETDENTS": "syscall",
- "syscall.SYS_GETDENTS64": "syscall",
- "syscall.SYS_GETDIRENTRIES": "syscall",
- "syscall.SYS_GETDIRENTRIES64": "syscall",
- "syscall.SYS_GETDIRENTRIESATTR": "syscall",
- "syscall.SYS_GETDTABLECOUNT": "syscall",
- "syscall.SYS_GETDTABLESIZE": "syscall",
- "syscall.SYS_GETEGID": "syscall",
- "syscall.SYS_GETEGID32": "syscall",
- "syscall.SYS_GETEUID": "syscall",
- "syscall.SYS_GETEUID32": "syscall",
- "syscall.SYS_GETFH": "syscall",
- "syscall.SYS_GETFSSTAT": "syscall",
- "syscall.SYS_GETFSSTAT64": "syscall",
- "syscall.SYS_GETGID": "syscall",
- "syscall.SYS_GETGID32": "syscall",
- "syscall.SYS_GETGROUPS": "syscall",
- "syscall.SYS_GETGROUPS32": "syscall",
- "syscall.SYS_GETHOSTUUID": "syscall",
- "syscall.SYS_GETITIMER": "syscall",
- "syscall.SYS_GETLCID": "syscall",
- "syscall.SYS_GETLOGIN": "syscall",
- "syscall.SYS_GETLOGINCLASS": "syscall",
- "syscall.SYS_GETPEERNAME": "syscall",
- "syscall.SYS_GETPGID": "syscall",
- "syscall.SYS_GETPGRP": "syscall",
- "syscall.SYS_GETPID": "syscall",
- "syscall.SYS_GETPMSG": "syscall",
- "syscall.SYS_GETPPID": "syscall",
- "syscall.SYS_GETPRIORITY": "syscall",
- "syscall.SYS_GETRESGID": "syscall",
- "syscall.SYS_GETRESGID32": "syscall",
- "syscall.SYS_GETRESUID": "syscall",
- "syscall.SYS_GETRESUID32": "syscall",
- "syscall.SYS_GETRLIMIT": "syscall",
- "syscall.SYS_GETRTABLE": "syscall",
- "syscall.SYS_GETRUSAGE": "syscall",
- "syscall.SYS_GETSGROUPS": "syscall",
- "syscall.SYS_GETSID": "syscall",
- "syscall.SYS_GETSOCKNAME": "syscall",
- "syscall.SYS_GETSOCKOPT": "syscall",
- "syscall.SYS_GETTHRID": "syscall",
- "syscall.SYS_GETTID": "syscall",
- "syscall.SYS_GETTIMEOFDAY": "syscall",
- "syscall.SYS_GETUID": "syscall",
- "syscall.SYS_GETUID32": "syscall",
- "syscall.SYS_GETVFSSTAT": "syscall",
- "syscall.SYS_GETWGROUPS": "syscall",
- "syscall.SYS_GETXATTR": "syscall",
- "syscall.SYS_GET_KERNEL_SYMS": "syscall",
- "syscall.SYS_GET_MEMPOLICY": "syscall",
- "syscall.SYS_GET_ROBUST_LIST": "syscall",
- "syscall.SYS_GET_THREAD_AREA": "syscall",
- "syscall.SYS_GTTY": "syscall",
- "syscall.SYS_IDENTITYSVC": "syscall",
- "syscall.SYS_IDLE": "syscall",
- "syscall.SYS_INITGROUPS": "syscall",
- "syscall.SYS_INIT_MODULE": "syscall",
- "syscall.SYS_INOTIFY_ADD_WATCH": "syscall",
- "syscall.SYS_INOTIFY_INIT": "syscall",
- "syscall.SYS_INOTIFY_INIT1": "syscall",
- "syscall.SYS_INOTIFY_RM_WATCH": "syscall",
- "syscall.SYS_IOCTL": "syscall",
- "syscall.SYS_IOPERM": "syscall",
- "syscall.SYS_IOPL": "syscall",
- "syscall.SYS_IOPOLICYSYS": "syscall",
- "syscall.SYS_IOPRIO_GET": "syscall",
- "syscall.SYS_IOPRIO_SET": "syscall",
- "syscall.SYS_IO_CANCEL": "syscall",
- "syscall.SYS_IO_DESTROY": "syscall",
- "syscall.SYS_IO_GETEVENTS": "syscall",
- "syscall.SYS_IO_SETUP": "syscall",
- "syscall.SYS_IO_SUBMIT": "syscall",
- "syscall.SYS_IPC": "syscall",
- "syscall.SYS_ISSETUGID": "syscall",
- "syscall.SYS_JAIL": "syscall",
- "syscall.SYS_JAIL_ATTACH": "syscall",
- "syscall.SYS_JAIL_GET": "syscall",
- "syscall.SYS_JAIL_REMOVE": "syscall",
- "syscall.SYS_JAIL_SET": "syscall",
- "syscall.SYS_KDEBUG_TRACE": "syscall",
- "syscall.SYS_KENV": "syscall",
- "syscall.SYS_KEVENT": "syscall",
- "syscall.SYS_KEVENT64": "syscall",
- "syscall.SYS_KEXEC_LOAD": "syscall",
- "syscall.SYS_KEYCTL": "syscall",
- "syscall.SYS_KILL": "syscall",
- "syscall.SYS_KLDFIND": "syscall",
- "syscall.SYS_KLDFIRSTMOD": "syscall",
- "syscall.SYS_KLDLOAD": "syscall",
- "syscall.SYS_KLDNEXT": "syscall",
- "syscall.SYS_KLDSTAT": "syscall",
- "syscall.SYS_KLDSYM": "syscall",
- "syscall.SYS_KLDUNLOAD": "syscall",
- "syscall.SYS_KLDUNLOADF": "syscall",
- "syscall.SYS_KQUEUE": "syscall",
- "syscall.SYS_KQUEUE1": "syscall",
- "syscall.SYS_KTIMER_CREATE": "syscall",
- "syscall.SYS_KTIMER_DELETE": "syscall",
- "syscall.SYS_KTIMER_GETOVERRUN": "syscall",
- "syscall.SYS_KTIMER_GETTIME": "syscall",
- "syscall.SYS_KTIMER_SETTIME": "syscall",
- "syscall.SYS_KTRACE": "syscall",
- "syscall.SYS_LCHFLAGS": "syscall",
- "syscall.SYS_LCHMOD": "syscall",
- "syscall.SYS_LCHOWN": "syscall",
- "syscall.SYS_LCHOWN32": "syscall",
- "syscall.SYS_LGETFH": "syscall",
- "syscall.SYS_LGETXATTR": "syscall",
- "syscall.SYS_LINK": "syscall",
- "syscall.SYS_LINKAT": "syscall",
- "syscall.SYS_LIO_LISTIO": "syscall",
- "syscall.SYS_LISTEN": "syscall",
- "syscall.SYS_LISTXATTR": "syscall",
- "syscall.SYS_LLISTXATTR": "syscall",
- "syscall.SYS_LOCK": "syscall",
- "syscall.SYS_LOOKUP_DCOOKIE": "syscall",
- "syscall.SYS_LPATHCONF": "syscall",
- "syscall.SYS_LREMOVEXATTR": "syscall",
- "syscall.SYS_LSEEK": "syscall",
- "syscall.SYS_LSETXATTR": "syscall",
- "syscall.SYS_LSTAT": "syscall",
- "syscall.SYS_LSTAT64": "syscall",
- "syscall.SYS_LSTAT64_EXTENDED": "syscall",
- "syscall.SYS_LSTATV": "syscall",
- "syscall.SYS_LSTAT_EXTENDED": "syscall",
- "syscall.SYS_LUTIMES": "syscall",
- "syscall.SYS_MAC_SYSCALL": "syscall",
- "syscall.SYS_MADVISE": "syscall",
- "syscall.SYS_MADVISE1": "syscall",
- "syscall.SYS_MAXSYSCALL": "syscall",
- "syscall.SYS_MBIND": "syscall",
- "syscall.SYS_MIGRATE_PAGES": "syscall",
- "syscall.SYS_MINCORE": "syscall",
- "syscall.SYS_MINHERIT": "syscall",
- "syscall.SYS_MKCOMPLEX": "syscall",
- "syscall.SYS_MKDIR": "syscall",
- "syscall.SYS_MKDIRAT": "syscall",
- "syscall.SYS_MKDIR_EXTENDED": "syscall",
- "syscall.SYS_MKFIFO": "syscall",
- "syscall.SYS_MKFIFOAT": "syscall",
- "syscall.SYS_MKFIFO_EXTENDED": "syscall",
- "syscall.SYS_MKNOD": "syscall",
- "syscall.SYS_MKNODAT": "syscall",
- "syscall.SYS_MLOCK": "syscall",
- "syscall.SYS_MLOCKALL": "syscall",
- "syscall.SYS_MMAP": "syscall",
- "syscall.SYS_MMAP2": "syscall",
- "syscall.SYS_MODCTL": "syscall",
- "syscall.SYS_MODFIND": "syscall",
- "syscall.SYS_MODFNEXT": "syscall",
- "syscall.SYS_MODIFY_LDT": "syscall",
- "syscall.SYS_MODNEXT": "syscall",
- "syscall.SYS_MODSTAT": "syscall",
- "syscall.SYS_MODWATCH": "syscall",
- "syscall.SYS_MOUNT": "syscall",
- "syscall.SYS_MOVE_PAGES": "syscall",
- "syscall.SYS_MPROTECT": "syscall",
- "syscall.SYS_MPX": "syscall",
- "syscall.SYS_MQUERY": "syscall",
- "syscall.SYS_MQ_GETSETATTR": "syscall",
- "syscall.SYS_MQ_NOTIFY": "syscall",
- "syscall.SYS_MQ_OPEN": "syscall",
- "syscall.SYS_MQ_TIMEDRECEIVE": "syscall",
- "syscall.SYS_MQ_TIMEDSEND": "syscall",
- "syscall.SYS_MQ_UNLINK": "syscall",
- "syscall.SYS_MREMAP": "syscall",
- "syscall.SYS_MSGCTL": "syscall",
- "syscall.SYS_MSGGET": "syscall",
- "syscall.SYS_MSGRCV": "syscall",
- "syscall.SYS_MSGRCV_NOCANCEL": "syscall",
- "syscall.SYS_MSGSND": "syscall",
- "syscall.SYS_MSGSND_NOCANCEL": "syscall",
- "syscall.SYS_MSGSYS": "syscall",
- "syscall.SYS_MSYNC": "syscall",
- "syscall.SYS_MSYNC_NOCANCEL": "syscall",
- "syscall.SYS_MUNLOCK": "syscall",
- "syscall.SYS_MUNLOCKALL": "syscall",
- "syscall.SYS_MUNMAP": "syscall",
- "syscall.SYS_NAME_TO_HANDLE_AT": "syscall",
- "syscall.SYS_NANOSLEEP": "syscall",
- "syscall.SYS_NEWFSTATAT": "syscall",
- "syscall.SYS_NFSCLNT": "syscall",
- "syscall.SYS_NFSSERVCTL": "syscall",
- "syscall.SYS_NFSSVC": "syscall",
- "syscall.SYS_NFSTAT": "syscall",
- "syscall.SYS_NICE": "syscall",
- "syscall.SYS_NLSTAT": "syscall",
- "syscall.SYS_NMOUNT": "syscall",
- "syscall.SYS_NSTAT": "syscall",
- "syscall.SYS_NTP_ADJTIME": "syscall",
- "syscall.SYS_NTP_GETTIME": "syscall",
- "syscall.SYS_OABI_SYSCALL_BASE": "syscall",
- "syscall.SYS_OBREAK": "syscall",
- "syscall.SYS_OLDFSTAT": "syscall",
- "syscall.SYS_OLDLSTAT": "syscall",
- "syscall.SYS_OLDOLDUNAME": "syscall",
- "syscall.SYS_OLDSTAT": "syscall",
- "syscall.SYS_OLDUNAME": "syscall",
- "syscall.SYS_OPEN": "syscall",
- "syscall.SYS_OPENAT": "syscall",
- "syscall.SYS_OPENBSD_POLL": "syscall",
- "syscall.SYS_OPEN_BY_HANDLE_AT": "syscall",
- "syscall.SYS_OPEN_EXTENDED": "syscall",
- "syscall.SYS_OPEN_NOCANCEL": "syscall",
- "syscall.SYS_OVADVISE": "syscall",
- "syscall.SYS_PACCEPT": "syscall",
- "syscall.SYS_PATHCONF": "syscall",
- "syscall.SYS_PAUSE": "syscall",
- "syscall.SYS_PCICONFIG_IOBASE": "syscall",
- "syscall.SYS_PCICONFIG_READ": "syscall",
- "syscall.SYS_PCICONFIG_WRITE": "syscall",
- "syscall.SYS_PDFORK": "syscall",
- "syscall.SYS_PDGETPID": "syscall",
- "syscall.SYS_PDKILL": "syscall",
- "syscall.SYS_PERF_EVENT_OPEN": "syscall",
- "syscall.SYS_PERSONALITY": "syscall",
- "syscall.SYS_PID_HIBERNATE": "syscall",
- "syscall.SYS_PID_RESUME": "syscall",
- "syscall.SYS_PID_SHUTDOWN_SOCKETS": "syscall",
- "syscall.SYS_PID_SUSPEND": "syscall",
- "syscall.SYS_PIPE": "syscall",
- "syscall.SYS_PIPE2": "syscall",
- "syscall.SYS_PIVOT_ROOT": "syscall",
- "syscall.SYS_PMC_CONTROL": "syscall",
- "syscall.SYS_PMC_GET_INFO": "syscall",
- "syscall.SYS_POLL": "syscall",
- "syscall.SYS_POLLTS": "syscall",
- "syscall.SYS_POLL_NOCANCEL": "syscall",
- "syscall.SYS_POSIX_FADVISE": "syscall",
- "syscall.SYS_POSIX_FALLOCATE": "syscall",
- "syscall.SYS_POSIX_OPENPT": "syscall",
- "syscall.SYS_POSIX_SPAWN": "syscall",
- "syscall.SYS_PPOLL": "syscall",
- "syscall.SYS_PRCTL": "syscall",
- "syscall.SYS_PREAD": "syscall",
- "syscall.SYS_PREAD64": "syscall",
- "syscall.SYS_PREADV": "syscall",
- "syscall.SYS_PREAD_NOCANCEL": "syscall",
- "syscall.SYS_PRLIMIT64": "syscall",
- "syscall.SYS_PROCCTL": "syscall",
- "syscall.SYS_PROCESS_POLICY": "syscall",
- "syscall.SYS_PROCESS_VM_READV": "syscall",
- "syscall.SYS_PROCESS_VM_WRITEV": "syscall",
- "syscall.SYS_PROC_INFO": "syscall",
- "syscall.SYS_PROF": "syscall",
- "syscall.SYS_PROFIL": "syscall",
- "syscall.SYS_PSELECT": "syscall",
- "syscall.SYS_PSELECT6": "syscall",
- "syscall.SYS_PSET_ASSIGN": "syscall",
- "syscall.SYS_PSET_CREATE": "syscall",
- "syscall.SYS_PSET_DESTROY": "syscall",
- "syscall.SYS_PSYNCH_CVBROAD": "syscall",
- "syscall.SYS_PSYNCH_CVCLRPREPOST": "syscall",
- "syscall.SYS_PSYNCH_CVSIGNAL": "syscall",
- "syscall.SYS_PSYNCH_CVWAIT": "syscall",
- "syscall.SYS_PSYNCH_MUTEXDROP": "syscall",
- "syscall.SYS_PSYNCH_MUTEXWAIT": "syscall",
- "syscall.SYS_PSYNCH_RW_DOWNGRADE": "syscall",
- "syscall.SYS_PSYNCH_RW_LONGRDLOCK": "syscall",
- "syscall.SYS_PSYNCH_RW_RDLOCK": "syscall",
- "syscall.SYS_PSYNCH_RW_UNLOCK": "syscall",
- "syscall.SYS_PSYNCH_RW_UNLOCK2": "syscall",
- "syscall.SYS_PSYNCH_RW_UPGRADE": "syscall",
- "syscall.SYS_PSYNCH_RW_WRLOCK": "syscall",
- "syscall.SYS_PSYNCH_RW_YIELDWRLOCK": "syscall",
- "syscall.SYS_PTRACE": "syscall",
- "syscall.SYS_PUTPMSG": "syscall",
- "syscall.SYS_PWRITE": "syscall",
- "syscall.SYS_PWRITE64": "syscall",
- "syscall.SYS_PWRITEV": "syscall",
- "syscall.SYS_PWRITE_NOCANCEL": "syscall",
- "syscall.SYS_QUERY_MODULE": "syscall",
- "syscall.SYS_QUOTACTL": "syscall",
- "syscall.SYS_RASCTL": "syscall",
- "syscall.SYS_RCTL_ADD_RULE": "syscall",
- "syscall.SYS_RCTL_GET_LIMITS": "syscall",
- "syscall.SYS_RCTL_GET_RACCT": "syscall",
- "syscall.SYS_RCTL_GET_RULES": "syscall",
- "syscall.SYS_RCTL_REMOVE_RULE": "syscall",
- "syscall.SYS_READ": "syscall",
- "syscall.SYS_READAHEAD": "syscall",
- "syscall.SYS_READDIR": "syscall",
- "syscall.SYS_READLINK": "syscall",
- "syscall.SYS_READLINKAT": "syscall",
- "syscall.SYS_READV": "syscall",
- "syscall.SYS_READV_NOCANCEL": "syscall",
- "syscall.SYS_READ_NOCANCEL": "syscall",
- "syscall.SYS_REBOOT": "syscall",
- "syscall.SYS_RECV": "syscall",
- "syscall.SYS_RECVFROM": "syscall",
- "syscall.SYS_RECVFROM_NOCANCEL": "syscall",
- "syscall.SYS_RECVMMSG": "syscall",
- "syscall.SYS_RECVMSG": "syscall",
- "syscall.SYS_RECVMSG_NOCANCEL": "syscall",
- "syscall.SYS_REMAP_FILE_PAGES": "syscall",
- "syscall.SYS_REMOVEXATTR": "syscall",
- "syscall.SYS_RENAME": "syscall",
- "syscall.SYS_RENAMEAT": "syscall",
- "syscall.SYS_REQUEST_KEY": "syscall",
- "syscall.SYS_RESTART_SYSCALL": "syscall",
- "syscall.SYS_REVOKE": "syscall",
- "syscall.SYS_RFORK": "syscall",
- "syscall.SYS_RMDIR": "syscall",
- "syscall.SYS_RTPRIO": "syscall",
- "syscall.SYS_RTPRIO_THREAD": "syscall",
- "syscall.SYS_RT_SIGACTION": "syscall",
- "syscall.SYS_RT_SIGPENDING": "syscall",
- "syscall.SYS_RT_SIGPROCMASK": "syscall",
- "syscall.SYS_RT_SIGQUEUEINFO": "syscall",
- "syscall.SYS_RT_SIGRETURN": "syscall",
- "syscall.SYS_RT_SIGSUSPEND": "syscall",
- "syscall.SYS_RT_SIGTIMEDWAIT": "syscall",
- "syscall.SYS_RT_TGSIGQUEUEINFO": "syscall",
- "syscall.SYS_SBRK": "syscall",
- "syscall.SYS_SCHED_GETAFFINITY": "syscall",
- "syscall.SYS_SCHED_GETPARAM": "syscall",
- "syscall.SYS_SCHED_GETSCHEDULER": "syscall",
- "syscall.SYS_SCHED_GET_PRIORITY_MAX": "syscall",
- "syscall.SYS_SCHED_GET_PRIORITY_MIN": "syscall",
- "syscall.SYS_SCHED_RR_GET_INTERVAL": "syscall",
- "syscall.SYS_SCHED_SETAFFINITY": "syscall",
- "syscall.SYS_SCHED_SETPARAM": "syscall",
- "syscall.SYS_SCHED_SETSCHEDULER": "syscall",
- "syscall.SYS_SCHED_YIELD": "syscall",
- "syscall.SYS_SCTP_GENERIC_RECVMSG": "syscall",
- "syscall.SYS_SCTP_GENERIC_SENDMSG": "syscall",
- "syscall.SYS_SCTP_GENERIC_SENDMSG_IOV": "syscall",
- "syscall.SYS_SCTP_PEELOFF": "syscall",
- "syscall.SYS_SEARCHFS": "syscall",
- "syscall.SYS_SECURITY": "syscall",
- "syscall.SYS_SELECT": "syscall",
- "syscall.SYS_SELECT_NOCANCEL": "syscall",
- "syscall.SYS_SEMCONFIG": "syscall",
- "syscall.SYS_SEMCTL": "syscall",
- "syscall.SYS_SEMGET": "syscall",
- "syscall.SYS_SEMOP": "syscall",
- "syscall.SYS_SEMSYS": "syscall",
- "syscall.SYS_SEMTIMEDOP": "syscall",
- "syscall.SYS_SEM_CLOSE": "syscall",
- "syscall.SYS_SEM_DESTROY": "syscall",
- "syscall.SYS_SEM_GETVALUE": "syscall",
- "syscall.SYS_SEM_INIT": "syscall",
- "syscall.SYS_SEM_OPEN": "syscall",
- "syscall.SYS_SEM_POST": "syscall",
- "syscall.SYS_SEM_TRYWAIT": "syscall",
- "syscall.SYS_SEM_UNLINK": "syscall",
- "syscall.SYS_SEM_WAIT": "syscall",
- "syscall.SYS_SEM_WAIT_NOCANCEL": "syscall",
- "syscall.SYS_SEND": "syscall",
- "syscall.SYS_SENDFILE": "syscall",
- "syscall.SYS_SENDFILE64": "syscall",
- "syscall.SYS_SENDMMSG": "syscall",
- "syscall.SYS_SENDMSG": "syscall",
- "syscall.SYS_SENDMSG_NOCANCEL": "syscall",
- "syscall.SYS_SENDTO": "syscall",
- "syscall.SYS_SENDTO_NOCANCEL": "syscall",
- "syscall.SYS_SETATTRLIST": "syscall",
- "syscall.SYS_SETAUDIT": "syscall",
- "syscall.SYS_SETAUDIT_ADDR": "syscall",
- "syscall.SYS_SETAUID": "syscall",
- "syscall.SYS_SETCONTEXT": "syscall",
- "syscall.SYS_SETDOMAINNAME": "syscall",
- "syscall.SYS_SETEGID": "syscall",
- "syscall.SYS_SETEUID": "syscall",
- "syscall.SYS_SETFIB": "syscall",
- "syscall.SYS_SETFSGID": "syscall",
- "syscall.SYS_SETFSGID32": "syscall",
- "syscall.SYS_SETFSUID": "syscall",
- "syscall.SYS_SETFSUID32": "syscall",
- "syscall.SYS_SETGID": "syscall",
- "syscall.SYS_SETGID32": "syscall",
- "syscall.SYS_SETGROUPS": "syscall",
- "syscall.SYS_SETGROUPS32": "syscall",
- "syscall.SYS_SETHOSTNAME": "syscall",
- "syscall.SYS_SETITIMER": "syscall",
- "syscall.SYS_SETLCID": "syscall",
- "syscall.SYS_SETLOGIN": "syscall",
- "syscall.SYS_SETLOGINCLASS": "syscall",
- "syscall.SYS_SETNS": "syscall",
- "syscall.SYS_SETPGID": "syscall",
- "syscall.SYS_SETPRIORITY": "syscall",
- "syscall.SYS_SETPRIVEXEC": "syscall",
- "syscall.SYS_SETREGID": "syscall",
- "syscall.SYS_SETREGID32": "syscall",
- "syscall.SYS_SETRESGID": "syscall",
- "syscall.SYS_SETRESGID32": "syscall",
- "syscall.SYS_SETRESUID": "syscall",
- "syscall.SYS_SETRESUID32": "syscall",
- "syscall.SYS_SETREUID": "syscall",
- "syscall.SYS_SETREUID32": "syscall",
- "syscall.SYS_SETRLIMIT": "syscall",
- "syscall.SYS_SETRTABLE": "syscall",
- "syscall.SYS_SETSGROUPS": "syscall",
- "syscall.SYS_SETSID": "syscall",
- "syscall.SYS_SETSOCKOPT": "syscall",
- "syscall.SYS_SETTID": "syscall",
- "syscall.SYS_SETTID_WITH_PID": "syscall",
- "syscall.SYS_SETTIMEOFDAY": "syscall",
- "syscall.SYS_SETUID": "syscall",
- "syscall.SYS_SETUID32": "syscall",
- "syscall.SYS_SETWGROUPS": "syscall",
- "syscall.SYS_SETXATTR": "syscall",
- "syscall.SYS_SET_MEMPOLICY": "syscall",
- "syscall.SYS_SET_ROBUST_LIST": "syscall",
- "syscall.SYS_SET_THREAD_AREA": "syscall",
- "syscall.SYS_SET_TID_ADDRESS": "syscall",
- "syscall.SYS_SGETMASK": "syscall",
- "syscall.SYS_SHARED_REGION_CHECK_NP": "syscall",
- "syscall.SYS_SHARED_REGION_MAP_AND_SLIDE_NP": "syscall",
- "syscall.SYS_SHMAT": "syscall",
- "syscall.SYS_SHMCTL": "syscall",
- "syscall.SYS_SHMDT": "syscall",
- "syscall.SYS_SHMGET": "syscall",
- "syscall.SYS_SHMSYS": "syscall",
- "syscall.SYS_SHM_OPEN": "syscall",
- "syscall.SYS_SHM_UNLINK": "syscall",
- "syscall.SYS_SHUTDOWN": "syscall",
- "syscall.SYS_SIGACTION": "syscall",
- "syscall.SYS_SIGALTSTACK": "syscall",
- "syscall.SYS_SIGNAL": "syscall",
- "syscall.SYS_SIGNALFD": "syscall",
- "syscall.SYS_SIGNALFD4": "syscall",
- "syscall.SYS_SIGPENDING": "syscall",
- "syscall.SYS_SIGPROCMASK": "syscall",
- "syscall.SYS_SIGQUEUE": "syscall",
- "syscall.SYS_SIGQUEUEINFO": "syscall",
- "syscall.SYS_SIGRETURN": "syscall",
- "syscall.SYS_SIGSUSPEND": "syscall",
- "syscall.SYS_SIGSUSPEND_NOCANCEL": "syscall",
- "syscall.SYS_SIGTIMEDWAIT": "syscall",
- "syscall.SYS_SIGWAIT": "syscall",
- "syscall.SYS_SIGWAITINFO": "syscall",
- "syscall.SYS_SOCKET": "syscall",
- "syscall.SYS_SOCKETCALL": "syscall",
- "syscall.SYS_SOCKETPAIR": "syscall",
- "syscall.SYS_SPLICE": "syscall",
- "syscall.SYS_SSETMASK": "syscall",
- "syscall.SYS_SSTK": "syscall",
- "syscall.SYS_STACK_SNAPSHOT": "syscall",
- "syscall.SYS_STAT": "syscall",
- "syscall.SYS_STAT64": "syscall",
- "syscall.SYS_STAT64_EXTENDED": "syscall",
- "syscall.SYS_STATFS": "syscall",
- "syscall.SYS_STATFS64": "syscall",
- "syscall.SYS_STATV": "syscall",
- "syscall.SYS_STATVFS1": "syscall",
- "syscall.SYS_STAT_EXTENDED": "syscall",
- "syscall.SYS_STIME": "syscall",
- "syscall.SYS_STTY": "syscall",
- "syscall.SYS_SWAPCONTEXT": "syscall",
- "syscall.SYS_SWAPCTL": "syscall",
- "syscall.SYS_SWAPOFF": "syscall",
- "syscall.SYS_SWAPON": "syscall",
- "syscall.SYS_SYMLINK": "syscall",
- "syscall.SYS_SYMLINKAT": "syscall",
- "syscall.SYS_SYNC": "syscall",
- "syscall.SYS_SYNCFS": "syscall",
- "syscall.SYS_SYNC_FILE_RANGE": "syscall",
- "syscall.SYS_SYSARCH": "syscall",
- "syscall.SYS_SYSCALL": "syscall",
- "syscall.SYS_SYSCALL_BASE": "syscall",
- "syscall.SYS_SYSFS": "syscall",
- "syscall.SYS_SYSINFO": "syscall",
- "syscall.SYS_SYSLOG": "syscall",
- "syscall.SYS_TEE": "syscall",
- "syscall.SYS_TGKILL": "syscall",
- "syscall.SYS_THREAD_SELFID": "syscall",
- "syscall.SYS_THR_CREATE": "syscall",
- "syscall.SYS_THR_EXIT": "syscall",
- "syscall.SYS_THR_KILL": "syscall",
- "syscall.SYS_THR_KILL2": "syscall",
- "syscall.SYS_THR_NEW": "syscall",
- "syscall.SYS_THR_SELF": "syscall",
- "syscall.SYS_THR_SET_NAME": "syscall",
- "syscall.SYS_THR_SUSPEND": "syscall",
- "syscall.SYS_THR_WAKE": "syscall",
- "syscall.SYS_TIME": "syscall",
- "syscall.SYS_TIMERFD_CREATE": "syscall",
- "syscall.SYS_TIMERFD_GETTIME": "syscall",
- "syscall.SYS_TIMERFD_SETTIME": "syscall",
- "syscall.SYS_TIMER_CREATE": "syscall",
- "syscall.SYS_TIMER_DELETE": "syscall",
- "syscall.SYS_TIMER_GETOVERRUN": "syscall",
- "syscall.SYS_TIMER_GETTIME": "syscall",
- "syscall.SYS_TIMER_SETTIME": "syscall",
- "syscall.SYS_TIMES": "syscall",
- "syscall.SYS_TKILL": "syscall",
- "syscall.SYS_TRUNCATE": "syscall",
- "syscall.SYS_TRUNCATE64": "syscall",
- "syscall.SYS_TUXCALL": "syscall",
- "syscall.SYS_UGETRLIMIT": "syscall",
- "syscall.SYS_ULIMIT": "syscall",
- "syscall.SYS_UMASK": "syscall",
- "syscall.SYS_UMASK_EXTENDED": "syscall",
- "syscall.SYS_UMOUNT": "syscall",
- "syscall.SYS_UMOUNT2": "syscall",
- "syscall.SYS_UNAME": "syscall",
- "syscall.SYS_UNDELETE": "syscall",
- "syscall.SYS_UNLINK": "syscall",
- "syscall.SYS_UNLINKAT": "syscall",
- "syscall.SYS_UNMOUNT": "syscall",
- "syscall.SYS_UNSHARE": "syscall",
- "syscall.SYS_USELIB": "syscall",
- "syscall.SYS_USTAT": "syscall",
- "syscall.SYS_UTIME": "syscall",
- "syscall.SYS_UTIMENSAT": "syscall",
- "syscall.SYS_UTIMES": "syscall",
- "syscall.SYS_UTRACE": "syscall",
- "syscall.SYS_UUIDGEN": "syscall",
- "syscall.SYS_VADVISE": "syscall",
- "syscall.SYS_VFORK": "syscall",
- "syscall.SYS_VHANGUP": "syscall",
- "syscall.SYS_VM86": "syscall",
- "syscall.SYS_VM86OLD": "syscall",
- "syscall.SYS_VMSPLICE": "syscall",
- "syscall.SYS_VM_PRESSURE_MONITOR": "syscall",
- "syscall.SYS_VSERVER": "syscall",
- "syscall.SYS_WAIT4": "syscall",
- "syscall.SYS_WAIT4_NOCANCEL": "syscall",
- "syscall.SYS_WAIT6": "syscall",
- "syscall.SYS_WAITEVENT": "syscall",
- "syscall.SYS_WAITID": "syscall",
- "syscall.SYS_WAITID_NOCANCEL": "syscall",
- "syscall.SYS_WAITPID": "syscall",
- "syscall.SYS_WATCHEVENT": "syscall",
- "syscall.SYS_WORKQ_KERNRETURN": "syscall",
- "syscall.SYS_WORKQ_OPEN": "syscall",
- "syscall.SYS_WRITE": "syscall",
- "syscall.SYS_WRITEV": "syscall",
- "syscall.SYS_WRITEV_NOCANCEL": "syscall",
- "syscall.SYS_WRITE_NOCANCEL": "syscall",
- "syscall.SYS_YIELD": "syscall",
- "syscall.SYS__LLSEEK": "syscall",
- "syscall.SYS__LWP_CONTINUE": "syscall",
- "syscall.SYS__LWP_CREATE": "syscall",
- "syscall.SYS__LWP_CTL": "syscall",
- "syscall.SYS__LWP_DETACH": "syscall",
- "syscall.SYS__LWP_EXIT": "syscall",
- "syscall.SYS__LWP_GETNAME": "syscall",
- "syscall.SYS__LWP_GETPRIVATE": "syscall",
- "syscall.SYS__LWP_KILL": "syscall",
- "syscall.SYS__LWP_PARK": "syscall",
- "syscall.SYS__LWP_SELF": "syscall",
- "syscall.SYS__LWP_SETNAME": "syscall",
- "syscall.SYS__LWP_SETPRIVATE": "syscall",
- "syscall.SYS__LWP_SUSPEND": "syscall",
- "syscall.SYS__LWP_UNPARK": "syscall",
- "syscall.SYS__LWP_UNPARK_ALL": "syscall",
- "syscall.SYS__LWP_WAIT": "syscall",
- "syscall.SYS__LWP_WAKEUP": "syscall",
- "syscall.SYS__NEWSELECT": "syscall",
- "syscall.SYS__PSET_BIND": "syscall",
- "syscall.SYS__SCHED_GETAFFINITY": "syscall",
- "syscall.SYS__SCHED_GETPARAM": "syscall",
- "syscall.SYS__SCHED_SETAFFINITY": "syscall",
- "syscall.SYS__SCHED_SETPARAM": "syscall",
- "syscall.SYS__SYSCTL": "syscall",
- "syscall.SYS__UMTX_LOCK": "syscall",
- "syscall.SYS__UMTX_OP": "syscall",
- "syscall.SYS__UMTX_UNLOCK": "syscall",
- "syscall.SYS___ACL_ACLCHECK_FD": "syscall",
- "syscall.SYS___ACL_ACLCHECK_FILE": "syscall",
- "syscall.SYS___ACL_ACLCHECK_LINK": "syscall",
- "syscall.SYS___ACL_DELETE_FD": "syscall",
- "syscall.SYS___ACL_DELETE_FILE": "syscall",
- "syscall.SYS___ACL_DELETE_LINK": "syscall",
- "syscall.SYS___ACL_GET_FD": "syscall",
- "syscall.SYS___ACL_GET_FILE": "syscall",
- "syscall.SYS___ACL_GET_LINK": "syscall",
- "syscall.SYS___ACL_SET_FD": "syscall",
- "syscall.SYS___ACL_SET_FILE": "syscall",
- "syscall.SYS___ACL_SET_LINK": "syscall",
- "syscall.SYS___CLONE": "syscall",
- "syscall.SYS___DISABLE_THREADSIGNAL": "syscall",
- "syscall.SYS___GETCWD": "syscall",
- "syscall.SYS___GETLOGIN": "syscall",
- "syscall.SYS___GET_TCB": "syscall",
- "syscall.SYS___MAC_EXECVE": "syscall",
- "syscall.SYS___MAC_GETFSSTAT": "syscall",
- "syscall.SYS___MAC_GET_FD": "syscall",
- "syscall.SYS___MAC_GET_FILE": "syscall",
- "syscall.SYS___MAC_GET_LCID": "syscall",
- "syscall.SYS___MAC_GET_LCTX": "syscall",
- "syscall.SYS___MAC_GET_LINK": "syscall",
- "syscall.SYS___MAC_GET_MOUNT": "syscall",
- "syscall.SYS___MAC_GET_PID": "syscall",
- "syscall.SYS___MAC_GET_PROC": "syscall",
- "syscall.SYS___MAC_MOUNT": "syscall",
- "syscall.SYS___MAC_SET_FD": "syscall",
- "syscall.SYS___MAC_SET_FILE": "syscall",
- "syscall.SYS___MAC_SET_LCTX": "syscall",
- "syscall.SYS___MAC_SET_LINK": "syscall",
- "syscall.SYS___MAC_SET_PROC": "syscall",
- "syscall.SYS___MAC_SYSCALL": "syscall",
- "syscall.SYS___OLD_SEMWAIT_SIGNAL": "syscall",
- "syscall.SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL": "syscall",
- "syscall.SYS___POSIX_CHOWN": "syscall",
- "syscall.SYS___POSIX_FCHOWN": "syscall",
- "syscall.SYS___POSIX_LCHOWN": "syscall",
- "syscall.SYS___POSIX_RENAME": "syscall",
- "syscall.SYS___PTHREAD_CANCELED": "syscall",
- "syscall.SYS___PTHREAD_CHDIR": "syscall",
- "syscall.SYS___PTHREAD_FCHDIR": "syscall",
- "syscall.SYS___PTHREAD_KILL": "syscall",
- "syscall.SYS___PTHREAD_MARKCANCEL": "syscall",
- "syscall.SYS___PTHREAD_SIGMASK": "syscall",
- "syscall.SYS___QUOTACTL": "syscall",
- "syscall.SYS___SEMCTL": "syscall",
- "syscall.SYS___SEMWAIT_SIGNAL": "syscall",
- "syscall.SYS___SEMWAIT_SIGNAL_NOCANCEL": "syscall",
- "syscall.SYS___SETLOGIN": "syscall",
- "syscall.SYS___SETUGID": "syscall",
- "syscall.SYS___SET_TCB": "syscall",
- "syscall.SYS___SIGACTION_SIGTRAMP": "syscall",
- "syscall.SYS___SIGTIMEDWAIT": "syscall",
- "syscall.SYS___SIGWAIT": "syscall",
- "syscall.SYS___SIGWAIT_NOCANCEL": "syscall",
- "syscall.SYS___SYSCTL": "syscall",
- "syscall.SYS___TFORK": "syscall",
- "syscall.SYS___THREXIT": "syscall",
- "syscall.SYS___THRSIGDIVERT": "syscall",
- "syscall.SYS___THRSLEEP": "syscall",
- "syscall.SYS___THRWAKEUP": "syscall",
- "syscall.S_ARCH1": "syscall",
- "syscall.S_ARCH2": "syscall",
- "syscall.S_BLKSIZE": "syscall",
- "syscall.S_IEXEC": "syscall",
- "syscall.S_IFBLK": "syscall",
- "syscall.S_IFCHR": "syscall",
- "syscall.S_IFDIR": "syscall",
- "syscall.S_IFIFO": "syscall",
- "syscall.S_IFLNK": "syscall",
- "syscall.S_IFMT": "syscall",
- "syscall.S_IFREG": "syscall",
- "syscall.S_IFSOCK": "syscall",
- "syscall.S_IFWHT": "syscall",
- "syscall.S_IREAD": "syscall",
- "syscall.S_IRGRP": "syscall",
- "syscall.S_IROTH": "syscall",
- "syscall.S_IRUSR": "syscall",
- "syscall.S_IRWXG": "syscall",
- "syscall.S_IRWXO": "syscall",
- "syscall.S_IRWXU": "syscall",
- "syscall.S_ISGID": "syscall",
- "syscall.S_ISTXT": "syscall",
- "syscall.S_ISUID": "syscall",
- "syscall.S_ISVTX": "syscall",
- "syscall.S_IWGRP": "syscall",
- "syscall.S_IWOTH": "syscall",
- "syscall.S_IWRITE": "syscall",
- "syscall.S_IWUSR": "syscall",
- "syscall.S_IXGRP": "syscall",
- "syscall.S_IXOTH": "syscall",
- "syscall.S_IXUSR": "syscall",
- "syscall.S_LOGIN_SET": "syscall",
- "syscall.SecurityAttributes": "syscall",
- "syscall.Seek": "syscall",
- "syscall.Select": "syscall",
- "syscall.Sendfile": "syscall",
- "syscall.Sendmsg": "syscall",
- "syscall.SendmsgN": "syscall",
- "syscall.Sendto": "syscall",
- "syscall.Servent": "syscall",
- "syscall.SetBpf": "syscall",
- "syscall.SetBpfBuflen": "syscall",
- "syscall.SetBpfDatalink": "syscall",
- "syscall.SetBpfHeadercmpl": "syscall",
- "syscall.SetBpfImmediate": "syscall",
- "syscall.SetBpfInterface": "syscall",
- "syscall.SetBpfPromisc": "syscall",
- "syscall.SetBpfTimeout": "syscall",
- "syscall.SetCurrentDirectory": "syscall",
- "syscall.SetEndOfFile": "syscall",
- "syscall.SetEnvironmentVariable": "syscall",
- "syscall.SetFileAttributes": "syscall",
- "syscall.SetFileCompletionNotificationModes": "syscall",
- "syscall.SetFilePointer": "syscall",
- "syscall.SetFileTime": "syscall",
- "syscall.SetHandleInformation": "syscall",
- "syscall.SetKevent": "syscall",
- "syscall.SetLsfPromisc": "syscall",
- "syscall.SetNonblock": "syscall",
- "syscall.Setdomainname": "syscall",
- "syscall.Setegid": "syscall",
- "syscall.Setenv": "syscall",
- "syscall.Seteuid": "syscall",
- "syscall.Setfsgid": "syscall",
- "syscall.Setfsuid": "syscall",
- "syscall.Setgid": "syscall",
- "syscall.Setgroups": "syscall",
- "syscall.Sethostname": "syscall",
- "syscall.Setlogin": "syscall",
- "syscall.Setpgid": "syscall",
- "syscall.Setpriority": "syscall",
- "syscall.Setprivexec": "syscall",
- "syscall.Setregid": "syscall",
- "syscall.Setresgid": "syscall",
- "syscall.Setresuid": "syscall",
- "syscall.Setreuid": "syscall",
- "syscall.Setrlimit": "syscall",
- "syscall.Setsid": "syscall",
- "syscall.Setsockopt": "syscall",
- "syscall.SetsockoptByte": "syscall",
- "syscall.SetsockoptICMPv6Filter": "syscall",
- "syscall.SetsockoptIPMreq": "syscall",
- "syscall.SetsockoptIPMreqn": "syscall",
- "syscall.SetsockoptIPv6Mreq": "syscall",
- "syscall.SetsockoptInet4Addr": "syscall",
- "syscall.SetsockoptInt": "syscall",
- "syscall.SetsockoptLinger": "syscall",
- "syscall.SetsockoptString": "syscall",
- "syscall.SetsockoptTimeval": "syscall",
- "syscall.Settimeofday": "syscall",
- "syscall.Setuid": "syscall",
- "syscall.Setxattr": "syscall",
- "syscall.Shutdown": "syscall",
- "syscall.SidTypeAlias": "syscall",
- "syscall.SidTypeComputer": "syscall",
- "syscall.SidTypeDeletedAccount": "syscall",
- "syscall.SidTypeDomain": "syscall",
- "syscall.SidTypeGroup": "syscall",
- "syscall.SidTypeInvalid": "syscall",
- "syscall.SidTypeLabel": "syscall",
- "syscall.SidTypeUnknown": "syscall",
- "syscall.SidTypeUser": "syscall",
- "syscall.SidTypeWellKnownGroup": "syscall",
- "syscall.Signal": "syscall",
- "syscall.SizeofBpfHdr": "syscall",
- "syscall.SizeofBpfInsn": "syscall",
- "syscall.SizeofBpfProgram": "syscall",
- "syscall.SizeofBpfStat": "syscall",
- "syscall.SizeofBpfVersion": "syscall",
- "syscall.SizeofBpfZbuf": "syscall",
- "syscall.SizeofBpfZbufHeader": "syscall",
- "syscall.SizeofCmsghdr": "syscall",
- "syscall.SizeofICMPv6Filter": "syscall",
- "syscall.SizeofIPMreq": "syscall",
- "syscall.SizeofIPMreqn": "syscall",
- "syscall.SizeofIPv6MTUInfo": "syscall",
- "syscall.SizeofIPv6Mreq": "syscall",
- "syscall.SizeofIfAddrmsg": "syscall",
- "syscall.SizeofIfAnnounceMsghdr": "syscall",
- "syscall.SizeofIfData": "syscall",
- "syscall.SizeofIfInfomsg": "syscall",
- "syscall.SizeofIfMsghdr": "syscall",
- "syscall.SizeofIfaMsghdr": "syscall",
- "syscall.SizeofIfmaMsghdr": "syscall",
- "syscall.SizeofIfmaMsghdr2": "syscall",
- "syscall.SizeofInet4Pktinfo": "syscall",
- "syscall.SizeofInet6Pktinfo": "syscall",
- "syscall.SizeofInotifyEvent": "syscall",
- "syscall.SizeofLinger": "syscall",
- "syscall.SizeofMsghdr": "syscall",
- "syscall.SizeofNlAttr": "syscall",
- "syscall.SizeofNlMsgerr": "syscall",
- "syscall.SizeofNlMsghdr": "syscall",
- "syscall.SizeofRtAttr": "syscall",
- "syscall.SizeofRtGenmsg": "syscall",
- "syscall.SizeofRtMetrics": "syscall",
- "syscall.SizeofRtMsg": "syscall",
- "syscall.SizeofRtMsghdr": "syscall",
- "syscall.SizeofRtNexthop": "syscall",
- "syscall.SizeofSockFilter": "syscall",
- "syscall.SizeofSockFprog": "syscall",
- "syscall.SizeofSockaddrAny": "syscall",
- "syscall.SizeofSockaddrDatalink": "syscall",
- "syscall.SizeofSockaddrInet4": "syscall",
- "syscall.SizeofSockaddrInet6": "syscall",
- "syscall.SizeofSockaddrLinklayer": "syscall",
- "syscall.SizeofSockaddrNetlink": "syscall",
- "syscall.SizeofSockaddrUnix": "syscall",
- "syscall.SizeofTCPInfo": "syscall",
- "syscall.SizeofUcred": "syscall",
- "syscall.SlicePtrFromStrings": "syscall",
- "syscall.SockFilter": "syscall",
- "syscall.SockFprog": "syscall",
- "syscall.SockaddrDatalink": "syscall",
- "syscall.SockaddrGen": "syscall",
- "syscall.SockaddrInet4": "syscall",
- "syscall.SockaddrInet6": "syscall",
- "syscall.SockaddrLinklayer": "syscall",
- "syscall.SockaddrNetlink": "syscall",
- "syscall.SockaddrUnix": "syscall",
- "syscall.Socket": "syscall",
- "syscall.SocketControlMessage": "syscall",
- "syscall.SocketDisableIPv6": "syscall",
- "syscall.Socketpair": "syscall",
- "syscall.Splice": "syscall",
- "syscall.StartProcess": "syscall",
- "syscall.StartupInfo": "syscall",
- "syscall.Stat": "syscall",
- "syscall.Stat_t": "syscall",
- "syscall.Statfs": "syscall",
- "syscall.Statfs_t": "syscall",
- "syscall.Stderr": "syscall",
- "syscall.Stdin": "syscall",
- "syscall.Stdout": "syscall",
- "syscall.StringBytePtr": "syscall",
- "syscall.StringByteSlice": "syscall",
- "syscall.StringSlicePtr": "syscall",
- "syscall.StringToSid": "syscall",
- "syscall.StringToUTF16": "syscall",
- "syscall.StringToUTF16Ptr": "syscall",
- "syscall.Symlink": "syscall",
- "syscall.Sync": "syscall",
- "syscall.SyncFileRange": "syscall",
- "syscall.SysProcAttr": "syscall",
- "syscall.SysProcIDMap": "syscall",
- "syscall.Syscall": "syscall",
- "syscall.Syscall12": "syscall",
- "syscall.Syscall15": "syscall",
- "syscall.Syscall6": "syscall",
- "syscall.Syscall9": "syscall",
- "syscall.Sysctl": "syscall",
- "syscall.SysctlUint32": "syscall",
- "syscall.Sysctlnode": "syscall",
- "syscall.Sysinfo": "syscall",
- "syscall.Sysinfo_t": "syscall",
- "syscall.Systemtime": "syscall",
- "syscall.TCGETS": "syscall",
- "syscall.TCIFLUSH": "syscall",
- "syscall.TCIOFLUSH": "syscall",
- "syscall.TCOFLUSH": "syscall",
- "syscall.TCPInfo": "syscall",
- "syscall.TCPKeepalive": "syscall",
- "syscall.TCP_CA_NAME_MAX": "syscall",
- "syscall.TCP_CONGCTL": "syscall",
- "syscall.TCP_CONGESTION": "syscall",
- "syscall.TCP_CONNECTIONTIMEOUT": "syscall",
- "syscall.TCP_CORK": "syscall",
- "syscall.TCP_DEFER_ACCEPT": "syscall",
- "syscall.TCP_INFO": "syscall",
- "syscall.TCP_KEEPALIVE": "syscall",
- "syscall.TCP_KEEPCNT": "syscall",
- "syscall.TCP_KEEPIDLE": "syscall",
- "syscall.TCP_KEEPINIT": "syscall",
- "syscall.TCP_KEEPINTVL": "syscall",
- "syscall.TCP_LINGER2": "syscall",
- "syscall.TCP_MAXBURST": "syscall",
- "syscall.TCP_MAXHLEN": "syscall",
- "syscall.TCP_MAXOLEN": "syscall",
- "syscall.TCP_MAXSEG": "syscall",
- "syscall.TCP_MAXWIN": "syscall",
- "syscall.TCP_MAX_SACK": "syscall",
- "syscall.TCP_MAX_WINSHIFT": "syscall",
- "syscall.TCP_MD5SIG": "syscall",
- "syscall.TCP_MD5SIG_MAXKEYLEN": "syscall",
- "syscall.TCP_MINMSS": "syscall",
- "syscall.TCP_MINMSSOVERLOAD": "syscall",
- "syscall.TCP_MSS": "syscall",
- "syscall.TCP_NODELAY": "syscall",
- "syscall.TCP_NOOPT": "syscall",
- "syscall.TCP_NOPUSH": "syscall",
- "syscall.TCP_NSTATES": "syscall",
- "syscall.TCP_QUICKACK": "syscall",
- "syscall.TCP_RXT_CONNDROPTIME": "syscall",
- "syscall.TCP_RXT_FINDROP": "syscall",
- "syscall.TCP_SACK_ENABLE": "syscall",
- "syscall.TCP_SYNCNT": "syscall",
- "syscall.TCP_VENDOR": "syscall",
- "syscall.TCP_WINDOW_CLAMP": "syscall",
- "syscall.TCSAFLUSH": "syscall",
- "syscall.TCSETS": "syscall",
- "syscall.TF_DISCONNECT": "syscall",
- "syscall.TF_REUSE_SOCKET": "syscall",
- "syscall.TF_USE_DEFAULT_WORKER": "syscall",
- "syscall.TF_USE_KERNEL_APC": "syscall",
- "syscall.TF_USE_SYSTEM_THREAD": "syscall",
- "syscall.TF_WRITE_BEHIND": "syscall",
- "syscall.TH32CS_INHERIT": "syscall",
- "syscall.TH32CS_SNAPALL": "syscall",
- "syscall.TH32CS_SNAPHEAPLIST": "syscall",
- "syscall.TH32CS_SNAPMODULE": "syscall",
- "syscall.TH32CS_SNAPMODULE32": "syscall",
- "syscall.TH32CS_SNAPPROCESS": "syscall",
- "syscall.TH32CS_SNAPTHREAD": "syscall",
- "syscall.TIME_ZONE_ID_DAYLIGHT": "syscall",
- "syscall.TIME_ZONE_ID_STANDARD": "syscall",
- "syscall.TIME_ZONE_ID_UNKNOWN": "syscall",
- "syscall.TIOCCBRK": "syscall",
- "syscall.TIOCCDTR": "syscall",
- "syscall.TIOCCONS": "syscall",
- "syscall.TIOCDCDTIMESTAMP": "syscall",
- "syscall.TIOCDRAIN": "syscall",
- "syscall.TIOCDSIMICROCODE": "syscall",
- "syscall.TIOCEXCL": "syscall",
- "syscall.TIOCEXT": "syscall",
- "syscall.TIOCFLAG_CDTRCTS": "syscall",
- "syscall.TIOCFLAG_CLOCAL": "syscall",
- "syscall.TIOCFLAG_CRTSCTS": "syscall",
- "syscall.TIOCFLAG_MDMBUF": "syscall",
- "syscall.TIOCFLAG_PPS": "syscall",
- "syscall.TIOCFLAG_SOFTCAR": "syscall",
- "syscall.TIOCFLUSH": "syscall",
- "syscall.TIOCGDEV": "syscall",
- "syscall.TIOCGDRAINWAIT": "syscall",
- "syscall.TIOCGETA": "syscall",
- "syscall.TIOCGETD": "syscall",
- "syscall.TIOCGFLAGS": "syscall",
- "syscall.TIOCGICOUNT": "syscall",
- "syscall.TIOCGLCKTRMIOS": "syscall",
- "syscall.TIOCGLINED": "syscall",
- "syscall.TIOCGPGRP": "syscall",
- "syscall.TIOCGPTN": "syscall",
- "syscall.TIOCGQSIZE": "syscall",
- "syscall.TIOCGRANTPT": "syscall",
- "syscall.TIOCGRS485": "syscall",
- "syscall.TIOCGSERIAL": "syscall",
- "syscall.TIOCGSID": "syscall",
- "syscall.TIOCGSIZE": "syscall",
- "syscall.TIOCGSOFTCAR": "syscall",
- "syscall.TIOCGTSTAMP": "syscall",
- "syscall.TIOCGWINSZ": "syscall",
- "syscall.TIOCINQ": "syscall",
- "syscall.TIOCIXOFF": "syscall",
- "syscall.TIOCIXON": "syscall",
- "syscall.TIOCLINUX": "syscall",
- "syscall.TIOCMBIC": "syscall",
- "syscall.TIOCMBIS": "syscall",
- "syscall.TIOCMGDTRWAIT": "syscall",
- "syscall.TIOCMGET": "syscall",
- "syscall.TIOCMIWAIT": "syscall",
- "syscall.TIOCMODG": "syscall",
- "syscall.TIOCMODS": "syscall",
- "syscall.TIOCMSDTRWAIT": "syscall",
- "syscall.TIOCMSET": "syscall",
- "syscall.TIOCM_CAR": "syscall",
- "syscall.TIOCM_CD": "syscall",
- "syscall.TIOCM_CTS": "syscall",
- "syscall.TIOCM_DCD": "syscall",
- "syscall.TIOCM_DSR": "syscall",
- "syscall.TIOCM_DTR": "syscall",
- "syscall.TIOCM_LE": "syscall",
- "syscall.TIOCM_RI": "syscall",
- "syscall.TIOCM_RNG": "syscall",
- "syscall.TIOCM_RTS": "syscall",
- "syscall.TIOCM_SR": "syscall",
- "syscall.TIOCM_ST": "syscall",
- "syscall.TIOCNOTTY": "syscall",
- "syscall.TIOCNXCL": "syscall",
- "syscall.TIOCOUTQ": "syscall",
- "syscall.TIOCPKT": "syscall",
- "syscall.TIOCPKT_DATA": "syscall",
- "syscall.TIOCPKT_DOSTOP": "syscall",
- "syscall.TIOCPKT_FLUSHREAD": "syscall",
- "syscall.TIOCPKT_FLUSHWRITE": "syscall",
- "syscall.TIOCPKT_IOCTL": "syscall",
- "syscall.TIOCPKT_NOSTOP": "syscall",
- "syscall.TIOCPKT_START": "syscall",
- "syscall.TIOCPKT_STOP": "syscall",
- "syscall.TIOCPTMASTER": "syscall",
- "syscall.TIOCPTMGET": "syscall",
- "syscall.TIOCPTSNAME": "syscall",
- "syscall.TIOCPTYGNAME": "syscall",
- "syscall.TIOCPTYGRANT": "syscall",
- "syscall.TIOCPTYUNLK": "syscall",
- "syscall.TIOCRCVFRAME": "syscall",
- "syscall.TIOCREMOTE": "syscall",
- "syscall.TIOCSBRK": "syscall",
- "syscall.TIOCSCONS": "syscall",
- "syscall.TIOCSCTTY": "syscall",
- "syscall.TIOCSDRAINWAIT": "syscall",
- "syscall.TIOCSDTR": "syscall",
- "syscall.TIOCSERCONFIG": "syscall",
- "syscall.TIOCSERGETLSR": "syscall",
- "syscall.TIOCSERGETMULTI": "syscall",
- "syscall.TIOCSERGSTRUCT": "syscall",
- "syscall.TIOCSERGWILD": "syscall",
- "syscall.TIOCSERSETMULTI": "syscall",
- "syscall.TIOCSERSWILD": "syscall",
- "syscall.TIOCSER_TEMT": "syscall",
- "syscall.TIOCSETA": "syscall",
- "syscall.TIOCSETAF": "syscall",
- "syscall.TIOCSETAW": "syscall",
- "syscall.TIOCSETD": "syscall",
- "syscall.TIOCSFLAGS": "syscall",
- "syscall.TIOCSIG": "syscall",
- "syscall.TIOCSLCKTRMIOS": "syscall",
- "syscall.TIOCSLINED": "syscall",
- "syscall.TIOCSPGRP": "syscall",
- "syscall.TIOCSPTLCK": "syscall",
- "syscall.TIOCSQSIZE": "syscall",
- "syscall.TIOCSRS485": "syscall",
- "syscall.TIOCSSERIAL": "syscall",
- "syscall.TIOCSSIZE": "syscall",
- "syscall.TIOCSSOFTCAR": "syscall",
- "syscall.TIOCSTART": "syscall",
- "syscall.TIOCSTAT": "syscall",
- "syscall.TIOCSTI": "syscall",
- "syscall.TIOCSTOP": "syscall",
- "syscall.TIOCSTSTAMP": "syscall",
- "syscall.TIOCSWINSZ": "syscall",
- "syscall.TIOCTIMESTAMP": "syscall",
- "syscall.TIOCUCNTL": "syscall",
- "syscall.TIOCVHANGUP": "syscall",
- "syscall.TIOCXMTFRAME": "syscall",
- "syscall.TOKEN_ADJUST_DEFAULT": "syscall",
- "syscall.TOKEN_ADJUST_GROUPS": "syscall",
- "syscall.TOKEN_ADJUST_PRIVILEGES": "syscall",
- "syscall.TOKEN_ALL_ACCESS": "syscall",
- "syscall.TOKEN_ASSIGN_PRIMARY": "syscall",
- "syscall.TOKEN_DUPLICATE": "syscall",
- "syscall.TOKEN_EXECUTE": "syscall",
- "syscall.TOKEN_IMPERSONATE": "syscall",
- "syscall.TOKEN_QUERY": "syscall",
- "syscall.TOKEN_QUERY_SOURCE": "syscall",
- "syscall.TOKEN_READ": "syscall",
- "syscall.TOKEN_WRITE": "syscall",
- "syscall.TOSTOP": "syscall",
- "syscall.TRUNCATE_EXISTING": "syscall",
- "syscall.TUNATTACHFILTER": "syscall",
- "syscall.TUNDETACHFILTER": "syscall",
- "syscall.TUNGETFEATURES": "syscall",
- "syscall.TUNGETIFF": "syscall",
- "syscall.TUNGETSNDBUF": "syscall",
- "syscall.TUNGETVNETHDRSZ": "syscall",
- "syscall.TUNSETDEBUG": "syscall",
- "syscall.TUNSETGROUP": "syscall",
- "syscall.TUNSETIFF": "syscall",
- "syscall.TUNSETLINK": "syscall",
- "syscall.TUNSETNOCSUM": "syscall",
- "syscall.TUNSETOFFLOAD": "syscall",
- "syscall.TUNSETOWNER": "syscall",
- "syscall.TUNSETPERSIST": "syscall",
- "syscall.TUNSETSNDBUF": "syscall",
- "syscall.TUNSETTXFILTER": "syscall",
- "syscall.TUNSETVNETHDRSZ": "syscall",
- "syscall.Tee": "syscall",
- "syscall.TerminateProcess": "syscall",
- "syscall.Termios": "syscall",
- "syscall.Tgkill": "syscall",
- "syscall.Time": "syscall",
- "syscall.Time_t": "syscall",
- "syscall.Times": "syscall",
- "syscall.Timespec": "syscall",
- "syscall.TimespecToNsec": "syscall",
- "syscall.Timeval": "syscall",
- "syscall.Timeval32": "syscall",
- "syscall.TimevalToNsec": "syscall",
- "syscall.Timex": "syscall",
- "syscall.Timezoneinformation": "syscall",
- "syscall.Tms": "syscall",
- "syscall.Token": "syscall",
- "syscall.TokenAccessInformation": "syscall",
- "syscall.TokenAuditPolicy": "syscall",
- "syscall.TokenDefaultDacl": "syscall",
- "syscall.TokenElevation": "syscall",
- "syscall.TokenElevationType": "syscall",
- "syscall.TokenGroups": "syscall",
- "syscall.TokenGroupsAndPrivileges": "syscall",
- "syscall.TokenHasRestrictions": "syscall",
- "syscall.TokenImpersonationLevel": "syscall",
- "syscall.TokenIntegrityLevel": "syscall",
- "syscall.TokenLinkedToken": "syscall",
- "syscall.TokenLogonSid": "syscall",
- "syscall.TokenMandatoryPolicy": "syscall",
- "syscall.TokenOrigin": "syscall",
- "syscall.TokenOwner": "syscall",
- "syscall.TokenPrimaryGroup": "syscall",
- "syscall.TokenPrivileges": "syscall",
- "syscall.TokenRestrictedSids": "syscall",
- "syscall.TokenSandBoxInert": "syscall",
- "syscall.TokenSessionId": "syscall",
- "syscall.TokenSessionReference": "syscall",
- "syscall.TokenSource": "syscall",
- "syscall.TokenStatistics": "syscall",
- "syscall.TokenType": "syscall",
- "syscall.TokenUIAccess": "syscall",
- "syscall.TokenUser": "syscall",
- "syscall.TokenVirtualizationAllowed": "syscall",
- "syscall.TokenVirtualizationEnabled": "syscall",
- "syscall.Tokenprimarygroup": "syscall",
- "syscall.Tokenuser": "syscall",
- "syscall.TranslateAccountName": "syscall",
- "syscall.TranslateName": "syscall",
- "syscall.TransmitFile": "syscall",
- "syscall.TransmitFileBuffers": "syscall",
- "syscall.Truncate": "syscall",
- "syscall.USAGE_MATCH_TYPE_AND": "syscall",
- "syscall.USAGE_MATCH_TYPE_OR": "syscall",
- "syscall.UTF16FromString": "syscall",
- "syscall.UTF16PtrFromString": "syscall",
- "syscall.UTF16ToString": "syscall",
- "syscall.Ucred": "syscall",
- "syscall.Umask": "syscall",
- "syscall.Uname": "syscall",
- "syscall.Undelete": "syscall",
- "syscall.UnixCredentials": "syscall",
- "syscall.UnixRights": "syscall",
- "syscall.Unlink": "syscall",
- "syscall.Unlinkat": "syscall",
- "syscall.UnmapViewOfFile": "syscall",
- "syscall.Unmount": "syscall",
- "syscall.Unsetenv": "syscall",
- "syscall.Unshare": "syscall",
- "syscall.UserInfo10": "syscall",
- "syscall.Ustat": "syscall",
- "syscall.Ustat_t": "syscall",
- "syscall.Utimbuf": "syscall",
- "syscall.Utime": "syscall",
- "syscall.Utimes": "syscall",
- "syscall.UtimesNano": "syscall",
- "syscall.Utsname": "syscall",
- "syscall.VDISCARD": "syscall",
- "syscall.VDSUSP": "syscall",
- "syscall.VEOF": "syscall",
- "syscall.VEOL": "syscall",
- "syscall.VEOL2": "syscall",
- "syscall.VERASE": "syscall",
- "syscall.VERASE2": "syscall",
- "syscall.VINTR": "syscall",
- "syscall.VKILL": "syscall",
- "syscall.VLNEXT": "syscall",
- "syscall.VMIN": "syscall",
- "syscall.VQUIT": "syscall",
- "syscall.VREPRINT": "syscall",
- "syscall.VSTART": "syscall",
- "syscall.VSTATUS": "syscall",
- "syscall.VSTOP": "syscall",
- "syscall.VSUSP": "syscall",
- "syscall.VSWTC": "syscall",
- "syscall.VT0": "syscall",
- "syscall.VT1": "syscall",
- "syscall.VTDLY": "syscall",
- "syscall.VTIME": "syscall",
- "syscall.VWERASE": "syscall",
- "syscall.VirtualLock": "syscall",
- "syscall.VirtualUnlock": "syscall",
- "syscall.WAIT_ABANDONED": "syscall",
- "syscall.WAIT_FAILED": "syscall",
- "syscall.WAIT_OBJECT_0": "syscall",
- "syscall.WAIT_TIMEOUT": "syscall",
- "syscall.WALL": "syscall",
- "syscall.WALLSIG": "syscall",
- "syscall.WALTSIG": "syscall",
- "syscall.WCLONE": "syscall",
- "syscall.WCONTINUED": "syscall",
- "syscall.WCOREFLAG": "syscall",
- "syscall.WEXITED": "syscall",
- "syscall.WLINUXCLONE": "syscall",
- "syscall.WNOHANG": "syscall",
- "syscall.WNOTHREAD": "syscall",
- "syscall.WNOWAIT": "syscall",
- "syscall.WNOZOMBIE": "syscall",
- "syscall.WOPTSCHECKED": "syscall",
- "syscall.WORDSIZE": "syscall",
- "syscall.WSABuf": "syscall",
- "syscall.WSACleanup": "syscall",
- "syscall.WSADESCRIPTION_LEN": "syscall",
- "syscall.WSAData": "syscall",
- "syscall.WSAEACCES": "syscall",
- "syscall.WSAECONNABORTED": "syscall",
- "syscall.WSAECONNRESET": "syscall",
- "syscall.WSAEnumProtocols": "syscall",
- "syscall.WSAID_CONNECTEX": "syscall",
- "syscall.WSAIoctl": "syscall",
- "syscall.WSAPROTOCOL_LEN": "syscall",
- "syscall.WSAProtocolChain": "syscall",
- "syscall.WSAProtocolInfo": "syscall",
- "syscall.WSARecv": "syscall",
- "syscall.WSARecvFrom": "syscall",
- "syscall.WSASYS_STATUS_LEN": "syscall",
- "syscall.WSASend": "syscall",
- "syscall.WSASendTo": "syscall",
- "syscall.WSASendto": "syscall",
- "syscall.WSAStartup": "syscall",
- "syscall.WSTOPPED": "syscall",
- "syscall.WTRAPPED": "syscall",
- "syscall.WUNTRACED": "syscall",
- "syscall.Wait4": "syscall",
- "syscall.WaitForSingleObject": "syscall",
- "syscall.WaitStatus": "syscall",
- "syscall.Win32FileAttributeData": "syscall",
- "syscall.Win32finddata": "syscall",
- "syscall.Write": "syscall",
- "syscall.WriteConsole": "syscall",
- "syscall.WriteFile": "syscall",
- "syscall.X509_ASN_ENCODING": "syscall",
- "syscall.XCASE": "syscall",
- "syscall.XP1_CONNECTIONLESS": "syscall",
- "syscall.XP1_CONNECT_DATA": "syscall",
- "syscall.XP1_DISCONNECT_DATA": "syscall",
- "syscall.XP1_EXPEDITED_DATA": "syscall",
- "syscall.XP1_GRACEFUL_CLOSE": "syscall",
- "syscall.XP1_GUARANTEED_DELIVERY": "syscall",
- "syscall.XP1_GUARANTEED_ORDER": "syscall",
- "syscall.XP1_IFS_HANDLES": "syscall",
- "syscall.XP1_MESSAGE_ORIENTED": "syscall",
- "syscall.XP1_MULTIPOINT_CONTROL_PLANE": "syscall",
- "syscall.XP1_MULTIPOINT_DATA_PLANE": "syscall",
- "syscall.XP1_PARTIAL_MESSAGE": "syscall",
- "syscall.XP1_PSEUDO_STREAM": "syscall",
- "syscall.XP1_QOS_SUPPORTED": "syscall",
- "syscall.XP1_SAN_SUPPORT_SDP": "syscall",
- "syscall.XP1_SUPPORT_BROADCAST": "syscall",
- "syscall.XP1_SUPPORT_MULTIPOINT": "syscall",
- "syscall.XP1_UNI_RECV": "syscall",
- "syscall.XP1_UNI_SEND": "syscall",
- "syslog.Dial": "log/syslog",
- "syslog.LOG_ALERT": "log/syslog",
- "syslog.LOG_AUTH": "log/syslog",
- "syslog.LOG_AUTHPRIV": "log/syslog",
- "syslog.LOG_CRIT": "log/syslog",
- "syslog.LOG_CRON": "log/syslog",
- "syslog.LOG_DAEMON": "log/syslog",
- "syslog.LOG_DEBUG": "log/syslog",
- "syslog.LOG_EMERG": "log/syslog",
- "syslog.LOG_ERR": "log/syslog",
- "syslog.LOG_FTP": "log/syslog",
- "syslog.LOG_INFO": "log/syslog",
- "syslog.LOG_KERN": "log/syslog",
- "syslog.LOG_LOCAL0": "log/syslog",
- "syslog.LOG_LOCAL1": "log/syslog",
- "syslog.LOG_LOCAL2": "log/syslog",
- "syslog.LOG_LOCAL3": "log/syslog",
- "syslog.LOG_LOCAL4": "log/syslog",
- "syslog.LOG_LOCAL5": "log/syslog",
- "syslog.LOG_LOCAL6": "log/syslog",
- "syslog.LOG_LOCAL7": "log/syslog",
- "syslog.LOG_LPR": "log/syslog",
- "syslog.LOG_MAIL": "log/syslog",
- "syslog.LOG_NEWS": "log/syslog",
- "syslog.LOG_NOTICE": "log/syslog",
- "syslog.LOG_SYSLOG": "log/syslog",
- "syslog.LOG_USER": "log/syslog",
- "syslog.LOG_UUCP": "log/syslog",
- "syslog.LOG_WARNING": "log/syslog",
- "syslog.New": "log/syslog",
- "syslog.NewLogger": "log/syslog",
- "syslog.Priority": "log/syslog",
- "syslog.Writer": "log/syslog",
- "tabwriter.AlignRight": "text/tabwriter",
- "tabwriter.Debug": "text/tabwriter",
- "tabwriter.DiscardEmptyColumns": "text/tabwriter",
- "tabwriter.Escape": "text/tabwriter",
- "tabwriter.FilterHTML": "text/tabwriter",
- "tabwriter.NewWriter": "text/tabwriter",
- "tabwriter.StripEscape": "text/tabwriter",
- "tabwriter.TabIndent": "text/tabwriter",
- "tabwriter.Writer": "text/tabwriter",
- "tar.ErrFieldTooLong": "archive/tar",
- "tar.ErrHeader": "archive/tar",
- "tar.ErrWriteAfterClose": "archive/tar",
- "tar.ErrWriteTooLong": "archive/tar",
- "tar.FileInfoHeader": "archive/tar",
- "tar.Header": "archive/tar",
- "tar.NewReader": "archive/tar",
- "tar.NewWriter": "archive/tar",
- "tar.Reader": "archive/tar",
- "tar.TypeBlock": "archive/tar",
- "tar.TypeChar": "archive/tar",
- "tar.TypeCont": "archive/tar",
- "tar.TypeDir": "archive/tar",
- "tar.TypeFifo": "archive/tar",
- "tar.TypeGNULongLink": "archive/tar",
- "tar.TypeGNULongName": "archive/tar",
- "tar.TypeGNUSparse": "archive/tar",
- "tar.TypeLink": "archive/tar",
- "tar.TypeReg": "archive/tar",
- "tar.TypeRegA": "archive/tar",
- "tar.TypeSymlink": "archive/tar",
- "tar.TypeXGlobalHeader": "archive/tar",
- "tar.TypeXHeader": "archive/tar",
- "tar.Writer": "archive/tar",
- "template.CSS": "html/template",
- "template.ErrAmbigContext": "html/template",
- "template.ErrBadHTML": "html/template",
- "template.ErrBranchEnd": "html/template",
- "template.ErrEndContext": "html/template",
- "template.ErrNoSuchTemplate": "html/template",
- "template.ErrOutputContext": "html/template",
- "template.ErrPartialCharset": "html/template",
- "template.ErrPartialEscape": "html/template",
- "template.ErrPredefinedEscaper": "html/template",
- "template.ErrRangeLoopReentry": "html/template",
- "template.ErrSlashAmbig": "html/template",
- "template.Error": "html/template",
- "template.ErrorCode": "html/template",
- "template.ExecError": "text/template",
- // "template.FuncMap" is ambiguous
- "template.HTML": "html/template",
- "template.HTMLAttr": "html/template",
- // "template.HTMLEscape" is ambiguous
- // "template.HTMLEscapeString" is ambiguous
- // "template.HTMLEscaper" is ambiguous
- // "template.IsTrue" is ambiguous
- "template.JS": "html/template",
- // "template.JSEscape" is ambiguous
- // "template.JSEscapeString" is ambiguous
- // "template.JSEscaper" is ambiguous
- "template.JSStr": "html/template",
- // "template.Must" is ambiguous
- // "template.New" is ambiguous
- "template.OK": "html/template",
- // "template.ParseFiles" is ambiguous
- // "template.ParseGlob" is ambiguous
- // "template.Template" is ambiguous
- "template.URL": "html/template",
- // "template.URLQueryEscaper" is ambiguous
- "testing.AllocsPerRun": "testing",
- "testing.B": "testing",
- "testing.Benchmark": "testing",
- "testing.BenchmarkResult": "testing",
- "testing.Cover": "testing",
- "testing.CoverBlock": "testing",
- "testing.CoverMode": "testing",
- "testing.Coverage": "testing",
- "testing.InternalBenchmark": "testing",
- "testing.InternalExample": "testing",
- "testing.InternalTest": "testing",
- "testing.M": "testing",
- "testing.Main": "testing",
- "testing.MainStart": "testing",
- "testing.PB": "testing",
- "testing.RegisterCover": "testing",
- "testing.RunBenchmarks": "testing",
- "testing.RunExamples": "testing",
- "testing.RunTests": "testing",
- "testing.Short": "testing",
- "testing.T": "testing",
- "testing.Verbose": "testing",
- "textproto.CanonicalMIMEHeaderKey": "net/textproto",
- "textproto.Conn": "net/textproto",
- "textproto.Dial": "net/textproto",
- "textproto.Error": "net/textproto",
- "textproto.MIMEHeader": "net/textproto",
- "textproto.NewConn": "net/textproto",
- "textproto.NewReader": "net/textproto",
- "textproto.NewWriter": "net/textproto",
- "textproto.Pipeline": "net/textproto",
- "textproto.ProtocolError": "net/textproto",
- "textproto.Reader": "net/textproto",
- "textproto.TrimBytes": "net/textproto",
- "textproto.TrimString": "net/textproto",
- "textproto.Writer": "net/textproto",
- "time.ANSIC": "time",
- "time.After": "time",
- "time.AfterFunc": "time",
- "time.April": "time",
- "time.August": "time",
- "time.Date": "time",
- "time.December": "time",
- "time.Duration": "time",
- "time.February": "time",
- "time.FixedZone": "time",
- "time.Friday": "time",
- "time.Hour": "time",
- "time.January": "time",
- "time.July": "time",
- "time.June": "time",
- "time.Kitchen": "time",
- "time.LoadLocation": "time",
- "time.Local": "time",
- "time.Location": "time",
- "time.March": "time",
- "time.May": "time",
- "time.Microsecond": "time",
- "time.Millisecond": "time",
- "time.Minute": "time",
- "time.Monday": "time",
- "time.Month": "time",
- "time.Nanosecond": "time",
- "time.NewTicker": "time",
- "time.NewTimer": "time",
- "time.November": "time",
- "time.Now": "time",
- "time.October": "time",
- "time.Parse": "time",
- "time.ParseDuration": "time",
- "time.ParseError": "time",
- "time.ParseInLocation": "time",
- "time.RFC1123": "time",
- "time.RFC1123Z": "time",
- "time.RFC3339": "time",
- "time.RFC3339Nano": "time",
- "time.RFC822": "time",
- "time.RFC822Z": "time",
- "time.RFC850": "time",
- "time.RubyDate": "time",
- "time.Saturday": "time",
- "time.Second": "time",
- "time.September": "time",
- "time.Since": "time",
- "time.Sleep": "time",
- "time.Stamp": "time",
- "time.StampMicro": "time",
- "time.StampMilli": "time",
- "time.StampNano": "time",
- "time.Sunday": "time",
- "time.Thursday": "time",
- "time.Tick": "time",
- "time.Ticker": "time",
- "time.Time": "time",
- "time.Timer": "time",
- "time.Tuesday": "time",
- "time.UTC": "time",
- "time.Unix": "time",
- "time.UnixDate": "time",
- "time.Until": "time",
- "time.Wednesday": "time",
- "time.Weekday": "time",
- "tls.Certificate": "crypto/tls",
- "tls.CertificateRequestInfo": "crypto/tls",
- "tls.Client": "crypto/tls",
- "tls.ClientAuthType": "crypto/tls",
- "tls.ClientHelloInfo": "crypto/tls",
- "tls.ClientSessionCache": "crypto/tls",
- "tls.ClientSessionState": "crypto/tls",
- "tls.Config": "crypto/tls",
- "tls.Conn": "crypto/tls",
- "tls.ConnectionState": "crypto/tls",
- "tls.CurveID": "crypto/tls",
- "tls.CurveP256": "crypto/tls",
- "tls.CurveP384": "crypto/tls",
- "tls.CurveP521": "crypto/tls",
- "tls.Dial": "crypto/tls",
- "tls.DialWithDialer": "crypto/tls",
- "tls.ECDSAWithP256AndSHA256": "crypto/tls",
- "tls.ECDSAWithP384AndSHA384": "crypto/tls",
- "tls.ECDSAWithP521AndSHA512": "crypto/tls",
- "tls.Listen": "crypto/tls",
- "tls.LoadX509KeyPair": "crypto/tls",
- "tls.NewLRUClientSessionCache": "crypto/tls",
- "tls.NewListener": "crypto/tls",
- "tls.NoClientCert": "crypto/tls",
- "tls.PKCS1WithSHA1": "crypto/tls",
- "tls.PKCS1WithSHA256": "crypto/tls",
- "tls.PKCS1WithSHA384": "crypto/tls",
- "tls.PKCS1WithSHA512": "crypto/tls",
- "tls.PSSWithSHA256": "crypto/tls",
- "tls.PSSWithSHA384": "crypto/tls",
- "tls.PSSWithSHA512": "crypto/tls",
- "tls.RecordHeaderError": "crypto/tls",
- "tls.RenegotiateFreelyAsClient": "crypto/tls",
- "tls.RenegotiateNever": "crypto/tls",
- "tls.RenegotiateOnceAsClient": "crypto/tls",
- "tls.RenegotiationSupport": "crypto/tls",
- "tls.RequestClientCert": "crypto/tls",
- "tls.RequireAndVerifyClientCert": "crypto/tls",
- "tls.RequireAnyClientCert": "crypto/tls",
- "tls.Server": "crypto/tls",
- "tls.SignatureScheme": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305": "crypto/tls",
- "tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305": "crypto/tls",
- "tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA": "crypto/tls",
- "tls.TLS_FALLBACK_SCSV": "crypto/tls",
- "tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_128_CBC_SHA": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_128_CBC_SHA256": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_128_GCM_SHA256": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_256_CBC_SHA": "crypto/tls",
- "tls.TLS_RSA_WITH_AES_256_GCM_SHA384": "crypto/tls",
- "tls.TLS_RSA_WITH_RC4_128_SHA": "crypto/tls",
- "tls.VerifyClientCertIfGiven": "crypto/tls",
- "tls.VersionSSL30": "crypto/tls",
- "tls.VersionTLS10": "crypto/tls",
- "tls.VersionTLS11": "crypto/tls",
- "tls.VersionTLS12": "crypto/tls",
- "tls.X25519": "crypto/tls",
- "tls.X509KeyPair": "crypto/tls",
- "token.ADD": "go/token",
- "token.ADD_ASSIGN": "go/token",
- "token.AND": "go/token",
- "token.AND_ASSIGN": "go/token",
- "token.AND_NOT": "go/token",
- "token.AND_NOT_ASSIGN": "go/token",
- "token.ARROW": "go/token",
- "token.ASSIGN": "go/token",
- "token.BREAK": "go/token",
- "token.CASE": "go/token",
- "token.CHAN": "go/token",
- "token.CHAR": "go/token",
- "token.COLON": "go/token",
- "token.COMMA": "go/token",
- "token.COMMENT": "go/token",
- "token.CONST": "go/token",
- "token.CONTINUE": "go/token",
- "token.DEC": "go/token",
- "token.DEFAULT": "go/token",
- "token.DEFER": "go/token",
- "token.DEFINE": "go/token",
- "token.ELLIPSIS": "go/token",
- "token.ELSE": "go/token",
- "token.EOF": "go/token",
- "token.EQL": "go/token",
- "token.FALLTHROUGH": "go/token",
- "token.FLOAT": "go/token",
- "token.FOR": "go/token",
- "token.FUNC": "go/token",
- "token.File": "go/token",
- "token.FileSet": "go/token",
- "token.GEQ": "go/token",
- "token.GO": "go/token",
- "token.GOTO": "go/token",
- "token.GTR": "go/token",
- "token.HighestPrec": "go/token",
- "token.IDENT": "go/token",
- "token.IF": "go/token",
- "token.ILLEGAL": "go/token",
- "token.IMAG": "go/token",
- "token.IMPORT": "go/token",
- "token.INC": "go/token",
- "token.INT": "go/token",
- "token.INTERFACE": "go/token",
- "token.LAND": "go/token",
- "token.LBRACE": "go/token",
- "token.LBRACK": "go/token",
- "token.LEQ": "go/token",
- "token.LOR": "go/token",
- "token.LPAREN": "go/token",
- "token.LSS": "go/token",
- "token.Lookup": "go/token",
- "token.LowestPrec": "go/token",
- "token.MAP": "go/token",
- "token.MUL": "go/token",
- "token.MUL_ASSIGN": "go/token",
- "token.NEQ": "go/token",
- "token.NOT": "go/token",
- "token.NewFileSet": "go/token",
- "token.NoPos": "go/token",
- "token.OR": "go/token",
- "token.OR_ASSIGN": "go/token",
- "token.PACKAGE": "go/token",
- "token.PERIOD": "go/token",
- "token.Pos": "go/token",
- "token.Position": "go/token",
- "token.QUO": "go/token",
- "token.QUO_ASSIGN": "go/token",
- "token.RANGE": "go/token",
- "token.RBRACE": "go/token",
- "token.RBRACK": "go/token",
- "token.REM": "go/token",
- "token.REM_ASSIGN": "go/token",
- "token.RETURN": "go/token",
- "token.RPAREN": "go/token",
- "token.SELECT": "go/token",
- "token.SEMICOLON": "go/token",
- "token.SHL": "go/token",
- "token.SHL_ASSIGN": "go/token",
- "token.SHR": "go/token",
- "token.SHR_ASSIGN": "go/token",
- "token.STRING": "go/token",
- "token.STRUCT": "go/token",
- "token.SUB": "go/token",
- "token.SUB_ASSIGN": "go/token",
- "token.SWITCH": "go/token",
- "token.TYPE": "go/token",
- "token.Token": "go/token",
- "token.UnaryPrec": "go/token",
- "token.VAR": "go/token",
- "token.XOR": "go/token",
- "token.XOR_ASSIGN": "go/token",
- "trace.Start": "runtime/trace",
- "trace.Stop": "runtime/trace",
- "types.Array": "go/types",
- "types.AssertableTo": "go/types",
- "types.AssignableTo": "go/types",
- "types.Basic": "go/types",
- "types.BasicInfo": "go/types",
- "types.BasicKind": "go/types",
- "types.Bool": "go/types",
- "types.Builtin": "go/types",
- "types.Byte": "go/types",
- "types.Chan": "go/types",
- "types.ChanDir": "go/types",
- "types.Checker": "go/types",
- "types.Comparable": "go/types",
- "types.Complex128": "go/types",
- "types.Complex64": "go/types",
- "types.Config": "go/types",
- "types.Const": "go/types",
- "types.ConvertibleTo": "go/types",
- "types.DefPredeclaredTestFuncs": "go/types",
- "types.Default": "go/types",
- "types.Error": "go/types",
- "types.Eval": "go/types",
- "types.ExprString": "go/types",
- "types.FieldVal": "go/types",
- "types.Float32": "go/types",
- "types.Float64": "go/types",
- "types.Func": "go/types",
- "types.Id": "go/types",
- "types.Identical": "go/types",
- "types.IdenticalIgnoreTags": "go/types",
- "types.Implements": "go/types",
- "types.ImportMode": "go/types",
- "types.Importer": "go/types",
- "types.ImporterFrom": "go/types",
- "types.Info": "go/types",
- "types.Initializer": "go/types",
- "types.Int": "go/types",
- "types.Int16": "go/types",
- "types.Int32": "go/types",
- "types.Int64": "go/types",
- "types.Int8": "go/types",
- "types.Interface": "go/types",
- "types.Invalid": "go/types",
- "types.IsBoolean": "go/types",
- "types.IsComplex": "go/types",
- "types.IsConstType": "go/types",
- "types.IsFloat": "go/types",
- "types.IsInteger": "go/types",
- "types.IsInterface": "go/types",
- "types.IsNumeric": "go/types",
- "types.IsOrdered": "go/types",
- "types.IsString": "go/types",
- "types.IsUnsigned": "go/types",
- "types.IsUntyped": "go/types",
- "types.Label": "go/types",
- "types.LookupFieldOrMethod": "go/types",
- "types.Map": "go/types",
- "types.MethodExpr": "go/types",
- "types.MethodSet": "go/types",
- "types.MethodVal": "go/types",
- "types.MissingMethod": "go/types",
- "types.Named": "go/types",
- "types.NewArray": "go/types",
- "types.NewChan": "go/types",
- "types.NewChecker": "go/types",
- "types.NewConst": "go/types",
- "types.NewField": "go/types",
- "types.NewFunc": "go/types",
- "types.NewInterface": "go/types",
- "types.NewLabel": "go/types",
- "types.NewMap": "go/types",
- "types.NewMethodSet": "go/types",
- "types.NewNamed": "go/types",
- "types.NewPackage": "go/types",
- "types.NewParam": "go/types",
- "types.NewPkgName": "go/types",
- "types.NewPointer": "go/types",
- "types.NewScope": "go/types",
- "types.NewSignature": "go/types",
- "types.NewSlice": "go/types",
- "types.NewStruct": "go/types",
- "types.NewTuple": "go/types",
- "types.NewTypeName": "go/types",
- "types.NewVar": "go/types",
- "types.Nil": "go/types",
- "types.ObjectString": "go/types",
- "types.Package": "go/types",
- "types.PkgName": "go/types",
- "types.Pointer": "go/types",
- "types.Qualifier": "go/types",
- "types.RecvOnly": "go/types",
- "types.RelativeTo": "go/types",
- "types.Rune": "go/types",
- "types.Scope": "go/types",
- "types.Selection": "go/types",
- "types.SelectionKind": "go/types",
- "types.SelectionString": "go/types",
- "types.SendOnly": "go/types",
- "types.SendRecv": "go/types",
- "types.Signature": "go/types",
- "types.Sizes": "go/types",
- "types.SizesFor": "go/types",
- "types.Slice": "go/types",
- "types.StdSizes": "go/types",
- "types.String": "go/types",
- "types.Struct": "go/types",
- "types.Tuple": "go/types",
- "types.Typ": "go/types",
- "types.Type": "go/types",
- "types.TypeAndValue": "go/types",
- "types.TypeName": "go/types",
- "types.TypeString": "go/types",
- "types.Uint": "go/types",
- "types.Uint16": "go/types",
- "types.Uint32": "go/types",
- "types.Uint64": "go/types",
- "types.Uint8": "go/types",
- "types.Uintptr": "go/types",
- "types.Universe": "go/types",
- "types.Unsafe": "go/types",
- "types.UnsafePointer": "go/types",
- "types.UntypedBool": "go/types",
- "types.UntypedComplex": "go/types",
- "types.UntypedFloat": "go/types",
- "types.UntypedInt": "go/types",
- "types.UntypedNil": "go/types",
- "types.UntypedRune": "go/types",
- "types.UntypedString": "go/types",
- "types.Var": "go/types",
- "types.WriteExpr": "go/types",
- "types.WriteSignature": "go/types",
- "types.WriteType": "go/types",
- "unicode.ASCII_Hex_Digit": "unicode",
- "unicode.Adlam": "unicode",
- "unicode.Ahom": "unicode",
- "unicode.Anatolian_Hieroglyphs": "unicode",
- "unicode.Arabic": "unicode",
- "unicode.Armenian": "unicode",
- "unicode.Avestan": "unicode",
- "unicode.AzeriCase": "unicode",
- "unicode.Balinese": "unicode",
- "unicode.Bamum": "unicode",
- "unicode.Bassa_Vah": "unicode",
- "unicode.Batak": "unicode",
- "unicode.Bengali": "unicode",
- "unicode.Bhaiksuki": "unicode",
- "unicode.Bidi_Control": "unicode",
- "unicode.Bopomofo": "unicode",
- "unicode.Brahmi": "unicode",
- "unicode.Braille": "unicode",
- "unicode.Buginese": "unicode",
- "unicode.Buhid": "unicode",
- "unicode.C": "unicode",
- "unicode.Canadian_Aboriginal": "unicode",
- "unicode.Carian": "unicode",
- "unicode.CaseRange": "unicode",
- "unicode.CaseRanges": "unicode",
- "unicode.Categories": "unicode",
- "unicode.Caucasian_Albanian": "unicode",
- "unicode.Cc": "unicode",
- "unicode.Cf": "unicode",
- "unicode.Chakma": "unicode",
- "unicode.Cham": "unicode",
- "unicode.Cherokee": "unicode",
- "unicode.Co": "unicode",
- "unicode.Common": "unicode",
- "unicode.Coptic": "unicode",
- "unicode.Cs": "unicode",
- "unicode.Cuneiform": "unicode",
- "unicode.Cypriot": "unicode",
- "unicode.Cyrillic": "unicode",
- "unicode.Dash": "unicode",
- "unicode.Deprecated": "unicode",
- "unicode.Deseret": "unicode",
- "unicode.Devanagari": "unicode",
- "unicode.Diacritic": "unicode",
- "unicode.Digit": "unicode",
- "unicode.Duployan": "unicode",
- "unicode.Egyptian_Hieroglyphs": "unicode",
- "unicode.Elbasan": "unicode",
- "unicode.Ethiopic": "unicode",
- "unicode.Extender": "unicode",
- "unicode.FoldCategory": "unicode",
- "unicode.FoldScript": "unicode",
- "unicode.Georgian": "unicode",
- "unicode.Glagolitic": "unicode",
- "unicode.Gothic": "unicode",
- "unicode.Grantha": "unicode",
- "unicode.GraphicRanges": "unicode",
- "unicode.Greek": "unicode",
- "unicode.Gujarati": "unicode",
- "unicode.Gurmukhi": "unicode",
- "unicode.Han": "unicode",
- "unicode.Hangul": "unicode",
- "unicode.Hanunoo": "unicode",
- "unicode.Hatran": "unicode",
- "unicode.Hebrew": "unicode",
- "unicode.Hex_Digit": "unicode",
- "unicode.Hiragana": "unicode",
- "unicode.Hyphen": "unicode",
- "unicode.IDS_Binary_Operator": "unicode",
- "unicode.IDS_Trinary_Operator": "unicode",
- "unicode.Ideographic": "unicode",
- "unicode.Imperial_Aramaic": "unicode",
- "unicode.In": "unicode",
- "unicode.Inherited": "unicode",
- "unicode.Inscriptional_Pahlavi": "unicode",
- "unicode.Inscriptional_Parthian": "unicode",
- "unicode.Is": "unicode",
- "unicode.IsControl": "unicode",
- "unicode.IsDigit": "unicode",
- "unicode.IsGraphic": "unicode",
- "unicode.IsLetter": "unicode",
- "unicode.IsLower": "unicode",
- "unicode.IsMark": "unicode",
- "unicode.IsNumber": "unicode",
- "unicode.IsOneOf": "unicode",
- "unicode.IsPrint": "unicode",
- "unicode.IsPunct": "unicode",
- "unicode.IsSpace": "unicode",
- "unicode.IsSymbol": "unicode",
- "unicode.IsTitle": "unicode",
- "unicode.IsUpper": "unicode",
- "unicode.Javanese": "unicode",
- "unicode.Join_Control": "unicode",
- "unicode.Kaithi": "unicode",
- "unicode.Kannada": "unicode",
- "unicode.Katakana": "unicode",
- "unicode.Kayah_Li": "unicode",
- "unicode.Kharoshthi": "unicode",
- "unicode.Khmer": "unicode",
- "unicode.Khojki": "unicode",
- "unicode.Khudawadi": "unicode",
- "unicode.L": "unicode",
- "unicode.Lao": "unicode",
- "unicode.Latin": "unicode",
- "unicode.Lepcha": "unicode",
- "unicode.Letter": "unicode",
- "unicode.Limbu": "unicode",
- "unicode.Linear_A": "unicode",
- "unicode.Linear_B": "unicode",
- "unicode.Lisu": "unicode",
- "unicode.Ll": "unicode",
- "unicode.Lm": "unicode",
- "unicode.Lo": "unicode",
- "unicode.Logical_Order_Exception": "unicode",
- "unicode.Lower": "unicode",
- "unicode.LowerCase": "unicode",
- "unicode.Lt": "unicode",
- "unicode.Lu": "unicode",
- "unicode.Lycian": "unicode",
- "unicode.Lydian": "unicode",
- "unicode.M": "unicode",
- "unicode.Mahajani": "unicode",
- "unicode.Malayalam": "unicode",
- "unicode.Mandaic": "unicode",
- "unicode.Manichaean": "unicode",
- "unicode.Marchen": "unicode",
- "unicode.Mark": "unicode",
- "unicode.MaxASCII": "unicode",
- "unicode.MaxCase": "unicode",
- "unicode.MaxLatin1": "unicode",
- "unicode.MaxRune": "unicode",
- "unicode.Mc": "unicode",
- "unicode.Me": "unicode",
- "unicode.Meetei_Mayek": "unicode",
- "unicode.Mende_Kikakui": "unicode",
- "unicode.Meroitic_Cursive": "unicode",
- "unicode.Meroitic_Hieroglyphs": "unicode",
- "unicode.Miao": "unicode",
- "unicode.Mn": "unicode",
- "unicode.Modi": "unicode",
- "unicode.Mongolian": "unicode",
- "unicode.Mro": "unicode",
- "unicode.Multani": "unicode",
- "unicode.Myanmar": "unicode",
- "unicode.N": "unicode",
- "unicode.Nabataean": "unicode",
- "unicode.Nd": "unicode",
- "unicode.New_Tai_Lue": "unicode",
- "unicode.Newa": "unicode",
- "unicode.Nko": "unicode",
- "unicode.Nl": "unicode",
- "unicode.No": "unicode",
- "unicode.Noncharacter_Code_Point": "unicode",
- "unicode.Number": "unicode",
- "unicode.Ogham": "unicode",
- "unicode.Ol_Chiki": "unicode",
- "unicode.Old_Hungarian": "unicode",
- "unicode.Old_Italic": "unicode",
- "unicode.Old_North_Arabian": "unicode",
- "unicode.Old_Permic": "unicode",
- "unicode.Old_Persian": "unicode",
- "unicode.Old_South_Arabian": "unicode",
- "unicode.Old_Turkic": "unicode",
- "unicode.Oriya": "unicode",
- "unicode.Osage": "unicode",
- "unicode.Osmanya": "unicode",
- "unicode.Other": "unicode",
- "unicode.Other_Alphabetic": "unicode",
- "unicode.Other_Default_Ignorable_Code_Point": "unicode",
- "unicode.Other_Grapheme_Extend": "unicode",
- "unicode.Other_ID_Continue": "unicode",
- "unicode.Other_ID_Start": "unicode",
- "unicode.Other_Lowercase": "unicode",
- "unicode.Other_Math": "unicode",
- "unicode.Other_Uppercase": "unicode",
- "unicode.P": "unicode",
- "unicode.Pahawh_Hmong": "unicode",
- "unicode.Palmyrene": "unicode",
- "unicode.Pattern_Syntax": "unicode",
- "unicode.Pattern_White_Space": "unicode",
- "unicode.Pau_Cin_Hau": "unicode",
- "unicode.Pc": "unicode",
- "unicode.Pd": "unicode",
- "unicode.Pe": "unicode",
- "unicode.Pf": "unicode",
- "unicode.Phags_Pa": "unicode",
- "unicode.Phoenician": "unicode",
- "unicode.Pi": "unicode",
- "unicode.Po": "unicode",
- "unicode.Prepended_Concatenation_Mark": "unicode",
- "unicode.PrintRanges": "unicode",
- "unicode.Properties": "unicode",
- "unicode.Ps": "unicode",
- "unicode.Psalter_Pahlavi": "unicode",
- "unicode.Punct": "unicode",
- "unicode.Quotation_Mark": "unicode",
- "unicode.Radical": "unicode",
- "unicode.Range16": "unicode",
- "unicode.Range32": "unicode",
- "unicode.RangeTable": "unicode",
- "unicode.Rejang": "unicode",
- "unicode.ReplacementChar": "unicode",
- "unicode.Runic": "unicode",
- "unicode.S": "unicode",
- "unicode.STerm": "unicode",
- "unicode.Samaritan": "unicode",
- "unicode.Saurashtra": "unicode",
- "unicode.Sc": "unicode",
- "unicode.Scripts": "unicode",
- "unicode.Sentence_Terminal": "unicode",
- "unicode.Sharada": "unicode",
- "unicode.Shavian": "unicode",
- "unicode.Siddham": "unicode",
- "unicode.SignWriting": "unicode",
- "unicode.SimpleFold": "unicode",
- "unicode.Sinhala": "unicode",
- "unicode.Sk": "unicode",
- "unicode.Sm": "unicode",
- "unicode.So": "unicode",
- "unicode.Soft_Dotted": "unicode",
- "unicode.Sora_Sompeng": "unicode",
- "unicode.Space": "unicode",
- "unicode.SpecialCase": "unicode",
- "unicode.Sundanese": "unicode",
- "unicode.Syloti_Nagri": "unicode",
- "unicode.Symbol": "unicode",
- "unicode.Syriac": "unicode",
- "unicode.Tagalog": "unicode",
- "unicode.Tagbanwa": "unicode",
- "unicode.Tai_Le": "unicode",
- "unicode.Tai_Tham": "unicode",
- "unicode.Tai_Viet": "unicode",
- "unicode.Takri": "unicode",
- "unicode.Tamil": "unicode",
- "unicode.Tangut": "unicode",
- "unicode.Telugu": "unicode",
- "unicode.Terminal_Punctuation": "unicode",
- "unicode.Thaana": "unicode",
- "unicode.Thai": "unicode",
- "unicode.Tibetan": "unicode",
- "unicode.Tifinagh": "unicode",
- "unicode.Tirhuta": "unicode",
- "unicode.Title": "unicode",
- "unicode.TitleCase": "unicode",
- "unicode.To": "unicode",
- "unicode.ToLower": "unicode",
- "unicode.ToTitle": "unicode",
- "unicode.ToUpper": "unicode",
- "unicode.TurkishCase": "unicode",
- "unicode.Ugaritic": "unicode",
- "unicode.Unified_Ideograph": "unicode",
- "unicode.Upper": "unicode",
- "unicode.UpperCase": "unicode",
- "unicode.UpperLower": "unicode",
- "unicode.Vai": "unicode",
- "unicode.Variation_Selector": "unicode",
- "unicode.Version": "unicode",
- "unicode.Warang_Citi": "unicode",
- "unicode.White_Space": "unicode",
- "unicode.Yi": "unicode",
- "unicode.Z": "unicode",
- "unicode.Zl": "unicode",
- "unicode.Zp": "unicode",
- "unicode.Zs": "unicode",
- "url.Error": "net/url",
- "url.EscapeError": "net/url",
- "url.InvalidHostError": "net/url",
- "url.Parse": "net/url",
- "url.ParseQuery": "net/url",
- "url.ParseRequestURI": "net/url",
- "url.PathEscape": "net/url",
- "url.PathUnescape": "net/url",
- "url.QueryEscape": "net/url",
- "url.QueryUnescape": "net/url",
- "url.URL": "net/url",
- "url.User": "net/url",
- "url.UserPassword": "net/url",
- "url.Userinfo": "net/url",
- "url.Values": "net/url",
- "user.Current": "os/user",
- "user.Group": "os/user",
- "user.Lookup": "os/user",
- "user.LookupGroup": "os/user",
- "user.LookupGroupId": "os/user",
- "user.LookupId": "os/user",
- "user.UnknownGroupError": "os/user",
- "user.UnknownGroupIdError": "os/user",
- "user.UnknownUserError": "os/user",
- "user.UnknownUserIdError": "os/user",
- "user.User": "os/user",
- "utf16.Decode": "unicode/utf16",
- "utf16.DecodeRune": "unicode/utf16",
- "utf16.Encode": "unicode/utf16",
- "utf16.EncodeRune": "unicode/utf16",
- "utf16.IsSurrogate": "unicode/utf16",
- "utf8.DecodeLastRune": "unicode/utf8",
- "utf8.DecodeLastRuneInString": "unicode/utf8",
- "utf8.DecodeRune": "unicode/utf8",
- "utf8.DecodeRuneInString": "unicode/utf8",
- "utf8.EncodeRune": "unicode/utf8",
- "utf8.FullRune": "unicode/utf8",
- "utf8.FullRuneInString": "unicode/utf8",
- "utf8.MaxRune": "unicode/utf8",
- "utf8.RuneCount": "unicode/utf8",
- "utf8.RuneCountInString": "unicode/utf8",
- "utf8.RuneError": "unicode/utf8",
- "utf8.RuneLen": "unicode/utf8",
- "utf8.RuneSelf": "unicode/utf8",
- "utf8.RuneStart": "unicode/utf8",
- "utf8.UTFMax": "unicode/utf8",
- "utf8.Valid": "unicode/utf8",
- "utf8.ValidRune": "unicode/utf8",
- "utf8.ValidString": "unicode/utf8",
- "x509.CANotAuthorizedForThisName": "crypto/x509",
- "x509.CertPool": "crypto/x509",
- "x509.Certificate": "crypto/x509",
- "x509.CertificateInvalidError": "crypto/x509",
- "x509.CertificateRequest": "crypto/x509",
- "x509.ConstraintViolationError": "crypto/x509",
- "x509.CreateCertificate": "crypto/x509",
- "x509.CreateCertificateRequest": "crypto/x509",
- "x509.DSA": "crypto/x509",
- "x509.DSAWithSHA1": "crypto/x509",
- "x509.DSAWithSHA256": "crypto/x509",
- "x509.DecryptPEMBlock": "crypto/x509",
- "x509.ECDSA": "crypto/x509",
- "x509.ECDSAWithSHA1": "crypto/x509",
- "x509.ECDSAWithSHA256": "crypto/x509",
- "x509.ECDSAWithSHA384": "crypto/x509",
- "x509.ECDSAWithSHA512": "crypto/x509",
- "x509.EncryptPEMBlock": "crypto/x509",
- "x509.ErrUnsupportedAlgorithm": "crypto/x509",
- "x509.Expired": "crypto/x509",
- "x509.ExtKeyUsage": "crypto/x509",
- "x509.ExtKeyUsageAny": "crypto/x509",
- "x509.ExtKeyUsageClientAuth": "crypto/x509",
- "x509.ExtKeyUsageCodeSigning": "crypto/x509",
- "x509.ExtKeyUsageEmailProtection": "crypto/x509",
- "x509.ExtKeyUsageIPSECEndSystem": "crypto/x509",
- "x509.ExtKeyUsageIPSECTunnel": "crypto/x509",
- "x509.ExtKeyUsageIPSECUser": "crypto/x509",
- "x509.ExtKeyUsageMicrosoftServerGatedCrypto": "crypto/x509",
- "x509.ExtKeyUsageNetscapeServerGatedCrypto": "crypto/x509",
- "x509.ExtKeyUsageOCSPSigning": "crypto/x509",
- "x509.ExtKeyUsageServerAuth": "crypto/x509",
- "x509.ExtKeyUsageTimeStamping": "crypto/x509",
- "x509.HostnameError": "crypto/x509",
- "x509.IncompatibleUsage": "crypto/x509",
- "x509.IncorrectPasswordError": "crypto/x509",
- "x509.InsecureAlgorithmError": "crypto/x509",
- "x509.InvalidReason": "crypto/x509",
- "x509.IsEncryptedPEMBlock": "crypto/x509",
- "x509.KeyUsage": "crypto/x509",
- "x509.KeyUsageCRLSign": "crypto/x509",
- "x509.KeyUsageCertSign": "crypto/x509",
- "x509.KeyUsageContentCommitment": "crypto/x509",
- "x509.KeyUsageDataEncipherment": "crypto/x509",
- "x509.KeyUsageDecipherOnly": "crypto/x509",
- "x509.KeyUsageDigitalSignature": "crypto/x509",
- "x509.KeyUsageEncipherOnly": "crypto/x509",
- "x509.KeyUsageKeyAgreement": "crypto/x509",
- "x509.KeyUsageKeyEncipherment": "crypto/x509",
- "x509.MD2WithRSA": "crypto/x509",
- "x509.MD5WithRSA": "crypto/x509",
- "x509.MarshalECPrivateKey": "crypto/x509",
- "x509.MarshalPKCS1PrivateKey": "crypto/x509",
- "x509.MarshalPKIXPublicKey": "crypto/x509",
- "x509.NameMismatch": "crypto/x509",
- "x509.NewCertPool": "crypto/x509",
- "x509.NotAuthorizedToSign": "crypto/x509",
- "x509.PEMCipher": "crypto/x509",
- "x509.PEMCipher3DES": "crypto/x509",
- "x509.PEMCipherAES128": "crypto/x509",
- "x509.PEMCipherAES192": "crypto/x509",
- "x509.PEMCipherAES256": "crypto/x509",
- "x509.PEMCipherDES": "crypto/x509",
- "x509.ParseCRL": "crypto/x509",
- "x509.ParseCertificate": "crypto/x509",
- "x509.ParseCertificateRequest": "crypto/x509",
- "x509.ParseCertificates": "crypto/x509",
- "x509.ParseDERCRL": "crypto/x509",
- "x509.ParseECPrivateKey": "crypto/x509",
- "x509.ParsePKCS1PrivateKey": "crypto/x509",
- "x509.ParsePKCS8PrivateKey": "crypto/x509",
- "x509.ParsePKIXPublicKey": "crypto/x509",
- "x509.PublicKeyAlgorithm": "crypto/x509",
- "x509.RSA": "crypto/x509",
- "x509.SHA1WithRSA": "crypto/x509",
- "x509.SHA256WithRSA": "crypto/x509",
- "x509.SHA256WithRSAPSS": "crypto/x509",
- "x509.SHA384WithRSA": "crypto/x509",
- "x509.SHA384WithRSAPSS": "crypto/x509",
- "x509.SHA512WithRSA": "crypto/x509",
- "x509.SHA512WithRSAPSS": "crypto/x509",
- "x509.SignatureAlgorithm": "crypto/x509",
- "x509.SystemCertPool": "crypto/x509",
- "x509.SystemRootsError": "crypto/x509",
- "x509.TooManyIntermediates": "crypto/x509",
- "x509.UnhandledCriticalExtension": "crypto/x509",
- "x509.UnknownAuthorityError": "crypto/x509",
- "x509.UnknownPublicKeyAlgorithm": "crypto/x509",
- "x509.UnknownSignatureAlgorithm": "crypto/x509",
- "x509.VerifyOptions": "crypto/x509",
- "xml.Attr": "encoding/xml",
- "xml.CharData": "encoding/xml",
- "xml.Comment": "encoding/xml",
- "xml.CopyToken": "encoding/xml",
- "xml.Decoder": "encoding/xml",
- "xml.Directive": "encoding/xml",
- "xml.Encoder": "encoding/xml",
- "xml.EndElement": "encoding/xml",
- "xml.Escape": "encoding/xml",
- "xml.EscapeText": "encoding/xml",
- "xml.HTMLAutoClose": "encoding/xml",
- "xml.HTMLEntity": "encoding/xml",
- "xml.Header": "encoding/xml",
- "xml.Marshal": "encoding/xml",
- "xml.MarshalIndent": "encoding/xml",
- "xml.Marshaler": "encoding/xml",
- "xml.MarshalerAttr": "encoding/xml",
- "xml.Name": "encoding/xml",
- "xml.NewDecoder": "encoding/xml",
- "xml.NewEncoder": "encoding/xml",
- "xml.ProcInst": "encoding/xml",
- "xml.StartElement": "encoding/xml",
- "xml.SyntaxError": "encoding/xml",
- "xml.TagPathError": "encoding/xml",
- "xml.Token": "encoding/xml",
- "xml.Unmarshal": "encoding/xml",
- "xml.UnmarshalError": "encoding/xml",
- "xml.Unmarshaler": "encoding/xml",
- "xml.UnmarshalerAttr": "encoding/xml",
- "xml.UnsupportedTypeError": "encoding/xml",
- "zip.Compressor": "archive/zip",
- "zip.Decompressor": "archive/zip",
- "zip.Deflate": "archive/zip",
- "zip.ErrAlgorithm": "archive/zip",
- "zip.ErrChecksum": "archive/zip",
- "zip.ErrFormat": "archive/zip",
- "zip.File": "archive/zip",
- "zip.FileHeader": "archive/zip",
- "zip.FileInfoHeader": "archive/zip",
- "zip.NewReader": "archive/zip",
- "zip.NewWriter": "archive/zip",
- "zip.OpenReader": "archive/zip",
- "zip.ReadCloser": "archive/zip",
- "zip.Reader": "archive/zip",
- "zip.RegisterCompressor": "archive/zip",
- "zip.RegisterDecompressor": "archive/zip",
- "zip.Store": "archive/zip",
- "zip.Writer": "archive/zip",
- "zlib.BestCompression": "compress/zlib",
- "zlib.BestSpeed": "compress/zlib",
- "zlib.DefaultCompression": "compress/zlib",
- "zlib.ErrChecksum": "compress/zlib",
- "zlib.ErrDictionary": "compress/zlib",
- "zlib.ErrHeader": "compress/zlib",
- "zlib.HuffmanOnly": "compress/zlib",
- "zlib.NewReader": "compress/zlib",
- "zlib.NewReaderDict": "compress/zlib",
- "zlib.NewWriter": "compress/zlib",
- "zlib.NewWriterLevel": "compress/zlib",
- "zlib.NewWriterLevelDict": "compress/zlib",
- "zlib.NoCompression": "compress/zlib",
- "zlib.Resetter": "compress/zlib",
- "zlib.Writer": "compress/zlib",
-
- "unsafe.Alignof": "unsafe",
- "unsafe.ArbitraryType": "unsafe",
- "unsafe.Offsetof": "unsafe",
- "unsafe.Pointer": "unsafe",
- "unsafe.Sizeof": "unsafe",
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/refactor/importgraph/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/refactor/importgraph/LICENSE
deleted file mode 100644
index 6a66aea5e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/refactor/importgraph/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/refactor/importgraph/graph.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/refactor/importgraph/graph.go
deleted file mode 100644
index d2d8f098b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/golang.org/x/tools/refactor/importgraph/graph.go
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package importgraph computes the forward and reverse import
-// dependency graphs for all packages in a Go workspace.
-package importgraph // import "golang.org/x/tools/refactor/importgraph"
-
-import (
- "go/build"
- "sync"
-
- "golang.org/x/tools/go/buildutil"
-)
-
-// A Graph is an import dependency graph, either forward or reverse.
-//
-// The graph maps each node (a package import path) to the set of its
-// successors in the graph. For a forward graph, this is the set of
-// imported packages (prerequisites); for a reverse graph, it is the set
-// of importing packages (clients).
-//
-// Graph construction inspects all imports in each package's directory,
-// including those in _test.go files, so the resulting graph may be cyclic.
-type Graph map[string]map[string]bool
-
-func (g Graph) addEdge(from, to string) {
- edges := g[from]
- if edges == nil {
- edges = make(map[string]bool)
- g[from] = edges
- }
- edges[to] = true
-}
-
-// Search returns all the nodes of the graph reachable from
-// any of the specified roots, by following edges forwards.
-// Relationally, this is the reflexive transitive closure.
-func (g Graph) Search(roots ...string) map[string]bool {
- seen := make(map[string]bool)
- var visit func(x string)
- visit = func(x string) {
- if !seen[x] {
- seen[x] = true
- for y := range g[x] {
- visit(y)
- }
- }
- }
- for _, root := range roots {
- visit(root)
- }
- return seen
-}
-
-// Build scans the specified Go workspace and builds the forward and
-// reverse import dependency graphs for all its packages.
-// It also returns a mapping from canonical import paths to errors for packages
-// whose loading was not entirely successful.
-// A package may appear in the graph and in the errors mapping.
-// All package paths are canonical and may contain "/vendor/".
-func Build(ctxt *build.Context) (forward, reverse Graph, errors map[string]error) {
- type importEdge struct {
- from, to string
- }
- type pathError struct {
- path string
- err error
- }
-
- ch := make(chan interface{})
-
- go func() {
- sema := make(chan int, 20) // I/O concurrency limiting semaphore
- var wg sync.WaitGroup
- buildutil.ForEachPackage(ctxt, func(path string, err error) {
- if err != nil {
- ch <- pathError{path, err}
- return
- }
-
- wg.Add(1)
- go func() {
- defer wg.Done()
-
- sema <- 1
- bp, err := ctxt.Import(path, "", 0)
- <-sema
-
- if err != nil {
- if _, ok := err.(*build.NoGoError); ok {
- // empty directory is not an error
- } else {
- ch <- pathError{path, err}
- }
- // Even in error cases, Import usually returns a package.
- }
-
- // absolutize resolves an import path relative
- // to the current package bp.
- // The absolute form may contain "vendor".
- //
- // The vendoring feature slows down Build by 3×.
- // Here are timings from a 1400 package workspace:
- // 1100ms: current code (with vendor check)
- // 880ms: with a nonblocking cache around ctxt.IsDir
- // 840ms: nonblocking cache with duplicate suppression
- // 340ms: original code (no vendor check)
- // TODO(adonovan): optimize, somehow.
- memo := make(map[string]string)
- absolutize := func(path string) string {
- canon, ok := memo[path]
- if !ok {
- sema <- 1
- bp2, _ := ctxt.Import(path, bp.Dir, build.FindOnly)
- <-sema
-
- if bp2 != nil {
- canon = bp2.ImportPath
- } else {
- canon = path
- }
- memo[path] = canon
- }
- return canon
- }
-
- if bp != nil {
- for _, imp := range bp.Imports {
- ch <- importEdge{path, absolutize(imp)}
- }
- for _, imp := range bp.TestImports {
- ch <- importEdge{path, absolutize(imp)}
- }
- for _, imp := range bp.XTestImports {
- ch <- importEdge{path, absolutize(imp)}
- }
- }
-
- }()
- })
- wg.Wait()
- close(ch)
- }()
-
- forward = make(Graph)
- reverse = make(Graph)
-
- for e := range ch {
- switch e := e.(type) {
- case pathError:
- if errors == nil {
- errors = make(map[string]error)
- }
- errors[e.path] = e.err
-
- case importEdge:
- if e.to == "C" {
- continue // "C" is fake
- }
- forward.addEdge(e.from, e.to)
- reverse.addEdge(e.to, e.from)
- }
- }
-
- return forward, reverse, errors
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/LICENSE
deleted file mode 100644
index dfd031454..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2016 Dominik Honnef
-
-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/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/callgraph.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/callgraph.go
deleted file mode 100644
index d93a20a3a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/callgraph.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Package callgraph defines the call graph and various algorithms
-and utilities to operate on it.
-
-A call graph is a labelled directed graph whose nodes represent
-functions and whose edge labels represent syntactic function call
-sites. The presence of a labelled edge (caller, site, callee)
-indicates that caller may call callee at the specified call site.
-
-A call graph is a multigraph: it may contain multiple edges (caller,
-*, callee) connecting the same pair of nodes, so long as the edges
-differ by label; this occurs when one function calls another function
-from multiple call sites. Also, it may contain multiple edges
-(caller, site, *) that differ only by callee; this indicates a
-polymorphic call.
-
-A SOUND call graph is one that overapproximates the dynamic calling
-behaviors of the program in all possible executions. One call graph
-is more PRECISE than another if it is a smaller overapproximation of
-the dynamic behavior.
-
-All call graphs have a synthetic root node which is responsible for
-calling main() and init().
-
-Calls to built-in functions (e.g. panic, println) are not represented
-in the call graph; they are treated like built-in operators of the
-language.
-
-*/
-package callgraph // import "honnef.co/go/tools/callgraph"
-
-// TODO(adonovan): add a function to eliminate wrappers from the
-// callgraph, preserving topology.
-// More generally, we could eliminate "uninteresting" nodes such as
-// nodes from packages we don't care about.
-
-import (
- "fmt"
- "go/token"
-
- "honnef.co/go/tools/ssa"
-)
-
-// A Graph represents a call graph.
-//
-// A graph may contain nodes that are not reachable from the root.
-// If the call graph is sound, such nodes indicate unreachable
-// functions.
-//
-type Graph struct {
- Root *Node // the distinguished root node
- Nodes map[*ssa.Function]*Node // all nodes by function
-}
-
-// New returns a new Graph with the specified root node.
-func New(root *ssa.Function) *Graph {
- g := &Graph{Nodes: make(map[*ssa.Function]*Node)}
- g.Root = g.CreateNode(root)
- return g
-}
-
-// CreateNode returns the Node for fn, creating it if not present.
-func (g *Graph) CreateNode(fn *ssa.Function) *Node {
- n, ok := g.Nodes[fn]
- if !ok {
- n = &Node{Func: fn, ID: len(g.Nodes)}
- g.Nodes[fn] = n
- }
- return n
-}
-
-// A Node represents a node in a call graph.
-type Node struct {
- Func *ssa.Function // the function this node represents
- ID int // 0-based sequence number
- In []*Edge // unordered set of incoming call edges (n.In[*].Callee == n)
- Out []*Edge // unordered set of outgoing call edges (n.Out[*].Caller == n)
-}
-
-func (n *Node) String() string {
- return fmt.Sprintf("n%d:%s", n.ID, n.Func)
-}
-
-// A Edge represents an edge in the call graph.
-//
-// Site is nil for edges originating in synthetic or intrinsic
-// functions, e.g. reflect.Call or the root of the call graph.
-type Edge struct {
- Caller *Node
- Site ssa.CallInstruction
- Callee *Node
-}
-
-func (e Edge) String() string {
- return fmt.Sprintf("%s --> %s", e.Caller, e.Callee)
-}
-
-func (e Edge) Description() string {
- var prefix string
- switch e.Site.(type) {
- case nil:
- return "synthetic call"
- case *ssa.Go:
- prefix = "concurrent "
- case *ssa.Defer:
- prefix = "deferred "
- }
- return prefix + e.Site.Common().Description()
-}
-
-func (e Edge) Pos() token.Pos {
- if e.Site == nil {
- return token.NoPos
- }
- return e.Site.Pos()
-}
-
-// AddEdge adds the edge (caller, site, callee) to the call graph.
-// Elimination of duplicate edges is the caller's responsibility.
-func AddEdge(caller *Node, site ssa.CallInstruction, callee *Node) {
- e := &Edge{caller, site, callee}
- callee.In = append(callee.In, e)
- caller.Out = append(caller.Out, e)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/cha/cha.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/cha/cha.go
deleted file mode 100644
index 2a96b9089..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/cha/cha.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package cha computes the call graph of a Go program using the Class
-// Hierarchy Analysis (CHA) algorithm.
-//
-// CHA was first described in "Optimization of Object-Oriented Programs
-// Using Static Class Hierarchy Analysis", Jeffrey Dean, David Grove,
-// and Craig Chambers, ECOOP'95.
-//
-// CHA is related to RTA (see go/callgraph/rta); the difference is that
-// CHA conservatively computes the entire "implements" relation between
-// interfaces and concrete types ahead of time, whereas RTA uses dynamic
-// programming to construct it on the fly as it encounters new functions
-// reachable from main. CHA may thus include spurious call edges for
-// types that haven't been instantiated yet, or types that are never
-// instantiated.
-//
-// Since CHA conservatively assumes that all functions are address-taken
-// and all concrete types are put into interfaces, it is sound to run on
-// partial programs, such as libraries without a main or test function.
-//
-package cha // import "honnef.co/go/tools/callgraph/cha"
-
-import (
- "go/types"
-
- "honnef.co/go/tools/callgraph"
- "honnef.co/go/tools/ssa"
- "honnef.co/go/tools/ssa/ssautil"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// CallGraph computes the call graph of the specified program using the
-// Class Hierarchy Analysis algorithm.
-//
-func CallGraph(prog *ssa.Program) *callgraph.Graph {
- cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
-
- allFuncs := ssautil.AllFunctions(prog)
-
- // funcsBySig contains all functions, keyed by signature. It is
- // the effective set of address-taken functions used to resolve
- // a dynamic call of a particular signature.
- var funcsBySig typeutil.Map // value is []*ssa.Function
-
- // methodsByName contains all methods,
- // grouped by name for efficient lookup.
- methodsByName := make(map[string][]*ssa.Function)
-
- // methodsMemo records, for every abstract method call call I.f on
- // interface type I, the set of concrete methods C.f of all
- // types C that satisfy interface I.
- methodsMemo := make(map[*types.Func][]*ssa.Function)
- lookupMethods := func(m *types.Func) []*ssa.Function {
- methods, ok := methodsMemo[m]
- if !ok {
- I := m.Type().(*types.Signature).Recv().Type().Underlying().(*types.Interface)
- for _, f := range methodsByName[m.Name()] {
- C := f.Signature.Recv().Type() // named or *named
- if types.Implements(C, I) {
- methods = append(methods, f)
- }
- }
- methodsMemo[m] = methods
- }
- return methods
- }
-
- for f := range allFuncs {
- if f.Signature.Recv() == nil {
- // Package initializers can never be address-taken.
- if f.Name() == "init" && f.Synthetic == "package initializer" {
- continue
- }
- funcs, _ := funcsBySig.At(f.Signature).([]*ssa.Function)
- funcs = append(funcs, f)
- funcsBySig.Set(f.Signature, funcs)
- } else {
- methodsByName[f.Name()] = append(methodsByName[f.Name()], f)
- }
- }
-
- addEdge := func(fnode *callgraph.Node, site ssa.CallInstruction, g *ssa.Function) {
- gnode := cg.CreateNode(g)
- callgraph.AddEdge(fnode, site, gnode)
- }
-
- addEdges := func(fnode *callgraph.Node, site ssa.CallInstruction, callees []*ssa.Function) {
- // Because every call to a highly polymorphic and
- // frequently used abstract method such as
- // (io.Writer).Write is assumed to call every concrete
- // Write method in the program, the call graph can
- // contain a lot of duplication.
- //
- // TODO(adonovan): opt: consider factoring the callgraph
- // API so that the Callers component of each edge is a
- // slice of nodes, not a singleton.
- for _, g := range callees {
- addEdge(fnode, site, g)
- }
- }
-
- for f := range allFuncs {
- fnode := cg.CreateNode(f)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if site, ok := instr.(ssa.CallInstruction); ok {
- call := site.Common()
- if call.IsInvoke() {
- addEdges(fnode, site, lookupMethods(call.Method))
- } else if g := call.StaticCallee(); g != nil {
- addEdge(fnode, site, g)
- } else if _, ok := call.Value.(*ssa.Builtin); !ok {
- callees, _ := funcsBySig.At(call.Signature()).([]*ssa.Function)
- addEdges(fnode, site, callees)
- }
- }
- }
- }
- }
-
- return cg
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/rta/rta.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/rta/rta.go
deleted file mode 100644
index eb7262922..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/rta/rta.go
+++ /dev/null
@@ -1,459 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This package provides Rapid Type Analysis (RTA) for Go, a fast
-// algorithm for call graph construction and discovery of reachable code
-// (and hence dead code) and runtime types. The algorithm was first
-// described in:
-//
-// David F. Bacon and Peter F. Sweeney. 1996.
-// Fast static analysis of C++ virtual function calls. (OOPSLA '96)
-// http://doi.acm.org/10.1145/236337.236371
-//
-// The algorithm uses dynamic programming to tabulate the cross-product
-// of the set of known "address taken" functions with the set of known
-// dynamic calls of the same type. As each new address-taken function
-// is discovered, call graph edges are added from each known callsite,
-// and as each new call site is discovered, call graph edges are added
-// from it to each known address-taken function.
-//
-// A similar approach is used for dynamic calls via interfaces: it
-// tabulates the cross-product of the set of known "runtime types",
-// i.e. types that may appear in an interface value, or be derived from
-// one via reflection, with the set of known "invoke"-mode dynamic
-// calls. As each new "runtime type" is discovered, call edges are
-// added from the known call sites, and as each new call site is
-// discovered, call graph edges are added to each compatible
-// method.
-//
-// In addition, we must consider all exported methods of any runtime type
-// as reachable, since they may be called via reflection.
-//
-// Each time a newly added call edge causes a new function to become
-// reachable, the code of that function is analyzed for more call sites,
-// address-taken functions, and runtime types. The process continues
-// until a fixed point is achieved.
-//
-// The resulting call graph is less precise than one produced by pointer
-// analysis, but the algorithm is much faster. For example, running the
-// cmd/callgraph tool on its own source takes ~2.1s for RTA and ~5.4s
-// for points-to analysis.
-//
-package rta // import "honnef.co/go/tools/callgraph/rta"
-
-// TODO(adonovan): test it by connecting it to the interpreter and
-// replacing all "unreachable" functions by a special intrinsic, and
-// ensure that that intrinsic is never called.
-
-import (
- "fmt"
- "go/types"
-
- "honnef.co/go/tools/callgraph"
- "honnef.co/go/tools/ssa"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// A Result holds the results of Rapid Type Analysis, which includes the
-// set of reachable functions/methods, runtime types, and the call graph.
-//
-type Result struct {
- // CallGraph is the discovered callgraph.
- // It does not include edges for calls made via reflection.
- CallGraph *callgraph.Graph
-
- // Reachable contains the set of reachable functions and methods.
- // This includes exported methods of runtime types, since
- // they may be accessed via reflection.
- // The value indicates whether the function is address-taken.
- //
- // (We wrap the bool in a struct to avoid inadvertent use of
- // "if Reachable[f] {" to test for set membership.)
- Reachable map[*ssa.Function]struct{ AddrTaken bool }
-
- // RuntimeTypes contains the set of types that are needed at
- // runtime, for interfaces or reflection.
- //
- // The value indicates whether the type is inaccessible to reflection.
- // Consider:
- // type A struct{B}
- // fmt.Println(new(A))
- // Types *A, A and B are accessible to reflection, but the unnamed
- // type struct{B} is not.
- RuntimeTypes typeutil.Map
-}
-
-// Working state of the RTA algorithm.
-type rta struct {
- result *Result
-
- prog *ssa.Program
-
- worklist []*ssa.Function // list of functions to visit
-
- // addrTakenFuncsBySig contains all address-taken *Functions, grouped by signature.
- // Keys are *types.Signature, values are map[*ssa.Function]bool sets.
- addrTakenFuncsBySig typeutil.Map
-
- // dynCallSites contains all dynamic "call"-mode call sites, grouped by signature.
- // Keys are *types.Signature, values are unordered []ssa.CallInstruction.
- dynCallSites typeutil.Map
-
- // invokeSites contains all "invoke"-mode call sites, grouped by interface.
- // Keys are *types.Interface (never *types.Named),
- // Values are unordered []ssa.CallInstruction sets.
- invokeSites typeutil.Map
-
- // The following two maps together define the subset of the
- // m:n "implements" relation needed by the algorithm.
-
- // concreteTypes maps each concrete type to the set of interfaces that it implements.
- // Keys are types.Type, values are unordered []*types.Interface.
- // Only concrete types used as MakeInterface operands are included.
- concreteTypes typeutil.Map
-
- // interfaceTypes maps each interface type to
- // the set of concrete types that implement it.
- // Keys are *types.Interface, values are unordered []types.Type.
- // Only interfaces used in "invoke"-mode CallInstructions are included.
- interfaceTypes typeutil.Map
-}
-
-// addReachable marks a function as potentially callable at run-time,
-// and ensures that it gets processed.
-func (r *rta) addReachable(f *ssa.Function, addrTaken bool) {
- reachable := r.result.Reachable
- n := len(reachable)
- v := reachable[f]
- if addrTaken {
- v.AddrTaken = true
- }
- reachable[f] = v
- if len(reachable) > n {
- // First time seeing f. Add it to the worklist.
- r.worklist = append(r.worklist, f)
- }
-}
-
-// addEdge adds the specified call graph edge, and marks it reachable.
-// addrTaken indicates whether to mark the callee as "address-taken".
-func (r *rta) addEdge(site ssa.CallInstruction, callee *ssa.Function, addrTaken bool) {
- r.addReachable(callee, addrTaken)
-
- if g := r.result.CallGraph; g != nil {
- if site.Parent() == nil {
- panic(site)
- }
- from := g.CreateNode(site.Parent())
- to := g.CreateNode(callee)
- callgraph.AddEdge(from, site, to)
- }
-}
-
-// ---------- addrTakenFuncs × dynCallSites ----------
-
-// visitAddrTakenFunc is called each time we encounter an address-taken function f.
-func (r *rta) visitAddrTakenFunc(f *ssa.Function) {
- // Create two-level map (Signature -> Function -> bool).
- S := f.Signature
- funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool)
- if funcs == nil {
- funcs = make(map[*ssa.Function]bool)
- r.addrTakenFuncsBySig.Set(S, funcs)
- }
- if !funcs[f] {
- // First time seeing f.
- funcs[f] = true
-
- // If we've seen any dyncalls of this type, mark it reachable,
- // and add call graph edges.
- sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction)
- for _, site := range sites {
- r.addEdge(site, f, true)
- }
- }
-}
-
-// visitDynCall is called each time we encounter a dynamic "call"-mode call.
-func (r *rta) visitDynCall(site ssa.CallInstruction) {
- S := site.Common().Signature()
-
- // Record the call site.
- sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction)
- r.dynCallSites.Set(S, append(sites, site))
-
- // For each function of signature S that we know is address-taken,
- // mark it reachable. We'll add the callgraph edges later.
- funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool)
- for g := range funcs {
- r.addEdge(site, g, true)
- }
-}
-
-// ---------- concrete types × invoke sites ----------
-
-// addInvokeEdge is called for each new pair (site, C) in the matrix.
-func (r *rta) addInvokeEdge(site ssa.CallInstruction, C types.Type) {
- // Ascertain the concrete method of C to be called.
- imethod := site.Common().Method
- cmethod := r.prog.MethodValue(r.prog.MethodSets.MethodSet(C).Lookup(imethod.Pkg(), imethod.Name()))
- r.addEdge(site, cmethod, true)
-}
-
-// visitInvoke is called each time the algorithm encounters an "invoke"-mode call.
-func (r *rta) visitInvoke(site ssa.CallInstruction) {
- I := site.Common().Value.Type().Underlying().(*types.Interface)
-
- // Record the invoke site.
- sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction)
- r.invokeSites.Set(I, append(sites, site))
-
- // Add callgraph edge for each existing
- // address-taken concrete type implementing I.
- for _, C := range r.implementations(I) {
- r.addInvokeEdge(site, C)
- }
-}
-
-// ---------- main algorithm ----------
-
-// visitFunc processes function f.
-func (r *rta) visitFunc(f *ssa.Function) {
- var space [32]*ssa.Value // preallocate space for common case
-
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- rands := instr.Operands(space[:0])
-
- switch instr := instr.(type) {
- case ssa.CallInstruction:
- call := instr.Common()
- if call.IsInvoke() {
- r.visitInvoke(instr)
- } else if g := call.StaticCallee(); g != nil {
- r.addEdge(instr, g, false)
- } else if _, ok := call.Value.(*ssa.Builtin); !ok {
- r.visitDynCall(instr)
- }
-
- // Ignore the call-position operand when
- // looking for address-taken Functions.
- // Hack: assume this is rands[0].
- rands = rands[1:]
-
- case *ssa.MakeInterface:
- r.addRuntimeType(instr.X.Type(), false)
- }
-
- // Process all address-taken functions.
- for _, op := range rands {
- if g, ok := (*op).(*ssa.Function); ok {
- r.visitAddrTakenFunc(g)
- }
- }
- }
- }
-}
-
-// Analyze performs Rapid Type Analysis, starting at the specified root
-// functions. It returns nil if no roots were specified.
-//
-// If buildCallGraph is true, Result.CallGraph will contain a call
-// graph; otherwise, only the other fields (reachable functions) are
-// populated.
-//
-func Analyze(roots []*ssa.Function, buildCallGraph bool) *Result {
- if len(roots) == 0 {
- return nil
- }
-
- r := &rta{
- result: &Result{Reachable: make(map[*ssa.Function]struct{ AddrTaken bool })},
- prog: roots[0].Prog,
- }
-
- if buildCallGraph {
- // TODO(adonovan): change callgraph API to eliminate the
- // notion of a distinguished root node. Some callgraphs
- // have many roots, or none.
- r.result.CallGraph = callgraph.New(roots[0])
- }
-
- hasher := typeutil.MakeHasher()
- r.result.RuntimeTypes.SetHasher(hasher)
- r.addrTakenFuncsBySig.SetHasher(hasher)
- r.dynCallSites.SetHasher(hasher)
- r.invokeSites.SetHasher(hasher)
- r.concreteTypes.SetHasher(hasher)
- r.interfaceTypes.SetHasher(hasher)
-
- // Visit functions, processing their instructions, and adding
- // new functions to the worklist, until a fixed point is
- // reached.
- var shadow []*ssa.Function // for efficiency, we double-buffer the worklist
- r.worklist = append(r.worklist, roots...)
- for len(r.worklist) > 0 {
- shadow, r.worklist = r.worklist, shadow[:0]
- for _, f := range shadow {
- r.visitFunc(f)
- }
- }
- return r.result
-}
-
-// interfaces(C) returns all currently known interfaces implemented by C.
-func (r *rta) interfaces(C types.Type) []*types.Interface {
- // Ascertain set of interfaces C implements
- // and update 'implements' relation.
- var ifaces []*types.Interface
- r.interfaceTypes.Iterate(func(I types.Type, concs interface{}) {
- if I := I.(*types.Interface); types.Implements(C, I) {
- concs, _ := concs.([]types.Type)
- r.interfaceTypes.Set(I, append(concs, C))
- ifaces = append(ifaces, I)
- }
- })
- r.concreteTypes.Set(C, ifaces)
- return ifaces
-}
-
-// implementations(I) returns all currently known concrete types that implement I.
-func (r *rta) implementations(I *types.Interface) []types.Type {
- var concs []types.Type
- if v := r.interfaceTypes.At(I); v != nil {
- concs = v.([]types.Type)
- } else {
- // First time seeing this interface.
- // Update the 'implements' relation.
- r.concreteTypes.Iterate(func(C types.Type, ifaces interface{}) {
- if types.Implements(C, I) {
- ifaces, _ := ifaces.([]*types.Interface)
- r.concreteTypes.Set(C, append(ifaces, I))
- concs = append(concs, C)
- }
- })
- r.interfaceTypes.Set(I, concs)
- }
- return concs
-}
-
-// addRuntimeType is called for each concrete type that can be the
-// dynamic type of some interface or reflect.Value.
-// Adapted from needMethods in go/ssa/builder.go
-//
-func (r *rta) addRuntimeType(T types.Type, skip bool) {
- if prev, ok := r.result.RuntimeTypes.At(T).(bool); ok {
- if skip && !prev {
- r.result.RuntimeTypes.Set(T, skip)
- }
- return
- }
- r.result.RuntimeTypes.Set(T, skip)
-
- mset := r.prog.MethodSets.MethodSet(T)
-
- if _, ok := T.Underlying().(*types.Interface); !ok {
- // T is a new concrete type.
- for i, n := 0, mset.Len(); i < n; i++ {
- sel := mset.At(i)
- m := sel.Obj()
-
- if m.Exported() {
- // Exported methods are always potentially callable via reflection.
- r.addReachable(r.prog.MethodValue(sel), true)
- }
- }
-
- // Add callgraph edge for each existing dynamic
- // "invoke"-mode call via that interface.
- for _, I := range r.interfaces(T) {
- sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction)
- for _, site := range sites {
- r.addInvokeEdge(site, T)
- }
- }
- }
-
- // Precondition: T is not a method signature (*Signature with Recv()!=nil).
- // Recursive case: skip => don't call makeMethods(T).
- // Each package maintains its own set of types it has visited.
-
- var n *types.Named
- switch T := T.(type) {
- case *types.Named:
- n = T
- case *types.Pointer:
- n, _ = T.Elem().(*types.Named)
- }
- if n != nil {
- owner := n.Obj().Pkg()
- if owner == nil {
- return // built-in error type
- }
- }
-
- // Recursion over signatures of each exported method.
- for i := 0; i < mset.Len(); i++ {
- if mset.At(i).Obj().Exported() {
- sig := mset.At(i).Type().(*types.Signature)
- r.addRuntimeType(sig.Params(), true) // skip the Tuple itself
- r.addRuntimeType(sig.Results(), true) // skip the Tuple itself
- }
- }
-
- switch t := T.(type) {
- case *types.Basic:
- // nop
-
- case *types.Interface:
- // nop---handled by recursion over method set.
-
- case *types.Pointer:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Slice:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Chan:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Map:
- r.addRuntimeType(t.Key(), false)
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Signature:
- if t.Recv() != nil {
- panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
- }
- r.addRuntimeType(t.Params(), true) // skip the Tuple itself
- r.addRuntimeType(t.Results(), true) // skip the Tuple itself
-
- case *types.Named:
- // A pointer-to-named type can be derived from a named
- // type via reflection. It may have methods too.
- r.addRuntimeType(types.NewPointer(T), false)
-
- // Consider 'type T struct{S}' where S has methods.
- // Reflection provides no way to get from T to struct{S},
- // only to S, so the method set of struct{S} is unwanted,
- // so set 'skip' flag during recursion.
- r.addRuntimeType(t.Underlying(), true)
-
- case *types.Array:
- r.addRuntimeType(t.Elem(), false)
-
- case *types.Struct:
- for i, n := 0, t.NumFields(); i < n; i++ {
- r.addRuntimeType(t.Field(i).Type(), false)
- }
-
- case *types.Tuple:
- for i, n := 0, t.Len(); i < n; i++ {
- r.addRuntimeType(t.At(i).Type(), false)
- }
-
- default:
- panic(T)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/static/static.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/static/static.go
deleted file mode 100644
index 5444e8411..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/static/static.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Package static computes the call graph of a Go program containing
-// only static call edges.
-package static // import "honnef.co/go/tools/callgraph/static"
-
-import (
- "honnef.co/go/tools/callgraph"
- "honnef.co/go/tools/ssa"
- "honnef.co/go/tools/ssa/ssautil"
-)
-
-// CallGraph computes the call graph of the specified program
-// considering only static calls.
-//
-func CallGraph(prog *ssa.Program) *callgraph.Graph {
- cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
-
- // TODO(adonovan): opt: use only a single pass over the ssa.Program.
- // TODO(adonovan): opt: this is slower than RTA (perhaps because
- // the lower precision means so many edges are allocated)!
- for f := range ssautil.AllFunctions(prog) {
- fnode := cg.CreateNode(f)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if site, ok := instr.(ssa.CallInstruction); ok {
- if g := site.Common().StaticCallee(); g != nil {
- gnode := cg.CreateNode(g)
- callgraph.AddEdge(fnode, site, gnode)
- }
- }
- }
- }
- }
-
- return cg
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/util.go
deleted file mode 100644
index 7aeda9641..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/callgraph/util.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package callgraph
-
-import "honnef.co/go/tools/ssa"
-
-// This file provides various utilities over call graphs, such as
-// visitation and path search.
-
-// CalleesOf returns a new set containing all direct callees of the
-// caller node.
-//
-func CalleesOf(caller *Node) map[*Node]bool {
- callees := make(map[*Node]bool)
- for _, e := range caller.Out {
- callees[e.Callee] = true
- }
- return callees
-}
-
-// GraphVisitEdges visits all the edges in graph g in depth-first order.
-// The edge function is called for each edge in postorder. If it
-// returns non-nil, visitation stops and GraphVisitEdges returns that
-// value.
-//
-func GraphVisitEdges(g *Graph, edge func(*Edge) error) error {
- seen := make(map[*Node]bool)
- var visit func(n *Node) error
- visit = func(n *Node) error {
- if !seen[n] {
- seen[n] = true
- for _, e := range n.Out {
- if err := visit(e.Callee); err != nil {
- return err
- }
- if err := edge(e); err != nil {
- return err
- }
- }
- }
- return nil
- }
- for _, n := range g.Nodes {
- if err := visit(n); err != nil {
- return err
- }
- }
- return nil
-}
-
-// PathSearch finds an arbitrary path starting at node start and
-// ending at some node for which isEnd() returns true. On success,
-// PathSearch returns the path as an ordered list of edges; on
-// failure, it returns nil.
-//
-func PathSearch(start *Node, isEnd func(*Node) bool) []*Edge {
- stack := make([]*Edge, 0, 32)
- seen := make(map[*Node]bool)
- var search func(n *Node) []*Edge
- search = func(n *Node) []*Edge {
- if !seen[n] {
- seen[n] = true
- if isEnd(n) {
- return stack
- }
- for _, e := range n.Out {
- stack = append(stack, e) // push
- if found := search(e.Callee); found != nil {
- return found
- }
- stack = stack[:len(stack)-1] // pop
- }
- }
- return nil
- }
- return search(start)
-}
-
-// DeleteSyntheticNodes removes from call graph g all nodes for
-// synthetic functions (except g.Root and package initializers),
-// preserving the topology. In effect, calls to synthetic wrappers
-// are "inlined".
-//
-func (g *Graph) DeleteSyntheticNodes() {
- // Measurements on the standard library and go.tools show that
- // resulting graph has ~15% fewer nodes and 4-8% fewer edges
- // than the input.
- //
- // Inlining a wrapper of in-degree m, out-degree n adds m*n
- // and removes m+n edges. Since most wrappers are monomorphic
- // (n=1) this results in a slight reduction. Polymorphic
- // wrappers (n>1), e.g. from embedding an interface value
- // inside a struct to satisfy some interface, cause an
- // increase in the graph, but they seem to be uncommon.
-
- // Hash all existing edges to avoid creating duplicates.
- edges := make(map[Edge]bool)
- for _, cgn := range g.Nodes {
- for _, e := range cgn.Out {
- edges[*e] = true
- }
- }
- for fn, cgn := range g.Nodes {
- if cgn == g.Root || fn.Synthetic == "" || isInit(cgn.Func) {
- continue // keep
- }
- for _, eIn := range cgn.In {
- for _, eOut := range cgn.Out {
- newEdge := Edge{eIn.Caller, eIn.Site, eOut.Callee}
- if edges[newEdge] {
- continue // don't add duplicate
- }
- AddEdge(eIn.Caller, eIn.Site, eOut.Callee)
- edges[newEdge] = true
- }
- }
- g.DeleteNode(cgn)
- }
-}
-
-func isInit(fn *ssa.Function) bool {
- return fn.Pkg != nil && fn.Pkg.Func("init") == fn
-}
-
-// DeleteNode removes node n and its edges from the graph g.
-// (NB: not efficient for batch deletion.)
-func (g *Graph) DeleteNode(n *Node) {
- n.deleteIns()
- n.deleteOuts()
- delete(g.Nodes, n.Func)
-}
-
-// deleteIns deletes all incoming edges to n.
-func (n *Node) deleteIns() {
- for _, e := range n.In {
- removeOutEdge(e)
- }
- n.In = nil
-}
-
-// deleteOuts deletes all outgoing edges from n.
-func (n *Node) deleteOuts() {
- for _, e := range n.Out {
- removeInEdge(e)
- }
- n.Out = nil
-}
-
-// removeOutEdge removes edge.Caller's outgoing edge 'edge'.
-func removeOutEdge(edge *Edge) {
- caller := edge.Caller
- n := len(caller.Out)
- for i, e := range caller.Out {
- if e == edge {
- // Replace it with the final element and shrink the slice.
- caller.Out[i] = caller.Out[n-1]
- caller.Out[n-1] = nil // aid GC
- caller.Out = caller.Out[:n-1]
- return
- }
- }
- panic("edge not found: " + edge.String())
-}
-
-// removeInEdge removes edge.Callee's incoming edge 'edge'.
-func removeInEdge(edge *Edge) {
- caller := edge.Callee
- n := len(caller.In)
- for i, e := range caller.In {
- if e == edge {
- // Replace it with the final element and shrink the slice.
- caller.In[i] = caller.In[n-1]
- caller.In[n-1] = nil // aid GC
- caller.In = caller.In[:n-1]
- return
- }
- }
- panic("edge not found: " + edge.String())
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/errcheck-ng/errcheck-ng.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/errcheck-ng/errcheck-ng.go
deleted file mode 100644
index cb5bab942..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/errcheck-ng/errcheck-ng.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package main // import "honnef.co/go/tools/cmd/errcheck-ng"
-
-import (
- "os"
-
- "honnef.co/go/tools/errcheck"
- "honnef.co/go/tools/lint/lintutil"
-)
-
-func main() {
- c := lintutil.CheckerConfig{
- Checker: errcheck.NewChecker(),
- ExitNonZero: true,
- }
- lintutil.ProcessArgs("errcheck-ng", []lintutil.CheckerConfig{c}, os.Args[1:])
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/gosimple/gosimple.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/gosimple/gosimple.go
deleted file mode 100644
index 6ea1d79b0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/gosimple/gosimple.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// gosimple detects code that could be rewritten in a simpler way.
-package main // import "honnef.co/go/tools/cmd/gosimple"
-import (
- "os"
-
- "honnef.co/go/tools/lint/lintutil"
- "honnef.co/go/tools/simple"
-)
-
-func main() {
- fs := lintutil.FlagSet("gosimple")
- gen := fs.Bool("generated", false, "Check generated code")
- fs.Parse(os.Args[1:])
- c := simple.NewChecker()
- c.CheckGenerated = *gen
- cfg := lintutil.CheckerConfig{
- Checker: c,
- ExitNonZero: true,
- }
- lintutil.ProcessFlagSet([]lintutil.CheckerConfig{cfg}, fs)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/keyify/keyify.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/keyify/keyify.go
deleted file mode 100644
index 5e18724b6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/keyify/keyify.go
+++ /dev/null
@@ -1,401 +0,0 @@
-// keyify transforms unkeyed struct literals into a keyed ones.
-package main
-
-import (
- "bytes"
- "encoding/json"
- "flag"
- "fmt"
- "go/ast"
- "go/build"
- "go/constant"
- "go/printer"
- "go/token"
- "go/types"
- "log"
- "os"
- "path/filepath"
-
- "honnef.co/go/tools/version"
-
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/go/loader"
-)
-
-var (
- fRecursive bool
- fOneLine bool
- fJSON bool
- fMinify bool
- fModified bool
- fVersion bool
-)
-
-func init() {
- flag.BoolVar(&fRecursive, "r", false, "keyify struct initializers recursively")
- flag.BoolVar(&fOneLine, "o", false, "print new struct initializer on a single line")
- flag.BoolVar(&fJSON, "json", false, "print new struct initializer as JSON")
- flag.BoolVar(&fMinify, "m", false, "omit fields that are set to their zero value")
- flag.BoolVar(&fModified, "modified", false, "read an archive of modified files from standard input")
- flag.BoolVar(&fVersion, "version", false, "Print version and exit")
-}
-
-func usage() {
- fmt.Printf("Usage: %s [flags] \n\n", os.Args[0])
- flag.PrintDefaults()
-}
-
-func main() {
- log.SetFlags(0)
- flag.Usage = usage
- flag.Parse()
-
- if fVersion {
- version.Print()
- os.Exit(0)
- }
-
- if flag.NArg() != 1 {
- flag.Usage()
- os.Exit(2)
- }
- pos := flag.Args()[0]
- name, start, _, err := parsePos(pos)
- if err != nil {
- log.Fatal(err)
- }
- eval, err := filepath.EvalSymlinks(name)
- if err != nil {
- log.Fatal(err)
- }
- name, err = filepath.Abs(eval)
- if err != nil {
- log.Fatal(err)
- }
- cwd, err := os.Getwd()
- if err != nil {
- log.Fatal(err)
- }
- ctx := &build.Default
- if fModified {
- overlay, err := buildutil.ParseOverlayArchive(os.Stdin)
- if err != nil {
- log.Fatal(err)
- }
- ctx = buildutil.OverlayContext(ctx, overlay)
- }
- bpkg, err := buildutil.ContainingPackage(ctx, cwd, name)
- if err != nil {
- log.Fatal(err)
- }
- conf := &loader.Config{
- Build: ctx,
- }
- conf.TypeCheckFuncBodies = func(s string) bool {
- return s == bpkg.ImportPath || s == bpkg.ImportPath+"_test"
- }
- conf.ImportWithTests(bpkg.ImportPath)
- lprog, err := conf.Load()
- if err != nil {
- log.Fatal(err)
- }
- var tf *token.File
- var af *ast.File
- pkg := lprog.InitialPackages()[0]
- for _, ff := range pkg.Files {
- file := lprog.Fset.File(ff.Pos())
- if file.Name() == name {
- af = ff
- tf = file
- break
- }
- }
- tstart, tend, err := fileOffsetToPos(tf, start, start)
- if err != nil {
- log.Fatal(err)
- }
- path, _ := astutil.PathEnclosingInterval(af, tstart, tend)
- var complit *ast.CompositeLit
- for _, p := range path {
- if p, ok := p.(*ast.CompositeLit); ok {
- complit = p
- break
- }
- }
- if complit == nil {
- log.Fatal("no composite literal found near point")
- }
- if len(complit.Elts) == 0 {
- printComplit(complit, complit, lprog.Fset, lprog.Fset)
- return
- }
- if _, ok := complit.Elts[0].(*ast.KeyValueExpr); ok {
- lit := complit
- if fOneLine {
- lit = copyExpr(complit, 1).(*ast.CompositeLit)
- }
- printComplit(complit, lit, lprog.Fset, lprog.Fset)
- return
- }
- _, ok := pkg.TypeOf(complit).Underlying().(*types.Struct)
- if !ok {
- log.Fatal("not a struct initialiser")
- return
- }
-
- newComplit, lines := keyify(pkg, complit)
- newFset := token.NewFileSet()
- newFile := newFset.AddFile("", -1, lines)
- for i := 1; i <= lines; i++ {
- newFile.AddLine(i)
- }
- printComplit(complit, newComplit, lprog.Fset, newFset)
-}
-
-func keyify(
- pkg *loader.PackageInfo,
- complit *ast.CompositeLit,
-) (*ast.CompositeLit, int) {
- var calcPos func(int) token.Pos
- if fOneLine {
- calcPos = func(int) token.Pos { return token.Pos(1) }
- } else {
- calcPos = func(i int) token.Pos { return token.Pos(2 + i) }
- }
-
- st, _ := pkg.TypeOf(complit).Underlying().(*types.Struct)
- newComplit := &ast.CompositeLit{
- Type: complit.Type,
- Lbrace: 1,
- Rbrace: token.Pos(st.NumFields() + 2),
- }
- if fOneLine {
- newComplit.Rbrace = 1
- }
- numLines := 2 + st.NumFields()
- n := 0
- for i := 0; i < st.NumFields(); i++ {
- field := st.Field(i)
- val := complit.Elts[i]
- if fRecursive {
- if val2, ok := val.(*ast.CompositeLit); ok {
- if _, ok := pkg.TypeOf(val2.Type).Underlying().(*types.Struct); ok {
- var lines int
- numLines += lines
- val, lines = keyify(pkg, val2)
- }
- }
- }
- _, isIface := st.Field(i).Type().Underlying().(*types.Interface)
- if fMinify && (isNil(val, pkg) || (!isIface && isZero(val, pkg))) {
- continue
- }
- elt := &ast.KeyValueExpr{
- Key: &ast.Ident{NamePos: calcPos(n), Name: field.Name()},
- Value: copyExpr(val, calcPos(n)),
- }
- newComplit.Elts = append(newComplit.Elts, elt)
- n++
- }
- return newComplit, numLines
-}
-
-func isNil(val ast.Expr, pkg *loader.PackageInfo) bool {
- ident, ok := val.(*ast.Ident)
- if !ok {
- return false
- }
- if _, ok := pkg.ObjectOf(ident).(*types.Nil); ok {
- return true
- }
- if c, ok := pkg.ObjectOf(ident).(*types.Const); ok {
- if c.Val().Kind() != constant.Bool {
- return false
- }
- return !constant.BoolVal(c.Val())
- }
- return false
-}
-
-func isZero(val ast.Expr, pkg *loader.PackageInfo) bool {
- switch val := val.(type) {
- case *ast.BasicLit:
- switch val.Value {
- case `""`, "``", "0", "0.0", "0i", "0.":
- return true
- default:
- return false
- }
- case *ast.Ident:
- return isNil(val, pkg)
- case *ast.CompositeLit:
- typ := pkg.TypeOf(val.Type)
- if typ == nil {
- return false
- }
- isIface := false
- switch typ := typ.Underlying().(type) {
- case *types.Struct:
- case *types.Array:
- _, isIface = typ.Elem().Underlying().(*types.Interface)
- default:
- return false
- }
- for _, elt := range val.Elts {
- if isNil(elt, pkg) || (!isIface && !isZero(elt, pkg)) {
- return false
- }
- }
- return true
- }
- return false
-}
-
-func printComplit(oldlit, newlit *ast.CompositeLit, oldfset, newfset *token.FileSet) {
- buf := &bytes.Buffer{}
- cfg := printer.Config{Mode: printer.UseSpaces | printer.TabIndent, Tabwidth: 8}
- _ = cfg.Fprint(buf, newfset, newlit)
- if fJSON {
- output := struct {
- Start int `json:"start"`
- End int `json:"end"`
- Replacement string `json:"replacement"`
- }{
- oldfset.Position(oldlit.Pos()).Offset,
- oldfset.Position(oldlit.End()).Offset,
- buf.String(),
- }
- _ = json.NewEncoder(os.Stdout).Encode(output)
- } else {
- fmt.Println(buf.String())
- }
-}
-
-func copyExpr(expr ast.Expr, line token.Pos) ast.Expr {
- switch expr := expr.(type) {
- case *ast.BasicLit:
- cp := *expr
- cp.ValuePos = 0
- return &cp
- case *ast.BinaryExpr:
- cp := *expr
- cp.X = copyExpr(cp.X, line)
- cp.OpPos = 0
- cp.Y = copyExpr(cp.Y, line)
- return &cp
- case *ast.CallExpr:
- cp := *expr
- cp.Fun = copyExpr(cp.Fun, line)
- cp.Lparen = 0
- for i, v := range cp.Args {
- cp.Args[i] = copyExpr(v, line)
- }
- if cp.Ellipsis != 0 {
- cp.Ellipsis = line
- }
- cp.Rparen = 0
- return &cp
- case *ast.CompositeLit:
- cp := *expr
- cp.Type = copyExpr(cp.Type, line)
- cp.Lbrace = 0
- for i, v := range cp.Elts {
- cp.Elts[i] = copyExpr(v, line)
- }
- cp.Rbrace = 0
- return &cp
- case *ast.Ident:
- cp := *expr
- cp.NamePos = 0
- return &cp
- case *ast.IndexExpr:
- cp := *expr
- cp.X = copyExpr(cp.X, line)
- cp.Lbrack = 0
- cp.Index = copyExpr(cp.Index, line)
- cp.Rbrack = 0
- return &cp
- case *ast.KeyValueExpr:
- cp := *expr
- cp.Key = copyExpr(cp.Key, line)
- cp.Colon = 0
- cp.Value = copyExpr(cp.Value, line)
- return &cp
- case *ast.ParenExpr:
- cp := *expr
- cp.Lparen = 0
- cp.X = copyExpr(cp.X, line)
- cp.Rparen = 0
- return &cp
- case *ast.SelectorExpr:
- cp := *expr
- cp.X = copyExpr(cp.X, line)
- cp.Sel = copyExpr(cp.Sel, line).(*ast.Ident)
- return &cp
- case *ast.SliceExpr:
- cp := *expr
- cp.X = copyExpr(cp.X, line)
- cp.Lbrack = 0
- cp.Low = copyExpr(cp.Low, line)
- cp.High = copyExpr(cp.High, line)
- cp.Max = copyExpr(cp.Max, line)
- cp.Rbrack = 0
- return &cp
- case *ast.StarExpr:
- cp := *expr
- cp.Star = 0
- cp.X = copyExpr(cp.X, line)
- return &cp
- case *ast.TypeAssertExpr:
- cp := *expr
- cp.X = copyExpr(cp.X, line)
- cp.Lparen = 0
- cp.Type = copyExpr(cp.Type, line)
- cp.Rparen = 0
- return &cp
- case *ast.UnaryExpr:
- cp := *expr
- cp.OpPos = 0
- cp.X = copyExpr(cp.X, line)
- return &cp
- case *ast.MapType:
- cp := *expr
- cp.Map = 0
- cp.Key = copyExpr(cp.Key, line)
- cp.Value = copyExpr(cp.Value, line)
- return &cp
- case *ast.ArrayType:
- cp := *expr
- cp.Lbrack = 0
- cp.Len = copyExpr(cp.Len, line)
- cp.Elt = copyExpr(cp.Elt, line)
- return &cp
- case *ast.Ellipsis:
- cp := *expr
- cp.Elt = copyExpr(cp.Elt, line)
- cp.Ellipsis = line
- return &cp
- case *ast.InterfaceType:
- cp := *expr
- cp.Interface = 0
- return &cp
- case *ast.StructType:
- cp := *expr
- cp.Struct = 0
- return &cp
- case *ast.FuncLit:
- return expr
- case *ast.ChanType:
- cp := *expr
- cp.Arrow = 0
- cp.Begin = 0
- cp.Value = copyExpr(cp.Value, line)
- return &cp
- case nil:
- return nil
- default:
- panic(fmt.Sprintf("shouldn't happen: unknown ast.Expr of type %T", expr))
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/keyify/position.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/keyify/position.go
deleted file mode 100644
index b9578760c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/keyify/position.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "go/token"
- "strconv"
- "strings"
-)
-
-func parseOctothorpDecimal(s string) int {
- if s != "" && s[0] == '#' {
- if s, err := strconv.ParseInt(s[1:], 10, 32); err == nil {
- return int(s)
- }
- }
- return -1
-}
-
-func parsePos(pos string) (filename string, startOffset, endOffset int, err error) {
- if pos == "" {
- err = fmt.Errorf("no source position specified")
- return
- }
-
- colon := strings.LastIndex(pos, ":")
- if colon < 0 {
- err = fmt.Errorf("bad position syntax %q", pos)
- return
- }
- filename, offset := pos[:colon], pos[colon+1:]
- startOffset = -1
- endOffset = -1
- if hyphen := strings.Index(offset, ","); hyphen < 0 {
- // e.g. "foo.go:#123"
- startOffset = parseOctothorpDecimal(offset)
- endOffset = startOffset
- } else {
- // e.g. "foo.go:#123,#456"
- startOffset = parseOctothorpDecimal(offset[:hyphen])
- endOffset = parseOctothorpDecimal(offset[hyphen+1:])
- }
- if startOffset < 0 || endOffset < 0 {
- err = fmt.Errorf("invalid offset %q in query position", offset)
- return
- }
- return
-}
-
-func fileOffsetToPos(file *token.File, startOffset, endOffset int) (start, end token.Pos, err error) {
- // Range check [start..end], inclusive of both end-points.
-
- if 0 <= startOffset && startOffset <= file.Size() {
- start = file.Pos(int(startOffset))
- } else {
- err = fmt.Errorf("start position is beyond end of file")
- return
- }
-
- if 0 <= endOffset && endOffset <= file.Size() {
- end = file.Pos(int(endOffset))
- } else {
- err = fmt.Errorf("end position is beyond end of file")
- return
- }
-
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/megacheck/megacheck.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/megacheck/megacheck.go
deleted file mode 100644
index 4c0b97c80..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/megacheck/megacheck.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// megacheck runs staticcheck, gosimple and unused.
-package main // import "honnef.co/go/tools/cmd/megacheck"
-
-import (
- "os"
-
- "honnef.co/go/tools/lint/lintutil"
- "honnef.co/go/tools/simple"
- "honnef.co/go/tools/staticcheck"
- "honnef.co/go/tools/unused"
-)
-
-func main() {
- var flags struct {
- staticcheck struct {
- enabled bool
- generated bool
- exitNonZero bool
- }
- gosimple struct {
- enabled bool
- generated bool
- exitNonZero bool
- }
- unused struct {
- enabled bool
- constants bool
- fields bool
- functions bool
- types bool
- variables bool
- debug string
- wholeProgram bool
- reflection bool
- exitNonZero bool
- }
- }
- fs := lintutil.FlagSet("megacheck")
- fs.BoolVar(&flags.gosimple.enabled,
- "simple.enabled", true, "Run gosimple")
- fs.BoolVar(&flags.gosimple.generated,
- "simple.generated", false, "Check generated code")
- fs.BoolVar(&flags.gosimple.exitNonZero,
- "simple.exit-non-zero", false, "Exit non-zero if any problems were found")
-
- fs.BoolVar(&flags.staticcheck.enabled,
- "staticcheck.enabled", true, "Run staticcheck")
- fs.BoolVar(&flags.staticcheck.generated,
- "staticcheck.generated", false, "Check generated code (only applies to a subset of checks)")
- fs.BoolVar(&flags.staticcheck.exitNonZero,
- "staticcheck.exit-non-zero", true, "Exit non-zero if any problems were found")
-
- fs.BoolVar(&flags.unused.enabled,
- "unused.enabled", true, "Run unused")
- fs.BoolVar(&flags.unused.constants,
- "unused.consts", true, "Report unused constants")
- fs.BoolVar(&flags.unused.fields,
- "unused.fields", true, "Report unused fields")
- fs.BoolVar(&flags.unused.functions,
- "unused.funcs", true, "Report unused functions and methods")
- fs.BoolVar(&flags.unused.types,
- "unused.types", true, "Report unused types")
- fs.BoolVar(&flags.unused.variables,
- "unused.vars", true, "Report unused variables")
- fs.BoolVar(&flags.unused.wholeProgram,
- "unused.exported", false, "Treat arguments as a program and report unused exported identifiers")
- fs.BoolVar(&flags.unused.reflection,
- "unused.reflect", true, "Consider identifiers as used when it's likely they'll be accessed via reflection")
- fs.BoolVar(&flags.unused.exitNonZero,
- "unused.exit-non-zero", true, "Exit non-zero if any problems were found")
-
- fs.Parse(os.Args[1:])
-
- var checkers []lintutil.CheckerConfig
-
- if flags.staticcheck.enabled {
- sac := staticcheck.NewChecker()
- sac.CheckGenerated = flags.staticcheck.generated
- checkers = append(checkers, lintutil.CheckerConfig{
- Checker: sac,
- ExitNonZero: flags.staticcheck.exitNonZero,
- })
- }
-
- if flags.gosimple.enabled {
- sc := simple.NewChecker()
- sc.CheckGenerated = flags.gosimple.generated
- checkers = append(checkers, lintutil.CheckerConfig{
- Checker: sc,
- ExitNonZero: flags.gosimple.exitNonZero,
- })
- }
-
- if flags.unused.enabled {
- var mode unused.CheckMode
- if flags.unused.constants {
- mode |= unused.CheckConstants
- }
- if flags.unused.fields {
- mode |= unused.CheckFields
- }
- if flags.unused.functions {
- mode |= unused.CheckFunctions
- }
- if flags.unused.types {
- mode |= unused.CheckTypes
- }
- if flags.unused.variables {
- mode |= unused.CheckVariables
- }
- uc := unused.NewChecker(mode)
- uc.WholeProgram = flags.unused.wholeProgram
- uc.ConsiderReflection = flags.unused.reflection
- checkers = append(checkers, lintutil.CheckerConfig{
- Checker: unused.NewLintChecker(uc),
- ExitNonZero: flags.unused.exitNonZero,
- })
-
- }
-
- lintutil.ProcessFlagSet(checkers, fs)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/rdeps/rdeps.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/rdeps/rdeps.go
deleted file mode 100644
index f4a3d0c74..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/rdeps/rdeps.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// rdeps scans GOPATH for all reverse dependencies of a set of Go
-// packages.
-//
-// rdeps will not sort its output, and the order of the output is
-// undefined. Pipe its output through sort if you need stable output.
-package main
-
-import (
- "bufio"
- "flag"
- "fmt"
- "go/build"
- "os"
-
- "honnef.co/go/tools/version"
-
- "github.com/kisielk/gotool"
- "golang.org/x/tools/go/buildutil"
- "golang.org/x/tools/refactor/importgraph"
-)
-
-func main() {
- var tags buildutil.TagsFlag
- flag.Var(&tags, "tags", "List of build tags")
- stdin := flag.Bool("stdin", false, "Read packages from stdin instead of the command line")
- recursive := flag.Bool("r", false, "Print reverse dependencies recursively")
- printVersion := flag.Bool("version", false, "Print version and exit")
- flag.Parse()
-
- if *printVersion {
- version.Print()
- os.Exit(0)
- }
-
- ctx := build.Default
- ctx.BuildTags = tags
- var args []string
- if *stdin {
- s := bufio.NewScanner(os.Stdin)
- for s.Scan() {
- args = append(args, s.Text())
- }
- } else {
- args = flag.Args()
- }
- if len(args) == 0 {
- return
- }
- wd, err := os.Getwd()
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- pkgs := gotool.ImportPaths(args)
- for i, pkg := range pkgs {
- bpkg, err := ctx.Import(pkg, wd, build.FindOnly)
- if err != nil {
- continue
- }
- pkgs[i] = bpkg.ImportPath
- }
- _, reverse, errors := importgraph.Build(&ctx)
- _ = errors
-
- seen := map[string]bool{}
- var printRDeps func(pkg string)
- printRDeps = func(pkg string) {
- for rdep := range reverse[pkg] {
- if seen[rdep] {
- continue
- }
- seen[rdep] = true
- fmt.Println(rdep)
- if *recursive {
- printRDeps(rdep)
- }
- }
- }
-
- for _, pkg := range pkgs {
- printRDeps(pkg)
- }
- for pkg, err := range errors {
- fmt.Fprintf(os.Stderr, "error in package %s: %s\n", pkg, err)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/staticcheck/staticcheck.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/staticcheck/staticcheck.go
deleted file mode 100644
index 5e6d6f9cc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/staticcheck/staticcheck.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// staticcheck detects a myriad of bugs and inefficiencies in your
-// code.
-package main // import "honnef.co/go/tools/cmd/staticcheck"
-
-import (
- "os"
-
- "honnef.co/go/tools/lint/lintutil"
- "honnef.co/go/tools/staticcheck"
-)
-
-func main() {
- fs := lintutil.FlagSet("staticcheck")
- gen := fs.Bool("generated", false, "Check generated code")
- fs.Parse(os.Args[1:])
- c := staticcheck.NewChecker()
- c.CheckGenerated = *gen
- cfg := lintutil.CheckerConfig{
- Checker: c,
- ExitNonZero: true,
- }
- lintutil.ProcessFlagSet([]lintutil.CheckerConfig{cfg}, fs)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout-optimize/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout-optimize/main.go
deleted file mode 100644
index dd9c1f3b5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout-optimize/main.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// structlayout-optimize reorders struct fields to minimize the amount
-// of padding.
-package main
-
-import (
- "encoding/json"
- "flag"
- "fmt"
- "log"
- "os"
- "sort"
- "strings"
-
- st "honnef.co/go/tools/structlayout"
- "honnef.co/go/tools/version"
-)
-
-var (
- fJSON bool
- fRecurse bool
- fVersion bool
-)
-
-func init() {
- flag.BoolVar(&fJSON, "json", false, "Format data as JSON")
- flag.BoolVar(&fRecurse, "r", false, "Break up structs and reorder their fields freely")
- flag.BoolVar(&fVersion, "version", false, "Print version and exit")
-}
-
-func main() {
- log.SetFlags(0)
- flag.Parse()
-
- if fVersion {
- version.Print()
- os.Exit(0)
- }
-
- var in []st.Field
- if err := json.NewDecoder(os.Stdin).Decode(&in); err != nil {
- log.Fatal(err)
- }
- if len(in) == 0 {
- return
- }
- if !fRecurse {
- in = combine(in)
- }
- var fields []st.Field
- for _, field := range in {
- if field.IsPadding {
- continue
- }
- fields = append(fields, field)
- }
- optimize(fields)
- fields = pad(fields)
-
- if fJSON {
- json.NewEncoder(os.Stdout).Encode(fields)
- } else {
- for _, field := range fields {
- fmt.Println(field)
- }
- }
-}
-
-func combine(fields []st.Field) []st.Field {
- new := st.Field{}
- cur := ""
- var out []st.Field
- wasPad := true
- for _, field := range fields {
- var prefix string
- if field.IsPadding {
- wasPad = true
- continue
- }
- p := strings.Split(field.Name, ".")
- prefix = strings.Join(p[:2], ".")
- if field.Align > new.Align {
- new.Align = field.Align
- }
- if !wasPad {
- new.End = field.Start
- new.Size = new.End - new.Start
- }
- if prefix != cur {
- if cur != "" {
- out = append(out, new)
- }
- cur = prefix
- new = field
- new.Name = prefix
- } else {
- new.Type = "struct"
- }
- wasPad = false
- }
- new.Size = new.End - new.Start
- out = append(out, new)
- return out
-}
-
-func optimize(fields []st.Field) {
- sort.Sort(&byAlignAndSize{fields})
-}
-
-func pad(fields []st.Field) []st.Field {
- if len(fields) == 0 {
- return nil
- }
- var out []st.Field
- pos := int64(0)
- offsets := offsetsof(fields)
- alignment := int64(1)
- for i, field := range fields {
- if field.Align > alignment {
- alignment = field.Align
- }
- if offsets[i] > pos {
- padding := offsets[i] - pos
- out = append(out, st.Field{
- IsPadding: true,
- Start: pos,
- End: pos + padding,
- Size: padding,
- })
- pos += padding
- }
- field.Start = pos
- field.End = pos + field.Size
- out = append(out, field)
- pos += field.Size
- }
- sz := size(out)
- pad := align(sz, alignment) - sz
- if pad > 0 {
- field := out[len(out)-1]
- out = append(out, st.Field{
- IsPadding: true,
- Start: field.End,
- End: field.End + pad,
- Size: pad,
- })
- }
- return out
-}
-
-func size(fields []st.Field) int64 {
- n := int64(0)
- for _, field := range fields {
- n += field.Size
- }
- return n
-}
-
-type byAlignAndSize struct {
- fields []st.Field
-}
-
-func (s *byAlignAndSize) Len() int { return len(s.fields) }
-func (s *byAlignAndSize) Swap(i, j int) {
- s.fields[i], s.fields[j] = s.fields[j], s.fields[i]
-}
-
-func (s *byAlignAndSize) Less(i, j int) bool {
- // Place zero sized objects before non-zero sized objects.
- if s.fields[i].Size == 0 && s.fields[j].Size != 0 {
- return true
- }
- if s.fields[j].Size == 0 && s.fields[i].Size != 0 {
- return false
- }
-
- // Next, place more tightly aligned objects before less tightly aligned objects.
- if s.fields[i].Align != s.fields[j].Align {
- return s.fields[i].Align > s.fields[j].Align
- }
-
- // Lastly, order by size.
- if s.fields[i].Size != s.fields[j].Size {
- return s.fields[i].Size > s.fields[j].Size
- }
-
- return false
-}
-
-func offsetsof(fields []st.Field) []int64 {
- offsets := make([]int64, len(fields))
- var o int64
- for i, f := range fields {
- a := f.Align
- o = align(o, a)
- offsets[i] = o
- o += f.Size
- }
- return offsets
-}
-
-// align returns the smallest y >= x such that y % a == 0.
-func align(x, a int64) int64 {
- y := x + a - 1
- return y - y%a
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout-pretty/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout-pretty/main.go
deleted file mode 100644
index a75192c9d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout-pretty/main.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// structlayout-pretty formats the output of structlayout with ASCII
-// art.
-package main
-
-import (
- "encoding/json"
- "flag"
- "fmt"
- "log"
- "os"
- "strings"
-
- st "honnef.co/go/tools/structlayout"
- "honnef.co/go/tools/version"
-)
-
-var (
- fVerbose bool
- fVersion bool
-)
-
-func init() {
- flag.BoolVar(&fVerbose, "v", false, "Do not compact consecutive bytes of fields")
- flag.BoolVar(&fVersion, "version", false, "Print version and exit")
-}
-
-func main() {
- log.SetFlags(0)
- flag.Parse()
-
- if fVersion {
- version.Print()
- os.Exit(0)
- }
-
- var fields []st.Field
- if err := json.NewDecoder(os.Stdin).Decode(&fields); err != nil {
- log.Fatal(err)
- }
- if len(fields) == 0 {
- return
- }
- max := fields[len(fields)-1].End
- maxLength := len(fmt.Sprintf("%d", max))
- padding := strings.Repeat(" ", maxLength+2)
- format := fmt.Sprintf(" %%%dd ", maxLength)
- pos := int64(0)
- fmt.Println(padding + "+--------+")
- for _, field := range fields {
- name := field.Name + " " + field.Type
- if field.IsPadding {
- name = "padding"
- }
- fmt.Printf(format+"| | <- %s (size %d, align %d)\n", pos, name, field.Size, field.Align)
- fmt.Println(padding + "+--------+")
-
- if fVerbose {
- for i := int64(0); i < field.Size-1; i++ {
- fmt.Printf(format+"| |\n", pos+i+1)
- fmt.Println(padding + "+--------+")
- }
- } else {
- if field.Size > 2 {
- fmt.Println(padding + "-........-")
- fmt.Println(padding + "+--------+")
- fmt.Printf(format+"| |\n", pos+field.Size-1)
- fmt.Println(padding + "+--------+")
- }
- }
- pos += field.Size
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout/main.go
deleted file mode 100644
index 0cdf7c2cf..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/structlayout/main.go
+++ /dev/null
@@ -1,149 +0,0 @@
-// structlayout displays the layout (field sizes and padding) of structs.
-package main
-
-import (
- "encoding/json"
- "flag"
- "fmt"
- "go/build"
- "go/types"
- "log"
- "os"
-
- "honnef.co/go/tools/gcsizes"
- st "honnef.co/go/tools/structlayout"
- "honnef.co/go/tools/version"
-
- "golang.org/x/tools/go/loader"
-)
-
-var (
- fJSON bool
- fVersion bool
-)
-
-func init() {
- flag.BoolVar(&fJSON, "json", false, "Format data as JSON")
- flag.BoolVar(&fVersion, "version", false, "Print version and exit")
-}
-
-func main() {
- log.SetFlags(0)
- flag.Parse()
-
- if fVersion {
- version.Print()
- os.Exit(0)
- }
-
- if len(flag.Args()) != 2 {
- flag.Usage()
- os.Exit(1)
- }
-
- conf := loader.Config{
- Build: &build.Default,
- }
-
- var pkg string
- var typName string
- pkg = flag.Args()[0]
- typName = flag.Args()[1]
- conf.Import(pkg)
-
- lprog, err := conf.Load()
- if err != nil {
- log.Fatal(err)
- }
- var typ types.Type
- obj := lprog.Package(pkg).Pkg.Scope().Lookup(typName)
- if obj == nil {
- log.Fatal("couldn't find type")
- }
- typ = obj.Type()
-
- st, ok := typ.Underlying().(*types.Struct)
- if !ok {
- log.Fatal("identifier is not a struct type")
- }
-
- fields := sizes(st, typ.(*types.Named).Obj().Name(), 0, nil)
- if fJSON {
- emitJSON(fields)
- } else {
- emitText(fields)
- }
-}
-
-func emitJSON(fields []st.Field) {
- if fields == nil {
- fields = []st.Field{}
- }
- json.NewEncoder(os.Stdout).Encode(fields)
-}
-
-func emitText(fields []st.Field) {
- for _, field := range fields {
- fmt.Println(field)
- }
-}
-func sizes(typ *types.Struct, prefix string, base int64, out []st.Field) []st.Field {
- s := gcsizes.ForArch(build.Default.GOARCH)
- n := typ.NumFields()
- var fields []*types.Var
- for i := 0; i < n; i++ {
- fields = append(fields, typ.Field(i))
- }
- offsets := s.Offsetsof(fields)
- for i := range offsets {
- offsets[i] += base
- }
-
- pos := base
- for i, field := range fields {
- if offsets[i] > pos {
- padding := offsets[i] - pos
- out = append(out, st.Field{
- IsPadding: true,
- Start: pos,
- End: pos + padding,
- Size: padding,
- })
- pos += padding
- }
- size := s.Sizeof(field.Type())
- if typ2, ok := field.Type().Underlying().(*types.Struct); ok && typ2.NumFields() != 0 {
- out = sizes(typ2, prefix+"."+field.Name(), pos, out)
- } else {
- out = append(out, st.Field{
- Name: prefix + "." + field.Name(),
- Type: field.Type().String(),
- Start: offsets[i],
- End: offsets[i] + size,
- Size: size,
- Align: s.Alignof(field.Type()),
- })
- }
- pos += size
- }
-
- if len(out) == 0 {
- return out
- }
- field := &out[len(out)-1]
- if field.Size == 0 {
- field.Size = 1
- field.End++
- }
- pad := s.Sizeof(typ) - field.End
- if pad > 0 {
- out = append(out, st.Field{
- IsPadding: true,
- Start: field.End,
- End: field.End + pad,
- Size: pad,
- })
- }
-
- return out
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/unused/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/unused/main.go
deleted file mode 100644
index 9698db50a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/cmd/unused/main.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// unused reports unused identifiers (types, functions, ...) in your
-// code.
-package main // import "honnef.co/go/tools/cmd/unused"
-
-import (
- "log"
- "os"
-
- "honnef.co/go/tools/lint/lintutil"
- "honnef.co/go/tools/unused"
-)
-
-var (
- fConstants bool
- fFields bool
- fFunctions bool
- fTypes bool
- fVariables bool
- fDebug string
- fWholeProgram bool
- fReflection bool
-)
-
-func newChecker(mode unused.CheckMode) *unused.Checker {
- checker := unused.NewChecker(mode)
-
- if fDebug != "" {
- debug, err := os.Create(fDebug)
- if err != nil {
- log.Fatal("couldn't open debug file:", err)
- }
- checker.Debug = debug
- }
-
- checker.WholeProgram = fWholeProgram
- checker.ConsiderReflection = fReflection
- return checker
-}
-
-func main() {
- log.SetFlags(0)
-
- fs := lintutil.FlagSet("unused")
- fs.BoolVar(&fConstants, "consts", true, "Report unused constants")
- fs.BoolVar(&fFields, "fields", true, "Report unused fields")
- fs.BoolVar(&fFunctions, "funcs", true, "Report unused functions and methods")
- fs.BoolVar(&fTypes, "types", true, "Report unused types")
- fs.BoolVar(&fVariables, "vars", true, "Report unused variables")
- fs.StringVar(&fDebug, "debug", "", "Write a debug graph to `file`. Existing files will be overwritten.")
- fs.BoolVar(&fWholeProgram, "exported", false, "Treat arguments as a program and report unused exported identifiers")
- fs.BoolVar(&fReflection, "reflect", true, "Consider identifiers as used when it's likely they'll be accessed via reflection")
- fs.Parse(os.Args[1:])
-
- var mode unused.CheckMode
- if fConstants {
- mode |= unused.CheckConstants
- }
- if fFields {
- mode |= unused.CheckFields
- }
- if fFunctions {
- mode |= unused.CheckFunctions
- }
- if fTypes {
- mode |= unused.CheckTypes
- }
- if fVariables {
- mode |= unused.CheckVariables
- }
-
- checker := newChecker(mode)
- l := unused.NewLintChecker(checker)
- cfg := lintutil.CheckerConfig{
- Checker: l,
- ExitNonZero: true,
- }
- lintutil.ProcessFlagSet([]lintutil.CheckerConfig{cfg}, fs)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/deprecated/stdlib.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/deprecated/stdlib.go
deleted file mode 100644
index b6b217c3e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/deprecated/stdlib.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package deprecated
-
-type Deprecation struct {
- DeprecatedSince int
- AlternativeAvailableSince int
-}
-
-var Stdlib = map[string]Deprecation{
- "image/jpeg.Reader": {4, 0},
- // FIXME(dh): AllowBinary isn't being detected as deprecated
- // because the comment has a newline right after "Deprecated:"
- "go/build.AllowBinary": {7, 7},
- "(archive/zip.FileHeader).CompressedSize": {1, 1},
- "(archive/zip.FileHeader).UncompressedSize": {1, 1},
- "(go/doc.Package).Bugs": {1, 1},
- "os.SEEK_SET": {7, 7},
- "os.SEEK_CUR": {7, 7},
- "os.SEEK_END": {7, 7},
- "(net.Dialer).Cancel": {7, 7},
- "runtime.CPUProfile": {9, 0},
- "compress/flate.ReadError": {6, 6},
- "compress/flate.WriteError": {6, 6},
- "path/filepath.HasPrefix": {0, 0},
- "(net/http.Transport).Dial": {7, 7},
- "(*net/http.Transport).CancelRequest": {6, 5},
- "net/http.ErrWriteAfterFlush": {7, 0},
- "net/http.ErrHeaderTooLong": {8, 0},
- "net/http.ErrShortBody": {8, 0},
- "net/http.ErrMissingContentLength": {8, 0},
- "net/http/httputil.ErrPersistEOF": {0, 0},
- "net/http/httputil.ErrClosed": {0, 0},
- "net/http/httputil.ErrPipeline": {0, 0},
- "net/http/httputil.ServerConn": {0, 0},
- "net/http/httputil.NewServerConn": {0, 0},
- "net/http/httputil.ClientConn": {0, 0},
- "net/http/httputil.NewClientConn": {0, 0},
- "net/http/httputil.NewProxyClientConn": {0, 0},
- "(net/http.Request).Cancel": {7, 7},
- "(text/template/parse.PipeNode).Line": {1, 1},
- "(text/template/parse.ActionNode).Line": {1, 1},
- "(text/template/parse.BranchNode).Line": {1, 1},
- "(text/template/parse.TemplateNode).Line": {1, 1},
- "database/sql/driver.ColumnConverter": {9, 9},
- "database/sql/driver.Execer": {8, 8},
- "database/sql/driver.Queryer": {8, 8},
- "(database/sql/driver.Conn).Begin": {8, 8},
- "(database/sql/driver.Stmt).Exec": {8, 8},
- "(database/sql/driver.Stmt).Query": {8, 8},
- "syscall.StringByteSlice": {1, 1},
- "syscall.StringBytePtr": {1, 1},
- "syscall.StringSlicePtr": {1, 1},
- "syscall.StringToUTF16": {1, 1},
- "syscall.StringToUTF16Ptr": {1, 1},
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/errcheck/errcheck.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/errcheck/errcheck.go
deleted file mode 100644
index d9004de32..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/errcheck/errcheck.go
+++ /dev/null
@@ -1,157 +0,0 @@
-package errcheck
-
-import (
- "go/types"
-
- "honnef.co/go/tools/functions"
- "honnef.co/go/tools/lint"
- "honnef.co/go/tools/ssa"
-)
-
-type Checker struct {
- funcDescs *functions.Descriptions
-}
-
-func NewChecker() *Checker {
- return &Checker{}
-}
-
-func (*Checker) Name() string { return "errcheck" }
-func (*Checker) Prefix() string { return "ERR" }
-
-func (c *Checker) Funcs() map[string]lint.Func {
- return map[string]lint.Func{
- "ERR1000": c.CheckErrcheck,
- }
-}
-
-func (c *Checker) Init(prog *lint.Program) {
- c.funcDescs = functions.NewDescriptions(prog.SSA)
-}
-
-func (c *Checker) CheckErrcheck(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- for _, b := range ssafn.Blocks {
- for _, ins := range b.Instrs {
- ssacall, ok := ins.(ssa.CallInstruction)
- if !ok {
- continue
- }
-
- switch lint.CallName(ssacall.Common()) {
- case "fmt.Print", "fmt.Println", "fmt.Printf":
- continue
- }
- isRecover := false
- if builtin, ok := ssacall.Common().Value.(*ssa.Builtin); ok {
- isRecover = ok && builtin.Name() == "recover"
- }
-
- switch ins := ins.(type) {
- case ssa.Value:
- refs := ins.Referrers()
- if refs == nil || len(lint.FilterDebug(*refs)) != 0 {
- continue
- }
- case ssa.Instruction:
- // will be a 'go' or 'defer', neither of which has usable return values
- default:
- // shouldn't happen
- continue
- }
-
- if ssacall.Common().IsInvoke() {
- if sc, ok := ssacall.Common().Value.(*ssa.Call); ok {
- // TODO(dh): support multiple levels of
- // interfaces, not just one
- ssafn := sc.Common().StaticCallee()
- if ssafn != nil {
- ct := c.funcDescs.Get(ssafn).ConcreteReturnTypes
- // TODO(dh): support >1 concrete types
- if ct != nil && len(ct) == 1 {
- // TODO(dh): do we have access to a
- // cached method set somewhere?
- ms := types.NewMethodSet(ct[0].At(ct[0].Len() - 1).Type())
- // TODO(dh): where can we get the pkg
- // for Lookup? Passing nil works fine
- // for exported methods, but will fail
- // on unexported ones
- // TODO(dh): holy nesting and poor
- // variable names, clean this up
- fn, _ := ms.Lookup(nil, ssacall.Common().Method.Name()).Obj().(*types.Func)
- if fn != nil {
- ssafn := j.Program.SSA.FuncValue(fn)
- if ssafn != nil {
- if c.funcDescs.Get(ssafn).NilError {
- continue
- }
- }
- }
- }
- }
- }
- } else {
- ssafn := ssacall.Common().StaticCallee()
- if ssafn != nil {
- if c.funcDescs.Get(ssafn).NilError {
- // Don't complain when the error is known to be nil
- continue
- }
- }
- }
- switch lint.CallName(ssacall.Common()) {
- case "(*os.File).Close":
- recv := ssacall.Common().Args[0]
- if isReadOnlyFile(recv, nil) {
- continue
- }
- }
-
- res := ssacall.Common().Signature().Results()
- if res.Len() == 0 {
- continue
- }
- if !isRecover {
- last := res.At(res.Len() - 1)
- if types.TypeString(last.Type(), nil) != "error" {
- continue
- }
- }
- j.Errorf(ins, "unchecked error")
- }
- }
- }
-}
-
-func isReadOnlyFile(val ssa.Value, seen map[ssa.Value]bool) bool {
- if seen == nil {
- seen = map[ssa.Value]bool{}
- }
- if seen[val] {
- return true
- }
- seen[val] = true
- switch val := val.(type) {
- case *ssa.Phi:
- for _, edge := range val.Edges {
- if !isReadOnlyFile(edge, seen) {
- return false
- }
- }
- return true
- case *ssa.Extract:
- call, ok := val.Tuple.(*ssa.Call)
- if !ok {
- return false
- }
- switch lint.CallName(call.Common()) {
- case "os.Open":
- return true
- case "os.OpenFile":
- flags, ok := call.Common().Args[1].(*ssa.Const)
- return ok && flags.Uint64() == 0
- }
- return false
- }
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/concrete.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/concrete.go
deleted file mode 100644
index 932acd03e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/concrete.go
+++ /dev/null
@@ -1,56 +0,0 @@
-package functions
-
-import (
- "go/token"
- "go/types"
-
- "honnef.co/go/tools/ssa"
-)
-
-func concreteReturnTypes(fn *ssa.Function) []*types.Tuple {
- res := fn.Signature.Results()
- if res == nil {
- return nil
- }
- ifaces := make([]bool, res.Len())
- any := false
- for i := 0; i < res.Len(); i++ {
- _, ifaces[i] = res.At(i).Type().Underlying().(*types.Interface)
- any = any || ifaces[i]
- }
- if !any {
- return []*types.Tuple{res}
- }
- var out []*types.Tuple
- for _, block := range fn.Blocks {
- if len(block.Instrs) == 0 {
- continue
- }
- ret, ok := block.Instrs[len(block.Instrs)-1].(*ssa.Return)
- if !ok {
- continue
- }
- vars := make([]*types.Var, res.Len())
- for i, v := range ret.Results {
- var typ types.Type
- if !ifaces[i] {
- typ = res.At(i).Type()
- } else if mi, ok := v.(*ssa.MakeInterface); ok {
- // TODO(dh): if mi.X is a function call that returns
- // an interface, call concreteReturnTypes on that
- // function (or, really, go through Descriptions,
- // avoid infinite recursion etc, just like nil error
- // detection)
-
- // TODO(dh): support Phi nodes
- typ = mi.X.Type()
- } else {
- typ = res.At(i).Type()
- }
- vars[i] = types.NewParam(token.NoPos, nil, "", typ)
- }
- out = append(out, types.NewTuple(vars...))
- }
- // TODO(dh): deduplicate out
- return out
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/functions.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/functions.go
deleted file mode 100644
index c5fe2d729..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/functions.go
+++ /dev/null
@@ -1,150 +0,0 @@
-package functions
-
-import (
- "go/types"
- "sync"
-
- "honnef.co/go/tools/callgraph"
- "honnef.co/go/tools/callgraph/static"
- "honnef.co/go/tools/ssa"
- "honnef.co/go/tools/staticcheck/vrp"
-)
-
-var stdlibDescs = map[string]Description{
- "errors.New": Description{Pure: true},
-
- "fmt.Errorf": Description{Pure: true},
- "fmt.Sprintf": Description{Pure: true},
- "fmt.Sprint": Description{Pure: true},
-
- "sort.Reverse": Description{Pure: true},
-
- "strings.Map": Description{Pure: true},
- "strings.Repeat": Description{Pure: true},
- "strings.Replace": Description{Pure: true},
- "strings.Title": Description{Pure: true},
- "strings.ToLower": Description{Pure: true},
- "strings.ToLowerSpecial": Description{Pure: true},
- "strings.ToTitle": Description{Pure: true},
- "strings.ToTitleSpecial": Description{Pure: true},
- "strings.ToUpper": Description{Pure: true},
- "strings.ToUpperSpecial": Description{Pure: true},
- "strings.Trim": Description{Pure: true},
- "strings.TrimFunc": Description{Pure: true},
- "strings.TrimLeft": Description{Pure: true},
- "strings.TrimLeftFunc": Description{Pure: true},
- "strings.TrimPrefix": Description{Pure: true},
- "strings.TrimRight": Description{Pure: true},
- "strings.TrimRightFunc": Description{Pure: true},
- "strings.TrimSpace": Description{Pure: true},
- "strings.TrimSuffix": Description{Pure: true},
-
- "(*net/http.Request).WithContext": Description{Pure: true},
-
- "math/rand.Read": Description{NilError: true},
- "(*math/rand.Rand).Read": Description{NilError: true},
-}
-
-type Description struct {
- // The function is known to be pure
- Pure bool
- // The function is known to be a stub
- Stub bool
- // The function is known to never return (panics notwithstanding)
- Infinite bool
- // Variable ranges
- Ranges vrp.Ranges
- Loops []Loop
- // Function returns an error as its last argument, but it is
- // always nil
- NilError bool
- ConcreteReturnTypes []*types.Tuple
-}
-
-type descriptionEntry struct {
- ready chan struct{}
- result Description
-}
-
-type Descriptions struct {
- CallGraph *callgraph.Graph
- mu sync.Mutex
- cache map[*ssa.Function]*descriptionEntry
-}
-
-func NewDescriptions(prog *ssa.Program) *Descriptions {
- return &Descriptions{
- CallGraph: static.CallGraph(prog),
- cache: map[*ssa.Function]*descriptionEntry{},
- }
-}
-
-func (d *Descriptions) Get(fn *ssa.Function) Description {
- d.mu.Lock()
- fd := d.cache[fn]
- if fd == nil {
- fd = &descriptionEntry{
- ready: make(chan struct{}),
- }
- d.cache[fn] = fd
- d.mu.Unlock()
-
- {
- fd.result = stdlibDescs[fn.RelString(nil)]
- fd.result.Pure = fd.result.Pure || d.IsPure(fn)
- fd.result.Stub = fd.result.Stub || d.IsStub(fn)
- fd.result.Infinite = fd.result.Infinite || !terminates(fn)
- fd.result.Ranges = vrp.BuildGraph(fn).Solve()
- fd.result.Loops = findLoops(fn)
- fd.result.NilError = fd.result.NilError || IsNilError(fn)
- fd.result.ConcreteReturnTypes = concreteReturnTypes(fn)
- }
-
- close(fd.ready)
- } else {
- d.mu.Unlock()
- <-fd.ready
- }
- return fd.result
-}
-
-func IsNilError(fn *ssa.Function) bool {
- // TODO(dh): This is very simplistic, as we only look for constant
- // nil returns. A more advanced approach would work transitively.
- // An even more advanced approach would be context-aware and
- // determine nil errors based on inputs (e.g. io.WriteString to a
- // bytes.Buffer will always return nil, but an io.WriteString to
- // an os.File might not). Similarly, an os.File opened for reading
- // won't error on Close, but other files will.
- res := fn.Signature.Results()
- if res.Len() == 0 {
- return false
- }
- last := res.At(res.Len() - 1)
- if types.TypeString(last.Type(), nil) != "error" {
- return false
- }
-
- if fn.Blocks == nil {
- return false
- }
- for _, block := range fn.Blocks {
- if len(block.Instrs) == 0 {
- continue
- }
- ins := block.Instrs[len(block.Instrs)-1]
- ret, ok := ins.(*ssa.Return)
- if !ok {
- continue
- }
- v := ret.Results[len(ret.Results)-1]
- c, ok := v.(*ssa.Const)
- if !ok {
- return false
- }
- if !c.IsNil() {
- return false
- }
- }
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/loops.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/loops.go
deleted file mode 100644
index 63011cf3e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/loops.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package functions
-
-import "honnef.co/go/tools/ssa"
-
-type Loop map[*ssa.BasicBlock]bool
-
-func findLoops(fn *ssa.Function) []Loop {
- if fn.Blocks == nil {
- return nil
- }
- tree := fn.DomPreorder()
- var sets []Loop
- for _, h := range tree {
- for _, n := range h.Preds {
- if !h.Dominates(n) {
- continue
- }
- // n is a back-edge to h
- // h is the loop header
- if n == h {
- sets = append(sets, Loop{n: true})
- continue
- }
- set := Loop{h: true, n: true}
- for _, b := range allPredsBut(n, h, nil) {
- set[b] = true
- }
- sets = append(sets, set)
- }
- }
- return sets
-}
-
-func allPredsBut(b, but *ssa.BasicBlock, list []*ssa.BasicBlock) []*ssa.BasicBlock {
-outer:
- for _, pred := range b.Preds {
- if pred == but {
- continue
- }
- for _, p := range list {
- // TODO improve big-o complexity of this function
- if pred == p {
- continue outer
- }
- }
- list = append(list, pred)
- list = allPredsBut(pred, but, list)
- }
- return list
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/pure.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/pure.go
deleted file mode 100644
index d1c4d036e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/pure.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package functions
-
-import (
- "go/token"
- "go/types"
-
- "honnef.co/go/tools/callgraph"
- "honnef.co/go/tools/lint"
- "honnef.co/go/tools/ssa"
-)
-
-// IsStub reports whether a function is a stub. A function is
-// considered a stub if it has no instructions or exactly one
-// instruction, which must be either returning only constant values or
-// a panic.
-func (d *Descriptions) IsStub(fn *ssa.Function) bool {
- if len(fn.Blocks) == 0 {
- return true
- }
- if len(fn.Blocks) > 1 {
- return false
- }
- instrs := lint.FilterDebug(fn.Blocks[0].Instrs)
- if len(instrs) != 1 {
- return false
- }
-
- switch instrs[0].(type) {
- case *ssa.Return:
- // Since this is the only instruction, the return value must
- // be a constant. We consider all constants as stubs, not just
- // the zero value. This does not, unfortunately, cover zero
- // initialised structs, as these cause additional
- // instructions.
- return true
- case *ssa.Panic:
- return true
- default:
- return false
- }
-}
-
-func (d *Descriptions) IsPure(fn *ssa.Function) bool {
- if fn.Signature.Results().Len() == 0 {
- // A function with no return values is empty or is doing some
- // work we cannot see (for example because of build tags);
- // don't consider it pure.
- return false
- }
-
- for _, param := range fn.Params {
- if _, ok := param.Type().Underlying().(*types.Basic); !ok {
- return false
- }
- }
-
- if fn.Blocks == nil {
- return false
- }
- checkCall := func(common *ssa.CallCommon) bool {
- if common.IsInvoke() {
- return false
- }
- builtin, ok := common.Value.(*ssa.Builtin)
- if !ok {
- if common.StaticCallee() != fn {
- if common.StaticCallee() == nil {
- return false
- }
- // TODO(dh): ideally, IsPure wouldn't be responsible
- // for avoiding infinite recursion, but
- // FunctionDescriptions would be.
- node := d.CallGraph.CreateNode(common.StaticCallee())
- if callgraph.PathSearch(node, func(other *callgraph.Node) bool {
- return other.Func == fn
- }) != nil {
- return false
- }
- if !d.Get(common.StaticCallee()).Pure {
- return false
- }
- }
- } else {
- switch builtin.Name() {
- case "len", "cap", "make", "new":
- default:
- return false
- }
- }
- return true
- }
- for _, b := range fn.Blocks {
- for _, ins := range b.Instrs {
- switch ins := ins.(type) {
- case *ssa.Call:
- if !checkCall(ins.Common()) {
- return false
- }
- case *ssa.Defer:
- if !checkCall(&ins.Call) {
- return false
- }
- case *ssa.Select:
- return false
- case *ssa.Send:
- return false
- case *ssa.Go:
- return false
- case *ssa.Panic:
- return false
- case *ssa.Store:
- return false
- case *ssa.FieldAddr:
- return false
- case *ssa.UnOp:
- if ins.Op == token.MUL || ins.Op == token.AND {
- return false
- }
- }
- }
- }
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/terminates.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/terminates.go
deleted file mode 100644
index 65f9e16dc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/functions/terminates.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package functions
-
-import "honnef.co/go/tools/ssa"
-
-// terminates reports whether fn is supposed to return, that is if it
-// has at least one theoretic path that returns from the function.
-// Explicit panics do not count as terminating.
-func terminates(fn *ssa.Function) bool {
- if fn.Blocks == nil {
- // assuming that a function terminates is the conservative
- // choice
- return true
- }
-
- for _, block := range fn.Blocks {
- if len(block.Instrs) == 0 {
- continue
- }
- if _, ok := block.Instrs[len(block.Instrs)-1].(*ssa.Return); ok {
- return true
- }
- }
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/gcsizes/sizes.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/gcsizes/sizes.go
deleted file mode 100644
index 4857418c9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/gcsizes/sizes.go
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gcsizes provides a types.Sizes implementation that adheres
-// to the rules used by the gc compiler.
-package gcsizes // import "honnef.co/go/tools/gcsizes"
-
-import (
- "go/build"
- "go/types"
-)
-
-type Sizes struct {
- WordSize int64
- MaxAlign int64
-}
-
-// ForArch returns a correct Sizes for the given architecture.
-func ForArch(arch string) *Sizes {
- wordSize := int64(8)
- maxAlign := int64(8)
- switch build.Default.GOARCH {
- case "386", "arm":
- wordSize, maxAlign = 4, 4
- case "amd64p32":
- wordSize = 4
- }
- return &Sizes{WordSize: wordSize, MaxAlign: maxAlign}
-}
-
-func (s *Sizes) Alignof(T types.Type) int64 {
- switch t := T.Underlying().(type) {
- case *types.Array:
- return s.Alignof(t.Elem())
- case *types.Struct:
- max := int64(1)
- n := t.NumFields()
- var fields []*types.Var
- for i := 0; i < n; i++ {
- fields = append(fields, t.Field(i))
- }
- for _, f := range fields {
- if a := s.Alignof(f.Type()); a > max {
- max = a
- }
- }
- return max
- }
- a := s.Sizeof(T) // may be 0
- if a < 1 {
- return 1
- }
- if a > s.MaxAlign {
- return s.MaxAlign
- }
- return a
-}
-
-func (s *Sizes) Offsetsof(fields []*types.Var) []int64 {
- offsets := make([]int64, len(fields))
- var o int64
- for i, f := range fields {
- a := s.Alignof(f.Type())
- o = align(o, a)
- offsets[i] = o
- o += s.Sizeof(f.Type())
- }
- return offsets
-}
-
-var basicSizes = [...]byte{
- types.Bool: 1,
- types.Int8: 1,
- types.Int16: 2,
- types.Int32: 4,
- types.Int64: 8,
- types.Uint8: 1,
- types.Uint16: 2,
- types.Uint32: 4,
- types.Uint64: 8,
- types.Float32: 4,
- types.Float64: 8,
- types.Complex64: 8,
- types.Complex128: 16,
-}
-
-func (s *Sizes) Sizeof(T types.Type) int64 {
- switch t := T.Underlying().(type) {
- case *types.Basic:
- k := t.Kind()
- if int(k) < len(basicSizes) {
- if s := basicSizes[k]; s > 0 {
- return int64(s)
- }
- }
- if k == types.String {
- return s.WordSize * 2
- }
- case *types.Array:
- n := t.Len()
- if n == 0 {
- return 0
- }
- a := s.Alignof(t.Elem())
- z := s.Sizeof(t.Elem())
- return align(z, a)*(n-1) + z
- case *types.Slice:
- return s.WordSize * 3
- case *types.Struct:
- n := t.NumFields()
- if n == 0 {
- return 0
- }
-
- var fields []*types.Var
- for i := 0; i < n; i++ {
- fields = append(fields, t.Field(i))
- }
- offsets := s.Offsetsof(fields)
- a := s.Alignof(T)
- lsz := s.Sizeof(fields[n-1].Type())
- if lsz == 0 {
- lsz = 1
- }
- z := offsets[n-1] + lsz
- return align(z, a)
- case *types.Interface:
- return s.WordSize * 2
- }
- return s.WordSize // catch-all
-}
-
-// align returns the smallest y >= x such that y % a == 0.
-func align(x, a int64) int64 {
- y := x + a - 1
- return y - y%a
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/internal/sharedcheck/lint.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/internal/sharedcheck/lint.go
deleted file mode 100644
index 5f62fc2e7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/internal/sharedcheck/lint.go
+++ /dev/null
@@ -1,70 +0,0 @@
-package sharedcheck
-
-import (
- "go/ast"
- "go/types"
-
- "honnef.co/go/tools/lint"
- "honnef.co/go/tools/ssa"
-)
-
-func CheckRangeStringRunes(nodeFns map[ast.Node]*ssa.Function, j *lint.Job) {
- fn := func(node ast.Node) bool {
- rng, ok := node.(*ast.RangeStmt)
- if !ok || !lint.IsBlank(rng.Key) {
- return true
- }
- ssafn := nodeFns[rng]
- if ssafn == nil {
- return true
- }
- v, _ := ssafn.ValueForExpr(rng.X)
-
- // Check that we're converting from string to []rune
- val, _ := v.(*ssa.Convert)
- if val == nil {
- return true
- }
- Tsrc, ok := val.X.Type().(*types.Basic)
- if !ok || Tsrc.Kind() != types.String {
- return true
- }
- Tdst, ok := val.Type().(*types.Slice)
- if !ok {
- return true
- }
- TdstElem, ok := Tdst.Elem().(*types.Basic)
- if !ok || TdstElem.Kind() != types.Int32 {
- return true
- }
-
- // Check that the result of the conversion is only used to
- // range over
- refs := val.Referrers()
- if refs == nil {
- return true
- }
-
- // Expect two refs: one for obtaining the length of the slice,
- // one for accessing the elements
- if len(lint.FilterDebug(*refs)) != 2 {
- // TODO(dh): right now, we check that only one place
- // refers to our slice. This will miss cases such as
- // ranging over the slice twice. Ideally, we'd ensure that
- // the slice is only used for ranging over (without
- // accessing the key), but that is harder to do because in
- // SSA form, ranging over a slice looks like an ordinary
- // loop with index increments and slice accesses. We'd
- // have to look at the associated AST node to check that
- // it's a range statement.
- return true
- }
-
- j.Errorf(rng, "should range over string, not []rune(string)")
-
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/lint.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/lint.go
deleted file mode 100644
index 75a5198f6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/lint.go
+++ /dev/null
@@ -1,844 +0,0 @@
-// Copyright (c) 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 or at
-// https://developers.google.com/open-source/licenses/bsd.
-
-// Package lint provides the foundation for tools like gosimple.
-package lint // import "honnef.co/go/tools/lint"
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/build"
- "go/constant"
- "go/printer"
- "go/token"
- "go/types"
- "path/filepath"
- "runtime"
- "sort"
- "strings"
- "sync"
- "unicode"
-
- "golang.org/x/tools/go/ast/astutil"
- "golang.org/x/tools/go/loader"
- "honnef.co/go/tools/ssa"
- "honnef.co/go/tools/ssa/ssautil"
-)
-
-type Job struct {
- Program *Program
-
- checker string
- check string
- problems []Problem
-}
-
-type Ignore interface {
- Match(p Problem) bool
-}
-
-type LineIgnore struct {
- File string
- Line int
- Checks []string
- matched bool
- pos token.Pos
-}
-
-func (li *LineIgnore) Match(p Problem) bool {
- if p.Position.Filename != li.File || p.Position.Line != li.Line {
- return false
- }
- for _, c := range li.Checks {
- if m, _ := filepath.Match(c, p.Check); m {
- li.matched = true
- return true
- }
- }
- return false
-}
-
-func (li *LineIgnore) String() string {
- matched := "not matched"
- if li.matched {
- matched = "matched"
- }
- return fmt.Sprintf("%s:%d %s (%s)", li.File, li.Line, strings.Join(li.Checks, ", "), matched)
-}
-
-type FileIgnore struct {
- File string
- Checks []string
-}
-
-func (fi *FileIgnore) Match(p Problem) bool {
- if p.Position.Filename != fi.File {
- return false
- }
- for _, c := range fi.Checks {
- if m, _ := filepath.Match(c, p.Check); m {
- return true
- }
- }
- return false
-}
-
-type GlobIgnore struct {
- Pattern string
- Checks []string
-}
-
-func (gi *GlobIgnore) Match(p Problem) bool {
- if gi.Pattern != "*" {
- pkgpath := p.Package.Path()
- if strings.HasSuffix(pkgpath, "_test") {
- pkgpath = pkgpath[:len(pkgpath)-len("_test")]
- }
- name := filepath.Join(pkgpath, filepath.Base(p.Position.Filename))
- if m, _ := filepath.Match(gi.Pattern, name); !m {
- return false
- }
- }
- for _, c := range gi.Checks {
- if m, _ := filepath.Match(c, p.Check); m {
- return true
- }
- }
- return false
-}
-
-type Program struct {
- SSA *ssa.Program
- Prog *loader.Program
- // TODO(dh): Rename to InitialPackages?
- Packages []*Pkg
- InitialFunctions []*ssa.Function
- AllFunctions []*ssa.Function
- Files []*ast.File
- Info *types.Info
- GoVersion int
-
- tokenFileMap map[*token.File]*ast.File
- astFileMap map[*ast.File]*Pkg
-}
-
-type Func func(*Job)
-
-// Problem represents a problem in some source code.
-type Problem struct {
- pos token.Pos
- Position token.Position // position in source file
- Text string // the prose that describes the problem
- Check string
- Checker string
- Package *types.Package
- Ignored bool
-}
-
-func (p *Problem) String() string {
- if p.Check == "" {
- return p.Text
- }
- return fmt.Sprintf("%s (%s)", p.Text, p.Check)
-}
-
-type Checker interface {
- Name() string
- Prefix() string
- Init(*Program)
- Funcs() map[string]Func
-}
-
-// A Linter lints Go source code.
-type Linter struct {
- Checker Checker
- Ignores []Ignore
- GoVersion int
- ReturnIgnored bool
-
- automaticIgnores []Ignore
-}
-
-func (l *Linter) ignore(p Problem) bool {
- ignored := false
- for _, ig := range l.automaticIgnores {
- // We cannot short-circuit these, as we want to record, for
- // each ignore, whether it matched or not.
- if ig.Match(p) {
- ignored = true
- }
- }
- if ignored {
- // no need to execute other ignores if we've already had a
- // match.
- return true
- }
- for _, ig := range l.Ignores {
- // We can short-circuit here, as we aren't tracking any
- // information.
- if ig.Match(p) {
- return true
- }
- }
-
- return false
-}
-
-func (prog *Program) File(node Positioner) *ast.File {
- return prog.tokenFileMap[prog.SSA.Fset.File(node.Pos())]
-}
-
-func (j *Job) File(node Positioner) *ast.File {
- return j.Program.File(node)
-}
-
-// TODO(dh): switch to sort.Slice when Go 1.9 lands.
-type byPosition struct {
- fset *token.FileSet
- ps []Problem
-}
-
-func (ps byPosition) Len() int {
- return len(ps.ps)
-}
-
-func (ps byPosition) Less(i int, j int) bool {
- pi, pj := ps.ps[i].Position, ps.ps[j].Position
-
- if pi.Filename != pj.Filename {
- return pi.Filename < pj.Filename
- }
- if pi.Line != pj.Line {
- return pi.Line < pj.Line
- }
- if pi.Column != pj.Column {
- return pi.Column < pj.Column
- }
-
- return ps.ps[i].Text < ps.ps[j].Text
-}
-
-func (ps byPosition) Swap(i int, j int) {
- ps.ps[i], ps.ps[j] = ps.ps[j], ps.ps[i]
-}
-
-func parseDirective(s string) (cmd string, args []string) {
- if !strings.HasPrefix(s, "//lint:") {
- return "", nil
- }
- s = strings.TrimPrefix(s, "//lint:")
- fields := strings.Split(s, " ")
- return fields[0], fields[1:]
-}
-
-func (l *Linter) Lint(lprog *loader.Program, conf *loader.Config) []Problem {
- ssaprog := ssautil.CreateProgram(lprog, ssa.GlobalDebug)
- ssaprog.Build()
- pkgMap := map[*ssa.Package]*Pkg{}
- var pkgs []*Pkg
- for _, pkginfo := range lprog.InitialPackages() {
- ssapkg := ssaprog.Package(pkginfo.Pkg)
- var bp *build.Package
- if len(pkginfo.Files) != 0 {
- path := lprog.Fset.Position(pkginfo.Files[0].Pos()).Filename
- dir := filepath.Dir(path)
- var err error
- ctx := conf.Build
- if ctx == nil {
- ctx = &build.Default
- }
- bp, err = ctx.ImportDir(dir, 0)
- if err != nil {
- // shouldn't happen
- }
- }
- pkg := &Pkg{
- Package: ssapkg,
- Info: pkginfo,
- BuildPkg: bp,
- }
- pkgMap[ssapkg] = pkg
- pkgs = append(pkgs, pkg)
- }
- prog := &Program{
- SSA: ssaprog,
- Prog: lprog,
- Packages: pkgs,
- Info: &types.Info{},
- GoVersion: l.GoVersion,
- tokenFileMap: map[*token.File]*ast.File{},
- astFileMap: map[*ast.File]*Pkg{},
- }
-
- initial := map[*types.Package]struct{}{}
- for _, pkg := range pkgs {
- initial[pkg.Info.Pkg] = struct{}{}
- }
- for fn := range ssautil.AllFunctions(ssaprog) {
- if fn.Pkg == nil {
- continue
- }
- prog.AllFunctions = append(prog.AllFunctions, fn)
- if _, ok := initial[fn.Pkg.Pkg]; ok {
- prog.InitialFunctions = append(prog.InitialFunctions, fn)
- }
- }
- for _, pkg := range pkgs {
- prog.Files = append(prog.Files, pkg.Info.Files...)
-
- ssapkg := ssaprog.Package(pkg.Info.Pkg)
- for _, f := range pkg.Info.Files {
- prog.astFileMap[f] = pkgMap[ssapkg]
- }
- }
-
- for _, pkginfo := range lprog.AllPackages {
- for _, f := range pkginfo.Files {
- tf := lprog.Fset.File(f.Pos())
- prog.tokenFileMap[tf] = f
- }
- }
-
- var out []Problem
- l.automaticIgnores = nil
- for _, pkginfo := range lprog.InitialPackages() {
- for _, f := range pkginfo.Files {
- cm := ast.NewCommentMap(lprog.Fset, f, f.Comments)
- for node, cgs := range cm {
- for _, cg := range cgs {
- for _, c := range cg.List {
- if !strings.HasPrefix(c.Text, "//lint:") {
- continue
- }
- cmd, args := parseDirective(c.Text)
- switch cmd {
- case "ignore", "file-ignore":
- if len(args) < 2 {
- // FIXME(dh): this causes duplicated warnings when using megacheck
- p := Problem{
- pos: c.Pos(),
- Position: prog.DisplayPosition(c.Pos()),
- Text: "malformed linter directive; missing the required reason field?",
- Check: "",
- Checker: l.Checker.Name(),
- Package: nil,
- }
- out = append(out, p)
- continue
- }
- default:
- // unknown directive, ignore
- continue
- }
- checks := strings.Split(args[0], ",")
- pos := prog.DisplayPosition(node.Pos())
- var ig Ignore
- switch cmd {
- case "ignore":
- ig = &LineIgnore{
- File: pos.Filename,
- Line: pos.Line,
- Checks: checks,
- pos: c.Pos(),
- }
- case "file-ignore":
- ig = &FileIgnore{
- File: pos.Filename,
- Checks: checks,
- }
- }
- l.automaticIgnores = append(l.automaticIgnores, ig)
- }
- }
- }
- }
- }
-
- sizes := struct {
- types int
- defs int
- uses int
- implicits int
- selections int
- scopes int
- }{}
- for _, pkg := range pkgs {
- sizes.types += len(pkg.Info.Info.Types)
- sizes.defs += len(pkg.Info.Info.Defs)
- sizes.uses += len(pkg.Info.Info.Uses)
- sizes.implicits += len(pkg.Info.Info.Implicits)
- sizes.selections += len(pkg.Info.Info.Selections)
- sizes.scopes += len(pkg.Info.Info.Scopes)
- }
- prog.Info.Types = make(map[ast.Expr]types.TypeAndValue, sizes.types)
- prog.Info.Defs = make(map[*ast.Ident]types.Object, sizes.defs)
- prog.Info.Uses = make(map[*ast.Ident]types.Object, sizes.uses)
- prog.Info.Implicits = make(map[ast.Node]types.Object, sizes.implicits)
- prog.Info.Selections = make(map[*ast.SelectorExpr]*types.Selection, sizes.selections)
- prog.Info.Scopes = make(map[ast.Node]*types.Scope, sizes.scopes)
- for _, pkg := range pkgs {
- for k, v := range pkg.Info.Info.Types {
- prog.Info.Types[k] = v
- }
- for k, v := range pkg.Info.Info.Defs {
- prog.Info.Defs[k] = v
- }
- for k, v := range pkg.Info.Info.Uses {
- prog.Info.Uses[k] = v
- }
- for k, v := range pkg.Info.Info.Implicits {
- prog.Info.Implicits[k] = v
- }
- for k, v := range pkg.Info.Info.Selections {
- prog.Info.Selections[k] = v
- }
- for k, v := range pkg.Info.Info.Scopes {
- prog.Info.Scopes[k] = v
- }
- }
- l.Checker.Init(prog)
-
- funcs := l.Checker.Funcs()
- var keys []string
- for k := range funcs {
- keys = append(keys, k)
- }
- sort.Strings(keys)
-
- var jobs []*Job
- for _, k := range keys {
- j := &Job{
- Program: prog,
- checker: l.Checker.Name(),
- check: k,
- }
- jobs = append(jobs, j)
- }
- wg := &sync.WaitGroup{}
- for _, j := range jobs {
- wg.Add(1)
- go func(j *Job) {
- defer wg.Done()
- fn := funcs[j.check]
- if fn == nil {
- return
- }
- fn(j)
- }(j)
- }
- wg.Wait()
-
- for _, j := range jobs {
- for _, p := range j.problems {
- p.Ignored = l.ignore(p)
- if l.ReturnIgnored || !p.Ignored {
- out = append(out, p)
- }
- }
- }
-
- for _, ig := range l.automaticIgnores {
- ig, ok := ig.(*LineIgnore)
- if !ok {
- continue
- }
- if ig.matched {
- continue
- }
- for _, c := range ig.Checks {
- idx := strings.IndexFunc(c, func(r rune) bool {
- return unicode.IsNumber(r)
- })
- if idx == -1 {
- // malformed check name, backing out
- continue
- }
- if c[:idx] != l.Checker.Prefix() {
- // not for this checker
- continue
- }
- p := Problem{
- pos: ig.pos,
- Position: prog.DisplayPosition(ig.pos),
- Text: "this linter directive didn't match anything; should it be removed?",
- Check: "",
- Checker: l.Checker.Name(),
- Package: nil,
- }
- out = append(out, p)
- }
- }
-
- sort.Sort(byPosition{lprog.Fset, out})
- return out
-}
-
-// Pkg represents a package being linted.
-type Pkg struct {
- *ssa.Package
- Info *loader.PackageInfo
- BuildPkg *build.Package
-}
-
-type packager interface {
- Package() *ssa.Package
-}
-
-func IsExample(fn *ssa.Function) bool {
- if !strings.HasPrefix(fn.Name(), "Example") {
- return false
- }
- f := fn.Prog.Fset.File(fn.Pos())
- if f == nil {
- return false
- }
- return strings.HasSuffix(f.Name(), "_test.go")
-}
-
-func (j *Job) IsInTest(node Positioner) bool {
- f := j.Program.SSA.Fset.File(node.Pos())
- return f != nil && strings.HasSuffix(f.Name(), "_test.go")
-}
-
-func (j *Job) IsInMain(node Positioner) bool {
- if node, ok := node.(packager); ok {
- return node.Package().Pkg.Name() == "main"
- }
- pkg := j.NodePackage(node)
- if pkg == nil {
- return false
- }
- return pkg.Pkg.Name() == "main"
-}
-
-type Positioner interface {
- Pos() token.Pos
-}
-
-func (prog *Program) DisplayPosition(p token.Pos) token.Position {
- // The //line compiler directive can be used to change the file
- // name and line numbers associated with code. This can, for
- // example, be used by code generation tools. The most prominent
- // example is 'go tool cgo', which uses //line directives to refer
- // back to the original source code.
- //
- // In the context of our linters, we need to treat these
- // directives differently depending on context. For cgo files, we
- // want to honour the directives, so that line numbers are
- // adjusted correctly. For all other files, we want to ignore the
- // directives, so that problems are reported at their actual
- // position and not, for example, a yacc grammar file. This also
- // affects the ignore mechanism, since it operates on the position
- // information stored within problems. With this implementation, a
- // user will ignore foo.go, not foo.y
-
- pkg := prog.astFileMap[prog.tokenFileMap[prog.Prog.Fset.File(p)]]
- bp := pkg.BuildPkg
- adjPos := prog.Prog.Fset.Position(p)
- if bp == nil {
- // couldn't find the package for some reason (deleted? faulty
- // file system?)
- return adjPos
- }
- base := filepath.Base(adjPos.Filename)
- for _, f := range bp.CgoFiles {
- if f == base {
- // this is a cgo file, use the adjusted position
- return adjPos
- }
- }
- // not a cgo file, ignore //line directives
- return prog.Prog.Fset.PositionFor(p, false)
-}
-
-func (j *Job) Errorf(n Positioner, format string, args ...interface{}) *Problem {
- tf := j.Program.SSA.Fset.File(n.Pos())
- f := j.Program.tokenFileMap[tf]
- pkg := j.Program.astFileMap[f].Pkg
-
- pos := j.Program.DisplayPosition(n.Pos())
- problem := Problem{
- pos: n.Pos(),
- Position: pos,
- Text: fmt.Sprintf(format, args...),
- Check: j.check,
- Checker: j.checker,
- Package: pkg,
- }
- j.problems = append(j.problems, problem)
- return &j.problems[len(j.problems)-1]
-}
-
-func (j *Job) Render(x interface{}) string {
- fset := j.Program.SSA.Fset
- var buf bytes.Buffer
- if err := printer.Fprint(&buf, fset, x); err != nil {
- panic(err)
- }
- return buf.String()
-}
-
-func (j *Job) RenderArgs(args []ast.Expr) string {
- var ss []string
- for _, arg := range args {
- ss = append(ss, j.Render(arg))
- }
- return strings.Join(ss, ", ")
-}
-
-func IsIdent(expr ast.Expr, ident string) bool {
- id, ok := expr.(*ast.Ident)
- return ok && id.Name == ident
-}
-
-// isBlank returns whether id is the blank identifier "_".
-// If id == nil, the answer is false.
-func IsBlank(id ast.Expr) bool {
- ident, ok := id.(*ast.Ident)
- return ok && ident.Name == "_"
-}
-
-func IsZero(expr ast.Expr) bool {
- lit, ok := expr.(*ast.BasicLit)
- return ok && lit.Kind == token.INT && lit.Value == "0"
-}
-
-func (j *Job) IsNil(expr ast.Expr) bool {
- return j.Program.Info.Types[expr].IsNil()
-}
-
-func (j *Job) BoolConst(expr ast.Expr) bool {
- val := j.Program.Info.ObjectOf(expr.(*ast.Ident)).(*types.Const).Val()
- return constant.BoolVal(val)
-}
-
-func (j *Job) IsBoolConst(expr ast.Expr) bool {
- // We explicitly don't support typed bools because more often than
- // not, custom bool types are used as binary enums and the
- // explicit comparison is desired.
-
- ident, ok := expr.(*ast.Ident)
- if !ok {
- return false
- }
- obj := j.Program.Info.ObjectOf(ident)
- c, ok := obj.(*types.Const)
- if !ok {
- return false
- }
- basic, ok := c.Type().(*types.Basic)
- if !ok {
- return false
- }
- if basic.Kind() != types.UntypedBool && basic.Kind() != types.Bool {
- return false
- }
- return true
-}
-
-func (j *Job) ExprToInt(expr ast.Expr) (int64, bool) {
- tv := j.Program.Info.Types[expr]
- if tv.Value == nil {
- return 0, false
- }
- if tv.Value.Kind() != constant.Int {
- return 0, false
- }
- return constant.Int64Val(tv.Value)
-}
-
-func (j *Job) ExprToString(expr ast.Expr) (string, bool) {
- val := j.Program.Info.Types[expr].Value
- if val == nil {
- return "", false
- }
- if val.Kind() != constant.String {
- return "", false
- }
- return constant.StringVal(val), true
-}
-
-func (j *Job) NodePackage(node Positioner) *Pkg {
- f := j.File(node)
- return j.Program.astFileMap[f]
-}
-
-func IsGenerated(f *ast.File) bool {
- comments := f.Comments
- if len(comments) > 0 {
- comment := comments[0].Text()
- return strings.Contains(comment, "Code generated by") ||
- strings.Contains(comment, "DO NOT EDIT")
- }
- return false
-}
-
-func Preamble(f *ast.File) string {
- cutoff := f.Package
- if f.Doc != nil {
- cutoff = f.Doc.Pos()
- }
- var out []string
- for _, cmt := range f.Comments {
- if cmt.Pos() >= cutoff {
- break
- }
- out = append(out, cmt.Text())
- }
- return strings.Join(out, "\n")
-}
-
-func IsPointerLike(T types.Type) bool {
- switch T := T.Underlying().(type) {
- case *types.Interface, *types.Chan, *types.Map, *types.Pointer:
- return true
- case *types.Basic:
- return T.Kind() == types.UnsafePointer
- }
- return false
-}
-
-func (j *Job) IsGoVersion(minor int) bool {
- return j.Program.GoVersion >= minor
-}
-
-func (j *Job) IsCallToAST(node ast.Node, name string) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return false
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return false
- }
- fn, ok := j.Program.Info.ObjectOf(sel.Sel).(*types.Func)
- return ok && fn.FullName() == name
-}
-
-func (j *Job) IsCallToAnyAST(node ast.Node, names ...string) bool {
- for _, name := range names {
- if j.IsCallToAST(node, name) {
- return true
- }
- }
- return false
-}
-
-func CallName(call *ssa.CallCommon) string {
- if call.IsInvoke() {
- return ""
- }
- switch v := call.Value.(type) {
- case *ssa.Function:
- fn, ok := v.Object().(*types.Func)
- if !ok {
- return ""
- }
- return fn.FullName()
- case *ssa.Builtin:
- return v.Name()
- }
- return ""
-}
-
-func IsCallTo(call *ssa.CallCommon, name string) bool {
- return CallName(call) == name
-}
-
-func FilterDebug(instr []ssa.Instruction) []ssa.Instruction {
- var out []ssa.Instruction
- for _, ins := range instr {
- if _, ok := ins.(*ssa.DebugRef); !ok {
- out = append(out, ins)
- }
- }
- return out
-}
-
-func NodeFns(pkgs []*Pkg) map[ast.Node]*ssa.Function {
- out := map[ast.Node]*ssa.Function{}
-
- wg := &sync.WaitGroup{}
- chNodeFns := make(chan map[ast.Node]*ssa.Function, runtime.NumCPU()*2)
- for _, pkg := range pkgs {
- pkg := pkg
- wg.Add(1)
- go func() {
- m := map[ast.Node]*ssa.Function{}
- for _, f := range pkg.Info.Files {
- ast.Walk(&globalVisitor{m, pkg, f}, f)
- }
- chNodeFns <- m
- wg.Done()
- }()
- }
- go func() {
- wg.Wait()
- close(chNodeFns)
- }()
-
- for nodeFns := range chNodeFns {
- for k, v := range nodeFns {
- out[k] = v
- }
- }
-
- return out
-}
-
-type globalVisitor struct {
- m map[ast.Node]*ssa.Function
- pkg *Pkg
- f *ast.File
-}
-
-func (v *globalVisitor) Visit(node ast.Node) ast.Visitor {
- switch node := node.(type) {
- case *ast.CallExpr:
- v.m[node] = v.pkg.Func("init")
- return v
- case *ast.FuncDecl, *ast.FuncLit:
- nv := &fnVisitor{v.m, v.f, v.pkg, nil}
- return nv.Visit(node)
- default:
- return v
- }
-}
-
-type fnVisitor struct {
- m map[ast.Node]*ssa.Function
- f *ast.File
- pkg *Pkg
- ssafn *ssa.Function
-}
-
-func (v *fnVisitor) Visit(node ast.Node) ast.Visitor {
- switch node := node.(type) {
- case *ast.FuncDecl:
- var ssafn *ssa.Function
- ssafn = v.pkg.Prog.FuncValue(v.pkg.Info.ObjectOf(node.Name).(*types.Func))
- v.m[node] = ssafn
- if ssafn == nil {
- return nil
- }
- return &fnVisitor{v.m, v.f, v.pkg, ssafn}
- case *ast.FuncLit:
- var ssafn *ssa.Function
- path, _ := astutil.PathEnclosingInterval(v.f, node.Pos(), node.Pos())
- ssafn = ssa.EnclosingFunction(v.pkg.Package, path)
- v.m[node] = ssafn
- if ssafn == nil {
- return nil
- }
- return &fnVisitor{v.m, v.f, v.pkg, ssafn}
- case nil:
- return nil
- default:
- v.m[node] = v.ssafn
- return v
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/lintutil/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/lintutil/util.go
deleted file mode 100644
index 0bb142668..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/lintutil/util.go
+++ /dev/null
@@ -1,349 +0,0 @@
-// Copyright (c) 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 or at
-// https://developers.google.com/open-source/licenses/bsd.
-
-// Package lintutil provides helpers for writing linter command lines.
-package lintutil // import "honnef.co/go/tools/lint/lintutil"
-
-import (
- "encoding/json"
- "errors"
- "flag"
- "fmt"
- "go/build"
- "go/parser"
- "go/token"
- "go/types"
- "io"
- "os"
- "path/filepath"
- "strconv"
- "strings"
-
- "honnef.co/go/tools/lint"
- "honnef.co/go/tools/version"
-
- "github.com/kisielk/gotool"
- "golang.org/x/tools/go/loader"
-)
-
-type OutputFormatter interface {
- Format(p lint.Problem)
-}
-
-type TextOutput struct {
- w io.Writer
-}
-
-func (o TextOutput) Format(p lint.Problem) {
- fmt.Fprintf(o.w, "%v: %s\n", relativePositionString(p.Position), p.String())
-}
-
-type JSONOutput struct {
- w io.Writer
-}
-
-func (o JSONOutput) Format(p lint.Problem) {
- type location struct {
- File string `json:"file"`
- Line int `json:"line"`
- Column int `json:"column"`
- }
- jp := struct {
- Checker string `json:"checker"`
- Code string `json:"code"`
- Severity string `json:"severity,omitempty"`
- Location location `json:"location"`
- Message string `json:"message"`
- Ignored bool `json:"ignored"`
- }{
- p.Checker,
- p.Check,
- "", // TODO(dh): support severity
- location{
- p.Position.Filename,
- p.Position.Line,
- p.Position.Column,
- },
- p.Text,
- p.Ignored,
- }
- _ = json.NewEncoder(o.w).Encode(jp)
-}
-func usage(name string, flags *flag.FlagSet) func() {
- return func() {
- fmt.Fprintf(os.Stderr, "Usage of %s:\n", name)
- fmt.Fprintf(os.Stderr, "\t%s [flags] # runs on package in current directory\n", name)
- fmt.Fprintf(os.Stderr, "\t%s [flags] packages\n", name)
- fmt.Fprintf(os.Stderr, "\t%s [flags] directory\n", name)
- fmt.Fprintf(os.Stderr, "\t%s [flags] files... # must be a single package\n", name)
- fmt.Fprintf(os.Stderr, "Flags:\n")
- flags.PrintDefaults()
- }
-}
-
-type runner struct {
- checker lint.Checker
- tags []string
- ignores []lint.Ignore
- version int
- returnIgnored bool
-}
-
-func resolveRelative(importPaths []string, tags []string) (goFiles bool, err error) {
- if len(importPaths) == 0 {
- return false, nil
- }
- if strings.HasSuffix(importPaths[0], ".go") {
- // User is specifying a package in terms of .go files, don't resolve
- return true, nil
- }
- wd, err := os.Getwd()
- if err != nil {
- return false, err
- }
- ctx := build.Default
- ctx.BuildTags = tags
- for i, path := range importPaths {
- bpkg, err := ctx.Import(path, wd, build.FindOnly)
- if err != nil {
- return false, fmt.Errorf("can't load package %q: %v", path, err)
- }
- importPaths[i] = bpkg.ImportPath
- }
- return false, nil
-}
-
-func parseIgnore(s string) ([]lint.Ignore, error) {
- var out []lint.Ignore
- if len(s) == 0 {
- return nil, nil
- }
- for _, part := range strings.Fields(s) {
- p := strings.Split(part, ":")
- if len(p) != 2 {
- return nil, errors.New("malformed ignore string")
- }
- path := p[0]
- checks := strings.Split(p[1], ",")
- out = append(out, &lint.GlobIgnore{Pattern: path, Checks: checks})
- }
- return out, nil
-}
-
-type versionFlag int
-
-func (v *versionFlag) String() string {
- return fmt.Sprintf("1.%d", *v)
-}
-
-func (v *versionFlag) Set(s string) error {
- if len(s) < 3 {
- return errors.New("invalid Go version")
- }
- if s[0] != '1' {
- return errors.New("invalid Go version")
- }
- if s[1] != '.' {
- return errors.New("invalid Go version")
- }
- i, err := strconv.Atoi(s[2:])
- *v = versionFlag(i)
- return err
-}
-
-func (v *versionFlag) Get() interface{} {
- return int(*v)
-}
-
-func FlagSet(name string) *flag.FlagSet {
- flags := flag.NewFlagSet("", flag.ExitOnError)
- flags.Usage = usage(name, flags)
- flags.Float64("min_confidence", 0, "Deprecated; use -ignore instead")
- flags.String("tags", "", "List of `build tags`")
- flags.String("ignore", "", "Space separated list of checks to ignore, in the following format: 'import/path/file.go:Check1,Check2,...' Both the import path and file name sections support globbing, e.g. 'os/exec/*_test.go'")
- flags.Bool("tests", true, "Include tests")
- flags.Bool("version", false, "Print version and exit")
- flags.Bool("show-ignored", false, "Don't filter ignored problems")
- flags.String("f", "text", "Output `format` (valid choices are 'text' and 'json')")
-
- tags := build.Default.ReleaseTags
- v := tags[len(tags)-1][2:]
- version := new(versionFlag)
- if err := version.Set(v); err != nil {
- panic(fmt.Sprintf("internal error: %s", err))
- }
-
- flags.Var(version, "go", "Target Go `version` in the format '1.x'")
- return flags
-}
-
-type CheckerConfig struct {
- Checker lint.Checker
- ExitNonZero bool
-}
-
-func ProcessFlagSet(confs []CheckerConfig, fs *flag.FlagSet) {
- tags := fs.Lookup("tags").Value.(flag.Getter).Get().(string)
- ignore := fs.Lookup("ignore").Value.(flag.Getter).Get().(string)
- tests := fs.Lookup("tests").Value.(flag.Getter).Get().(bool)
- goVersion := fs.Lookup("go").Value.(flag.Getter).Get().(int)
- format := fs.Lookup("f").Value.(flag.Getter).Get().(string)
- printVersion := fs.Lookup("version").Value.(flag.Getter).Get().(bool)
- showIgnored := fs.Lookup("show-ignored").Value.(flag.Getter).Get().(bool)
-
- if printVersion {
- version.Print()
- os.Exit(0)
- }
-
- var cs []lint.Checker
- for _, conf := range confs {
- cs = append(cs, conf.Checker)
- }
- pss, err := Lint(cs, fs.Args(), &Options{
- Tags: strings.Fields(tags),
- LintTests: tests,
- Ignores: ignore,
- GoVersion: goVersion,
- ReturnIgnored: showIgnored,
- })
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
-
- var ps []lint.Problem
- for _, p := range pss {
- ps = append(ps, p...)
- }
-
- var f OutputFormatter
- switch format {
- case "text":
- f = TextOutput{os.Stdout}
- case "json":
- f = JSONOutput{os.Stdout}
- default:
- fmt.Fprintf(os.Stderr, "unsupported output format %q\n", format)
- os.Exit(2)
- }
-
- for _, p := range ps {
- f.Format(p)
- }
- for i, p := range pss {
- if len(p) != 0 && confs[i].ExitNonZero {
- os.Exit(1)
- }
- }
-}
-
-type Options struct {
- Tags []string
- LintTests bool
- Ignores string
- GoVersion int
- ReturnIgnored bool
-}
-
-func Lint(cs []lint.Checker, pkgs []string, opt *Options) ([][]lint.Problem, error) {
- if opt == nil {
- opt = &Options{}
- }
- ignores, err := parseIgnore(opt.Ignores)
- if err != nil {
- return nil, err
- }
- paths := gotool.ImportPaths(pkgs)
- goFiles, err := resolveRelative(paths, opt.Tags)
- if err != nil {
- return nil, err
- }
- ctx := build.Default
- ctx.BuildTags = opt.Tags
- hadError := false
- conf := &loader.Config{
- Build: &ctx,
- ParserMode: parser.ParseComments,
- ImportPkgs: map[string]bool{},
- TypeChecker: types.Config{
- Error: func(err error) {
- // Only print the first error found
- if hadError {
- return
- }
- hadError = true
- fmt.Fprintln(os.Stderr, err)
- },
- },
- }
- if goFiles {
- conf.CreateFromFilenames("adhoc", paths...)
- } else {
- for _, path := range paths {
- conf.ImportPkgs[path] = opt.LintTests
- }
- }
- lprog, err := conf.Load()
- if err != nil {
- return nil, err
- }
-
- var problems [][]lint.Problem
- for _, c := range cs {
- runner := &runner{
- checker: c,
- tags: opt.Tags,
- ignores: ignores,
- version: opt.GoVersion,
- returnIgnored: opt.ReturnIgnored,
- }
- problems = append(problems, runner.lint(lprog, conf))
- }
- return problems, nil
-}
-
-func shortPath(path string) string {
- cwd, err := os.Getwd()
- if err != nil {
- return path
- }
- if rel, err := filepath.Rel(cwd, path); err == nil && len(rel) < len(path) {
- return rel
- }
- return path
-}
-
-func relativePositionString(pos token.Position) string {
- s := shortPath(pos.Filename)
- if pos.IsValid() {
- if s != "" {
- s += ":"
- }
- s += fmt.Sprintf("%d:%d", pos.Line, pos.Column)
- }
- if s == "" {
- s = "-"
- }
- return s
-}
-
-func ProcessArgs(name string, cs []CheckerConfig, args []string) {
- flags := FlagSet(name)
- flags.Parse(args)
-
- ProcessFlagSet(cs, flags)
-}
-
-func (runner *runner) lint(lprog *loader.Program, conf *loader.Config) []lint.Problem {
- l := &lint.Linter{
- Checker: runner.checker,
- Ignores: runner.ignores,
- GoVersion: runner.version,
- ReturnIgnored: runner.returnIgnored,
- }
- return l.Lint(lprog, conf)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/testutil/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/testutil/util.go
deleted file mode 100644
index 3e223f3ce..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/lint/testutil/util.go
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright (c) 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 or at
-// https://developers.google.com/open-source/licenses/bsd.
-
-package testutil // import "honnef.co/go/tools/lint/testutil"
-
-import (
- "flag"
- "fmt"
- "go/parser"
- "go/token"
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
- "regexp"
- "strconv"
- "strings"
- "testing"
-
- "honnef.co/go/tools/lint"
-
- "golang.org/x/tools/go/loader"
-)
-
-var lintMatch = flag.String("lint.match", "", "restrict testdata matches to this pattern")
-
-func TestAll(t *testing.T, c lint.Checker, dir string) {
- baseDir := filepath.Join("testdata", dir)
- fis, err := ioutil.ReadDir(baseDir)
- if err != nil {
- t.Fatalf("ioutil.ReadDir: %v", err)
- }
- if len(fis) == 0 {
- t.Fatalf("no files in %v", baseDir)
- }
- rx, err := regexp.Compile(*lintMatch)
- if err != nil {
- t.Fatalf("Bad -lint.match value %q: %v", *lintMatch, err)
- }
-
- files := map[int][]os.FileInfo{}
- for _, fi := range fis {
- if !rx.MatchString(fi.Name()) {
- continue
- }
- if !strings.HasSuffix(fi.Name(), ".go") {
- continue
- }
- parts := strings.Split(fi.Name(), "_")
- v := 0
- if len(parts) > 1 && strings.HasPrefix(parts[len(parts)-1], "go1") {
- var err error
- s := parts[len(parts)-1][len("go1"):]
- s = s[:len(s)-len(".go")]
- v, err = strconv.Atoi(s)
- if err != nil {
- t.Fatalf("cannot process file name %q: %s", fi.Name(), err)
- }
- }
- files[v] = append(files[v], fi)
- }
-
- conf := &loader.Config{
- ParserMode: parser.ParseComments,
- }
- sources := map[string][]byte{}
- for _, fi := range fis {
- filename := path.Join(baseDir, fi.Name())
- src, err := ioutil.ReadFile(filename)
- if err != nil {
- t.Errorf("Failed reading %s: %v", fi.Name(), err)
- continue
- }
- f, err := conf.ParseFile(filename, src)
- if err != nil {
- t.Errorf("error parsing %s: %s", filename, err)
- continue
- }
- sources[fi.Name()] = src
- conf.CreateFromFiles(fi.Name(), f)
- }
-
- lprog, err := conf.Load()
- if err != nil {
- t.Fatalf("error loading program: %s", err)
- }
-
- for version, fis := range files {
- l := &lint.Linter{Checker: c, GoVersion: version}
-
- res := l.Lint(lprog, conf)
- for _, fi := range fis {
- name := fi.Name()
- src := sources[name]
-
- ins := parseInstructions(t, name, src)
-
- for _, in := range ins {
- ok := false
- for i, p := range res {
- if p.Position.Line != in.Line || filepath.Base(p.Position.Filename) != name {
- continue
- }
- if in.Match.MatchString(p.Text) {
- // remove this problem from ps
- copy(res[i:], res[i+1:])
- res = res[:len(res)-1]
-
- //t.Logf("/%v/ matched at %s:%d", in.Match, fi.Name(), in.Line)
- ok = true
- break
- }
- }
- if !ok {
- t.Errorf("Lint failed at %s:%d; /%v/ did not match", name, in.Line, in.Match)
- }
- }
- }
- for _, p := range res {
- name := filepath.Base(p.Position.Filename)
- for _, fi := range fis {
- if name == fi.Name() {
- t.Errorf("Unexpected problem at %s: %v", p.Position, p.Text)
- break
- }
- }
- }
- }
-}
-
-type instruction struct {
- Line int // the line number this applies to
- Match *regexp.Regexp // what pattern to match
- Replacement string // what the suggested replacement line should be
-}
-
-// parseInstructions parses instructions from the comments in a Go source file.
-// It returns nil if none were parsed.
-func parseInstructions(t *testing.T, filename string, src []byte) []instruction {
- fset := token.NewFileSet()
- f, err := parser.ParseFile(fset, filename, src, parser.ParseComments)
- if err != nil {
- t.Fatalf("Test file %v does not parse: %v", filename, err)
- }
- var ins []instruction
- for _, cg := range f.Comments {
- ln := fset.PositionFor(cg.Pos(), false).Line
- raw := cg.Text()
- for _, line := range strings.Split(raw, "\n") {
- if line == "" || strings.HasPrefix(line, "#") {
- continue
- }
- if line == "OK" && ins == nil {
- // so our return value will be non-nil
- ins = make([]instruction, 0)
- continue
- }
- if !strings.Contains(line, "MATCH") {
- continue
- }
- rx, err := extractPattern(line)
- if err != nil {
- t.Fatalf("At %v:%d: %v", filename, ln, err)
- }
- matchLine := ln
- if i := strings.Index(line, "MATCH:"); i >= 0 {
- // This is a match for a different line.
- lns := strings.TrimPrefix(line[i:], "MATCH:")
- lns = lns[:strings.Index(lns, " ")]
- matchLine, err = strconv.Atoi(lns)
- if err != nil {
- t.Fatalf("Bad match line number %q at %v:%d: %v", lns, filename, ln, err)
- }
- }
- var repl string
- if r, ok := extractReplacement(line); ok {
- repl = r
- }
- ins = append(ins, instruction{
- Line: matchLine,
- Match: rx,
- Replacement: repl,
- })
- }
- }
- return ins
-}
-
-func extractPattern(line string) (*regexp.Regexp, error) {
- n := strings.Index(line, " ")
- if n == 01 {
- return nil, fmt.Errorf("malformed match instruction %q", line)
- }
- line = line[n+1:]
- var pat string
- switch line[0] {
- case '/':
- a, b := strings.Index(line, "/"), strings.LastIndex(line, "/")
- if a == -1 || a == b {
- return nil, fmt.Errorf("malformed match instruction %q", line)
- }
- pat = line[a+1 : b]
- case '"':
- a, b := strings.Index(line, `"`), strings.LastIndex(line, `"`)
- if a == -1 || a == b {
- return nil, fmt.Errorf("malformed match instruction %q", line)
- }
- pat = regexp.QuoteMeta(line[a+1 : b])
- default:
- return nil, fmt.Errorf("malformed match instruction %q", line)
- }
-
- rx, err := regexp.Compile(pat)
- if err != nil {
- return nil, fmt.Errorf("bad match pattern %q: %v", pat, err)
- }
- return rx, nil
-}
-
-func extractReplacement(line string) (string, bool) {
- // Look for this: / -> `
- // (the end of a match and start of a backtick string),
- // and then the closing backtick.
- const start = "/ -> `"
- a, b := strings.Index(line, start), strings.LastIndex(line, "`")
- if a < 0 || a > b {
- return "", false
- }
- return line[a+len(start) : b], true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint.go
deleted file mode 100644
index 47ee6909a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint.go
+++ /dev/null
@@ -1,1771 +0,0 @@
-// Package simple contains a linter for Go source code.
-package simple // import "honnef.co/go/tools/simple"
-
-import (
- "go/ast"
- "go/constant"
- "go/token"
- "go/types"
- "reflect"
- "strings"
-
- "honnef.co/go/tools/internal/sharedcheck"
- "honnef.co/go/tools/lint"
- "honnef.co/go/tools/ssa"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-type Checker struct {
- CheckGenerated bool
- MS *typeutil.MethodSetCache
-
- nodeFns map[ast.Node]*ssa.Function
-}
-
-func NewChecker() *Checker {
- return &Checker{
- MS: &typeutil.MethodSetCache{},
- }
-}
-
-func (*Checker) Name() string { return "gosimple" }
-func (*Checker) Prefix() string { return "S" }
-
-func (c *Checker) Init(prog *lint.Program) {
- c.nodeFns = lint.NodeFns(prog.Packages)
-}
-
-func (c *Checker) Funcs() map[string]lint.Func {
- return map[string]lint.Func{
- "S1000": c.LintSingleCaseSelect,
- "S1001": c.LintLoopCopy,
- "S1002": c.LintIfBoolCmp,
- "S1003": c.LintStringsContains,
- "S1004": c.LintBytesCompare,
- "S1005": c.LintUnnecessaryBlank,
- "S1006": c.LintForTrue,
- "S1007": c.LintRegexpRaw,
- "S1008": c.LintIfReturn,
- "S1009": c.LintRedundantNilCheckWithLen,
- "S1010": c.LintSlicing,
- "S1011": c.LintLoopAppend,
- "S1012": c.LintTimeSince,
- "S1013": c.LintSimplerReturn,
- "S1014": nil,
- "S1015": nil,
- "S1016": c.LintSimplerStructConversion,
- "S1017": c.LintTrim,
- "S1018": c.LintLoopSlide,
- "S1019": c.LintMakeLenCap,
- "S1020": c.LintAssertNotNil,
- "S1021": c.LintDeclareAssign,
- "S1022": nil,
- "S1023": c.LintRedundantBreak,
- "S1024": c.LintTimeUntil,
- "S1025": c.LintRedundantSprintf,
- "S1026": nil,
- "S1027": nil,
- "S1028": c.LintErrorsNewSprintf,
- "S1029": c.LintRangeStringRunes,
- "S1030": c.LintBytesBufferConversions,
- "S1031": c.LintNilCheckAroundRange,
- }
-}
-
-func (c *Checker) filterGenerated(files []*ast.File) []*ast.File {
- if c.CheckGenerated {
- return files
- }
- var out []*ast.File
- for _, f := range files {
- if !lint.IsGenerated(f) {
- out = append(out, f)
- }
- }
- return out
-}
-
-func (c *Checker) LintSingleCaseSelect(j *lint.Job) {
- isSingleSelect := func(node ast.Node) bool {
- v, ok := node.(*ast.SelectStmt)
- if !ok {
- return false
- }
- return len(v.Body.List) == 1
- }
-
- seen := map[ast.Node]struct{}{}
- fn := func(node ast.Node) bool {
- switch v := node.(type) {
- case *ast.ForStmt:
- if len(v.Body.List) != 1 {
- return true
- }
- if !isSingleSelect(v.Body.List[0]) {
- return true
- }
- if _, ok := v.Body.List[0].(*ast.SelectStmt).Body.List[0].(*ast.CommClause).Comm.(*ast.SendStmt); ok {
- // Don't suggest using range for channel sends
- return true
- }
- seen[v.Body.List[0]] = struct{}{}
- j.Errorf(node, "should use for range instead of for { select {} }")
- case *ast.SelectStmt:
- if _, ok := seen[v]; ok {
- return true
- }
- if !isSingleSelect(v) {
- return true
- }
- j.Errorf(node, "should use a simple channel send/receive instead of select with a single case")
- return true
- }
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintLoopCopy(j *lint.Job) {
- fn := func(node ast.Node) bool {
- loop, ok := node.(*ast.RangeStmt)
- if !ok {
- return true
- }
-
- if loop.Key == nil {
- return true
- }
- if len(loop.Body.List) != 1 {
- return true
- }
- stmt, ok := loop.Body.List[0].(*ast.AssignStmt)
- if !ok {
- return true
- }
- if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 {
- return true
- }
- lhs, ok := stmt.Lhs[0].(*ast.IndexExpr)
- if !ok {
- return true
- }
- if _, ok := j.Program.Info.TypeOf(lhs.X).(*types.Slice); !ok {
- return true
- }
- lidx, ok := lhs.Index.(*ast.Ident)
- if !ok {
- return true
- }
- key, ok := loop.Key.(*ast.Ident)
- if !ok {
- return true
- }
- if j.Program.Info.TypeOf(lhs) == nil || j.Program.Info.TypeOf(stmt.Rhs[0]) == nil {
- return true
- }
- if j.Program.Info.ObjectOf(lidx) != j.Program.Info.ObjectOf(key) {
- return true
- }
- if !types.Identical(j.Program.Info.TypeOf(lhs), j.Program.Info.TypeOf(stmt.Rhs[0])) {
- return true
- }
- if _, ok := j.Program.Info.TypeOf(loop.X).(*types.Slice); !ok {
- return true
- }
-
- if rhs, ok := stmt.Rhs[0].(*ast.IndexExpr); ok {
- rx, ok := rhs.X.(*ast.Ident)
- _ = rx
- if !ok {
- return true
- }
- ridx, ok := rhs.Index.(*ast.Ident)
- if !ok {
- return true
- }
- if j.Program.Info.ObjectOf(ridx) != j.Program.Info.ObjectOf(key) {
- return true
- }
- } else if rhs, ok := stmt.Rhs[0].(*ast.Ident); ok {
- value, ok := loop.Value.(*ast.Ident)
- if !ok {
- return true
- }
- if j.Program.Info.ObjectOf(rhs) != j.Program.Info.ObjectOf(value) {
- return true
- }
- } else {
- return true
- }
- j.Errorf(loop, "should use copy() instead of a loop")
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintIfBoolCmp(j *lint.Job) {
- fn := func(node ast.Node) bool {
- expr, ok := node.(*ast.BinaryExpr)
- if !ok || (expr.Op != token.EQL && expr.Op != token.NEQ) {
- return true
- }
- x := j.IsBoolConst(expr.X)
- y := j.IsBoolConst(expr.Y)
- if !x && !y {
- return true
- }
- var other ast.Expr
- var val bool
- if x {
- val = j.BoolConst(expr.X)
- other = expr.Y
- } else {
- val = j.BoolConst(expr.Y)
- other = expr.X
- }
- basic, ok := j.Program.Info.TypeOf(other).Underlying().(*types.Basic)
- if !ok || basic.Kind() != types.Bool {
- return true
- }
- op := ""
- if (expr.Op == token.EQL && !val) || (expr.Op == token.NEQ && val) {
- op = "!"
- }
- r := op + j.Render(other)
- l1 := len(r)
- r = strings.TrimLeft(r, "!")
- if (l1-len(r))%2 == 1 {
- r = "!" + r
- }
- j.Errorf(expr, "should omit comparison to bool constant, can be simplified to %s", r)
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintBytesBufferConversions(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok || len(call.Args) != 1 {
- return true
- }
-
- argCall, ok := call.Args[0].(*ast.CallExpr)
- if !ok {
- return true
- }
- sel, ok := argCall.Fun.(*ast.SelectorExpr)
- if !ok {
- return true
- }
-
- typ := j.Program.Info.TypeOf(call.Fun)
- if typ == types.Universe.Lookup("string").Type() && j.IsCallToAST(call.Args[0], "(*bytes.Buffer).Bytes") {
- j.Errorf(call, "should use %v.String() instead of %v", j.Render(sel.X), j.Render(call))
- } else if typ, ok := typ.(*types.Slice); ok && typ.Elem() == types.Universe.Lookup("byte").Type() && j.IsCallToAST(call.Args[0], "(*bytes.Buffer).String") {
- j.Errorf(call, "should use %v.Bytes() instead of %v", j.Render(sel.X), j.Render(call))
- }
-
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintStringsContains(j *lint.Job) {
- // map of value to token to bool value
- allowed := map[int64]map[token.Token]bool{
- -1: {token.GTR: true, token.NEQ: true, token.EQL: false},
- 0: {token.GEQ: true, token.LSS: false},
- }
- fn := func(node ast.Node) bool {
- expr, ok := node.(*ast.BinaryExpr)
- if !ok {
- return true
- }
- switch expr.Op {
- case token.GEQ, token.GTR, token.NEQ, token.LSS, token.EQL:
- default:
- return true
- }
-
- value, ok := j.ExprToInt(expr.Y)
- if !ok {
- return true
- }
-
- allowedOps, ok := allowed[value]
- if !ok {
- return true
- }
- b, ok := allowedOps[expr.Op]
- if !ok {
- return true
- }
-
- call, ok := expr.X.(*ast.CallExpr)
- if !ok {
- return true
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return true
- }
- pkgIdent, ok := sel.X.(*ast.Ident)
- if !ok {
- return true
- }
- funIdent := sel.Sel
- if pkgIdent.Name != "strings" && pkgIdent.Name != "bytes" {
- return true
- }
- newFunc := ""
- switch funIdent.Name {
- case "IndexRune":
- newFunc = "ContainsRune"
- case "IndexAny":
- newFunc = "ContainsAny"
- case "Index":
- newFunc = "Contains"
- default:
- return true
- }
-
- prefix := ""
- if !b {
- prefix = "!"
- }
- j.Errorf(node, "should use %s%s.%s(%s) instead", prefix, pkgIdent.Name, newFunc, j.RenderArgs(call.Args))
-
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintBytesCompare(j *lint.Job) {
- fn := func(node ast.Node) bool {
- expr, ok := node.(*ast.BinaryExpr)
- if !ok {
- return true
- }
- if expr.Op != token.NEQ && expr.Op != token.EQL {
- return true
- }
- call, ok := expr.X.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAST(call, "bytes.Compare") {
- return true
- }
- value, ok := j.ExprToInt(expr.Y)
- if !ok || value != 0 {
- return true
- }
- args := j.RenderArgs(call.Args)
- prefix := ""
- if expr.Op == token.NEQ {
- prefix = "!"
- }
- j.Errorf(node, "should use %sbytes.Equal(%s) instead", prefix, args)
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintForTrue(j *lint.Job) {
- fn := func(node ast.Node) bool {
- loop, ok := node.(*ast.ForStmt)
- if !ok {
- return true
- }
- if loop.Init != nil || loop.Post != nil {
- return true
- }
- if !j.IsBoolConst(loop.Cond) || !j.BoolConst(loop.Cond) {
- return true
- }
- j.Errorf(loop, "should use for {} instead of for true {}")
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintRegexpRaw(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAST(call, "regexp.MustCompile") &&
- !j.IsCallToAST(call, "regexp.Compile") {
- return true
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return true
- }
- if len(call.Args) != 1 {
- // invalid function call
- return true
- }
- lit, ok := call.Args[0].(*ast.BasicLit)
- if !ok {
- // TODO(dominikh): support string concat, maybe support constants
- return true
- }
- if lit.Kind != token.STRING {
- // invalid function call
- return true
- }
- if lit.Value[0] != '"' {
- // already a raw string
- return true
- }
- val := lit.Value
- if !strings.Contains(val, `\\`) {
- return true
- }
-
- bs := false
- for _, c := range val {
- if !bs && c == '\\' {
- bs = true
- continue
- }
- if bs && c == '\\' {
- bs = false
- continue
- }
- if bs {
- // backslash followed by non-backslash -> escape sequence
- return true
- }
- }
-
- j.Errorf(call, "should use raw string (`...`) with regexp.%s to avoid having to escape twice", sel.Sel.Name)
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintIfReturn(j *lint.Job) {
- fn := func(node ast.Node) bool {
- block, ok := node.(*ast.BlockStmt)
- if !ok {
- return true
- }
- l := len(block.List)
- if l < 2 {
- return true
- }
- n1, n2 := block.List[l-2], block.List[l-1]
-
- if len(block.List) >= 3 {
- if _, ok := block.List[l-3].(*ast.IfStmt); ok {
- // Do not flag a series of if statements
- return true
- }
- }
- // if statement with no init, no else, a single condition
- // checking an identifier or function call and just a return
- // statement in the body, that returns a boolean constant
- ifs, ok := n1.(*ast.IfStmt)
- if !ok {
- return true
- }
- if ifs.Else != nil || ifs.Init != nil {
- return true
- }
- if len(ifs.Body.List) != 1 {
- return true
- }
- if op, ok := ifs.Cond.(*ast.BinaryExpr); ok {
- switch op.Op {
- case token.EQL, token.LSS, token.GTR, token.NEQ, token.LEQ, token.GEQ:
- default:
- return true
- }
- }
- ret1, ok := ifs.Body.List[0].(*ast.ReturnStmt)
- if !ok {
- return true
- }
- if len(ret1.Results) != 1 {
- return true
- }
- if !j.IsBoolConst(ret1.Results[0]) {
- return true
- }
-
- ret2, ok := n2.(*ast.ReturnStmt)
- if !ok {
- return true
- }
- if len(ret2.Results) != 1 {
- return true
- }
- if !j.IsBoolConst(ret2.Results[0]) {
- return true
- }
- j.Errorf(n1, "should use 'return ' instead of 'if { return }; return '")
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-// LintRedundantNilCheckWithLen checks for the following reduntant nil-checks:
-//
-// if x == nil || len(x) == 0 {}
-// if x != nil && len(x) != 0 {}
-// if x != nil && len(x) == N {} (where N != 0)
-// if x != nil && len(x) > N {}
-// if x != nil && len(x) >= N {} (where N != 0)
-//
-func (c *Checker) LintRedundantNilCheckWithLen(j *lint.Job) {
- isConstZero := func(expr ast.Expr) (isConst bool, isZero bool) {
- _, ok := expr.(*ast.BasicLit)
- if ok {
- return true, lint.IsZero(expr)
- }
- id, ok := expr.(*ast.Ident)
- if !ok {
- return false, false
- }
- c, ok := j.Program.Info.ObjectOf(id).(*types.Const)
- if !ok {
- return false, false
- }
- return true, c.Val().Kind() == constant.Int && c.Val().String() == "0"
- }
-
- fn := func(node ast.Node) bool {
- // check that expr is "x || y" or "x && y"
- expr, ok := node.(*ast.BinaryExpr)
- if !ok {
- return true
- }
- if expr.Op != token.LOR && expr.Op != token.LAND {
- return true
- }
- eqNil := expr.Op == token.LOR
-
- // check that x is "xx == nil" or "xx != nil"
- x, ok := expr.X.(*ast.BinaryExpr)
- if !ok {
- return true
- }
- if eqNil && x.Op != token.EQL {
- return true
- }
- if !eqNil && x.Op != token.NEQ {
- return true
- }
- xx, ok := x.X.(*ast.Ident)
- if !ok {
- return true
- }
- if !j.IsNil(x.Y) {
- return true
- }
-
- // check that y is "len(xx) == 0" or "len(xx) ... "
- y, ok := expr.Y.(*ast.BinaryExpr)
- if !ok {
- return true
- }
- if eqNil && y.Op != token.EQL { // must be len(xx) *==* 0
- return false
- }
- yx, ok := y.X.(*ast.CallExpr)
- if !ok {
- return true
- }
- yxFun, ok := yx.Fun.(*ast.Ident)
- if !ok || yxFun.Name != "len" || len(yx.Args) != 1 {
- return true
- }
- yxArg, ok := yx.Args[0].(*ast.Ident)
- if !ok {
- return true
- }
- if yxArg.Name != xx.Name {
- return true
- }
-
- if eqNil && !lint.IsZero(y.Y) { // must be len(x) == *0*
- return true
- }
-
- if !eqNil {
- isConst, isZero := isConstZero(y.Y)
- if !isConst {
- return true
- }
- switch y.Op {
- case token.EQL:
- // avoid false positive for "xx != nil && len(xx) == 0"
- if isZero {
- return true
- }
- case token.GEQ:
- // avoid false positive for "xx != nil && len(xx) >= 0"
- if isZero {
- return true
- }
- case token.NEQ:
- // avoid false positive for "xx != nil && len(xx) != "
- if !isZero {
- return true
- }
- case token.GTR:
- // ok
- default:
- return true
- }
- }
-
- // finally check that xx type is one of array, slice, map or chan
- // this is to prevent false positive in case if xx is a pointer to an array
- var nilType string
- switch j.Program.Info.TypeOf(xx).(type) {
- case *types.Slice:
- nilType = "nil slices"
- case *types.Map:
- nilType = "nil maps"
- case *types.Chan:
- nilType = "nil channels"
- default:
- return true
- }
- j.Errorf(expr, "should omit nil check; len() for %s is defined as zero", nilType)
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintSlicing(j *lint.Job) {
- fn := func(node ast.Node) bool {
- n, ok := node.(*ast.SliceExpr)
- if !ok {
- return true
- }
- if n.Max != nil {
- return true
- }
- s, ok := n.X.(*ast.Ident)
- if !ok || s.Obj == nil {
- return true
- }
- call, ok := n.High.(*ast.CallExpr)
- if !ok || len(call.Args) != 1 || call.Ellipsis.IsValid() {
- return true
- }
- fun, ok := call.Fun.(*ast.Ident)
- if !ok || fun.Name != "len" {
- return true
- }
- if _, ok := j.Program.Info.ObjectOf(fun).(*types.Builtin); !ok {
- return true
- }
- arg, ok := call.Args[0].(*ast.Ident)
- if !ok || arg.Obj != s.Obj {
- return true
- }
- j.Errorf(n, "should omit second index in slice, s[a:len(s)] is identical to s[a:]")
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func refersTo(info *types.Info, expr ast.Expr, ident *ast.Ident) bool {
- found := false
- fn := func(node ast.Node) bool {
- ident2, ok := node.(*ast.Ident)
- if !ok {
- return true
- }
- if info.ObjectOf(ident) == info.ObjectOf(ident2) {
- found = true
- return false
- }
- return true
- }
- ast.Inspect(expr, fn)
- return found
-}
-
-func (c *Checker) LintLoopAppend(j *lint.Job) {
- fn := func(node ast.Node) bool {
- loop, ok := node.(*ast.RangeStmt)
- if !ok {
- return true
- }
- if !lint.IsBlank(loop.Key) {
- return true
- }
- val, ok := loop.Value.(*ast.Ident)
- if !ok {
- return true
- }
- if len(loop.Body.List) != 1 {
- return true
- }
- stmt, ok := loop.Body.List[0].(*ast.AssignStmt)
- if !ok {
- return true
- }
- if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 {
- return true
- }
- if refersTo(j.Program.Info, stmt.Lhs[0], val) {
- return true
- }
- call, ok := stmt.Rhs[0].(*ast.CallExpr)
- if !ok {
- return true
- }
- if len(call.Args) != 2 || call.Ellipsis.IsValid() {
- return true
- }
- fun, ok := call.Fun.(*ast.Ident)
- if !ok {
- return true
- }
- obj := j.Program.Info.ObjectOf(fun)
- fn, ok := obj.(*types.Builtin)
- if !ok || fn.Name() != "append" {
- return true
- }
-
- src := j.Program.Info.TypeOf(loop.X)
- dst := j.Program.Info.TypeOf(call.Args[0])
- // TODO(dominikh) remove nil check once Go issue #15173 has
- // been fixed
- if src == nil {
- return true
- }
- if !types.Identical(src, dst) {
- return true
- }
-
- if j.Render(stmt.Lhs[0]) != j.Render(call.Args[0]) {
- return true
- }
-
- el, ok := call.Args[1].(*ast.Ident)
- if !ok {
- return true
- }
- if j.Program.Info.ObjectOf(val) != j.Program.Info.ObjectOf(el) {
- return true
- }
- j.Errorf(loop, "should replace loop with %s = append(%s, %s...)",
- j.Render(stmt.Lhs[0]), j.Render(call.Args[0]), j.Render(loop.X))
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintTimeSince(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAST(sel.X, "time.Now") {
- return true
- }
- if sel.Sel.Name != "Sub" {
- return true
- }
- j.Errorf(call, "should use time.Since instead of time.Now().Sub")
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintTimeUntil(j *lint.Job) {
- if !j.IsGoVersion(8) {
- return
- }
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAST(call, "(time.Time).Sub") {
- return true
- }
- if !j.IsCallToAST(call.Args[0], "time.Now") {
- return true
- }
- j.Errorf(call, "should use time.Until instead of t.Sub(time.Now())")
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintSimplerReturn(j *lint.Job) {
- fn1 := func(node ast.Node) bool {
- var ret *ast.FieldList
- switch x := node.(type) {
- case *ast.FuncDecl:
- ret = x.Type.Results
- case *ast.FuncLit:
- ret = x.Type.Results
- default:
- return true
- }
- if ret == nil {
- return true
- }
-
- fn2 := func(node ast.Node) bool {
- block, ok := node.(*ast.BlockStmt)
- if !ok {
- return true
- }
- if len(block.List) < 2 {
- return true
- }
-
- outer:
- for i, stmt := range block.List {
- if i == len(block.List)-1 {
- break
- }
- if i > 0 {
- // don't flag an if in a series of ifs
- if _, ok := block.List[i-1].(*ast.IfStmt); ok {
- continue
- }
- }
-
- // if != nil
- ifs, ok := stmt.(*ast.IfStmt)
- if !ok || len(ifs.Body.List) != 1 || ifs.Else != nil {
- continue
- }
- expr, ok := ifs.Cond.(*ast.BinaryExpr)
- if !ok || expr.Op != token.NEQ || !j.IsNil(expr.Y) {
- continue
- }
- id1, ok := expr.X.(*ast.Ident)
- if !ok {
- continue
- }
-
- // return ...,
- ret1, ok := ifs.Body.List[0].(*ast.ReturnStmt)
- if !ok || len(ret1.Results) == 0 {
- continue
- }
- var results1 []types.Object
- for _, res := range ret1.Results {
- ident, ok := res.(*ast.Ident)
- if !ok {
- continue outer
- }
- results1 = append(results1, j.Program.Info.ObjectOf(ident))
- }
- if results1[len(results1)-1] != j.Program.Info.ObjectOf(id1) {
- continue
- }
-
- // return ..., [ | nil]
- ret2, ok := block.List[i+1].(*ast.ReturnStmt)
- if !ok || len(ret2.Results) == 0 {
- continue
- }
- var results2 []types.Object
- for _, res := range ret2.Results {
- ident, ok := res.(*ast.Ident)
- if !ok {
- continue outer
- }
- results2 = append(results2, j.Program.Info.ObjectOf(ident))
- }
- _, isNil := results2[len(results2)-1].(*types.Nil)
- if results2[len(results2)-1] != j.Program.Info.ObjectOf(id1) &&
- !isNil {
- continue
- }
- for i, v := range results1[:len(results1)-1] {
- if v != results2[i] {
- continue outer
- }
- }
-
- id1Obj := j.Program.Info.ObjectOf(id1)
- if id1Obj == nil {
- continue
- }
- _, idIface := id1Obj.Type().Underlying().(*types.Interface)
- _, retIface := j.Program.Info.TypeOf(ret.List[len(ret.List)-1].Type).Underlying().(*types.Interface)
-
- if retIface && !idIface {
- // When the return value is an interface, but the
- // identifier is not, an explicit check for nil is
- // required to return an untyped nil.
- continue
- }
-
- j.Errorf(ifs, "'if %s != nil { return %s }; return %s' can be simplified to 'return %s'",
- j.Render(expr.X), j.RenderArgs(ret1.Results),
- j.RenderArgs(ret2.Results), j.RenderArgs(ret1.Results))
- }
- return true
- }
- ast.Inspect(node, fn2)
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn1)
- }
-}
-
-func (c *Checker) LintUnnecessaryBlank(j *lint.Job) {
- fn1 := func(node ast.Node) {
- assign, ok := node.(*ast.AssignStmt)
- if !ok {
- return
- }
- if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 {
- return
- }
- if !lint.IsBlank(assign.Lhs[1]) {
- return
- }
- switch rhs := assign.Rhs[0].(type) {
- case *ast.IndexExpr:
- // The type-checker should make sure that it's a map, but
- // let's be safe.
- if _, ok := j.Program.Info.TypeOf(rhs.X).Underlying().(*types.Map); !ok {
- return
- }
- case *ast.UnaryExpr:
- if rhs.Op != token.ARROW {
- return
- }
- default:
- return
- }
- cp := *assign
- cp.Lhs = cp.Lhs[0:1]
- j.Errorf(assign, "should write %s instead of %s", j.Render(&cp), j.Render(assign))
- }
-
- fn2 := func(node ast.Node) {
- stmt, ok := node.(*ast.AssignStmt)
- if !ok {
- return
- }
- if len(stmt.Lhs) != len(stmt.Rhs) {
- return
- }
- for i, lh := range stmt.Lhs {
- rh := stmt.Rhs[i]
- if !lint.IsBlank(lh) {
- continue
- }
- expr, ok := rh.(*ast.UnaryExpr)
- if !ok {
- continue
- }
- if expr.Op != token.ARROW {
- continue
- }
- j.Errorf(lh, "'_ = <-ch' can be simplified to '<-ch'")
- }
- }
-
- fn3 := func(node ast.Node) {
- rs, ok := node.(*ast.RangeStmt)
- if !ok {
- return
- }
- if lint.IsBlank(rs.Key) && (rs.Value == nil || lint.IsBlank(rs.Value)) {
- j.Errorf(rs.Key, "should omit values from range; this loop is equivalent to `for range ...`")
- }
- }
-
- fn := func(node ast.Node) bool {
- fn1(node)
- fn2(node)
- if j.IsGoVersion(4) {
- fn3(node)
- }
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintSimplerStructConversion(j *lint.Job) {
- var skip ast.Node
- fn := func(node ast.Node) bool {
- // Do not suggest type conversion between pointers
- if unary, ok := node.(*ast.UnaryExpr); ok && unary.Op == token.AND {
- if lit, ok := unary.X.(*ast.CompositeLit); ok {
- skip = lit
- }
- return true
- }
-
- if node == skip {
- return true
- }
-
- lit, ok := node.(*ast.CompositeLit)
- if !ok {
- return true
- }
- typ1, _ := j.Program.Info.TypeOf(lit.Type).(*types.Named)
- if typ1 == nil {
- return true
- }
- s1, ok := typ1.Underlying().(*types.Struct)
- if !ok {
- return true
- }
-
- var typ2 *types.Named
- var ident *ast.Ident
- getSelType := func(expr ast.Expr) (types.Type, *ast.Ident, bool) {
- sel, ok := expr.(*ast.SelectorExpr)
- if !ok {
- return nil, nil, false
- }
- ident, ok := sel.X.(*ast.Ident)
- if !ok {
- return nil, nil, false
- }
- typ := j.Program.Info.TypeOf(sel.X)
- return typ, ident, typ != nil
- }
- if len(lit.Elts) == 0 {
- return true
- }
- if s1.NumFields() != len(lit.Elts) {
- return true
- }
- for i, elt := range lit.Elts {
- var t types.Type
- var id *ast.Ident
- var ok bool
- switch elt := elt.(type) {
- case *ast.SelectorExpr:
- t, id, ok = getSelType(elt)
- if !ok {
- return true
- }
- if i >= s1.NumFields() || s1.Field(i).Name() != elt.Sel.Name {
- return true
- }
- case *ast.KeyValueExpr:
- var sel *ast.SelectorExpr
- sel, ok = elt.Value.(*ast.SelectorExpr)
- if !ok {
- return true
- }
-
- if elt.Key.(*ast.Ident).Name != sel.Sel.Name {
- return true
- }
- t, id, ok = getSelType(elt.Value)
- }
- if !ok {
- return true
- }
- // All fields must be initialized from the same object
- if ident != nil && ident.Obj != id.Obj {
- return true
- }
- typ2, _ = t.(*types.Named)
- if typ2 == nil {
- return true
- }
- ident = id
- }
-
- if typ2 == nil {
- return true
- }
-
- if typ1.Obj().Pkg() != typ2.Obj().Pkg() {
- // Do not suggest type conversions between different
- // packages. Types in different packages might only match
- // by coincidence. Furthermore, if the dependency ever
- // adds more fields to its type, it could break the code
- // that relies on the type conversion to work.
- return true
- }
-
- s2, ok := typ2.Underlying().(*types.Struct)
- if !ok {
- return true
- }
- if typ1 == typ2 {
- return true
- }
- if !structsIdentical(s1, s2) {
- return true
- }
- j.Errorf(node, "should convert %s (type %s) to %s instead of using struct literal",
- ident.Name, typ2.Obj().Name(), typ1.Obj().Name())
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintTrim(j *lint.Job) {
- sameNonDynamic := func(node1, node2 ast.Node) bool {
- if reflect.TypeOf(node1) != reflect.TypeOf(node2) {
- return false
- }
-
- switch node1 := node1.(type) {
- case *ast.Ident:
- return node1.Obj == node2.(*ast.Ident).Obj
- case *ast.SelectorExpr:
- return j.Render(node1) == j.Render(node2)
- case *ast.IndexExpr:
- return j.Render(node1) == j.Render(node2)
- }
- return false
- }
-
- isLenOnIdent := func(fn ast.Expr, ident ast.Expr) bool {
- call, ok := fn.(*ast.CallExpr)
- if !ok {
- return false
- }
- if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "len" {
- return false
- }
- if len(call.Args) != 1 {
- return false
- }
- return sameNonDynamic(call.Args[0], ident)
- }
-
- fn := func(node ast.Node) bool {
- var pkg string
- var fun string
-
- ifstmt, ok := node.(*ast.IfStmt)
- if !ok {
- return true
- }
- if ifstmt.Init != nil {
- return true
- }
- if ifstmt.Else != nil {
- return true
- }
- if len(ifstmt.Body.List) != 1 {
- return true
- }
- condCall, ok := ifstmt.Cond.(*ast.CallExpr)
- if !ok {
- return true
- }
- call, ok := condCall.Fun.(*ast.SelectorExpr)
- if !ok {
- return true
- }
- if lint.IsIdent(call.X, "strings") {
- pkg = "strings"
- } else if lint.IsIdent(call.X, "bytes") {
- pkg = "bytes"
- } else {
- return true
- }
- if lint.IsIdent(call.Sel, "HasPrefix") {
- fun = "HasPrefix"
- } else if lint.IsIdent(call.Sel, "HasSuffix") {
- fun = "HasSuffix"
- } else {
- return true
- }
-
- assign, ok := ifstmt.Body.List[0].(*ast.AssignStmt)
- if !ok {
- return true
- }
- if assign.Tok != token.ASSIGN {
- return true
- }
- if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
- return true
- }
- if !sameNonDynamic(condCall.Args[0], assign.Lhs[0]) {
- return true
- }
- slice, ok := assign.Rhs[0].(*ast.SliceExpr)
- if !ok {
- return true
- }
- if slice.Slice3 {
- return true
- }
- if !sameNonDynamic(slice.X, condCall.Args[0]) {
- return true
- }
- var index ast.Expr
- switch fun {
- case "HasPrefix":
- // TODO(dh) We could detect a High that is len(s), but another
- // rule will already flag that, anyway.
- if slice.High != nil {
- return true
- }
- index = slice.Low
- case "HasSuffix":
- if slice.Low != nil {
- n, ok := j.ExprToInt(slice.Low)
- if !ok || n != 0 {
- return true
- }
- }
- index = slice.High
- }
-
- switch index := index.(type) {
- case *ast.CallExpr:
- if fun != "HasPrefix" {
- return true
- }
- if fn, ok := index.Fun.(*ast.Ident); !ok || fn.Name != "len" {
- return true
- }
- if len(index.Args) != 1 {
- return true
- }
- id3 := index.Args[0]
- switch oid3 := condCall.Args[1].(type) {
- case *ast.BasicLit:
- if pkg != "strings" {
- return false
- }
- lit, ok := id3.(*ast.BasicLit)
- if !ok {
- return true
- }
- s1, ok1 := j.ExprToString(lit)
- s2, ok2 := j.ExprToString(condCall.Args[1])
- if !ok1 || !ok2 || s1 != s2 {
- return true
- }
- default:
- if !sameNonDynamic(id3, oid3) {
- return true
- }
- }
- case *ast.BasicLit, *ast.Ident:
- if fun != "HasPrefix" {
- return true
- }
- if pkg != "strings" {
- return true
- }
- string, ok1 := j.ExprToString(condCall.Args[1])
- int, ok2 := j.ExprToInt(slice.Low)
- if !ok1 || !ok2 || int != int64(len(string)) {
- return true
- }
- case *ast.BinaryExpr:
- if fun != "HasSuffix" {
- return true
- }
- if index.Op != token.SUB {
- return true
- }
- if !isLenOnIdent(index.X, condCall.Args[0]) ||
- !isLenOnIdent(index.Y, condCall.Args[1]) {
- return true
- }
- default:
- return true
- }
-
- var replacement string
- switch fun {
- case "HasPrefix":
- replacement = "TrimPrefix"
- case "HasSuffix":
- replacement = "TrimSuffix"
- }
- j.Errorf(ifstmt, "should replace this if statement with an unconditional %s.%s", pkg, replacement)
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintLoopSlide(j *lint.Job) {
- // TODO(dh): detect bs[i+offset] in addition to bs[offset+i]
- // TODO(dh): consider merging this function with LintLoopCopy
- // TODO(dh): detect length that is an expression, not a variable name
- // TODO(dh): support sliding to a different offset than the beginning of the slice
-
- fn := func(node ast.Node) bool {
- /*
- for i := 0; i < n; i++ {
- bs[i] = bs[offset+i]
- }
-
- ↓
-
- copy(bs[:n], bs[offset:offset+n])
- */
-
- loop, ok := node.(*ast.ForStmt)
- if !ok || len(loop.Body.List) != 1 || loop.Init == nil || loop.Cond == nil || loop.Post == nil {
- return true
- }
- assign, ok := loop.Init.(*ast.AssignStmt)
- if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || !lint.IsZero(assign.Rhs[0]) {
- return true
- }
- initvar, ok := assign.Lhs[0].(*ast.Ident)
- if !ok {
- return true
- }
- post, ok := loop.Post.(*ast.IncDecStmt)
- if !ok || post.Tok != token.INC {
- return true
- }
- postvar, ok := post.X.(*ast.Ident)
- if !ok || j.Program.Info.ObjectOf(postvar) != j.Program.Info.ObjectOf(initvar) {
- return true
- }
- bin, ok := loop.Cond.(*ast.BinaryExpr)
- if !ok || bin.Op != token.LSS {
- return true
- }
- binx, ok := bin.X.(*ast.Ident)
- if !ok || j.Program.Info.ObjectOf(binx) != j.Program.Info.ObjectOf(initvar) {
- return true
- }
- biny, ok := bin.Y.(*ast.Ident)
- if !ok {
- return true
- }
-
- assign, ok = loop.Body.List[0].(*ast.AssignStmt)
- if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || assign.Tok != token.ASSIGN {
- return true
- }
- lhs, ok := assign.Lhs[0].(*ast.IndexExpr)
- if !ok {
- return true
- }
- rhs, ok := assign.Rhs[0].(*ast.IndexExpr)
- if !ok {
- return true
- }
-
- bs1, ok := lhs.X.(*ast.Ident)
- if !ok {
- return true
- }
- bs2, ok := rhs.X.(*ast.Ident)
- if !ok {
- return true
- }
- obj1 := j.Program.Info.ObjectOf(bs1)
- obj2 := j.Program.Info.ObjectOf(bs2)
- if obj1 != obj2 {
- return true
- }
- if _, ok := obj1.Type().Underlying().(*types.Slice); !ok {
- return true
- }
-
- index1, ok := lhs.Index.(*ast.Ident)
- if !ok || j.Program.Info.ObjectOf(index1) != j.Program.Info.ObjectOf(initvar) {
- return true
- }
- index2, ok := rhs.Index.(*ast.BinaryExpr)
- if !ok || index2.Op != token.ADD {
- return true
- }
- add1, ok := index2.X.(*ast.Ident)
- if !ok {
- return true
- }
- add2, ok := index2.Y.(*ast.Ident)
- if !ok || j.Program.Info.ObjectOf(add2) != j.Program.Info.ObjectOf(initvar) {
- return true
- }
-
- j.Errorf(loop, "should use copy(%s[:%s], %s[%s:]) instead", j.Render(bs1), j.Render(biny), j.Render(bs1), j.Render(add1))
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintMakeLenCap(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "make" {
- // FIXME check whether make is indeed the built-in function
- return true
- }
- switch len(call.Args) {
- case 2:
- // make(T, len)
- if _, ok := j.Program.Info.TypeOf(call.Args[0]).Underlying().(*types.Slice); ok {
- break
- }
- if lint.IsZero(call.Args[1]) {
- j.Errorf(call.Args[1], "should use make(%s) instead", j.Render(call.Args[0]))
- }
- case 3:
- // make(T, len, cap)
- if j.Render(call.Args[1]) == j.Render(call.Args[2]) {
- j.Errorf(call.Args[1], "should use make(%s, %s) instead", j.Render(call.Args[0]), j.Render(call.Args[1]))
- }
- }
- return false
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintAssertNotNil(j *lint.Job) {
- isNilCheck := func(ident *ast.Ident, expr ast.Expr) bool {
- xbinop, ok := expr.(*ast.BinaryExpr)
- if !ok || xbinop.Op != token.NEQ {
- return false
- }
- xident, ok := xbinop.X.(*ast.Ident)
- if !ok || xident.Obj != ident.Obj {
- return false
- }
- if !j.IsNil(xbinop.Y) {
- return false
- }
- return true
- }
- isOKCheck := func(ident *ast.Ident, expr ast.Expr) bool {
- yident, ok := expr.(*ast.Ident)
- if !ok || yident.Obj != ident.Obj {
- return false
- }
- return true
- }
- fn := func(node ast.Node) bool {
- ifstmt, ok := node.(*ast.IfStmt)
- if !ok {
- return true
- }
- assign, ok := ifstmt.Init.(*ast.AssignStmt)
- if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !lint.IsBlank(assign.Lhs[0]) {
- return true
- }
- assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr)
- if !ok {
- return true
- }
- binop, ok := ifstmt.Cond.(*ast.BinaryExpr)
- if !ok || binop.Op != token.LAND {
- return true
- }
- assertIdent, ok := assert.X.(*ast.Ident)
- if !ok {
- return true
- }
- assignIdent, ok := assign.Lhs[1].(*ast.Ident)
- if !ok {
- return true
- }
- if !(isNilCheck(assertIdent, binop.X) && isOKCheck(assignIdent, binop.Y)) &&
- !(isNilCheck(assertIdent, binop.Y) && isOKCheck(assignIdent, binop.X)) {
- return true
- }
- j.Errorf(ifstmt, "when %s is true, %s can't be nil", j.Render(assignIdent), j.Render(assertIdent))
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintDeclareAssign(j *lint.Job) {
- fn := func(node ast.Node) bool {
- block, ok := node.(*ast.BlockStmt)
- if !ok {
- return true
- }
- if len(block.List) < 2 {
- return true
- }
- for i, stmt := range block.List[:len(block.List)-1] {
- _ = i
- decl, ok := stmt.(*ast.DeclStmt)
- if !ok {
- continue
- }
- gdecl, ok := decl.Decl.(*ast.GenDecl)
- if !ok || gdecl.Tok != token.VAR || len(gdecl.Specs) != 1 {
- continue
- }
- vspec, ok := gdecl.Specs[0].(*ast.ValueSpec)
- if !ok || len(vspec.Names) != 1 || len(vspec.Values) != 0 {
- continue
- }
-
- assign, ok := block.List[i+1].(*ast.AssignStmt)
- if !ok || assign.Tok != token.ASSIGN {
- continue
- }
- if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
- continue
- }
- ident, ok := assign.Lhs[0].(*ast.Ident)
- if !ok {
- continue
- }
- if vspec.Names[0].Obj != ident.Obj {
- continue
- }
-
- if refersTo(j.Program.Info, assign.Rhs[0], ident) {
- continue
- }
- j.Errorf(decl, "should merge variable declaration with assignment on next line")
- }
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintRedundantBreak(j *lint.Job) {
- fn1 := func(node ast.Node) {
- clause, ok := node.(*ast.CaseClause)
- if !ok {
- return
- }
- if len(clause.Body) < 2 {
- return
- }
- branch, ok := clause.Body[len(clause.Body)-1].(*ast.BranchStmt)
- if !ok || branch.Tok != token.BREAK || branch.Label != nil {
- return
- }
- j.Errorf(branch, "redundant break statement")
- return
- }
- fn2 := func(node ast.Node) {
- var ret *ast.FieldList
- var body *ast.BlockStmt
- switch x := node.(type) {
- case *ast.FuncDecl:
- ret = x.Type.Results
- body = x.Body
- case *ast.FuncLit:
- ret = x.Type.Results
- body = x.Body
- default:
- return
- }
- // if the func has results, a return can't be redundant.
- // similarly, if there are no statements, there can be
- // no return.
- if ret != nil || body == nil || len(body.List) < 1 {
- return
- }
- rst, ok := body.List[len(body.List)-1].(*ast.ReturnStmt)
- if !ok {
- return
- }
- // we don't need to check rst.Results as we already
- // checked x.Type.Results to be nil.
- j.Errorf(rst, "redundant return statement")
- }
- fn := func(node ast.Node) bool {
- fn1(node)
- fn2(node)
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) Implements(j *lint.Job, typ types.Type, iface string) bool {
- // OPT(dh): we can cache the type lookup
- idx := strings.IndexRune(iface, '.')
- var scope *types.Scope
- var ifaceName string
- if idx == -1 {
- scope = types.Universe
- ifaceName = iface
- } else {
- pkgName := iface[:idx]
- pkg := j.Program.Prog.Package(pkgName)
- if pkg == nil {
- return false
- }
- scope = pkg.Pkg.Scope()
- ifaceName = iface[idx+1:]
- }
-
- obj := scope.Lookup(ifaceName)
- if obj == nil {
- return false
- }
- i, ok := obj.Type().Underlying().(*types.Interface)
- if !ok {
- return false
- }
- return types.Implements(typ, i)
-}
-
-func (c *Checker) LintRedundantSprintf(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAST(call, "fmt.Sprintf") {
- return true
- }
- if len(call.Args) != 2 {
- return true
- }
- if s, ok := j.ExprToString(call.Args[0]); !ok || s != "%s" {
- return true
- }
- pkg := j.NodePackage(call)
- arg := call.Args[1]
- typ := pkg.Info.TypeOf(arg)
-
- if c.Implements(j, typ, "fmt.Stringer") {
- j.Errorf(call, "should use String() instead of fmt.Sprintf")
- return true
- }
-
- if typ.Underlying() == types.Universe.Lookup("string").Type() {
- if typ == types.Universe.Lookup("string").Type() {
- j.Errorf(call, "the argument is already a string, there's no need to use fmt.Sprintf")
- } else {
- j.Errorf(call, "the argument's underlying type is a string, should use a simple conversion instead of fmt.Sprintf")
- }
- }
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintErrorsNewSprintf(j *lint.Job) {
- fn := func(node ast.Node) bool {
- if !j.IsCallToAST(node, "errors.New") {
- return true
- }
- call := node.(*ast.CallExpr)
- if !j.IsCallToAST(call.Args[0], "fmt.Sprintf") {
- return true
- }
- j.Errorf(node, "should use fmt.Errorf(...) instead of errors.New(fmt.Sprintf(...))")
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) LintRangeStringRunes(j *lint.Job) {
- sharedcheck.CheckRangeStringRunes(c.nodeFns, j)
-}
-
-func (c *Checker) LintNilCheckAroundRange(j *lint.Job) {
- fn := func(node ast.Node) bool {
- ifstmt, ok := node.(*ast.IfStmt)
- if !ok {
- return true
- }
-
- cond, ok := ifstmt.Cond.(*ast.BinaryExpr)
- if !ok {
- return true
- }
-
- if cond.Op != token.NEQ || !j.IsNil(cond.Y) || len(ifstmt.Body.List) != 1 {
- return true
- }
-
- loop, ok := ifstmt.Body.List[0].(*ast.RangeStmt)
- if !ok {
- return true
- }
- ifXIdent, ok := cond.X.(*ast.Ident)
- if !ok {
- return true
- }
- rangeXIdent, ok := loop.X.(*ast.Ident)
- if !ok {
- return true
- }
- if ifXIdent.Obj != rangeXIdent.Obj {
- return true
- }
- switch j.Program.Info.TypeOf(rangeXIdent).(type) {
- case *types.Slice, *types.Map:
- j.Errorf(node, "unnecessary nil check around range")
- }
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint17.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint17.go
deleted file mode 100644
index 53f529c26..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint17.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build !go1.8
-
-package simple
-
-import "go/types"
-
-var structsIdentical = types.Identical
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint18.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint18.go
deleted file mode 100644
index ab9ea727a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/simple/lint18.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build go1.8
-
-package simple
-
-import "go/types"
-
-var structsIdentical = types.IdenticalIgnoreTags
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/blockopt.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/blockopt.go
deleted file mode 100644
index 22c9a4c0d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/blockopt.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// Simple block optimizations to simplify the control flow graph.
-
-// TODO(adonovan): opt: instead of creating several "unreachable" blocks
-// per function in the Builder, reuse a single one (e.g. at Blocks[1])
-// to reduce garbage.
-
-import (
- "fmt"
- "os"
-)
-
-// If true, perform sanity checking and show progress at each
-// successive iteration of optimizeBlocks. Very verbose.
-const debugBlockOpt = false
-
-// markReachable sets Index=-1 for all blocks reachable from b.
-func markReachable(b *BasicBlock) {
- b.Index = -1
- for _, succ := range b.Succs {
- if succ.Index == 0 {
- markReachable(succ)
- }
- }
-}
-
-func DeleteUnreachableBlocks(f *Function) {
- deleteUnreachableBlocks(f)
-}
-
-// deleteUnreachableBlocks marks all reachable blocks of f and
-// eliminates (nils) all others, including possibly cyclic subgraphs.
-//
-func deleteUnreachableBlocks(f *Function) {
- const white, black = 0, -1
- // We borrow b.Index temporarily as the mark bit.
- for _, b := range f.Blocks {
- b.Index = white
- }
- markReachable(f.Blocks[0])
- if f.Recover != nil {
- markReachable(f.Recover)
- }
- for i, b := range f.Blocks {
- if b.Index == white {
- for _, c := range b.Succs {
- if c.Index == black {
- c.removePred(b) // delete white->black edge
- }
- }
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "unreachable", b)
- }
- f.Blocks[i] = nil // delete b
- }
- }
- f.removeNilBlocks()
-}
-
-// jumpThreading attempts to apply simple jump-threading to block b,
-// in which a->b->c become a->c if b is just a Jump.
-// The result is true if the optimization was applied.
-//
-func jumpThreading(f *Function, b *BasicBlock) bool {
- if b.Index == 0 {
- return false // don't apply to entry block
- }
- if b.Instrs == nil {
- return false
- }
- if _, ok := b.Instrs[0].(*Jump); !ok {
- return false // not just a jump
- }
- c := b.Succs[0]
- if c == b {
- return false // don't apply to degenerate jump-to-self.
- }
- if c.hasPhi() {
- return false // not sound without more effort
- }
- for j, a := range b.Preds {
- a.replaceSucc(b, c)
-
- // If a now has two edges to c, replace its degenerate If by Jump.
- if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c {
- jump := new(Jump)
- jump.setBlock(a)
- a.Instrs[len(a.Instrs)-1] = jump
- a.Succs = a.Succs[:1]
- c.removePred(b)
- } else {
- if j == 0 {
- c.replacePred(b, a)
- } else {
- c.Preds = append(c.Preds, a)
- }
- }
-
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c)
- }
- }
- f.Blocks[b.Index] = nil // delete b
- return true
-}
-
-// fuseBlocks attempts to apply the block fusion optimization to block
-// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1.
-// The result is true if the optimization was applied.
-//
-func fuseBlocks(f *Function, a *BasicBlock) bool {
- if len(a.Succs) != 1 {
- return false
- }
- b := a.Succs[0]
- if len(b.Preds) != 1 {
- return false
- }
-
- // Degenerate &&/|| ops may result in a straight-line CFG
- // containing φ-nodes. (Ideally we'd replace such them with
- // their sole operand but that requires Referrers, built later.)
- if b.hasPhi() {
- return false // not sound without further effort
- }
-
- // Eliminate jump at end of A, then copy all of B across.
- a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...)
- for _, instr := range b.Instrs {
- instr.setBlock(a)
- }
-
- // A inherits B's successors
- a.Succs = append(a.succs2[:0], b.Succs...)
-
- // Fix up Preds links of all successors of B.
- for _, c := range b.Succs {
- c.replacePred(b, a)
- }
-
- if debugBlockOpt {
- fmt.Fprintln(os.Stderr, "fuseBlocks", a, b)
- }
-
- f.Blocks[b.Index] = nil // delete b
- return true
-}
-
-func OptimizeBlocks(f *Function) {
- optimizeBlocks(f)
-}
-
-// optimizeBlocks() performs some simple block optimizations on a
-// completed function: dead block elimination, block fusion, jump
-// threading.
-//
-func optimizeBlocks(f *Function) {
- deleteUnreachableBlocks(f)
-
- // Loop until no further progress.
- changed := true
- for changed {
- changed = false
-
- if debugBlockOpt {
- f.WriteTo(os.Stderr)
- mustSanityCheck(f, nil)
- }
-
- for _, b := range f.Blocks {
- // f.Blocks will temporarily contain nils to indicate
- // deleted blocks; we remove them at the end.
- if b == nil {
- continue
- }
-
- // Fuse blocks. b->c becomes bc.
- if fuseBlocks(f, b) {
- changed = true
- }
-
- // a->b->c becomes a->c if b contains only a Jump.
- if jumpThreading(f, b) {
- changed = true
- continue // (b was disconnected)
- }
- }
- }
- f.removeNilBlocks()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/builder.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/builder.go
deleted file mode 100644
index bfb7a2b76..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/builder.go
+++ /dev/null
@@ -1,2383 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the BUILD phase of SSA construction.
-//
-// SSA construction has two phases, CREATE and BUILD. In the CREATE phase
-// (create.go), all packages are constructed and type-checked and
-// definitions of all package members are created, method-sets are
-// computed, and wrapper methods are synthesized.
-// ssa.Packages are created in arbitrary order.
-//
-// In the BUILD phase (builder.go), the builder traverses the AST of
-// each Go source function and generates SSA instructions for the
-// function body. Initializer expressions for package-level variables
-// are emitted to the package's init() function in the order specified
-// by go/types.Info.InitOrder, then code for each function in the
-// package is generated in lexical order.
-// The BUILD phases for distinct packages are independent and are
-// executed in parallel.
-//
-// TODO(adonovan): indeed, building functions is now embarrassingly parallel.
-// Audit for concurrency then benchmark using more goroutines.
-//
-// The builder's and Program's indices (maps) are populated and
-// mutated during the CREATE phase, but during the BUILD phase they
-// remain constant. The sole exception is Prog.methodSets and its
-// related maps, which are protected by a dedicated mutex.
-
-import (
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "os"
- "sync"
-)
-
-type opaqueType struct {
- types.Type
- name string
-}
-
-func (t *opaqueType) String() string { return t.name }
-
-var (
- varOk = newVar("ok", tBool)
- varIndex = newVar("index", tInt)
-
- // Type constants.
- tBool = types.Typ[types.Bool]
- tByte = types.Typ[types.Byte]
- tInt = types.Typ[types.Int]
- tInvalid = types.Typ[types.Invalid]
- tString = types.Typ[types.String]
- tUntypedNil = types.Typ[types.UntypedNil]
- tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators
- tEface = new(types.Interface)
-
- // SSA Value constants.
- vZero = intConst(0)
- vOne = intConst(1)
- vTrue = NewConst(exact.MakeBool(true), tBool)
-)
-
-// builder holds state associated with the package currently being built.
-// Its methods contain all the logic for AST-to-SSA conversion.
-type builder struct{}
-
-// cond emits to fn code to evaluate boolean condition e and jump
-// to t or f depending on its value, performing various simplifications.
-//
-// Postcondition: fn.currentBlock is nil.
-//
-func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) {
- switch e := e.(type) {
- case *ast.ParenExpr:
- b.cond(fn, e.X, t, f)
- return
-
- case *ast.BinaryExpr:
- switch e.Op {
- case token.LAND:
- ltrue := fn.newBasicBlock("cond.true")
- b.cond(fn, e.X, ltrue, f)
- fn.currentBlock = ltrue
- b.cond(fn, e.Y, t, f)
- return
-
- case token.LOR:
- lfalse := fn.newBasicBlock("cond.false")
- b.cond(fn, e.X, t, lfalse)
- fn.currentBlock = lfalse
- b.cond(fn, e.Y, t, f)
- return
- }
-
- case *ast.UnaryExpr:
- if e.Op == token.NOT {
- b.cond(fn, e.X, f, t)
- return
- }
- }
-
- // A traditional compiler would simplify "if false" (etc) here
- // but we do not, for better fidelity to the source code.
- //
- // The value of a constant condition may be platform-specific,
- // and may cause blocks that are reachable in some configuration
- // to be hidden from subsequent analyses such as bug-finding tools.
- emitIf(fn, b.expr(fn, e), t, f)
-}
-
-// logicalBinop emits code to fn to evaluate e, a &&- or
-// ||-expression whose reified boolean value is wanted.
-// The value is returned.
-//
-func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value {
- rhs := fn.newBasicBlock("binop.rhs")
- done := fn.newBasicBlock("binop.done")
-
- // T(e) = T(e.X) = T(e.Y) after untyped constants have been
- // eliminated.
- // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool.
- t := fn.Pkg.typeOf(e)
-
- var short Value // value of the short-circuit path
- switch e.Op {
- case token.LAND:
- b.cond(fn, e.X, rhs, done)
- short = NewConst(exact.MakeBool(false), t)
-
- case token.LOR:
- b.cond(fn, e.X, done, rhs)
- short = NewConst(exact.MakeBool(true), t)
- }
-
- // Is rhs unreachable?
- if rhs.Preds == nil {
- // Simplify false&&y to false, true||y to true.
- fn.currentBlock = done
- return short
- }
-
- // Is done unreachable?
- if done.Preds == nil {
- // Simplify true&&y (or false||y) to y.
- fn.currentBlock = rhs
- return b.expr(fn, e.Y)
- }
-
- // All edges from e.X to done carry the short-circuit value.
- var edges []Value
- for _ = range done.Preds {
- edges = append(edges, short)
- }
-
- // The edge from e.Y to done carries the value of e.Y.
- fn.currentBlock = rhs
- edges = append(edges, b.expr(fn, e.Y))
- emitJump(fn, done)
- fn.currentBlock = done
-
- phi := &Phi{Edges: edges, Comment: e.Op.String()}
- phi.pos = e.OpPos
- phi.typ = t
- return done.emit(phi)
-}
-
-// exprN lowers a multi-result expression e to SSA form, emitting code
-// to fn and returning a single Value whose type is a *types.Tuple.
-// The caller must access the components via Extract.
-//
-// Multi-result expressions include CallExprs in a multi-value
-// assignment or return statement, and "value,ok" uses of
-// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op
-// is token.ARROW).
-//
-func (b *builder) exprN(fn *Function, e ast.Expr) Value {
- typ := fn.Pkg.typeOf(e).(*types.Tuple)
- switch e := e.(type) {
- case *ast.ParenExpr:
- return b.exprN(fn, e.X)
-
- case *ast.CallExpr:
- // Currently, no built-in function nor type conversion
- // has multiple results, so we can avoid some of the
- // cases for single-valued CallExpr.
- var c Call
- b.setCall(fn, e, &c.Call)
- c.typ = typ
- return fn.emit(&c)
-
- case *ast.IndexExpr:
- mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
- lookup := &Lookup{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
- CommaOk: true,
- }
- lookup.setType(typ)
- lookup.setPos(e.Lbrack)
- return fn.emit(lookup)
-
- case *ast.TypeAssertExpr:
- return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen)
-
- case *ast.UnaryExpr: // must be receive <-
- unop := &UnOp{
- Op: token.ARROW,
- X: b.expr(fn, e.X),
- CommaOk: true,
- }
- unop.setType(typ)
- unop.setPos(e.OpPos)
- return fn.emit(unop)
- }
- panic(fmt.Sprintf("exprN(%T) in %s", e, fn))
-}
-
-// builtin emits to fn SSA instructions to implement a call to the
-// built-in function obj with the specified arguments
-// and return type. It returns the value defined by the result.
-//
-// The result is nil if no special handling was required; in this case
-// the caller should treat this like an ordinary library function
-// call.
-//
-func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value {
- switch obj.Name() {
- case "make":
- switch typ.Underlying().(type) {
- case *types.Slice:
- n := b.expr(fn, args[1])
- m := n
- if len(args) == 3 {
- m = b.expr(fn, args[2])
- }
- if m, ok := m.(*Const); ok {
- // treat make([]T, n, m) as new([m]T)[:n]
- cap := m.Int64()
- at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap)
- alloc := emitNew(fn, at, pos)
- alloc.Comment = "makeslice"
- v := &Slice{
- X: alloc,
- High: n,
- }
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
- }
- v := &MakeSlice{
- Len: n,
- Cap: m,
- }
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
-
- case *types.Map:
- var res Value
- if len(args) == 2 {
- res = b.expr(fn, args[1])
- }
- v := &MakeMap{Reserve: res}
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
-
- case *types.Chan:
- var sz Value = vZero
- if len(args) == 2 {
- sz = b.expr(fn, args[1])
- }
- v := &MakeChan{Size: sz}
- v.setPos(pos)
- v.setType(typ)
- return fn.emit(v)
- }
-
- case "new":
- alloc := emitNew(fn, deref(typ), pos)
- alloc.Comment = "new"
- return alloc
-
- case "len", "cap":
- // Special case: len or cap of an array or *array is
- // based on the type, not the value which may be nil.
- // We must still evaluate the value, though. (If it
- // was side-effect free, the whole call would have
- // been constant-folded.)
- t := deref(fn.Pkg.typeOf(args[0])).Underlying()
- if at, ok := t.(*types.Array); ok {
- b.expr(fn, args[0]) // for effects only
- return intConst(at.Len())
- }
- // Otherwise treat as normal.
-
- case "panic":
- fn.emit(&Panic{
- X: emitConv(fn, b.expr(fn, args[0]), tEface),
- pos: pos,
- })
- fn.currentBlock = fn.newBasicBlock("unreachable")
- return vTrue // any non-nil Value will do
- }
- return nil // treat all others as a regular function call
-}
-
-// addr lowers a single-result addressable expression e to SSA form,
-// emitting code to fn and returning the location (an lvalue) defined
-// by the expression.
-//
-// If escaping is true, addr marks the base variable of the
-// addressable expression e as being a potentially escaping pointer
-// value. For example, in this code:
-//
-// a := A{
-// b: [1]B{B{c: 1}}
-// }
-// return &a.b[0].c
-//
-// the application of & causes a.b[0].c to have its address taken,
-// which means that ultimately the local variable a must be
-// heap-allocated. This is a simple but very conservative escape
-// analysis.
-//
-// Operations forming potentially escaping pointers include:
-// - &x, including when implicit in method call or composite literals.
-// - a[:] iff a is an array (not *array)
-// - references to variables in lexically enclosing functions.
-//
-func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue {
- switch e := e.(type) {
- case *ast.Ident:
- if isBlankIdent(e) {
- return blank{}
- }
- obj := fn.Pkg.objectOf(e)
- v := fn.Prog.packageLevelValue(obj) // var (address)
- if v == nil {
- v = fn.lookup(obj, escaping)
- }
- return &address{addr: v, pos: e.Pos(), expr: e}
-
- case *ast.CompositeLit:
- t := deref(fn.Pkg.typeOf(e))
- var v *Alloc
- if escaping {
- v = emitNew(fn, t, e.Lbrace)
- } else {
- v = fn.addLocal(t, e.Lbrace)
- }
- v.Comment = "complit"
- var sb storebuf
- b.compLit(fn, v, e, true, &sb)
- sb.emit(fn)
- return &address{addr: v, pos: e.Lbrace, expr: e}
-
- case *ast.ParenExpr:
- return b.addr(fn, e.X, escaping)
-
- case *ast.SelectorExpr:
- sel, ok := fn.Pkg.info.Selections[e]
- if !ok {
- // qualified identifier
- return b.addr(fn, e.Sel, escaping)
- }
- if sel.Kind() != types.FieldVal {
- panic(sel)
- }
- wantAddr := true
- v := b.receiver(fn, e.X, wantAddr, escaping, sel)
- last := len(sel.Index()) - 1
- return &address{
- addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel),
- pos: e.Sel.Pos(),
- expr: e.Sel,
- }
-
- case *ast.IndexExpr:
- var x Value
- var et types.Type
- switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- x = b.addr(fn, e.X, escaping).address(fn)
- et = types.NewPointer(t.Elem())
- case *types.Pointer: // *array
- x = b.expr(fn, e.X)
- et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())
- case *types.Slice:
- x = b.expr(fn, e.X)
- et = types.NewPointer(t.Elem())
- case *types.Map:
- return &element{
- m: b.expr(fn, e.X),
- k: emitConv(fn, b.expr(fn, e.Index), t.Key()),
- t: t.Elem(),
- pos: e.Lbrack,
- }
- default:
- panic("unexpected container type in IndexExpr: " + t.String())
- }
- v := &IndexAddr{
- X: x,
- Index: emitConv(fn, b.expr(fn, e.Index), tInt),
- }
- v.setPos(e.Lbrack)
- v.setType(et)
- return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e}
-
- case *ast.StarExpr:
- return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e}
- }
-
- panic(fmt.Sprintf("unexpected address expression: %T", e))
-}
-
-type store struct {
- lhs lvalue
- rhs Value
-}
-
-type storebuf struct{ stores []store }
-
-func (sb *storebuf) store(lhs lvalue, rhs Value) {
- sb.stores = append(sb.stores, store{lhs, rhs})
-}
-
-func (sb *storebuf) emit(fn *Function) {
- for _, s := range sb.stores {
- s.lhs.store(fn, s.rhs)
- }
-}
-
-// assign emits to fn code to initialize the lvalue loc with the value
-// of expression e. If isZero is true, assign assumes that loc holds
-// the zero value for its type.
-//
-// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate
-// better code in some cases, e.g., for composite literals in an
-// addressable location.
-//
-// If sb is not nil, assign generates code to evaluate expression e, but
-// not to update loc. Instead, the necessary stores are appended to the
-// storebuf sb so that they can be executed later. This allows correct
-// in-place update of existing variables when the RHS is a composite
-// literal that may reference parts of the LHS.
-//
-func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) {
- // Can we initialize it in place?
- if e, ok := unparen(e).(*ast.CompositeLit); ok {
- // A CompositeLit never evaluates to a pointer,
- // so if the type of the location is a pointer,
- // an &-operation is implied.
- if _, ok := loc.(blank); !ok { // avoid calling blank.typ()
- if isPointer(loc.typ()) {
- ptr := b.addr(fn, e, true).address(fn)
- // copy address
- if sb != nil {
- sb.store(loc, ptr)
- } else {
- loc.store(fn, ptr)
- }
- return
- }
- }
-
- if _, ok := loc.(*address); ok {
- if isInterface(loc.typ()) {
- // e.g. var x interface{} = T{...}
- // Can't in-place initialize an interface value.
- // Fall back to copying.
- } else {
- // x = T{...} or x := T{...}
- addr := loc.address(fn)
- if sb != nil {
- b.compLit(fn, addr, e, isZero, sb)
- } else {
- var sb storebuf
- b.compLit(fn, addr, e, isZero, &sb)
- sb.emit(fn)
- }
-
- // Subtle: emit debug ref for aggregate types only;
- // slice and map are handled by store ops in compLit.
- switch loc.typ().Underlying().(type) {
- case *types.Struct, *types.Array:
- emitDebugRef(fn, e, addr, true)
- }
-
- return
- }
- }
- }
-
- // simple case: just copy
- rhs := b.expr(fn, e)
- if sb != nil {
- sb.store(loc, rhs)
- } else {
- loc.store(fn, rhs)
- }
-}
-
-// expr lowers a single-result expression e to SSA form, emitting code
-// to fn and returning the Value defined by the expression.
-//
-func (b *builder) expr(fn *Function, e ast.Expr) Value {
- e = unparen(e)
-
- tv := fn.Pkg.info.Types[e]
-
- // Is expression a constant?
- if tv.Value != nil {
- return NewConst(tv.Value, tv.Type)
- }
-
- var v Value
- if tv.Addressable() {
- // Prefer pointer arithmetic ({Index,Field}Addr) followed
- // by Load over subelement extraction (e.g. Index, Field),
- // to avoid large copies.
- v = b.addr(fn, e, false).load(fn)
- } else {
- v = b.expr0(fn, e, tv)
- }
- if fn.debugInfo() {
- emitDebugRef(fn, e, v, false)
- }
- return v
-}
-
-func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value {
- switch e := e.(type) {
- case *ast.BasicLit:
- panic("non-constant BasicLit") // unreachable
-
- case *ast.FuncLit:
- fn2 := &Function{
- name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)),
- Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature),
- pos: e.Type.Func,
- parent: fn,
- Pkg: fn.Pkg,
- Prog: fn.Prog,
- syntax: e,
- }
- fn.AnonFuncs = append(fn.AnonFuncs, fn2)
- b.buildFunction(fn2)
- if fn2.FreeVars == nil {
- return fn2
- }
- v := &MakeClosure{Fn: fn2}
- v.setType(tv.Type)
- for _, fv := range fn2.FreeVars {
- v.Bindings = append(v.Bindings, fv.outer)
- fv.outer = nil
- }
- return fn.emit(v)
-
- case *ast.TypeAssertExpr: // single-result form only
- return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen)
-
- case *ast.CallExpr:
- if fn.Pkg.info.Types[e.Fun].IsType() {
- // Explicit type conversion, e.g. string(x) or big.Int(x)
- x := b.expr(fn, e.Args[0])
- y := emitConv(fn, x, tv.Type)
- if y != x {
- switch y := y.(type) {
- case *Convert:
- y.pos = e.Lparen
- case *ChangeType:
- y.pos = e.Lparen
- case *MakeInterface:
- y.pos = e.Lparen
- }
- }
- return y
- }
- // Call to "intrinsic" built-ins, e.g. new, make, panic.
- if id, ok := unparen(e.Fun).(*ast.Ident); ok {
- if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok {
- if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil {
- return v
- }
- }
- }
- // Regular function call.
- var v Call
- b.setCall(fn, e, &v.Call)
- v.setType(tv.Type)
- return fn.emit(&v)
-
- case *ast.UnaryExpr:
- switch e.Op {
- case token.AND: // &X --- potentially escaping.
- addr := b.addr(fn, e.X, true)
- if _, ok := unparen(e.X).(*ast.StarExpr); ok {
- // &*p must panic if p is nil (http://golang.org/s/go12nil).
- // For simplicity, we'll just (suboptimally) rely
- // on the side effects of a load.
- // TODO(adonovan): emit dedicated nilcheck.
- addr.load(fn)
- }
- return addr.address(fn)
- case token.ADD:
- return b.expr(fn, e.X)
- case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^
- v := &UnOp{
- Op: e.Op,
- X: b.expr(fn, e.X),
- }
- v.setPos(e.OpPos)
- v.setType(tv.Type)
- return fn.emit(v)
- default:
- panic(e.Op)
- }
-
- case *ast.BinaryExpr:
- switch e.Op {
- case token.LAND, token.LOR:
- return b.logicalBinop(fn, e)
- case token.SHL, token.SHR:
- fallthrough
- case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
- return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos)
-
- case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ:
- cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos)
- // The type of x==y may be UntypedBool.
- return emitConv(fn, cmp, DefaultType(tv.Type))
- default:
- panic("illegal op in BinaryExpr: " + e.Op.String())
- }
-
- case *ast.SliceExpr:
- var low, high, max Value
- var x Value
- switch fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- // Potentially escaping.
- x = b.addr(fn, e.X, true).address(fn)
- case *types.Basic, *types.Slice, *types.Pointer: // *array
- x = b.expr(fn, e.X)
- default:
- panic("unreachable")
- }
- if e.High != nil {
- high = b.expr(fn, e.High)
- }
- if e.Low != nil {
- low = b.expr(fn, e.Low)
- }
- if e.Slice3 {
- max = b.expr(fn, e.Max)
- }
- v := &Slice{
- X: x,
- Low: low,
- High: high,
- Max: max,
- }
- v.setPos(e.Lbrack)
- v.setType(tv.Type)
- return fn.emit(v)
-
- case *ast.Ident:
- obj := fn.Pkg.info.Uses[e]
- // Universal built-in or nil?
- switch obj := obj.(type) {
- case *types.Builtin:
- return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)}
- case *types.Nil:
- return nilConst(tv.Type)
- }
- // Package-level func or var?
- if v := fn.Prog.packageLevelValue(obj); v != nil {
- if _, ok := obj.(*types.Var); ok {
- return emitLoad(fn, v) // var (address)
- }
- return v // (func)
- }
- // Local var.
- return emitLoad(fn, fn.lookup(obj, false)) // var (address)
-
- case *ast.SelectorExpr:
- sel, ok := fn.Pkg.info.Selections[e]
- if !ok {
- // qualified identifier
- return b.expr(fn, e.Sel)
- }
- switch sel.Kind() {
- case types.MethodExpr:
- // (*T).f or T.f, the method f from the method-set of type T.
- // The result is a "thunk".
- return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type)
-
- case types.MethodVal:
- // e.f where e is an expression and f is a method.
- // The result is a "bound".
- obj := sel.Obj().(*types.Func)
- rt := recvType(obj)
- wantAddr := isPointer(rt)
- escaping := true
- v := b.receiver(fn, e.X, wantAddr, escaping, sel)
- if isInterface(rt) {
- // If v has interface type I,
- // we must emit a check that v is non-nil.
- // We use: typeassert v.(I).
- emitTypeAssert(fn, v, rt, token.NoPos)
- }
- c := &MakeClosure{
- Fn: makeBound(fn.Prog, obj),
- Bindings: []Value{v},
- }
- c.setPos(e.Sel.Pos())
- c.setType(tv.Type)
- return fn.emit(c)
-
- case types.FieldVal:
- indices := sel.Index()
- last := len(indices) - 1
- v := b.expr(fn, e.X)
- v = emitImplicitSelections(fn, v, indices[:last])
- v = emitFieldSelection(fn, v, indices[last], false, e.Sel)
- return v
- }
-
- panic("unexpected expression-relative selector")
-
- case *ast.IndexExpr:
- switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
- case *types.Array:
- // Non-addressable array (in a register).
- v := &Index{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), tInt),
- }
- v.setPos(e.Lbrack)
- v.setType(t.Elem())
- return fn.emit(v)
-
- case *types.Map:
- // Maps are not addressable.
- mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
- v := &Lookup{
- X: b.expr(fn, e.X),
- Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
- }
- v.setPos(e.Lbrack)
- v.setType(mapt.Elem())
- return fn.emit(v)
-
- case *types.Basic: // => string
- // Strings are not addressable.
- v := &Lookup{
- X: b.expr(fn, e.X),
- Index: b.expr(fn, e.Index),
- }
- v.setPos(e.Lbrack)
- v.setType(tByte)
- return fn.emit(v)
-
- case *types.Slice, *types.Pointer: // *array
- // Addressable slice/array; use IndexAddr and Load.
- return b.addr(fn, e, false).load(fn)
-
- default:
- panic("unexpected container type in IndexExpr: " + t.String())
- }
-
- case *ast.CompositeLit, *ast.StarExpr:
- // Addressable types (lvalues)
- return b.addr(fn, e, false).load(fn)
- }
-
- panic(fmt.Sprintf("unexpected expr: %T", e))
-}
-
-// stmtList emits to fn code for all statements in list.
-func (b *builder) stmtList(fn *Function, list []ast.Stmt) {
- for _, s := range list {
- b.stmt(fn, s)
- }
-}
-
-// receiver emits to fn code for expression e in the "receiver"
-// position of selection e.f (where f may be a field or a method) and
-// returns the effective receiver after applying the implicit field
-// selections of sel.
-//
-// wantAddr requests that the result is an an address. If
-// !sel.Indirect(), this may require that e be built in addr() mode; it
-// must thus be addressable.
-//
-// escaping is defined as per builder.addr().
-//
-func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value {
- var v Value
- if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) {
- v = b.addr(fn, e, escaping).address(fn)
- } else {
- v = b.expr(fn, e)
- }
-
- last := len(sel.Index()) - 1
- v = emitImplicitSelections(fn, v, sel.Index()[:last])
- if !wantAddr && isPointer(v.Type()) {
- v = emitLoad(fn, v)
- }
- return v
-}
-
-// setCallFunc populates the function parts of a CallCommon structure
-// (Func, Method, Recv, Args[0]) based on the kind of invocation
-// occurring in e.
-//
-func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) {
- c.pos = e.Lparen
-
- // Is this a method call?
- if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok {
- sel, ok := fn.Pkg.info.Selections[selector]
- if ok && sel.Kind() == types.MethodVal {
- obj := sel.Obj().(*types.Func)
- recv := recvType(obj)
- wantAddr := isPointer(recv)
- escaping := true
- v := b.receiver(fn, selector.X, wantAddr, escaping, sel)
- if isInterface(recv) {
- // Invoke-mode call.
- c.Value = v
- c.Method = obj
- } else {
- // "Call"-mode call.
- c.Value = fn.Prog.declaredFunc(obj)
- c.Args = append(c.Args, v)
- }
- return
- }
-
- // sel.Kind()==MethodExpr indicates T.f() or (*T).f():
- // a statically dispatched call to the method f in the
- // method-set of T or *T. T may be an interface.
- //
- // e.Fun would evaluate to a concrete method, interface
- // wrapper function, or promotion wrapper.
- //
- // For now, we evaluate it in the usual way.
- //
- // TODO(adonovan): opt: inline expr() here, to make the
- // call static and to avoid generation of wrappers.
- // It's somewhat tricky as it may consume the first
- // actual parameter if the call is "invoke" mode.
- //
- // Examples:
- // type T struct{}; func (T) f() {} // "call" mode
- // type T interface { f() } // "invoke" mode
- //
- // type S struct{ T }
- //
- // var s S
- // S.f(s)
- // (*S).f(&s)
- //
- // Suggested approach:
- // - consume the first actual parameter expression
- // and build it with b.expr().
- // - apply implicit field selections.
- // - use MethodVal logic to populate fields of c.
- }
-
- // Evaluate the function operand in the usual way.
- c.Value = b.expr(fn, e.Fun)
-}
-
-// emitCallArgs emits to f code for the actual parameters of call e to
-// a (possibly built-in) function of effective type sig.
-// The argument values are appended to args, which is then returned.
-//
-func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value {
- // f(x, y, z...): pass slice z straight through.
- if e.Ellipsis != 0 {
- for i, arg := range e.Args {
- v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type())
- args = append(args, v)
- }
- return args
- }
-
- offset := len(args) // 1 if call has receiver, 0 otherwise
-
- // Evaluate actual parameter expressions.
- //
- // If this is a chained call of the form f(g()) where g has
- // multiple return values (MRV), they are flattened out into
- // args; a suffix of them may end up in a varargs slice.
- for _, arg := range e.Args {
- v := b.expr(fn, arg)
- if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain
- for i, n := 0, ttuple.Len(); i < n; i++ {
- args = append(args, emitExtract(fn, v, i))
- }
- } else {
- args = append(args, v)
- }
- }
-
- // Actual->formal assignability conversions for normal parameters.
- np := sig.Params().Len() // number of normal parameters
- if sig.Variadic() {
- np--
- }
- for i := 0; i < np; i++ {
- args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type())
- }
-
- // Actual->formal assignability conversions for variadic parameter,
- // and construction of slice.
- if sig.Variadic() {
- varargs := args[offset+np:]
- st := sig.Params().At(np).Type().(*types.Slice)
- vt := st.Elem()
- if len(varargs) == 0 {
- args = append(args, nilConst(st))
- } else {
- // Replace a suffix of args with a slice containing it.
- at := types.NewArray(vt, int64(len(varargs)))
- a := emitNew(fn, at, token.NoPos)
- a.setPos(e.Rparen)
- a.Comment = "varargs"
- for i, arg := range varargs {
- iaddr := &IndexAddr{
- X: a,
- Index: intConst(int64(i)),
- }
- iaddr.setType(types.NewPointer(vt))
- fn.emit(iaddr)
- emitStore(fn, iaddr, arg, arg.Pos())
- }
- s := &Slice{X: a}
- s.setType(st)
- args[offset+np] = fn.emit(s)
- args = args[:offset+np+1]
- }
- }
- return args
-}
-
-// setCall emits to fn code to evaluate all the parameters of a function
-// call e, and populates *c with those values.
-//
-func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) {
- // First deal with the f(...) part and optional receiver.
- b.setCallFunc(fn, e, c)
-
- // Then append the other actual parameters.
- sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature)
- if sig == nil {
- panic(fmt.Sprintf("no signature for call of %s", e.Fun))
- }
- c.Args = b.emitCallArgs(fn, sig, e, c.Args)
-}
-
-// assignOp emits to fn code to perform loc += incr or loc -= incr.
-func (b *builder) assignOp(fn *Function, loc lvalue, incr Value, op token.Token, pos token.Pos) {
- oldv := loc.load(fn)
- loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, incr, oldv.Type()), loc.typ(), pos))
-}
-
-// localValueSpec emits to fn code to define all of the vars in the
-// function-local ValueSpec, spec.
-//
-func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) {
- switch {
- case len(spec.Values) == len(spec.Names):
- // e.g. var x, y = 0, 1
- // 1:1 assignment
- for i, id := range spec.Names {
- if !isBlankIdent(id) {
- fn.addLocalForIdent(id)
- }
- lval := b.addr(fn, id, false) // non-escaping
- b.assign(fn, lval, spec.Values[i], true, nil)
- }
-
- case len(spec.Values) == 0:
- // e.g. var x, y int
- // Locals are implicitly zero-initialized.
- for _, id := range spec.Names {
- if !isBlankIdent(id) {
- lhs := fn.addLocalForIdent(id)
- if fn.debugInfo() {
- emitDebugRef(fn, id, lhs, true)
- }
- }
- }
-
- default:
- // e.g. var x, y = pos()
- tuple := b.exprN(fn, spec.Values[0])
- for i, id := range spec.Names {
- if !isBlankIdent(id) {
- fn.addLocalForIdent(id)
- lhs := b.addr(fn, id, false) // non-escaping
- lhs.store(fn, emitExtract(fn, tuple, i))
- }
- }
- }
-}
-
-// assignStmt emits code to fn for a parallel assignment of rhss to lhss.
-// isDef is true if this is a short variable declaration (:=).
-//
-// Note the similarity with localValueSpec.
-//
-func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) {
- // Side effects of all LHSs and RHSs must occur in left-to-right order.
- lvals := make([]lvalue, len(lhss))
- isZero := make([]bool, len(lhss))
- for i, lhs := range lhss {
- var lval lvalue = blank{}
- if !isBlankIdent(lhs) {
- if isDef {
- if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil {
- fn.addNamedLocal(obj)
- isZero[i] = true
- }
- }
- lval = b.addr(fn, lhs, false) // non-escaping
- }
- lvals[i] = lval
- }
- if len(lhss) == len(rhss) {
- // Simple assignment: x = f() (!isDef)
- // Parallel assignment: x, y = f(), g() (!isDef)
- // or short var decl: x, y := f(), g() (isDef)
- //
- // In all cases, the RHSs may refer to the LHSs,
- // so we need a storebuf.
- var sb storebuf
- for i := range rhss {
- b.assign(fn, lvals[i], rhss[i], isZero[i], &sb)
- }
- sb.emit(fn)
- } else {
- // e.g. x, y = pos()
- tuple := b.exprN(fn, rhss[0])
- emitDebugRef(fn, rhss[0], tuple, false)
- for i, lval := range lvals {
- lval.store(fn, emitExtract(fn, tuple, i))
- }
- }
-}
-
-// arrayLen returns the length of the array whose composite literal elements are elts.
-func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 {
- var max int64 = -1
- var i int64 = -1
- for _, e := range elts {
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- i = b.expr(fn, kv.Key).(*Const).Int64()
- } else {
- i++
- }
- if i > max {
- max = i
- }
- }
- return max + 1
-}
-
-// compLit emits to fn code to initialize a composite literal e at
-// address addr with type typ.
-//
-// Nested composite literals are recursively initialized in place
-// where possible. If isZero is true, compLit assumes that addr
-// holds the zero value for typ.
-//
-// Because the elements of a composite literal may refer to the
-// variables being updated, as in the second line below,
-// x := T{a: 1}
-// x = T{a: x.a}
-// all the reads must occur before all the writes. Thus all stores to
-// loc are emitted to the storebuf sb for later execution.
-//
-// A CompositeLit may have pointer type only in the recursive (nested)
-// case when the type name is implicit. e.g. in []*T{{}}, the inner
-// literal has type *T behaves like &T{}.
-// In that case, addr must hold a T, not a *T.
-//
-func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) {
- typ := deref(fn.Pkg.typeOf(e))
- switch t := typ.Underlying().(type) {
- case *types.Struct:
- if !isZero && len(e.Elts) != t.NumFields() {
- // memclear
- sb.store(&address{addr, e.Lbrace, nil},
- zeroValue(fn, deref(addr.Type())))
- isZero = true
- }
- for i, e := range e.Elts {
- fieldIndex := i
- pos := e.Pos()
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- fname := kv.Key.(*ast.Ident).Name
- for i, n := 0, t.NumFields(); i < n; i++ {
- sf := t.Field(i)
- if sf.Name() == fname {
- fieldIndex = i
- pos = kv.Colon
- e = kv.Value
- break
- }
- }
- }
- sf := t.Field(fieldIndex)
- faddr := &FieldAddr{
- X: addr,
- Field: fieldIndex,
- }
- faddr.setType(types.NewPointer(sf.Type()))
- fn.emit(faddr)
- b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb)
- }
-
- case *types.Array, *types.Slice:
- var at *types.Array
- var array Value
- switch t := t.(type) {
- case *types.Slice:
- at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts))
- alloc := emitNew(fn, at, e.Lbrace)
- alloc.Comment = "slicelit"
- array = alloc
- case *types.Array:
- at = t
- array = addr
-
- if !isZero && int64(len(e.Elts)) != at.Len() {
- // memclear
- sb.store(&address{array, e.Lbrace, nil},
- zeroValue(fn, deref(array.Type())))
- }
- }
-
- var idx *Const
- for _, e := range e.Elts {
- pos := e.Pos()
- if kv, ok := e.(*ast.KeyValueExpr); ok {
- idx = b.expr(fn, kv.Key).(*Const)
- pos = kv.Colon
- e = kv.Value
- } else {
- var idxval int64
- if idx != nil {
- idxval = idx.Int64() + 1
- }
- idx = intConst(idxval)
- }
- iaddr := &IndexAddr{
- X: array,
- Index: idx,
- }
- iaddr.setType(types.NewPointer(at.Elem()))
- fn.emit(iaddr)
- if t != at { // slice
- // backing array is unaliased => storebuf not needed.
- b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil)
- } else {
- b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb)
- }
- }
-
- if t != at { // slice
- s := &Slice{X: array}
- s.setPos(e.Lbrace)
- s.setType(typ)
- sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s))
- }
-
- case *types.Map:
- m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))}
- m.setPos(e.Lbrace)
- m.setType(typ)
- fn.emit(m)
- for _, e := range e.Elts {
- e := e.(*ast.KeyValueExpr)
-
- // If a key expression in a map literal is itself a
- // composite literal, the type may be omitted.
- // For example:
- // map[*struct{}]bool{{}: true}
- // An &-operation may be implied:
- // map[*struct{}]bool{&struct{}{}: true}
- var key Value
- if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) {
- // A CompositeLit never evaluates to a pointer,
- // so if the type of the location is a pointer,
- // an &-operation is implied.
- key = b.addr(fn, e.Key, true).address(fn)
- } else {
- key = b.expr(fn, e.Key)
- }
-
- loc := element{
- m: m,
- k: emitConv(fn, key, t.Key()),
- t: t.Elem(),
- pos: e.Colon,
- }
-
- // We call assign() only because it takes care
- // of any &-operation required in the recursive
- // case, e.g.,
- // map[int]*struct{}{0: {}} implies &struct{}{}.
- // In-place update is of course impossible,
- // and no storebuf is needed.
- b.assign(fn, &loc, e.Value, true, nil)
- }
- sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m)
-
- default:
- panic("unexpected CompositeLit type: " + t.String())
- }
-}
-
-// switchStmt emits to fn code for the switch statement s, optionally
-// labelled by label.
-//
-func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) {
- // We treat SwitchStmt like a sequential if-else chain.
- // Multiway dispatch can be recovered later by ssautil.Switches()
- // to those cases that are free of side effects.
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- var tag Value = vTrue
- if s.Tag != nil {
- tag = b.expr(fn, s.Tag)
- }
- done := fn.newBasicBlock("switch.done")
- if label != nil {
- label._break = done
- }
- // We pull the default case (if present) down to the end.
- // But each fallthrough label must point to the next
- // body block in source order, so we preallocate a
- // body block (fallthru) for the next case.
- // Unfortunately this makes for a confusing block order.
- var dfltBody *[]ast.Stmt
- var dfltFallthrough *BasicBlock
- var fallthru, dfltBlock *BasicBlock
- ncases := len(s.Body.List)
- for i, clause := range s.Body.List {
- body := fallthru
- if body == nil {
- body = fn.newBasicBlock("switch.body") // first case only
- }
-
- // Preallocate body block for the next case.
- fallthru = done
- if i+1 < ncases {
- fallthru = fn.newBasicBlock("switch.body")
- }
-
- cc := clause.(*ast.CaseClause)
- if cc.List == nil {
- // Default case.
- dfltBody = &cc.Body
- dfltFallthrough = fallthru
- dfltBlock = body
- continue
- }
-
- var nextCond *BasicBlock
- for _, cond := range cc.List {
- nextCond = fn.newBasicBlock("switch.next")
- // TODO(adonovan): opt: when tag==vTrue, we'd
- // get better code if we use b.cond(cond)
- // instead of BinOp(EQL, tag, b.expr(cond))
- // followed by If. Don't forget conversions
- // though.
- cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), token.NoPos)
- emitIf(fn, cond, body, nextCond)
- fn.currentBlock = nextCond
- }
- fn.currentBlock = body
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _fallthrough: fallthru,
- }
- b.stmtList(fn, cc.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = nextCond
- }
- if dfltBlock != nil {
- emitJump(fn, dfltBlock)
- fn.currentBlock = dfltBlock
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _fallthrough: dfltFallthrough,
- }
- b.stmtList(fn, *dfltBody)
- fn.targets = fn.targets.tail
- }
- emitJump(fn, done)
- fn.currentBlock = done
-}
-
-// typeSwitchStmt emits to fn code for the type switch statement s, optionally
-// labelled by label.
-//
-func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) {
- // We treat TypeSwitchStmt like a sequential if-else chain.
- // Multiway dispatch can be recovered later by ssautil.Switches().
-
- // Typeswitch lowering:
- //
- // var x X
- // switch y := x.(type) {
- // case T1, T2: S1 // >1 (y := x)
- // case nil: SN // nil (y := x)
- // default: SD // 0 types (y := x)
- // case T3: S3 // 1 type (y := x.(T3))
- // }
- //
- // ...s.Init...
- // x := eval x
- // .caseT1:
- // t1, ok1 := typeswitch,ok x
- // if ok1 then goto S1 else goto .caseT2
- // .caseT2:
- // t2, ok2 := typeswitch,ok x
- // if ok2 then goto S1 else goto .caseNil
- // .S1:
- // y := x
- // ...S1...
- // goto done
- // .caseNil:
- // if t2, ok2 := typeswitch,ok x
- // if x == nil then goto SN else goto .caseT3
- // .SN:
- // y := x
- // ...SN...
- // goto done
- // .caseT3:
- // t3, ok3 := typeswitch,ok x
- // if ok3 then goto S3 else goto default
- // .S3:
- // y := t3
- // ...S3...
- // goto done
- // .default:
- // y := x
- // ...SD...
- // goto done
- // .done:
-
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
-
- var x Value
- switch ass := s.Assign.(type) {
- case *ast.ExprStmt: // x.(type)
- x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X)
- case *ast.AssignStmt: // y := x.(type)
- x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
- }
-
- done := fn.newBasicBlock("typeswitch.done")
- if label != nil {
- label._break = done
- }
- var default_ *ast.CaseClause
- for _, clause := range s.Body.List {
- cc := clause.(*ast.CaseClause)
- if cc.List == nil {
- default_ = cc
- continue
- }
- body := fn.newBasicBlock("typeswitch.body")
- var next *BasicBlock
- var casetype types.Type
- var ti Value // ti, ok := typeassert,ok x
- for _, cond := range cc.List {
- next = fn.newBasicBlock("typeswitch.next")
- casetype = fn.Pkg.typeOf(cond)
- var condv Value
- if casetype == tUntypedNil {
- condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos)
- ti = x
- } else {
- yok := emitTypeTest(fn, x, casetype, cc.Case)
- ti = emitExtract(fn, yok, 0)
- condv = emitExtract(fn, yok, 1)
- }
- emitIf(fn, condv, body, next)
- fn.currentBlock = next
- }
- if len(cc.List) != 1 {
- ti = x
- }
- fn.currentBlock = body
- b.typeCaseBody(fn, cc, ti, done)
- fn.currentBlock = next
- }
- if default_ != nil {
- b.typeCaseBody(fn, default_, x, done)
- } else {
- emitJump(fn, done)
- }
- fn.currentBlock = done
-}
-
-func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) {
- if obj := fn.Pkg.info.Implicits[cc]; obj != nil {
- // In a switch y := x.(type), each case clause
- // implicitly declares a distinct object y.
- // In a single-type case, y has that type.
- // In multi-type cases, 'case nil' and default,
- // y has the same type as the interface operand.
- emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos())
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, cc.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
-}
-
-// selectStmt emits to fn code for the select statement s, optionally
-// labelled by label.
-//
-func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) {
- // A blocking select of a single case degenerates to a
- // simple send or receive.
- // TODO(adonovan): opt: is this optimization worth its weight?
- if len(s.Body.List) == 1 {
- clause := s.Body.List[0].(*ast.CommClause)
- if clause.Comm != nil {
- b.stmt(fn, clause.Comm)
- done := fn.newBasicBlock("select.done")
- if label != nil {
- label._break = done
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, clause.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = done
- return
- }
- }
-
- // First evaluate all channels in all cases, and find
- // the directions of each state.
- var states []*SelectState
- blocking := true
- debugInfo := fn.debugInfo()
- for _, clause := range s.Body.List {
- var st *SelectState
- switch comm := clause.(*ast.CommClause).Comm.(type) {
- case nil: // default case
- blocking = false
- continue
-
- case *ast.SendStmt: // ch<- i
- ch := b.expr(fn, comm.Chan)
- st = &SelectState{
- Dir: types.SendOnly,
- Chan: ch,
- Send: emitConv(fn, b.expr(fn, comm.Value),
- ch.Type().Underlying().(*types.Chan).Elem()),
- Pos: comm.Arrow,
- }
- if debugInfo {
- st.DebugNode = comm
- }
-
- case *ast.AssignStmt: // x := <-ch
- recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr)
- st = &SelectState{
- Dir: types.RecvOnly,
- Chan: b.expr(fn, recv.X),
- Pos: recv.OpPos,
- }
- if debugInfo {
- st.DebugNode = recv
- }
-
- case *ast.ExprStmt: // <-ch
- recv := unparen(comm.X).(*ast.UnaryExpr)
- st = &SelectState{
- Dir: types.RecvOnly,
- Chan: b.expr(fn, recv.X),
- Pos: recv.OpPos,
- }
- if debugInfo {
- st.DebugNode = recv
- }
- }
- states = append(states, st)
- }
-
- // We dispatch on the (fair) result of Select using a
- // sequential if-else chain, in effect:
- //
- // idx, recvOk, r0...r_n-1 := select(...)
- // if idx == 0 { // receive on channel 0 (first receive => r0)
- // x, ok := r0, recvOk
- // ...state0...
- // } else if v == 1 { // send on channel 1
- // ...state1...
- // } else {
- // ...default...
- // }
- sel := &Select{
- States: states,
- Blocking: blocking,
- }
- sel.setPos(s.Select)
- var vars []*types.Var
- vars = append(vars, varIndex, varOk)
- for _, st := range states {
- if st.Dir == types.RecvOnly {
- tElem := st.Chan.Type().Underlying().(*types.Chan).Elem()
- vars = append(vars, anonVar(tElem))
- }
- }
- sel.setType(types.NewTuple(vars...))
-
- fn.emit(sel)
- idx := emitExtract(fn, sel, 0)
-
- done := fn.newBasicBlock("select.done")
- if label != nil {
- label._break = done
- }
-
- var defaultBody *[]ast.Stmt
- state := 0
- r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV
- for _, cc := range s.Body.List {
- clause := cc.(*ast.CommClause)
- if clause.Comm == nil {
- defaultBody = &clause.Body
- continue
- }
- body := fn.newBasicBlock("select.body")
- next := fn.newBasicBlock("select.next")
- emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next)
- fn.currentBlock = body
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- switch comm := clause.Comm.(type) {
- case *ast.ExprStmt: // <-ch
- if debugInfo {
- v := emitExtract(fn, sel, r)
- emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
- }
- r++
-
- case *ast.AssignStmt: // x := <-states[state].Chan
- if comm.Tok == token.DEFINE {
- fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident))
- }
- x := b.addr(fn, comm.Lhs[0], false) // non-escaping
- v := emitExtract(fn, sel, r)
- if debugInfo {
- emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
- }
- x.store(fn, v)
-
- if len(comm.Lhs) == 2 { // x, ok := ...
- if comm.Tok == token.DEFINE {
- fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident))
- }
- ok := b.addr(fn, comm.Lhs[1], false) // non-escaping
- ok.store(fn, emitExtract(fn, sel, 1))
- }
- r++
- }
- b.stmtList(fn, clause.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, done)
- fn.currentBlock = next
- state++
- }
- if defaultBody != nil {
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- }
- b.stmtList(fn, *defaultBody)
- fn.targets = fn.targets.tail
- } else {
- // A blocking select must match some case.
- // (This should really be a runtime.errorString, not a string.)
- fn.emit(&Panic{
- X: emitConv(fn, stringConst("blocking select matched no case"), tEface),
- })
- fn.currentBlock = fn.newBasicBlock("unreachable")
- }
- emitJump(fn, done)
- fn.currentBlock = done
-}
-
-// forStmt emits to fn code for the for statement s, optionally
-// labelled by label.
-//
-func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) {
- // ...init...
- // jump loop
- // loop:
- // if cond goto body else done
- // body:
- // ...body...
- // jump post
- // post: (target of continue)
- // ...post...
- // jump loop
- // done: (target of break)
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- body := fn.newBasicBlock("for.body")
- done := fn.newBasicBlock("for.done") // target of 'break'
- loop := body // target of back-edge
- if s.Cond != nil {
- loop = fn.newBasicBlock("for.loop")
- }
- cont := loop // target of 'continue'
- if s.Post != nil {
- cont = fn.newBasicBlock("for.post")
- }
- if label != nil {
- label._break = done
- label._continue = cont
- }
- emitJump(fn, loop)
- fn.currentBlock = loop
- if loop != body {
- b.cond(fn, s.Cond, body, done)
- fn.currentBlock = body
- }
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _continue: cont,
- }
- b.stmt(fn, s.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, cont)
-
- if s.Post != nil {
- fn.currentBlock = cont
- b.stmt(fn, s.Post)
- emitJump(fn, loop) // back-edge
- }
- fn.currentBlock = done
-}
-
-// rangeIndexed emits to fn the header for an integer-indexed loop
-// over array, *array or slice value x.
-// The v result is defined only if tv is non-nil.
-// forPos is the position of the "for" token.
-//
-func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
- //
- // length = len(x)
- // index = -1
- // loop: (target of continue)
- // index++
- // if index < length goto body else done
- // body:
- // k = index
- // v = x[index]
- // ...body...
- // jump loop
- // done: (target of break)
-
- // Determine number of iterations.
- var length Value
- if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok {
- // For array or *array, the number of iterations is
- // known statically thanks to the type. We avoid a
- // data dependence upon x, permitting later dead-code
- // elimination if x is pure, static unrolling, etc.
- // Ranging over a nil *array may have >0 iterations.
- // We still generate code for x, in case it has effects.
- length = intConst(arr.Len())
- } else {
- // length = len(x).
- var c Call
- c.Call.Value = makeLen(x.Type())
- c.Call.Args = []Value{x}
- c.setType(tInt)
- length = fn.emit(&c)
- }
-
- index := fn.addLocal(tInt, token.NoPos)
- emitStore(fn, index, intConst(-1), pos)
-
- loop = fn.newBasicBlock("rangeindex.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
-
- incr := &BinOp{
- Op: token.ADD,
- X: emitLoad(fn, index),
- Y: vOne,
- }
- incr.setType(tInt)
- emitStore(fn, index, fn.emit(incr), pos)
-
- body := fn.newBasicBlock("rangeindex.body")
- done = fn.newBasicBlock("rangeindex.done")
- emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done)
- fn.currentBlock = body
-
- k = emitLoad(fn, index)
- if tv != nil {
- switch t := x.Type().Underlying().(type) {
- case *types.Array:
- instr := &Index{
- X: x,
- Index: k,
- }
- instr.setType(t.Elem())
- v = fn.emit(instr)
-
- case *types.Pointer: // *array
- instr := &IndexAddr{
- X: x,
- Index: k,
- }
- instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()))
- v = emitLoad(fn, fn.emit(instr))
-
- case *types.Slice:
- instr := &IndexAddr{
- X: x,
- Index: k,
- }
- instr.setType(types.NewPointer(t.Elem()))
- v = emitLoad(fn, fn.emit(instr))
-
- default:
- panic("rangeIndexed x:" + t.String())
- }
- }
- return
-}
-
-// rangeIter emits to fn the header for a loop using
-// Range/Next/Extract to iterate over map or string value x.
-// tk and tv are the types of the key/value results k and v, or nil
-// if the respective component is not wanted.
-//
-func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
- //
- // it = range x
- // loop: (target of continue)
- // okv = next it (ok, key, value)
- // ok = extract okv #0
- // if ok goto body else done
- // body:
- // k = extract okv #1
- // v = extract okv #2
- // ...body...
- // jump loop
- // done: (target of break)
- //
-
- if tk == nil {
- tk = tInvalid
- }
- if tv == nil {
- tv = tInvalid
- }
-
- rng := &Range{X: x}
- rng.setPos(pos)
- rng.setType(tRangeIter)
- it := fn.emit(rng)
-
- loop = fn.newBasicBlock("rangeiter.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
-
- _, isString := x.Type().Underlying().(*types.Basic)
-
- okv := &Next{
- Iter: it,
- IsString: isString,
- }
- okv.setType(types.NewTuple(
- varOk,
- newVar("k", tk),
- newVar("v", tv),
- ))
- fn.emit(okv)
-
- body := fn.newBasicBlock("rangeiter.body")
- done = fn.newBasicBlock("rangeiter.done")
- emitIf(fn, emitExtract(fn, okv, 0), body, done)
- fn.currentBlock = body
-
- if tk != tInvalid {
- k = emitExtract(fn, okv, 1)
- }
- if tv != tInvalid {
- v = emitExtract(fn, okv, 2)
- }
- return
-}
-
-// rangeChan emits to fn the header for a loop that receives from
-// channel x until it fails.
-// tk is the channel's element type, or nil if the k result is
-// not wanted
-// pos is the position of the '=' or ':=' token.
-//
-func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) {
- //
- // loop: (target of continue)
- // ko = <-x (key, ok)
- // ok = extract ko #1
- // if ok goto body else done
- // body:
- // k = extract ko #0
- // ...
- // goto loop
- // done: (target of break)
-
- loop = fn.newBasicBlock("rangechan.loop")
- emitJump(fn, loop)
- fn.currentBlock = loop
- recv := &UnOp{
- Op: token.ARROW,
- X: x,
- CommaOk: true,
- }
- recv.setPos(pos)
- recv.setType(types.NewTuple(
- newVar("k", x.Type().Underlying().(*types.Chan).Elem()),
- varOk,
- ))
- ko := fn.emit(recv)
- body := fn.newBasicBlock("rangechan.body")
- done = fn.newBasicBlock("rangechan.done")
- emitIf(fn, emitExtract(fn, ko, 1), body, done)
- fn.currentBlock = body
- if tk != nil {
- k = emitExtract(fn, ko, 0)
- }
- return
-}
-
-// rangeStmt emits to fn code for the range statement s, optionally
-// labelled by label.
-//
-func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) {
- var tk, tv types.Type
- if s.Key != nil && !isBlankIdent(s.Key) {
- tk = fn.Pkg.typeOf(s.Key)
- }
- if s.Value != nil && !isBlankIdent(s.Value) {
- tv = fn.Pkg.typeOf(s.Value)
- }
-
- // If iteration variables are defined (:=), this
- // occurs once outside the loop.
- //
- // Unlike a short variable declaration, a RangeStmt
- // using := never redeclares an existing variable; it
- // always creates a new one.
- if s.Tok == token.DEFINE {
- if tk != nil {
- fn.addLocalForIdent(s.Key.(*ast.Ident))
- }
- if tv != nil {
- fn.addLocalForIdent(s.Value.(*ast.Ident))
- }
- }
-
- x := b.expr(fn, s.X)
-
- var k, v Value
- var loop, done *BasicBlock
- switch rt := x.Type().Underlying().(type) {
- case *types.Slice, *types.Array, *types.Pointer: // *array
- k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For)
-
- case *types.Chan:
- k, loop, done = b.rangeChan(fn, x, tk, s.For)
-
- case *types.Map, *types.Basic: // string
- k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For)
-
- default:
- panic("Cannot range over: " + rt.String())
- }
-
- // Evaluate both LHS expressions before we update either.
- var kl, vl lvalue
- if tk != nil {
- kl = b.addr(fn, s.Key, false) // non-escaping
- }
- if tv != nil {
- vl = b.addr(fn, s.Value, false) // non-escaping
- }
- if tk != nil {
- kl.store(fn, k)
- }
- if tv != nil {
- vl.store(fn, v)
- }
-
- if label != nil {
- label._break = done
- label._continue = loop
- }
-
- fn.targets = &targets{
- tail: fn.targets,
- _break: done,
- _continue: loop,
- }
- b.stmt(fn, s.Body)
- fn.targets = fn.targets.tail
- emitJump(fn, loop) // back-edge
- fn.currentBlock = done
-}
-
-// stmt lowers statement s to SSA form, emitting code to fn.
-func (b *builder) stmt(fn *Function, _s ast.Stmt) {
- // The label of the current statement. If non-nil, its _goto
- // target is always set; its _break and _continue are set only
- // within the body of switch/typeswitch/select/for/range.
- // It is effectively an additional default-nil parameter of stmt().
- var label *lblock
-start:
- switch s := _s.(type) {
- case *ast.EmptyStmt:
- // ignore. (Usually removed by gofmt.)
-
- case *ast.DeclStmt: // Con, Var or Typ
- d := s.Decl.(*ast.GenDecl)
- if d.Tok == token.VAR {
- for _, spec := range d.Specs {
- if vs, ok := spec.(*ast.ValueSpec); ok {
- b.localValueSpec(fn, vs)
- }
- }
- }
-
- case *ast.LabeledStmt:
- label = fn.labelledBlock(s.Label)
- emitJump(fn, label._goto)
- fn.currentBlock = label._goto
- _s = s.Stmt
- goto start // effectively: tailcall stmt(fn, s.Stmt, label)
-
- case *ast.ExprStmt:
- b.expr(fn, s.X)
-
- case *ast.SendStmt:
- fn.emit(&Send{
- Chan: b.expr(fn, s.Chan),
- X: emitConv(fn, b.expr(fn, s.Value),
- fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()),
- pos: s.Arrow,
- })
-
- case *ast.IncDecStmt:
- op := token.ADD
- if s.Tok == token.DEC {
- op = token.SUB
- }
- loc := b.addr(fn, s.X, false)
- b.assignOp(fn, loc, NewConst(exact.MakeInt64(1), loc.typ()), op, s.Pos())
-
- case *ast.AssignStmt:
- switch s.Tok {
- case token.ASSIGN, token.DEFINE:
- b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE)
-
- default: // +=, etc.
- op := s.Tok + token.ADD - token.ADD_ASSIGN
- b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op, s.Pos())
- }
-
- case *ast.GoStmt:
- // The "intrinsics" new/make/len/cap are forbidden here.
- // panic is treated like an ordinary function call.
- v := Go{pos: s.Go}
- b.setCall(fn, s.Call, &v.Call)
- fn.emit(&v)
-
- case *ast.DeferStmt:
- // The "intrinsics" new/make/len/cap are forbidden here.
- // panic is treated like an ordinary function call.
- v := Defer{pos: s.Defer}
- b.setCall(fn, s.Call, &v.Call)
- fn.emit(&v)
-
- // A deferred call can cause recovery from panic,
- // and control resumes at the Recover block.
- createRecoverBlock(fn)
-
- case *ast.ReturnStmt:
- var results []Value
- if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 {
- // Return of one expression in a multi-valued function.
- tuple := b.exprN(fn, s.Results[0])
- ttuple := tuple.Type().(*types.Tuple)
- for i, n := 0, ttuple.Len(); i < n; i++ {
- results = append(results,
- emitConv(fn, emitExtract(fn, tuple, i),
- fn.Signature.Results().At(i).Type()))
- }
- } else {
- // 1:1 return, or no-arg return in non-void function.
- for i, r := range s.Results {
- v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type())
- results = append(results, v)
- }
- }
- if fn.namedResults != nil {
- // Function has named result parameters (NRPs).
- // Perform parallel assignment of return operands to NRPs.
- for i, r := range results {
- emitStore(fn, fn.namedResults[i], r, s.Return)
- }
- }
- // Run function calls deferred in this
- // function when explicitly returning from it.
- fn.emit(new(RunDefers))
- if fn.namedResults != nil {
- // Reload NRPs to form the result tuple.
- results = results[:0]
- for _, r := range fn.namedResults {
- results = append(results, emitLoad(fn, r))
- }
- }
- fn.emit(&Return{Results: results, pos: s.Return})
- fn.currentBlock = fn.newBasicBlock("unreachable")
-
- case *ast.BranchStmt:
- var block *BasicBlock
- switch s.Tok {
- case token.BREAK:
- if s.Label != nil {
- block = fn.labelledBlock(s.Label)._break
- } else {
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._break
- }
- }
-
- case token.CONTINUE:
- if s.Label != nil {
- block = fn.labelledBlock(s.Label)._continue
- } else {
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._continue
- }
- }
-
- case token.FALLTHROUGH:
- for t := fn.targets; t != nil && block == nil; t = t.tail {
- block = t._fallthrough
- }
-
- case token.GOTO:
- block = fn.labelledBlock(s.Label)._goto
- }
- emitJump(fn, block)
- fn.currentBlock = fn.newBasicBlock("unreachable")
-
- case *ast.BlockStmt:
- b.stmtList(fn, s.List)
-
- case *ast.IfStmt:
- if s.Init != nil {
- b.stmt(fn, s.Init)
- }
- then := fn.newBasicBlock("if.then")
- done := fn.newBasicBlock("if.done")
- els := done
- if s.Else != nil {
- els = fn.newBasicBlock("if.else")
- }
- b.cond(fn, s.Cond, then, els)
- fn.currentBlock = then
- b.stmt(fn, s.Body)
- emitJump(fn, done)
-
- if s.Else != nil {
- fn.currentBlock = els
- b.stmt(fn, s.Else)
- emitJump(fn, done)
- }
-
- fn.currentBlock = done
-
- case *ast.SwitchStmt:
- b.switchStmt(fn, s, label)
-
- case *ast.TypeSwitchStmt:
- b.typeSwitchStmt(fn, s, label)
-
- case *ast.SelectStmt:
- b.selectStmt(fn, s, label)
-
- case *ast.ForStmt:
- b.forStmt(fn, s, label)
-
- case *ast.RangeStmt:
- b.rangeStmt(fn, s, label)
-
- default:
- panic(fmt.Sprintf("unexpected statement kind: %T", s))
- }
-}
-
-// buildFunction builds SSA code for the body of function fn. Idempotent.
-func (b *builder) buildFunction(fn *Function) {
- if fn.Blocks != nil {
- return // building already started
- }
-
- var recvField *ast.FieldList
- var body *ast.BlockStmt
- var functype *ast.FuncType
- switch n := fn.syntax.(type) {
- case nil:
- return // not a Go source function. (Synthetic, or from object file.)
- case *ast.FuncDecl:
- functype = n.Type
- recvField = n.Recv
- body = n.Body
- case *ast.FuncLit:
- functype = n.Type
- body = n.Body
- default:
- panic(n)
- }
-
- if body == nil {
- // External function.
- if fn.Params == nil {
- // This condition ensures we add a non-empty
- // params list once only, but we may attempt
- // the degenerate empty case repeatedly.
- // TODO(adonovan): opt: don't do that.
-
- // We set Function.Params even though there is no body
- // code to reference them. This simplifies clients.
- if recv := fn.Signature.Recv(); recv != nil {
- fn.addParamObj(recv)
- }
- params := fn.Signature.Params()
- for i, n := 0, params.Len(); i < n; i++ {
- fn.addParamObj(params.At(i))
- }
- }
- return
- }
- if fn.Prog.mode&LogSource != 0 {
- defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))()
- }
- fn.startBody()
- fn.createSyntacticParams(recvField, functype)
- b.stmt(fn, body)
- if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) {
- // Control fell off the end of the function's body block.
- //
- // Block optimizations eliminate the current block, if
- // unreachable. It is a builder invariant that
- // if this no-arg return is ill-typed for
- // fn.Signature.Results, this block must be
- // unreachable. The sanity checker checks this.
- fn.emit(new(RunDefers))
- fn.emit(new(Return))
- }
- fn.finishBody()
-}
-
-// buildFuncDecl builds SSA code for the function or method declared
-// by decl in package pkg.
-//
-func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) {
- id := decl.Name
- if isBlankIdent(id) {
- return // discard
- }
- fn := pkg.values[pkg.info.Defs[id]].(*Function)
- if decl.Recv == nil && id.Name == "init" {
- var v Call
- v.Call.Value = fn
- v.setType(types.NewTuple())
- pkg.init.emit(&v)
- }
- b.buildFunction(fn)
-}
-
-// Build calls Package.Build for each package in prog.
-// Building occurs in parallel unless the BuildSerially mode flag was set.
-//
-// Build is intended for whole-program analysis; a typical compiler
-// need only build a single package.
-//
-// Build is idempotent and thread-safe.
-//
-func (prog *Program) Build() {
- var wg sync.WaitGroup
- for _, p := range prog.packages {
- if prog.mode&BuildSerially != 0 {
- p.Build()
- } else {
- wg.Add(1)
- go func(p *Package) {
- p.Build()
- wg.Done()
- }(p)
- }
- }
- wg.Wait()
-}
-
-// Build builds SSA code for all functions and vars in package p.
-//
-// Precondition: CreatePackage must have been called for all of p's
-// direct imports (and hence its direct imports must have been
-// error-free).
-//
-// Build is idempotent and thread-safe.
-//
-func (p *Package) Build() { p.buildOnce.Do(p.build) }
-
-func (p *Package) build() {
- if p.info == nil {
- return // synthetic package, e.g. "testmain"
- }
- if p.files == nil {
- p.info = nil
- return // package loaded from export data
- }
-
- // Ensure we have runtime type info for all exported members.
- // TODO(adonovan): ideally belongs in memberFromObject, but
- // that would require package creation in topological order.
- for name, mem := range p.Members {
- if ast.IsExported(name) {
- p.Prog.needMethodsOf(mem.Type())
- }
- }
- if p.Prog.mode&LogSource != 0 {
- defer logStack("build %s", p)()
- }
- init := p.init
- init.startBody()
-
- var done *BasicBlock
-
- if p.Prog.mode&BareInits == 0 {
- // Make init() skip if package is already initialized.
- initguard := p.Var("init$guard")
- doinit := init.newBasicBlock("init.start")
- done = init.newBasicBlock("init.done")
- emitIf(init, emitLoad(init, initguard), done, doinit)
- init.currentBlock = doinit
- emitStore(init, initguard, vTrue, token.NoPos)
-
- // Call the init() function of each package we import.
- for _, pkg := range p.Pkg.Imports() {
- prereq := p.Prog.packages[pkg]
- if prereq == nil {
- panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path()))
- }
- var v Call
- v.Call.Value = prereq.init
- v.Call.pos = init.pos
- v.setType(types.NewTuple())
- init.emit(&v)
- }
- }
-
- var b builder
-
- // Initialize package-level vars in correct order.
- for _, varinit := range p.info.InitOrder {
- if init.Prog.mode&LogSource != 0 {
- fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n",
- varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos()))
- }
- if len(varinit.Lhs) == 1 {
- // 1:1 initialization: var x, y = a(), b()
- var lval lvalue
- if v := varinit.Lhs[0]; v.Name() != "_" {
- lval = &address{addr: p.values[v].(*Global), pos: v.Pos()}
- } else {
- lval = blank{}
- }
- b.assign(init, lval, varinit.Rhs, true, nil)
- } else {
- // n:1 initialization: var x, y := f()
- tuple := b.exprN(init, varinit.Rhs)
- for i, v := range varinit.Lhs {
- if v.Name() == "_" {
- continue
- }
- emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos())
- }
- }
- }
-
- // Build all package-level functions, init functions
- // and methods, including unreachable/blank ones.
- // We build them in source order, but it's not significant.
- for _, file := range p.files {
- for _, decl := range file.Decls {
- if decl, ok := decl.(*ast.FuncDecl); ok {
- b.buildFuncDecl(p, decl)
- }
- }
- }
-
- // Finish up init().
- if p.Prog.mode&BareInits == 0 {
- emitJump(init, done)
- init.currentBlock = done
- }
- init.emit(new(Return))
- init.finishBody()
-
- p.info = nil // We no longer need ASTs or go/types deductions.
-
- if p.Prog.mode&SanityCheckFunctions != 0 {
- sanityCheckPackage(p)
- }
-}
-
-// Like ObjectOf, but panics instead of returning nil.
-// Only valid during p's create and build phases.
-func (p *Package) objectOf(id *ast.Ident) types.Object {
- if o := p.info.ObjectOf(id); o != nil {
- return o
- }
- panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s",
- id.Name, p.Prog.Fset.Position(id.Pos())))
-}
-
-// Like TypeOf, but panics instead of returning nil.
-// Only valid during p's create and build phases.
-func (p *Package) typeOf(e ast.Expr) types.Type {
- if T := p.info.TypeOf(e); T != nil {
- return T
- }
- panic(fmt.Sprintf("no type for %T @ %s",
- e, p.Prog.Fset.Position(e.Pos())))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/const.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/const.go
deleted file mode 100644
index 3606e0fae..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/const.go
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.6
-
-package ssa
-
-// This file defines the Const SSA value type.
-
-import (
- "fmt"
- exact "go/constant"
- "go/token"
- "go/types"
- "strconv"
-)
-
-// NewConst returns a new constant of the specified value and type.
-// val must be valid according to the specification of Const.Value.
-//
-func NewConst(val exact.Value, typ types.Type) *Const {
- return &Const{typ, val}
-}
-
-// intConst returns an 'int' constant that evaluates to i.
-// (i is an int64 in case the host is narrower than the target.)
-func intConst(i int64) *Const {
- return NewConst(exact.MakeInt64(i), tInt)
-}
-
-// nilConst returns a nil constant of the specified type, which may
-// be any reference type, including interfaces.
-//
-func nilConst(typ types.Type) *Const {
- return NewConst(nil, typ)
-}
-
-// stringConst returns a 'string' constant that evaluates to s.
-func stringConst(s string) *Const {
- return NewConst(exact.MakeString(s), tString)
-}
-
-// zeroConst returns a new "zero" constant of the specified type,
-// which must not be an array or struct type: the zero values of
-// aggregates are well-defined but cannot be represented by Const.
-//
-func zeroConst(t types.Type) *Const {
- switch t := t.(type) {
- case *types.Basic:
- switch {
- case t.Info()&types.IsBoolean != 0:
- return NewConst(exact.MakeBool(false), t)
- case t.Info()&types.IsNumeric != 0:
- return NewConst(exact.MakeInt64(0), t)
- case t.Info()&types.IsString != 0:
- return NewConst(exact.MakeString(""), t)
- case t.Kind() == types.UnsafePointer:
- fallthrough
- case t.Kind() == types.UntypedNil:
- return nilConst(t)
- default:
- panic(fmt.Sprint("zeroConst for unexpected type:", t))
- }
- case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature:
- return nilConst(t)
- case *types.Named:
- return NewConst(zeroConst(t.Underlying()).Value, t)
- case *types.Array, *types.Struct, *types.Tuple:
- panic(fmt.Sprint("zeroConst applied to aggregate:", t))
- }
- panic(fmt.Sprint("zeroConst: unexpected ", t))
-}
-
-func (c *Const) RelString(from *types.Package) string {
- var s string
- if c.Value == nil {
- s = "nil"
- } else if c.Value.Kind() == exact.String {
- s = exact.StringVal(c.Value)
- const max = 20
- // TODO(adonovan): don't cut a rune in half.
- if len(s) > max {
- s = s[:max-3] + "..." // abbreviate
- }
- s = strconv.Quote(s)
- } else {
- s = c.Value.String()
- }
- return s + ":" + relType(c.Type(), from)
-}
-
-func (c *Const) Name() string {
- return c.RelString(nil)
-}
-
-func (c *Const) String() string {
- return c.Name()
-}
-
-func (c *Const) Type() types.Type {
- return c.typ
-}
-
-func (c *Const) Referrers() *[]Instruction {
- return nil
-}
-
-func (c *Const) Parent() *Function { return nil }
-
-func (c *Const) Pos() token.Pos {
- return token.NoPos
-}
-
-// IsNil returns true if this constant represents a typed or untyped nil value.
-func (c *Const) IsNil() bool {
- return c.Value == nil
-}
-
-// TODO(adonovan): move everything below into honnef.co/go/tools/ssa/interp.
-
-// Int64 returns the numeric value of this constant truncated to fit
-// a signed 64-bit integer.
-//
-func (c *Const) Int64() int64 {
- switch x := exact.ToInt(c.Value); x.Kind() {
- case exact.Int:
- if i, ok := exact.Int64Val(x); ok {
- return i
- }
- return 0
- case exact.Float:
- f, _ := exact.Float64Val(x)
- return int64(f)
- }
- panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Uint64 returns the numeric value of this constant truncated to fit
-// an unsigned 64-bit integer.
-//
-func (c *Const) Uint64() uint64 {
- switch x := exact.ToInt(c.Value); x.Kind() {
- case exact.Int:
- if u, ok := exact.Uint64Val(x); ok {
- return u
- }
- return 0
- case exact.Float:
- f, _ := exact.Float64Val(x)
- return uint64(f)
- }
- panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Float64 returns the numeric value of this constant truncated to fit
-// a float64.
-//
-func (c *Const) Float64() float64 {
- f, _ := exact.Float64Val(c.Value)
- return f
-}
-
-// Complex128 returns the complex value of this constant truncated to
-// fit a complex128.
-//
-func (c *Const) Complex128() complex128 {
- re, _ := exact.Float64Val(exact.Real(c.Value))
- im, _ := exact.Float64Val(exact.Imag(c.Value))
- return complex(re, im)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/const15.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/const15.go
deleted file mode 100644
index 49b53337b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/const15.go
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5,!go1.6
-
-package ssa
-
-// This file defines the Const SSA value type.
-
-import (
- "fmt"
- exact "go/constant"
- "go/token"
- "go/types"
- "strconv"
-)
-
-// NewConst returns a new constant of the specified value and type.
-// val must be valid according to the specification of Const.Value.
-//
-func NewConst(val exact.Value, typ types.Type) *Const {
- return &Const{typ, val}
-}
-
-// intConst returns an 'int' constant that evaluates to i.
-// (i is an int64 in case the host is narrower than the target.)
-func intConst(i int64) *Const {
- return NewConst(exact.MakeInt64(i), tInt)
-}
-
-// nilConst returns a nil constant of the specified type, which may
-// be any reference type, including interfaces.
-//
-func nilConst(typ types.Type) *Const {
- return NewConst(nil, typ)
-}
-
-// stringConst returns a 'string' constant that evaluates to s.
-func stringConst(s string) *Const {
- return NewConst(exact.MakeString(s), tString)
-}
-
-// zeroConst returns a new "zero" constant of the specified type,
-// which must not be an array or struct type: the zero values of
-// aggregates are well-defined but cannot be represented by Const.
-//
-func zeroConst(t types.Type) *Const {
- switch t := t.(type) {
- case *types.Basic:
- switch {
- case t.Info()&types.IsBoolean != 0:
- return NewConst(exact.MakeBool(false), t)
- case t.Info()&types.IsNumeric != 0:
- return NewConst(exact.MakeInt64(0), t)
- case t.Info()&types.IsString != 0:
- return NewConst(exact.MakeString(""), t)
- case t.Kind() == types.UnsafePointer:
- fallthrough
- case t.Kind() == types.UntypedNil:
- return nilConst(t)
- default:
- panic(fmt.Sprint("zeroConst for unexpected type:", t))
- }
- case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature:
- return nilConst(t)
- case *types.Named:
- return NewConst(zeroConst(t.Underlying()).Value, t)
- case *types.Array, *types.Struct, *types.Tuple:
- panic(fmt.Sprint("zeroConst applied to aggregate:", t))
- }
- panic(fmt.Sprint("zeroConst: unexpected ", t))
-}
-
-func (c *Const) RelString(from *types.Package) string {
- var s string
- if c.Value == nil {
- s = "nil"
- } else if c.Value.Kind() == exact.String {
- s = exact.StringVal(c.Value)
- const max = 20
- // TODO(adonovan): don't cut a rune in half.
- if len(s) > max {
- s = s[:max-3] + "..." // abbreviate
- }
- s = strconv.Quote(s)
- } else {
- s = c.Value.String()
- }
- return s + ":" + relType(c.Type(), from)
-}
-
-func (c *Const) Name() string {
- return c.RelString(nil)
-}
-
-func (c *Const) String() string {
- return c.Name()
-}
-
-func (c *Const) Type() types.Type {
- return c.typ
-}
-
-func (c *Const) Referrers() *[]Instruction {
- return nil
-}
-
-func (c *Const) Parent() *Function { return nil }
-
-func (c *Const) Pos() token.Pos {
- return token.NoPos
-}
-
-// IsNil returns true if this constant represents a typed or untyped nil value.
-func (c *Const) IsNil() bool {
- return c.Value == nil
-}
-
-// TODO(adonovan): move everything below into honnef.co/go/tools/ssa/interp.
-
-// Int64 returns the numeric value of this constant truncated to fit
-// a signed 64-bit integer.
-//
-func (c *Const) Int64() int64 {
- switch x := c.Value; x.Kind() {
- case exact.Int:
- if i, ok := exact.Int64Val(x); ok {
- return i
- }
- return 0
- case exact.Float:
- f, _ := exact.Float64Val(x)
- return int64(f)
- }
- panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Uint64 returns the numeric value of this constant truncated to fit
-// an unsigned 64-bit integer.
-//
-func (c *Const) Uint64() uint64 {
- switch x := c.Value; x.Kind() {
- case exact.Int:
- if u, ok := exact.Uint64Val(x); ok {
- return u
- }
- return 0
- case exact.Float:
- f, _ := exact.Float64Val(x)
- return uint64(f)
- }
- panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Float64 returns the numeric value of this constant truncated to fit
-// a float64.
-//
-func (c *Const) Float64() float64 {
- f, _ := exact.Float64Val(c.Value)
- return f
-}
-
-// Complex128 returns the complex value of this constant truncated to
-// fit a complex128.
-//
-func (c *Const) Complex128() complex128 {
- re, _ := exact.Float64Val(exact.Real(c.Value))
- im, _ := exact.Float64Val(exact.Imag(c.Value))
- return complex(re, im)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/create.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/create.go
deleted file mode 100644
index 69ac12b1b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/create.go
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the CREATE phase of SSA construction.
-// See builder.go for explanation.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "os"
- "sync"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// NewProgram returns a new SSA Program.
-//
-// mode controls diagnostics and checking during SSA construction.
-//
-func NewProgram(fset *token.FileSet, mode BuilderMode) *Program {
- prog := &Program{
- Fset: fset,
- imported: make(map[string]*Package),
- packages: make(map[*types.Package]*Package),
- thunks: make(map[selectionKey]*Function),
- bounds: make(map[*types.Func]*Function),
- mode: mode,
- }
-
- h := typeutil.MakeHasher() // protected by methodsMu, in effect
- prog.methodSets.SetHasher(h)
- prog.canon.SetHasher(h)
-
- return prog
-}
-
-// memberFromObject populates package pkg with a member for the
-// typechecker object obj.
-//
-// For objects from Go source code, syntax is the associated syntax
-// tree (for funcs and vars only); it will be used during the build
-// phase.
-//
-func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
- name := obj.Name()
- switch obj := obj.(type) {
- case *types.Builtin:
- if pkg.Pkg != types.Unsafe {
- panic("unexpected builtin object: " + obj.String())
- }
-
- case *types.TypeName:
- pkg.Members[name] = &Type{
- object: obj,
- pkg: pkg,
- }
-
- case *types.Const:
- c := &NamedConst{
- object: obj,
- Value: NewConst(obj.Val(), obj.Type()),
- pkg: pkg,
- }
- pkg.values[obj] = c.Value
- pkg.Members[name] = c
-
- case *types.Var:
- g := &Global{
- Pkg: pkg,
- name: name,
- object: obj,
- typ: types.NewPointer(obj.Type()), // address
- pos: obj.Pos(),
- }
- pkg.values[obj] = g
- pkg.Members[name] = g
-
- case *types.Func:
- sig := obj.Type().(*types.Signature)
- if sig.Recv() == nil && name == "init" {
- pkg.ninit++
- name = fmt.Sprintf("init#%d", pkg.ninit)
- }
- fn := &Function{
- name: name,
- object: obj,
- Signature: sig,
- syntax: syntax,
- pos: obj.Pos(),
- Pkg: pkg,
- Prog: pkg.Prog,
- }
- if syntax == nil {
- fn.Synthetic = "loaded from gc object file"
- }
-
- pkg.values[obj] = fn
- if sig.Recv() == nil {
- pkg.Members[name] = fn // package-level function
- }
-
- default: // (incl. *types.Package)
- panic("unexpected Object type: " + obj.String())
- }
-}
-
-// membersFromDecl populates package pkg with members for each
-// typechecker object (var, func, const or type) associated with the
-// specified decl.
-//
-func membersFromDecl(pkg *Package, decl ast.Decl) {
- switch decl := decl.(type) {
- case *ast.GenDecl: // import, const, type or var
- switch decl.Tok {
- case token.CONST:
- for _, spec := range decl.Specs {
- for _, id := range spec.(*ast.ValueSpec).Names {
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], nil)
- }
- }
- }
-
- case token.VAR:
- for _, spec := range decl.Specs {
- for _, id := range spec.(*ast.ValueSpec).Names {
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], spec)
- }
- }
- }
-
- case token.TYPE:
- for _, spec := range decl.Specs {
- id := spec.(*ast.TypeSpec).Name
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], nil)
- }
- }
- }
-
- case *ast.FuncDecl:
- id := decl.Name
- if !isBlankIdent(id) {
- memberFromObject(pkg, pkg.info.Defs[id], decl)
- }
- }
-}
-
-// CreatePackage constructs and returns an SSA Package from the
-// specified type-checked, error-free file ASTs, and populates its
-// Members mapping.
-//
-// importable determines whether this package should be returned by a
-// subsequent call to ImportedPackage(pkg.Path()).
-//
-// The real work of building SSA form for each function is not done
-// until a subsequent call to Package.Build().
-//
-func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package {
- p := &Package{
- Prog: prog,
- Members: make(map[string]Member),
- values: make(map[types.Object]Value),
- Pkg: pkg,
- info: info, // transient (CREATE and BUILD phases)
- files: files, // transient (CREATE and BUILD phases)
- }
-
- // Add init() function.
- p.init = &Function{
- name: "init",
- Signature: new(types.Signature),
- Synthetic: "package initializer",
- Pkg: p,
- Prog: prog,
- }
- p.Members[p.init.name] = p.init
-
- // CREATE phase.
- // Allocate all package members: vars, funcs, consts and types.
- if len(files) > 0 {
- // Go source package.
- for _, file := range files {
- for _, decl := range file.Decls {
- membersFromDecl(p, decl)
- }
- }
- } else {
- // GC-compiled binary package (or "unsafe")
- // No code.
- // No position information.
- scope := p.Pkg.Scope()
- for _, name := range scope.Names() {
- obj := scope.Lookup(name)
- memberFromObject(p, obj, nil)
- if obj, ok := obj.(*types.TypeName); ok {
- if named, ok := obj.Type().(*types.Named); ok {
- for i, n := 0, named.NumMethods(); i < n; i++ {
- memberFromObject(p, named.Method(i), nil)
- }
- }
- }
- }
- }
-
- if prog.mode&BareInits == 0 {
- // Add initializer guard variable.
- initguard := &Global{
- Pkg: p,
- name: "init$guard",
- typ: types.NewPointer(tBool),
- }
- p.Members[initguard.Name()] = initguard
- }
-
- if prog.mode&GlobalDebug != 0 {
- p.SetDebugMode(true)
- }
-
- if prog.mode&PrintPackages != 0 {
- printMu.Lock()
- p.WriteTo(os.Stdout)
- printMu.Unlock()
- }
-
- if importable {
- prog.imported[p.Pkg.Path()] = p
- }
- prog.packages[p.Pkg] = p
-
- return p
-}
-
-// printMu serializes printing of Packages/Functions to stdout.
-var printMu sync.Mutex
-
-// AllPackages returns a new slice containing all packages in the
-// program prog in unspecified order.
-//
-func (prog *Program) AllPackages() []*Package {
- pkgs := make([]*Package, 0, len(prog.packages))
- for _, pkg := range prog.packages {
- pkgs = append(pkgs, pkg)
- }
- return pkgs
-}
-
-// ImportedPackage returns the importable SSA Package whose import
-// path is path, or nil if no such SSA package has been created.
-//
-// Not all packages are importable. For example, no import
-// declaration can resolve to the x_test package created by 'go test'
-// or the ad-hoc main package created 'go build foo.go'.
-//
-func (prog *Program) ImportedPackage(path string) *Package {
- return prog.imported[path]
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/doc.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/doc.go
deleted file mode 100644
index 57474dd20..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/doc.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ssa defines a representation of the elements of Go programs
-// (packages, types, functions, variables and constants) using a
-// static single-assignment (SSA) form intermediate representation
-// (IR) for the bodies of functions.
-//
-// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
-//
-// For an introduction to SSA form, see
-// http://en.wikipedia.org/wiki/Static_single_assignment_form.
-// This page provides a broader reading list:
-// http://www.dcs.gla.ac.uk/~jsinger/ssa.html.
-//
-// The level of abstraction of the SSA form is intentionally close to
-// the source language to facilitate construction of source analysis
-// tools. It is not intended for machine code generation.
-//
-// All looping, branching and switching constructs are replaced with
-// unstructured control flow. Higher-level control flow constructs
-// such as multi-way branch can be reconstructed as needed; see
-// ssautil.Switches() for an example.
-//
-// To construct an SSA-form program, call ssautil.CreateProgram on a
-// loader.Program, a set of type-checked packages created from
-// parsed Go source files. The resulting ssa.Program contains all the
-// packages and their members, but SSA code is not created for
-// function bodies until a subsequent call to (*Package).Build.
-//
-// The builder initially builds a naive SSA form in which all local
-// variables are addresses of stack locations with explicit loads and
-// stores. Registerisation of eligible locals and φ-node insertion
-// using dominance and dataflow are then performed as a second pass
-// called "lifting" to improve the accuracy and performance of
-// subsequent analyses; this pass can be skipped by setting the
-// NaiveForm builder flag.
-//
-// The primary interfaces of this package are:
-//
-// - Member: a named member of a Go package.
-// - Value: an expression that yields a value.
-// - Instruction: a statement that consumes values and performs computation.
-// - Node: a Value or Instruction (emphasizing its membership in the SSA value graph)
-//
-// A computation that yields a result implements both the Value and
-// Instruction interfaces. The following table shows for each
-// concrete type which of these interfaces it implements.
-//
-// Value? Instruction? Member?
-// *Alloc ✔ ✔
-// *BinOp ✔ ✔
-// *Builtin ✔
-// *Call ✔ ✔
-// *ChangeInterface ✔ ✔
-// *ChangeType ✔ ✔
-// *Const ✔
-// *Convert ✔ ✔
-// *DebugRef ✔
-// *Defer ✔
-// *Extract ✔ ✔
-// *Field ✔ ✔
-// *FieldAddr ✔ ✔
-// *FreeVar ✔
-// *Function ✔ ✔ (func)
-// *Global ✔ ✔ (var)
-// *Go ✔
-// *If ✔
-// *Index ✔ ✔
-// *IndexAddr ✔ ✔
-// *Jump ✔
-// *Lookup ✔ ✔
-// *MakeChan ✔ ✔
-// *MakeClosure ✔ ✔
-// *MakeInterface ✔ ✔
-// *MakeMap ✔ ✔
-// *MakeSlice ✔ ✔
-// *MapUpdate ✔
-// *NamedConst ✔ (const)
-// *Next ✔ ✔
-// *Panic ✔
-// *Parameter ✔
-// *Phi ✔ ✔
-// *Range ✔ ✔
-// *Return ✔
-// *RunDefers ✔
-// *Select ✔ ✔
-// *Send ✔
-// *Slice ✔ ✔
-// *Store ✔
-// *Type ✔ (type)
-// *TypeAssert ✔ ✔
-// *UnOp ✔ ✔
-//
-// Other key types in this package include: Program, Package, Function
-// and BasicBlock.
-//
-// The program representation constructed by this package is fully
-// resolved internally, i.e. it does not rely on the names of Values,
-// Packages, Functions, Types or BasicBlocks for the correct
-// interpretation of the program. Only the identities of objects and
-// the topology of the SSA and type graphs are semantically
-// significant. (There is one exception: Ids, used to identify field
-// and method names, contain strings.) Avoidance of name-based
-// operations simplifies the implementation of subsequent passes and
-// can make them very efficient. Many objects are nonetheless named
-// to aid in debugging, but it is not essential that the names be
-// either accurate or unambiguous. The public API exposes a number of
-// name-based maps for client convenience.
-//
-// The ssa/ssautil package provides various utilities that depend only
-// on the public API of this package.
-//
-// TODO(adonovan): Consider the exceptional control-flow implications
-// of defer and recover().
-//
-// TODO(adonovan): write a how-to document for all the various cases
-// of trying to determine corresponding elements across the four
-// domains of source locations, ast.Nodes, types.Objects,
-// ssa.Values/Instructions.
-//
-package ssa // import "honnef.co/go/tools/ssa"
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/dom.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/dom.go
deleted file mode 100644
index 12ef4308f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/dom.go
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines algorithms related to dominance.
-
-// Dominator tree construction ----------------------------------------
-//
-// We use the algorithm described in Lengauer & Tarjan. 1979. A fast
-// algorithm for finding dominators in a flowgraph.
-// http://doi.acm.org/10.1145/357062.357071
-//
-// We also apply the optimizations to SLT described in Georgiadis et
-// al, Finding Dominators in Practice, JGAA 2006,
-// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf
-// to avoid the need for buckets of size > 1.
-
-import (
- "bytes"
- "fmt"
- "math/big"
- "os"
- "sort"
-)
-
-// Idom returns the block that immediately dominates b:
-// its parent in the dominator tree, if any.
-// Neither the entry node (b.Index==0) nor recover node
-// (b==b.Parent().Recover()) have a parent.
-//
-func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom }
-
-// Dominees returns the list of blocks that b immediately dominates:
-// its children in the dominator tree.
-//
-func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children }
-
-// Dominates reports whether b dominates c.
-func (b *BasicBlock) Dominates(c *BasicBlock) bool {
- return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post
-}
-
-type byDomPreorder []*BasicBlock
-
-func (a byDomPreorder) Len() int { return len(a) }
-func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre }
-
-// DomPreorder returns a new slice containing the blocks of f in
-// dominator tree preorder.
-//
-func (f *Function) DomPreorder() []*BasicBlock {
- n := len(f.Blocks)
- order := make(byDomPreorder, n, n)
- copy(order, f.Blocks)
- sort.Sort(order)
- return order
-}
-
-// domInfo contains a BasicBlock's dominance information.
-type domInfo struct {
- idom *BasicBlock // immediate dominator (parent in domtree)
- children []*BasicBlock // nodes immediately dominated by this one
- pre, post int32 // pre- and post-order numbering within domtree
-}
-
-// ltState holds the working state for Lengauer-Tarjan algorithm
-// (during which domInfo.pre is repurposed for CFG DFS preorder number).
-type ltState struct {
- // Each slice is indexed by b.Index.
- sdom []*BasicBlock // b's semidominator
- parent []*BasicBlock // b's parent in DFS traversal of CFG
- ancestor []*BasicBlock // b's ancestor with least sdom
-}
-
-// dfs implements the depth-first search part of the LT algorithm.
-func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 {
- preorder[i] = v
- v.dom.pre = i // For now: DFS preorder of spanning tree of CFG
- i++
- lt.sdom[v.Index] = v
- lt.link(nil, v)
- for _, w := range v.Succs {
- if lt.sdom[w.Index] == nil {
- lt.parent[w.Index] = v
- i = lt.dfs(w, i, preorder)
- }
- }
- return i
-}
-
-// eval implements the EVAL part of the LT algorithm.
-func (lt *ltState) eval(v *BasicBlock) *BasicBlock {
- // TODO(adonovan): opt: do path compression per simple LT.
- u := v
- for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] {
- if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre {
- u = v
- }
- }
- return u
-}
-
-// link implements the LINK part of the LT algorithm.
-func (lt *ltState) link(v, w *BasicBlock) {
- lt.ancestor[w.Index] = v
-}
-
-// buildDomTree computes the dominator tree of f using the LT algorithm.
-// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run).
-//
-func buildDomTree(f *Function) {
- // The step numbers refer to the original LT paper; the
- // reordering is due to Georgiadis.
-
- // Clear any previous domInfo.
- for _, b := range f.Blocks {
- b.dom = domInfo{}
- }
-
- n := len(f.Blocks)
- // Allocate space for 5 contiguous [n]*BasicBlock arrays:
- // sdom, parent, ancestor, preorder, buckets.
- space := make([]*BasicBlock, 5*n, 5*n)
- lt := ltState{
- sdom: space[0:n],
- parent: space[n : 2*n],
- ancestor: space[2*n : 3*n],
- }
-
- // Step 1. Number vertices by depth-first preorder.
- preorder := space[3*n : 4*n]
- root := f.Blocks[0]
- prenum := lt.dfs(root, 0, preorder)
- recover := f.Recover
- if recover != nil {
- lt.dfs(recover, prenum, preorder)
- }
-
- buckets := space[4*n : 5*n]
- copy(buckets, preorder)
-
- // In reverse preorder...
- for i := int32(n) - 1; i > 0; i-- {
- w := preorder[i]
-
- // Step 3. Implicitly define the immediate dominator of each node.
- for v := buckets[i]; v != w; v = buckets[v.dom.pre] {
- u := lt.eval(v)
- if lt.sdom[u.Index].dom.pre < i {
- v.dom.idom = u
- } else {
- v.dom.idom = w
- }
- }
-
- // Step 2. Compute the semidominators of all nodes.
- lt.sdom[w.Index] = lt.parent[w.Index]
- for _, v := range w.Preds {
- u := lt.eval(v)
- if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre {
- lt.sdom[w.Index] = lt.sdom[u.Index]
- }
- }
-
- lt.link(lt.parent[w.Index], w)
-
- if lt.parent[w.Index] == lt.sdom[w.Index] {
- w.dom.idom = lt.parent[w.Index]
- } else {
- buckets[i] = buckets[lt.sdom[w.Index].dom.pre]
- buckets[lt.sdom[w.Index].dom.pre] = w
- }
- }
-
- // The final 'Step 3' is now outside the loop.
- for v := buckets[0]; v != root; v = buckets[v.dom.pre] {
- v.dom.idom = root
- }
-
- // Step 4. Explicitly define the immediate dominator of each
- // node, in preorder.
- for _, w := range preorder[1:] {
- if w == root || w == recover {
- w.dom.idom = nil
- } else {
- if w.dom.idom != lt.sdom[w.Index] {
- w.dom.idom = w.dom.idom.dom.idom
- }
- // Calculate Children relation as inverse of Idom.
- w.dom.idom.dom.children = append(w.dom.idom.dom.children, w)
- }
- }
-
- pre, post := numberDomTree(root, 0, 0)
- if recover != nil {
- numberDomTree(recover, pre, post)
- }
-
- // printDomTreeDot(os.Stderr, f) // debugging
- // printDomTreeText(os.Stderr, root, 0) // debugging
-
- if f.Prog.mode&SanityCheckFunctions != 0 {
- sanityCheckDomTree(f)
- }
-}
-
-// numberDomTree sets the pre- and post-order numbers of a depth-first
-// traversal of the dominator tree rooted at v. These are used to
-// answer dominance queries in constant time.
-//
-func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) {
- v.dom.pre = pre
- pre++
- for _, child := range v.dom.children {
- pre, post = numberDomTree(child, pre, post)
- }
- v.dom.post = post
- post++
- return pre, post
-}
-
-// Testing utilities ----------------------------------------
-
-// sanityCheckDomTree checks the correctness of the dominator tree
-// computed by the LT algorithm by comparing against the dominance
-// relation computed by a naive Kildall-style forward dataflow
-// analysis (Algorithm 10.16 from the "Dragon" book).
-//
-func sanityCheckDomTree(f *Function) {
- n := len(f.Blocks)
-
- // D[i] is the set of blocks that dominate f.Blocks[i],
- // represented as a bit-set of block indices.
- D := make([]big.Int, n)
-
- one := big.NewInt(1)
-
- // all is the set of all blocks; constant.
- var all big.Int
- all.Set(one).Lsh(&all, uint(n)).Sub(&all, one)
-
- // Initialization.
- for i, b := range f.Blocks {
- if i == 0 || b == f.Recover {
- // A root is dominated only by itself.
- D[i].SetBit(&D[0], 0, 1)
- } else {
- // All other blocks are (initially) dominated
- // by every block.
- D[i].Set(&all)
- }
- }
-
- // Iteration until fixed point.
- for changed := true; changed; {
- changed = false
- for i, b := range f.Blocks {
- if i == 0 || b == f.Recover {
- continue
- }
- // Compute intersection across predecessors.
- var x big.Int
- x.Set(&all)
- for _, pred := range b.Preds {
- x.And(&x, &D[pred.Index])
- }
- x.SetBit(&x, i, 1) // a block always dominates itself.
- if D[i].Cmp(&x) != 0 {
- D[i].Set(&x)
- changed = true
- }
- }
- }
-
- // Check the entire relation. O(n^2).
- // The Recover block (if any) must be treated specially so we skip it.
- ok := true
- for i := 0; i < n; i++ {
- for j := 0; j < n; j++ {
- b, c := f.Blocks[i], f.Blocks[j]
- if c == f.Recover {
- continue
- }
- actual := b.Dominates(c)
- expected := D[j].Bit(i) == 1
- if actual != expected {
- fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected)
- ok = false
- }
- }
- }
-
- preorder := f.DomPreorder()
- for _, b := range f.Blocks {
- if got := preorder[b.dom.pre]; got != b {
- fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b)
- ok = false
- }
- }
-
- if !ok {
- panic("sanityCheckDomTree failed for " + f.String())
- }
-
-}
-
-// Printing functions ----------------------------------------
-
-// printDomTree prints the dominator tree as text, using indentation.
-func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) {
- fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v)
- for _, child := range v.dom.children {
- printDomTreeText(buf, child, indent+1)
- }
-}
-
-// printDomTreeDot prints the dominator tree of f in AT&T GraphViz
-// (.dot) format.
-func printDomTreeDot(buf *bytes.Buffer, f *Function) {
- fmt.Fprintln(buf, "//", f)
- fmt.Fprintln(buf, "digraph domtree {")
- for i, b := range f.Blocks {
- v := b.dom
- fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post)
- // TODO(adonovan): improve appearance of edges
- // belonging to both dominator tree and CFG.
-
- // Dominator tree edge.
- if i != 0 {
- fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre)
- }
- // CFG edges.
- for _, pred := range b.Preds {
- fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre)
- }
- }
- fmt.Fprintln(buf, "}")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/emit.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/emit.go
deleted file mode 100644
index 400da2122..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/emit.go
+++ /dev/null
@@ -1,475 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// Helpers for emitting SSA instructions.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
-)
-
-// emitNew emits to f a new (heap Alloc) instruction allocating an
-// object of type typ. pos is the optional source location.
-//
-func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc {
- v := &Alloc{Heap: true}
- v.setType(types.NewPointer(typ))
- v.setPos(pos)
- f.emit(v)
- return v
-}
-
-// emitLoad emits to f an instruction to load the address addr into a
-// new temporary, and returns the value so defined.
-//
-func emitLoad(f *Function, addr Value) *UnOp {
- v := &UnOp{Op: token.MUL, X: addr}
- v.setType(deref(addr.Type()))
- f.emit(v)
- return v
-}
-
-// emitDebugRef emits to f a DebugRef pseudo-instruction associating
-// expression e with value v.
-//
-func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) {
- if !f.debugInfo() {
- return // debugging not enabled
- }
- if v == nil || e == nil {
- panic("nil")
- }
- var obj types.Object
- e = unparen(e)
- if id, ok := e.(*ast.Ident); ok {
- if isBlankIdent(id) {
- return
- }
- obj = f.Pkg.objectOf(id)
- switch obj.(type) {
- case *types.Nil, *types.Const, *types.Builtin:
- return
- }
- }
- f.emit(&DebugRef{
- X: v,
- Expr: e,
- IsAddr: isAddr,
- object: obj,
- })
-}
-
-// emitArith emits to f code to compute the binary operation op(x, y)
-// where op is an eager shift, logical or arithmetic operation.
-// (Use emitCompare() for comparisons and Builder.logicalBinop() for
-// non-eager operations.)
-//
-func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value {
- switch op {
- case token.SHL, token.SHR:
- x = emitConv(f, x, t)
- // y may be signed or an 'untyped' constant.
- // TODO(adonovan): whence signed values?
- if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 {
- y = emitConv(f, y, types.Typ[types.Uint64])
- }
-
- case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
- x = emitConv(f, x, t)
- y = emitConv(f, y, t)
-
- default:
- panic("illegal op in emitArith: " + op.String())
-
- }
- v := &BinOp{
- Op: op,
- X: x,
- Y: y,
- }
- v.setPos(pos)
- v.setType(t)
- return f.emit(v)
-}
-
-// emitCompare emits to f code compute the boolean result of
-// comparison comparison 'x op y'.
-//
-func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value {
- xt := x.Type().Underlying()
- yt := y.Type().Underlying()
-
- // Special case to optimise a tagless SwitchStmt so that
- // these are equivalent
- // switch { case e: ...}
- // switch true { case e: ... }
- // if e==true { ... }
- // even in the case when e's type is an interface.
- // TODO(adonovan): opt: generalise to x==true, false!=y, etc.
- if x == vTrue && op == token.EQL {
- if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 {
- return y
- }
- }
-
- if types.Identical(xt, yt) {
- // no conversion necessary
- } else if _, ok := xt.(*types.Interface); ok {
- y = emitConv(f, y, x.Type())
- } else if _, ok := yt.(*types.Interface); ok {
- x = emitConv(f, x, y.Type())
- } else if _, ok := x.(*Const); ok {
- x = emitConv(f, x, y.Type())
- } else if _, ok := y.(*Const); ok {
- y = emitConv(f, y, x.Type())
- } else {
- // other cases, e.g. channels. No-op.
- }
-
- v := &BinOp{
- Op: op,
- X: x,
- Y: y,
- }
- v.setPos(pos)
- v.setType(tBool)
- return f.emit(v)
-}
-
-// isValuePreserving returns true if a conversion from ut_src to
-// ut_dst is value-preserving, i.e. just a change of type.
-// Precondition: neither argument is a named type.
-//
-func isValuePreserving(ut_src, ut_dst types.Type) bool {
- // Identical underlying types?
- if structTypesIdentical(ut_dst, ut_src) {
- return true
- }
-
- switch ut_dst.(type) {
- case *types.Chan:
- // Conversion between channel types?
- _, ok := ut_src.(*types.Chan)
- return ok
-
- case *types.Pointer:
- // Conversion between pointers with identical base types?
- _, ok := ut_src.(*types.Pointer)
- return ok
- }
- return false
-}
-
-// emitConv emits to f code to convert Value val to exactly type typ,
-// and returns the converted value. Implicit conversions are required
-// by language assignability rules in assignments, parameter passing,
-// etc. Conversions cannot fail dynamically.
-//
-func emitConv(f *Function, val Value, typ types.Type) Value {
- t_src := val.Type()
-
- // Identical types? Conversion is a no-op.
- if types.Identical(t_src, typ) {
- return val
- }
-
- ut_dst := typ.Underlying()
- ut_src := t_src.Underlying()
-
- // Just a change of type, but not value or representation?
- if isValuePreserving(ut_src, ut_dst) {
- c := &ChangeType{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- // Conversion to, or construction of a value of, an interface type?
- if _, ok := ut_dst.(*types.Interface); ok {
- // Assignment from one interface type to another?
- if _, ok := ut_src.(*types.Interface); ok {
- c := &ChangeInterface{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- // Untyped nil constant? Return interface-typed nil constant.
- if ut_src == tUntypedNil {
- return nilConst(typ)
- }
-
- // Convert (non-nil) "untyped" literals to their default type.
- if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 {
- val = emitConv(f, val, DefaultType(ut_src))
- }
-
- f.Pkg.Prog.needMethodsOf(val.Type())
- mi := &MakeInterface{X: val}
- mi.setType(typ)
- return f.emit(mi)
- }
-
- // Conversion of a compile-time constant value?
- if c, ok := val.(*Const); ok {
- if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() {
- // Conversion of a compile-time constant to
- // another constant type results in a new
- // constant of the destination type and
- // (initially) the same abstract value.
- // We don't truncate the value yet.
- return NewConst(c.Value, typ)
- }
-
- // We're converting from constant to non-constant type,
- // e.g. string -> []byte/[]rune.
- }
-
- // A representation-changing conversion?
- // At least one of {ut_src,ut_dst} must be *Basic.
- // (The other may be []byte or []rune.)
- _, ok1 := ut_src.(*types.Basic)
- _, ok2 := ut_dst.(*types.Basic)
- if ok1 || ok2 {
- c := &Convert{X: val}
- c.setType(typ)
- return f.emit(c)
- }
-
- panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ))
-}
-
-// emitStore emits to f an instruction to store value val at location
-// addr, applying implicit conversions as required by assignability rules.
-//
-func emitStore(f *Function, addr, val Value, pos token.Pos) *Store {
- s := &Store{
- Addr: addr,
- Val: emitConv(f, val, deref(addr.Type())),
- pos: pos,
- }
- f.emit(s)
- return s
-}
-
-// emitJump emits to f a jump to target, and updates the control-flow graph.
-// Postcondition: f.currentBlock is nil.
-//
-func emitJump(f *Function, target *BasicBlock) {
- b := f.currentBlock
- b.emit(new(Jump))
- addEdge(b, target)
- f.currentBlock = nil
-}
-
-func (b *BasicBlock) emitJump(target *BasicBlock) {
- b.emit(new(Jump))
- addEdge(b, target)
-}
-
-// emitIf emits to f a conditional jump to tblock or fblock based on
-// cond, and updates the control-flow graph.
-// Postcondition: f.currentBlock is nil.
-//
-func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) {
- b := f.currentBlock
- b.emit(&If{Cond: cond})
- addEdge(b, tblock)
- addEdge(b, fblock)
- f.currentBlock = nil
-}
-
-// emitExtract emits to f an instruction to extract the index'th
-// component of tuple. It returns the extracted value.
-//
-func emitExtract(f *Function, tuple Value, index int) Value {
- e := &Extract{Tuple: tuple, Index: index}
- e.setType(tuple.Type().(*types.Tuple).At(index).Type())
- return f.emit(e)
-}
-
-// emitTypeAssert emits to f a type assertion value := x.(t) and
-// returns the value. x.Type() must be an interface.
-//
-func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value {
- a := &TypeAssert{X: x, AssertedType: t}
- a.setPos(pos)
- a.setType(t)
- return f.emit(a)
-}
-
-// emitTypeTest emits to f a type test value,ok := x.(t) and returns
-// a (value, ok) tuple. x.Type() must be an interface.
-//
-func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value {
- a := &TypeAssert{
- X: x,
- AssertedType: t,
- CommaOk: true,
- }
- a.setPos(pos)
- a.setType(types.NewTuple(
- newVar("value", t),
- varOk,
- ))
- return f.emit(a)
-}
-
-// emitTailCall emits to f a function call in tail position. The
-// caller is responsible for all fields of 'call' except its type.
-// Intended for wrapper methods.
-// Precondition: f does/will not use deferred procedure calls.
-// Postcondition: f.currentBlock is nil.
-//
-func emitTailCall(f *Function, call *Call) {
- tresults := f.Signature.Results()
- nr := tresults.Len()
- if nr == 1 {
- call.typ = tresults.At(0).Type()
- } else {
- call.typ = tresults
- }
- tuple := f.emit(call)
- var ret Return
- switch nr {
- case 0:
- // no-op
- case 1:
- ret.Results = []Value{tuple}
- default:
- for i := 0; i < nr; i++ {
- v := emitExtract(f, tuple, i)
- // TODO(adonovan): in principle, this is required:
- // v = emitConv(f, o.Type, f.Signature.Results[i].Type)
- // but in practice emitTailCall is only used when
- // the types exactly match.
- ret.Results = append(ret.Results, v)
- }
- }
- f.emit(&ret)
- f.currentBlock = nil
-}
-
-// emitImplicitSelections emits to f code to apply the sequence of
-// implicit field selections specified by indices to base value v, and
-// returns the selected value.
-//
-// If v is the address of a struct, the result will be the address of
-// a field; if it is the value of a struct, the result will be the
-// value of a field.
-//
-func emitImplicitSelections(f *Function, v Value, indices []int) Value {
- for _, index := range indices {
- fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
-
- if isPointer(v.Type()) {
- instr := &FieldAddr{
- X: v,
- Field: index,
- }
- instr.setType(types.NewPointer(fld.Type()))
- v = f.emit(instr)
- // Load the field's value iff indirectly embedded.
- if isPointer(fld.Type()) {
- v = emitLoad(f, v)
- }
- } else {
- instr := &Field{
- X: v,
- Field: index,
- }
- instr.setType(fld.Type())
- v = f.emit(instr)
- }
- }
- return v
-}
-
-// emitFieldSelection emits to f code to select the index'th field of v.
-//
-// If wantAddr, the input must be a pointer-to-struct and the result
-// will be the field's address; otherwise the result will be the
-// field's value.
-// Ident id is used for position and debug info.
-//
-func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value {
- fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
- if isPointer(v.Type()) {
- instr := &FieldAddr{
- X: v,
- Field: index,
- }
- instr.setPos(id.Pos())
- instr.setType(types.NewPointer(fld.Type()))
- v = f.emit(instr)
- // Load the field's value iff we don't want its address.
- if !wantAddr {
- v = emitLoad(f, v)
- }
- } else {
- instr := &Field{
- X: v,
- Field: index,
- }
- instr.setPos(id.Pos())
- instr.setType(fld.Type())
- v = f.emit(instr)
- }
- emitDebugRef(f, id, v, wantAddr)
- return v
-}
-
-// zeroValue emits to f code to produce a zero value of type t,
-// and returns it.
-//
-func zeroValue(f *Function, t types.Type) Value {
- switch t.Underlying().(type) {
- case *types.Struct, *types.Array:
- return emitLoad(f, f.addLocal(t, token.NoPos))
- default:
- return zeroConst(t)
- }
-}
-
-// createRecoverBlock emits to f a block of code to return after a
-// recovered panic, and sets f.Recover to it.
-//
-// If f's result parameters are named, the code loads and returns
-// their current values, otherwise it returns the zero values of their
-// type.
-//
-// Idempotent.
-//
-func createRecoverBlock(f *Function) {
- if f.Recover != nil {
- return // already created
- }
- saved := f.currentBlock
-
- f.Recover = f.newBasicBlock("recover")
- f.currentBlock = f.Recover
-
- var results []Value
- if f.namedResults != nil {
- // Reload NRPs to form value tuple.
- for _, r := range f.namedResults {
- results = append(results, emitLoad(f, r))
- }
- } else {
- R := f.Signature.Results()
- for i, n := 0, R.Len(); i < n; i++ {
- T := R.At(i).Type()
-
- // Return zero value of each result type.
- results = append(results, zeroValue(f, T))
- }
- }
- f.emit(&Return{Results: results})
-
- f.currentBlock = saved
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/func.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/func.go
deleted file mode 100644
index 86a3da74d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/func.go
+++ /dev/null
@@ -1,703 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// This file implements the Function and BasicBlock types.
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "io"
- "os"
- "strings"
-)
-
-// addEdge adds a control-flow graph edge from from to to.
-func addEdge(from, to *BasicBlock) {
- from.Succs = append(from.Succs, to)
- to.Preds = append(to.Preds, from)
-}
-
-// Parent returns the function that contains block b.
-func (b *BasicBlock) Parent() *Function { return b.parent }
-
-// String returns a human-readable label of this block.
-// It is not guaranteed unique within the function.
-//
-func (b *BasicBlock) String() string {
- return fmt.Sprintf("%d", b.Index)
-}
-
-// emit appends an instruction to the current basic block.
-// If the instruction defines a Value, it is returned.
-//
-func (b *BasicBlock) emit(i Instruction) Value {
- i.setBlock(b)
- b.Instrs = append(b.Instrs, i)
- v, _ := i.(Value)
- return v
-}
-
-// predIndex returns the i such that b.Preds[i] == c or panics if
-// there is none.
-func (b *BasicBlock) predIndex(c *BasicBlock) int {
- for i, pred := range b.Preds {
- if pred == c {
- return i
- }
- }
- panic(fmt.Sprintf("no edge %s -> %s", c, b))
-}
-
-// hasPhi returns true if b.Instrs contains φ-nodes.
-func (b *BasicBlock) hasPhi() bool {
- _, ok := b.Instrs[0].(*Phi)
- return ok
-}
-
-func (b *BasicBlock) Phis() []Instruction {
- return b.phis()
-}
-
-// phis returns the prefix of b.Instrs containing all the block's φ-nodes.
-func (b *BasicBlock) phis() []Instruction {
- for i, instr := range b.Instrs {
- if _, ok := instr.(*Phi); !ok {
- return b.Instrs[:i]
- }
- }
- return nil // unreachable in well-formed blocks
-}
-
-// replacePred replaces all occurrences of p in b's predecessor list with q.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) replacePred(p, q *BasicBlock) {
- for i, pred := range b.Preds {
- if pred == p {
- b.Preds[i] = q
- }
- }
-}
-
-// replaceSucc replaces all occurrences of p in b's successor list with q.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) replaceSucc(p, q *BasicBlock) {
- for i, succ := range b.Succs {
- if succ == p {
- b.Succs[i] = q
- }
- }
-}
-
-func (b *BasicBlock) RemovePred(p *BasicBlock) {
- b.removePred(p)
-}
-
-// removePred removes all occurrences of p in b's
-// predecessor list and φ-nodes.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) removePred(p *BasicBlock) {
- phis := b.phis()
-
- // We must preserve edge order for φ-nodes.
- j := 0
- for i, pred := range b.Preds {
- if pred != p {
- b.Preds[j] = b.Preds[i]
- // Strike out φ-edge too.
- for _, instr := range phis {
- phi := instr.(*Phi)
- phi.Edges[j] = phi.Edges[i]
- }
- j++
- }
- }
- // Nil out b.Preds[j:] and φ-edges[j:] to aid GC.
- for i := j; i < len(b.Preds); i++ {
- b.Preds[i] = nil
- for _, instr := range phis {
- instr.(*Phi).Edges[i] = nil
- }
- }
- b.Preds = b.Preds[:j]
- for _, instr := range phis {
- phi := instr.(*Phi)
- phi.Edges = phi.Edges[:j]
- }
-}
-
-// Destinations associated with unlabelled for/switch/select stmts.
-// We push/pop one of these as we enter/leave each construct and for
-// each BranchStmt we scan for the innermost target of the right type.
-//
-type targets struct {
- tail *targets // rest of stack
- _break *BasicBlock
- _continue *BasicBlock
- _fallthrough *BasicBlock
-}
-
-// Destinations associated with a labelled block.
-// We populate these as labels are encountered in forward gotos or
-// labelled statements.
-//
-type lblock struct {
- _goto *BasicBlock
- _break *BasicBlock
- _continue *BasicBlock
-}
-
-// labelledBlock returns the branch target associated with the
-// specified label, creating it if needed.
-//
-func (f *Function) labelledBlock(label *ast.Ident) *lblock {
- lb := f.lblocks[label.Obj]
- if lb == nil {
- lb = &lblock{_goto: f.newBasicBlock(label.Name)}
- if f.lblocks == nil {
- f.lblocks = make(map[*ast.Object]*lblock)
- }
- f.lblocks[label.Obj] = lb
- }
- return lb
-}
-
-// addParam adds a (non-escaping) parameter to f.Params of the
-// specified name, type and source position.
-//
-func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter {
- v := &Parameter{
- name: name,
- typ: typ,
- pos: pos,
- parent: f,
- }
- f.Params = append(f.Params, v)
- return v
-}
-
-func (f *Function) addParamObj(obj types.Object) *Parameter {
- name := obj.Name()
- if name == "" {
- name = fmt.Sprintf("arg%d", len(f.Params))
- }
- param := f.addParam(name, obj.Type(), obj.Pos())
- param.object = obj
- return param
-}
-
-// addSpilledParam declares a parameter that is pre-spilled to the
-// stack; the function body will load/store the spilled location.
-// Subsequent lifting will eliminate spills where possible.
-//
-func (f *Function) addSpilledParam(obj types.Object) {
- param := f.addParamObj(obj)
- spill := &Alloc{Comment: obj.Name()}
- spill.setType(types.NewPointer(obj.Type()))
- spill.setPos(obj.Pos())
- f.objects[obj] = spill
- f.Locals = append(f.Locals, spill)
- f.emit(spill)
- f.emit(&Store{Addr: spill, Val: param})
-}
-
-// startBody initializes the function prior to generating SSA code for its body.
-// Precondition: f.Type() already set.
-//
-func (f *Function) startBody() {
- f.currentBlock = f.newBasicBlock("entry")
- f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init
-}
-
-// createSyntacticParams populates f.Params and generates code (spills
-// and named result locals) for all the parameters declared in the
-// syntax. In addition it populates the f.objects mapping.
-//
-// Preconditions:
-// f.startBody() was called.
-// Postcondition:
-// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0)
-//
-func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) {
- // Receiver (at most one inner iteration).
- if recv != nil {
- for _, field := range recv.List {
- for _, n := range field.Names {
- f.addSpilledParam(f.Pkg.info.Defs[n])
- }
- // Anonymous receiver? No need to spill.
- if field.Names == nil {
- f.addParamObj(f.Signature.Recv())
- }
- }
- }
-
- // Parameters.
- if functype.Params != nil {
- n := len(f.Params) // 1 if has recv, 0 otherwise
- for _, field := range functype.Params.List {
- for _, n := range field.Names {
- f.addSpilledParam(f.Pkg.info.Defs[n])
- }
- // Anonymous parameter? No need to spill.
- if field.Names == nil {
- f.addParamObj(f.Signature.Params().At(len(f.Params) - n))
- }
- }
- }
-
- // Named results.
- if functype.Results != nil {
- for _, field := range functype.Results.List {
- // Implicit "var" decl of locals for named results.
- for _, n := range field.Names {
- f.namedResults = append(f.namedResults, f.addLocalForIdent(n))
- }
- }
- }
-}
-
-// numberRegisters assigns numbers to all SSA registers
-// (value-defining Instructions) in f, to aid debugging.
-// (Non-Instruction Values are named at construction.)
-//
-func numberRegisters(f *Function) {
- v := 0
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- switch instr.(type) {
- case Value:
- instr.(interface {
- setNum(int)
- }).setNum(v)
- v++
- }
- }
- }
-}
-
-// buildReferrers populates the def/use information in all non-nil
-// Value.Referrers slice.
-// Precondition: all such slices are initially empty.
-func buildReferrers(f *Function) {
- var rands []*Value
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- rands = instr.Operands(rands[:0]) // recycle storage
- for _, rand := range rands {
- if r := *rand; r != nil {
- if ref := r.Referrers(); ref != nil {
- *ref = append(*ref, instr)
- }
- }
- }
- }
- }
-}
-
-// finishBody() finalizes the function after SSA code generation of its body.
-func (f *Function) finishBody() {
- f.objects = nil
- f.currentBlock = nil
- f.lblocks = nil
-
- // Don't pin the AST in memory (except in debug mode).
- if n := f.syntax; n != nil && !f.debugInfo() {
- f.syntax = extentNode{n.Pos(), n.End()}
- }
-
- // Remove from f.Locals any Allocs that escape to the heap.
- j := 0
- for _, l := range f.Locals {
- if !l.Heap {
- f.Locals[j] = l
- j++
- }
- }
- // Nil out f.Locals[j:] to aid GC.
- for i := j; i < len(f.Locals); i++ {
- f.Locals[i] = nil
- }
- f.Locals = f.Locals[:j]
-
- optimizeBlocks(f)
-
- buildReferrers(f)
-
- buildDomTree(f)
-
- if f.Prog.mode&NaiveForm == 0 {
- // For debugging pre-state of lifting pass:
- // numberRegisters(f)
- // f.WriteTo(os.Stderr)
- lift(f)
- }
-
- f.namedResults = nil // (used by lifting)
-
- numberRegisters(f)
-
- if f.Prog.mode&PrintFunctions != 0 {
- printMu.Lock()
- f.WriteTo(os.Stdout)
- printMu.Unlock()
- }
-
- if f.Prog.mode&SanityCheckFunctions != 0 {
- mustSanityCheck(f, nil)
- }
-}
-
-func (f *Function) RemoveNilBlocks() {
- f.removeNilBlocks()
-}
-
-// removeNilBlocks eliminates nils from f.Blocks and updates each
-// BasicBlock.Index. Use this after any pass that may delete blocks.
-//
-func (f *Function) removeNilBlocks() {
- j := 0
- for _, b := range f.Blocks {
- if b != nil {
- b.Index = j
- f.Blocks[j] = b
- j++
- }
- }
- // Nil out f.Blocks[j:] to aid GC.
- for i := j; i < len(f.Blocks); i++ {
- f.Blocks[i] = nil
- }
- f.Blocks = f.Blocks[:j]
-}
-
-// SetDebugMode sets the debug mode for package pkg. If true, all its
-// functions will include full debug info. This greatly increases the
-// size of the instruction stream, and causes Functions to depend upon
-// the ASTs, potentially keeping them live in memory for longer.
-//
-func (pkg *Package) SetDebugMode(debug bool) {
- // TODO(adonovan): do we want ast.File granularity?
- pkg.debug = debug
-}
-
-// debugInfo reports whether debug info is wanted for this function.
-func (f *Function) debugInfo() bool {
- return f.Pkg != nil && f.Pkg.debug
-}
-
-// addNamedLocal creates a local variable, adds it to function f and
-// returns it. Its name and type are taken from obj. Subsequent
-// calls to f.lookup(obj) will return the same local.
-//
-func (f *Function) addNamedLocal(obj types.Object) *Alloc {
- l := f.addLocal(obj.Type(), obj.Pos())
- l.Comment = obj.Name()
- f.objects[obj] = l
- return l
-}
-
-func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc {
- return f.addNamedLocal(f.Pkg.info.Defs[id])
-}
-
-// addLocal creates an anonymous local variable of type typ, adds it
-// to function f and returns it. pos is the optional source location.
-//
-func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc {
- v := &Alloc{}
- v.setType(types.NewPointer(typ))
- v.setPos(pos)
- f.Locals = append(f.Locals, v)
- f.emit(v)
- return v
-}
-
-// lookup returns the address of the named variable identified by obj
-// that is local to function f or one of its enclosing functions.
-// If escaping, the reference comes from a potentially escaping pointer
-// expression and the referent must be heap-allocated.
-//
-func (f *Function) lookup(obj types.Object, escaping bool) Value {
- if v, ok := f.objects[obj]; ok {
- if alloc, ok := v.(*Alloc); ok && escaping {
- alloc.Heap = true
- }
- return v // function-local var (address)
- }
-
- // Definition must be in an enclosing function;
- // plumb it through intervening closures.
- if f.parent == nil {
- panic("no ssa.Value for " + obj.String())
- }
- outer := f.parent.lookup(obj, true) // escaping
- v := &FreeVar{
- name: obj.Name(),
- typ: outer.Type(),
- pos: outer.Pos(),
- outer: outer,
- parent: f,
- }
- f.objects[obj] = v
- f.FreeVars = append(f.FreeVars, v)
- return v
-}
-
-// emit emits the specified instruction to function f.
-func (f *Function) emit(instr Instruction) Value {
- return f.currentBlock.emit(instr)
-}
-
-// RelString returns the full name of this function, qualified by
-// package name, receiver type, etc.
-//
-// The specific formatting rules are not guaranteed and may change.
-//
-// Examples:
-// "math.IsNaN" // a package-level function
-// "(*bytes.Buffer).Bytes" // a declared method or a wrapper
-// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0)
-// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure)
-// "main.main$1" // an anonymous function in main
-// "main.init#1" // a declared init function
-// "main.init" // the synthesized package initializer
-//
-// When these functions are referred to from within the same package
-// (i.e. from == f.Pkg.Object), they are rendered without the package path.
-// For example: "IsNaN", "(*Buffer).Bytes", etc.
-//
-// All non-synthetic functions have distinct package-qualified names.
-// (But two methods may have the same name "(T).f" if one is a synthetic
-// wrapper promoting a non-exported method "f" from another package; in
-// that case, the strings are equal but the identifiers "f" are distinct.)
-//
-func (f *Function) RelString(from *types.Package) string {
- // Anonymous?
- if f.parent != nil {
- // An anonymous function's Name() looks like "parentName$1",
- // but its String() should include the type/package/etc.
- parent := f.parent.RelString(from)
- for i, anon := range f.parent.AnonFuncs {
- if anon == f {
- return fmt.Sprintf("%s$%d", parent, 1+i)
- }
- }
-
- return f.name // should never happen
- }
-
- // Method (declared or wrapper)?
- if recv := f.Signature.Recv(); recv != nil {
- return f.relMethod(from, recv.Type())
- }
-
- // Thunk?
- if f.method != nil {
- return f.relMethod(from, f.method.Recv())
- }
-
- // Bound?
- if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") {
- return f.relMethod(from, f.FreeVars[0].Type())
- }
-
- // Package-level function?
- // Prefix with package name for cross-package references only.
- if p := f.pkg(); p != nil && p != from {
- return fmt.Sprintf("%s.%s", p.Path(), f.name)
- }
-
- // Unknown.
- return f.name
-}
-
-func (f *Function) relMethod(from *types.Package, recv types.Type) string {
- return fmt.Sprintf("(%s).%s", relType(recv, from), f.name)
-}
-
-// writeSignature writes to buf the signature sig in declaration syntax.
-func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) {
- buf.WriteString("func ")
- if recv := sig.Recv(); recv != nil {
- buf.WriteString("(")
- if n := params[0].Name(); n != "" {
- buf.WriteString(n)
- buf.WriteString(" ")
- }
- types.WriteType(buf, params[0].Type(), types.RelativeTo(from))
- buf.WriteString(") ")
- }
- buf.WriteString(name)
- types.WriteSignature(buf, sig, types.RelativeTo(from))
-}
-
-func (f *Function) pkg() *types.Package {
- if f.Pkg != nil {
- return f.Pkg.Pkg
- }
- return nil
-}
-
-var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer
-
-func (f *Function) WriteTo(w io.Writer) (int64, error) {
- var buf bytes.Buffer
- WriteFunction(&buf, f)
- n, err := w.Write(buf.Bytes())
- return int64(n), err
-}
-
-// WriteFunction writes to buf a human-readable "disassembly" of f.
-func WriteFunction(buf *bytes.Buffer, f *Function) {
- fmt.Fprintf(buf, "# Name: %s\n", f.String())
- if f.Pkg != nil {
- fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path())
- }
- if syn := f.Synthetic; syn != "" {
- fmt.Fprintln(buf, "# Synthetic:", syn)
- }
- if pos := f.Pos(); pos.IsValid() {
- fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos))
- }
-
- if f.parent != nil {
- fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name())
- }
-
- if f.Recover != nil {
- fmt.Fprintf(buf, "# Recover: %s\n", f.Recover)
- }
-
- from := f.pkg()
-
- if f.FreeVars != nil {
- buf.WriteString("# Free variables:\n")
- for i, fv := range f.FreeVars {
- fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from))
- }
- }
-
- if len(f.Locals) > 0 {
- buf.WriteString("# Locals:\n")
- for i, l := range f.Locals {
- fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from))
- }
- }
- writeSignature(buf, from, f.Name(), f.Signature, f.Params)
- buf.WriteString(":\n")
-
- if f.Blocks == nil {
- buf.WriteString("\t(external)\n")
- }
-
- // NB. column calculations are confused by non-ASCII
- // characters and assume 8-space tabs.
- const punchcard = 80 // for old time's sake.
- const tabwidth = 8
- for _, b := range f.Blocks {
- if b == nil {
- // Corrupt CFG.
- fmt.Fprintf(buf, ".nil:\n")
- continue
- }
- n, _ := fmt.Fprintf(buf, "%d:", b.Index)
- bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs))
- fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg)
-
- if false { // CFG debugging
- fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs)
- }
- for _, instr := range b.Instrs {
- buf.WriteString("\t")
- switch v := instr.(type) {
- case Value:
- l := punchcard - tabwidth
- // Left-align the instruction.
- if name := v.Name(); name != "" {
- n, _ := fmt.Fprintf(buf, "%s = ", name)
- l -= n
- }
- n, _ := buf.WriteString(instr.String())
- l -= n
- // Right-align the type if there's space.
- if t := v.Type(); t != nil {
- buf.WriteByte(' ')
- ts := relType(t, from)
- l -= len(ts) + len(" ") // (spaces before and after type)
- if l > 0 {
- fmt.Fprintf(buf, "%*s", l, "")
- }
- buf.WriteString(ts)
- }
- case nil:
- // Be robust against bad transforms.
- buf.WriteString("")
- default:
- buf.WriteString(instr.String())
- }
- buf.WriteString("\n")
- }
- }
- fmt.Fprintf(buf, "\n")
-}
-
-// newBasicBlock adds to f a new basic block and returns it. It does
-// not automatically become the current block for subsequent calls to emit.
-// comment is an optional string for more readable debugging output.
-//
-func (f *Function) newBasicBlock(comment string) *BasicBlock {
- b := &BasicBlock{
- Index: len(f.Blocks),
- Comment: comment,
- parent: f,
- }
- b.Succs = b.succs2[:0]
- f.Blocks = append(f.Blocks, b)
- return b
-}
-
-// NewFunction returns a new synthetic Function instance belonging to
-// prog, with its name and signature fields set as specified.
-//
-// The caller is responsible for initializing the remaining fields of
-// the function object, e.g. Pkg, Params, Blocks.
-//
-// It is practically impossible for clients to construct well-formed
-// SSA functions/packages/programs directly, so we assume this is the
-// job of the Builder alone. NewFunction exists to provide clients a
-// little flexibility. For example, analysis tools may wish to
-// construct fake Functions for the root of the callgraph, a fake
-// "reflect" package, etc.
-//
-// TODO(adonovan): think harder about the API here.
-//
-func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function {
- return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance}
-}
-
-type extentNode [2]token.Pos
-
-func (n extentNode) Pos() token.Pos { return n[0] }
-func (n extentNode) End() token.Pos { return n[1] }
-
-// Syntax returns an ast.Node whose Pos/End methods provide the
-// lexical extent of the function if it was defined by Go source code
-// (f.Synthetic==""), or nil otherwise.
-//
-// If f was built with debug information (see Package.SetDebugRef),
-// the result is the *ast.FuncDecl or *ast.FuncLit that declared the
-// function. Otherwise, it is an opaque Node providing only position
-// information; this avoids pinning the AST in memory.
-//
-func (f *Function) Syntax() ast.Node { return f.syntax }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/identical.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/identical.go
deleted file mode 100644
index 53cbee107..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/identical.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build go1.8
-
-package ssa
-
-import "go/types"
-
-var structTypesIdentical = types.IdenticalIgnoreTags
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/identical_17.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/identical_17.go
deleted file mode 100644
index da89d3339..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/identical_17.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build !go1.8
-
-package ssa
-
-import "go/types"
-
-var structTypesIdentical = types.Identical
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/lift.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/lift.go
deleted file mode 100644
index 02707970e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/lift.go
+++ /dev/null
@@ -1,608 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// This file defines the lifting pass which tries to "lift" Alloc
-// cells (new/local variables) into SSA registers, replacing loads
-// with the dominating stored value, eliminating loads and stores, and
-// inserting φ-nodes as needed.
-
-// Cited papers and resources:
-//
-// Ron Cytron et al. 1991. Efficiently computing SSA form...
-// http://doi.acm.org/10.1145/115372.115320
-//
-// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm.
-// Software Practice and Experience 2001, 4:1-10.
-// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf
-//
-// Daniel Berlin, llvmdev mailing list, 2012.
-// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html
-// (Be sure to expand the whole thread.)
-
-// TODO(adonovan): opt: there are many optimizations worth evaluating, and
-// the conventional wisdom for SSA construction is that a simple
-// algorithm well engineered often beats those of better asymptotic
-// complexity on all but the most egregious inputs.
-//
-// Danny Berlin suggests that the Cooper et al. algorithm for
-// computing the dominance frontier is superior to Cytron et al.
-// Furthermore he recommends that rather than computing the DF for the
-// whole function then renaming all alloc cells, it may be cheaper to
-// compute the DF for each alloc cell separately and throw it away.
-//
-// Consider exploiting liveness information to avoid creating dead
-// φ-nodes which we then immediately remove.
-//
-// Integrate lifting with scalar replacement of aggregates (SRA) since
-// the two are synergistic.
-//
-// Also see many other "TODO: opt" suggestions in the code.
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "math/big"
- "os"
-)
-
-// If true, perform sanity checking and show diagnostic information at
-// each step of lifting. Very verbose.
-const debugLifting = false
-
-// domFrontier maps each block to the set of blocks in its dominance
-// frontier. The outer slice is conceptually a map keyed by
-// Block.Index. The inner slice is conceptually a set, possibly
-// containing duplicates.
-//
-// TODO(adonovan): opt: measure impact of dups; consider a packed bit
-// representation, e.g. big.Int, and bitwise parallel operations for
-// the union step in the Children loop.
-//
-// domFrontier's methods mutate the slice's elements but not its
-// length, so their receivers needn't be pointers.
-//
-type domFrontier [][]*BasicBlock
-
-func (df domFrontier) add(u, v *BasicBlock) {
- p := &df[u.Index]
- *p = append(*p, v)
-}
-
-// build builds the dominance frontier df for the dominator (sub)tree
-// rooted at u, using the Cytron et al. algorithm.
-//
-// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA
-// by pruning the entire IDF computation, rather than merely pruning
-// the DF -> IDF step.
-func (df domFrontier) build(u *BasicBlock) {
- // Encounter each node u in postorder of dom tree.
- for _, child := range u.dom.children {
- df.build(child)
- }
- for _, vb := range u.Succs {
- if v := vb.dom; v.idom != u {
- df.add(u, vb)
- }
- }
- for _, w := range u.dom.children {
- for _, vb := range df[w.Index] {
- // TODO(adonovan): opt: use word-parallel bitwise union.
- if v := vb.dom; v.idom != u {
- df.add(u, vb)
- }
- }
- }
-}
-
-func buildDomFrontier(fn *Function) domFrontier {
- df := make(domFrontier, len(fn.Blocks))
- df.build(fn.Blocks[0])
- if fn.Recover != nil {
- df.build(fn.Recover)
- }
- return df
-}
-
-func RemoveInstr(refs []Instruction, instr Instruction) []Instruction {
- return removeInstr(refs, instr)
-}
-
-func removeInstr(refs []Instruction, instr Instruction) []Instruction {
- i := 0
- for _, ref := range refs {
- if ref == instr {
- continue
- }
- refs[i] = ref
- i++
- }
- for j := i; j != len(refs); j++ {
- refs[j] = nil // aid GC
- }
- return refs[:i]
-}
-
-// lift attempts to replace local and new Allocs accessed only with
-// load/store by SSA registers, inserting φ-nodes where necessary.
-// The result is a program in classical pruned SSA form.
-//
-// Preconditions:
-// - fn has no dead blocks (blockopt has run).
-// - Def/use info (Operands and Referrers) is up-to-date.
-// - The dominator tree is up-to-date.
-//
-func lift(fn *Function) {
- // TODO(adonovan): opt: lots of little optimizations may be
- // worthwhile here, especially if they cause us to avoid
- // buildDomFrontier. For example:
- //
- // - Alloc never loaded? Eliminate.
- // - Alloc never stored? Replace all loads with a zero constant.
- // - Alloc stored once? Replace loads with dominating store;
- // don't forget that an Alloc is itself an effective store
- // of zero.
- // - Alloc used only within a single block?
- // Use degenerate algorithm avoiding φ-nodes.
- // - Consider synergy with scalar replacement of aggregates (SRA).
- // e.g. *(&x.f) where x is an Alloc.
- // Perhaps we'd get better results if we generated this as x.f
- // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)).
- // Unclear.
- //
- // But we will start with the simplest correct code.
- df := buildDomFrontier(fn)
-
- if debugLifting {
- title := false
- for i, blocks := range df {
- if blocks != nil {
- if !title {
- fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn)
- title = true
- }
- fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks)
- }
- }
- }
-
- newPhis := make(newPhiMap)
-
- // During this pass we will replace some BasicBlock.Instrs
- // (allocs, loads and stores) with nil, keeping a count in
- // BasicBlock.gaps. At the end we will reset Instrs to the
- // concatenation of all non-dead newPhis and non-nil Instrs
- // for the block, reusing the original array if space permits.
-
- // While we're here, we also eliminate 'rundefers'
- // instructions in functions that contain no 'defer'
- // instructions.
- usesDefer := false
-
- // Determine which allocs we can lift and number them densely.
- // The renaming phase uses this numbering for compact maps.
- numAllocs := 0
- for _, b := range fn.Blocks {
- b.gaps = 0
- b.rundefers = 0
- for _, instr := range b.Instrs {
- switch instr := instr.(type) {
- case *Alloc:
- index := -1
- if liftAlloc(df, instr, newPhis) {
- index = numAllocs
- numAllocs++
- }
- instr.index = index
- case *Defer:
- usesDefer = true
- case *RunDefers:
- b.rundefers++
- }
- }
- }
-
- // renaming maps an alloc (keyed by index) to its replacement
- // value. Initially the renaming contains nil, signifying the
- // zero constant of the appropriate type; we construct the
- // Const lazily at most once on each path through the domtree.
- // TODO(adonovan): opt: cache per-function not per subtree.
- renaming := make([]Value, numAllocs)
-
- // Renaming.
- rename(fn.Blocks[0], renaming, newPhis)
-
- // Eliminate dead new phis, then prepend the live ones to each block.
- for _, b := range fn.Blocks {
-
- // Compress the newPhis slice to eliminate unused phis.
- // TODO(adonovan): opt: compute liveness to avoid
- // placing phis in blocks for which the alloc cell is
- // not live.
- nps := newPhis[b]
- j := 0
- for _, np := range nps {
- if !phiIsLive(np.phi) {
- // discard it, first removing it from referrers
- for _, newval := range np.phi.Edges {
- if refs := newval.Referrers(); refs != nil {
- *refs = removeInstr(*refs, np.phi)
- }
- }
- continue
- }
- nps[j] = np
- j++
- }
- nps = nps[:j]
-
- rundefersToKill := b.rundefers
- if usesDefer {
- rundefersToKill = 0
- }
-
- if j+b.gaps+rundefersToKill == 0 {
- continue // fast path: no new phis or gaps
- }
-
- // Compact nps + non-nil Instrs into a new slice.
- // TODO(adonovan): opt: compact in situ if there is
- // sufficient space or slack in the slice.
- dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill)
- for i, np := range nps {
- dst[i] = np.phi
- }
- for _, instr := range b.Instrs {
- if instr == nil {
- continue
- }
- if !usesDefer {
- if _, ok := instr.(*RunDefers); ok {
- continue
- }
- }
- dst[j] = instr
- j++
- }
- for i, np := range nps {
- dst[i] = np.phi
- }
- b.Instrs = dst
- }
-
- // Remove any fn.Locals that were lifted.
- j := 0
- for _, l := range fn.Locals {
- if l.index < 0 {
- fn.Locals[j] = l
- j++
- }
- }
- // Nil out fn.Locals[j:] to aid GC.
- for i := j; i < len(fn.Locals); i++ {
- fn.Locals[i] = nil
- }
- fn.Locals = fn.Locals[:j]
-}
-
-func phiIsLive(phi *Phi) bool {
- for _, instr := range *phi.Referrers() {
- if instr == phi {
- continue // self-refs don't count
- }
- if _, ok := instr.(*DebugRef); ok {
- continue // debug refs don't count
- }
- return true
- }
- return false
-}
-
-type blockSet struct{ big.Int } // (inherit methods from Int)
-
-// add adds b to the set and returns true if the set changed.
-func (s *blockSet) add(b *BasicBlock) bool {
- i := b.Index
- if s.Bit(i) != 0 {
- return false
- }
- s.SetBit(&s.Int, i, 1)
- return true
-}
-
-// take removes an arbitrary element from a set s and
-// returns its index, or returns -1 if empty.
-func (s *blockSet) take() int {
- l := s.BitLen()
- for i := 0; i < l; i++ {
- if s.Bit(i) == 1 {
- s.SetBit(&s.Int, i, 0)
- return i
- }
- }
- return -1
-}
-
-// newPhi is a pair of a newly introduced φ-node and the lifted Alloc
-// it replaces.
-type newPhi struct {
- phi *Phi
- alloc *Alloc
-}
-
-// newPhiMap records for each basic block, the set of newPhis that
-// must be prepended to the block.
-type newPhiMap map[*BasicBlock][]newPhi
-
-// liftAlloc determines whether alloc can be lifted into registers,
-// and if so, it populates newPhis with all the φ-nodes it may require
-// and returns true.
-//
-func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap) bool {
- // Don't lift aggregates into registers, because we don't have
- // a way to express their zero-constants.
- switch deref(alloc.Type()).Underlying().(type) {
- case *types.Array, *types.Struct:
- return false
- }
-
- // Don't lift named return values in functions that defer
- // calls that may recover from panic.
- if fn := alloc.Parent(); fn.Recover != nil {
- for _, nr := range fn.namedResults {
- if nr == alloc {
- return false
- }
- }
- }
-
- // Compute defblocks, the set of blocks containing a
- // definition of the alloc cell.
- var defblocks blockSet
- for _, instr := range *alloc.Referrers() {
- // Bail out if we discover the alloc is not liftable;
- // the only operations permitted to use the alloc are
- // loads/stores into the cell, and DebugRef.
- switch instr := instr.(type) {
- case *Store:
- if instr.Val == alloc {
- return false // address used as value
- }
- if instr.Addr != alloc {
- panic("Alloc.Referrers is inconsistent")
- }
- defblocks.add(instr.Block())
- case *UnOp:
- if instr.Op != token.MUL {
- return false // not a load
- }
- if instr.X != alloc {
- panic("Alloc.Referrers is inconsistent")
- }
- case *DebugRef:
- // ok
- default:
- return false // some other instruction
- }
- }
- // The Alloc itself counts as a (zero) definition of the cell.
- defblocks.add(alloc.Block())
-
- if debugLifting {
- fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name())
- }
-
- fn := alloc.Parent()
-
- // Φ-insertion.
- //
- // What follows is the body of the main loop of the insert-φ
- // function described by Cytron et al, but instead of using
- // counter tricks, we just reset the 'hasAlready' and 'work'
- // sets each iteration. These are bitmaps so it's pretty cheap.
- //
- // TODO(adonovan): opt: recycle slice storage for W,
- // hasAlready, defBlocks across liftAlloc calls.
- var hasAlready blockSet
-
- // Initialize W and work to defblocks.
- var work blockSet = defblocks // blocks seen
- var W blockSet // blocks to do
- W.Set(&defblocks.Int)
-
- // Traverse iterated dominance frontier, inserting φ-nodes.
- for i := W.take(); i != -1; i = W.take() {
- u := fn.Blocks[i]
- for _, v := range df[u.Index] {
- if hasAlready.add(v) {
- // Create φ-node.
- // It will be prepended to v.Instrs later, if needed.
- phi := &Phi{
- Edges: make([]Value, len(v.Preds)),
- Comment: alloc.Comment,
- }
- phi.pos = alloc.Pos()
- phi.setType(deref(alloc.Type()))
- phi.block = v
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v)
- }
- newPhis[v] = append(newPhis[v], newPhi{phi, alloc})
-
- if work.add(v) {
- W.add(v)
- }
- }
- }
- }
-
- return true
-}
-
-func ReplaceAll(x, y Value) {
- replaceAll(x, y)
-}
-
-// replaceAll replaces all intraprocedural uses of x with y,
-// updating x.Referrers and y.Referrers.
-// Precondition: x.Referrers() != nil, i.e. x must be local to some function.
-//
-func replaceAll(x, y Value) {
- var rands []*Value
- pxrefs := x.Referrers()
- pyrefs := y.Referrers()
- for _, instr := range *pxrefs {
- rands = instr.Operands(rands[:0]) // recycle storage
- for _, rand := range rands {
- if *rand != nil {
- if *rand == x {
- *rand = y
- }
- }
- }
- if pyrefs != nil {
- *pyrefs = append(*pyrefs, instr) // dups ok
- }
- }
- *pxrefs = nil // x is now unreferenced
-}
-
-// renamed returns the value to which alloc is being renamed,
-// constructing it lazily if it's the implicit zero initialization.
-//
-func renamed(renaming []Value, alloc *Alloc) Value {
- v := renaming[alloc.index]
- if v == nil {
- v = zeroConst(deref(alloc.Type()))
- renaming[alloc.index] = v
- }
- return v
-}
-
-// rename implements the (Cytron et al) SSA renaming algorithm, a
-// preorder traversal of the dominator tree replacing all loads of
-// Alloc cells with the value stored to that cell by the dominating
-// store instruction. For lifting, we need only consider loads,
-// stores and φ-nodes.
-//
-// renaming is a map from *Alloc (keyed by index number) to its
-// dominating stored value; newPhis[x] is the set of new φ-nodes to be
-// prepended to block x.
-//
-func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) {
- // Each φ-node becomes the new name for its associated Alloc.
- for _, np := range newPhis[u] {
- phi := np.phi
- alloc := np.alloc
- renaming[alloc.index] = phi
- }
-
- // Rename loads and stores of allocs.
- for i, instr := range u.Instrs {
- switch instr := instr.(type) {
- case *Alloc:
- if instr.index >= 0 { // store of zero to Alloc cell
- // Replace dominated loads by the zero value.
- renaming[instr.index] = nil
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr)
- }
- // Delete the Alloc.
- u.Instrs[i] = nil
- u.gaps++
- }
-
- case *Store:
- if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell
- // Replace dominated loads by the stored value.
- renaming[alloc.index] = instr.Val
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n",
- instr, instr.Val.Name())
- }
- // Remove the store from the referrer list of the stored value.
- if refs := instr.Val.Referrers(); refs != nil {
- *refs = removeInstr(*refs, instr)
- }
- // Delete the Store.
- u.Instrs[i] = nil
- u.gaps++
- }
-
- case *UnOp:
- if instr.Op == token.MUL {
- if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell
- newval := renamed(renaming, alloc)
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n",
- instr.Name(), instr, newval.Name())
- }
- // Replace all references to
- // the loaded value by the
- // dominating stored value.
- replaceAll(instr, newval)
- // Delete the Load.
- u.Instrs[i] = nil
- u.gaps++
- }
- }
-
- case *DebugRef:
- if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell
- if instr.IsAddr {
- instr.X = renamed(renaming, alloc)
- instr.IsAddr = false
-
- // Add DebugRef to instr.X's referrers.
- if refs := instr.X.Referrers(); refs != nil {
- *refs = append(*refs, instr)
- }
- } else {
- // A source expression denotes the address
- // of an Alloc that was optimized away.
- instr.X = nil
-
- // Delete the DebugRef.
- u.Instrs[i] = nil
- u.gaps++
- }
- }
- }
- }
-
- // For each φ-node in a CFG successor, rename the edge.
- for _, v := range u.Succs {
- phis := newPhis[v]
- if len(phis) == 0 {
- continue
- }
- i := v.predIndex(u)
- for _, np := range phis {
- phi := np.phi
- alloc := np.alloc
- newval := renamed(renaming, alloc)
- if debugLifting {
- fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n",
- phi.Name(), u, v, i, alloc.Name(), newval.Name())
- }
- phi.Edges[i] = newval
- if prefs := newval.Referrers(); prefs != nil {
- *prefs = append(*prefs, phi)
- }
- }
- }
-
- // Continue depth-first recursion over domtree, pushing a
- // fresh copy of the renaming map for each subtree.
- for _, v := range u.dom.children {
- // TODO(adonovan): opt: avoid copy on final iteration; use destructive update.
- r := make([]Value, len(renaming))
- copy(r, renaming)
- rename(v, r, newPhis)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/lvalue.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/lvalue.go
deleted file mode 100644
index d2226a9b4..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/lvalue.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// lvalues are the union of addressable expressions and map-index
-// expressions.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-)
-
-// An lvalue represents an assignable location that may appear on the
-// left-hand side of an assignment. This is a generalization of a
-// pointer to permit updates to elements of maps.
-//
-type lvalue interface {
- store(fn *Function, v Value) // stores v into the location
- load(fn *Function) Value // loads the contents of the location
- address(fn *Function) Value // address of the location
- typ() types.Type // returns the type of the location
-}
-
-// An address is an lvalue represented by a true pointer.
-type address struct {
- addr Value
- pos token.Pos // source position
- expr ast.Expr // source syntax of the value (not address) [debug mode]
-}
-
-func (a *address) load(fn *Function) Value {
- load := emitLoad(fn, a.addr)
- load.pos = a.pos
- return load
-}
-
-func (a *address) store(fn *Function, v Value) {
- store := emitStore(fn, a.addr, v, a.pos)
- if a.expr != nil {
- // store.Val is v, converted for assignability.
- emitDebugRef(fn, a.expr, store.Val, false)
- }
-}
-
-func (a *address) address(fn *Function) Value {
- if a.expr != nil {
- emitDebugRef(fn, a.expr, a.addr, true)
- }
- return a.addr
-}
-
-func (a *address) typ() types.Type {
- return deref(a.addr.Type())
-}
-
-// An element is an lvalue represented by m[k], the location of an
-// element of a map or string. These locations are not addressable
-// since pointers cannot be formed from them, but they do support
-// load(), and in the case of maps, store().
-//
-type element struct {
- m, k Value // map or string
- t types.Type // map element type or string byte type
- pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v)
-}
-
-func (e *element) load(fn *Function) Value {
- l := &Lookup{
- X: e.m,
- Index: e.k,
- }
- l.setPos(e.pos)
- l.setType(e.t)
- return fn.emit(l)
-}
-
-func (e *element) store(fn *Function, v Value) {
- up := &MapUpdate{
- Map: e.m,
- Key: e.k,
- Value: emitConv(fn, v, e.t),
- }
- up.pos = e.pos
- fn.emit(up)
-}
-
-func (e *element) address(fn *Function) Value {
- panic("map/string elements are not addressable")
-}
-
-func (e *element) typ() types.Type {
- return e.t
-}
-
-// A blank is a dummy variable whose name is "_".
-// It is not reified: loads are illegal and stores are ignored.
-//
-type blank struct{}
-
-func (bl blank) load(fn *Function) Value {
- panic("blank.load is illegal")
-}
-
-func (bl blank) store(fn *Function, v Value) {
- s := &BlankStore{
- Val: v,
- }
- fn.emit(s)
-}
-
-func (bl blank) address(fn *Function) Value {
- panic("blank var is not addressable")
-}
-
-func (bl blank) typ() types.Type {
- // This should be the type of the blank Ident; the typechecker
- // doesn't provide this yet, but fortunately, we don't need it
- // yet either.
- panic("blank.typ is unimplemented")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/methods.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/methods.go
deleted file mode 100644
index 7d1fb42b5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/methods.go
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// This file defines utilities for population of method sets.
-
-import (
- "fmt"
- "go/types"
-)
-
-// MethodValue returns the Function implementing method sel, building
-// wrapper methods on demand. It returns nil if sel denotes an
-// abstract (interface) method.
-//
-// Precondition: sel.Kind() == MethodVal.
-//
-// Thread-safe.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) MethodValue(sel *types.Selection) *Function {
- if sel.Kind() != types.MethodVal {
- panic(fmt.Sprintf("Method(%s) kind != MethodVal", sel))
- }
- T := sel.Recv()
- if isInterface(T) {
- return nil // abstract method
- }
- if prog.mode&LogSource != 0 {
- defer logStack("Method %s %v", T, sel)()
- }
-
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- return prog.addMethod(prog.createMethodSet(T), sel)
-}
-
-// LookupMethod returns the implementation of the method of type T
-// identified by (pkg, name). It returns nil if the method exists but
-// is abstract, and panics if T has no such method.
-//
-func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function {
- sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name)
- if sel == nil {
- panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name)))
- }
- return prog.MethodValue(sel)
-}
-
-// methodSet contains the (concrete) methods of a non-interface type.
-type methodSet struct {
- mapping map[string]*Function // populated lazily
- complete bool // mapping contains all methods
-}
-
-// Precondition: !isInterface(T).
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-func (prog *Program) createMethodSet(T types.Type) *methodSet {
- mset, ok := prog.methodSets.At(T).(*methodSet)
- if !ok {
- mset = &methodSet{mapping: make(map[string]*Function)}
- prog.methodSets.Set(T, mset)
- }
- return mset
-}
-
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function {
- if sel.Kind() == types.MethodExpr {
- panic(sel)
- }
- id := sel.Obj().Id()
- fn := mset.mapping[id]
- if fn == nil {
- obj := sel.Obj().(*types.Func)
-
- needsPromotion := len(sel.Index()) > 1
- needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv())
- if needsPromotion || needsIndirection {
- fn = makeWrapper(prog, sel)
- } else {
- fn = prog.declaredFunc(obj)
- }
- if fn.Signature.Recv() == nil {
- panic(fn) // missing receiver
- }
- mset.mapping[id] = fn
- }
- return fn
-}
-
-// RuntimeTypes returns a new unordered slice containing all
-// concrete types in the program for which a complete (non-empty)
-// method set is required at run-time.
-//
-// Thread-safe.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) RuntimeTypes() []types.Type {
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- var res []types.Type
- prog.methodSets.Iterate(func(T types.Type, v interface{}) {
- if v.(*methodSet).complete {
- res = append(res, T)
- }
- })
- return res
-}
-
-// declaredFunc returns the concrete function/method denoted by obj.
-// Panic ensues if there is none.
-//
-func (prog *Program) declaredFunc(obj *types.Func) *Function {
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Function)
- }
- panic("no concrete method: " + obj.String())
-}
-
-// needMethodsOf ensures that runtime type information (including the
-// complete method set) is available for the specified type T and all
-// its subcomponents.
-//
-// needMethodsOf must be called for at least every type that is an
-// operand of some MakeInterface instruction, and for the type of
-// every exported package member.
-//
-// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-//
-// Thread-safe. (Called via emitConv from multiple builder goroutines.)
-//
-// TODO(adonovan): make this faster. It accounts for 20% of SSA build time.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) needMethodsOf(T types.Type) {
- prog.methodsMu.Lock()
- prog.needMethods(T, false)
- prog.methodsMu.Unlock()
-}
-
-// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-// Recursive case: skip => don't create methods for T.
-//
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-//
-func (prog *Program) needMethods(T types.Type, skip bool) {
- // Each package maintains its own set of types it has visited.
- if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok {
- // needMethods(T) was previously called
- if !prevSkip || skip {
- return // already seen, with same or false 'skip' value
- }
- }
- prog.runtimeTypes.Set(T, skip)
-
- tmset := prog.MethodSets.MethodSet(T)
-
- if !skip && !isInterface(T) && tmset.Len() > 0 {
- // Create methods of T.
- mset := prog.createMethodSet(T)
- if !mset.complete {
- mset.complete = true
- n := tmset.Len()
- for i := 0; i < n; i++ {
- prog.addMethod(mset, tmset.At(i))
- }
- }
- }
-
- // Recursion over signatures of each method.
- for i := 0; i < tmset.Len(); i++ {
- sig := tmset.At(i).Type().(*types.Signature)
- prog.needMethods(sig.Params(), false)
- prog.needMethods(sig.Results(), false)
- }
-
- switch t := T.(type) {
- case *types.Basic:
- // nop
-
- case *types.Interface:
- // nop---handled by recursion over method set.
-
- case *types.Pointer:
- prog.needMethods(t.Elem(), false)
-
- case *types.Slice:
- prog.needMethods(t.Elem(), false)
-
- case *types.Chan:
- prog.needMethods(t.Elem(), false)
-
- case *types.Map:
- prog.needMethods(t.Key(), false)
- prog.needMethods(t.Elem(), false)
-
- case *types.Signature:
- if t.Recv() != nil {
- panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
- }
- prog.needMethods(t.Params(), false)
- prog.needMethods(t.Results(), false)
-
- case *types.Named:
- // A pointer-to-named type can be derived from a named
- // type via reflection. It may have methods too.
- prog.needMethods(types.NewPointer(T), false)
-
- // Consider 'type T struct{S}' where S has methods.
- // Reflection provides no way to get from T to struct{S},
- // only to S, so the method set of struct{S} is unwanted,
- // so set 'skip' flag during recursion.
- prog.needMethods(t.Underlying(), true)
-
- case *types.Array:
- prog.needMethods(t.Elem(), false)
-
- case *types.Struct:
- for i, n := 0, t.NumFields(); i < n; i++ {
- prog.needMethods(t.Field(i).Type(), false)
- }
-
- case *types.Tuple:
- for i, n := 0, t.Len(); i < n; i++ {
- prog.needMethods(t.At(i).Type(), false)
- }
-
- default:
- panic(T)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/mode.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/mode.go
deleted file mode 100644
index d2a269893..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/mode.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the BuilderMode type and its command-line flag.
-
-import (
- "bytes"
- "fmt"
-)
-
-// BuilderMode is a bitmask of options for diagnostics and checking.
-//
-// *BuilderMode satisfies the flag.Value interface. Example:
-//
-// var mode = ssa.BuilderMode(0)
-// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) }
-//
-type BuilderMode uint
-
-const (
- PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout
- PrintFunctions // Print function SSA code to stdout
- LogSource // Log source locations as SSA builder progresses
- SanityCheckFunctions // Perform sanity checking of function bodies
- NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers
- BuildSerially // Build packages serially, not in parallel.
- GlobalDebug // Enable debug info for all packages
- BareInits // Build init functions without guards or calls to dependent inits
-)
-
-const BuilderModeDoc = `Options controlling the SSA builder.
-The value is a sequence of zero or more of these letters:
-C perform sanity [C]hecking of the SSA form.
-D include [D]ebug info for every function.
-P print [P]ackage inventory.
-F print [F]unction SSA code.
-S log [S]ource locations as SSA builder progresses.
-L build distinct packages seria[L]ly instead of in parallel.
-N build [N]aive SSA form: don't replace local loads/stores with registers.
-I build bare [I]nit functions: no init guards or calls to dependent inits.
-`
-
-func (m BuilderMode) String() string {
- var buf bytes.Buffer
- if m&GlobalDebug != 0 {
- buf.WriteByte('D')
- }
- if m&PrintPackages != 0 {
- buf.WriteByte('P')
- }
- if m&PrintFunctions != 0 {
- buf.WriteByte('F')
- }
- if m&LogSource != 0 {
- buf.WriteByte('S')
- }
- if m&SanityCheckFunctions != 0 {
- buf.WriteByte('C')
- }
- if m&NaiveForm != 0 {
- buf.WriteByte('N')
- }
- if m&BuildSerially != 0 {
- buf.WriteByte('L')
- }
- return buf.String()
-}
-
-// Set parses the flag characters in s and updates *m.
-func (m *BuilderMode) Set(s string) error {
- var mode BuilderMode
- for _, c := range s {
- switch c {
- case 'D':
- mode |= GlobalDebug
- case 'P':
- mode |= PrintPackages
- case 'F':
- mode |= PrintFunctions
- case 'S':
- mode |= LogSource | BuildSerially
- case 'C':
- mode |= SanityCheckFunctions
- case 'N':
- mode |= NaiveForm
- case 'L':
- mode |= BuildSerially
- default:
- return fmt.Errorf("unknown BuilderMode option: %q", c)
- }
- }
- *m = mode
- return nil
-}
-
-// Get returns m.
-func (m BuilderMode) Get() interface{} { return m }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/print.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/print.go
deleted file mode 100644
index a7deb8810..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/print.go
+++ /dev/null
@@ -1,433 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// This file implements the String() methods for all Value and
-// Instruction types.
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "io"
- "reflect"
- "sort"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// relName returns the name of v relative to i.
-// In most cases, this is identical to v.Name(), but references to
-// Functions (including methods) and Globals use RelString and
-// all types are displayed with relType, so that only cross-package
-// references are package-qualified.
-//
-func relName(v Value, i Instruction) string {
- var from *types.Package
- if i != nil {
- from = i.Parent().pkg()
- }
- switch v := v.(type) {
- case Member: // *Function or *Global
- return v.RelString(from)
- case *Const:
- return v.RelString(from)
- }
- return v.Name()
-}
-
-func relType(t types.Type, from *types.Package) string {
- return types.TypeString(t, types.RelativeTo(from))
-}
-
-func relString(m Member, from *types.Package) string {
- // NB: not all globals have an Object (e.g. init$guard),
- // so use Package().Object not Object.Package().
- if pkg := m.Package().Pkg; pkg != nil && pkg != from {
- return fmt.Sprintf("%s.%s", pkg.Path(), m.Name())
- }
- return m.Name()
-}
-
-// Value.String()
-//
-// This method is provided only for debugging.
-// It never appears in disassembly, which uses Value.Name().
-
-func (v *Parameter) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from))
-}
-
-func (v *FreeVar) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from))
-}
-
-func (v *Builtin) String() string {
- return fmt.Sprintf("builtin %s", v.Name())
-}
-
-// Instruction.String()
-
-func (v *Alloc) String() string {
- op := "local"
- if v.Heap {
- op = "new"
- }
- from := v.Parent().pkg()
- return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment)
-}
-
-func (v *Phi) String() string {
- var b bytes.Buffer
- b.WriteString("φ [")
- for i, edge := range v.Edges {
- if i > 0 {
- b.WriteString(", ")
- }
- // Be robust against malformed CFG.
- block := -1
- if v.block != nil && i < len(v.block.Preds) {
- block = v.block.Preds[i].Index
- }
- fmt.Fprintf(&b, "%d: ", block)
- edgeVal := "" // be robust
- if edge != nil {
- edgeVal = relName(edge, v)
- }
- b.WriteString(edgeVal)
- }
- b.WriteString("]")
- if v.Comment != "" {
- b.WriteString(" #")
- b.WriteString(v.Comment)
- }
- return b.String()
-}
-
-func printCall(v *CallCommon, prefix string, instr Instruction) string {
- var b bytes.Buffer
- b.WriteString(prefix)
- if !v.IsInvoke() {
- b.WriteString(relName(v.Value, instr))
- } else {
- fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name())
- }
- b.WriteString("(")
- for i, arg := range v.Args {
- if i > 0 {
- b.WriteString(", ")
- }
- b.WriteString(relName(arg, instr))
- }
- if v.Signature().Variadic() {
- b.WriteString("...")
- }
- b.WriteString(")")
- return b.String()
-}
-
-func (c *CallCommon) String() string {
- return printCall(c, "", nil)
-}
-
-func (v *Call) String() string {
- return printCall(&v.Call, "", v)
-}
-
-func (v *BinOp) String() string {
- return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v))
-}
-
-func (v *UnOp) String() string {
- return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk))
-}
-
-func printConv(prefix string, v, x Value) string {
- from := v.Parent().pkg()
- return fmt.Sprintf("%s %s <- %s (%s)",
- prefix,
- relType(v.Type(), from),
- relType(x.Type(), from),
- relName(x, v.(Instruction)))
-}
-
-func (v *ChangeType) String() string { return printConv("changetype", v, v.X) }
-func (v *Convert) String() string { return printConv("convert", v, v.X) }
-func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) }
-func (v *MakeInterface) String() string { return printConv("make", v, v.X) }
-
-func (v *MakeClosure) String() string {
- var b bytes.Buffer
- fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v))
- if v.Bindings != nil {
- b.WriteString(" [")
- for i, c := range v.Bindings {
- if i > 0 {
- b.WriteString(", ")
- }
- b.WriteString(relName(c, v))
- }
- b.WriteString("]")
- }
- return b.String()
-}
-
-func (v *MakeSlice) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s %s",
- relType(v.Type(), from),
- relName(v.Len, v),
- relName(v.Cap, v))
-}
-
-func (v *Slice) String() string {
- var b bytes.Buffer
- b.WriteString("slice ")
- b.WriteString(relName(v.X, v))
- b.WriteString("[")
- if v.Low != nil {
- b.WriteString(relName(v.Low, v))
- }
- b.WriteString(":")
- if v.High != nil {
- b.WriteString(relName(v.High, v))
- }
- if v.Max != nil {
- b.WriteString(":")
- b.WriteString(relName(v.Max, v))
- }
- b.WriteString("]")
- return b.String()
-}
-
-func (v *MakeMap) String() string {
- res := ""
- if v.Reserve != nil {
- res = relName(v.Reserve, v)
- }
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s", relType(v.Type(), from), res)
-}
-
-func (v *MakeChan) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v))
-}
-
-func (v *FieldAddr) String() string {
- st := deref(v.X.Type()).Underlying().(*types.Struct)
- // Be robust against a bad index.
- name := "?"
- if 0 <= v.Field && v.Field < st.NumFields() {
- name = st.Field(v.Field).Name()
- }
- return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field)
-}
-
-func (v *Field) String() string {
- st := v.X.Type().Underlying().(*types.Struct)
- // Be robust against a bad index.
- name := "?"
- if 0 <= v.Field && v.Field < st.NumFields() {
- name = st.Field(v.Field).Name()
- }
- return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field)
-}
-
-func (v *IndexAddr) String() string {
- return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v))
-}
-
-func (v *Index) String() string {
- return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v))
-}
-
-func (v *Lookup) String() string {
- return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk))
-}
-
-func (v *Range) String() string {
- return "range " + relName(v.X, v)
-}
-
-func (v *Next) String() string {
- return "next " + relName(v.Iter, v)
-}
-
-func (v *TypeAssert) String() string {
- from := v.Parent().pkg()
- return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from))
-}
-
-func (v *Extract) String() string {
- return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index)
-}
-
-func (s *Jump) String() string {
- // Be robust against malformed CFG.
- block := -1
- if s.block != nil && len(s.block.Succs) == 1 {
- block = s.block.Succs[0].Index
- }
- return fmt.Sprintf("jump %d", block)
-}
-
-func (s *If) String() string {
- // Be robust against malformed CFG.
- tblock, fblock := -1, -1
- if s.block != nil && len(s.block.Succs) == 2 {
- tblock = s.block.Succs[0].Index
- fblock = s.block.Succs[1].Index
- }
- return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock)
-}
-
-func (s *Go) String() string {
- return printCall(&s.Call, "go ", s)
-}
-
-func (s *Panic) String() string {
- return "panic " + relName(s.X, s)
-}
-
-func (s *Return) String() string {
- var b bytes.Buffer
- b.WriteString("return")
- for i, r := range s.Results {
- if i == 0 {
- b.WriteString(" ")
- } else {
- b.WriteString(", ")
- }
- b.WriteString(relName(r, s))
- }
- return b.String()
-}
-
-func (*RunDefers) String() string {
- return "rundefers"
-}
-
-func (s *Send) String() string {
- return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s))
-}
-
-func (s *Defer) String() string {
- return printCall(&s.Call, "defer ", s)
-}
-
-func (s *Select) String() string {
- var b bytes.Buffer
- for i, st := range s.States {
- if i > 0 {
- b.WriteString(", ")
- }
- if st.Dir == types.RecvOnly {
- b.WriteString("<-")
- b.WriteString(relName(st.Chan, s))
- } else {
- b.WriteString(relName(st.Chan, s))
- b.WriteString("<-")
- b.WriteString(relName(st.Send, s))
- }
- }
- non := ""
- if !s.Blocking {
- non = "non"
- }
- return fmt.Sprintf("select %sblocking [%s]", non, b.String())
-}
-
-func (s *Store) String() string {
- return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s))
-}
-
-func (s *BlankStore) String() string {
- return fmt.Sprintf("_ = %s", relName(s.Val, s))
-}
-
-func (s *MapUpdate) String() string {
- return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s))
-}
-
-func (s *DebugRef) String() string {
- p := s.Parent().Prog.Fset.Position(s.Pos())
- var descr interface{}
- if s.object != nil {
- descr = s.object // e.g. "var x int"
- } else {
- descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr"
- }
- var addr string
- if s.IsAddr {
- addr = "address of "
- }
- return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name())
-}
-
-func (p *Package) String() string {
- return "package " + p.Pkg.Path()
-}
-
-var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer
-
-func (p *Package) WriteTo(w io.Writer) (int64, error) {
- var buf bytes.Buffer
- WritePackage(&buf, p)
- n, err := w.Write(buf.Bytes())
- return int64(n), err
-}
-
-// WritePackage writes to buf a human-readable summary of p.
-func WritePackage(buf *bytes.Buffer, p *Package) {
- fmt.Fprintf(buf, "%s:\n", p)
-
- var names []string
- maxname := 0
- for name := range p.Members {
- if l := len(name); l > maxname {
- maxname = l
- }
- names = append(names, name)
- }
-
- from := p.Pkg
- sort.Strings(names)
- for _, name := range names {
- switch mem := p.Members[name].(type) {
- case *NamedConst:
- fmt.Fprintf(buf, " const %-*s %s = %s\n",
- maxname, name, mem.Name(), mem.Value.RelString(from))
-
- case *Function:
- fmt.Fprintf(buf, " func %-*s %s\n",
- maxname, name, relType(mem.Type(), from))
-
- case *Type:
- fmt.Fprintf(buf, " type %-*s %s\n",
- maxname, name, relType(mem.Type().Underlying(), from))
- for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
- fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from)))
- }
-
- case *Global:
- fmt.Fprintf(buf, " var %-*s %s\n",
- maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
- }
- }
-
- fmt.Fprintf(buf, "\n")
-}
-
-func commaOk(x bool) string {
- if x {
- return ",ok"
- }
- return ""
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/sanity.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/sanity.go
deleted file mode 100644
index bd7377ce5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/sanity.go
+++ /dev/null
@@ -1,523 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// An optional pass for sanity-checking invariants of the SSA representation.
-// Currently it checks CFG invariants but little at the instruction level.
-
-import (
- "fmt"
- "go/types"
- "io"
- "os"
- "strings"
-)
-
-type sanity struct {
- reporter io.Writer
- fn *Function
- block *BasicBlock
- instrs map[Instruction]struct{}
- insane bool
-}
-
-// sanityCheck performs integrity checking of the SSA representation
-// of the function fn and returns true if it was valid. Diagnostics
-// are written to reporter if non-nil, os.Stderr otherwise. Some
-// diagnostics are only warnings and do not imply a negative result.
-//
-// Sanity-checking is intended to facilitate the debugging of code
-// transformation passes.
-//
-func sanityCheck(fn *Function, reporter io.Writer) bool {
- if reporter == nil {
- reporter = os.Stderr
- }
- return (&sanity{reporter: reporter}).checkFunction(fn)
-}
-
-// mustSanityCheck is like sanityCheck but panics instead of returning
-// a negative result.
-//
-func mustSanityCheck(fn *Function, reporter io.Writer) {
- if !sanityCheck(fn, reporter) {
- fn.WriteTo(os.Stderr)
- panic("SanityCheck failed")
- }
-}
-
-func (s *sanity) diagnostic(prefix, format string, args ...interface{}) {
- fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn)
- if s.block != nil {
- fmt.Fprintf(s.reporter, ", block %s", s.block)
- }
- io.WriteString(s.reporter, ": ")
- fmt.Fprintf(s.reporter, format, args...)
- io.WriteString(s.reporter, "\n")
-}
-
-func (s *sanity) errorf(format string, args ...interface{}) {
- s.insane = true
- s.diagnostic("Error", format, args...)
-}
-
-func (s *sanity) warnf(format string, args ...interface{}) {
- s.diagnostic("Warning", format, args...)
-}
-
-// findDuplicate returns an arbitrary basic block that appeared more
-// than once in blocks, or nil if all were unique.
-func findDuplicate(blocks []*BasicBlock) *BasicBlock {
- if len(blocks) < 2 {
- return nil
- }
- if blocks[0] == blocks[1] {
- return blocks[0]
- }
- // Slow path:
- m := make(map[*BasicBlock]bool)
- for _, b := range blocks {
- if m[b] {
- return b
- }
- m[b] = true
- }
- return nil
-}
-
-func (s *sanity) checkInstr(idx int, instr Instruction) {
- switch instr := instr.(type) {
- case *If, *Jump, *Return, *Panic:
- s.errorf("control flow instruction not at end of block")
- case *Phi:
- if idx == 0 {
- // It suffices to apply this check to just the first phi node.
- if dup := findDuplicate(s.block.Preds); dup != nil {
- s.errorf("phi node in block with duplicate predecessor %s", dup)
- }
- } else {
- prev := s.block.Instrs[idx-1]
- if _, ok := prev.(*Phi); !ok {
- s.errorf("Phi instruction follows a non-Phi: %T", prev)
- }
- }
- if ne, np := len(instr.Edges), len(s.block.Preds); ne != np {
- s.errorf("phi node has %d edges but %d predecessors", ne, np)
-
- } else {
- for i, e := range instr.Edges {
- if e == nil {
- s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i])
- }
- }
- }
-
- case *Alloc:
- if !instr.Heap {
- found := false
- for _, l := range s.fn.Locals {
- if l == instr {
- found = true
- break
- }
- }
- if !found {
- s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr)
- }
- }
-
- case *BinOp:
- case *Call:
- case *ChangeInterface:
- case *ChangeType:
- case *Convert:
- if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok {
- if _, ok := instr.Type().Underlying().(*types.Basic); !ok {
- s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type())
- }
- }
-
- case *Defer:
- case *Extract:
- case *Field:
- case *FieldAddr:
- case *Go:
- case *Index:
- case *IndexAddr:
- case *Lookup:
- case *MakeChan:
- case *MakeClosure:
- numFree := len(instr.Fn.(*Function).FreeVars)
- numBind := len(instr.Bindings)
- if numFree != numBind {
- s.errorf("MakeClosure has %d Bindings for function %s with %d free vars",
- numBind, instr.Fn, numFree)
-
- }
- if recv := instr.Type().(*types.Signature).Recv(); recv != nil {
- s.errorf("MakeClosure's type includes receiver %s", recv.Type())
- }
-
- case *MakeInterface:
- case *MakeMap:
- case *MakeSlice:
- case *MapUpdate:
- case *Next:
- case *Range:
- case *RunDefers:
- case *Select:
- case *Send:
- case *Slice:
- case *Store:
- case *TypeAssert:
- case *UnOp:
- case *DebugRef:
- case *BlankStore:
- case *Sigma:
- // TODO(adonovan): implement checks.
- default:
- panic(fmt.Sprintf("Unknown instruction type: %T", instr))
- }
-
- if call, ok := instr.(CallInstruction); ok {
- if call.Common().Signature() == nil {
- s.errorf("nil signature: %s", call)
- }
- }
-
- // Check that value-defining instructions have valid types
- // and a valid referrer list.
- if v, ok := instr.(Value); ok {
- t := v.Type()
- if t == nil {
- s.errorf("no type: %s = %s", v.Name(), v)
- } else if t == tRangeIter {
- // not a proper type; ignore.
- } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
- s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t)
- }
- s.checkReferrerList(v)
- }
-
- // Untyped constants are legal as instruction Operands(),
- // for example:
- // _ = "foo"[0]
- // or:
- // if wordsize==64 {...}
-
- // All other non-Instruction Values can be found via their
- // enclosing Function or Package.
-}
-
-func (s *sanity) checkFinalInstr(idx int, instr Instruction) {
- switch instr := instr.(type) {
- case *If:
- if nsuccs := len(s.block.Succs); nsuccs != 2 {
- s.errorf("If-terminated block has %d successors; expected 2", nsuccs)
- return
- }
- if s.block.Succs[0] == s.block.Succs[1] {
- s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0])
- return
- }
-
- case *Jump:
- if nsuccs := len(s.block.Succs); nsuccs != 1 {
- s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs)
- return
- }
-
- case *Return:
- if nsuccs := len(s.block.Succs); nsuccs != 0 {
- s.errorf("Return-terminated block has %d successors; expected none", nsuccs)
- return
- }
- if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na {
- s.errorf("%d-ary return in %d-ary function", na, nf)
- }
-
- case *Panic:
- if nsuccs := len(s.block.Succs); nsuccs != 0 {
- s.errorf("Panic-terminated block has %d successors; expected none", nsuccs)
- return
- }
-
- default:
- s.errorf("non-control flow instruction at end of block")
- }
-}
-
-func (s *sanity) checkBlock(b *BasicBlock, index int) {
- s.block = b
-
- if b.Index != index {
- s.errorf("block has incorrect Index %d", b.Index)
- }
- if b.parent != s.fn {
- s.errorf("block has incorrect parent %s", b.parent)
- }
-
- // Check all blocks are reachable.
- // (The entry block is always implicitly reachable,
- // as is the Recover block, if any.)
- if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 {
- s.warnf("unreachable block")
- if b.Instrs == nil {
- // Since this block is about to be pruned,
- // tolerating transient problems in it
- // simplifies other optimizations.
- return
- }
- }
-
- // Check predecessor and successor relations are dual,
- // and that all blocks in CFG belong to same function.
- for _, a := range b.Preds {
- found := false
- for _, bb := range a.Succs {
- if bb == b {
- found = true
- break
- }
- }
- if !found {
- s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs)
- }
- if a.parent != s.fn {
- s.errorf("predecessor %s belongs to different function %s", a, a.parent)
- }
- }
- for _, c := range b.Succs {
- found := false
- for _, bb := range c.Preds {
- if bb == b {
- found = true
- break
- }
- }
- if !found {
- s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds)
- }
- if c.parent != s.fn {
- s.errorf("successor %s belongs to different function %s", c, c.parent)
- }
- }
-
- // Check each instruction is sane.
- n := len(b.Instrs)
- if n == 0 {
- s.errorf("basic block contains no instructions")
- }
- var rands [10]*Value // reuse storage
- for j, instr := range b.Instrs {
- if instr == nil {
- s.errorf("nil instruction at index %d", j)
- continue
- }
- if b2 := instr.Block(); b2 == nil {
- s.errorf("nil Block() for instruction at index %d", j)
- continue
- } else if b2 != b {
- s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j)
- continue
- }
- if j < n-1 {
- s.checkInstr(j, instr)
- } else {
- s.checkFinalInstr(j, instr)
- }
-
- // Check Instruction.Operands.
- operands:
- for i, op := range instr.Operands(rands[:0]) {
- if op == nil {
- s.errorf("nil operand pointer %d of %s", i, instr)
- continue
- }
- val := *op
- if val == nil {
- continue // a nil operand is ok
- }
-
- // Check that "untyped" types only appear on constant operands.
- if _, ok := (*op).(*Const); !ok {
- if basic, ok := (*op).Type().(*types.Basic); ok {
- if basic.Info()&types.IsUntyped != 0 {
- s.errorf("operand #%d of %s is untyped: %s", i, instr, basic)
- }
- }
- }
-
- // Check that Operands that are also Instructions belong to same function.
- // TODO(adonovan): also check their block dominates block b.
- if val, ok := val.(Instruction); ok {
- if val.Parent() != s.fn {
- s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent())
- }
- }
-
- // Check that each function-local operand of
- // instr refers back to instr. (NB: quadratic)
- switch val := val.(type) {
- case *Const, *Global, *Builtin:
- continue // not local
- case *Function:
- if val.parent == nil {
- continue // only anon functions are local
- }
- }
-
- // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined.
-
- if refs := val.Referrers(); refs != nil {
- for _, ref := range *refs {
- if ref == instr {
- continue operands
- }
- }
- s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val)
- } else {
- s.errorf("operand %d of %s (%s) has no referrers", i, instr, val)
- }
- }
- }
-}
-
-func (s *sanity) checkReferrerList(v Value) {
- refs := v.Referrers()
- if refs == nil {
- s.errorf("%s has missing referrer list", v.Name())
- return
- }
- for i, ref := range *refs {
- if _, ok := s.instrs[ref]; !ok {
- s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref)
- }
- }
-}
-
-func (s *sanity) checkFunction(fn *Function) bool {
- // TODO(adonovan): check Function invariants:
- // - check params match signature
- // - check transient fields are nil
- // - warn if any fn.Locals do not appear among block instructions.
- s.fn = fn
- if fn.Prog == nil {
- s.errorf("nil Prog")
- }
-
- fn.String() // must not crash
- fn.RelString(fn.pkg()) // must not crash
-
- // All functions have a package, except delegates (which are
- // shared across packages, or duplicated as weak symbols in a
- // separate-compilation model), and error.Error.
- if fn.Pkg == nil {
- if strings.HasPrefix(fn.Synthetic, "wrapper ") ||
- strings.HasPrefix(fn.Synthetic, "bound ") ||
- strings.HasPrefix(fn.Synthetic, "thunk ") ||
- strings.HasSuffix(fn.name, "Error") {
- // ok
- } else {
- s.errorf("nil Pkg")
- }
- }
- if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn {
- s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
- }
- for i, l := range fn.Locals {
- if l.Parent() != fn {
- s.errorf("Local %s at index %d has wrong parent", l.Name(), i)
- }
- if l.Heap {
- s.errorf("Local %s at index %d has Heap flag set", l.Name(), i)
- }
- }
- // Build the set of valid referrers.
- s.instrs = make(map[Instruction]struct{})
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- s.instrs[instr] = struct{}{}
- }
- }
- for i, p := range fn.Params {
- if p.Parent() != fn {
- s.errorf("Param %s at index %d has wrong parent", p.Name(), i)
- }
- s.checkReferrerList(p)
- }
- for i, fv := range fn.FreeVars {
- if fv.Parent() != fn {
- s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i)
- }
- s.checkReferrerList(fv)
- }
-
- if fn.Blocks != nil && len(fn.Blocks) == 0 {
- // Function _had_ blocks (so it's not external) but
- // they were "optimized" away, even the entry block.
- s.errorf("Blocks slice is non-nil but empty")
- }
- for i, b := range fn.Blocks {
- if b == nil {
- s.warnf("nil *BasicBlock at f.Blocks[%d]", i)
- continue
- }
- s.checkBlock(b, i)
- }
- if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover {
- s.errorf("Recover block is not in Blocks slice")
- }
-
- s.block = nil
- for i, anon := range fn.AnonFuncs {
- if anon.Parent() != fn {
- s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent())
- }
- }
- s.fn = nil
- return !s.insane
-}
-
-// sanityCheckPackage checks invariants of packages upon creation.
-// It does not require that the package is built.
-// Unlike sanityCheck (for functions), it just panics at the first error.
-func sanityCheckPackage(pkg *Package) {
- if pkg.Pkg == nil {
- panic(fmt.Sprintf("Package %s has no Object", pkg))
- }
- pkg.String() // must not crash
-
- for name, mem := range pkg.Members {
- if name != mem.Name() {
- panic(fmt.Sprintf("%s: %T.Name() = %s, want %s",
- pkg.Pkg.Path(), mem, mem.Name(), name))
- }
- obj := mem.Object()
- if obj == nil {
- // This check is sound because fields
- // {Global,Function}.object have type
- // types.Object. (If they were declared as
- // *types.{Var,Func}, we'd have a non-empty
- // interface containing a nil pointer.)
-
- continue // not all members have typechecker objects
- }
- if obj.Name() != name {
- if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") {
- // Ok. The name of a declared init function varies between
- // its types.Func ("init") and its ssa.Function ("init#%d").
- } else {
- panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s",
- pkg.Pkg.Path(), mem, obj.Name(), name))
- }
- }
- if obj.Pos() != mem.Pos() {
- panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos()))
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/source.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/source.go
deleted file mode 100644
index e17e02346..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/source.go
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// This file defines utilities for working with source positions
-// or source-level named entities ("objects").
-
-// TODO(adonovan): test that {Value,Instruction}.Pos() positions match
-// the originating syntax, as specified.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
- "log"
-)
-
-// EnclosingFunction returns the function that contains the syntax
-// node denoted by path.
-//
-// Syntax associated with package-level variable specifications is
-// enclosed by the package's init() function.
-//
-// Returns nil if not found; reasons might include:
-// - the node is not enclosed by any function.
-// - the node is within an anonymous function (FuncLit) and
-// its SSA function has not been created yet
-// (pkg.Build() has not yet been called).
-//
-func EnclosingFunction(pkg *Package, path []ast.Node) *Function {
- // Start with package-level function...
- fn := findEnclosingPackageLevelFunction(pkg, path)
- if fn == nil {
- return nil // not in any function
- }
-
- // ...then walk down the nested anonymous functions.
- n := len(path)
-outer:
- for i := range path {
- if lit, ok := path[n-1-i].(*ast.FuncLit); ok {
- for _, anon := range fn.AnonFuncs {
- if anon.Pos() == lit.Type.Func {
- fn = anon
- continue outer
- }
- }
- // SSA function not found:
- // - package not yet built, or maybe
- // - builder skipped FuncLit in dead block
- // (in principle; but currently the Builder
- // generates even dead FuncLits).
- return nil
- }
- }
- return fn
-}
-
-// HasEnclosingFunction returns true if the AST node denoted by path
-// is contained within the declaration of some function or
-// package-level variable.
-//
-// Unlike EnclosingFunction, the behaviour of this function does not
-// depend on whether SSA code for pkg has been built, so it can be
-// used to quickly reject check inputs that will cause
-// EnclosingFunction to fail, prior to SSA building.
-//
-func HasEnclosingFunction(pkg *Package, path []ast.Node) bool {
- return findEnclosingPackageLevelFunction(pkg, path) != nil
-}
-
-// findEnclosingPackageLevelFunction returns the Function
-// corresponding to the package-level function enclosing path.
-//
-func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function {
- if n := len(path); n >= 2 { // [... {Gen,Func}Decl File]
- switch decl := path[n-2].(type) {
- case *ast.GenDecl:
- if decl.Tok == token.VAR && n >= 3 {
- // Package-level 'var' initializer.
- return pkg.init
- }
-
- case *ast.FuncDecl:
- if decl.Recv == nil && decl.Name.Name == "init" {
- // Explicit init() function.
- for _, b := range pkg.init.Blocks {
- for _, instr := range b.Instrs {
- if instr, ok := instr.(*Call); ok {
- if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos {
- return callee
- }
- }
- }
- }
- // Hack: return non-nil when SSA is not yet
- // built so that HasEnclosingFunction works.
- return pkg.init
- }
- // Declared function/method.
- return findNamedFunc(pkg, decl.Name.NamePos)
- }
- }
- return nil // not in any function
-}
-
-// findNamedFunc returns the named function whose FuncDecl.Ident is at
-// position pos.
-//
-func findNamedFunc(pkg *Package, pos token.Pos) *Function {
- // Look at all package members and method sets of named types.
- // Not very efficient.
- for _, mem := range pkg.Members {
- switch mem := mem.(type) {
- case *Function:
- if mem.Pos() == pos {
- return mem
- }
- case *Type:
- mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
- for i, n := 0, mset.Len(); i < n; i++ {
- // Don't call Program.Method: avoid creating wrappers.
- obj := mset.At(i).Obj().(*types.Func)
- if obj.Pos() == pos {
- if pkg.values[obj] == nil {
- log.Println(obj)
- }
- return pkg.values[obj].(*Function)
- }
- }
- }
- }
- return nil
-}
-
-// ValueForExpr returns the SSA Value that corresponds to non-constant
-// expression e.
-//
-// It returns nil if no value was found, e.g.
-// - the expression is not lexically contained within f;
-// - f was not built with debug information; or
-// - e is a constant expression. (For efficiency, no debug
-// information is stored for constants. Use
-// go/types.Info.Types[e].Value instead.)
-// - e is a reference to nil or a built-in function.
-// - the value was optimised away.
-//
-// If e is an addressable expression used in an lvalue context,
-// value is the address denoted by e, and isAddr is true.
-//
-// The types of e (or &e, if isAddr) and the result are equal
-// (modulo "untyped" bools resulting from comparisons).
-//
-// (Tip: to find the ssa.Value given a source position, use
-// importer.PathEnclosingInterval to locate the ast.Node, then
-// EnclosingFunction to locate the Function, then ValueForExpr to find
-// the ssa.Value.)
-//
-func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) {
- if f.debugInfo() { // (opt)
- e = unparen(e)
- for _, b := range f.Blocks {
- for _, instr := range b.Instrs {
- if ref, ok := instr.(*DebugRef); ok {
- if ref.Expr == e {
- return ref.X, ref.IsAddr
- }
- }
- }
- }
- }
- return
-}
-
-// --- Lookup functions for source-level named entities (types.Objects) ---
-
-// Package returns the SSA Package corresponding to the specified
-// type-checker package object.
-// It returns nil if no such SSA package has been created.
-//
-func (prog *Program) Package(obj *types.Package) *Package {
- return prog.packages[obj]
-}
-
-// packageLevelValue returns the package-level value corresponding to
-// the specified named object, which may be a package-level const
-// (*Const), var (*Global) or func (*Function) of some package in
-// prog. It returns nil if the object is not found.
-//
-func (prog *Program) packageLevelValue(obj types.Object) Value {
- if pkg, ok := prog.packages[obj.Pkg()]; ok {
- return pkg.values[obj]
- }
- return nil
-}
-
-// FuncValue returns the concrete Function denoted by the source-level
-// named function obj, or nil if obj denotes an interface method.
-//
-// TODO(adonovan): check the invariant that obj.Type() matches the
-// result's Signature, both in the params/results and in the receiver.
-//
-func (prog *Program) FuncValue(obj *types.Func) *Function {
- fn, _ := prog.packageLevelValue(obj).(*Function)
- return fn
-}
-
-// ConstValue returns the SSA Value denoted by the source-level named
-// constant obj.
-//
-func (prog *Program) ConstValue(obj *types.Const) *Const {
- // TODO(adonovan): opt: share (don't reallocate)
- // Consts for const objects and constant ast.Exprs.
-
- // Universal constant? {true,false,nil}
- if obj.Parent() == types.Universe {
- return NewConst(obj.Val(), obj.Type())
- }
- // Package-level named constant?
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Const)
- }
- return NewConst(obj.Val(), obj.Type())
-}
-
-// VarValue returns the SSA Value that corresponds to a specific
-// identifier denoting the source-level named variable obj.
-//
-// VarValue returns nil if a local variable was not found, perhaps
-// because its package was not built, the debug information was not
-// requested during SSA construction, or the value was optimized away.
-//
-// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval),
-// and that ident must resolve to obj.
-//
-// pkg is the package enclosing the reference. (A reference to a var
-// always occurs within a function, so we need to know where to find it.)
-//
-// If the identifier is a field selector and its base expression is
-// non-addressable, then VarValue returns the value of that field.
-// For example:
-// func f() struct {x int}
-// f().x // VarValue(x) returns a *Field instruction of type int
-//
-// All other identifiers denote addressable locations (variables).
-// For them, VarValue may return either the variable's address or its
-// value, even when the expression is evaluated only for its value; the
-// situation is reported by isAddr, the second component of the result.
-//
-// If !isAddr, the returned value is the one associated with the
-// specific identifier. For example,
-// var x int // VarValue(x) returns Const 0 here
-// x = 1 // VarValue(x) returns Const 1 here
-//
-// It is not specified whether the value or the address is returned in
-// any particular case, as it may depend upon optimizations performed
-// during SSA code generation, such as registerization, constant
-// folding, avoidance of materialization of subexpressions, etc.
-//
-func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) {
- // All references to a var are local to some function, possibly init.
- fn := EnclosingFunction(pkg, ref)
- if fn == nil {
- return // e.g. def of struct field; SSA not built?
- }
-
- id := ref[0].(*ast.Ident)
-
- // Defining ident of a parameter?
- if id.Pos() == obj.Pos() {
- for _, param := range fn.Params {
- if param.Object() == obj {
- return param, false
- }
- }
- }
-
- // Other ident?
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- if dr, ok := instr.(*DebugRef); ok {
- if dr.Pos() == id.Pos() {
- return dr.X, dr.IsAddr
- }
- }
- }
- }
-
- // Defining ident of package-level var?
- if v := prog.packageLevelValue(obj); v != nil {
- return v.(*Global), true
- }
-
- return // e.g. debug info not requested, or var optimized away
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssa.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssa.go
deleted file mode 100644
index ed280c7d5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssa.go
+++ /dev/null
@@ -1,1751 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// This package defines a high-level intermediate representation for
-// Go programs using static single-assignment (SSA) form.
-
-import (
- "fmt"
- "go/ast"
- exact "go/constant"
- "go/token"
- "go/types"
- "sync"
-
- "golang.org/x/tools/go/types/typeutil"
-)
-
-// A Program is a partial or complete Go program converted to SSA form.
-type Program struct {
- Fset *token.FileSet // position information for the files of this Program
- imported map[string]*Package // all importable Packages, keyed by import path
- packages map[*types.Package]*Package // all loaded Packages, keyed by object
- mode BuilderMode // set of mode bits for SSA construction
- MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets
-
- methodsMu sync.Mutex // guards the following maps:
- methodSets typeutil.Map // maps type to its concrete methodSet
- runtimeTypes typeutil.Map // types for which rtypes are needed
- canon typeutil.Map // type canonicalization map
- bounds map[*types.Func]*Function // bounds for curried x.Method closures
- thunks map[selectionKey]*Function // thunks for T.Method expressions
-}
-
-// A Package is a single analyzed Go package containing Members for
-// all package-level functions, variables, constants and types it
-// declares. These may be accessed directly via Members, or via the
-// type-specific accessor methods Func, Type, Var and Const.
-//
-// Members also contains entries for "init" (the synthetic package
-// initializer) and "init#%d", the nth declared init function,
-// and unspecified other things too.
-//
-type Package struct {
- Prog *Program // the owning program
- Pkg *types.Package // the corresponding go/types.Package
- Members map[string]Member // all package members keyed by name (incl. init and init#%d)
- values map[types.Object]Value // package members (incl. types and methods), keyed by object
- init *Function // Func("init"); the package's init function
- debug bool // include full debug info in this package
-
- // The following fields are set transiently, then cleared
- // after building.
- buildOnce sync.Once // ensures package building occurs once
- ninit int32 // number of init functions
- info *types.Info // package type information
- files []*ast.File // package ASTs
-}
-
-// A Member is a member of a Go package, implemented by *NamedConst,
-// *Global, *Function, or *Type; they are created by package-level
-// const, var, func and type declarations respectively.
-//
-type Member interface {
- Name() string // declared name of the package member
- String() string // package-qualified name of the package member
- RelString(*types.Package) string // like String, but relative refs are unqualified
- Object() types.Object // typechecker's object for this member, if any
- Pos() token.Pos // position of member's declaration, if known
- Type() types.Type // type of the package member
- Token() token.Token // token.{VAR,FUNC,CONST,TYPE}
- Package() *Package // the containing package
-}
-
-// A Type is a Member of a Package representing a package-level named type.
-//
-// Type() returns a *types.Named.
-//
-type Type struct {
- object *types.TypeName
- pkg *Package
-}
-
-// A NamedConst is a Member of a Package representing a package-level
-// named constant.
-//
-// Pos() returns the position of the declaring ast.ValueSpec.Names[*]
-// identifier.
-//
-// NB: a NamedConst is not a Value; it contains a constant Value, which
-// it augments with the name and position of its 'const' declaration.
-//
-type NamedConst struct {
- object *types.Const
- Value *Const
- pos token.Pos
- pkg *Package
-}
-
-// A Value is an SSA value that can be referenced by an instruction.
-type Value interface {
- // Name returns the name of this value, and determines how
- // this Value appears when used as an operand of an
- // Instruction.
- //
- // This is the same as the source name for Parameters,
- // Builtins, Functions, FreeVars, Globals.
- // For constants, it is a representation of the constant's value
- // and type. For all other Values this is the name of the
- // virtual register defined by the instruction.
- //
- // The name of an SSA Value is not semantically significant,
- // and may not even be unique within a function.
- Name() string
-
- // If this value is an Instruction, String returns its
- // disassembled form; otherwise it returns unspecified
- // human-readable information about the Value, such as its
- // kind, name and type.
- String() string
-
- // Type returns the type of this value. Many instructions
- // (e.g. IndexAddr) change their behaviour depending on the
- // types of their operands.
- Type() types.Type
-
- // Parent returns the function to which this Value belongs.
- // It returns nil for named Functions, Builtin, Const and Global.
- Parent() *Function
-
- // Referrers returns the list of instructions that have this
- // value as one of their operands; it may contain duplicates
- // if an instruction has a repeated operand.
- //
- // Referrers actually returns a pointer through which the
- // caller may perform mutations to the object's state.
- //
- // Referrers is currently only defined if Parent()!=nil,
- // i.e. for the function-local values FreeVar, Parameter,
- // Functions (iff anonymous) and all value-defining instructions.
- // It returns nil for named Functions, Builtin, Const and Global.
- //
- // Instruction.Operands contains the inverse of this relation.
- Referrers() *[]Instruction
-
- // Pos returns the location of the AST token most closely
- // associated with the operation that gave rise to this value,
- // or token.NoPos if it was not explicit in the source.
- //
- // For each ast.Node type, a particular token is designated as
- // the closest location for the expression, e.g. the Lparen
- // for an *ast.CallExpr. This permits a compact but
- // approximate mapping from Values to source positions for use
- // in diagnostic messages, for example.
- //
- // (Do not use this position to determine which Value
- // corresponds to an ast.Expr; use Function.ValueForExpr
- // instead. NB: it requires that the function was built with
- // debug information.)
- Pos() token.Pos
-}
-
-// An Instruction is an SSA instruction that computes a new Value or
-// has some effect.
-//
-// An Instruction that defines a value (e.g. BinOp) also implements
-// the Value interface; an Instruction that only has an effect (e.g. Store)
-// does not.
-//
-type Instruction interface {
- // String returns the disassembled form of this value.
- //
- // Examples of Instructions that are Values:
- // "x + y" (BinOp)
- // "len([])" (Call)
- // Note that the name of the Value is not printed.
- //
- // Examples of Instructions that are not Values:
- // "return x" (Return)
- // "*y = x" (Store)
- //
- // (The separation Value.Name() from Value.String() is useful
- // for some analyses which distinguish the operation from the
- // value it defines, e.g., 'y = local int' is both an allocation
- // of memory 'local int' and a definition of a pointer y.)
- String() string
-
- // Parent returns the function to which this instruction
- // belongs.
- Parent() *Function
-
- // Block returns the basic block to which this instruction
- // belongs.
- Block() *BasicBlock
-
- // setBlock sets the basic block to which this instruction belongs.
- setBlock(*BasicBlock)
-
- // Operands returns the operands of this instruction: the
- // set of Values it references.
- //
- // Specifically, it appends their addresses to rands, a
- // user-provided slice, and returns the resulting slice,
- // permitting avoidance of memory allocation.
- //
- // The operands are appended in undefined order, but the order
- // is consistent for a given Instruction; the addresses are
- // always non-nil but may point to a nil Value. Clients may
- // store through the pointers, e.g. to effect a value
- // renaming.
- //
- // Value.Referrers is a subset of the inverse of this
- // relation. (Referrers are not tracked for all types of
- // Values.)
- Operands(rands []*Value) []*Value
-
- // Pos returns the location of the AST token most closely
- // associated with the operation that gave rise to this
- // instruction, or token.NoPos if it was not explicit in the
- // source.
- //
- // For each ast.Node type, a particular token is designated as
- // the closest location for the expression, e.g. the Go token
- // for an *ast.GoStmt. This permits a compact but approximate
- // mapping from Instructions to source positions for use in
- // diagnostic messages, for example.
- //
- // (Do not use this position to determine which Instruction
- // corresponds to an ast.Expr; see the notes for Value.Pos.
- // This position may be used to determine which non-Value
- // Instruction corresponds to some ast.Stmts, but not all: If
- // and Jump instructions have no Pos(), for example.)
- Pos() token.Pos
-}
-
-// A Node is a node in the SSA value graph. Every concrete type that
-// implements Node is also either a Value, an Instruction, or both.
-//
-// Node contains the methods common to Value and Instruction, plus the
-// Operands and Referrers methods generalized to return nil for
-// non-Instructions and non-Values, respectively.
-//
-// Node is provided to simplify SSA graph algorithms. Clients should
-// use the more specific and informative Value or Instruction
-// interfaces where appropriate.
-//
-type Node interface {
- // Common methods:
- String() string
- Pos() token.Pos
- Parent() *Function
-
- // Partial methods:
- Operands(rands []*Value) []*Value // nil for non-Instructions
- Referrers() *[]Instruction // nil for non-Values
-}
-
-// Function represents the parameters, results, and code of a function
-// or method.
-//
-// If Blocks is nil, this indicates an external function for which no
-// Go source code is available. In this case, FreeVars and Locals
-// are nil too. Clients performing whole-program analysis must
-// handle external functions specially.
-//
-// Blocks contains the function's control-flow graph (CFG).
-// Blocks[0] is the function entry point; block order is not otherwise
-// semantically significant, though it may affect the readability of
-// the disassembly.
-// To iterate over the blocks in dominance order, use DomPreorder().
-//
-// Recover is an optional second entry point to which control resumes
-// after a recovered panic. The Recover block may contain only a return
-// statement, preceded by a load of the function's named return
-// parameters, if any.
-//
-// A nested function (Parent()!=nil) that refers to one or more
-// lexically enclosing local variables ("free variables") has FreeVars.
-// Such functions cannot be called directly but require a
-// value created by MakeClosure which, via its Bindings, supplies
-// values for these parameters.
-//
-// If the function is a method (Signature.Recv() != nil) then the first
-// element of Params is the receiver parameter.
-//
-// A Go package may declare many functions called "init".
-// For each one, Object().Name() returns "init" but Name() returns
-// "init#1", etc, in declaration order.
-//
-// Pos() returns the declaring ast.FuncLit.Type.Func or the position
-// of the ast.FuncDecl.Name, if the function was explicit in the
-// source. Synthetic wrappers, for which Synthetic != "", may share
-// the same position as the function they wrap.
-// Syntax.Pos() always returns the position of the declaring "func" token.
-//
-// Type() returns the function's Signature.
-//
-type Function struct {
- name string
- object types.Object // a declared *types.Func or one of its wrappers
- method *types.Selection // info about provenance of synthetic methods
- Signature *types.Signature
- pos token.Pos
-
- Synthetic string // provenance of synthetic function; "" for true source functions
- syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode
- parent *Function // enclosing function if anon; nil if global
- Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error)
- Prog *Program // enclosing program
- Params []*Parameter // function parameters; for methods, includes receiver
- FreeVars []*FreeVar // free variables whose values must be supplied by closure
- Locals []*Alloc // local variables of this function
- Blocks []*BasicBlock // basic blocks of the function; nil => external
- Recover *BasicBlock // optional; control transfers here after recovered panic
- AnonFuncs []*Function // anonymous functions directly beneath this one
- referrers []Instruction // referring instructions (iff Parent() != nil)
-
- // The following fields are set transiently during building,
- // then cleared.
- currentBlock *BasicBlock // where to emit code
- objects map[types.Object]Value // addresses of local variables
- namedResults []*Alloc // tuple of named results
- targets *targets // linked stack of branch targets
- lblocks map[*ast.Object]*lblock // labelled blocks
-}
-
-// BasicBlock represents an SSA basic block.
-//
-// The final element of Instrs is always an explicit transfer of
-// control (If, Jump, Return, or Panic).
-//
-// A block may contain no Instructions only if it is unreachable,
-// i.e., Preds is nil. Empty blocks are typically pruned.
-//
-// BasicBlocks and their Preds/Succs relation form a (possibly cyclic)
-// graph independent of the SSA Value graph: the control-flow graph or
-// CFG. It is illegal for multiple edges to exist between the same
-// pair of blocks.
-//
-// Each BasicBlock is also a node in the dominator tree of the CFG.
-// The tree may be navigated using Idom()/Dominees() and queried using
-// Dominates().
-//
-// The order of Preds and Succs is significant (to Phi and If
-// instructions, respectively).
-//
-type BasicBlock struct {
- Index int // index of this block within Parent().Blocks
- Comment string // optional label; no semantic significance
- parent *Function // parent function
- Instrs []Instruction // instructions in order
- Preds, Succs []*BasicBlock // predecessors and successors
- succs2 [2]*BasicBlock // initial space for Succs
- dom domInfo // dominator tree info
- gaps int // number of nil Instrs (transient)
- rundefers int // number of rundefers (transient)
-}
-
-// Pure values ----------------------------------------
-
-// A FreeVar represents a free variable of the function to which it
-// belongs.
-//
-// FreeVars are used to implement anonymous functions, whose free
-// variables are lexically captured in a closure formed by
-// MakeClosure. The value of such a free var is an Alloc or another
-// FreeVar and is considered a potentially escaping heap address, with
-// pointer type.
-//
-// FreeVars are also used to implement bound method closures. Such a
-// free var represents the receiver value and may be of any type that
-// has concrete methods.
-//
-// Pos() returns the position of the value that was captured, which
-// belongs to an enclosing function.
-//
-type FreeVar struct {
- name string
- typ types.Type
- pos token.Pos
- parent *Function
- referrers []Instruction
-
- // Transiently needed during building.
- outer Value // the Value captured from the enclosing context.
-}
-
-// A Parameter represents an input parameter of a function.
-//
-type Parameter struct {
- name string
- object types.Object // a *types.Var; nil for non-source locals
- typ types.Type
- pos token.Pos
- parent *Function
- referrers []Instruction
-}
-
-// A Const represents the value of a constant expression.
-//
-// The underlying type of a constant may be any boolean, numeric, or
-// string type. In addition, a Const may represent the nil value of
-// any reference type---interface, map, channel, pointer, slice, or
-// function---but not "untyped nil".
-//
-// All source-level constant expressions are represented by a Const
-// of the same type and value.
-//
-// Value holds the exact value of the constant, independent of its
-// Type(), using the same representation as package go/exact uses for
-// constants, or nil for a typed nil value.
-//
-// Pos() returns token.NoPos.
-//
-// Example printed form:
-// 42:int
-// "hello":untyped string
-// 3+4i:MyComplex
-//
-type Const struct {
- typ types.Type
- Value exact.Value
-}
-
-// A Global is a named Value holding the address of a package-level
-// variable.
-//
-// Pos() returns the position of the ast.ValueSpec.Names[*]
-// identifier.
-//
-type Global struct {
- name string
- object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard
- typ types.Type
- pos token.Pos
-
- Pkg *Package
-}
-
-// A Builtin represents a specific use of a built-in function, e.g. len.
-//
-// Builtins are immutable values. Builtins do not have addresses.
-// Builtins can only appear in CallCommon.Func.
-//
-// Name() indicates the function: one of the built-in functions from the
-// Go spec (excluding "make" and "new") or one of these ssa-defined
-// intrinsics:
-//
-// // wrapnilchk returns ptr if non-nil, panics otherwise.
-// // (For use in indirection wrappers.)
-// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T
-//
-// Object() returns a *types.Builtin for built-ins defined by the spec,
-// nil for others.
-//
-// Type() returns a *types.Signature representing the effective
-// signature of the built-in for this call.
-//
-type Builtin struct {
- name string
- sig *types.Signature
-}
-
-// Value-defining instructions ----------------------------------------
-
-// The Alloc instruction reserves space for a variable of the given type,
-// zero-initializes it, and yields its address.
-//
-// Alloc values are always addresses, and have pointer types, so the
-// type of the allocated variable is actually
-// Type().Underlying().(*types.Pointer).Elem().
-//
-// If Heap is false, Alloc allocates space in the function's
-// activation record (frame); we refer to an Alloc(Heap=false) as a
-// "local" alloc. Each local Alloc returns the same address each time
-// it is executed within the same activation; the space is
-// re-initialized to zero.
-//
-// If Heap is true, Alloc allocates space in the heap; we
-// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc
-// returns a different address each time it is executed.
-//
-// When Alloc is applied to a channel, map or slice type, it returns
-// the address of an uninitialized (nil) reference of that kind; store
-// the result of MakeSlice, MakeMap or MakeChan in that location to
-// instantiate these types.
-//
-// Pos() returns the ast.CompositeLit.Lbrace for a composite literal,
-// or the ast.CallExpr.Rparen for a call to new() or for a call that
-// allocates a varargs slice.
-//
-// Example printed form:
-// t0 = local int
-// t1 = new int
-//
-type Alloc struct {
- register
- Comment string
- Heap bool
- index int // dense numbering; for lifting
-}
-
-var _ Instruction = (*Sigma)(nil)
-var _ Value = (*Sigma)(nil)
-
-type Sigma struct {
- register
- X Value
- Branch bool
-}
-
-func (p *Sigma) Value() Value {
- v := p.X
- for {
- sigma, ok := v.(*Sigma)
- if !ok {
- break
- }
- v = sigma
- }
- return v
-}
-
-func (p *Sigma) String() string {
- return fmt.Sprintf("σ [%s.%t]", relName(p.X, p), p.Branch)
-}
-
-// The Phi instruction represents an SSA φ-node, which combines values
-// that differ across incoming control-flow edges and yields a new
-// value. Within a block, all φ-nodes must appear before all non-φ
-// nodes.
-//
-// Pos() returns the position of the && or || for short-circuit
-// control-flow joins, or that of the *Alloc for φ-nodes inserted
-// during SSA renaming.
-//
-// Example printed form:
-// t2 = phi [0: t0, 1: t1]
-//
-type Phi struct {
- register
- Comment string // a hint as to its purpose
- Edges []Value // Edges[i] is value for Block().Preds[i]
-}
-
-// The Call instruction represents a function or method call.
-//
-// The Call instruction yields the function result if there is exactly
-// one. Otherwise it returns a tuple, the components of which are
-// accessed via Extract.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.CallExpr.Lparen, if explicit in the source.
-//
-// Example printed form:
-// t2 = println(t0, t1)
-// t4 = t3()
-// t7 = invoke t5.Println(...t6)
-//
-type Call struct {
- register
- Call CallCommon
-}
-
-// The BinOp instruction yields the result of binary operation X Op Y.
-//
-// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source.
-//
-// Example printed form:
-// t1 = t0 + 1:int
-//
-type BinOp struct {
- register
- // One of:
- // ADD SUB MUL QUO REM + - * / %
- // AND OR XOR SHL SHR AND_NOT & | ^ << >> &~
- // EQL LSS GTR NEQ LEQ GEQ == != < <= < >=
- Op token.Token
- X, Y Value
-}
-
-// The UnOp instruction yields the result of Op X.
-// ARROW is channel receive.
-// MUL is pointer indirection (load).
-// XOR is bitwise complement.
-// SUB is negation.
-// NOT is logical negation.
-//
-// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above
-// and a boolean indicating the success of the receive. The
-// components of the tuple are accessed using Extract.
-//
-// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source.
-// For receive operations (ARROW) implicit in ranging over a channel,
-// Pos() returns the ast.RangeStmt.For.
-// For implicit memory loads (STAR), Pos() returns the position of the
-// most closely associated source-level construct; the details are not
-// specified.
-//
-// Example printed form:
-// t0 = *x
-// t2 = <-t1,ok
-//
-type UnOp struct {
- register
- Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^
- X Value
- CommaOk bool
-}
-
-// The ChangeType instruction applies to X a value-preserving type
-// change to Type().
-//
-// Type changes are permitted:
-// - between a named type and its underlying type.
-// - between two named types of the same underlying type.
-// - between (possibly named) pointers to identical base types.
-// - from a bidirectional channel to a read- or write-channel,
-// optionally adding/removing a name.
-//
-// This operation cannot fail dynamically.
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = changetype *int <- IntPtr (t0)
-//
-type ChangeType struct {
- register
- X Value
-}
-
-// The Convert instruction yields the conversion of value X to type
-// Type(). One or both of those types is basic (but possibly named).
-//
-// A conversion may change the value and representation of its operand.
-// Conversions are permitted:
-// - between real numeric types.
-// - between complex numeric types.
-// - between string and []byte or []rune.
-// - between pointers and unsafe.Pointer.
-// - between unsafe.Pointer and uintptr.
-// - from (Unicode) integer to (UTF-8) string.
-// A conversion may imply a type name change also.
-//
-// This operation cannot fail dynamically.
-//
-// Conversions of untyped string/number/bool constants to a specific
-// representation are eliminated during SSA construction.
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = convert []byte <- string (t0)
-//
-type Convert struct {
- register
- X Value
-}
-
-// ChangeInterface constructs a value of one interface type from a
-// value of another interface type known to be assignable to it.
-// This operation cannot fail.
-//
-// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
-// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
-// instruction arose from an explicit e.(T) operation; or token.NoPos
-// otherwise.
-//
-// Example printed form:
-// t1 = change interface interface{} <- I (t0)
-//
-type ChangeInterface struct {
- register
- X Value
-}
-
-// MakeInterface constructs an instance of an interface type from a
-// value of a concrete type.
-//
-// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set
-// of X, and Program.Method(m) to find the implementation of a method.
-//
-// To construct the zero value of an interface type T, use:
-// NewConst(exact.MakeNil(), T, pos)
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// t1 = make interface{} <- int (42:int)
-// t2 = make Stringer <- t0
-//
-type MakeInterface struct {
- register
- X Value
-}
-
-// The MakeClosure instruction yields a closure value whose code is
-// Fn and whose free variables' values are supplied by Bindings.
-//
-// Type() returns a (possibly named) *types.Signature.
-//
-// Pos() returns the ast.FuncLit.Type.Func for a function literal
-// closure or the ast.SelectorExpr.Sel for a bound method closure.
-//
-// Example printed form:
-// t0 = make closure anon@1.2 [x y z]
-// t1 = make closure bound$(main.I).add [i]
-//
-type MakeClosure struct {
- register
- Fn Value // always a *Function
- Bindings []Value // values for each free variable in Fn.FreeVars
-}
-
-// The MakeMap instruction creates a new hash-table-based map object
-// and yields a value of kind map.
-//
-// Type() returns a (possibly named) *types.Map.
-//
-// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or
-// the ast.CompositeLit.Lbrack if created by a literal.
-//
-// Example printed form:
-// t1 = make map[string]int t0
-// t1 = make StringIntMap t0
-//
-type MakeMap struct {
- register
- Reserve Value // initial space reservation; nil => default
-}
-
-// The MakeChan instruction creates a new channel object and yields a
-// value of kind chan.
-//
-// Type() returns a (possibly named) *types.Chan.
-//
-// Pos() returns the ast.CallExpr.Lparen for the make(chan) that
-// created it.
-//
-// Example printed form:
-// t0 = make chan int 0
-// t0 = make IntChan 0
-//
-type MakeChan struct {
- register
- Size Value // int; size of buffer; zero => synchronous.
-}
-
-// The MakeSlice instruction yields a slice of length Len backed by a
-// newly allocated array of length Cap.
-//
-// Both Len and Cap must be non-nil Values of integer type.
-//
-// (Alloc(types.Array) followed by Slice will not suffice because
-// Alloc can only create arrays of constant length.)
-//
-// Type() returns a (possibly named) *types.Slice.
-//
-// Pos() returns the ast.CallExpr.Lparen for the make([]T) that
-// created it.
-//
-// Example printed form:
-// t1 = make []string 1:int t0
-// t1 = make StringSlice 1:int t0
-//
-type MakeSlice struct {
- register
- Len Value
- Cap Value
-}
-
-// The Slice instruction yields a slice of an existing string, slice
-// or *array X between optional integer bounds Low and High.
-//
-// Dynamically, this instruction panics if X evaluates to a nil *array
-// pointer.
-//
-// Type() returns string if the type of X was string, otherwise a
-// *types.Slice with the same element type as X.
-//
-// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice
-// operation, the ast.CompositeLit.Lbrace if created by a literal, or
-// NoPos if not explicit in the source (e.g. a variadic argument slice).
-//
-// Example printed form:
-// t1 = slice t0[1:]
-//
-type Slice struct {
- register
- X Value // slice, string, or *array
- Low, High, Max Value // each may be nil
-}
-
-// The FieldAddr instruction yields the address of Field of *struct X.
-//
-// The field is identified by its index within the field list of the
-// struct type of X.
-//
-// Dynamically, this instruction panics if X evaluates to a nil
-// pointer.
-//
-// Type() returns a (possibly named) *types.Pointer.
-//
-// Pos() returns the position of the ast.SelectorExpr.Sel for the
-// field, if explicit in the source.
-//
-// Example printed form:
-// t1 = &t0.name [#1]
-//
-type FieldAddr struct {
- register
- X Value // *struct
- Field int // index into X.Type().Deref().(*types.Struct).Fields
-}
-
-// The Field instruction yields the Field of struct X.
-//
-// The field is identified by its index within the field list of the
-// struct type of X; by using numeric indices we avoid ambiguity of
-// package-local identifiers and permit compact representations.
-//
-// Pos() returns the position of the ast.SelectorExpr.Sel for the
-// field, if explicit in the source.
-//
-// Example printed form:
-// t1 = t0.name [#1]
-//
-type Field struct {
- register
- X Value // struct
- Field int // index into X.Type().(*types.Struct).Fields
-}
-
-// The IndexAddr instruction yields the address of the element at
-// index Index of collection X. Index is an integer expression.
-//
-// The elements of maps and strings are not addressable; use Lookup or
-// MapUpdate instead.
-//
-// Dynamically, this instruction panics if X evaluates to a nil *array
-// pointer.
-//
-// Type() returns a (possibly named) *types.Pointer.
-//
-// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
-// explicit in the source.
-//
-// Example printed form:
-// t2 = &t0[t1]
-//
-type IndexAddr struct {
- register
- X Value // slice or *array,
- Index Value // numeric index
-}
-
-// The Index instruction yields element Index of array X.
-//
-// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
-// explicit in the source.
-//
-// Example printed form:
-// t2 = t0[t1]
-//
-type Index struct {
- register
- X Value // array
- Index Value // integer index
-}
-
-// The Lookup instruction yields element Index of collection X, a map
-// or string. Index is an integer expression if X is a string or the
-// appropriate key type if X is a map.
-//
-// If CommaOk, the result is a 2-tuple of the value above and a
-// boolean indicating the result of a map membership test for the key.
-// The components of the tuple are accessed using Extract.
-//
-// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source.
-//
-// Example printed form:
-// t2 = t0[t1]
-// t5 = t3[t4],ok
-//
-type Lookup struct {
- register
- X Value // string or map
- Index Value // numeric or key-typed index
- CommaOk bool // return a value,ok pair
-}
-
-// SelectState is a helper for Select.
-// It represents one goal state and its corresponding communication.
-//
-type SelectState struct {
- Dir types.ChanDir // direction of case (SendOnly or RecvOnly)
- Chan Value // channel to use (for send or receive)
- Send Value // value to send (for send)
- Pos token.Pos // position of token.ARROW
- DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode]
-}
-
-// The Select instruction tests whether (or blocks until) one
-// of the specified sent or received states is entered.
-//
-// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator.
-}
-
-// The TypeAssert instruction tests whether interface value X has type
-// AssertedType.
-//
-// If !CommaOk, on success it returns v, the result of the conversion
-// (defined below); on failure it panics.
-//
-// If CommaOk: on success it returns a pair (v, true) where v is the
-// result of the conversion; on failure it returns (z, false) where z
-// is AssertedType's zero value. The components of the pair must be
-// accessed using the Extract instruction.
-//
-// If AssertedType is a concrete type, TypeAssert checks whether the
-// dynamic type in interface X is equal to it, and if so, the result
-// of the conversion is a copy of the value in the interface.
-//
-// If AssertedType is an interface, TypeAssert checks whether the
-// dynamic type of the interface is assignable to it, and if so, the
-// result of the conversion is a copy of the interface value X.
-// If AssertedType is a superinterface of X.Type(), the operation will
-// fail iff the operand is nil. (Contrast with ChangeInterface, which
-// performs no nil-check.)
-//
-// Type() reflects the actual type of the result, possibly a
-// 2-types.Tuple; AssertedType is the asserted type.
-//
-// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
-// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
-// instruction arose from an explicit e.(T) operation; or the
-// ast.CaseClause.Case if the instruction arose from a case of a
-// type-switch statement.
-//
-// Example printed form:
-// t1 = typeassert t0.(int)
-// t3 = typeassert,ok t2.(T)
-//
-type TypeAssert struct {
- register
- X Value
- AssertedType types.Type
- CommaOk bool
-}
-
-// The Extract instruction yields component Index of Tuple.
-//
-// This is used to access the results of instructions with multiple
-// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and
-// IndexExpr(Map).
-//
-// Example printed form:
-// t1 = extract t0 #1
-//
-type Extract struct {
- register
- Tuple Value
- Index int
-}
-
-// Instructions executed for effect. They do not yield a value. --------------------
-
-// The Jump instruction transfers control to the sole successor of its
-// owning block.
-//
-// A Jump must be the last instruction of its containing BasicBlock.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// jump done
-//
-type Jump struct {
- anInstruction
-}
-
-// The If instruction transfers control to one of the two successors
-// of its owning block, depending on the boolean Cond: the first if
-// true, the second if false.
-//
-// An If instruction must be the last instruction of its containing
-// BasicBlock.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// if t0 goto done else body
-//
-type If struct {
- anInstruction
- Cond Value
-}
-
-// The Return instruction returns values and control back to the calling
-// function.
-//
-// len(Results) is always equal to the number of results in the
-// function's signature.
-//
-// If len(Results) > 1, Return returns a tuple value with the specified
-// components which the caller must access using Extract instructions.
-//
-// There is no instruction to return a ready-made tuple like those
-// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or
-// a tail-call to a function with multiple result parameters.
-//
-// Return must be the last instruction of its containing BasicBlock.
-// Such a block has no successors.
-//
-// Pos() returns the ast.ReturnStmt.Return, if explicit in the source.
-//
-// Example printed form:
-// return
-// return nil:I, 2:int
-//
-type Return struct {
- anInstruction
- Results []Value
- pos token.Pos
-}
-
-// The RunDefers instruction pops and invokes the entire stack of
-// procedure calls pushed by Defer instructions in this function.
-//
-// It is legal to encounter multiple 'rundefers' instructions in a
-// single control-flow path through a function; this is useful in
-// the combined init() function, for example.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// rundefers
-//
-type RunDefers struct {
- anInstruction
-}
-
-// The Panic instruction initiates a panic with value X.
-//
-// A Panic instruction must be the last instruction of its containing
-// BasicBlock, which must have no successors.
-//
-// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction;
-// they are treated as calls to a built-in function.
-//
-// Pos() returns the ast.CallExpr.Lparen if this panic was explicit
-// in the source.
-//
-// Example printed form:
-// panic t0
-//
-type Panic struct {
- anInstruction
- X Value // an interface{}
- pos token.Pos
-}
-
-// The Go instruction creates a new goroutine and calls the specified
-// function within it.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.GoStmt.Go.
-//
-// Example printed form:
-// go println(t0, t1)
-// go t3()
-// go invoke t5.Println(...t6)
-//
-type Go struct {
- anInstruction
- Call CallCommon
- pos token.Pos
-}
-
-// The Defer instruction pushes the specified call onto a stack of
-// functions to be called by a RunDefers instruction or by a panic.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.DeferStmt.Defer.
-//
-// Example printed form:
-// defer println(t0, t1)
-// defer t3()
-// defer invoke t5.Println(...t6)
-//
-type Defer struct {
- anInstruction
- Call CallCommon
- pos token.Pos
-}
-
-// The Send instruction sends X on channel Chan.
-//
-// Pos() returns the ast.SendStmt.Arrow, if explicit in the source.
-//
-// Example printed form:
-// send t0 <- t1
-//
-type Send struct {
- anInstruction
- Chan, X Value
- pos token.Pos
-}
-
-// The Store instruction stores Val at address Addr.
-// Stores can be of arbitrary types.
-//
-// Pos() returns the position of the source-level construct most closely
-// associated with the memory store operation.
-// Since implicit memory stores are numerous and varied and depend upon
-// implementation choices, the details are not specified.
-//
-// Example printed form:
-// *x = y
-//
-type Store struct {
- anInstruction
- Addr Value
- Val Value
- pos token.Pos
-}
-
-// The BlankStore instruction is emitted for assignments to the blank
-// identifier.
-//
-// BlankStore is a pseudo-instruction: it has no dynamic effect.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// _ = t0
-//
-type BlankStore struct {
- anInstruction
- Val Value
-}
-
-// The MapUpdate instruction updates the association of Map[Key] to
-// Value.
-//
-// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack,
-// if explicit in the source.
-//
-// Example printed form:
-// t0[t1] = t2
-//
-type MapUpdate struct {
- anInstruction
- Map Value
- Key Value
- Value Value
- pos token.Pos
-}
-
-// A DebugRef instruction maps a source-level expression Expr to the
-// SSA value X that represents the value (!IsAddr) or address (IsAddr)
-// of that expression.
-//
-// DebugRef is a pseudo-instruction: it has no dynamic effect.
-//
-// Pos() returns Expr.Pos(), the start position of the source-level
-// expression. This is not the same as the "designated" token as
-// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the
-// position of the ("designated") Lparen token.
-//
-// If Expr is an *ast.Ident denoting a var or func, Object() returns
-// the object; though this information can be obtained from the type
-// checker, including it here greatly facilitates debugging.
-// For non-Ident expressions, Object() returns nil.
-//
-// DebugRefs are generated only for functions built with debugging
-// enabled; see Package.SetDebugMode() and the GlobalDebug builder
-// mode flag.
-//
-// DebugRefs are not emitted for ast.Idents referring to constants or
-// predeclared identifiers, since they are trivial and numerous.
-// Nor are they emitted for ast.ParenExprs.
-//
-// (By representing these as instructions, rather than out-of-band,
-// consistency is maintained during transformation passes by the
-// ordinary SSA renaming machinery.)
-//
-// Example printed form:
-// ; *ast.CallExpr @ 102:9 is t5
-// ; var x float64 @ 109:72 is x
-// ; address of *ast.CompositeLit @ 216:10 is t0
-//
-type DebugRef struct {
- anInstruction
- Expr ast.Expr // the referring expression (never *ast.ParenExpr)
- object types.Object // the identity of the source var/func
- IsAddr bool // Expr is addressable and X is the address it denotes
- X Value // the value or address of Expr
-}
-
-// Embeddable mix-ins and helpers for common parts of other structs. -----------
-
-// register is a mix-in embedded by all SSA values that are also
-// instructions, i.e. virtual registers, and provides a uniform
-// implementation of most of the Value interface: Value.Name() is a
-// numbered register (e.g. "t0"); the other methods are field accessors.
-//
-// Temporary names are automatically assigned to each register on
-// completion of building a function in SSA form.
-//
-// Clients must not assume that the 'id' value (and the Name() derived
-// from it) is unique within a function. As always in this API,
-// semantics are determined only by identity; names exist only to
-// facilitate debugging.
-//
-type register struct {
- anInstruction
- num int // "name" of virtual register, e.g. "t0". Not guaranteed unique.
- typ types.Type // type of virtual register
- pos token.Pos // position of source expression, or NoPos
- referrers []Instruction
-}
-
-// anInstruction is a mix-in embedded by all Instructions.
-// It provides the implementations of the Block and setBlock methods.
-type anInstruction struct {
- block *BasicBlock // the basic block of this instruction
-}
-
-// CallCommon is contained by Go, Defer and Call to hold the
-// common parts of a function or method call.
-//
-// Each CallCommon exists in one of two modes, function call and
-// interface method invocation, or "call" and "invoke" for short.
-//
-// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon
-// represents an ordinary function call of the value in Value,
-// which may be a *Builtin, a *Function or any other value of kind
-// 'func'.
-//
-// Value may be one of:
-// (a) a *Function, indicating a statically dispatched call
-// to a package-level function, an anonymous function, or
-// a method of a named type.
-// (b) a *MakeClosure, indicating an immediately applied
-// function literal with free variables.
-// (c) a *Builtin, indicating a statically dispatched call
-// to a built-in function.
-// (d) any other value, indicating a dynamically dispatched
-// function call.
-// StaticCallee returns the identity of the callee in cases
-// (a) and (b), nil otherwise.
-//
-// Args contains the arguments to the call. If Value is a method,
-// Args[0] contains the receiver parameter.
-//
-// Example printed form:
-// t2 = println(t0, t1)
-// go t3()
-// defer t5(...t6)
-//
-// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon
-// represents a dynamically dispatched call to an interface method.
-// In this mode, Value is the interface value and Method is the
-// interface's abstract method. Note: an abstract method may be
-// shared by multiple interfaces due to embedding; Value.Type()
-// provides the specific interface used for this call.
-//
-// Value is implicitly supplied to the concrete method implementation
-// as the receiver parameter; in other words, Args[0] holds not the
-// receiver but the first true argument.
-//
-// Example printed form:
-// t1 = invoke t0.String()
-// go invoke t3.Run(t2)
-// defer invoke t4.Handle(...t5)
-//
-// For all calls to variadic functions (Signature().Variadic()),
-// the last element of Args is a slice.
-//
-type CallCommon struct {
- Value Value // receiver (invoke mode) or func value (call mode)
- Method *types.Func // abstract method (invoke mode)
- Args []Value // actual parameters (in static method call, includes receiver)
- pos token.Pos // position of CallExpr.Lparen, iff explicit in source
-}
-
-// IsInvoke returns true if this call has "invoke" (not "call") mode.
-func (c *CallCommon) IsInvoke() bool {
- return c.Method != nil
-}
-
-func (c *CallCommon) Pos() token.Pos { return c.pos }
-
-// Signature returns the signature of the called function.
-//
-// For an "invoke"-mode call, the signature of the interface method is
-// returned.
-//
-// In either "call" or "invoke" mode, if the callee is a method, its
-// receiver is represented by sig.Recv, not sig.Params().At(0).
-//
-func (c *CallCommon) Signature() *types.Signature {
- if c.Method != nil {
- return c.Method.Type().(*types.Signature)
- }
- return c.Value.Type().Underlying().(*types.Signature)
-}
-
-// StaticCallee returns the callee if this is a trivially static
-// "call"-mode call to a function.
-func (c *CallCommon) StaticCallee() *Function {
- switch fn := c.Value.(type) {
- case *Function:
- return fn
- case *MakeClosure:
- return fn.Fn.(*Function)
- }
- return nil
-}
-
-// Description returns a description of the mode of this call suitable
-// for a user interface, e.g., "static method call".
-func (c *CallCommon) Description() string {
- switch fn := c.Value.(type) {
- case *Builtin:
- return "built-in function call"
- case *MakeClosure:
- return "static function closure call"
- case *Function:
- if fn.Signature.Recv() != nil {
- return "static method call"
- }
- return "static function call"
- }
- if c.IsInvoke() {
- return "dynamic method call" // ("invoke" mode)
- }
- return "dynamic function call"
-}
-
-// The CallInstruction interface, implemented by *Go, *Defer and *Call,
-// exposes the common parts of function-calling instructions,
-// yet provides a way back to the Value defined by *Call alone.
-//
-type CallInstruction interface {
- Instruction
- Common() *CallCommon // returns the common parts of the call
- Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer)
-}
-
-func (s *Call) Common() *CallCommon { return &s.Call }
-func (s *Defer) Common() *CallCommon { return &s.Call }
-func (s *Go) Common() *CallCommon { return &s.Call }
-
-func (s *Call) Value() *Call { return s }
-func (s *Defer) Value() *Call { return nil }
-func (s *Go) Value() *Call { return nil }
-
-func (v *Builtin) Type() types.Type { return v.sig }
-func (v *Builtin) Name() string { return v.name }
-func (*Builtin) Referrers() *[]Instruction { return nil }
-func (v *Builtin) Pos() token.Pos { return token.NoPos }
-func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) }
-func (v *Builtin) Parent() *Function { return nil }
-
-func (v *FreeVar) Type() types.Type { return v.typ }
-func (v *FreeVar) Name() string { return v.name }
-func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers }
-func (v *FreeVar) Pos() token.Pos { return v.pos }
-func (v *FreeVar) Parent() *Function { return v.parent }
-
-func (v *Global) Type() types.Type { return v.typ }
-func (v *Global) Name() string { return v.name }
-func (v *Global) Parent() *Function { return nil }
-func (v *Global) Pos() token.Pos { return v.pos }
-func (v *Global) Referrers() *[]Instruction { return nil }
-func (v *Global) Token() token.Token { return token.VAR }
-func (v *Global) Object() types.Object { return v.object }
-func (v *Global) String() string { return v.RelString(nil) }
-func (v *Global) Package() *Package { return v.Pkg }
-func (v *Global) RelString(from *types.Package) string { return relString(v, from) }
-
-func (v *Function) Name() string { return v.name }
-func (v *Function) Type() types.Type { return v.Signature }
-func (v *Function) Pos() token.Pos { return v.pos }
-func (v *Function) Token() token.Token { return token.FUNC }
-func (v *Function) Object() types.Object { return v.object }
-func (v *Function) String() string { return v.RelString(nil) }
-func (v *Function) Package() *Package { return v.Pkg }
-func (v *Function) Parent() *Function { return v.parent }
-func (v *Function) Referrers() *[]Instruction {
- if v.parent != nil {
- return &v.referrers
- }
- return nil
-}
-
-func (v *Parameter) Type() types.Type { return v.typ }
-func (v *Parameter) Name() string { return v.name }
-func (v *Parameter) Object() types.Object { return v.object }
-func (v *Parameter) Referrers() *[]Instruction { return &v.referrers }
-func (v *Parameter) Pos() token.Pos { return v.pos }
-func (v *Parameter) Parent() *Function { return v.parent }
-
-func (v *Alloc) Type() types.Type { return v.typ }
-func (v *Alloc) Referrers() *[]Instruction { return &v.referrers }
-func (v *Alloc) Pos() token.Pos { return v.pos }
-
-func (v *register) Type() types.Type { return v.typ }
-func (v *register) setType(typ types.Type) { v.typ = typ }
-func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) }
-func (v *register) setNum(num int) { v.num = num }
-func (v *register) Referrers() *[]Instruction { return &v.referrers }
-func (v *register) Pos() token.Pos { return v.pos }
-func (v *register) setPos(pos token.Pos) { v.pos = pos }
-
-func (v *anInstruction) Parent() *Function { return v.block.parent }
-func (v *anInstruction) Block() *BasicBlock { return v.block }
-func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block }
-func (v *anInstruction) Referrers() *[]Instruction { return nil }
-
-func (t *Type) Name() string { return t.object.Name() }
-func (t *Type) Pos() token.Pos { return t.object.Pos() }
-func (t *Type) Type() types.Type { return t.object.Type() }
-func (t *Type) Token() token.Token { return token.TYPE }
-func (t *Type) Object() types.Object { return t.object }
-func (t *Type) String() string { return t.RelString(nil) }
-func (t *Type) Package() *Package { return t.pkg }
-func (t *Type) RelString(from *types.Package) string { return relString(t, from) }
-
-func (c *NamedConst) Name() string { return c.object.Name() }
-func (c *NamedConst) Pos() token.Pos { return c.object.Pos() }
-func (c *NamedConst) String() string { return c.RelString(nil) }
-func (c *NamedConst) Type() types.Type { return c.object.Type() }
-func (c *NamedConst) Token() token.Token { return token.CONST }
-func (c *NamedConst) Object() types.Object { return c.object }
-func (c *NamedConst) Package() *Package { return c.pkg }
-func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) }
-
-// Func returns the package-level function of the specified name,
-// or nil if not found.
-//
-func (p *Package) Func(name string) (f *Function) {
- f, _ = p.Members[name].(*Function)
- return
-}
-
-// Var returns the package-level variable of the specified name,
-// or nil if not found.
-//
-func (p *Package) Var(name string) (g *Global) {
- g, _ = p.Members[name].(*Global)
- return
-}
-
-// Const returns the package-level constant of the specified name,
-// or nil if not found.
-//
-func (p *Package) Const(name string) (c *NamedConst) {
- c, _ = p.Members[name].(*NamedConst)
- return
-}
-
-// Type returns the package-level type of the specified name,
-// or nil if not found.
-//
-func (p *Package) Type(name string) (t *Type) {
- t, _ = p.Members[name].(*Type)
- return
-}
-
-func (v *Call) Pos() token.Pos { return v.Call.pos }
-func (s *Defer) Pos() token.Pos { return s.pos }
-func (s *Go) Pos() token.Pos { return s.pos }
-func (s *MapUpdate) Pos() token.Pos { return s.pos }
-func (s *Panic) Pos() token.Pos { return s.pos }
-func (s *Return) Pos() token.Pos { return s.pos }
-func (s *Send) Pos() token.Pos { return s.pos }
-func (s *Store) Pos() token.Pos { return s.pos }
-func (s *BlankStore) Pos() token.Pos { return token.NoPos }
-func (s *If) Pos() token.Pos { return token.NoPos }
-func (s *Jump) Pos() token.Pos { return token.NoPos }
-func (s *RunDefers) Pos() token.Pos { return token.NoPos }
-func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() }
-
-// Operands.
-
-func (v *Alloc) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *BinOp) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Y)
-}
-
-func (c *CallCommon) Operands(rands []*Value) []*Value {
- rands = append(rands, &c.Value)
- for i := range c.Args {
- rands = append(rands, &c.Args[i])
- }
- return rands
-}
-
-func (s *Go) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (s *Call) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (s *Defer) Operands(rands []*Value) []*Value {
- return s.Call.Operands(rands)
-}
-
-func (v *ChangeInterface) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *ChangeType) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *Convert) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *DebugRef) Operands(rands []*Value) []*Value {
- return append(rands, &s.X)
-}
-
-func (v *Extract) Operands(rands []*Value) []*Value {
- return append(rands, &v.Tuple)
-}
-
-func (v *Field) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *FieldAddr) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *If) Operands(rands []*Value) []*Value {
- return append(rands, &s.Cond)
-}
-
-func (v *Index) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (v *IndexAddr) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (*Jump) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *Lookup) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Index)
-}
-
-func (v *MakeChan) Operands(rands []*Value) []*Value {
- return append(rands, &v.Size)
-}
-
-func (v *MakeClosure) Operands(rands []*Value) []*Value {
- rands = append(rands, &v.Fn)
- for i := range v.Bindings {
- rands = append(rands, &v.Bindings[i])
- }
- return rands
-}
-
-func (v *MakeInterface) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *MakeMap) Operands(rands []*Value) []*Value {
- return append(rands, &v.Reserve)
-}
-
-func (v *MakeSlice) Operands(rands []*Value) []*Value {
- return append(rands, &v.Len, &v.Cap)
-}
-
-func (v *MapUpdate) Operands(rands []*Value) []*Value {
- return append(rands, &v.Map, &v.Key, &v.Value)
-}
-
-func (v *Next) Operands(rands []*Value) []*Value {
- return append(rands, &v.Iter)
-}
-
-func (s *Panic) Operands(rands []*Value) []*Value {
- return append(rands, &s.X)
-}
-
-func (v *Sigma) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *Phi) Operands(rands []*Value) []*Value {
- for i := range v.Edges {
- rands = append(rands, &v.Edges[i])
- }
- return rands
-}
-
-func (v *Range) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (s *Return) Operands(rands []*Value) []*Value {
- for i := range s.Results {
- rands = append(rands, &s.Results[i])
- }
- return rands
-}
-
-func (*RunDefers) Operands(rands []*Value) []*Value {
- return rands
-}
-
-func (v *Select) Operands(rands []*Value) []*Value {
- for i := range v.States {
- rands = append(rands, &v.States[i].Chan, &v.States[i].Send)
- }
- return rands
-}
-
-func (s *Send) Operands(rands []*Value) []*Value {
- return append(rands, &s.Chan, &s.X)
-}
-
-func (v *Slice) Operands(rands []*Value) []*Value {
- return append(rands, &v.X, &v.Low, &v.High, &v.Max)
-}
-
-func (s *Store) Operands(rands []*Value) []*Value {
- return append(rands, &s.Addr, &s.Val)
-}
-
-func (s *BlankStore) Operands(rands []*Value) []*Value {
- return append(rands, &s.Val)
-}
-
-func (v *TypeAssert) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-func (v *UnOp) Operands(rands []*Value) []*Value {
- return append(rands, &v.X)
-}
-
-// Non-Instruction Values:
-func (v *Builtin) Operands(rands []*Value) []*Value { return rands }
-func (v *FreeVar) Operands(rands []*Value) []*Value { return rands }
-func (v *Const) Operands(rands []*Value) []*Value { return rands }
-func (v *Function) Operands(rands []*Value) []*Value { return rands }
-func (v *Global) Operands(rands []*Value) []*Value { return rands }
-func (v *Parameter) Operands(rands []*Value) []*Value { return rands }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/load.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/load.go
deleted file mode 100644
index 2fc108f33..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/load.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssautil
-
-// This file defines utility functions for constructing programs in SSA form.
-
-import (
- "go/ast"
- "go/token"
- "go/types"
-
- "golang.org/x/tools/go/loader"
- "honnef.co/go/tools/ssa"
-)
-
-// CreateProgram returns a new program in SSA form, given a program
-// loaded from source. An SSA package is created for each transitively
-// error-free package of lprog.
-//
-// Code for bodies of functions is not built until Build is called
-// on the result.
-//
-// mode controls diagnostics and checking during SSA construction.
-//
-func CreateProgram(lprog *loader.Program, mode ssa.BuilderMode) *ssa.Program {
- prog := ssa.NewProgram(lprog.Fset, mode)
-
- for _, info := range lprog.AllPackages {
- if info.TransitivelyErrorFree {
- prog.CreatePackage(info.Pkg, info.Files, &info.Info, info.Importable)
- }
- }
-
- return prog
-}
-
-// BuildPackage builds an SSA program with IR for a single package.
-//
-// It populates pkg by type-checking the specified file ASTs. All
-// dependencies are loaded using the importer specified by tc, which
-// typically loads compiler export data; SSA code cannot be built for
-// those packages. BuildPackage then constructs an ssa.Program with all
-// dependency packages created, and builds and returns the SSA package
-// corresponding to pkg.
-//
-// The caller must have set pkg.Path() to the import path.
-//
-// The operation fails if there were any type-checking or import errors.
-//
-// See ../ssa/example_test.go for an example.
-//
-func BuildPackage(tc *types.Config, fset *token.FileSet, pkg *types.Package, files []*ast.File, mode ssa.BuilderMode) (*ssa.Package, *types.Info, error) {
- if fset == nil {
- panic("no token.FileSet")
- }
- if pkg.Path() == "" {
- panic("package has no import path")
- }
-
- info := &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- }
- if err := types.NewChecker(tc, fset, pkg, info).Files(files); err != nil {
- return nil, nil, err
- }
-
- prog := ssa.NewProgram(fset, mode)
-
- // Create SSA packages for all imports.
- // Order is not significant.
- created := make(map[*types.Package]bool)
- var createAll func(pkgs []*types.Package)
- createAll = func(pkgs []*types.Package) {
- for _, p := range pkgs {
- if !created[p] {
- created[p] = true
- prog.CreatePackage(p, nil, nil, true)
- createAll(p.Imports())
- }
- }
- }
- createAll(pkg.Imports())
-
- // Create and build the primary package.
- ssapkg := prog.CreatePackage(pkg, files, info, false)
- ssapkg.Build()
- return ssapkg, info, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/switch.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/switch.go
deleted file mode 100644
index ef698b383..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/switch.go
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssautil
-
-// This file implements discovery of switch and type-switch constructs
-// from low-level control flow.
-//
-// Many techniques exist for compiling a high-level switch with
-// constant cases to efficient machine code. The optimal choice will
-// depend on the data type, the specific case values, the code in the
-// body of each case, and the hardware.
-// Some examples:
-// - a lookup table (for a switch that maps constants to constants)
-// - a computed goto
-// - a binary tree
-// - a perfect hash
-// - a two-level switch (to partition constant strings by their first byte).
-
-import (
- "bytes"
- "fmt"
- "go/token"
- "go/types"
-
- "honnef.co/go/tools/ssa"
-)
-
-// A ConstCase represents a single constant comparison.
-// It is part of a Switch.
-type ConstCase struct {
- Block *ssa.BasicBlock // block performing the comparison
- Body *ssa.BasicBlock // body of the case
- Value *ssa.Const // case comparand
-}
-
-// A TypeCase represents a single type assertion.
-// It is part of a Switch.
-type TypeCase struct {
- Block *ssa.BasicBlock // block performing the type assert
- Body *ssa.BasicBlock // body of the case
- Type types.Type // case type
- Binding ssa.Value // value bound by this case
-}
-
-// A Switch is a logical high-level control flow operation
-// (a multiway branch) discovered by analysis of a CFG containing
-// only if/else chains. It is not part of the ssa.Instruction set.
-//
-// One of ConstCases and TypeCases has length >= 2;
-// the other is nil.
-//
-// In a value switch, the list of cases may contain duplicate constants.
-// A type switch may contain duplicate types, or types assignable
-// to an interface type also in the list.
-// TODO(adonovan): eliminate such duplicates.
-//
-type Switch struct {
- Start *ssa.BasicBlock // block containing start of if/else chain
- X ssa.Value // the switch operand
- ConstCases []ConstCase // ordered list of constant comparisons
- TypeCases []TypeCase // ordered list of type assertions
- Default *ssa.BasicBlock // successor if all comparisons fail
-}
-
-func (sw *Switch) String() string {
- // We represent each block by the String() of its
- // first Instruction, e.g. "print(42:int)".
- var buf bytes.Buffer
- if sw.ConstCases != nil {
- fmt.Fprintf(&buf, "switch %s {\n", sw.X.Name())
- for _, c := range sw.ConstCases {
- fmt.Fprintf(&buf, "case %s: %s\n", c.Value, c.Body.Instrs[0])
- }
- } else {
- fmt.Fprintf(&buf, "switch %s.(type) {\n", sw.X.Name())
- for _, c := range sw.TypeCases {
- fmt.Fprintf(&buf, "case %s %s: %s\n",
- c.Binding.Name(), c.Type, c.Body.Instrs[0])
- }
- }
- if sw.Default != nil {
- fmt.Fprintf(&buf, "default: %s\n", sw.Default.Instrs[0])
- }
- fmt.Fprintf(&buf, "}")
- return buf.String()
-}
-
-// Switches examines the control-flow graph of fn and returns the
-// set of inferred value and type switches. A value switch tests an
-// ssa.Value for equality against two or more compile-time constant
-// values. Switches involving link-time constants (addresses) are
-// ignored. A type switch type-asserts an ssa.Value against two or
-// more types.
-//
-// The switches are returned in dominance order.
-//
-// The resulting switches do not necessarily correspond to uses of the
-// 'switch' keyword in the source: for example, a single source-level
-// switch statement with non-constant cases may result in zero, one or
-// many Switches, one per plural sequence of constant cases.
-// Switches may even be inferred from if/else- or goto-based control flow.
-// (In general, the control flow constructs of the source program
-// cannot be faithfully reproduced from the SSA representation.)
-//
-func Switches(fn *ssa.Function) []Switch {
- // Traverse the CFG in dominance order, so we don't
- // enter an if/else-chain in the middle.
- var switches []Switch
- seen := make(map[*ssa.BasicBlock]bool) // TODO(adonovan): opt: use ssa.blockSet
- for _, b := range fn.DomPreorder() {
- if x, k := isComparisonBlock(b); x != nil {
- // Block b starts a switch.
- sw := Switch{Start: b, X: x}
- valueSwitch(&sw, k, seen)
- if len(sw.ConstCases) > 1 {
- switches = append(switches, sw)
- }
- }
-
- if y, x, T := isTypeAssertBlock(b); y != nil {
- // Block b starts a type switch.
- sw := Switch{Start: b, X: x}
- typeSwitch(&sw, y, T, seen)
- if len(sw.TypeCases) > 1 {
- switches = append(switches, sw)
- }
- }
- }
- return switches
-}
-
-func valueSwitch(sw *Switch, k *ssa.Const, seen map[*ssa.BasicBlock]bool) {
- b := sw.Start
- x := sw.X
- for x == sw.X {
- if seen[b] {
- break
- }
- seen[b] = true
-
- sw.ConstCases = append(sw.ConstCases, ConstCase{
- Block: b,
- Body: b.Succs[0],
- Value: k,
- })
- b = b.Succs[1]
- if len(b.Instrs) > 2 {
- // Block b contains not just 'if x == k',
- // so it may have side effects that
- // make it unsafe to elide.
- break
- }
- if len(b.Preds) != 1 {
- // Block b has multiple predecessors,
- // so it cannot be treated as a case.
- break
- }
- x, k = isComparisonBlock(b)
- }
- sw.Default = b
-}
-
-func typeSwitch(sw *Switch, y ssa.Value, T types.Type, seen map[*ssa.BasicBlock]bool) {
- b := sw.Start
- x := sw.X
- for x == sw.X {
- if seen[b] {
- break
- }
- seen[b] = true
-
- sw.TypeCases = append(sw.TypeCases, TypeCase{
- Block: b,
- Body: b.Succs[0],
- Type: T,
- Binding: y,
- })
- b = b.Succs[1]
- if len(b.Instrs) > 4 {
- // Block b contains not just
- // {TypeAssert; Extract #0; Extract #1; If}
- // so it may have side effects that
- // make it unsafe to elide.
- break
- }
- if len(b.Preds) != 1 {
- // Block b has multiple predecessors,
- // so it cannot be treated as a case.
- break
- }
- y, x, T = isTypeAssertBlock(b)
- }
- sw.Default = b
-}
-
-// isComparisonBlock returns the operands (v, k) if a block ends with
-// a comparison v==k, where k is a compile-time constant.
-//
-func isComparisonBlock(b *ssa.BasicBlock) (v ssa.Value, k *ssa.Const) {
- if n := len(b.Instrs); n >= 2 {
- if i, ok := b.Instrs[n-1].(*ssa.If); ok {
- if binop, ok := i.Cond.(*ssa.BinOp); ok && binop.Block() == b && binop.Op == token.EQL {
- if k, ok := binop.Y.(*ssa.Const); ok {
- return binop.X, k
- }
- if k, ok := binop.X.(*ssa.Const); ok {
- return binop.Y, k
- }
- }
- }
- }
- return
-}
-
-// isTypeAssertBlock returns the operands (y, x, T) if a block ends with
-// a type assertion "if y, ok := x.(T); ok {".
-//
-func isTypeAssertBlock(b *ssa.BasicBlock) (y, x ssa.Value, T types.Type) {
- if n := len(b.Instrs); n >= 4 {
- if i, ok := b.Instrs[n-1].(*ssa.If); ok {
- if ext1, ok := i.Cond.(*ssa.Extract); ok && ext1.Block() == b && ext1.Index == 1 {
- if ta, ok := ext1.Tuple.(*ssa.TypeAssert); ok && ta.Block() == b {
- // hack: relies upon instruction ordering.
- if ext0, ok := b.Instrs[n-3].(*ssa.Extract); ok {
- return ext0, ta.X, ta.AssertedType
- }
- }
- }
- }
- }
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/visit.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/visit.go
deleted file mode 100644
index 5c14845f5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/ssautil/visit.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil // import "honnef.co/go/tools/ssa/ssautil"
-
-import "honnef.co/go/tools/ssa"
-
-// This file defines utilities for visiting the SSA representation of
-// a Program.
-//
-// TODO(adonovan): test coverage.
-
-// AllFunctions finds and returns the set of functions potentially
-// needed by program prog, as determined by a simple linker-style
-// reachability algorithm starting from the members and method-sets of
-// each package. The result may include anonymous functions and
-// synthetic wrappers.
-//
-// Precondition: all packages are built.
-//
-func AllFunctions(prog *ssa.Program) map[*ssa.Function]bool {
- visit := visitor{
- prog: prog,
- seen: make(map[*ssa.Function]bool),
- }
- visit.program()
- return visit.seen
-}
-
-type visitor struct {
- prog *ssa.Program
- seen map[*ssa.Function]bool
-}
-
-func (visit *visitor) program() {
- for _, pkg := range visit.prog.AllPackages() {
- for _, mem := range pkg.Members {
- if fn, ok := mem.(*ssa.Function); ok {
- visit.function(fn)
- }
- }
- }
- for _, T := range visit.prog.RuntimeTypes() {
- mset := visit.prog.MethodSets.MethodSet(T)
- for i, n := 0, mset.Len(); i < n; i++ {
- visit.function(visit.prog.MethodValue(mset.At(i)))
- }
- }
-}
-
-func (visit *visitor) function(fn *ssa.Function) {
- if !visit.seen[fn] {
- visit.seen[fn] = true
- var buf [10]*ssa.Value // avoid alloc in common case
- for _, b := range fn.Blocks {
- for _, instr := range b.Instrs {
- for _, op := range instr.Operands(buf[:0]) {
- if fn, ok := (*op).(*ssa.Function); ok {
- visit.function(fn)
- }
- }
- }
- }
- }
-}
-
-// MainPackages returns the subset of the specified packages
-// named "main" that define a main function.
-// The result may include synthetic "testmain" packages.
-func MainPackages(pkgs []*ssa.Package) []*ssa.Package {
- var mains []*ssa.Package
- for _, pkg := range pkgs {
- if pkg.Pkg.Name() == "main" && pkg.Func("main") != nil {
- mains = append(mains, pkg)
- }
- }
- return mains
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/testmain.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/testmain.go
deleted file mode 100644
index 2b897246c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/testmain.go
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// CreateTestMainPackage synthesizes a main package that runs all the
-// tests of the supplied packages.
-// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing.
-//
-// TODO(adonovan): this file no longer needs to live in the ssa package.
-// Move it to ssautil.
-
-import (
- "bytes"
- "fmt"
- "go/ast"
- "go/parser"
- "go/types"
- "log"
- "os"
- "strings"
- "text/template"
-)
-
-// FindTests returns the Test, Benchmark, and Example functions
-// (as defined by "go test") defined in the specified package,
-// and its TestMain function, if any.
-func FindTests(pkg *Package) (tests, benchmarks, examples []*Function, main *Function) {
- prog := pkg.Prog
-
- // The first two of these may be nil: if the program doesn't import "testing",
- // it can't contain any tests, but it may yet contain Examples.
- var testSig *types.Signature // func(*testing.T)
- var benchmarkSig *types.Signature // func(*testing.B)
- var exampleSig = types.NewSignature(nil, nil, nil, false) // func()
-
- // Obtain the types from the parameters of testing.MainStart.
- if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
- mainStart := testingPkg.Func("MainStart")
- params := mainStart.Signature.Params()
- testSig = funcField(params.At(1).Type())
- benchmarkSig = funcField(params.At(2).Type())
-
- // Does the package define this function?
- // func TestMain(*testing.M)
- if f := pkg.Func("TestMain"); f != nil {
- sig := f.Type().(*types.Signature)
- starM := mainStart.Signature.Results().At(0).Type() // *testing.M
- if sig.Results().Len() == 0 &&
- sig.Params().Len() == 1 &&
- types.Identical(sig.Params().At(0).Type(), starM) {
- main = f
- }
- }
- }
-
- // TODO(adonovan): use a stable order, e.g. lexical.
- for _, mem := range pkg.Members {
- if f, ok := mem.(*Function); ok &&
- ast.IsExported(f.Name()) &&
- strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") {
-
- switch {
- case testSig != nil && isTestSig(f, "Test", testSig):
- tests = append(tests, f)
- case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig):
- benchmarks = append(benchmarks, f)
- case isTestSig(f, "Example", exampleSig):
- examples = append(examples, f)
- default:
- continue
- }
- }
- }
- return
-}
-
-// Like isTest, but checks the signature too.
-func isTestSig(f *Function, prefix string, sig *types.Signature) bool {
- return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig)
-}
-
-// Given the type of one of the three slice parameters of testing.Main,
-// returns the function type.
-func funcField(slice types.Type) *types.Signature {
- return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature)
-}
-
-// 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.
-// Plundered from $GOROOT/src/cmd/go/test.go
-func isTest(name, prefix string) bool {
- if !strings.HasPrefix(name, prefix) {
- return false
- }
- if len(name) == len(prefix) { // "Test" is ok
- return true
- }
- return ast.IsExported(name[len(prefix):])
-}
-
-// CreateTestMainPackage creates and returns a synthetic "testmain"
-// package for the specified package if it defines tests, benchmarks or
-// executable examples, or nil otherwise. The new package is named
-// "main" and provides a function named "main" that runs the tests,
-// similar to the one that would be created by the 'go test' tool.
-//
-// Subsequent calls to prog.AllPackages include the new package.
-// The package pkg must belong to the program prog.
-func (prog *Program) CreateTestMainPackage(pkg *Package) *Package {
- if pkg.Prog != prog {
- log.Fatal("Package does not belong to Program")
- }
-
- // Template data
- var data struct {
- Pkg *Package
- Tests, Benchmarks, Examples []*Function
- Main *Function
- Go18 bool
- }
- data.Pkg = pkg
-
- // Enumerate tests.
- data.Tests, data.Benchmarks, data.Examples, data.Main = FindTests(pkg)
- if data.Main == nil &&
- data.Tests == nil && data.Benchmarks == nil && data.Examples == nil {
- return nil
- }
-
- // Synthesize source for testmain package.
- path := pkg.Pkg.Path() + "$testmain"
- tmpl := testmainTmpl
- if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
- // In Go 1.8, testing.MainStart's first argument is an interface, not a func.
- data.Go18 = types.IsInterface(testingPkg.Func("MainStart").Signature.Params().At(0).Type())
- } else {
- // The program does not import "testing", but FindTests
- // returned non-nil, which must mean there were Examples
- // but no Test, Benchmark, or TestMain functions.
-
- // We'll simply call them from testmain.main; this will
- // ensure they don't panic, but will not check any
- // "Output:" comments.
- // (We should not execute an Example that has no
- // "Output:" comment, but it's impossible to tell here.)
- tmpl = examplesOnlyTmpl
- }
- var buf bytes.Buffer
- if err := tmpl.Execute(&buf, data); err != nil {
- log.Fatalf("internal error expanding template for %s: %v", path, err)
- }
- if false { // debugging
- fmt.Fprintln(os.Stderr, buf.String())
- }
-
- // Parse and type-check the testmain package.
- f, err := parser.ParseFile(prog.Fset, path+".go", &buf, parser.Mode(0))
- if err != nil {
- log.Fatalf("internal error parsing %s: %v", path, err)
- }
- conf := types.Config{
- DisableUnusedImportCheck: true,
- Importer: importer{pkg},
- }
- files := []*ast.File{f}
- info := &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Scopes: make(map[ast.Node]*types.Scope),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- }
- testmainPkg, err := conf.Check(path, prog.Fset, files, info)
- if err != nil {
- log.Fatalf("internal error type-checking %s: %v", path, err)
- }
-
- // Create and build SSA code.
- testmain := prog.CreatePackage(testmainPkg, files, info, false)
- testmain.SetDebugMode(false)
- testmain.Build()
- testmain.Func("main").Synthetic = "test main function"
- testmain.Func("init").Synthetic = "package initializer"
- return testmain
-}
-
-// An implementation of types.Importer for an already loaded SSA program.
-type importer struct {
- pkg *Package // package under test; may be non-importable
-}
-
-func (imp importer) Import(path string) (*types.Package, error) {
- if p := imp.pkg.Prog.ImportedPackage(path); p != nil {
- return p.Pkg, nil
- }
- if path == imp.pkg.Pkg.Path() {
- return imp.pkg.Pkg, nil
- }
- return nil, fmt.Errorf("not found") // can't happen
-}
-
-var testmainTmpl = template.Must(template.New("testmain").Parse(`
-package main
-
-import "io"
-import "os"
-import "testing"
-import p {{printf "%q" .Pkg.Pkg.Path}}
-
-{{if .Go18}}
-type deps struct{}
-
-func (deps) MatchString(pat, str string) (bool, error) { return true, nil }
-func (deps) StartCPUProfile(io.Writer) error { return nil }
-func (deps) StopCPUProfile() {}
-func (deps) WriteHeapProfile(io.Writer) error { return nil }
-func (deps) WriteProfileTo(string, io.Writer, int) error { return nil }
-
-var match deps
-{{else}}
-func match(_, _ string) (bool, error) { return true, nil }
-{{end}}
-
-func main() {
- tests := []testing.InternalTest{
-{{range .Tests}}
- { {{printf "%q" .Name}}, p.{{.Name}} },
-{{end}}
- }
- benchmarks := []testing.InternalBenchmark{
-{{range .Benchmarks}}
- { {{printf "%q" .Name}}, p.{{.Name}} },
-{{end}}
- }
- examples := []testing.InternalExample{
-{{range .Examples}}
- {Name: {{printf "%q" .Name}}, F: p.{{.Name}}},
-{{end}}
- }
- m := testing.MainStart(match, tests, benchmarks, examples)
-{{with .Main}}
- p.{{.Name}}(m)
-{{else}}
- os.Exit(m.Run())
-{{end}}
-}
-
-`))
-
-var examplesOnlyTmpl = template.Must(template.New("examples").Parse(`
-package main
-
-import p {{printf "%q" .Pkg.Pkg.Path}}
-
-func main() {
-{{range .Examples}}
- p.{{.Name}}()
-{{end}}
-}
-`))
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/util.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/util.go
deleted file mode 100644
index 317a0130b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/util.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// This file defines a number of miscellaneous utility functions.
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "io"
- "os"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-//// AST utilities
-
-func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
-
-// isBlankIdent returns true iff e is an Ident with name "_".
-// They have no associated types.Object, and thus no type.
-//
-func isBlankIdent(e ast.Expr) bool {
- id, ok := e.(*ast.Ident)
- return ok && id.Name == "_"
-}
-
-//// Type utilities. Some of these belong in go/types.
-
-// isPointer returns true for types whose underlying type is a pointer.
-func isPointer(typ types.Type) bool {
- _, ok := typ.Underlying().(*types.Pointer)
- return ok
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-// recvType returns the receiver type of method obj.
-func recvType(obj *types.Func) types.Type {
- return obj.Type().(*types.Signature).Recv().Type()
-}
-
-// DefaultType returns the default "typed" type for an "untyped" type;
-// it returns the incoming type for all other types. The default type
-// for untyped nil is untyped nil.
-//
-// Exported to ssa/interp.
-//
-// TODO(gri): this is a copy of go/types.defaultType; export that function.
-//
-func DefaultType(typ types.Type) types.Type {
- if t, ok := typ.(*types.Basic); ok {
- k := t.Kind()
- switch k {
- case types.UntypedBool:
- k = types.Bool
- case types.UntypedInt:
- k = types.Int
- case types.UntypedRune:
- k = types.Rune
- case types.UntypedFloat:
- k = types.Float64
- case types.UntypedComplex:
- k = types.Complex128
- case types.UntypedString:
- k = types.String
- }
- typ = types.Typ[k]
- }
- return typ
-}
-
-// logStack prints the formatted "start" message to stderr and
-// returns a closure that prints the corresponding "end" message.
-// Call using 'defer logStack(...)()' to show builder stack on panic.
-// Don't forget trailing parens!
-//
-func logStack(format string, args ...interface{}) func() {
- msg := fmt.Sprintf(format, args...)
- io.WriteString(os.Stderr, msg)
- io.WriteString(os.Stderr, "\n")
- return func() {
- io.WriteString(os.Stderr, msg)
- io.WriteString(os.Stderr, " end\n")
- }
-}
-
-// newVar creates a 'var' for use in a types.Tuple.
-func newVar(name string, typ types.Type) *types.Var {
- return types.NewParam(token.NoPos, nil, name, typ)
-}
-
-// anonVar creates an anonymous 'var' for use in a types.Tuple.
-func anonVar(typ types.Type) *types.Var {
- return newVar("", typ)
-}
-
-var lenResults = types.NewTuple(anonVar(tInt))
-
-// makeLen returns the len builtin specialized to type func(T)int.
-func makeLen(T types.Type) *Builtin {
- lenParams := types.NewTuple(anonVar(T))
- return &Builtin{
- name: "len",
- sig: types.NewSignature(nil, lenParams, lenResults, false),
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/wrappers.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/wrappers.go
deleted file mode 100644
index 6ca01ab35..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/wrappers.go
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.5
-
-package ssa
-
-// This file defines synthesis of Functions that delegate to declared
-// methods; they come in three kinds:
-//
-// (1) wrappers: methods that wrap declared methods, performing
-// implicit pointer indirections and embedded field selections.
-//
-// (2) thunks: funcs that wrap declared methods. Like wrappers,
-// thunks perform indirections and field selections. The thunk's
-// first parameter is used as the receiver for the method call.
-//
-// (3) bounds: funcs that wrap declared methods. The bound's sole
-// free variable, supplied by a closure, is used as the receiver
-// for the method call. No indirections or field selections are
-// performed since they can be done before the call.
-
-import (
- "fmt"
-
- "go/types"
-)
-
-// -- wrappers -----------------------------------------------------------
-
-// makeWrapper returns a synthetic method that delegates to the
-// declared method denoted by meth.Obj(), first performing any
-// necessary pointer indirections or field selections implied by meth.
-//
-// The resulting method's receiver type is meth.Recv().
-//
-// This function is versatile but quite subtle! Consider the
-// following axes of variation when making changes:
-// - optional receiver indirection
-// - optional implicit field selections
-// - meth.Obj() may denote a concrete or an interface method
-// - the result may be a thunk or a wrapper.
-//
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-//
-func makeWrapper(prog *Program, sel *types.Selection) *Function {
- obj := sel.Obj().(*types.Func) // the declared function
- sig := sel.Type().(*types.Signature) // type of this wrapper
-
- var recv *types.Var // wrapper's receiver or thunk's params[0]
- name := obj.Name()
- var description string
- var start int // first regular param
- if sel.Kind() == types.MethodExpr {
- name += "$thunk"
- description = "thunk"
- recv = sig.Params().At(0)
- start = 1
- } else {
- description = "wrapper"
- recv = sig.Recv()
- }
-
- description = fmt.Sprintf("%s for %s", description, sel.Obj())
- if prog.mode&LogSource != 0 {
- defer logStack("make %s to (%s)", description, recv.Type())()
- }
- fn := &Function{
- name: name,
- method: sel,
- object: obj,
- Signature: sig,
- Synthetic: description,
- Prog: prog,
- pos: obj.Pos(),
- }
- fn.startBody()
- fn.addSpilledParam(recv)
- createParams(fn, start)
-
- indices := sel.Index()
-
- var v Value = fn.Locals[0] // spilled receiver
- if isPointer(sel.Recv()) {
- v = emitLoad(fn, v)
-
- // For simple indirection wrappers, perform an informative nil-check:
- // "value method (T).f called using nil *T pointer"
- if len(indices) == 1 && !isPointer(recvType(obj)) {
- var c Call
- c.Call.Value = &Builtin{
- name: "ssa:wrapnilchk",
- sig: types.NewSignature(nil,
- types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)),
- types.NewTuple(anonVar(sel.Recv())), false),
- }
- c.Call.Args = []Value{
- v,
- stringConst(deref(sel.Recv()).String()),
- stringConst(sel.Obj().Name()),
- }
- c.setType(v.Type())
- v = fn.emit(&c)
- }
- }
-
- // Invariant: v is a pointer, either
- // value of *A receiver param, or
- // address of A spilled receiver.
-
- // We use pointer arithmetic (FieldAddr possibly followed by
- // Load) in preference to value extraction (Field possibly
- // preceded by Load).
-
- v = emitImplicitSelections(fn, v, indices[:len(indices)-1])
-
- // Invariant: v is a pointer, either
- // value of implicit *C field, or
- // address of implicit C field.
-
- var c Call
- if r := recvType(obj); !isInterface(r) { // concrete method
- if !isPointer(r) {
- v = emitLoad(fn, v)
- }
- c.Call.Value = prog.declaredFunc(obj)
- c.Call.Args = append(c.Call.Args, v)
- } else {
- c.Call.Method = obj
- c.Call.Value = emitLoad(fn, v)
- }
- for _, arg := range fn.Params[1:] {
- c.Call.Args = append(c.Call.Args, arg)
- }
- emitTailCall(fn, &c)
- fn.finishBody()
- return fn
-}
-
-// createParams creates parameters for wrapper method fn based on its
-// Signature.Params, which do not include the receiver.
-// start is the index of the first regular parameter to use.
-//
-func createParams(fn *Function, start int) {
- var last *Parameter
- tparams := fn.Signature.Params()
- for i, n := start, tparams.Len(); i < n; i++ {
- last = fn.addParamObj(tparams.At(i))
- }
- if fn.Signature.Variadic() {
- last.typ = types.NewSlice(last.typ)
- }
-}
-
-// -- bounds -----------------------------------------------------------
-
-// makeBound returns a bound method wrapper (or "bound"), a synthetic
-// function that delegates to a concrete or interface method denoted
-// by obj. The resulting function has no receiver, but has one free
-// variable which will be used as the method's receiver in the
-// tail-call.
-//
-// Use MakeClosure with such a wrapper to construct a bound method
-// closure. e.g.:
-//
-// type T int or: type T interface { meth() }
-// func (t T) meth()
-// var t T
-// f := t.meth
-// f() // calls t.meth()
-//
-// f is a closure of a synthetic wrapper defined as if by:
-//
-// f := func() { return t.meth() }
-//
-// Unlike makeWrapper, makeBound need perform no indirection or field
-// selections because that can be done before the closure is
-// constructed.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
-//
-func makeBound(prog *Program, obj *types.Func) *Function {
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
- fn, ok := prog.bounds[obj]
- if !ok {
- description := fmt.Sprintf("bound method wrapper for %s", obj)
- if prog.mode&LogSource != 0 {
- defer logStack("%s", description)()
- }
- fn = &Function{
- name: obj.Name() + "$bound",
- object: obj,
- Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver
- Synthetic: description,
- Prog: prog,
- pos: obj.Pos(),
- }
-
- fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn}
- fn.FreeVars = []*FreeVar{fv}
- fn.startBody()
- createParams(fn, 0)
- var c Call
-
- if !isInterface(recvType(obj)) { // concrete
- c.Call.Value = prog.declaredFunc(obj)
- c.Call.Args = []Value{fv}
- } else {
- c.Call.Value = fv
- c.Call.Method = obj
- }
- for _, arg := range fn.Params {
- c.Call.Args = append(c.Call.Args, arg)
- }
- emitTailCall(fn, &c)
- fn.finishBody()
-
- prog.bounds[obj] = fn
- }
- return fn
-}
-
-// -- thunks -----------------------------------------------------------
-
-// makeThunk returns a thunk, a synthetic function that delegates to a
-// concrete or interface method denoted by sel.Obj(). The resulting
-// function has no receiver, but has an additional (first) regular
-// parameter.
-//
-// Precondition: sel.Kind() == types.MethodExpr.
-//
-// type T int or: type T interface { meth() }
-// func (t T) meth()
-// f := T.meth
-// var t T
-// f(t) // calls t.meth()
-//
-// f is a synthetic wrapper defined as if by:
-//
-// f := func(t T) { return t.meth() }
-//
-// TODO(adonovan): opt: currently the stub is created even when used
-// directly in a function call: C.f(i, 0). This is less efficient
-// than inlining the stub.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
-//
-func makeThunk(prog *Program, sel *types.Selection) *Function {
- if sel.Kind() != types.MethodExpr {
- panic(sel)
- }
-
- key := selectionKey{
- kind: sel.Kind(),
- recv: sel.Recv(),
- obj: sel.Obj(),
- index: fmt.Sprint(sel.Index()),
- indirect: sel.Indirect(),
- }
-
- prog.methodsMu.Lock()
- defer prog.methodsMu.Unlock()
-
- // Canonicalize key.recv to avoid constructing duplicate thunks.
- canonRecv, ok := prog.canon.At(key.recv).(types.Type)
- if !ok {
- canonRecv = key.recv
- prog.canon.Set(key.recv, canonRecv)
- }
- key.recv = canonRecv
-
- fn, ok := prog.thunks[key]
- if !ok {
- fn = makeWrapper(prog, sel)
- if fn.Signature.Recv() != nil {
- panic(fn) // unexpected receiver
- }
- prog.thunks[key] = fn
- }
- return fn
-}
-
-func changeRecv(s *types.Signature, recv *types.Var) *types.Signature {
- return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic())
-}
-
-// selectionKey is like types.Selection but a usable map key.
-type selectionKey struct {
- kind types.SelectionKind
- recv types.Type // canonicalized via Program.canon
- obj types.Object
- index string
- indirect bool
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/write.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/write.go
deleted file mode 100644
index 89761a18a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/ssa/write.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package ssa
-
-func NewJump(parent *BasicBlock) *Jump {
- return &Jump{anInstruction{parent}}
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/buildtag.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/buildtag.go
deleted file mode 100644
index 27c31c099..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/buildtag.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package staticcheck
-
-import (
- "go/ast"
- "strings"
-
- "honnef.co/go/tools/lint"
-)
-
-func buildTags(f *ast.File) [][]string {
- var out [][]string
- for _, line := range strings.Split(lint.Preamble(f), "\n") {
- if !strings.HasPrefix(line, "+build ") {
- continue
- }
- line = strings.TrimSpace(strings.TrimPrefix(line, "+build "))
- fields := strings.Fields(line)
- out = append(out, fields)
- }
- return out
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/lint.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/lint.go
deleted file mode 100644
index 1694e40d7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/lint.go
+++ /dev/null
@@ -1,2841 +0,0 @@
-// Package staticcheck contains a linter for Go source code.
-package staticcheck // import "honnef.co/go/tools/staticcheck"
-
-import (
- "fmt"
- "go/ast"
- "go/constant"
- "go/token"
- "go/types"
- htmltemplate "html/template"
- "net/http"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "sync"
- texttemplate "text/template"
-
- "honnef.co/go/tools/deprecated"
- "honnef.co/go/tools/functions"
- "honnef.co/go/tools/internal/sharedcheck"
- "honnef.co/go/tools/lint"
- "honnef.co/go/tools/ssa"
- "honnef.co/go/tools/staticcheck/vrp"
-
- "golang.org/x/tools/go/ast/astutil"
-)
-
-func validRegexp(call *Call) {
- arg := call.Args[0]
- err := ValidateRegexp(arg.Value)
- if err != nil {
- arg.Invalid(err.Error())
- }
-}
-
-type runeSlice []rune
-
-func (rs runeSlice) Len() int { return len(rs) }
-func (rs runeSlice) Less(i int, j int) bool { return rs[i] < rs[j] }
-func (rs runeSlice) Swap(i int, j int) { rs[i], rs[j] = rs[j], rs[i] }
-
-func utf8Cutset(call *Call) {
- arg := call.Args[1]
- if InvalidUTF8(arg.Value) {
- arg.Invalid(MsgInvalidUTF8)
- }
-}
-
-func uniqueCutset(call *Call) {
- arg := call.Args[1]
- if !UniqueStringCutset(arg.Value) {
- arg.Invalid(MsgNonUniqueCutset)
- }
-}
-
-func unmarshalPointer(name string, arg int) CallCheck {
- return func(call *Call) {
- if !Pointer(call.Args[arg].Value) {
- call.Args[arg].Invalid(fmt.Sprintf("%s expects to unmarshal into a pointer, but the provided value is not a pointer", name))
- }
- }
-}
-
-func pointlessIntMath(call *Call) {
- if ConvertedFromInt(call.Args[0].Value) {
- call.Invalid(fmt.Sprintf("calling %s on a converted integer is pointless", lint.CallName(call.Instr.Common())))
- }
-}
-
-func checkValidHostPort(arg int) CallCheck {
- return func(call *Call) {
- if !ValidHostPort(call.Args[arg].Value) {
- call.Args[arg].Invalid(MsgInvalidHostPort)
- }
- }
-}
-
-var (
- checkRegexpRules = map[string]CallCheck{
- "regexp.MustCompile": validRegexp,
- "regexp.Compile": validRegexp,
- }
-
- checkTimeParseRules = map[string]CallCheck{
- "time.Parse": func(call *Call) {
- arg := call.Args[0]
- err := ValidateTimeLayout(arg.Value)
- if err != nil {
- arg.Invalid(err.Error())
- }
- },
- }
-
- checkEncodingBinaryRules = map[string]CallCheck{
- "encoding/binary.Write": func(call *Call) {
- arg := call.Args[2]
- if !CanBinaryMarshal(call.Job, arg.Value) {
- arg.Invalid(fmt.Sprintf("value of type %s cannot be used with binary.Write", arg.Value.Value.Type()))
- }
- },
- }
-
- checkURLsRules = map[string]CallCheck{
- "net/url.Parse": func(call *Call) {
- arg := call.Args[0]
- err := ValidateURL(arg.Value)
- if err != nil {
- arg.Invalid(err.Error())
- }
- },
- }
-
- checkSyncPoolValueRules = map[string]CallCheck{
- "(*sync.Pool).Put": func(call *Call) {
- arg := call.Args[0]
- typ := arg.Value.Value.Type()
- if !lint.IsPointerLike(typ) {
- arg.Invalid("argument should be pointer-like to avoid allocations")
- }
- },
- }
-
- checkRegexpFindAllRules = map[string]CallCheck{
- "(*regexp.Regexp).FindAll": RepeatZeroTimes("a FindAll method", 1),
- "(*regexp.Regexp).FindAllIndex": RepeatZeroTimes("a FindAll method", 1),
- "(*regexp.Regexp).FindAllString": RepeatZeroTimes("a FindAll method", 1),
- "(*regexp.Regexp).FindAllStringIndex": RepeatZeroTimes("a FindAll method", 1),
- "(*regexp.Regexp).FindAllStringSubmatch": RepeatZeroTimes("a FindAll method", 1),
- "(*regexp.Regexp).FindAllStringSubmatchIndex": RepeatZeroTimes("a FindAll method", 1),
- "(*regexp.Regexp).FindAllSubmatch": RepeatZeroTimes("a FindAll method", 1),
- "(*regexp.Regexp).FindAllSubmatchIndex": RepeatZeroTimes("a FindAll method", 1),
- }
-
- checkUTF8CutsetRules = map[string]CallCheck{
- "strings.IndexAny": utf8Cutset,
- "strings.LastIndexAny": utf8Cutset,
- "strings.ContainsAny": utf8Cutset,
- "strings.Trim": utf8Cutset,
- "strings.TrimLeft": utf8Cutset,
- "strings.TrimRight": utf8Cutset,
- }
-
- checkUniqueCutsetRules = map[string]CallCheck{
- "strings.Trim": uniqueCutset,
- "strings.TrimLeft": uniqueCutset,
- "strings.TrimRight": uniqueCutset,
- }
-
- checkUnmarshalPointerRules = map[string]CallCheck{
- "encoding/xml.Unmarshal": unmarshalPointer("xml.Unmarshal", 1),
- "(*encoding/xml.Decoder).Decode": unmarshalPointer("Decode", 0),
- "encoding/json.Unmarshal": unmarshalPointer("json.Unmarshal", 1),
- "(*encoding/json.Decoder).Decode": unmarshalPointer("Decode", 0),
- }
-
- checkUnbufferedSignalChanRules = map[string]CallCheck{
- "os/signal.Notify": func(call *Call) {
- arg := call.Args[0]
- if UnbufferedChannel(arg.Value) {
- arg.Invalid("the channel used with signal.Notify should be buffered")
- }
- },
- }
-
- checkMathIntRules = map[string]CallCheck{
- "math.Ceil": pointlessIntMath,
- "math.Floor": pointlessIntMath,
- "math.IsNaN": pointlessIntMath,
- "math.Trunc": pointlessIntMath,
- "math.IsInf": pointlessIntMath,
- }
-
- checkStringsReplaceZeroRules = map[string]CallCheck{
- "strings.Replace": RepeatZeroTimes("strings.Replace", 3),
- "bytes.Replace": RepeatZeroTimes("bytes.Replace", 3),
- }
-
- checkListenAddressRules = map[string]CallCheck{
- "net/http.ListenAndServe": checkValidHostPort(0),
- "net/http.ListenAndServeTLS": checkValidHostPort(0),
- }
-
- checkBytesEqualIPRules = map[string]CallCheck{
- "bytes.Equal": func(call *Call) {
- if ConvertedFrom(call.Args[0].Value, "net.IP") && ConvertedFrom(call.Args[1].Value, "net.IP") {
- call.Invalid("use net.IP.Equal to compare net.IPs, not bytes.Equal")
- }
- },
- }
-
- checkRegexpMatchLoopRules = map[string]CallCheck{
- "regexp.Match": loopedRegexp("regexp.Match"),
- "regexp.MatchReader": loopedRegexp("regexp.MatchReader"),
- "regexp.MatchString": loopedRegexp("regexp.MatchString"),
- }
-)
-
-type Checker struct {
- CheckGenerated bool
- funcDescs *functions.Descriptions
- deprecatedObjs map[types.Object]string
- nodeFns map[ast.Node]*ssa.Function
-}
-
-func NewChecker() *Checker {
- return &Checker{}
-}
-
-func (*Checker) Name() string { return "staticcheck" }
-func (*Checker) Prefix() string { return "SA" }
-
-func (c *Checker) Funcs() map[string]lint.Func {
- return map[string]lint.Func{
- "SA1000": c.callChecker(checkRegexpRules),
- "SA1001": c.CheckTemplate,
- "SA1002": c.callChecker(checkTimeParseRules),
- "SA1003": c.callChecker(checkEncodingBinaryRules),
- "SA1004": c.CheckTimeSleepConstant,
- "SA1005": c.CheckExec,
- "SA1006": c.CheckUnsafePrintf,
- "SA1007": c.callChecker(checkURLsRules),
- "SA1008": c.CheckCanonicalHeaderKey,
- "SA1009": nil,
- "SA1010": c.callChecker(checkRegexpFindAllRules),
- "SA1011": c.callChecker(checkUTF8CutsetRules),
- "SA1012": c.CheckNilContext,
- "SA1013": c.CheckSeeker,
- "SA1014": c.callChecker(checkUnmarshalPointerRules),
- "SA1015": c.CheckLeakyTimeTick,
- "SA1016": c.CheckUntrappableSignal,
- "SA1017": c.callChecker(checkUnbufferedSignalChanRules),
- "SA1018": c.callChecker(checkStringsReplaceZeroRules),
- "SA1019": c.CheckDeprecated,
- "SA1020": c.callChecker(checkListenAddressRules),
- "SA1021": c.callChecker(checkBytesEqualIPRules),
- "SA1022": nil,
- "SA1023": c.CheckWriterBufferModified,
- "SA1024": c.callChecker(checkUniqueCutsetRules),
-
- "SA2000": c.CheckWaitgroupAdd,
- "SA2001": c.CheckEmptyCriticalSection,
- "SA2002": c.CheckConcurrentTesting,
- "SA2003": c.CheckDeferLock,
-
- "SA3000": c.CheckTestMainExit,
- "SA3001": c.CheckBenchmarkN,
-
- "SA4000": c.CheckLhsRhsIdentical,
- "SA4001": c.CheckIneffectiveCopy,
- "SA4002": c.CheckDiffSizeComparison,
- "SA4003": c.CheckUnsignedComparison,
- "SA4004": c.CheckIneffectiveLoop,
- "SA4005": c.CheckIneffectiveFieldAssignments,
- "SA4006": c.CheckUnreadVariableValues,
- // "SA4007": c.CheckPredeterminedBooleanExprs,
- "SA4007": nil,
- "SA4008": c.CheckLoopCondition,
- "SA4009": c.CheckArgOverwritten,
- "SA4010": c.CheckIneffectiveAppend,
- "SA4011": c.CheckScopedBreak,
- "SA4012": c.CheckNaNComparison,
- "SA4013": c.CheckDoubleNegation,
- "SA4014": c.CheckRepeatedIfElse,
- "SA4015": c.callChecker(checkMathIntRules),
- "SA4016": c.CheckSillyBitwiseOps,
- "SA4017": c.CheckPureFunctions,
- "SA4018": c.CheckSelfAssignment,
- "SA4019": c.CheckDuplicateBuildConstraints,
-
- "SA5000": c.CheckNilMaps,
- "SA5001": c.CheckEarlyDefer,
- "SA5002": c.CheckInfiniteEmptyLoop,
- "SA5003": c.CheckDeferInInfiniteLoop,
- "SA5004": c.CheckLoopEmptyDefault,
- "SA5005": c.CheckCyclicFinalizer,
- // "SA5006": c.CheckSliceOutOfBounds,
- "SA5007": c.CheckInfiniteRecursion,
-
- "SA6000": c.callChecker(checkRegexpMatchLoopRules),
- "SA6001": c.CheckMapBytesKey,
- "SA6002": c.callChecker(checkSyncPoolValueRules),
- "SA6003": c.CheckRangeStringRunes,
- "SA6004": nil,
-
- "SA9000": nil,
- "SA9001": c.CheckDubiousDeferInChannelRangeLoop,
- "SA9002": c.CheckNonOctalFileMode,
- "SA9003": c.CheckEmptyBranch,
- }
-}
-
-func (c *Checker) filterGenerated(files []*ast.File) []*ast.File {
- if c.CheckGenerated {
- return files
- }
- var out []*ast.File
- for _, f := range files {
- if !lint.IsGenerated(f) {
- out = append(out, f)
- }
- }
- return out
-}
-
-func (c *Checker) deprecateObject(m map[types.Object]string, prog *lint.Program, obj types.Object) {
- if obj.Pkg() == nil {
- return
- }
-
- f := prog.File(obj)
- if f == nil {
- return
- }
- msg := c.deprecationMessage(f, prog.Prog.Fset, obj)
- if msg != "" {
- m[obj] = msg
- }
-}
-
-func (c *Checker) Init(prog *lint.Program) {
- wg := &sync.WaitGroup{}
- wg.Add(3)
- go func() {
- c.funcDescs = functions.NewDescriptions(prog.SSA)
- for _, fn := range prog.AllFunctions {
- if fn.Blocks != nil {
- applyStdlibKnowledge(fn)
- ssa.OptimizeBlocks(fn)
- }
- }
- wg.Done()
- }()
-
- go func() {
- c.nodeFns = lint.NodeFns(prog.Packages)
- wg.Done()
- }()
-
- go func() {
- c.deprecatedObjs = map[types.Object]string{}
- for _, ssapkg := range prog.SSA.AllPackages() {
- ssapkg := ssapkg
- for _, member := range ssapkg.Members {
- obj := member.Object()
- if obj == nil {
- continue
- }
- c.deprecateObject(c.deprecatedObjs, prog, obj)
- if typ, ok := obj.Type().(*types.Named); ok {
- for i := 0; i < typ.NumMethods(); i++ {
- meth := typ.Method(i)
- c.deprecateObject(c.deprecatedObjs, prog, meth)
- }
-
- if iface, ok := typ.Underlying().(*types.Interface); ok {
- for i := 0; i < iface.NumExplicitMethods(); i++ {
- meth := iface.ExplicitMethod(i)
- c.deprecateObject(c.deprecatedObjs, prog, meth)
- }
- }
- }
- if typ, ok := obj.Type().Underlying().(*types.Struct); ok {
- n := typ.NumFields()
- for i := 0; i < n; i++ {
- // FIXME(dh): This code will not find deprecated
- // fields in anonymous structs.
- field := typ.Field(i)
- c.deprecateObject(c.deprecatedObjs, prog, field)
- }
- }
- }
- }
- wg.Done()
- }()
-
- wg.Wait()
-}
-
-func (c *Checker) deprecationMessage(file *ast.File, fset *token.FileSet, obj types.Object) (message string) {
- pos := obj.Pos()
- path, _ := astutil.PathEnclosingInterval(file, pos, pos)
- if len(path) <= 2 {
- return ""
- }
- var docs []*ast.CommentGroup
- switch n := path[1].(type) {
- case *ast.FuncDecl:
- docs = append(docs, n.Doc)
- case *ast.Field:
- docs = append(docs, n.Doc)
- case *ast.ValueSpec:
- docs = append(docs, n.Doc)
- if len(path) >= 3 {
- if n, ok := path[2].(*ast.GenDecl); ok {
- docs = append(docs, n.Doc)
- }
- }
- case *ast.TypeSpec:
- docs = append(docs, n.Doc)
- if len(path) >= 3 {
- if n, ok := path[2].(*ast.GenDecl); ok {
- docs = append(docs, n.Doc)
- }
- }
- default:
- return ""
- }
-
- for _, doc := range docs {
- if doc == nil {
- continue
- }
- parts := strings.Split(doc.Text(), "\n\n")
- last := parts[len(parts)-1]
- if !strings.HasPrefix(last, "Deprecated: ") {
- continue
- }
- alt := last[len("Deprecated: "):]
- alt = strings.Replace(alt, "\n", " ", -1)
- return alt
- }
- return ""
-}
-
-func (c *Checker) isInLoop(b *ssa.BasicBlock) bool {
- sets := c.funcDescs.Get(b.Parent()).Loops
- for _, set := range sets {
- if set[b] {
- return true
- }
- }
- return false
-}
-
-func applyStdlibKnowledge(fn *ssa.Function) {
- if len(fn.Blocks) == 0 {
- return
- }
-
- // comma-ok receiving from a time.Tick channel will never return
- // ok == false, so any branching on the value of ok can be
- // replaced with an unconditional jump. This will primarily match
- // `for range time.Tick(x)` loops, but it can also match
- // user-written code.
- for _, block := range fn.Blocks {
- if len(block.Instrs) < 3 {
- continue
- }
- if len(block.Succs) != 2 {
- continue
- }
- var instrs []*ssa.Instruction
- for i, ins := range block.Instrs {
- if _, ok := ins.(*ssa.DebugRef); ok {
- continue
- }
- instrs = append(instrs, &block.Instrs[i])
- }
-
- for i, ins := range instrs {
- unop, ok := (*ins).(*ssa.UnOp)
- if !ok || unop.Op != token.ARROW {
- continue
- }
- call, ok := unop.X.(*ssa.Call)
- if !ok {
- continue
- }
- if !lint.IsCallTo(call.Common(), "time.Tick") {
- continue
- }
- ex, ok := (*instrs[i+1]).(*ssa.Extract)
- if !ok || ex.Tuple != unop || ex.Index != 1 {
- continue
- }
-
- ifstmt, ok := (*instrs[i+2]).(*ssa.If)
- if !ok || ifstmt.Cond != ex {
- continue
- }
-
- *instrs[i+2] = ssa.NewJump(block)
- succ := block.Succs[1]
- block.Succs = block.Succs[0:1]
- succ.RemovePred(block)
- }
- }
-}
-
-func hasType(j *lint.Job, expr ast.Expr, name string) bool {
- return types.TypeString(j.Program.Info.TypeOf(expr), nil) == name
-}
-
-func (c *Checker) CheckUntrappableSignal(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAnyAST(call,
- "os/signal.Ignore", "os/signal.Notify", "os/signal.Reset") {
- return true
- }
- for _, arg := range call.Args {
- if conv, ok := arg.(*ast.CallExpr); ok && isName(j, conv.Fun, "os.Signal") {
- arg = conv.Args[0]
- }
-
- if isName(j, arg, "os.Kill") || isName(j, arg, "syscall.SIGKILL") {
- j.Errorf(arg, "%s cannot be trapped (did you mean syscall.SIGTERM?)", j.Render(arg))
- }
- if isName(j, arg, "syscall.SIGSTOP") {
- j.Errorf(arg, "%s signal cannot be trapped", j.Render(arg))
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckTemplate(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- var kind string
- if j.IsCallToAST(call, "(*text/template.Template).Parse") {
- kind = "text"
- } else if j.IsCallToAST(call, "(*html/template.Template).Parse") {
- kind = "html"
- } else {
- return true
- }
- sel := call.Fun.(*ast.SelectorExpr)
- if !j.IsCallToAST(sel.X, "text/template.New") &&
- !j.IsCallToAST(sel.X, "html/template.New") {
- // TODO(dh): this is a cheap workaround for templates with
- // different delims. A better solution with less false
- // negatives would use data flow analysis to see where the
- // template comes from and where it has been
- return true
- }
- s, ok := j.ExprToString(call.Args[0])
- if !ok {
- return true
- }
- var err error
- switch kind {
- case "text":
- _, err = texttemplate.New("").Parse(s)
- case "html":
- _, err = htmltemplate.New("").Parse(s)
- }
- if err != nil {
- // TODO(dominikh): whitelist other parse errors, if any
- if strings.Contains(err.Error(), "unexpected") {
- j.Errorf(call.Args[0], "%s", err)
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckTimeSleepConstant(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAST(call, "time.Sleep") {
- return true
- }
- lit, ok := call.Args[0].(*ast.BasicLit)
- if !ok {
- return true
- }
- n, err := strconv.Atoi(lit.Value)
- if err != nil {
- return true
- }
- if n == 0 || n > 120 {
- // time.Sleep(0) is a seldomly used pattern in concurrency
- // tests. >120 might be intentional. 120 was chosen
- // because the user could've meant 2 minutes.
- return true
- }
- recommendation := "time.Sleep(time.Nanosecond)"
- if n != 1 {
- recommendation = fmt.Sprintf("time.Sleep(%d * time.Nanosecond)", n)
- }
- j.Errorf(call.Args[0], "sleeping for %d nanoseconds is probably a bug. Be explicit if it isn't: %s", n, recommendation)
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckWaitgroupAdd(j *lint.Job) {
- fn := func(node ast.Node) bool {
- g, ok := node.(*ast.GoStmt)
- if !ok {
- return true
- }
- fun, ok := g.Call.Fun.(*ast.FuncLit)
- if !ok {
- return true
- }
- if len(fun.Body.List) == 0 {
- return true
- }
- stmt, ok := fun.Body.List[0].(*ast.ExprStmt)
- if !ok {
- return true
- }
- call, ok := stmt.X.(*ast.CallExpr)
- if !ok {
- return true
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return true
- }
- fn, ok := j.Program.Info.ObjectOf(sel.Sel).(*types.Func)
- if !ok {
- return true
- }
- if fn.FullName() == "(*sync.WaitGroup).Add" {
- j.Errorf(sel, "should call %s before starting the goroutine to avoid a race",
- j.Render(stmt))
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckInfiniteEmptyLoop(j *lint.Job) {
- fn := func(node ast.Node) bool {
- loop, ok := node.(*ast.ForStmt)
- if !ok || len(loop.Body.List) != 0 || loop.Post != nil {
- return true
- }
-
- if loop.Init != nil {
- // TODO(dh): this isn't strictly necessary, it just makes
- // the check easier.
- return true
- }
- // An empty loop is bad news in two cases: 1) The loop has no
- // condition. In that case, it's just a loop that spins
- // forever and as fast as it can, keeping a core busy. 2) The
- // loop condition only consists of variable or field reads and
- // operators on those. The only way those could change their
- // value is with unsynchronised access, which constitutes a
- // data race.
- //
- // If the condition contains any function calls, its behaviour
- // is dynamic and the loop might terminate. Similarly for
- // channel receives.
-
- if loop.Cond != nil && hasSideEffects(loop.Cond) {
- return true
- }
-
- j.Errorf(loop, "this loop will spin, using 100%% CPU")
- if loop.Cond != nil {
- j.Errorf(loop, "loop condition never changes or has a race condition")
- }
-
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckDeferInInfiniteLoop(j *lint.Job) {
- fn := func(node ast.Node) bool {
- mightExit := false
- var defers []ast.Stmt
- loop, ok := node.(*ast.ForStmt)
- if !ok || loop.Cond != nil {
- return true
- }
- fn2 := func(node ast.Node) bool {
- switch stmt := node.(type) {
- case *ast.ReturnStmt:
- mightExit = true
- case *ast.BranchStmt:
- // TODO(dominikh): if this sees a break in a switch or
- // select, it doesn't check if it breaks the loop or
- // just the select/switch. This causes some false
- // negatives.
- if stmt.Tok == token.BREAK {
- mightExit = true
- }
- case *ast.DeferStmt:
- defers = append(defers, stmt)
- case *ast.FuncLit:
- // Don't look into function bodies
- return false
- }
- return true
- }
- ast.Inspect(loop.Body, fn2)
- if mightExit {
- return true
- }
- for _, stmt := range defers {
- j.Errorf(stmt, "defers in this infinite loop will never run")
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckDubiousDeferInChannelRangeLoop(j *lint.Job) {
- fn := func(node ast.Node) bool {
- loop, ok := node.(*ast.RangeStmt)
- if !ok {
- return true
- }
- typ := j.Program.Info.TypeOf(loop.X)
- _, ok = typ.Underlying().(*types.Chan)
- if !ok {
- return true
- }
- fn2 := func(node ast.Node) bool {
- switch stmt := node.(type) {
- case *ast.DeferStmt:
- j.Errorf(stmt, "defers in this range loop won't run unless the channel gets closed")
- case *ast.FuncLit:
- // Don't look into function bodies
- return false
- }
- return true
- }
- ast.Inspect(loop.Body, fn2)
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckTestMainExit(j *lint.Job) {
- fn := func(node ast.Node) bool {
- if !isTestMain(j, node) {
- return true
- }
-
- arg := j.Program.Info.ObjectOf(node.(*ast.FuncDecl).Type.Params.List[0].Names[0])
- callsRun := false
- fn2 := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return true
- }
- ident, ok := sel.X.(*ast.Ident)
- if !ok {
- return true
- }
- if arg != j.Program.Info.ObjectOf(ident) {
- return true
- }
- if sel.Sel.Name == "Run" {
- callsRun = true
- return false
- }
- return true
- }
- ast.Inspect(node.(*ast.FuncDecl).Body, fn2)
-
- callsExit := false
- fn3 := func(node ast.Node) bool {
- if j.IsCallToAST(node, "os.Exit") {
- callsExit = true
- return false
- }
- return true
- }
- ast.Inspect(node.(*ast.FuncDecl).Body, fn3)
- if !callsExit && callsRun {
- j.Errorf(node, "TestMain should call os.Exit to set exit code")
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func isTestMain(j *lint.Job, node ast.Node) bool {
- decl, ok := node.(*ast.FuncDecl)
- if !ok {
- return false
- }
- if decl.Name.Name != "TestMain" {
- return false
- }
- if len(decl.Type.Params.List) != 1 {
- return false
- }
- arg := decl.Type.Params.List[0]
- if len(arg.Names) != 1 {
- return false
- }
- typ := j.Program.Info.TypeOf(arg.Type)
- return typ != nil && typ.String() == "*testing.M"
-}
-
-func (c *Checker) CheckExec(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAST(call, "os/exec.Command") {
- return true
- }
- val, ok := j.ExprToString(call.Args[0])
- if !ok {
- return true
- }
- if !strings.Contains(val, " ") || strings.Contains(val, `\`) || strings.Contains(val, "/") {
- return true
- }
- j.Errorf(call.Args[0], "first argument to exec.Command looks like a shell command, but a program name or path are expected")
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckLoopEmptyDefault(j *lint.Job) {
- fn := func(node ast.Node) bool {
- loop, ok := node.(*ast.ForStmt)
- if !ok || len(loop.Body.List) != 1 || loop.Cond != nil || loop.Init != nil {
- return true
- }
- sel, ok := loop.Body.List[0].(*ast.SelectStmt)
- if !ok {
- return true
- }
- for _, c := range sel.Body.List {
- if comm, ok := c.(*ast.CommClause); ok && comm.Comm == nil && len(comm.Body) == 0 {
- j.Errorf(comm, "should not have an empty default case in a for+select loop. The loop will spin.")
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckLhsRhsIdentical(j *lint.Job) {
- fn := func(node ast.Node) bool {
- op, ok := node.(*ast.BinaryExpr)
- if !ok {
- return true
- }
- switch op.Op {
- case token.EQL, token.NEQ:
- if basic, ok := j.Program.Info.TypeOf(op.X).(*types.Basic); ok {
- if kind := basic.Kind(); kind == types.Float32 || kind == types.Float64 {
- // f == f and f != f might be used to check for NaN
- return true
- }
- }
- case token.SUB, token.QUO, token.AND, token.REM, token.OR, token.XOR, token.AND_NOT,
- token.LAND, token.LOR, token.LSS, token.GTR, token.LEQ, token.GEQ:
- default:
- // For some ops, such as + and *, it can make sense to
- // have identical operands
- return true
- }
-
- if j.Render(op.X) != j.Render(op.Y) {
- return true
- }
- j.Errorf(op, "identical expressions on the left and right side of the '%s' operator", op.Op)
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckScopedBreak(j *lint.Job) {
- fn := func(node ast.Node) bool {
- var body *ast.BlockStmt
- switch node := node.(type) {
- case *ast.ForStmt:
- body = node.Body
- case *ast.RangeStmt:
- body = node.Body
- default:
- return true
- }
- for _, stmt := range body.List {
- var blocks [][]ast.Stmt
- switch stmt := stmt.(type) {
- case *ast.SwitchStmt:
- for _, c := range stmt.Body.List {
- blocks = append(blocks, c.(*ast.CaseClause).Body)
- }
- case *ast.SelectStmt:
- for _, c := range stmt.Body.List {
- blocks = append(blocks, c.(*ast.CommClause).Body)
- }
- default:
- continue
- }
-
- for _, body := range blocks {
- if len(body) == 0 {
- continue
- }
- lasts := []ast.Stmt{body[len(body)-1]}
- // TODO(dh): unfold all levels of nested block
- // statements, not just a single level if statement
- if ifs, ok := lasts[0].(*ast.IfStmt); ok {
- if len(ifs.Body.List) == 0 {
- continue
- }
- lasts[0] = ifs.Body.List[len(ifs.Body.List)-1]
-
- if block, ok := ifs.Else.(*ast.BlockStmt); ok {
- if len(block.List) != 0 {
- lasts = append(lasts, block.List[len(block.List)-1])
- }
- }
- }
- for _, last := range lasts {
- branch, ok := last.(*ast.BranchStmt)
- if !ok || branch.Tok != token.BREAK || branch.Label != nil {
- continue
- }
- j.Errorf(branch, "ineffective break statement. Did you mean to break out of the outer loop?")
- }
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckUnsafePrintf(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if !j.IsCallToAnyAST(call, "fmt.Printf", "fmt.Sprintf", "log.Printf") {
- return true
- }
- if len(call.Args) != 1 {
- return true
- }
- switch call.Args[0].(type) {
- case *ast.CallExpr, *ast.Ident:
- default:
- return true
- }
- j.Errorf(call.Args[0], "printf-style function with dynamic first argument and no further arguments should use print-style function instead")
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckEarlyDefer(j *lint.Job) {
- fn := func(node ast.Node) bool {
- block, ok := node.(*ast.BlockStmt)
- if !ok {
- return true
- }
- if len(block.List) < 2 {
- return true
- }
- for i, stmt := range block.List {
- if i == len(block.List)-1 {
- break
- }
- assign, ok := stmt.(*ast.AssignStmt)
- if !ok {
- continue
- }
- if len(assign.Rhs) != 1 {
- continue
- }
- if len(assign.Lhs) < 2 {
- continue
- }
- if lhs, ok := assign.Lhs[len(assign.Lhs)-1].(*ast.Ident); ok && lhs.Name == "_" {
- continue
- }
- call, ok := assign.Rhs[0].(*ast.CallExpr)
- if !ok {
- continue
- }
- sig, ok := j.Program.Info.TypeOf(call.Fun).(*types.Signature)
- if !ok {
- continue
- }
- if sig.Results().Len() < 2 {
- continue
- }
- last := sig.Results().At(sig.Results().Len() - 1)
- // FIXME(dh): check that it's error from universe, not
- // another type of the same name
- if last.Type().String() != "error" {
- continue
- }
- lhs, ok := assign.Lhs[0].(*ast.Ident)
- if !ok {
- continue
- }
- def, ok := block.List[i+1].(*ast.DeferStmt)
- if !ok {
- continue
- }
- sel, ok := def.Call.Fun.(*ast.SelectorExpr)
- if !ok {
- continue
- }
- ident, ok := selectorX(sel).(*ast.Ident)
- if !ok {
- continue
- }
- if ident.Obj != lhs.Obj {
- continue
- }
- if sel.Sel.Name != "Close" {
- continue
- }
- j.Errorf(def, "should check returned error before deferring %s", j.Render(def.Call))
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func selectorX(sel *ast.SelectorExpr) ast.Node {
- switch x := sel.X.(type) {
- case *ast.SelectorExpr:
- return selectorX(x)
- default:
- return x
- }
-}
-
-func (c *Checker) CheckEmptyCriticalSection(j *lint.Job) {
- // Initially it might seem like this check would be easier to
- // implement in SSA. After all, we're only checking for two
- // consecutive method calls. In reality, however, there may be any
- // number of other instructions between the lock and unlock, while
- // still constituting an empty critical section. For example,
- // given `m.x().Lock(); m.x().Unlock()`, there will be a call to
- // x(). In the AST-based approach, this has a tiny potential for a
- // false positive (the second call to x might be doing work that
- // is protected by the mutex). In an SSA-based approach, however,
- // it would miss a lot of real bugs.
-
- mutexParams := func(s ast.Stmt) (x ast.Expr, funcName string, ok bool) {
- expr, ok := s.(*ast.ExprStmt)
- if !ok {
- return nil, "", false
- }
- call, ok := expr.X.(*ast.CallExpr)
- if !ok {
- return nil, "", false
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return nil, "", false
- }
-
- fn, ok := j.Program.Info.ObjectOf(sel.Sel).(*types.Func)
- if !ok {
- return nil, "", false
- }
- sig := fn.Type().(*types.Signature)
- if sig.Params().Len() != 0 || sig.Results().Len() != 0 {
- return nil, "", false
- }
-
- return sel.X, fn.Name(), true
- }
-
- fn := func(node ast.Node) bool {
- block, ok := node.(*ast.BlockStmt)
- if !ok {
- return true
- }
- if len(block.List) < 2 {
- return true
- }
- for i := range block.List[:len(block.List)-1] {
- sel1, method1, ok1 := mutexParams(block.List[i])
- sel2, method2, ok2 := mutexParams(block.List[i+1])
-
- if !ok1 || !ok2 || j.Render(sel1) != j.Render(sel2) {
- continue
- }
- if (method1 == "Lock" && method2 == "Unlock") ||
- (method1 == "RLock" && method2 == "RUnlock") {
- j.Errorf(block.List[i+1], "empty critical section")
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-// cgo produces code like fn(&*_Cvar_kSomeCallbacks) which we don't
-// want to flag.
-var cgoIdent = regexp.MustCompile(`^_C(func|var)_.+$`)
-
-func (c *Checker) CheckIneffectiveCopy(j *lint.Job) {
- fn := func(node ast.Node) bool {
- if unary, ok := node.(*ast.UnaryExpr); ok {
- if star, ok := unary.X.(*ast.StarExpr); ok && unary.Op == token.AND {
- ident, ok := star.X.(*ast.Ident)
- if !ok || !cgoIdent.MatchString(ident.Name) {
- j.Errorf(unary, "&*x will be simplified to x. It will not copy x.")
- }
- }
- }
-
- if star, ok := node.(*ast.StarExpr); ok {
- if unary, ok := star.X.(*ast.UnaryExpr); ok && unary.Op == token.AND {
- j.Errorf(star, "*&x will be simplified to x. It will not copy x.")
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckDiffSizeComparison(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- for _, b := range ssafn.Blocks {
- for _, ins := range b.Instrs {
- binop, ok := ins.(*ssa.BinOp)
- if !ok {
- continue
- }
- if binop.Op != token.EQL && binop.Op != token.NEQ {
- continue
- }
- _, ok1 := binop.X.(*ssa.Slice)
- _, ok2 := binop.Y.(*ssa.Slice)
- if !ok1 && !ok2 {
- continue
- }
- r := c.funcDescs.Get(ssafn).Ranges
- r1, ok1 := r.Get(binop.X).(vrp.StringInterval)
- r2, ok2 := r.Get(binop.Y).(vrp.StringInterval)
- if !ok1 || !ok2 {
- continue
- }
- if r1.Length.Intersection(r2.Length).Empty() {
- j.Errorf(binop, "comparing strings of different sizes for equality will always return false")
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckCanonicalHeaderKey(j *lint.Job) {
- fn := func(node ast.Node) bool {
- assign, ok := node.(*ast.AssignStmt)
- if ok {
- // TODO(dh): This risks missing some Header reads, for
- // example in `h1["foo"] = h2["foo"]` – these edge
- // cases are probably rare enough to ignore for now.
- for _, expr := range assign.Lhs {
- op, ok := expr.(*ast.IndexExpr)
- if !ok {
- continue
- }
- if hasType(j, op.X, "net/http.Header") {
- return false
- }
- }
- return true
- }
- op, ok := node.(*ast.IndexExpr)
- if !ok {
- return true
- }
- if !hasType(j, op.X, "net/http.Header") {
- return true
- }
- s, ok := j.ExprToString(op.Index)
- if !ok {
- return true
- }
- if s == http.CanonicalHeaderKey(s) {
- return true
- }
- j.Errorf(op, "keys in http.Header are canonicalized, %q is not canonical; fix the constant or use http.CanonicalHeaderKey", s)
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckBenchmarkN(j *lint.Job) {
- fn := func(node ast.Node) bool {
- assign, ok := node.(*ast.AssignStmt)
- if !ok {
- return true
- }
- if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
- return true
- }
- sel, ok := assign.Lhs[0].(*ast.SelectorExpr)
- if !ok {
- return true
- }
- if sel.Sel.Name != "N" {
- return true
- }
- if !hasType(j, sel.X, "*testing.B") {
- return true
- }
- j.Errorf(assign, "should not assign to %s", j.Render(sel))
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckIneffectiveFieldAssignments(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- // fset := j.Program.SSA.Fset
- // if fset.File(f.File.Pos()) != fset.File(ssafn.Pos()) {
- // continue
- // }
- if ssafn.Signature.Recv() == nil {
- continue
- }
-
- if len(ssafn.Blocks) == 0 {
- // External function
- continue
- }
-
- reads := map[*ssa.BasicBlock]map[ssa.Value]bool{}
- writes := map[*ssa.BasicBlock]map[ssa.Value]bool{}
-
- recv := ssafn.Params[0]
- if _, ok := recv.Type().Underlying().(*types.Struct); !ok {
- continue
- }
- recvPtrs := map[ssa.Value]bool{
- recv: true,
- }
- if len(ssafn.Locals) == 0 || ssafn.Locals[0].Heap {
- continue
- }
- blocks := ssafn.DomPreorder()
- for _, block := range blocks {
- if writes[block] == nil {
- writes[block] = map[ssa.Value]bool{}
- }
- if reads[block] == nil {
- reads[block] = map[ssa.Value]bool{}
- }
-
- for _, ins := range block.Instrs {
- switch ins := ins.(type) {
- case *ssa.Store:
- if recvPtrs[ins.Val] {
- recvPtrs[ins.Addr] = true
- }
- fa, ok := ins.Addr.(*ssa.FieldAddr)
- if !ok {
- continue
- }
- if !recvPtrs[fa.X] {
- continue
- }
- writes[block][fa] = true
- case *ssa.UnOp:
- if ins.Op != token.MUL {
- continue
- }
- if recvPtrs[ins.X] {
- reads[block][ins] = true
- continue
- }
- fa, ok := ins.X.(*ssa.FieldAddr)
- if !ok {
- continue
- }
- if !recvPtrs[fa.X] {
- continue
- }
- reads[block][fa] = true
- }
- }
- }
-
- for block, writes := range writes {
- seen := map[*ssa.BasicBlock]bool{}
- var hasRead func(block *ssa.BasicBlock, write *ssa.FieldAddr) bool
- hasRead = func(block *ssa.BasicBlock, write *ssa.FieldAddr) bool {
- seen[block] = true
- for read := range reads[block] {
- switch ins := read.(type) {
- case *ssa.FieldAddr:
- if ins.Field == write.Field && read.Pos() > write.Pos() {
- return true
- }
- case *ssa.UnOp:
- if ins.Pos() >= write.Pos() {
- return true
- }
- }
- }
- for _, succ := range block.Succs {
- if !seen[succ] {
- if hasRead(succ, write) {
- return true
- }
- }
- }
- return false
- }
- for write := range writes {
- fa := write.(*ssa.FieldAddr)
- if !hasRead(block, fa) {
- name := recv.Type().Underlying().(*types.Struct).Field(fa.Field).Name()
- j.Errorf(fa, "ineffective assignment to field %s", name)
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckUnreadVariableValues(j *lint.Job) {
- fn := func(node ast.Node) bool {
- switch node.(type) {
- case *ast.FuncDecl, *ast.FuncLit:
- default:
- return true
- }
-
- ssafn := c.nodeFns[node]
- if ssafn == nil {
- return true
- }
- if lint.IsExample(ssafn) {
- return true
- }
- ast.Inspect(node, func(node ast.Node) bool {
- assign, ok := node.(*ast.AssignStmt)
- if !ok {
- return true
- }
- if len(assign.Lhs) > 1 && len(assign.Rhs) == 1 {
- // Either a function call with multiple return values,
- // or a comma-ok assignment
-
- val, _ := ssafn.ValueForExpr(assign.Rhs[0])
- if val == nil {
- return true
- }
- refs := val.Referrers()
- if refs == nil {
- return true
- }
- for _, ref := range *refs {
- ex, ok := ref.(*ssa.Extract)
- if !ok {
- continue
- }
- exrefs := ex.Referrers()
- if exrefs == nil {
- continue
- }
- if len(lint.FilterDebug(*exrefs)) == 0 {
- lhs := assign.Lhs[ex.Index]
- if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" {
- continue
- }
- j.Errorf(lhs, "this value of %s is never used", lhs)
- }
- }
- return true
- }
- for i, lhs := range assign.Lhs {
- rhs := assign.Rhs[i]
- if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" {
- continue
- }
- val, _ := ssafn.ValueForExpr(rhs)
- if val == nil {
- continue
- }
-
- refs := val.Referrers()
- if refs == nil {
- // TODO investigate why refs can be nil
- return true
- }
- if len(lint.FilterDebug(*refs)) == 0 {
- j.Errorf(lhs, "this value of %s is never used", lhs)
- }
- }
- return true
- })
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckPredeterminedBooleanExprs(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- ssabinop, ok := ins.(*ssa.BinOp)
- if !ok {
- continue
- }
- switch ssabinop.Op {
- case token.GTR, token.LSS, token.EQL, token.NEQ, token.LEQ, token.GEQ:
- default:
- continue
- }
-
- xs, ok1 := consts(ssabinop.X, nil, nil)
- ys, ok2 := consts(ssabinop.Y, nil, nil)
- if !ok1 || !ok2 || len(xs) == 0 || len(ys) == 0 {
- continue
- }
-
- trues := 0
- for _, x := range xs {
- for _, y := range ys {
- if x.Value == nil {
- if y.Value == nil {
- trues++
- }
- continue
- }
- if constant.Compare(x.Value, ssabinop.Op, y.Value) {
- trues++
- }
- }
- }
- b := trues != 0
- if trues == 0 || trues == len(xs)*len(ys) {
- j.Errorf(ssabinop, "binary expression is always %t for all possible values (%s %s %s)",
- b, xs, ssabinop.Op, ys)
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckNilMaps(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- mu, ok := ins.(*ssa.MapUpdate)
- if !ok {
- continue
- }
- c, ok := mu.Map.(*ssa.Const)
- if !ok {
- continue
- }
- if c.Value != nil {
- continue
- }
- j.Errorf(mu, "assignment to nil map")
- }
- }
- }
-}
-
-func (c *Checker) CheckUnsignedComparison(j *lint.Job) {
- fn := func(node ast.Node) bool {
- expr, ok := node.(*ast.BinaryExpr)
- if !ok {
- return true
- }
- tx := j.Program.Info.TypeOf(expr.X)
- basic, ok := tx.Underlying().(*types.Basic)
- if !ok {
- return true
- }
- if (basic.Info() & types.IsUnsigned) == 0 {
- return true
- }
- lit, ok := expr.Y.(*ast.BasicLit)
- if !ok || lit.Value != "0" {
- return true
- }
- switch expr.Op {
- case token.GEQ:
- j.Errorf(expr, "unsigned values are always >= 0")
- case token.LSS:
- j.Errorf(expr, "unsigned values are never < 0")
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func consts(val ssa.Value, out []*ssa.Const, visitedPhis map[string]bool) ([]*ssa.Const, bool) {
- if visitedPhis == nil {
- visitedPhis = map[string]bool{}
- }
- var ok bool
- switch val := val.(type) {
- case *ssa.Phi:
- if visitedPhis[val.Name()] {
- break
- }
- visitedPhis[val.Name()] = true
- vals := val.Operands(nil)
- for _, phival := range vals {
- out, ok = consts(*phival, out, visitedPhis)
- if !ok {
- return nil, false
- }
- }
- case *ssa.Const:
- out = append(out, val)
- case *ssa.Convert:
- out, ok = consts(val.X, out, visitedPhis)
- if !ok {
- return nil, false
- }
- default:
- return nil, false
- }
- if len(out) < 2 {
- return out, true
- }
- uniq := []*ssa.Const{out[0]}
- for _, val := range out[1:] {
- if val.Value == uniq[len(uniq)-1].Value {
- continue
- }
- uniq = append(uniq, val)
- }
- return uniq, true
-}
-
-func (c *Checker) CheckLoopCondition(j *lint.Job) {
- fn := func(node ast.Node) bool {
- loop, ok := node.(*ast.ForStmt)
- if !ok {
- return true
- }
- if loop.Init == nil || loop.Cond == nil || loop.Post == nil {
- return true
- }
- init, ok := loop.Init.(*ast.AssignStmt)
- if !ok || len(init.Lhs) != 1 || len(init.Rhs) != 1 {
- return true
- }
- cond, ok := loop.Cond.(*ast.BinaryExpr)
- if !ok {
- return true
- }
- x, ok := cond.X.(*ast.Ident)
- if !ok {
- return true
- }
- lhs, ok := init.Lhs[0].(*ast.Ident)
- if !ok {
- return true
- }
- if x.Obj != lhs.Obj {
- return true
- }
- if _, ok := loop.Post.(*ast.IncDecStmt); !ok {
- return true
- }
-
- ssafn := c.nodeFns[cond]
- if ssafn == nil {
- return true
- }
- v, isAddr := ssafn.ValueForExpr(cond.X)
- if v == nil || isAddr {
- return true
- }
- switch v := v.(type) {
- case *ssa.Phi:
- ops := v.Operands(nil)
- if len(ops) != 2 {
- return true
- }
- _, ok := (*ops[0]).(*ssa.Const)
- if !ok {
- return true
- }
- sigma, ok := (*ops[1]).(*ssa.Sigma)
- if !ok {
- return true
- }
- if sigma.X != v {
- return true
- }
- case *ssa.UnOp:
- return true
- }
- j.Errorf(cond, "variable in loop condition never changes")
-
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckArgOverwritten(j *lint.Job) {
- fn := func(node ast.Node) bool {
- var typ *ast.FuncType
- var body *ast.BlockStmt
- switch fn := node.(type) {
- case *ast.FuncDecl:
- typ = fn.Type
- body = fn.Body
- case *ast.FuncLit:
- typ = fn.Type
- body = fn.Body
- }
- if body == nil {
- return true
- }
- ssafn := c.nodeFns[node]
- if ssafn == nil {
- return true
- }
- if len(typ.Params.List) == 0 {
- return true
- }
- for _, field := range typ.Params.List {
- for _, arg := range field.Names {
- obj := j.Program.Info.ObjectOf(arg)
- var ssaobj *ssa.Parameter
- for _, param := range ssafn.Params {
- if param.Object() == obj {
- ssaobj = param
- break
- }
- }
- if ssaobj == nil {
- continue
- }
- refs := ssaobj.Referrers()
- if refs == nil {
- continue
- }
- if len(lint.FilterDebug(*refs)) != 0 {
- continue
- }
-
- assigned := false
- ast.Inspect(body, func(node ast.Node) bool {
- assign, ok := node.(*ast.AssignStmt)
- if !ok {
- return true
- }
- for _, lhs := range assign.Lhs {
- ident, ok := lhs.(*ast.Ident)
- if !ok {
- continue
- }
- if j.Program.Info.ObjectOf(ident) == obj {
- assigned = true
- return false
- }
- }
- return true
- })
- if assigned {
- j.Errorf(arg, "argument %s is overwritten before first use", arg)
- }
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckIneffectiveLoop(j *lint.Job) {
- // This check detects some, but not all unconditional loop exits.
- // We give up in the following cases:
- //
- // - a goto anywhere in the loop. The goto might skip over our
- // return, and we don't check that it doesn't.
- //
- // - any nested, unlabelled continue, even if it is in another
- // loop or closure.
- fn := func(node ast.Node) bool {
- var body *ast.BlockStmt
- switch fn := node.(type) {
- case *ast.FuncDecl:
- body = fn.Body
- case *ast.FuncLit:
- body = fn.Body
- default:
- return true
- }
- if body == nil {
- return true
- }
- labels := map[*ast.Object]ast.Stmt{}
- ast.Inspect(body, func(node ast.Node) bool {
- label, ok := node.(*ast.LabeledStmt)
- if !ok {
- return true
- }
- labels[label.Label.Obj] = label.Stmt
- return true
- })
-
- ast.Inspect(body, func(node ast.Node) bool {
- var loop ast.Node
- var body *ast.BlockStmt
- switch node := node.(type) {
- case *ast.ForStmt:
- body = node.Body
- loop = node
- case *ast.RangeStmt:
- typ := j.Program.Info.TypeOf(node.X)
- if _, ok := typ.Underlying().(*types.Map); ok {
- // looping once over a map is a valid pattern for
- // getting an arbitrary element.
- return true
- }
- body = node.Body
- loop = node
- default:
- return true
- }
- if len(body.List) < 2 {
- // avoid flagging the somewhat common pattern of using
- // a range loop to get the first element in a slice,
- // or the first rune in a string.
- return true
- }
- var unconditionalExit ast.Node
- hasBranching := false
- for _, stmt := range body.List {
- switch stmt := stmt.(type) {
- case *ast.BranchStmt:
- switch stmt.Tok {
- case token.BREAK:
- if stmt.Label == nil || labels[stmt.Label.Obj] == loop {
- unconditionalExit = stmt
- }
- case token.CONTINUE:
- if stmt.Label == nil || labels[stmt.Label.Obj] == loop {
- unconditionalExit = nil
- return false
- }
- }
- case *ast.ReturnStmt:
- unconditionalExit = stmt
- case *ast.IfStmt, *ast.ForStmt, *ast.RangeStmt, *ast.SwitchStmt, *ast.SelectStmt:
- hasBranching = true
- }
- }
- if unconditionalExit == nil || !hasBranching {
- return false
- }
- ast.Inspect(body, func(node ast.Node) bool {
- if branch, ok := node.(*ast.BranchStmt); ok {
-
- switch branch.Tok {
- case token.GOTO:
- unconditionalExit = nil
- return false
- case token.CONTINUE:
- if branch.Label != nil && labels[branch.Label.Obj] != loop {
- return true
- }
- unconditionalExit = nil
- return false
- }
- }
- return true
- })
- if unconditionalExit != nil {
- j.Errorf(unconditionalExit, "the surrounding loop is unconditionally terminated")
- }
- return true
- })
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckNilContext(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- if len(call.Args) == 0 {
- return true
- }
- if typ, ok := j.Program.Info.TypeOf(call.Args[0]).(*types.Basic); !ok || typ.Kind() != types.UntypedNil {
- return true
- }
- sig, ok := j.Program.Info.TypeOf(call.Fun).(*types.Signature)
- if !ok {
- return true
- }
- if sig.Params().Len() == 0 {
- return true
- }
- if types.TypeString(sig.Params().At(0).Type(), nil) != "context.Context" {
- return true
- }
- j.Errorf(call.Args[0],
- "do not pass a nil Context, even if a function permits it; pass context.TODO if you are unsure about which Context to use")
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckSeeker(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return true
- }
- if sel.Sel.Name != "Seek" {
- return true
- }
- if len(call.Args) != 2 {
- return true
- }
- arg0, ok := call.Args[0].(*ast.SelectorExpr)
- if !ok {
- return true
- }
- switch arg0.Sel.Name {
- case "SeekStart", "SeekCurrent", "SeekEnd":
- default:
- return true
- }
- pkg, ok := arg0.X.(*ast.Ident)
- if !ok {
- return true
- }
- if pkg.Name != "io" {
- return true
- }
- j.Errorf(call, "the first argument of io.Seeker is the offset, but an io.Seek* constant is being used instead")
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckIneffectiveAppend(j *lint.Job) {
- isAppend := func(ins ssa.Value) bool {
- call, ok := ins.(*ssa.Call)
- if !ok {
- return false
- }
- if call.Call.IsInvoke() {
- return false
- }
- if builtin, ok := call.Call.Value.(*ssa.Builtin); !ok || builtin.Name() != "append" {
- return false
- }
- return true
- }
-
- for _, ssafn := range j.Program.InitialFunctions {
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- val, ok := ins.(ssa.Value)
- if !ok || !isAppend(val) {
- continue
- }
-
- isUsed := false
- visited := map[ssa.Instruction]bool{}
- var walkRefs func(refs []ssa.Instruction)
- walkRefs = func(refs []ssa.Instruction) {
- loop:
- for _, ref := range refs {
- if visited[ref] {
- continue
- }
- visited[ref] = true
- if _, ok := ref.(*ssa.DebugRef); ok {
- continue
- }
- switch ref := ref.(type) {
- case *ssa.Phi:
- walkRefs(*ref.Referrers())
- case *ssa.Sigma:
- walkRefs(*ref.Referrers())
- case ssa.Value:
- if !isAppend(ref) {
- isUsed = true
- } else {
- walkRefs(*ref.Referrers())
- }
- case ssa.Instruction:
- isUsed = true
- break loop
- }
- }
- }
- refs := val.Referrers()
- if refs == nil {
- continue
- }
- walkRefs(*refs)
- if !isUsed {
- j.Errorf(ins, "this result of append is never used, except maybe in other appends")
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckConcurrentTesting(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- gostmt, ok := ins.(*ssa.Go)
- if !ok {
- continue
- }
- var fn *ssa.Function
- switch val := gostmt.Call.Value.(type) {
- case *ssa.Function:
- fn = val
- case *ssa.MakeClosure:
- fn = val.Fn.(*ssa.Function)
- default:
- continue
- }
- if fn.Blocks == nil {
- continue
- }
- for _, block := range fn.Blocks {
- for _, ins := range block.Instrs {
- call, ok := ins.(*ssa.Call)
- if !ok {
- continue
- }
- if call.Call.IsInvoke() {
- continue
- }
- callee := call.Call.StaticCallee()
- if callee == nil {
- continue
- }
- recv := callee.Signature.Recv()
- if recv == nil {
- continue
- }
- if types.TypeString(recv.Type(), nil) != "*testing.common" {
- continue
- }
- fn, ok := call.Call.StaticCallee().Object().(*types.Func)
- if !ok {
- continue
- }
- name := fn.Name()
- switch name {
- case "FailNow", "Fatal", "Fatalf", "SkipNow", "Skip", "Skipf":
- default:
- continue
- }
- j.Errorf(gostmt, "the goroutine calls T.%s, which must be called in the same goroutine as the test", name)
- }
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckCyclicFinalizer(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- node := c.funcDescs.CallGraph.CreateNode(ssafn)
- for _, edge := range node.Out {
- if edge.Callee.Func.RelString(nil) != "runtime.SetFinalizer" {
- continue
- }
- arg0 := edge.Site.Common().Args[0]
- if iface, ok := arg0.(*ssa.MakeInterface); ok {
- arg0 = iface.X
- }
- unop, ok := arg0.(*ssa.UnOp)
- if !ok {
- continue
- }
- v, ok := unop.X.(*ssa.Alloc)
- if !ok {
- continue
- }
- arg1 := edge.Site.Common().Args[1]
- if iface, ok := arg1.(*ssa.MakeInterface); ok {
- arg1 = iface.X
- }
- mc, ok := arg1.(*ssa.MakeClosure)
- if !ok {
- continue
- }
- for _, b := range mc.Bindings {
- if b == v {
- pos := j.Program.DisplayPosition(mc.Fn.Pos())
- j.Errorf(edge.Site, "the finalizer closes over the object, preventing the finalizer from ever running (at %s)", pos)
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckSliceOutOfBounds(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- ia, ok := ins.(*ssa.IndexAddr)
- if !ok {
- continue
- }
- if _, ok := ia.X.Type().Underlying().(*types.Slice); !ok {
- continue
- }
- sr, ok1 := c.funcDescs.Get(ssafn).Ranges[ia.X].(vrp.SliceInterval)
- idxr, ok2 := c.funcDescs.Get(ssafn).Ranges[ia.Index].(vrp.IntInterval)
- if !ok1 || !ok2 || !sr.IsKnown() || !idxr.IsKnown() || sr.Length.Empty() || idxr.Empty() {
- continue
- }
- if idxr.Lower.Cmp(sr.Length.Upper) >= 0 {
- j.Errorf(ia, "index out of bounds")
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckDeferLock(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- for _, block := range ssafn.Blocks {
- instrs := lint.FilterDebug(block.Instrs)
- if len(instrs) < 2 {
- continue
- }
- for i, ins := range instrs[:len(instrs)-1] {
- call, ok := ins.(*ssa.Call)
- if !ok {
- continue
- }
- if !lint.IsCallTo(call.Common(), "(*sync.Mutex).Lock") && !lint.IsCallTo(call.Common(), "(*sync.RWMutex).RLock") {
- continue
- }
- nins, ok := instrs[i+1].(*ssa.Defer)
- if !ok {
- continue
- }
- if !lint.IsCallTo(&nins.Call, "(*sync.Mutex).Lock") && !lint.IsCallTo(&nins.Call, "(*sync.RWMutex).RLock") {
- continue
- }
- if call.Common().Args[0] != nins.Call.Args[0] {
- continue
- }
- name := shortCallName(call.Common())
- alt := ""
- switch name {
- case "Lock":
- alt = "Unlock"
- case "RLock":
- alt = "RUnlock"
- }
- j.Errorf(nins, "deferring %s right after having locked already; did you mean to defer %s?", name, alt)
- }
- }
- }
-}
-
-func (c *Checker) CheckNaNComparison(j *lint.Job) {
- isNaN := func(v ssa.Value) bool {
- call, ok := v.(*ssa.Call)
- if !ok {
- return false
- }
- return lint.IsCallTo(call.Common(), "math.NaN")
- }
- for _, ssafn := range j.Program.InitialFunctions {
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- ins, ok := ins.(*ssa.BinOp)
- if !ok {
- continue
- }
- if isNaN(ins.X) || isNaN(ins.Y) {
- j.Errorf(ins, "no value is equal to NaN, not even NaN itself")
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckInfiniteRecursion(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- node := c.funcDescs.CallGraph.CreateNode(ssafn)
- for _, edge := range node.Out {
- if edge.Callee != node {
- continue
- }
- if _, ok := edge.Site.(*ssa.Go); ok {
- // Recursively spawning goroutines doesn't consume
- // stack space infinitely, so don't flag it.
- continue
- }
-
- block := edge.Site.Block()
- canReturn := false
- for _, b := range ssafn.Blocks {
- if block.Dominates(b) {
- continue
- }
- if len(b.Instrs) == 0 {
- continue
- }
- if _, ok := b.Instrs[len(b.Instrs)-1].(*ssa.Return); ok {
- canReturn = true
- break
- }
- }
- if canReturn {
- continue
- }
- j.Errorf(edge.Site, "infinite recursive call")
- }
- }
-}
-
-func objectName(obj types.Object) string {
- if obj == nil {
- return ""
- }
- var name string
- if obj.Pkg() != nil && obj.Pkg().Scope().Lookup(obj.Name()) == obj {
- var s string
- s = obj.Pkg().Path()
- if s != "" {
- name += s + "."
- }
- }
- name += obj.Name()
- return name
-}
-
-func isName(j *lint.Job, expr ast.Expr, name string) bool {
- var obj types.Object
- switch expr := expr.(type) {
- case *ast.Ident:
- obj = j.Program.Info.ObjectOf(expr)
- case *ast.SelectorExpr:
- obj = j.Program.Info.ObjectOf(expr.Sel)
- }
- return objectName(obj) == name
-}
-
-func (c *Checker) CheckLeakyTimeTick(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- if j.IsInMain(ssafn) || j.IsInTest(ssafn) {
- continue
- }
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- call, ok := ins.(*ssa.Call)
- if !ok || !lint.IsCallTo(call.Common(), "time.Tick") {
- continue
- }
- if c.funcDescs.Get(call.Parent()).Infinite {
- continue
- }
- j.Errorf(call, "using time.Tick leaks the underlying ticker, consider using it only in endless functions, tests and the main package, and use time.NewTicker here")
- }
- }
- }
-}
-
-func (c *Checker) CheckDoubleNegation(j *lint.Job) {
- fn := func(node ast.Node) bool {
- unary1, ok := node.(*ast.UnaryExpr)
- if !ok {
- return true
- }
- unary2, ok := unary1.X.(*ast.UnaryExpr)
- if !ok {
- return true
- }
- if unary1.Op != token.NOT || unary2.Op != token.NOT {
- return true
- }
- j.Errorf(unary1, "negating a boolean twice has no effect; is this a typo?")
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func hasSideEffects(node ast.Node) bool {
- dynamic := false
- ast.Inspect(node, func(node ast.Node) bool {
- switch node := node.(type) {
- case *ast.CallExpr:
- dynamic = true
- return false
- case *ast.UnaryExpr:
- if node.Op == token.ARROW {
- dynamic = true
- return false
- }
- }
- return true
- })
- return dynamic
-}
-
-func (c *Checker) CheckRepeatedIfElse(j *lint.Job) {
- seen := map[ast.Node]bool{}
-
- var collectConds func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr)
- collectConds = func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr) {
- seen[ifstmt] = true
- if ifstmt.Init != nil {
- inits = append(inits, ifstmt.Init)
- }
- conds = append(conds, ifstmt.Cond)
- if elsestmt, ok := ifstmt.Else.(*ast.IfStmt); ok {
- return collectConds(elsestmt, inits, conds)
- }
- return inits, conds
- }
- fn := func(node ast.Node) bool {
- ifstmt, ok := node.(*ast.IfStmt)
- if !ok {
- return true
- }
- if seen[ifstmt] {
- return true
- }
- inits, conds := collectConds(ifstmt, nil, nil)
- if len(inits) > 0 {
- return true
- }
- for _, cond := range conds {
- if hasSideEffects(cond) {
- return true
- }
- }
- counts := map[string]int{}
- for _, cond := range conds {
- s := j.Render(cond)
- counts[s]++
- if counts[s] == 2 {
- j.Errorf(cond, "this condition occurs multiple times in this if/else if chain")
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckSillyBitwiseOps(j *lint.Job) {
- for _, ssafn := range j.Program.InitialFunctions {
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- ins, ok := ins.(*ssa.BinOp)
- if !ok {
- continue
- }
-
- if c, ok := ins.Y.(*ssa.Const); !ok || c.Value == nil || c.Value.Kind() != constant.Int || c.Uint64() != 0 {
- continue
- }
- switch ins.Op {
- case token.AND, token.OR, token.XOR:
- default:
- // we do not flag shifts because too often, x<<0 is part
- // of a pattern, x<<0, x<<8, x<<16, ...
- continue
- }
- path, _ := astutil.PathEnclosingInterval(j.File(ins), ins.Pos(), ins.Pos())
- if len(path) == 0 {
- continue
- }
- if node, ok := path[0].(*ast.BinaryExpr); !ok || !lint.IsZero(node.Y) {
- continue
- }
-
- switch ins.Op {
- case token.AND:
- j.Errorf(ins, "x & 0 always equals 0")
- case token.OR, token.XOR:
- j.Errorf(ins, "x %s 0 always equals x", ins.Op)
- }
- }
- }
- }
-}
-
-func (c *Checker) CheckNonOctalFileMode(j *lint.Job) {
- fn := func(node ast.Node) bool {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return true
- }
- sig, ok := j.Program.Info.TypeOf(call.Fun).(*types.Signature)
- if !ok {
- return true
- }
- n := sig.Params().Len()
- var args []int
- for i := 0; i < n; i++ {
- typ := sig.Params().At(i).Type()
- if types.TypeString(typ, nil) == "os.FileMode" {
- args = append(args, i)
- }
- }
- for _, i := range args {
- lit, ok := call.Args[i].(*ast.BasicLit)
- if !ok {
- continue
- }
- if len(lit.Value) == 3 &&
- lit.Value[0] != '0' &&
- lit.Value[0] >= '0' && lit.Value[0] <= '7' &&
- lit.Value[1] >= '0' && lit.Value[1] <= '7' &&
- lit.Value[2] >= '0' && lit.Value[2] <= '7' {
-
- v, err := strconv.ParseInt(lit.Value, 10, 64)
- if err != nil {
- continue
- }
- j.Errorf(call.Args[i], "file mode '%s' evaluates to %#o; did you mean '0%s'?", lit.Value, v, lit.Value)
- }
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckPureFunctions(j *lint.Job) {
-fnLoop:
- for _, ssafn := range j.Program.InitialFunctions {
- if j.IsInTest(ssafn) {
- params := ssafn.Signature.Params()
- for i := 0; i < params.Len(); i++ {
- param := params.At(i)
- if types.TypeString(param.Type(), nil) == "*testing.B" {
- // Ignore discarded pure functions in code related
- // to benchmarks. Instead of matching BenchmarkFoo
- // functions, we match any function accepting a
- // *testing.B. Benchmarks sometimes call generic
- // functions for doing the actual work, and
- // checking for the parameter is a lot easier and
- // faster than analyzing call trees.
- continue fnLoop
- }
- }
- }
-
- for _, b := range ssafn.Blocks {
- for _, ins := range b.Instrs {
- ins, ok := ins.(*ssa.Call)
- if !ok {
- continue
- }
- refs := ins.Referrers()
- if refs == nil || len(lint.FilterDebug(*refs)) > 0 {
- continue
- }
- callee := ins.Common().StaticCallee()
- if callee == nil {
- continue
- }
- if c.funcDescs.Get(callee).Pure && !c.funcDescs.Get(callee).Stub {
- j.Errorf(ins, "%s is a pure function but its return value is ignored", callee.Name())
- continue
- }
- }
- }
- }
-}
-
-func (c *Checker) isDeprecated(j *lint.Job, ident *ast.Ident) (bool, string) {
- obj := j.Program.Info.ObjectOf(ident)
- if obj.Pkg() == nil {
- return false, ""
- }
- alt := c.deprecatedObjs[obj]
- return alt != "", alt
-}
-
-func selectorName(j *lint.Job, expr *ast.SelectorExpr) string {
- sel := j.Program.Info.Selections[expr]
- if sel == nil {
- if x, ok := expr.X.(*ast.Ident); ok {
- return fmt.Sprintf("%s.%s", x.Name, expr.Sel.Name)
- }
- panic(fmt.Sprintf("unsupported selector: %v", expr))
- }
- return fmt.Sprintf("(%s).%s", sel.Recv(), sel.Obj().Name())
-}
-
-func (c *Checker) enclosingFunc(sel *ast.SelectorExpr) *ssa.Function {
- fn := c.nodeFns[sel]
- if fn == nil {
- return nil
- }
- for fn.Parent() != nil {
- fn = fn.Parent()
- }
- return fn
-}
-
-func (c *Checker) CheckDeprecated(j *lint.Job) {
- fn := func(node ast.Node) bool {
- sel, ok := node.(*ast.SelectorExpr)
- if !ok {
- return true
- }
-
- obj := j.Program.Info.ObjectOf(sel.Sel)
- if obj.Pkg() == nil {
- return true
- }
- nodePkg := j.NodePackage(node).Pkg
- if nodePkg == obj.Pkg() || obj.Pkg().Path()+"_test" == nodePkg.Path() {
- // Don't flag stuff in our own package
- return true
- }
- if ok, alt := c.isDeprecated(j, sel.Sel); ok {
- // Look for the first available alternative, not the first
- // version something was deprecated in. If a function was
- // deprecated in Go 1.6, an alternative has been available
- // already in 1.0, and we're targetting 1.2, it still
- // makes sense to use the alternative from 1.0, to be
- // future-proof.
- minVersion := deprecated.Stdlib[selectorName(j, sel)].AlternativeAvailableSince
- if !j.IsGoVersion(minVersion) {
- return true
- }
-
- if fn := c.enclosingFunc(sel); fn != nil {
- if _, ok := c.deprecatedObjs[fn.Object()]; ok {
- // functions that are deprecated may use deprecated
- // symbols
- return true
- }
- }
- j.Errorf(sel, "%s is deprecated: %s", j.Render(sel), alt)
- return true
- }
- return true
- }
- for _, f := range j.Program.Files {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) callChecker(rules map[string]CallCheck) func(j *lint.Job) {
- return func(j *lint.Job) {
- c.checkCalls(j, rules)
- }
-}
-
-func (c *Checker) checkCalls(j *lint.Job, rules map[string]CallCheck) {
- for _, ssafn := range j.Program.InitialFunctions {
- node := c.funcDescs.CallGraph.CreateNode(ssafn)
- for _, edge := range node.Out {
- callee := edge.Callee.Func
- obj, ok := callee.Object().(*types.Func)
- if !ok {
- continue
- }
-
- r, ok := rules[obj.FullName()]
- if !ok {
- continue
- }
- var args []*Argument
- ssaargs := edge.Site.Common().Args
- if callee.Signature.Recv() != nil {
- ssaargs = ssaargs[1:]
- }
- for _, arg := range ssaargs {
- if iarg, ok := arg.(*ssa.MakeInterface); ok {
- arg = iarg.X
- }
- vr := c.funcDescs.Get(edge.Site.Parent()).Ranges[arg]
- args = append(args, &Argument{Value: Value{arg, vr}})
- }
- call := &Call{
- Job: j,
- Instr: edge.Site,
- Args: args,
- Checker: c,
- Parent: edge.Site.Parent(),
- }
- r(call)
- for idx, arg := range call.Args {
- _ = idx
- for _, e := range arg.invalids {
- // path, _ := astutil.PathEnclosingInterval(f.File, edge.Site.Pos(), edge.Site.Pos())
- // if len(path) < 2 {
- // continue
- // }
- // astcall, ok := path[0].(*ast.CallExpr)
- // if !ok {
- // continue
- // }
- // j.Errorf(astcall.Args[idx], "%s", e)
-
- j.Errorf(edge.Site, "%s", e)
- }
- }
- for _, e := range call.invalids {
- j.Errorf(call.Instr.Common(), "%s", e)
- }
- }
- }
-}
-
-func unwrapFunction(val ssa.Value) *ssa.Function {
- switch val := val.(type) {
- case *ssa.Function:
- return val
- case *ssa.MakeClosure:
- return val.Fn.(*ssa.Function)
- default:
- return nil
- }
-}
-
-func shortCallName(call *ssa.CallCommon) string {
- if call.IsInvoke() {
- return ""
- }
- switch v := call.Value.(type) {
- case *ssa.Function:
- fn, ok := v.Object().(*types.Func)
- if !ok {
- return ""
- }
- return fn.Name()
- case *ssa.Builtin:
- return v.Name()
- }
- return ""
-}
-
-func hasCallTo(block *ssa.BasicBlock, name string) bool {
- for _, ins := range block.Instrs {
- call, ok := ins.(*ssa.Call)
- if !ok {
- continue
- }
- if lint.IsCallTo(call.Common(), name) {
- return true
- }
- }
- return false
-}
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
- if p, ok := typ.Underlying().(*types.Pointer); ok {
- return p.Elem()
- }
- return typ
-}
-
-func (c *Checker) CheckWriterBufferModified(j *lint.Job) {
- // TODO(dh): this might be a good candidate for taint analysis.
- // Taint the argument as MUST_NOT_MODIFY, then propagate that
- // through functions like bytes.Split
-
- for _, ssafn := range j.Program.InitialFunctions {
- sig := ssafn.Signature
- if ssafn.Name() != "Write" || sig.Recv() == nil || sig.Params().Len() != 1 || sig.Results().Len() != 2 {
- continue
- }
- tArg, ok := sig.Params().At(0).Type().(*types.Slice)
- if !ok {
- continue
- }
- if basic, ok := tArg.Elem().(*types.Basic); !ok || basic.Kind() != types.Byte {
- continue
- }
- if basic, ok := sig.Results().At(0).Type().(*types.Basic); !ok || basic.Kind() != types.Int {
- continue
- }
- if named, ok := sig.Results().At(1).Type().(*types.Named); !ok || types.TypeString(named, nil) != "error" {
- continue
- }
-
- for _, block := range ssafn.Blocks {
- for _, ins := range block.Instrs {
- switch ins := ins.(type) {
- case *ssa.Store:
- addr, ok := ins.Addr.(*ssa.IndexAddr)
- if !ok {
- continue
- }
- if addr.X != ssafn.Params[1] {
- continue
- }
- j.Errorf(ins, "io.Writer.Write must not modify the provided buffer, not even temporarily")
- case *ssa.Call:
- if !lint.IsCallTo(ins.Common(), "append") {
- continue
- }
- if ins.Common().Args[0] != ssafn.Params[1] {
- continue
- }
- j.Errorf(ins, "io.Writer.Write must not modify the provided buffer, not even temporarily")
- }
- }
- }
- }
-}
-
-func loopedRegexp(name string) CallCheck {
- return func(call *Call) {
- if len(extractConsts(call.Args[0].Value.Value)) == 0 {
- return
- }
- if !call.Checker.isInLoop(call.Instr.Block()) {
- return
- }
- call.Invalid(fmt.Sprintf("calling %s in a loop has poor performance, consider using regexp.Compile", name))
- }
-}
-
-func (c *Checker) CheckEmptyBranch(j *lint.Job) {
- fn := func(node ast.Node) bool {
- ifstmt, ok := node.(*ast.IfStmt)
- if !ok {
- return true
- }
- ssafn := c.nodeFns[node]
- if lint.IsExample(ssafn) {
- return true
- }
- if ifstmt.Else != nil {
- b, ok := ifstmt.Else.(*ast.BlockStmt)
- if !ok || len(b.List) != 0 {
- return true
- }
- j.Errorf(ifstmt.Else, "empty branch")
- }
- if len(ifstmt.Body.List) != 0 {
- return true
- }
- j.Errorf(ifstmt, "empty branch")
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func (c *Checker) CheckMapBytesKey(j *lint.Job) {
- for _, fn := range j.Program.InitialFunctions {
- for _, b := range fn.Blocks {
- insLoop:
- for _, ins := range b.Instrs {
- // find []byte -> string conversions
- conv, ok := ins.(*ssa.Convert)
- if !ok || conv.Type() != types.Universe.Lookup("string").Type() {
- continue
- }
- if s, ok := conv.X.Type().(*types.Slice); !ok || s.Elem() != types.Universe.Lookup("byte").Type() {
- continue
- }
- refs := conv.Referrers()
- // need at least two (DebugRef) references: the
- // conversion and the *ast.Ident
- if refs == nil || len(*refs) < 2 {
- continue
- }
- ident := false
- // skip first reference, that's the conversion itself
- for _, ref := range (*refs)[1:] {
- switch ref := ref.(type) {
- case *ssa.DebugRef:
- if _, ok := ref.Expr.(*ast.Ident); !ok {
- // the string seems to be used somewhere
- // unexpected; the default branch should
- // catch this already, but be safe
- continue insLoop
- } else {
- ident = true
- }
- case *ssa.Lookup:
- default:
- // the string is used somewhere else than a
- // map lookup
- continue insLoop
- }
- }
-
- // the result of the conversion wasn't assigned to an
- // identifier
- if !ident {
- continue
- }
- j.Errorf(conv, "m[string(key)] would be more efficient than k := string(key); m[k]")
- }
- }
- }
-}
-
-func (c *Checker) CheckRangeStringRunes(j *lint.Job) {
- sharedcheck.CheckRangeStringRunes(c.nodeFns, j)
-}
-
-func (c *Checker) CheckSelfAssignment(j *lint.Job) {
- fn := func(node ast.Node) bool {
- assign, ok := node.(*ast.AssignStmt)
- if !ok {
- return true
- }
- if assign.Tok != token.ASSIGN || len(assign.Lhs) != len(assign.Rhs) {
- return true
- }
- for i, stmt := range assign.Lhs {
- rlh := j.Render(stmt)
- rrh := j.Render(assign.Rhs[i])
- if rlh == rrh {
- j.Errorf(assign, "self-assignment of %s to %s", rrh, rlh)
- }
- }
- return true
- }
- for _, f := range c.filterGenerated(j.Program.Files) {
- ast.Inspect(f, fn)
- }
-}
-
-func buildTagsIdentical(s1, s2 []string) bool {
- if len(s1) != len(s2) {
- return false
- }
- s1s := make([]string, len(s1))
- copy(s1s, s1)
- sort.Strings(s1s)
- s2s := make([]string, len(s2))
- copy(s2s, s2)
- sort.Strings(s2s)
- for i, s := range s1s {
- if s != s2s[i] {
- return false
- }
- }
- return true
-}
-
-func (c *Checker) CheckDuplicateBuildConstraints(job *lint.Job) {
- for _, f := range c.filterGenerated(job.Program.Files) {
- constraints := buildTags(f)
- for i, constraint1 := range constraints {
- for j, constraint2 := range constraints {
- if i >= j {
- continue
- }
- if buildTagsIdentical(constraint1, constraint2) {
- job.Errorf(f, "identical build constraints %q and %q",
- strings.Join(constraint1, " "),
- strings.Join(constraint2, " "))
- }
- }
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/rules.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/rules.go
deleted file mode 100644
index 60cc00c21..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/rules.go
+++ /dev/null
@@ -1,321 +0,0 @@
-package staticcheck
-
-import (
- "fmt"
- "go/constant"
- "go/types"
- "net"
- "net/url"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "time"
- "unicode/utf8"
-
- "honnef.co/go/tools/lint"
- "honnef.co/go/tools/ssa"
- "honnef.co/go/tools/staticcheck/vrp"
-)
-
-const (
- MsgInvalidHostPort = "invalid port or service name in host:port pair"
- MsgInvalidUTF8 = "argument is not a valid UTF-8 encoded string"
- MsgNonUniqueCutset = "cutset contains duplicate characters"
-)
-
-type Call struct {
- Job *lint.Job
- Instr ssa.CallInstruction
- Args []*Argument
-
- Checker *Checker
- Parent *ssa.Function
-
- invalids []string
-}
-
-func (c *Call) Invalid(msg string) {
- c.invalids = append(c.invalids, msg)
-}
-
-type Argument struct {
- Value Value
- invalids []string
-}
-
-func (arg *Argument) Invalid(msg string) {
- arg.invalids = append(arg.invalids, msg)
-}
-
-type Value struct {
- Value ssa.Value
- Range vrp.Range
-}
-
-type CallCheck func(call *Call)
-
-func extractConsts(v ssa.Value) []*ssa.Const {
- switch v := v.(type) {
- case *ssa.Const:
- return []*ssa.Const{v}
- case *ssa.MakeInterface:
- return extractConsts(v.X)
- default:
- return nil
- }
-}
-
-func ValidateRegexp(v Value) error {
- for _, c := range extractConsts(v.Value) {
- if c.Value == nil {
- continue
- }
- if c.Value.Kind() != constant.String {
- continue
- }
- s := constant.StringVal(c.Value)
- if _, err := regexp.Compile(s); err != nil {
- return err
- }
- }
- return nil
-}
-
-func ValidateTimeLayout(v Value) error {
- for _, c := range extractConsts(v.Value) {
- if c.Value == nil {
- continue
- }
- if c.Value.Kind() != constant.String {
- continue
- }
- s := constant.StringVal(c.Value)
- s = strings.Replace(s, "_", " ", -1)
- s = strings.Replace(s, "Z", "-", -1)
- _, err := time.Parse(s, s)
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-func ValidateURL(v Value) error {
- for _, c := range extractConsts(v.Value) {
- if c.Value == nil {
- continue
- }
- if c.Value.Kind() != constant.String {
- continue
- }
- s := constant.StringVal(c.Value)
- _, err := url.Parse(s)
- if err != nil {
- return fmt.Errorf("%q is not a valid URL: %s", s, err)
- }
- }
- return nil
-}
-
-func IntValue(v Value, z vrp.Z) bool {
- r, ok := v.Range.(vrp.IntInterval)
- if !ok || !r.IsKnown() {
- return false
- }
- if r.Lower != r.Upper {
- return false
- }
- if r.Lower.Cmp(z) == 0 {
- return true
- }
- return false
-}
-
-func InvalidUTF8(v Value) bool {
- for _, c := range extractConsts(v.Value) {
- if c.Value == nil {
- continue
- }
- if c.Value.Kind() != constant.String {
- continue
- }
- s := constant.StringVal(c.Value)
- if !utf8.ValidString(s) {
- return true
- }
- }
- return false
-}
-
-func UnbufferedChannel(v Value) bool {
- r, ok := v.Range.(vrp.ChannelInterval)
- if !ok || !r.IsKnown() {
- return false
- }
- if r.Size.Lower.Cmp(vrp.NewZ(0)) == 0 &&
- r.Size.Upper.Cmp(vrp.NewZ(0)) == 0 {
- return true
- }
- return false
-}
-
-func Pointer(v Value) bool {
- switch v.Value.Type().Underlying().(type) {
- case *types.Pointer, *types.Interface:
- return true
- }
- return false
-}
-
-func ConvertedFromInt(v Value) bool {
- conv, ok := v.Value.(*ssa.Convert)
- if !ok {
- return false
- }
- b, ok := conv.X.Type().Underlying().(*types.Basic)
- if !ok {
- return false
- }
- if (b.Info() & types.IsInteger) == 0 {
- return false
- }
- return true
-}
-
-func validEncodingBinaryType(j *lint.Job, typ types.Type) bool {
- typ = typ.Underlying()
- switch typ := typ.(type) {
- case *types.Basic:
- switch typ.Kind() {
- case types.Uint8, types.Uint16, types.Uint32, types.Uint64,
- types.Int8, types.Int16, types.Int32, types.Int64,
- types.Float32, types.Float64, types.Complex64, types.Complex128, types.Invalid:
- return true
- case types.Bool:
- return j.IsGoVersion(8)
- }
- return false
- case *types.Struct:
- n := typ.NumFields()
- for i := 0; i < n; i++ {
- if !validEncodingBinaryType(j, typ.Field(i).Type()) {
- return false
- }
- }
- return true
- case *types.Array:
- return validEncodingBinaryType(j, typ.Elem())
- case *types.Interface:
- // we can't determine if it's a valid type or not
- return true
- }
- return false
-}
-
-func CanBinaryMarshal(j *lint.Job, v Value) bool {
- typ := v.Value.Type().Underlying()
- if ttyp, ok := typ.(*types.Pointer); ok {
- typ = ttyp.Elem().Underlying()
- }
- if ttyp, ok := typ.(interface {
- Elem() types.Type
- }); ok {
- if _, ok := ttyp.(*types.Pointer); !ok {
- typ = ttyp.Elem()
- }
- }
-
- return validEncodingBinaryType(j, typ)
-}
-
-func RepeatZeroTimes(name string, arg int) CallCheck {
- return func(call *Call) {
- arg := call.Args[arg]
- if IntValue(arg.Value, vrp.NewZ(0)) {
- arg.Invalid(fmt.Sprintf("calling %s with n == 0 will return no results, did you mean -1?", name))
- }
- }
-}
-
-func validateServiceName(s string) bool {
- if len(s) < 1 || len(s) > 15 {
- return false
- }
- if s[0] == '-' || s[len(s)-1] == '-' {
- return false
- }
- if strings.Contains(s, "--") {
- return false
- }
- hasLetter := false
- for _, r := range s {
- if (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') {
- hasLetter = true
- continue
- }
- if r >= '0' && r <= '9' {
- continue
- }
- return false
- }
- return hasLetter
-}
-
-func validatePort(s string) bool {
- n, err := strconv.ParseInt(s, 10, 64)
- if err != nil {
- return validateServiceName(s)
- }
- return n >= 0 && n <= 65535
-}
-
-func ValidHostPort(v Value) bool {
- for _, k := range extractConsts(v.Value) {
- if k.Value == nil {
- continue
- }
- if k.Value.Kind() != constant.String {
- continue
- }
- s := constant.StringVal(k.Value)
- _, port, err := net.SplitHostPort(s)
- if err != nil {
- return false
- }
- // TODO(dh): check hostname
- if !validatePort(port) {
- return false
- }
- }
- return true
-}
-
-// ConvertedFrom reports whether value v was converted from type typ.
-func ConvertedFrom(v Value, typ string) bool {
- change, ok := v.Value.(*ssa.ChangeType)
- return ok && types.TypeString(change.X.Type(), nil) == typ
-}
-
-func UniqueStringCutset(v Value) bool {
- for _, c := range extractConsts(v.Value) {
- if c.Value == nil {
- continue
- }
- if c.Value.Kind() != constant.String {
- continue
- }
- s := constant.StringVal(c.Value)
- rs := runeSlice(s)
- if len(rs) < 2 {
- continue
- }
- sort.Sort(rs)
- for i, r := range rs[1:] {
- if rs[i] == r {
- return false
- }
- }
- }
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/channel.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/channel.go
deleted file mode 100644
index c8fbacba2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/channel.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package vrp
-
-import (
- "fmt"
-
- "honnef.co/go/tools/ssa"
-)
-
-type ChannelInterval struct {
- Size IntInterval
-}
-
-func (c ChannelInterval) Union(other Range) Range {
- i, ok := other.(ChannelInterval)
- if !ok {
- i = ChannelInterval{EmptyIntInterval}
- }
- if c.Size.Empty() || !c.Size.IsKnown() {
- return i
- }
- if i.Size.Empty() || !i.Size.IsKnown() {
- return c
- }
- return ChannelInterval{
- Size: c.Size.Union(i.Size).(IntInterval),
- }
-}
-
-func (c ChannelInterval) String() string {
- return c.Size.String()
-}
-
-func (c ChannelInterval) IsKnown() bool {
- return c.Size.IsKnown()
-}
-
-type MakeChannelConstraint struct {
- aConstraint
- Buffer ssa.Value
-}
-type ChannelChangeTypeConstraint struct {
- aConstraint
- X ssa.Value
-}
-
-func NewMakeChannelConstraint(buffer, y ssa.Value) Constraint {
- return &MakeChannelConstraint{NewConstraint(y), buffer}
-}
-func NewChannelChangeTypeConstraint(x, y ssa.Value) Constraint {
- return &ChannelChangeTypeConstraint{NewConstraint(y), x}
-}
-
-func (c *MakeChannelConstraint) Operands() []ssa.Value { return []ssa.Value{c.Buffer} }
-func (c *ChannelChangeTypeConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
-
-func (c *MakeChannelConstraint) String() string {
- return fmt.Sprintf("%s = make(chan, %s)", c.Y().Name, c.Buffer.Name())
-}
-func (c *ChannelChangeTypeConstraint) String() string {
- return fmt.Sprintf("%s = changetype(%s)", c.Y().Name, c.X.Name())
-}
-
-func (c *MakeChannelConstraint) Eval(g *Graph) Range {
- i, ok := g.Range(c.Buffer).(IntInterval)
- if !ok {
- return ChannelInterval{NewIntInterval(NewZ(0), PInfinity)}
- }
- if i.Lower.Sign() == -1 {
- i.Lower = NewZ(0)
- }
- return ChannelInterval{i}
-}
-func (c *ChannelChangeTypeConstraint) Eval(g *Graph) Range { return g.Range(c.X) }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/int.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/int.go
deleted file mode 100644
index 926bb7af3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/int.go
+++ /dev/null
@@ -1,476 +0,0 @@
-package vrp
-
-import (
- "fmt"
- "go/token"
- "go/types"
- "math/big"
-
- "honnef.co/go/tools/ssa"
-)
-
-type Zs []Z
-
-func (zs Zs) Len() int {
- return len(zs)
-}
-
-func (zs Zs) Less(i int, j int) bool {
- return zs[i].Cmp(zs[j]) == -1
-}
-
-func (zs Zs) Swap(i int, j int) {
- zs[i], zs[j] = zs[j], zs[i]
-}
-
-type Z struct {
- infinity int8
- integer *big.Int
-}
-
-func NewZ(n int64) Z {
- return NewBigZ(big.NewInt(n))
-}
-
-func NewBigZ(n *big.Int) Z {
- return Z{integer: n}
-}
-
-func (z1 Z) Infinite() bool {
- return z1.infinity != 0
-}
-
-func (z1 Z) Add(z2 Z) Z {
- if z2.Sign() == -1 {
- return z1.Sub(z2.Negate())
- }
- if z1 == NInfinity {
- return NInfinity
- }
- if z1 == PInfinity {
- return PInfinity
- }
- if z2 == PInfinity {
- return PInfinity
- }
-
- if !z1.Infinite() && !z2.Infinite() {
- n := &big.Int{}
- n.Add(z1.integer, z2.integer)
- return NewBigZ(n)
- }
-
- panic(fmt.Sprintf("%s + %s is not defined", z1, z2))
-}
-
-func (z1 Z) Sub(z2 Z) Z {
- if z2.Sign() == -1 {
- return z1.Add(z2.Negate())
- }
- if !z1.Infinite() && !z2.Infinite() {
- n := &big.Int{}
- n.Sub(z1.integer, z2.integer)
- return NewBigZ(n)
- }
-
- if z1 != PInfinity && z2 == PInfinity {
- return NInfinity
- }
- if z1.Infinite() && !z2.Infinite() {
- return Z{infinity: z1.infinity}
- }
- if z1 == PInfinity && z2 == PInfinity {
- return PInfinity
- }
- panic(fmt.Sprintf("%s - %s is not defined", z1, z2))
-}
-
-func (z1 Z) Mul(z2 Z) Z {
- if (z1.integer != nil && z1.integer.Sign() == 0) ||
- (z2.integer != nil && z2.integer.Sign() == 0) {
- return NewBigZ(&big.Int{})
- }
-
- if z1.infinity != 0 || z2.infinity != 0 {
- return Z{infinity: int8(z1.Sign() * z2.Sign())}
- }
-
- n := &big.Int{}
- n.Mul(z1.integer, z2.integer)
- return NewBigZ(n)
-}
-
-func (z1 Z) Negate() Z {
- if z1.infinity == 1 {
- return NInfinity
- }
- if z1.infinity == -1 {
- return PInfinity
- }
- n := &big.Int{}
- n.Neg(z1.integer)
- return NewBigZ(n)
-}
-
-func (z1 Z) Sign() int {
- if z1.infinity != 0 {
- return int(z1.infinity)
- }
- return z1.integer.Sign()
-}
-
-func (z1 Z) String() string {
- if z1 == NInfinity {
- return "-∞"
- }
- if z1 == PInfinity {
- return "∞"
- }
- return fmt.Sprintf("%d", z1.integer)
-}
-
-func (z1 Z) Cmp(z2 Z) int {
- if z1.infinity == z2.infinity && z1.infinity != 0 {
- return 0
- }
- if z1 == PInfinity {
- return 1
- }
- if z1 == NInfinity {
- return -1
- }
- if z2 == NInfinity {
- return 1
- }
- if z2 == PInfinity {
- return -1
- }
- return z1.integer.Cmp(z2.integer)
-}
-
-func MaxZ(zs ...Z) Z {
- if len(zs) == 0 {
- panic("Max called with no arguments")
- }
- if len(zs) == 1 {
- return zs[0]
- }
- ret := zs[0]
- for _, z := range zs[1:] {
- if z.Cmp(ret) == 1 {
- ret = z
- }
- }
- return ret
-}
-
-func MinZ(zs ...Z) Z {
- if len(zs) == 0 {
- panic("Min called with no arguments")
- }
- if len(zs) == 1 {
- return zs[0]
- }
- ret := zs[0]
- for _, z := range zs[1:] {
- if z.Cmp(ret) == -1 {
- ret = z
- }
- }
- return ret
-}
-
-var NInfinity = Z{infinity: -1}
-var PInfinity = Z{infinity: 1}
-var EmptyIntInterval = IntInterval{true, PInfinity, NInfinity}
-
-func InfinityFor(v ssa.Value) IntInterval {
- if b, ok := v.Type().Underlying().(*types.Basic); ok {
- if (b.Info() & types.IsUnsigned) != 0 {
- return NewIntInterval(NewZ(0), PInfinity)
- }
- }
- return NewIntInterval(NInfinity, PInfinity)
-}
-
-type IntInterval struct {
- known bool
- Lower Z
- Upper Z
-}
-
-func NewIntInterval(l, u Z) IntInterval {
- if u.Cmp(l) == -1 {
- return EmptyIntInterval
- }
- return IntInterval{known: true, Lower: l, Upper: u}
-}
-
-func (i IntInterval) IsKnown() bool {
- return i.known
-}
-
-func (i IntInterval) Empty() bool {
- return i.Lower == PInfinity && i.Upper == NInfinity
-}
-
-func (i IntInterval) IsMaxRange() bool {
- return i.Lower == NInfinity && i.Upper == PInfinity
-}
-
-func (i1 IntInterval) Intersection(i2 IntInterval) IntInterval {
- if !i1.IsKnown() {
- return i2
- }
- if !i2.IsKnown() {
- return i1
- }
- if i1.Empty() || i2.Empty() {
- return EmptyIntInterval
- }
- i3 := NewIntInterval(MaxZ(i1.Lower, i2.Lower), MinZ(i1.Upper, i2.Upper))
- if i3.Lower.Cmp(i3.Upper) == 1 {
- return EmptyIntInterval
- }
- return i3
-}
-
-func (i1 IntInterval) Union(other Range) Range {
- i2, ok := other.(IntInterval)
- if !ok {
- i2 = EmptyIntInterval
- }
- if i1.Empty() || !i1.IsKnown() {
- return i2
- }
- if i2.Empty() || !i2.IsKnown() {
- return i1
- }
- return NewIntInterval(MinZ(i1.Lower, i2.Lower), MaxZ(i1.Upper, i2.Upper))
-}
-
-func (i1 IntInterval) Add(i2 IntInterval) IntInterval {
- if i1.Empty() || i2.Empty() {
- return EmptyIntInterval
- }
- l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper
- return NewIntInterval(l1.Add(l2), u1.Add(u2))
-}
-
-func (i1 IntInterval) Sub(i2 IntInterval) IntInterval {
- if i1.Empty() || i2.Empty() {
- return EmptyIntInterval
- }
- l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper
- return NewIntInterval(l1.Sub(u2), u1.Sub(l2))
-}
-
-func (i1 IntInterval) Mul(i2 IntInterval) IntInterval {
- if i1.Empty() || i2.Empty() {
- return EmptyIntInterval
- }
- x1, x2 := i1.Lower, i1.Upper
- y1, y2 := i2.Lower, i2.Upper
- return NewIntInterval(
- MinZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)),
- MaxZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)),
- )
-}
-
-func (i1 IntInterval) String() string {
- if !i1.IsKnown() {
- return "[⊥, ⊥]"
- }
- if i1.Empty() {
- return "{}"
- }
- return fmt.Sprintf("[%s, %s]", i1.Lower, i1.Upper)
-}
-
-type IntArithmeticConstraint struct {
- aConstraint
- A ssa.Value
- B ssa.Value
- Op token.Token
- Fn func(IntInterval, IntInterval) IntInterval
-}
-
-type IntAddConstraint struct{ *IntArithmeticConstraint }
-type IntSubConstraint struct{ *IntArithmeticConstraint }
-type IntMulConstraint struct{ *IntArithmeticConstraint }
-
-type IntConversionConstraint struct {
- aConstraint
- X ssa.Value
-}
-
-type IntIntersectionConstraint struct {
- aConstraint
- ranges Ranges
- A ssa.Value
- B ssa.Value
- Op token.Token
- I IntInterval
- resolved bool
-}
-
-type IntIntervalConstraint struct {
- aConstraint
- I IntInterval
-}
-
-func NewIntArithmeticConstraint(a, b, y ssa.Value, op token.Token, fn func(IntInterval, IntInterval) IntInterval) *IntArithmeticConstraint {
- return &IntArithmeticConstraint{NewConstraint(y), a, b, op, fn}
-}
-func NewIntAddConstraint(a, b, y ssa.Value) Constraint {
- return &IntAddConstraint{NewIntArithmeticConstraint(a, b, y, token.ADD, IntInterval.Add)}
-}
-func NewIntSubConstraint(a, b, y ssa.Value) Constraint {
- return &IntSubConstraint{NewIntArithmeticConstraint(a, b, y, token.SUB, IntInterval.Sub)}
-}
-func NewIntMulConstraint(a, b, y ssa.Value) Constraint {
- return &IntMulConstraint{NewIntArithmeticConstraint(a, b, y, token.MUL, IntInterval.Mul)}
-}
-func NewIntConversionConstraint(x, y ssa.Value) Constraint {
- return &IntConversionConstraint{NewConstraint(y), x}
-}
-func NewIntIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint {
- return &IntIntersectionConstraint{
- aConstraint: NewConstraint(y),
- ranges: ranges,
- A: a,
- B: b,
- Op: op,
- }
-}
-func NewIntIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
- return &IntIntervalConstraint{NewConstraint(y), i}
-}
-
-func (c *IntArithmeticConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} }
-func (c *IntConversionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
-func (c *IntIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} }
-func (s *IntIntervalConstraint) Operands() []ssa.Value { return nil }
-
-func (c *IntArithmeticConstraint) String() string {
- return fmt.Sprintf("%s = %s %s %s", c.Y().Name(), c.A.Name(), c.Op, c.B.Name())
-}
-func (c *IntConversionConstraint) String() string {
- return fmt.Sprintf("%s = %s(%s)", c.Y().Name(), c.Y().Type(), c.X.Name())
-}
-func (c *IntIntersectionConstraint) String() string {
- return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch)
-}
-func (c *IntIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
-
-func (c *IntArithmeticConstraint) Eval(g *Graph) Range {
- i1, i2 := g.Range(c.A).(IntInterval), g.Range(c.B).(IntInterval)
- if !i1.IsKnown() || !i2.IsKnown() {
- return IntInterval{}
- }
- return c.Fn(i1, i2)
-}
-func (c *IntConversionConstraint) Eval(g *Graph) Range {
- s := &types.StdSizes{
- // XXX is it okay to assume the largest word size, or do we
- // need to be platform specific?
- WordSize: 8,
- MaxAlign: 1,
- }
- fromI := g.Range(c.X).(IntInterval)
- toI := g.Range(c.Y()).(IntInterval)
- fromT := c.X.Type().Underlying().(*types.Basic)
- toT := c.Y().Type().Underlying().(*types.Basic)
- fromB := s.Sizeof(c.X.Type())
- toB := s.Sizeof(c.Y().Type())
-
- if !fromI.IsKnown() {
- return toI
- }
- if !toI.IsKnown() {
- return fromI
- }
-
- // uint -> sint/uint, M > N: [max(0, l1), min(2**N-1, u2)]
- if (fromT.Info()&types.IsUnsigned != 0) &&
- toB > fromB {
-
- n := big.NewInt(1)
- n.Lsh(n, uint(fromB*8))
- n.Sub(n, big.NewInt(1))
- return NewIntInterval(
- MaxZ(NewZ(0), fromI.Lower),
- MinZ(NewBigZ(n), toI.Upper),
- )
- }
-
- // sint -> sint, M > N; [max(-∞, l1), min(2**N-1, u2)]
- if (fromT.Info()&types.IsUnsigned == 0) &&
- (toT.Info()&types.IsUnsigned == 0) &&
- toB > fromB {
-
- n := big.NewInt(1)
- n.Lsh(n, uint(fromB*8))
- n.Sub(n, big.NewInt(1))
- return NewIntInterval(
- MaxZ(NInfinity, fromI.Lower),
- MinZ(NewBigZ(n), toI.Upper),
- )
- }
-
- return fromI
-}
-func (c *IntIntersectionConstraint) Eval(g *Graph) Range {
- xi := g.Range(c.A).(IntInterval)
- if !xi.IsKnown() {
- return c.I
- }
- return xi.Intersection(c.I)
-}
-func (c *IntIntervalConstraint) Eval(*Graph) Range { return c.I }
-
-func (c *IntIntersectionConstraint) Futures() []ssa.Value {
- return []ssa.Value{c.B}
-}
-
-func (c *IntIntersectionConstraint) Resolve() {
- r, ok := c.ranges[c.B].(IntInterval)
- if !ok {
- c.I = InfinityFor(c.Y())
- return
- }
-
- switch c.Op {
- case token.EQL:
- c.I = r
- case token.GTR:
- c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity)
- case token.GEQ:
- c.I = NewIntInterval(r.Lower, PInfinity)
- case token.LSS:
- // TODO(dh): do we need 0 instead of NInfinity for uints?
- c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1)))
- case token.LEQ:
- c.I = NewIntInterval(NInfinity, r.Upper)
- case token.NEQ:
- c.I = InfinityFor(c.Y())
- default:
- panic("unsupported op " + c.Op.String())
- }
-}
-
-func (c *IntIntersectionConstraint) IsKnown() bool {
- return c.I.IsKnown()
-}
-
-func (c *IntIntersectionConstraint) MarkUnresolved() {
- c.resolved = false
-}
-
-func (c *IntIntersectionConstraint) MarkResolved() {
- c.resolved = true
-}
-
-func (c *IntIntersectionConstraint) IsResolved() bool {
- return c.resolved
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/slice.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/slice.go
deleted file mode 100644
index 40658dd8d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/slice.go
+++ /dev/null
@@ -1,273 +0,0 @@
-package vrp
-
-// TODO(dh): most of the constraints have implementations identical to
-// that of strings. Consider reusing them.
-
-import (
- "fmt"
- "go/types"
-
- "honnef.co/go/tools/ssa"
-)
-
-type SliceInterval struct {
- Length IntInterval
-}
-
-func (s SliceInterval) Union(other Range) Range {
- i, ok := other.(SliceInterval)
- if !ok {
- i = SliceInterval{EmptyIntInterval}
- }
- if s.Length.Empty() || !s.Length.IsKnown() {
- return i
- }
- if i.Length.Empty() || !i.Length.IsKnown() {
- return s
- }
- return SliceInterval{
- Length: s.Length.Union(i.Length).(IntInterval),
- }
-}
-func (s SliceInterval) String() string { return s.Length.String() }
-func (s SliceInterval) IsKnown() bool { return s.Length.IsKnown() }
-
-type SliceAppendConstraint struct {
- aConstraint
- A ssa.Value
- B ssa.Value
-}
-
-type SliceSliceConstraint struct {
- aConstraint
- X ssa.Value
- Lower ssa.Value
- Upper ssa.Value
-}
-
-type ArraySliceConstraint struct {
- aConstraint
- X ssa.Value
- Lower ssa.Value
- Upper ssa.Value
-}
-
-type SliceIntersectionConstraint struct {
- aConstraint
- X ssa.Value
- I IntInterval
-}
-
-type SliceLengthConstraint struct {
- aConstraint
- X ssa.Value
-}
-
-type MakeSliceConstraint struct {
- aConstraint
- Size ssa.Value
-}
-
-type SliceIntervalConstraint struct {
- aConstraint
- I IntInterval
-}
-
-func NewSliceAppendConstraint(a, b, y ssa.Value) Constraint {
- return &SliceAppendConstraint{NewConstraint(y), a, b}
-}
-func NewSliceSliceConstraint(x, lower, upper, y ssa.Value) Constraint {
- return &SliceSliceConstraint{NewConstraint(y), x, lower, upper}
-}
-func NewArraySliceConstraint(x, lower, upper, y ssa.Value) Constraint {
- return &ArraySliceConstraint{NewConstraint(y), x, lower, upper}
-}
-func NewSliceIntersectionConstraint(x ssa.Value, i IntInterval, y ssa.Value) Constraint {
- return &SliceIntersectionConstraint{NewConstraint(y), x, i}
-}
-func NewSliceLengthConstraint(x, y ssa.Value) Constraint {
- return &SliceLengthConstraint{NewConstraint(y), x}
-}
-func NewMakeSliceConstraint(size, y ssa.Value) Constraint {
- return &MakeSliceConstraint{NewConstraint(y), size}
-}
-func NewSliceIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
- return &SliceIntervalConstraint{NewConstraint(y), i}
-}
-
-func (c *SliceAppendConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} }
-func (c *SliceSliceConstraint) Operands() []ssa.Value {
- ops := []ssa.Value{c.X}
- if c.Lower != nil {
- ops = append(ops, c.Lower)
- }
- if c.Upper != nil {
- ops = append(ops, c.Upper)
- }
- return ops
-}
-func (c *ArraySliceConstraint) Operands() []ssa.Value {
- ops := []ssa.Value{c.X}
- if c.Lower != nil {
- ops = append(ops, c.Lower)
- }
- if c.Upper != nil {
- ops = append(ops, c.Upper)
- }
- return ops
-}
-func (c *SliceIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
-func (c *SliceLengthConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
-func (c *MakeSliceConstraint) Operands() []ssa.Value { return []ssa.Value{c.Size} }
-func (s *SliceIntervalConstraint) Operands() []ssa.Value { return nil }
-
-func (c *SliceAppendConstraint) String() string {
- return fmt.Sprintf("%s = append(%s, %s)", c.Y().Name(), c.A.Name(), c.B.Name())
-}
-func (c *SliceSliceConstraint) String() string {
- var lname, uname string
- if c.Lower != nil {
- lname = c.Lower.Name()
- }
- if c.Upper != nil {
- uname = c.Upper.Name()
- }
- return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
-}
-func (c *ArraySliceConstraint) String() string {
- var lname, uname string
- if c.Lower != nil {
- lname = c.Lower.Name()
- }
- if c.Upper != nil {
- uname = c.Upper.Name()
- }
- return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
-}
-func (c *SliceIntersectionConstraint) String() string {
- return fmt.Sprintf("%s = %s.%t ⊓ %s", c.Y().Name(), c.X.Name(), c.Y().(*ssa.Sigma).Branch, c.I)
-}
-func (c *SliceLengthConstraint) String() string {
- return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name())
-}
-func (c *MakeSliceConstraint) String() string {
- return fmt.Sprintf("%s = make(slice, %s)", c.Y().Name(), c.Size.Name())
-}
-func (c *SliceIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
-
-func (c *SliceAppendConstraint) Eval(g *Graph) Range {
- l1 := g.Range(c.A).(SliceInterval).Length
- var l2 IntInterval
- switch r := g.Range(c.B).(type) {
- case SliceInterval:
- l2 = r.Length
- case StringInterval:
- l2 = r.Length
- default:
- return SliceInterval{}
- }
- if !l1.IsKnown() || !l2.IsKnown() {
- return SliceInterval{}
- }
- return SliceInterval{
- Length: l1.Add(l2),
- }
-}
-func (c *SliceSliceConstraint) Eval(g *Graph) Range {
- lr := NewIntInterval(NewZ(0), NewZ(0))
- if c.Lower != nil {
- lr = g.Range(c.Lower).(IntInterval)
- }
- ur := g.Range(c.X).(SliceInterval).Length
- if c.Upper != nil {
- ur = g.Range(c.Upper).(IntInterval)
- }
- if !lr.IsKnown() || !ur.IsKnown() {
- return SliceInterval{}
- }
-
- ls := []Z{
- ur.Lower.Sub(lr.Lower),
- ur.Upper.Sub(lr.Lower),
- ur.Lower.Sub(lr.Upper),
- ur.Upper.Sub(lr.Upper),
- }
- // TODO(dh): if we don't truncate lengths to 0 we might be able to
- // easily detect slices with high < low. we'd need to treat -∞
- // specially, though.
- for i, l := range ls {
- if l.Sign() == -1 {
- ls[i] = NewZ(0)
- }
- }
-
- return SliceInterval{
- Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
- }
-}
-func (c *ArraySliceConstraint) Eval(g *Graph) Range {
- lr := NewIntInterval(NewZ(0), NewZ(0))
- if c.Lower != nil {
- lr = g.Range(c.Lower).(IntInterval)
- }
- var l int64
- switch typ := c.X.Type().(type) {
- case *types.Array:
- l = typ.Len()
- case *types.Pointer:
- l = typ.Elem().(*types.Array).Len()
- }
- ur := NewIntInterval(NewZ(l), NewZ(l))
- if c.Upper != nil {
- ur = g.Range(c.Upper).(IntInterval)
- }
- if !lr.IsKnown() || !ur.IsKnown() {
- return SliceInterval{}
- }
-
- ls := []Z{
- ur.Lower.Sub(lr.Lower),
- ur.Upper.Sub(lr.Lower),
- ur.Lower.Sub(lr.Upper),
- ur.Upper.Sub(lr.Upper),
- }
- // TODO(dh): if we don't truncate lengths to 0 we might be able to
- // easily detect slices with high < low. we'd need to treat -∞
- // specially, though.
- for i, l := range ls {
- if l.Sign() == -1 {
- ls[i] = NewZ(0)
- }
- }
-
- return SliceInterval{
- Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
- }
-}
-func (c *SliceIntersectionConstraint) Eval(g *Graph) Range {
- xi := g.Range(c.X).(SliceInterval)
- if !xi.IsKnown() {
- return c.I
- }
- return SliceInterval{
- Length: xi.Length.Intersection(c.I),
- }
-}
-func (c *SliceLengthConstraint) Eval(g *Graph) Range {
- i := g.Range(c.X).(SliceInterval).Length
- if !i.IsKnown() {
- return NewIntInterval(NewZ(0), PInfinity)
- }
- return i
-}
-func (c *MakeSliceConstraint) Eval(g *Graph) Range {
- i, ok := g.Range(c.Size).(IntInterval)
- if !ok {
- return SliceInterval{NewIntInterval(NewZ(0), PInfinity)}
- }
- if i.Lower.Sign() == -1 {
- i.Lower = NewZ(0)
- }
- return SliceInterval{i}
-}
-func (c *SliceIntervalConstraint) Eval(*Graph) Range { return SliceInterval{c.I} }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/string.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/string.go
deleted file mode 100644
index e05877f9f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/string.go
+++ /dev/null
@@ -1,258 +0,0 @@
-package vrp
-
-import (
- "fmt"
- "go/token"
- "go/types"
-
- "honnef.co/go/tools/ssa"
-)
-
-type StringInterval struct {
- Length IntInterval
-}
-
-func (s StringInterval) Union(other Range) Range {
- i, ok := other.(StringInterval)
- if !ok {
- i = StringInterval{EmptyIntInterval}
- }
- if s.Length.Empty() || !s.Length.IsKnown() {
- return i
- }
- if i.Length.Empty() || !i.Length.IsKnown() {
- return s
- }
- return StringInterval{
- Length: s.Length.Union(i.Length).(IntInterval),
- }
-}
-
-func (s StringInterval) String() string {
- return s.Length.String()
-}
-
-func (s StringInterval) IsKnown() bool {
- return s.Length.IsKnown()
-}
-
-type StringSliceConstraint struct {
- aConstraint
- X ssa.Value
- Lower ssa.Value
- Upper ssa.Value
-}
-
-type StringIntersectionConstraint struct {
- aConstraint
- ranges Ranges
- A ssa.Value
- B ssa.Value
- Op token.Token
- I IntInterval
- resolved bool
-}
-
-type StringConcatConstraint struct {
- aConstraint
- A ssa.Value
- B ssa.Value
-}
-
-type StringLengthConstraint struct {
- aConstraint
- X ssa.Value
-}
-
-type StringIntervalConstraint struct {
- aConstraint
- I IntInterval
-}
-
-func NewStringSliceConstraint(x, lower, upper, y ssa.Value) Constraint {
- return &StringSliceConstraint{NewConstraint(y), x, lower, upper}
-}
-func NewStringIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint {
- return &StringIntersectionConstraint{
- aConstraint: NewConstraint(y),
- ranges: ranges,
- A: a,
- B: b,
- Op: op,
- }
-}
-func NewStringConcatConstraint(a, b, y ssa.Value) Constraint {
- return &StringConcatConstraint{NewConstraint(y), a, b}
-}
-func NewStringLengthConstraint(x ssa.Value, y ssa.Value) Constraint {
- return &StringLengthConstraint{NewConstraint(y), x}
-}
-func NewStringIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
- return &StringIntervalConstraint{NewConstraint(y), i}
-}
-
-func (c *StringSliceConstraint) Operands() []ssa.Value {
- vs := []ssa.Value{c.X}
- if c.Lower != nil {
- vs = append(vs, c.Lower)
- }
- if c.Upper != nil {
- vs = append(vs, c.Upper)
- }
- return vs
-}
-func (c *StringIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} }
-func (c StringConcatConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} }
-func (c *StringLengthConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
-func (s *StringIntervalConstraint) Operands() []ssa.Value { return nil }
-
-func (c *StringSliceConstraint) String() string {
- var lname, uname string
- if c.Lower != nil {
- lname = c.Lower.Name()
- }
- if c.Upper != nil {
- uname = c.Upper.Name()
- }
- return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
-}
-func (c *StringIntersectionConstraint) String() string {
- return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch)
-}
-func (c StringConcatConstraint) String() string {
- return fmt.Sprintf("%s = %s + %s", c.Y().Name(), c.A.Name(), c.B.Name())
-}
-func (c *StringLengthConstraint) String() string {
- return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name())
-}
-func (c *StringIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
-
-func (c *StringSliceConstraint) Eval(g *Graph) Range {
- lr := NewIntInterval(NewZ(0), NewZ(0))
- if c.Lower != nil {
- lr = g.Range(c.Lower).(IntInterval)
- }
- ur := g.Range(c.X).(StringInterval).Length
- if c.Upper != nil {
- ur = g.Range(c.Upper).(IntInterval)
- }
- if !lr.IsKnown() || !ur.IsKnown() {
- return StringInterval{}
- }
-
- ls := []Z{
- ur.Lower.Sub(lr.Lower),
- ur.Upper.Sub(lr.Lower),
- ur.Lower.Sub(lr.Upper),
- ur.Upper.Sub(lr.Upper),
- }
- // TODO(dh): if we don't truncate lengths to 0 we might be able to
- // easily detect slices with high < low. we'd need to treat -∞
- // specially, though.
- for i, l := range ls {
- if l.Sign() == -1 {
- ls[i] = NewZ(0)
- }
- }
-
- return StringInterval{
- Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
- }
-}
-func (c *StringIntersectionConstraint) Eval(g *Graph) Range {
- var l IntInterval
- switch r := g.Range(c.A).(type) {
- case StringInterval:
- l = r.Length
- case IntInterval:
- l = r
- }
-
- if !l.IsKnown() {
- return StringInterval{c.I}
- }
- return StringInterval{
- Length: l.Intersection(c.I),
- }
-}
-func (c StringConcatConstraint) Eval(g *Graph) Range {
- i1, i2 := g.Range(c.A).(StringInterval), g.Range(c.B).(StringInterval)
- if !i1.Length.IsKnown() || !i2.Length.IsKnown() {
- return StringInterval{}
- }
- return StringInterval{
- Length: i1.Length.Add(i2.Length),
- }
-}
-func (c *StringLengthConstraint) Eval(g *Graph) Range {
- i := g.Range(c.X).(StringInterval).Length
- if !i.IsKnown() {
- return NewIntInterval(NewZ(0), PInfinity)
- }
- return i
-}
-func (c *StringIntervalConstraint) Eval(*Graph) Range { return StringInterval{c.I} }
-
-func (c *StringIntersectionConstraint) Futures() []ssa.Value {
- return []ssa.Value{c.B}
-}
-
-func (c *StringIntersectionConstraint) Resolve() {
- if (c.A.Type().Underlying().(*types.Basic).Info() & types.IsString) != 0 {
- // comparing two strings
- r, ok := c.ranges[c.B].(StringInterval)
- if !ok {
- c.I = NewIntInterval(NewZ(0), PInfinity)
- return
- }
- switch c.Op {
- case token.EQL:
- c.I = r.Length
- case token.GTR, token.GEQ:
- c.I = NewIntInterval(r.Length.Lower, PInfinity)
- case token.LSS, token.LEQ:
- c.I = NewIntInterval(NewZ(0), r.Length.Upper)
- case token.NEQ:
- default:
- panic("unsupported op " + c.Op.String())
- }
- } else {
- r, ok := c.ranges[c.B].(IntInterval)
- if !ok {
- c.I = NewIntInterval(NewZ(0), PInfinity)
- return
- }
- // comparing two lengths
- switch c.Op {
- case token.EQL:
- c.I = r
- case token.GTR:
- c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity)
- case token.GEQ:
- c.I = NewIntInterval(r.Lower, PInfinity)
- case token.LSS:
- c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1)))
- case token.LEQ:
- c.I = NewIntInterval(NInfinity, r.Upper)
- case token.NEQ:
- default:
- panic("unsupported op " + c.Op.String())
- }
- }
-}
-
-func (c *StringIntersectionConstraint) IsKnown() bool {
- return c.I.IsKnown()
-}
-
-func (c *StringIntersectionConstraint) MarkUnresolved() {
- c.resolved = false
-}
-
-func (c *StringIntersectionConstraint) MarkResolved() {
- c.resolved = true
-}
-
-func (c *StringIntersectionConstraint) IsResolved() bool {
- return c.resolved
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/vrp.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/vrp.go
deleted file mode 100644
index cb17f042a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/staticcheck/vrp/vrp.go
+++ /dev/null
@@ -1,1049 +0,0 @@
-package vrp
-
-// TODO(dh) widening and narrowing have a lot of code in common. Make
-// it reusable.
-
-import (
- "fmt"
- "go/constant"
- "go/token"
- "go/types"
- "math/big"
- "sort"
- "strings"
-
- "honnef.co/go/tools/ssa"
-)
-
-type Future interface {
- Constraint
- Futures() []ssa.Value
- Resolve()
- IsKnown() bool
- MarkUnresolved()
- MarkResolved()
- IsResolved() bool
-}
-
-type Range interface {
- Union(other Range) Range
- IsKnown() bool
-}
-
-type Constraint interface {
- Y() ssa.Value
- isConstraint()
- String() string
- Eval(*Graph) Range
- Operands() []ssa.Value
-}
-
-type aConstraint struct {
- y ssa.Value
-}
-
-func NewConstraint(y ssa.Value) aConstraint {
- return aConstraint{y}
-}
-
-func (aConstraint) isConstraint() {}
-func (c aConstraint) Y() ssa.Value { return c.y }
-
-type PhiConstraint struct {
- aConstraint
- Vars []ssa.Value
-}
-
-func NewPhiConstraint(vars []ssa.Value, y ssa.Value) Constraint {
- uniqm := map[ssa.Value]struct{}{}
- for _, v := range vars {
- uniqm[v] = struct{}{}
- }
- var uniq []ssa.Value
- for v := range uniqm {
- uniq = append(uniq, v)
- }
- return &PhiConstraint{
- aConstraint: NewConstraint(y),
- Vars: uniq,
- }
-}
-
-func (c *PhiConstraint) Operands() []ssa.Value {
- return c.Vars
-}
-
-func (c *PhiConstraint) Eval(g *Graph) Range {
- i := Range(nil)
- for _, v := range c.Vars {
- i = g.Range(v).Union(i)
- }
- return i
-}
-
-func (c *PhiConstraint) String() string {
- names := make([]string, len(c.Vars))
- for i, v := range c.Vars {
- names[i] = v.Name()
- }
- return fmt.Sprintf("%s = φ(%s)", c.Y().Name(), strings.Join(names, ", "))
-}
-
-func isSupportedType(typ types.Type) bool {
- switch typ := typ.Underlying().(type) {
- case *types.Basic:
- switch typ.Kind() {
- case types.String, types.UntypedString:
- return true
- default:
- if (typ.Info() & types.IsInteger) == 0 {
- return false
- }
- }
- case *types.Chan:
- return true
- case *types.Slice:
- return true
- default:
- return false
- }
- return true
-}
-
-func ConstantToZ(c constant.Value) Z {
- s := constant.ToInt(c).ExactString()
- n := &big.Int{}
- n.SetString(s, 10)
- return NewBigZ(n)
-}
-
-func sigmaInteger(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
- op := cond.Op
- if !ins.Branch {
- op = (invertToken(op))
- }
-
- switch op {
- case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ:
- default:
- return nil
- }
- var a, b ssa.Value
- if (*ops[0]) == ins.X {
- a = *ops[0]
- b = *ops[1]
- } else {
- a = *ops[1]
- b = *ops[0]
- op = flipToken(op)
- }
- return NewIntIntersectionConstraint(a, b, op, g.ranges, ins)
-}
-
-func sigmaString(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
- op := cond.Op
- if !ins.Branch {
- op = (invertToken(op))
- }
-
- switch op {
- case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ:
- default:
- return nil
- }
-
- if ((*ops[0]).Type().Underlying().(*types.Basic).Info() & types.IsString) == 0 {
- var a, b ssa.Value
- call, ok := (*ops[0]).(*ssa.Call)
- if ok && call.Common().Args[0] == ins.X {
- a = *ops[0]
- b = *ops[1]
- } else {
- a = *ops[1]
- b = *ops[0]
- op = flipToken(op)
- }
- return NewStringIntersectionConstraint(a, b, op, g.ranges, ins)
- }
- var a, b ssa.Value
- if (*ops[0]) == ins.X {
- a = *ops[0]
- b = *ops[1]
- } else {
- a = *ops[1]
- b = *ops[0]
- op = flipToken(op)
- }
- return NewStringIntersectionConstraint(a, b, op, g.ranges, ins)
-}
-
-func sigmaSlice(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
- // TODO(dh) sigmaSlice and sigmaString are a lot alike. Can they
- // be merged?
- //
- // XXX support futures
-
- op := cond.Op
- if !ins.Branch {
- op = (invertToken(op))
- }
-
- k, ok := (*ops[1]).(*ssa.Const)
- // XXX investigate in what cases this wouldn't be a Const
- //
- // XXX what if left and right are swapped?
- if !ok {
- return nil
- }
-
- call, ok := (*ops[0]).(*ssa.Call)
- if !ok {
- return nil
- }
- builtin, ok := call.Common().Value.(*ssa.Builtin)
- if !ok {
- return nil
- }
- if builtin.Name() != "len" {
- return nil
- }
- callops := call.Operands(nil)
-
- v := ConstantToZ(k.Value)
- c := NewSliceIntersectionConstraint(*callops[1], IntInterval{}, ins).(*SliceIntersectionConstraint)
- switch op {
- case token.EQL:
- c.I = NewIntInterval(v, v)
- case token.GTR, token.GEQ:
- off := int64(0)
- if cond.Op == token.GTR {
- off = 1
- }
- c.I = NewIntInterval(
- v.Add(NewZ(off)),
- PInfinity,
- )
- case token.LSS, token.LEQ:
- off := int64(0)
- if cond.Op == token.LSS {
- off = -1
- }
- c.I = NewIntInterval(
- NInfinity,
- v.Add(NewZ(off)),
- )
- default:
- return nil
- }
- return c
-}
-
-func BuildGraph(f *ssa.Function) *Graph {
- g := &Graph{
- Vertices: map[interface{}]*Vertex{},
- ranges: Ranges{},
- }
-
- var cs []Constraint
-
- ops := make([]*ssa.Value, 16)
- seen := map[ssa.Value]bool{}
- for _, block := range f.Blocks {
- for _, ins := range block.Instrs {
- ops = ins.Operands(ops[:0])
- for _, op := range ops {
- if c, ok := (*op).(*ssa.Const); ok {
- if seen[c] {
- continue
- }
- seen[c] = true
- if c.Value == nil {
- switch c.Type().Underlying().(type) {
- case *types.Slice:
- cs = append(cs, NewSliceIntervalConstraint(NewIntInterval(NewZ(0), NewZ(0)), c))
- }
- continue
- }
- switch c.Value.Kind() {
- case constant.Int:
- v := ConstantToZ(c.Value)
- cs = append(cs, NewIntIntervalConstraint(NewIntInterval(v, v), c))
- case constant.String:
- s := constant.StringVal(c.Value)
- n := NewZ(int64(len(s)))
- cs = append(cs, NewStringIntervalConstraint(NewIntInterval(n, n), c))
- }
- }
- }
- }
- }
- for _, block := range f.Blocks {
- for _, ins := range block.Instrs {
- switch ins := ins.(type) {
- case *ssa.Convert:
- switch v := ins.Type().Underlying().(type) {
- case *types.Basic:
- if (v.Info() & types.IsInteger) == 0 {
- continue
- }
- cs = append(cs, NewIntConversionConstraint(ins.X, ins))
- }
- case *ssa.Call:
- if static := ins.Common().StaticCallee(); static != nil {
- if fn, ok := static.Object().(*types.Func); ok {
- switch fn.FullName() {
- case "bytes.Index", "bytes.IndexAny", "bytes.IndexByte",
- "bytes.IndexFunc", "bytes.IndexRune", "bytes.LastIndex",
- "bytes.LastIndexAny", "bytes.LastIndexByte", "bytes.LastIndexFunc",
- "strings.Index", "strings.IndexAny", "strings.IndexByte",
- "strings.IndexFunc", "strings.IndexRune", "strings.LastIndex",
- "strings.LastIndexAny", "strings.LastIndexByte", "strings.LastIndexFunc":
- // TODO(dh): instead of limiting by +∞,
- // limit by the upper bound of the passed
- // string
- cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), PInfinity), ins))
- case "bytes.Title", "bytes.ToLower", "bytes.ToTitle", "bytes.ToUpper",
- "strings.Title", "strings.ToLower", "strings.ToTitle", "strings.ToUpper":
- cs = append(cs, NewCopyConstraint(ins.Common().Args[0], ins))
- case "bytes.ToLowerSpecial", "bytes.ToTitleSpecial", "bytes.ToUpperSpecial",
- "strings.ToLowerSpecial", "strings.ToTitleSpecial", "strings.ToUpperSpecial":
- cs = append(cs, NewCopyConstraint(ins.Common().Args[1], ins))
- case "bytes.Compare", "strings.Compare":
- cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), NewZ(1)), ins))
- case "bytes.Count", "strings.Count":
- // TODO(dh): instead of limiting by +∞,
- // limit by the upper bound of the passed
- // string.
- cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins))
- case "bytes.Map", "bytes.TrimFunc", "bytes.TrimLeft", "bytes.TrimLeftFunc",
- "bytes.TrimRight", "bytes.TrimRightFunc", "bytes.TrimSpace",
- "strings.Map", "strings.TrimFunc", "strings.TrimLeft", "strings.TrimLeftFunc",
- "strings.TrimRight", "strings.TrimRightFunc", "strings.TrimSpace":
- // TODO(dh): lower = 0, upper = upper of passed string
- case "bytes.TrimPrefix", "bytes.TrimSuffix",
- "strings.TrimPrefix", "strings.TrimSuffix":
- // TODO(dh) range between "unmodified" and len(cutset) removed
- case "(*bytes.Buffer).Cap", "(*bytes.Buffer).Len", "(*bytes.Reader).Len", "(*bytes.Reader).Size":
- cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins))
- }
- }
- }
- builtin, ok := ins.Common().Value.(*ssa.Builtin)
- ops := ins.Operands(nil)
- if !ok {
- continue
- }
- switch builtin.Name() {
- case "len":
- switch op1 := (*ops[1]).Type().Underlying().(type) {
- case *types.Basic:
- if op1.Kind() == types.String || op1.Kind() == types.UntypedString {
- cs = append(cs, NewStringLengthConstraint(*ops[1], ins))
- }
- case *types.Slice:
- cs = append(cs, NewSliceLengthConstraint(*ops[1], ins))
- }
-
- case "append":
- cs = append(cs, NewSliceAppendConstraint(ins.Common().Args[0], ins.Common().Args[1], ins))
- }
- case *ssa.BinOp:
- ops := ins.Operands(nil)
- basic, ok := (*ops[0]).Type().Underlying().(*types.Basic)
- if !ok {
- continue
- }
- switch basic.Kind() {
- case types.Int, types.Int8, types.Int16, types.Int32, types.Int64,
- types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt:
- fns := map[token.Token]func(ssa.Value, ssa.Value, ssa.Value) Constraint{
- token.ADD: NewIntAddConstraint,
- token.SUB: NewIntSubConstraint,
- token.MUL: NewIntMulConstraint,
- // XXX support QUO, REM, SHL, SHR
- }
- fn, ok := fns[ins.Op]
- if ok {
- cs = append(cs, fn(*ops[0], *ops[1], ins))
- }
- case types.String, types.UntypedString:
- if ins.Op == token.ADD {
- cs = append(cs, NewStringConcatConstraint(*ops[0], *ops[1], ins))
- }
- }
- case *ssa.Slice:
- typ := ins.X.Type().Underlying()
- switch typ := typ.(type) {
- case *types.Basic:
- cs = append(cs, NewStringSliceConstraint(ins.X, ins.Low, ins.High, ins))
- case *types.Slice:
- cs = append(cs, NewSliceSliceConstraint(ins.X, ins.Low, ins.High, ins))
- case *types.Array:
- cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins))
- case *types.Pointer:
- if _, ok := typ.Elem().(*types.Array); !ok {
- continue
- }
- cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins))
- }
- case *ssa.Phi:
- if !isSupportedType(ins.Type()) {
- continue
- }
- ops := ins.Operands(nil)
- dops := make([]ssa.Value, len(ops))
- for i, op := range ops {
- dops[i] = *op
- }
- cs = append(cs, NewPhiConstraint(dops, ins))
- case *ssa.Sigma:
- pred := ins.Block().Preds[0]
- instrs := pred.Instrs
- cond, ok := instrs[len(instrs)-1].(*ssa.If).Cond.(*ssa.BinOp)
- ops := cond.Operands(nil)
- if !ok {
- continue
- }
- switch typ := ins.Type().Underlying().(type) {
- case *types.Basic:
- var c Constraint
- switch typ.Kind() {
- case types.Int, types.Int8, types.Int16, types.Int32, types.Int64,
- types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt:
- c = sigmaInteger(g, ins, cond, ops)
- case types.String, types.UntypedString:
- c = sigmaString(g, ins, cond, ops)
- }
- if c != nil {
- cs = append(cs, c)
- }
- case *types.Slice:
- c := sigmaSlice(g, ins, cond, ops)
- if c != nil {
- cs = append(cs, c)
- }
- default:
- //log.Printf("unsupported sigma type %T", typ) // XXX
- }
- case *ssa.MakeChan:
- cs = append(cs, NewMakeChannelConstraint(ins.Size, ins))
- case *ssa.MakeSlice:
- cs = append(cs, NewMakeSliceConstraint(ins.Len, ins))
- case *ssa.ChangeType:
- switch ins.X.Type().Underlying().(type) {
- case *types.Chan:
- cs = append(cs, NewChannelChangeTypeConstraint(ins.X, ins))
- }
- }
- }
- }
-
- for _, c := range cs {
- if c == nil {
- panic("nil constraint")
- }
- // If V is used in constraint C, then we create an edge V->C
- for _, op := range c.Operands() {
- g.AddEdge(op, c, false)
- }
- if c, ok := c.(Future); ok {
- for _, op := range c.Futures() {
- g.AddEdge(op, c, true)
- }
- }
- // If constraint C defines variable V, then we create an edge
- // C->V
- g.AddEdge(c, c.Y(), false)
- }
-
- g.FindSCCs()
- g.sccEdges = make([][]Edge, len(g.SCCs))
- g.futures = make([][]Future, len(g.SCCs))
- for _, e := range g.Edges {
- g.sccEdges[e.From.SCC] = append(g.sccEdges[e.From.SCC], e)
- if !e.control {
- continue
- }
- if c, ok := e.To.Value.(Future); ok {
- g.futures[e.From.SCC] = append(g.futures[e.From.SCC], c)
- }
- }
- return g
-}
-
-func (g *Graph) Solve() Ranges {
- var consts []Z
- off := NewZ(1)
- for _, n := range g.Vertices {
- if c, ok := n.Value.(*ssa.Const); ok {
- basic, ok := c.Type().Underlying().(*types.Basic)
- if !ok {
- continue
- }
- if (basic.Info() & types.IsInteger) != 0 {
- z := ConstantToZ(c.Value)
- consts = append(consts, z)
- consts = append(consts, z.Add(off))
- consts = append(consts, z.Sub(off))
- }
- }
-
- }
- sort.Sort(Zs(consts))
-
- for scc, vertices := range g.SCCs {
- n := 0
- n = len(vertices)
- if n == 1 {
- g.resolveFutures(scc)
- v := vertices[0]
- if v, ok := v.Value.(ssa.Value); ok {
- switch typ := v.Type().Underlying().(type) {
- case *types.Basic:
- switch typ.Kind() {
- case types.String, types.UntypedString:
- if !g.Range(v).(StringInterval).IsKnown() {
- g.SetRange(v, StringInterval{NewIntInterval(NewZ(0), PInfinity)})
- }
- default:
- if !g.Range(v).(IntInterval).IsKnown() {
- g.SetRange(v, InfinityFor(v))
- }
- }
- case *types.Chan:
- if !g.Range(v).(ChannelInterval).IsKnown() {
- g.SetRange(v, ChannelInterval{NewIntInterval(NewZ(0), PInfinity)})
- }
- case *types.Slice:
- if !g.Range(v).(SliceInterval).IsKnown() {
- g.SetRange(v, SliceInterval{NewIntInterval(NewZ(0), PInfinity)})
- }
- }
- }
- if c, ok := v.Value.(Constraint); ok {
- g.SetRange(c.Y(), c.Eval(g))
- }
- } else {
- uses := g.uses(scc)
- entries := g.entries(scc)
- for len(entries) > 0 {
- v := entries[len(entries)-1]
- entries = entries[:len(entries)-1]
- for _, use := range uses[v] {
- if g.widen(use, consts) {
- entries = append(entries, use.Y())
- }
- }
- }
-
- g.resolveFutures(scc)
-
- // XXX this seems to be necessary, but shouldn't be.
- // removing it leads to nil pointer derefs; investigate
- // where we're not setting values correctly.
- for _, n := range vertices {
- if v, ok := n.Value.(ssa.Value); ok {
- i, ok := g.Range(v).(IntInterval)
- if !ok {
- continue
- }
- if !i.IsKnown() {
- g.SetRange(v, InfinityFor(v))
- }
- }
- }
-
- actives := g.actives(scc)
- for len(actives) > 0 {
- v := actives[len(actives)-1]
- actives = actives[:len(actives)-1]
- for _, use := range uses[v] {
- if g.narrow(use) {
- actives = append(actives, use.Y())
- }
- }
- }
- }
- // propagate scc
- for _, edge := range g.sccEdges[scc] {
- if edge.control {
- continue
- }
- if edge.From.SCC == edge.To.SCC {
- continue
- }
- if c, ok := edge.To.Value.(Constraint); ok {
- g.SetRange(c.Y(), c.Eval(g))
- }
- if c, ok := edge.To.Value.(Future); ok {
- if !c.IsKnown() {
- c.MarkUnresolved()
- }
- }
- }
- }
-
- for v, r := range g.ranges {
- i, ok := r.(IntInterval)
- if !ok {
- continue
- }
- if (v.Type().Underlying().(*types.Basic).Info() & types.IsUnsigned) == 0 {
- if i.Upper != PInfinity {
- s := &types.StdSizes{
- // XXX is it okay to assume the largest word size, or do we
- // need to be platform specific?
- WordSize: 8,
- MaxAlign: 1,
- }
- bits := (s.Sizeof(v.Type()) * 8) - 1
- n := big.NewInt(1)
- n = n.Lsh(n, uint(bits))
- upper, lower := &big.Int{}, &big.Int{}
- upper.Sub(n, big.NewInt(1))
- lower.Neg(n)
-
- if i.Upper.Cmp(NewBigZ(upper)) == 1 {
- i = NewIntInterval(NInfinity, PInfinity)
- } else if i.Lower.Cmp(NewBigZ(lower)) == -1 {
- i = NewIntInterval(NInfinity, PInfinity)
- }
- }
- }
-
- g.ranges[v] = i
- }
-
- return g.ranges
-}
-
-func VertexString(v *Vertex) string {
- switch v := v.Value.(type) {
- case Constraint:
- return v.String()
- case ssa.Value:
- return v.Name()
- case nil:
- return "BUG: nil vertex value"
- default:
- panic(fmt.Sprintf("unexpected type %T", v))
- }
-}
-
-type Vertex struct {
- Value interface{} // one of Constraint or ssa.Value
- SCC int
- index int
- lowlink int
- stack bool
-
- Succs []Edge
-}
-
-type Ranges map[ssa.Value]Range
-
-func (r Ranges) Get(x ssa.Value) Range {
- if x == nil {
- return nil
- }
- i, ok := r[x]
- if !ok {
- switch x := x.Type().Underlying().(type) {
- case *types.Basic:
- switch x.Kind() {
- case types.String, types.UntypedString:
- return StringInterval{}
- default:
- return IntInterval{}
- }
- case *types.Chan:
- return ChannelInterval{}
- case *types.Slice:
- return SliceInterval{}
- }
- }
- return i
-}
-
-type Graph struct {
- Vertices map[interface{}]*Vertex
- Edges []Edge
- SCCs [][]*Vertex
- ranges Ranges
-
- // map SCCs to futures
- futures [][]Future
- // map SCCs to edges
- sccEdges [][]Edge
-}
-
-func (g Graph) Graphviz() string {
- var lines []string
- lines = append(lines, "digraph{")
- ids := map[interface{}]int{}
- i := 1
- for _, v := range g.Vertices {
- ids[v] = i
- shape := "box"
- if _, ok := v.Value.(ssa.Value); ok {
- shape = "oval"
- }
- lines = append(lines, fmt.Sprintf(`n%d [shape="%s", label=%q, colorscheme=spectral11, style="filled", fillcolor="%d"]`,
- i, shape, VertexString(v), (v.SCC%11)+1))
- i++
- }
- for _, e := range g.Edges {
- style := "solid"
- if e.control {
- style = "dashed"
- }
- lines = append(lines, fmt.Sprintf(`n%d -> n%d [style="%s"]`, ids[e.From], ids[e.To], style))
- }
- lines = append(lines, "}")
- return strings.Join(lines, "\n")
-}
-
-func (g *Graph) SetRange(x ssa.Value, r Range) {
- g.ranges[x] = r
-}
-
-func (g *Graph) Range(x ssa.Value) Range {
- return g.ranges.Get(x)
-}
-
-func (g *Graph) widen(c Constraint, consts []Z) bool {
- setRange := func(i Range) {
- g.SetRange(c.Y(), i)
- }
- widenIntInterval := func(oi, ni IntInterval) (IntInterval, bool) {
- if !ni.IsKnown() {
- return oi, false
- }
- nlc := NInfinity
- nuc := PInfinity
- for _, co := range consts {
- if co.Cmp(ni.Lower) <= 0 {
- nlc = co
- break
- }
- }
- for _, co := range consts {
- if co.Cmp(ni.Upper) >= 0 {
- nuc = co
- break
- }
- }
-
- if !oi.IsKnown() {
- return ni, true
- }
- if ni.Lower.Cmp(oi.Lower) == -1 && ni.Upper.Cmp(oi.Upper) == 1 {
- return NewIntInterval(nlc, nuc), true
- }
- if ni.Lower.Cmp(oi.Lower) == -1 {
- return NewIntInterval(nlc, oi.Upper), true
- }
- if ni.Upper.Cmp(oi.Upper) == 1 {
- return NewIntInterval(oi.Lower, nuc), true
- }
- return oi, false
- }
- switch oi := g.Range(c.Y()).(type) {
- case IntInterval:
- ni := c.Eval(g).(IntInterval)
- si, changed := widenIntInterval(oi, ni)
- if changed {
- setRange(si)
- return true
- }
- return false
- case StringInterval:
- ni := c.Eval(g).(StringInterval)
- si, changed := widenIntInterval(oi.Length, ni.Length)
- if changed {
- setRange(StringInterval{si})
- return true
- }
- return false
- case SliceInterval:
- ni := c.Eval(g).(SliceInterval)
- si, changed := widenIntInterval(oi.Length, ni.Length)
- if changed {
- setRange(SliceInterval{si})
- return true
- }
- return false
- default:
- return false
- }
-}
-
-func (g *Graph) narrow(c Constraint) bool {
- narrowIntInterval := func(oi, ni IntInterval) (IntInterval, bool) {
- oLower := oi.Lower
- oUpper := oi.Upper
- nLower := ni.Lower
- nUpper := ni.Upper
-
- if oLower == NInfinity && nLower != NInfinity {
- return NewIntInterval(nLower, oUpper), true
- }
- if oUpper == PInfinity && nUpper != PInfinity {
- return NewIntInterval(oLower, nUpper), true
- }
- if oLower.Cmp(nLower) == 1 {
- return NewIntInterval(nLower, oUpper), true
- }
- if oUpper.Cmp(nUpper) == -1 {
- return NewIntInterval(oLower, nUpper), true
- }
- return oi, false
- }
- switch oi := g.Range(c.Y()).(type) {
- case IntInterval:
- ni := c.Eval(g).(IntInterval)
- si, changed := narrowIntInterval(oi, ni)
- if changed {
- g.SetRange(c.Y(), si)
- return true
- }
- return false
- case StringInterval:
- ni := c.Eval(g).(StringInterval)
- si, changed := narrowIntInterval(oi.Length, ni.Length)
- if changed {
- g.SetRange(c.Y(), StringInterval{si})
- return true
- }
- return false
- case SliceInterval:
- ni := c.Eval(g).(SliceInterval)
- si, changed := narrowIntInterval(oi.Length, ni.Length)
- if changed {
- g.SetRange(c.Y(), SliceInterval{si})
- return true
- }
- return false
- default:
- return false
- }
-}
-
-func (g *Graph) resolveFutures(scc int) {
- for _, c := range g.futures[scc] {
- c.Resolve()
- }
-}
-
-func (g *Graph) entries(scc int) []ssa.Value {
- var entries []ssa.Value
- for _, n := range g.Vertices {
- if n.SCC != scc {
- continue
- }
- if v, ok := n.Value.(ssa.Value); ok {
- // XXX avoid quadratic runtime
- //
- // XXX I cannot think of any code where the future and its
- // variables aren't in the same SCC, in which case this
- // code isn't very useful (the variables won't be resolved
- // yet). Before we have a cross-SCC example, however, we
- // can't really verify that this code is working
- // correctly, or indeed doing anything useful.
- for _, on := range g.Vertices {
- if c, ok := on.Value.(Future); ok {
- if c.Y() == v {
- if !c.IsResolved() {
- g.SetRange(c.Y(), c.Eval(g))
- c.MarkResolved()
- }
- break
- }
- }
- }
- if g.Range(v).IsKnown() {
- entries = append(entries, v)
- }
- }
- }
- return entries
-}
-
-func (g *Graph) uses(scc int) map[ssa.Value][]Constraint {
- m := map[ssa.Value][]Constraint{}
- for _, e := range g.sccEdges[scc] {
- if e.control {
- continue
- }
- if v, ok := e.From.Value.(ssa.Value); ok {
- c := e.To.Value.(Constraint)
- sink := c.Y()
- if g.Vertices[sink].SCC == scc {
- m[v] = append(m[v], c)
- }
- }
- }
- return m
-}
-
-func (g *Graph) actives(scc int) []ssa.Value {
- var actives []ssa.Value
- for _, n := range g.Vertices {
- if n.SCC != scc {
- continue
- }
- if v, ok := n.Value.(ssa.Value); ok {
- if _, ok := v.(*ssa.Const); !ok {
- actives = append(actives, v)
- }
- }
- }
- return actives
-}
-
-func (g *Graph) AddEdge(from, to interface{}, ctrl bool) {
- vf, ok := g.Vertices[from]
- if !ok {
- vf = &Vertex{Value: from}
- g.Vertices[from] = vf
- }
- vt, ok := g.Vertices[to]
- if !ok {
- vt = &Vertex{Value: to}
- g.Vertices[to] = vt
- }
- e := Edge{From: vf, To: vt, control: ctrl}
- g.Edges = append(g.Edges, e)
- vf.Succs = append(vf.Succs, e)
-}
-
-type Edge struct {
- From, To *Vertex
- control bool
-}
-
-func (e Edge) String() string {
- return fmt.Sprintf("%s -> %s", VertexString(e.From), VertexString(e.To))
-}
-
-func (g *Graph) FindSCCs() {
- // use Tarjan to find the SCCs
-
- index := 1
- var s []*Vertex
-
- scc := 0
- var strongconnect func(v *Vertex)
- strongconnect = func(v *Vertex) {
- // set the depth index for v to the smallest unused index
- v.index = index
- v.lowlink = index
- index++
- s = append(s, v)
- v.stack = true
-
- for _, e := range v.Succs {
- w := e.To
- if w.index == 0 {
- // successor w has not yet been visited; recurse on it
- strongconnect(w)
- if w.lowlink < v.lowlink {
- v.lowlink = w.lowlink
- }
- } else if w.stack {
- // successor w is in stack s and hence in the current scc
- if w.index < v.lowlink {
- v.lowlink = w.index
- }
- }
- }
-
- if v.lowlink == v.index {
- for {
- w := s[len(s)-1]
- s = s[:len(s)-1]
- w.stack = false
- w.SCC = scc
- if w == v {
- break
- }
- }
- scc++
- }
- }
- for _, v := range g.Vertices {
- if v.index == 0 {
- strongconnect(v)
- }
- }
-
- g.SCCs = make([][]*Vertex, scc)
- for _, n := range g.Vertices {
- n.SCC = scc - n.SCC - 1
- g.SCCs[n.SCC] = append(g.SCCs[n.SCC], n)
- }
-}
-
-func invertToken(tok token.Token) token.Token {
- switch tok {
- case token.LSS:
- return token.GEQ
- case token.GTR:
- return token.LEQ
- case token.EQL:
- return token.NEQ
- case token.NEQ:
- return token.EQL
- case token.GEQ:
- return token.LSS
- case token.LEQ:
- return token.GTR
- default:
- panic(fmt.Sprintf("unsupported token %s", tok))
- }
-}
-
-func flipToken(tok token.Token) token.Token {
- switch tok {
- case token.LSS:
- return token.GTR
- case token.GTR:
- return token.LSS
- case token.EQL:
- return token.EQL
- case token.NEQ:
- return token.NEQ
- case token.GEQ:
- return token.LEQ
- case token.LEQ:
- return token.GEQ
- default:
- panic(fmt.Sprintf("unsupported token %s", tok))
- }
-}
-
-type CopyConstraint struct {
- aConstraint
- X ssa.Value
-}
-
-func (c *CopyConstraint) String() string {
- return fmt.Sprintf("%s = copy(%s)", c.Y().Name(), c.X.Name())
-}
-
-func (c *CopyConstraint) Eval(g *Graph) Range {
- return g.Range(c.X)
-}
-
-func (c *CopyConstraint) Operands() []ssa.Value {
- return []ssa.Value{c.X}
-}
-
-func NewCopyConstraint(x, y ssa.Value) Constraint {
- return &CopyConstraint{
- aConstraint: aConstraint{
- y: y,
- },
- X: x,
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/structlayout/layout.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/structlayout/layout.go
deleted file mode 100644
index 04652f8bf..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/structlayout/layout.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package structlayout
-
-import "fmt"
-
-type Field struct {
- Name string `json:"name"`
- Type string `json:"type"`
- Start int64 `json:"start"`
- End int64 `json:"end"`
- Size int64 `json:"size"`
- Align int64 `json:"align"`
- IsPadding bool `json:"is_padding"`
-}
-
-func (f Field) String() string {
- if f.IsPadding {
- return fmt.Sprintf("%s: %d-%d (size %d, align %d)",
- "padding", f.Start, f.End, f.Size, f.Align)
- }
- return fmt.Sprintf("%s %s: %d-%d (size %d, align %d)",
- f.Name, f.Type, f.Start, f.End, f.Size, f.Align)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/unused/unused.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/unused/unused.go
deleted file mode 100644
index c0a71e4e3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/unused/unused.go
+++ /dev/null
@@ -1,1063 +0,0 @@
-package unused // import "honnef.co/go/tools/unused"
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "io"
- "path/filepath"
- "strings"
-
- "honnef.co/go/tools/lint"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/types/typeutil"
-)
-
-func NewLintChecker(c *Checker) *LintChecker {
- l := &LintChecker{
- c: c,
- }
- return l
-}
-
-type LintChecker struct {
- c *Checker
-}
-
-func (*LintChecker) Name() string { return "unused" }
-func (*LintChecker) Prefix() string { return "U" }
-
-func (l *LintChecker) Init(*lint.Program) {}
-func (l *LintChecker) Funcs() map[string]lint.Func {
- return map[string]lint.Func{
- "U1000": l.Lint,
- }
-}
-
-func typString(obj types.Object) string {
- switch obj := obj.(type) {
- case *types.Func:
- return "func"
- case *types.Var:
- if obj.IsField() {
- return "field"
- }
- return "var"
- case *types.Const:
- return "const"
- case *types.TypeName:
- return "type"
- default:
- // log.Printf("%T", obj)
- return "identifier"
- }
-}
-
-func (l *LintChecker) Lint(j *lint.Job) {
- unused := l.c.Check(j.Program.Prog)
- for _, u := range unused {
- name := u.Obj.Name()
- if sig, ok := u.Obj.Type().(*types.Signature); ok && sig.Recv() != nil {
- switch sig.Recv().Type().(type) {
- case *types.Named, *types.Pointer:
- typ := types.TypeString(sig.Recv().Type(), func(*types.Package) string { return "" })
- if len(typ) > 0 && typ[0] == '*' {
- name = fmt.Sprintf("(%s).%s", typ, u.Obj.Name())
- } else if len(typ) > 0 {
- name = fmt.Sprintf("%s.%s", typ, u.Obj.Name())
- }
- }
- }
- j.Errorf(u.Obj, "%s %s is unused", typString(u.Obj), name)
- }
-}
-
-type graph struct {
- roots []*graphNode
- nodes map[interface{}]*graphNode
-}
-
-func (g *graph) markUsedBy(obj, usedBy interface{}) {
- objNode := g.getNode(obj)
- usedByNode := g.getNode(usedBy)
- if objNode.obj == usedByNode.obj {
- return
- }
- usedByNode.uses[objNode] = struct{}{}
-}
-
-var labelCounter = 1
-
-func (g *graph) getNode(obj interface{}) *graphNode {
- for {
- if pt, ok := obj.(*types.Pointer); ok {
- obj = pt.Elem()
- } else {
- break
- }
- }
- _, ok := g.nodes[obj]
- if !ok {
- g.addObj(obj)
- }
-
- return g.nodes[obj]
-}
-
-func (g *graph) addObj(obj interface{}) {
- if pt, ok := obj.(*types.Pointer); ok {
- obj = pt.Elem()
- }
- node := &graphNode{obj: obj, uses: make(map[*graphNode]struct{}), n: labelCounter}
- g.nodes[obj] = node
- labelCounter++
-
- if obj, ok := obj.(*types.Struct); ok {
- n := obj.NumFields()
- for i := 0; i < n; i++ {
- field := obj.Field(i)
- g.markUsedBy(obj, field)
- }
- }
-}
-
-type graphNode struct {
- obj interface{}
- uses map[*graphNode]struct{}
- used bool
- quiet bool
- n int
-}
-
-type CheckMode int
-
-const (
- CheckConstants CheckMode = 1 << iota
- CheckFields
- CheckFunctions
- CheckTypes
- CheckVariables
-
- CheckAll = CheckConstants | CheckFields | CheckFunctions | CheckTypes | CheckVariables
-)
-
-type Unused struct {
- Obj types.Object
- Position token.Position
-}
-
-type Checker struct {
- Mode CheckMode
- WholeProgram bool
- ConsiderReflection bool
- Debug io.Writer
-
- graph *graph
-
- msCache typeutil.MethodSetCache
- lprog *loader.Program
- topmostCache map[*types.Scope]*types.Scope
- interfaces []*types.Interface
-}
-
-func NewChecker(mode CheckMode) *Checker {
- return &Checker{
- Mode: mode,
- graph: &graph{
- nodes: make(map[interface{}]*graphNode),
- },
- topmostCache: make(map[*types.Scope]*types.Scope),
- }
-}
-
-func (c *Checker) checkConstants() bool { return (c.Mode & CheckConstants) > 0 }
-func (c *Checker) checkFields() bool { return (c.Mode & CheckFields) > 0 }
-func (c *Checker) checkFunctions() bool { return (c.Mode & CheckFunctions) > 0 }
-func (c *Checker) checkTypes() bool { return (c.Mode & CheckTypes) > 0 }
-func (c *Checker) checkVariables() bool { return (c.Mode & CheckVariables) > 0 }
-
-func (c *Checker) markFields(typ types.Type) {
- structType, ok := typ.Underlying().(*types.Struct)
- if !ok {
- return
- }
- n := structType.NumFields()
- for i := 0; i < n; i++ {
- field := structType.Field(i)
- c.graph.markUsedBy(field, typ)
- }
-}
-
-type Error struct {
- Errors map[string][]error
-}
-
-func (e Error) Error() string {
- return fmt.Sprintf("errors in %d packages", len(e.Errors))
-}
-
-func (c *Checker) Check(lprog *loader.Program) []Unused {
- var unused []Unused
- c.lprog = lprog
- if c.WholeProgram {
- c.findExportedInterfaces()
- }
- for _, pkg := range c.lprog.InitialPackages() {
- c.processDefs(pkg)
- c.processUses(pkg)
- c.processTypes(pkg)
- c.processSelections(pkg)
- c.processAST(pkg)
- }
-
- for _, node := range c.graph.nodes {
- obj, ok := node.obj.(types.Object)
- if !ok {
- continue
- }
- typNode, ok := c.graph.nodes[obj.Type()]
- if !ok {
- continue
- }
- node.uses[typNode] = struct{}{}
- }
-
- roots := map[*graphNode]struct{}{}
- for _, root := range c.graph.roots {
- roots[root] = struct{}{}
- }
- markNodesUsed(roots)
- c.markNodesQuiet()
-
- if c.Debug != nil {
- c.printDebugGraph(c.Debug)
- }
-
- for _, node := range c.graph.nodes {
- if node.used || node.quiet {
- continue
- }
- obj, ok := node.obj.(types.Object)
- if !ok {
- continue
- }
- found := false
- if !false {
- for _, pkg := range c.lprog.InitialPackages() {
- if pkg.Pkg == obj.Pkg() {
- found = true
- break
- }
- }
- }
- if !found {
- continue
- }
-
- pos := c.lprog.Fset.Position(obj.Pos())
- if pos.Filename == "" || filepath.Base(pos.Filename) == "C" {
- continue
- }
- generated := false
- for _, file := range c.lprog.Package(obj.Pkg().Path()).Files {
- if c.lprog.Fset.Position(file.Pos()).Filename != pos.Filename {
- continue
- }
- if len(file.Comments) > 0 {
- generated = isGenerated(file.Comments[0].Text())
- }
- break
- }
- if generated {
- continue
- }
- unused = append(unused, Unused{Obj: obj, Position: pos})
- }
- return unused
-}
-
-// isNoCopyType reports whether a type represents the NoCopy sentinel
-// type. The NoCopy type is a named struct with no fields and exactly
-// one method `func Lock()` that is empty.
-//
-// FIXME(dh): currently we're not checking that the function body is
-// empty.
-func isNoCopyType(typ types.Type) bool {
- st, ok := typ.Underlying().(*types.Struct)
- if !ok {
- return false
- }
- if st.NumFields() != 0 {
- return false
- }
-
- named, ok := typ.(*types.Named)
- if !ok {
- return false
- }
- if named.NumMethods() != 1 {
- return false
- }
- meth := named.Method(0)
- if meth.Name() != "Lock" {
- return false
- }
- sig := meth.Type().(*types.Signature)
- if sig.Params().Len() != 0 || sig.Results().Len() != 0 {
- return false
- }
- return true
-}
-
-func (c *Checker) useNoCopyFields(typ types.Type) {
- if st, ok := typ.Underlying().(*types.Struct); ok {
- n := st.NumFields()
- for i := 0; i < n; i++ {
- field := st.Field(i)
- if isNoCopyType(field.Type()) {
- c.graph.markUsedBy(field, typ)
- }
- }
- }
-}
-
-func (c *Checker) useExportedFields(typ types.Type) {
- if st, ok := typ.Underlying().(*types.Struct); ok {
- n := st.NumFields()
- for i := 0; i < n; i++ {
- field := st.Field(i)
- if field.Exported() {
- c.graph.markUsedBy(field, typ)
- }
- }
- }
-}
-
-func (c *Checker) useExportedMethods(typ types.Type) {
- named, ok := typ.(*types.Named)
- if !ok {
- return
- }
- ms := typeutil.IntuitiveMethodSet(named, &c.msCache)
- for i := 0; i < len(ms); i++ {
- meth := ms[i].Obj()
- if meth.Exported() {
- c.graph.markUsedBy(meth, typ)
- }
- }
-
- st, ok := named.Underlying().(*types.Struct)
- if !ok {
- return
- }
- n := st.NumFields()
- for i := 0; i < n; i++ {
- field := st.Field(i)
- if !field.Anonymous() {
- continue
- }
- ms := typeutil.IntuitiveMethodSet(field.Type(), &c.msCache)
- for j := 0; j < len(ms); j++ {
- if ms[j].Obj().Exported() {
- c.graph.markUsedBy(field, typ)
- break
- }
- }
- }
-}
-
-func (c *Checker) processDefs(pkg *loader.PackageInfo) {
- for _, obj := range pkg.Defs {
- if obj == nil {
- continue
- }
- c.graph.getNode(obj)
-
- if obj, ok := obj.(*types.TypeName); ok {
- c.graph.markUsedBy(obj.Type().Underlying(), obj.Type())
- c.graph.markUsedBy(obj.Type(), obj) // TODO is this needed?
- c.graph.markUsedBy(obj, obj.Type())
-
- // We mark all exported fields as used. For normal
- // operation, we have to. The user may use these fields
- // without us knowing.
- //
- // TODO(dh): In whole-program mode, however, we mark them
- // as used because of reflection (such as JSON
- // marshaling). Strictly speaking, we would only need to
- // mark them used if an instance of the type was
- // accessible via an interface value.
- if !c.WholeProgram || c.ConsiderReflection {
- c.useExportedFields(obj.Type())
- }
-
- // TODO(dh): Traditionally we have not marked all exported
- // methods as exported, even though they're strictly
- // speaking accessible through reflection. We've done that
- // because using methods just via reflection is rare, and
- // not worth the false negatives. With the new -reflect
- // flag, however, we should reconsider that choice.
- if !c.WholeProgram {
- c.useExportedMethods(obj.Type())
- }
- }
-
- switch obj := obj.(type) {
- case *types.Var, *types.Const, *types.Func, *types.TypeName:
- if obj.Exported() {
- // Exported variables and constants use their types,
- // even if there's no expression using them in the
- // checked program.
- //
- // Also operates on funcs and type names, but that's
- // irrelevant/redundant.
- c.graph.markUsedBy(obj.Type(), obj)
- }
- if obj.Name() == "_" {
- node := c.graph.getNode(obj)
- node.quiet = true
- scope := c.topmostScope(pkg.Pkg.Scope().Innermost(obj.Pos()), pkg.Pkg)
- if scope == pkg.Pkg.Scope() {
- c.graph.roots = append(c.graph.roots, node)
- } else {
- c.graph.markUsedBy(obj, scope)
- }
- } else {
- // Variables declared in functions are used. This is
- // done so that arguments and return parameters are
- // always marked as used.
- if _, ok := obj.(*types.Var); ok {
- if obj.Parent() != obj.Pkg().Scope() && obj.Parent() != nil {
- c.graph.markUsedBy(obj, c.topmostScope(obj.Parent(), obj.Pkg()))
- c.graph.markUsedBy(obj.Type(), obj)
- }
- }
- }
- }
-
- if fn, ok := obj.(*types.Func); ok {
- // A function uses its signature
- c.graph.markUsedBy(fn, fn.Type())
-
- // A function uses its return types
- sig := fn.Type().(*types.Signature)
- res := sig.Results()
- n := res.Len()
- for i := 0; i < n; i++ {
- c.graph.markUsedBy(res.At(i).Type(), fn)
- }
- }
-
- if obj, ok := obj.(interface {
- Scope() *types.Scope
- Pkg() *types.Package
- }); ok {
- scope := obj.Scope()
- c.graph.markUsedBy(c.topmostScope(scope, obj.Pkg()), obj)
- }
-
- if c.isRoot(obj) {
- node := c.graph.getNode(obj)
- c.graph.roots = append(c.graph.roots, node)
- if obj, ok := obj.(*types.PkgName); ok {
- scope := obj.Pkg().Scope()
- c.graph.markUsedBy(scope, obj)
- }
- }
- }
-}
-
-func (c *Checker) processUses(pkg *loader.PackageInfo) {
- for ident, usedObj := range pkg.Uses {
- if _, ok := usedObj.(*types.PkgName); ok {
- continue
- }
- pos := ident.Pos()
- scope := pkg.Pkg.Scope().Innermost(pos)
- scope = c.topmostScope(scope, pkg.Pkg)
- if scope != pkg.Pkg.Scope() {
- c.graph.markUsedBy(usedObj, scope)
- }
-
- switch usedObj.(type) {
- case *types.Var, *types.Const:
- c.graph.markUsedBy(usedObj.Type(), usedObj)
- }
- }
-}
-
-func (c *Checker) findExportedInterfaces() {
- c.interfaces = []*types.Interface{types.Universe.Lookup("error").Type().(*types.Named).Underlying().(*types.Interface)}
- var pkgs []*loader.PackageInfo
- if c.WholeProgram {
- for _, pkg := range c.lprog.AllPackages {
- pkgs = append(pkgs, pkg)
- }
- } else {
- pkgs = c.lprog.InitialPackages()
- }
-
- for _, pkg := range pkgs {
- for _, tv := range pkg.Types {
- iface, ok := tv.Type.(*types.Interface)
- if !ok {
- continue
- }
- if iface.NumMethods() == 0 {
- continue
- }
- c.interfaces = append(c.interfaces, iface)
- }
- }
-}
-
-func (c *Checker) processTypes(pkg *loader.PackageInfo) {
- named := map[*types.Named]*types.Pointer{}
- var interfaces []*types.Interface
- for _, tv := range pkg.Types {
- if typ, ok := tv.Type.(interface {
- Elem() types.Type
- }); ok {
- c.graph.markUsedBy(typ.Elem(), typ)
- }
-
- switch obj := tv.Type.(type) {
- case *types.Named:
- named[obj] = types.NewPointer(obj)
- c.graph.markUsedBy(obj, obj.Underlying())
- c.graph.markUsedBy(obj.Underlying(), obj)
- case *types.Interface:
- if obj.NumMethods() > 0 {
- interfaces = append(interfaces, obj)
- }
- case *types.Struct:
- c.useNoCopyFields(obj)
- if pkg.Pkg.Name() != "main" && !c.WholeProgram {
- c.useExportedFields(obj)
- }
- }
- }
-
- // Pretend that all types are meant to implement as many
- // interfaces as possible.
- //
- // TODO(dh): For normal operations, that's the best we can do, as
- // we have no idea what external users will do with our types. In
- // whole-program mode, we could be more conservative, in two ways:
- // 1) Only consider interfaces if a type has been assigned to one
- // 2) Use SSA and flow analysis and determine the exact set of
- // interfaces that is relevant.
- fn := func(iface *types.Interface) {
- for obj, objPtr := range named {
- if !types.Implements(obj, iface) && !types.Implements(objPtr, iface) {
- continue
- }
- ifaceMethods := make(map[string]struct{}, iface.NumMethods())
- n := iface.NumMethods()
- for i := 0; i < n; i++ {
- meth := iface.Method(i)
- ifaceMethods[meth.Name()] = struct{}{}
- }
- for _, obj := range []types.Type{obj, objPtr} {
- ms := c.msCache.MethodSet(obj)
- n := ms.Len()
- for i := 0; i < n; i++ {
- sel := ms.At(i)
- meth := sel.Obj().(*types.Func)
- _, found := ifaceMethods[meth.Name()]
- if !found {
- continue
- }
- c.graph.markUsedBy(meth.Type().(*types.Signature).Recv().Type(), obj) // embedded receiver
- if len(sel.Index()) > 1 {
- f := getField(obj, sel.Index()[0])
- c.graph.markUsedBy(f, obj) // embedded receiver
- }
- c.graph.markUsedBy(meth, obj)
- }
- }
- }
- }
-
- for _, iface := range interfaces {
- fn(iface)
- }
- for _, iface := range c.interfaces {
- fn(iface)
- }
-}
-
-func (c *Checker) processSelections(pkg *loader.PackageInfo) {
- fn := func(expr *ast.SelectorExpr, sel *types.Selection, offset int) {
- scope := pkg.Pkg.Scope().Innermost(expr.Pos())
- c.graph.markUsedBy(expr.X, c.topmostScope(scope, pkg.Pkg))
- c.graph.markUsedBy(sel.Obj(), expr.X)
- if len(sel.Index()) > 1 {
- typ := sel.Recv()
- indices := sel.Index()
- for _, idx := range indices[:len(indices)-offset] {
- obj := getField(typ, idx)
- typ = obj.Type()
- c.graph.markUsedBy(obj, expr.X)
- }
- }
- }
-
- for expr, sel := range pkg.Selections {
- switch sel.Kind() {
- case types.FieldVal:
- fn(expr, sel, 0)
- case types.MethodVal:
- fn(expr, sel, 1)
- }
- }
-}
-
-func dereferenceType(typ types.Type) types.Type {
- if typ, ok := typ.(*types.Pointer); ok {
- return typ.Elem()
- }
- return typ
-}
-
-// processConversion marks fields as used if they're part of a type conversion.
-func (c *Checker) processConversion(pkg *loader.PackageInfo, node ast.Node) {
- if node, ok := node.(*ast.CallExpr); ok {
- callTyp := pkg.TypeOf(node.Fun)
- var typDst *types.Struct
- var ok bool
- switch typ := callTyp.(type) {
- case *types.Named:
- typDst, ok = typ.Underlying().(*types.Struct)
- case *types.Pointer:
- typDst, ok = typ.Elem().Underlying().(*types.Struct)
- default:
- return
- }
- if !ok {
- return
- }
-
- if typ, ok := pkg.TypeOf(node.Args[0]).(*types.Basic); ok && typ.Kind() == types.UnsafePointer {
- // This is an unsafe conversion. Assume that all the
- // fields are relevant (they are, because of memory
- // layout)
- n := typDst.NumFields()
- for i := 0; i < n; i++ {
- c.graph.markUsedBy(typDst.Field(i), typDst)
- }
- return
- }
-
- typSrc, ok := dereferenceType(pkg.TypeOf(node.Args[0])).Underlying().(*types.Struct)
- if !ok {
- return
- }
-
- // When we convert from type t1 to t2, were t1 and t2 are
- // structs, all fields are relevant, as otherwise the
- // conversion would fail.
- //
- // We mark t2's fields as used by t1's fields, and vice
- // versa. That way, if no code actually refers to a field
- // in either type, it's still correctly marked as unused.
- // If a field is used in either struct, it's implicitly
- // relevant in the other one, too.
- //
- // It works in a similar way for conversions between types
- // of two packages, only that the extra information in the
- // graph is redundant unless we're in whole program mode.
- n := typDst.NumFields()
- for i := 0; i < n; i++ {
- fDst := typDst.Field(i)
- fSrc := typSrc.Field(i)
- c.graph.markUsedBy(fDst, fSrc)
- c.graph.markUsedBy(fSrc, fDst)
- }
- }
-}
-
-// processCompositeLiteral marks fields as used if the struct is used
-// in a composite literal.
-func (c *Checker) processCompositeLiteral(pkg *loader.PackageInfo, node ast.Node) {
- // XXX how does this actually work? wouldn't it match t{}?
- if node, ok := node.(*ast.CompositeLit); ok {
- typ := pkg.TypeOf(node)
- if _, ok := typ.(*types.Named); ok {
- typ = typ.Underlying()
- }
- if _, ok := typ.(*types.Struct); !ok {
- return
- }
-
- if isBasicStruct(node.Elts) {
- c.markFields(typ)
- }
- }
-}
-
-// processCgoExported marks functions as used if they're being
-// exported to cgo.
-func (c *Checker) processCgoExported(pkg *loader.PackageInfo, node ast.Node) {
- if node, ok := node.(*ast.FuncDecl); ok {
- if node.Doc == nil {
- return
- }
- for _, cmt := range node.Doc.List {
- if !strings.HasPrefix(cmt.Text, "//go:cgo_export_") {
- return
- }
- obj := pkg.ObjectOf(node.Name)
- c.graph.roots = append(c.graph.roots, c.graph.getNode(obj))
- }
- }
-}
-
-func (c *Checker) processVariableDeclaration(pkg *loader.PackageInfo, node ast.Node) {
- if decl, ok := node.(*ast.GenDecl); ok {
- for _, spec := range decl.Specs {
- spec, ok := spec.(*ast.ValueSpec)
- if !ok {
- continue
- }
- for i, name := range spec.Names {
- if i >= len(spec.Values) {
- break
- }
- value := spec.Values[i]
- fn := func(node ast.Node) bool {
- if node3, ok := node.(*ast.Ident); ok {
- obj := pkg.ObjectOf(node3)
- if _, ok := obj.(*types.PkgName); ok {
- return true
- }
- c.graph.markUsedBy(obj, pkg.ObjectOf(name))
- }
- return true
- }
- ast.Inspect(value, fn)
- }
- }
- }
-}
-
-func (c *Checker) processArrayConstants(pkg *loader.PackageInfo, node ast.Node) {
- if decl, ok := node.(*ast.ArrayType); ok {
- ident, ok := decl.Len.(*ast.Ident)
- if !ok {
- return
- }
- c.graph.markUsedBy(pkg.ObjectOf(ident), pkg.TypeOf(decl))
- }
-}
-
-func (c *Checker) processKnownReflectMethodCallers(pkg *loader.PackageInfo, node ast.Node) {
- call, ok := node.(*ast.CallExpr)
- if !ok {
- return
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return
- }
- if types.TypeString(pkg.TypeOf(sel.X), nil) != "*net/rpc.Server" {
- x, ok := sel.X.(*ast.Ident)
- if !ok {
- return
- }
- pkgname, ok := pkg.ObjectOf(x).(*types.PkgName)
- if !ok {
- return
- }
- if pkgname.Imported().Path() != "net/rpc" {
- return
- }
- }
-
- var arg ast.Expr
- switch sel.Sel.Name {
- case "Register":
- if len(call.Args) != 1 {
- return
- }
- arg = call.Args[0]
- case "RegisterName":
- if len(call.Args) != 2 {
- return
- }
- arg = call.Args[1]
- }
- typ := pkg.TypeOf(arg)
- ms := types.NewMethodSet(typ)
- for i := 0; i < ms.Len(); i++ {
- c.graph.markUsedBy(ms.At(i).Obj(), typ)
- }
-}
-
-func (c *Checker) processAST(pkg *loader.PackageInfo) {
- fn := func(node ast.Node) bool {
- c.processConversion(pkg, node)
- c.processKnownReflectMethodCallers(pkg, node)
- c.processCompositeLiteral(pkg, node)
- c.processCgoExported(pkg, node)
- c.processVariableDeclaration(pkg, node)
- c.processArrayConstants(pkg, node)
- return true
- }
- for _, file := range pkg.Files {
- ast.Inspect(file, fn)
- }
-}
-
-func isBasicStruct(elts []ast.Expr) bool {
- for _, elt := range elts {
- if _, ok := elt.(*ast.KeyValueExpr); !ok {
- return true
- }
- }
- return false
-}
-
-func isPkgScope(obj types.Object) bool {
- return obj.Parent() == obj.Pkg().Scope()
-}
-
-func isMain(obj types.Object) bool {
- if obj.Pkg().Name() != "main" {
- return false
- }
- if obj.Name() != "main" {
- return false
- }
- if !isPkgScope(obj) {
- return false
- }
- if !isFunction(obj) {
- return false
- }
- if isMethod(obj) {
- return false
- }
- return true
-}
-
-func isFunction(obj types.Object) bool {
- _, ok := obj.(*types.Func)
- return ok
-}
-
-func isMethod(obj types.Object) bool {
- if !isFunction(obj) {
- return false
- }
- return obj.(*types.Func).Type().(*types.Signature).Recv() != nil
-}
-
-func isVariable(obj types.Object) bool {
- _, ok := obj.(*types.Var)
- return ok
-}
-
-func isConstant(obj types.Object) bool {
- _, ok := obj.(*types.Const)
- return ok
-}
-
-func isType(obj types.Object) bool {
- _, ok := obj.(*types.TypeName)
- return ok
-}
-
-func isField(obj types.Object) bool {
- if obj, ok := obj.(*types.Var); ok && obj.IsField() {
- return true
- }
- return false
-}
-
-func (c *Checker) checkFlags(v interface{}) bool {
- obj, ok := v.(types.Object)
- if !ok {
- return false
- }
- if isFunction(obj) && !c.checkFunctions() {
- return false
- }
- if isVariable(obj) && !c.checkVariables() {
- return false
- }
- if isConstant(obj) && !c.checkConstants() {
- return false
- }
- if isType(obj) && !c.checkTypes() {
- return false
- }
- if isField(obj) && !c.checkFields() {
- return false
- }
- return true
-}
-
-func (c *Checker) isRoot(obj types.Object) bool {
- // - in local mode, main, init, tests, and non-test, non-main exported are roots
- // - in global mode (not yet implemented), main, init and tests are roots
-
- if _, ok := obj.(*types.PkgName); ok {
- return true
- }
-
- if isMain(obj) || (isFunction(obj) && !isMethod(obj) && obj.Name() == "init") {
- return true
- }
- if obj.Exported() {
- f := c.lprog.Fset.Position(obj.Pos()).Filename
- if strings.HasSuffix(f, "_test.go") {
- return strings.HasPrefix(obj.Name(), "Test") ||
- strings.HasPrefix(obj.Name(), "Benchmark") ||
- strings.HasPrefix(obj.Name(), "Example")
- }
-
- // Package-level are used, except in package main
- if isPkgScope(obj) && obj.Pkg().Name() != "main" && !c.WholeProgram {
- return true
- }
- }
- return false
-}
-
-func markNodesUsed(nodes map[*graphNode]struct{}) {
- for node := range nodes {
- wasUsed := node.used
- node.used = true
- if !wasUsed {
- markNodesUsed(node.uses)
- }
- }
-}
-
-func (c *Checker) markNodesQuiet() {
- for _, node := range c.graph.nodes {
- if node.used {
- continue
- }
- if obj, ok := node.obj.(types.Object); ok && !c.checkFlags(obj) {
- node.quiet = true
- continue
- }
- c.markObjQuiet(node.obj)
- }
-}
-
-func (c *Checker) markObjQuiet(obj interface{}) {
- switch obj := obj.(type) {
- case *types.Named:
- n := obj.NumMethods()
- for i := 0; i < n; i++ {
- meth := obj.Method(i)
- node := c.graph.getNode(meth)
- node.quiet = true
- c.markObjQuiet(meth.Scope())
- }
- case *types.Struct:
- n := obj.NumFields()
- for i := 0; i < n; i++ {
- field := obj.Field(i)
- c.graph.nodes[field].quiet = true
- }
- case *types.Func:
- c.markObjQuiet(obj.Scope())
- case *types.Scope:
- if obj == nil {
- return
- }
- if obj.Parent() == types.Universe {
- return
- }
- for _, name := range obj.Names() {
- v := obj.Lookup(name)
- if n, ok := c.graph.nodes[v]; ok {
- n.quiet = true
- }
- }
- n := obj.NumChildren()
- for i := 0; i < n; i++ {
- c.markObjQuiet(obj.Child(i))
- }
- }
-}
-
-func getField(typ types.Type, idx int) *types.Var {
- switch obj := typ.(type) {
- case *types.Pointer:
- return getField(obj.Elem(), idx)
- case *types.Named:
- switch v := obj.Underlying().(type) {
- case *types.Struct:
- return v.Field(idx)
- case *types.Pointer:
- return getField(v.Elem(), idx)
- default:
- panic(fmt.Sprintf("unexpected type %s", typ))
- }
- case *types.Struct:
- return obj.Field(idx)
- }
- return nil
-}
-
-func (c *Checker) topmostScope(scope *types.Scope, pkg *types.Package) (ret *types.Scope) {
- if top, ok := c.topmostCache[scope]; ok {
- return top
- }
- defer func() {
- c.topmostCache[scope] = ret
- }()
- if scope == pkg.Scope() {
- return scope
- }
- if scope.Parent().Parent() == pkg.Scope() {
- return scope
- }
- return c.topmostScope(scope.Parent(), pkg)
-}
-
-func (c *Checker) printDebugGraph(w io.Writer) {
- fmt.Fprintln(w, "digraph {")
- fmt.Fprintln(w, "n0 [label = roots]")
- for _, node := range c.graph.nodes {
- s := fmt.Sprintf("%s (%T)", node.obj, node.obj)
- s = strings.Replace(s, "\n", "", -1)
- s = strings.Replace(s, `"`, "", -1)
- fmt.Fprintf(w, `n%d [label = %q]`, node.n, s)
- color := "black"
- switch {
- case node.used:
- color = "green"
- case node.quiet:
- color = "orange"
- case !c.checkFlags(node.obj):
- color = "purple"
- default:
- color = "red"
- }
- fmt.Fprintf(w, "[color = %s]", color)
- fmt.Fprintln(w)
- }
-
- for _, node1 := range c.graph.nodes {
- for node2 := range node1.uses {
- fmt.Fprintf(w, "n%d -> n%d\n", node1.n, node2.n)
- }
- }
- for _, root := range c.graph.roots {
- fmt.Fprintf(w, "n0 -> n%d\n", root.n)
- }
- fmt.Fprintln(w, "}")
-}
-
-func isGenerated(comment string) bool {
- return strings.Contains(comment, "Code generated by") ||
- strings.Contains(comment, "DO NOT EDIT")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/version/version.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/version/version.go
deleted file mode 100644
index 5e41bc4f7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/honnef.co/go/tools/version/version.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package version
-
-import (
- "fmt"
- "os"
- "path/filepath"
-)
-
-const Version = "2017.2"
-
-func Print() {
- if Version == "devel" {
- fmt.Printf("%s (no version)\n", filepath.Base(os.Args[0]))
- } else {
- fmt.Printf("%s %s\n", filepath.Base(os.Args[0]), Version)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/manifest b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/manifest
deleted file mode 100644
index 5caf5aaac..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/manifest
+++ /dev/null
@@ -1,353 +0,0 @@
-{
- "version": 0,
- "dependencies": [
- {
- "importpath": "github.com/GoASTScanner/gas",
- "repository": "https://github.com/GoASTScanner/gas",
- "vcs": "git",
- "revision": "f22c701483ba201fbdb79c3667a28ef6a4e4a25c",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/alecthomas/gocyclo",
- "repository": "https://github.com/alecthomas/gocyclo",
- "vcs": "git",
- "revision": "aa8f8b160214d8dfccfe3e17e578dd0fcc6fede7",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/alexkohler/nakedret",
- "repository": "https://github.com/alexkohler/nakedret",
- "vcs": "git",
- "revision": "ca8b55b818e14bc0f1f52b714e7474634eadcd34",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/client9/misspell",
- "repository": "https://github.com/client9/misspell",
- "vcs": "git",
- "revision": "e1f24e3e0b6b2c8bc98584370d382ae095b13c94",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/dnephin/govet",
- "repository": "https://github.com/dnephin/govet",
- "vcs": "git",
- "revision": "4a96d43e39d340b63daa8bc5576985aa599885f6",
- "branch": "fork",
- "notests": true
- },
- {
- "importpath": "github.com/golang/lint",
- "repository": "https://github.com/golang/lint",
- "vcs": "git",
- "revision": "c5fb716d6688a859aae56d26d3e6070808df29f7",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/gordonklaus/ineffassign",
- "repository": "https://github.com/gordonklaus/ineffassign",
- "vcs": "git",
- "revision": "da3d65debb9bff70fcfb6f277a8db31e8200de20",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/jgautheron/goconst",
- "repository": "https://github.com/jgautheron/goconst",
- "vcs": "git",
- "revision": "9740945f5dcb78c2faa8eedcce78c2a04aa6e1e9",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/kisielk/errcheck",
- "repository": "https://github.com/kisielk/errcheck",
- "vcs": "git",
- "revision": "23699b7e2cbfdb89481023524954ba2aeff6be90",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/kisielk/gotool",
- "repository": "https://github.com/kisielk/gotool",
- "vcs": "git",
- "revision": "d6ce6262d87e3a4e153e86023ff56ae771554a41",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/mdempsky/maligned",
- "repository": "https://github.com/mdempsky/maligned",
- "vcs": "git",
- "revision": "08c8e9db1bce03f1af283686c0943fcb75f0109e",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/mdempsky/unconvert",
- "repository": "https://github.com/mdempsky/unconvert",
- "vcs": "git",
- "revision": "beb68d938016d2dec1d1b078054f4d3db25f97be",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/mibk/dupl",
- "repository": "https://github.com/mibk/dupl",
- "vcs": "git",
- "revision": "3447d9b0cb5a3e7dccb1a9f1c975f35683f304e6",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/opennota/check",
- "repository": "https://github.com/opennota/check",
- "vcs": "git",
- "revision": "0ec6d92e97559edf84eebe7c51b069953d4b522c",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/stripe/safesql",
- "repository": "https://github.com/stripe/safesql",
- "vcs": "git",
- "revision": "452e37ed794488bd0d99676532f346e03cc6cd2c",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/tsenart/deadcode",
- "repository": "https://github.com/tsenart/deadcode",
- "vcs": "git",
- "revision": "210d2dc333e90c7e3eedf4f2242507a8e83ed4ab",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/walle/lll",
- "repository": "https://github.com/walle/lll",
- "vcs": "git",
- "revision": "8b13b3fbf7312913fcfdbfa78997b9bd1dbb11af",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "golang.org/x/text/internal/gen",
- "repository": "https://go.googlesource.com/text",
- "vcs": "git",
- "revision": "bd91bbf73e9a4a801adbfb97133c992678533126",
- "branch": "master",
- "path": "internal/gen",
- "notests": true
- },
- {
- "importpath": "golang.org/x/text/internal/triegen",
- "repository": "https://go.googlesource.com/text",
- "vcs": "git",
- "revision": "bd91bbf73e9a4a801adbfb97133c992678533126",
- "branch": "master",
- "path": "internal/triegen",
- "notests": true
- },
- {
- "importpath": "golang.org/x/text/internal/ucd",
- "repository": "https://go.googlesource.com/text",
- "vcs": "git",
- "revision": "bd91bbf73e9a4a801adbfb97133c992678533126",
- "branch": "master",
- "path": "internal/ucd",
- "notests": true
- },
- {
- "importpath": "golang.org/x/text/transform",
- "repository": "https://go.googlesource.com/text",
- "vcs": "git",
- "revision": "bd91bbf73e9a4a801adbfb97133c992678533126",
- "branch": "master",
- "path": "transform",
- "notests": true
- },
- {
- "importpath": "golang.org/x/text/unicode/cldr",
- "repository": "https://go.googlesource.com/text",
- "vcs": "git",
- "revision": "bd91bbf73e9a4a801adbfb97133c992678533126",
- "branch": "master",
- "path": "unicode/cldr",
- "notests": true
- },
- {
- "importpath": "golang.org/x/text/width",
- "repository": "https://go.googlesource.com/text",
- "vcs": "git",
- "revision": "bd91bbf73e9a4a801adbfb97133c992678533126",
- "branch": "master",
- "path": "/width",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/cmd/goimports",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/cmd/goimports",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/cmd/gotype",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/cmd/gotype",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/container/intsets",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/container/intsets",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/ast/astutil",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "go/ast/astutil",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/buildutil",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "go/buildutil",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/callgraph",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/go/callgraph",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/gcexportdata",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/go/gcexportdata",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/gcimporter15",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/go/gcimporter15",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/loader",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/go/loader",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/pointer",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "go/pointer",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/ssa",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/go/ssa",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/go/types/typeutil",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "/go/types/typeutil",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/imports",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "3b1faeda9afbcba128c2d794b38ffe7982141139",
- "branch": "master",
- "path": "imports",
- "notests": true
- },
- {
- "importpath": "golang.org/x/tools/refactor/importgraph",
- "repository": "https://go.googlesource.com/tools",
- "vcs": "git",
- "revision": "9c477bae194915bfd4bc8c314e90e28b9ec1c831",
- "branch": "master",
- "path": "/refactor/importgraph",
- "notests": true
- },
- {
- "importpath": "honnef.co/go/tools",
- "repository": "https://github.com/dominikh/go-tools",
- "vcs": "git",
- "revision": "50914165a1ae448f1608c6c325d052313396182e",
- "branch": "HEAD",
- "notests": true
- },
- {
- "importpath": "mvdan.cc/interfacer",
- "repository": "https://github.com/mvdan/interfacer",
- "vcs": "git",
- "revision": "d7e7372184a059b8fd99d96a593e3811bf989d75",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "mvdan.cc/lint",
- "repository": "https://github.com/mvdan/lint",
- "vcs": "git",
- "revision": "adc824a0674b99099789b6188a058d485eaf61c0",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "mvdan.cc/unparam",
- "repository": "https://github.com/mvdan/unparam",
- "vcs": "git",
- "revision": "6b9a9bf4cdf71fae79104529ee3f16148302cc71",
- "branch": "master",
- "notests": true
- }
- ]
-}
\ No newline at end of file
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/LICENSE
deleted file mode 100644
index 7d71d51a5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2015, Daniel Martí. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of the copyright holder nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 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/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/cache.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/cache.go
deleted file mode 100644
index 757eca55e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/cache.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2015, Daniel Martí
-// See LICENSE for licensing information
-
-package check
-
-import (
- "go/ast"
- "go/types"
-)
-
-type pkgTypes struct {
- ifaces map[string]string
- funcSigns map[string]bool
-}
-
-func (p *pkgTypes) getTypes(pkg *types.Package) {
- p.ifaces = make(map[string]string)
- p.funcSigns = make(map[string]bool)
- done := make(map[*types.Package]bool)
- addTypes := func(pkg *types.Package, top bool) {
- if done[pkg] {
- return
- }
- done[pkg] = true
- ifs, funs := fromScope(pkg.Scope())
- fullName := func(name string) string {
- if !top {
- return pkg.Path() + "." + name
- }
- return name
- }
- for iftype, name := range ifs {
- // only suggest exported interfaces
- if ast.IsExported(name) {
- p.ifaces[iftype] = fullName(name)
- }
- }
- for ftype := range funs {
- // ignore non-exported func signatures too
- p.funcSigns[ftype] = true
- }
- }
- for _, imp := range pkg.Imports() {
- addTypes(imp, false)
- for _, imp2 := range imp.Imports() {
- addTypes(imp2, false)
- }
- }
- addTypes(pkg, true)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/check.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/check.go
deleted file mode 100644
index f4d3b4037..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/check.go
+++ /dev/null
@@ -1,462 +0,0 @@
-// Copyright (c) 2015, Daniel Martí
-// See LICENSE for licensing information
-
-package check // import "mvdan.cc/interfacer/check"
-
-import (
- "fmt"
- "go/ast"
- "go/token"
- "go/types"
- "os"
- "strings"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-
- "github.com/kisielk/gotool"
- "mvdan.cc/lint"
-)
-
-func toDiscard(usage *varUsage) bool {
- if usage.discard {
- return true
- }
- for to := range usage.assigned {
- if toDiscard(to) {
- return true
- }
- }
- return false
-}
-
-func allCalls(usage *varUsage, all, ftypes map[string]string) {
- for fname := range usage.calls {
- all[fname] = ftypes[fname]
- }
- for to := range usage.assigned {
- allCalls(to, all, ftypes)
- }
-}
-
-func (c *Checker) interfaceMatching(param *types.Var, usage *varUsage) (string, string) {
- if toDiscard(usage) {
- return "", ""
- }
- ftypes := typeFuncMap(param.Type())
- called := make(map[string]string, len(usage.calls))
- allCalls(usage, called, ftypes)
- s := funcMapString(called)
- return c.ifaces[s], s
-}
-
-type varUsage struct {
- calls map[string]struct{}
- discard bool
-
- assigned map[*varUsage]struct{}
-}
-
-type funcDecl struct {
- astDecl *ast.FuncDecl
- ssaFn *ssa.Function
-}
-
-// CheckArgs checks the packages specified by their import paths in
-// args.
-func CheckArgs(args []string) ([]string, error) {
- paths := gotool.ImportPaths(args)
- conf := loader.Config{}
- conf.AllowErrors = true
- rest, err := conf.FromArgs(paths, false)
- if err != nil {
- return nil, err
- }
- if len(rest) > 0 {
- return nil, fmt.Errorf("unwanted extra args: %v", rest)
- }
- lprog, err := conf.Load()
- if err != nil {
- return nil, err
- }
- prog := ssautil.CreateProgram(lprog, 0)
- prog.Build()
- c := new(Checker)
- c.Program(lprog)
- c.ProgramSSA(prog)
- issues, err := c.Check()
- if err != nil {
- return nil, err
- }
- wd, err := os.Getwd()
- if err != nil {
- return nil, err
- }
- lines := make([]string, len(issues))
- for i, issue := range issues {
- fpos := prog.Fset.Position(issue.Pos()).String()
- if strings.HasPrefix(fpos, wd) {
- fpos = fpos[len(wd)+1:]
- }
- lines[i] = fmt.Sprintf("%s: %s", fpos, issue.Message())
- }
- return lines, nil
-}
-
-type Checker struct {
- lprog *loader.Program
- prog *ssa.Program
-
- pkgTypes
- *loader.PackageInfo
-
- funcs []*funcDecl
-
- ssaByPos map[token.Pos]*ssa.Function
-
- discardFuncs map[*types.Signature]struct{}
-
- vars map[*types.Var]*varUsage
-}
-
-var (
- _ lint.Checker = (*Checker)(nil)
- _ lint.WithSSA = (*Checker)(nil)
-)
-
-func (c *Checker) Program(lprog *loader.Program) {
- c.lprog = lprog
-}
-
-func (c *Checker) ProgramSSA(prog *ssa.Program) {
- c.prog = prog
-}
-
-func (c *Checker) Check() ([]lint.Issue, error) {
- var total []lint.Issue
- c.ssaByPos = make(map[token.Pos]*ssa.Function)
- wantPkg := make(map[*types.Package]bool)
- for _, pinfo := range c.lprog.InitialPackages() {
- wantPkg[pinfo.Pkg] = true
- }
- for fn := range ssautil.AllFunctions(c.prog) {
- if fn.Pkg == nil { // builtin?
- continue
- }
- if len(fn.Blocks) == 0 { // stub
- continue
- }
- if !wantPkg[fn.Pkg.Pkg] { // not part of given pkgs
- continue
- }
- c.ssaByPos[fn.Pos()] = fn
- }
- for _, pinfo := range c.lprog.InitialPackages() {
- pkg := pinfo.Pkg
- c.getTypes(pkg)
- c.PackageInfo = c.lprog.AllPackages[pkg]
- total = append(total, c.checkPkg()...)
- }
- return total, nil
-}
-
-func (c *Checker) checkPkg() []lint.Issue {
- c.discardFuncs = make(map[*types.Signature]struct{})
- c.vars = make(map[*types.Var]*varUsage)
- c.funcs = c.funcs[:0]
- findFuncs := func(node ast.Node) bool {
- decl, ok := node.(*ast.FuncDecl)
- if !ok {
- return true
- }
- ssaFn := c.ssaByPos[decl.Name.Pos()]
- if ssaFn == nil {
- return true
- }
- fd := &funcDecl{
- astDecl: decl,
- ssaFn: ssaFn,
- }
- if c.funcSigns[signString(fd.ssaFn.Signature)] {
- // implements interface
- return true
- }
- c.funcs = append(c.funcs, fd)
- ast.Walk(c, decl.Body)
- return true
- }
- for _, f := range c.Files {
- ast.Inspect(f, findFuncs)
- }
- return c.packageIssues()
-}
-
-func paramVarAndType(sign *types.Signature, i int) (*types.Var, types.Type) {
- params := sign.Params()
- extra := sign.Variadic() && i >= params.Len()-1
- if !extra {
- if i >= params.Len() {
- // builtins with multiple signatures
- return nil, nil
- }
- vr := params.At(i)
- return vr, vr.Type()
- }
- last := params.At(params.Len() - 1)
- switch x := last.Type().(type) {
- case *types.Slice:
- return nil, x.Elem()
- default:
- return nil, x
- }
-}
-
-func (c *Checker) varUsage(e ast.Expr) *varUsage {
- id, ok := e.(*ast.Ident)
- if !ok {
- return nil
- }
- param, ok := c.ObjectOf(id).(*types.Var)
- if !ok {
- // not a variable
- return nil
- }
- if usage, e := c.vars[param]; e {
- return usage
- }
- if !interesting(param.Type()) {
- return nil
- }
- usage := &varUsage{
- calls: make(map[string]struct{}),
- assigned: make(map[*varUsage]struct{}),
- }
- c.vars[param] = usage
- return usage
-}
-
-func (c *Checker) addUsed(e ast.Expr, as types.Type) {
- if as == nil {
- return
- }
- if usage := c.varUsage(e); usage != nil {
- // using variable
- iface, ok := as.Underlying().(*types.Interface)
- if !ok {
- usage.discard = true
- return
- }
- for i := 0; i < iface.NumMethods(); i++ {
- m := iface.Method(i)
- usage.calls[m.Name()] = struct{}{}
- }
- } else if t, ok := c.TypeOf(e).(*types.Signature); ok {
- // using func
- c.discardFuncs[t] = struct{}{}
- }
-}
-
-func (c *Checker) addAssign(to, from ast.Expr) {
- pto := c.varUsage(to)
- pfrom := c.varUsage(from)
- if pto == nil || pfrom == nil {
- // either isn't interesting
- return
- }
- pfrom.assigned[pto] = struct{}{}
-}
-
-func (c *Checker) discard(e ast.Expr) {
- if usage := c.varUsage(e); usage != nil {
- usage.discard = true
- }
-}
-
-func (c *Checker) comparedWith(e, with ast.Expr) {
- if _, ok := with.(*ast.BasicLit); ok {
- c.discard(e)
- }
-}
-
-func (c *Checker) Visit(node ast.Node) ast.Visitor {
- switch x := node.(type) {
- case *ast.SelectorExpr:
- if _, ok := c.TypeOf(x.Sel).(*types.Signature); !ok {
- c.discard(x.X)
- }
- case *ast.StarExpr:
- c.discard(x.X)
- case *ast.UnaryExpr:
- c.discard(x.X)
- case *ast.IndexExpr:
- c.discard(x.X)
- case *ast.IncDecStmt:
- c.discard(x.X)
- case *ast.BinaryExpr:
- switch x.Op {
- case token.EQL, token.NEQ:
- c.comparedWith(x.X, x.Y)
- c.comparedWith(x.Y, x.X)
- default:
- c.discard(x.X)
- c.discard(x.Y)
- }
- case *ast.ValueSpec:
- for _, val := range x.Values {
- c.addUsed(val, c.TypeOf(x.Type))
- }
- case *ast.AssignStmt:
- for i, val := range x.Rhs {
- left := x.Lhs[i]
- if x.Tok == token.ASSIGN {
- c.addUsed(val, c.TypeOf(left))
- }
- c.addAssign(left, val)
- }
- case *ast.CompositeLit:
- for i, e := range x.Elts {
- switch y := e.(type) {
- case *ast.KeyValueExpr:
- c.addUsed(y.Key, c.TypeOf(y.Value))
- c.addUsed(y.Value, c.TypeOf(y.Key))
- case *ast.Ident:
- c.addUsed(y, compositeIdentType(c.TypeOf(x), i))
- }
- }
- case *ast.CallExpr:
- switch y := c.TypeOf(x.Fun).Underlying().(type) {
- case *types.Signature:
- c.onMethodCall(x, y)
- default:
- // type conversion
- if len(x.Args) == 1 {
- c.addUsed(x.Args[0], y)
- }
- }
- }
- return c
-}
-
-func compositeIdentType(t types.Type, i int) types.Type {
- switch x := t.(type) {
- case *types.Named:
- return compositeIdentType(x.Underlying(), i)
- case *types.Struct:
- return x.Field(i).Type()
- case *types.Array:
- return x.Elem()
- case *types.Slice:
- return x.Elem()
- }
- return nil
-}
-
-func (c *Checker) onMethodCall(ce *ast.CallExpr, sign *types.Signature) {
- for i, e := range ce.Args {
- paramObj, t := paramVarAndType(sign, i)
- // Don't if this is a parameter being re-used as itself
- // in a recursive call
- if id, ok := e.(*ast.Ident); ok {
- if paramObj == c.ObjectOf(id) {
- continue
- }
- }
- c.addUsed(e, t)
- }
- sel, ok := ce.Fun.(*ast.SelectorExpr)
- if !ok {
- return
- }
- // receiver func call on the left side
- if usage := c.varUsage(sel.X); usage != nil {
- usage.calls[sel.Sel.Name] = struct{}{}
- }
-}
-
-func (fd *funcDecl) paramGroups() [][]*types.Var {
- astList := fd.astDecl.Type.Params.List
- groups := make([][]*types.Var, len(astList))
- signIndex := 0
- for i, field := range astList {
- group := make([]*types.Var, len(field.Names))
- for j := range field.Names {
- group[j] = fd.ssaFn.Signature.Params().At(signIndex)
- signIndex++
- }
- groups[i] = group
- }
- return groups
-}
-
-func (c *Checker) packageIssues() []lint.Issue {
- var issues []lint.Issue
- for _, fd := range c.funcs {
- if _, e := c.discardFuncs[fd.ssaFn.Signature]; e {
- continue
- }
- for _, group := range fd.paramGroups() {
- issues = append(issues, c.groupIssues(fd, group)...)
- }
- }
- return issues
-}
-
-type Issue struct {
- pos token.Pos
- msg string
-}
-
-func (i Issue) Pos() token.Pos { return i.pos }
-func (i Issue) Message() string { return i.msg }
-
-func (c *Checker) groupIssues(fd *funcDecl, group []*types.Var) []lint.Issue {
- var issues []lint.Issue
- for _, param := range group {
- usage := c.vars[param]
- if usage == nil {
- return nil
- }
- newType := c.paramNewType(fd.astDecl.Name.Name, param, usage)
- if newType == "" {
- return nil
- }
- issues = append(issues, Issue{
- pos: param.Pos(),
- msg: fmt.Sprintf("%s can be %s", param.Name(), newType),
- })
- }
- return issues
-}
-
-func willAddAllocation(t types.Type) bool {
- switch t.Underlying().(type) {
- case *types.Pointer, *types.Interface:
- return false
- }
- return true
-}
-
-func (c *Checker) paramNewType(funcName string, param *types.Var, usage *varUsage) string {
- t := param.Type()
- if !ast.IsExported(funcName) && willAddAllocation(t) {
- return ""
- }
- if named := typeNamed(t); named != nil {
- tname := named.Obj().Name()
- vname := param.Name()
- if mentionsName(funcName, tname) || mentionsName(funcName, vname) {
- return ""
- }
- }
- ifname, iftype := c.interfaceMatching(param, usage)
- if ifname == "" {
- return ""
- }
- if types.IsInterface(t.Underlying()) {
- if have := funcMapString(typeFuncMap(t)); have == iftype {
- return ""
- }
- }
- return ifname
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/types.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/types.go
deleted file mode 100644
index 393bb0b9f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/check/types.go
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (c) 2015, Daniel Martí
-// See LICENSE for licensing information
-
-package check
-
-import (
- "bytes"
- "fmt"
- "go/types"
- "sort"
- "strings"
-)
-
-type methoder interface {
- NumMethods() int
- Method(int) *types.Func
-}
-
-func methoderFuncMap(m methoder, skip bool) map[string]string {
- ifuncs := make(map[string]string, m.NumMethods())
- for i := 0; i < m.NumMethods(); i++ {
- f := m.Method(i)
- if !f.Exported() {
- if skip {
- continue
- }
- return nil
- }
- sign := f.Type().(*types.Signature)
- ifuncs[f.Name()] = signString(sign)
- }
- return ifuncs
-}
-
-func typeFuncMap(t types.Type) map[string]string {
- switch x := t.(type) {
- case *types.Pointer:
- return typeFuncMap(x.Elem())
- case *types.Named:
- u := x.Underlying()
- if types.IsInterface(u) {
- return typeFuncMap(u)
- }
- return methoderFuncMap(x, true)
- case *types.Interface:
- return methoderFuncMap(x, false)
- default:
- return nil
- }
-}
-
-func funcMapString(iface map[string]string) string {
- fnames := make([]string, 0, len(iface))
- for fname := range iface {
- fnames = append(fnames, fname)
- }
- sort.Strings(fnames)
- var b bytes.Buffer
- for i, fname := range fnames {
- if i > 0 {
- fmt.Fprint(&b, "; ")
- }
- fmt.Fprint(&b, fname, iface[fname])
- }
- return b.String()
-}
-
-func tupleJoin(buf *bytes.Buffer, t *types.Tuple) {
- buf.WriteByte('(')
- for i := 0; i < t.Len(); i++ {
- if i > 0 {
- buf.WriteString(", ")
- }
- buf.WriteString(t.At(i).Type().String())
- }
- buf.WriteByte(')')
-}
-
-// signString is similar to Signature.String(), but it ignores
-// param/result names.
-func signString(sign *types.Signature) string {
- var buf bytes.Buffer
- tupleJoin(&buf, sign.Params())
- tupleJoin(&buf, sign.Results())
- return buf.String()
-}
-
-func interesting(t types.Type) bool {
- switch x := t.(type) {
- case *types.Interface:
- return x.NumMethods() > 1
- case *types.Named:
- if u := x.Underlying(); types.IsInterface(u) {
- return interesting(u)
- }
- return x.NumMethods() >= 1
- case *types.Pointer:
- return interesting(x.Elem())
- default:
- return false
- }
-}
-
-func anyInteresting(params *types.Tuple) bool {
- for i := 0; i < params.Len(); i++ {
- t := params.At(i).Type()
- if interesting(t) {
- return true
- }
- }
- return false
-}
-
-func fromScope(scope *types.Scope) (ifaces map[string]string, funcs map[string]bool) {
- ifaces = make(map[string]string)
- funcs = make(map[string]bool)
- for _, name := range scope.Names() {
- tn, ok := scope.Lookup(name).(*types.TypeName)
- if !ok {
- continue
- }
- switch x := tn.Type().Underlying().(type) {
- case *types.Interface:
- iface := methoderFuncMap(x, false)
- if len(iface) == 0 {
- continue
- }
- for i := 0; i < x.NumMethods(); i++ {
- f := x.Method(i)
- sign := f.Type().(*types.Signature)
- if !anyInteresting(sign.Params()) {
- continue
- }
- funcs[signString(sign)] = true
- }
- s := funcMapString(iface)
- if _, e := ifaces[s]; !e {
- ifaces[s] = tn.Name()
- }
- case *types.Signature:
- if !anyInteresting(x.Params()) {
- continue
- }
- funcs[signString(x)] = true
- }
- }
- return ifaces, funcs
-}
-
-func mentionsName(fname, name string) bool {
- if len(name) < 2 {
- return false
- }
- capit := strings.ToUpper(name[:1]) + name[1:]
- lower := strings.ToLower(name)
- return strings.Contains(fname, capit) || strings.HasPrefix(fname, lower)
-}
-
-func typeNamed(t types.Type) *types.Named {
- for {
- switch x := t.(type) {
- case *types.Named:
- return x
- case *types.Pointer:
- t = x.Elem()
- default:
- return nil
- }
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/main.go
deleted file mode 100644
index bc86977a1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/interfacer/main.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2015, Daniel Martí
-// See LICENSE for licensing information
-
-package main // import "mvdan.cc/interfacer"
-
-import (
- "flag"
- "fmt"
- "os"
-
- "mvdan.cc/interfacer/check"
-)
-
-var _ = flag.Bool("v", false, "print the names of packages as they are checked")
-
-func main() {
- flag.Parse()
- lines, err := check.CheckArgs(flag.Args())
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- for _, line := range lines {
- fmt.Println(line)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/LICENSE
deleted file mode 100644
index a06c5ebfc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2017, Daniel Martí. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of the copyright holder nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 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/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/cmd/metalint/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/cmd/metalint/main.go
deleted file mode 100644
index ca1646e6f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/cmd/metalint/main.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (c) 2017, Daniel Martí
-// See LICENSE for licensing information
-
-package main // import "mvdan.cc/lint/cmd/metalint"
-
-import (
- "flag"
- "fmt"
- "os"
- "strings"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-
- "mvdan.cc/lint"
-
- "github.com/kisielk/gotool"
-
- interfacer "mvdan.cc/interfacer/check"
- unparam "mvdan.cc/unparam/check"
-)
-
-var tests = flag.Bool("tests", false, "include tests")
-
-func main() {
- flag.Parse()
- if err := runLinters(flag.Args()...); err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
-}
-
-var linters = [...]struct {
- name string
- checker lint.Checker
-}{
- {"unparam", &unparam.Checker{}},
- {"interfacer", &interfacer.Checker{}},
-}
-
-type metaChecker struct {
- wd string
-
- lprog *loader.Program
- prog *ssa.Program
-}
-
-func runLinters(args ...string) error {
- paths := gotool.ImportPaths(args)
- wd, err := os.Getwd()
- if err != nil {
- return err
- }
- c := &metaChecker{wd: wd}
- var conf loader.Config
- if _, err := conf.FromArgs(paths, *tests); err != nil {
- return err
- }
- if c.lprog, err = conf.Load(); err != nil {
- return err
- }
- for _, l := range linters {
- l.checker.Program(c.lprog)
- if ssaChecker, ok := l.checker.(lint.WithSSA); ok {
- if c.prog == nil {
- c.prog = ssautil.CreateProgram(c.lprog, 0)
- c.prog.Build()
- }
- ssaChecker.ProgramSSA(c.prog)
- }
- issues, err := l.checker.Check()
- if err != nil {
- return err
- }
- c.printIssues(l.name, issues)
- }
- return nil
-}
-
-func (c *metaChecker) printIssues(name string, issues []lint.Issue) {
- for _, issue := range issues {
- fpos := c.lprog.Fset.Position(issue.Pos()).String()
- if strings.HasPrefix(fpos, c.wd) {
- fpos = fpos[len(c.wd)+1:]
- }
- fmt.Printf("%s: %s (%s)\n", fpos, issue.Message(), name)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/lint.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/lint.go
deleted file mode 100644
index a16789fad..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/lint/lint.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2017, Daniel Martí
-// See LICENSE for licensing information
-
-// Package lint defines common interfaces for Go code checkers.
-package lint // import "mvdan.cc/lint"
-
-import (
- "go/token"
-
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
-)
-
-// A Checker points out issues in a program.
-type Checker interface {
- Program(*loader.Program)
- Check() ([]Issue, error)
-}
-
-type WithSSA interface {
- ProgramSSA(*ssa.Program)
-}
-
-// Issue represents an issue somewhere in a source code file.
-type Issue interface {
- Pos() token.Pos
- Message() string
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/LICENSE
deleted file mode 100644
index a06c5ebfc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2017, Daniel Martí. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of the copyright holder nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 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/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/check/check.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/check/check.go
deleted file mode 100644
index e9c2a99d1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/check/check.go
+++ /dev/null
@@ -1,458 +0,0 @@
-// Copyright (c) 2017, Daniel Martí
-// See LICENSE for licensing information
-
-// Package check implements the unparam linter. Note that its API is not
-// stable.
-package check // import "mvdan.cc/unparam/check"
-
-import (
- "fmt"
- "go/ast"
- "go/constant"
- "go/parser"
- "go/token"
- "go/types"
- "io"
- "os"
- "path/filepath"
- "regexp"
- "sort"
- "strings"
-
- "golang.org/x/tools/go/callgraph"
- "golang.org/x/tools/go/callgraph/cha"
- "golang.org/x/tools/go/loader"
- "golang.org/x/tools/go/ssa"
- "golang.org/x/tools/go/ssa/ssautil"
-
- "github.com/kisielk/gotool"
- "mvdan.cc/lint"
-)
-
-func UnusedParams(tests, debug bool, args ...string) ([]string, error) {
- wd, err := os.Getwd()
- if err != nil {
- return nil, err
- }
- c := &Checker{
- wd: wd,
- tests: tests,
- }
- if debug {
- c.debugLog = os.Stderr
- }
- return c.lines(args...)
-}
-
-type Checker struct {
- lprog *loader.Program
- prog *ssa.Program
-
- wd string
-
- tests bool
- debugLog io.Writer
-
- cachedDeclCounts map[string]map[string]int
-}
-
-var (
- _ lint.Checker = (*Checker)(nil)
- _ lint.WithSSA = (*Checker)(nil)
-
- skipValue = new(ssa.Value)
-)
-
-func (c *Checker) lines(args ...string) ([]string, error) {
- paths := gotool.ImportPaths(args)
- var conf loader.Config
- if _, err := conf.FromArgs(paths, c.tests); err != nil {
- return nil, err
- }
- lprog, err := conf.Load()
- if err != nil {
- return nil, err
- }
- prog := ssautil.CreateProgram(lprog, 0)
- prog.Build()
- c.Program(lprog)
- c.ProgramSSA(prog)
- issues, err := c.Check()
- if err != nil {
- return nil, err
- }
- lines := make([]string, len(issues))
- for i, issue := range issues {
- fpos := prog.Fset.Position(issue.Pos()).String()
- if strings.HasPrefix(fpos, c.wd) {
- fpos = fpos[len(c.wd)+1:]
- }
- lines[i] = fmt.Sprintf("%s: %s", fpos, issue.Message())
- }
- return lines, nil
-}
-
-type Issue struct {
- pos token.Pos
- msg string
-}
-
-func (i Issue) Pos() token.Pos { return i.pos }
-func (i Issue) Message() string { return i.msg }
-
-func (c *Checker) Program(lprog *loader.Program) {
- c.lprog = lprog
-}
-
-func (c *Checker) ProgramSSA(prog *ssa.Program) {
- c.prog = prog
-}
-
-func (c *Checker) debug(format string, a ...interface{}) {
- if c.debugLog != nil {
- fmt.Fprintf(c.debugLog, format, a...)
- }
-}
-
-func (c *Checker) Check() ([]lint.Issue, error) {
- c.cachedDeclCounts = make(map[string]map[string]int)
- wantPkg := make(map[*types.Package]*loader.PackageInfo)
- for _, info := range c.lprog.InitialPackages() {
- wantPkg[info.Pkg] = info
- }
- cg := cha.CallGraph(c.prog)
-
- var issues []lint.Issue
-funcLoop:
- for fn := range ssautil.AllFunctions(c.prog) {
- if fn.Pkg == nil { // builtin?
- continue
- }
- if len(fn.Blocks) == 0 { // stub
- continue
- }
- info := wantPkg[fn.Pkg.Pkg]
- if info == nil { // not part of given pkgs
- continue
- }
- c.debug("func %s\n", fn.String())
- if dummyImpl(fn.Blocks[0]) { // panic implementation
- c.debug(" skip - dummy implementation\n")
- continue
- }
- for _, edge := range cg.Nodes[fn].In {
- switch edge.Site.Common().Value.(type) {
- case *ssa.Function:
- default:
- // called via a parameter or field, type
- // is set in stone.
- c.debug(" skip - type is required via call\n")
- continue funcLoop
- }
- }
- if c.multipleImpls(info, fn) {
- c.debug(" skip - multiple implementations via build tags\n")
- continue
- }
-
- callers := cg.Nodes[fn].In
- results := fn.Signature.Results()
- // skip exported funcs, as well as those that are
- // entirely unused
- if !ast.IsExported(fn.Name()) && len(callers) > 0 {
- resLoop:
- for i := 0; i < results.Len(); i++ {
- for _, edge := range callers {
- val := edge.Site.Value()
- if val == nil { // e.g. go statement
- continue
- }
- for _, instr := range *val.Referrers() {
- extract, ok := instr.(*ssa.Extract)
- if !ok {
- continue resLoop // direct, real use
- }
- if extract.Index != i {
- continue // not the same result param
- }
- if len(*extract.Referrers()) > 0 {
- continue resLoop // real use after extraction
- }
- }
- }
- res := results.At(i)
- name := paramDesc(i, res)
- issues = append(issues, Issue{
- pos: res.Pos(),
- msg: fmt.Sprintf("result %s is never used", name),
- })
- }
- }
-
- seen := make([]constant.Value, results.Len())
- numRets := 0
- for _, block := range fn.Blocks {
- last := block.Instrs[len(block.Instrs)-1]
- ret, ok := last.(*ssa.Return)
- if !ok {
- continue
- }
- for i, val := range ret.Results {
- cnst, ok := val.(*ssa.Const)
- switch {
- case !ok:
- seen[i] = nil
- case numRets == 0:
- seen[i] = cnst.Value
- case seen[i] == nil:
- case !constant.Compare(seen[i], token.EQL, cnst.Value):
- seen[i] = nil
- }
- }
- numRets++
- }
- if numRets > 1 {
- for i, val := range seen {
- if val == nil {
- continue
- }
- res := results.At(i)
- name := paramDesc(i, res)
- issues = append(issues, Issue{
- pos: res.Pos(),
- msg: fmt.Sprintf("result %s is always %s", name, val.String()),
- })
- }
- }
-
- for i, par := range fn.Params {
- if i == 0 && fn.Signature.Recv() != nil { // receiver
- continue
- }
- c.debug("%s\n", par.String())
- switch par.Object().Name() {
- case "", "_": // unnamed
- c.debug(" skip - unnamed\n")
- continue
- }
- reason := "is unused"
- if cv := receivesSameValue(cg.Nodes[fn].In, par, i); cv != nil {
- reason = fmt.Sprintf("always receives %v", cv)
- } else if anyRealUse(par, i) {
- c.debug(" skip - used somewhere in the func body\n")
- continue
- }
- issues = append(issues, Issue{
- pos: par.Pos(),
- msg: fmt.Sprintf("%s %s", par.Name(), reason),
- })
- }
-
- }
- // TODO: replace by sort.Slice once we drop Go 1.7 support
- sort.Sort(byNamePos{c.prog.Fset, issues})
- return issues, nil
-}
-
-type byNamePos struct {
- fset *token.FileSet
- l []lint.Issue
-}
-
-func (p byNamePos) Len() int { return len(p.l) }
-func (p byNamePos) Swap(i, j int) { p.l[i], p.l[j] = p.l[j], p.l[i] }
-func (p byNamePos) Less(i, j int) bool {
- p1 := p.fset.Position(p.l[i].Pos())
- p2 := p.fset.Position(p.l[j].Pos())
- if p1.Filename == p2.Filename {
- return p1.Offset < p2.Offset
- }
- return p1.Filename < p2.Filename
-}
-
-func receivesSameValue(in []*callgraph.Edge, par *ssa.Parameter, pos int) constant.Value {
- if ast.IsExported(par.Parent().Name()) {
- // we might not have all call sites for an exported func
- return nil
- }
- var seen constant.Value
- for _, edge := range in {
- call := edge.Site.Common()
- cnst, ok := call.Args[pos].(*ssa.Const)
- if !ok {
- return nil // not a constant
- }
- if seen == nil {
- seen = cnst.Value // first constant
- } else if !constant.Compare(seen, token.EQL, cnst.Value) {
- return nil // different constants
- }
- }
- return seen
-}
-
-func anyRealUse(par *ssa.Parameter, pos int) bool {
-refLoop:
- for _, ref := range *par.Referrers() {
- switch x := ref.(type) {
- case *ssa.Call:
- if x.Call.Value != par.Parent() {
- return true // not a recursive call
- }
- for i, arg := range x.Call.Args {
- if arg != par {
- continue
- }
- if i == pos {
- // reused directly in a recursive call
- continue refLoop
- }
- }
- return true
- case *ssa.Store:
- if insertedStore(x) {
- continue // inserted by go/ssa, not from the code
- }
- return true
- default:
- return true
- }
- }
- return false
-}
-
-func insertedStore(instr ssa.Instruction) bool {
- if instr.Pos() != token.NoPos {
- return false
- }
- store, ok := instr.(*ssa.Store)
- if !ok {
- return false
- }
- alloc, ok := store.Addr.(*ssa.Alloc)
- // we want exactly one use of this alloc value for it to be
- // inserted by ssa and dummy - the alloc instruction itself.
- return ok && len(*alloc.Referrers()) == 1
-}
-
-var rxHarmlessCall = regexp.MustCompile(`(?i)\b(log(ger)?|errors)\b|\bf?print`)
-
-// dummyImpl reports whether a block is a dummy implementation. This is
-// true if the block will almost immediately panic, throw or return
-// constants only.
-func dummyImpl(blk *ssa.BasicBlock) bool {
- var ops [8]*ssa.Value
- for _, instr := range blk.Instrs {
- if insertedStore(instr) {
- continue // inserted by go/ssa, not from the code
- }
- for _, val := range instr.Operands(ops[:0]) {
- switch x := (*val).(type) {
- case nil, *ssa.Const, *ssa.ChangeType, *ssa.Alloc,
- *ssa.MakeInterface, *ssa.Function,
- *ssa.Global, *ssa.IndexAddr, *ssa.Slice,
- *ssa.UnOp:
- case *ssa.Call:
- if rxHarmlessCall.MatchString(x.Call.Value.String()) {
- continue
- }
- default:
- return false
- }
- }
- switch x := instr.(type) {
- case *ssa.Alloc, *ssa.Store, *ssa.UnOp, *ssa.BinOp,
- *ssa.MakeInterface, *ssa.MakeMap, *ssa.Extract,
- *ssa.IndexAddr, *ssa.FieldAddr, *ssa.Slice,
- *ssa.Lookup, *ssa.ChangeType, *ssa.TypeAssert,
- *ssa.Convert, *ssa.ChangeInterface:
- // non-trivial expressions in panic/log/print
- // calls
- case *ssa.Return, *ssa.Panic:
- return true
- case *ssa.Call:
- if rxHarmlessCall.MatchString(x.Call.Value.String()) {
- continue
- }
- return x.Call.Value.Name() == "throw" // runtime's panic
- default:
- return false
- }
- }
- return false
-}
-
-func (c *Checker) declCounts(pkgDir string, pkgName string) map[string]int {
- if m := c.cachedDeclCounts[pkgDir]; m != nil {
- return m
- }
- fset := token.NewFileSet()
- pkgs, err := parser.ParseDir(fset, pkgDir, nil, 0)
- if err != nil {
- panic(err.Error())
- return nil
- }
- pkg := pkgs[pkgName]
- count := make(map[string]int)
- for _, file := range pkg.Files {
- for _, decl := range file.Decls {
- fd, _ := decl.(*ast.FuncDecl)
- if fd == nil {
- continue
- }
- name := astPrefix(fd.Recv) + fd.Name.Name
- count[name]++
- }
- }
- c.cachedDeclCounts[pkgDir] = count
- return count
-}
-
-func astPrefix(recv *ast.FieldList) string {
- if recv == nil {
- return ""
- }
- expr := recv.List[0].Type
- for {
- star, _ := expr.(*ast.StarExpr)
- if star == nil {
- break
- }
- expr = star.X
- }
- id := expr.(*ast.Ident)
- return id.Name + "."
-}
-
-func (c *Checker) multipleImpls(info *loader.PackageInfo, fn *ssa.Function) bool {
- if fn.Parent() != nil { // nested func
- return false
- }
- path := c.prog.Fset.Position(fn.Pos()).Filename
- if path == "" { // generated func, like init
- return false
- }
- count := c.declCounts(filepath.Dir(path), info.Pkg.Name())
- name := fn.Name()
- if fn.Signature.Recv() != nil {
- tp := fn.Params[0].Type()
- for {
- point, _ := tp.(*types.Pointer)
- if point == nil {
- break
- }
- tp = point.Elem()
- }
- named := tp.(*types.Named)
- name = named.Obj().Name() + "." + name
- }
- return count[name] > 1
-}
-
-func paramDesc(i int, v *types.Var) string {
- name := v.Name()
- if name != "" {
- return name
- }
- return fmt.Sprintf("%d (%s)", i, v.Type().String())
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/main.go b/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/main.go
deleted file mode 100644
index 524736df7..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/_linters/src/mvdan.cc/unparam/main.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2017, Daniel Martí
-// See LICENSE for licensing information
-
-package main // import "mvdan.cc/unparam"
-
-import (
- "flag"
- "fmt"
- "os"
-
- "mvdan.cc/unparam/check"
-)
-
-var (
- tests = flag.Bool("tests", true, "include tests")
- debug = flag.Bool("debug", false, "debug prints")
-)
-
-func main() {
- flag.Usage = func() {
- fmt.Fprintln(os.Stderr, "usage: unparam [flags] [package ...]")
- flag.PrintDefaults()
- }
- flag.Parse()
- warns, err := check.UnusedParams(*tests, *debug, flag.Args()...)
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- for _, warn := range warns {
- fmt.Println(warn)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/aggregate.go b/vendor/src/github.com/alecthomas/gometalinter/aggregate.go
deleted file mode 100644
index 1017891c6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/aggregate.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package main
-
-import (
- "sort"
- "strings"
-)
-
-type issueKey struct {
- path string
- line, col int
- message string
-}
-
-type multiIssue struct {
- *Issue
- linterNames []string
-}
-
-// AggregateIssueChan reads issues from a channel, aggregates issues which have
-// the same file, line, vol, and message, and returns aggregated issues on
-// a new channel.
-func AggregateIssueChan(issues chan *Issue) chan *Issue {
- out := make(chan *Issue, 1000000)
- issueMap := make(map[issueKey]*multiIssue)
- go func() {
- for issue := range issues {
- key := issueKey{
- path: issue.Path.String(),
- line: issue.Line,
- col: issue.Col,
- message: issue.Message,
- }
- if existing, ok := issueMap[key]; ok {
- existing.linterNames = append(existing.linterNames, issue.Linter)
- } else {
- issueMap[key] = &multiIssue{
- Issue: issue,
- linterNames: []string{issue.Linter},
- }
- }
- }
- for _, multi := range issueMap {
- issue := multi.Issue
- sort.Strings(multi.linterNames)
- issue.Linter = strings.Join(multi.linterNames, ", ")
- out <- issue
- }
- close(out)
- }()
- return out
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/checkstyle.go b/vendor/src/github.com/alecthomas/gometalinter/checkstyle.go
deleted file mode 100644
index 52ff23964..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/checkstyle.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package main
-
-import (
- "encoding/xml"
- "fmt"
-
- kingpin "gopkg.in/alecthomas/kingpin.v3-unstable"
-)
-
-type checkstyleOutput struct {
- XMLName xml.Name `xml:"checkstyle"`
- Version string `xml:"version,attr"`
- Files []*checkstyleFile `xml:"file"`
-}
-
-type checkstyleFile struct {
- Name string `xml:"name,attr"`
- Errors []*checkstyleError `xml:"error"`
-}
-
-type checkstyleError struct {
- Column int `xml:"column,attr"`
- Line int `xml:"line,attr"`
- Message string `xml:"message,attr"`
- Severity string `xml:"severity,attr"`
- Source string `xml:"source,attr"`
-}
-
-func outputToCheckstyle(issues chan *Issue) int {
- var lastFile *checkstyleFile
- out := checkstyleOutput{
- Version: "5.0",
- }
- status := 0
- for issue := range issues {
- path := issue.Path.Relative()
- if lastFile != nil && lastFile.Name != path {
- out.Files = append(out.Files, lastFile)
- lastFile = nil
- }
- if lastFile == nil {
- lastFile = &checkstyleFile{Name: path}
- }
-
- if config.Errors && issue.Severity != Error {
- continue
- }
-
- lastFile.Errors = append(lastFile.Errors, &checkstyleError{
- Column: issue.Col,
- Line: issue.Line,
- Message: issue.Message,
- Severity: string(issue.Severity),
- Source: issue.Linter,
- })
- status = 1
- }
- if lastFile != nil {
- out.Files = append(out.Files, lastFile)
- }
- d, err := xml.Marshal(&out)
- kingpin.FatalIfError(err, "")
- fmt.Printf("%s%s\n", xml.Header, d)
- return status
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/config.go b/vendor/src/github.com/alecthomas/gometalinter/config.go
deleted file mode 100644
index 603c1b62c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/config.go
+++ /dev/null
@@ -1,139 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "runtime"
- "text/template"
- "time"
-)
-
-// Config for gometalinter. This can be loaded from a JSON file with --config.
-type Config struct { // nolint: maligned
- // A map from linter name -> .
- //
- // For backwards compatibility, the value stored in the JSON blob can also
- // be a string of the form ":".
- Linters map[string]StringOrLinterConfig
-
- // The set of linters that should be enabled.
- Enable []string
- Disable []string
-
- // A map of linter name to message that is displayed. This is useful when linters display text
- // that is useful only in isolation, such as errcheck which just reports the construct.
- MessageOverride map[string]string
- Severity map[string]string
- VendoredLinters bool
- Format string
- Fast bool
- Install bool
- Update bool
- Force bool
- DownloadOnly bool
- Debug bool
- Concurrency int
- Exclude []string
- Include []string
- Skip []string
- Vendor bool
- Cyclo int
- LineLength int
- MisspellLocale string
- MinConfidence float64
- MinOccurrences int
- MinConstLength int
- DuplThreshold int
- Sort []string
- Test bool
- Deadline jsonDuration
- Errors bool
- JSON bool
- Checkstyle bool
- EnableGC bool
- Aggregate bool
- EnableAll bool
-
- // Warn if a nolint directive was never matched to a linter issue
- WarnUnmatchedDirective bool
-
- formatTemplate *template.Template
-}
-
-type StringOrLinterConfig LinterConfig
-
-func (c *StringOrLinterConfig) UnmarshalJSON(raw []byte) error {
- var linterConfig LinterConfig
- // first try to un-marshall directly into struct
- origErr := json.Unmarshal(raw, &linterConfig)
- if origErr == nil {
- *c = StringOrLinterConfig(linterConfig)
- return nil
- }
-
- // i.e. bytes didn't represent the struct, treat them as a string
- var linterSpec string
- if err := json.Unmarshal(raw, &linterSpec); err != nil {
- return origErr
- }
- linter, err := parseLinterConfigSpec("", linterSpec)
- if err != nil {
- return err
- }
- *c = StringOrLinterConfig(linter)
- return nil
-}
-
-type jsonDuration time.Duration
-
-func (td *jsonDuration) UnmarshalJSON(raw []byte) error {
- var durationAsString string
- if err := json.Unmarshal(raw, &durationAsString); err != nil {
- return err
- }
- duration, err := time.ParseDuration(durationAsString)
- *td = jsonDuration(duration)
- return err
-}
-
-// Duration returns the value as a time.Duration
-func (td *jsonDuration) Duration() time.Duration {
- return time.Duration(*td)
-}
-
-var sortKeys = []string{"none", "path", "line", "column", "severity", "message", "linter"}
-
-// Configuration defaults.
-var config = &Config{
- Format: DefaultIssueFormat,
-
- Linters: map[string]StringOrLinterConfig{},
- Severity: map[string]string{
- "gotype": "error",
- "gotypex": "error",
- "test": "error",
- "testify": "error",
- "vet": "error",
- },
- MessageOverride: map[string]string{
- "errcheck": "error return value not checked ({message})",
- "gocyclo": "cyclomatic complexity {cyclo} of function {function}() is high (> {mincyclo})",
- "gofmt": "file is not gofmted with -s",
- "goimports": "file is not goimported",
- "safesql": "potentially unsafe SQL statement",
- "structcheck": "unused struct field {message}",
- "unparam": "parameter {message}",
- "varcheck": "unused variable or constant {message}",
- },
- Enable: defaultEnabled(),
- VendoredLinters: true,
- Concurrency: runtime.NumCPU(),
- Cyclo: 10,
- LineLength: 80,
- MisspellLocale: "",
- MinConfidence: 0.8,
- MinOccurrences: 3,
- MinConstLength: 3,
- DuplThreshold: 50,
- Sort: []string{"none"},
- Deadline: jsonDuration(time.Second * 30),
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/config_test.go b/vendor/src/github.com/alecthomas/gometalinter/config_test.go
deleted file mode 100644
index f7a4e9378..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/config_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestLinterConfigUnmarshalJSON(t *testing.T) {
- source := `{
- "Command": "/bin/custom",
- "PartitionStrategy": "directories"
- }`
- var config StringOrLinterConfig
- err := json.Unmarshal([]byte(source), &config)
- require.NoError(t, err)
- assert.Equal(t, "/bin/custom", config.Command)
- assert.Equal(t, functionName(partitionPathsAsDirectories), functionName(config.PartitionStrategy))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/directives.go b/vendor/src/github.com/alecthomas/gometalinter/directives.go
deleted file mode 100644
index 45d322e1e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/directives.go
+++ /dev/null
@@ -1,226 +0,0 @@
-package main
-
-import (
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- "os"
- "sort"
- "strings"
- "sync"
- "time"
-)
-
-type ignoredRange struct {
- col int
- start, end int
- linters []string
- matched bool
-}
-
-func (i *ignoredRange) matches(issue *Issue) bool {
- if issue.Line < i.start || issue.Line > i.end {
- return false
- }
- if len(i.linters) == 0 {
- return true
- }
- for _, l := range i.linters {
- if l == issue.Linter {
- return true
- }
- }
- return false
-}
-
-func (i *ignoredRange) near(col, start int) bool {
- return col == i.col && i.end == start-1
-}
-
-func (i *ignoredRange) String() string {
- linters := strings.Join(i.linters, ",")
- if len(i.linters) == 0 {
- linters = "all"
- }
- return fmt.Sprintf("%s:%d-%d", linters, i.start, i.end)
-}
-
-type ignoredRanges []*ignoredRange
-
-func (ir ignoredRanges) Len() int { return len(ir) }
-func (ir ignoredRanges) Swap(i, j int) { ir[i], ir[j] = ir[j], ir[i] }
-func (ir ignoredRanges) Less(i, j int) bool { return ir[i].end < ir[j].end }
-
-type directiveParser struct {
- lock sync.Mutex
- files map[string]ignoredRanges
- fset *token.FileSet
-}
-
-func newDirectiveParser() *directiveParser {
- return &directiveParser{
- files: map[string]ignoredRanges{},
- fset: token.NewFileSet(),
- }
-}
-
-// IsIgnored returns true if the given linter issue is ignored by a linter directive.
-func (d *directiveParser) IsIgnored(issue *Issue) bool {
- d.lock.Lock()
- path := issue.Path.Relative()
- ranges, ok := d.files[path]
- if !ok {
- ranges = d.parseFile(path)
- sort.Sort(ranges)
- d.files[path] = ranges
- }
- d.lock.Unlock()
- for _, r := range ranges {
- if r.matches(issue) {
- debug("nolint: matched %s to issue %s", r, issue)
- r.matched = true
- return true
- }
- }
- return false
-}
-
-// Unmatched returns all the ranges which were never used to ignore an issue
-func (d *directiveParser) Unmatched() map[string]ignoredRanges {
- unmatched := map[string]ignoredRanges{}
- for path, ranges := range d.files {
- for _, ignore := range ranges {
- if !ignore.matched {
- unmatched[path] = append(unmatched[path], ignore)
- }
- }
- }
- return unmatched
-}
-
-// LoadFiles from a list of directories
-func (d *directiveParser) LoadFiles(paths []string) error {
- d.lock.Lock()
- defer d.lock.Unlock()
- filenames, err := pathsToFileGlobs(paths)
- if err != nil {
- return err
- }
- for _, filename := range filenames {
- ranges := d.parseFile(filename)
- sort.Sort(ranges)
- d.files[filename] = ranges
- }
- return nil
-}
-
-// Takes a set of ignoredRanges, determines if they immediately precede a statement
-// construct, and expands the range to include that construct. Why? So you can
-// precede a function or struct with //nolint
-type rangeExpander struct {
- fset *token.FileSet
- ranges ignoredRanges
-}
-
-func (a *rangeExpander) Visit(node ast.Node) ast.Visitor {
- if node == nil {
- return a
- }
- startPos := a.fset.Position(node.Pos())
- start := startPos.Line
- end := a.fset.Position(node.End()).Line
- found := sort.Search(len(a.ranges), func(i int) bool {
- return a.ranges[i].end+1 >= start
- })
- if found < len(a.ranges) && a.ranges[found].near(startPos.Column, start) {
- r := a.ranges[found]
- if r.start > start {
- r.start = start
- }
- if r.end < end {
- r.end = end
- }
- }
- return a
-}
-
-func (d *directiveParser) parseFile(path string) ignoredRanges {
- start := time.Now()
- debug("nolint: parsing %s for directives", path)
- file, err := parser.ParseFile(d.fset, path, nil, parser.ParseComments)
- if err != nil {
- debug("nolint: failed to parse %q: %s", path, err)
- return nil
- }
- ranges := extractCommentGroupRange(d.fset, file.Comments...)
- visitor := &rangeExpander{fset: d.fset, ranges: ranges}
- ast.Walk(visitor, file)
- debug("nolint: parsing %s took %s", path, time.Since(start))
- return visitor.ranges
-}
-
-func extractCommentGroupRange(fset *token.FileSet, comments ...*ast.CommentGroup) (ranges ignoredRanges) {
- for _, g := range comments {
- for _, c := range g.List {
- text := strings.TrimLeft(c.Text, "/ ")
- var linters []string
- if strings.HasPrefix(text, "nolint") {
- if strings.HasPrefix(text, "nolint:") {
- for _, linter := range strings.Split(text[7:], ",") {
- linters = append(linters, strings.TrimSpace(linter))
- }
- }
- pos := fset.Position(g.Pos())
- rng := &ignoredRange{
- col: pos.Column,
- start: pos.Line,
- end: fset.Position(g.End()).Line,
- linters: linters,
- }
- ranges = append(ranges, rng)
- }
- }
- }
- return
-}
-
-func filterIssuesViaDirectives(directives *directiveParser, issues chan *Issue) chan *Issue {
- out := make(chan *Issue, 1000000)
- go func() {
- for issue := range issues {
- if !directives.IsIgnored(issue) {
- out <- issue
- }
- }
-
- if config.WarnUnmatchedDirective {
- for _, issue := range warnOnUnusedDirective(directives) {
- out <- issue
- }
- }
- close(out)
- }()
- return out
-}
-
-func warnOnUnusedDirective(directives *directiveParser) []*Issue {
- out := []*Issue{}
-
- cwd, err := os.Getwd()
- if err != nil {
- warning("failed to get working directory %s", err)
- }
-
- for path, ranges := range directives.Unmatched() {
- for _, ignore := range ranges {
- issue, _ := NewIssue("nolint", config.formatTemplate)
- issue.Path = newIssuePath(cwd, path)
- issue.Line = ignore.start
- issue.Col = ignore.col
- issue.Message = "nolint directive did not match any issue"
- out = append(out, issue)
- }
- }
- return out
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/directives_test.go b/vendor/src/github.com/alecthomas/gometalinter/directives_test.go
deleted file mode 100644
index f0e3b267b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/directives_test.go
+++ /dev/null
@@ -1,42 +0,0 @@
-package main
-
-import (
- "testing"
-
- "github.com/stretchr/testify/assert"
-)
-
-func TestIgnoreRangeMatch(t *testing.T) {
- var testcases = []struct {
- doc string
- issue Issue
- linters []string
- expected bool
- }{
- {
- doc: "unmatched line",
- issue: Issue{Line: 100},
- },
- {
- doc: "matched line, all linters",
- issue: Issue{Line: 5},
- expected: true,
- },
- {
- doc: "matched line, unmatched linter",
- issue: Issue{Line: 5},
- linters: []string{"vet"},
- },
- {
- doc: "matched line and linters",
- issue: Issue{Line: 20, Linter: "vet"},
- linters: []string{"vet"},
- expected: true,
- },
- }
-
- for _, testcase := range testcases {
- ir := ignoredRange{col: 20, start: 5, end: 20, linters: testcase.linters}
- assert.Equal(t, testcase.expected, ir.matches(&testcase.issue), testcase.doc)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/execute.go b/vendor/src/github.com/alecthomas/gometalinter/execute.go
deleted file mode 100644
index da9eb5f3b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/execute.go
+++ /dev/null
@@ -1,290 +0,0 @@
-package main
-
-import (
- "bytes"
- "fmt"
- "os"
- "os/exec"
- "reflect"
- "regexp"
- "strconv"
- "strings"
- "sync"
- "time"
-
- "github.com/google/shlex"
- kingpin "gopkg.in/alecthomas/kingpin.v3-unstable"
-)
-
-type Vars map[string]string
-
-func (v Vars) Copy() Vars {
- out := Vars{}
- for k, v := range v {
- out[k] = v
- }
- return out
-}
-
-func (v Vars) Replace(s string) string {
- for k, v := range v {
- prefix := regexp.MustCompile(fmt.Sprintf("{%s=([^}]*)}", k))
- if v != "" {
- s = prefix.ReplaceAllString(s, "$1")
- } else {
- s = prefix.ReplaceAllString(s, "")
- }
- s = strings.Replace(s, fmt.Sprintf("{%s}", k), v, -1)
- }
- return s
-}
-
-type linterState struct {
- *Linter
- issues chan *Issue
- vars Vars
- exclude *regexp.Regexp
- include *regexp.Regexp
- deadline <-chan time.Time
-}
-
-func (l *linterState) Partitions(paths []string) ([][]string, error) {
- cmdArgs, err := parseCommand(l.command())
- if err != nil {
- return nil, err
- }
- parts, err := l.Linter.PartitionStrategy(cmdArgs, paths)
- if err != nil {
- return nil, err
- }
- return parts, nil
-}
-
-func (l *linterState) command() string {
- return l.vars.Replace(l.Command)
-}
-
-func runLinters(linters map[string]*Linter, paths []string, concurrency int, exclude, include *regexp.Regexp) (chan *Issue, chan error) {
- errch := make(chan error, len(linters))
- concurrencych := make(chan bool, concurrency)
- incomingIssues := make(chan *Issue, 1000000)
-
- directiveParser := newDirectiveParser()
- if config.WarnUnmatchedDirective {
- directiveParser.LoadFiles(paths)
- }
-
- processedIssues := maybeSortIssues(filterIssuesViaDirectives(
- directiveParser, maybeAggregateIssues(incomingIssues)))
-
- vars := Vars{
- "duplthreshold": fmt.Sprintf("%d", config.DuplThreshold),
- "mincyclo": fmt.Sprintf("%d", config.Cyclo),
- "maxlinelength": fmt.Sprintf("%d", config.LineLength),
- "misspelllocale": fmt.Sprintf("%s", config.MisspellLocale),
- "min_confidence": fmt.Sprintf("%f", config.MinConfidence),
- "min_occurrences": fmt.Sprintf("%d", config.MinOccurrences),
- "min_const_length": fmt.Sprintf("%d", config.MinConstLength),
- "tests": "",
- "not_tests": "true",
- }
- if config.Test {
- vars["tests"] = "true"
- vars["not_tests"] = ""
- }
-
- wg := &sync.WaitGroup{}
- id := 1
- for _, linter := range linters {
- deadline := time.After(config.Deadline.Duration())
- state := &linterState{
- Linter: linter,
- issues: incomingIssues,
- vars: vars,
- exclude: exclude,
- include: include,
- deadline: deadline,
- }
-
- partitions, err := state.Partitions(paths)
- if err != nil {
- errch <- err
- continue
- }
- for _, args := range partitions {
- wg.Add(1)
- concurrencych <- true
- // Call the goroutine with a copy of the args array so that the
- // contents of the array are not modified by the next iteration of
- // the above for loop
- go func(id int, args []string) {
- err := executeLinter(id, state, args)
- if err != nil {
- errch <- err
- }
- <-concurrencych
- wg.Done()
- }(id, args)
- id++
- }
- }
-
- go func() {
- wg.Wait()
- close(incomingIssues)
- close(errch)
- }()
- return processedIssues, errch
-}
-
-func executeLinter(id int, state *linterState, args []string) error {
- if len(args) == 0 {
- return fmt.Errorf("missing linter command")
- }
-
- start := time.Now()
- dbg := namespacedDebug(fmt.Sprintf("[%s.%d]: ", state.Name, id))
- dbg("executing %s", strings.Join(args, " "))
- buf := bytes.NewBuffer(nil)
- command := args[0]
- cmd := exec.Command(command, args[1:]...) // nolint: gas
- cmd.Stdout = buf
- cmd.Stderr = buf
- err := cmd.Start()
- if err != nil {
- return fmt.Errorf("failed to execute linter %s: %s", command, err)
- }
-
- done := make(chan bool)
- go func() {
- err = cmd.Wait()
- done <- true
- }()
-
- // Wait for process to complete or deadline to expire.
- select {
- case <-done:
-
- case <-state.deadline:
- err = fmt.Errorf("deadline exceeded by linter %s (try increasing --deadline)",
- state.Name)
- kerr := cmd.Process.Kill()
- if kerr != nil {
- warning("failed to kill %s: %s", state.Name, kerr)
- }
- return err
- }
-
- if err != nil {
- dbg("warning: %s returned %s: %s", command, err, buf.String())
- }
-
- processOutput(dbg, state, buf.Bytes())
- elapsed := time.Since(start)
- dbg("%s linter took %s", state.Name, elapsed)
- return nil
-}
-
-func parseCommand(command string) ([]string, error) {
- args, err := shlex.Split(command)
- if err != nil {
- return nil, err
- }
- if len(args) == 0 {
- return nil, fmt.Errorf("invalid command %q", command)
- }
- exe, err := exec.LookPath(args[0])
- if err != nil {
- return nil, err
- }
- return append([]string{exe}, args[1:]...), nil
-}
-
-// nolint: gocyclo
-func processOutput(dbg debugFunction, state *linterState, out []byte) {
- re := state.regex
- all := re.FindAllSubmatchIndex(out, -1)
- dbg("%s hits %d: %s", state.Name, len(all), state.Pattern)
-
- cwd, err := os.Getwd()
- if err != nil {
- warning("failed to get working directory %s", err)
- }
-
- // Create a local copy of vars so they can be modified by the linter output
- vars := state.vars.Copy()
-
- for _, indices := range all {
- group := [][]byte{}
- for i := 0; i < len(indices); i += 2 {
- var fragment []byte
- if indices[i] != -1 {
- fragment = out[indices[i]:indices[i+1]]
- }
- group = append(group, fragment)
- }
-
- issue, err := NewIssue(state.Linter.Name, config.formatTemplate)
- kingpin.FatalIfError(err, "Invalid output format")
-
- for i, name := range re.SubexpNames() {
- if group[i] == nil {
- continue
- }
- part := string(group[i])
- if name != "" {
- vars[name] = part
- }
- switch name {
- case "path":
- issue.Path, err = newIssuePathFromAbsPath(cwd, part)
- if err != nil {
- warning("failed to make %s a relative path: %s", part, err)
- }
- case "line":
- n, err := strconv.ParseInt(part, 10, 32)
- kingpin.FatalIfError(err, "line matched invalid integer")
- issue.Line = int(n)
-
- case "col":
- n, err := strconv.ParseInt(part, 10, 32)
- kingpin.FatalIfError(err, "col matched invalid integer")
- issue.Col = int(n)
-
- case "message":
- issue.Message = part
-
- case "":
- }
- }
- // TODO: set messageOveride and severity on the Linter instead of reading
- // them directly from the static config
- if m, ok := config.MessageOverride[state.Name]; ok {
- issue.Message = vars.Replace(m)
- }
- if sev, ok := config.Severity[state.Name]; ok {
- issue.Severity = Severity(sev)
- }
- if state.exclude != nil && state.exclude.MatchString(issue.String()) {
- continue
- }
- if state.include != nil && !state.include.MatchString(issue.String()) {
- continue
- }
- state.issues <- issue
- }
-}
-
-func maybeSortIssues(issues chan *Issue) chan *Issue {
- if reflect.DeepEqual([]string{"none"}, config.Sort) {
- return issues
- }
- return SortIssueChan(issues, config.Sort)
-}
-
-func maybeAggregateIssues(issues chan *Issue) chan *Issue {
- if !config.Aggregate {
- return issues
- }
- return AggregateIssueChan(issues)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/execute_test.go b/vendor/src/github.com/alecthomas/gometalinter/execute_test.go
deleted file mode 100644
index cc2703ac9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/execute_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package main
-
-import (
- "testing"
-
- "github.com/stretchr/testify/assert"
-)
-
-func TestLinterStateCommand(t *testing.T) {
- varsDefault := Vars{"tests": "", "not_tests": "true"}
- varsWithTest := Vars{"tests": "true", "not_tests": ""}
-
- var testcases = []struct {
- linter string
- vars Vars
- expected string
- }{
- {
- linter: "errcheck",
- vars: varsWithTest,
- expected: `errcheck -abspath `,
- },
- {
- linter: "errcheck",
- vars: varsDefault,
- expected: `errcheck -abspath -ignoretests`,
- },
- {
- linter: "gotype",
- vars: varsDefault,
- expected: `gotype -e `,
- },
- {
- linter: "gotype",
- vars: varsWithTest,
- expected: `gotype -e -t`,
- },
- {
- linter: "structcheck",
- vars: varsDefault,
- expected: `structcheck `,
- },
- {
- linter: "structcheck",
- vars: varsWithTest,
- expected: `structcheck -t`,
- },
- {
- linter: "unparam",
- vars: varsDefault,
- expected: `unparam -tests=false`,
- },
- {
- linter: "unparam",
- vars: varsWithTest,
- expected: `unparam `,
- },
- }
-
- for _, testcase := range testcases {
- ls := linterState{
- Linter: getLinterByName(testcase.linter, LinterConfig{}),
- vars: testcase.vars,
- }
- assert.Equal(t, testcase.expected, ls.command())
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/issue.go b/vendor/src/github.com/alecthomas/gometalinter/issue.go
deleted file mode 100644
index 46c609a7b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/issue.go
+++ /dev/null
@@ -1,166 +0,0 @@
-package main
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "path/filepath"
- "sort"
- "strings"
- "text/template"
-)
-
-// DefaultIssueFormat used to print an issue
-const DefaultIssueFormat = "{{.Path}}:{{.Line}}:{{if .Col}}{{.Col}}{{end}}:{{.Severity}}: {{.Message}} ({{.Linter}})"
-
-// Severity of linter message
-type Severity string
-
-// Linter message severity levels.
-const (
- Error Severity = "error"
- Warning Severity = "warning"
-)
-
-type IssuePath struct {
- root string
- path string
-}
-
-func (i IssuePath) String() string {
- return i.Relative()
-}
-
-func (i IssuePath) Relative() string {
- return i.path
-}
-
-func (i IssuePath) Abs() string {
- return filepath.Join(i.root, i.path)
-}
-
-func (i IssuePath) MarshalJSON() ([]byte, error) {
- return json.Marshal(i.String())
-}
-
-func newIssuePath(root, path string) IssuePath {
- return IssuePath{root: root, path: path}
-}
-
-// newIssuePathFromAbsPath returns a new issuePath from a path that may be
-// an absolute path. root must be an absolute path.
-func newIssuePathFromAbsPath(root, path string) (IssuePath, error) {
- resolvedRoot, err := filepath.EvalSymlinks(root)
- if err != nil {
- return newIssuePath(root, path), err
- }
-
- resolvedPath, err := filepath.EvalSymlinks(path)
- if err != nil {
- return newIssuePath(root, path), err
- }
-
- if !filepath.IsAbs(path) {
- return newIssuePath(resolvedRoot, resolvedPath), nil
- }
-
- relPath, err := filepath.Rel(resolvedRoot, resolvedPath)
- return newIssuePath(resolvedRoot, relPath), err
-}
-
-type Issue struct {
- Linter string `json:"linter"`
- Severity Severity `json:"severity"`
- Path IssuePath `json:"path"`
- Line int `json:"line"`
- Col int `json:"col"`
- Message string `json:"message"`
- formatTmpl *template.Template
-}
-
-// NewIssue returns a new issue. Returns an error if formatTmpl is not a valid
-// template for an Issue.
-func NewIssue(linter string, formatTmpl *template.Template) (*Issue, error) {
- issue := &Issue{
- Line: 1,
- Severity: Warning,
- Linter: linter,
- formatTmpl: formatTmpl,
- }
- err := formatTmpl.Execute(ioutil.Discard, issue)
- return issue, err
-}
-
-func (i *Issue) String() string {
- if i.formatTmpl == nil {
- col := ""
- if i.Col != 0 {
- col = fmt.Sprintf("%d", i.Col)
- }
- return fmt.Sprintf("%s:%d:%s:%s: %s (%s)",
- strings.TrimSpace(i.Path.Relative()),
- i.Line, col, i.Severity,
- strings.TrimSpace(i.Message),
- i.Linter)
- }
- buf := new(bytes.Buffer)
- _ = i.formatTmpl.Execute(buf, i)
- return buf.String()
-}
-
-type sortedIssues struct {
- issues []*Issue
- order []string
-}
-
-func (s *sortedIssues) Len() int { return len(s.issues) }
-func (s *sortedIssues) Swap(i, j int) { s.issues[i], s.issues[j] = s.issues[j], s.issues[i] }
-
-func (s *sortedIssues) Less(i, j int) bool {
- l, r := s.issues[i], s.issues[j]
- return CompareIssue(*l, *r, s.order)
-}
-
-// CompareIssue two Issues and return true if left should sort before right
-// nolint: gocyclo
-func CompareIssue(l, r Issue, order []string) bool {
- for _, key := range order {
- switch {
- case key == "path" && l.Path != r.Path:
- return l.Path.String() < r.Path.String()
- case key == "line" && l.Line != r.Line:
- return l.Line < r.Line
- case key == "column" && l.Col != r.Col:
- return l.Col < r.Col
- case key == "severity" && l.Severity != r.Severity:
- return l.Severity < r.Severity
- case key == "message" && l.Message != r.Message:
- return l.Message < r.Message
- case key == "linter" && l.Linter != r.Linter:
- return l.Linter < r.Linter
- }
- }
- return true
-}
-
-// SortIssueChan reads issues from one channel, sorts them, and returns them to another
-// channel
-func SortIssueChan(issues chan *Issue, order []string) chan *Issue {
- out := make(chan *Issue, 1000000)
- sorted := &sortedIssues{
- issues: []*Issue{},
- order: order,
- }
- go func() {
- for issue := range issues {
- sorted.issues = append(sorted.issues, issue)
- }
- sort.Sort(sorted)
- for _, issue := range sorted.issues {
- out <- issue
- }
- close(out)
- }()
- return out
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/issue_test.go b/vendor/src/github.com/alecthomas/gometalinter/issue_test.go
deleted file mode 100644
index 3a027b51e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/issue_test.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package main
-
-import (
- "sort"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestSortedIssues(t *testing.T) {
- actual := []*Issue{
- {Path: newIssuePath("", "b.go"), Line: 5, Col: 1},
- {Path: newIssuePath("", "a.go"), Line: 3, Col: 2},
- {Path: newIssuePath("", "b.go"), Line: 1, Col: 3},
- {Path: newIssuePath("", "a.go"), Line: 1, Col: 4},
- }
- issues := &sortedIssues{
- issues: actual,
- order: []string{"path", "line", "column"},
- }
- sort.Sort(issues)
- expected := []*Issue{
- {Path: newIssuePath("", "a.go"), Line: 1, Col: 4},
- {Path: newIssuePath("", "a.go"), Line: 3, Col: 2},
- {Path: newIssuePath( "", "b.go"), Line: 1, Col: 3},
- {Path: newIssuePath( "", "b.go"), Line: 5, Col: 1},
- }
- require.Equal(t, expected, actual)
-}
-
-func TestCompareOrderWithMessage(t *testing.T) {
- order := []string{"path", "line", "column", "message"}
- issueM := Issue{Path: newIssuePath("", "file.go"), Message: "message"}
- issueU := Issue{Path: newIssuePath("", "file.go"), Message: "unknown"}
-
- assert.True(t, CompareIssue(issueM, issueU, order))
- assert.False(t, CompareIssue(issueU, issueM, order))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/linters.go b/vendor/src/github.com/alecthomas/gometalinter/linters.go
deleted file mode 100644
index 53373a936..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/linters.go
+++ /dev/null
@@ -1,413 +0,0 @@
-package main
-
-import (
- "fmt"
- "os"
- "os/exec"
- "regexp"
- "sort"
- "strings"
-
- kingpin "gopkg.in/alecthomas/kingpin.v3-unstable"
-)
-
-type LinterConfig struct {
- Command string
- Pattern string
- InstallFrom string
- PartitionStrategy partitionStrategy
- IsFast bool
- defaultEnabled bool
-}
-
-type Linter struct {
- LinterConfig
- Name string
- regex *regexp.Regexp
-}
-
-// NewLinter returns a new linter from a config
-func NewLinter(name string, config LinterConfig) (*Linter, error) {
- if p, ok := predefinedPatterns[config.Pattern]; ok {
- config.Pattern = p
- }
- regex, err := regexp.Compile("(?m:" + config.Pattern + ")")
- if err != nil {
- return nil, err
- }
- if config.PartitionStrategy == nil {
- config.PartitionStrategy = partitionPathsAsDirectories
- }
- return &Linter{
- LinterConfig: config,
- Name: name,
- regex: regex,
- }, nil
-}
-
-func (l *Linter) String() string {
- return l.Name
-}
-
-var predefinedPatterns = map[string]string{
- "PATH:LINE:COL:MESSAGE": `^(?P.*?\.go):(?P\d+):(?P \d+):\s*(?P.*)$`,
- "PATH:LINE:MESSAGE": `^(?P.*?\.go):(?P\d+):\s*(?P.*)$`,
-}
-
-func getLinterByName(name string, overrideConf LinterConfig) *Linter {
- conf := defaultLinters[name]
- if val := overrideConf.Command; val != "" {
- conf.Command = val
- }
- if val := overrideConf.Pattern; val != "" {
- conf.Pattern = val
- }
- if val := overrideConf.InstallFrom; val != "" {
- conf.InstallFrom = val
- }
- if overrideConf.IsFast {
- conf.IsFast = true
- }
- if val := overrideConf.PartitionStrategy; val != nil {
- conf.PartitionStrategy = val
- }
-
- linter, _ := NewLinter(name, conf)
- return linter
-}
-
-func parseLinterConfigSpec(name string, spec string) (LinterConfig, error) {
- parts := strings.SplitN(spec, ":", 2)
- if len(parts) < 2 {
- return LinterConfig{}, fmt.Errorf("linter spec needs at least two components")
- }
-
- config := defaultLinters[name]
- config.Command, config.Pattern = parts[0], parts[1]
- if predefined, ok := predefinedPatterns[config.Pattern]; ok {
- config.Pattern = predefined
- }
-
- return config, nil
-}
-
-func makeInstallCommand(linters ...string) []string {
- cmd := []string{"get"}
- if config.VendoredLinters {
- cmd = []string{"install"}
- } else {
- if config.Update {
- cmd = append(cmd, "-u")
- }
- if config.Force {
- cmd = append(cmd, "-f")
- }
- if config.DownloadOnly {
- cmd = append(cmd, "-d")
- }
- }
- if config.Debug {
- cmd = append(cmd, "-v")
- }
- cmd = append(cmd, linters...)
- return cmd
-}
-
-func installLintersWithOneCommand(targets []string) error {
- cmd := makeInstallCommand(targets...)
- debug("go %s", strings.Join(cmd, " "))
- c := exec.Command("go", cmd...) // nolint: gas
- c.Stdout = os.Stdout
- c.Stderr = os.Stderr
- return c.Run()
-}
-
-func installLintersIndividually(targets []string) {
- failed := []string{}
- for _, target := range targets {
- cmd := makeInstallCommand(target)
- debug("go %s", strings.Join(cmd, " "))
- c := exec.Command("go", cmd...) // nolint: gas
- c.Stdout = os.Stdout
- c.Stderr = os.Stderr
- if err := c.Run(); err != nil {
- warning("failed to install %s: %s", target, err)
- failed = append(failed, target)
- }
- }
- if len(failed) > 0 {
- kingpin.Fatalf("failed to install the following linters: %s", strings.Join(failed, ", "))
- }
-}
-
-func installLinters() {
- names := make([]string, 0, len(defaultLinters))
- targets := make([]string, 0, len(defaultLinters))
- for name, config := range defaultLinters {
- if config.InstallFrom == "" {
- continue
- }
- names = append(names, name)
- targets = append(targets, config.InstallFrom)
- }
- sort.Strings(names)
- namesStr := strings.Join(names, "\n ")
- if config.DownloadOnly {
- fmt.Printf("Downloading:\n %s\n", namesStr)
- } else {
- fmt.Printf("Installing:\n %s\n", namesStr)
- }
- err := installLintersWithOneCommand(targets)
- if err == nil {
- return
- }
- warning("failed to install one or more linters: %s (installing individually)", err)
- installLintersIndividually(targets)
-}
-
-func getDefaultLinters() []*Linter {
- out := []*Linter{}
- for name, config := range defaultLinters {
- linter, err := NewLinter(name, config)
- kingpin.FatalIfError(err, "invalid linter %q", name)
- out = append(out, linter)
- }
- return out
-}
-
-func defaultEnabled() []string {
- enabled := []string{}
- for name, config := range defaultLinters {
- if config.defaultEnabled {
- enabled = append(enabled, name)
- }
- }
- return enabled
-}
-
-func validateLinters(linters map[string]*Linter, config *Config) error {
- var unknownLinters []string
- for name := range linters {
- if _, isDefault := defaultLinters[name]; !isDefault {
- if _, isCustom := config.Linters[name]; !isCustom {
- unknownLinters = append(unknownLinters, name)
- }
- }
- }
- if len(unknownLinters) > 0 {
- return fmt.Errorf("unknown linters: %s", strings.Join(unknownLinters, ", "))
- }
- return nil
-}
-
-const vetPattern = `^(?:vet:.*?\.go:\s+(?P.*?\.go):(?P\d+):(?P \d+):\s*(?P.*))|(?:(?P.*?\.go):(?P\d+):\s*(?P.*))$`
-
-var defaultLinters = map[string]LinterConfig{
- "maligned": {
- Command: "maligned",
- Pattern: `^(?:[^:]+: )?(?P.*?\.go):(?P\d+):(?P \d+):\s*(?P.+)$`,
- InstallFrom: "github.com/mdempsky/maligned",
- PartitionStrategy: partitionPathsAsPackages,
- defaultEnabled: true,
- },
- "deadcode": {
- Command: "deadcode",
- Pattern: `^deadcode: (?P.*?\.go):(?P\d+):(?P \d+):\s*(?P.*)$`,
- InstallFrom: "github.com/tsenart/deadcode",
- PartitionStrategy: partitionPathsAsDirectories,
- defaultEnabled: true,
- },
- "dupl": {
- Command: `dupl -plumbing -threshold {duplthreshold}`,
- Pattern: `^(?P.*?\.go):(?P\d+)-\d+:\s*(?P.*)$`,
- InstallFrom: "github.com/mibk/dupl",
- PartitionStrategy: partitionPathsAsFiles,
- IsFast: true,
- },
- "errcheck": {
- Command: `errcheck -abspath {not_tests=-ignoretests}`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "github.com/kisielk/errcheck",
- PartitionStrategy: partitionPathsAsPackages,
- defaultEnabled: true,
- },
- "gas": {
- Command: `gas -fmt=csv`,
- Pattern: `^(?P.*?\.go),(?P\d+),(?P[^,]+,[^,]+,[^,]+)`,
- InstallFrom: "github.com/GoASTScanner/gas",
- PartitionStrategy: partitionPathsAsFiles,
- defaultEnabled: true,
- IsFast: true,
- },
- "goconst": {
- Command: `goconst -min-occurrences {min_occurrences} -min-length {min_const_length}`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "github.com/jgautheron/goconst/cmd/goconst",
- PartitionStrategy: partitionPathsAsDirectories,
- defaultEnabled: true,
- IsFast: true,
- },
- "gocyclo": {
- Command: `gocyclo -over {mincyclo}`,
- Pattern: `^(?P\d+)\s+\S+\s(?P\S+)\s+(?P.*?\.go):(?P\d+):(\d+)$`,
- InstallFrom: "github.com/alecthomas/gocyclo",
- PartitionStrategy: partitionPathsAsDirectories,
- defaultEnabled: true,
- IsFast: true,
- },
- "gofmt": {
- Command: `gofmt -l -s`,
- Pattern: `^(?P.*?\.go)$`,
- PartitionStrategy: partitionPathsAsFiles,
- IsFast: true,
- },
- "goimports": {
- Command: `goimports -l`,
- Pattern: `^(?P.*?\.go)$`,
- InstallFrom: "golang.org/x/tools/cmd/goimports",
- PartitionStrategy: partitionPathsAsFiles,
- IsFast: true,
- },
- "golint": {
- Command: `golint -min_confidence {min_confidence}`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "github.com/golang/lint/golint",
- PartitionStrategy: partitionPathsAsDirectories,
- defaultEnabled: true,
- IsFast: true,
- },
- "gosimple": {
- Command: `gosimple`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "honnef.co/go/tools/cmd/gosimple",
- PartitionStrategy: partitionPathsAsPackages,
- },
- "gotype": {
- Command: `gotype -e {tests=-t}`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "golang.org/x/tools/cmd/gotype",
- PartitionStrategy: partitionPathsByDirectory,
- defaultEnabled: true,
- IsFast: true,
- },
- "gotypex": {
- Command: `gotype -e -x`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "golang.org/x/tools/cmd/gotype",
- PartitionStrategy: partitionPathsByDirectory,
- defaultEnabled: true,
- IsFast: true,
- },
- "ineffassign": {
- Command: `ineffassign -n`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "github.com/gordonklaus/ineffassign",
- PartitionStrategy: partitionPathsAsDirectories,
- defaultEnabled: true,
- IsFast: true,
- },
- "interfacer": {
- Command: `interfacer`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "mvdan.cc/interfacer",
- PartitionStrategy: partitionPathsAsPackages,
- defaultEnabled: true,
- },
- "lll": {
- Command: `lll -g -l {maxlinelength}`,
- Pattern: `PATH:LINE:MESSAGE`,
- InstallFrom: "github.com/walle/lll/cmd/lll",
- PartitionStrategy: partitionPathsAsFiles,
- IsFast: true,
- },
- "megacheck": {
- Command: `megacheck`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "honnef.co/go/tools/cmd/megacheck",
- PartitionStrategy: partitionPathsAsPackages,
- defaultEnabled: true,
- },
- "misspell": {
- Command: `misspell -j 1 --locale "{misspelllocale}"`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "github.com/client9/misspell/cmd/misspell",
- PartitionStrategy: partitionPathsAsFiles,
- IsFast: true,
- },
- "nakedret": {
- Command: `nakedret`,
- Pattern: `^(?P.*?\.go):(?P\d+)\s*(?P.*)$`,
- InstallFrom: "github.com/alexkohler/nakedret",
- PartitionStrategy: partitionPathsAsDirectories,
- },
- "safesql": {
- Command: `safesql`,
- Pattern: `^- (?P.*?\.go):(?P\d+):(?P \d+)$`,
- InstallFrom: "github.com/stripe/safesql",
- PartitionStrategy: partitionPathsAsPackages,
- },
- "staticcheck": {
- Command: `staticcheck`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "honnef.co/go/tools/cmd/staticcheck",
- PartitionStrategy: partitionPathsAsPackages,
- },
- "structcheck": {
- Command: `structcheck {tests=-t}`,
- Pattern: `^(?:[^:]+: )?(?P.*?\.go):(?P\d+):(?P \d+):\s*(?P.+)$`,
- InstallFrom: "github.com/opennota/check/cmd/structcheck",
- PartitionStrategy: partitionPathsAsPackages,
- defaultEnabled: true,
- },
- "test": {
- Command: `go test`,
- Pattern: `^--- FAIL: .*$\s+(?P.*?\.go):(?P\d+): (?P.*)$`,
- PartitionStrategy: partitionPathsAsPackages,
- },
- "testify": {
- Command: `go test`,
- Pattern: `Location:\s+(?P.*?\.go):(?P\d+)$\s+Error:\s+(?P[^\n]+)`,
- PartitionStrategy: partitionPathsAsPackages,
- },
- "unconvert": {
- Command: `unconvert`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "github.com/mdempsky/unconvert",
- PartitionStrategy: partitionPathsAsPackages,
- defaultEnabled: true,
- },
- "unparam": {
- Command: `unparam {not_tests=-tests=false}`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "mvdan.cc/unparam",
- PartitionStrategy: partitionPathsAsPackages,
- },
- "unused": {
- Command: `unused`,
- Pattern: `PATH:LINE:COL:MESSAGE`,
- InstallFrom: "honnef.co/go/tools/cmd/unused",
- PartitionStrategy: partitionPathsAsPackages,
- },
- "varcheck": {
- Command: `varcheck`,
- Pattern: `^(?:[^:]+: )?(?P.*?\.go):(?P\d+):(?P \d+):\s*(?P.*)$`,
- InstallFrom: "github.com/opennota/check/cmd/varcheck",
- PartitionStrategy: partitionPathsAsPackages,
- defaultEnabled: true,
- },
- "vet": {
- Command: `govet --no-recurse`,
- Pattern: vetPattern,
- InstallFrom: "github.com/dnephin/govet",
- PartitionStrategy: partitionPathsAsDirectories,
- defaultEnabled: true,
- IsFast: true,
- },
- "vetshadow": {
- Command: `govet --no-recurse --shadow`,
- Pattern: vetPattern,
- PartitionStrategy: partitionPathsAsDirectories,
- defaultEnabled: true,
- IsFast: true,
- },
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/linters_test.go b/vendor/src/github.com/alecthomas/gometalinter/linters_test.go
deleted file mode 100644
index 1a66db001..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/linters_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package main
-
-import (
- "reflect"
- "runtime"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestNewLinterWithCustomLinter(t *testing.T) {
- config := LinterConfig{
- Command: "/usr/bin/custom",
- Pattern: "path",
- }
- linter, err := NewLinter("thename", config)
- require.NoError(t, err)
- assert.Equal(t, functionName(partitionPathsAsDirectories), functionName(linter.LinterConfig.PartitionStrategy))
- assert.Equal(t, "(?m:path)", linter.regex.String())
- assert.Equal(t, "thename", linter.Name)
- assert.Equal(t, config.Command, linter.Command)
-}
-
-func TestGetLinterByName(t *testing.T) {
- config := LinterConfig{
- Command: "maligned",
- Pattern: "path",
- InstallFrom: "./install/path",
- PartitionStrategy: partitionPathsAsDirectories,
- IsFast: true,
- }
- overrideConfig := getLinterByName(config.Command, config)
- assert.Equal(t, config.Command, overrideConfig.Command)
- assert.Equal(t, config.Pattern, overrideConfig.Pattern)
- assert.Equal(t, config.InstallFrom, overrideConfig.InstallFrom)
- assert.Equal(t, functionName(config.PartitionStrategy), functionName(overrideConfig.PartitionStrategy))
- assert.Equal(t, config.IsFast, overrideConfig.IsFast)
-}
-
-func TestValidateLinters(t *testing.T) {
- originalConfig := *config
- defer func() { config = &originalConfig }()
-
- config = &Config{
- Enable: []string{"_dummylinter_"},
- }
-
- err := validateLinters(lintersFromConfig(config), config)
- require.Error(t, err, "expected unknown linter error for _dummylinter_")
-
- config = &Config{
- Enable: defaultEnabled(),
- }
- err = validateLinters(lintersFromConfig(config), config)
- require.NoError(t, err)
-}
-
-func functionName(i interface{}) string {
- return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/main.go b/vendor/src/github.com/alecthomas/gometalinter/main.go
deleted file mode 100644
index 8986536e1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/main.go
+++ /dev/null
@@ -1,511 +0,0 @@
-package main
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "os"
- "os/user"
- "path/filepath"
- "regexp"
- "runtime"
- "sort"
- "strings"
- "text/template"
- "time"
-
- kingpin "gopkg.in/alecthomas/kingpin.v3-unstable"
-)
-
-var (
- // Locations to look for vendored linters.
- vendoredSearchPaths = [][]string{
- {"github.com", "alecthomas", "gometalinter", "_linters"},
- {"gopkg.in", "alecthomas", "gometalinter.v2", "_linters"},
- }
- Version = "master"
-)
-
-func setupFlags(app *kingpin.Application) {
- app.Flag("config", "Load JSON configuration from file.").Envar("GOMETALINTER_CONFIG").Action(loadConfig).String()
- app.Flag("disable", "Disable previously enabled linters.").PlaceHolder("LINTER").Short('D').Action(disableAction).Strings()
- app.Flag("enable", "Enable previously disabled linters.").PlaceHolder("LINTER").Short('E').Action(enableAction).Strings()
- app.Flag("linter", "Define a linter.").PlaceHolder("NAME:COMMAND:PATTERN").Action(cliLinterOverrides).StringMap()
- app.Flag("message-overrides", "Override message from linter. {message} will be expanded to the original message.").PlaceHolder("LINTER:MESSAGE").StringMapVar(&config.MessageOverride)
- app.Flag("severity", "Map of linter severities.").PlaceHolder("LINTER:SEVERITY").StringMapVar(&config.Severity)
- app.Flag("disable-all", "Disable all linters.").Action(disableAllAction).Bool()
- app.Flag("enable-all", "Enable all linters.").Action(enableAllAction).Bool()
- app.Flag("format", "Output format.").PlaceHolder(config.Format).StringVar(&config.Format)
- app.Flag("vendored-linters", "Use vendored linters (recommended) (DEPRECATED - use binary packages).").BoolVar(&config.VendoredLinters)
- app.Flag("fast", "Only run fast linters.").BoolVar(&config.Fast)
- app.Flag("install", "Attempt to install all known linters (DEPRECATED - use binary packages).").Short('i').BoolVar(&config.Install)
- app.Flag("update", "Pass -u to go tool when installing (DEPRECATED - use binary packages).").Short('u').BoolVar(&config.Update)
- app.Flag("force", "Pass -f to go tool when installing (DEPRECATED - use binary packages).").Short('f').BoolVar(&config.Force)
- app.Flag("download-only", "Pass -d to go tool when installing (DEPRECATED - use binary packages).").BoolVar(&config.DownloadOnly)
- app.Flag("debug", "Display messages for failed linters, etc.").Short('d').BoolVar(&config.Debug)
- app.Flag("concurrency", "Number of concurrent linters to run.").PlaceHolder(fmt.Sprintf("%d", runtime.NumCPU())).Short('j').IntVar(&config.Concurrency)
- app.Flag("exclude", "Exclude messages matching these regular expressions.").Short('e').PlaceHolder("REGEXP").StringsVar(&config.Exclude)
- app.Flag("include", "Include messages matching these regular expressions.").Short('I').PlaceHolder("REGEXP").StringsVar(&config.Include)
- app.Flag("skip", "Skip directories with this name when expanding '...'.").Short('s').PlaceHolder("DIR...").StringsVar(&config.Skip)
- app.Flag("vendor", "Enable vendoring support (skips 'vendor' directories and sets GO15VENDOREXPERIMENT=1).").BoolVar(&config.Vendor)
- app.Flag("cyclo-over", "Report functions with cyclomatic complexity over N (using gocyclo).").PlaceHolder("10").IntVar(&config.Cyclo)
- app.Flag("line-length", "Report lines longer than N (using lll).").PlaceHolder("80").IntVar(&config.LineLength)
- app.Flag("misspell-locale", "Specify locale to use (using misspell).").PlaceHolder("").StringVar(&config.MisspellLocale)
- app.Flag("min-confidence", "Minimum confidence interval to pass to golint.").PlaceHolder(".80").FloatVar(&config.MinConfidence)
- app.Flag("min-occurrences", "Minimum occurrences to pass to goconst.").PlaceHolder("3").IntVar(&config.MinOccurrences)
- app.Flag("min-const-length", "Minimum constant length.").PlaceHolder("3").IntVar(&config.MinConstLength)
- app.Flag("dupl-threshold", "Minimum token sequence as a clone for dupl.").PlaceHolder("50").IntVar(&config.DuplThreshold)
- app.Flag("sort", fmt.Sprintf("Sort output by any of %s.", strings.Join(sortKeys, ", "))).PlaceHolder("none").EnumsVar(&config.Sort, sortKeys...)
- app.Flag("tests", "Include test files for linters that support this option.").Short('t').BoolVar(&config.Test)
- app.Flag("deadline", "Cancel linters if they have not completed within this duration.").PlaceHolder("30s").DurationVar((*time.Duration)(&config.Deadline))
- app.Flag("errors", "Only show errors.").BoolVar(&config.Errors)
- app.Flag("json", "Generate structured JSON rather than standard line-based output.").BoolVar(&config.JSON)
- app.Flag("checkstyle", "Generate checkstyle XML rather than standard line-based output.").BoolVar(&config.Checkstyle)
- app.Flag("enable-gc", "Enable GC for linters (useful on large repositories).").BoolVar(&config.EnableGC)
- app.Flag("aggregate", "Aggregate issues reported by several linters.").BoolVar(&config.Aggregate)
- app.Flag("warn-unmatched-nolint", "Warn if a nolint directive is not matched with an issue.").BoolVar(&config.WarnUnmatchedDirective)
- app.GetFlag("help").Short('h')
-}
-
-func cliLinterOverrides(app *kingpin.Application, element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
- // expected input structure - :
- parts := strings.SplitN(*element.Value, ":", 2)
- if len(parts) < 2 {
- return fmt.Errorf("incorrectly formatted input: %s", *element.Value)
- }
- name := parts[0]
- spec := parts[1]
- conf, err := parseLinterConfigSpec(name, spec)
- if err != nil {
- return fmt.Errorf("incorrectly formatted input: %s", *element.Value)
- }
- config.Linters[name] = StringOrLinterConfig(conf)
- return nil
-}
-
-func loadConfig(app *kingpin.Application, element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
- r, err := os.Open(*element.Value)
- if err != nil {
- return err
- }
- defer r.Close() // nolint: errcheck
- err = json.NewDecoder(r).Decode(config)
- if err != nil {
- return err
- }
- for _, disable := range config.Disable {
- for i, enable := range config.Enable {
- if enable == disable {
- config.Enable = append(config.Enable[:i], config.Enable[i+1:]...)
- break
- }
- }
- }
- return err
-}
-
-func disableAction(app *kingpin.Application, element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
- out := []string{}
- for _, linter := range config.Enable {
- if linter != *element.Value {
- out = append(out, linter)
- }
- }
- config.Enable = out
- return nil
-}
-
-func enableAction(app *kingpin.Application, element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
- config.Enable = append(config.Enable, *element.Value)
- return nil
-}
-
-func disableAllAction(app *kingpin.Application, element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
- config.Enable = []string{}
- return nil
-}
-
-func enableAllAction(app *kingpin.Application, element *kingpin.ParseElement, ctx *kingpin.ParseContext) error {
- for linter := range defaultLinters {
- config.Enable = append(config.Enable, linter)
- }
- config.EnableAll = true
- return nil
-}
-
-type debugFunction func(format string, args ...interface{})
-
-func debug(format string, args ...interface{}) {
- if config.Debug {
- fmt.Fprintf(os.Stderr, "DEBUG: "+format+"\n", args...)
- }
-}
-
-func namespacedDebug(prefix string) debugFunction {
- return func(format string, args ...interface{}) {
- debug(prefix+format, args...)
- }
-}
-
-func warning(format string, args ...interface{}) {
- fmt.Fprintf(os.Stderr, "WARNING: "+format+"\n", args...)
-}
-
-func formatLinters() string {
- w := bytes.NewBuffer(nil)
- for _, linter := range getDefaultLinters() {
- install := "(" + linter.InstallFrom + ")"
- if install == "()" {
- install = ""
- }
- fmt.Fprintf(w, " %s: %s\n\tcommand: %s\n\tregex: %s\n\tfast: %t\n\tdefault enabled: %t\n\n",
- linter.Name, install, linter.Command, linter.Pattern, linter.IsFast, linter.defaultEnabled)
- }
- return w.String()
-}
-
-func formatSeverity() string {
- w := bytes.NewBuffer(nil)
- for name, severity := range config.Severity {
- fmt.Fprintf(w, " %s -> %s\n", name, severity)
- }
- return w.String()
-}
-
-func main() {
- kingpin.Version(Version)
- pathsArg := kingpin.Arg("path", "Directories to lint. Defaults to \".\". /... will recurse.").Strings()
- app := kingpin.CommandLine
- setupFlags(app)
- app.Help = fmt.Sprintf(`Aggregate and normalise the output of a whole bunch of Go linters.
-
-PlaceHolder linters:
-
-%s
-
-Severity override map (default is "warning"):
-
-%s
-`, formatLinters(), formatSeverity())
- kingpin.Parse()
-
- if config.Install {
- if config.VendoredLinters {
- configureEnvironmentForInstall()
- }
- installLinters()
- return
- }
-
- configureEnvironment()
- include, exclude := processConfig(config)
-
- start := time.Now()
- paths := resolvePaths(*pathsArg, config.Skip)
-
- linters := lintersFromConfig(config)
- err := validateLinters(linters, config)
- kingpin.FatalIfError(err, "")
-
- issues, errch := runLinters(linters, paths, config.Concurrency, exclude, include)
- status := 0
- if config.JSON {
- status |= outputToJSON(issues)
- } else if config.Checkstyle {
- status |= outputToCheckstyle(issues)
- } else {
- status |= outputToConsole(issues)
- }
- for err := range errch {
- warning("%s", err)
- status |= 2
- }
- elapsed := time.Since(start)
- debug("total elapsed time %s", elapsed)
- os.Exit(status)
-}
-
-// nolint: gocyclo
-func processConfig(config *Config) (include *regexp.Regexp, exclude *regexp.Regexp) {
- tmpl, err := template.New("output").Parse(config.Format)
- kingpin.FatalIfError(err, "invalid format %q", config.Format)
- config.formatTemplate = tmpl
-
- // Linters are by their very nature, short lived, so disable GC.
- // Reduced (user) linting time on kingpin from 0.97s to 0.64s.
- if !config.EnableGC {
- _ = os.Setenv("GOGC", "off")
- }
- if config.VendoredLinters && config.Install && config.Update {
- warning(`Linters are now vendored by default, --update ignored. The original
-behaviour can be re-enabled with --no-vendored-linters.
-
-To request an update for a vendored linter file an issue at:
-https://github.com/alecthomas/gometalinter/issues/new
-`)
- config.Update = false
- }
- // Force sorting by path if checkstyle mode is selected
- // !jsonFlag check is required to handle:
- // gometalinter --json --checkstyle --sort=severity
- if config.Checkstyle && !config.JSON {
- config.Sort = []string{"path"}
- }
-
- // PlaceHolder to skipping "vendor" directory if GO15VENDOREXPERIMENT=1 is enabled.
- // TODO(alec): This will probably need to be enabled by default at a later time.
- if os.Getenv("GO15VENDOREXPERIMENT") == "1" || config.Vendor {
- if err := os.Setenv("GO15VENDOREXPERIMENT", "1"); err != nil {
- warning("setenv GO15VENDOREXPERIMENT: %s", err)
- }
- config.Skip = append(config.Skip, "vendor")
- config.Vendor = true
- }
- if len(config.Exclude) > 0 {
- exclude = regexp.MustCompile(strings.Join(config.Exclude, "|"))
- }
-
- if len(config.Include) > 0 {
- include = regexp.MustCompile(strings.Join(config.Include, "|"))
- }
-
- runtime.GOMAXPROCS(config.Concurrency)
- return include, exclude
-}
-
-func outputToConsole(issues chan *Issue) int {
- status := 0
- for issue := range issues {
- if config.Errors && issue.Severity != Error {
- continue
- }
- fmt.Println(issue.String())
- status = 1
- }
- return status
-}
-
-func outputToJSON(issues chan *Issue) int {
- fmt.Println("[")
- status := 0
- for issue := range issues {
- if config.Errors && issue.Severity != Error {
- continue
- }
- if status != 0 {
- fmt.Printf(",\n")
- }
- d, err := json.Marshal(issue)
- kingpin.FatalIfError(err, "")
- fmt.Printf(" %s", d)
- status = 1
- }
- fmt.Printf("\n]\n")
- return status
-}
-
-func resolvePaths(paths, skip []string) []string {
- if len(paths) == 0 {
- return []string{"."}
- }
-
- skipPath := newPathFilter(skip)
- dirs := newStringSet()
- for _, path := range paths {
- if strings.HasSuffix(path, "/...") {
- root := filepath.Dir(path)
- _ = filepath.Walk(root, func(p string, i os.FileInfo, err error) error {
- if err != nil {
- warning("invalid path %q: %s", p, err)
- return err
- }
-
- skip := skipPath(p)
- switch {
- case i.IsDir() && skip:
- return filepath.SkipDir
- case !i.IsDir() && !skip && strings.HasSuffix(p, ".go"):
- dirs.add(filepath.Clean(filepath.Dir(p)))
- }
- return nil
- })
- } else {
- dirs.add(filepath.Clean(path))
- }
- }
- out := make([]string, 0, dirs.size())
- for _, d := range dirs.asSlice() {
- out = append(out, relativePackagePath(d))
- }
- sort.Strings(out)
- for _, d := range out {
- debug("linting path %s", d)
- }
- return out
-}
-
-func newPathFilter(skip []string) func(string) bool {
- filter := map[string]bool{}
- for _, name := range skip {
- filter[name] = true
- }
-
- return func(path string) bool {
- base := filepath.Base(path)
- if filter[base] || filter[path] {
- return true
- }
- return base != "." && base != ".." && strings.ContainsAny(base[0:1], "_.")
- }
-}
-
-func relativePackagePath(dir string) string {
- if filepath.IsAbs(dir) || strings.HasPrefix(dir, ".") {
- return dir
- }
- // package names must start with a ./
- return "./" + dir
-}
-
-func lintersFromConfig(config *Config) map[string]*Linter {
- out := map[string]*Linter{}
- config.Enable = replaceWithMegacheck(config.Enable, config.EnableAll)
- for _, name := range config.Enable {
- linter := getLinterByName(name, LinterConfig(config.Linters[name]))
- if config.Fast && !linter.IsFast {
- continue
- }
- out[name] = linter
- }
- for _, linter := range config.Disable {
- delete(out, linter)
- }
- return out
-}
-
-// replaceWithMegacheck checks enabled linters if they duplicate megacheck and
-// returns a either a revised list removing those and adding megacheck or an
-// unchanged slice. Emits a warning if linters were removed and swapped with
-// megacheck.
-func replaceWithMegacheck(enabled []string, enableAll bool) []string {
- var (
- staticcheck,
- gosimple,
- unused bool
- revised []string
- )
- for _, linter := range enabled {
- switch linter {
- case "staticcheck":
- staticcheck = true
- case "gosimple":
- gosimple = true
- case "unused":
- unused = true
- case "megacheck":
- // Don't add to revised slice, we'll add it later
- default:
- revised = append(revised, linter)
- }
- }
- if staticcheck && gosimple && unused {
- if !enableAll {
- warning("staticcheck, gosimple and unused are all set, using megacheck instead")
- }
- return append(revised, "megacheck")
- }
- return enabled
-}
-
-func findVendoredLinters() string {
- gopaths := getGoPathList()
- for _, home := range vendoredSearchPaths {
- for _, p := range gopaths {
- joined := append([]string{p, "src"}, home...)
- vendorRoot := filepath.Join(joined...)
- if _, err := os.Stat(vendorRoot); err == nil {
- return vendorRoot
- }
- }
- }
- return ""
-}
-
-// Go 1.8 compatible GOPATH.
-func getGoPath() string {
- path := os.Getenv("GOPATH")
- if path == "" {
- user, err := user.Current()
- kingpin.FatalIfError(err, "")
- path = filepath.Join(user.HomeDir, "go")
- }
- return path
-}
-
-func getGoPathList() []string {
- return strings.Split(getGoPath(), string(os.PathListSeparator))
-}
-
-// addPath appends path to paths if path does not already exist in paths. Returns
-// the new paths.
-func addPath(paths []string, path string) []string {
- for _, existingpath := range paths {
- if path == existingpath {
- return paths
- }
- }
- return append(paths, path)
-}
-
-// configureEnvironment adds all `bin/` directories from $GOPATH to $PATH
-func configureEnvironment() {
- paths := addGoBinsToPath(getGoPathList())
- setEnv("PATH", strings.Join(paths, string(os.PathListSeparator)))
- debugPrintEnv()
-}
-
-func addGoBinsToPath(gopaths []string) []string {
- paths := strings.Split(os.Getenv("PATH"), string(os.PathListSeparator))
- for _, p := range gopaths {
- paths = addPath(paths, filepath.Join(p, "bin"))
- }
- gobin := os.Getenv("GOBIN")
- if gobin != "" {
- paths = addPath(paths, gobin)
- }
- return paths
-}
-
-// configureEnvironmentForInstall sets GOPATH and GOBIN so that vendored linters
-// can be installed
-func configureEnvironmentForInstall() {
- gopaths := getGoPathList()
- vendorRoot := findVendoredLinters()
- if vendorRoot == "" {
- kingpin.Fatalf("could not find vendored linters in GOPATH=%q", getGoPath())
- }
- debug("found vendored linters at %s, updating environment", vendorRoot)
-
- gobin := os.Getenv("GOBIN")
- if gobin == "" {
- gobin = filepath.Join(gopaths[0], "bin")
- }
- setEnv("GOBIN", gobin)
-
- // "go install" panics when one GOPATH element is beneath another, so set
- // GOPATH to the vendor root
- setEnv("GOPATH", vendorRoot)
- debugPrintEnv()
-}
-
-func setEnv(key string, value string) {
- if err := os.Setenv(key, value); err != nil {
- warning("setenv %s: %s", key, err)
- }
-}
-
-func debugPrintEnv() {
- debug("PATH=%s", os.Getenv("PATH"))
- debug("GOPATH=%s", os.Getenv("GOPATH"))
- debug("GOBIN=%s", os.Getenv("GOBIN"))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/main_test.go b/vendor/src/github.com/alecthomas/gometalinter/main_test.go
deleted file mode 100644
index e67961aa0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/main_test.go
+++ /dev/null
@@ -1,252 +0,0 @@
-package main
-
-import (
- "io/ioutil"
- "os"
- "path/filepath"
- "testing"
- "time"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "gopkg.in/alecthomas/kingpin.v3-unstable"
-)
-
-func TestRelativePackagePath(t *testing.T) {
- var testcases = []struct {
- dir string
- expected string
- }{
- {
- dir: "/abs/path",
- expected: "/abs/path",
- },
- {
- dir: ".",
- expected: ".",
- },
- {
- dir: "./foo",
- expected: "./foo",
- },
- {
- dir: "relative/path",
- expected: "./relative/path",
- },
- }
-
- for _, testcase := range testcases {
- assert.Equal(t, testcase.expected, relativePackagePath(testcase.dir))
- }
-}
-
-func TestResolvePathsNoPaths(t *testing.T) {
- paths := resolvePaths(nil, nil)
- assert.Equal(t, []string{"."}, paths)
-}
-
-func TestResolvePathsNoExpands(t *testing.T) {
- // Non-expanded paths should not be filtered by the skip path list
- paths := resolvePaths([]string{".", "foo", "foo/bar"}, []string{"foo/bar"})
- expected := []string{".", "./foo", "./foo/bar"}
- assert.Equal(t, expected, paths)
-}
-
-func TestResolvePathsWithExpands(t *testing.T) {
- tmpdir, cleanup := setupTempDir(t)
- defer cleanup()
-
- mkGoFile(t, tmpdir, "file.go")
- mkDir(t, tmpdir, "exclude")
- mkDir(t, tmpdir, "other", "exclude")
- mkDir(t, tmpdir, "include")
- mkDir(t, tmpdir, "include", "foo")
- mkDir(t, tmpdir, "duplicate")
- mkDir(t, tmpdir, ".exclude")
- mkDir(t, tmpdir, "include", ".exclude")
- mkDir(t, tmpdir, "_exclude")
- mkDir(t, tmpdir, "include", "_exclude")
-
- filterPaths := []string{"exclude", "other/exclude"}
- paths := resolvePaths([]string{"./...", "foo", "duplicate"}, filterPaths)
-
- expected := []string{
- ".",
- "./duplicate",
- "./foo",
- "./include",
- "./include/foo",
- }
- assert.Equal(t, expected, paths)
-}
-
-func setupTempDir(t *testing.T) (string, func()) {
- tmpdir, err := ioutil.TempDir("", "test-expand-paths")
- require.NoError(t, err)
-
- oldwd, err := os.Getwd()
- require.NoError(t, err)
- require.NoError(t, os.Chdir(tmpdir))
-
- return tmpdir, func() {
- os.RemoveAll(tmpdir)
- require.NoError(t, os.Chdir(oldwd))
- }
-}
-
-func mkDir(t *testing.T, paths ...string) {
- fullPath := filepath.Join(paths...)
- require.NoError(t, os.MkdirAll(fullPath, 0755))
- mkGoFile(t, fullPath, "file.go")
-}
-
-func mkGoFile(t *testing.T, path string, filename string) {
- content := []byte("package foo")
- err := ioutil.WriteFile(filepath.Join(path, filename), content, 0644)
- require.NoError(t, err)
-}
-
-func TestPathFilter(t *testing.T) {
- skip := []string{"exclude", "skip.go"}
- pathFilter := newPathFilter(skip)
-
- var testcases = []struct {
- path string
- expected bool
- }{
- {path: "exclude", expected: true},
- {path: "something/skip.go", expected: true},
- {path: "skip.go", expected: true},
- {path: ".git", expected: true},
- {path: "_ignore", expected: true},
- {path: "include.go", expected: false},
- {path: ".", expected: false},
- {path: "..", expected: false},
- }
-
- for _, testcase := range testcases {
- assert.Equal(t, testcase.expected, pathFilter(testcase.path), testcase.path)
- }
-}
-
-func TestLoadConfigWithDeadline(t *testing.T) {
- originalConfig := *config
- defer func() { config = &originalConfig }()
-
- tmpfile, err := ioutil.TempFile("", "test-config")
- require.NoError(t, err)
- defer os.Remove(tmpfile.Name())
-
- _, err = tmpfile.Write([]byte(`{"Deadline": "3m"}`))
- require.NoError(t, err)
- require.NoError(t, tmpfile.Close())
-
- filename := tmpfile.Name()
- err = loadConfig(nil, &kingpin.ParseElement{Value: &filename}, nil)
- require.NoError(t, err)
-
- require.Equal(t, 3*time.Minute, config.Deadline.Duration())
-}
-
-func TestDeadlineFlag(t *testing.T) {
- app := kingpin.New("test-app", "")
- setupFlags(app)
- _, err := app.Parse([]string{"--deadline", "2m"})
- require.NoError(t, err)
- require.Equal(t, 2*time.Minute, config.Deadline.Duration())
-}
-
-func TestAddPath(t *testing.T) {
- paths := []string{"existing"}
- assert.Equal(t, paths, addPath(paths, "existing"))
- expected := []string{"existing", "new"}
- assert.Equal(t, expected, addPath(paths, "new"))
-}
-
-func TestSetupFlagsLinterFlag(t *testing.T) {
- originalConfig := *config
- defer func() { config = &originalConfig }()
-
- app := kingpin.New("test-app", "")
- setupFlags(app)
- _, err := app.Parse([]string{"--linter", "a:b:c"})
- require.NoError(t, err)
- linter, ok := config.Linters["a"]
- assert.True(t, ok)
- assert.Equal(t, "b", linter.Command)
- assert.Equal(t, "c", linter.Pattern)
-}
-
-func TestSetupFlagsConfigWithLinterString(t *testing.T) {
- originalConfig := *config
- defer func() { config = &originalConfig }()
-
- tmpfile, err := ioutil.TempFile("", "test-config")
- require.NoError(t, err)
- defer os.Remove(tmpfile.Name())
-
- _, err = tmpfile.Write([]byte(`{"Linters": {"linter": "command:path"} }`))
- require.NoError(t, err)
- require.NoError(t, tmpfile.Close())
-
- app := kingpin.New("test-app", "")
- setupFlags(app)
-
- _, err = app.Parse([]string{"--config", tmpfile.Name()})
- require.NoError(t, err)
- linter, ok := config.Linters["linter"]
- assert.True(t, ok)
- assert.Equal(t, "command", linter.Command)
- assert.Equal(t, "path", linter.Pattern)
-}
-
-func TestSetupFlagsConfigWithLinterMap(t *testing.T) {
- originalConfig := *config
- defer func() { config = &originalConfig }()
-
- tmpfile, err := ioutil.TempFile("", "test-config")
- require.NoError(t, err)
- defer os.Remove(tmpfile.Name())
-
- _, err = tmpfile.Write([]byte(`{"Linters":
- {"linter":
- { "Command": "command" }}}`))
- require.NoError(t, err)
- require.NoError(t, tmpfile.Close())
-
- app := kingpin.New("test-app", "")
- setupFlags(app)
-
- _, err = app.Parse([]string{"--config", tmpfile.Name()})
- require.NoError(t, err)
- linter, ok := config.Linters["linter"]
- assert.True(t, ok)
- assert.Equal(t, "command", linter.Command)
- assert.Equal(t, "", linter.Pattern)
-}
-
-func TestSetupFlagsConfigAndLinterFlag(t *testing.T) {
- originalConfig := *config
- defer func() { config = &originalConfig }()
-
- tmpfile, err := ioutil.TempFile("", "test-config")
- require.NoError(t, err)
- defer os.Remove(tmpfile.Name())
-
- _, err = tmpfile.Write([]byte(`{"Linters":
- {"linter": { "Command": "some-command" }}}`))
- require.NoError(t, err)
- require.NoError(t, tmpfile.Close())
-
- app := kingpin.New("test-app", "")
- setupFlags(app)
-
- _, err = app.Parse([]string{
- "--config", tmpfile.Name(),
- "--linter", "linter:command:pattern"})
- require.NoError(t, err)
- linter, ok := config.Linters["linter"]
- assert.True(t, ok)
- assert.Equal(t, "command", linter.Command)
- assert.Equal(t, "pattern", linter.Pattern)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/package.sh b/vendor/src/github.com/alecthomas/gometalinter/package.sh
deleted file mode 100644
index fe365d25a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/package.sh
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/bin/bash -e
-
-# Only build packages for tagged releases
-TAG="$(git tag -l --points-at HEAD)"
-
-export CGO_ENABLED=0
-
-GO_VERSION="$(go version | awk '{print $3}' | cut -d. -f1-2)"
-
-if [ "$GO_VERSION" != "go1.9" ]; then
- echo "$0: not packaging; not on Go 1.9"
- exit 0
-fi
-
-if echo "$TAG" | grep -q '^v[0-9]\.[0-9]\.[0-9]\(-.*\)?$' && false; then
- echo "$0: not packaging; no tag or tag not in semver format"
- exit 0
-fi
-
-LINTERS="
- github.com/alecthomas/gocyclo
- github.com/alexkohler/nakedret
- github.com/client9/misspell/cmd/misspell
- github.com/dnephin/govet
- github.com/GoASTScanner/gas
- github.com/golang/lint/golint
- github.com/gordonklaus/ineffassign
- github.com/jgautheron/goconst/cmd/goconst
- github.com/kisielk/errcheck
- github.com/mdempsky/maligned
- github.com/mdempsky/unconvert
- github.com/mibk/dupl
- github.com/opennota/check/cmd/structcheck
- github.com/opennota/check/cmd/varcheck
- github.com/stripe/safesql
- github.com/tsenart/deadcode
- github.com/walle/lll/cmd/lll
- golang.org/x/tools/cmd/goimports
- golang.org/x/tools/cmd/gotype
- honnef.co/go/tools/cmd/gosimple
- honnef.co/go/tools/cmd/megacheck
- honnef.co/go/tools/cmd/staticcheck
- honnef.co/go/tools/cmd/unused
- mvdan.cc/interfacer
- mvdan.cc/unparam
-"
-
-eval "$(go env | FS='' awk '{printf "REAL_%s\n", $0}')"
-
-function install_go_binary() {
- local SRC
- if [ "$GOOS" = "$REAL_GOOS" -a "$GOARCH" = "$REAL_GOARCH" ]; then
- SRC="${GOPATH}/bin"
- else
- SRC="${GOPATH}/bin/${GOOS}_${GOARCH}"
- fi
- install -m 755 "${SRC}/${1}${SUFFIX}" "${2}"
-}
-
-function packager() {
- if [ "$GOOS" = "windows" ]; then
- zip -9 -r -o "${1}".zip "${1}"
- else
- tar cvfj "${1}".tar.bz2 "${1}"
- fi
-}
-
-rm -rf "${PWD}/dist"
-
-for GOOS in linux darwin windows; do
- SUFFIX=""
- if [ "$GOOS" = "windows" ]; then
- SUFFIX=".exe"
- fi
-
- for GOARCH in 386 amd64; do
- export GOPATH="${REAL_GOPATH}"
- DEST="${PWD}/dist/gometalinter-${TAG}-${GOOS}-${GOARCH}"
- install -d -m 755 "${DEST}/linters"
- install -m 644 COPYING "${DEST}"
- cat << EOF > "${DEST}/README.txt"
-gometalinter is a tool to normalise the output of Go linters.
-See https://github.com/alecthomas/gometalinter for more information.
-
-This is a binary distribution of gometalinter ${TAG}.
-
-All binaries must be installed in the PATH for gometalinter to operate correctly.
-EOF
- echo "${DEST}"
- export GOOS GOARCH
-
- go build -i .
- go build -o "${DEST}/gometalinter${SUFFIX}" -ldflags="-X main.Version=${TAG}" .
-
- export GOPATH="$PWD/_linters"
-
- go install -v ${LINTERS}
- for LINTER in ${LINTERS}; do
- install_go_binary $(basename ${LINTER}) "${DEST}/linters"
- done
-
- (cd "${DEST}/.." && packager "$(basename ${DEST})")
- done
-done
diff --git a/vendor/src/github.com/alecthomas/gometalinter/partition.go b/vendor/src/github.com/alecthomas/gometalinter/partition.go
deleted file mode 100644
index a4a8ce5a5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/partition.go
+++ /dev/null
@@ -1,163 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "fmt"
- "path/filepath"
-)
-
-// MaxCommandBytes is the maximum number of bytes used when executing a command
-const MaxCommandBytes = 32000
-
-type partitionStrategy func([]string, []string) ([][]string, error)
-
-func (ps *partitionStrategy) UnmarshalJSON(raw []byte) error {
- var strategyName string
- if err := json.Unmarshal(raw, &strategyName); err != nil {
- return err
- }
-
- switch strategyName {
- case "directories":
- *ps = partitionPathsAsDirectories
- case "files":
- *ps = partitionPathsAsFiles
- case "packages":
- *ps = partitionPathsAsPackages
- case "files-by-package":
- *ps = partitionPathsAsFilesGroupedByPackage
- case "single-directory":
- *ps = partitionPathsByDirectory
- default:
- return fmt.Errorf("unknown parition strategy %s", strategyName)
- }
- return nil
-}
-
-func pathsToFileGlobs(paths []string) ([]string, error) {
- filePaths := []string{}
- for _, dir := range paths {
- paths, err := filepath.Glob(filepath.Join(dir, "*.go"))
- if err != nil {
- return nil, err
- }
- filePaths = append(filePaths, paths...)
- }
- return filePaths, nil
-}
-
-func partitionPathsAsDirectories(cmdArgs []string, paths []string) ([][]string, error) {
- return partitionToMaxSize(cmdArgs, paths, MaxCommandBytes), nil
-}
-
-func partitionToMaxSize(cmdArgs []string, paths []string, maxSize int) [][]string {
- partitions := newSizePartitioner(cmdArgs, maxSize)
- for _, path := range paths {
- partitions.add(path)
- }
- return partitions.end()
-}
-
-type sizePartitioner struct {
- base []string
- parts [][]string
- current []string
- size int
- max int
-}
-
-func newSizePartitioner(base []string, max int) *sizePartitioner {
- p := &sizePartitioner{base: base, max: max}
- p.new()
- return p
-}
-
-func (p *sizePartitioner) add(arg string) {
- if p.size+len(arg)+1 > p.max {
- p.new()
- }
- p.current = append(p.current, arg)
- p.size += len(arg) + 1
-}
-
-func (p *sizePartitioner) new() {
- p.end()
- p.size = 0
- p.current = []string{}
- for _, arg := range p.base {
- p.add(arg)
- }
-}
-
-func (p *sizePartitioner) end() [][]string {
- if len(p.current) > 0 {
- p.parts = append(p.parts, p.current)
- }
- return p.parts
-}
-
-func partitionPathsAsFiles(cmdArgs []string, paths []string) ([][]string, error) {
- filePaths, err := pathsToFileGlobs(paths)
- if err != nil || len(filePaths) == 0 {
- return nil, err
- }
- return partitionPathsAsDirectories(cmdArgs, filePaths)
-}
-
-func partitionPathsAsFilesGroupedByPackage(cmdArgs []string, paths []string) ([][]string, error) {
- parts := [][]string{}
- for _, path := range paths {
- filePaths, err := pathsToFileGlobs([]string{path})
- if err != nil {
- return nil, err
- }
- if len(filePaths) == 0 {
- continue
- }
- parts = append(parts, append(cmdArgs, filePaths...))
- }
- return parts, nil
-}
-
-func partitionPathsAsPackages(cmdArgs []string, paths []string) ([][]string, error) {
- packagePaths, err := pathsToPackagePaths(paths)
- if err != nil || len(packagePaths) == 0 {
- return nil, err
- }
- return partitionPathsAsDirectories(cmdArgs, packagePaths)
-}
-
-func pathsToPackagePaths(paths []string) ([]string, error) {
- packages := []string{}
-
- for _, path := range paths {
- pkg, err := packageNameFromPath(path)
- if err != nil {
- return nil, err
- }
- packages = append(packages, pkg)
- }
- return packages, nil
-}
-
-func packageNameFromPath(path string) (string, error) {
- if !filepath.IsAbs(path) {
- return path, nil
- }
- for _, gopath := range getGoPathList() {
- rel, err := filepath.Rel(filepath.Join(gopath, "src"), path)
- if err != nil {
- continue
- }
- return rel, nil
- }
- return "", fmt.Errorf("%s not in GOPATH", path)
-}
-
-func partitionPathsByDirectory(cmdArgs []string, paths []string) ([][]string, error) {
- parts := [][]string{}
- for _, path := range paths {
- parts = append(parts, append(cmdArgs, path))
- }
- return parts, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/partition_test.go b/vendor/src/github.com/alecthomas/gometalinter/partition_test.go
deleted file mode 100644
index e146486b3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/partition_test.go
+++ /dev/null
@@ -1,114 +0,0 @@
-package main
-
-import (
- "io/ioutil"
- "os"
- "path/filepath"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestPartitionToMaxSize(t *testing.T) {
- cmdArgs := []string{"/usr/bin/foo", "-c"}
- paths := []string{"one", "two", "three", "four"}
-
- parts := partitionToMaxSize(cmdArgs, paths, 24)
- expected := [][]string{
- append(cmdArgs, "one", "two"),
- append(cmdArgs, "three"),
- append(cmdArgs, "four"),
- }
- assert.Equal(t, expected, parts)
-}
-
-func TestPartitionToPackageFileGlobs(t *testing.T) {
- tmpdir, err := ioutil.TempDir("", "test-expand-paths")
- require.NoError(t, err)
- defer os.RemoveAll(tmpdir)
-
- cmdArgs := []string{"/usr/bin/foo", "-c"}
- paths := []string{
- filepath.Join(tmpdir, "one"),
- filepath.Join(tmpdir, "two"),
- }
- for _, dir := range paths {
- mkDir(t, dir)
- mkGoFile(t, dir, "other.go")
- }
-
- parts, err := partitionPathsAsFilesGroupedByPackage(cmdArgs, paths)
- require.NoError(t, err)
- expected := [][]string{
- append(cmdArgs, packagePaths(paths[0], "file.go", "other.go")...),
- append(cmdArgs, packagePaths(paths[1], "file.go", "other.go")...),
- }
- assert.Equal(t, expected, parts)
-}
-
-func packagePaths(dir string, filenames ...string) []string {
- paths := []string{}
- for _, filename := range filenames {
- paths = append(paths, filepath.Join(dir, filename))
- }
- return paths
-}
-
-func TestPartitionToPackageFileGlobsNoFiles(t *testing.T) {
- tmpdir, err := ioutil.TempDir("", "test-expand-paths")
- require.NoError(t, err)
- defer os.RemoveAll(tmpdir)
-
- cmdArgs := []string{"/usr/bin/foo", "-c"}
- paths := []string{filepath.Join(tmpdir, "one"), filepath.Join(tmpdir, "two")}
- parts, err := partitionPathsAsFilesGroupedByPackage(cmdArgs, paths)
- require.NoError(t, err)
- assert.Len(t, parts, 0)
-}
-
-func TestPartitionToMaxArgSizeWithFileGlobsNoFiles(t *testing.T) {
- tmpdir, err := ioutil.TempDir("", "test-expand-paths")
- require.NoError(t, err)
- defer os.RemoveAll(tmpdir)
-
- cmdArgs := []string{"/usr/bin/foo", "-c"}
- paths := []string{filepath.Join(tmpdir, "one"), filepath.Join(tmpdir, "two")}
- parts, err := partitionPathsAsFiles(cmdArgs, paths)
- require.NoError(t, err)
- assert.Len(t, parts, 0)
-}
-
-func TestPathsToPackagePaths(t *testing.T) {
- root := "/fake/root"
- defer fakeGoPath(t, root)()
-
- packagePaths, err := pathsToPackagePaths([]string{
- filepath.Join(root, "src", "example.com", "foo"),
- "./relative/package",
- })
- require.NoError(t, err)
- expected := []string{"example.com/foo", "./relative/package"}
- assert.Equal(t, expected, packagePaths)
-}
-
-func fakeGoPath(t *testing.T, path string) func() {
- oldpath := os.Getenv("GOPATH")
- require.NoError(t, os.Setenv("GOPATH", path))
- return func() { require.NoError(t, os.Setenv("GOPATH", oldpath)) }
-}
-
-func TestPartitionPathsByDirectory(t *testing.T) {
- cmdArgs := []string{"/usr/bin/foo", "-c"}
- paths := []string{"one", "two", "three"}
-
- parts, err := partitionPathsByDirectory(cmdArgs, paths)
- require.NoError(t, err)
- expected := [][]string{
- append(cmdArgs, "one"),
- append(cmdArgs, "two"),
- append(cmdArgs, "three"),
- }
- assert.Equal(t, expected, parts)
-
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/README.md b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/README.md
deleted file mode 100644
index 540a73a79..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Regression tests for gometalinter
-
-These tests run specific linters through gometalinter and verify that they
-output what we expect from a particular piece of source code.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/deadcode_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/deadcode_test.go
deleted file mode 100644
index 488771d35..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/deadcode_test.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestDeadcode(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func test() {
- return
- println("hello")
-}
-`
- expected := Issues{
- {Linter: "deadcode", Severity: "warning", Path: "test.go", Line: 3, Col: 1, Message: "test is unused"},
- }
- ExpectIssues(t, "deadcode", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/dupl_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/dupl_test.go
deleted file mode 100644
index f8a92104b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/dupl_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestDupl(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func findVendoredLinters() string {
- gopaths := strings.Split(os.Getenv("GOPATH"), string(os.PathListSeparator))
- for _, home := range vendoredSearchPaths {
- for _, p := range gopaths {
- joined := append([]string{p, "src"}, home...)
- vendorRoot := filepath.Join(joined...)
- fmt.Println(vendorRoot)
- if _, err := os.Stat(vendorRoot); err == nil {
- return vendorRoot
- }
- }
- }
- return ""
-
-}
-
-func two() string {
- gopaths := strings.Split(os.Getenv("GOPATH"), string(os.PathListSeparator))
- for _, home := range vendoredSearchPaths {
- for _, p := range gopaths {
- joined := append([]string{p, "src"}, home...)
- vendorRoot := filepath.Join(joined...)
- fmt.Println(vendorRoot)
- if _, err := os.Stat(vendorRoot); err == nil {
- return vendorRoot
- }
- }
- }
- return ""
-
-}
-`
-
- expected := Issues{
- {Linter: "dupl", Severity: "warning", Path: "test.go", Line: 3, Col: 0, Message: "duplicate of test.go:19-33"},
- {Linter: "dupl", Severity: "warning", Path: "test.go", Line: 19, Col: 0, Message: "duplicate of test.go:3-17"},
- }
- ExpectIssues(t, "dupl", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/errcheck_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/errcheck_test.go
deleted file mode 100644
index c5500a18b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/errcheck_test.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestErrcheck(t *testing.T) {
- t.Parallel()
- source := `package moo
-
-func f() error { return nil}
-func test() { f() }
-`
- expected := Issues{
- {Linter: "errcheck", Severity: "warning", Path: "test.go", Line: 4, Col: 16, Message: "error return value not checked (func test() { f() })"},
- }
- ExpectIssues(t, "errcheck", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gas_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gas_test.go
deleted file mode 100644
index 51c07270b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gas_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package regressiontests
-
-import (
- "fmt"
- "testing"
-
- "github.com/gotestyourself/gotestyourself/fs"
- "github.com/stretchr/testify/assert"
-)
-
-func TestGas(t *testing.T) {
- t.Parallel()
- dir := fs.NewDir(t, "test-gas",
- fs.WithFile("file.go", gasFileErrorUnhandled("root")),
- fs.WithDir("sub",
- fs.WithFile("file.go", gasFileErrorUnhandled("sub"))))
- defer dir.Remove()
- expected := Issues{
- {Linter: "gas", Severity: "warning", Path: "file.go", Line: 3, Col: 0, Message: "Errors unhandled.,LOW,HIGH"},
- {Linter: "gas", Severity: "warning", Path: "sub/file.go", Line: 3, Col: 0, Message: "Errors unhandled.,LOW,HIGH"},
- }
- actual := RunLinter(t, "gas", dir.Path())
- assert.Equal(t, expected, actual)
-}
-
-func gasFileErrorUnhandled(pkg string) string {
- return fmt.Sprintf(`package %s
- func badFunction() string {
- u, _ := ErrorHandle()
- return u
- }
-
- func ErrorHandle() (u string, err error) {
- return u
- }
- `, pkg)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/goconst_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/goconst_test.go
deleted file mode 100644
index 80ad6fffa..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/goconst_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestGoconst(t *testing.T) {
- t.Parallel()
- source := `package test
-func a() {
- foo := "bar"
-}
-func b() {
- bar := "bar"
-}
-`
- expected := Issues{
- {Linter: "goconst", Severity: "warning", Path: "test.go", Line: 3, Col: 9, Message: `1 other occurrence(s) of "bar" found in: test.go:6:9`},
- {Linter: "goconst", Severity: "warning", Path: "test.go", Line: 6, Col: 9, Message: `1 other occurrence(s) of "bar" found in: test.go:3:9`},
- }
- ExpectIssues(t, "goconst", source, expected, "--min-occurrences", "2")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gocyclo_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gocyclo_test.go
deleted file mode 100644
index d555d8fcf..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gocyclo_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestGocyclo(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func processOutput(state *linterState, out []byte) {
- re := state.Match()
- all := re.FindAllSubmatchIndex(out, -1)
- debug("%s hits %d: %s", state.name, len(all), state.pattern)
- for _, indices := range all {
- group := [][]byte{}
- for i := 0; i < len(indices); i += 2 {
- fragment := out[indices[i]:indices[i+1]]
- group = append(group, fragment)
- }
-
- issue := &Issue{}
- issue.Linter = Linter(state.name)
- for i, name := range re.SubexpNames() {
- part := string(group[i])
- if name != "" {
- state.vars[name] = part
- }
- switch name {
- case "path":
- issue.Path = part
-
- case "line":
- n, err := strconv.ParseInt(part, 10, 32)
- kingpin.FatalIfError(err, "line matched invalid integer")
- issue.Line = int(n)
-
- case "col":
- n, err := strconv.ParseInt(part, 10, 32)
- kingpin.FatalIfError(err, "col matched invalid integer")
- issue.Col = int(n)
-
- case "message":
- issue.Message = part
-
- case "":
- }
- }
- if m, ok := linterMessageOverrideFlag[state.name]; ok {
- issue.Message = state.vars.Replace(m)
- }
- if sev, ok := linterSeverityFlag[state.name]; ok {
- issue.Severity = Severity(sev)
- } else {
- issue.Severity = "error"
- }
- if state.filter != nil && state.filter.MatchString(issue.String()) {
- continue
- }
- state.issues <- issue
- }
- return
-}
-`
- expected := Issues{
- {Linter: "gocyclo", Severity: "warning", Path: "test.go", Line: 3, Col: 0, Message: "cyclomatic complexity 14 of function processOutput() is high (> 10)"},
- }
- ExpectIssues(t, "gocyclo", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gofmt_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gofmt_test.go
deleted file mode 100644
index a0e35a7b1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gofmt_test.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestGofmt(t *testing.T) {
- t.Parallel()
- source := `
-package test
-func test() { if nil {} }
-`
- expected := Issues{
- {Linter: "gofmt", Severity: "warning", Path: "test.go", Line: 1, Col: 0, Message: "file is not gofmted with -s"},
- }
- ExpectIssues(t, "gofmt", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/goimports_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/goimports_test.go
deleted file mode 100644
index 14881c854..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/goimports_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestGoimports(t *testing.T) {
- source := `
-package test
-func test() {fmt.Println(nil)}
-`
- expected := Issues{
- {Linter: "goimports", Severity: "warning", Path: "test.go", Line: 1, Col: 0, Message: "file is not goimported"},
- }
- ExpectIssues(t, "goimports", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/golint_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/golint_test.go
deleted file mode 100644
index 99a812526..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/golint_test.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestGolint(t *testing.T) {
- t.Parallel()
- source := `
-package test
-
-type Foo int
-`
- expected := Issues{
- {Linter: "golint", Severity: "warning", Path: "test.go", Line: 4, Col: 6, Message: "exported type Foo should have comment or be unexported"},
- }
- ExpectIssues(t, "golint", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gosimple_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gosimple_test.go
deleted file mode 100644
index 623e87368..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gosimple_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestGoSimple(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func a(ok bool, ch chan bool) {
- select {
- case <- ch:
- }
-
- for {
- select {
- case <- ch:
- }
- }
-
- if ok == true {
- }
-}
-`
- expected := Issues{
- {Linter: "gosimple", Severity: "warning", Path: "test.go", Line: 4, Col: 2, Message: "should use a simple channel send/receive instead of select with a single case (S1000)"},
- {Linter: "gosimple", Severity: "warning", Path: "test.go", Line: 8, Col: 2, Message: "should use for range instead of for { select {} } (S1000)"},
- {Linter: "gosimple", Severity: "warning", Path: "test.go", Line: 14, Col: 5, Message: "should omit comparison to bool constant, can be simplified to ok (S1002)"},
- }
- ExpectIssues(t, "gosimple", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gotype_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gotype_test.go
deleted file mode 100644
index ce6e7ff39..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/gotype_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package regressiontests
-
-import (
- "fmt"
- "testing"
-
- "github.com/gotestyourself/gotestyourself/fs"
- "github.com/stretchr/testify/assert"
-)
-
-func TestGoType(t *testing.T) {
- t.Parallel()
-
- dir := fs.NewDir(t, "test-gotype",
- fs.WithFile("file.go", goTypeFile("root")),
- fs.WithDir("sub",
- fs.WithFile("file.go", goTypeFile("sub"))),
- fs.WithDir("excluded",
- fs.WithFile("file.go", goTypeFile("excluded"))))
- defer dir.Remove()
-
- expected := Issues{
- {Linter: "gotype", Severity: "error", Path: "file.go", Line: 4, Col: 6, Message: "foo declared but not used"},
- {Linter: "gotype", Severity: "error", Path: "sub/file.go", Line: 4, Col: 6, Message: "foo declared but not used"},
- }
- actual := RunLinter(t, "gotype", dir.Path(), "--skip=excluded")
- assert.Equal(t, expected, actual)
-}
-
-func TestGoTypeWithMultiPackageDirectoryTest(t *testing.T) {
- t.Parallel()
-
- dir := fs.NewDir(t, "test-gotype",
- fs.WithFile("file.go", goTypeFile("root")),
- fs.WithFile("file_test.go", goTypeFile("root_test")))
- defer dir.Remove()
-
- expected := Issues{
- {Linter: "gotype", Severity: "error", Path: "file.go", Line: 4, Col: 6, Message: "foo declared but not used"},
- {Linter: "gotypex", Severity: "error", Path: "file_test.go", Line: 4, Col: 6, Message: "foo declared but not used"},
- }
- actual := RunLinter(t, "gotype", dir.Path())
- actual = append(actual, RunLinter(t, "gotypex", dir.Path())...)
- assert.Equal(t, expected, actual)
-}
-
-
-func goTypeFile(pkg string) string {
- return fmt.Sprintf(`package %s
-
-func badFunction() {
- var foo string
-}
- `, pkg)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/ineffassign_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/ineffassign_test.go
deleted file mode 100644
index 6a0444142..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/ineffassign_test.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestIneffassign(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func test() {
- a := 1
-}`
- expected := Issues{
- {Linter: "ineffassign", Severity: "warning", Path: "test.go", Line: 4, Col: 2, Message: "ineffectual assignment to a"},
- }
- ExpectIssues(t, "ineffassign", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/interfacer_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/interfacer_test.go
deleted file mode 100644
index 5c17286d4..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/interfacer_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestInterfacer(t *testing.T) {
- t.Parallel()
- expected := Issues{
- {Linter: "interfacer", Severity: "warning", Path: "test.go", Line: 5, Col: 8, Message: "r can be io.Closer"},
- }
- ExpectIssues(t, "interfacer", `package main
-
-import "os"
-
-func f(r *os.File) {
- r.Close()
-}
-
-func main() {
-}
-`, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/lll_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/lll_test.go
deleted file mode 100644
index 36488fa4f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/lll_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestLLL(t *testing.T) {
- t.Parallel()
- source := `package test
-// This is a really long line full of text that is uninteresting in the extreme. Also we're just trying to make it here.
-`
- expected := Issues{
- {Linter: "lll", Severity: "warning", Path: "test.go", Line: 2, Col: 0, Message: "line is 120 characters"},
- }
- ExpectIssues(t, "lll", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/maligned_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/maligned_test.go
deleted file mode 100644
index fe7cc52ed..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/maligned_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestMaligned(t *testing.T) {
- t.Parallel()
- source := `package test
-
-type unaligned struct {
- a uint16
- b uint64
- c uint16
-
-}
-`
- expected := Issues{
- {Linter: "maligned", Severity: "warning", Path: "test.go", Line: 3, Col: 16, Message: "struct of size 24 could be 16"},
- }
- ExpectIssues(t, "maligned", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/megacheck_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/megacheck_test.go
deleted file mode 100644
index 1c41dbcb1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/megacheck_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestMegaCheck(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func f() {
- var ok bool
- if ok == true {
- }
-}
-`
- expected := Issues{
- {Linter: "megacheck", Severity: "warning", Path: "test.go", Line: 3, Col: 6, Message: "func f is unused (U1000)"},
- {Linter: "megacheck", Severity: "warning", Path: "test.go", Line: 5, Col: 2, Message: "empty branch (SA9003)"},
- {Linter: "megacheck", Severity: "warning", Path: "test.go", Line: 5, Col: 5, Message: "should omit comparison to bool constant, can be simplified to ok (S1002)"},
- }
- ExpectIssues(t, "megacheck", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/misspell_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/misspell_test.go
deleted file mode 100644
index 379bca070..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/misspell_test.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestMisSpell(t *testing.T) {
- t.Parallel()
- source := `package test
-// The langauge is incorrect.
-var a = "langauge"
-`
- expected := Issues{
- {Linter: "misspell", Severity: "warning", Path: "test.go", Line: 2, Col: 7, Message: "\"langauge\" is a misspelling of \"language\""},
- {Linter: "misspell", Severity: "warning", Path: "test.go", Line: 3, Col: 9, Message: "\"langauge\" is a misspelling of \"language\""},
- }
- ExpectIssues(t, "misspell", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/nakedret_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/nakedret_test.go
deleted file mode 100644
index d642edbe2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/nakedret_test.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestNakedret(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func shortFunc() (r uint32) {
- r = r + r
- return
-}
-
-func longFunc() (r uint32) {
- r = r + r
- r = r - r
- r = r * r
- r = r / r
- r = r % r
- r = r^r
- r = r&r
- return
-}
-`
- expected := Issues{
- {Linter: "nakedret", Severity: "warning", Path: "test.go", Line: 16, Message: "longFunc naked returns on 9 line function "},
- }
- ExpectIssues(t, "nakedret", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/safesql_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/safesql_test.go
deleted file mode 100644
index 512ae1d7c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/safesql_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestSafesql(t *testing.T) {
- t.Parallel()
- source := `package test
-
-import (
- "database/sql"
- "log"
- "strconv"
-)
-
-func main() {
- getUser(42)
-}
-
-func getUser(userID int64) {
- db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")
- if err != nil {
- log.Fatal(err)
- }
- defer db.Close()
-
- rows, err := db.Query("SELECT id, name FROM users WHERE id=" + strconv.FormatInt(userID, 10))
- if err != nil {
- log.Fatal(err)
- }
- defer rows.Close()
-}
-`
- expected := Issues{
- {Linter: "safesql", Severity: "warning", Path: "test.go", Line: 20, Col: 23, Message: `potentially unsafe SQL statement`},
- }
- ExpectIssues(t, "safesql", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/staticcheck_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/staticcheck_test.go
deleted file mode 100644
index 7dfb99a25..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/staticcheck_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestStaticCheck(t *testing.T) {
- t.Parallel()
- source := `package test
-
-import "regexp"
-
-var v = regexp.MustCompile("*")
-`
- expected := Issues{
- {Linter: "staticcheck", Severity: "warning", Path: "test.go", Line: 5, Col: 27, Message: "error parsing regexp: missing argument to repetition operator: `*` (SA1000)"},
- }
- ExpectIssues(t, "staticcheck", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/structcheck_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/structcheck_test.go
deleted file mode 100644
index 2cd1e46b6..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/structcheck_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestStructcheck(t *testing.T) {
- t.Parallel()
- source := `package test
-
-type test struct {
- unused int
-}
-`
- expected := Issues{
- {Linter: "structcheck", Severity: "warning", Path: "test.go", Line: 4, Col: 2, Message: "unused struct field github.com/alecthomas/gometalinter/regressiontests/.test.unused"},
- }
- ExpectIssues(t, "structcheck", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/support.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/support.go
deleted file mode 100644
index 2563b8b65..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/support.go
+++ /dev/null
@@ -1,106 +0,0 @@
-package regressiontests
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
- "testing"
-
- "github.com/gotestyourself/gotestyourself/fs"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-type Issue struct {
- Linter string `json:"linter"`
- Severity string `json:"severity"`
- Path string `json:"path"`
- Line int `json:"line"`
- Col int `json:"col"`
- Message string `json:"message"`
-}
-
-func (i *Issue) String() string {
- col := ""
- if i.Col != 0 {
- col = fmt.Sprintf("%d", i.Col)
- }
- return fmt.Sprintf("%s:%d:%s:%s: %s (%s)", strings.TrimSpace(i.Path), i.Line, col, i.Severity, strings.TrimSpace(i.Message), i.Linter)
-}
-
-type Issues []Issue
-
-// ExpectIssues runs gometalinter and expects it to generate exactly the
-// issues provided.
-func ExpectIssues(t *testing.T, linter string, source string, expected Issues, extraFlags ...string) {
- // Write source to temporary directory.
- dir, err := ioutil.TempDir(".", "gometalinter-")
- require.NoError(t, err)
- defer os.RemoveAll(dir)
-
- testFile := filepath.Join(dir, "test.go")
- err = ioutil.WriteFile(testFile, []byte(source), 0644)
- require.NoError(t, err)
-
- actual := RunLinter(t, linter, dir, extraFlags...)
- assert.Equal(t, expected, actual)
-}
-
-// RunLinter runs the gometalinter as a binary against the files at path and
-// returns the issues it encountered
-func RunLinter(t *testing.T, linter string, path string, extraFlags ...string) Issues {
- binary, cleanup := buildBinary(t)
- defer cleanup()
-
- args := []string{
- "-d", "--disable-all", "--enable", linter, "--json",
- "--sort=path", "--sort=line", "--sort=column", "--sort=message",
- "./...",
- }
- args = append(args, extraFlags...)
- cmd := exec.Command(binary, args...)
- cmd.Dir = path
-
- errBuffer := new(bytes.Buffer)
- cmd.Stderr = errBuffer
-
- output, _ := cmd.Output()
-
- var actual Issues
- err := json.Unmarshal(output, &actual)
- if !assert.NoError(t, err) {
- fmt.Printf("Stderr: %s\n", errBuffer)
- fmt.Printf("Output: %s\n", output)
- return nil
- }
- return filterIssues(actual, linter, path)
-}
-
-func buildBinary(t *testing.T) (string, func()) {
- tmpdir := fs.NewDir(t, "regression-test-binary")
- path := tmpdir.Join("gometalinter")
- cmd := exec.Command("go", "build", "-o", path, "..")
- require.NoError(t, cmd.Run())
- return path, tmpdir.Remove
-}
-
-// filterIssues to just the issues relevant for the current linter and normalize
-// the error message by removing the directory part of the path from both Path
-// and Message
-func filterIssues(issues Issues, linterName string, dir string) Issues {
- filtered := Issues{}
- for _, issue := range issues {
- if issue.Linter == linterName || linterName == "" {
- issue.Path = strings.Replace(issue.Path, dir+string(os.PathSeparator), "", -1)
- issue.Message = strings.Replace(issue.Message, dir+string(os.PathSeparator), "", -1)
- issue.Message = strings.Replace(issue.Message, dir, "", -1)
- filtered = append(filtered, issue)
- }
- }
- return filtered
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unconvert_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unconvert_test.go
deleted file mode 100644
index fcb73e3dd..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unconvert_test.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestUnconvert(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func test() {
- var a int64
- b := int64(a)
- println(b)
-}`
- expected := Issues{
- {Linter: "unconvert", Severity: "warning", Path: "test.go", Line: 5, Col: 12, Message: "unnecessary conversion"},
- }
- ExpectIssues(t, "unconvert", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unparam_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unparam_test.go
deleted file mode 100644
index 0596d2bd8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unparam_test.go
+++ /dev/null
@@ -1,153 +0,0 @@
-package regressiontests
-
-import (
- "testing"
-)
-
-func TestUnparam(t *testing.T) {
- t.Parallel()
- source := `package foo
-
-import (
- "errors"
- "log"
- "net/http"
-)
-
-type FooType int
-
-func AllUsed(a, b FooType) FooType { return a + b }
-
-func OneUnused(a, b FooType) FooType { return a }
-
-func doWork() {}
-
-var Sink interface{}
-
-func Parent() {
- oneUnused := func(f FooType) {
- doWork()
- }
- Sink = oneUnused
-}
-
-func Handler(w http.ResponseWriter, r *http.Request) {
- w.Write([]byte("hi"))
-}
-
-type FooIface interface {
- foo(w http.ResponseWriter, code FooType) error
-}
-
-func FooImpl(w http.ResponseWriter, code FooType) error {
- w.Write([]byte("hi"))
- return nil
-}
-
-func (f FooType) AllUsed(a FooType) FooType { return f + a }
-
-func (f FooType) OneUnused(a FooType) FooType { return f }
-
-func DummyImpl(f FooType) {}
-
-func PanicImpl(f FooType) { panic("dummy") }
-
-func NonPanicImpl(w http.ResponseWriter, f FooType) {
- for i := 0; i < 10; i++ {
- w.Write([]byte("foo"))
- }
- panic("default")
-}
-
-func endlessLoop(w http.ResponseWriter) {
- for {
- w.Write([]byte("foo"))
- }
-}
-
-func NonPanicImpl2(w http.ResponseWriter, f FooType) {
- endlessLoop(w)
- panic("unreachable")
-}
-
-func throw(v ...interface{}) {}
-
-func ThrowImpl(f FooType) { throw("dummy") }
-
-func ZeroImpl(f FooType) (int, string, []byte) { return 0, "", nil }
-
-func ErrorsImpl(f FooType) error { return errors.New("unimpl") }
-
-const ConstFoo = FooType(123)
-
-func (f FooType) Error() string { return "foo" }
-
-func CustomErrImpl(f FooType) error { return ConstFoo }
-
-func NonConstImpl(f FooType, s string) error { return f }
-
-func LogImpl(f FooType) { log.Print("not implemented") }
-
-type BarFunc func(a FooType, s string) int
-
-func BarImpl(a FooType, s string) int { return int(a) }
-
-func NoName(FooType) { doWork() }
-
-func UnderscoreName(_ FooType) { doWork() }
-
-type BarStruct struct {
- fn func(a FooType, b byte)
-}
-
-func BarField(a FooType, b byte) { doWork() }
-
-type Bar2Struct struct {
- st struct {
- fn func(a FooType, r rune)
- }
-}
-
-func Bar2Field(a FooType, r rune) { doWork() }
-
-func FuncAsParam(fn func(FooType) string) { fn(0) }
-
-func PassedAsParam(f FooType) string {
- doWork()
- return "foo"
-}
-
-func (f FooType) FuncAsParam2(fn func(FooType) []byte) { fn(0) }
-
-func PassedAsParam2(f FooType) []byte {
- doWork()
- return nil
-}
-
-type RecursiveIface interface {
- Foo(RecursiveIface)
-}
-
-func AsSliceElem(f FooType) []int {
- doWork()
- return nil
-}
-
-var SliceElems = []func(FooType) []int{AsSliceElem} `
- expected := Issues{
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 13, Col: 19, Message: "parameter b is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 20, Col: 20, Message: "parameter f is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 34, Col: 37, Message: "parameter code is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 41, Col: 28, Message: "parameter a is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 47, Col: 42, Message: "parameter f is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 60, Col: 43, Message: "parameter f is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 79, Col: 30, Message: "parameter s is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 85, Col: 25, Message: "parameter s is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 95, Col: 15, Message: "parameter a is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 95, Col: 26, Message: "parameter b is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 103, Col: 16, Message: "parameter a is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 103, Col: 27, Message: "parameter r is unused"},
- Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 123, Col: 18, Message: "parameter f is unused"},
- }
- ExpectIssues(t, "unparam", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unused_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unused_test.go
deleted file mode 100644
index f6f7289b2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/unused_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestUnused(t *testing.T) {
- t.Parallel()
- source := `package test
-
-var v int = 10
-
-func f() {
-}
-`
- expected := Issues{
- {Linter: "unused", Severity: "warning", Path: "test.go", Line: 3, Col: 5, Message: "var v is unused (U1000)"},
- {Linter: "unused", Severity: "warning", Path: "test.go", Line: 5, Col: 6, Message: "func f is unused (U1000)"},
- }
- ExpectIssues(t, "unused", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/varcheck_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/varcheck_test.go
deleted file mode 100644
index d516ec5a2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/varcheck_test.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestVarcheck(t *testing.T) {
- t.Parallel()
- source := `package test
-
-var v int
-`
- expected := Issues{
- {Linter: "varcheck", Severity: "warning", Path: "test.go", Line: 3, Col: 5, Message: "unused variable or constant v"},
- }
- ExpectIssues(t, "varcheck", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/vet_shadow_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/vet_shadow_test.go
deleted file mode 100644
index 9b4a443de..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/vet_shadow_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package regressiontests
-
-import "testing"
-
-func TestVetShadow(t *testing.T) {
- t.Parallel()
- source := `package test
-
-func test(mystructs []*MyStruct) *MyStruct {
- var foo *MyStruct
- for _, mystruct := range mystructs {
- foo := mystruct
- }
- return foo
-}
-`
- expected := Issues{
- {Linter: "vetshadow", Severity: "warning", Path: "test.go", Line: 6, Col: 0, Message: "declaration of \"foo\" shadows declaration at test.go:4"},
- }
- ExpectIssues(t, "vetshadow", source, expected)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/vet_test.go b/vendor/src/github.com/alecthomas/gometalinter/regressiontests/vet_test.go
deleted file mode 100644
index 733a5f621..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/regressiontests/vet_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package regressiontests
-
-import (
- "testing"
-
- "github.com/gotestyourself/gotestyourself/fs"
- "github.com/stretchr/testify/assert"
-)
-
-func TestVet(t *testing.T) {
- t.Parallel()
-
- dir := fs.NewDir(t, "test-vet",
- fs.WithFile("file.go", vetFile("root")),
- fs.WithFile("file_test.go", vetExternalPackageFile("root_test")),
- fs.WithDir("sub",
- fs.WithFile("file.go", vetFile("sub"))),
- fs.WithDir("excluded",
- fs.WithFile("file.go", vetFile("excluded"))))
- defer dir.Remove()
-
- expected := Issues{
- {Linter: "vet", Severity: "error", Path: "file.go", Line: 7, Col: 0, Message: "missing argument for Printf(\"%d\"): format reads arg 1, have only 0 args"},
- {Linter: "vet", Severity: "error", Path: "file.go", Line: 7, Col: 0, Message: "unreachable code"},
- {Linter: "vet", Severity: "error", Path: "file_test.go", Line: 7, Col: 0, Message: "unreachable code"},
- {Linter: "vet", Severity: "error", Path: "sub/file.go", Line: 7, Col: 0, Message: "missing argument for Printf(\"%d\"): format reads arg 1, have only 0 args"},
- {Linter: "vet", Severity: "error", Path: "sub/file.go", Line: 7, Col: 0, Message: "unreachable code"},
- }
- actual := RunLinter(t, "vet", dir.Path(), "--skip=excluded")
- assert.Equal(t, expected, actual)
-}
-
-func vetFile(pkg string) string {
- return `package ` + pkg + `
-
-import "fmt"
-
-func Something() {
- return
- fmt.Printf("%d")
-}
-`
-}
-
-func vetExternalPackageFile(pkg string) string {
- return `package ` + pkg + `
-
-import "fmt"
-
-func ExampleSomething() {
- return
- root.Something()
-}
-`
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/stringset.go b/vendor/src/github.com/alecthomas/gometalinter/stringset.go
deleted file mode 100644
index 53264ca9e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/stringset.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package main
-
-type stringSet struct {
- items map[string]struct{}
-}
-
-func newStringSet(items ...string) *stringSet {
- setItems := make(map[string]struct{}, len(items))
- for _, item := range items {
- setItems[item] = struct{}{}
- }
- return &stringSet{items: setItems}
-}
-
-func (s *stringSet) add(item string) {
- s.items[item] = struct{}{}
-}
-
-func (s *stringSet) asSlice() []string {
- items := []string{}
- for item := range s.items {
- items = append(items, item)
- }
- return items
-}
-
-func (s *stringSet) size() int {
- return len(s.items)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/COPYING b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/COPYING
deleted file mode 100644
index 2993ec085..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/COPYING
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2014 Alec Thomas
-
-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/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/bytes.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/bytes.go
deleted file mode 100644
index eaadeb800..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/bytes.go
+++ /dev/null
@@ -1,83 +0,0 @@
-package units
-
-// Base2Bytes is the old non-SI power-of-2 byte scale (1024 bytes in a kilobyte,
-// etc.).
-type Base2Bytes int64
-
-// Base-2 byte units.
-const (
- Kibibyte Base2Bytes = 1024
- KiB = Kibibyte
- Mebibyte = Kibibyte * 1024
- MiB = Mebibyte
- Gibibyte = Mebibyte * 1024
- GiB = Gibibyte
- Tebibyte = Gibibyte * 1024
- TiB = Tebibyte
- Pebibyte = Tebibyte * 1024
- PiB = Pebibyte
- Exbibyte = Pebibyte * 1024
- EiB = Exbibyte
-)
-
-var (
- bytesUnitMap = MakeUnitMap("iB", "B", 1024)
- oldBytesUnitMap = MakeUnitMap("B", "B", 1024)
-)
-
-// ParseBase2Bytes supports both iB and B in base-2 multipliers. That is, KB
-// and KiB are both 1024.
-func ParseBase2Bytes(s string) (Base2Bytes, error) {
- n, err := ParseUnit(s, bytesUnitMap)
- if err != nil {
- n, err = ParseUnit(s, oldBytesUnitMap)
- }
- return Base2Bytes(n), err
-}
-
-func (b Base2Bytes) String() string {
- return ToString(int64(b), 1024, "iB", "B")
-}
-
-var (
- metricBytesUnitMap = MakeUnitMap("B", "B", 1000)
-)
-
-// MetricBytes are SI byte units (1000 bytes in a kilobyte).
-type MetricBytes SI
-
-// SI base-10 byte units.
-const (
- Kilobyte MetricBytes = 1000
- KB = Kilobyte
- Megabyte = Kilobyte * 1000
- MB = Megabyte
- Gigabyte = Megabyte * 1000
- GB = Gigabyte
- Terabyte = Gigabyte * 1000
- TB = Terabyte
- Petabyte = Terabyte * 1000
- PB = Petabyte
- Exabyte = Petabyte * 1000
- EB = Exabyte
-)
-
-// ParseMetricBytes parses base-10 metric byte units. That is, KB is 1000 bytes.
-func ParseMetricBytes(s string) (MetricBytes, error) {
- n, err := ParseUnit(s, metricBytesUnitMap)
- return MetricBytes(n), err
-}
-
-func (m MetricBytes) String() string {
- return ToString(int64(m), 1000, "B", "B")
-}
-
-// ParseStrictBytes supports both iB and B suffixes for base 2 and metric,
-// respectively. That is, KiB represents 1024 and KB represents 1000.
-func ParseStrictBytes(s string) (int64, error) {
- n, err := ParseUnit(s, bytesUnitMap)
- if err != nil {
- n, err = ParseUnit(s, metricBytesUnitMap)
- }
- return int64(n), err
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/doc.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/doc.go
deleted file mode 100644
index 156ae3867..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/doc.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Package units provides helpful unit multipliers and functions for Go.
-//
-// The goal of this package is to have functionality similar to the time [1] package.
-//
-//
-// [1] http://golang.org/pkg/time/
-//
-// It allows for code like this:
-//
-// n, err := ParseBase2Bytes("1KB")
-// // n == 1024
-// n = units.Mebibyte * 512
-package units
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/si.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/si.go
deleted file mode 100644
index 8234a9d52..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/si.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package units
-
-// SI units.
-type SI int64
-
-// SI unit multiples.
-const (
- Kilo SI = 1000
- Mega = Kilo * 1000
- Giga = Mega * 1000
- Tera = Giga * 1000
- Peta = Tera * 1000
- Exa = Peta * 1000
-)
-
-func MakeUnitMap(suffix, shortSuffix string, scale int64) map[string]float64 {
- return map[string]float64{
- shortSuffix: 1,
- "K" + suffix: float64(scale),
- "M" + suffix: float64(scale * scale),
- "G" + suffix: float64(scale * scale * scale),
- "T" + suffix: float64(scale * scale * scale * scale),
- "P" + suffix: float64(scale * scale * scale * scale * scale),
- "E" + suffix: float64(scale * scale * scale * scale * scale * scale),
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/util.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/util.go
deleted file mode 100644
index 6527e92d1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/alecthomas/units/util.go
+++ /dev/null
@@ -1,138 +0,0 @@
-package units
-
-import (
- "errors"
- "fmt"
- "strings"
-)
-
-var (
- siUnits = []string{"", "K", "M", "G", "T", "P", "E"}
-)
-
-func ToString(n int64, scale int64, suffix, baseSuffix string) string {
- mn := len(siUnits)
- out := make([]string, mn)
- for i, m := range siUnits {
- if n%scale != 0 || i == 0 && n == 0 {
- s := suffix
- if i == 0 {
- s = baseSuffix
- }
- out[mn-1-i] = fmt.Sprintf("%d%s%s", n%scale, m, s)
- }
- n /= scale
- if n == 0 {
- break
- }
- }
- return strings.Join(out, "")
-}
-
-// Below code ripped straight from http://golang.org/src/pkg/time/format.go?s=33392:33438#L1123
-var errLeadingInt = errors.New("units: bad [0-9]*") // never printed
-
-// leadingInt consumes the leading [0-9]* from s.
-func leadingInt(s string) (x int64, rem string, err error) {
- i := 0
- for ; i < len(s); i++ {
- c := s[i]
- if c < '0' || c > '9' {
- break
- }
- if x >= (1<<63-10)/10 {
- // overflow
- return 0, "", errLeadingInt
- }
- x = x*10 + int64(c) - '0'
- }
- return x, s[i:], nil
-}
-
-func ParseUnit(s string, unitMap map[string]float64) (int64, error) {
- // [-+]?([0-9]*(\.[0-9]*)?[a-z]+)+
- orig := s
- f := float64(0)
- neg := false
-
- // Consume [-+]?
- if s != "" {
- c := s[0]
- if c == '-' || c == '+' {
- neg = c == '-'
- s = s[1:]
- }
- }
- // Special case: if all that is left is "0", this is zero.
- if s == "0" {
- return 0, nil
- }
- if s == "" {
- return 0, errors.New("units: invalid " + orig)
- }
- for s != "" {
- g := float64(0) // this element of the sequence
-
- var x int64
- var err error
-
- // The next character must be [0-9.]
- if !(s[0] == '.' || ('0' <= s[0] && s[0] <= '9')) {
- return 0, errors.New("units: invalid " + orig)
- }
- // Consume [0-9]*
- pl := len(s)
- x, s, err = leadingInt(s)
- if err != nil {
- return 0, errors.New("units: invalid " + orig)
- }
- g = float64(x)
- pre := pl != len(s) // whether we consumed anything before a period
-
- // Consume (\.[0-9]*)?
- post := false
- if s != "" && s[0] == '.' {
- s = s[1:]
- pl := len(s)
- x, s, err = leadingInt(s)
- if err != nil {
- return 0, errors.New("units: invalid " + orig)
- }
- scale := 1.0
- for n := pl - len(s); n > 0; n-- {
- scale *= 10
- }
- g += float64(x) / scale
- post = pl != len(s)
- }
- if !pre && !post {
- // no digits (e.g. ".s" or "-.s")
- return 0, errors.New("units: invalid " + orig)
- }
-
- // Consume unit.
- i := 0
- for ; i < len(s); i++ {
- c := s[i]
- if c == '.' || ('0' <= c && c <= '9') {
- break
- }
- }
- u := s[:i]
- s = s[i:]
- unit, ok := unitMap[u]
- if !ok {
- return 0, errors.New("units: unknown unit " + u + " in " + orig)
- }
-
- f += g * unit
- }
-
- if neg {
- f = -f
- }
- if f < float64(-1<<63) || f > float64(1<<63-1) {
- return 0, errors.New("units: overflow parsing unit")
- }
- return int64(f), nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/google/shlex/COPYING b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/google/shlex/COPYING
deleted file mode 100644
index d64569567..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/google/shlex/COPYING
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/google/shlex/shlex.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/google/shlex/shlex.go
deleted file mode 100644
index 3cb37b7e4..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/google/shlex/shlex.go
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
-Copyright 2012 Google Inc. 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 shlex implements a simple lexer which splits input in to tokens using
-shell-style rules for quoting and commenting.
-
-The basic use case uses the default ASCII lexer to split a string into sub-strings:
-
- shlex.Split("one \"two three\" four") -> []string{"one", "two three", "four"}
-
-To process a stream of strings:
-
- l := NewLexer(os.Stdin)
- for ; token, err := l.Next(); err != nil {
- // process token
- }
-
-To access the raw token stream (which includes tokens for comments):
-
- t := NewTokenizer(os.Stdin)
- for ; token, err := t.Next(); err != nil {
- // process token
- }
-
-*/
-package shlex
-
-import (
- "bufio"
- "fmt"
- "io"
- "strings"
-)
-
-// TokenType is a top-level token classification: A word, space, comment, unknown.
-type TokenType int
-
-// runeTokenClass is the type of a UTF-8 character classification: A quote, space, escape.
-type runeTokenClass int
-
-// the internal state used by the lexer state machine
-type lexerState int
-
-// Token is a (type, value) pair representing a lexographical token.
-type Token struct {
- tokenType TokenType
- value string
-}
-
-// Equal reports whether tokens a, and b, are equal.
-// Two tokens are equal if both their types and values are equal. A nil token can
-// never be equal to another token.
-func (a *Token) Equal(b *Token) bool {
- if a == nil || b == nil {
- return false
- }
- if a.tokenType != b.tokenType {
- return false
- }
- return a.value == b.value
-}
-
-// Named classes of UTF-8 runes
-const (
- spaceRunes = " \t\r\n"
- escapingQuoteRunes = `"`
- nonEscapingQuoteRunes = "'"
- escapeRunes = `\`
- commentRunes = "#"
-)
-
-// Classes of rune token
-const (
- unknownRuneClass runeTokenClass = iota
- spaceRuneClass
- escapingQuoteRuneClass
- nonEscapingQuoteRuneClass
- escapeRuneClass
- commentRuneClass
- eofRuneClass
-)
-
-// Classes of lexographic token
-const (
- UnknownToken TokenType = iota
- WordToken
- SpaceToken
- CommentToken
-)
-
-// Lexer state machine states
-const (
- startState lexerState = iota // no runes have been seen
- inWordState // processing regular runes in a word
- escapingState // we have just consumed an escape rune; the next rune is literal
- escapingQuotedState // we have just consumed an escape rune within a quoted string
- quotingEscapingState // we are within a quoted string that supports escaping ("...")
- quotingState // we are within a string that does not support escaping ('...')
- commentState // we are within a comment (everything following an unquoted or unescaped #
-)
-
-// tokenClassifier is used for classifying rune characters.
-type tokenClassifier map[rune]runeTokenClass
-
-func (typeMap tokenClassifier) addRuneClass(runes string, tokenType runeTokenClass) {
- for _, runeChar := range runes {
- typeMap[runeChar] = tokenType
- }
-}
-
-// newDefaultClassifier creates a new classifier for ASCII characters.
-func newDefaultClassifier() tokenClassifier {
- t := tokenClassifier{}
- t.addRuneClass(spaceRunes, spaceRuneClass)
- t.addRuneClass(escapingQuoteRunes, escapingQuoteRuneClass)
- t.addRuneClass(nonEscapingQuoteRunes, nonEscapingQuoteRuneClass)
- t.addRuneClass(escapeRunes, escapeRuneClass)
- t.addRuneClass(commentRunes, commentRuneClass)
- return t
-}
-
-// ClassifyRune classifiees a rune
-func (t tokenClassifier) ClassifyRune(runeVal rune) runeTokenClass {
- return t[runeVal]
-}
-
-// Lexer turns an input stream into a sequence of tokens. Whitespace and comments are skipped.
-type Lexer Tokenizer
-
-// NewLexer creates a new lexer from an input stream.
-func NewLexer(r io.Reader) *Lexer {
-
- return (*Lexer)(NewTokenizer(r))
-}
-
-// Next returns the next word, or an error. If there are no more words,
-// the error will be io.EOF.
-func (l *Lexer) Next() (string, error) {
- for {
- token, err := (*Tokenizer)(l).Next()
- if err != nil {
- return "", err
- }
- switch token.tokenType {
- case WordToken:
- return token.value, nil
- case CommentToken:
- // skip comments
- default:
- return "", fmt.Errorf("Unknown token type: %v", token.tokenType)
- }
- }
-}
-
-// Tokenizer turns an input stream into a sequence of typed tokens
-type Tokenizer struct {
- input bufio.Reader
- classifier tokenClassifier
-}
-
-// NewTokenizer creates a new tokenizer from an input stream.
-func NewTokenizer(r io.Reader) *Tokenizer {
- input := bufio.NewReader(r)
- classifier := newDefaultClassifier()
- return &Tokenizer{
- input: *input,
- classifier: classifier}
-}
-
-// scanStream scans the stream for the next token using the internal state machine.
-// It will panic if it encounters a rune which it does not know how to handle.
-func (t *Tokenizer) scanStream() (*Token, error) {
- state := startState
- var tokenType TokenType
- var value []rune
- var nextRune rune
- var nextRuneType runeTokenClass
- var err error
-
- for {
- nextRune, _, err = t.input.ReadRune()
- nextRuneType = t.classifier.ClassifyRune(nextRune)
-
- if err == io.EOF {
- nextRuneType = eofRuneClass
- err = nil
- } else if err != nil {
- return nil, err
- }
-
- switch state {
- case startState: // no runes read yet
- {
- switch nextRuneType {
- case eofRuneClass:
- {
- return nil, io.EOF
- }
- case spaceRuneClass:
- {
- }
- case escapingQuoteRuneClass:
- {
- tokenType = WordToken
- state = quotingEscapingState
- }
- case nonEscapingQuoteRuneClass:
- {
- tokenType = WordToken
- state = quotingState
- }
- case escapeRuneClass:
- {
- tokenType = WordToken
- state = escapingState
- }
- case commentRuneClass:
- {
- tokenType = CommentToken
- state = commentState
- }
- default:
- {
- tokenType = WordToken
- value = append(value, nextRune)
- state = inWordState
- }
- }
- }
- case inWordState: // in a regular word
- {
- switch nextRuneType {
- case eofRuneClass:
- {
- token := &Token{
- tokenType: tokenType,
- value: string(value)}
- return token, err
- }
- case spaceRuneClass:
- {
- t.input.UnreadRune()
- token := &Token{
- tokenType: tokenType,
- value: string(value)}
- return token, err
- }
- case escapingQuoteRuneClass:
- {
- state = quotingEscapingState
- }
- case nonEscapingQuoteRuneClass:
- {
- state = quotingState
- }
- case escapeRuneClass:
- {
- state = escapingState
- }
- default:
- {
- value = append(value, nextRune)
- }
- }
- }
- case escapingState: // the rune after an escape character
- {
- switch nextRuneType {
- case eofRuneClass:
- {
- err = fmt.Errorf("EOF found after escape character")
- token := &Token{
- tokenType: tokenType,
- value: string(value)}
- return token, err
- }
- default:
- {
- state = inWordState
- value = append(value, nextRune)
- }
- }
- }
- case escapingQuotedState: // the next rune after an escape character, in double quotes
- {
- switch nextRuneType {
- case eofRuneClass:
- {
- err = fmt.Errorf("EOF found after escape character")
- token := &Token{
- tokenType: tokenType,
- value: string(value)}
- return token, err
- }
- default:
- {
- state = quotingEscapingState
- value = append(value, nextRune)
- }
- }
- }
- case quotingEscapingState: // in escaping double quotes
- {
- switch nextRuneType {
- case eofRuneClass:
- {
- err = fmt.Errorf("EOF found when expecting closing quote")
- token := &Token{
- tokenType: tokenType,
- value: string(value)}
- return token, err
- }
- case escapingQuoteRuneClass:
- {
- state = inWordState
- }
- case escapeRuneClass:
- {
- state = escapingQuotedState
- }
- default:
- {
- value = append(value, nextRune)
- }
- }
- }
- case quotingState: // in non-escaping single quotes
- {
- switch nextRuneType {
- case eofRuneClass:
- {
- err = fmt.Errorf("EOF found when expecting closing quote")
- token := &Token{
- tokenType: tokenType,
- value: string(value)}
- return token, err
- }
- case nonEscapingQuoteRuneClass:
- {
- state = inWordState
- }
- default:
- {
- value = append(value, nextRune)
- }
- }
- }
- case commentState: // in a comment
- {
- switch nextRuneType {
- case eofRuneClass:
- {
- token := &Token{
- tokenType: tokenType,
- value: string(value)}
- return token, err
- }
- case spaceRuneClass:
- {
- if nextRune == '\n' {
- state = startState
- token := &Token{
- tokenType: tokenType,
- value: string(value)}
- return token, err
- } else {
- value = append(value, nextRune)
- }
- }
- default:
- {
- value = append(value, nextRune)
- }
- }
- }
- default:
- {
- return nil, fmt.Errorf("Unexpected state: %v", state)
- }
- }
- }
-}
-
-// Next returns the next token in the stream.
-func (t *Tokenizer) Next() (*Token, error) {
- return t.scanStream()
-}
-
-// Split partitions a string into a slice of strings.
-func Split(s string) ([]string, error) {
- l := NewLexer(strings.NewReader(s))
- subStrings := make([]string, 0)
- for {
- word, err := l.Next()
- if err != nil {
- if err == io.EOF {
- return subStrings, nil
- }
- return subStrings, err
- }
- subStrings = append(subStrings, word)
- }
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/LICENSE
deleted file mode 100644
index 609cce797..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2014 Nick Snyder https://github.com/nicksnyder
-
-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/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/bundle/bundle.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/bundle/bundle.go
deleted file mode 100644
index 155543bda..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/bundle/bundle.go
+++ /dev/null
@@ -1,344 +0,0 @@
-// Package bundle manages translations for multiple languages.
-package bundle
-
-import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "path/filepath"
- "reflect"
- "sync"
-
- "github.com/nicksnyder/go-i18n/i18n/language"
- "github.com/nicksnyder/go-i18n/i18n/translation"
- "gopkg.in/yaml.v2"
-)
-
-// TranslateFunc is a copy of i18n.TranslateFunc to avoid a circular dependency.
-type TranslateFunc func(translationID string, args ...interface{}) string
-
-// Bundle stores the translations for multiple languages.
-type Bundle struct {
- // The primary translations for a language tag and translation id.
- translations map[string]map[string]translation.Translation
-
- // Translations that can be used when an exact language match is not possible.
- fallbackTranslations map[string]map[string]translation.Translation
-
- sync.RWMutex
-}
-
-// New returns an empty bundle.
-func New() *Bundle {
- return &Bundle{
- translations: make(map[string]map[string]translation.Translation),
- fallbackTranslations: make(map[string]map[string]translation.Translation),
- }
-}
-
-// MustLoadTranslationFile is similar to LoadTranslationFile
-// except it panics if an error happens.
-func (b *Bundle) MustLoadTranslationFile(filename string) {
- if err := b.LoadTranslationFile(filename); err != nil {
- panic(err)
- }
-}
-
-// LoadTranslationFile loads the translations from filename into memory.
-//
-// The language that the translations are associated with is parsed from the filename (e.g. en-US.json).
-//
-// Generally you should load translation files once during your program's initialization.
-func (b *Bundle) LoadTranslationFile(filename string) error {
- buf, err := ioutil.ReadFile(filename)
- if err != nil {
- return err
- }
- return b.ParseTranslationFileBytes(filename, buf)
-}
-
-// ParseTranslationFileBytes is similar to LoadTranslationFile except it parses the bytes in buf.
-//
-// It is useful for parsing translation files embedded with go-bindata.
-func (b *Bundle) ParseTranslationFileBytes(filename string, buf []byte) error {
- basename := filepath.Base(filename)
- langs := language.Parse(basename)
- switch l := len(langs); {
- case l == 0:
- return fmt.Errorf("no language found in %q", basename)
- case l > 1:
- return fmt.Errorf("multiple languages found in filename %q: %v; expected one", basename, langs)
- }
- translations, err := parseTranslations(filename, buf)
- if err != nil {
- return err
- }
- b.AddTranslation(langs[0], translations...)
- return nil
-}
-
-func parseTranslations(filename string, buf []byte) ([]translation.Translation, error) {
- var unmarshalFunc func([]byte, interface{}) error
- switch format := filepath.Ext(filename); format {
- case ".json":
- unmarshalFunc = json.Unmarshal
- case ".yaml":
- unmarshalFunc = yaml.Unmarshal
- default:
- return nil, fmt.Errorf("unsupported file extension %s", format)
- }
-
- var translationsData []map[string]interface{}
- if len(buf) > 0 {
- if err := unmarshalFunc(buf, &translationsData); err != nil {
- return nil, fmt.Errorf("failed to load %s because %s", filename, err)
- }
- }
-
- translations := make([]translation.Translation, 0, len(translationsData))
- for i, translationData := range translationsData {
- t, err := translation.NewTranslation(translationData)
- if err != nil {
- return nil, fmt.Errorf("unable to parse translation #%d in %s because %s\n%v", i, filename, err, translationData)
- }
- translations = append(translations, t)
- }
- return translations, nil
-}
-
-// AddTranslation adds translations for a language.
-//
-// It is useful if your translations are in a format not supported by LoadTranslationFile.
-func (b *Bundle) AddTranslation(lang *language.Language, translations ...translation.Translation) {
- b.Lock()
- defer b.Unlock()
- if b.translations[lang.Tag] == nil {
- b.translations[lang.Tag] = make(map[string]translation.Translation, len(translations))
- }
- currentTranslations := b.translations[lang.Tag]
- for _, newTranslation := range translations {
- if currentTranslation := currentTranslations[newTranslation.ID()]; currentTranslation != nil {
- currentTranslations[newTranslation.ID()] = currentTranslation.Merge(newTranslation)
- } else {
- currentTranslations[newTranslation.ID()] = newTranslation
- }
- }
-
- // lang can provide translations for less specific language tags.
- for _, tag := range lang.MatchingTags() {
- b.fallbackTranslations[tag] = currentTranslations
- }
-}
-
-// Translations returns all translations in the bundle.
-func (b *Bundle) Translations() map[string]map[string]translation.Translation {
- t := make(map[string]map[string]translation.Translation)
- b.RLock()
- for tag, translations := range b.translations {
- t[tag] = make(map[string]translation.Translation)
- for id, translation := range translations {
- t[tag][id] = translation
- }
- }
- b.RUnlock()
- return t
-}
-
-// LanguageTags returns the tags of all languages that that have been added.
-func (b *Bundle) LanguageTags() []string {
- var tags []string
- b.RLock()
- for k := range b.translations {
- tags = append(tags, k)
- }
- b.RUnlock()
- return tags
-}
-
-// LanguageTranslationIDs returns the ids of all translations that have been added for a given language.
-func (b *Bundle) LanguageTranslationIDs(languageTag string) []string {
- var ids []string
- b.RLock()
- for id := range b.translations[languageTag] {
- ids = append(ids, id)
- }
- b.RUnlock()
- return ids
-}
-
-// MustTfunc is similar to Tfunc except it panics if an error happens.
-func (b *Bundle) MustTfunc(pref string, prefs ...string) TranslateFunc {
- tfunc, err := b.Tfunc(pref, prefs...)
- if err != nil {
- panic(err)
- }
- return tfunc
-}
-
-// MustTfuncAndLanguage is similar to TfuncAndLanguage except it panics if an error happens.
-func (b *Bundle) MustTfuncAndLanguage(pref string, prefs ...string) (TranslateFunc, *language.Language) {
- tfunc, language, err := b.TfuncAndLanguage(pref, prefs...)
- if err != nil {
- panic(err)
- }
- return tfunc, language
-}
-
-// Tfunc is similar to TfuncAndLanguage except is doesn't return the Language.
-func (b *Bundle) Tfunc(pref string, prefs ...string) (TranslateFunc, error) {
- tfunc, _, err := b.TfuncAndLanguage(pref, prefs...)
- return tfunc, err
-}
-
-// TfuncAndLanguage returns a TranslateFunc for the first Language that
-// has a non-zero number of translations in the bundle.
-//
-// The returned Language matches the the first language preference that could be satisfied,
-// but this may not strictly match the language of the translations used to satisfy that preference.
-//
-// For example, the user may request "zh". If there are no translations for "zh" but there are translations
-// for "zh-cn", then the translations for "zh-cn" will be used but the returned Language will be "zh".
-//
-// It can parse languages from Accept-Language headers (RFC 2616),
-// but it assumes weights are monotonically decreasing.
-func (b *Bundle) TfuncAndLanguage(pref string, prefs ...string) (TranslateFunc, *language.Language, error) {
- lang := b.supportedLanguage(pref, prefs...)
- var err error
- if lang == nil {
- err = fmt.Errorf("no supported languages found %#v", append(prefs, pref))
- }
- return func(translationID string, args ...interface{}) string {
- return b.translate(lang, translationID, args...)
- }, lang, err
-}
-
-// supportedLanguage returns the first language which
-// has a non-zero number of translations in the bundle.
-func (b *Bundle) supportedLanguage(pref string, prefs ...string) *language.Language {
- lang := b.translatedLanguage(pref)
- if lang == nil {
- for _, pref := range prefs {
- lang = b.translatedLanguage(pref)
- if lang != nil {
- break
- }
- }
- }
- return lang
-}
-
-func (b *Bundle) translatedLanguage(src string) *language.Language {
- langs := language.Parse(src)
- b.RLock()
- defer b.RUnlock()
- for _, lang := range langs {
- if len(b.translations[lang.Tag]) > 0 ||
- len(b.fallbackTranslations[lang.Tag]) > 0 {
- return lang
- }
- }
- return nil
-}
-
-func (b *Bundle) translate(lang *language.Language, translationID string, args ...interface{}) string {
- if lang == nil {
- return translationID
- }
-
- translation := b.translation(lang, translationID)
- if translation == nil {
- return translationID
- }
-
- var data interface{}
- var count interface{}
- if argc := len(args); argc > 0 {
- if isNumber(args[0]) {
- count = args[0]
- if argc > 1 {
- data = args[1]
- }
- } else {
- data = args[0]
- }
- }
-
- if count != nil {
- if data == nil {
- data = map[string]interface{}{"Count": count}
- } else {
- dataMap := toMap(data)
- dataMap["Count"] = count
- data = dataMap
- }
- } else {
- dataMap := toMap(data)
- if c, ok := dataMap["Count"]; ok {
- count = c
- }
- }
-
- p, _ := lang.Plural(count)
- template := translation.Template(p)
- if template == nil {
- return translationID
- }
-
- s := template.Execute(data)
- if s == "" {
- return translationID
- }
- return s
-}
-
-func (b *Bundle) translation(lang *language.Language, translationID string) translation.Translation {
- b.RLock()
- defer b.RUnlock()
- translations := b.translations[lang.Tag]
- if translations == nil {
- translations = b.fallbackTranslations[lang.Tag]
- if translations == nil {
- return nil
- }
- }
- return translations[translationID]
-}
-
-func isNumber(n interface{}) bool {
- switch n.(type) {
- case int, int8, int16, int32, int64, string:
- return true
- }
- return false
-}
-
-func toMap(input interface{}) map[string]interface{} {
- if data, ok := input.(map[string]interface{}); ok {
- return data
- }
- v := reflect.ValueOf(input)
- switch v.Kind() {
- case reflect.Ptr:
- return toMap(v.Elem().Interface())
- case reflect.Struct:
- return structToMap(v)
- default:
- return nil
- }
-}
-
-// Converts the top level of a struct to a map[string]interface{}.
-// Code inspired by github.com/fatih/structs.
-func structToMap(v reflect.Value) map[string]interface{} {
- out := make(map[string]interface{})
- t := v.Type()
- for i := 0; i < t.NumField(); i++ {
- field := t.Field(i)
- if field.PkgPath != "" {
- // unexported field. skip.
- continue
- }
- out[field.Name] = v.FieldByName(field.Name).Interface()
- }
- return out
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/i18n.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/i18n.go
deleted file mode 100644
index c478ff6ea..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/i18n.go
+++ /dev/null
@@ -1,158 +0,0 @@
-// Package i18n supports string translations with variable substitution and CLDR pluralization.
-// It is intended to be used in conjunction with the goi18n command, although that is not strictly required.
-//
-// Initialization
-//
-// Your Go program should load translations during its initialization.
-// i18n.MustLoadTranslationFile("path/to/fr-FR.all.json")
-// If your translations are in a file format not supported by (Must)?LoadTranslationFile,
-// then you can use the AddTranslation function to manually add translations.
-//
-// Fetching a translation
-//
-// Use Tfunc or MustTfunc to fetch a TranslateFunc that will return the translated string for a specific language.
-// func handleRequest(w http.ResponseWriter, r *http.Request) {
-// cookieLang := r.Cookie("lang")
-// acceptLang := r.Header.Get("Accept-Language")
-// defaultLang = "en-US" // known valid language
-// T, err := i18n.Tfunc(cookieLang, acceptLang, defaultLang)
-// fmt.Println(T("Hello world"))
-// }
-//
-// Usually it is a good idea to identify strings by a generic id rather than the English translation,
-// but the rest of this documentation will continue to use the English translation for readability.
-// T("Hello world") // ok
-// T("programGreeting") // better!
-//
-// Variables
-//
-// TranslateFunc supports strings that have variables using the text/template syntax.
-// T("Hello {{.Person}}", map[string]interface{}{
-// "Person": "Bob",
-// })
-//
-// Pluralization
-//
-// TranslateFunc supports the pluralization of strings using the CLDR pluralization rules defined here:
-// http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html
-// T("You have {{.Count}} unread emails.", 2)
-// T("I am {{.Count}} meters tall.", "1.7")
-//
-// Plural strings may also have variables.
-// T("{{.Person}} has {{.Count}} unread emails", 2, map[string]interface{}{
-// "Person": "Bob",
-// })
-//
-// Sentences with multiple plural components can be supported with nesting.
-// T("{{.Person}} has {{.Count}} unread emails in the past {{.Timeframe}}.", 3, map[string]interface{}{
-// "Person": "Bob",
-// "Timeframe": T("{{.Count}} days", 2),
-// })
-//
-// Templates
-//
-// You can use the .Funcs() method of a text/template or html/template to register a TranslateFunc
-// for usage inside of that template.
-package i18n
-
-import (
- "github.com/nicksnyder/go-i18n/i18n/bundle"
- "github.com/nicksnyder/go-i18n/i18n/language"
- "github.com/nicksnyder/go-i18n/i18n/translation"
-)
-
-// TranslateFunc returns the translation of the string identified by translationID.
-//
-// If there is no translation for translationID, then the translationID itself is returned.
-// This makes it easy to identify missing translations in your app.
-//
-// If translationID is a non-plural form, then the first variadic argument may be a map[string]interface{}
-// or struct that contains template data.
-//
-// If translationID is a plural form, the function accepts two parameter signatures
-// 1. T(count int, data struct{})
-// The first variadic argument must be an integer type
-// (int, int8, int16, int32, int64) or a float formatted as a string (e.g. "123.45").
-// The second variadic argument may be a map[string]interface{} or struct{} that contains template data.
-// 2. T(data struct{})
-// data must be a struct{} or map[string]interface{} that contains a Count field and the template data,
-// Count field must be an integer type (int, int8, int16, int32, int64)
-// or a float formatted as a string (e.g. "123.45").
-type TranslateFunc func(translationID string, args ...interface{}) string
-
-// IdentityTfunc returns a TranslateFunc that always returns the translationID passed to it.
-//
-// It is a useful placeholder when parsing a text/template or html/template
-// before the actual Tfunc is available.
-func IdentityTfunc() TranslateFunc {
- return func(translationID string, args ...interface{}) string {
- return translationID
- }
-}
-
-var defaultBundle = bundle.New()
-
-// MustLoadTranslationFile is similar to LoadTranslationFile
-// except it panics if an error happens.
-func MustLoadTranslationFile(filename string) {
- defaultBundle.MustLoadTranslationFile(filename)
-}
-
-// LoadTranslationFile loads the translations from filename into memory.
-//
-// The language that the translations are associated with is parsed from the filename (e.g. en-US.json).
-//
-// Generally you should load translation files once during your program's initialization.
-func LoadTranslationFile(filename string) error {
- return defaultBundle.LoadTranslationFile(filename)
-}
-
-// ParseTranslationFileBytes is similar to LoadTranslationFile except it parses the bytes in buf.
-//
-// It is useful for parsing translation files embedded with go-bindata.
-func ParseTranslationFileBytes(filename string, buf []byte) error {
- return defaultBundle.ParseTranslationFileBytes(filename, buf)
-}
-
-// AddTranslation adds translations for a language.
-//
-// It is useful if your translations are in a format not supported by LoadTranslationFile.
-func AddTranslation(lang *language.Language, translations ...translation.Translation) {
- defaultBundle.AddTranslation(lang, translations...)
-}
-
-// LanguageTags returns the tags of all languages that have been added.
-func LanguageTags() []string {
- return defaultBundle.LanguageTags()
-}
-
-// LanguageTranslationIDs returns the ids of all translations that have been added for a given language.
-func LanguageTranslationIDs(languageTag string) []string {
- return defaultBundle.LanguageTranslationIDs(languageTag)
-}
-
-// MustTfunc is similar to Tfunc except it panics if an error happens.
-func MustTfunc(languageSource string, languageSources ...string) TranslateFunc {
- return TranslateFunc(defaultBundle.MustTfunc(languageSource, languageSources...))
-}
-
-// Tfunc returns a TranslateFunc that will be bound to the first language which
-// has a non-zero number of translations.
-//
-// It can parse languages from Accept-Language headers (RFC 2616).
-func Tfunc(languageSource string, languageSources ...string) (TranslateFunc, error) {
- tfunc, err := defaultBundle.Tfunc(languageSource, languageSources...)
- return TranslateFunc(tfunc), err
-}
-
-// MustTfuncAndLanguage is similar to TfuncAndLanguage except it panics if an error happens.
-func MustTfuncAndLanguage(languageSource string, languageSources ...string) (TranslateFunc, *language.Language) {
- tfunc, lang := defaultBundle.MustTfuncAndLanguage(languageSource, languageSources...)
- return TranslateFunc(tfunc), lang
-}
-
-// TfuncAndLanguage is similar to Tfunc except it also returns the language which TranslateFunc is bound to.
-func TfuncAndLanguage(languageSource string, languageSources ...string) (TranslateFunc, *language.Language, error) {
- tfunc, lang, err := defaultBundle.TfuncAndLanguage(languageSource, languageSources...)
- return TranslateFunc(tfunc), lang, err
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/main.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/main.go
deleted file mode 100644
index 5d6b6ad4f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/main.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package main
-
-import (
- "encoding/xml"
- "flag"
- "fmt"
- "io/ioutil"
- "os"
- "text/template"
-)
-
-var usage = `%[1]s generates Go code to support CLDR plural rules.
-
-Usage: %[1]s [options]
-
-Options:
-
-`
-
-func main() {
- flag.Usage = func() {
- fmt.Fprintf(os.Stderr, usage, os.Args[0])
- flag.PrintDefaults()
- }
- var in, cout, tout string
- flag.StringVar(&in, "i", "plurals.xml", "the input XML file containing CLDR plural rules")
- flag.StringVar(&cout, "cout", "", "the code output file")
- flag.StringVar(&tout, "tout", "", "the test output file")
- flag.BoolVar(&verbose, "v", false, "verbose output")
- flag.Parse()
-
- buf, err := ioutil.ReadFile(in)
- if err != nil {
- fatalf("failed to read file: %s", err)
- }
-
- var data SupplementalData
- if err := xml.Unmarshal(buf, &data); err != nil {
- fatalf("failed to unmarshal xml: %s", err)
- }
-
- count := 0
- for _, pg := range data.PluralGroups {
- count += len(pg.SplitLocales())
- }
- infof("parsed %d locales", count)
-
- if cout != "" {
- file := openWritableFile(cout)
- if err := codeTemplate.Execute(file, data); err != nil {
- fatalf("unable to execute code template because %s", err)
- } else {
- infof("generated %s", cout)
- }
- } else {
- infof("not generating code file (use -cout)")
- }
-
- if tout != "" {
- file := openWritableFile(tout)
- if err := testTemplate.Execute(file, data); err != nil {
- fatalf("unable to execute test template because %s", err)
- } else {
- infof("generated %s", tout)
- }
- } else {
- infof("not generating test file (use -tout)")
- }
-}
-
-func openWritableFile(name string) *os.File {
- file, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
- if err != nil {
- fatalf("failed to write file %s because %s", name, err)
- }
- return file
-}
-
-var codeTemplate = template.Must(template.New("spec").Parse(`package language
-// This file is generated by i18n/language/codegen/generate.sh
-
-func init() {
-{{range .PluralGroups}}
- registerPluralSpec({{printf "%#v" .SplitLocales}}, &PluralSpec{
- Plurals: newPluralSet({{range $i, $e := .PluralRules}}{{if $i}}, {{end}}{{$e.CountTitle}}{{end}}),
- PluralFunc: func(ops *operands) Plural { {{range .PluralRules}}{{if .GoCondition}}
- // {{.Condition}}
- if {{.GoCondition}} {
- return {{.CountTitle}}
- }{{end}}{{end}}
- return Other
- },
- }){{end}}
-}
-`))
-
-var testTemplate = template.Must(template.New("spec").Parse(`package language
-// This file is generated by i18n/language/codegen/generate.sh
-
-import "testing"
-
-{{range .PluralGroups}}
-func Test{{.Name}}(t *testing.T) {
- var tests []pluralTest
- {{range .PluralRules}}
- {{if .IntegerExamples}}tests = appendIntegerTests(tests, {{.CountTitle}}, {{printf "%#v" .IntegerExamples}}){{end}}
- {{if .DecimalExamples}}tests = appendDecimalTests(tests, {{.CountTitle}}, {{printf "%#v" .DecimalExamples}}){{end}}
- {{end}}
- locales := {{printf "%#v" .SplitLocales}}
- for _, locale := range locales {
- runTests(t, locale, tests)
- }
-}
-{{end}}
-`))
-
-func infof(format string, args ...interface{}) {
- fmt.Fprintf(os.Stderr, format+"\n", args...)
-}
-
-var verbose bool
-
-func verbosef(format string, args ...interface{}) {
- if verbose {
- infof(format, args...)
- }
-}
-
-func fatalf(format string, args ...interface{}) {
- infof("fatal: "+format+"\n", args...)
- os.Exit(1)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/xml.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/xml.go
deleted file mode 100644
index 9d39053c2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/xml.go
+++ /dev/null
@@ -1,143 +0,0 @@
-package main
-
-import (
- "encoding/xml"
- "fmt"
- "regexp"
- "strings"
-)
-
-// SupplementalData is the top level struct of plural.xml
-type SupplementalData struct {
- XMLName xml.Name `xml:"supplementalData"`
- PluralGroups []PluralGroup `xml:"plurals>pluralRules"`
-}
-
-// PluralGroup is a group of locales with the same plural rules.
-type PluralGroup struct {
- Locales string `xml:"locales,attr"`
- PluralRules []PluralRule `xml:"pluralRule"`
-}
-
-// Name returns a unique name for this plural group.
-func (pg *PluralGroup) Name() string {
- n := strings.Title(pg.Locales)
- return strings.Replace(n, " ", "", -1)
-}
-
-// SplitLocales returns all the locales in the PluralGroup as a slice.
-func (pg *PluralGroup) SplitLocales() []string {
- return strings.Split(pg.Locales, " ")
-}
-
-// PluralRule is the rule for a single plural form.
-type PluralRule struct {
- Count string `xml:"count,attr"`
- Rule string `xml:",innerxml"`
-}
-
-// CountTitle returns the title case of the PluralRule's count.
-func (pr *PluralRule) CountTitle() string {
- return strings.Title(pr.Count)
-}
-
-// Condition returns the condition where the PluralRule applies.
-func (pr *PluralRule) Condition() string {
- i := strings.Index(pr.Rule, "@")
- return pr.Rule[:i]
-}
-
-// Examples returns the integer and decimal exmaples for the PLuralRule.
-func (pr *PluralRule) Examples() (integer []string, decimal []string) {
- ex := strings.Replace(pr.Rule, ", …", "", -1)
- ddelim := "@decimal"
- if i := strings.Index(ex, ddelim); i > 0 {
- dex := strings.TrimSpace(ex[i+len(ddelim):])
- decimal = strings.Split(dex, ", ")
- ex = ex[:i]
- }
- idelim := "@integer"
- if i := strings.Index(ex, idelim); i > 0 {
- iex := strings.TrimSpace(ex[i+len(idelim):])
- integer = strings.Split(iex, ", ")
- }
- return integer, decimal
-}
-
-// IntegerExamples returns the integer exmaples for the PLuralRule.
-func (pr *PluralRule) IntegerExamples() []string {
- integer, _ := pr.Examples()
- return integer
-}
-
-// DecimalExamples returns the decimal exmaples for the PLuralRule.
-func (pr *PluralRule) DecimalExamples() []string {
- _, decimal := pr.Examples()
- return decimal
-}
-
-var relationRegexp = regexp.MustCompile("([niftvw])(?: % ([0-9]+))? (!=|=)(.*)")
-
-// GoCondition converts the XML condition to valid Go code.
-func (pr *PluralRule) GoCondition() string {
- var ors []string
- for _, and := range strings.Split(pr.Condition(), "or") {
- var ands []string
- for _, relation := range strings.Split(and, "and") {
- parts := relationRegexp.FindStringSubmatch(relation)
- if parts == nil {
- continue
- }
- lvar, lmod, op, rhs := strings.Title(parts[1]), parts[2], parts[3], strings.TrimSpace(parts[4])
- if op == "=" {
- op = "=="
- }
- lvar = "ops." + lvar
- var rhor []string
- var rany []string
- for _, rh := range strings.Split(rhs, ",") {
- if parts := strings.Split(rh, ".."); len(parts) == 2 {
- from, to := parts[0], parts[1]
- if lvar == "ops.N" {
- if lmod != "" {
- rhor = append(rhor, fmt.Sprintf("ops.NmodInRange(%s, %s, %s)", lmod, from, to))
- } else {
- rhor = append(rhor, fmt.Sprintf("ops.NinRange(%s, %s)", from, to))
- }
- } else if lmod != "" {
- rhor = append(rhor, fmt.Sprintf("intInRange(%s %% %s, %s, %s)", lvar, lmod, from, to))
- } else {
- rhor = append(rhor, fmt.Sprintf("intInRange(%s, %s, %s)", lvar, from, to))
- }
- } else {
- rany = append(rany, rh)
- }
- }
-
- if len(rany) > 0 {
- rh := strings.Join(rany, ",")
- if lvar == "ops.N" {
- if lmod != "" {
- rhor = append(rhor, fmt.Sprintf("ops.NmodEqualsAny(%s, %s)", lmod, rh))
- } else {
- rhor = append(rhor, fmt.Sprintf("ops.NequalsAny(%s)", rh))
- }
- } else if lmod != "" {
- rhor = append(rhor, fmt.Sprintf("intEqualsAny(%s %% %s, %s)", lvar, lmod, rh))
- } else {
- rhor = append(rhor, fmt.Sprintf("intEqualsAny(%s, %s)", lvar, rh))
- }
- }
- r := strings.Join(rhor, " || ")
- if len(rhor) > 1 {
- r = "(" + r + ")"
- }
- if op == "!=" {
- r = "!" + r
- }
- ands = append(ands, r)
- }
- ors = append(ors, strings.Join(ands, " && "))
- }
- return strings.Join(ors, " ||\n")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/language.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/language.go
deleted file mode 100644
index 9a155efc5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/language.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// Package language defines languages that implement CLDR pluralization.
-package language
-
-import (
- "fmt"
- "strings"
-)
-
-// Language is a written human language.
-type Language struct {
- // Tag uniquely identifies the language as defined by RFC 5646.
- //
- // Most language tags are a two character language code (ISO 639-1)
- // optionally followed by a dash and a two character country code (ISO 3166-1).
- // (e.g. en, pt-br)
- Tag string
- *PluralSpec
-}
-
-func (l *Language) String() string {
- return l.Tag
-}
-
-// MatchingTags returns the set of language tags that map to this Language.
-// e.g. "zh-hans-cn" yields {"zh", "zh-hans", "zh-hans-cn"}
-// BUG: This should be computed once and stored as a field on Language for efficiency,
-// but this would require changing how Languages are constructed.
-func (l *Language) MatchingTags() []string {
- parts := strings.Split(l.Tag, "-")
- var prefix, matches []string
- for _, part := range parts {
- prefix = append(prefix, part)
- match := strings.Join(prefix, "-")
- matches = append(matches, match)
- }
- return matches
-}
-
-// Parse returns a slice of supported languages found in src or nil if none are found.
-// It can parse language tags and Accept-Language headers.
-func Parse(src string) []*Language {
- var langs []*Language
- start := 0
- for end, chr := range src {
- switch chr {
- case ',', ';', '.':
- tag := strings.TrimSpace(src[start:end])
- if spec := getPluralSpec(tag); spec != nil {
- langs = append(langs, &Language{NormalizeTag(tag), spec})
- }
- start = end + 1
- }
- }
- if start > 0 {
- tag := strings.TrimSpace(src[start:])
- if spec := getPluralSpec(tag); spec != nil {
- langs = append(langs, &Language{NormalizeTag(tag), spec})
- }
- return dedupe(langs)
- }
- if spec := getPluralSpec(src); spec != nil {
- langs = append(langs, &Language{NormalizeTag(src), spec})
- }
- return langs
-}
-
-func dedupe(langs []*Language) []*Language {
- found := make(map[string]struct{}, len(langs))
- deduped := make([]*Language, 0, len(langs))
- for _, lang := range langs {
- if _, ok := found[lang.Tag]; !ok {
- found[lang.Tag] = struct{}{}
- deduped = append(deduped, lang)
- }
- }
- return deduped
-}
-
-// MustParse is similar to Parse except it panics instead of retuning a nil Language.
-func MustParse(src string) []*Language {
- langs := Parse(src)
- if len(langs) == 0 {
- panic(fmt.Errorf("unable to parse language from %q", src))
- }
- return langs
-}
-
-// Add adds support for a new language.
-func Add(l *Language) {
- tag := NormalizeTag(l.Tag)
- pluralSpecs[tag] = l.PluralSpec
-}
-
-// NormalizeTag returns a language tag with all lower-case characters
-// and dashes "-" instead of underscores "_"
-func NormalizeTag(tag string) string {
- tag = strings.ToLower(tag)
- return strings.Replace(tag, "_", "-", -1)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/operands.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/operands.go
deleted file mode 100644
index 877bcc89d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/operands.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package language
-
-import (
- "fmt"
- "strconv"
- "strings"
-)
-
-// http://unicode.org/reports/tr35/tr35-numbers.html#Operands
-type operands struct {
- N float64 // absolute value of the source number (integer and decimals)
- I int64 // integer digits of n
- V int64 // number of visible fraction digits in n, with trailing zeros
- W int64 // number of visible fraction digits in n, without trailing zeros
- F int64 // visible fractional digits in n, with trailing zeros
- T int64 // visible fractional digits in n, without trailing zeros
-}
-
-// NmodEqualAny returns true if o represents an integer equal to any of the arguments.
-func (o *operands) NequalsAny(any ...int64) bool {
- for _, i := range any {
- if o.I == i && o.T == 0 {
- return true
- }
- }
- return false
-}
-
-// NmodEqualAny returns true if o represents an integer equal to any of the arguments modulo mod.
-func (o *operands) NmodEqualsAny(mod int64, any ...int64) bool {
- modI := o.I % mod
- for _, i := range any {
- if modI == i && o.T == 0 {
- return true
- }
- }
- return false
-}
-
-// NmodInRange returns true if o represents an integer in the closed interval [from, to].
-func (o *operands) NinRange(from, to int64) bool {
- return o.T == 0 && from <= o.I && o.I <= to
-}
-
-// NmodInRange returns true if o represents an integer in the closed interval [from, to] modulo mod.
-func (o *operands) NmodInRange(mod, from, to int64) bool {
- modI := o.I % mod
- return o.T == 0 && from <= modI && modI <= to
-}
-
-func newOperands(v interface{}) (*operands, error) {
- switch v := v.(type) {
- case int:
- return newOperandsInt64(int64(v)), nil
- case int8:
- return newOperandsInt64(int64(v)), nil
- case int16:
- return newOperandsInt64(int64(v)), nil
- case int32:
- return newOperandsInt64(int64(v)), nil
- case int64:
- return newOperandsInt64(v), nil
- case string:
- return newOperandsString(v)
- case float32, float64:
- return nil, fmt.Errorf("floats should be formatted into a string")
- default:
- return nil, fmt.Errorf("invalid type %T; expected integer or string", v)
- }
-}
-
-func newOperandsInt64(i int64) *operands {
- if i < 0 {
- i = -i
- }
- return &operands{float64(i), i, 0, 0, 0, 0}
-}
-
-func newOperandsString(s string) (*operands, error) {
- if s[0] == '-' {
- s = s[1:]
- }
- n, err := strconv.ParseFloat(s, 64)
- if err != nil {
- return nil, err
- }
- ops := &operands{N: n}
- parts := strings.SplitN(s, ".", 2)
- ops.I, err = strconv.ParseInt(parts[0], 10, 64)
- if err != nil {
- return nil, err
- }
- if len(parts) == 1 {
- return ops, nil
- }
- fraction := parts[1]
- ops.V = int64(len(fraction))
- for i := ops.V - 1; i >= 0; i-- {
- if fraction[i] != '0' {
- ops.W = i + 1
- break
- }
- }
- if ops.V > 0 {
- f, err := strconv.ParseInt(fraction, 10, 0)
- if err != nil {
- return nil, err
- }
- ops.F = f
- }
- if ops.W > 0 {
- t, err := strconv.ParseInt(fraction[:ops.W], 10, 0)
- if err != nil {
- return nil, err
- }
- ops.T = t
- }
- return ops, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/plural.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/plural.go
deleted file mode 100644
index 1f3ea5c69..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/plural.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package language
-
-import (
- "fmt"
-)
-
-// Plural represents a language pluralization form as defined here:
-// http://cldr.unicode.org/index/cldr-spec/plural-rules
-type Plural string
-
-// All defined plural categories.
-const (
- Invalid Plural = "invalid"
- Zero = "zero"
- One = "one"
- Two = "two"
- Few = "few"
- Many = "many"
- Other = "other"
-)
-
-// NewPlural returns src as a Plural
-// or Invalid and a non-nil error if src is not a valid Plural.
-func NewPlural(src string) (Plural, error) {
- switch src {
- case "zero":
- return Zero, nil
- case "one":
- return One, nil
- case "two":
- return Two, nil
- case "few":
- return Few, nil
- case "many":
- return Many, nil
- case "other":
- return Other, nil
- }
- return Invalid, fmt.Errorf("invalid plural category %s", src)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec.go
deleted file mode 100644
index fc3522682..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec.go
+++ /dev/null
@@ -1,74 +0,0 @@
-package language
-
-import "strings"
-
-// PluralSpec defines the CLDR plural rules for a language.
-// http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html
-// http://unicode.org/reports/tr35/tr35-numbers.html#Operands
-type PluralSpec struct {
- Plurals map[Plural]struct{}
- PluralFunc func(*operands) Plural
-}
-
-var pluralSpecs = make(map[string]*PluralSpec)
-
-func normalizePluralSpecID(id string) string {
- id = strings.Replace(id, "_", "-", -1)
- id = strings.ToLower(id)
- return id
-}
-
-func registerPluralSpec(ids []string, ps *PluralSpec) {
- for _, id := range ids {
- id = normalizePluralSpecID(id)
- pluralSpecs[id] = ps
- }
-}
-
-// Plural returns the plural category for number as defined by
-// the language's CLDR plural rules.
-func (ps *PluralSpec) Plural(number interface{}) (Plural, error) {
- ops, err := newOperands(number)
- if err != nil {
- return Invalid, err
- }
- return ps.PluralFunc(ops), nil
-}
-
-// getPluralSpec returns the PluralSpec that matches the longest prefix of tag.
-// It returns nil if no PluralSpec matches tag.
-func getPluralSpec(tag string) *PluralSpec {
- tag = NormalizeTag(tag)
- subtag := tag
- for {
- if spec := pluralSpecs[subtag]; spec != nil {
- return spec
- }
- end := strings.LastIndex(subtag, "-")
- if end == -1 {
- return nil
- }
- subtag = subtag[:end]
- }
-}
-
-func newPluralSet(plurals ...Plural) map[Plural]struct{} {
- set := make(map[Plural]struct{}, len(plurals))
- for _, plural := range plurals {
- set[plural] = struct{}{}
- }
- return set
-}
-
-func intInRange(i, from, to int64) bool {
- return from <= i && i <= to
-}
-
-func intEqualsAny(i int64, any ...int64) bool {
- for _, a := range any {
- if i == a {
- return true
- }
- }
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec_gen.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec_gen.go
deleted file mode 100644
index c9b4f2667..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec_gen.go
+++ /dev/null
@@ -1,567 +0,0 @@
-package language
-
-// This file is generated by i18n/language/codegen/generate.sh
-
-func init() {
-
- registerPluralSpec([]string{"bm", "bo", "dz", "id", "ig", "ii", "in", "ja", "jbo", "jv", "jw", "kde", "kea", "km", "ko", "lkt", "lo", "ms", "my", "nqo", "root", "sah", "ses", "sg", "th", "to", "vi", "wo", "yo", "zh"}, &PluralSpec{
- Plurals: newPluralSet(Other),
- PluralFunc: func(ops *operands) Plural {
- return Other
- },
- })
- registerPluralSpec([]string{"am", "as", "bn", "fa", "gu", "hi", "kn", "mr", "zu"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // i = 0 or n = 1
- if intEqualsAny(ops.I, 0) ||
- ops.NequalsAny(1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"ff", "fr", "hy", "kab"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // i = 0,1
- if intEqualsAny(ops.I, 0, 1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"ast", "ca", "de", "en", "et", "fi", "fy", "gl", "it", "ji", "nl", "sv", "sw", "ur", "yi"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // i = 1 and v = 0
- if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"si"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 0,1 or i = 0 and f = 1
- if ops.NequalsAny(0, 1) ||
- intEqualsAny(ops.I, 0) && intEqualsAny(ops.F, 1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"ak", "bh", "guw", "ln", "mg", "nso", "pa", "ti", "wa"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 0..1
- if ops.NinRange(0, 1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"tzm"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 0..1 or n = 11..99
- if ops.NinRange(0, 1) ||
- ops.NinRange(11, 99) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"pt"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 0..2 and n != 2
- if ops.NinRange(0, 2) && !ops.NequalsAny(2) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"af", "asa", "az", "bem", "bez", "bg", "brx", "ce", "cgg", "chr", "ckb", "dv", "ee", "el", "eo", "es", "eu", "fo", "fur", "gsw", "ha", "haw", "hu", "jgo", "jmc", "ka", "kaj", "kcg", "kk", "kkj", "kl", "ks", "ksb", "ku", "ky", "lb", "lg", "mas", "mgo", "ml", "mn", "nah", "nb", "nd", "ne", "nn", "nnh", "no", "nr", "ny", "nyn", "om", "or", "os", "pap", "ps", "rm", "rof", "rwk", "saq", "sdh", "seh", "sn", "so", "sq", "ss", "ssy", "st", "syr", "ta", "te", "teo", "tig", "tk", "tn", "tr", "ts", "ug", "uz", "ve", "vo", "vun", "wae", "xh", "xog"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 1
- if ops.NequalsAny(1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"pt_PT"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 1 and v = 0
- if ops.NequalsAny(1) && intEqualsAny(ops.V, 0) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"da"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 1 or t != 0 and i = 0,1
- if ops.NequalsAny(1) ||
- !intEqualsAny(ops.T, 0) && intEqualsAny(ops.I, 0, 1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"is"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // t = 0 and i % 10 = 1 and i % 100 != 11 or t != 0
- if intEqualsAny(ops.T, 0) && intEqualsAny(ops.I%10, 1) && !intEqualsAny(ops.I%100, 11) ||
- !intEqualsAny(ops.T, 0) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"mk"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // v = 0 and i % 10 = 1 or f % 10 = 1
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 1) ||
- intEqualsAny(ops.F%10, 1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"fil", "tl"}, &PluralSpec{
- Plurals: newPluralSet(One, Other),
- PluralFunc: func(ops *operands) Plural {
- // v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I, 1, 2, 3) ||
- intEqualsAny(ops.V, 0) && !intEqualsAny(ops.I%10, 4, 6, 9) ||
- !intEqualsAny(ops.V, 0) && !intEqualsAny(ops.F%10, 4, 6, 9) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"lv", "prg"}, &PluralSpec{
- Plurals: newPluralSet(Zero, One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19
- if ops.NmodEqualsAny(10, 0) ||
- ops.NmodInRange(100, 11, 19) ||
- intEqualsAny(ops.V, 2) && intInRange(ops.F%100, 11, 19) {
- return Zero
- }
- // n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1
- if ops.NmodEqualsAny(10, 1) && !ops.NmodEqualsAny(100, 11) ||
- intEqualsAny(ops.V, 2) && intEqualsAny(ops.F%10, 1) && !intEqualsAny(ops.F%100, 11) ||
- !intEqualsAny(ops.V, 2) && intEqualsAny(ops.F%10, 1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"lag"}, &PluralSpec{
- Plurals: newPluralSet(Zero, One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 0
- if ops.NequalsAny(0) {
- return Zero
- }
- // i = 0,1 and n != 0
- if intEqualsAny(ops.I, 0, 1) && !ops.NequalsAny(0) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"ksh"}, &PluralSpec{
- Plurals: newPluralSet(Zero, One, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 0
- if ops.NequalsAny(0) {
- return Zero
- }
- // n = 1
- if ops.NequalsAny(1) {
- return One
- }
- return Other
- },
- })
- registerPluralSpec([]string{"iu", "kw", "naq", "se", "sma", "smi", "smj", "smn", "sms"}, &PluralSpec{
- Plurals: newPluralSet(One, Two, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 1
- if ops.NequalsAny(1) {
- return One
- }
- // n = 2
- if ops.NequalsAny(2) {
- return Two
- }
- return Other
- },
- })
- registerPluralSpec([]string{"shi"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Other),
- PluralFunc: func(ops *operands) Plural {
- // i = 0 or n = 1
- if intEqualsAny(ops.I, 0) ||
- ops.NequalsAny(1) {
- return One
- }
- // n = 2..10
- if ops.NinRange(2, 10) {
- return Few
- }
- return Other
- },
- })
- registerPluralSpec([]string{"mo", "ro"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Other),
- PluralFunc: func(ops *operands) Plural {
- // i = 1 and v = 0
- if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) {
- return One
- }
- // v != 0 or n = 0 or n != 1 and n % 100 = 1..19
- if !intEqualsAny(ops.V, 0) ||
- ops.NequalsAny(0) ||
- !ops.NequalsAny(1) && ops.NmodInRange(100, 1, 19) {
- return Few
- }
- return Other
- },
- })
- registerPluralSpec([]string{"bs", "hr", "sh", "sr"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Other),
- PluralFunc: func(ops *operands) Plural {
- // v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 1) && !intEqualsAny(ops.I%100, 11) ||
- intEqualsAny(ops.F%10, 1) && !intEqualsAny(ops.F%100, 11) {
- return One
- }
- // v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14
- if intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 2, 4) && !intInRange(ops.I%100, 12, 14) ||
- intInRange(ops.F%10, 2, 4) && !intInRange(ops.F%100, 12, 14) {
- return Few
- }
- return Other
- },
- })
- registerPluralSpec([]string{"gd"}, &PluralSpec{
- Plurals: newPluralSet(One, Two, Few, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 1,11
- if ops.NequalsAny(1, 11) {
- return One
- }
- // n = 2,12
- if ops.NequalsAny(2, 12) {
- return Two
- }
- // n = 3..10,13..19
- if ops.NinRange(3, 10) || ops.NinRange(13, 19) {
- return Few
- }
- return Other
- },
- })
- registerPluralSpec([]string{"sl"}, &PluralSpec{
- Plurals: newPluralSet(One, Two, Few, Other),
- PluralFunc: func(ops *operands) Plural {
- // v = 0 and i % 100 = 1
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 1) {
- return One
- }
- // v = 0 and i % 100 = 2
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 2) {
- return Two
- }
- // v = 0 and i % 100 = 3..4 or v != 0
- if intEqualsAny(ops.V, 0) && intInRange(ops.I%100, 3, 4) ||
- !intEqualsAny(ops.V, 0) {
- return Few
- }
- return Other
- },
- })
- registerPluralSpec([]string{"dsb", "hsb"}, &PluralSpec{
- Plurals: newPluralSet(One, Two, Few, Other),
- PluralFunc: func(ops *operands) Plural {
- // v = 0 and i % 100 = 1 or f % 100 = 1
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 1) ||
- intEqualsAny(ops.F%100, 1) {
- return One
- }
- // v = 0 and i % 100 = 2 or f % 100 = 2
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 2) ||
- intEqualsAny(ops.F%100, 2) {
- return Two
- }
- // v = 0 and i % 100 = 3..4 or f % 100 = 3..4
- if intEqualsAny(ops.V, 0) && intInRange(ops.I%100, 3, 4) ||
- intInRange(ops.F%100, 3, 4) {
- return Few
- }
- return Other
- },
- })
- registerPluralSpec([]string{"he", "iw"}, &PluralSpec{
- Plurals: newPluralSet(One, Two, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // i = 1 and v = 0
- if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) {
- return One
- }
- // i = 2 and v = 0
- if intEqualsAny(ops.I, 2) && intEqualsAny(ops.V, 0) {
- return Two
- }
- // v = 0 and n != 0..10 and n % 10 = 0
- if intEqualsAny(ops.V, 0) && !ops.NinRange(0, 10) && ops.NmodEqualsAny(10, 0) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"cs", "sk"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // i = 1 and v = 0
- if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) {
- return One
- }
- // i = 2..4 and v = 0
- if intInRange(ops.I, 2, 4) && intEqualsAny(ops.V, 0) {
- return Few
- }
- // v != 0
- if !intEqualsAny(ops.V, 0) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"pl"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // i = 1 and v = 0
- if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) {
- return One
- }
- // v = 0 and i % 10 = 2..4 and i % 100 != 12..14
- if intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 2, 4) && !intInRange(ops.I%100, 12, 14) {
- return Few
- }
- // v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14
- if intEqualsAny(ops.V, 0) && !intEqualsAny(ops.I, 1) && intInRange(ops.I%10, 0, 1) ||
- intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 5, 9) ||
- intEqualsAny(ops.V, 0) && intInRange(ops.I%100, 12, 14) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"be"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // n % 10 = 1 and n % 100 != 11
- if ops.NmodEqualsAny(10, 1) && !ops.NmodEqualsAny(100, 11) {
- return One
- }
- // n % 10 = 2..4 and n % 100 != 12..14
- if ops.NmodInRange(10, 2, 4) && !ops.NmodInRange(100, 12, 14) {
- return Few
- }
- // n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14
- if ops.NmodEqualsAny(10, 0) ||
- ops.NmodInRange(10, 5, 9) ||
- ops.NmodInRange(100, 11, 14) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"lt"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // n % 10 = 1 and n % 100 != 11..19
- if ops.NmodEqualsAny(10, 1) && !ops.NmodInRange(100, 11, 19) {
- return One
- }
- // n % 10 = 2..9 and n % 100 != 11..19
- if ops.NmodInRange(10, 2, 9) && !ops.NmodInRange(100, 11, 19) {
- return Few
- }
- // f != 0
- if !intEqualsAny(ops.F, 0) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"mt"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 1
- if ops.NequalsAny(1) {
- return One
- }
- // n = 0 or n % 100 = 2..10
- if ops.NequalsAny(0) ||
- ops.NmodInRange(100, 2, 10) {
- return Few
- }
- // n % 100 = 11..19
- if ops.NmodInRange(100, 11, 19) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"ru", "uk"}, &PluralSpec{
- Plurals: newPluralSet(One, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // v = 0 and i % 10 = 1 and i % 100 != 11
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 1) && !intEqualsAny(ops.I%100, 11) {
- return One
- }
- // v = 0 and i % 10 = 2..4 and i % 100 != 12..14
- if intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 2, 4) && !intInRange(ops.I%100, 12, 14) {
- return Few
- }
- // v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 0) ||
- intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 5, 9) ||
- intEqualsAny(ops.V, 0) && intInRange(ops.I%100, 11, 14) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"br"}, &PluralSpec{
- Plurals: newPluralSet(One, Two, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // n % 10 = 1 and n % 100 != 11,71,91
- if ops.NmodEqualsAny(10, 1) && !ops.NmodEqualsAny(100, 11, 71, 91) {
- return One
- }
- // n % 10 = 2 and n % 100 != 12,72,92
- if ops.NmodEqualsAny(10, 2) && !ops.NmodEqualsAny(100, 12, 72, 92) {
- return Two
- }
- // n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99
- if (ops.NmodInRange(10, 3, 4) || ops.NmodEqualsAny(10, 9)) && !(ops.NmodInRange(100, 10, 19) || ops.NmodInRange(100, 70, 79) || ops.NmodInRange(100, 90, 99)) {
- return Few
- }
- // n != 0 and n % 1000000 = 0
- if !ops.NequalsAny(0) && ops.NmodEqualsAny(1000000, 0) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"ga"}, &PluralSpec{
- Plurals: newPluralSet(One, Two, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 1
- if ops.NequalsAny(1) {
- return One
- }
- // n = 2
- if ops.NequalsAny(2) {
- return Two
- }
- // n = 3..6
- if ops.NinRange(3, 6) {
- return Few
- }
- // n = 7..10
- if ops.NinRange(7, 10) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"gv"}, &PluralSpec{
- Plurals: newPluralSet(One, Two, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // v = 0 and i % 10 = 1
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 1) {
- return One
- }
- // v = 0 and i % 10 = 2
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 2) {
- return Two
- }
- // v = 0 and i % 100 = 0,20,40,60,80
- if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 0, 20, 40, 60, 80) {
- return Few
- }
- // v != 0
- if !intEqualsAny(ops.V, 0) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"ar"}, &PluralSpec{
- Plurals: newPluralSet(Zero, One, Two, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 0
- if ops.NequalsAny(0) {
- return Zero
- }
- // n = 1
- if ops.NequalsAny(1) {
- return One
- }
- // n = 2
- if ops.NequalsAny(2) {
- return Two
- }
- // n % 100 = 3..10
- if ops.NmodInRange(100, 3, 10) {
- return Few
- }
- // n % 100 = 11..99
- if ops.NmodInRange(100, 11, 99) {
- return Many
- }
- return Other
- },
- })
- registerPluralSpec([]string{"cy"}, &PluralSpec{
- Plurals: newPluralSet(Zero, One, Two, Few, Many, Other),
- PluralFunc: func(ops *operands) Plural {
- // n = 0
- if ops.NequalsAny(0) {
- return Zero
- }
- // n = 1
- if ops.NequalsAny(1) {
- return One
- }
- // n = 2
- if ops.NequalsAny(2) {
- return Two
- }
- // n = 3
- if ops.NequalsAny(3) {
- return Few
- }
- // n = 6
- if ops.NequalsAny(6) {
- return Many
- }
- return Other
- },
- })
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/plural_translation.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/plural_translation.go
deleted file mode 100644
index 4f579d16a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/plural_translation.go
+++ /dev/null
@@ -1,78 +0,0 @@
-package translation
-
-import (
- "github.com/nicksnyder/go-i18n/i18n/language"
-)
-
-type pluralTranslation struct {
- id string
- templates map[language.Plural]*template
-}
-
-func (pt *pluralTranslation) MarshalInterface() interface{} {
- return map[string]interface{}{
- "id": pt.id,
- "translation": pt.templates,
- }
-}
-
-func (pt *pluralTranslation) ID() string {
- return pt.id
-}
-
-func (pt *pluralTranslation) Template(pc language.Plural) *template {
- return pt.templates[pc]
-}
-
-func (pt *pluralTranslation) UntranslatedCopy() Translation {
- return &pluralTranslation{pt.id, make(map[language.Plural]*template)}
-}
-
-func (pt *pluralTranslation) Normalize(l *language.Language) Translation {
- // Delete plural categories that don't belong to this language.
- for pc := range pt.templates {
- if _, ok := l.Plurals[pc]; !ok {
- delete(pt.templates, pc)
- }
- }
- // Create map entries for missing valid categories.
- for pc := range l.Plurals {
- if _, ok := pt.templates[pc]; !ok {
- pt.templates[pc] = mustNewTemplate("")
- }
- }
- return pt
-}
-
-func (pt *pluralTranslation) Backfill(src Translation) Translation {
- for pc, t := range pt.templates {
- if t == nil || t.src == "" {
- pt.templates[pc] = src.Template(language.Other)
- }
- }
- return pt
-}
-
-func (pt *pluralTranslation) Merge(t Translation) Translation {
- other, ok := t.(*pluralTranslation)
- if !ok || pt.ID() != t.ID() {
- return t
- }
- for pluralCategory, template := range other.templates {
- if template != nil && template.src != "" {
- pt.templates[pluralCategory] = template
- }
- }
- return pt
-}
-
-func (pt *pluralTranslation) Incomplete(l *language.Language) bool {
- for pc := range l.Plurals {
- if t := pt.templates[pc]; t == nil || t.src == "" {
- return true
- }
- }
- return false
-}
-
-var _ = Translation(&pluralTranslation{})
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/single_translation.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/single_translation.go
deleted file mode 100644
index 1010e5947..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/single_translation.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package translation
-
-import (
- "github.com/nicksnyder/go-i18n/i18n/language"
-)
-
-type singleTranslation struct {
- id string
- template *template
-}
-
-func (st *singleTranslation) MarshalInterface() interface{} {
- return map[string]interface{}{
- "id": st.id,
- "translation": st.template,
- }
-}
-
-func (st *singleTranslation) ID() string {
- return st.id
-}
-
-func (st *singleTranslation) Template(pc language.Plural) *template {
- return st.template
-}
-
-func (st *singleTranslation) UntranslatedCopy() Translation {
- return &singleTranslation{st.id, mustNewTemplate("")}
-}
-
-func (st *singleTranslation) Normalize(language *language.Language) Translation {
- return st
-}
-
-func (st *singleTranslation) Backfill(src Translation) Translation {
- if st.template == nil || st.template.src == "" {
- st.template = src.Template(language.Other)
- }
- return st
-}
-
-func (st *singleTranslation) Merge(t Translation) Translation {
- other, ok := t.(*singleTranslation)
- if !ok || st.ID() != t.ID() {
- return t
- }
- if other.template != nil && other.template.src != "" {
- st.template = other.template
- }
- return st
-}
-
-func (st *singleTranslation) Incomplete(l *language.Language) bool {
- return st.template == nil || st.template.src == ""
-}
-
-var _ = Translation(&singleTranslation{})
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/template.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/template.go
deleted file mode 100644
index c8756fa4e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/template.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package translation
-
-import (
- "bytes"
- "encoding"
- "strings"
- gotemplate "text/template"
-)
-
-type template struct {
- tmpl *gotemplate.Template
- src string
-}
-
-func newTemplate(src string) (*template, error) {
- var tmpl template
- err := tmpl.parseTemplate(src)
- return &tmpl, err
-}
-
-func mustNewTemplate(src string) *template {
- t, err := newTemplate(src)
- if err != nil {
- panic(err)
- }
- return t
-}
-
-func (t *template) String() string {
- return t.src
-}
-
-func (t *template) Execute(args interface{}) string {
- if t.tmpl == nil {
- return t.src
- }
- var buf bytes.Buffer
- if err := t.tmpl.Execute(&buf, args); err != nil {
- return err.Error()
- }
- return buf.String()
-}
-
-func (t *template) MarshalText() ([]byte, error) {
- return []byte(t.src), nil
-}
-
-func (t *template) UnmarshalText(src []byte) error {
- return t.parseTemplate(string(src))
-}
-
-func (t *template) parseTemplate(src string) (err error) {
- t.src = src
- if strings.Contains(src, "{{") {
- t.tmpl, err = gotemplate.New(src).Parse(src)
- }
- return
-}
-
-var _ = encoding.TextMarshaler(&template{})
-var _ = encoding.TextUnmarshaler(&template{})
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/translation.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/translation.go
deleted file mode 100644
index fa93180b8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/github.com/nicksnyder/go-i18n/i18n/translation/translation.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Package translation defines the interface for a translation.
-package translation
-
-import (
- "fmt"
-
- "github.com/nicksnyder/go-i18n/i18n/language"
-)
-
-// Translation is the interface that represents a translated string.
-type Translation interface {
- // MarshalInterface returns the object that should be used
- // to serialize the translation.
- MarshalInterface() interface{}
- ID() string
- Template(language.Plural) *template
- UntranslatedCopy() Translation
- Normalize(language *language.Language) Translation
- Backfill(src Translation) Translation
- Merge(Translation) Translation
- Incomplete(l *language.Language) bool
-}
-
-// SortableByID implements sort.Interface for a slice of translations.
-type SortableByID []Translation
-
-func (a SortableByID) Len() int { return len(a) }
-func (a SortableByID) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a SortableByID) Less(i, j int) bool { return a[i].ID() < a[j].ID() }
-
-// NewTranslation reflects on data to create a new Translation.
-//
-// data["id"] must be a string and data["translation"] must be either a string
-// for a non-plural translation or a map[string]interface{} for a plural translation.
-func NewTranslation(data map[string]interface{}) (Translation, error) {
- id, ok := data["id"].(string)
- if !ok {
- return nil, fmt.Errorf(`missing "id" key`)
- }
- var pluralObject map[string]interface{}
- switch translation := data["translation"].(type) {
- case string:
- tmpl, err := newTemplate(translation)
- if err != nil {
- return nil, err
- }
- return &singleTranslation{id, tmpl}, nil
- case map[interface{}]interface{}:
- // The YAML parser uses interface{} keys so we first convert them to string keys.
- pluralObject = make(map[string]interface{})
- for k, v := range translation {
- kStr, ok := k.(string)
- if !ok {
- return nil, fmt.Errorf(`invalid plural category type %T; expected string`, k)
- }
- pluralObject[kStr] = v
- }
- case map[string]interface{}:
- pluralObject = translation
- case nil:
- return nil, fmt.Errorf(`missing "translation" key`)
- default:
- return nil, fmt.Errorf(`unsupported type for "translation" key %T`, translation)
- }
-
- templates := make(map[language.Plural]*template, len(pluralObject))
- for k, v := range pluralObject {
- pc, err := language.NewPlural(k)
- if err != nil {
- return nil, err
- }
- str, ok := v.(string)
- if !ok {
- return nil, fmt.Errorf(`plural category "%s" has value of type %T; expected string`, pc, v)
- }
- tmpl, err := newTemplate(str)
- if err != nil {
- return nil, err
- }
- templates[pc] = tmpl
- }
- return &pluralTranslation{id, templates}, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/COPYING b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/COPYING
deleted file mode 100644
index 2993ec085..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/COPYING
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2014 Alec Thomas
-
-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/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/actions.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/actions.go
deleted file mode 100644
index 22f412019..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/actions.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package kingpin
-
-// Action callback triggered during parsing.
-//
-// "element" is the flag, argument or command associated with the callback. It contains the Clause
-// and the string value.
-//
-// "context" contains the full parse context, including all other elements that have been parsed.
-type Action func(app *Application, element *ParseElement, context *ParseContext) error
-
-type actionApplier interface {
- applyActions(*Application, *ParseElement, *ParseContext) error
- applyPreActions(*Application, *ParseElement, *ParseContext) error
-}
-
-type actionMixin struct {
- actions []Action
- preActions []Action
-}
-
-func (a *actionMixin) addAction(action Action) {
- a.actions = append(a.actions, action)
-}
-
-func (a *actionMixin) addPreAction(action Action) {
- a.actions = append(a.actions, action)
-}
-
-func (a *actionMixin) applyActions(app *Application, element *ParseElement, context *ParseContext) error {
- for _, action := range a.actions {
- if err := action(app, element, context); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (a *actionMixin) applyPreActions(app *Application, element *ParseElement, context *ParseContext) error {
- for _, preAction := range a.preActions {
- if err := preAction(app, element, context); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/app.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/app.go
deleted file mode 100644
index 2f3de4287..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/app.go
+++ /dev/null
@@ -1,677 +0,0 @@
-package kingpin
-
-import (
- "fmt"
- "io"
- "os"
- "strings"
-)
-
-var (
- errCommandNotSpecified = TError("command not specified")
-)
-
-// An Application contains the definitions of flags, arguments and commands
-// for an application.
-type Application struct {
- cmdMixin
- initialized bool
-
- Name string
- Help string
-
- author string
- version string
- output io.Writer // Destination for usage.
- errors io.Writer
- terminate func(status int) // See Terminate()
- noInterspersed bool // can flags be interspersed with args (or must they come first)
- envarSeparator string
- defaultEnvars bool
- resolvers []Resolver
- completion bool
- helpFlag *Clause
- helpCommand *CmdClause
- defaultUsage *UsageContext
-}
-
-// New creates a new Kingpin application instance.
-func New(name, help string) *Application {
- a := &Application{
- Name: name,
- Help: help,
- output: os.Stdout,
- errors: os.Stderr,
- terminate: os.Exit,
- envarSeparator: string(os.PathListSeparator),
- defaultUsage: &UsageContext{
- Template: DefaultUsageTemplate,
- },
- }
- a.flagGroup = newFlagGroup()
- a.argGroup = newArgGroup()
- a.cmdGroup = newCmdGroup(a)
- a.helpFlag = a.Flag("help", T("Show context-sensitive help.")).Action(func(a *Application, e *ParseElement, c *ParseContext) error {
- a.UsageForContext(c)
- a.terminate(0)
- return nil
- })
- a.helpFlag.Bool()
- a.Flag("completion-bash", T("Output possible completions for the given args.")).Hidden().BoolVar(&a.completion)
- a.Flag("completion-script-bash", T("Generate completion script for bash.")).Hidden().PreAction(a.generateBashCompletionScript).Bool()
- a.Flag("completion-script-zsh", T("Generate completion script for ZSH.")).Hidden().PreAction(a.generateZSHCompletionScript).Bool()
-
- return a
-}
-
-// Struct allows applications to define flags with struct tags.
-//
-// Supported struct tags are: help, placeholder, default, short, long, required, hidden, env,
-// enum, and arg.
-//
-// The name of the flag will default to the CamelCase name transformed to camel-case. This can
-// be overridden with the "long" tag.
-//
-// All basic Go types are supported including floats, ints, strings, time.Duration,
-// and slices of same.
-//
-// For compatibility, also supports the tags used by https://github.com/jessevdk/go-flags
-func (a *Application) Struct(v interface{}) error {
- return a.fromStruct(nil, v)
-}
-
-func (a *Application) generateBashCompletionScript(_ *Application, e *ParseElement, c *ParseContext) error {
- usageContext := &UsageContext{
- Template: BashCompletionTemplate,
- }
- a.Writers(os.Stdout, os.Stderr)
- if err := a.UsageForContextWithTemplate(usageContext, c); err != nil {
- return err
- }
- a.terminate(0)
- return nil
-}
-
-func (a *Application) generateZSHCompletionScript(_ *Application, e *ParseElement, c *ParseContext) error {
- usageContext := &UsageContext{
- Template: ZshCompletionTemplate,
- }
- a.Writers(os.Stdout, os.Stderr)
- if err := a.UsageForContextWithTemplate(usageContext, c); err != nil {
- return err
- }
- a.terminate(0)
- return nil
-}
-
-// Action is an application-wide callback. It is used in two situations: first, with a nil "element"
-// parameter when parsing is complete, and second whenever a command, argument or flag is
-// encountered.
-func (a *Application) Action(action Action) *Application {
- a.addAction(action)
- return a
-}
-
-// PreAction is an application-wide callback. It is in two situations: first, with a nil "element"
-// parameter, and second, whenever a command, argument or flag is encountered.
-func (a *Application) PreAction(action Action) *Application {
- a.addPreAction(action)
- return a
-}
-
-// DefaultEnvars configures all flags (that do not already have an associated
-// envar) to use a default environment variable in the form "_".
-//
-// For example, if the application is named "foo" and a flag is named "bar-
-// waz" the environment variable: "FOO_BAR_WAZ".
-func (a *Application) DefaultEnvars() *Application {
- a.defaultEnvars = true
- return a
-}
-
-// EnvarSeparator sets the string that is used for separating values in environment variables.
-//
-// This defaults to the current OS's path list separator (typically : or ;).
-func (a *Application) EnvarSeparator(sep string) *Application {
- a.envarSeparator = sep
- return a
-
-}
-
-// Resolver adds an ordered set of flag/argument resolvers.
-//
-// Resolvers provide default flag/argument values, from environment variables, configuration files, etc. Multiple
-// resolvers may be added, and they are processed in order.
-//
-// The last Resolver to return a value always wins. Values returned from resolvers are not cumulative.
-func (a *Application) Resolver(resolvers ...Resolver) *Application {
- a.resolvers = append(a.resolvers, resolvers...)
- return a
-}
-
-// Terminate specifies the termination handler. Defaults to os.Exit(status).
-// If nil is passed, a no-op function will be used.
-func (a *Application) Terminate(terminate func(int)) *Application {
- if terminate == nil {
- terminate = func(int) {}
- }
- a.terminate = terminate
- return a
-}
-
-// Writers specifies the writers to use for usage and errors. Defaults to os.Stderr.
-func (a *Application) Writers(out, err io.Writer) *Application {
- a.output = out
- a.errors = err
- return a
-}
-
-// UsageTemplate specifies the text template to use when displaying usage
-// information via --help. The default is DefaultUsageTemplate.
-func (a *Application) UsageTemplate(template string) *Application {
- a.defaultUsage.Template = template
- return a
-}
-
-// UsageContext specifies the UsageContext to use when displaying usage
-// information via --help.
-func (a *Application) UsageContext(context *UsageContext) *Application {
- a.defaultUsage = context
- return a
-}
-
-// ParseContext parses the given command line and returns the fully populated
-// ParseContext.
-func (a *Application) ParseContext(args []string) (*ParseContext, error) {
- return a.parseContext(false, args)
-}
-
-func (a *Application) parseContext(ignoreDefault bool, args []string) (*ParseContext, error) {
- if err := a.init(); err != nil {
- return nil, err
- }
- context := tokenize(args, ignoreDefault, a.buildResolvers())
- err := parse(context, a)
- return context, err
-}
-
-// Build resolvers to emulate the envar and defaults behaviour that was previously hard-coded.
-func (a *Application) buildResolvers() []Resolver {
-
- // .Default() has lowest priority...
- resolvers := []Resolver{defaultsResolver()}
- // Then custom resolvers...
- resolvers = append(resolvers, a.resolvers...)
- // Finally, envars are highest priority behind direct flag parsing.
- if a.defaultEnvars {
- resolvers = append(resolvers, PrefixedEnvarResolver(a.Name+"_", a.envarSeparator))
- }
- resolvers = append(resolvers, envarResolver(a.envarSeparator))
-
- return resolvers
-}
-
-// Parse parses command-line arguments. It returns the selected command and an
-// error. The selected command will be a space separated subcommand, if
-// subcommands have been configured.
-//
-// This will populate all flag and argument values, call all callbacks, and so
-// on.
-func (a *Application) Parse(args []string) (command string, err error) {
- context, parseErr := a.ParseContext(args)
- if context == nil {
- // Since we do not throw error immediately, there could be a case
- // where a context returns nil. Protect against that.
- return "", parseErr
- }
-
- if err = a.setDefaults(context); err != nil {
- return "", err
- }
-
- selected, setValuesErr := a.setValues(context)
-
- if err = a.applyPreActions(context, !a.completion); err != nil {
- return "", err
- }
-
- if a.completion {
- a.generateBashCompletion(context)
- a.terminate(0)
- } else {
- if parseErr != nil {
- return "", parseErr
- }
-
- a.maybeHelp(context)
- if !context.EOL() {
- return "", TError("unexpected argument '{{.Arg0}}'", V{"Arg0": context.Peek()})
- }
-
- if setValuesErr != nil {
- return "", setValuesErr
- }
-
- command, err = a.execute(context, selected)
- if err == errCommandNotSpecified {
- a.writeUsage(context, nil)
- }
- }
- return command, err
-}
-
-func (a *Application) writeUsage(context *ParseContext, err error) {
- if err != nil {
- a.Errorf("%s", err)
- }
- if err := a.UsageForContext(context); err != nil {
- panic(err)
- }
- a.terminate(1)
-}
-
-func (a *Application) maybeHelp(context *ParseContext) {
- for _, element := range context.Elements {
- if element.OneOf.Flag == a.helpFlag {
- // Re-parse the command-line ignoring defaults, so that help works correctly.
- context, _ = a.parseContext(true, context.rawArgs)
- a.writeUsage(context, nil)
- }
- }
-}
-
-// Version adds a --version flag for displaying the application version.
-func (a *Application) Version(version string) *Application {
- a.version = version
- a.Flag("version", T("Show application version.")).
- PreAction(func(*Application, *ParseElement, *ParseContext) error {
- fmt.Fprintln(a.output, version)
- a.terminate(0)
- return nil
- }).
- Bool()
- return a
-}
-
-// Author sets the author name for usage templates.
-func (a *Application) Author(author string) *Application {
- a.author = author
- return a
-}
-
-// Command adds a new top-level command.
-func (a *Application) Command(name, help string) *CmdClause {
- return a.addCommand(name, help)
-}
-
-// Interspersed control if flags can be interspersed with positional arguments
-//
-// true (the default) means that they can, false means that all the flags must appear before the first positional arguments.
-func (a *Application) Interspersed(interspersed bool) *Application {
- a.noInterspersed = !interspersed
- return a
-}
-
-func (a *Application) init() error {
- if a.initialized {
- return nil
- }
- if err := a.checkArgCommandMixing(); err != nil {
- return err
- }
-
- // If we have subcommands, add a help command at the top-level.
- if a.cmdGroup.have() {
- var command []string
- a.helpCommand = a.Command("help", T("Show help.")).
- PreAction(func(_ *Application, element *ParseElement, context *ParseContext) error {
- a.Usage(command)
- command = []string{}
- a.terminate(0)
- return nil
- })
- a.helpCommand.
- Arg("command", T("Show help on command.")).
- StringsVar(&command)
- // Make help first command.
- l := len(a.commandOrder)
- a.commandOrder = append(a.commandOrder[l-1:l], a.commandOrder[:l-1]...)
- }
-
- if err := a.flagGroup.init(); err != nil {
- return err
- }
- if err := a.cmdGroup.init(); err != nil {
- return err
- }
- if err := a.argGroup.init(); err != nil {
- return err
- }
- for _, cmd := range a.commands {
- if err := cmd.init(); err != nil {
- return err
- }
- }
- flagGroups := []*flagGroup{a.flagGroup}
- for _, cmd := range a.commandOrder {
- if err := checkDuplicateFlags(cmd, flagGroups); err != nil {
- return err
- }
- }
- a.initialized = true
- return nil
-}
-
-// Recursively check commands for duplicate flags.
-func checkDuplicateFlags(current *CmdClause, flagGroups []*flagGroup) error {
- // Check for duplicates.
- for _, flags := range flagGroups {
- for _, flag := range current.flagOrder {
- if flag.shorthand != 0 {
- if _, ok := flags.short[string(flag.shorthand)]; ok {
- return TError("duplicate short flag -{{.Arg0}}", V{"Arg0": flag.shorthand})
- }
- }
- if _, ok := flags.long[flag.name]; ok {
- return TError("duplicate long flag --{{.Arg0}}", V{"Arg0": flag.name})
- }
- }
- }
- flagGroups = append(flagGroups, current.flagGroup)
- // Check subcommands.
- for _, subcmd := range current.commandOrder {
- if err := checkDuplicateFlags(subcmd, flagGroups); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (a *Application) execute(context *ParseContext, selected []string) (string, error) {
- var err error
-
- if err = a.validateRequired(context); err != nil {
- return "", err
- }
-
- if err = a.applyActions(context); err != nil {
- return "", err
- }
-
- command := strings.Join(selected, " ")
- if command == "" && a.cmdGroup.have() {
- return "", errCommandNotSpecified
- }
- return command, err
-}
-
-func (a *Application) setDefaults(context *ParseContext) error {
- flagElements := context.Elements.FlagMap()
- argElements := context.Elements.ArgMap()
-
- // Check required flags and set defaults.
- for _, flag := range context.flags.long {
- if flagElements[flag.name] == nil {
- if err := flag.setDefault(context); err != nil {
- return err
- }
- } else {
- flag.reset()
- }
- }
-
- for _, arg := range context.arguments.args {
- if argElements[arg.name] == nil {
- if err := arg.setDefault(context); err != nil {
- return err
- }
- } else {
- arg.reset()
- }
- }
-
- return nil
-}
-
-func (a *Application) validateRequired(context *ParseContext) error {
- flagElements := context.Elements.FlagMap()
- argElements := context.Elements.ArgMap()
-
- // Check required flags and set defaults.
- for _, flag := range context.flags.long {
- if flagElements[flag.name] == nil {
- // Check required flags were provided.
- if flag.needsValue(context) {
- return TError("required flag --{{.Arg0}} not provided", V{"Arg0": flag.name})
- }
- }
- }
-
- for _, arg := range context.arguments.args {
- if argElements[arg.name] == nil {
- if arg.needsValue(context) {
- return TError("required argument '{{.Arg0}}' not provided", V{"Arg0": arg.name})
- }
- }
- }
- return nil
-}
-
-func (a *Application) setValues(context *ParseContext) (selected []string, err error) {
- // Set all arg and flag values.
- var (
- lastCmd *CmdClause
- flagSet = map[string]struct{}{}
- )
- for _, element := range context.Elements {
- switch {
- case element.OneOf.Flag != nil:
- clause := element.OneOf.Flag
- if _, ok := flagSet[clause.name]; ok {
- if v, ok := clause.value.(cumulativeValue); !ok || !v.IsCumulative() {
- return nil, TError("flag '{{.Arg0}}' cannot be repeated", V{"Arg0": clause.name})
- }
- }
- if err = clause.value.Set(*element.Value); err != nil {
- return
- }
- flagSet[clause.name] = struct{}{}
-
- case element.OneOf.Arg != nil:
- clause := element.OneOf.Arg
- if err = clause.value.Set(*element.Value); err != nil {
- return
- }
-
- case element.OneOf.Cmd != nil:
- clause := element.OneOf.Cmd
- if clause.validator != nil {
- if err = clause.validator(clause); err != nil {
- return
- }
- }
- selected = append(selected, clause.name)
- lastCmd = clause
- }
- }
-
- if lastCmd == nil || lastCmd.optionalSubcommands {
- return
- }
- if len(lastCmd.commands) > 0 {
- return nil, TError("must select a subcommand of '{{.Arg0}}'", V{"Arg0": lastCmd.FullCommand()})
- }
-
- return
-}
-
-// Errorf prints an error message to w in the format ": error: ".
-func (a *Application) Errorf(format string, args ...interface{}) {
- fmt.Fprintf(a.errors, a.Name+T(": error: ")+format+"\n", args...)
-}
-
-// Fatalf writes a formatted error to w then terminates with exit status 1.
-func (a *Application) Fatalf(format string, args ...interface{}) {
- a.Errorf(format, args...)
- a.terminate(1)
-}
-
-// FatalUsage prints an error message followed by usage information, then
-// exits with a non-zero status.
-func (a *Application) FatalUsage(format string, args ...interface{}) {
- a.Errorf(format, args...)
- a.Usage([]string{})
- a.terminate(1)
-}
-
-// FatalUsageContext writes a printf formatted error message to w, then usage
-// information for the given ParseContext, before exiting.
-func (a *Application) FatalUsageContext(context *ParseContext, format string, args ...interface{}) {
- a.Errorf(format, args...)
- if err := a.UsageForContext(context); err != nil {
- panic(err)
- }
- a.terminate(1)
-}
-
-// FatalIfError prints an error and exits if err is not nil. The error is printed
-// with the given formatted string, if any.
-func (a *Application) FatalIfError(err error, format string, args ...interface{}) {
- if err != nil {
- prefix := ""
- if format != "" {
- prefix = fmt.Sprintf(format, args...) + ": "
- }
- a.Errorf(prefix+"%s", err)
- a.terminate(1)
- }
-}
-
-func (a *Application) completionOptions(context *ParseContext) []string {
- args := context.rawArgs
-
- var (
- currArg string
- prevArg string
- target cmdMixin
- )
-
- numArgs := len(args)
- if numArgs > 1 {
- args = args[1:]
- currArg = args[len(args)-1]
- }
- if numArgs > 2 {
- prevArg = args[len(args)-2]
- }
-
- target = a.cmdMixin
- if context.SelectedCommand != nil {
- // A subcommand was in use. We will use it as the target
- target = context.SelectedCommand.cmdMixin
- }
-
- if (currArg != "" && strings.HasPrefix(currArg, "--")) || strings.HasPrefix(prevArg, "--") {
- // Perform completion for A flag. The last/current argument started with "-"
- var (
- flagName string // The name of a flag if given (could be half complete)
- flagValue string // The value assigned to a flag (if given) (could be half complete)
- )
-
- if strings.HasPrefix(prevArg, "--") && !strings.HasPrefix(currArg, "--") {
- // Matches: ./myApp --flag value
- // Wont Match: ./myApp --flag --
- flagName = prevArg[2:] // Strip the "--"
- flagValue = currArg
- } else if strings.HasPrefix(currArg, "--") {
- // Matches: ./myApp --flag --
- // Matches: ./myApp --flag somevalue --
- // Matches: ./myApp --
- flagName = currArg[2:] // Strip the "--"
- }
-
- options, flagMatched, valueMatched := target.FlagCompletion(flagName, flagValue)
- if valueMatched {
- // Value Matched. Show cmdCompletions
- return target.CmdCompletion(context)
- }
-
- // Add top level flags if we're not at the top level and no match was found.
- if context.SelectedCommand != nil && !flagMatched {
- topOptions, topFlagMatched, topValueMatched := a.FlagCompletion(flagName, flagValue)
- if topValueMatched {
- // Value Matched. Back to cmdCompletions
- return target.CmdCompletion(context)
- }
-
- if topFlagMatched {
- // Top level had a flag which matched the input. Return it's options.
- options = topOptions
- } else {
- // Add top level flags
- options = append(options, topOptions...)
- }
- }
- return options
- }
-
- // Perform completion for sub commands and arguments.
- return target.CmdCompletion(context)
-}
-
-func (a *Application) generateBashCompletion(context *ParseContext) {
- options := a.completionOptions(context)
- fmt.Printf("%s", strings.Join(options, "\n"))
-}
-
-func (a *Application) applyPreActions(context *ParseContext, dispatch bool) error {
- if !dispatch {
- return nil
- }
- if err := a.actionMixin.applyPreActions(a, nil, context); err != nil {
- return err
- }
- for _, element := range context.Elements {
- if err := a.actionMixin.applyPreActions(a, element, context); err != nil {
- return err
- }
- var applier actionApplier
- switch {
- case element.OneOf.Arg != nil:
- applier = element.OneOf.Arg
- case element.OneOf.Flag != nil:
- applier = element.OneOf.Flag
- case element.OneOf.Cmd != nil:
- applier = element.OneOf.Cmd
- }
- if err := applier.applyPreActions(a, element, context); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (a *Application) applyActions(context *ParseContext) error {
- if err := a.actionMixin.applyActions(a, nil, context); err != nil {
- return err
- }
- // Dispatch to actions.
- for _, element := range context.Elements {
- if err := a.actionMixin.applyActions(a, element, context); err != nil {
- return err
- }
- var applier actionApplier
- switch {
- case element.OneOf.Arg != nil:
- applier = element.OneOf.Arg
- case element.OneOf.Flag != nil:
- applier = element.OneOf.Flag
- case element.OneOf.Cmd != nil:
- applier = element.OneOf.Cmd
- }
- if err := applier.applyActions(a, element, context); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/args.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/args.go
deleted file mode 100644
index 3846b480d..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/args.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package kingpin
-
-type argGroup struct {
- args []*Clause
-}
-
-func newArgGroup() *argGroup {
- return &argGroup{}
-}
-
-func (a *argGroup) have() bool {
- return len(a.args) > 0
-}
-
-// GetArg gets an argument definition.
-//
-// This allows existing arguments to be modified after definition but before parsing. Useful for
-// modular applications.
-func (a *argGroup) GetArg(name string) *Clause {
- for _, arg := range a.args {
- if arg.name == name {
- return arg
- }
- }
- return nil
-}
-
-func (a *argGroup) Arg(name, help string) *Clause {
- arg := NewClause(name, help)
- a.args = append(a.args, arg)
- return arg
-}
-
-func (a *argGroup) init() error {
- required := 0
- seen := map[string]struct{}{}
- previousArgMustBeLast := false
- for i, arg := range a.args {
- if previousArgMustBeLast {
- return TError("Args() can't be followed by another argument '{{.Arg0}}'", V{"Arg0": arg.name})
- }
- if arg.consumesRemainder() {
- previousArgMustBeLast = true
- }
- if _, ok := seen[arg.name]; ok {
- return TError("duplicate argument '{{.Arg0}}'", V{"Arg0": arg.name})
- }
- seen[arg.name] = struct{}{}
- if arg.required && required != i {
- return TError("required arguments found after non-required")
- }
- if arg.required {
- required++
- }
- if err := arg.init(); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/camelcase.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/camelcase.go
deleted file mode 100644
index 5f7e513fb..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/camelcase.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package kingpin
-
-// NOTE: This code is from https://github.com/fatih/camelcase. MIT license.
-
-import (
- "unicode"
- "unicode/utf8"
-)
-
-// Split splits the camelcase word and returns a list of words. It also
-// supports digits. Both lower camel case and upper camel case are supported.
-// For more info please check: http://en.wikipedia.org/wiki/CamelCase
-//
-// Examples
-//
-// "" => [""]
-// "lowercase" => ["lowercase"]
-// "Class" => ["Class"]
-// "MyClass" => ["My", "Class"]
-// "MyC" => ["My", "C"]
-// "HTML" => ["HTML"]
-// "PDFLoader" => ["PDF", "Loader"]
-// "AString" => ["A", "String"]
-// "SimpleXMLParser" => ["Simple", "XML", "Parser"]
-// "vimRPCPlugin" => ["vim", "RPC", "Plugin"]
-// "GL11Version" => ["GL", "11", "Version"]
-// "99Bottles" => ["99", "Bottles"]
-// "May5" => ["May", "5"]
-// "BFG9000" => ["BFG", "9000"]
-// "BöseÜberraschung" => ["Böse", "Überraschung"]
-// "Two spaces" => ["Two", " ", "spaces"]
-// "BadUTF8\xe2\xe2\xa1" => ["BadUTF8\xe2\xe2\xa1"]
-//
-// Splitting rules
-//
-// 1) If string is not valid UTF-8, return it without splitting as
-// single item array.
-// 2) Assign all unicode characters into one of 4 sets: lower case
-// letters, upper case letters, numbers, and all other characters.
-// 3) Iterate through characters of string, introducing splits
-// between adjacent characters that belong to different sets.
-// 4) Iterate through array of split strings, and if a given string
-// is upper case:
-// if subsequent string is lower case:
-// move last character of upper case string to beginning of
-// lower case string
-func camelCase(src string) (entries []string) {
- // don't split invalid utf8
- if !utf8.ValidString(src) {
- return []string{src}
- }
- entries = []string{}
- var runes [][]rune
- lastClass := 0
- // split into fields based on class of unicode character
- for _, r := range src {
- var class int
- switch true {
- case unicode.IsLower(r):
- class = 1
- case unicode.IsUpper(r):
- class = 2
- case unicode.IsDigit(r):
- class = 3
- default:
- class = 4
- }
- if class == lastClass {
- runes[len(runes)-1] = append(runes[len(runes)-1], r)
- } else {
- runes = append(runes, []rune{r})
- }
- lastClass = class
- }
- // handle upper case -> lower case sequences, e.g.
- // "PDFL", "oader" -> "PDF", "Loader"
- for i := 0; i < len(runes)-1; i++ {
- if unicode.IsUpper(runes[i][0]) && unicode.IsLower(runes[i+1][0]) {
- runes[i+1] = append([]rune{runes[i][len(runes[i])-1]}, runes[i+1]...)
- runes[i] = runes[i][:len(runes[i])-1]
- }
- }
- // construct []string from results
- for _, s := range runes {
- if len(s) > 0 {
- entries = append(entries, string(s))
- }
- }
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/clause.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/clause.go
deleted file mode 100644
index 617593d25..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/clause.go
+++ /dev/null
@@ -1,340 +0,0 @@
-package kingpin
-
-import (
- "net/url"
-
- "github.com/alecthomas/units"
-)
-
-// A Clause represents a flag or an argument passed by the user.
-type Clause struct {
- actionMixin
- completionsMixin
-
- name string
- shorthand rune
- help string
- placeholder string
- hidden bool
- defaultValues []string
- value Value
- required bool
- envar string
- noEnvar bool
-}
-
-func NewClause(name, help string) *Clause {
- return &Clause{
- name: name,
- help: help,
- }
-}
-
-func (c *Clause) consumesRemainder() bool {
- if r, ok := c.value.(cumulativeValue); ok {
- return r.IsCumulative()
- }
- return false
-}
-
-func (c *Clause) init() error {
- if c.required && len(c.defaultValues) > 0 {
- return TError("required flag '--{{.Arg0}}' with default value that will never be used", V{"Arg0": c.name})
- }
- if c.value == nil {
- return TError("no type defined for --{{.Arg0}} (eg. .String())", V{"Arg0": c.name})
- }
- if v, ok := c.value.(cumulativeValue); (!ok || !v.IsCumulative()) && len(c.defaultValues) > 1 {
- return TError("invalid default for '--{{.Arg0}}', expecting single value", V{"Arg0": c.name})
- }
- return nil
-}
-
-func (c *Clause) Help(help string) *Clause {
- c.help = help
- return c
-}
-
-// UsageAction adds a PreAction() that will display the given UsageContext.
-func (c *Clause) UsageAction(context *UsageContext) *Clause {
- c.PreAction(func(a *Application, e *ParseElement, c *ParseContext) error {
- a.UsageForContextWithTemplate(context, c)
- a.terminate(0)
- return nil
- })
- return c
-}
-
-func (c *Clause) UsageActionTemplate(template string) *Clause {
- return c.UsageAction(&UsageContext{Template: template})
-}
-
-func (c *Clause) Action(action Action) *Clause {
- c.actions = append(c.actions, action)
- return c
-}
-
-// PreAction callback executed
-func (c *Clause) PreAction(action Action) *Clause {
- c.preActions = append(c.preActions, action)
- return c
-}
-
-// HintAction registers a HintAction (function) for the flag to provide completions
-func (c *Clause) HintAction(action HintAction) *Clause {
- c.addHintAction(action)
- return c
-}
-
-// Envar overrides the default value(s) for a flag from an environment variable,
-// if it is set. Several default values can be provided by using new lines to
-// separate them.
-func (c *Clause) Envar(name string) *Clause {
- c.envar = name
- c.noEnvar = false
- return c
-}
-
-// NoEnvar forces environment variable defaults to be disabled for this flag.
-// Most useful in conjunction with PrefixedEnvarResolver.
-func (c *Clause) NoEnvar() *Clause {
- c.envar = ""
- c.noEnvar = true
- return c
-}
-
-func (c *Clause) resolveCompletions() []string {
- var hints []string
-
- options := c.builtinHintActions
- if len(c.hintActions) > 0 {
- // User specified their own hintActions. Use those instead.
- options = c.hintActions
- }
-
- for _, hintAction := range options {
- hints = append(hints, hintAction()...)
- }
- return hints
-}
-
-// HintOptions registers any number of options for the flag to provide completions
-func (c *Clause) HintOptions(options ...string) *Clause {
- c.addHintAction(func() []string {
- return options
- })
- return c
-}
-
-// Default values for this flag. They *must* be parseable by the value of the flag.
-func (c *Clause) Default(values ...string) *Clause {
- c.defaultValues = values
- return c
-}
-
-// PlaceHolder sets the place-holder string used for flag values in the help. The
-// default behaviour is to use the value provided by Default() if provided,
-// then fall back on the capitalized flag name.
-func (c *Clause) PlaceHolder(placeholder string) *Clause {
- c.placeholder = placeholder
- return c
-}
-
-// Hidden hides a flag from usage but still allows it to be used.
-func (c *Clause) Hidden() *Clause {
- c.hidden = true
- return c
-}
-
-// Required makes the flag required. You can not provide a Default() value to a Required() flag.
-func (c *Clause) Required() *Clause {
- c.required = true
- return c
-}
-
-// Short sets the short flag name.
-func (c *Clause) Short(name rune) *Clause {
- c.shorthand = name
- return c
-}
-
-func (c *Clause) needsValue(context *ParseContext) bool {
- return c.required && !c.canResolve(context)
-}
-
-func (c *Clause) canResolve(context *ParseContext) bool {
- for _, resolver := range context.resolvers {
- rvalues, err := resolver.Resolve(c.name, context)
- if err != nil {
- return false
- }
- if rvalues != nil {
- return true
- }
- }
- return false
-}
-
-func (c *Clause) reset() {
- if c, ok := c.value.(cumulativeValue); ok {
- c.Reset()
- }
-}
-
-func (c *Clause) setDefault(context *ParseContext) error {
- var values []string
- for _, resolver := range context.resolvers {
- rvalues, err := resolver.Resolve(c.name, context)
- if err != nil {
- return err
- }
- if rvalues != nil {
- values = rvalues
- }
- }
-
- if values != nil {
- c.reset()
- for _, value := range values {
- if err := c.value.Set(value); err != nil {
- return err
- }
- }
- return nil
- }
- return nil
-}
-
-func (c *Clause) SetValue(value Value) {
- c.value = value
-}
-
-// StringMap provides key=value parsing into a map.
-func (c *Clause) StringMap() (target *map[string]string) {
- target = &(map[string]string{})
- c.StringMapVar(target)
- return
-}
-
-// Bytes parses numeric byte units. eg. 1.5KB
-func (c *Clause) Bytes() (target *units.Base2Bytes) {
- target = new(units.Base2Bytes)
- c.BytesVar(target)
- return
-}
-
-// ExistingFile sets the parser to one that requires and returns an existing file.
-func (c *Clause) ExistingFile() (target *string) {
- target = new(string)
- c.ExistingFileVar(target)
- return
-}
-
-// ExistingDir sets the parser to one that requires and returns an existing directory.
-func (c *Clause) ExistingDir() (target *string) {
- target = new(string)
- c.ExistingDirVar(target)
- return
-}
-
-// ExistingFileOrDir sets the parser to one that requires and returns an existing file OR directory.
-func (c *Clause) ExistingFileOrDir() (target *string) {
- target = new(string)
- c.ExistingFileOrDirVar(target)
- return
-}
-
-// URL provides a valid, parsed url.URL.
-func (c *Clause) URL() (target **url.URL) {
- target = new(*url.URL)
- c.URLVar(target)
- return
-}
-
-// StringMap provides key=value parsing into a map.
-func (c *Clause) StringMapVar(target *map[string]string) {
- c.SetValue(newStringMapValue(target))
-}
-
-// Float sets the parser to a float64 parser.
-func (c *Clause) Float() (target *float64) {
- return c.Float64()
-}
-
-// Float sets the parser to a float64 parser.
-func (c *Clause) FloatVar(target *float64) {
- c.Float64Var(target)
-}
-
-// BytesVar parses numeric byte units. eg. 1.5KB
-func (c *Clause) BytesVar(target *units.Base2Bytes) {
- c.SetValue(newBytesValue(target))
-}
-
-// ExistingFile sets the parser to one that requires and returns an existing file.
-func (c *Clause) ExistingFileVar(target *string) {
- c.SetValue(newExistingFileValue(target))
-}
-
-// ExistingDir sets the parser to one that requires and returns an existing directory.
-func (c *Clause) ExistingDirVar(target *string) {
- c.SetValue(newExistingDirValue(target))
-}
-
-// ExistingDir sets the parser to one that requires and returns an existing directory.
-func (c *Clause) ExistingFileOrDirVar(target *string) {
- c.SetValue(newExistingFileOrDirValue(target))
-}
-
-// URL provides a valid, parsed url.URL.
-func (c *Clause) URLVar(target **url.URL) {
- c.SetValue(newURLValue(target))
-}
-
-// URLList provides a parsed list of url.URL values.
-func (c *Clause) URLList() (target *[]*url.URL) {
- target = new([]*url.URL)
- c.URLListVar(target)
- return
-}
-
-// URLListVar provides a parsed list of url.URL values.
-func (c *Clause) URLListVar(target *[]*url.URL) {
- c.SetValue(newURLListValue(target))
-}
-
-// Enum allows a value from a set of options.
-func (c *Clause) Enum(options ...string) (target *string) {
- target = new(string)
- c.EnumVar(target, options...)
- return
-}
-
-// EnumVar allows a value from a set of options.
-func (c *Clause) EnumVar(target *string, options ...string) {
- c.addHintActionBuiltin(func() []string { return options })
- c.SetValue(newEnumFlag(target, options...))
-}
-
-// Enums allows a set of values from a set of options.
-func (c *Clause) Enums(options ...string) (target *[]string) {
- target = new([]string)
- c.EnumsVar(target, options...)
- return
-}
-
-// EnumVar allows a value from a set of options.
-func (c *Clause) EnumsVar(target *[]string, options ...string) {
- c.SetValue(newEnumsFlag(target, options...))
-}
-
-// A Counter increments a number each time it is encountered.
-func (c *Clause) Counter() (target *int) {
- target = new(int)
- c.CounterVar(target)
- return
-}
-
-func (c *Clause) CounterVar(target *int) {
- c.SetValue(newCounterValue(target))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd.go
deleted file mode 100644
index 579d961eb..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd.go
+++ /dev/null
@@ -1,320 +0,0 @@
-package kingpin
-
-import (
- "errors"
- "strings"
-)
-
-type cmdMixin struct {
- actionMixin
- *flagGroup
- *argGroup
- *cmdGroup
-}
-
-// CmdCompletion returns completion options for arguments, if that's where
-// parsing left off, or commands if there aren't any unsatisfied args.
-func (c *cmdMixin) CmdCompletion(context *ParseContext) []string {
- var options []string
-
- // Count args already satisfied - we won't complete those, and add any
- // default commands' alternatives, since they weren't listed explicitly
- // and the user may want to explicitly list something else.
- argsSatisfied := 0
- for _, el := range context.Elements {
- switch {
- case el.OneOf.Arg != nil:
- if el.Value != nil && *el.Value != "" {
- argsSatisfied++
- }
- case el.OneOf.Cmd != nil:
- options = append(options, el.OneOf.Cmd.completionAlts...)
- default:
- }
- }
-
- if argsSatisfied < len(c.argGroup.args) {
- // Since not all args have been satisfied, show options for the current one
- options = append(options, c.argGroup.args[argsSatisfied].resolveCompletions()...)
- } else {
- // If all args are satisfied, then go back to completing commands
- for _, cmd := range c.cmdGroup.commandOrder {
- if !cmd.hidden {
- options = append(options, cmd.name)
- }
- }
- }
-
- return options
-}
-
-func (c *cmdMixin) FlagCompletion(flagName string, flagValue string) (choices []string, flagMatch bool, optionMatch bool) {
- // Check if flagName matches a known flag.
- // If it does, show the options for the flag
- // Otherwise, show all flags
-
- options := []string{}
-
- for _, flag := range c.flagGroup.flagOrder {
- // Loop through each flag and determine if a match exists
- if flag.name == flagName {
- // User typed entire flag. Need to look for flag options.
- options = flag.resolveCompletions()
- if len(options) == 0 {
- // No Options to Choose From, Assume Match.
- return options, true, true
- }
-
- // Loop options to find if the user specified value matches
- isPrefix := false
- matched := false
-
- for _, opt := range options {
- if flagValue == opt {
- matched = true
- } else if strings.HasPrefix(opt, flagValue) {
- isPrefix = true
- }
- }
-
- // Matched Flag Directly
- // Flag Value Not Prefixed, and Matched Directly
- return options, true, !isPrefix && matched
- }
-
- if !flag.hidden {
- options = append(options, "--"+flag.name)
- }
- }
- // No Flag directly matched.
- return options, false, false
-
-}
-
-type cmdGroup struct {
- app *Application
- parent *CmdClause
- commands map[string]*CmdClause
- commandOrder []*CmdClause
-}
-
-func (c *cmdGroup) defaultSubcommand() *CmdClause {
- for _, cmd := range c.commandOrder {
- if cmd.isDefault {
- return cmd
- }
- }
- return nil
-}
-
-func (c *cmdGroup) cmdNames() []string {
- names := make([]string, 0, len(c.commandOrder))
- for _, cmd := range c.commandOrder {
- names = append(names, cmd.name)
- }
- return names
-}
-
-// GetArg gets a command definition.
-//
-// This allows existing commands to be modified after definition but before parsing. Useful for
-// modular applications.
-func (c *cmdGroup) GetCommand(name string) *CmdClause {
- return c.commands[name]
-}
-
-func newCmdGroup(app *Application) *cmdGroup {
- return &cmdGroup{
- app: app,
- commands: make(map[string]*CmdClause),
- }
-}
-
-func (c *cmdGroup) addCommand(name, help string) *CmdClause {
- cmd := newCommand(c.app, name, help)
- c.commands[name] = cmd
- c.commandOrder = append(c.commandOrder, cmd)
- return cmd
-}
-
-func (c *cmdGroup) init() error {
- seen := map[string]bool{}
- if c.defaultSubcommand() != nil && !c.have() {
- return TError("default subcommand {{.Arg0}} provided but no subcommands defined", V{"Arg0": c.defaultSubcommand().name})
- }
- defaults := []string{}
- for _, cmd := range c.commandOrder {
- if cmd.isDefault {
- defaults = append(defaults, cmd.name)
- }
- if seen[cmd.name] {
- return TError("duplicate command {{.Arg0}}", V{"Arg0": cmd.name})
- }
- seen[cmd.name] = true
- for _, alias := range cmd.aliases {
- if seen[alias] {
- return TError("alias duplicates existing command {{.Arg0}}", V{"Arg0": alias})
- }
- c.commands[alias] = cmd
- }
- if err := cmd.init(); err != nil {
- return err
- }
- }
- if len(defaults) > 1 {
- return TError("more than one default subcommand exists: {{.Arg0}}", V{"Arg0": strings.Join(defaults, ", ")})
- }
- return nil
-}
-
-func (c *cmdGroup) have() bool {
- return len(c.commands) > 0
-}
-
-type CmdClauseValidator func(*CmdClause) error
-
-// A CmdClause is a single top-level command. It encapsulates a set of flags
-// and either subcommands or positional arguments.
-type CmdClause struct {
- cmdMixin
- app *Application
- name string
- aliases []string
- help string
- isDefault bool
- validator CmdClauseValidator
- hidden bool
- completionAlts []string
- optionalSubcommands bool
-}
-
-func newCommand(app *Application, name, help string) *CmdClause {
- c := &CmdClause{
- app: app,
- name: name,
- help: help,
- }
- c.flagGroup = newFlagGroup()
- c.argGroup = newArgGroup()
- c.cmdGroup = newCmdGroup(app)
- return c
-}
-
-// Struct allows applications to define flags with struct tags.
-//
-// Supported struct tags are: help, placeholder, default, short, long, required, hidden, env,
-// enum, and arg.
-//
-// The name of the flag will default to the CamelCase name transformed to camel-case. This can
-// be overridden with the "long" tag.
-//
-// All basic Go types are supported including floats, ints, strings, time.Duration,
-// and slices of same.
-//
-// For compatibility, also supports the tags used by https://github.com/jessevdk/go-flags
-func (c *CmdClause) Struct(v interface{}) error {
- return c.fromStruct(c, v)
-}
-
-// Add an Alias for this command.
-func (c *CmdClause) Alias(name string) *CmdClause {
- c.aliases = append(c.aliases, name)
- return c
-}
-
-// Validate sets a validation function to run when parsing.
-func (c *CmdClause) Validate(validator CmdClauseValidator) *CmdClause {
- c.validator = validator
- return c
-}
-
-// FullCommand returns the fully qualified "path" to this command,
-// including interspersed argument placeholders. Does not include trailing
-// argument placeholders.
-//
-// eg. "signup "
-func (c *CmdClause) FullCommand() string {
- return strings.Join(c.fullCommand(), " ")
-}
-
-func (c *CmdClause) fullCommand() (out []string) {
- out = append(out, c.name)
- for _, arg := range c.args {
- text := "<" + arg.name + ">"
- if _, ok := arg.value.(cumulativeValue); ok {
- text += " ..."
- }
- if !arg.required {
- text = "[" + text + "]"
- }
- out = append(out, text)
- }
- if c.parent != nil {
- out = append(c.parent.fullCommand(), out...)
- }
- return
-}
-
-// Command adds a new sub-command.
-func (c *CmdClause) Command(name, help string) *CmdClause {
- cmd := c.addCommand(name, help)
- cmd.parent = c
- return cmd
-}
-
-// OptionalSubcommands makes subcommands optional
-func (c *CmdClause) OptionalSubcommands() *CmdClause {
- c.optionalSubcommands = true
- return c
-}
-
-// Default makes this command the default if commands don't match.
-func (c *CmdClause) Default() *CmdClause {
- c.isDefault = true
- return c
-}
-
-func (c *CmdClause) Action(action Action) *CmdClause {
- c.addAction(action)
- return c
-}
-
-func (c *CmdClause) PreAction(action Action) *CmdClause {
- c.addPreAction(action)
- return c
-}
-
-func (c *cmdMixin) checkArgCommandMixing() error {
- if c.argGroup.have() && c.cmdGroup.have() {
- for _, arg := range c.args {
- if arg.consumesRemainder() {
- return errors.New("cannot mix cumulative Arg() with Command()s")
- }
- if !arg.required {
- return errors.New("Arg()s mixed with Command()s MUST be required")
- }
- }
- }
- return nil
-}
-
-func (c *CmdClause) init() error {
- if err := c.flagGroup.init(); err != nil {
- return err
- }
- if err := c.checkArgCommandMixing(); err != nil {
- return err
- }
- if err := c.argGroup.init(); err != nil {
- return err
- }
- if err := c.cmdGroup.init(); err != nil {
- return err
- }
- return nil
-}
-
-func (c *CmdClause) Hidden() *CmdClause {
- c.hidden = true
- return c
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd/embedi18n/main.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd/embedi18n/main.go
deleted file mode 100644
index c4bf286bc..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd/embedi18n/main.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package main
-
-import (
- "bytes"
- "compress/gzip"
- "fmt"
- "io/ioutil"
- "os"
- "strings"
-)
-
-func compress(data []byte) []byte {
- w := bytes.NewBuffer(nil)
- gw, err := gzip.NewWriterLevel(w, gzip.BestCompression)
- if err != nil {
- panic(err)
- }
- _, err = gw.Write(data)
- if err != nil {
- panic(err)
- }
- gw.Close()
- return w.Bytes()
-}
-
-func main() {
- name := os.Args[1]
- r, err := os.Open("i18n/" + name + ".all.json")
- if err != nil {
- panic(err)
- }
- defer r.Close()
- data, err := ioutil.ReadAll(r)
- if err != nil {
- panic(err)
- }
- data = compress(data)
- id := strings.Replace(name, "-", "_", -1)
- w, err := os.Create("i18n_" + id + ".go")
- if err != nil {
- panic(err)
- }
- defer w.Close()
- fmt.Fprintf(w, `package kingpin
-
-var i18n_%s = []byte(%q)
-`, id, data)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd/genvalues/main.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd/genvalues/main.go
deleted file mode 100644
index afb7c92ee..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/cmd/genvalues/main.go
+++ /dev/null
@@ -1,133 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "os"
- "os/exec"
- "strings"
- "text/template"
-)
-
-const (
- tmpl = `package kingpin
-
-// This file is autogenerated by "go generate .". Do not modify.
-
-{{range .}}
-{{if not .NoValueParser}}
-// -- {{.Type}} Value
-type {{.|ValueName}} struct { v *{{.Type}} }
-
-func new{{.|Name}}Value(p *{{.Type}}) *{{.|ValueName}} {
- return &{{.|ValueName}}{p}
-}
-
-func (f *{{.|ValueName}}) Set(s string) error {
- v, err := {{.Parser}}
- if err == nil {
- *f.v = ({{.Type}})(v)
- }
- return err
-}
-
-func (f *{{.|ValueName}}) Get() interface{} { return ({{.Type}})(*f.v) }
-
-func (f *{{.|ValueName}}) String() string { return {{.|Format}} }
-
-{{if .Help}}
-// {{.Help}}
-{{else -}}
-// {{.|Name}} parses the next command-line value as {{.Type}}.
-{{end -}}
-func (p *Clause) {{.|Name}}() (target *{{.Type}}) {
- target = new({{.Type}})
- p.{{.|Name}}Var(target)
- return
-}
-
-func (p *Clause) {{.|Name}}Var(target *{{.Type}}) {
- p.SetValue(new{{.|Name}}Value(target))
-}
-
-{{end}}
-// {{.|Plural}} accumulates {{.Type}} values into a slice.
-func (p *Clause) {{.|Plural}}() (target *[]{{.Type}}) {
- target = new([]{{.Type}})
- p.{{.|Plural}}Var(target)
- return
-}
-
-func (p *Clause) {{.|Plural}}Var(target *[]{{.Type}}) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return new{{.|Name}}Value(v.(*{{.Type}}))
- }))
-}
-
-{{end}}
-`
-)
-
-type Value struct {
- Name string `json:"name"`
- NoValueParser bool `json:"no_value_parser"`
- Type string `json:"type"`
- Parser string `json:"parser"`
- Format string `json:"format"`
- Plural string `json:"plural"`
- Help string `json:"help"`
-}
-
-func fatalIfError(err error) {
- if err != nil {
- panic(err)
- }
-}
-
-func main() {
- r, err := os.Open("values.json")
- fatalIfError(err)
- defer r.Close()
-
- v := []Value{}
- err = json.NewDecoder(r).Decode(&v)
- fatalIfError(err)
-
- valueName := func(v *Value) string {
- if v.Name != "" {
- return v.Name
- }
- return strings.Title(v.Type)
- }
-
- t, err := template.New("genvalues").Funcs(template.FuncMap{
- "Lower": strings.ToLower,
- "Format": func(v *Value) string {
- if v.Format != "" {
- return v.Format
- }
- return "fmt.Sprintf(\"%v\", *f.v)"
- },
- "ValueName": func(v *Value) string {
- name := valueName(v)
- return strings.ToLower(name[0:1]) + name[1:] + "Value"
- },
- "Name": valueName,
- "Plural": func(v *Value) string {
- if v.Plural != "" {
- return v.Plural
- }
- return valueName(v) + "List"
- },
- }).Parse(tmpl)
- fatalIfError(err)
-
- w, err := os.Create("values_generated.go")
- fatalIfError(err)
- defer w.Close()
-
- err = t.Execute(w, v)
- fatalIfError(err)
-
- err = exec.Command("goimports", "-w", "values_generated.go").Run()
- fatalIfError(err)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/completions.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/completions.go
deleted file mode 100644
index 655758ec8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/completions.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package kingpin
-
-// HintAction is a function type who is expected to return a slice of possible
-// command line arguments.
-type HintAction func() []string
-
-type completionsMixin struct {
- hintActions []HintAction
- builtinHintActions []HintAction
-}
-
-func (a *completionsMixin) addHintAction(action HintAction) {
- a.hintActions = append(a.hintActions, action)
-}
-
-// Allow adding of HintActions which are added internally, ie, EnumVar
-func (a *completionsMixin) addHintActionBuiltin(action HintAction) {
- a.builtinHintActions = append(a.builtinHintActions, action)
-}
-
-func (a *completionsMixin) resolveCompletions() []string {
- var hints []string
-
- options := a.builtinHintActions
- if len(a.hintActions) > 0 {
- // User specified their own hintActions. Use those instead.
- options = a.hintActions
- }
-
- for _, hintAction := range options {
- hints = append(hints, hintAction()...)
- }
- return hints
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/doc.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/doc.go
deleted file mode 100644
index c14762c5c..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/doc.go
+++ /dev/null
@@ -1,68 +0,0 @@
-// Package kingpin provides command line interfaces like this:
-//
-// $ chat
-// usage: chat [] [] [ ...]
-//
-// Flags:
-// --debug enable debug mode
-// --help Show help.
-// --server=127.0.0.1 server address
-//
-// Commands:
-// help
-// Show help for a command.
-//
-// post []
-// Post a message to a channel.
-//
-// register
-// Register a new user.
-//
-// $ chat help post
-// usage: chat [] post [] []
-//
-// Post a message to a channel.
-//
-// Flags:
-// --image=IMAGE image to post
-//
-// Args:
-// channel to post to
-// [] text to post
-// $ chat post --image=~/Downloads/owls.jpg pics
-//
-// From code like this:
-//
-// package main
-//
-// import "gopkg.in/alecthomas/kingpin.v1"
-//
-// var (
-// debug = kingpin.Flag("debug", "enable debug mode").Default("false").Bool()
-// serverIP = kingpin.Flag("server", "server address").Default("127.0.0.1").IP()
-//
-// register = kingpin.Command("register", "Register a new user.")
-// registerNick = register.Arg("nick", "nickname for user").Required().String()
-// registerName = register.Arg("name", "name of user").Required().String()
-//
-// post = kingpin.Command("post", "Post a message to a channel.")
-// postImage = post.Flag("image", "image to post").ExistingFile()
-// postChannel = post.Arg("channel", "channel to post to").Required().String()
-// postText = post.Arg("text", "text to post").String()
-// )
-//
-// func main() {
-// switch kingpin.Parse() {
-// // Register user
-// case "register":
-// println(*registerNick)
-//
-// // Post message
-// case "post":
-// if *postImage != nil {
-// }
-// if *postText != "" {
-// }
-// }
-// }
-package kingpin
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/flags.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/flags.go
deleted file mode 100644
index 515f8aac1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/flags.go
+++ /dev/null
@@ -1,136 +0,0 @@
-package kingpin
-
-import "strings"
-
-type flagGroup struct {
- short map[string]*Clause
- long map[string]*Clause
- flagOrder []*Clause
-}
-
-func newFlagGroup() *flagGroup {
- return &flagGroup{
- short: map[string]*Clause{},
- long: map[string]*Clause{},
- }
-}
-
-// GetFlag gets a flag definition.
-//
-// This allows existing flags to be modified after definition but before parsing. Useful for
-// modular applications.
-func (f *flagGroup) GetFlag(name string) *Clause {
- return f.long[name]
-}
-
-// Flag defines a new flag with the given long name and help.
-func (f *flagGroup) Flag(name, help string) *Clause {
- flag := NewClause(name, help)
- f.long[name] = flag
- f.flagOrder = append(f.flagOrder, flag)
- return flag
-}
-
-func (f *flagGroup) init() error {
- if err := f.checkDuplicates(); err != nil {
- return err
- }
- for _, flag := range f.long {
- if err := flag.init(); err != nil {
- return err
- }
- if flag.shorthand != 0 {
- f.short[string(flag.shorthand)] = flag
- }
- }
- return nil
-}
-
-func (f *flagGroup) checkDuplicates() error {
- seenShort := map[rune]bool{}
- seenLong := map[string]bool{}
- for _, flag := range f.flagOrder {
- if flag.shorthand != 0 {
- if _, ok := seenShort[flag.shorthand]; ok {
- return TError("duplicate short flag -{{.Arg0}}", V{"Arg0": flag.shorthand})
- }
- seenShort[flag.shorthand] = true
- }
- if _, ok := seenLong[flag.name]; ok {
- return TError("duplicate long flag --{{.Arg0}}", V{"Arg0": flag.name})
- }
- seenLong[flag.name] = true
- }
- return nil
-}
-
-func (f *flagGroup) parse(context *ParseContext) (*Clause, error) {
- var token *Token
-
-loop:
- for {
- token = context.Peek()
- switch token.Type {
- case TokenEOL:
- break loop
-
- case TokenLong, TokenShort:
- flagToken := token
- var flag *Clause
- var ok bool
- invert := false
-
- name := token.Value
- if token.Type == TokenLong {
- flag, ok = f.long[name]
- if !ok {
- if strings.HasPrefix(name, "no-") {
- name = name[3:]
- invert = true
- }
- flag, ok = f.long[name]
- } else if strings.HasPrefix(name, "no-") {
- invert = true
- }
- if !ok {
- return nil, TError("unknown long flag '{{.Arg0}}'", V{"Arg0": flagToken})
- }
- } else {
- flag, ok = f.short[name]
- if !ok {
- return nil, TError("unknown short flag '{{.Arg0}}'", V{"Arg0": flagToken})
- }
- }
-
- context.Next()
-
- var defaultValue string
- if fb, ok := flag.value.(boolFlag); ok && fb.IsBoolFlag() {
- if invert {
- defaultValue = "false"
- } else {
- defaultValue = "true"
- }
- } else {
- if invert {
- context.Push(token)
- return nil, TError("unknown long flag '{{.Arg0}}'", V{"Arg0": flagToken})
- }
- token = context.Peek()
- if token.Type != TokenArg {
- context.Push(token)
- return nil, TError("expected argument for flag '{{.Arg0}}'", V{"Arg0": flagToken})
- }
- context.Next()
- defaultValue = token.Value
- }
-
- context.matchedFlag(flag, defaultValue)
- return flag, nil
-
- default:
- break loop
- }
- }
- return nil, nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/global.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/global.go
deleted file mode 100644
index 97f1e2af5..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/global.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package kingpin
-
-import (
- "os"
- "path/filepath"
-)
-
-var (
- // CommandLine is the default Kingpin parser.
- CommandLine = New(filepath.Base(os.Args[0]), "")
-)
-
-// Command adds a new command to the default parser.
-func Command(name, help string) *CmdClause {
- return CommandLine.Command(name, help)
-}
-
-// Flag adds a new flag to the default parser.
-func Flag(name, help string) *Clause {
- return CommandLine.Flag(name, help)
-}
-
-// Arg adds a new argument to the top-level of the default parser.
-func Arg(name, help string) *Clause {
- return CommandLine.Arg(name, help)
-}
-
-// Struct creates a command-line from a struct.
-func Struct(v interface{}) *Application {
- err := CommandLine.Struct(v)
- FatalIfError(err, "")
- return CommandLine
-}
-
-// Parse and return the selected command. Will call the termination handler if
-// an error is encountered.
-func Parse() string {
- selected := MustParse(CommandLine.Parse(os.Args[1:]))
- if selected == "" && CommandLine.cmdGroup.have() {
- Usage()
- CommandLine.terminate(0)
- }
- return selected
-}
-
-// Errorf prints an error message to stderr.
-func Errorf(format string, args ...interface{}) {
- CommandLine.Errorf(format, args...)
-}
-
-// Fatalf prints an error message to stderr and exits.
-func Fatalf(format string, args ...interface{}) {
- CommandLine.Fatalf(format, args...)
-}
-
-// FatalIfError prints an error and exits if err is not nil. The error is printed
-// with the given prefix.
-func FatalIfError(err error, format string, args ...interface{}) {
- CommandLine.FatalIfError(err, format, args...)
-}
-
-// FatalUsage prints an error message followed by usage information, then
-// exits with a non-zero status.
-func FatalUsage(format string, args ...interface{}) {
- CommandLine.FatalUsage(format, args...)
-}
-
-// FatalUsageContext writes a printf formatted error message to stderr, then
-// usage information for the given ParseContext, before exiting.
-func FatalUsageContext(context *ParseContext, format string, args ...interface{}) {
- CommandLine.FatalUsageContext(context, format, args...)
-}
-
-// Usage prints usage to stderr.
-func Usage() {
- CommandLine.Usage(os.Args[1:])
-}
-
-// UsageTemplate associates a template with a flag. The flag must be a Bool() and must
-// already be defined.
-func UsageTemplate(template string) *Application {
- return CommandLine.UsageTemplate(template)
-}
-
-// MustParse can be used with app.Parse(args) to exit with an error if parsing fails.
-func MustParse(command string, err error) string {
- if err != nil {
- Fatalf(T("{{.Arg0}}, try --help", V{"Arg0": err}))
- }
- return command
-}
-
-// Version adds a flag for displaying the application version number.
-func Version(version string) *Application {
- return CommandLine.Version(version)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/guesswidth.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/guesswidth.go
deleted file mode 100644
index a269531c8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/guesswidth.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// +build appengine !linux,!freebsd,!darwin,!dragonfly,!netbsd,!openbsd
-
-package kingpin
-
-import "io"
-
-func guessWidth(w io.Writer) int {
- return 80
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/guesswidth_unix.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/guesswidth_unix.go
deleted file mode 100644
index ad8163f55..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/guesswidth_unix.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// +build !appengine,linux freebsd darwin dragonfly netbsd openbsd
-
-package kingpin
-
-import (
- "io"
- "os"
- "strconv"
- "syscall"
- "unsafe"
-)
-
-func guessWidth(w io.Writer) int {
- // check if COLUMNS env is set to comply with
- // http://pubs.opengroup.org/onlinepubs/009604499/basedefs/xbd_chap08.html
- colsStr := os.Getenv("COLUMNS")
- if colsStr != "" {
- if cols, err := strconv.Atoi(colsStr); err == nil {
- return cols
- }
- }
-
- if t, ok := w.(*os.File); ok {
- fd := t.Fd()
- var dimensions [4]uint16
-
- if _, _, err := syscall.Syscall6(
- syscall.SYS_IOCTL,
- uintptr(fd),
- uintptr(syscall.TIOCGWINSZ),
- uintptr(unsafe.Pointer(&dimensions)),
- 0, 0, 0,
- ); err == 0 {
- return int(dimensions[1])
- }
- }
- return 80
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_en_AU.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_en_AU.go
deleted file mode 100644
index bd8e81a27..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_en_AU.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package kingpin
-
-var i18n_en_AU = []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x02\xff\xa4XOk+7\x10\xbf\xfbS\f\xb9؆8\xa4\xf4f\xe8!\x94\xb4\x85\x06\x1e4\xbcB\xfb\xfa\x0e\xf2\xee쮨,m%\xad\x9d\x10\xf2\u074bv\xfdg\x93\xccHZ\xe7f\xd0\xfc\xfex\xa4\x19\x8d\xf6\xdb\f\xe0e\x06\x00p%˫5\\\xcd_^n\xeel}\xfb\xfa:\a\xe9@@)-\x16\xde\xd8\xe7\xab\xeb!\xce[\xa1\x9d\x12^\x1a\x9d\x00\xcc\x00^\xaf\x93\x02\x95T\x98\xcb\xddǒ\xb4k@k\x8d]\x03Cu^'\xe1\xfft\xb7\xb7?\x16\xf7_\x1e\xfa\x1f\x9c\x9f\xf7Q\x11*-U\x06\xd59\x8a\xa4\xba\xb3\xb5[,\xa1\x10z\xeea\x83P\x19\xa5\xcc\x1eK\xd8<\x83\xd0\xc67hAغۢ\xf60J\x16\xa3y1\x1di\xeeW\xd4h\x85G\x10\xb0\x15\x1aZQ\xe3\r#L\x86\xc6I\v\xb3m\x15\x06\x02p\x85\x95\xad\x87\xcaX\xf8\xfb\xf1\xb7\xa4F\x04y\x89\xe4F\xb8\xe6B\xcd\x01\x1a\x17UF\xd7Рj\x93\x1a\xa3H\x92\xf2K\xe7\xdb\xceCk\x9c\x93\x1b5\xf6\xe4z7\xbeA\xa8\xe5\x0eu\xd8c\xc7\xc9Me!\xad<6f\x0f\xa2m\x95,zbءu\xd2hN\x94\x8f\xe7\xe9\v\xa3=>\xf9\x95C\xed\xa4\x97;\x8cf1\n\xe1E\xc2:\x18\x1d\xb2\xb0\x15\xba\x8c\xb2\u007f\x88\x8d\xd3&\xb9\x18\x82oC稔\xa8\xdd\xd0;\xbe3LT$I)\x94\x14\x0e\xcan\xc8?:\xc0'\xe9\xbc\xd4\xf5\xf1\xbf\xc0\xa9\x170RS\x18h\v\x87\xb6\xc3\xf1\x1f\x97I\xf0\xd0ж\xf2\t\xeel\xbdX:\xd8K\xdf\xc0σ\xf2b\xe9\x18\xd2$,!\xe6M\xbbR\xb8Cu\xa9l\x92\x806pȨ6\x1e\\\x8b\x85\xac$\x96\x9c\x16\x19KҖX\x89Nyp\xdd\xe6ÞAk\xcdN\x96\xe1\xa6\xe8G\x9ea||̦l\\\x1cL\n\x9f\xe7!\x86|\x14@\x12t\xfa㕛\xae\xef\x14*%5I!\x83\xf8_m\xf6\x9ae\x1aVc\xd0\xd1\b\x9bc-\x86\x89ʌ\xc6\xd7|\x1d\x06D\n\x8d\xe6Qo\x9fa\xb5\n\xefx\x86\x9f\x8e\xa5\xfd;Q\xe3\x9a\xf39,\x92\xc0_\xc2ӟ\x03\x1e\x16\xd9\x0f\x8f\xeb\xc8WD\x06vx\xba\xb2\xd0\xf3:\xfdm\xe4\xfc\xfc\xe3\x18ބ\x04\x92\xd9\xf7\xd9\xff\x01\x00\x00\xff\xffrWY\x98\xc4\x16\x00\x00")
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_fr.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_fr.go
deleted file mode 100644
index 1f27521ad..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_fr.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package kingpin
-
-var i18n_fr = []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x02\xff\x94\xd1A\xaa\x830\x10\x06\xe0}N1d\xf36\xea\x01\xdc\xc9{\xbc\v\xb8,]L㨁\x98H&i\x85һ\x17\xd1nJ\a\xe9\xfa\xcf\xf7\a\xe6?)\x80\xbb\x02\x00ж\xd35\xe8v\f70\xc1'ZR\xc9\xe4\xd9&{%\x18\xc9͕.\xb6\x97)\xa2g\x87\xc9\x06\xbf\x92\xa6\xef\xad\x19)\x82\xfbA\xdb\xd1Kgr\x8e*\xad\x00\x1e\xc5\xfb/\x99q\xa0Z\xe8\xdbÏ\xf0\xdf\xe1\xc0\x12\xfc\x8b8\x13\xe6E\xb0M\x94i\x13\x87<\x91O,\xd8\xdf0M\xe8;\xd1\xef9I\xbe\xcd\x17sPц̥9\xeaY\xe7\xf9b\x8c\xed\xfe\uab1e\x01\x00\x00\xff\xff\x1esa\xbf\xe9\x01\x00\x00")
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_init.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_init.go
deleted file mode 100644
index 61b62b3c0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/i18n_init.go
+++ /dev/null
@@ -1,82 +0,0 @@
-package kingpin
-
-//go:generate go run ./cmd/embedi18n/main.go en-AU
-//go:generate go run ./cmd/embedi18n/main.go fr
-
-import (
- "bytes"
- "compress/gzip"
- "io/ioutil"
- "os"
- "strings"
-
- "github.com/nicksnyder/go-i18n/i18n"
-)
-
-type tError struct {
- msg string
- args []interface{}
-}
-
-// TError is an error that translates itself.
-//
-// It has the same signature and usage as T().
-func TError(msg string, args ...interface{}) error { return &tError{msg: msg, args: args} }
-func (i *tError) Error() string { return T(i.msg, i.args...) }
-
-// T is a translation function.
-var T = initI18N()
-
-func initI18N() i18n.TranslateFunc {
- // Initialise translations.
- i18n.ParseTranslationFileBytes("i18n/en-AU.all.json", decompressLang(i18n_en_AU))
- i18n.ParseTranslationFileBytes("i18n/fr.all.json", decompressLang(i18n_fr))
-
- // Detect language.
- lang := detectLang()
- t, err := i18n.Tfunc(lang, "en")
- if err != nil {
- panic(err)
- }
- return t
-}
-
-func detectLang() string {
- lang := os.Getenv("LANG")
- if lang == "" {
- return "en"
- }
- // Remove encoding spec (eg. ".UTF-8")
- if idx := strings.Index(lang, "."); idx != -1 {
- lang = lang[0:idx]
- }
- // en_AU -> en-AU
- return strings.Replace(lang, "_", "-", -1)
-}
-
-func decompressLang(data []byte) []byte {
- r := bytes.NewReader(data)
- gr, err := gzip.NewReader(r)
- if err != nil {
- panic(err)
- }
- out, err := ioutil.ReadAll(gr)
- if err != nil {
- panic(err)
- }
- return out
-}
-
-// SetLanguage sets the language for Kingpin.
-func SetLanguage(lang string, others ...string) error {
- t, err := i18n.Tfunc(lang, others...)
- if err != nil {
- return err
- }
- T = t
- return nil
-}
-
-// V is a convenience alias for translation function variables.
-// eg. T("Something {{.Arg0}}", V{"Arg0": "moo"})
-type V map[string]interface{}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/model.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/model.go
deleted file mode 100644
index fa32ea82b..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/model.go
+++ /dev/null
@@ -1,292 +0,0 @@
-// nolint: golint
-package kingpin
-
-import (
- "fmt"
- "strconv"
- "strings"
-)
-
-// Data model for Kingpin command-line structure.
-
-type FlagGroupModel struct {
- Flags []*ClauseModel
-}
-
-func (f *FlagGroupModel) FlagByName(name string) *ClauseModel {
- for _, flag := range f.Flags {
- if flag.Name == name {
- return flag
- }
- }
- return nil
-}
-
-func (f *FlagGroupModel) FlagSummary() string {
- out := []string{}
- count := 0
- for _, flag := range f.Flags {
- if flag.Name != "help" {
- count++
- }
- if flag.Required {
- if flag.IsBoolFlag() {
- out = append(out, fmt.Sprintf("--[no-]%s", flag.Name))
- } else {
- out = append(out, fmt.Sprintf("--%s=%s", flag.Name, flag.FormatPlaceHolder()))
- }
- }
- }
- if count != len(out) {
- out = append(out, T("[]"))
- }
- return strings.Join(out, " ")
-}
-
-type ClauseModel struct {
- Name string
- Help string
- Short rune
- Default []string
- PlaceHolder string
- Required bool
- Hidden bool
- Value Value
- Cumulative bool
-}
-
-func (c *ClauseModel) String() string {
- return c.Value.String()
-}
-
-func (c *ClauseModel) IsBoolFlag() bool {
- if fl, ok := c.Value.(boolFlag); ok {
- return fl.IsBoolFlag()
- }
- return false
-}
-
-func (c *ClauseModel) FormatPlaceHolder() string {
- if c.PlaceHolder != "" {
- return c.PlaceHolder
- }
- if len(c.Default) > 0 {
- ellipsis := ""
- if len(c.Default) > 1 {
- ellipsis = "..."
- }
- if _, ok := c.Value.(*stringValue); ok {
- return strconv.Quote(c.Default[0]) + ellipsis
- }
- return c.Default[0] + ellipsis
- }
- return strings.ToUpper(c.Name)
-}
-
-type ArgGroupModel struct {
- Args []*ClauseModel
-}
-
-func (a *ArgGroupModel) ArgSummary() string {
- depth := 0
- out := []string{}
- for _, arg := range a.Args {
- h := "<" + arg.Name + ">"
- if arg.Cumulative {
- h += " ..."
- }
- if !arg.Required {
- h = "[" + h
- depth++
- }
- out = append(out, h)
- }
- if len(out) == 0 {
- return ""
- }
- out[len(out)-1] = out[len(out)-1] + strings.Repeat("]", depth)
- return strings.Join(out, " ")
-}
-
-type CmdGroupModel struct {
- Commands []*CmdModel
-}
-
-func (c *CmdGroupModel) FlattenedCommands() (out []*CmdModel) {
- for _, cmd := range c.Commands {
- if cmd.OptionalSubcommands {
- out = append(out, cmd)
- }
- if len(cmd.Commands) == 0 {
- out = append(out, cmd)
- }
- out = append(out, cmd.FlattenedCommands()...)
- }
- return
-}
-
-type CmdModel struct {
- Name string
- Aliases []string
- Help string
- Depth int
- Hidden bool
- Default bool
- OptionalSubcommands bool
- Parent *CmdModel
- *FlagGroupModel
- *ArgGroupModel
- *CmdGroupModel
-}
-
-func (c *CmdModel) String() string {
- return c.CmdSummary()
-}
-
-func (c *CmdModel) CmdSummary() string {
- out := []string{}
- for cursor := c; cursor != nil; cursor = cursor.Parent {
- text := cursor.Name
- if cursor.Default {
- text = "*" + text
- }
- if flags := cursor.FlagSummary(); flags != "" {
- text += " " + flags
- }
- if args := cursor.ArgSummary(); args != "" {
- text += " " + args
- }
- out = append([]string{text}, out...)
- }
- return strings.Join(out, " ")
-}
-
-// FullCommand is the command path to this node, excluding positional arguments and flags.
-func (c *CmdModel) FullCommand() string {
- out := []string{}
- for i := c; i != nil; i = i.Parent {
- out = append([]string{i.Name}, out...)
- }
- return strings.Join(out, " ")
-}
-
-type ApplicationModel struct {
- Name string
- Help string
- Version string
- Author string
- *ArgGroupModel
- *CmdGroupModel
- *FlagGroupModel
-}
-
-func (a *ApplicationModel) AppSummary() string {
- summary := a.Name
- if flags := a.FlagSummary(); flags != "" {
- summary += " " + flags
- }
- if args := a.ArgSummary(); args != "" {
- summary += " " + args
- }
- if len(a.Commands) > 0 {
- summary += " "
- }
- return summary
-}
-
-func (a *ApplicationModel) FindModelForCommand(cmd *CmdClause) *CmdModel {
- if cmd == nil {
- return nil
- }
- path := []string{}
- for c := cmd; c != nil; c = c.parent {
- path = append([]string{c.name}, path...)
- }
- var selected *CmdModel
- cursor := a.CmdGroupModel
- for _, component := range path {
- for _, cmd := range cursor.Commands {
- if cmd.Name == component {
- selected = cmd
- cursor = cmd.CmdGroupModel
- break
- }
- }
- }
- if selected == nil {
- panic("this shouldn't happen")
- }
- return selected
-}
-
-func (a *Application) Model() *ApplicationModel {
- return &ApplicationModel{
- Name: a.Name,
- Help: a.Help,
- Version: a.version,
- Author: a.author,
- FlagGroupModel: a.flagGroup.Model(),
- ArgGroupModel: a.argGroup.Model(),
- CmdGroupModel: a.cmdGroup.Model(nil),
- }
-}
-
-func (a *argGroup) Model() *ArgGroupModel {
- m := &ArgGroupModel{}
- for _, arg := range a.args {
- m.Args = append(m.Args, arg.Model())
- }
- return m
-}
-
-func (f *flagGroup) Model() *FlagGroupModel {
- m := &FlagGroupModel{}
- for _, fl := range f.flagOrder {
- m.Flags = append(m.Flags, fl.Model())
- }
- return m
-}
-
-func (f *Clause) Model() *ClauseModel {
- _, cumulative := f.value.(cumulativeValue)
- return &ClauseModel{
- Name: f.name,
- Help: f.help,
- Short: f.shorthand,
- Default: f.defaultValues,
- PlaceHolder: f.placeholder,
- Required: f.required,
- Hidden: f.hidden,
- Value: f.value,
- Cumulative: cumulative,
- }
-}
-
-func (c *cmdGroup) Model(parent *CmdModel) *CmdGroupModel {
- m := &CmdGroupModel{}
- for _, cm := range c.commandOrder {
- m.Commands = append(m.Commands, cm.Model(parent))
- }
- return m
-}
-
-func (c *CmdClause) Model(parent *CmdModel) *CmdModel {
- depth := 0
- for i := c; i != nil; i = i.parent {
- depth++
- }
- cmd := &CmdModel{
- Name: c.name,
- Parent: parent,
- Aliases: c.aliases,
- Help: c.help,
- Depth: depth,
- Hidden: c.hidden,
- Default: c.isDefault,
- OptionalSubcommands: c.optionalSubcommands,
- FlagGroupModel: c.flagGroup.Model(),
- ArgGroupModel: c.argGroup.Model(),
- }
- cmd.CmdGroupModel = c.cmdGroup.Model(cmd)
- return cmd
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/parser.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/parser.go
deleted file mode 100644
index b95247594..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/parser.go
+++ /dev/null
@@ -1,436 +0,0 @@
-package kingpin
-
-import (
- "bufio"
- "os"
- "strings"
- "unicode/utf8"
-)
-
-type TokenType int
-
-// Token types.
-const (
- TokenShort TokenType = iota
- TokenLong
- TokenArg
- TokenError
- TokenEOL
-)
-
-func (t TokenType) String() string {
- switch t {
- case TokenShort:
- return T("short flag")
- case TokenLong:
- return T("long flag")
- case TokenArg:
- return T("argument")
- case TokenError:
- return T("error")
- case TokenEOL:
- return T("")
- }
- return T("unknown")
-}
-
-var (
- TokenEOLMarker = Token{-1, TokenEOL, ""}
-)
-
-type Token struct {
- Index int
- Type TokenType
- Value string
-}
-
-func (t *Token) Equal(o *Token) bool {
- return t.Index == o.Index
-}
-
-func (t *Token) IsFlag() bool {
- return t.Type == TokenShort || t.Type == TokenLong
-}
-
-func (t *Token) IsEOF() bool {
- return t.Type == TokenEOL
-}
-
-func (t *Token) String() string {
- switch t.Type {
- case TokenShort:
- return "-" + t.Value
- case TokenLong:
- return "--" + t.Value
- case TokenArg:
- return t.Value
- case TokenError:
- return T("error: ") + t.Value
- case TokenEOL:
- return T("")
- default:
- panic("unhandled type")
- }
-}
-
-type OneOfClause struct {
- Flag *Clause
- Arg *Clause
- Cmd *CmdClause
-}
-
-// A ParseElement represents the parsers view of each element in the command-line argument slice.
-type ParseElement struct {
- // Clause associated with this element. Exactly one of these will be present.
- OneOf OneOfClause
- // Value is corresponding value for an argument or flag. For commands this value will be nil.
- Value *string
-}
-
-// ParseElements represents each element in the command-line argument slice.
-type ParseElements []*ParseElement
-
-// FlagMap collects all parsed flags into a map keyed by long name.
-func (p ParseElements) FlagMap() map[string]*ParseElement {
- // Collect flags into maps.
- flags := map[string]*ParseElement{}
- for _, element := range p {
- if element.OneOf.Flag != nil {
- flags[element.OneOf.Flag.name] = element
- }
- }
- return flags
-}
-
-// ArgMap collects all parsed positional arguments into a map keyed by long name.
-func (p ParseElements) ArgMap() map[string]*ParseElement {
- flags := map[string]*ParseElement{}
- for _, element := range p {
- if element.OneOf.Arg != nil {
- flags[element.OneOf.Arg.name] = element
- }
- }
- return flags
-}
-
-// ParseContext holds the current context of the parser. When passed to
-// Action() callbacks Elements will be fully populated with *FlagClause,
-// *ArgClause and *CmdClause values and their corresponding arguments (if
-// any).
-type ParseContext struct {
- SelectedCommand *CmdClause
- resolvers []Resolver
- ignoreDefault bool
- argsOnly bool
- peek []*Token
- argi int // Index of current command-line arg we're processing.
- args []string
- rawArgs []string
- flags *flagGroup
- arguments *argGroup
- argumenti int // Cursor into arguments
- // Flags, arguments and commands encountered and collected during parse.
- Elements ParseElements
-}
-
-func (p *ParseContext) CombinedFlagsAndArgs() []*Clause {
- return append(p.Args(), p.Flags()...)
-}
-
-func (p *ParseContext) Args() []*Clause {
- return p.arguments.args
-}
-
-func (p *ParseContext) Flags() []*Clause {
- return p.flags.flagOrder
-}
-
-// LastCmd returns true if the element is the last (sub)command being evaluated.
-func (p *ParseContext) LastCmd(element *ParseElement) bool {
- lastCmdIndex := -1
- eIndex := -2
- for i, e := range p.Elements {
- if element == e {
- eIndex = i
- }
-
- if e.OneOf.Cmd != nil {
- lastCmdIndex = i
- }
- }
- return lastCmdIndex == eIndex
-}
-
-func (p *ParseContext) nextArg() *Clause {
- if p.argumenti >= len(p.arguments.args) {
- return nil
- }
- arg := p.arguments.args[p.argumenti]
- if !arg.consumesRemainder() {
- p.argumenti++
- }
- return arg
-}
-
-func (p *ParseContext) next() {
- p.argi++
- p.args = p.args[1:]
-}
-
-// HasTrailingArgs returns true if there are unparsed command-line arguments.
-// This can occur if the parser can not match remaining arguments.
-func (p *ParseContext) HasTrailingArgs() bool {
- return len(p.args) > 0
-}
-
-func tokenize(args []string, ignoreDefault bool, resolvers []Resolver) *ParseContext {
- return &ParseContext{
- ignoreDefault: ignoreDefault,
- args: args,
- rawArgs: args,
- flags: newFlagGroup(),
- arguments: newArgGroup(),
- resolvers: resolvers,
- }
-}
-
-func (p *ParseContext) mergeFlags(flags *flagGroup) {
- for _, flag := range flags.flagOrder {
- if flag.shorthand != 0 {
- p.flags.short[string(flag.shorthand)] = flag
- }
- p.flags.long[flag.name] = flag
- p.flags.flagOrder = append(p.flags.flagOrder, flag)
- }
-}
-
-func (p *ParseContext) mergeArgs(args *argGroup) {
- p.arguments.args = append(p.arguments.args, args.args...)
-}
-
-func (p *ParseContext) EOL() bool {
- return p.Peek().Type == TokenEOL
-}
-
-// Next token in the parse context.
-func (p *ParseContext) Next() *Token {
- if len(p.peek) > 0 {
- return p.pop()
- }
-
- // End of tokens.
- if len(p.args) == 0 {
- return &Token{Index: p.argi, Type: TokenEOL}
- }
-
- arg := p.args[0]
- p.next()
-
- if p.argsOnly {
- return &Token{p.argi, TokenArg, arg}
- }
-
- // All remaining args are passed directly.
- if arg == "--" {
- p.argsOnly = true
- return p.Next()
- }
-
- if strings.HasPrefix(arg, "--") {
- parts := strings.SplitN(arg[2:], "=", 2)
- token := &Token{p.argi, TokenLong, parts[0]}
- if len(parts) == 2 {
- p.Push(&Token{p.argi, TokenArg, parts[1]})
- }
- return token
- }
-
- if strings.HasPrefix(arg, "-") {
- if len(arg) == 1 {
- return &Token{Index: p.argi, Type: TokenShort}
- }
- rn, size := utf8.DecodeRuneInString(arg[1:])
- short := string(rn)
- flag, ok := p.flags.short[short]
- // Not a known short flag, we'll just return it anyway.
- if !ok {
- } else if fb, ok := flag.value.(boolFlag); ok && fb.IsBoolFlag() {
- // Bool short flag.
- } else {
- // Short flag with combined argument: -fARG
- token := &Token{p.argi, TokenShort, short}
- if len(arg) > 2 {
- p.Push(&Token{p.argi, TokenArg, arg[1+size:]})
- }
- return token
- }
-
- if len(arg) > 1+size {
- p.args = append([]string{"-" + arg[1+size:]}, p.args...)
- }
- return &Token{p.argi, TokenShort, short}
- }
-
- return &Token{p.argi, TokenArg, arg}
-}
-
-func (p *ParseContext) Peek() *Token {
- if len(p.peek) == 0 {
- return p.Push(p.Next())
- }
- return p.peek[len(p.peek)-1]
-}
-
-func (p *ParseContext) Push(token *Token) *Token {
- p.peek = append(p.peek, token)
- return token
-}
-
-func (p *ParseContext) pop() *Token {
- end := len(p.peek) - 1
- token := p.peek[end]
- p.peek = p.peek[0:end]
- return token
-}
-
-func (p *ParseContext) String() string {
- if p.SelectedCommand == nil {
- return ""
- }
- return p.SelectedCommand.FullCommand()
-}
-
-func (p *ParseContext) matchedFlag(flag *Clause, value string) {
- p.Elements = append(p.Elements, &ParseElement{OneOf: OneOfClause{Flag: flag}, Value: &value})
-}
-
-func (p *ParseContext) matchedArg(arg *Clause, value string) {
- p.Elements = append(p.Elements, &ParseElement{OneOf: OneOfClause{Arg: arg}, Value: &value})
-}
-
-func (p *ParseContext) matchedCmd(cmd *CmdClause) {
- p.Elements = append(p.Elements, &ParseElement{OneOf: OneOfClause{Cmd: cmd}})
- p.mergeFlags(cmd.flagGroup)
- p.mergeArgs(cmd.argGroup)
- p.SelectedCommand = cmd
-}
-
-// Expand arguments from a file. Lines starting with # will be treated as comments.
-func ExpandArgsFromFile(filename string) (out []string, err error) {
- r, err := os.Open(filename)
- if err != nil {
- return nil, err
- }
- defer r.Close()
- scanner := bufio.NewScanner(r)
- for scanner.Scan() {
- line := scanner.Text()
- if strings.HasPrefix(line, "#") {
- continue
- }
- out = append(out, line)
- }
- err = scanner.Err()
- return
-}
-
-func parse(context *ParseContext, app *Application) (err error) { // nolint: gocyclo
- context.mergeFlags(app.flagGroup)
- context.mergeArgs(app.argGroup)
-
- cmds := app.cmdGroup
- ignoreDefault := context.ignoreDefault
-
-loop:
- for !context.EOL() {
- token := context.Peek()
-
- switch token.Type {
- case TokenLong, TokenShort:
- if flag, err := context.flags.parse(context); err != nil {
- if !ignoreDefault {
- if cmd := cmds.defaultSubcommand(); cmd != nil {
- cmd.completionAlts = cmds.cmdNames()
- context.matchedCmd(cmd)
- cmds = cmd.cmdGroup
- break
- }
- }
- return err
- } else if flag == app.helpFlag {
- ignoreDefault = true
- }
-
- case TokenArg:
- if context.arguments.have() {
- if app.noInterspersed {
- // no more flags
- context.argsOnly = true
- }
- arg := context.nextArg()
- if arg != nil {
- context.matchedArg(arg, token.String())
- context.Next()
- continue
- }
- }
-
- if cmds.have() {
- selectedDefault := false
- cmd, ok := cmds.commands[token.String()]
- if !ok {
- if !ignoreDefault {
- if cmd = cmds.defaultSubcommand(); cmd != nil {
- cmd.completionAlts = cmds.cmdNames()
- selectedDefault = true
- }
- }
- if cmd == nil {
- return TError("expected command but got {{.Arg0}}", V{"Arg0": token})
- }
- }
- if cmd == app.helpCommand {
- ignoreDefault = true
- }
- cmd.completionAlts = nil
- context.matchedCmd(cmd)
- cmds = cmd.cmdGroup
- if !selectedDefault {
- context.Next()
- }
- continue
- }
-
- break loop
-
- case TokenEOL:
- break loop
- }
- }
-
- // Move to innermost default command.
- for !ignoreDefault {
- if cmd := cmds.defaultSubcommand(); cmd != nil {
- cmd.completionAlts = cmds.cmdNames()
- context.matchedCmd(cmd)
- cmds = cmd.cmdGroup
- } else {
- break
- }
- }
-
- if !context.EOL() {
- return TError("unexpected '{{.Arg0}}'", V{"Arg0": context.Peek()})
- }
-
- // Set defaults for all remaining args.
- for arg := context.nextArg(); arg != nil && !arg.consumesRemainder(); arg = context.nextArg() {
- for _, defaultValue := range arg.defaultValues {
- if err := arg.value.Set(defaultValue); err != nil {
- return TError("invalid default value '{{.Arg0}}' for argument '{{.Arg1}}'", V{"Arg0": defaultValue, "Arg1": arg.name})
- }
- }
- }
-
- return
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/resolver.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/resolver.go
deleted file mode 100644
index b80649402..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/resolver.go
+++ /dev/null
@@ -1,157 +0,0 @@
-package kingpin
-
-import (
- "encoding/json"
- "fmt"
- "os"
- "regexp"
- "strings"
-)
-
-var (
- envarTransformRegexp = regexp.MustCompile(`[^a-zA-Z_]+`)
-)
-
-// A Resolver retrieves flag values from an external source, such as a configuration file or environment variables.
-type Resolver interface {
- // Resolve key in the given parse context.
- //
- // A nil slice should be returned if the key can not be resolved.
- Resolve(key string, context *ParseContext) ([]string, error)
-}
-
-// ResolverFunc is a function that is also a Resolver.
-type ResolverFunc func(key string, context *ParseContext) ([]string, error)
-
-func (r ResolverFunc) Resolve(key string, context *ParseContext) ([]string, error) {
- return r(key, context)
-}
-
-// A resolver that pulls values from the flag defaults. This resolver is always installed in the ParseContext.
-func defaultsResolver() Resolver {
- return ResolverFunc(func(key string, context *ParseContext) ([]string, error) {
- for _, clause := range context.CombinedFlagsAndArgs() {
- if clause.name == key {
- return clause.defaultValues, nil
- }
- }
- return nil, nil
- })
-}
-
-func parseEnvar(envar, sep string) []string {
- value, ok := os.LookupEnv(envar)
- if !ok {
- return nil
- }
- if sep == "" {
- return []string{value}
- }
- return strings.Split(value, sep)
-}
-
-// Resolves a clause value from the envar configured on that clause, if any.
-func envarResolver(sep string) Resolver {
- return ResolverFunc(func(key string, context *ParseContext) ([]string, error) {
- for _, clause := range context.CombinedFlagsAndArgs() {
- if key == clause.name {
- if clause.noEnvar || clause.envar == "" {
- return nil, nil
- }
- return parseEnvar(clause.envar, sep), nil
- }
- }
- return nil, nil
- })
-}
-
-// MapResolver resolves values from a static map.
-func MapResolver(values map[string][]string) Resolver {
- return ResolverFunc(func(key string, context *ParseContext) ([]string, error) {
- return values[key], nil
- })
-}
-
-// JSONResolver returns a Resolver that retrieves values from a JSON source.
-func JSONResolver(data []byte) (Resolver, error) {
- values := map[string]interface{}{}
- err := json.Unmarshal(data, &values)
- if err != nil {
- return nil, err
- }
- mapping := map[string][]string{}
- for key, value := range values {
- sub, err := jsonDecodeValue(value)
- if err != nil {
- return nil, err
- }
- mapping[key] = sub
- }
- return MapResolver(mapping), nil
-}
-
-func jsonDecodeValue(value interface{}) ([]string, error) {
- switch v := value.(type) {
- case []interface{}:
- out := []string{}
- for _, sv := range v {
- next, err := jsonDecodeValue(sv)
- if err != nil {
- return nil, err
- }
- out = append(out, next...)
- }
- return out, nil
- case string:
- return []string{v}, nil
- case float64:
- return []string{fmt.Sprintf("%v", v)}, nil
- case bool:
- if v {
- return []string{"true"}, nil
- }
- return []string{"false"}, nil
- }
- return nil, fmt.Errorf("unsupported JSON value %v (of type %T)", value, value)
-}
-
-// RenamingResolver creates a resolver for remapping names for a child resolver.
-//
-// This is useful if your configuration file uses a naming convention that does not map directly to
-// flag names.
-func RenamingResolver(resolver Resolver, rename func(string) string) Resolver {
- return ResolverFunc(func(key string, context *ParseContext) ([]string, error) {
- return resolver.Resolve(rename(key), context)
- })
-}
-
-// PrefixedEnvarResolver resolves any flag/argument via environment variables.
-//
-// "prefix" is the common-prefix for the environment variables. "separator", is the character used to separate
-// multiple values within a single envar (eg. ";")
-//
-// With a prefix of APP_, flags in the form --some-flag will be transformed to APP_SOME_FLAG.
-func PrefixedEnvarResolver(prefix, separator string) Resolver {
- return ResolverFunc(func(key string, context *ParseContext) ([]string, error) {
- key = envarTransform(prefix + key)
- return parseEnvar(key, separator), nil
- })
-}
-
-// DontResolve returns a Resolver that will never return values for the given keys, even if provided.
-func DontResolve(resolver Resolver, keys ...string) Resolver {
- disabled := map[string]bool{}
- for _, key := range keys {
- disabled[key] = true
- }
- return ResolverFunc(func(key string, context *ParseContext) ([]string, error) {
- if disabled[key] {
- return nil, nil
- }
- return resolver.Resolve(key, context)
- })
-}
-
-func envarTransform(name string) string {
- return strings.ToUpper(envarTransformRegexp.ReplaceAllString(name, "_"))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/struct.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/struct.go
deleted file mode 100644
index 2923dfdff..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/struct.go
+++ /dev/null
@@ -1,196 +0,0 @@
-package kingpin
-
-import (
- "fmt"
- "reflect"
- "strings"
- "time"
- "unicode/utf8"
-)
-
-func (c *cmdMixin) fromStruct(clause *CmdClause, v interface{}) error { // nolint: gocyclo
- urv := reflect.ValueOf(v)
- rv := reflect.Indirect(reflect.ValueOf(v))
- if rv.Kind() != reflect.Struct {
- return fmt.Errorf("expected a struct but received " + reflect.TypeOf(v).String())
- }
- for i := 0; i < rv.NumField(); i++ {
- // Parse out tags
- field := rv.Field(i)
- ft := rv.Type().Field(i)
- if strings.ToLower(ft.Name[0:1]) == ft.Name[0:1] {
- continue
- }
- tag := ft.Tag
- help := tag.Get("help")
- if help == "" {
- help = tag.Get("description")
- }
- placeholder := tag.Get("placeholder")
- if placeholder == "" {
- placeholder = tag.Get("value-name")
- }
- dflt := tag.Get("default")
- short := tag.Get("short")
- required := tag.Get("required")
- hidden := tag.Get("hidden")
- env := tag.Get("env")
- enum := tag.Get("enum")
- name := strings.ToLower(strings.Join(camelCase(ft.Name), "-"))
- if tag.Get("long") != "" {
- name = tag.Get("long")
- }
- arg := tag.Get("arg")
-
- var action Action
- onMethodName := "On" + strings.ToUpper(ft.Name[0:1]) + ft.Name[1:]
- if actionMethod := urv.MethodByName(onMethodName); actionMethod.IsValid() {
- action, _ = actionMethod.Interface().(func(*Application, *ParseElement, *ParseContext) error)
- }
-
- if field.Kind() == reflect.Struct {
- if ft.Anonymous {
- if err := c.fromStruct(clause, field.Addr().Interface()); err != nil {
- return err
- }
- } else {
- cmd := c.addCommand(name, help)
- cmd.parent = clause
- if hidden != "" {
- cmd = cmd.Hidden()
- }
- if err := cmd.Struct(field.Addr().Interface()); err != nil {
- return err
- }
- }
- continue
- }
-
- // Define flag using extracted tags
- var clause *Clause
- if arg != "" {
- clause = c.Arg(name, help)
- } else {
- clause = c.Flag(name, help)
- }
- if action != nil {
- clause.Action(action)
- }
- if dflt != "" {
- clause = clause.Default(dflt)
- }
- if short != "" {
- r, _ := utf8.DecodeRuneInString(short)
- if r == utf8.RuneError {
- return fmt.Errorf("invalid short flag %s", short)
- }
- clause = clause.Short(r)
- }
- if required != "" {
- clause = clause.Required()
- }
- if hidden != "" {
- clause = clause.Hidden()
- }
- if placeholder != "" {
- clause = clause.PlaceHolder(placeholder)
- }
- if env != "" {
- clause = clause.Envar(env)
- }
- ptr := field.Addr().Interface()
- if ft.Type == reflect.TypeOf(time.Duration(0)) {
- clause.DurationVar(ptr.(*time.Duration))
- } else {
- switch ft.Type.Kind() {
- case reflect.String:
- if enum != "" {
- clause.EnumVar(ptr.(*string), strings.Split(enum, ",")...)
- } else {
- clause.StringVar(ptr.(*string))
- }
-
- case reflect.Bool:
- clause.BoolVar(ptr.(*bool))
-
- case reflect.Float32:
- clause.Float32Var(ptr.(*float32))
- case reflect.Float64:
- clause.Float64Var(ptr.(*float64))
-
- case reflect.Int:
- clause.IntVar(ptr.(*int))
- case reflect.Int8:
- clause.Int8Var(ptr.(*int8))
- case reflect.Int16:
- clause.Int16Var(ptr.(*int16))
- case reflect.Int32:
- clause.Int32Var(ptr.(*int32))
- case reflect.Int64:
- clause.Int64Var(ptr.(*int64))
-
- case reflect.Uint:
- clause.UintVar(ptr.(*uint))
- case reflect.Uint8:
- clause.Uint8Var(ptr.(*uint8))
- case reflect.Uint16:
- clause.Uint16Var(ptr.(*uint16))
- case reflect.Uint32:
- clause.Uint32Var(ptr.(*uint32))
- case reflect.Uint64:
- clause.Uint64Var(ptr.(*uint64))
-
- case reflect.Slice:
- if ft.Type == reflect.TypeOf(time.Duration(0)) {
- clause.DurationListVar(ptr.(*[]time.Duration))
- } else {
- switch ft.Type.Elem().Kind() {
- case reflect.String:
- if enum != "" {
- clause.EnumsVar(field.Addr().Interface().(*[]string), strings.Split(enum, ",")...)
- } else {
- clause.StringsVar(field.Addr().Interface().(*[]string))
- }
-
- case reflect.Bool:
- clause.BoolListVar(field.Addr().Interface().(*[]bool))
-
- case reflect.Float32:
- clause.Float32ListVar(ptr.(*[]float32))
- case reflect.Float64:
- clause.Float64ListVar(ptr.(*[]float64))
-
- case reflect.Int:
- clause.IntsVar(field.Addr().Interface().(*[]int))
- case reflect.Int8:
- clause.Int8ListVar(ptr.(*[]int8))
- case reflect.Int16:
- clause.Int16ListVar(ptr.(*[]int16))
- case reflect.Int32:
- clause.Int32ListVar(ptr.(*[]int32))
- case reflect.Int64:
- clause.Int64ListVar(ptr.(*[]int64))
-
- case reflect.Uint:
- clause.UintsVar(ptr.(*[]uint))
- case reflect.Uint8:
- clause.HexBytesVar(ptr.(*[]byte))
- case reflect.Uint16:
- clause.Uint16ListVar(ptr.(*[]uint16))
- case reflect.Uint32:
- clause.Uint32ListVar(ptr.(*[]uint32))
- case reflect.Uint64:
- clause.Uint64ListVar(ptr.(*[]uint64))
-
- default:
- return fmt.Errorf("unsupported field type %s for field %s", ft.Type.String(), ft.Name)
- }
- }
-
- default:
- return fmt.Errorf("unsupported field type %s for field %s", ft.Type.String(), ft.Name)
- }
- }
- }
- return nil
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/templates.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/templates.go
deleted file mode 100644
index ce5ef3a64..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/templates.go
+++ /dev/null
@@ -1,171 +0,0 @@
-package kingpin
-
-// DefaultUsageTemplate is the default usage template.
-var DefaultUsageTemplate = `{{define "FormatCommands" -}}
-{{range .FlattenedCommands -}}
-{{if not .Hidden}}
- {{.CmdSummary}}
-{{.Help|Wrap 4}}
-{{if .Flags -}}
-{{with .Flags|FlagsToTwoColumns}}{{FormatTwoColumnsWithIndent . 4 2}}{{end}}
-{{end -}}
-{{end -}}
-{{end -}}
-{{end -}}
-
-{{define "FormatUsage" -}}
-{{.AppSummary}}
-{{if .Help}}
-{{.Help|Wrap 0 -}}
-{{end -}}
-
-{{end -}}
-
-{{if .Context.SelectedCommand -}}
-{{T "usage:"}} {{.App.Name}} {{.App.FlagSummary}} {{.Context.SelectedCommand.CmdSummary}}
-{{else}}
-{{T "usage:"}} {{template "FormatUsage" .App}}
-{{end}}
-{{if .Context.Flags -}}
-{{T "Flags:"}}
-{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}}
-{{end -}}
-{{if .Context.Args -}}
-{{T "Args:"}}
-{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}}
-{{end -}}
-{{if .Context.SelectedCommand -}}
-{{if len .Context.SelectedCommand.Commands -}}
-{{T "Subcommands:"}}
-{{template "FormatCommands" .Context.SelectedCommand}}
-{{end -}}
-{{else if .App.Commands -}}
-{{T "Commands:" -}}
-{{template "FormatCommands" .App}}
-{{end -}}
-`
-
-// CompactUsageTemplate is a template with compactly formatted commands for large command structures.
-var CompactUsageTemplate = `{{define "FormatCommand" -}}
-{{if .FlagSummary}} {{.FlagSummary}}{{end -}}
-{{range .Args}} {{if not .Required}}[{{end}}<{{.Name}}>{{if .Value|IsCumulative}} ...{{end}}{{if not .Required}}]{{end}}{{end -}}
-{{end -}}
-
-{{define "FormatCommandList" -}}
-{{range . -}}
-{{if not .Hidden -}}
-{{.Depth|Indent}}{{.Name}}{{if .Default}}*{{end}}{{template "FormatCommand" .}}
-{{end -}}
-{{template "FormatCommandList" .Commands -}}
-{{end -}}
-{{end -}}
-
-{{define "FormatUsage" -}}
-{{template "FormatCommand" .}}{{if .Commands}} [ ...]{{end}}
-{{if .Help}}
-{{.Help|Wrap 0 -}}
-{{end -}}
-
-{{end -}}
-
-{{if .Context.SelectedCommand -}}
-{{T "usage:"}} {{.App.Name}} {{template "FormatUsage" .Context.SelectedCommand}}
-{{else -}}
-{{T "usage:"}} {{.App.Name}}{{template "FormatUsage" .App}}
-{{end -}}
-{{if .Context.Flags -}}
-{{T "Flags:"}}
-{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}}
-{{end -}}
-{{if .Context.Args -}}
-{{T "Args:"}}
-{{.Context.Args|ArgsToTwoColumns|FormatTwoColumns}}
-{{end -}}
-{{if .Context.SelectedCommand -}}
-{{if .Context.SelectedCommand.Commands -}}
-{{T "Commands:"}}
- {{.Context.SelectedCommand}}
-{{.Context.SelectedCommand.Commands|CommandsToTwoColumns|FormatTwoColumns}}
-{{end -}}
-{{else if .App.Commands -}}
-{{T "Commands:"}}
-{{.App.Commands|CommandsToTwoColumns|FormatTwoColumns}}
-{{end -}}
-`
-
-var ManPageTemplate = `{{define "FormatFlags" -}}
-{{range .Flags -}}
-{{if not .Hidden -}}
-.TP
-\fB{{if .Short}}-{{.Short|Char}}, {{end}}--{{.Name}}{{if not .IsBoolFlag}}={{.FormatPlaceHolder}}{{end}}\fR
-{{.Help}}
-{{end -}}
-{{end -}}
-{{end -}}
-
-{{define "FormatCommand" -}}
-{{end -}}
-
-{{define "FormatCommands" -}}
-{{range .FlattenedCommands -}}
-{{if not .Hidden -}}
-.SS
-\fB{{.CmdSummary}}\fR
-.PP
-{{.Help}}
-{{template "FormatFlags" . -}}
-{{end -}}
-{{end -}}
-{{end -}}
-
-{{define "FormatUsage" -}}
-{{if .FlagSummary}} {{.FlagSummary}}{{end -}}
-{{if .Commands}} [ ...]{{end}}\fR
-{{end -}}
-
-.TH {{.App.Name}} 1 {{.App.Version}} "{{.App.Author}}"
-.SH "NAME"
-{{.App.Name}}
-.SH "SYNOPSIS"
-.TP
-\fB{{.App.Name}}{{template "FormatUsage" .App}}
-.SH "DESCRIPTION"
-{{.App.Help}}
-.SH "OPTIONS"
-{{template "FormatFlags" .App -}}
-{{if .App.Commands -}}
-.SH "COMMANDS"
-{{template "FormatCommands" .App -}}
-{{end -}}
-`
-
-var BashCompletionTemplate = `
-_{{.App.Name}}_bash_autocomplete() {
- local cur prev opts base
- COMPREPLY=()
- cur="${COMP_WORDS[COMP_CWORD]}"
- opts=$( ${COMP_WORDS[0]} --completion-bash ${COMP_WORDS[@]:1:$COMP_CWORD} )
- COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
- return 0
-}
-complete -F _{{.App.Name}}_bash_autocomplete {{.App.Name}}
-
-`
-
-var ZshCompletionTemplate = `
-#compdef {{.App.Name}}
-autoload -U compinit && compinit
-autoload -U bashcompinit && bashcompinit
-
-_{{.App.Name}}_bash_autocomplete() {
- local cur prev opts base
- COMPREPLY=()
- cur="${COMP_WORDS[COMP_CWORD]}"
- opts=$( ${COMP_WORDS[0]} --completion-bash ${COMP_WORDS[@]:1:$COMP_CWORD} )
- COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
- [[ $COMPREPLY ]] && return
- compgen -f
- return 0
-}
-complete -F _{{.App.Name}}_bash_autocomplete {{.App.Name}}
-`
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/usage.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/usage.go
deleted file mode 100644
index 77a440f27..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/usage.go
+++ /dev/null
@@ -1,273 +0,0 @@
-package kingpin
-
-import (
- "bytes"
- "fmt"
- "go/doc"
- "io"
- "strings"
- "text/template"
-)
-
-var (
- preIndent = " "
-)
-
-// UsageContext contains all of the context used to render a usage message.
-type UsageContext struct {
- // The text/template body to use.
- Template string
- // Indentation multiplier (defaults to 2 of omitted).
- Indent int
- // Width of wrap. Defaults wraps to the terminal.
- Width int
- // Funcs available in the template.
- Funcs template.FuncMap
- // Vars available in the template.
- Vars map[string]interface{}
-}
-
-func formatTwoColumns(w io.Writer, indent, padding, width int, rows [][2]string) {
- // Find size of first column.
- s := 0
- for _, row := range rows {
- if c := len(row[0]); c > s && c < 30 {
- s = c
- }
- }
-
- indentStr := strings.Repeat(" ", indent)
- offsetStr := strings.Repeat(" ", s+padding)
-
- for _, row := range rows {
- buf := bytes.NewBuffer(nil)
- doc.ToText(buf, row[1], "", preIndent, width-s-padding-indent)
- lines := strings.Split(strings.TrimRight(buf.String(), "\n"), "\n")
- fmt.Fprintf(w, "%s%-*s%*s", indentStr, s, row[0], padding, "")
- if len(row[0]) >= 30 {
- fmt.Fprintf(w, "\n%s%s", indentStr, offsetStr)
- }
- fmt.Fprintf(w, "%s\n", lines[0])
- for _, line := range lines[1:] {
- fmt.Fprintf(w, "%s%s%s\n", indentStr, offsetStr, line)
- }
- }
-}
-
-// Usage writes application usage to Writer. It parses args to determine
-// appropriate help context, such as which command to show help for.
-func (a *Application) Usage(args []string) {
- context, err := a.parseContext(true, args)
- a.FatalIfError(err, "")
- if err := a.UsageForContextWithTemplate(a.defaultUsage, context); err != nil {
- panic(err)
- }
-}
-
-func formatAppUsage(app *ApplicationModel) string {
- s := []string{app.Name}
- if len(app.Flags) > 0 {
- s = append(s, app.FlagSummary())
- }
- if len(app.Args) > 0 {
- s = append(s, app.ArgSummary())
- }
- return strings.Join(s, " ")
-}
-
-func formatCmdUsage(app *ApplicationModel, cmd *CmdModel) string {
- s := []string{app.Name, cmd.String()}
- if len(app.Flags) > 0 {
- s = append(s, app.FlagSummary())
- }
- if len(app.Args) > 0 {
- s = append(s, app.ArgSummary())
- }
- return strings.Join(s, " ")
-}
-
-func formatFlag(haveShort bool, flag *ClauseModel) string {
- flagString := ""
- if flag.Short != 0 {
- flagString += fmt.Sprintf("-%c, --%s", flag.Short, flag.Name)
- } else {
- if haveShort {
- flagString += fmt.Sprintf(" --%s", flag.Name)
- } else {
- flagString += fmt.Sprintf("--%s", flag.Name)
- }
- }
- if !flag.IsBoolFlag() {
- flagString += fmt.Sprintf("=%s", flag.FormatPlaceHolder())
- }
- if v, ok := flag.Value.(cumulativeValue); ok && v.IsCumulative() {
- flagString += " ..."
- }
- return flagString
-}
-
-type templateParseContext struct {
- SelectedCommand *CmdModel
- *FlagGroupModel
- *ArgGroupModel
-}
-
-// UsageForContext displays usage information from a ParseContext (obtained from
-// Application.ParseContext() or Action(f) callbacks).
-func (a *Application) UsageForContext(context *ParseContext) error {
- return a.UsageForContextWithTemplate(a.defaultUsage, context)
-}
-
-// UsageForContextWithTemplate is for fine-grained control over usage messages. You generally don't
-// need to use this.
-func (a *Application) UsageForContextWithTemplate(usageContext *UsageContext, parseContext *ParseContext) error { // nolint: gocyclo
- indent := usageContext.Indent
- if indent == 0 {
- indent = 2
- }
- width := usageContext.Width
- if width == 0 {
- width = guessWidth(a.output)
- }
- tmpl := usageContext.Template
- if tmpl == "" {
- tmpl = a.defaultUsage.Template
- if tmpl == "" {
- tmpl = DefaultUsageTemplate
- }
- }
- funcs := template.FuncMap{
- "T": T,
- "Indent": func(level int) string {
- return strings.Repeat(" ", level*indent)
- },
- "Wrap": func(indent int, s string) string {
- buf := bytes.NewBuffer(nil)
- indentText := strings.Repeat(" ", indent)
- doc.ToText(buf, s, indentText, " "+indentText, width-indent)
- return buf.String()
- },
- "FormatFlag": formatFlag,
- "FlagsToTwoColumns": func(f []*ClauseModel) [][2]string {
- rows := [][2]string{}
- haveShort := false
- for _, flag := range f {
- if flag.Short != 0 {
- haveShort = true
- break
- }
- }
- for _, flag := range f {
- if !flag.Hidden {
- rows = append(rows, [2]string{formatFlag(haveShort, flag), flag.Help})
- }
- }
- return rows
- },
- "RequiredFlags": func(f []*ClauseModel) []*ClauseModel {
- requiredFlags := []*ClauseModel{}
- for _, flag := range f {
- if flag.Required {
- requiredFlags = append(requiredFlags, flag)
- }
- }
- return requiredFlags
- },
- "OptionalFlags": func(f []*ClauseModel) []*ClauseModel {
- optionalFlags := []*ClauseModel{}
- for _, flag := range f {
- if !flag.Required {
- optionalFlags = append(optionalFlags, flag)
- }
- }
- return optionalFlags
- },
- "ArgsToTwoColumns": func(a []*ClauseModel) [][2]string {
- rows := [][2]string{}
- for _, arg := range a {
- s := "<" + arg.Name + ">"
- if !arg.Required {
- s = "[" + s + "]"
- }
- rows = append(rows, [2]string{s, arg.Help})
- }
- return rows
- },
- "CommandsToTwoColumns": func(c []*CmdModel) [][2]string {
- return commandsToColumns(indent, c)
- },
- "FormatTwoColumns": func(rows [][2]string) string {
- buf := bytes.NewBuffer(nil)
- formatTwoColumns(buf, indent, indent, width, rows)
- return buf.String()
- },
- "FormatTwoColumnsWithIndent": func(rows [][2]string, indent, padding int) string {
- buf := bytes.NewBuffer(nil)
- formatTwoColumns(buf, indent, padding, width, rows)
- return buf.String()
- },
- "FormatAppUsage": formatAppUsage,
- "FormatCommandUsage": formatCmdUsage,
- "IsCumulative": func(value Value) bool {
- r, ok := value.(cumulativeValue)
- return ok && r.IsCumulative()
- },
- "Char": func(c rune) string {
- return string(c)
- },
- }
- for name, fn := range usageContext.Funcs {
- funcs[name] = fn
- }
- t, err := template.New("usage").Funcs(funcs).Parse(tmpl)
- if err != nil {
- return err
- }
- appModel := a.Model()
- var selectedCommand *CmdModel
- if parseContext.SelectedCommand != nil {
- selectedCommand = appModel.FindModelForCommand(parseContext.SelectedCommand)
- }
- ctx := map[string]interface{}{
- "App": appModel,
- "Width": width,
- "Context": &templateParseContext{
- SelectedCommand: selectedCommand,
- FlagGroupModel: parseContext.flags.Model(),
- ArgGroupModel: parseContext.arguments.Model(),
- },
- }
- for k, v := range usageContext.Vars {
- ctx[k] = v
- }
- return t.Execute(a.output, ctx)
-}
-
-func commandsToColumns(indent int, cmds []*CmdModel) [][2]string {
- out := [][2]string{}
- for _, cmd := range cmds {
- if cmd.Hidden {
- continue
- }
- left := cmd.Name
- if cmd.FlagSummary() != "" {
- left += " " + cmd.FlagSummary()
- }
- args := []string{}
- for _, arg := range cmd.Args {
- if arg.Required {
- argText := "<" + arg.Name + ">"
- if _, ok := arg.Value.(cumulativeValue); ok {
- argText += " ..."
- }
- args = append(args, argText)
- }
- }
- if len(args) != 0 {
- left += " " + strings.Join(args, " ")
- }
- out = append(out, [2]string{strings.Repeat(" ", cmd.Depth*indent-1) + left, cmd.Help})
- out = append(out, commandsToColumns(indent, cmd.Commands)...)
- }
- return out
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/values.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/values.go
deleted file mode 100644
index d48710112..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/values.go
+++ /dev/null
@@ -1,365 +0,0 @@
-package kingpin
-
-//go:generate go run ./cmd/genvalues/main.go
-
-import (
- "fmt"
- "net/url"
- "os"
- "reflect"
- "regexp"
- "strings"
-
- "github.com/alecthomas/units"
-)
-
-// NOTE: Most of the base type values were lifted from:
-// http://golang.org/src/pkg/flag/flag.go?s=20146:20222
-
-// Value is the interface to the dynamic value stored in a flag.
-// (The default value is represented as a string.)
-//
-// If a Value has an IsBoolFlag() bool method returning true, the command-line
-// parser makes --name equivalent to -name=true rather than using the next
-// command-line argument, and adds a --no-name counterpart for negating the
-// flag.
-type Value interface {
- String() string
- Set(string) error
-}
-
-// Getter is an interface that allows the contents of a Value to be retrieved.
-// It wraps the Value interface, rather than being part of it, because it
-// appeared after Go 1 and its compatibility rules. All Value types provided
-// by this package satisfy the Getter interface.
-type Getter interface {
- Value
- Get() interface{}
-}
-
-// Optional interface to indicate boolean flags that don't accept a value, and
-// implicitly have a --no- negation counterpart.
-type boolFlag interface {
- Value
- IsBoolFlag() bool
-}
-
-// Optional interface for values that cumulatively consume all remaining
-// input.
-type cumulativeValue interface {
- Value
- Reset()
- IsCumulative() bool
-}
-
-type accumulator struct {
- element func(value interface{}) Value
- typ reflect.Type
- slice reflect.Value
-}
-
-// Use reflection to accumulate values into a slice.
-//
-// target := []string{}
-// newAccumulator(&target, func (value interface{}) Value {
-// return newStringValue(value.(*string))
-// })
-func newAccumulator(slice interface{}, element func(value interface{}) Value) *accumulator {
- typ := reflect.TypeOf(slice)
- if typ.Kind() != reflect.Ptr || typ.Elem().Kind() != reflect.Slice {
- panic(T("expected a pointer to a slice"))
- }
- return &accumulator{
- element: element,
- typ: typ.Elem().Elem(),
- slice: reflect.ValueOf(slice),
- }
-}
-
-func (a *accumulator) String() string {
- out := []string{}
- s := a.slice.Elem()
- for i := 0; i < s.Len(); i++ {
- out = append(out, a.element(s.Index(i).Addr().Interface()).String())
- }
- return strings.Join(out, ",")
-}
-
-func (a *accumulator) Set(value string) error {
- e := reflect.New(a.typ)
- if err := a.element(e.Interface()).Set(value); err != nil {
- return err
- }
- slice := reflect.Append(a.slice.Elem(), e.Elem())
- a.slice.Elem().Set(slice)
- return nil
-}
-
-func (a *accumulator) Get() interface{} {
- return a.slice.Interface()
-}
-
-func (a *accumulator) IsCumulative() bool {
- return true
-}
-
-func (a *accumulator) Reset() {
- if a.slice.Kind() == reflect.Ptr {
- a.slice.Elem().Set(reflect.MakeSlice(a.slice.Type().Elem(), 0, 0))
- } else {
- a.slice.Set(reflect.MakeSlice(a.slice.Type(), 0, 0))
- }
-}
-
-func (b *boolValue) IsBoolFlag() bool { return true }
-
-// -- map[string]string Value
-type stringMapValue map[string]string
-
-func newStringMapValue(p *map[string]string) *stringMapValue {
- return (*stringMapValue)(p)
-}
-
-var stringMapRegex = regexp.MustCompile("[:=]")
-
-func (s *stringMapValue) Set(value string) error {
- parts := stringMapRegex.Split(value, 2)
- if len(parts) != 2 {
- return TError("expected KEY=VALUE got '{{.Arg0}}'", V{"Arg0": value})
- }
- (*s)[parts[0]] = parts[1]
- return nil
-}
-
-func (s *stringMapValue) Get() interface{} {
- return (map[string]string)(*s)
-}
-
-func (s *stringMapValue) String() string {
- return fmt.Sprintf("%s", map[string]string(*s))
-}
-
-func (s *stringMapValue) IsCumulative() bool {
- return true
-}
-
-func (s *stringMapValue) Reset() {
- *s = map[string]string{}
-}
-
-// -- existingFile Value
-
-type fileStatValue struct {
- path *string
- predicate func(os.FileInfo) error
-}
-
-func newFileStatValue(p *string, predicate func(os.FileInfo) error) *fileStatValue {
- return &fileStatValue{
- path: p,
- predicate: predicate,
- }
-}
-
-func (f *fileStatValue) Set(value string) error {
- if s, err := os.Stat(value); os.IsNotExist(err) {
- return TError("path '{{.Arg0}}' does not exist", V{"Arg0": value})
- } else if err != nil {
- return err
- } else if err := f.predicate(s); err != nil {
- return err
- }
- *f.path = value
- return nil
-}
-
-func (f *fileStatValue) Get() interface{} {
- return (string)(*f.path)
-}
-
-func (f *fileStatValue) String() string {
- return *f.path
-}
-
-// -- url.URL Value
-type urlValue struct {
- u **url.URL
-}
-
-func newURLValue(p **url.URL) *urlValue {
- return &urlValue{p}
-}
-
-func (u *urlValue) Set(value string) error {
- url, err := url.Parse(value)
- if err != nil {
- return TError("invalid URL: {{.Arg0}}", V{"Arg0": err})
- }
- *u.u = url
- return nil
-}
-
-func (u *urlValue) Get() interface{} {
- return (*url.URL)(*u.u)
-}
-
-func (u *urlValue) String() string {
- if *u.u == nil {
- return T("")
- }
- return (*u.u).String()
-}
-
-// -- []*url.URL Value
-type urlListValue []*url.URL
-
-func newURLListValue(p *[]*url.URL) *urlListValue {
- return (*urlListValue)(p)
-}
-
-func (u *urlListValue) Set(value string) error {
- url, err := url.Parse(value)
- if err != nil {
- return TError("invalid URL: {{.Arg0}}", V{"Arg0": err})
- }
- *u = append(*u, url)
- return nil
-}
-
-func (u *urlListValue) Get() interface{} {
- return ([]*url.URL)(*u)
-}
-
-func (u *urlListValue) String() string {
- out := []string{}
- for _, url := range *u {
- out = append(out, url.String())
- }
- return strings.Join(out, ",")
-}
-
-// A flag whose value must be in a set of options.
-type enumValue struct {
- value *string
- options []string
-}
-
-func newEnumFlag(target *string, options ...string) *enumValue {
- return &enumValue{
- value: target,
- options: options,
- }
-}
-
-func (e *enumValue) String() string {
- return *e.value
-}
-
-func (e *enumValue) Set(value string) error {
- for _, v := range e.options {
- if v == value {
- *e.value = value
- return nil
- }
- }
- return TError("enum value must be one of {{.Arg0}}, got '{{.Arg1}}'", V{"Arg0": strings.Join(e.options, T(",")), "Arg1": value})
-}
-
-func (e *enumValue) Get() interface{} {
- return (string)(*e.value)
-}
-
-// -- []string Enum Value
-type enumsValue struct {
- value *[]string
- options []string
-}
-
-func newEnumsFlag(target *[]string, options ...string) *enumsValue {
- return &enumsValue{
- value: target,
- options: options,
- }
-}
-
-func (e *enumsValue) Set(value string) error {
- for _, v := range e.options {
- if v == value {
- *e.value = append(*e.value, value)
- return nil
- }
- }
- return TError("enum value must be one of {{.Arg0}}, got '{{.Arg1}}'", V{"Arg0": strings.Join(e.options, T(",")), "Arg1": value})
-}
-
-func (e *enumsValue) Get() interface{} {
- return ([]string)(*e.value)
-}
-
-func (e *enumsValue) String() string {
- return strings.Join(*e.value, ",")
-}
-
-func (e *enumsValue) IsCumulative() bool {
- return true
-}
-
-func (e *enumsValue) Reset() {
- *e.value = []string{}
-}
-
-// -- units.Base2Bytes Value
-type bytesValue units.Base2Bytes
-
-func newBytesValue(p *units.Base2Bytes) *bytesValue {
- return (*bytesValue)(p)
-}
-
-func (d *bytesValue) Set(s string) error {
- v, err := units.ParseBase2Bytes(s)
- *d = bytesValue(v)
- return err
-}
-
-func (d *bytesValue) Get() interface{} { return units.Base2Bytes(*d) }
-
-func (d *bytesValue) String() string { return (*units.Base2Bytes)(d).String() }
-
-func newExistingFileValue(target *string) *fileStatValue {
- return newFileStatValue(target, func(s os.FileInfo) error {
- if s.IsDir() {
- return TError("'{{.Arg0}}' is a directory", V{"Arg0": s.Name()})
- }
- return nil
- })
-}
-
-func newExistingDirValue(target *string) *fileStatValue {
- return newFileStatValue(target, func(s os.FileInfo) error {
- if !s.IsDir() {
- return TError("'{{.Arg0}}' is a file", V{"Arg0": s.Name()})
- }
- return nil
- })
-}
-
-func newExistingFileOrDirValue(target *string) *fileStatValue {
- return newFileStatValue(target, func(s os.FileInfo) error { return nil })
-}
-
-type counterValue int
-
-func newCounterValue(n *int) *counterValue {
- return (*counterValue)(n)
-}
-
-func (c *counterValue) Set(s string) error {
- *c++
- return nil
-}
-
-func (c *counterValue) Get() interface{} { return (int)(*c) }
-func (c *counterValue) IsBoolFlag() bool { return true }
-func (c *counterValue) String() string { return fmt.Sprintf("%d", *c) }
-func (c *counterValue) IsCumulative() bool { return true }
-func (c *counterValue) Reset() { *c = 0 }
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/values_generated.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/values_generated.go
deleted file mode 100644
index f0cf093f2..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/alecthomas/kingpin.v3-unstable/values_generated.go
+++ /dev/null
@@ -1,781 +0,0 @@
-package kingpin
-
-import (
- "encoding/hex"
- "fmt"
- "regexp"
- "strconv"
- "time"
-)
-
-// This file is autogenerated by "go generate .". Do not modify.
-
-// -- bool Value
-type boolValue struct{ v *bool }
-
-func newBoolValue(p *bool) *boolValue {
- return &boolValue{p}
-}
-
-func (f *boolValue) Set(s string) error {
- v, err := strconv.ParseBool(s)
- if err == nil {
- *f.v = (bool)(v)
- }
- return err
-}
-
-func (f *boolValue) Get() interface{} { return (bool)(*f.v) }
-
-func (f *boolValue) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Bool parses the next command-line value as bool.
-func (p *Clause) Bool() (target *bool) {
- target = new(bool)
- p.BoolVar(target)
- return
-}
-
-func (p *Clause) BoolVar(target *bool) {
- p.SetValue(newBoolValue(target))
-}
-
-// BoolList accumulates bool values into a slice.
-func (p *Clause) BoolList() (target *[]bool) {
- target = new([]bool)
- p.BoolListVar(target)
- return
-}
-
-func (p *Clause) BoolListVar(target *[]bool) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newBoolValue(v.(*bool))
- }))
-}
-
-// -- string Value
-type stringValue struct{ v *string }
-
-func newStringValue(p *string) *stringValue {
- return &stringValue{p}
-}
-
-func (f *stringValue) Set(s string) error {
- v, err := s, error(nil)
- if err == nil {
- *f.v = (string)(v)
- }
- return err
-}
-
-func (f *stringValue) Get() interface{} { return (string)(*f.v) }
-
-func (f *stringValue) String() string { return string(*f.v) }
-
-// String parses the next command-line value as string.
-func (p *Clause) String() (target *string) {
- target = new(string)
- p.StringVar(target)
- return
-}
-
-func (p *Clause) StringVar(target *string) {
- p.SetValue(newStringValue(target))
-}
-
-// Strings accumulates string values into a slice.
-func (p *Clause) Strings() (target *[]string) {
- target = new([]string)
- p.StringsVar(target)
- return
-}
-
-func (p *Clause) StringsVar(target *[]string) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newStringValue(v.(*string))
- }))
-}
-
-// -- uint Value
-type uintValue struct{ v *uint }
-
-func newUintValue(p *uint) *uintValue {
- return &uintValue{p}
-}
-
-func (f *uintValue) Set(s string) error {
- v, err := strconv.ParseUint(s, 0, 64)
- if err == nil {
- *f.v = (uint)(v)
- }
- return err
-}
-
-func (f *uintValue) Get() interface{} { return (uint)(*f.v) }
-
-func (f *uintValue) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Uint parses the next command-line value as uint.
-func (p *Clause) Uint() (target *uint) {
- target = new(uint)
- p.UintVar(target)
- return
-}
-
-func (p *Clause) UintVar(target *uint) {
- p.SetValue(newUintValue(target))
-}
-
-// Uints accumulates uint values into a slice.
-func (p *Clause) Uints() (target *[]uint) {
- target = new([]uint)
- p.UintsVar(target)
- return
-}
-
-func (p *Clause) UintsVar(target *[]uint) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newUintValue(v.(*uint))
- }))
-}
-
-// -- uint8 Value
-type uint8Value struct{ v *uint8 }
-
-func newUint8Value(p *uint8) *uint8Value {
- return &uint8Value{p}
-}
-
-func (f *uint8Value) Set(s string) error {
- v, err := strconv.ParseUint(s, 0, 8)
- if err == nil {
- *f.v = (uint8)(v)
- }
- return err
-}
-
-func (f *uint8Value) Get() interface{} { return (uint8)(*f.v) }
-
-func (f *uint8Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Uint8 parses the next command-line value as uint8.
-func (p *Clause) Uint8() (target *uint8) {
- target = new(uint8)
- p.Uint8Var(target)
- return
-}
-
-func (p *Clause) Uint8Var(target *uint8) {
- p.SetValue(newUint8Value(target))
-}
-
-// Uint8List accumulates uint8 values into a slice.
-func (p *Clause) Uint8List() (target *[]uint8) {
- target = new([]uint8)
- p.Uint8ListVar(target)
- return
-}
-
-func (p *Clause) Uint8ListVar(target *[]uint8) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newUint8Value(v.(*uint8))
- }))
-}
-
-// -- uint16 Value
-type uint16Value struct{ v *uint16 }
-
-func newUint16Value(p *uint16) *uint16Value {
- return &uint16Value{p}
-}
-
-func (f *uint16Value) Set(s string) error {
- v, err := strconv.ParseUint(s, 0, 16)
- if err == nil {
- *f.v = (uint16)(v)
- }
- return err
-}
-
-func (f *uint16Value) Get() interface{} { return (uint16)(*f.v) }
-
-func (f *uint16Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Uint16 parses the next command-line value as uint16.
-func (p *Clause) Uint16() (target *uint16) {
- target = new(uint16)
- p.Uint16Var(target)
- return
-}
-
-func (p *Clause) Uint16Var(target *uint16) {
- p.SetValue(newUint16Value(target))
-}
-
-// Uint16List accumulates uint16 values into a slice.
-func (p *Clause) Uint16List() (target *[]uint16) {
- target = new([]uint16)
- p.Uint16ListVar(target)
- return
-}
-
-func (p *Clause) Uint16ListVar(target *[]uint16) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newUint16Value(v.(*uint16))
- }))
-}
-
-// -- uint32 Value
-type uint32Value struct{ v *uint32 }
-
-func newUint32Value(p *uint32) *uint32Value {
- return &uint32Value{p}
-}
-
-func (f *uint32Value) Set(s string) error {
- v, err := strconv.ParseUint(s, 0, 32)
- if err == nil {
- *f.v = (uint32)(v)
- }
- return err
-}
-
-func (f *uint32Value) Get() interface{} { return (uint32)(*f.v) }
-
-func (f *uint32Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Uint32 parses the next command-line value as uint32.
-func (p *Clause) Uint32() (target *uint32) {
- target = new(uint32)
- p.Uint32Var(target)
- return
-}
-
-func (p *Clause) Uint32Var(target *uint32) {
- p.SetValue(newUint32Value(target))
-}
-
-// Uint32List accumulates uint32 values into a slice.
-func (p *Clause) Uint32List() (target *[]uint32) {
- target = new([]uint32)
- p.Uint32ListVar(target)
- return
-}
-
-func (p *Clause) Uint32ListVar(target *[]uint32) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newUint32Value(v.(*uint32))
- }))
-}
-
-// -- uint64 Value
-type uint64Value struct{ v *uint64 }
-
-func newUint64Value(p *uint64) *uint64Value {
- return &uint64Value{p}
-}
-
-func (f *uint64Value) Set(s string) error {
- v, err := strconv.ParseUint(s, 0, 64)
- if err == nil {
- *f.v = (uint64)(v)
- }
- return err
-}
-
-func (f *uint64Value) Get() interface{} { return (uint64)(*f.v) }
-
-func (f *uint64Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Uint64 parses the next command-line value as uint64.
-func (p *Clause) Uint64() (target *uint64) {
- target = new(uint64)
- p.Uint64Var(target)
- return
-}
-
-func (p *Clause) Uint64Var(target *uint64) {
- p.SetValue(newUint64Value(target))
-}
-
-// Uint64List accumulates uint64 values into a slice.
-func (p *Clause) Uint64List() (target *[]uint64) {
- target = new([]uint64)
- p.Uint64ListVar(target)
- return
-}
-
-func (p *Clause) Uint64ListVar(target *[]uint64) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newUint64Value(v.(*uint64))
- }))
-}
-
-// -- int Value
-type intValue struct{ v *int }
-
-func newIntValue(p *int) *intValue {
- return &intValue{p}
-}
-
-func (f *intValue) Set(s string) error {
- v, err := strconv.ParseFloat(s, 64)
- if err == nil {
- *f.v = (int)(v)
- }
- return err
-}
-
-func (f *intValue) Get() interface{} { return (int)(*f.v) }
-
-func (f *intValue) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Int parses the next command-line value as int.
-func (p *Clause) Int() (target *int) {
- target = new(int)
- p.IntVar(target)
- return
-}
-
-func (p *Clause) IntVar(target *int) {
- p.SetValue(newIntValue(target))
-}
-
-// Ints accumulates int values into a slice.
-func (p *Clause) Ints() (target *[]int) {
- target = new([]int)
- p.IntsVar(target)
- return
-}
-
-func (p *Clause) IntsVar(target *[]int) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newIntValue(v.(*int))
- }))
-}
-
-// -- int8 Value
-type int8Value struct{ v *int8 }
-
-func newInt8Value(p *int8) *int8Value {
- return &int8Value{p}
-}
-
-func (f *int8Value) Set(s string) error {
- v, err := strconv.ParseInt(s, 0, 8)
- if err == nil {
- *f.v = (int8)(v)
- }
- return err
-}
-
-func (f *int8Value) Get() interface{} { return (int8)(*f.v) }
-
-func (f *int8Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Int8 parses the next command-line value as int8.
-func (p *Clause) Int8() (target *int8) {
- target = new(int8)
- p.Int8Var(target)
- return
-}
-
-func (p *Clause) Int8Var(target *int8) {
- p.SetValue(newInt8Value(target))
-}
-
-// Int8List accumulates int8 values into a slice.
-func (p *Clause) Int8List() (target *[]int8) {
- target = new([]int8)
- p.Int8ListVar(target)
- return
-}
-
-func (p *Clause) Int8ListVar(target *[]int8) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newInt8Value(v.(*int8))
- }))
-}
-
-// -- int16 Value
-type int16Value struct{ v *int16 }
-
-func newInt16Value(p *int16) *int16Value {
- return &int16Value{p}
-}
-
-func (f *int16Value) Set(s string) error {
- v, err := strconv.ParseInt(s, 0, 16)
- if err == nil {
- *f.v = (int16)(v)
- }
- return err
-}
-
-func (f *int16Value) Get() interface{} { return (int16)(*f.v) }
-
-func (f *int16Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Int16 parses the next command-line value as int16.
-func (p *Clause) Int16() (target *int16) {
- target = new(int16)
- p.Int16Var(target)
- return
-}
-
-func (p *Clause) Int16Var(target *int16) {
- p.SetValue(newInt16Value(target))
-}
-
-// Int16List accumulates int16 values into a slice.
-func (p *Clause) Int16List() (target *[]int16) {
- target = new([]int16)
- p.Int16ListVar(target)
- return
-}
-
-func (p *Clause) Int16ListVar(target *[]int16) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newInt16Value(v.(*int16))
- }))
-}
-
-// -- int32 Value
-type int32Value struct{ v *int32 }
-
-func newInt32Value(p *int32) *int32Value {
- return &int32Value{p}
-}
-
-func (f *int32Value) Set(s string) error {
- v, err := strconv.ParseInt(s, 0, 32)
- if err == nil {
- *f.v = (int32)(v)
- }
- return err
-}
-
-func (f *int32Value) Get() interface{} { return (int32)(*f.v) }
-
-func (f *int32Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Int32 parses the next command-line value as int32.
-func (p *Clause) Int32() (target *int32) {
- target = new(int32)
- p.Int32Var(target)
- return
-}
-
-func (p *Clause) Int32Var(target *int32) {
- p.SetValue(newInt32Value(target))
-}
-
-// Int32List accumulates int32 values into a slice.
-func (p *Clause) Int32List() (target *[]int32) {
- target = new([]int32)
- p.Int32ListVar(target)
- return
-}
-
-func (p *Clause) Int32ListVar(target *[]int32) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newInt32Value(v.(*int32))
- }))
-}
-
-// -- int64 Value
-type int64Value struct{ v *int64 }
-
-func newInt64Value(p *int64) *int64Value {
- return &int64Value{p}
-}
-
-func (f *int64Value) Set(s string) error {
- v, err := strconv.ParseInt(s, 0, 64)
- if err == nil {
- *f.v = (int64)(v)
- }
- return err
-}
-
-func (f *int64Value) Get() interface{} { return (int64)(*f.v) }
-
-func (f *int64Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Int64 parses the next command-line value as int64.
-func (p *Clause) Int64() (target *int64) {
- target = new(int64)
- p.Int64Var(target)
- return
-}
-
-func (p *Clause) Int64Var(target *int64) {
- p.SetValue(newInt64Value(target))
-}
-
-// Int64List accumulates int64 values into a slice.
-func (p *Clause) Int64List() (target *[]int64) {
- target = new([]int64)
- p.Int64ListVar(target)
- return
-}
-
-func (p *Clause) Int64ListVar(target *[]int64) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newInt64Value(v.(*int64))
- }))
-}
-
-// -- float64 Value
-type float64Value struct{ v *float64 }
-
-func newFloat64Value(p *float64) *float64Value {
- return &float64Value{p}
-}
-
-func (f *float64Value) Set(s string) error {
- v, err := strconv.ParseFloat(s, 64)
- if err == nil {
- *f.v = (float64)(v)
- }
- return err
-}
-
-func (f *float64Value) Get() interface{} { return (float64)(*f.v) }
-
-func (f *float64Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Float64 parses the next command-line value as float64.
-func (p *Clause) Float64() (target *float64) {
- target = new(float64)
- p.Float64Var(target)
- return
-}
-
-func (p *Clause) Float64Var(target *float64) {
- p.SetValue(newFloat64Value(target))
-}
-
-// Float64List accumulates float64 values into a slice.
-func (p *Clause) Float64List() (target *[]float64) {
- target = new([]float64)
- p.Float64ListVar(target)
- return
-}
-
-func (p *Clause) Float64ListVar(target *[]float64) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newFloat64Value(v.(*float64))
- }))
-}
-
-// -- float32 Value
-type float32Value struct{ v *float32 }
-
-func newFloat32Value(p *float32) *float32Value {
- return &float32Value{p}
-}
-
-func (f *float32Value) Set(s string) error {
- v, err := strconv.ParseFloat(s, 32)
- if err == nil {
- *f.v = (float32)(v)
- }
- return err
-}
-
-func (f *float32Value) Get() interface{} { return (float32)(*f.v) }
-
-func (f *float32Value) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Float32 parses the next command-line value as float32.
-func (p *Clause) Float32() (target *float32) {
- target = new(float32)
- p.Float32Var(target)
- return
-}
-
-func (p *Clause) Float32Var(target *float32) {
- p.SetValue(newFloat32Value(target))
-}
-
-// Float32List accumulates float32 values into a slice.
-func (p *Clause) Float32List() (target *[]float32) {
- target = new([]float32)
- p.Float32ListVar(target)
- return
-}
-
-func (p *Clause) Float32ListVar(target *[]float32) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newFloat32Value(v.(*float32))
- }))
-}
-
-// ExistingFiles accumulates string values into a slice.
-func (p *Clause) ExistingFiles() (target *[]string) {
- target = new([]string)
- p.ExistingFilesVar(target)
- return
-}
-
-func (p *Clause) ExistingFilesVar(target *[]string) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newExistingFileValue(v.(*string))
- }))
-}
-
-// ExistingDirs accumulates string values into a slice.
-func (p *Clause) ExistingDirs() (target *[]string) {
- target = new([]string)
- p.ExistingDirsVar(target)
- return
-}
-
-func (p *Clause) ExistingDirsVar(target *[]string) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newExistingDirValue(v.(*string))
- }))
-}
-
-// ExistingFilesOrDirs accumulates string values into a slice.
-func (p *Clause) ExistingFilesOrDirs() (target *[]string) {
- target = new([]string)
- p.ExistingFilesOrDirsVar(target)
- return
-}
-
-func (p *Clause) ExistingFilesOrDirsVar(target *[]string) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newExistingFileOrDirValue(v.(*string))
- }))
-}
-
-// -- *regexp.Regexp Value
-type regexpValue struct{ v **regexp.Regexp }
-
-func newRegexpValue(p **regexp.Regexp) *regexpValue {
- return ®expValue{p}
-}
-
-func (f *regexpValue) Set(s string) error {
- v, err := regexp.Compile(s)
- if err == nil {
- *f.v = (*regexp.Regexp)(v)
- }
- return err
-}
-
-func (f *regexpValue) Get() interface{} { return (*regexp.Regexp)(*f.v) }
-
-func (f *regexpValue) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Regexp parses the next command-line value as *regexp.Regexp.
-func (p *Clause) Regexp() (target **regexp.Regexp) {
- target = new(*regexp.Regexp)
- p.RegexpVar(target)
- return
-}
-
-func (p *Clause) RegexpVar(target **regexp.Regexp) {
- p.SetValue(newRegexpValue(target))
-}
-
-// RegexpList accumulates *regexp.Regexp values into a slice.
-func (p *Clause) RegexpList() (target *[]*regexp.Regexp) {
- target = new([]*regexp.Regexp)
- p.RegexpListVar(target)
- return
-}
-
-func (p *Clause) RegexpListVar(target *[]*regexp.Regexp) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newRegexpValue(v.(**regexp.Regexp))
- }))
-}
-
-// -- []byte Value
-type hexBytesValue struct{ v *[]byte }
-
-func newHexBytesValue(p *[]byte) *hexBytesValue {
- return &hexBytesValue{p}
-}
-
-func (f *hexBytesValue) Set(s string) error {
- v, err := hex.DecodeString(s)
- if err == nil {
- *f.v = ([]byte)(v)
- }
- return err
-}
-
-func (f *hexBytesValue) Get() interface{} { return ([]byte)(*f.v) }
-
-func (f *hexBytesValue) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Bytes as a hex string.
-func (p *Clause) HexBytes() (target *[]byte) {
- target = new([]byte)
- p.HexBytesVar(target)
- return
-}
-
-func (p *Clause) HexBytesVar(target *[]byte) {
- p.SetValue(newHexBytesValue(target))
-}
-
-// HexBytesList accumulates []byte values into a slice.
-func (p *Clause) HexBytesList() (target *[][]byte) {
- target = new([][]byte)
- p.HexBytesListVar(target)
- return
-}
-
-func (p *Clause) HexBytesListVar(target *[][]byte) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newHexBytesValue(v.(*[]byte))
- }))
-}
-
-// -- time.Duration Value
-type durationValue struct{ v *time.Duration }
-
-func newDurationValue(p *time.Duration) *durationValue {
- return &durationValue{p}
-}
-
-func (f *durationValue) Set(s string) error {
- v, err := time.ParseDuration(s)
- if err == nil {
- *f.v = (time.Duration)(v)
- }
- return err
-}
-
-func (f *durationValue) Get() interface{} { return (time.Duration)(*f.v) }
-
-func (f *durationValue) String() string { return fmt.Sprintf("%v", *f.v) }
-
-// Time duration.
-func (p *Clause) Duration() (target *time.Duration) {
- target = new(time.Duration)
- p.DurationVar(target)
- return
-}
-
-func (p *Clause) DurationVar(target *time.Duration) {
- p.SetValue(newDurationValue(target))
-}
-
-// DurationList accumulates time.Duration values into a slice.
-func (p *Clause) DurationList() (target *[]time.Duration) {
- target = new([]time.Duration)
- p.DurationListVar(target)
- return
-}
-
-func (p *Clause) DurationListVar(target *[]time.Duration) {
- p.SetValue(newAccumulator(target, func(v interface{}) Value {
- return newDurationValue(v.(*time.Duration))
- }))
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/LICENSE b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/LICENSE
deleted file mode 100644
index 866d74a7a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright 2011-2016 Canonical Ltd.
-
-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/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/apic.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/apic.go
deleted file mode 100644
index 95ec014e8..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/apic.go
+++ /dev/null
@@ -1,742 +0,0 @@
-package yaml
-
-import (
- "io"
- "os"
-)
-
-func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) {
- //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens))
-
- // Check if we can move the queue at the beginning of the buffer.
- if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) {
- if parser.tokens_head != len(parser.tokens) {
- copy(parser.tokens, parser.tokens[parser.tokens_head:])
- }
- parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head]
- parser.tokens_head = 0
- }
- parser.tokens = append(parser.tokens, *token)
- if pos < 0 {
- return
- }
- copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:])
- parser.tokens[parser.tokens_head+pos] = *token
-}
-
-// Create a new parser object.
-func yaml_parser_initialize(parser *yaml_parser_t) bool {
- *parser = yaml_parser_t{
- raw_buffer: make([]byte, 0, input_raw_buffer_size),
- buffer: make([]byte, 0, input_buffer_size),
- }
- return true
-}
-
-// Destroy a parser object.
-func yaml_parser_delete(parser *yaml_parser_t) {
- *parser = yaml_parser_t{}
-}
-
-// String read handler.
-func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
- if parser.input_pos == len(parser.input) {
- return 0, io.EOF
- }
- n = copy(buffer, parser.input[parser.input_pos:])
- parser.input_pos += n
- return n, nil
-}
-
-// File read handler.
-func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
- return parser.input_file.Read(buffer)
-}
-
-// Set a string input.
-func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) {
- if parser.read_handler != nil {
- panic("must set the input source only once")
- }
- parser.read_handler = yaml_string_read_handler
- parser.input = input
- parser.input_pos = 0
-}
-
-// Set a file input.
-func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) {
- if parser.read_handler != nil {
- panic("must set the input source only once")
- }
- parser.read_handler = yaml_file_read_handler
- parser.input_file = file
-}
-
-// Set the source encoding.
-func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) {
- if parser.encoding != yaml_ANY_ENCODING {
- panic("must set the encoding only once")
- }
- parser.encoding = encoding
-}
-
-// Create a new emitter object.
-func yaml_emitter_initialize(emitter *yaml_emitter_t) bool {
- *emitter = yaml_emitter_t{
- buffer: make([]byte, output_buffer_size),
- raw_buffer: make([]byte, 0, output_raw_buffer_size),
- states: make([]yaml_emitter_state_t, 0, initial_stack_size),
- events: make([]yaml_event_t, 0, initial_queue_size),
- }
- return true
-}
-
-// Destroy an emitter object.
-func yaml_emitter_delete(emitter *yaml_emitter_t) {
- *emitter = yaml_emitter_t{}
-}
-
-// String write handler.
-func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
- *emitter.output_buffer = append(*emitter.output_buffer, buffer...)
- return nil
-}
-
-// File write handler.
-func yaml_file_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
- _, err := emitter.output_file.Write(buffer)
- return err
-}
-
-// Set a string output.
-func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) {
- if emitter.write_handler != nil {
- panic("must set the output target only once")
- }
- emitter.write_handler = yaml_string_write_handler
- emitter.output_buffer = output_buffer
-}
-
-// Set a file output.
-func yaml_emitter_set_output_file(emitter *yaml_emitter_t, file io.Writer) {
- if emitter.write_handler != nil {
- panic("must set the output target only once")
- }
- emitter.write_handler = yaml_file_write_handler
- emitter.output_file = file
-}
-
-// Set the output encoding.
-func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) {
- if emitter.encoding != yaml_ANY_ENCODING {
- panic("must set the output encoding only once")
- }
- emitter.encoding = encoding
-}
-
-// Set the canonical output style.
-func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) {
- emitter.canonical = canonical
-}
-
-//// Set the indentation increment.
-func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) {
- if indent < 2 || indent > 9 {
- indent = 2
- }
- emitter.best_indent = indent
-}
-
-// Set the preferred line width.
-func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) {
- if width < 0 {
- width = -1
- }
- emitter.best_width = width
-}
-
-// Set if unescaped non-ASCII characters are allowed.
-func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) {
- emitter.unicode = unicode
-}
-
-// Set the preferred line break character.
-func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) {
- emitter.line_break = line_break
-}
-
-///*
-// * Destroy a token object.
-// */
-//
-//YAML_DECLARE(void)
-//yaml_token_delete(yaml_token_t *token)
-//{
-// assert(token); // Non-NULL token object expected.
-//
-// switch (token.type)
-// {
-// case YAML_TAG_DIRECTIVE_TOKEN:
-// yaml_free(token.data.tag_directive.handle);
-// yaml_free(token.data.tag_directive.prefix);
-// break;
-//
-// case YAML_ALIAS_TOKEN:
-// yaml_free(token.data.alias.value);
-// break;
-//
-// case YAML_ANCHOR_TOKEN:
-// yaml_free(token.data.anchor.value);
-// break;
-//
-// case YAML_TAG_TOKEN:
-// yaml_free(token.data.tag.handle);
-// yaml_free(token.data.tag.suffix);
-// break;
-//
-// case YAML_SCALAR_TOKEN:
-// yaml_free(token.data.scalar.value);
-// break;
-//
-// default:
-// break;
-// }
-//
-// memset(token, 0, sizeof(yaml_token_t));
-//}
-//
-///*
-// * Check if a string is a valid UTF-8 sequence.
-// *
-// * Check 'reader.c' for more details on UTF-8 encoding.
-// */
-//
-//static int
-//yaml_check_utf8(yaml_char_t *start, size_t length)
-//{
-// yaml_char_t *end = start+length;
-// yaml_char_t *pointer = start;
-//
-// while (pointer < end) {
-// unsigned char octet;
-// unsigned int width;
-// unsigned int value;
-// size_t k;
-//
-// octet = pointer[0];
-// width = (octet & 0x80) == 0x00 ? 1 :
-// (octet & 0xE0) == 0xC0 ? 2 :
-// (octet & 0xF0) == 0xE0 ? 3 :
-// (octet & 0xF8) == 0xF0 ? 4 : 0;
-// value = (octet & 0x80) == 0x00 ? octet & 0x7F :
-// (octet & 0xE0) == 0xC0 ? octet & 0x1F :
-// (octet & 0xF0) == 0xE0 ? octet & 0x0F :
-// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
-// if (!width) return 0;
-// if (pointer+width > end) return 0;
-// for (k = 1; k < width; k ++) {
-// octet = pointer[k];
-// if ((octet & 0xC0) != 0x80) return 0;
-// value = (value << 6) + (octet & 0x3F);
-// }
-// if (!((width == 1) ||
-// (width == 2 && value >= 0x80) ||
-// (width == 3 && value >= 0x800) ||
-// (width == 4 && value >= 0x10000))) return 0;
-//
-// pointer += width;
-// }
-//
-// return 1;
-//}
-//
-
-// Create STREAM-START.
-func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) bool {
- *event = yaml_event_t{
- typ: yaml_STREAM_START_EVENT,
- encoding: encoding,
- }
- return true
-}
-
-// Create STREAM-END.
-func yaml_stream_end_event_initialize(event *yaml_event_t) bool {
- *event = yaml_event_t{
- typ: yaml_STREAM_END_EVENT,
- }
- return true
-}
-
-// Create DOCUMENT-START.
-func yaml_document_start_event_initialize(event *yaml_event_t, version_directive *yaml_version_directive_t,
- tag_directives []yaml_tag_directive_t, implicit bool) bool {
- *event = yaml_event_t{
- typ: yaml_DOCUMENT_START_EVENT,
- version_directive: version_directive,
- tag_directives: tag_directives,
- implicit: implicit,
- }
- return true
-}
-
-// Create DOCUMENT-END.
-func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) bool {
- *event = yaml_event_t{
- typ: yaml_DOCUMENT_END_EVENT,
- implicit: implicit,
- }
- return true
-}
-
-///*
-// * Create ALIAS.
-// */
-//
-//YAML_DECLARE(int)
-//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t)
-//{
-// mark yaml_mark_t = { 0, 0, 0 }
-// anchor_copy *yaml_char_t = NULL
-//
-// assert(event) // Non-NULL event object is expected.
-// assert(anchor) // Non-NULL anchor is expected.
-//
-// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0
-//
-// anchor_copy = yaml_strdup(anchor)
-// if (!anchor_copy)
-// return 0
-//
-// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark)
-//
-// return 1
-//}
-
-// Create SCALAR.
-func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool {
- *event = yaml_event_t{
- typ: yaml_SCALAR_EVENT,
- anchor: anchor,
- tag: tag,
- value: value,
- implicit: plain_implicit,
- quoted_implicit: quoted_implicit,
- style: yaml_style_t(style),
- }
- return true
-}
-
-// Create SEQUENCE-START.
-func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool {
- *event = yaml_event_t{
- typ: yaml_SEQUENCE_START_EVENT,
- anchor: anchor,
- tag: tag,
- implicit: implicit,
- style: yaml_style_t(style),
- }
- return true
-}
-
-// Create SEQUENCE-END.
-func yaml_sequence_end_event_initialize(event *yaml_event_t) bool {
- *event = yaml_event_t{
- typ: yaml_SEQUENCE_END_EVENT,
- }
- return true
-}
-
-// Create MAPPING-START.
-func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) bool {
- *event = yaml_event_t{
- typ: yaml_MAPPING_START_EVENT,
- anchor: anchor,
- tag: tag,
- implicit: implicit,
- style: yaml_style_t(style),
- }
- return true
-}
-
-// Create MAPPING-END.
-func yaml_mapping_end_event_initialize(event *yaml_event_t) bool {
- *event = yaml_event_t{
- typ: yaml_MAPPING_END_EVENT,
- }
- return true
-}
-
-// Destroy an event object.
-func yaml_event_delete(event *yaml_event_t) {
- *event = yaml_event_t{}
-}
-
-///*
-// * Create a document object.
-// */
-//
-//YAML_DECLARE(int)
-//yaml_document_initialize(document *yaml_document_t,
-// version_directive *yaml_version_directive_t,
-// tag_directives_start *yaml_tag_directive_t,
-// tag_directives_end *yaml_tag_directive_t,
-// start_implicit int, end_implicit int)
-//{
-// struct {
-// error yaml_error_type_t
-// } context
-// struct {
-// start *yaml_node_t
-// end *yaml_node_t
-// top *yaml_node_t
-// } nodes = { NULL, NULL, NULL }
-// version_directive_copy *yaml_version_directive_t = NULL
-// struct {
-// start *yaml_tag_directive_t
-// end *yaml_tag_directive_t
-// top *yaml_tag_directive_t
-// } tag_directives_copy = { NULL, NULL, NULL }
-// value yaml_tag_directive_t = { NULL, NULL }
-// mark yaml_mark_t = { 0, 0, 0 }
-//
-// assert(document) // Non-NULL document object is expected.
-// assert((tag_directives_start && tag_directives_end) ||
-// (tag_directives_start == tag_directives_end))
-// // Valid tag directives are expected.
-//
-// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error
-//
-// if (version_directive) {
-// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t))
-// if (!version_directive_copy) goto error
-// version_directive_copy.major = version_directive.major
-// version_directive_copy.minor = version_directive.minor
-// }
-//
-// if (tag_directives_start != tag_directives_end) {
-// tag_directive *yaml_tag_directive_t
-// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
-// goto error
-// for (tag_directive = tag_directives_start
-// tag_directive != tag_directives_end; tag_directive ++) {
-// assert(tag_directive.handle)
-// assert(tag_directive.prefix)
-// if (!yaml_check_utf8(tag_directive.handle,
-// strlen((char *)tag_directive.handle)))
-// goto error
-// if (!yaml_check_utf8(tag_directive.prefix,
-// strlen((char *)tag_directive.prefix)))
-// goto error
-// value.handle = yaml_strdup(tag_directive.handle)
-// value.prefix = yaml_strdup(tag_directive.prefix)
-// if (!value.handle || !value.prefix) goto error
-// if (!PUSH(&context, tag_directives_copy, value))
-// goto error
-// value.handle = NULL
-// value.prefix = NULL
-// }
-// }
-//
-// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
-// tag_directives_copy.start, tag_directives_copy.top,
-// start_implicit, end_implicit, mark, mark)
-//
-// return 1
-//
-//error:
-// STACK_DEL(&context, nodes)
-// yaml_free(version_directive_copy)
-// while (!STACK_EMPTY(&context, tag_directives_copy)) {
-// value yaml_tag_directive_t = POP(&context, tag_directives_copy)
-// yaml_free(value.handle)
-// yaml_free(value.prefix)
-// }
-// STACK_DEL(&context, tag_directives_copy)
-// yaml_free(value.handle)
-// yaml_free(value.prefix)
-//
-// return 0
-//}
-//
-///*
-// * Destroy a document object.
-// */
-//
-//YAML_DECLARE(void)
-//yaml_document_delete(document *yaml_document_t)
-//{
-// struct {
-// error yaml_error_type_t
-// } context
-// tag_directive *yaml_tag_directive_t
-//
-// context.error = YAML_NO_ERROR // Eliminate a compliler warning.
-//
-// assert(document) // Non-NULL document object is expected.
-//
-// while (!STACK_EMPTY(&context, document.nodes)) {
-// node yaml_node_t = POP(&context, document.nodes)
-// yaml_free(node.tag)
-// switch (node.type) {
-// case YAML_SCALAR_NODE:
-// yaml_free(node.data.scalar.value)
-// break
-// case YAML_SEQUENCE_NODE:
-// STACK_DEL(&context, node.data.sequence.items)
-// break
-// case YAML_MAPPING_NODE:
-// STACK_DEL(&context, node.data.mapping.pairs)
-// break
-// default:
-// assert(0) // Should not happen.
-// }
-// }
-// STACK_DEL(&context, document.nodes)
-//
-// yaml_free(document.version_directive)
-// for (tag_directive = document.tag_directives.start
-// tag_directive != document.tag_directives.end
-// tag_directive++) {
-// yaml_free(tag_directive.handle)
-// yaml_free(tag_directive.prefix)
-// }
-// yaml_free(document.tag_directives.start)
-//
-// memset(document, 0, sizeof(yaml_document_t))
-//}
-//
-///**
-// * Get a document node.
-// */
-//
-//YAML_DECLARE(yaml_node_t *)
-//yaml_document_get_node(document *yaml_document_t, index int)
-//{
-// assert(document) // Non-NULL document object is expected.
-//
-// if (index > 0 && document.nodes.start + index <= document.nodes.top) {
-// return document.nodes.start + index - 1
-// }
-// return NULL
-//}
-//
-///**
-// * Get the root object.
-// */
-//
-//YAML_DECLARE(yaml_node_t *)
-//yaml_document_get_root_node(document *yaml_document_t)
-//{
-// assert(document) // Non-NULL document object is expected.
-//
-// if (document.nodes.top != document.nodes.start) {
-// return document.nodes.start
-// }
-// return NULL
-//}
-//
-///*
-// * Add a scalar node to a document.
-// */
-//
-//YAML_DECLARE(int)
-//yaml_document_add_scalar(document *yaml_document_t,
-// tag *yaml_char_t, value *yaml_char_t, length int,
-// style yaml_scalar_style_t)
-//{
-// struct {
-// error yaml_error_type_t
-// } context
-// mark yaml_mark_t = { 0, 0, 0 }
-// tag_copy *yaml_char_t = NULL
-// value_copy *yaml_char_t = NULL
-// node yaml_node_t
-//
-// assert(document) // Non-NULL document object is expected.
-// assert(value) // Non-NULL value is expected.
-//
-// if (!tag) {
-// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG
-// }
-//
-// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
-// tag_copy = yaml_strdup(tag)
-// if (!tag_copy) goto error
-//
-// if (length < 0) {
-// length = strlen((char *)value)
-// }
-//
-// if (!yaml_check_utf8(value, length)) goto error
-// value_copy = yaml_malloc(length+1)
-// if (!value_copy) goto error
-// memcpy(value_copy, value, length)
-// value_copy[length] = '\0'
-//
-// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark)
-// if (!PUSH(&context, document.nodes, node)) goto error
-//
-// return document.nodes.top - document.nodes.start
-//
-//error:
-// yaml_free(tag_copy)
-// yaml_free(value_copy)
-//
-// return 0
-//}
-//
-///*
-// * Add a sequence node to a document.
-// */
-//
-//YAML_DECLARE(int)
-//yaml_document_add_sequence(document *yaml_document_t,
-// tag *yaml_char_t, style yaml_sequence_style_t)
-//{
-// struct {
-// error yaml_error_type_t
-// } context
-// mark yaml_mark_t = { 0, 0, 0 }
-// tag_copy *yaml_char_t = NULL
-// struct {
-// start *yaml_node_item_t
-// end *yaml_node_item_t
-// top *yaml_node_item_t
-// } items = { NULL, NULL, NULL }
-// node yaml_node_t
-//
-// assert(document) // Non-NULL document object is expected.
-//
-// if (!tag) {
-// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG
-// }
-//
-// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
-// tag_copy = yaml_strdup(tag)
-// if (!tag_copy) goto error
-//
-// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error
-//
-// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
-// style, mark, mark)
-// if (!PUSH(&context, document.nodes, node)) goto error
-//
-// return document.nodes.top - document.nodes.start
-//
-//error:
-// STACK_DEL(&context, items)
-// yaml_free(tag_copy)
-//
-// return 0
-//}
-//
-///*
-// * Add a mapping node to a document.
-// */
-//
-//YAML_DECLARE(int)
-//yaml_document_add_mapping(document *yaml_document_t,
-// tag *yaml_char_t, style yaml_mapping_style_t)
-//{
-// struct {
-// error yaml_error_type_t
-// } context
-// mark yaml_mark_t = { 0, 0, 0 }
-// tag_copy *yaml_char_t = NULL
-// struct {
-// start *yaml_node_pair_t
-// end *yaml_node_pair_t
-// top *yaml_node_pair_t
-// } pairs = { NULL, NULL, NULL }
-// node yaml_node_t
-//
-// assert(document) // Non-NULL document object is expected.
-//
-// if (!tag) {
-// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG
-// }
-//
-// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
-// tag_copy = yaml_strdup(tag)
-// if (!tag_copy) goto error
-//
-// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error
-//
-// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
-// style, mark, mark)
-// if (!PUSH(&context, document.nodes, node)) goto error
-//
-// return document.nodes.top - document.nodes.start
-//
-//error:
-// STACK_DEL(&context, pairs)
-// yaml_free(tag_copy)
-//
-// return 0
-//}
-//
-///*
-// * Append an item to a sequence node.
-// */
-//
-//YAML_DECLARE(int)
-//yaml_document_append_sequence_item(document *yaml_document_t,
-// sequence int, item int)
-//{
-// struct {
-// error yaml_error_type_t
-// } context
-//
-// assert(document) // Non-NULL document is required.
-// assert(sequence > 0
-// && document.nodes.start + sequence <= document.nodes.top)
-// // Valid sequence id is required.
-// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE)
-// // A sequence node is required.
-// assert(item > 0 && document.nodes.start + item <= document.nodes.top)
-// // Valid item id is required.
-//
-// if (!PUSH(&context,
-// document.nodes.start[sequence-1].data.sequence.items, item))
-// return 0
-//
-// return 1
-//}
-//
-///*
-// * Append a pair of a key and a value to a mapping node.
-// */
-//
-//YAML_DECLARE(int)
-//yaml_document_append_mapping_pair(document *yaml_document_t,
-// mapping int, key int, value int)
-//{
-// struct {
-// error yaml_error_type_t
-// } context
-//
-// pair yaml_node_pair_t
-//
-// assert(document) // Non-NULL document is required.
-// assert(mapping > 0
-// && document.nodes.start + mapping <= document.nodes.top)
-// // Valid mapping id is required.
-// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE)
-// // A mapping node is required.
-// assert(key > 0 && document.nodes.start + key <= document.nodes.top)
-// // Valid key id is required.
-// assert(value > 0 && document.nodes.start + value <= document.nodes.top)
-// // Valid value id is required.
-//
-// pair.key = key
-// pair.value = value
-//
-// if (!PUSH(&context,
-// document.nodes.start[mapping-1].data.mapping.pairs, pair))
-// return 0
-//
-// return 1
-//}
-//
-//
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/decode.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/decode.go
deleted file mode 100644
index b13ab9f07..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/decode.go
+++ /dev/null
@@ -1,683 +0,0 @@
-package yaml
-
-import (
- "encoding"
- "encoding/base64"
- "fmt"
- "math"
- "reflect"
- "strconv"
- "time"
-)
-
-const (
- documentNode = 1 << iota
- mappingNode
- sequenceNode
- scalarNode
- aliasNode
-)
-
-type node struct {
- kind int
- line, column int
- tag string
- value string
- implicit bool
- children []*node
- anchors map[string]*node
-}
-
-// ----------------------------------------------------------------------------
-// Parser, produces a node tree out of a libyaml event stream.
-
-type parser struct {
- parser yaml_parser_t
- event yaml_event_t
- doc *node
-}
-
-func newParser(b []byte) *parser {
- p := parser{}
- if !yaml_parser_initialize(&p.parser) {
- panic("failed to initialize YAML emitter")
- }
-
- if len(b) == 0 {
- b = []byte{'\n'}
- }
-
- yaml_parser_set_input_string(&p.parser, b)
-
- p.skip()
- if p.event.typ != yaml_STREAM_START_EVENT {
- panic("expected stream start event, got " + strconv.Itoa(int(p.event.typ)))
- }
- p.skip()
- return &p
-}
-
-func (p *parser) destroy() {
- if p.event.typ != yaml_NO_EVENT {
- yaml_event_delete(&p.event)
- }
- yaml_parser_delete(&p.parser)
-}
-
-func (p *parser) skip() {
- if p.event.typ != yaml_NO_EVENT {
- if p.event.typ == yaml_STREAM_END_EVENT {
- failf("attempted to go past the end of stream; corrupted value?")
- }
- yaml_event_delete(&p.event)
- }
- if !yaml_parser_parse(&p.parser, &p.event) {
- p.fail()
- }
-}
-
-func (p *parser) fail() {
- var where string
- var line int
- if p.parser.problem_mark.line != 0 {
- line = p.parser.problem_mark.line
- } else if p.parser.context_mark.line != 0 {
- line = p.parser.context_mark.line
- }
- if line != 0 {
- where = "line " + strconv.Itoa(line) + ": "
- }
- var msg string
- if len(p.parser.problem) > 0 {
- msg = p.parser.problem
- } else {
- msg = "unknown problem parsing YAML content"
- }
- failf("%s%s", where, msg)
-}
-
-func (p *parser) anchor(n *node, anchor []byte) {
- if anchor != nil {
- p.doc.anchors[string(anchor)] = n
- }
-}
-
-func (p *parser) parse() *node {
- switch p.event.typ {
- case yaml_SCALAR_EVENT:
- return p.scalar()
- case yaml_ALIAS_EVENT:
- return p.alias()
- case yaml_MAPPING_START_EVENT:
- return p.mapping()
- case yaml_SEQUENCE_START_EVENT:
- return p.sequence()
- case yaml_DOCUMENT_START_EVENT:
- return p.document()
- case yaml_STREAM_END_EVENT:
- // Happens when attempting to decode an empty buffer.
- return nil
- default:
- panic("attempted to parse unknown event: " + strconv.Itoa(int(p.event.typ)))
- }
- panic("unreachable")
-}
-
-func (p *parser) node(kind int) *node {
- return &node{
- kind: kind,
- line: p.event.start_mark.line,
- column: p.event.start_mark.column,
- }
-}
-
-func (p *parser) document() *node {
- n := p.node(documentNode)
- n.anchors = make(map[string]*node)
- p.doc = n
- p.skip()
- n.children = append(n.children, p.parse())
- if p.event.typ != yaml_DOCUMENT_END_EVENT {
- panic("expected end of document event but got " + strconv.Itoa(int(p.event.typ)))
- }
- p.skip()
- return n
-}
-
-func (p *parser) alias() *node {
- n := p.node(aliasNode)
- n.value = string(p.event.anchor)
- p.skip()
- return n
-}
-
-func (p *parser) scalar() *node {
- n := p.node(scalarNode)
- n.value = string(p.event.value)
- n.tag = string(p.event.tag)
- n.implicit = p.event.implicit
- p.anchor(n, p.event.anchor)
- p.skip()
- return n
-}
-
-func (p *parser) sequence() *node {
- n := p.node(sequenceNode)
- p.anchor(n, p.event.anchor)
- p.skip()
- for p.event.typ != yaml_SEQUENCE_END_EVENT {
- n.children = append(n.children, p.parse())
- }
- p.skip()
- return n
-}
-
-func (p *parser) mapping() *node {
- n := p.node(mappingNode)
- p.anchor(n, p.event.anchor)
- p.skip()
- for p.event.typ != yaml_MAPPING_END_EVENT {
- n.children = append(n.children, p.parse(), p.parse())
- }
- p.skip()
- return n
-}
-
-// ----------------------------------------------------------------------------
-// Decoder, unmarshals a node into a provided value.
-
-type decoder struct {
- doc *node
- aliases map[string]bool
- mapType reflect.Type
- terrors []string
-}
-
-var (
- mapItemType = reflect.TypeOf(MapItem{})
- durationType = reflect.TypeOf(time.Duration(0))
- defaultMapType = reflect.TypeOf(map[interface{}]interface{}{})
- ifaceType = defaultMapType.Elem()
-)
-
-func newDecoder() *decoder {
- d := &decoder{mapType: defaultMapType}
- d.aliases = make(map[string]bool)
- return d
-}
-
-func (d *decoder) terror(n *node, tag string, out reflect.Value) {
- if n.tag != "" {
- tag = n.tag
- }
- value := n.value
- if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG {
- if len(value) > 10 {
- value = " `" + value[:7] + "...`"
- } else {
- value = " `" + value + "`"
- }
- }
- d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type()))
-}
-
-func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) {
- terrlen := len(d.terrors)
- err := u.UnmarshalYAML(func(v interface{}) (err error) {
- defer handleErr(&err)
- d.unmarshal(n, reflect.ValueOf(v))
- if len(d.terrors) > terrlen {
- issues := d.terrors[terrlen:]
- d.terrors = d.terrors[:terrlen]
- return &TypeError{issues}
- }
- return nil
- })
- if e, ok := err.(*TypeError); ok {
- d.terrors = append(d.terrors, e.Errors...)
- return false
- }
- if err != nil {
- fail(err)
- }
- return true
-}
-
-// d.prepare initializes and dereferences pointers and calls UnmarshalYAML
-// if a value is found to implement it.
-// It returns the initialized and dereferenced out value, whether
-// unmarshalling was already done by UnmarshalYAML, and if so whether
-// its types unmarshalled appropriately.
-//
-// If n holds a null value, prepare returns before doing anything.
-func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) {
- if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "" && n.implicit) {
- return out, false, false
- }
- again := true
- for again {
- again = false
- if out.Kind() == reflect.Ptr {
- if out.IsNil() {
- out.Set(reflect.New(out.Type().Elem()))
- }
- out = out.Elem()
- again = true
- }
- if out.CanAddr() {
- if u, ok := out.Addr().Interface().(Unmarshaler); ok {
- good = d.callUnmarshaler(n, u)
- return out, true, good
- }
- }
- }
- return out, false, false
-}
-
-func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) {
- switch n.kind {
- case documentNode:
- return d.document(n, out)
- case aliasNode:
- return d.alias(n, out)
- }
- out, unmarshaled, good := d.prepare(n, out)
- if unmarshaled {
- return good
- }
- switch n.kind {
- case scalarNode:
- good = d.scalar(n, out)
- case mappingNode:
- good = d.mapping(n, out)
- case sequenceNode:
- good = d.sequence(n, out)
- default:
- panic("internal error: unknown node kind: " + strconv.Itoa(n.kind))
- }
- return good
-}
-
-func (d *decoder) document(n *node, out reflect.Value) (good bool) {
- if len(n.children) == 1 {
- d.doc = n
- d.unmarshal(n.children[0], out)
- return true
- }
- return false
-}
-
-func (d *decoder) alias(n *node, out reflect.Value) (good bool) {
- an, ok := d.doc.anchors[n.value]
- if !ok {
- failf("unknown anchor '%s' referenced", n.value)
- }
- if d.aliases[n.value] {
- failf("anchor '%s' value contains itself", n.value)
- }
- d.aliases[n.value] = true
- good = d.unmarshal(an, out)
- delete(d.aliases, n.value)
- return good
-}
-
-var zeroValue reflect.Value
-
-func resetMap(out reflect.Value) {
- for _, k := range out.MapKeys() {
- out.SetMapIndex(k, zeroValue)
- }
-}
-
-func (d *decoder) scalar(n *node, out reflect.Value) (good bool) {
- var tag string
- var resolved interface{}
- if n.tag == "" && !n.implicit {
- tag = yaml_STR_TAG
- resolved = n.value
- } else {
- tag, resolved = resolve(n.tag, n.value)
- if tag == yaml_BINARY_TAG {
- data, err := base64.StdEncoding.DecodeString(resolved.(string))
- if err != nil {
- failf("!!binary value contains invalid base64 data")
- }
- resolved = string(data)
- }
- }
- if resolved == nil {
- if out.Kind() == reflect.Map && !out.CanAddr() {
- resetMap(out)
- } else {
- out.Set(reflect.Zero(out.Type()))
- }
- return true
- }
- if s, ok := resolved.(string); ok && out.CanAddr() {
- if u, ok := out.Addr().Interface().(encoding.TextUnmarshaler); ok {
- err := u.UnmarshalText([]byte(s))
- if err != nil {
- fail(err)
- }
- return true
- }
- }
- switch out.Kind() {
- case reflect.String:
- if tag == yaml_BINARY_TAG {
- out.SetString(resolved.(string))
- good = true
- } else if resolved != nil {
- out.SetString(n.value)
- good = true
- }
- case reflect.Interface:
- if resolved == nil {
- out.Set(reflect.Zero(out.Type()))
- } else {
- out.Set(reflect.ValueOf(resolved))
- }
- good = true
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- switch resolved := resolved.(type) {
- case int:
- if !out.OverflowInt(int64(resolved)) {
- out.SetInt(int64(resolved))
- good = true
- }
- case int64:
- if !out.OverflowInt(resolved) {
- out.SetInt(resolved)
- good = true
- }
- case uint64:
- if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
- out.SetInt(int64(resolved))
- good = true
- }
- case float64:
- if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
- out.SetInt(int64(resolved))
- good = true
- }
- case string:
- if out.Type() == durationType {
- d, err := time.ParseDuration(resolved)
- if err == nil {
- out.SetInt(int64(d))
- good = true
- }
- }
- }
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- switch resolved := resolved.(type) {
- case int:
- if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
- out.SetUint(uint64(resolved))
- good = true
- }
- case int64:
- if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
- out.SetUint(uint64(resolved))
- good = true
- }
- case uint64:
- if !out.OverflowUint(uint64(resolved)) {
- out.SetUint(uint64(resolved))
- good = true
- }
- case float64:
- if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) {
- out.SetUint(uint64(resolved))
- good = true
- }
- }
- case reflect.Bool:
- switch resolved := resolved.(type) {
- case bool:
- out.SetBool(resolved)
- good = true
- }
- case reflect.Float32, reflect.Float64:
- switch resolved := resolved.(type) {
- case int:
- out.SetFloat(float64(resolved))
- good = true
- case int64:
- out.SetFloat(float64(resolved))
- good = true
- case uint64:
- out.SetFloat(float64(resolved))
- good = true
- case float64:
- out.SetFloat(resolved)
- good = true
- }
- case reflect.Ptr:
- if out.Type().Elem() == reflect.TypeOf(resolved) {
- // TODO DOes this make sense? When is out a Ptr except when decoding a nil value?
- elem := reflect.New(out.Type().Elem())
- elem.Elem().Set(reflect.ValueOf(resolved))
- out.Set(elem)
- good = true
- }
- }
- if !good {
- d.terror(n, tag, out)
- }
- return good
-}
-
-func settableValueOf(i interface{}) reflect.Value {
- v := reflect.ValueOf(i)
- sv := reflect.New(v.Type()).Elem()
- sv.Set(v)
- return sv
-}
-
-func (d *decoder) sequence(n *node, out reflect.Value) (good bool) {
- l := len(n.children)
-
- var iface reflect.Value
- switch out.Kind() {
- case reflect.Slice:
- out.Set(reflect.MakeSlice(out.Type(), l, l))
- case reflect.Interface:
- // No type hints. Will have to use a generic sequence.
- iface = out
- out = settableValueOf(make([]interface{}, l))
- default:
- d.terror(n, yaml_SEQ_TAG, out)
- return false
- }
- et := out.Type().Elem()
-
- j := 0
- for i := 0; i < l; i++ {
- e := reflect.New(et).Elem()
- if ok := d.unmarshal(n.children[i], e); ok {
- out.Index(j).Set(e)
- j++
- }
- }
- out.Set(out.Slice(0, j))
- if iface.IsValid() {
- iface.Set(out)
- }
- return true
-}
-
-func (d *decoder) mapping(n *node, out reflect.Value) (good bool) {
- switch out.Kind() {
- case reflect.Struct:
- return d.mappingStruct(n, out)
- case reflect.Slice:
- return d.mappingSlice(n, out)
- case reflect.Map:
- // okay
- case reflect.Interface:
- if d.mapType.Kind() == reflect.Map {
- iface := out
- out = reflect.MakeMap(d.mapType)
- iface.Set(out)
- } else {
- slicev := reflect.New(d.mapType).Elem()
- if !d.mappingSlice(n, slicev) {
- return false
- }
- out.Set(slicev)
- return true
- }
- default:
- d.terror(n, yaml_MAP_TAG, out)
- return false
- }
- outt := out.Type()
- kt := outt.Key()
- et := outt.Elem()
-
- mapType := d.mapType
- if outt.Key() == ifaceType && outt.Elem() == ifaceType {
- d.mapType = outt
- }
-
- if out.IsNil() {
- out.Set(reflect.MakeMap(outt))
- }
- l := len(n.children)
- for i := 0; i < l; i += 2 {
- if isMerge(n.children[i]) {
- d.merge(n.children[i+1], out)
- continue
- }
- k := reflect.New(kt).Elem()
- if d.unmarshal(n.children[i], k) {
- kkind := k.Kind()
- if kkind == reflect.Interface {
- kkind = k.Elem().Kind()
- }
- if kkind == reflect.Map || kkind == reflect.Slice {
- failf("invalid map key: %#v", k.Interface())
- }
- e := reflect.New(et).Elem()
- if d.unmarshal(n.children[i+1], e) {
- out.SetMapIndex(k, e)
- }
- }
- }
- d.mapType = mapType
- return true
-}
-
-func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) {
- outt := out.Type()
- if outt.Elem() != mapItemType {
- d.terror(n, yaml_MAP_TAG, out)
- return false
- }
-
- mapType := d.mapType
- d.mapType = outt
-
- var slice []MapItem
- var l = len(n.children)
- for i := 0; i < l; i += 2 {
- if isMerge(n.children[i]) {
- d.merge(n.children[i+1], out)
- continue
- }
- item := MapItem{}
- k := reflect.ValueOf(&item.Key).Elem()
- if d.unmarshal(n.children[i], k) {
- v := reflect.ValueOf(&item.Value).Elem()
- if d.unmarshal(n.children[i+1], v) {
- slice = append(slice, item)
- }
- }
- }
- out.Set(reflect.ValueOf(slice))
- d.mapType = mapType
- return true
-}
-
-func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) {
- sinfo, err := getStructInfo(out.Type())
- if err != nil {
- panic(err)
- }
- name := settableValueOf("")
- l := len(n.children)
-
- var inlineMap reflect.Value
- var elemType reflect.Type
- if sinfo.InlineMap != -1 {
- inlineMap = out.Field(sinfo.InlineMap)
- inlineMap.Set(reflect.New(inlineMap.Type()).Elem())
- elemType = inlineMap.Type().Elem()
- }
-
- for i := 0; i < l; i += 2 {
- ni := n.children[i]
- if isMerge(ni) {
- d.merge(n.children[i+1], out)
- continue
- }
- if !d.unmarshal(ni, name) {
- continue
- }
- if info, ok := sinfo.FieldsMap[name.String()]; ok {
- var field reflect.Value
- if info.Inline == nil {
- field = out.Field(info.Num)
- } else {
- field = out.FieldByIndex(info.Inline)
- }
- d.unmarshal(n.children[i+1], field)
- } else if sinfo.InlineMap != -1 {
- if inlineMap.IsNil() {
- inlineMap.Set(reflect.MakeMap(inlineMap.Type()))
- }
- value := reflect.New(elemType).Elem()
- d.unmarshal(n.children[i+1], value)
- inlineMap.SetMapIndex(name, value)
- }
- }
- return true
-}
-
-func failWantMap() {
- failf("map merge requires map or sequence of maps as the value")
-}
-
-func (d *decoder) merge(n *node, out reflect.Value) {
- switch n.kind {
- case mappingNode:
- d.unmarshal(n, out)
- case aliasNode:
- an, ok := d.doc.anchors[n.value]
- if ok && an.kind != mappingNode {
- failWantMap()
- }
- d.unmarshal(n, out)
- case sequenceNode:
- // Step backwards as earlier nodes take precedence.
- for i := len(n.children) - 1; i >= 0; i-- {
- ni := n.children[i]
- if ni.kind == aliasNode {
- an, ok := d.doc.anchors[ni.value]
- if ok && an.kind != mappingNode {
- failWantMap()
- }
- } else if ni.kind != mappingNode {
- failWantMap()
- }
- d.unmarshal(ni, out)
- }
- default:
- failWantMap()
- }
-}
-
-func isMerge(n *node) bool {
- return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG)
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/emitterc.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/emitterc.go
deleted file mode 100644
index 2befd553e..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/emitterc.go
+++ /dev/null
@@ -1,1685 +0,0 @@
-package yaml
-
-import (
- "bytes"
-)
-
-// Flush the buffer if needed.
-func flush(emitter *yaml_emitter_t) bool {
- if emitter.buffer_pos+5 >= len(emitter.buffer) {
- return yaml_emitter_flush(emitter)
- }
- return true
-}
-
-// Put a character to the output buffer.
-func put(emitter *yaml_emitter_t, value byte) bool {
- if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
- return false
- }
- emitter.buffer[emitter.buffer_pos] = value
- emitter.buffer_pos++
- emitter.column++
- return true
-}
-
-// Put a line break to the output buffer.
-func put_break(emitter *yaml_emitter_t) bool {
- if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
- return false
- }
- switch emitter.line_break {
- case yaml_CR_BREAK:
- emitter.buffer[emitter.buffer_pos] = '\r'
- emitter.buffer_pos += 1
- case yaml_LN_BREAK:
- emitter.buffer[emitter.buffer_pos] = '\n'
- emitter.buffer_pos += 1
- case yaml_CRLN_BREAK:
- emitter.buffer[emitter.buffer_pos+0] = '\r'
- emitter.buffer[emitter.buffer_pos+1] = '\n'
- emitter.buffer_pos += 2
- default:
- panic("unknown line break setting")
- }
- emitter.column = 0
- emitter.line++
- return true
-}
-
-// Copy a character from a string into buffer.
-func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
- if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
- return false
- }
- p := emitter.buffer_pos
- w := width(s[*i])
- switch w {
- case 4:
- emitter.buffer[p+3] = s[*i+3]
- fallthrough
- case 3:
- emitter.buffer[p+2] = s[*i+2]
- fallthrough
- case 2:
- emitter.buffer[p+1] = s[*i+1]
- fallthrough
- case 1:
- emitter.buffer[p+0] = s[*i+0]
- default:
- panic("unknown character width")
- }
- emitter.column++
- emitter.buffer_pos += w
- *i += w
- return true
-}
-
-// Write a whole string into buffer.
-func write_all(emitter *yaml_emitter_t, s []byte) bool {
- for i := 0; i < len(s); {
- if !write(emitter, s, &i) {
- return false
- }
- }
- return true
-}
-
-// Copy a line break character from a string into buffer.
-func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
- if s[*i] == '\n' {
- if !put_break(emitter) {
- return false
- }
- *i++
- } else {
- if !write(emitter, s, i) {
- return false
- }
- emitter.column = 0
- emitter.line++
- }
- return true
-}
-
-// Set an emitter error and return false.
-func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
- emitter.error = yaml_EMITTER_ERROR
- emitter.problem = problem
- return false
-}
-
-// Emit an event.
-func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- emitter.events = append(emitter.events, *event)
- for !yaml_emitter_need_more_events(emitter) {
- event := &emitter.events[emitter.events_head]
- if !yaml_emitter_analyze_event(emitter, event) {
- return false
- }
- if !yaml_emitter_state_machine(emitter, event) {
- return false
- }
- yaml_event_delete(event)
- emitter.events_head++
- }
- return true
-}
-
-// Check if we need to accumulate more events before emitting.
-//
-// We accumulate extra
-// - 1 event for DOCUMENT-START
-// - 2 events for SEQUENCE-START
-// - 3 events for MAPPING-START
-//
-func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
- if emitter.events_head == len(emitter.events) {
- return true
- }
- var accumulate int
- switch emitter.events[emitter.events_head].typ {
- case yaml_DOCUMENT_START_EVENT:
- accumulate = 1
- break
- case yaml_SEQUENCE_START_EVENT:
- accumulate = 2
- break
- case yaml_MAPPING_START_EVENT:
- accumulate = 3
- break
- default:
- return false
- }
- if len(emitter.events)-emitter.events_head > accumulate {
- return false
- }
- var level int
- for i := emitter.events_head; i < len(emitter.events); i++ {
- switch emitter.events[i].typ {
- case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
- level++
- case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
- level--
- }
- if level == 0 {
- return false
- }
- }
- return true
-}
-
-// Append a directive to the directives stack.
-func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
- for i := 0; i < len(emitter.tag_directives); i++ {
- if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
- if allow_duplicates {
- return true
- }
- return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
- }
- }
-
- // [Go] Do we actually need to copy this given garbage collection
- // and the lack of deallocating destructors?
- tag_copy := yaml_tag_directive_t{
- handle: make([]byte, len(value.handle)),
- prefix: make([]byte, len(value.prefix)),
- }
- copy(tag_copy.handle, value.handle)
- copy(tag_copy.prefix, value.prefix)
- emitter.tag_directives = append(emitter.tag_directives, tag_copy)
- return true
-}
-
-// Increase the indentation level.
-func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
- emitter.indents = append(emitter.indents, emitter.indent)
- if emitter.indent < 0 {
- if flow {
- emitter.indent = emitter.best_indent
- } else {
- emitter.indent = 0
- }
- } else if !indentless {
- emitter.indent += emitter.best_indent
- }
- return true
-}
-
-// State dispatcher.
-func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- switch emitter.state {
- default:
- case yaml_EMIT_STREAM_START_STATE:
- return yaml_emitter_emit_stream_start(emitter, event)
-
- case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
- return yaml_emitter_emit_document_start(emitter, event, true)
-
- case yaml_EMIT_DOCUMENT_START_STATE:
- return yaml_emitter_emit_document_start(emitter, event, false)
-
- case yaml_EMIT_DOCUMENT_CONTENT_STATE:
- return yaml_emitter_emit_document_content(emitter, event)
-
- case yaml_EMIT_DOCUMENT_END_STATE:
- return yaml_emitter_emit_document_end(emitter, event)
-
- case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
- return yaml_emitter_emit_flow_sequence_item(emitter, event, true)
-
- case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
- return yaml_emitter_emit_flow_sequence_item(emitter, event, false)
-
- case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
- return yaml_emitter_emit_flow_mapping_key(emitter, event, true)
-
- case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
- return yaml_emitter_emit_flow_mapping_key(emitter, event, false)
-
- case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
- return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
-
- case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
- return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
-
- case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
- return yaml_emitter_emit_block_sequence_item(emitter, event, true)
-
- case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
- return yaml_emitter_emit_block_sequence_item(emitter, event, false)
-
- case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
- return yaml_emitter_emit_block_mapping_key(emitter, event, true)
-
- case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
- return yaml_emitter_emit_block_mapping_key(emitter, event, false)
-
- case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
- return yaml_emitter_emit_block_mapping_value(emitter, event, true)
-
- case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
- return yaml_emitter_emit_block_mapping_value(emitter, event, false)
-
- case yaml_EMIT_END_STATE:
- return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
- }
- panic("invalid emitter state")
-}
-
-// Expect STREAM-START.
-func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- if event.typ != yaml_STREAM_START_EVENT {
- return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
- }
- if emitter.encoding == yaml_ANY_ENCODING {
- emitter.encoding = event.encoding
- if emitter.encoding == yaml_ANY_ENCODING {
- emitter.encoding = yaml_UTF8_ENCODING
- }
- }
- if emitter.best_indent < 2 || emitter.best_indent > 9 {
- emitter.best_indent = 2
- }
- if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
- emitter.best_width = 80
- }
- if emitter.best_width < 0 {
- emitter.best_width = 1<<31 - 1
- }
- if emitter.line_break == yaml_ANY_BREAK {
- emitter.line_break = yaml_LN_BREAK
- }
-
- emitter.indent = -1
- emitter.line = 0
- emitter.column = 0
- emitter.whitespace = true
- emitter.indention = true
-
- if emitter.encoding != yaml_UTF8_ENCODING {
- if !yaml_emitter_write_bom(emitter) {
- return false
- }
- }
- emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
- return true
-}
-
-// Expect DOCUMENT-START or STREAM-END.
-func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
-
- if event.typ == yaml_DOCUMENT_START_EVENT {
-
- if event.version_directive != nil {
- if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
- return false
- }
- }
-
- for i := 0; i < len(event.tag_directives); i++ {
- tag_directive := &event.tag_directives[i]
- if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
- return false
- }
- if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
- return false
- }
- }
-
- for i := 0; i < len(default_tag_directives); i++ {
- tag_directive := &default_tag_directives[i]
- if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
- return false
- }
- }
-
- implicit := event.implicit
- if !first || emitter.canonical {
- implicit = false
- }
-
- if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
- if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
- return false
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
-
- if event.version_directive != nil {
- implicit = false
- if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
- return false
- }
- if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
- return false
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
-
- if len(event.tag_directives) > 0 {
- implicit = false
- for i := 0; i < len(event.tag_directives); i++ {
- tag_directive := &event.tag_directives[i]
- if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
- return false
- }
- if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
- return false
- }
- if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
- return false
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- }
-
- if yaml_emitter_check_empty_document(emitter) {
- implicit = false
- }
- if !implicit {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
- return false
- }
- if emitter.canonical {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- }
-
- emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
- return true
- }
-
- if event.typ == yaml_STREAM_END_EVENT {
- if emitter.open_ended {
- if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
- return false
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- if !yaml_emitter_flush(emitter) {
- return false
- }
- emitter.state = yaml_EMIT_END_STATE
- return true
- }
-
- return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
-}
-
-// Expect the root node.
-func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
- return yaml_emitter_emit_node(emitter, event, true, false, false, false)
-}
-
-// Expect DOCUMENT-END.
-func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- if event.typ != yaml_DOCUMENT_END_EVENT {
- return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- if !event.implicit {
- // [Go] Allocate the slice elsewhere.
- if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
- return false
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- if !yaml_emitter_flush(emitter) {
- return false
- }
- emitter.state = yaml_EMIT_DOCUMENT_START_STATE
- emitter.tag_directives = emitter.tag_directives[:0]
- return true
-}
-
-// Expect a flow item node.
-func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
- if first {
- if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
- return false
- }
- if !yaml_emitter_increase_indent(emitter, true, false) {
- return false
- }
- emitter.flow_level++
- }
-
- if event.typ == yaml_SEQUENCE_END_EVENT {
- emitter.flow_level--
- emitter.indent = emitter.indents[len(emitter.indents)-1]
- emitter.indents = emitter.indents[:len(emitter.indents)-1]
- if emitter.canonical && !first {
- if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
- return false
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
- return false
- }
- emitter.state = emitter.states[len(emitter.states)-1]
- emitter.states = emitter.states[:len(emitter.states)-1]
-
- return true
- }
-
- if !first {
- if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
- return false
- }
- }
-
- if emitter.canonical || emitter.column > emitter.best_width {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
- return yaml_emitter_emit_node(emitter, event, false, true, false, false)
-}
-
-// Expect a flow key node.
-func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
- if first {
- if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
- return false
- }
- if !yaml_emitter_increase_indent(emitter, true, false) {
- return false
- }
- emitter.flow_level++
- }
-
- if event.typ == yaml_MAPPING_END_EVENT {
- emitter.flow_level--
- emitter.indent = emitter.indents[len(emitter.indents)-1]
- emitter.indents = emitter.indents[:len(emitter.indents)-1]
- if emitter.canonical && !first {
- if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
- return false
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
- return false
- }
- emitter.state = emitter.states[len(emitter.states)-1]
- emitter.states = emitter.states[:len(emitter.states)-1]
- return true
- }
-
- if !first {
- if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
- return false
- }
- }
- if emitter.canonical || emitter.column > emitter.best_width {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
-
- if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
- emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
- return yaml_emitter_emit_node(emitter, event, false, false, true, true)
- }
- if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
- return false
- }
- emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
- return yaml_emitter_emit_node(emitter, event, false, false, true, false)
-}
-
-// Expect a flow value node.
-func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
- if simple {
- if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
- return false
- }
- } else {
- if emitter.canonical || emitter.column > emitter.best_width {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
- return false
- }
- }
- emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
- return yaml_emitter_emit_node(emitter, event, false, false, true, false)
-}
-
-// Expect a block item node.
-func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
- if first {
- if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) {
- return false
- }
- }
- if event.typ == yaml_SEQUENCE_END_EVENT {
- emitter.indent = emitter.indents[len(emitter.indents)-1]
- emitter.indents = emitter.indents[:len(emitter.indents)-1]
- emitter.state = emitter.states[len(emitter.states)-1]
- emitter.states = emitter.states[:len(emitter.states)-1]
- return true
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
- return false
- }
- emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
- return yaml_emitter_emit_node(emitter, event, false, true, false, false)
-}
-
-// Expect a block key node.
-func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
- if first {
- if !yaml_emitter_increase_indent(emitter, false, false) {
- return false
- }
- }
- if event.typ == yaml_MAPPING_END_EVENT {
- emitter.indent = emitter.indents[len(emitter.indents)-1]
- emitter.indents = emitter.indents[:len(emitter.indents)-1]
- emitter.state = emitter.states[len(emitter.states)-1]
- emitter.states = emitter.states[:len(emitter.states)-1]
- return true
- }
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- if yaml_emitter_check_simple_key(emitter) {
- emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
- return yaml_emitter_emit_node(emitter, event, false, false, true, true)
- }
- if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
- return false
- }
- emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
- return yaml_emitter_emit_node(emitter, event, false, false, true, false)
-}
-
-// Expect a block value node.
-func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
- if simple {
- if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
- return false
- }
- } else {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
- return false
- }
- }
- emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
- return yaml_emitter_emit_node(emitter, event, false, false, true, false)
-}
-
-// Expect a node.
-func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
- root bool, sequence bool, mapping bool, simple_key bool) bool {
-
- emitter.root_context = root
- emitter.sequence_context = sequence
- emitter.mapping_context = mapping
- emitter.simple_key_context = simple_key
-
- switch event.typ {
- case yaml_ALIAS_EVENT:
- return yaml_emitter_emit_alias(emitter, event)
- case yaml_SCALAR_EVENT:
- return yaml_emitter_emit_scalar(emitter, event)
- case yaml_SEQUENCE_START_EVENT:
- return yaml_emitter_emit_sequence_start(emitter, event)
- case yaml_MAPPING_START_EVENT:
- return yaml_emitter_emit_mapping_start(emitter, event)
- default:
- return yaml_emitter_set_emitter_error(emitter,
- "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS")
- }
- return false
-}
-
-// Expect ALIAS.
-func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- if !yaml_emitter_process_anchor(emitter) {
- return false
- }
- emitter.state = emitter.states[len(emitter.states)-1]
- emitter.states = emitter.states[:len(emitter.states)-1]
- return true
-}
-
-// Expect SCALAR.
-func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- if !yaml_emitter_select_scalar_style(emitter, event) {
- return false
- }
- if !yaml_emitter_process_anchor(emitter) {
- return false
- }
- if !yaml_emitter_process_tag(emitter) {
- return false
- }
- if !yaml_emitter_increase_indent(emitter, true, false) {
- return false
- }
- if !yaml_emitter_process_scalar(emitter) {
- return false
- }
- emitter.indent = emitter.indents[len(emitter.indents)-1]
- emitter.indents = emitter.indents[:len(emitter.indents)-1]
- emitter.state = emitter.states[len(emitter.states)-1]
- emitter.states = emitter.states[:len(emitter.states)-1]
- return true
-}
-
-// Expect SEQUENCE-START.
-func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- if !yaml_emitter_process_anchor(emitter) {
- return false
- }
- if !yaml_emitter_process_tag(emitter) {
- return false
- }
- if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
- yaml_emitter_check_empty_sequence(emitter) {
- emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
- } else {
- emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
- }
- return true
-}
-
-// Expect MAPPING-START.
-func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
- if !yaml_emitter_process_anchor(emitter) {
- return false
- }
- if !yaml_emitter_process_tag(emitter) {
- return false
- }
- if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
- yaml_emitter_check_empty_mapping(emitter) {
- emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
- } else {
- emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
- }
- return true
-}
-
-// Check if the document content is an empty scalar.
-func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
- return false // [Go] Huh?
-}
-
-// Check if the next events represent an empty sequence.
-func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
- if len(emitter.events)-emitter.events_head < 2 {
- return false
- }
- return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
- emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
-}
-
-// Check if the next events represent an empty mapping.
-func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
- if len(emitter.events)-emitter.events_head < 2 {
- return false
- }
- return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
- emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
-}
-
-// Check if the next node can be expressed as a simple key.
-func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
- length := 0
- switch emitter.events[emitter.events_head].typ {
- case yaml_ALIAS_EVENT:
- length += len(emitter.anchor_data.anchor)
- case yaml_SCALAR_EVENT:
- if emitter.scalar_data.multiline {
- return false
- }
- length += len(emitter.anchor_data.anchor) +
- len(emitter.tag_data.handle) +
- len(emitter.tag_data.suffix) +
- len(emitter.scalar_data.value)
- case yaml_SEQUENCE_START_EVENT:
- if !yaml_emitter_check_empty_sequence(emitter) {
- return false
- }
- length += len(emitter.anchor_data.anchor) +
- len(emitter.tag_data.handle) +
- len(emitter.tag_data.suffix)
- case yaml_MAPPING_START_EVENT:
- if !yaml_emitter_check_empty_mapping(emitter) {
- return false
- }
- length += len(emitter.anchor_data.anchor) +
- len(emitter.tag_data.handle) +
- len(emitter.tag_data.suffix)
- default:
- return false
- }
- return length <= 128
-}
-
-// Determine an acceptable scalar style.
-func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
-
- no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
- if no_tag && !event.implicit && !event.quoted_implicit {
- return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
- }
-
- style := event.scalar_style()
- if style == yaml_ANY_SCALAR_STYLE {
- style = yaml_PLAIN_SCALAR_STYLE
- }
- if emitter.canonical {
- style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
- }
- if emitter.simple_key_context && emitter.scalar_data.multiline {
- style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
- }
-
- if style == yaml_PLAIN_SCALAR_STYLE {
- if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
- emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
- style = yaml_SINGLE_QUOTED_SCALAR_STYLE
- }
- if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
- style = yaml_SINGLE_QUOTED_SCALAR_STYLE
- }
- if no_tag && !event.implicit {
- style = yaml_SINGLE_QUOTED_SCALAR_STYLE
- }
- }
- if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
- if !emitter.scalar_data.single_quoted_allowed {
- style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
- }
- }
- if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
- if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
- style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
- }
- }
-
- if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
- emitter.tag_data.handle = []byte{'!'}
- }
- emitter.scalar_data.style = style
- return true
-}
-
-// Write an achor.
-func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
- if emitter.anchor_data.anchor == nil {
- return true
- }
- c := []byte{'&'}
- if emitter.anchor_data.alias {
- c[0] = '*'
- }
- if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
- return false
- }
- return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
-}
-
-// Write a tag.
-func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
- if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
- return true
- }
- if len(emitter.tag_data.handle) > 0 {
- if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
- return false
- }
- if len(emitter.tag_data.suffix) > 0 {
- if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
- return false
- }
- }
- } else {
- // [Go] Allocate these slices elsewhere.
- if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
- return false
- }
- if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
- return false
- }
- if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
- return false
- }
- }
- return true
-}
-
-// Write a scalar.
-func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
- switch emitter.scalar_data.style {
- case yaml_PLAIN_SCALAR_STYLE:
- return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
-
- case yaml_SINGLE_QUOTED_SCALAR_STYLE:
- return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
-
- case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
- return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
-
- case yaml_LITERAL_SCALAR_STYLE:
- return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
-
- case yaml_FOLDED_SCALAR_STYLE:
- return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
- }
- panic("unknown scalar style")
-}
-
-// Check if a %YAML directive is valid.
-func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
- if version_directive.major != 1 || version_directive.minor != 1 {
- return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
- }
- return true
-}
-
-// Check if a %TAG directive is valid.
-func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
- handle := tag_directive.handle
- prefix := tag_directive.prefix
- if len(handle) == 0 {
- return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
- }
- if handle[0] != '!' {
- return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
- }
- if handle[len(handle)-1] != '!' {
- return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
- }
- for i := 1; i < len(handle)-1; i += width(handle[i]) {
- if !is_alpha(handle, i) {
- return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
- }
- }
- if len(prefix) == 0 {
- return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
- }
- return true
-}
-
-// Check if an anchor is valid.
-func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
- if len(anchor) == 0 {
- problem := "anchor value must not be empty"
- if alias {
- problem = "alias value must not be empty"
- }
- return yaml_emitter_set_emitter_error(emitter, problem)
- }
- for i := 0; i < len(anchor); i += width(anchor[i]) {
- if !is_alpha(anchor, i) {
- problem := "anchor value must contain alphanumerical characters only"
- if alias {
- problem = "alias value must contain alphanumerical characters only"
- }
- return yaml_emitter_set_emitter_error(emitter, problem)
- }
- }
- emitter.anchor_data.anchor = anchor
- emitter.anchor_data.alias = alias
- return true
-}
-
-// Check if a tag is valid.
-func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
- if len(tag) == 0 {
- return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
- }
- for i := 0; i < len(emitter.tag_directives); i++ {
- tag_directive := &emitter.tag_directives[i]
- if bytes.HasPrefix(tag, tag_directive.prefix) {
- emitter.tag_data.handle = tag_directive.handle
- emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
- return true
- }
- }
- emitter.tag_data.suffix = tag
- return true
-}
-
-// Check if a scalar is valid.
-func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
- var (
- block_indicators = false
- flow_indicators = false
- line_breaks = false
- special_characters = false
-
- leading_space = false
- leading_break = false
- trailing_space = false
- trailing_break = false
- break_space = false
- space_break = false
-
- preceeded_by_whitespace = false
- followed_by_whitespace = false
- previous_space = false
- previous_break = false
- )
-
- emitter.scalar_data.value = value
-
- if len(value) == 0 {
- emitter.scalar_data.multiline = false
- emitter.scalar_data.flow_plain_allowed = false
- emitter.scalar_data.block_plain_allowed = true
- emitter.scalar_data.single_quoted_allowed = true
- emitter.scalar_data.block_allowed = false
- return true
- }
-
- if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
- block_indicators = true
- flow_indicators = true
- }
-
- preceeded_by_whitespace = true
- for i, w := 0, 0; i < len(value); i += w {
- w = width(value[i])
- followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
-
- if i == 0 {
- switch value[i] {
- case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
- flow_indicators = true
- block_indicators = true
- case '?', ':':
- flow_indicators = true
- if followed_by_whitespace {
- block_indicators = true
- }
- case '-':
- if followed_by_whitespace {
- flow_indicators = true
- block_indicators = true
- }
- }
- } else {
- switch value[i] {
- case ',', '?', '[', ']', '{', '}':
- flow_indicators = true
- case ':':
- flow_indicators = true
- if followed_by_whitespace {
- block_indicators = true
- }
- case '#':
- if preceeded_by_whitespace {
- flow_indicators = true
- block_indicators = true
- }
- }
- }
-
- if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
- special_characters = true
- }
- if is_space(value, i) {
- if i == 0 {
- leading_space = true
- }
- if i+width(value[i]) == len(value) {
- trailing_space = true
- }
- if previous_break {
- break_space = true
- }
- previous_space = true
- previous_break = false
- } else if is_break(value, i) {
- line_breaks = true
- if i == 0 {
- leading_break = true
- }
- if i+width(value[i]) == len(value) {
- trailing_break = true
- }
- if previous_space {
- space_break = true
- }
- previous_space = false
- previous_break = true
- } else {
- previous_space = false
- previous_break = false
- }
-
- // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
- preceeded_by_whitespace = is_blankz(value, i)
- }
-
- emitter.scalar_data.multiline = line_breaks
- emitter.scalar_data.flow_plain_allowed = true
- emitter.scalar_data.block_plain_allowed = true
- emitter.scalar_data.single_quoted_allowed = true
- emitter.scalar_data.block_allowed = true
-
- if leading_space || leading_break || trailing_space || trailing_break {
- emitter.scalar_data.flow_plain_allowed = false
- emitter.scalar_data.block_plain_allowed = false
- }
- if trailing_space {
- emitter.scalar_data.block_allowed = false
- }
- if break_space {
- emitter.scalar_data.flow_plain_allowed = false
- emitter.scalar_data.block_plain_allowed = false
- emitter.scalar_data.single_quoted_allowed = false
- }
- if space_break || special_characters {
- emitter.scalar_data.flow_plain_allowed = false
- emitter.scalar_data.block_plain_allowed = false
- emitter.scalar_data.single_quoted_allowed = false
- emitter.scalar_data.block_allowed = false
- }
- if line_breaks {
- emitter.scalar_data.flow_plain_allowed = false
- emitter.scalar_data.block_plain_allowed = false
- }
- if flow_indicators {
- emitter.scalar_data.flow_plain_allowed = false
- }
- if block_indicators {
- emitter.scalar_data.block_plain_allowed = false
- }
- return true
-}
-
-// Check if the event data is valid.
-func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
-
- emitter.anchor_data.anchor = nil
- emitter.tag_data.handle = nil
- emitter.tag_data.suffix = nil
- emitter.scalar_data.value = nil
-
- switch event.typ {
- case yaml_ALIAS_EVENT:
- if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
- return false
- }
-
- case yaml_SCALAR_EVENT:
- if len(event.anchor) > 0 {
- if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
- return false
- }
- }
- if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
- if !yaml_emitter_analyze_tag(emitter, event.tag) {
- return false
- }
- }
- if !yaml_emitter_analyze_scalar(emitter, event.value) {
- return false
- }
-
- case yaml_SEQUENCE_START_EVENT:
- if len(event.anchor) > 0 {
- if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
- return false
- }
- }
- if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
- if !yaml_emitter_analyze_tag(emitter, event.tag) {
- return false
- }
- }
-
- case yaml_MAPPING_START_EVENT:
- if len(event.anchor) > 0 {
- if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
- return false
- }
- }
- if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
- if !yaml_emitter_analyze_tag(emitter, event.tag) {
- return false
- }
- }
- }
- return true
-}
-
-// Write the BOM character.
-func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
- if !flush(emitter) {
- return false
- }
- pos := emitter.buffer_pos
- emitter.buffer[pos+0] = '\xEF'
- emitter.buffer[pos+1] = '\xBB'
- emitter.buffer[pos+2] = '\xBF'
- emitter.buffer_pos += 3
- return true
-}
-
-func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
- indent := emitter.indent
- if indent < 0 {
- indent = 0
- }
- if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
- if !put_break(emitter) {
- return false
- }
- }
- for emitter.column < indent {
- if !put(emitter, ' ') {
- return false
- }
- }
- emitter.whitespace = true
- emitter.indention = true
- return true
-}
-
-func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
- if need_whitespace && !emitter.whitespace {
- if !put(emitter, ' ') {
- return false
- }
- }
- if !write_all(emitter, indicator) {
- return false
- }
- emitter.whitespace = is_whitespace
- emitter.indention = (emitter.indention && is_indention)
- emitter.open_ended = false
- return true
-}
-
-func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
- if !write_all(emitter, value) {
- return false
- }
- emitter.whitespace = false
- emitter.indention = false
- return true
-}
-
-func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
- if !emitter.whitespace {
- if !put(emitter, ' ') {
- return false
- }
- }
- if !write_all(emitter, value) {
- return false
- }
- emitter.whitespace = false
- emitter.indention = false
- return true
-}
-
-func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
- if need_whitespace && !emitter.whitespace {
- if !put(emitter, ' ') {
- return false
- }
- }
- for i := 0; i < len(value); {
- var must_write bool
- switch value[i] {
- case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
- must_write = true
- default:
- must_write = is_alpha(value, i)
- }
- if must_write {
- if !write(emitter, value, &i) {
- return false
- }
- } else {
- w := width(value[i])
- for k := 0; k < w; k++ {
- octet := value[i]
- i++
- if !put(emitter, '%') {
- return false
- }
-
- c := octet >> 4
- if c < 10 {
- c += '0'
- } else {
- c += 'A' - 10
- }
- if !put(emitter, c) {
- return false
- }
-
- c = octet & 0x0f
- if c < 10 {
- c += '0'
- } else {
- c += 'A' - 10
- }
- if !put(emitter, c) {
- return false
- }
- }
- }
- }
- emitter.whitespace = false
- emitter.indention = false
- return true
-}
-
-func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
- if !emitter.whitespace {
- if !put(emitter, ' ') {
- return false
- }
- }
-
- spaces := false
- breaks := false
- for i := 0; i < len(value); {
- if is_space(value, i) {
- if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- i += width(value[i])
- } else {
- if !write(emitter, value, &i) {
- return false
- }
- }
- spaces = true
- } else if is_break(value, i) {
- if !breaks && value[i] == '\n' {
- if !put_break(emitter) {
- return false
- }
- }
- if !write_break(emitter, value, &i) {
- return false
- }
- emitter.indention = true
- breaks = true
- } else {
- if breaks {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- if !write(emitter, value, &i) {
- return false
- }
- emitter.indention = false
- spaces = false
- breaks = false
- }
- }
-
- emitter.whitespace = false
- emitter.indention = false
- if emitter.root_context {
- emitter.open_ended = true
- }
-
- return true
-}
-
-func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
-
- if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
- return false
- }
-
- spaces := false
- breaks := false
- for i := 0; i < len(value); {
- if is_space(value, i) {
- if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- i += width(value[i])
- } else {
- if !write(emitter, value, &i) {
- return false
- }
- }
- spaces = true
- } else if is_break(value, i) {
- if !breaks && value[i] == '\n' {
- if !put_break(emitter) {
- return false
- }
- }
- if !write_break(emitter, value, &i) {
- return false
- }
- emitter.indention = true
- breaks = true
- } else {
- if breaks {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- if value[i] == '\'' {
- if !put(emitter, '\'') {
- return false
- }
- }
- if !write(emitter, value, &i) {
- return false
- }
- emitter.indention = false
- spaces = false
- breaks = false
- }
- }
- if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
- return false
- }
- emitter.whitespace = false
- emitter.indention = false
- return true
-}
-
-func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
- spaces := false
- if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
- return false
- }
-
- for i := 0; i < len(value); {
- if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
- is_bom(value, i) || is_break(value, i) ||
- value[i] == '"' || value[i] == '\\' {
-
- octet := value[i]
-
- var w int
- var v rune
- switch {
- case octet&0x80 == 0x00:
- w, v = 1, rune(octet&0x7F)
- case octet&0xE0 == 0xC0:
- w, v = 2, rune(octet&0x1F)
- case octet&0xF0 == 0xE0:
- w, v = 3, rune(octet&0x0F)
- case octet&0xF8 == 0xF0:
- w, v = 4, rune(octet&0x07)
- }
- for k := 1; k < w; k++ {
- octet = value[i+k]
- v = (v << 6) + (rune(octet) & 0x3F)
- }
- i += w
-
- if !put(emitter, '\\') {
- return false
- }
-
- var ok bool
- switch v {
- case 0x00:
- ok = put(emitter, '0')
- case 0x07:
- ok = put(emitter, 'a')
- case 0x08:
- ok = put(emitter, 'b')
- case 0x09:
- ok = put(emitter, 't')
- case 0x0A:
- ok = put(emitter, 'n')
- case 0x0b:
- ok = put(emitter, 'v')
- case 0x0c:
- ok = put(emitter, 'f')
- case 0x0d:
- ok = put(emitter, 'r')
- case 0x1b:
- ok = put(emitter, 'e')
- case 0x22:
- ok = put(emitter, '"')
- case 0x5c:
- ok = put(emitter, '\\')
- case 0x85:
- ok = put(emitter, 'N')
- case 0xA0:
- ok = put(emitter, '_')
- case 0x2028:
- ok = put(emitter, 'L')
- case 0x2029:
- ok = put(emitter, 'P')
- default:
- if v <= 0xFF {
- ok = put(emitter, 'x')
- w = 2
- } else if v <= 0xFFFF {
- ok = put(emitter, 'u')
- w = 4
- } else {
- ok = put(emitter, 'U')
- w = 8
- }
- for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
- digit := byte((v >> uint(k)) & 0x0F)
- if digit < 10 {
- ok = put(emitter, digit+'0')
- } else {
- ok = put(emitter, digit+'A'-10)
- }
- }
- }
- if !ok {
- return false
- }
- spaces = false
- } else if is_space(value, i) {
- if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- if is_space(value, i+1) {
- if !put(emitter, '\\') {
- return false
- }
- }
- i += width(value[i])
- } else if !write(emitter, value, &i) {
- return false
- }
- spaces = true
- } else {
- if !write(emitter, value, &i) {
- return false
- }
- spaces = false
- }
- }
- if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
- return false
- }
- emitter.whitespace = false
- emitter.indention = false
- return true
-}
-
-func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
- if is_space(value, 0) || is_break(value, 0) {
- indent_hint := []byte{'0' + byte(emitter.best_indent)}
- if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
- return false
- }
- }
-
- emitter.open_ended = false
-
- var chomp_hint [1]byte
- if len(value) == 0 {
- chomp_hint[0] = '-'
- } else {
- i := len(value) - 1
- for value[i]&0xC0 == 0x80 {
- i--
- }
- if !is_break(value, i) {
- chomp_hint[0] = '-'
- } else if i == 0 {
- chomp_hint[0] = '+'
- emitter.open_ended = true
- } else {
- i--
- for value[i]&0xC0 == 0x80 {
- i--
- }
- if is_break(value, i) {
- chomp_hint[0] = '+'
- emitter.open_ended = true
- }
- }
- }
- if chomp_hint[0] != 0 {
- if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
- return false
- }
- }
- return true
-}
-
-func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
- if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
- return false
- }
- if !yaml_emitter_write_block_scalar_hints(emitter, value) {
- return false
- }
- if !put_break(emitter) {
- return false
- }
- emitter.indention = true
- emitter.whitespace = true
- breaks := true
- for i := 0; i < len(value); {
- if is_break(value, i) {
- if !write_break(emitter, value, &i) {
- return false
- }
- emitter.indention = true
- breaks = true
- } else {
- if breaks {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- }
- if !write(emitter, value, &i) {
- return false
- }
- emitter.indention = false
- breaks = false
- }
- }
-
- return true
-}
-
-func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
- if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
- return false
- }
- if !yaml_emitter_write_block_scalar_hints(emitter, value) {
- return false
- }
-
- if !put_break(emitter) {
- return false
- }
- emitter.indention = true
- emitter.whitespace = true
-
- breaks := true
- leading_spaces := true
- for i := 0; i < len(value); {
- if is_break(value, i) {
- if !breaks && !leading_spaces && value[i] == '\n' {
- k := 0
- for is_break(value, k) {
- k += width(value[k])
- }
- if !is_blankz(value, k) {
- if !put_break(emitter) {
- return false
- }
- }
- }
- if !write_break(emitter, value, &i) {
- return false
- }
- emitter.indention = true
- breaks = true
- } else {
- if breaks {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- leading_spaces = is_blank(value, i)
- }
- if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
- if !yaml_emitter_write_indent(emitter) {
- return false
- }
- i += width(value[i])
- } else {
- if !write(emitter, value, &i) {
- return false
- }
- }
- emitter.indention = false
- breaks = false
- }
- }
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/encode.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/encode.go
deleted file mode 100644
index 84f849955..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/encode.go
+++ /dev/null
@@ -1,306 +0,0 @@
-package yaml
-
-import (
- "encoding"
- "fmt"
- "reflect"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "time"
-)
-
-type encoder struct {
- emitter yaml_emitter_t
- event yaml_event_t
- out []byte
- flow bool
-}
-
-func newEncoder() (e *encoder) {
- e = &encoder{}
- e.must(yaml_emitter_initialize(&e.emitter))
- yaml_emitter_set_output_string(&e.emitter, &e.out)
- yaml_emitter_set_unicode(&e.emitter, true)
- e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING))
- e.emit()
- e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true))
- e.emit()
- return e
-}
-
-func (e *encoder) finish() {
- e.must(yaml_document_end_event_initialize(&e.event, true))
- e.emit()
- e.emitter.open_ended = false
- e.must(yaml_stream_end_event_initialize(&e.event))
- e.emit()
-}
-
-func (e *encoder) destroy() {
- yaml_emitter_delete(&e.emitter)
-}
-
-func (e *encoder) emit() {
- // This will internally delete the e.event value.
- if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT {
- e.must(false)
- }
-}
-
-func (e *encoder) must(ok bool) {
- if !ok {
- msg := e.emitter.problem
- if msg == "" {
- msg = "unknown problem generating YAML content"
- }
- failf("%s", msg)
- }
-}
-
-func (e *encoder) marshal(tag string, in reflect.Value) {
- if !in.IsValid() {
- e.nilv()
- return
- }
- iface := in.Interface()
- if m, ok := iface.(Marshaler); ok {
- v, err := m.MarshalYAML()
- if err != nil {
- fail(err)
- }
- if v == nil {
- e.nilv()
- return
- }
- in = reflect.ValueOf(v)
- } else if m, ok := iface.(encoding.TextMarshaler); ok {
- text, err := m.MarshalText()
- if err != nil {
- fail(err)
- }
- in = reflect.ValueOf(string(text))
- }
- switch in.Kind() {
- case reflect.Interface:
- if in.IsNil() {
- e.nilv()
- } else {
- e.marshal(tag, in.Elem())
- }
- case reflect.Map:
- e.mapv(tag, in)
- case reflect.Ptr:
- if in.IsNil() {
- e.nilv()
- } else {
- e.marshal(tag, in.Elem())
- }
- case reflect.Struct:
- e.structv(tag, in)
- case reflect.Slice:
- if in.Type().Elem() == mapItemType {
- e.itemsv(tag, in)
- } else {
- e.slicev(tag, in)
- }
- case reflect.String:
- e.stringv(tag, in)
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- if in.Type() == durationType {
- e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String()))
- } else {
- e.intv(tag, in)
- }
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- e.uintv(tag, in)
- case reflect.Float32, reflect.Float64:
- e.floatv(tag, in)
- case reflect.Bool:
- e.boolv(tag, in)
- default:
- panic("cannot marshal type: " + in.Type().String())
- }
-}
-
-func (e *encoder) mapv(tag string, in reflect.Value) {
- e.mappingv(tag, func() {
- keys := keyList(in.MapKeys())
- sort.Sort(keys)
- for _, k := range keys {
- e.marshal("", k)
- e.marshal("", in.MapIndex(k))
- }
- })
-}
-
-func (e *encoder) itemsv(tag string, in reflect.Value) {
- e.mappingv(tag, func() {
- slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem)
- for _, item := range slice {
- e.marshal("", reflect.ValueOf(item.Key))
- e.marshal("", reflect.ValueOf(item.Value))
- }
- })
-}
-
-func (e *encoder) structv(tag string, in reflect.Value) {
- sinfo, err := getStructInfo(in.Type())
- if err != nil {
- panic(err)
- }
- e.mappingv(tag, func() {
- for _, info := range sinfo.FieldsList {
- var value reflect.Value
- if info.Inline == nil {
- value = in.Field(info.Num)
- } else {
- value = in.FieldByIndex(info.Inline)
- }
- if info.OmitEmpty && isZero(value) {
- continue
- }
- e.marshal("", reflect.ValueOf(info.Key))
- e.flow = info.Flow
- e.marshal("", value)
- }
- if sinfo.InlineMap >= 0 {
- m := in.Field(sinfo.InlineMap)
- if m.Len() > 0 {
- e.flow = false
- keys := keyList(m.MapKeys())
- sort.Sort(keys)
- for _, k := range keys {
- if _, found := sinfo.FieldsMap[k.String()]; found {
- panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String()))
- }
- e.marshal("", k)
- e.flow = false
- e.marshal("", m.MapIndex(k))
- }
- }
- }
- })
-}
-
-func (e *encoder) mappingv(tag string, f func()) {
- implicit := tag == ""
- style := yaml_BLOCK_MAPPING_STYLE
- if e.flow {
- e.flow = false
- style = yaml_FLOW_MAPPING_STYLE
- }
- e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
- e.emit()
- f()
- e.must(yaml_mapping_end_event_initialize(&e.event))
- e.emit()
-}
-
-func (e *encoder) slicev(tag string, in reflect.Value) {
- implicit := tag == ""
- style := yaml_BLOCK_SEQUENCE_STYLE
- if e.flow {
- e.flow = false
- style = yaml_FLOW_SEQUENCE_STYLE
- }
- e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
- e.emit()
- n := in.Len()
- for i := 0; i < n; i++ {
- e.marshal("", in.Index(i))
- }
- e.must(yaml_sequence_end_event_initialize(&e.event))
- e.emit()
-}
-
-// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1.
-//
-// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported
-// in YAML 1.2 and by this package, but these should be marshalled quoted for
-// the time being for compatibility with other parsers.
-func isBase60Float(s string) (result bool) {
- // Fast path.
- if s == "" {
- return false
- }
- c := s[0]
- if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 {
- return false
- }
- // Do the full match.
- return base60float.MatchString(s)
-}
-
-// From http://yaml.org/type/float.html, except the regular expression there
-// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix.
-var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`)
-
-func (e *encoder) stringv(tag string, in reflect.Value) {
- var style yaml_scalar_style_t
- s := in.String()
- rtag, rs := resolve("", s)
- if rtag == yaml_BINARY_TAG {
- if tag == "" || tag == yaml_STR_TAG {
- tag = rtag
- s = rs.(string)
- } else if tag == yaml_BINARY_TAG {
- failf("explicitly tagged !!binary data must be base64-encoded")
- } else {
- failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag))
- }
- }
- if tag == "" && (rtag != yaml_STR_TAG || isBase60Float(s)) {
- style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
- } else if strings.Contains(s, "\n") {
- style = yaml_LITERAL_SCALAR_STYLE
- } else {
- style = yaml_PLAIN_SCALAR_STYLE
- }
- e.emitScalar(s, "", tag, style)
-}
-
-func (e *encoder) boolv(tag string, in reflect.Value) {
- var s string
- if in.Bool() {
- s = "true"
- } else {
- s = "false"
- }
- e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
-}
-
-func (e *encoder) intv(tag string, in reflect.Value) {
- s := strconv.FormatInt(in.Int(), 10)
- e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
-}
-
-func (e *encoder) uintv(tag string, in reflect.Value) {
- s := strconv.FormatUint(in.Uint(), 10)
- e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
-}
-
-func (e *encoder) floatv(tag string, in reflect.Value) {
- // FIXME: Handle 64 bits here.
- s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32)
- switch s {
- case "+Inf":
- s = ".inf"
- case "-Inf":
- s = "-.inf"
- case "NaN":
- s = ".nan"
- }
- e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
-}
-
-func (e *encoder) nilv() {
- e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE)
-}
-
-func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) {
- implicit := tag == ""
- e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style))
- e.emit()
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/parserc.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/parserc.go
deleted file mode 100644
index 0a7037ad1..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/parserc.go
+++ /dev/null
@@ -1,1096 +0,0 @@
-package yaml
-
-import (
- "bytes"
-)
-
-// The parser implements the following grammar:
-//
-// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
-// implicit_document ::= block_node DOCUMENT-END*
-// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
-// block_node_or_indentless_sequence ::=
-// ALIAS
-// | properties (block_content | indentless_block_sequence)?
-// | block_content
-// | indentless_block_sequence
-// block_node ::= ALIAS
-// | properties block_content?
-// | block_content
-// flow_node ::= ALIAS
-// | properties flow_content?
-// | flow_content
-// properties ::= TAG ANCHOR? | ANCHOR TAG?
-// block_content ::= block_collection | flow_collection | SCALAR
-// flow_content ::= flow_collection | SCALAR
-// block_collection ::= block_sequence | block_mapping
-// flow_collection ::= flow_sequence | flow_mapping
-// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
-// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
-// block_mapping ::= BLOCK-MAPPING_START
-// ((KEY block_node_or_indentless_sequence?)?
-// (VALUE block_node_or_indentless_sequence?)?)*
-// BLOCK-END
-// flow_sequence ::= FLOW-SEQUENCE-START
-// (flow_sequence_entry FLOW-ENTRY)*
-// flow_sequence_entry?
-// FLOW-SEQUENCE-END
-// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// flow_mapping ::= FLOW-MAPPING-START
-// (flow_mapping_entry FLOW-ENTRY)*
-// flow_mapping_entry?
-// FLOW-MAPPING-END
-// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-
-// Peek the next token in the token queue.
-func peek_token(parser *yaml_parser_t) *yaml_token_t {
- if parser.token_available || yaml_parser_fetch_more_tokens(parser) {
- return &parser.tokens[parser.tokens_head]
- }
- return nil
-}
-
-// Remove the next token from the queue (must be called after peek_token).
-func skip_token(parser *yaml_parser_t) {
- parser.token_available = false
- parser.tokens_parsed++
- parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN
- parser.tokens_head++
-}
-
-// Get the next event.
-func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool {
- // Erase the event object.
- *event = yaml_event_t{}
-
- // No events after the end of the stream or error.
- if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE {
- return true
- }
-
- // Generate the next event.
- return yaml_parser_state_machine(parser, event)
-}
-
-// Set parser error.
-func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool {
- parser.error = yaml_PARSER_ERROR
- parser.problem = problem
- parser.problem_mark = problem_mark
- return false
-}
-
-func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool {
- parser.error = yaml_PARSER_ERROR
- parser.context = context
- parser.context_mark = context_mark
- parser.problem = problem
- parser.problem_mark = problem_mark
- return false
-}
-
-// State dispatcher.
-func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool {
- //trace("yaml_parser_state_machine", "state:", parser.state.String())
-
- switch parser.state {
- case yaml_PARSE_STREAM_START_STATE:
- return yaml_parser_parse_stream_start(parser, event)
-
- case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
- return yaml_parser_parse_document_start(parser, event, true)
-
- case yaml_PARSE_DOCUMENT_START_STATE:
- return yaml_parser_parse_document_start(parser, event, false)
-
- case yaml_PARSE_DOCUMENT_CONTENT_STATE:
- return yaml_parser_parse_document_content(parser, event)
-
- case yaml_PARSE_DOCUMENT_END_STATE:
- return yaml_parser_parse_document_end(parser, event)
-
- case yaml_PARSE_BLOCK_NODE_STATE:
- return yaml_parser_parse_node(parser, event, true, false)
-
- case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
- return yaml_parser_parse_node(parser, event, true, true)
-
- case yaml_PARSE_FLOW_NODE_STATE:
- return yaml_parser_parse_node(parser, event, false, false)
-
- case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
- return yaml_parser_parse_block_sequence_entry(parser, event, true)
-
- case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
- return yaml_parser_parse_block_sequence_entry(parser, event, false)
-
- case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
- return yaml_parser_parse_indentless_sequence_entry(parser, event)
-
- case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
- return yaml_parser_parse_block_mapping_key(parser, event, true)
-
- case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
- return yaml_parser_parse_block_mapping_key(parser, event, false)
-
- case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
- return yaml_parser_parse_block_mapping_value(parser, event)
-
- case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
- return yaml_parser_parse_flow_sequence_entry(parser, event, true)
-
- case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
- return yaml_parser_parse_flow_sequence_entry(parser, event, false)
-
- case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
- return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event)
-
- case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
- return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event)
-
- case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
- return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event)
-
- case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
- return yaml_parser_parse_flow_mapping_key(parser, event, true)
-
- case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
- return yaml_parser_parse_flow_mapping_key(parser, event, false)
-
- case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
- return yaml_parser_parse_flow_mapping_value(parser, event, false)
-
- case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
- return yaml_parser_parse_flow_mapping_value(parser, event, true)
-
- default:
- panic("invalid parser state")
- }
- return false
-}
-
-// Parse the production:
-// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
-// ************
-func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_STREAM_START_TOKEN {
- return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark)
- }
- parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE
- *event = yaml_event_t{
- typ: yaml_STREAM_START_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- encoding: token.encoding,
- }
- skip_token(parser)
- return true
-}
-
-// Parse the productions:
-// implicit_document ::= block_node DOCUMENT-END*
-// *
-// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
-// *************************
-func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool {
-
- token := peek_token(parser)
- if token == nil {
- return false
- }
-
- // Parse extra document end indicators.
- if !implicit {
- for token.typ == yaml_DOCUMENT_END_TOKEN {
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- }
- }
-
- if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN &&
- token.typ != yaml_TAG_DIRECTIVE_TOKEN &&
- token.typ != yaml_DOCUMENT_START_TOKEN &&
- token.typ != yaml_STREAM_END_TOKEN {
- // Parse an implicit document.
- if !yaml_parser_process_directives(parser, nil, nil) {
- return false
- }
- parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
- parser.state = yaml_PARSE_BLOCK_NODE_STATE
-
- *event = yaml_event_t{
- typ: yaml_DOCUMENT_START_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- }
-
- } else if token.typ != yaml_STREAM_END_TOKEN {
- // Parse an explicit document.
- var version_directive *yaml_version_directive_t
- var tag_directives []yaml_tag_directive_t
- start_mark := token.start_mark
- if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) {
- return false
- }
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_DOCUMENT_START_TOKEN {
- yaml_parser_set_parser_error(parser,
- "did not find expected ", token.start_mark)
- return false
- }
- parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
- parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE
- end_mark := token.end_mark
-
- *event = yaml_event_t{
- typ: yaml_DOCUMENT_START_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- version_directive: version_directive,
- tag_directives: tag_directives,
- implicit: false,
- }
- skip_token(parser)
-
- } else {
- // Parse the stream end.
- parser.state = yaml_PARSE_END_STATE
- *event = yaml_event_t{
- typ: yaml_STREAM_END_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- }
- skip_token(parser)
- }
-
- return true
-}
-
-// Parse the productions:
-// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
-// ***********
-//
-func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ == yaml_VERSION_DIRECTIVE_TOKEN ||
- token.typ == yaml_TAG_DIRECTIVE_TOKEN ||
- token.typ == yaml_DOCUMENT_START_TOKEN ||
- token.typ == yaml_DOCUMENT_END_TOKEN ||
- token.typ == yaml_STREAM_END_TOKEN {
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
- return yaml_parser_process_empty_scalar(parser, event,
- token.start_mark)
- }
- return yaml_parser_parse_node(parser, event, true, false)
-}
-
-// Parse the productions:
-// implicit_document ::= block_node DOCUMENT-END*
-// *************
-// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
-//
-func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
-
- start_mark := token.start_mark
- end_mark := token.start_mark
-
- implicit := true
- if token.typ == yaml_DOCUMENT_END_TOKEN {
- end_mark = token.end_mark
- skip_token(parser)
- implicit = false
- }
-
- parser.tag_directives = parser.tag_directives[:0]
-
- parser.state = yaml_PARSE_DOCUMENT_START_STATE
- *event = yaml_event_t{
- typ: yaml_DOCUMENT_END_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- implicit: implicit,
- }
- return true
-}
-
-// Parse the productions:
-// block_node_or_indentless_sequence ::=
-// ALIAS
-// *****
-// | properties (block_content | indentless_block_sequence)?
-// ********** *
-// | block_content | indentless_block_sequence
-// *
-// block_node ::= ALIAS
-// *****
-// | properties block_content?
-// ********** *
-// | block_content
-// *
-// flow_node ::= ALIAS
-// *****
-// | properties flow_content?
-// ********** *
-// | flow_content
-// *
-// properties ::= TAG ANCHOR? | ANCHOR TAG?
-// *************************
-// block_content ::= block_collection | flow_collection | SCALAR
-// ******
-// flow_content ::= flow_collection | SCALAR
-// ******
-func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool {
- //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
-
- token := peek_token(parser)
- if token == nil {
- return false
- }
-
- if token.typ == yaml_ALIAS_TOKEN {
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
- *event = yaml_event_t{
- typ: yaml_ALIAS_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- anchor: token.value,
- }
- skip_token(parser)
- return true
- }
-
- start_mark := token.start_mark
- end_mark := token.start_mark
-
- var tag_token bool
- var tag_handle, tag_suffix, anchor []byte
- var tag_mark yaml_mark_t
- if token.typ == yaml_ANCHOR_TOKEN {
- anchor = token.value
- start_mark = token.start_mark
- end_mark = token.end_mark
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ == yaml_TAG_TOKEN {
- tag_token = true
- tag_handle = token.value
- tag_suffix = token.suffix
- tag_mark = token.start_mark
- end_mark = token.end_mark
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- }
- } else if token.typ == yaml_TAG_TOKEN {
- tag_token = true
- tag_handle = token.value
- tag_suffix = token.suffix
- start_mark = token.start_mark
- tag_mark = token.start_mark
- end_mark = token.end_mark
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ == yaml_ANCHOR_TOKEN {
- anchor = token.value
- end_mark = token.end_mark
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- }
- }
-
- var tag []byte
- if tag_token {
- if len(tag_handle) == 0 {
- tag = tag_suffix
- tag_suffix = nil
- } else {
- for i := range parser.tag_directives {
- if bytes.Equal(parser.tag_directives[i].handle, tag_handle) {
- tag = append([]byte(nil), parser.tag_directives[i].prefix...)
- tag = append(tag, tag_suffix...)
- break
- }
- }
- if len(tag) == 0 {
- yaml_parser_set_parser_error_context(parser,
- "while parsing a node", start_mark,
- "found undefined tag handle", tag_mark)
- return false
- }
- }
- }
-
- implicit := len(tag) == 0
- if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN {
- end_mark = token.end_mark
- parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
- *event = yaml_event_t{
- typ: yaml_SEQUENCE_START_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- anchor: anchor,
- tag: tag,
- implicit: implicit,
- style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
- }
- return true
- }
- if token.typ == yaml_SCALAR_TOKEN {
- var plain_implicit, quoted_implicit bool
- end_mark = token.end_mark
- if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') {
- plain_implicit = true
- } else if len(tag) == 0 {
- quoted_implicit = true
- }
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
-
- *event = yaml_event_t{
- typ: yaml_SCALAR_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- anchor: anchor,
- tag: tag,
- value: token.value,
- implicit: plain_implicit,
- quoted_implicit: quoted_implicit,
- style: yaml_style_t(token.style),
- }
- skip_token(parser)
- return true
- }
- if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN {
- // [Go] Some of the events below can be merged as they differ only on style.
- end_mark = token.end_mark
- parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
- *event = yaml_event_t{
- typ: yaml_SEQUENCE_START_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- anchor: anchor,
- tag: tag,
- implicit: implicit,
- style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE),
- }
- return true
- }
- if token.typ == yaml_FLOW_MAPPING_START_TOKEN {
- end_mark = token.end_mark
- parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
- *event = yaml_event_t{
- typ: yaml_MAPPING_START_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- anchor: anchor,
- tag: tag,
- implicit: implicit,
- style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
- }
- return true
- }
- if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
- end_mark = token.end_mark
- parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
- *event = yaml_event_t{
- typ: yaml_SEQUENCE_START_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- anchor: anchor,
- tag: tag,
- implicit: implicit,
- style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
- }
- return true
- }
- if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN {
- end_mark = token.end_mark
- parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
- *event = yaml_event_t{
- typ: yaml_MAPPING_START_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- anchor: anchor,
- tag: tag,
- implicit: implicit,
- style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE),
- }
- return true
- }
- if len(anchor) > 0 || len(tag) > 0 {
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
-
- *event = yaml_event_t{
- typ: yaml_SCALAR_EVENT,
- start_mark: start_mark,
- end_mark: end_mark,
- anchor: anchor,
- tag: tag,
- implicit: implicit,
- quoted_implicit: false,
- style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
- }
- return true
- }
-
- context := "while parsing a flow node"
- if block {
- context = "while parsing a block node"
- }
- yaml_parser_set_parser_error_context(parser, context, start_mark,
- "did not find expected node content", token.start_mark)
- return false
-}
-
-// Parse the productions:
-// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
-// ******************** *********** * *********
-//
-func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
- if first {
- token := peek_token(parser)
- parser.marks = append(parser.marks, token.start_mark)
- skip_token(parser)
- }
-
- token := peek_token(parser)
- if token == nil {
- return false
- }
-
- if token.typ == yaml_BLOCK_ENTRY_TOKEN {
- mark := token.end_mark
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE)
- return yaml_parser_parse_node(parser, event, true, false)
- } else {
- parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
- return yaml_parser_process_empty_scalar(parser, event, mark)
- }
- }
- if token.typ == yaml_BLOCK_END_TOKEN {
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
- parser.marks = parser.marks[:len(parser.marks)-1]
-
- *event = yaml_event_t{
- typ: yaml_SEQUENCE_END_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- }
-
- skip_token(parser)
- return true
- }
-
- context_mark := parser.marks[len(parser.marks)-1]
- parser.marks = parser.marks[:len(parser.marks)-1]
- return yaml_parser_set_parser_error_context(parser,
- "while parsing a block collection", context_mark,
- "did not find expected '-' indicator", token.start_mark)
-}
-
-// Parse the productions:
-// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
-// *********** *
-func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
-
- if token.typ == yaml_BLOCK_ENTRY_TOKEN {
- mark := token.end_mark
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_BLOCK_ENTRY_TOKEN &&
- token.typ != yaml_KEY_TOKEN &&
- token.typ != yaml_VALUE_TOKEN &&
- token.typ != yaml_BLOCK_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE)
- return yaml_parser_parse_node(parser, event, true, false)
- }
- parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
- return yaml_parser_process_empty_scalar(parser, event, mark)
- }
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
-
- *event = yaml_event_t{
- typ: yaml_SEQUENCE_END_EVENT,
- start_mark: token.start_mark,
- end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark?
- }
- return true
-}
-
-// Parse the productions:
-// block_mapping ::= BLOCK-MAPPING_START
-// *******************
-// ((KEY block_node_or_indentless_sequence?)?
-// *** *
-// (VALUE block_node_or_indentless_sequence?)?)*
-//
-// BLOCK-END
-// *********
-//
-func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
- if first {
- token := peek_token(parser)
- parser.marks = append(parser.marks, token.start_mark)
- skip_token(parser)
- }
-
- token := peek_token(parser)
- if token == nil {
- return false
- }
-
- if token.typ == yaml_KEY_TOKEN {
- mark := token.end_mark
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_KEY_TOKEN &&
- token.typ != yaml_VALUE_TOKEN &&
- token.typ != yaml_BLOCK_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE)
- return yaml_parser_parse_node(parser, event, true, true)
- } else {
- parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE
- return yaml_parser_process_empty_scalar(parser, event, mark)
- }
- } else if token.typ == yaml_BLOCK_END_TOKEN {
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
- parser.marks = parser.marks[:len(parser.marks)-1]
- *event = yaml_event_t{
- typ: yaml_MAPPING_END_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- }
- skip_token(parser)
- return true
- }
-
- context_mark := parser.marks[len(parser.marks)-1]
- parser.marks = parser.marks[:len(parser.marks)-1]
- return yaml_parser_set_parser_error_context(parser,
- "while parsing a block mapping", context_mark,
- "did not find expected key", token.start_mark)
-}
-
-// Parse the productions:
-// block_mapping ::= BLOCK-MAPPING_START
-//
-// ((KEY block_node_or_indentless_sequence?)?
-//
-// (VALUE block_node_or_indentless_sequence?)?)*
-// ***** *
-// BLOCK-END
-//
-//
-func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ == yaml_VALUE_TOKEN {
- mark := token.end_mark
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_KEY_TOKEN &&
- token.typ != yaml_VALUE_TOKEN &&
- token.typ != yaml_BLOCK_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE)
- return yaml_parser_parse_node(parser, event, true, true)
- }
- parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
- return yaml_parser_process_empty_scalar(parser, event, mark)
- }
- parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
- return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
-}
-
-// Parse the productions:
-// flow_sequence ::= FLOW-SEQUENCE-START
-// *******************
-// (flow_sequence_entry FLOW-ENTRY)*
-// * **********
-// flow_sequence_entry?
-// *
-// FLOW-SEQUENCE-END
-// *****************
-// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// *
-//
-func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
- if first {
- token := peek_token(parser)
- parser.marks = append(parser.marks, token.start_mark)
- skip_token(parser)
- }
- token := peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
- if !first {
- if token.typ == yaml_FLOW_ENTRY_TOKEN {
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- } else {
- context_mark := parser.marks[len(parser.marks)-1]
- parser.marks = parser.marks[:len(parser.marks)-1]
- return yaml_parser_set_parser_error_context(parser,
- "while parsing a flow sequence", context_mark,
- "did not find expected ',' or ']'", token.start_mark)
- }
- }
-
- if token.typ == yaml_KEY_TOKEN {
- parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
- *event = yaml_event_t{
- typ: yaml_MAPPING_START_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- implicit: true,
- style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
- }
- skip_token(parser)
- return true
- } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE)
- return yaml_parser_parse_node(parser, event, false, false)
- }
- }
-
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
- parser.marks = parser.marks[:len(parser.marks)-1]
-
- *event = yaml_event_t{
- typ: yaml_SEQUENCE_END_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- }
-
- skip_token(parser)
- return true
-}
-
-//
-// Parse the productions:
-// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// *** *
-//
-func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_VALUE_TOKEN &&
- token.typ != yaml_FLOW_ENTRY_TOKEN &&
- token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE)
- return yaml_parser_parse_node(parser, event, false, false)
- }
- mark := token.end_mark
- skip_token(parser)
- parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
- return yaml_parser_process_empty_scalar(parser, event, mark)
-}
-
-// Parse the productions:
-// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// ***** *
-//
-func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ == yaml_VALUE_TOKEN {
- skip_token(parser)
- token := peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE)
- return yaml_parser_parse_node(parser, event, false, false)
- }
- }
- parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
- return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
-}
-
-// Parse the productions:
-// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// *
-//
-func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
- parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE
- *event = yaml_event_t{
- typ: yaml_MAPPING_END_EVENT,
- start_mark: token.start_mark,
- end_mark: token.start_mark, // [Go] Shouldn't this be end_mark?
- }
- return true
-}
-
-// Parse the productions:
-// flow_mapping ::= FLOW-MAPPING-START
-// ******************
-// (flow_mapping_entry FLOW-ENTRY)*
-// * **********
-// flow_mapping_entry?
-// ******************
-// FLOW-MAPPING-END
-// ****************
-// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// * *** *
-//
-func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
- if first {
- token := peek_token(parser)
- parser.marks = append(parser.marks, token.start_mark)
- skip_token(parser)
- }
-
- token := peek_token(parser)
- if token == nil {
- return false
- }
-
- if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
- if !first {
- if token.typ == yaml_FLOW_ENTRY_TOKEN {
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- } else {
- context_mark := parser.marks[len(parser.marks)-1]
- parser.marks = parser.marks[:len(parser.marks)-1]
- return yaml_parser_set_parser_error_context(parser,
- "while parsing a flow mapping", context_mark,
- "did not find expected ',' or '}'", token.start_mark)
- }
- }
-
- if token.typ == yaml_KEY_TOKEN {
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_VALUE_TOKEN &&
- token.typ != yaml_FLOW_ENTRY_TOKEN &&
- token.typ != yaml_FLOW_MAPPING_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE)
- return yaml_parser_parse_node(parser, event, false, false)
- } else {
- parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE
- return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
- }
- } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE)
- return yaml_parser_parse_node(parser, event, false, false)
- }
- }
-
- parser.state = parser.states[len(parser.states)-1]
- parser.states = parser.states[:len(parser.states)-1]
- parser.marks = parser.marks[:len(parser.marks)-1]
- *event = yaml_event_t{
- typ: yaml_MAPPING_END_EVENT,
- start_mark: token.start_mark,
- end_mark: token.end_mark,
- }
- skip_token(parser)
- return true
-}
-
-// Parse the productions:
-// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// * ***** *
-//
-func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool {
- token := peek_token(parser)
- if token == nil {
- return false
- }
- if empty {
- parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
- return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
- }
- if token.typ == yaml_VALUE_TOKEN {
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN {
- parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE)
- return yaml_parser_parse_node(parser, event, false, false)
- }
- }
- parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
- return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
-}
-
-// Generate an empty scalar event.
-func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool {
- *event = yaml_event_t{
- typ: yaml_SCALAR_EVENT,
- start_mark: mark,
- end_mark: mark,
- value: nil, // Empty
- implicit: true,
- style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
- }
- return true
-}
-
-var default_tag_directives = []yaml_tag_directive_t{
- {[]byte("!"), []byte("!")},
- {[]byte("!!"), []byte("tag:yaml.org,2002:")},
-}
-
-// Parse directives.
-func yaml_parser_process_directives(parser *yaml_parser_t,
- version_directive_ref **yaml_version_directive_t,
- tag_directives_ref *[]yaml_tag_directive_t) bool {
-
- var version_directive *yaml_version_directive_t
- var tag_directives []yaml_tag_directive_t
-
- token := peek_token(parser)
- if token == nil {
- return false
- }
-
- for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN {
- if token.typ == yaml_VERSION_DIRECTIVE_TOKEN {
- if version_directive != nil {
- yaml_parser_set_parser_error(parser,
- "found duplicate %YAML directive", token.start_mark)
- return false
- }
- if token.major != 1 || token.minor != 1 {
- yaml_parser_set_parser_error(parser,
- "found incompatible YAML document", token.start_mark)
- return false
- }
- version_directive = &yaml_version_directive_t{
- major: token.major,
- minor: token.minor,
- }
- } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN {
- value := yaml_tag_directive_t{
- handle: token.value,
- prefix: token.prefix,
- }
- if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) {
- return false
- }
- tag_directives = append(tag_directives, value)
- }
-
- skip_token(parser)
- token = peek_token(parser)
- if token == nil {
- return false
- }
- }
-
- for i := range default_tag_directives {
- if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) {
- return false
- }
- }
-
- if version_directive_ref != nil {
- *version_directive_ref = version_directive
- }
- if tag_directives_ref != nil {
- *tag_directives_ref = tag_directives
- }
- return true
-}
-
-// Append a tag directive to the directives stack.
-func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool {
- for i := range parser.tag_directives {
- if bytes.Equal(value.handle, parser.tag_directives[i].handle) {
- if allow_duplicates {
- return true
- }
- return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark)
- }
- }
-
- // [Go] I suspect the copy is unnecessary. This was likely done
- // because there was no way to track ownership of the data.
- value_copy := yaml_tag_directive_t{
- handle: make([]byte, len(value.handle)),
- prefix: make([]byte, len(value.prefix)),
- }
- copy(value_copy.handle, value.handle)
- copy(value_copy.prefix, value.prefix)
- parser.tag_directives = append(parser.tag_directives, value_copy)
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/readerc.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/readerc.go
deleted file mode 100644
index f45079171..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/readerc.go
+++ /dev/null
@@ -1,394 +0,0 @@
-package yaml
-
-import (
- "io"
-)
-
-// Set the reader error and return 0.
-func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool {
- parser.error = yaml_READER_ERROR
- parser.problem = problem
- parser.problem_offset = offset
- parser.problem_value = value
- return false
-}
-
-// Byte order marks.
-const (
- bom_UTF8 = "\xef\xbb\xbf"
- bom_UTF16LE = "\xff\xfe"
- bom_UTF16BE = "\xfe\xff"
-)
-
-// Determine the input stream encoding by checking the BOM symbol. If no BOM is
-// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
-func yaml_parser_determine_encoding(parser *yaml_parser_t) bool {
- // Ensure that we had enough bytes in the raw buffer.
- for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 {
- if !yaml_parser_update_raw_buffer(parser) {
- return false
- }
- }
-
- // Determine the encoding.
- buf := parser.raw_buffer
- pos := parser.raw_buffer_pos
- avail := len(buf) - pos
- if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] {
- parser.encoding = yaml_UTF16LE_ENCODING
- parser.raw_buffer_pos += 2
- parser.offset += 2
- } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] {
- parser.encoding = yaml_UTF16BE_ENCODING
- parser.raw_buffer_pos += 2
- parser.offset += 2
- } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] {
- parser.encoding = yaml_UTF8_ENCODING
- parser.raw_buffer_pos += 3
- parser.offset += 3
- } else {
- parser.encoding = yaml_UTF8_ENCODING
- }
- return true
-}
-
-// Update the raw buffer.
-func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool {
- size_read := 0
-
- // Return if the raw buffer is full.
- if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) {
- return true
- }
-
- // Return on EOF.
- if parser.eof {
- return true
- }
-
- // Move the remaining bytes in the raw buffer to the beginning.
- if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) {
- copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:])
- }
- parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos]
- parser.raw_buffer_pos = 0
-
- // Call the read handler to fill the buffer.
- size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)])
- parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read]
- if err == io.EOF {
- parser.eof = true
- } else if err != nil {
- return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1)
- }
- return true
-}
-
-// Ensure that the buffer contains at least `length` characters.
-// Return true on success, false on failure.
-//
-// The length is supposed to be significantly less that the buffer size.
-func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool {
- if parser.read_handler == nil {
- panic("read handler must be set")
- }
-
- // If the EOF flag is set and the raw buffer is empty, do nothing.
- if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) {
- return true
- }
-
- // Return if the buffer contains enough characters.
- if parser.unread >= length {
- return true
- }
-
- // Determine the input encoding if it is not known yet.
- if parser.encoding == yaml_ANY_ENCODING {
- if !yaml_parser_determine_encoding(parser) {
- return false
- }
- }
-
- // Move the unread characters to the beginning of the buffer.
- buffer_len := len(parser.buffer)
- if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len {
- copy(parser.buffer, parser.buffer[parser.buffer_pos:])
- buffer_len -= parser.buffer_pos
- parser.buffer_pos = 0
- } else if parser.buffer_pos == buffer_len {
- buffer_len = 0
- parser.buffer_pos = 0
- }
-
- // Open the whole buffer for writing, and cut it before returning.
- parser.buffer = parser.buffer[:cap(parser.buffer)]
-
- // Fill the buffer until it has enough characters.
- first := true
- for parser.unread < length {
-
- // Fill the raw buffer if necessary.
- if !first || parser.raw_buffer_pos == len(parser.raw_buffer) {
- if !yaml_parser_update_raw_buffer(parser) {
- parser.buffer = parser.buffer[:buffer_len]
- return false
- }
- }
- first = false
-
- // Decode the raw buffer.
- inner:
- for parser.raw_buffer_pos != len(parser.raw_buffer) {
- var value rune
- var width int
-
- raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos
-
- // Decode the next character.
- switch parser.encoding {
- case yaml_UTF8_ENCODING:
- // Decode a UTF-8 character. Check RFC 3629
- // (http://www.ietf.org/rfc/rfc3629.txt) for more details.
- //
- // The following table (taken from the RFC) is used for
- // decoding.
- //
- // Char. number range | UTF-8 octet sequence
- // (hexadecimal) | (binary)
- // --------------------+------------------------------------
- // 0000 0000-0000 007F | 0xxxxxxx
- // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
- // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
- // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- //
- // Additionally, the characters in the range 0xD800-0xDFFF
- // are prohibited as they are reserved for use with UTF-16
- // surrogate pairs.
-
- // Determine the length of the UTF-8 sequence.
- octet := parser.raw_buffer[parser.raw_buffer_pos]
- switch {
- case octet&0x80 == 0x00:
- width = 1
- case octet&0xE0 == 0xC0:
- width = 2
- case octet&0xF0 == 0xE0:
- width = 3
- case octet&0xF8 == 0xF0:
- width = 4
- default:
- // The leading octet is invalid.
- return yaml_parser_set_reader_error(parser,
- "invalid leading UTF-8 octet",
- parser.offset, int(octet))
- }
-
- // Check if the raw buffer contains an incomplete character.
- if width > raw_unread {
- if parser.eof {
- return yaml_parser_set_reader_error(parser,
- "incomplete UTF-8 octet sequence",
- parser.offset, -1)
- }
- break inner
- }
-
- // Decode the leading octet.
- switch {
- case octet&0x80 == 0x00:
- value = rune(octet & 0x7F)
- case octet&0xE0 == 0xC0:
- value = rune(octet & 0x1F)
- case octet&0xF0 == 0xE0:
- value = rune(octet & 0x0F)
- case octet&0xF8 == 0xF0:
- value = rune(octet & 0x07)
- default:
- value = 0
- }
-
- // Check and decode the trailing octets.
- for k := 1; k < width; k++ {
- octet = parser.raw_buffer[parser.raw_buffer_pos+k]
-
- // Check if the octet is valid.
- if (octet & 0xC0) != 0x80 {
- return yaml_parser_set_reader_error(parser,
- "invalid trailing UTF-8 octet",
- parser.offset+k, int(octet))
- }
-
- // Decode the octet.
- value = (value << 6) + rune(octet&0x3F)
- }
-
- // Check the length of the sequence against the value.
- switch {
- case width == 1:
- case width == 2 && value >= 0x80:
- case width == 3 && value >= 0x800:
- case width == 4 && value >= 0x10000:
- default:
- return yaml_parser_set_reader_error(parser,
- "invalid length of a UTF-8 sequence",
- parser.offset, -1)
- }
-
- // Check the range of the value.
- if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF {
- return yaml_parser_set_reader_error(parser,
- "invalid Unicode character",
- parser.offset, int(value))
- }
-
- case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING:
- var low, high int
- if parser.encoding == yaml_UTF16LE_ENCODING {
- low, high = 0, 1
- } else {
- low, high = 1, 0
- }
-
- // The UTF-16 encoding is not as simple as one might
- // naively think. Check RFC 2781
- // (http://www.ietf.org/rfc/rfc2781.txt).
- //
- // Normally, two subsequent bytes describe a Unicode
- // character. However a special technique (called a
- // surrogate pair) is used for specifying character
- // values larger than 0xFFFF.
- //
- // A surrogate pair consists of two pseudo-characters:
- // high surrogate area (0xD800-0xDBFF)
- // low surrogate area (0xDC00-0xDFFF)
- //
- // The following formulas are used for decoding
- // and encoding characters using surrogate pairs:
- //
- // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF)
- // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF)
- // W1 = 110110yyyyyyyyyy
- // W2 = 110111xxxxxxxxxx
- //
- // where U is the character value, W1 is the high surrogate
- // area, W2 is the low surrogate area.
-
- // Check for incomplete UTF-16 character.
- if raw_unread < 2 {
- if parser.eof {
- return yaml_parser_set_reader_error(parser,
- "incomplete UTF-16 character",
- parser.offset, -1)
- }
- break inner
- }
-
- // Get the character.
- value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) +
- (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8)
-
- // Check for unexpected low surrogate area.
- if value&0xFC00 == 0xDC00 {
- return yaml_parser_set_reader_error(parser,
- "unexpected low surrogate area",
- parser.offset, int(value))
- }
-
- // Check for a high surrogate area.
- if value&0xFC00 == 0xD800 {
- width = 4
-
- // Check for incomplete surrogate pair.
- if raw_unread < 4 {
- if parser.eof {
- return yaml_parser_set_reader_error(parser,
- "incomplete UTF-16 surrogate pair",
- parser.offset, -1)
- }
- break inner
- }
-
- // Get the next character.
- value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) +
- (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8)
-
- // Check for a low surrogate area.
- if value2&0xFC00 != 0xDC00 {
- return yaml_parser_set_reader_error(parser,
- "expected low surrogate area",
- parser.offset+2, int(value2))
- }
-
- // Generate the value of the surrogate pair.
- value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF)
- } else {
- width = 2
- }
-
- default:
- panic("impossible")
- }
-
- // Check if the character is in the allowed range:
- // #x9 | #xA | #xD | [#x20-#x7E] (8 bit)
- // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit)
- // | [#x10000-#x10FFFF] (32 bit)
- switch {
- case value == 0x09:
- case value == 0x0A:
- case value == 0x0D:
- case value >= 0x20 && value <= 0x7E:
- case value == 0x85:
- case value >= 0xA0 && value <= 0xD7FF:
- case value >= 0xE000 && value <= 0xFFFD:
- case value >= 0x10000 && value <= 0x10FFFF:
- default:
- return yaml_parser_set_reader_error(parser,
- "control characters are not allowed",
- parser.offset, int(value))
- }
-
- // Move the raw pointers.
- parser.raw_buffer_pos += width
- parser.offset += width
-
- // Finally put the character into the buffer.
- if value <= 0x7F {
- // 0000 0000-0000 007F . 0xxxxxxx
- parser.buffer[buffer_len+0] = byte(value)
- buffer_len += 1
- } else if value <= 0x7FF {
- // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx
- parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6))
- parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F))
- buffer_len += 2
- } else if value <= 0xFFFF {
- // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx
- parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12))
- parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F))
- parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F))
- buffer_len += 3
- } else {
- // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18))
- parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F))
- parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F))
- parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F))
- buffer_len += 4
- }
-
- parser.unread++
- }
-
- // On EOF, put NUL into the buffer and return.
- if parser.eof {
- parser.buffer[buffer_len] = 0
- buffer_len++
- parser.unread++
- break
- }
- }
- parser.buffer = parser.buffer[:buffer_len]
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/resolve.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/resolve.go
deleted file mode 100644
index 232313cc0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/resolve.go
+++ /dev/null
@@ -1,208 +0,0 @@
-package yaml
-
-import (
- "encoding/base64"
- "math"
- "regexp"
- "strconv"
- "strings"
- "unicode/utf8"
-)
-
-type resolveMapItem struct {
- value interface{}
- tag string
-}
-
-var resolveTable = make([]byte, 256)
-var resolveMap = make(map[string]resolveMapItem)
-
-func init() {
- t := resolveTable
- t[int('+')] = 'S' // Sign
- t[int('-')] = 'S'
- for _, c := range "0123456789" {
- t[int(c)] = 'D' // Digit
- }
- for _, c := range "yYnNtTfFoO~" {
- t[int(c)] = 'M' // In map
- }
- t[int('.')] = '.' // Float (potentially in map)
-
- var resolveMapList = []struct {
- v interface{}
- tag string
- l []string
- }{
- {true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}},
- {true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}},
- {true, yaml_BOOL_TAG, []string{"on", "On", "ON"}},
- {false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}},
- {false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}},
- {false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}},
- {nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}},
- {math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}},
- {math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}},
- {math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}},
- {math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}},
- {"<<", yaml_MERGE_TAG, []string{"<<"}},
- }
-
- m := resolveMap
- for _, item := range resolveMapList {
- for _, s := range item.l {
- m[s] = resolveMapItem{item.v, item.tag}
- }
- }
-}
-
-const longTagPrefix = "tag:yaml.org,2002:"
-
-func shortTag(tag string) string {
- // TODO This can easily be made faster and produce less garbage.
- if strings.HasPrefix(tag, longTagPrefix) {
- return "!!" + tag[len(longTagPrefix):]
- }
- return tag
-}
-
-func longTag(tag string) string {
- if strings.HasPrefix(tag, "!!") {
- return longTagPrefix + tag[2:]
- }
- return tag
-}
-
-func resolvableTag(tag string) bool {
- switch tag {
- case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG:
- return true
- }
- return false
-}
-
-var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`)
-
-func resolve(tag string, in string) (rtag string, out interface{}) {
- if !resolvableTag(tag) {
- return tag, in
- }
-
- defer func() {
- switch tag {
- case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG:
- return
- }
- failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag))
- }()
-
- // Any data is accepted as a !!str or !!binary.
- // Otherwise, the prefix is enough of a hint about what it might be.
- hint := byte('N')
- if in != "" {
- hint = resolveTable[in[0]]
- }
- if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG {
- // Handle things we can lookup in a map.
- if item, ok := resolveMap[in]; ok {
- return item.tag, item.value
- }
-
- // Base 60 floats are a bad idea, were dropped in YAML 1.2, and
- // are purposefully unsupported here. They're still quoted on
- // the way out for compatibility with other parser, though.
-
- switch hint {
- case 'M':
- // We've already checked the map above.
-
- case '.':
- // Not in the map, so maybe a normal float.
- floatv, err := strconv.ParseFloat(in, 64)
- if err == nil {
- return yaml_FLOAT_TAG, floatv
- }
-
- case 'D', 'S':
- // Int, float, or timestamp.
- plain := strings.Replace(in, "_", "", -1)
- intv, err := strconv.ParseInt(plain, 0, 64)
- if err == nil {
- if intv == int64(int(intv)) {
- return yaml_INT_TAG, int(intv)
- } else {
- return yaml_INT_TAG, intv
- }
- }
- uintv, err := strconv.ParseUint(plain, 0, 64)
- if err == nil {
- return yaml_INT_TAG, uintv
- }
- if yamlStyleFloat.MatchString(plain) {
- floatv, err := strconv.ParseFloat(plain, 64)
- if err == nil {
- return yaml_FLOAT_TAG, floatv
- }
- }
- if strings.HasPrefix(plain, "0b") {
- intv, err := strconv.ParseInt(plain[2:], 2, 64)
- if err == nil {
- if intv == int64(int(intv)) {
- return yaml_INT_TAG, int(intv)
- } else {
- return yaml_INT_TAG, intv
- }
- }
- uintv, err := strconv.ParseUint(plain[2:], 2, 64)
- if err == nil {
- return yaml_INT_TAG, uintv
- }
- } else if strings.HasPrefix(plain, "-0b") {
- intv, err := strconv.ParseInt(plain[3:], 2, 64)
- if err == nil {
- if intv == int64(int(intv)) {
- return yaml_INT_TAG, -int(intv)
- } else {
- return yaml_INT_TAG, -intv
- }
- }
- }
- // XXX Handle timestamps here.
-
- default:
- panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")")
- }
- }
- if tag == yaml_BINARY_TAG {
- return yaml_BINARY_TAG, in
- }
- if utf8.ValidString(in) {
- return yaml_STR_TAG, in
- }
- return yaml_BINARY_TAG, encodeBase64(in)
-}
-
-// encodeBase64 encodes s as base64 that is broken up into multiple lines
-// as appropriate for the resulting length.
-func encodeBase64(s string) string {
- const lineLen = 70
- encLen := base64.StdEncoding.EncodedLen(len(s))
- lines := encLen/lineLen + 1
- buf := make([]byte, encLen*2+lines)
- in := buf[0:encLen]
- out := buf[encLen:]
- base64.StdEncoding.Encode(in, []byte(s))
- k := 0
- for i := 0; i < len(in); i += lineLen {
- j := i + lineLen
- if j > len(in) {
- j = len(in)
- }
- k += copy(out[k:], in[i:j])
- if lines > 1 {
- out[k] = '\n'
- k++
- }
- }
- return string(out[:k])
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/scannerc.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/scannerc.go
deleted file mode 100644
index 2c9d5111f..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/scannerc.go
+++ /dev/null
@@ -1,2710 +0,0 @@
-package yaml
-
-import (
- "bytes"
- "fmt"
-)
-
-// Introduction
-// ************
-//
-// The following notes assume that you are familiar with the YAML specification
-// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in
-// some cases we are less restrictive that it requires.
-//
-// The process of transforming a YAML stream into a sequence of events is
-// divided on two steps: Scanning and Parsing.
-//
-// The Scanner transforms the input stream into a sequence of tokens, while the
-// parser transform the sequence of tokens produced by the Scanner into a
-// sequence of parsing events.
-//
-// The Scanner is rather clever and complicated. The Parser, on the contrary,
-// is a straightforward implementation of a recursive-descendant parser (or,
-// LL(1) parser, as it is usually called).
-//
-// Actually there are two issues of Scanning that might be called "clever", the
-// rest is quite straightforward. The issues are "block collection start" and
-// "simple keys". Both issues are explained below in details.
-//
-// Here the Scanning step is explained and implemented. We start with the list
-// of all the tokens produced by the Scanner together with short descriptions.
-//
-// Now, tokens:
-//
-// STREAM-START(encoding) # The stream start.
-// STREAM-END # The stream end.
-// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive.
-// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive.
-// DOCUMENT-START # '---'
-// DOCUMENT-END # '...'
-// BLOCK-SEQUENCE-START # Indentation increase denoting a block
-// BLOCK-MAPPING-START # sequence or a block mapping.
-// BLOCK-END # Indentation decrease.
-// FLOW-SEQUENCE-START # '['
-// FLOW-SEQUENCE-END # ']'
-// BLOCK-SEQUENCE-START # '{'
-// BLOCK-SEQUENCE-END # '}'
-// BLOCK-ENTRY # '-'
-// FLOW-ENTRY # ','
-// KEY # '?' or nothing (simple keys).
-// VALUE # ':'
-// ALIAS(anchor) # '*anchor'
-// ANCHOR(anchor) # '&anchor'
-// TAG(handle,suffix) # '!handle!suffix'
-// SCALAR(value,style) # A scalar.
-//
-// The following two tokens are "virtual" tokens denoting the beginning and the
-// end of the stream:
-//
-// STREAM-START(encoding)
-// STREAM-END
-//
-// We pass the information about the input stream encoding with the
-// STREAM-START token.
-//
-// The next two tokens are responsible for tags:
-//
-// VERSION-DIRECTIVE(major,minor)
-// TAG-DIRECTIVE(handle,prefix)
-//
-// Example:
-//
-// %YAML 1.1
-// %TAG ! !foo
-// %TAG !yaml! tag:yaml.org,2002:
-// ---
-//
-// The correspoding sequence of tokens:
-//
-// STREAM-START(utf-8)
-// VERSION-DIRECTIVE(1,1)
-// TAG-DIRECTIVE("!","!foo")
-// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:")
-// DOCUMENT-START
-// STREAM-END
-//
-// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole
-// line.
-//
-// The document start and end indicators are represented by:
-//
-// DOCUMENT-START
-// DOCUMENT-END
-//
-// Note that if a YAML stream contains an implicit document (without '---'
-// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be
-// produced.
-//
-// In the following examples, we present whole documents together with the
-// produced tokens.
-//
-// 1. An implicit document:
-//
-// 'a scalar'
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// SCALAR("a scalar",single-quoted)
-// STREAM-END
-//
-// 2. An explicit document:
-//
-// ---
-// 'a scalar'
-// ...
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// DOCUMENT-START
-// SCALAR("a scalar",single-quoted)
-// DOCUMENT-END
-// STREAM-END
-//
-// 3. Several documents in a stream:
-//
-// 'a scalar'
-// ---
-// 'another scalar'
-// ---
-// 'yet another scalar'
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// SCALAR("a scalar",single-quoted)
-// DOCUMENT-START
-// SCALAR("another scalar",single-quoted)
-// DOCUMENT-START
-// SCALAR("yet another scalar",single-quoted)
-// STREAM-END
-//
-// We have already introduced the SCALAR token above. The following tokens are
-// used to describe aliases, anchors, tag, and scalars:
-//
-// ALIAS(anchor)
-// ANCHOR(anchor)
-// TAG(handle,suffix)
-// SCALAR(value,style)
-//
-// The following series of examples illustrate the usage of these tokens:
-//
-// 1. A recursive sequence:
-//
-// &A [ *A ]
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// ANCHOR("A")
-// FLOW-SEQUENCE-START
-// ALIAS("A")
-// FLOW-SEQUENCE-END
-// STREAM-END
-//
-// 2. A tagged scalar:
-//
-// !!float "3.14" # A good approximation.
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// TAG("!!","float")
-// SCALAR("3.14",double-quoted)
-// STREAM-END
-//
-// 3. Various scalar styles:
-//
-// --- # Implicit empty plain scalars do not produce tokens.
-// --- a plain scalar
-// --- 'a single-quoted scalar'
-// --- "a double-quoted scalar"
-// --- |-
-// a literal scalar
-// --- >-
-// a folded
-// scalar
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// DOCUMENT-START
-// DOCUMENT-START
-// SCALAR("a plain scalar",plain)
-// DOCUMENT-START
-// SCALAR("a single-quoted scalar",single-quoted)
-// DOCUMENT-START
-// SCALAR("a double-quoted scalar",double-quoted)
-// DOCUMENT-START
-// SCALAR("a literal scalar",literal)
-// DOCUMENT-START
-// SCALAR("a folded scalar",folded)
-// STREAM-END
-//
-// Now it's time to review collection-related tokens. We will start with
-// flow collections:
-//
-// FLOW-SEQUENCE-START
-// FLOW-SEQUENCE-END
-// FLOW-MAPPING-START
-// FLOW-MAPPING-END
-// FLOW-ENTRY
-// KEY
-// VALUE
-//
-// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and
-// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}'
-// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the
-// indicators '?' and ':', which are used for denoting mapping keys and values,
-// are represented by the KEY and VALUE tokens.
-//
-// The following examples show flow collections:
-//
-// 1. A flow sequence:
-//
-// [item 1, item 2, item 3]
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// FLOW-SEQUENCE-START
-// SCALAR("item 1",plain)
-// FLOW-ENTRY
-// SCALAR("item 2",plain)
-// FLOW-ENTRY
-// SCALAR("item 3",plain)
-// FLOW-SEQUENCE-END
-// STREAM-END
-//
-// 2. A flow mapping:
-//
-// {
-// a simple key: a value, # Note that the KEY token is produced.
-// ? a complex key: another value,
-// }
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// FLOW-MAPPING-START
-// KEY
-// SCALAR("a simple key",plain)
-// VALUE
-// SCALAR("a value",plain)
-// FLOW-ENTRY
-// KEY
-// SCALAR("a complex key",plain)
-// VALUE
-// SCALAR("another value",plain)
-// FLOW-ENTRY
-// FLOW-MAPPING-END
-// STREAM-END
-//
-// A simple key is a key which is not denoted by the '?' indicator. Note that
-// the Scanner still produce the KEY token whenever it encounters a simple key.
-//
-// For scanning block collections, the following tokens are used (note that we
-// repeat KEY and VALUE here):
-//
-// BLOCK-SEQUENCE-START
-// BLOCK-MAPPING-START
-// BLOCK-END
-// BLOCK-ENTRY
-// KEY
-// VALUE
-//
-// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
-// increase that precedes a block collection (cf. the INDENT token in Python).
-// The token BLOCK-END denote indentation decrease that ends a block collection
-// (cf. the DEDENT token in Python). However YAML has some syntax pecularities
-// that makes detections of these tokens more complex.
-//
-// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
-// '-', '?', and ':' correspondingly.
-//
-// The following examples show how the tokens BLOCK-SEQUENCE-START,
-// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner:
-//
-// 1. Block sequences:
-//
-// - item 1
-// - item 2
-// -
-// - item 3.1
-// - item 3.2
-// -
-// key 1: value 1
-// key 2: value 2
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// BLOCK-SEQUENCE-START
-// BLOCK-ENTRY
-// SCALAR("item 1",plain)
-// BLOCK-ENTRY
-// SCALAR("item 2",plain)
-// BLOCK-ENTRY
-// BLOCK-SEQUENCE-START
-// BLOCK-ENTRY
-// SCALAR("item 3.1",plain)
-// BLOCK-ENTRY
-// SCALAR("item 3.2",plain)
-// BLOCK-END
-// BLOCK-ENTRY
-// BLOCK-MAPPING-START
-// KEY
-// SCALAR("key 1",plain)
-// VALUE
-// SCALAR("value 1",plain)
-// KEY
-// SCALAR("key 2",plain)
-// VALUE
-// SCALAR("value 2",plain)
-// BLOCK-END
-// BLOCK-END
-// STREAM-END
-//
-// 2. Block mappings:
-//
-// a simple key: a value # The KEY token is produced here.
-// ? a complex key
-// : another value
-// a mapping:
-// key 1: value 1
-// key 2: value 2
-// a sequence:
-// - item 1
-// - item 2
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// BLOCK-MAPPING-START
-// KEY
-// SCALAR("a simple key",plain)
-// VALUE
-// SCALAR("a value",plain)
-// KEY
-// SCALAR("a complex key",plain)
-// VALUE
-// SCALAR("another value",plain)
-// KEY
-// SCALAR("a mapping",plain)
-// BLOCK-MAPPING-START
-// KEY
-// SCALAR("key 1",plain)
-// VALUE
-// SCALAR("value 1",plain)
-// KEY
-// SCALAR("key 2",plain)
-// VALUE
-// SCALAR("value 2",plain)
-// BLOCK-END
-// KEY
-// SCALAR("a sequence",plain)
-// VALUE
-// BLOCK-SEQUENCE-START
-// BLOCK-ENTRY
-// SCALAR("item 1",plain)
-// BLOCK-ENTRY
-// SCALAR("item 2",plain)
-// BLOCK-END
-// BLOCK-END
-// STREAM-END
-//
-// YAML does not always require to start a new block collection from a new
-// line. If the current line contains only '-', '?', and ':' indicators, a new
-// block collection may start at the current line. The following examples
-// illustrate this case:
-//
-// 1. Collections in a sequence:
-//
-// - - item 1
-// - item 2
-// - key 1: value 1
-// key 2: value 2
-// - ? complex key
-// : complex value
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// BLOCK-SEQUENCE-START
-// BLOCK-ENTRY
-// BLOCK-SEQUENCE-START
-// BLOCK-ENTRY
-// SCALAR("item 1",plain)
-// BLOCK-ENTRY
-// SCALAR("item 2",plain)
-// BLOCK-END
-// BLOCK-ENTRY
-// BLOCK-MAPPING-START
-// KEY
-// SCALAR("key 1",plain)
-// VALUE
-// SCALAR("value 1",plain)
-// KEY
-// SCALAR("key 2",plain)
-// VALUE
-// SCALAR("value 2",plain)
-// BLOCK-END
-// BLOCK-ENTRY
-// BLOCK-MAPPING-START
-// KEY
-// SCALAR("complex key")
-// VALUE
-// SCALAR("complex value")
-// BLOCK-END
-// BLOCK-END
-// STREAM-END
-//
-// 2. Collections in a mapping:
-//
-// ? a sequence
-// : - item 1
-// - item 2
-// ? a mapping
-// : key 1: value 1
-// key 2: value 2
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// BLOCK-MAPPING-START
-// KEY
-// SCALAR("a sequence",plain)
-// VALUE
-// BLOCK-SEQUENCE-START
-// BLOCK-ENTRY
-// SCALAR("item 1",plain)
-// BLOCK-ENTRY
-// SCALAR("item 2",plain)
-// BLOCK-END
-// KEY
-// SCALAR("a mapping",plain)
-// VALUE
-// BLOCK-MAPPING-START
-// KEY
-// SCALAR("key 1",plain)
-// VALUE
-// SCALAR("value 1",plain)
-// KEY
-// SCALAR("key 2",plain)
-// VALUE
-// SCALAR("value 2",plain)
-// BLOCK-END
-// BLOCK-END
-// STREAM-END
-//
-// YAML also permits non-indented sequences if they are included into a block
-// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced:
-//
-// key:
-// - item 1 # BLOCK-SEQUENCE-START is NOT produced here.
-// - item 2
-//
-// Tokens:
-//
-// STREAM-START(utf-8)
-// BLOCK-MAPPING-START
-// KEY
-// SCALAR("key",plain)
-// VALUE
-// BLOCK-ENTRY
-// SCALAR("item 1",plain)
-// BLOCK-ENTRY
-// SCALAR("item 2",plain)
-// BLOCK-END
-//
-
-// Ensure that the buffer contains the required number of characters.
-// Return true on success, false on failure (reader error or memory error).
-func cache(parser *yaml_parser_t, length int) bool {
- // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B)
- return parser.unread >= length || yaml_parser_update_buffer(parser, length)
-}
-
-// Advance the buffer pointer.
-func skip(parser *yaml_parser_t) {
- parser.mark.index++
- parser.mark.column++
- parser.unread--
- parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
-}
-
-func skip_line(parser *yaml_parser_t) {
- if is_crlf(parser.buffer, parser.buffer_pos) {
- parser.mark.index += 2
- parser.mark.column = 0
- parser.mark.line++
- parser.unread -= 2
- parser.buffer_pos += 2
- } else if is_break(parser.buffer, parser.buffer_pos) {
- parser.mark.index++
- parser.mark.column = 0
- parser.mark.line++
- parser.unread--
- parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
- }
-}
-
-// Copy a character to a string buffer and advance pointers.
-func read(parser *yaml_parser_t, s []byte) []byte {
- w := width(parser.buffer[parser.buffer_pos])
- if w == 0 {
- panic("invalid character sequence")
- }
- if len(s) == 0 {
- s = make([]byte, 0, 32)
- }
- if w == 1 && len(s)+w <= cap(s) {
- s = s[:len(s)+1]
- s[len(s)-1] = parser.buffer[parser.buffer_pos]
- parser.buffer_pos++
- } else {
- s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
- parser.buffer_pos += w
- }
- parser.mark.index++
- parser.mark.column++
- parser.unread--
- return s
-}
-
-// Copy a line break character to a string buffer and advance pointers.
-func read_line(parser *yaml_parser_t, s []byte) []byte {
- buf := parser.buffer
- pos := parser.buffer_pos
- switch {
- case buf[pos] == '\r' && buf[pos+1] == '\n':
- // CR LF . LF
- s = append(s, '\n')
- parser.buffer_pos += 2
- parser.mark.index++
- parser.unread--
- case buf[pos] == '\r' || buf[pos] == '\n':
- // CR|LF . LF
- s = append(s, '\n')
- parser.buffer_pos += 1
- case buf[pos] == '\xC2' && buf[pos+1] == '\x85':
- // NEL . LF
- s = append(s, '\n')
- parser.buffer_pos += 2
- case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'):
- // LS|PS . LS|PS
- s = append(s, buf[parser.buffer_pos:pos+3]...)
- parser.buffer_pos += 3
- default:
- return s
- }
- parser.mark.index++
- parser.mark.column = 0
- parser.mark.line++
- parser.unread--
- return s
-}
-
-// Get the next token.
-func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool {
- // Erase the token object.
- *token = yaml_token_t{} // [Go] Is this necessary?
-
- // No tokens after STREAM-END or error.
- if parser.stream_end_produced || parser.error != yaml_NO_ERROR {
- return true
- }
-
- // Ensure that the tokens queue contains enough tokens.
- if !parser.token_available {
- if !yaml_parser_fetch_more_tokens(parser) {
- return false
- }
- }
-
- // Fetch the next token from the queue.
- *token = parser.tokens[parser.tokens_head]
- parser.tokens_head++
- parser.tokens_parsed++
- parser.token_available = false
-
- if token.typ == yaml_STREAM_END_TOKEN {
- parser.stream_end_produced = true
- }
- return true
-}
-
-// Set the scanner error and return false.
-func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool {
- parser.error = yaml_SCANNER_ERROR
- parser.context = context
- parser.context_mark = context_mark
- parser.problem = problem
- parser.problem_mark = parser.mark
- return false
-}
-
-func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool {
- context := "while parsing a tag"
- if directive {
- context = "while parsing a %TAG directive"
- }
- return yaml_parser_set_scanner_error(parser, context, context_mark, "did not find URI escaped octet")
-}
-
-func trace(args ...interface{}) func() {
- pargs := append([]interface{}{"+++"}, args...)
- fmt.Println(pargs...)
- pargs = append([]interface{}{"---"}, args...)
- return func() { fmt.Println(pargs...) }
-}
-
-// Ensure that the tokens queue contains at least one token which can be
-// returned to the Parser.
-func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool {
- // While we need more tokens to fetch, do it.
- for {
- // Check if we really need to fetch more tokens.
- need_more_tokens := false
-
- if parser.tokens_head == len(parser.tokens) {
- // Queue is empty.
- need_more_tokens = true
- } else {
- // Check if any potential simple key may occupy the head position.
- if !yaml_parser_stale_simple_keys(parser) {
- return false
- }
-
- for i := range parser.simple_keys {
- simple_key := &parser.simple_keys[i]
- if simple_key.possible && simple_key.token_number == parser.tokens_parsed {
- need_more_tokens = true
- break
- }
- }
- }
-
- // We are finished.
- if !need_more_tokens {
- break
- }
- // Fetch the next token.
- if !yaml_parser_fetch_next_token(parser) {
- return false
- }
- }
-
- parser.token_available = true
- return true
-}
-
-// The dispatcher for token fetchers.
-func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool {
- // Ensure that the buffer is initialized.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- // Check if we just started scanning. Fetch STREAM-START then.
- if !parser.stream_start_produced {
- return yaml_parser_fetch_stream_start(parser)
- }
-
- // Eat whitespaces and comments until we reach the next token.
- if !yaml_parser_scan_to_next_token(parser) {
- return false
- }
-
- // Remove obsolete potential simple keys.
- if !yaml_parser_stale_simple_keys(parser) {
- return false
- }
-
- // Check the indentation level against the current column.
- if !yaml_parser_unroll_indent(parser, parser.mark.column) {
- return false
- }
-
- // Ensure that the buffer contains at least 4 characters. 4 is the length
- // of the longest indicators ('--- ' and '... ').
- if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
- return false
- }
-
- // Is it the end of the stream?
- if is_z(parser.buffer, parser.buffer_pos) {
- return yaml_parser_fetch_stream_end(parser)
- }
-
- // Is it a directive?
- if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' {
- return yaml_parser_fetch_directive(parser)
- }
-
- buf := parser.buffer
- pos := parser.buffer_pos
-
- // Is it the document start indicator?
- if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) {
- return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN)
- }
-
- // Is it the document end indicator?
- if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) {
- return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN)
- }
-
- // Is it the flow sequence start indicator?
- if buf[pos] == '[' {
- return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN)
- }
-
- // Is it the flow mapping start indicator?
- if parser.buffer[parser.buffer_pos] == '{' {
- return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN)
- }
-
- // Is it the flow sequence end indicator?
- if parser.buffer[parser.buffer_pos] == ']' {
- return yaml_parser_fetch_flow_collection_end(parser,
- yaml_FLOW_SEQUENCE_END_TOKEN)
- }
-
- // Is it the flow mapping end indicator?
- if parser.buffer[parser.buffer_pos] == '}' {
- return yaml_parser_fetch_flow_collection_end(parser,
- yaml_FLOW_MAPPING_END_TOKEN)
- }
-
- // Is it the flow entry indicator?
- if parser.buffer[parser.buffer_pos] == ',' {
- return yaml_parser_fetch_flow_entry(parser)
- }
-
- // Is it the block entry indicator?
- if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) {
- return yaml_parser_fetch_block_entry(parser)
- }
-
- // Is it the key indicator?
- if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
- return yaml_parser_fetch_key(parser)
- }
-
- // Is it the value indicator?
- if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
- return yaml_parser_fetch_value(parser)
- }
-
- // Is it an alias?
- if parser.buffer[parser.buffer_pos] == '*' {
- return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN)
- }
-
- // Is it an anchor?
- if parser.buffer[parser.buffer_pos] == '&' {
- return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN)
- }
-
- // Is it a tag?
- if parser.buffer[parser.buffer_pos] == '!' {
- return yaml_parser_fetch_tag(parser)
- }
-
- // Is it a literal scalar?
- if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 {
- return yaml_parser_fetch_block_scalar(parser, true)
- }
-
- // Is it a folded scalar?
- if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 {
- return yaml_parser_fetch_block_scalar(parser, false)
- }
-
- // Is it a single-quoted scalar?
- if parser.buffer[parser.buffer_pos] == '\'' {
- return yaml_parser_fetch_flow_scalar(parser, true)
- }
-
- // Is it a double-quoted scalar?
- if parser.buffer[parser.buffer_pos] == '"' {
- return yaml_parser_fetch_flow_scalar(parser, false)
- }
-
- // Is it a plain scalar?
- //
- // A plain scalar may start with any non-blank characters except
- //
- // '-', '?', ':', ',', '[', ']', '{', '}',
- // '#', '&', '*', '!', '|', '>', '\'', '\"',
- // '%', '@', '`'.
- //
- // In the block context (and, for the '-' indicator, in the flow context
- // too), it may also start with the characters
- //
- // '-', '?', ':'
- //
- // if it is followed by a non-space character.
- //
- // The last rule is more restrictive than the specification requires.
- // [Go] Make this logic more reasonable.
- //switch parser.buffer[parser.buffer_pos] {
- //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`':
- //}
- if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' ||
- parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' ||
- parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' ||
- parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
- parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' ||
- parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' ||
- parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' ||
- parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' ||
- parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' ||
- parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') ||
- (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) ||
- (parser.flow_level == 0 &&
- (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') &&
- !is_blankz(parser.buffer, parser.buffer_pos+1)) {
- return yaml_parser_fetch_plain_scalar(parser)
- }
-
- // If we don't determine the token type so far, it is an error.
- return yaml_parser_set_scanner_error(parser,
- "while scanning for the next token", parser.mark,
- "found character that cannot start any token")
-}
-
-// Check the list of potential simple keys and remove the positions that
-// cannot contain simple keys anymore.
-func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool {
- // Check for a potential simple key for each flow level.
- for i := range parser.simple_keys {
- simple_key := &parser.simple_keys[i]
-
- // The specification requires that a simple key
- //
- // - is limited to a single line,
- // - is shorter than 1024 characters.
- if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) {
-
- // Check if the potential simple key to be removed is required.
- if simple_key.required {
- return yaml_parser_set_scanner_error(parser,
- "while scanning a simple key", simple_key.mark,
- "could not find expected ':'")
- }
- simple_key.possible = false
- }
- }
- return true
-}
-
-// Check if a simple key may start at the current position and add it if
-// needed.
-func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
- // A simple key is required at the current position if the scanner is in
- // the block context and the current column coincides with the indentation
- // level.
-
- required := parser.flow_level == 0 && parser.indent == parser.mark.column
-
- // A simple key is required only when it is the first token in the current
- // line. Therefore it is always allowed. But we add a check anyway.
- if required && !parser.simple_key_allowed {
- panic("should not happen")
- }
-
- //
- // If the current position may start a simple key, save it.
- //
- if parser.simple_key_allowed {
- simple_key := yaml_simple_key_t{
- possible: true,
- required: required,
- token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
- }
- simple_key.mark = parser.mark
-
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
- parser.simple_keys[len(parser.simple_keys)-1] = simple_key
- }
- return true
-}
-
-// Remove a potential simple key at the current flow level.
-func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
- i := len(parser.simple_keys) - 1
- if parser.simple_keys[i].possible {
- // If the key is required, it is an error.
- if parser.simple_keys[i].required {
- return yaml_parser_set_scanner_error(parser,
- "while scanning a simple key", parser.simple_keys[i].mark,
- "could not find expected ':'")
- }
- }
- // Remove the key from the stack.
- parser.simple_keys[i].possible = false
- return true
-}
-
-// Increase the flow level and resize the simple key list if needed.
-func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
- // Reset the simple key on the next level.
- parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
-
- // Increase the flow level.
- parser.flow_level++
- return true
-}
-
-// Decrease the flow level.
-func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool {
- if parser.flow_level > 0 {
- parser.flow_level--
- parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1]
- }
- return true
-}
-
-// Push the current indentation level to the stack and set the new level
-// the current column is greater than the indentation level. In this case,
-// append or insert the specified token into the token queue.
-func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool {
- // In the flow context, do nothing.
- if parser.flow_level > 0 {
- return true
- }
-
- if parser.indent < column {
- // Push the current indentation level to the stack and set the new
- // indentation level.
- parser.indents = append(parser.indents, parser.indent)
- parser.indent = column
-
- // Create a token and insert it into the queue.
- token := yaml_token_t{
- typ: typ,
- start_mark: mark,
- end_mark: mark,
- }
- if number > -1 {
- number -= parser.tokens_parsed
- }
- yaml_insert_token(parser, number, &token)
- }
- return true
-}
-
-// Pop indentation levels from the indents stack until the current level
-// becomes less or equal to the column. For each indentation level, append
-// the BLOCK-END token.
-func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool {
- // In the flow context, do nothing.
- if parser.flow_level > 0 {
- return true
- }
-
- // Loop through the indentation levels in the stack.
- for parser.indent > column {
- // Create a token and append it to the queue.
- token := yaml_token_t{
- typ: yaml_BLOCK_END_TOKEN,
- start_mark: parser.mark,
- end_mark: parser.mark,
- }
- yaml_insert_token(parser, -1, &token)
-
- // Pop the indentation level.
- parser.indent = parser.indents[len(parser.indents)-1]
- parser.indents = parser.indents[:len(parser.indents)-1]
- }
- return true
-}
-
-// Initialize the scanner and produce the STREAM-START token.
-func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
-
- // Set the initial indentation.
- parser.indent = -1
-
- // Initialize the simple key stack.
- parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
-
- // A simple key is allowed at the beginning of the stream.
- parser.simple_key_allowed = true
-
- // We have started.
- parser.stream_start_produced = true
-
- // Create the STREAM-START token and append it to the queue.
- token := yaml_token_t{
- typ: yaml_STREAM_START_TOKEN,
- start_mark: parser.mark,
- end_mark: parser.mark,
- encoding: parser.encoding,
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the STREAM-END token and shut down the scanner.
-func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool {
-
- // Force new line.
- if parser.mark.column != 0 {
- parser.mark.column = 0
- parser.mark.line++
- }
-
- // Reset the indentation level.
- if !yaml_parser_unroll_indent(parser, -1) {
- return false
- }
-
- // Reset simple keys.
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
-
- parser.simple_key_allowed = false
-
- // Create the STREAM-END token and append it to the queue.
- token := yaml_token_t{
- typ: yaml_STREAM_END_TOKEN,
- start_mark: parser.mark,
- end_mark: parser.mark,
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token.
-func yaml_parser_fetch_directive(parser *yaml_parser_t) bool {
- // Reset the indentation level.
- if !yaml_parser_unroll_indent(parser, -1) {
- return false
- }
-
- // Reset simple keys.
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
-
- parser.simple_key_allowed = false
-
- // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token.
- token := yaml_token_t{}
- if !yaml_parser_scan_directive(parser, &token) {
- return false
- }
- // Append the token to the queue.
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the DOCUMENT-START or DOCUMENT-END token.
-func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool {
- // Reset the indentation level.
- if !yaml_parser_unroll_indent(parser, -1) {
- return false
- }
-
- // Reset simple keys.
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
-
- parser.simple_key_allowed = false
-
- // Consume the token.
- start_mark := parser.mark
-
- skip(parser)
- skip(parser)
- skip(parser)
-
- end_mark := parser.mark
-
- // Create the DOCUMENT-START or DOCUMENT-END token.
- token := yaml_token_t{
- typ: typ,
- start_mark: start_mark,
- end_mark: end_mark,
- }
- // Append the token to the queue.
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.
-func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool {
- // The indicators '[' and '{' may start a simple key.
- if !yaml_parser_save_simple_key(parser) {
- return false
- }
-
- // Increase the flow level.
- if !yaml_parser_increase_flow_level(parser) {
- return false
- }
-
- // A simple key may follow the indicators '[' and '{'.
- parser.simple_key_allowed = true
-
- // Consume the token.
- start_mark := parser.mark
- skip(parser)
- end_mark := parser.mark
-
- // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token.
- token := yaml_token_t{
- typ: typ,
- start_mark: start_mark,
- end_mark: end_mark,
- }
- // Append the token to the queue.
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.
-func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool {
- // Reset any potential simple key on the current flow level.
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
-
- // Decrease the flow level.
- if !yaml_parser_decrease_flow_level(parser) {
- return false
- }
-
- // No simple keys after the indicators ']' and '}'.
- parser.simple_key_allowed = false
-
- // Consume the token.
-
- start_mark := parser.mark
- skip(parser)
- end_mark := parser.mark
-
- // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token.
- token := yaml_token_t{
- typ: typ,
- start_mark: start_mark,
- end_mark: end_mark,
- }
- // Append the token to the queue.
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the FLOW-ENTRY token.
-func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool {
- // Reset any potential simple keys on the current flow level.
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
-
- // Simple keys are allowed after ','.
- parser.simple_key_allowed = true
-
- // Consume the token.
- start_mark := parser.mark
- skip(parser)
- end_mark := parser.mark
-
- // Create the FLOW-ENTRY token and append it to the queue.
- token := yaml_token_t{
- typ: yaml_FLOW_ENTRY_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the BLOCK-ENTRY token.
-func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool {
- // Check if the scanner is in the block context.
- if parser.flow_level == 0 {
- // Check if we are allowed to start a new entry.
- if !parser.simple_key_allowed {
- return yaml_parser_set_scanner_error(parser, "", parser.mark,
- "block sequence entries are not allowed in this context")
- }
- // Add the BLOCK-SEQUENCE-START token if needed.
- if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) {
- return false
- }
- } else {
- // It is an error for the '-' indicator to occur in the flow context,
- // but we let the Parser detect and report about it because the Parser
- // is able to point to the context.
- }
-
- // Reset any potential simple keys on the current flow level.
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
-
- // Simple keys are allowed after '-'.
- parser.simple_key_allowed = true
-
- // Consume the token.
- start_mark := parser.mark
- skip(parser)
- end_mark := parser.mark
-
- // Create the BLOCK-ENTRY token and append it to the queue.
- token := yaml_token_t{
- typ: yaml_BLOCK_ENTRY_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the KEY token.
-func yaml_parser_fetch_key(parser *yaml_parser_t) bool {
-
- // In the block context, additional checks are required.
- if parser.flow_level == 0 {
- // Check if we are allowed to start a new key (not nessesary simple).
- if !parser.simple_key_allowed {
- return yaml_parser_set_scanner_error(parser, "", parser.mark,
- "mapping keys are not allowed in this context")
- }
- // Add the BLOCK-MAPPING-START token if needed.
- if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
- return false
- }
- }
-
- // Reset any potential simple keys on the current flow level.
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
-
- // Simple keys are allowed after '?' in the block context.
- parser.simple_key_allowed = parser.flow_level == 0
-
- // Consume the token.
- start_mark := parser.mark
- skip(parser)
- end_mark := parser.mark
-
- // Create the KEY token and append it to the queue.
- token := yaml_token_t{
- typ: yaml_KEY_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the VALUE token.
-func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
-
- simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
-
- // Have we found a simple key?
- if simple_key.possible {
- // Create the KEY token and insert it into the queue.
- token := yaml_token_t{
- typ: yaml_KEY_TOKEN,
- start_mark: simple_key.mark,
- end_mark: simple_key.mark,
- }
- yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token)
-
- // In the block context, we may need to add the BLOCK-MAPPING-START token.
- if !yaml_parser_roll_indent(parser, simple_key.mark.column,
- simple_key.token_number,
- yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) {
- return false
- }
-
- // Remove the simple key.
- simple_key.possible = false
-
- // A simple key cannot follow another simple key.
- parser.simple_key_allowed = false
-
- } else {
- // The ':' indicator follows a complex key.
-
- // In the block context, extra checks are required.
- if parser.flow_level == 0 {
-
- // Check if we are allowed to start a complex value.
- if !parser.simple_key_allowed {
- return yaml_parser_set_scanner_error(parser, "", parser.mark,
- "mapping values are not allowed in this context")
- }
-
- // Add the BLOCK-MAPPING-START token if needed.
- if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
- return false
- }
- }
-
- // Simple keys after ':' are allowed in the block context.
- parser.simple_key_allowed = parser.flow_level == 0
- }
-
- // Consume the token.
- start_mark := parser.mark
- skip(parser)
- end_mark := parser.mark
-
- // Create the VALUE token and append it to the queue.
- token := yaml_token_t{
- typ: yaml_VALUE_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the ALIAS or ANCHOR token.
-func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool {
- // An anchor or an alias could be a simple key.
- if !yaml_parser_save_simple_key(parser) {
- return false
- }
-
- // A simple key cannot follow an anchor or an alias.
- parser.simple_key_allowed = false
-
- // Create the ALIAS or ANCHOR token and append it to the queue.
- var token yaml_token_t
- if !yaml_parser_scan_anchor(parser, &token, typ) {
- return false
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the TAG token.
-func yaml_parser_fetch_tag(parser *yaml_parser_t) bool {
- // A tag could be a simple key.
- if !yaml_parser_save_simple_key(parser) {
- return false
- }
-
- // A simple key cannot follow a tag.
- parser.simple_key_allowed = false
-
- // Create the TAG token and append it to the queue.
- var token yaml_token_t
- if !yaml_parser_scan_tag(parser, &token) {
- return false
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.
-func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool {
- // Remove any potential simple keys.
- if !yaml_parser_remove_simple_key(parser) {
- return false
- }
-
- // A simple key may follow a block scalar.
- parser.simple_key_allowed = true
-
- // Create the SCALAR token and append it to the queue.
- var token yaml_token_t
- if !yaml_parser_scan_block_scalar(parser, &token, literal) {
- return false
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.
-func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool {
- // A plain scalar could be a simple key.
- if !yaml_parser_save_simple_key(parser) {
- return false
- }
-
- // A simple key cannot follow a flow scalar.
- parser.simple_key_allowed = false
-
- // Create the SCALAR token and append it to the queue.
- var token yaml_token_t
- if !yaml_parser_scan_flow_scalar(parser, &token, single) {
- return false
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Produce the SCALAR(...,plain) token.
-func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool {
- // A plain scalar could be a simple key.
- if !yaml_parser_save_simple_key(parser) {
- return false
- }
-
- // A simple key cannot follow a flow scalar.
- parser.simple_key_allowed = false
-
- // Create the SCALAR token and append it to the queue.
- var token yaml_token_t
- if !yaml_parser_scan_plain_scalar(parser, &token) {
- return false
- }
- yaml_insert_token(parser, -1, &token)
- return true
-}
-
-// Eat whitespaces and comments until the next token is found.
-func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool {
-
- // Until the next token is not found.
- for {
- // Allow the BOM mark to start a line.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) {
- skip(parser)
- }
-
- // Eat whitespaces.
- // Tabs are allowed:
- // - in the flow context
- // - in the block context, but not at the beginning of the line or
- // after '-', '?', or ':' (complex value).
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Eat a comment until a line break.
- if parser.buffer[parser.buffer_pos] == '#' {
- for !is_breakz(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
- }
-
- // If it is a line break, eat it.
- if is_break(parser.buffer, parser.buffer_pos) {
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
- skip_line(parser)
-
- // In the block context, a new line may start a simple key.
- if parser.flow_level == 0 {
- parser.simple_key_allowed = true
- }
- } else {
- break // We have found a token.
- }
- }
-
- return true
-}
-
-// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
-//
-// Scope:
-// %YAML 1.1 # a comment \n
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// %TAG !yaml! tag:yaml.org,2002: \n
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool {
- // Eat '%'.
- start_mark := parser.mark
- skip(parser)
-
- // Scan the directive name.
- var name []byte
- if !yaml_parser_scan_directive_name(parser, start_mark, &name) {
- return false
- }
-
- // Is it a YAML directive?
- if bytes.Equal(name, []byte("YAML")) {
- // Scan the VERSION directive value.
- var major, minor int8
- if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) {
- return false
- }
- end_mark := parser.mark
-
- // Create a VERSION-DIRECTIVE token.
- *token = yaml_token_t{
- typ: yaml_VERSION_DIRECTIVE_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- major: major,
- minor: minor,
- }
-
- // Is it a TAG directive?
- } else if bytes.Equal(name, []byte("TAG")) {
- // Scan the TAG directive value.
- var handle, prefix []byte
- if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) {
- return false
- }
- end_mark := parser.mark
-
- // Create a TAG-DIRECTIVE token.
- *token = yaml_token_t{
- typ: yaml_TAG_DIRECTIVE_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- value: handle,
- prefix: prefix,
- }
-
- // Unknown directive.
- } else {
- yaml_parser_set_scanner_error(parser, "while scanning a directive",
- start_mark, "found unknown directive name")
- return false
- }
-
- // Eat the rest of the line including any comments.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- for is_blank(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- if parser.buffer[parser.buffer_pos] == '#' {
- for !is_breakz(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
- }
-
- // Check if we are at the end of the line.
- if !is_breakz(parser.buffer, parser.buffer_pos) {
- yaml_parser_set_scanner_error(parser, "while scanning a directive",
- start_mark, "did not find expected comment or line break")
- return false
- }
-
- // Eat a line break.
- if is_break(parser.buffer, parser.buffer_pos) {
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
- skip_line(parser)
- }
-
- return true
-}
-
-// Scan the directive name.
-//
-// Scope:
-// %YAML 1.1 # a comment \n
-// ^^^^
-// %TAG !yaml! tag:yaml.org,2002: \n
-// ^^^
-//
-func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool {
- // Consume the directive name.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- var s []byte
- for is_alpha(parser.buffer, parser.buffer_pos) {
- s = read(parser, s)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Check if the name is empty.
- if len(s) == 0 {
- yaml_parser_set_scanner_error(parser, "while scanning a directive",
- start_mark, "could not find expected directive name")
- return false
- }
-
- // Check for an blank character after the name.
- if !is_blankz(parser.buffer, parser.buffer_pos) {
- yaml_parser_set_scanner_error(parser, "while scanning a directive",
- start_mark, "found unexpected non-alphabetical character")
- return false
- }
- *name = s
- return true
-}
-
-// Scan the value of VERSION-DIRECTIVE.
-//
-// Scope:
-// %YAML 1.1 # a comment \n
-// ^^^^^^
-func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool {
- // Eat whitespaces.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- for is_blank(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Consume the major version number.
- if !yaml_parser_scan_version_directive_number(parser, start_mark, major) {
- return false
- }
-
- // Eat '.'.
- if parser.buffer[parser.buffer_pos] != '.' {
- return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
- start_mark, "did not find expected digit or '.' character")
- }
-
- skip(parser)
-
- // Consume the minor version number.
- if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) {
- return false
- }
- return true
-}
-
-const max_number_length = 2
-
-// Scan the version number of VERSION-DIRECTIVE.
-//
-// Scope:
-// %YAML 1.1 # a comment \n
-// ^
-// %YAML 1.1 # a comment \n
-// ^
-func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool {
-
- // Repeat while the next character is digit.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- var value, length int8
- for is_digit(parser.buffer, parser.buffer_pos) {
- // Check if the number is too long.
- length++
- if length > max_number_length {
- return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
- start_mark, "found extremely long version number")
- }
- value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos))
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Check if the number was present.
- if length == 0 {
- return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
- start_mark, "did not find expected version number")
- }
- *number = value
- return true
-}
-
-// Scan the value of a TAG-DIRECTIVE token.
-//
-// Scope:
-// %TAG !yaml! tag:yaml.org,2002: \n
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool {
- var handle_value, prefix_value []byte
-
- // Eat whitespaces.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- for is_blank(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Scan a handle.
- if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) {
- return false
- }
-
- // Expect a whitespace.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- if !is_blank(parser.buffer, parser.buffer_pos) {
- yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
- start_mark, "did not find expected whitespace")
- return false
- }
-
- // Eat whitespaces.
- for is_blank(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Scan a prefix.
- if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) {
- return false
- }
-
- // Expect a whitespace or line break.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- if !is_blankz(parser.buffer, parser.buffer_pos) {
- yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
- start_mark, "did not find expected whitespace or line break")
- return false
- }
-
- *handle = handle_value
- *prefix = prefix_value
- return true
-}
-
-func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool {
- var s []byte
-
- // Eat the indicator character.
- start_mark := parser.mark
- skip(parser)
-
- // Consume the value.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- for is_alpha(parser.buffer, parser.buffer_pos) {
- s = read(parser, s)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- end_mark := parser.mark
-
- /*
- * Check if length of the anchor is greater than 0 and it is followed by
- * a whitespace character or one of the indicators:
- *
- * '?', ':', ',', ']', '}', '%', '@', '`'.
- */
-
- if len(s) == 0 ||
- !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' ||
- parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' ||
- parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' ||
- parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' ||
- parser.buffer[parser.buffer_pos] == '`') {
- context := "while scanning an alias"
- if typ == yaml_ANCHOR_TOKEN {
- context = "while scanning an anchor"
- }
- yaml_parser_set_scanner_error(parser, context, start_mark,
- "did not find expected alphabetic or numeric character")
- return false
- }
-
- // Create a token.
- *token = yaml_token_t{
- typ: typ,
- start_mark: start_mark,
- end_mark: end_mark,
- value: s,
- }
-
- return true
-}
-
-/*
- * Scan a TAG token.
- */
-
-func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool {
- var handle, suffix []byte
-
- start_mark := parser.mark
-
- // Check if the tag is in the canonical form.
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
-
- if parser.buffer[parser.buffer_pos+1] == '<' {
- // Keep the handle as ''
-
- // Eat '!<'
- skip(parser)
- skip(parser)
-
- // Consume the tag value.
- if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
- return false
- }
-
- // Check for '>' and eat it.
- if parser.buffer[parser.buffer_pos] != '>' {
- yaml_parser_set_scanner_error(parser, "while scanning a tag",
- start_mark, "did not find the expected '>'")
- return false
- }
-
- skip(parser)
- } else {
- // The tag has either the '!suffix' or the '!handle!suffix' form.
-
- // First, try to scan a handle.
- if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) {
- return false
- }
-
- // Check if it is, indeed, handle.
- if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' {
- // Scan the suffix now.
- if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
- return false
- }
- } else {
- // It wasn't a handle after all. Scan the rest of the tag.
- if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) {
- return false
- }
-
- // Set the handle to '!'.
- handle = []byte{'!'}
-
- // A special case: the '!' tag. Set the handle to '' and the
- // suffix to '!'.
- if len(suffix) == 0 {
- handle, suffix = suffix, handle
- }
- }
- }
-
- // Check the character which ends the tag.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- if !is_blankz(parser.buffer, parser.buffer_pos) {
- yaml_parser_set_scanner_error(parser, "while scanning a tag",
- start_mark, "did not find expected whitespace or line break")
- return false
- }
-
- end_mark := parser.mark
-
- // Create a token.
- *token = yaml_token_t{
- typ: yaml_TAG_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- value: handle,
- suffix: suffix,
- }
- return true
-}
-
-// Scan a tag handle.
-func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool {
- // Check the initial '!' character.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- if parser.buffer[parser.buffer_pos] != '!' {
- yaml_parser_set_scanner_tag_error(parser, directive,
- start_mark, "did not find expected '!'")
- return false
- }
-
- var s []byte
-
- // Copy the '!' character.
- s = read(parser, s)
-
- // Copy all subsequent alphabetical and numerical characters.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- for is_alpha(parser.buffer, parser.buffer_pos) {
- s = read(parser, s)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Check if the trailing character is '!' and copy it.
- if parser.buffer[parser.buffer_pos] == '!' {
- s = read(parser, s)
- } else {
- // It's either the '!' tag or not really a tag handle. If it's a %TAG
- // directive, it's an error. If it's a tag token, it must be a part of URI.
- if directive && !(s[0] == '!' && s[1] == 0) {
- yaml_parser_set_scanner_tag_error(parser, directive,
- start_mark, "did not find expected '!'")
- return false
- }
- }
-
- *handle = s
- return true
-}
-
-// Scan a tag.
-func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool {
- //size_t length = head ? strlen((char *)head) : 0
- var s []byte
-
- // Copy the head if needed.
- //
- // Note that we don't copy the leading '!' character.
- if len(head) > 1 {
- s = append(s, head[1:]...)
- }
-
- // Scan the tag.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- // The set of characters that may appear in URI is as follows:
- //
- // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
- // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
- // '%'.
- // [Go] Convert this into more reasonable logic.
- for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' ||
- parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' ||
- parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' ||
- parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' ||
- parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' ||
- parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' ||
- parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' ||
- parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' ||
- parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' ||
- parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' ||
- parser.buffer[parser.buffer_pos] == '%' {
- // Check if it is a URI-escape sequence.
- if parser.buffer[parser.buffer_pos] == '%' {
- if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) {
- return false
- }
- } else {
- s = read(parser, s)
- }
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Check if the tag is non-empty.
- if len(s) == 0 {
- yaml_parser_set_scanner_tag_error(parser, directive,
- start_mark, "did not find expected tag URI")
- return false
- }
- *uri = s
- return true
-}
-
-// Decode an URI-escape sequence corresponding to a single UTF-8 character.
-func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool {
-
- // Decode the required number of characters.
- w := 1024
- for w > 0 {
- // Check for a URI-escaped octet.
- if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
- return false
- }
-
- if !(parser.buffer[parser.buffer_pos] == '%' &&
- is_hex(parser.buffer, parser.buffer_pos+1) &&
- is_hex(parser.buffer, parser.buffer_pos+2)) {
- return yaml_parser_set_scanner_tag_error(parser, directive,
- start_mark, "did not find URI escaped octet")
- }
-
- // Get the octet.
- octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2))
-
- // If it is the leading octet, determine the length of the UTF-8 sequence.
- if w == 1024 {
- w = width(octet)
- if w == 0 {
- return yaml_parser_set_scanner_tag_error(parser, directive,
- start_mark, "found an incorrect leading UTF-8 octet")
- }
- } else {
- // Check if the trailing octet is correct.
- if octet&0xC0 != 0x80 {
- return yaml_parser_set_scanner_tag_error(parser, directive,
- start_mark, "found an incorrect trailing UTF-8 octet")
- }
- }
-
- // Copy the octet and move the pointers.
- *s = append(*s, octet)
- skip(parser)
- skip(parser)
- skip(parser)
- w--
- }
- return true
-}
-
-// Scan a block scalar.
-func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool {
- // Eat the indicator '|' or '>'.
- start_mark := parser.mark
- skip(parser)
-
- // Scan the additional block scalar indicators.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- // Check for a chomping indicator.
- var chomping, increment int
- if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
- // Set the chomping method and eat the indicator.
- if parser.buffer[parser.buffer_pos] == '+' {
- chomping = +1
- } else {
- chomping = -1
- }
- skip(parser)
-
- // Check for an indentation indicator.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- if is_digit(parser.buffer, parser.buffer_pos) {
- // Check that the indentation is greater than 0.
- if parser.buffer[parser.buffer_pos] == '0' {
- yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
- start_mark, "found an indentation indicator equal to 0")
- return false
- }
-
- // Get the indentation level and eat the indicator.
- increment = as_digit(parser.buffer, parser.buffer_pos)
- skip(parser)
- }
-
- } else if is_digit(parser.buffer, parser.buffer_pos) {
- // Do the same as above, but in the opposite order.
-
- if parser.buffer[parser.buffer_pos] == '0' {
- yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
- start_mark, "found an indentation indicator equal to 0")
- return false
- }
- increment = as_digit(parser.buffer, parser.buffer_pos)
- skip(parser)
-
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
- if parser.buffer[parser.buffer_pos] == '+' {
- chomping = +1
- } else {
- chomping = -1
- }
- skip(parser)
- }
- }
-
- // Eat whitespaces and comments to the end of the line.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- for is_blank(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
- if parser.buffer[parser.buffer_pos] == '#' {
- for !is_breakz(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
- }
-
- // Check if we are at the end of the line.
- if !is_breakz(parser.buffer, parser.buffer_pos) {
- yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
- start_mark, "did not find expected comment or line break")
- return false
- }
-
- // Eat a line break.
- if is_break(parser.buffer, parser.buffer_pos) {
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
- skip_line(parser)
- }
-
- end_mark := parser.mark
-
- // Set the indentation level if it was specified.
- var indent int
- if increment > 0 {
- if parser.indent >= 0 {
- indent = parser.indent + increment
- } else {
- indent = increment
- }
- }
-
- // Scan the leading line breaks and determine the indentation level if needed.
- var s, leading_break, trailing_breaks []byte
- if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
- return false
- }
-
- // Scan the block scalar content.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- var leading_blank, trailing_blank bool
- for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) {
- // We are at the beginning of a non-empty line.
-
- // Is it a trailing whitespace?
- trailing_blank = is_blank(parser.buffer, parser.buffer_pos)
-
- // Check if we need to fold the leading line break.
- if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' {
- // Do we need to join the lines by space?
- if len(trailing_breaks) == 0 {
- s = append(s, ' ')
- }
- } else {
- s = append(s, leading_break...)
- }
- leading_break = leading_break[:0]
-
- // Append the remaining line breaks.
- s = append(s, trailing_breaks...)
- trailing_breaks = trailing_breaks[:0]
-
- // Is it a leading whitespace?
- leading_blank = is_blank(parser.buffer, parser.buffer_pos)
-
- // Consume the current line.
- for !is_breakz(parser.buffer, parser.buffer_pos) {
- s = read(parser, s)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Consume the line break.
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
-
- leading_break = read_line(parser, leading_break)
-
- // Eat the following indentation spaces and line breaks.
- if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
- return false
- }
- }
-
- // Chomp the tail.
- if chomping != -1 {
- s = append(s, leading_break...)
- }
- if chomping == 1 {
- s = append(s, trailing_breaks...)
- }
-
- // Create a token.
- *token = yaml_token_t{
- typ: yaml_SCALAR_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- value: s,
- style: yaml_LITERAL_SCALAR_STYLE,
- }
- if !literal {
- token.style = yaml_FOLDED_SCALAR_STYLE
- }
- return true
-}
-
-// Scan indentation spaces and line breaks for a block scalar. Determine the
-// indentation level if needed.
-func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool {
- *end_mark = parser.mark
-
- // Eat the indentation spaces and line breaks.
- max_indent := 0
- for {
- // Eat the indentation spaces.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) {
- skip(parser)
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
- if parser.mark.column > max_indent {
- max_indent = parser.mark.column
- }
-
- // Check for a tab character messing the indentation.
- if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) {
- return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
- start_mark, "found a tab character where an indentation space is expected")
- }
-
- // Have we found a non-empty line?
- if !is_break(parser.buffer, parser.buffer_pos) {
- break
- }
-
- // Consume the line break.
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
- // [Go] Should really be returning breaks instead.
- *breaks = read_line(parser, *breaks)
- *end_mark = parser.mark
- }
-
- // Determine the indentation level if needed.
- if *indent == 0 {
- *indent = max_indent
- if *indent < parser.indent+1 {
- *indent = parser.indent + 1
- }
- if *indent < 1 {
- *indent = 1
- }
- }
- return true
-}
-
-// Scan a quoted scalar.
-func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool {
- // Eat the left quote.
- start_mark := parser.mark
- skip(parser)
-
- // Consume the content of the quoted scalar.
- var s, leading_break, trailing_breaks, whitespaces []byte
- for {
- // Check that there are no document indicators at the beginning of the line.
- if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
- return false
- }
-
- if parser.mark.column == 0 &&
- ((parser.buffer[parser.buffer_pos+0] == '-' &&
- parser.buffer[parser.buffer_pos+1] == '-' &&
- parser.buffer[parser.buffer_pos+2] == '-') ||
- (parser.buffer[parser.buffer_pos+0] == '.' &&
- parser.buffer[parser.buffer_pos+1] == '.' &&
- parser.buffer[parser.buffer_pos+2] == '.')) &&
- is_blankz(parser.buffer, parser.buffer_pos+3) {
- yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
- start_mark, "found unexpected document indicator")
- return false
- }
-
- // Check for EOF.
- if is_z(parser.buffer, parser.buffer_pos) {
- yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
- start_mark, "found unexpected end of stream")
- return false
- }
-
- // Consume non-blank characters.
- leading_blanks := false
- for !is_blankz(parser.buffer, parser.buffer_pos) {
- if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {
- // Is is an escaped single quote.
- s = append(s, '\'')
- skip(parser)
- skip(parser)
-
- } else if single && parser.buffer[parser.buffer_pos] == '\'' {
- // It is a right single quote.
- break
- } else if !single && parser.buffer[parser.buffer_pos] == '"' {
- // It is a right double quote.
- break
-
- } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) {
- // It is an escaped line break.
- if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
- return false
- }
- skip(parser)
- skip_line(parser)
- leading_blanks = true
- break
-
- } else if !single && parser.buffer[parser.buffer_pos] == '\\' {
- // It is an escape sequence.
- code_length := 0
-
- // Check the escape character.
- switch parser.buffer[parser.buffer_pos+1] {
- case '0':
- s = append(s, 0)
- case 'a':
- s = append(s, '\x07')
- case 'b':
- s = append(s, '\x08')
- case 't', '\t':
- s = append(s, '\x09')
- case 'n':
- s = append(s, '\x0A')
- case 'v':
- s = append(s, '\x0B')
- case 'f':
- s = append(s, '\x0C')
- case 'r':
- s = append(s, '\x0D')
- case 'e':
- s = append(s, '\x1B')
- case ' ':
- s = append(s, '\x20')
- case '"':
- s = append(s, '"')
- case '\'':
- s = append(s, '\'')
- case '\\':
- s = append(s, '\\')
- case 'N': // NEL (#x85)
- s = append(s, '\xC2')
- s = append(s, '\x85')
- case '_': // #xA0
- s = append(s, '\xC2')
- s = append(s, '\xA0')
- case 'L': // LS (#x2028)
- s = append(s, '\xE2')
- s = append(s, '\x80')
- s = append(s, '\xA8')
- case 'P': // PS (#x2029)
- s = append(s, '\xE2')
- s = append(s, '\x80')
- s = append(s, '\xA9')
- case 'x':
- code_length = 2
- case 'u':
- code_length = 4
- case 'U':
- code_length = 8
- default:
- yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
- start_mark, "found unknown escape character")
- return false
- }
-
- skip(parser)
- skip(parser)
-
- // Consume an arbitrary escape code.
- if code_length > 0 {
- var value int
-
- // Scan the character value.
- if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) {
- return false
- }
- for k := 0; k < code_length; k++ {
- if !is_hex(parser.buffer, parser.buffer_pos+k) {
- yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
- start_mark, "did not find expected hexdecimal number")
- return false
- }
- value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k)
- }
-
- // Check the value and write the character.
- if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF {
- yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
- start_mark, "found invalid Unicode character escape code")
- return false
- }
- if value <= 0x7F {
- s = append(s, byte(value))
- } else if value <= 0x7FF {
- s = append(s, byte(0xC0+(value>>6)))
- s = append(s, byte(0x80+(value&0x3F)))
- } else if value <= 0xFFFF {
- s = append(s, byte(0xE0+(value>>12)))
- s = append(s, byte(0x80+((value>>6)&0x3F)))
- s = append(s, byte(0x80+(value&0x3F)))
- } else {
- s = append(s, byte(0xF0+(value>>18)))
- s = append(s, byte(0x80+((value>>12)&0x3F)))
- s = append(s, byte(0x80+((value>>6)&0x3F)))
- s = append(s, byte(0x80+(value&0x3F)))
- }
-
- // Advance the pointer.
- for k := 0; k < code_length; k++ {
- skip(parser)
- }
- }
- } else {
- // It is a non-escaped non-blank character.
- s = read(parser, s)
- }
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
- }
-
- // Check if we are at the end of the scalar.
- if single {
- if parser.buffer[parser.buffer_pos] == '\'' {
- break
- }
- } else {
- if parser.buffer[parser.buffer_pos] == '"' {
- break
- }
- }
-
- // Consume blank characters.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
- if is_blank(parser.buffer, parser.buffer_pos) {
- // Consume a space or a tab character.
- if !leading_blanks {
- whitespaces = read(parser, whitespaces)
- } else {
- skip(parser)
- }
- } else {
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
-
- // Check if it is a first line break.
- if !leading_blanks {
- whitespaces = whitespaces[:0]
- leading_break = read_line(parser, leading_break)
- leading_blanks = true
- } else {
- trailing_breaks = read_line(parser, trailing_breaks)
- }
- }
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Join the whitespaces or fold line breaks.
- if leading_blanks {
- // Do we need to fold line breaks?
- if len(leading_break) > 0 && leading_break[0] == '\n' {
- if len(trailing_breaks) == 0 {
- s = append(s, ' ')
- } else {
- s = append(s, trailing_breaks...)
- }
- } else {
- s = append(s, leading_break...)
- s = append(s, trailing_breaks...)
- }
- trailing_breaks = trailing_breaks[:0]
- leading_break = leading_break[:0]
- } else {
- s = append(s, whitespaces...)
- whitespaces = whitespaces[:0]
- }
- }
-
- // Eat the right quote.
- skip(parser)
- end_mark := parser.mark
-
- // Create a token.
- *token = yaml_token_t{
- typ: yaml_SCALAR_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- value: s,
- style: yaml_SINGLE_QUOTED_SCALAR_STYLE,
- }
- if !single {
- token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
- }
- return true
-}
-
-// Scan a plain scalar.
-func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool {
-
- var s, leading_break, trailing_breaks, whitespaces []byte
- var leading_blanks bool
- var indent = parser.indent + 1
-
- start_mark := parser.mark
- end_mark := parser.mark
-
- // Consume the content of the plain scalar.
- for {
- // Check for a document indicator.
- if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
- return false
- }
- if parser.mark.column == 0 &&
- ((parser.buffer[parser.buffer_pos+0] == '-' &&
- parser.buffer[parser.buffer_pos+1] == '-' &&
- parser.buffer[parser.buffer_pos+2] == '-') ||
- (parser.buffer[parser.buffer_pos+0] == '.' &&
- parser.buffer[parser.buffer_pos+1] == '.' &&
- parser.buffer[parser.buffer_pos+2] == '.')) &&
- is_blankz(parser.buffer, parser.buffer_pos+3) {
- break
- }
-
- // Check for a comment.
- if parser.buffer[parser.buffer_pos] == '#' {
- break
- }
-
- // Consume non-blank characters.
- for !is_blankz(parser.buffer, parser.buffer_pos) {
-
- // Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13".
- if parser.flow_level > 0 &&
- parser.buffer[parser.buffer_pos] == ':' &&
- !is_blankz(parser.buffer, parser.buffer_pos+1) {
- yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
- start_mark, "found unexpected ':'")
- return false
- }
-
- // Check for indicators that may end a plain scalar.
- if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) ||
- (parser.flow_level > 0 &&
- (parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == ':' ||
- parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' ||
- parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
- parser.buffer[parser.buffer_pos] == '}')) {
- break
- }
-
- // Check if we need to join whitespaces and breaks.
- if leading_blanks || len(whitespaces) > 0 {
- if leading_blanks {
- // Do we need to fold line breaks?
- if leading_break[0] == '\n' {
- if len(trailing_breaks) == 0 {
- s = append(s, ' ')
- } else {
- s = append(s, trailing_breaks...)
- }
- } else {
- s = append(s, leading_break...)
- s = append(s, trailing_breaks...)
- }
- trailing_breaks = trailing_breaks[:0]
- leading_break = leading_break[:0]
- leading_blanks = false
- } else {
- s = append(s, whitespaces...)
- whitespaces = whitespaces[:0]
- }
- }
-
- // Copy the character.
- s = read(parser, s)
-
- end_mark = parser.mark
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
- }
-
- // Is it the end?
- if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) {
- break
- }
-
- // Consume blank characters.
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
-
- for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
- if is_blank(parser.buffer, parser.buffer_pos) {
-
- // Check for tab character that abuse indentation.
- if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) {
- yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
- start_mark, "found a tab character that violate indentation")
- return false
- }
-
- // Consume a space or a tab character.
- if !leading_blanks {
- whitespaces = read(parser, whitespaces)
- } else {
- skip(parser)
- }
- } else {
- if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
- return false
- }
-
- // Check if it is a first line break.
- if !leading_blanks {
- whitespaces = whitespaces[:0]
- leading_break = read_line(parser, leading_break)
- leading_blanks = true
- } else {
- trailing_breaks = read_line(parser, trailing_breaks)
- }
- }
- if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
- return false
- }
- }
-
- // Check indentation level.
- if parser.flow_level == 0 && parser.mark.column < indent {
- break
- }
- }
-
- // Create a token.
- *token = yaml_token_t{
- typ: yaml_SCALAR_TOKEN,
- start_mark: start_mark,
- end_mark: end_mark,
- value: s,
- style: yaml_PLAIN_SCALAR_STYLE,
- }
-
- // Note that we change the 'simple_key_allowed' flag.
- if leading_blanks {
- parser.simple_key_allowed = true
- }
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/sorter.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/sorter.go
deleted file mode 100644
index 5958822f9..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/sorter.go
+++ /dev/null
@@ -1,104 +0,0 @@
-package yaml
-
-import (
- "reflect"
- "unicode"
-)
-
-type keyList []reflect.Value
-
-func (l keyList) Len() int { return len(l) }
-func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
-func (l keyList) Less(i, j int) bool {
- a := l[i]
- b := l[j]
- ak := a.Kind()
- bk := b.Kind()
- for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
- a = a.Elem()
- ak = a.Kind()
- }
- for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
- b = b.Elem()
- bk = b.Kind()
- }
- af, aok := keyFloat(a)
- bf, bok := keyFloat(b)
- if aok && bok {
- if af != bf {
- return af < bf
- }
- if ak != bk {
- return ak < bk
- }
- return numLess(a, b)
- }
- if ak != reflect.String || bk != reflect.String {
- return ak < bk
- }
- ar, br := []rune(a.String()), []rune(b.String())
- for i := 0; i < len(ar) && i < len(br); i++ {
- if ar[i] == br[i] {
- continue
- }
- al := unicode.IsLetter(ar[i])
- bl := unicode.IsLetter(br[i])
- if al && bl {
- return ar[i] < br[i]
- }
- if al || bl {
- return bl
- }
- var ai, bi int
- var an, bn int64
- for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
- an = an*10 + int64(ar[ai]-'0')
- }
- for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
- bn = bn*10 + int64(br[bi]-'0')
- }
- if an != bn {
- return an < bn
- }
- if ai != bi {
- return ai < bi
- }
- return ar[i] < br[i]
- }
- return len(ar) < len(br)
-}
-
-// keyFloat returns a float value for v if it is a number/bool
-// and whether it is a number/bool or not.
-func keyFloat(v reflect.Value) (f float64, ok bool) {
- switch v.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return float64(v.Int()), true
- case reflect.Float32, reflect.Float64:
- return v.Float(), true
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return float64(v.Uint()), true
- case reflect.Bool:
- if v.Bool() {
- return 1, true
- }
- return 0, true
- }
- return 0, false
-}
-
-// numLess returns whether a < b.
-// a and b must necessarily have the same kind.
-func numLess(a, b reflect.Value) bool {
- switch a.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return a.Int() < b.Int()
- case reflect.Float32, reflect.Float64:
- return a.Float() < b.Float()
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return a.Uint() < b.Uint()
- case reflect.Bool:
- return !a.Bool() && b.Bool()
- }
- panic("not a number")
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/writerc.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/writerc.go
deleted file mode 100644
index 190362f25..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/writerc.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package yaml
-
-// Set the writer error and return false.
-func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool {
- emitter.error = yaml_WRITER_ERROR
- emitter.problem = problem
- return false
-}
-
-// Flush the output buffer.
-func yaml_emitter_flush(emitter *yaml_emitter_t) bool {
- if emitter.write_handler == nil {
- panic("write handler not set")
- }
-
- // Check if the buffer is empty.
- if emitter.buffer_pos == 0 {
- return true
- }
-
- // If the output encoding is UTF-8, we don't need to recode the buffer.
- if emitter.encoding == yaml_UTF8_ENCODING {
- if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil {
- return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
- }
- emitter.buffer_pos = 0
- return true
- }
-
- // Recode the buffer into the raw buffer.
- var low, high int
- if emitter.encoding == yaml_UTF16LE_ENCODING {
- low, high = 0, 1
- } else {
- high, low = 1, 0
- }
-
- pos := 0
- for pos < emitter.buffer_pos {
- // See the "reader.c" code for more details on UTF-8 encoding. Note
- // that we assume that the buffer contains a valid UTF-8 sequence.
-
- // Read the next UTF-8 character.
- octet := emitter.buffer[pos]
-
- var w int
- var value rune
- switch {
- case octet&0x80 == 0x00:
- w, value = 1, rune(octet&0x7F)
- case octet&0xE0 == 0xC0:
- w, value = 2, rune(octet&0x1F)
- case octet&0xF0 == 0xE0:
- w, value = 3, rune(octet&0x0F)
- case octet&0xF8 == 0xF0:
- w, value = 4, rune(octet&0x07)
- }
- for k := 1; k < w; k++ {
- octet = emitter.buffer[pos+k]
- value = (value << 6) + (rune(octet) & 0x3F)
- }
- pos += w
-
- // Write the character.
- if value < 0x10000 {
- var b [2]byte
- b[high] = byte(value >> 8)
- b[low] = byte(value & 0xFF)
- emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1])
- } else {
- // Write the character using a surrogate pair (check "reader.c").
- var b [4]byte
- value -= 0x10000
- b[high] = byte(0xD8 + (value >> 18))
- b[low] = byte((value >> 10) & 0xFF)
- b[high+2] = byte(0xDC + ((value >> 8) & 0xFF))
- b[low+2] = byte(value & 0xFF)
- emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3])
- }
- }
-
- // Write the raw buffer.
- if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil {
- return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
- }
- emitter.buffer_pos = 0
- emitter.raw_buffer = emitter.raw_buffer[:0]
- return true
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yaml.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yaml.go
deleted file mode 100644
index 36d6b883a..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yaml.go
+++ /dev/null
@@ -1,346 +0,0 @@
-// Package yaml implements YAML support for the Go language.
-//
-// Source code and other details for the project are available at GitHub:
-//
-// https://github.com/go-yaml/yaml
-//
-package yaml
-
-import (
- "errors"
- "fmt"
- "reflect"
- "strings"
- "sync"
-)
-
-// MapSlice encodes and decodes as a YAML map.
-// The order of keys is preserved when encoding and decoding.
-type MapSlice []MapItem
-
-// MapItem is an item in a MapSlice.
-type MapItem struct {
- Key, Value interface{}
-}
-
-// The Unmarshaler interface may be implemented by types to customize their
-// behavior when being unmarshaled from a YAML document. The UnmarshalYAML
-// method receives a function that may be called to unmarshal the original
-// YAML value into a field or variable. It is safe to call the unmarshal
-// function parameter more than once if necessary.
-type Unmarshaler interface {
- UnmarshalYAML(unmarshal func(interface{}) error) error
-}
-
-// The Marshaler interface may be implemented by types to customize their
-// behavior when being marshaled into a YAML document. The returned value
-// is marshaled in place of the original value implementing Marshaler.
-//
-// If an error is returned by MarshalYAML, the marshaling procedure stops
-// and returns with the provided error.
-type Marshaler interface {
- MarshalYAML() (interface{}, error)
-}
-
-// Unmarshal decodes the first document found within the in byte slice
-// and assigns decoded values into the out value.
-//
-// Maps and pointers (to a struct, string, int, etc) are accepted as out
-// values. If an internal pointer within a struct is not initialized,
-// the yaml package will initialize it if necessary for unmarshalling
-// the provided data. The out parameter must not be nil.
-//
-// The type of the decoded values should be compatible with the respective
-// values in out. If one or more values cannot be decoded due to a type
-// mismatches, decoding continues partially until the end of the YAML
-// content, and a *yaml.TypeError is returned with details for all
-// missed values.
-//
-// Struct fields are only unmarshalled if they are exported (have an
-// upper case first letter), and are unmarshalled using the field name
-// lowercased as the default key. Custom keys may be defined via the
-// "yaml" name in the field tag: the content preceding the first comma
-// is used as the key, and the following comma-separated options are
-// used to tweak the marshalling process (see Marshal).
-// Conflicting names result in a runtime error.
-//
-// For example:
-//
-// type T struct {
-// F int `yaml:"a,omitempty"`
-// B int
-// }
-// var t T
-// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
-//
-// See the documentation of Marshal for the format of tags and a list of
-// supported tag options.
-//
-func Unmarshal(in []byte, out interface{}) (err error) {
- defer handleErr(&err)
- d := newDecoder()
- p := newParser(in)
- defer p.destroy()
- node := p.parse()
- if node != nil {
- v := reflect.ValueOf(out)
- if v.Kind() == reflect.Ptr && !v.IsNil() {
- v = v.Elem()
- }
- d.unmarshal(node, v)
- }
- if len(d.terrors) > 0 {
- return &TypeError{d.terrors}
- }
- return nil
-}
-
-// Marshal serializes the value provided into a YAML document. The structure
-// of the generated document will reflect the structure of the value itself.
-// Maps and pointers (to struct, string, int, etc) are accepted as the in value.
-//
-// Struct fields are only unmarshalled if they are exported (have an upper case
-// first letter), and are unmarshalled using the field name lowercased as the
-// default key. Custom keys may be defined via the "yaml" name in the field
-// tag: the content preceding the first comma is used as the key, and the
-// following comma-separated options are used to tweak the marshalling process.
-// Conflicting names result in a runtime error.
-//
-// The field tag format accepted is:
-//
-// `(...) yaml:"[][,[,]]" (...)`
-//
-// The following flags are currently supported:
-//
-// omitempty Only include the field if it's not set to the zero
-// value for the type or to empty slices or maps.
-// Does not apply to zero valued structs.
-//
-// flow Marshal using a flow style (useful for structs,
-// sequences and maps).
-//
-// inline Inline the field, which must be a struct or a map,
-// causing all of its fields or keys to be processed as if
-// they were part of the outer struct. For maps, keys must
-// not conflict with the yaml keys of other struct fields.
-//
-// In addition, if the key is "-", the field is ignored.
-//
-// For example:
-//
-// type T struct {
-// F int "a,omitempty"
-// B int
-// }
-// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
-// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
-//
-func Marshal(in interface{}) (out []byte, err error) {
- defer handleErr(&err)
- e := newEncoder()
- defer e.destroy()
- e.marshal("", reflect.ValueOf(in))
- e.finish()
- out = e.out
- return
-}
-
-func handleErr(err *error) {
- if v := recover(); v != nil {
- if e, ok := v.(yamlError); ok {
- *err = e.err
- } else {
- panic(v)
- }
- }
-}
-
-type yamlError struct {
- err error
-}
-
-func fail(err error) {
- panic(yamlError{err})
-}
-
-func failf(format string, args ...interface{}) {
- panic(yamlError{fmt.Errorf("yaml: "+format, args...)})
-}
-
-// A TypeError is returned by Unmarshal when one or more fields in
-// the YAML document cannot be properly decoded into the requested
-// types. When this error is returned, the value is still
-// unmarshaled partially.
-type TypeError struct {
- Errors []string
-}
-
-func (e *TypeError) Error() string {
- return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n "))
-}
-
-// --------------------------------------------------------------------------
-// Maintain a mapping of keys to structure field indexes
-
-// The code in this section was copied from mgo/bson.
-
-// structInfo holds details for the serialization of fields of
-// a given struct.
-type structInfo struct {
- FieldsMap map[string]fieldInfo
- FieldsList []fieldInfo
-
- // InlineMap is the number of the field in the struct that
- // contains an ,inline map, or -1 if there's none.
- InlineMap int
-}
-
-type fieldInfo struct {
- Key string
- Num int
- OmitEmpty bool
- Flow bool
-
- // Inline holds the field index if the field is part of an inlined struct.
- Inline []int
-}
-
-var structMap = make(map[reflect.Type]*structInfo)
-var fieldMapMutex sync.RWMutex
-
-func getStructInfo(st reflect.Type) (*structInfo, error) {
- fieldMapMutex.RLock()
- sinfo, found := structMap[st]
- fieldMapMutex.RUnlock()
- if found {
- return sinfo, nil
- }
-
- n := st.NumField()
- fieldsMap := make(map[string]fieldInfo)
- fieldsList := make([]fieldInfo, 0, n)
- inlineMap := -1
- for i := 0; i != n; i++ {
- field := st.Field(i)
- if field.PkgPath != "" && !field.Anonymous {
- continue // Private field
- }
-
- info := fieldInfo{Num: i}
-
- tag := field.Tag.Get("yaml")
- if tag == "" && strings.Index(string(field.Tag), ":") < 0 {
- tag = string(field.Tag)
- }
- if tag == "-" {
- continue
- }
-
- inline := false
- fields := strings.Split(tag, ",")
- if len(fields) > 1 {
- for _, flag := range fields[1:] {
- switch flag {
- case "omitempty":
- info.OmitEmpty = true
- case "flow":
- info.Flow = true
- case "inline":
- inline = true
- default:
- return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st))
- }
- }
- tag = fields[0]
- }
-
- if inline {
- switch field.Type.Kind() {
- case reflect.Map:
- if inlineMap >= 0 {
- return nil, errors.New("Multiple ,inline maps in struct " + st.String())
- }
- if field.Type.Key() != reflect.TypeOf("") {
- return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String())
- }
- inlineMap = info.Num
- case reflect.Struct:
- sinfo, err := getStructInfo(field.Type)
- if err != nil {
- return nil, err
- }
- for _, finfo := range sinfo.FieldsList {
- if _, found := fieldsMap[finfo.Key]; found {
- msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String()
- return nil, errors.New(msg)
- }
- if finfo.Inline == nil {
- finfo.Inline = []int{i, finfo.Num}
- } else {
- finfo.Inline = append([]int{i}, finfo.Inline...)
- }
- fieldsMap[finfo.Key] = finfo
- fieldsList = append(fieldsList, finfo)
- }
- default:
- //return nil, errors.New("Option ,inline needs a struct value or map field")
- return nil, errors.New("Option ,inline needs a struct value field")
- }
- continue
- }
-
- if tag != "" {
- info.Key = tag
- } else {
- info.Key = strings.ToLower(field.Name)
- }
-
- if _, found = fieldsMap[info.Key]; found {
- msg := "Duplicated key '" + info.Key + "' in struct " + st.String()
- return nil, errors.New(msg)
- }
-
- fieldsList = append(fieldsList, info)
- fieldsMap[info.Key] = info
- }
-
- sinfo = &structInfo{fieldsMap, fieldsList, inlineMap}
-
- fieldMapMutex.Lock()
- structMap[st] = sinfo
- fieldMapMutex.Unlock()
- return sinfo, nil
-}
-
-func isZero(v reflect.Value) bool {
- switch v.Kind() {
- case reflect.String:
- return len(v.String()) == 0
- case reflect.Interface, reflect.Ptr:
- return v.IsNil()
- case reflect.Slice:
- return v.Len() == 0
- case reflect.Map:
- return v.Len() == 0
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return v.Int() == 0
- case reflect.Float32, reflect.Float64:
- return v.Float() == 0
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return v.Uint() == 0
- case reflect.Bool:
- return !v.Bool()
- case reflect.Struct:
- vt := v.Type()
- for i := v.NumField() - 1; i >= 0; i-- {
- if vt.Field(i).PkgPath != "" {
- continue // Private field
- }
- if !isZero(v.Field(i)) {
- return false
- }
- }
- return true
- }
- return false
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yamlh.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yamlh.go
deleted file mode 100644
index d60a6b6b0..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yamlh.go
+++ /dev/null
@@ -1,716 +0,0 @@
-package yaml
-
-import (
- "io"
-)
-
-// The version directive data.
-type yaml_version_directive_t struct {
- major int8 // The major version number.
- minor int8 // The minor version number.
-}
-
-// The tag directive data.
-type yaml_tag_directive_t struct {
- handle []byte // The tag handle.
- prefix []byte // The tag prefix.
-}
-
-type yaml_encoding_t int
-
-// The stream encoding.
-const (
- // Let the parser choose the encoding.
- yaml_ANY_ENCODING yaml_encoding_t = iota
-
- yaml_UTF8_ENCODING // The default UTF-8 encoding.
- yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM.
- yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM.
-)
-
-type yaml_break_t int
-
-// Line break types.
-const (
- // Let the parser choose the break type.
- yaml_ANY_BREAK yaml_break_t = iota
-
- yaml_CR_BREAK // Use CR for line breaks (Mac style).
- yaml_LN_BREAK // Use LN for line breaks (Unix style).
- yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style).
-)
-
-type yaml_error_type_t int
-
-// Many bad things could happen with the parser and emitter.
-const (
- // No error is produced.
- yaml_NO_ERROR yaml_error_type_t = iota
-
- yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory.
- yaml_READER_ERROR // Cannot read or decode the input stream.
- yaml_SCANNER_ERROR // Cannot scan the input stream.
- yaml_PARSER_ERROR // Cannot parse the input stream.
- yaml_COMPOSER_ERROR // Cannot compose a YAML document.
- yaml_WRITER_ERROR // Cannot write to the output stream.
- yaml_EMITTER_ERROR // Cannot emit a YAML stream.
-)
-
-// The pointer position.
-type yaml_mark_t struct {
- index int // The position index.
- line int // The position line.
- column int // The position column.
-}
-
-// Node Styles
-
-type yaml_style_t int8
-
-type yaml_scalar_style_t yaml_style_t
-
-// Scalar styles.
-const (
- // Let the emitter choose the style.
- yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota
-
- yaml_PLAIN_SCALAR_STYLE // The plain scalar style.
- yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style.
- yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style.
- yaml_LITERAL_SCALAR_STYLE // The literal scalar style.
- yaml_FOLDED_SCALAR_STYLE // The folded scalar style.
-)
-
-type yaml_sequence_style_t yaml_style_t
-
-// Sequence styles.
-const (
- // Let the emitter choose the style.
- yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota
-
- yaml_BLOCK_SEQUENCE_STYLE // The block sequence style.
- yaml_FLOW_SEQUENCE_STYLE // The flow sequence style.
-)
-
-type yaml_mapping_style_t yaml_style_t
-
-// Mapping styles.
-const (
- // Let the emitter choose the style.
- yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota
-
- yaml_BLOCK_MAPPING_STYLE // The block mapping style.
- yaml_FLOW_MAPPING_STYLE // The flow mapping style.
-)
-
-// Tokens
-
-type yaml_token_type_t int
-
-// Token types.
-const (
- // An empty token.
- yaml_NO_TOKEN yaml_token_type_t = iota
-
- yaml_STREAM_START_TOKEN // A STREAM-START token.
- yaml_STREAM_END_TOKEN // A STREAM-END token.
-
- yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token.
- yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token.
- yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token.
- yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token.
-
- yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token.
- yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token.
- yaml_BLOCK_END_TOKEN // A BLOCK-END token.
-
- yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token.
- yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token.
- yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token.
- yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token.
-
- yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token.
- yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token.
- yaml_KEY_TOKEN // A KEY token.
- yaml_VALUE_TOKEN // A VALUE token.
-
- yaml_ALIAS_TOKEN // An ALIAS token.
- yaml_ANCHOR_TOKEN // An ANCHOR token.
- yaml_TAG_TOKEN // A TAG token.
- yaml_SCALAR_TOKEN // A SCALAR token.
-)
-
-func (tt yaml_token_type_t) String() string {
- switch tt {
- case yaml_NO_TOKEN:
- return "yaml_NO_TOKEN"
- case yaml_STREAM_START_TOKEN:
- return "yaml_STREAM_START_TOKEN"
- case yaml_STREAM_END_TOKEN:
- return "yaml_STREAM_END_TOKEN"
- case yaml_VERSION_DIRECTIVE_TOKEN:
- return "yaml_VERSION_DIRECTIVE_TOKEN"
- case yaml_TAG_DIRECTIVE_TOKEN:
- return "yaml_TAG_DIRECTIVE_TOKEN"
- case yaml_DOCUMENT_START_TOKEN:
- return "yaml_DOCUMENT_START_TOKEN"
- case yaml_DOCUMENT_END_TOKEN:
- return "yaml_DOCUMENT_END_TOKEN"
- case yaml_BLOCK_SEQUENCE_START_TOKEN:
- return "yaml_BLOCK_SEQUENCE_START_TOKEN"
- case yaml_BLOCK_MAPPING_START_TOKEN:
- return "yaml_BLOCK_MAPPING_START_TOKEN"
- case yaml_BLOCK_END_TOKEN:
- return "yaml_BLOCK_END_TOKEN"
- case yaml_FLOW_SEQUENCE_START_TOKEN:
- return "yaml_FLOW_SEQUENCE_START_TOKEN"
- case yaml_FLOW_SEQUENCE_END_TOKEN:
- return "yaml_FLOW_SEQUENCE_END_TOKEN"
- case yaml_FLOW_MAPPING_START_TOKEN:
- return "yaml_FLOW_MAPPING_START_TOKEN"
- case yaml_FLOW_MAPPING_END_TOKEN:
- return "yaml_FLOW_MAPPING_END_TOKEN"
- case yaml_BLOCK_ENTRY_TOKEN:
- return "yaml_BLOCK_ENTRY_TOKEN"
- case yaml_FLOW_ENTRY_TOKEN:
- return "yaml_FLOW_ENTRY_TOKEN"
- case yaml_KEY_TOKEN:
- return "yaml_KEY_TOKEN"
- case yaml_VALUE_TOKEN:
- return "yaml_VALUE_TOKEN"
- case yaml_ALIAS_TOKEN:
- return "yaml_ALIAS_TOKEN"
- case yaml_ANCHOR_TOKEN:
- return "yaml_ANCHOR_TOKEN"
- case yaml_TAG_TOKEN:
- return "yaml_TAG_TOKEN"
- case yaml_SCALAR_TOKEN:
- return "yaml_SCALAR_TOKEN"
- }
- return ""
-}
-
-// The token structure.
-type yaml_token_t struct {
- // The token type.
- typ yaml_token_type_t
-
- // The start/end of the token.
- start_mark, end_mark yaml_mark_t
-
- // The stream encoding (for yaml_STREAM_START_TOKEN).
- encoding yaml_encoding_t
-
- // The alias/anchor/scalar value or tag/tag directive handle
- // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN).
- value []byte
-
- // The tag suffix (for yaml_TAG_TOKEN).
- suffix []byte
-
- // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN).
- prefix []byte
-
- // The scalar style (for yaml_SCALAR_TOKEN).
- style yaml_scalar_style_t
-
- // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN).
- major, minor int8
-}
-
-// Events
-
-type yaml_event_type_t int8
-
-// Event types.
-const (
- // An empty event.
- yaml_NO_EVENT yaml_event_type_t = iota
-
- yaml_STREAM_START_EVENT // A STREAM-START event.
- yaml_STREAM_END_EVENT // A STREAM-END event.
- yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event.
- yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event.
- yaml_ALIAS_EVENT // An ALIAS event.
- yaml_SCALAR_EVENT // A SCALAR event.
- yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event.
- yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event.
- yaml_MAPPING_START_EVENT // A MAPPING-START event.
- yaml_MAPPING_END_EVENT // A MAPPING-END event.
-)
-
-// The event structure.
-type yaml_event_t struct {
-
- // The event type.
- typ yaml_event_type_t
-
- // The start and end of the event.
- start_mark, end_mark yaml_mark_t
-
- // The document encoding (for yaml_STREAM_START_EVENT).
- encoding yaml_encoding_t
-
- // The version directive (for yaml_DOCUMENT_START_EVENT).
- version_directive *yaml_version_directive_t
-
- // The list of tag directives (for yaml_DOCUMENT_START_EVENT).
- tag_directives []yaml_tag_directive_t
-
- // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT).
- anchor []byte
-
- // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
- tag []byte
-
- // The scalar value (for yaml_SCALAR_EVENT).
- value []byte
-
- // Is the document start/end indicator implicit, or the tag optional?
- // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT).
- implicit bool
-
- // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT).
- quoted_implicit bool
-
- // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
- style yaml_style_t
-}
-
-func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) }
-func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) }
-func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) }
-
-// Nodes
-
-const (
- yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null.
- yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false.
- yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values.
- yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values.
- yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values.
- yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values.
-
- yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences.
- yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping.
-
- // Not in original libyaml.
- yaml_BINARY_TAG = "tag:yaml.org,2002:binary"
- yaml_MERGE_TAG = "tag:yaml.org,2002:merge"
-
- yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str.
- yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq.
- yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map.
-)
-
-type yaml_node_type_t int
-
-// Node types.
-const (
- // An empty node.
- yaml_NO_NODE yaml_node_type_t = iota
-
- yaml_SCALAR_NODE // A scalar node.
- yaml_SEQUENCE_NODE // A sequence node.
- yaml_MAPPING_NODE // A mapping node.
-)
-
-// An element of a sequence node.
-type yaml_node_item_t int
-
-// An element of a mapping node.
-type yaml_node_pair_t struct {
- key int // The key of the element.
- value int // The value of the element.
-}
-
-// The node structure.
-type yaml_node_t struct {
- typ yaml_node_type_t // The node type.
- tag []byte // The node tag.
-
- // The node data.
-
- // The scalar parameters (for yaml_SCALAR_NODE).
- scalar struct {
- value []byte // The scalar value.
- length int // The length of the scalar value.
- style yaml_scalar_style_t // The scalar style.
- }
-
- // The sequence parameters (for YAML_SEQUENCE_NODE).
- sequence struct {
- items_data []yaml_node_item_t // The stack of sequence items.
- style yaml_sequence_style_t // The sequence style.
- }
-
- // The mapping parameters (for yaml_MAPPING_NODE).
- mapping struct {
- pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value).
- pairs_start *yaml_node_pair_t // The beginning of the stack.
- pairs_end *yaml_node_pair_t // The end of the stack.
- pairs_top *yaml_node_pair_t // The top of the stack.
- style yaml_mapping_style_t // The mapping style.
- }
-
- start_mark yaml_mark_t // The beginning of the node.
- end_mark yaml_mark_t // The end of the node.
-
-}
-
-// The document structure.
-type yaml_document_t struct {
-
- // The document nodes.
- nodes []yaml_node_t
-
- // The version directive.
- version_directive *yaml_version_directive_t
-
- // The list of tag directives.
- tag_directives_data []yaml_tag_directive_t
- tag_directives_start int // The beginning of the tag directives list.
- tag_directives_end int // The end of the tag directives list.
-
- start_implicit int // Is the document start indicator implicit?
- end_implicit int // Is the document end indicator implicit?
-
- // The start/end of the document.
- start_mark, end_mark yaml_mark_t
-}
-
-// The prototype of a read handler.
-//
-// The read handler is called when the parser needs to read more bytes from the
-// source. The handler should write not more than size bytes to the buffer.
-// The number of written bytes should be set to the size_read variable.
-//
-// [in,out] data A pointer to an application data specified by
-// yaml_parser_set_input().
-// [out] buffer The buffer to write the data from the source.
-// [in] size The size of the buffer.
-// [out] size_read The actual number of bytes read from the source.
-//
-// On success, the handler should return 1. If the handler failed,
-// the returned value should be 0. On EOF, the handler should set the
-// size_read to 0 and return 1.
-type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error)
-
-// This structure holds information about a potential simple key.
-type yaml_simple_key_t struct {
- possible bool // Is a simple key possible?
- required bool // Is a simple key required?
- token_number int // The number of the token.
- mark yaml_mark_t // The position mark.
-}
-
-// The states of the parser.
-type yaml_parser_state_t int
-
-const (
- yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota
-
- yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document.
- yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START.
- yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document.
- yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END.
- yaml_PARSE_BLOCK_NODE_STATE // Expect a block node.
- yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence.
- yaml_PARSE_FLOW_NODE_STATE // Expect a flow node.
- yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence.
- yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence.
- yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence.
- yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
- yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key.
- yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value.
- yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence.
- yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence.
- yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping.
- yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping.
- yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry.
- yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
- yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
- yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
- yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping.
- yaml_PARSE_END_STATE // Expect nothing.
-)
-
-func (ps yaml_parser_state_t) String() string {
- switch ps {
- case yaml_PARSE_STREAM_START_STATE:
- return "yaml_PARSE_STREAM_START_STATE"
- case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
- return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE"
- case yaml_PARSE_DOCUMENT_START_STATE:
- return "yaml_PARSE_DOCUMENT_START_STATE"
- case yaml_PARSE_DOCUMENT_CONTENT_STATE:
- return "yaml_PARSE_DOCUMENT_CONTENT_STATE"
- case yaml_PARSE_DOCUMENT_END_STATE:
- return "yaml_PARSE_DOCUMENT_END_STATE"
- case yaml_PARSE_BLOCK_NODE_STATE:
- return "yaml_PARSE_BLOCK_NODE_STATE"
- case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
- return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE"
- case yaml_PARSE_FLOW_NODE_STATE:
- return "yaml_PARSE_FLOW_NODE_STATE"
- case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
- return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE"
- case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
- return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE"
- case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
- return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE"
- case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
- return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE"
- case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
- return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE"
- case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
- return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE"
- case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
- return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE"
- case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
- return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE"
- case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
- return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE"
- case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
- return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE"
- case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
- return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE"
- case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
- return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE"
- case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
- return "yaml_PARSE_FLOW_MAPPING_KEY_STATE"
- case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
- return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE"
- case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
- return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE"
- case yaml_PARSE_END_STATE:
- return "yaml_PARSE_END_STATE"
- }
- return ""
-}
-
-// This structure holds aliases data.
-type yaml_alias_data_t struct {
- anchor []byte // The anchor.
- index int // The node id.
- mark yaml_mark_t // The anchor mark.
-}
-
-// The parser structure.
-//
-// All members are internal. Manage the structure using the
-// yaml_parser_ family of functions.
-type yaml_parser_t struct {
-
- // Error handling
-
- error yaml_error_type_t // Error type.
-
- problem string // Error description.
-
- // The byte about which the problem occured.
- problem_offset int
- problem_value int
- problem_mark yaml_mark_t
-
- // The error context.
- context string
- context_mark yaml_mark_t
-
- // Reader stuff
-
- read_handler yaml_read_handler_t // Read handler.
-
- input_file io.Reader // File input data.
- input []byte // String input data.
- input_pos int
-
- eof bool // EOF flag
-
- buffer []byte // The working buffer.
- buffer_pos int // The current position of the buffer.
-
- unread int // The number of unread characters in the buffer.
-
- raw_buffer []byte // The raw buffer.
- raw_buffer_pos int // The current position of the buffer.
-
- encoding yaml_encoding_t // The input encoding.
-
- offset int // The offset of the current position (in bytes).
- mark yaml_mark_t // The mark of the current position.
-
- // Scanner stuff
-
- stream_start_produced bool // Have we started to scan the input stream?
- stream_end_produced bool // Have we reached the end of the input stream?
-
- flow_level int // The number of unclosed '[' and '{' indicators.
-
- tokens []yaml_token_t // The tokens queue.
- tokens_head int // The head of the tokens queue.
- tokens_parsed int // The number of tokens fetched from the queue.
- token_available bool // Does the tokens queue contain a token ready for dequeueing.
-
- indent int // The current indentation level.
- indents []int // The indentation levels stack.
-
- simple_key_allowed bool // May a simple key occur at the current position?
- simple_keys []yaml_simple_key_t // The stack of simple keys.
-
- // Parser stuff
-
- state yaml_parser_state_t // The current parser state.
- states []yaml_parser_state_t // The parser states stack.
- marks []yaml_mark_t // The stack of marks.
- tag_directives []yaml_tag_directive_t // The list of TAG directives.
-
- // Dumper stuff
-
- aliases []yaml_alias_data_t // The alias data.
-
- document *yaml_document_t // The currently parsed document.
-}
-
-// Emitter Definitions
-
-// The prototype of a write handler.
-//
-// The write handler is called when the emitter needs to flush the accumulated
-// characters to the output. The handler should write @a size bytes of the
-// @a buffer to the output.
-//
-// @param[in,out] data A pointer to an application data specified by
-// yaml_emitter_set_output().
-// @param[in] buffer The buffer with bytes to be written.
-// @param[in] size The size of the buffer.
-//
-// @returns On success, the handler should return @c 1. If the handler failed,
-// the returned value should be @c 0.
-//
-type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error
-
-type yaml_emitter_state_t int
-
-// The emitter states.
-const (
- // Expect STREAM-START.
- yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota
-
- yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END.
- yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END.
- yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document.
- yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END.
- yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence.
- yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence.
- yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
- yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
- yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping.
- yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
- yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence.
- yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence.
- yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
- yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping.
- yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping.
- yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping.
- yaml_EMIT_END_STATE // Expect nothing.
-)
-
-// The emitter structure.
-//
-// All members are internal. Manage the structure using the @c yaml_emitter_
-// family of functions.
-type yaml_emitter_t struct {
-
- // Error handling
-
- error yaml_error_type_t // Error type.
- problem string // Error description.
-
- // Writer stuff
-
- write_handler yaml_write_handler_t // Write handler.
-
- output_buffer *[]byte // String output data.
- output_file io.Writer // File output data.
-
- buffer []byte // The working buffer.
- buffer_pos int // The current position of the buffer.
-
- raw_buffer []byte // The raw buffer.
- raw_buffer_pos int // The current position of the buffer.
-
- encoding yaml_encoding_t // The stream encoding.
-
- // Emitter stuff
-
- canonical bool // If the output is in the canonical style?
- best_indent int // The number of indentation spaces.
- best_width int // The preferred width of the output lines.
- unicode bool // Allow unescaped non-ASCII characters?
- line_break yaml_break_t // The preferred line break.
-
- state yaml_emitter_state_t // The current emitter state.
- states []yaml_emitter_state_t // The stack of states.
-
- events []yaml_event_t // The event queue.
- events_head int // The head of the event queue.
-
- indents []int // The stack of indentation levels.
-
- tag_directives []yaml_tag_directive_t // The list of tag directives.
-
- indent int // The current indentation level.
-
- flow_level int // The current flow level.
-
- root_context bool // Is it the document root context?
- sequence_context bool // Is it a sequence context?
- mapping_context bool // Is it a mapping context?
- simple_key_context bool // Is it a simple mapping key context?
-
- line int // The current line.
- column int // The current column.
- whitespace bool // If the last character was a whitespace?
- indention bool // If the last character was an indentation character (' ', '-', '?', ':')?
- open_ended bool // If an explicit document end is required?
-
- // Anchor analysis.
- anchor_data struct {
- anchor []byte // The anchor value.
- alias bool // Is it an alias?
- }
-
- // Tag analysis.
- tag_data struct {
- handle []byte // The tag handle.
- suffix []byte // The tag suffix.
- }
-
- // Scalar analysis.
- scalar_data struct {
- value []byte // The scalar value.
- multiline bool // Does the scalar contain line breaks?
- flow_plain_allowed bool // Can the scalar be expessed in the flow plain style?
- block_plain_allowed bool // Can the scalar be expressed in the block plain style?
- single_quoted_allowed bool // Can the scalar be expressed in the single quoted style?
- block_allowed bool // Can the scalar be expressed in the literal or folded styles?
- style yaml_scalar_style_t // The output style.
- }
-
- // Dumper stuff
-
- opened bool // If the stream was already opened?
- closed bool // If the stream was already closed?
-
- // The information associated with the document nodes.
- anchors *struct {
- references int // The number of references.
- anchor int // The anchor id.
- serialized bool // If the node has been emitted?
- }
-
- last_anchor_id int // The last assigned anchor id.
-
- document *yaml_document_t // The currently emitted document.
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yamlprivateh.go b/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yamlprivateh.go
deleted file mode 100644
index 8110ce3c3..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/yamlprivateh.go
+++ /dev/null
@@ -1,173 +0,0 @@
-package yaml
-
-const (
- // The size of the input raw buffer.
- input_raw_buffer_size = 512
-
- // The size of the input buffer.
- // It should be possible to decode the whole raw buffer.
- input_buffer_size = input_raw_buffer_size * 3
-
- // The size of the output buffer.
- output_buffer_size = 128
-
- // The size of the output raw buffer.
- // It should be possible to encode the whole output buffer.
- output_raw_buffer_size = (output_buffer_size*2 + 2)
-
- // The size of other stacks and queues.
- initial_stack_size = 16
- initial_queue_size = 16
- initial_string_size = 16
-)
-
-// Check if the character at the specified position is an alphabetical
-// character, a digit, '_', or '-'.
-func is_alpha(b []byte, i int) bool {
- return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-'
-}
-
-// Check if the character at the specified position is a digit.
-func is_digit(b []byte, i int) bool {
- return b[i] >= '0' && b[i] <= '9'
-}
-
-// Get the value of a digit.
-func as_digit(b []byte, i int) int {
- return int(b[i]) - '0'
-}
-
-// Check if the character at the specified position is a hex-digit.
-func is_hex(b []byte, i int) bool {
- return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f'
-}
-
-// Get the value of a hex-digit.
-func as_hex(b []byte, i int) int {
- bi := b[i]
- if bi >= 'A' && bi <= 'F' {
- return int(bi) - 'A' + 10
- }
- if bi >= 'a' && bi <= 'f' {
- return int(bi) - 'a' + 10
- }
- return int(bi) - '0'
-}
-
-// Check if the character is ASCII.
-func is_ascii(b []byte, i int) bool {
- return b[i] <= 0x7F
-}
-
-// Check if the character at the start of the buffer can be printed unescaped.
-func is_printable(b []byte, i int) bool {
- return ((b[i] == 0x0A) || // . == #x0A
- (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E
- (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF
- (b[i] > 0xC2 && b[i] < 0xED) ||
- (b[i] == 0xED && b[i+1] < 0xA0) ||
- (b[i] == 0xEE) ||
- (b[i] == 0xEF && // #xE000 <= . <= #xFFFD
- !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF
- !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF))))
-}
-
-// Check if the character at the specified position is NUL.
-func is_z(b []byte, i int) bool {
- return b[i] == 0x00
-}
-
-// Check if the beginning of the buffer is a BOM.
-func is_bom(b []byte, i int) bool {
- return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
-}
-
-// Check if the character at the specified position is space.
-func is_space(b []byte, i int) bool {
- return b[i] == ' '
-}
-
-// Check if the character at the specified position is tab.
-func is_tab(b []byte, i int) bool {
- return b[i] == '\t'
-}
-
-// Check if the character at the specified position is blank (space or tab).
-func is_blank(b []byte, i int) bool {
- //return is_space(b, i) || is_tab(b, i)
- return b[i] == ' ' || b[i] == '\t'
-}
-
-// Check if the character at the specified position is a line break.
-func is_break(b []byte, i int) bool {
- return (b[i] == '\r' || // CR (#xD)
- b[i] == '\n' || // LF (#xA)
- b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
- b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
- b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029)
-}
-
-func is_crlf(b []byte, i int) bool {
- return b[i] == '\r' && b[i+1] == '\n'
-}
-
-// Check if the character is a line break or NUL.
-func is_breakz(b []byte, i int) bool {
- //return is_break(b, i) || is_z(b, i)
- return ( // is_break:
- b[i] == '\r' || // CR (#xD)
- b[i] == '\n' || // LF (#xA)
- b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
- b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
- b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
- // is_z:
- b[i] == 0)
-}
-
-// Check if the character is a line break, space, or NUL.
-func is_spacez(b []byte, i int) bool {
- //return is_space(b, i) || is_breakz(b, i)
- return ( // is_space:
- b[i] == ' ' ||
- // is_breakz:
- b[i] == '\r' || // CR (#xD)
- b[i] == '\n' || // LF (#xA)
- b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
- b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
- b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
- b[i] == 0)
-}
-
-// Check if the character is a line break, space, tab, or NUL.
-func is_blankz(b []byte, i int) bool {
- //return is_blank(b, i) || is_breakz(b, i)
- return ( // is_blank:
- b[i] == ' ' || b[i] == '\t' ||
- // is_breakz:
- b[i] == '\r' || // CR (#xD)
- b[i] == '\n' || // LF (#xA)
- b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
- b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
- b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
- b[i] == 0)
-}
-
-// Determine the width of the character.
-func width(b byte) int {
- // Don't replace these by a switch without first
- // confirming that it is being inlined.
- if b&0x80 == 0x00 {
- return 1
- }
- if b&0xE0 == 0xC0 {
- return 2
- }
- if b&0xF0 == 0xE0 {
- return 3
- }
- if b&0xF8 == 0xF0 {
- return 4
- }
- return 0
-
-}
diff --git a/vendor/src/github.com/alecthomas/gometalinter/vendor/manifest b/vendor/src/github.com/alecthomas/gometalinter/vendor/manifest
deleted file mode 100644
index 10130cb29..000000000
--- a/vendor/src/github.com/alecthomas/gometalinter/vendor/manifest
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "version": 0,
- "dependencies": [
- {
- "importpath": "github.com/alecthomas/units",
- "repository": "https://github.com/alecthomas/units",
- "vcs": "git",
- "revision": "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/google/shlex",
- "repository": "https://github.com/google/shlex",
- "vcs": "git",
- "revision": "6f45313302b9c56850fc17f99e40caebce98c716",
- "branch": "master",
- "notests": true
- },
- {
- "importpath": "github.com/nicksnyder/go-i18n/i18n",
- "repository": "https://github.com/nicksnyder/go-i18n",
- "vcs": "git",
- "revision": "2c24b78755bd85f2b97c45f6f1bf906660b59d56",
- "branch": "master",
- "path": "/i18n",
- "notests": true
- },
- {
- "importpath": "gopkg.in/alecthomas/kingpin.v3-unstable",
- "repository": "https://gopkg.in/alecthomas/kingpin.v3-unstable",
- "vcs": "git",
- "revision": "63abe20a23e29e80bbef8089bd3dee3ac25e5306",
- "branch": "v3-unstable",
- "notests": true
- },
- {
- "importpath": "gopkg.in/yaml.v2",
- "repository": "https://gopkg.in/yaml.v2",
- "vcs": "git",
- "revision": "a3f3340b5840cee44f372bddb5880fcbc419b46a",
- "branch": "v2",
- "notests": true
- }
- ]
-}
\ No newline at end of file
diff --git a/vendor/src/github.com/alecthomas/units/COPYING b/vendor/src/github.com/alecthomas/units/COPYING
deleted file mode 100644
index 2993ec085..000000000
--- a/vendor/src/github.com/alecthomas/units/COPYING
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2014 Alec Thomas
-
-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/src/github.com/alecthomas/units/README.md b/vendor/src/github.com/alecthomas/units/README.md
deleted file mode 100644
index bee884e3c..000000000
--- a/vendor/src/github.com/alecthomas/units/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Units - Helpful unit multipliers and functions for Go
-
-The goal of this package is to have functionality similar to the [time](http://golang.org/pkg/time/) package.
-
-It allows for code like this:
-
-```go
-n, err := ParseBase2Bytes("1KB")
-// n == 1024
-n = units.Mebibyte * 512
-```
diff --git a/vendor/src/github.com/alecthomas/units/bytes.go b/vendor/src/github.com/alecthomas/units/bytes.go
deleted file mode 100644
index eaadeb800..000000000
--- a/vendor/src/github.com/alecthomas/units/bytes.go
+++ /dev/null
@@ -1,83 +0,0 @@
-package units
-
-// Base2Bytes is the old non-SI power-of-2 byte scale (1024 bytes in a kilobyte,
-// etc.).
-type Base2Bytes int64
-
-// Base-2 byte units.
-const (
- Kibibyte Base2Bytes = 1024
- KiB = Kibibyte
- Mebibyte = Kibibyte * 1024
- MiB = Mebibyte
- Gibibyte = Mebibyte * 1024
- GiB = Gibibyte
- Tebibyte = Gibibyte * 1024
- TiB = Tebibyte
- Pebibyte = Tebibyte * 1024
- PiB = Pebibyte
- Exbibyte = Pebibyte * 1024
- EiB = Exbibyte
-)
-
-var (
- bytesUnitMap = MakeUnitMap("iB", "B", 1024)
- oldBytesUnitMap = MakeUnitMap("B", "B", 1024)
-)
-
-// ParseBase2Bytes supports both iB and B in base-2 multipliers. That is, KB
-// and KiB are both 1024.
-func ParseBase2Bytes(s string) (Base2Bytes, error) {
- n, err := ParseUnit(s, bytesUnitMap)
- if err != nil {
- n, err = ParseUnit(s, oldBytesUnitMap)
- }
- return Base2Bytes(n), err
-}
-
-func (b Base2Bytes) String() string {
- return ToString(int64(b), 1024, "iB", "B")
-}
-
-var (
- metricBytesUnitMap = MakeUnitMap("B", "B", 1000)
-)
-
-// MetricBytes are SI byte units (1000 bytes in a kilobyte).
-type MetricBytes SI
-
-// SI base-10 byte units.
-const (
- Kilobyte MetricBytes = 1000
- KB = Kilobyte
- Megabyte = Kilobyte * 1000
- MB = Megabyte
- Gigabyte = Megabyte * 1000
- GB = Gigabyte
- Terabyte = Gigabyte * 1000
- TB = Terabyte
- Petabyte = Terabyte * 1000
- PB = Petabyte
- Exabyte = Petabyte * 1000
- EB = Exabyte
-)
-
-// ParseMetricBytes parses base-10 metric byte units. That is, KB is 1000 bytes.
-func ParseMetricBytes(s string) (MetricBytes, error) {
- n, err := ParseUnit(s, metricBytesUnitMap)
- return MetricBytes(n), err
-}
-
-func (m MetricBytes) String() string {
- return ToString(int64(m), 1000, "B", "B")
-}
-
-// ParseStrictBytes supports both iB and B suffixes for base 2 and metric,
-// respectively. That is, KiB represents 1024 and KB represents 1000.
-func ParseStrictBytes(s string) (int64, error) {
- n, err := ParseUnit(s, bytesUnitMap)
- if err != nil {
- n, err = ParseUnit(s, metricBytesUnitMap)
- }
- return int64(n), err
-}
diff --git a/vendor/src/github.com/alecthomas/units/bytes_test.go b/vendor/src/github.com/alecthomas/units/bytes_test.go
deleted file mode 100644
index 6cbc79de4..000000000
--- a/vendor/src/github.com/alecthomas/units/bytes_test.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package units
-
-import (
- "testing"
-
- "github.com/stretchr/testify/assert"
-)
-
-func TestBase2BytesString(t *testing.T) {
- assert.Equal(t, Base2Bytes(0).String(), "0B")
- assert.Equal(t, Base2Bytes(1025).String(), "1KiB1B")
- assert.Equal(t, Base2Bytes(1048577).String(), "1MiB1B")
-}
-
-func TestParseBase2Bytes(t *testing.T) {
- n, err := ParseBase2Bytes("0B")
- assert.NoError(t, err)
- assert.Equal(t, 0, int(n))
- n, err = ParseBase2Bytes("1KB")
- assert.NoError(t, err)
- assert.Equal(t, 1024, int(n))
- n, err = ParseBase2Bytes("1MB1KB25B")
- assert.NoError(t, err)
- assert.Equal(t, 1049625, int(n))
- n, err = ParseBase2Bytes("1.5MB")
- assert.NoError(t, err)
- assert.Equal(t, 1572864, int(n))
-}
-
-func TestMetricBytesString(t *testing.T) {
- assert.Equal(t, MetricBytes(0).String(), "0B")
- assert.Equal(t, MetricBytes(1001).String(), "1KB1B")
- assert.Equal(t, MetricBytes(1001025).String(), "1MB1KB25B")
-}
-
-func TestParseMetricBytes(t *testing.T) {
- n, err := ParseMetricBytes("0B")
- assert.NoError(t, err)
- assert.Equal(t, 0, int(n))
- n, err = ParseMetricBytes("1KB1B")
- assert.NoError(t, err)
- assert.Equal(t, 1001, int(n))
- n, err = ParseMetricBytes("1MB1KB25B")
- assert.NoError(t, err)
- assert.Equal(t, 1001025, int(n))
- n, err = ParseMetricBytes("1.5MB")
- assert.NoError(t, err)
- assert.Equal(t, 1500000, int(n))
-}
diff --git a/vendor/src/github.com/alecthomas/units/doc.go b/vendor/src/github.com/alecthomas/units/doc.go
deleted file mode 100644
index 156ae3867..000000000
--- a/vendor/src/github.com/alecthomas/units/doc.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Package units provides helpful unit multipliers and functions for Go.
-//
-// The goal of this package is to have functionality similar to the time [1] package.
-//
-//
-// [1] http://golang.org/pkg/time/
-//
-// It allows for code like this:
-//
-// n, err := ParseBase2Bytes("1KB")
-// // n == 1024
-// n = units.Mebibyte * 512
-package units
diff --git a/vendor/src/github.com/alecthomas/units/si.go b/vendor/src/github.com/alecthomas/units/si.go
deleted file mode 100644
index 8234a9d52..000000000
--- a/vendor/src/github.com/alecthomas/units/si.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package units
-
-// SI units.
-type SI int64
-
-// SI unit multiples.
-const (
- Kilo SI = 1000
- Mega = Kilo * 1000
- Giga = Mega * 1000
- Tera = Giga * 1000
- Peta = Tera * 1000
- Exa = Peta * 1000
-)
-
-func MakeUnitMap(suffix, shortSuffix string, scale int64) map[string]float64 {
- return map[string]float64{
- shortSuffix: 1,
- "K" + suffix: float64(scale),
- "M" + suffix: float64(scale * scale),
- "G" + suffix: float64(scale * scale * scale),
- "T" + suffix: float64(scale * scale * scale * scale),
- "P" + suffix: float64(scale * scale * scale * scale * scale),
- "E" + suffix: float64(scale * scale * scale * scale * scale * scale),
- }
-}
diff --git a/vendor/src/github.com/alecthomas/units/util.go b/vendor/src/github.com/alecthomas/units/util.go
deleted file mode 100644
index 6527e92d1..000000000
--- a/vendor/src/github.com/alecthomas/units/util.go
+++ /dev/null
@@ -1,138 +0,0 @@
-package units
-
-import (
- "errors"
- "fmt"
- "strings"
-)
-
-var (
- siUnits = []string{"", "K", "M", "G", "T", "P", "E"}
-)
-
-func ToString(n int64, scale int64, suffix, baseSuffix string) string {
- mn := len(siUnits)
- out := make([]string, mn)
- for i, m := range siUnits {
- if n%scale != 0 || i == 0 && n == 0 {
- s := suffix
- if i == 0 {
- s = baseSuffix
- }
- out[mn-1-i] = fmt.Sprintf("%d%s%s", n%scale, m, s)
- }
- n /= scale
- if n == 0 {
- break
- }
- }
- return strings.Join(out, "")
-}
-
-// Below code ripped straight from http://golang.org/src/pkg/time/format.go?s=33392:33438#L1123
-var errLeadingInt = errors.New("units: bad [0-9]*") // never printed
-
-// leadingInt consumes the leading [0-9]* from s.
-func leadingInt(s string) (x int64, rem string, err error) {
- i := 0
- for ; i < len(s); i++ {
- c := s[i]
- if c < '0' || c > '9' {
- break
- }
- if x >= (1<<63-10)/10 {
- // overflow
- return 0, "", errLeadingInt
- }
- x = x*10 + int64(c) - '0'
- }
- return x, s[i:], nil
-}
-
-func ParseUnit(s string, unitMap map[string]float64) (int64, error) {
- // [-+]?([0-9]*(\.[0-9]*)?[a-z]+)+
- orig := s
- f := float64(0)
- neg := false
-
- // Consume [-+]?
- if s != "" {
- c := s[0]
- if c == '-' || c == '+' {
- neg = c == '-'
- s = s[1:]
- }
- }
- // Special case: if all that is left is "0", this is zero.
- if s == "0" {
- return 0, nil
- }
- if s == "" {
- return 0, errors.New("units: invalid " + orig)
- }
- for s != "" {
- g := float64(0) // this element of the sequence
-
- var x int64
- var err error
-
- // The next character must be [0-9.]
- if !(s[0] == '.' || ('0' <= s[0] && s[0] <= '9')) {
- return 0, errors.New("units: invalid " + orig)
- }
- // Consume [0-9]*
- pl := len(s)
- x, s, err = leadingInt(s)
- if err != nil {
- return 0, errors.New("units: invalid " + orig)
- }
- g = float64(x)
- pre := pl != len(s) // whether we consumed anything before a period
-
- // Consume (\.[0-9]*)?
- post := false
- if s != "" && s[0] == '.' {
- s = s[1:]
- pl := len(s)
- x, s, err = leadingInt(s)
- if err != nil {
- return 0, errors.New("units: invalid " + orig)
- }
- scale := 1.0
- for n := pl - len(s); n > 0; n-- {
- scale *= 10
- }
- g += float64(x) / scale
- post = pl != len(s)
- }
- if !pre && !post {
- // no digits (e.g. ".s" or "-.s")
- return 0, errors.New("units: invalid " + orig)
- }
-
- // Consume unit.
- i := 0
- for ; i < len(s); i++ {
- c := s[i]
- if c == '.' || ('0' <= c && c <= '9') {
- break
- }
- }
- u := s[:i]
- s = s[i:]
- unit, ok := unitMap[u]
- if !ok {
- return 0, errors.New("units: unknown unit " + u + " in " + orig)
- }
-
- f += g * unit
- }
-
- if neg {
- f = -f
- }
- if f < float64(-1<<63) || f > float64(1<<63-1) {
- return 0, errors.New("units: overflow parsing unit")
- }
- return int64(f), nil
-}
diff --git a/vendor/src/github.com/apache/thrift/CHANGES b/vendor/src/github.com/apache/thrift/CHANGES
deleted file mode 100644
index 7b674d6f6..000000000
--- a/vendor/src/github.com/apache/thrift/CHANGES
+++ /dev/null
@@ -1,2366 +0,0 @@
-Apache Thrift Changelog
-
-Thrift 0.10.0
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-1840] - Thrift Generated Code Causes Global Variable Leaks
- * [THRIFT-1828] - moc_TQTcpServer.cpp was removed from source tree but is in thrift-0.9.0.tar.gz
- * [THRIFT-1790] - cocoa: Duplicate interface definition error
- * [THRIFT-1776] - TPipeServer should implement "listen", so that TServerEventHandler preServe will work right
- * [THRIFT-1351] - Compiler does not care about binary strings
- * [THRIFT-1229] - Python fastbinary.c can not handle unicode as generated python code
- * [THRIFT-749] - C++ TBufferedTransports do not flush their buffers on delete
- * [THRIFT-747] - C++ TSocket->close calls shutdown breaking forked parent process
- * [THRIFT-732] - server exits abnormally when client calls send_xxx function without calling recv_xxx function
- * [THRIFT-3942] - TSSLSocket does not honor send and receive timeouts
- * [THRIFT-3941] - WinXP version of thrift_poll() relies on undefined behavior by passing a destructed variable to select()
- * [THRIFT-3940] - Visual Studio project file for compiler is broken
- * [THRIFT-3943] - Coverity Scan identified some high severity defects
- * [THRIFT-3929] - PHP "nsglobal" Option Results in Syntax Error in Generated Code (Trailing Backslash)
- * [THRIFT-3936] - Cannot compile 0.10.0 development tip with VS2013 and earlier (snprintf, uint32_t)
- * [THRIFT-3935] - Incorrect skipping of map and set
- * [THRIFT-3920] - Ruby: Ensuring that HTTP failures will clear the http transport outbuf var
- * [THRIFT-3919] - C# TTLSServerSocket does not use clientTimeout
- * [THRIFT-3917] - Check backports.ssl_match_hostname module version
- * [THRIFT-3909] - Fix c_glib static lib CMake build
- * [THRIFT-3904] - Typo in node tutorial leads to wrong transport being used
- * [THRIFT-3848] - As an implementer of a perl socket server, I do not want to have to remember to ignore SIGCHLD for it to work properly
- * [THRIFT-3844] - thrift_protocol cannot compile in 7.0.7
- * [THRIFT-3843] - integer issues with Haxe PHP targets cause ZigZag encoding to fail
- * [THRIFT-3842] - Dart generates incorrect code for a const struct
- * [THRIFT-3841] - dart compact protocol incorrectly serializes/deserialized doubles
- * [THRIFT-3708] - NameError: global name 'TProtocol' is not defined
- * [THRIFT-3704] - "TConnectedClient died: Could not refill buffer" message shown when using HTTP Server
- * [THRIFT-3678] - Fix javadoc errors on JDK 8
- * [THRIFT-3014] - AppVeyor support
- * [THRIFT-2994] - Node.js TJSONProtocol cannot be used for object serialization.
- * [THRIFT-2974] - writeToParcel throws NPE for optional enum fields
- * [THRIFT-2948] - Python TJSONProtocol doesn't handle structs with binary fields containing invalid unicode.
- * [THRIFT-2845] - ChildService.Plo: No such file or directory
- * [THRIFT-3276] - Binary data does not decode correctly using the TJSONProtocol when the base64 encoded data is padded.
- * [THRIFT-3253] - Using latest version of D gives deprecation notices
- * [THRIFT-2883] - TTwisted.py, during ConnectionLost processing: exceptions.RuntimeError: dictionary changed size during iteration
- * [THRIFT-2019] - Writing on a disconnected socket on Mac causes SIG PIPE
- * [THRIFT-2020] - Thrift library has some empty files that haven't really been deleted
- * [THRIFT-2049] - Go compiler doesn't build on native Windows
- * [THRIFT-2024] - TServer.cpp warns on 64-bit platforms about truncating an rlim_t into an int
- * [THRIFT-2023] - gettimeofday implementation on Windows errors when no time zone is passed in.
- * [THRIFT-2022] - CoB and dense code generation still uses TR1 bind, even though that doesn't work with clang
- * [THRIFT-2027] - Minor 64-bit and NOMINMAX issues in C++ library
- * [THRIFT-2156] - TServerSocket::listen() is throwing exceptions with misleading information
- * [THRIFT-2154] - Missing #deepCopy should return T
- * [THRIFT-3157] - TBase signature should be TBase, F extends TFieldIdEnum>
- * [THRIFT-3156] - Node TLS: server executes processing logic two full times
- * [THRIFT-3154] - tutorial/py.tornado throw EOF exception
- * [THRIFT-3063] - C++ build -Wunused-parameter warnings on processor_test, TransportTest
- * [THRIFT-3056] - Add string/collection length limits for Python protocol readers
- * [THRIFT-3237] - Fix TNamedPipeServer::createNamedPipe memory leak
- * [THRIFT-3233] - Fix C++ ThreadManager::Impl::removeWorker worker join
- * [THRIFT-3232] - Cannot deserialize json messages created with fieldNamesAsString
- * [THRIFT-3206] - Fix Visual Studio build failure due 'pthread_self': identifier not found
- * [THRIFT-3200] - JS and nodejs do not encode JSON protocol binary fields as base64
- * [THRIFT-3199] - Exception field has basic metadata
- * [THRIFT-3182] - TFramedTransport is in an invalid state after frame size exception
- * [THRIFT-2536] - new TSocket, uninitialised value reported by valgrind
- * [THRIFT-2527] - Apache Thrift IDL Compiler code generated for Node.js should be jshint clean
- * [THRIFT-2519] - "processor" class is not being generated
- * [THRIFT-2431] - TFileTransportTest fails with "check delta < XXX failed"
- * [THRIFT-2708] - Erlang library does not support "oneway" message type
- * [THRIFT-3377] - Deep copy is actually shallow when using typedef members
- * [THRIFT-3376] - C# and Python JSON protocol double values lose precision
- * [THRIFT-3373] - Various fixes for cross test servers and clients
- * [THRIFT-3370] - errno extern variable redefined. Not compiling for Android
- * [THRIFT-3379] - Potential out of range panic in Go JSON protocols
- * [THRIFT-3371] - Abstract namespace Unix domain sockets broken in C++
- * [THRIFT-3380] - nodejs: 0.9.2 -> 0.9.3 upgrade breaks Protocol and Transport requires
- * [THRIFT-3367] - Fix bad links to coding_standards.md #634
- * [THRIFT-3401] - Nested collections emit Objective-C code that cannot compile
- * [THRIFT-3403] - JSON String reader doesn't recognize UTF-16 surrogate pairs
- * [THRIFT-3362] - make check fails for C++ at the SecurityTest
- * [THRIFT-3395] - Cocoa compiler produces corrupt code when boxing enums inside map.
- * [THRIFT-3394] - compiler generates uncompilable code
- * [THRIFT-3388] - hash doesn't work on set/list
- * [THRIFT-3391] - Wrong bool formatting in test server
- * [THRIFT-3390] - TTornado server doesn't handle closed connections properly
- * [THRIFT-3382] - TBase class for C++ Library
- * [THRIFT-3392] - Java TZlibTransport does not close its wrapper streams upon close()
- * [THRIFT-3383] - i64 related warnings
- * [THRIFT-3386] - misc. warnings with make check
- * [THRIFT-3385] - warning: format ‘%lu’ expects ‘long unsigned int’, but has type ‘std::basic_string::size_type {aka unsigned int}
- * [THRIFT-3355] - npm WARN package.json thrift@1.0.0-dev No license field.
- * [THRIFT-3360] - Improve cross test servers and clients further
- * [THRIFT-3359] - Binary field incompatibilities
- * [THRIFT-3354] - Fix word-extraction substr bug in initialism code
- * [THRIFT-3350] - Python JSON protocol does not encode binary as Base64
- * [THRIFT-3577] - assertion failed at line 512 of testcontainertest.c
- * [THRIFT-3576] - Boost test --log_format arg does not accept lowercase
- * [THRIFT-3575] - Go compiler tries to use unexported library methods when using read_write_private
- * [THRIFT-3574] - Cocoa generator makes uncompilable imports
- * [THRIFT-3570] - Remove duplicate instances that are added by upstream
- * [THRIFT-3571] - Make feature test result browsable
- * [THRIFT-3569] - c_glib protocols do not check number of bytes read by transport
- * [THRIFT-3568] - THeader server crashes on readSlow
- * [THRIFT-3567] - GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
- * [THRIFT-3566] - C++/Qt: TQTcpServerTest::test_communicate() is never executed
- * [THRIFT-3564] - C++/Qt: potential core dump in TQTcpServer in case an exception occurs in TAsyncProcessor::process()
- * [THRIFT-3558] - typos in c_glib tests
- * [THRIFT-3559] - Fix awkward extra semi-colons with Cocoa container literals
- * [THRIFT-3555] - 'configure' script does not honor --with-openssl= for libcrypto for BN_init
- * [THRIFT-3554] - Constant decls may lead to "Error: internal error: prepare_member_name_mapping() already active for different struct"
- * [THRIFT-3552] - glib_c Memory Leak
- * [THRIFT-3551] - Thrift perl library missing package declaration
- * [THRIFT-3549] - Exceptions are not properly stringified in Perl library
- * [THRIFT-3546] - NodeJS code should not be namespaced (and is currently not strict-mode compliant)
- * [THRIFT-3545] - Container type literals do not compile
- * [THRIFT-3538] - Remove UnboundMethodType in TProtocolDecorator
- * [THRIFT-3536] - Error 'char' does not contain a definition for 'IsLowSurrogate' for WP7 target
- * [THRIFT-3534] - Link error when building with Qt5
- * [THRIFT-3533] - Can not send nil pointer as service method argument
- * [THRIFT-3507] - THttpClient does not use proxy from http_proxy, https_proxy environment variables
- * [THRIFT-3502] - C++ TServerSocket passes small buffer to getsockname
- * [THRIFT-3501] - Forward slash in comment causes compiler error
- * [THRIFT-3498] - C++ library assumes optional function pthread_attr_setschedpolicy is available
- * [THRIFT-3497] - Build fails with "invalid use of incomplete type"
- * [THRIFT-3496] - C++: Cob style client fails when sending a consecutive request
- * [THRIFT-3493] - libthrift does not compile on windows using visual studio
- * [THRIFT-3488] - warning: unused variable 'program'
- * [THRIFT-3489] - warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
- * [THRIFT-3487] - Full support for newer Delphi versions
- * [THRIFT-3528] - Fix warnings in thrift.ll
- * [THRIFT-3527] - -gen py:dynamic,utf8strings ignores utf8strings option
- * [THRIFT-3526] - Code generated by py:utf8strings does not work for Python3
- * [THRIFT-3524] - dcc32 warning "W1000 Symbol 'IsLowSurrogate' is deprecated: 'Use TCharHelper'" in Thrift.Protocol.JSON.pas
- * [THRIFT-3525] - py:dynamic fails to handle binary list/set/map element
- * [THRIFT-3521] - TSimpleJSONProtocolTest is not deterministic (fails when run on JDK 8)
- * [THRIFT-3520] - Dart TSocket onError stream should be typed as Object
- * [THRIFT-3519] - fastbinary does not work with -gen py:utf8strings
- * [THRIFT-3518] - TConcurrentClientSyncInfo files were missing for Visual Studio
- * [THRIFT-3512] - c_glib: Build fails due to missing features.h
- * [THRIFT-3483] - Incorrect empty binary handling introduced by THRIFT-3359
- * [THRIFT-3479] - Oneway calls should not return exceptions to clients
- * [THRIFT-3478] - Restore dropped method to THsHaServer.java
- * [THRIFT-3477] - Parser fails on enum item that starts with 'E' letter and continues with number
- * [THRIFT-3476] - Missing include in ./src/thrift/protocol/TJSONProtocol.cpp
- * [THRIFT-3474] - Docker: thrift-compiler
- * [THRIFT-3473] - When "optional' is used with a struct member, C++ server seems to not return it correctly
- * [THRIFT-3468] - Dart TSocketTransport onError handler is too restrictive
- * [THRIFT-3451] - thrift_protocol PHP extension missing config.m4 file
- * [THRIFT-3456] - rounding issue in static assert
- * [THRIFT-3455] - struct write method's return value is incorrect
- * [THRIFT-3454] - Python Tornado tutorial is broken
- * [THRIFT-3463] - Java can't be disabled in CMake build
- * [THRIFT-3450] - NPE when using SSL
- * [THRIFT-3449] - TBaseAsyncProcessor fb.responseReady() never called for oneway functions
- * [THRIFT-3471] - Dart generator does not handle uppercase argument names
- * [THRIFT-3470] - Sporadic timeouts with pipes
- * [THRIFT-3465] - Go Code With Complex Const Initializer Compilation Depends On Struct Order
- * [THRIFT-3464] - Fix several defects in c_glib code generator
- * [THRIFT-3462] - Cocoa generates Incorrect #import header names
- * [THRIFT-3453] - remove rat_exclude
- * [THRIFT-3418] - Use of ciphers in ssl.wrap_socket() breaks python 2.6 compatibility
- * [THRIFT-3417] - "namespace xsd" is not really working
- * [THRIFT-3413] - Thrift code generation bug in Go when extending service
- * [THRIFT-3420] - C++: TSSLSockets are not interruptable
- * [THRIFT-3415] - include unistd.h conditionally
- * [THRIFT-3414] - #include in THeaderTransport.h breaks windows build
- * [THRIFT-3411] - Go generates remotes with wrong package qualifiers when including
- * [THRIFT-3430] - Go THttpClient does not read HTTP response body to completion when closing
- * [THRIFT-3423] - First call to thrift_transport:read_exact fails to dispatch correct function
- * [THRIFT-3422] - Go TServerSocket doesn't close on Interrupt
- * [THRIFT-3421] - rebar as dependency instead of bundling (was: rebar fails if PWD contains Unicode)
- * [THRIFT-3428] - Go test fails when running make check
- * [THRIFT-3445] - Throwable messages are hidden from JVM stack trace output
- * [THRIFT-3443] - Thrift include can generate uncompilable code
- * [THRIFT-3444] - Large 64 bit Integer does not preserve value through Node.js JSONProtocol
- * [THRIFT-3436] - misc. cross test issues with UTF-8 path names
- * [THRIFT-3435] - Put generated Java code for fullcamel tests in a separate package/namespace
- * [THRIFT-3433] - Doubles aren't interpreted correctly
- * [THRIFT-3437] - Mingw-w64 build fail
- * [THRIFT-3434] - Dart generator produces empty name in pubspec.yaml for includes without namespaces
- * [THRIFT-3408] - JSON generator emits incorrect types
- * [THRIFT-3406] - Cocoa client should not schedule streams on main runloop
- * [THRIFT-3404] - JSON String reader doesn't recognize UTF-16 surrogate pair
- * [THRIFT-3636] - Double precision is not fully preserved in C++ TJSONProtocol
- * [THRIFT-3632] - c_glib testserialization fails with glib assertion
- * [THRIFT-3619] - Using Thrift 0.9.3 with googletest on Linux gcc 4.9 / C++11
- * [THRIFT-3617] - CMake does not build gv/xml generators
- * [THRIFT-3615] - Fix Python SSL client resource leak on connection failure
- * [THRIFT-3616] - lib/py/test/test_sslsocket.py is flaky
- * [THRIFT-3643] - Perl SSL server crushes if a client disconnect without handshake
- * [THRIFT-3639] - C# Thrift library forces TLS 1.0, thwarting TLS 1.2 usage
- * [THRIFT-3633] - Travis "C C++ - GCC" build was using clang
- * [THRIFT-3634] - Fix Python TSocket resource leak on connection failure
- * [THRIFT-3630] - Debian/Ubuntu install docs need an update
- * [THRIFT-3629] - Parser sets exitcode on errors, but generator does not
- * [THRIFT-3608] - lib/cpp/test/SecurityTest is flaky in jenkins Thrift-precommit build.
- * [THRIFT-3601] - Better conformance to PEP8 for generated code
- * [THRIFT-3599] - Validate client IP address against cert's SubjectAltName
- * [THRIFT-3598] - TBufferedTransport doesn't instantiate client connection
- * [THRIFT-3597] - `make check` hangs in go tests
- * [THRIFT-3589] - Dart generator uses wrong name in constructor for uppercase arguments with defaults
- * [THRIFT-3588] - Using TypeScript with --noImplicitAny fails
- * [THRIFT-3584] - boolean false value cannot be transferred
- * [THRIFT-3578] - Make THeaderTransport detect TCompact framed and unframed
- * [THRIFT-3323] - Python library does not handle escaped forward slash ("/") in JSON
- * [THRIFT-3322] - CMake generated "make check" failes on python_test
- * [THRIFT-3321] - Thrift can't be added as a subdirectory of another CMake-based project
- * [THRIFT-3314] - Dots in file names of includes causes dots in javascript variable names
- * [THRIFT-3307] - Segfault in Ruby serializer
- * [THRIFT-3309] - Missing TConstant.php in /lib/php/Makefile.am
- * [THRIFT-3810] - unresolved external symbol public: virtual void __cdecl apache::thrift::server::TServerFramework::serve(void)
- * [THRIFT-3736] - C++ library build fails if OpenSSL does not surrpot SSLv3
- * [THRIFT-3878] - Compile error in TSSLSocket.cpp with new OpenSSL [CRYPTO_num_locks]
- * [THRIFT-3949] - missing make dist entry for compiler/cpp/test
- * [THRIFT-449] - The wire format of the JSON Protocol may not always be valid JSON if it contains non-UTF8 encoded strings
- * [THRIFT-162] - Thrift structures are unhashable, preventing them from being used as set elements
- * [THRIFT-3961] - TConnectedClient does not terminate the connection to the client if an exception while processing the received message occures.
- * [THRIFT-3881] - Travis CI builds are failing due to docker failures (three retries, and gives up)
- * [THRIFT-3937] - Cannot compile 0.10.0 development tip with gcc-4.6.x
- * [THRIFT-3964] - Unsupported mechanism type ????? due to dependency on default OS-dependent charset
- * [THRIFT-3038] - Use of volatile in cpp library
- * [THRIFT-3301] - Java generated code uses imports that can lead to class name collisions with IDL defined types
- * [THRIFT-3348] - PHP TCompactProtocol bool&int64 readvalue bug
- * [THRIFT-3955] - TThreadedServer Memory Leak
- * [THRIFT-3829] - Thrift does not install Python Libraries if Twisted is not installed
- * [THRIFT-3932] - C++ ThreadManager has a rare termination race
- * [THRIFT-3828] - cmake fails when Boost_INCLUDE_DIRS (and other variables passed to include_directories()) is empty
- * [THRIFT-3958] - CMake WITH_MT option for windows static runtime linking does not support the cmake build type RelWithDebInfo
- * [THRIFT-3957] - TConnectedClient does not disconnect from clients when their timeout is reached.
- * [THRIFT-3953] - TSSLSocket::close should handle exceptions from waitForEvent because it is called by the destructor.
- * [THRIFT-3977] - PHP extension creates undefined values when deserializing sets
- * [THRIFT-3947] - sockaddr type isn't always large enough for the return of getsockname
- * [THRIFT-2755] - ThreadSanitizer reports data race in ThreadManager::Impl::addWorker
- * [THRIFT-3948] - errno is not the correct method of getting the error in windows
- * [THRIFT-4008] - broken ci due to upstream dependency versioning break
- * [THRIFT-3999] - Fix Debian & Ubuntu package dependencies
- * [THRIFT-3886] - PHP cross test client returns 0 even when failing
- * [THRIFT-3997] - building thrift libs does not support new openssl
-
-## Documentation
- * [THRIFT-3867] - Specify BinaryProtocol and CompactProtocol
-
-## Epic
- * [THRIFT-3049] - As an iOS developer, I want a generator and library that produces Swift code
- * [THRIFT-2336] - UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
-
-## Improvement
- * [THRIFT-1867] - Python client/server should support client-side certificates.
- * [THRIFT-1313] - c_glib compact support
- * [THRIFT-1385] - make install doesn't install java library in the setted folder
- * [THRIFT-1437] - Update RPM spec
- * [THRIFT-847] - Test Framework harmonization across all languages
- * [THRIFT-819] - add Enumeration for protocol, transport and server types
- * [THRIFT-3927] - Emit an error instead of throw an error in the async callback
- * [THRIFT-3931] - TSimpleServer: If process request encounter UNKNOWN_METHOD, don't close transport.
- * [THRIFT-3934] - Automatically resolve OpenSSL binary version on Windows CI
- * [THRIFT-3918] - Run subset of make cross
- * [THRIFT-3908] - Remove redundant dependencies from Dockerfile
- * [THRIFT-3907] - Skip Docker image build on CI when unchanged
- * [THRIFT-3868] - Java struct equals should do identity check before field comparison
- * [THRIFT-3849] - Port Go serializer and deserializer to dart
- * [THRIFT-2989] - Complete CMake build for Apache Thrift
- * [THRIFT-2980] - ThriftMemoryBuffer doesn't have a constructor option to take an existing buffer
- * [THRIFT-2856] - refactor erlang basic transports and unify interfaces
- * [THRIFT-2877] - Optimize generated hashCode
- * [THRIFT-2869] - JSON: run schema validation from tests
- * [THRIFT-3112] - [Java] AsyncMethodCallback should be typed in generated AsyncIface
- * [THRIFT-3263] - PHP jsonSerialize() should cast scalar types
- * [THRIFT-2905] - Cocoa compiler should have option to produce "modern" Objective-C
- * [THRIFT-2821] - Enable the use of custom HTTP-Header in the Transport
- * [THRIFT-2093] - added the ability to set compression level in C++ zlib transport
- * [THRIFT-2089] - Compiler ignores duplicate typenames
- * [THRIFT-2056] - Moved all #include config.h statements to #include
- * [THRIFT-2031] - Make SO_KEEPALIVE configurable for C++ lib
- * [THRIFT-2021] - Improve large binary protocol string performance
- * [THRIFT-2028] - Cleanup threading headers / libraries
- * [THRIFT-2014] - Change C++ lib includes to use style throughout
- * [THRIFT-2312] - travis.yml: build everything
- * [THRIFT-1915] - Multiplexing Services
- * [THRIFT-1736] - Visual Studio top level project files within msvc
- * [THRIFT-1735] - integrate tutorial into regular build
- * [THRIFT-1533] - Make TTransport should be Closeable
- * [THRIFT-35] - Move language tests into their appropriate library directory
- * [THRIFT-1079] - Support i64 in AS3
- * [THRIFT-1108] - SSL support for the Ruby library
- * [THRIFT-3856] - update debian package deependencies
- * [THRIFT-3833] - haxe http server implementation (by embeding into php web server)
- * [THRIFT-3839] - Performance issue with big message deserialization using php extension
- * [THRIFT-3820] - Erlang: Detect OTP >= 18 to use new time correction
- * [THRIFT-3816] - Reduce docker build duration on Travis-CI
- * [THRIFT-3815] - Put appveyor dependency versions to one place
- * [THRIFT-3788] - Compatibility improvements and Win64 support
- * [THRIFT-3792] - Timeouts for anonymous pipes should be configurable
- * [THRIFT-3794] - Split Delphi application, protocol and transport exception subtypes into separate exceptions
- * [THRIFT-3774] - The generated code should have exception_names meta info
- * [THRIFT-3762] - Fix build warnings for deprecated Thrift "byte" fields
- * [THRIFT-3756] - Improve requiredness documentation
- * [THRIFT-3761] - Add debian package for Python3
- * [THRIFT-3742] - haxe php cli support
- * [THRIFT-3733] - Socket timeout improvements
- * [THRIFT-3728] - http transport for thrift-lua
- * [THRIFT-3905] - Dart compiler does not initialize bool, int, and double properties
- * [THRIFT-3911] - Loosen Ruby dev dependency version requirements
- * [THRIFT-3906] - Run C# tests with make check
- * [THRIFT-3900] - Add Python SSL flags
- * [THRIFT-3897] - Provide meaningful exception type based on WebExceptionStatus in case of timeout
- * [THRIFT-3808] - Missing `DOUBLE` in thrift type enumeration
- * [THRIFT-3803] - Remove "file" attribute from XML generator
- * [THRIFT-3660] - Add V4 mapped address to test client cert's altname
- * [THRIFT-3661] - Use https to download meck in erlang test build
- * [THRIFT-3659] - Check configure result of CMake on CI
- * [THRIFT-3667] - Add TLS SNI support to clients
- * [THRIFT-3651] - Make backports.match_hostname and ipaddress optional
- * [THRIFT-3666] - Build D tutorial as part of Autotools build
- * [THRIFT-3665] - Add D libevent and OpenSSL to docker images
- * [THRIFT-3664] - Remove md5.c
- * [THRIFT-3662] - Add Haskell to debian docker image
- * [THRIFT-3711] - Add D to cross language test
- * [THRIFT-3691] - Run flake8 Python style check on Travis-CI
- * [THRIFT-3692] - (Re)enable Appveyor C++ and Python build
- * [THRIFT-3677] - Improve CMake Java build
- * [THRIFT-3679] - Add stdout log to testBinary in Java test server
- * [THRIFT-3718] - Reduce size of docker image for build environment
- * [THRIFT-3698] - [Travis-CI] Introduce retry to apt commands
- * [THRIFT-3127] - switch -recurse to --recurse and reserve -r
- * [THRIFT-3087] - Pass on errors like "connection closed"
- * [THRIFT-3240] - Thrift Python client should support subjectAltName and wildcard certs in TSSLSocket
- * [THRIFT-3213] - make cross should indicate when it skips a known failing test
- * [THRIFT-3208] - Fix Visual Studio solution build failure due to missing source
- * [THRIFT-3186] - Add TServerHTTP to Go library
- * [THRIFT-2342] - Add __FILE__ and __LINE__ to Thrift C++ excpetions
- * [THRIFT-3372] - Add dart generator to Visual Studio project
- * [THRIFT-3366] - ThriftTest to implement standard return values
- * [THRIFT-3402] - Provide a perl Unix Socket implementation
- * [THRIFT-3361] - Improve C# library
- * [THRIFT-3393] - Introduce i8 to provide consistent set of Thrift IDL integer types
- * [THRIFT-3339] - Support for database/sql
- * [THRIFT-3565] - C++: T[Async]Processor::getEventHandler() should be declared as const member functions
- * [THRIFT-3563] - C++/Qt: removed usage of macro QT_PREPEND_NAMESPACE as it isn't consequently used for all references to Qt types.
- * [THRIFT-3562] - Removed unused TAsyncProcessor::getAsyncServer()
- * [THRIFT-3561] - C++/Qt: make use of Q_DISABLE_COPY() to get rid of copy ctor and assignment operator
- * [THRIFT-3556] - c_glib file descriptor transport
- * [THRIFT-3544] - Make cross test fail when server process died unexpectedly
- * [THRIFT-3540] - Make python tutorial more in line with PEP8
- * [THRIFT-3535] - Dart generator argument to produce a file structure usable in parent library
- * [THRIFT-3505] - Enhance Python TSSLSocket
- * [THRIFT-3506] - Eliminate old style classes from library code
- * [THRIFT-3503] - Enable py:utf8string by default
- * [THRIFT-3499] - Add package_prefix to python generator
- * [THRIFT-3495] - Minor enhancements and fixes for cross test
- * [THRIFT-3486] - Java generated `getFieldValue` is incompatible with `setFieldValue` for binary values.
- * [THRIFT-3484] - Consolidate temporary buffers in Java's TCompactProtocol
- * [THRIFT-3516] - Add feature test for THeader TBinaryProtocol interop
- * [THRIFT-3515] - Python 2.6 compatibility and test on CI
- * [THRIFT-3514] - PHP 7 compatible version of binary protocol
- * [THRIFT-3469] - Docker: Debian support
- * [THRIFT-3416] - Retire old "xxx_namespace" declarations from the IDL
- * [THRIFT-3426] - Align autogen comment in XSD
- * [THRIFT-3424] - Add CMake android build option
- * [THRIFT-3439] - Run make cross using Python3 when available
- * [THRIFT-3440] - Python make check takes too much time
- * [THRIFT-3441] - Stabilize Travis-CI builds
- * [THRIFT-3431] - Avoid "schemes" HashMap lookups during struct reads/writes
- * [THRIFT-3432] - Add a TByteBuffer transport to the Java library
- * [THRIFT-3438] - Enable py:new_style by default
- * [THRIFT-3405] - Go THttpClient misuses http.Client objects
- * [THRIFT-3614] - Improve logging of test_sslsocket.py
- * [THRIFT-3647] - Fix php extension build warnings
- * [THRIFT-3642] - Speed up cross test runner
- * [THRIFT-3637] - Implement compact protocol for dart
- * [THRIFT-3613] - Port Python C extension to Python 3
- * [THRIFT-3612] - Add Python C extension for compact protocol
- * [THRIFT-3611] - Add --regex filter to cross test runner
- * [THRIFT-3631] - JSON protocol implementation for Lua
- * [THRIFT-3609] - Remove or replace TestPortFixture.h
- * [THRIFT-3605] - Have the compiler complain about invalid arguments and options
- * [THRIFT-3596] - Better conformance to PEP8
- * [THRIFT-3585] - Compact protocol implementation for Lua
- * [THRIFT-3582] - Erlang libraries should have service metadata
- * [THRIFT-3579] - Introduce retry to make cross
- * [THRIFT-3306] - Java: TBinaryProtocol: Use 1 temp buffer instead of allocating 8
- * [THRIFT-3910] - Do not invoke pip as part of build process
- * [THRIFT-1857] - Python 3.X Support
- * [THRIFT-1944] - Binding to zero port
- * [THRIFT-3954] - Enable the usage of structs called "Object" in Java
- * [THRIFT-3981] - Enable analyzer strong mode in Dart library
- * [THRIFT-3998] - Document ability to add custom tags to thrift structs
- * [THRIFT-4006] - Add a removeEventListener method on TSocket
-
-## New Feature
- * [THRIFT-640] - Support deprecation
- * [THRIFT-948] - SSL socket support for PHP
- * [THRIFT-764] - add Support for Vala language
- * [THRIFT-3046] - Allow PSR4 class loading for generated classes (PHP)
- * [THRIFT-2113] - Erlang SSL Socket Support
- * [THRIFT-1482] - Unix domain socket support under PHP
- * [THRIFT-519] - Support collections of types without having to explicitly define it
- * [THRIFT-468] - Rack Middleware Application for Rails
- * [THRIFT-1708] - Add event handlers for processor events
- * [THRIFT-3834] - Erlang namespacing and exception metadata
- * [THRIFT-2510] - Implement TNonblockingServer's ability to listen on unix domain sockets
- * [THRIFT-3397] - Implement TProcessorFactory in C# to enable per-client processors
- * [THRIFT-3523] - XML Generator
- * [THRIFT-3510] - Add HttpTaskAsyncHandler implementation
- * [THRIFT-3318] - PHP: SimpleJSONProtocol Implementation
- * [THRIFT-3299] - Dart language bindings in Thrift
- * [THRIFT-2835] - Add possibility to distribute generators separately from thrift core, and load them dynamically
- * [THRIFT-184] - Add OSGi Manifest headers to the libthrift java library to be able to use Thrift in the OSGi runtime
- * [THRIFT-141] - If a required field is not present on serialization, throw an exception
- * [THRIFT-1891] - Add Windows ALPC transport which is right counterpart of Unix domain sockets
-
-## Question
- * [THRIFT-1808] - The Thrift struct should be considered self-contained?
- * [THRIFT-2895] - Tutorial cpp
- * [THRIFT-3860] - Elephant-bird application Test fails for Thrift
- * [THRIFT-3811] - HTTPS Support for C++ applications
- * [THRIFT-3509] - "make check" error
-
-## Story
- * [THRIFT-3452] - .travis.yml: Migrating from legacy to container-based infrastructure
-
-## Sub-task
- * [THRIFT-1811] - ruby tutorial as part of the regular build
- * [THRIFT-2779] - PHP TJSONProtocol encode unicode into UCS-4LE which can't be parsed by other language bindings
- * [THRIFT-2110] - Erlang: Support for Multiplexing Services on any Transport, Protocol and Server
- * [THRIFT-3852] - A Travis-CI job fails with "write error"
- * [THRIFT-3740] - Fix haxelib.json classpath
- * [THRIFT-3653] - incorrect union serialization
- * [THRIFT-3652] - incorrect serialization of optionals
- * [THRIFT-3655] - incorrect union serialization
- * [THRIFT-3654] - incorrect serialization of optionals
- * [THRIFT-3656] - incorrect serialization of optionals
- * [THRIFT-3699] - Fix integer limit symbol includes in Python C extension
- * [THRIFT-3693] - Fix include issue in C++ TSSLSocketInterruptTest on Windows
- * [THRIFT-3694] - [Windows] Disable tests of a few servers that are not supported
- * [THRIFT-3696] - Install pip to CentOS Docker images to fix Python builds
- * [THRIFT-3638] - Fix haxelib.json
- * [THRIFT-3251] - Add http transport for server to Go lib
- * [THRIFT-2424] - Recursive Types
- * [THRIFT-2423] - THeader
- * [THRIFT-2413] - Python: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
- * [THRIFT-2409] - Java: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
- * [THRIFT-2412] - D: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
- * [THRIFT-2411] - C++: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
- * [THRIFT-2410] - JavaMe: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
- * [THRIFT-2668] - TestSuite: detailed result on passed tests by feature
- * [THRIFT-2659] - python Test Server fails when throwing TException
- * [THRIFT-3398] - Add CMake build for Haskell library and tests
- * [THRIFT-3396] - DART: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
- * [THRIFT-3364] - Fix ruby binary field encoding in TJSONProtocol
- * [THRIFT-3381] - Fix for misc. codegen issues with THRIFT-2905
- * [THRIFT-3573] - No rule to make target `../../../test/c_glib/src/.deps/testthrifttest-thrift_test_handler.Po'.
- * [THRIFT-3572] - "Unable to determine the behavior of a signed right shift"
- * [THRIFT-3542] - Add length limit support to Java test server
- * [THRIFT-3537] - Remove the (now obsolete) csharp:asyncctp flag
- * [THRIFT-3532] - Add configurable string and container read size limit to Python protocols
- * [THRIFT-3531] - Create cross lang feature test for string and container read length limit
- * [THRIFT-3482] - Haskell JSON protocol does not encode binary field as Base64
- * [THRIFT-3425] - Minor fixes + simplification for CentOS Dockerfile
- * [THRIFT-3442] - Run CMake tests on Appveyor
- * [THRIFT-3409] - NodeJS binary field issues
- * [THRIFT-3621] - Fix lib/cpp/test/SecurityTest.cpp to use ephemeral ports
- * [THRIFT-3628] - Fix lib/cpp/test/TServerIntegrationTest.cpp to use ephemeral ports
- * [THRIFT-3625] - Kill unused #include "TestPortFixture.h" in lib/cpp/test/TServerTransportTest.cpp.
- * [THRIFT-3646] - Fix Python extension build warnings
- * [THRIFT-3626] - Fix lib/cpp/test/TSocketInterruptTest.cpp to use ephemeral ports.
- * [THRIFT-3624] - Fix lib/cpp/test/TServerSocketTest.cpp to use ephemeral ports
- * [THRIFT-3623] - Fix Fix cpp/lib/test/TSSLSocketInterruptTest.cpp to use ephemeral ports
- * [THRIFT-3592] - Add basic test client
- * [THRIFT-3980] - add TExtendedBinaryProtocol.java
-
-## Task
- * [THRIFT-1801] - Sync up TApplicationException codes across languages and thrift implementations
- * [THRIFT-1259] - Automate versioning
-
-## Test
- * [THRIFT-3400] - Add Erlang to cross test
- * [THRIFT-3504] - Fix FastbinaryTest.py
-
-## Wish
- * [THRIFT-3923] - Maybe remove Aereo from the "Powered by" list
- * [THRIFT-2149] - Add an option to disable the generation of default operators
-
-
-
-Thrift 0.9.3
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-2441] - Cannot shutdown TThreadedServer when clients are still connected
- * [THRIFT-2465] - TBinaryProtocolT breaks if copied/moved
- * [THRIFT-2474] - thrift.h causes a compile failure
- * [THRIFT-2540] - Running configure from outside the source directory fails
- * [THRIFT-2598] - Add check for minimum Go version to configure.ac
- * [THRIFT-2647] - compiler-hs: don't decapitalize field names, do decapitalize argument bindings
- * [THRIFT-2773] - Generated Java code for 'oneway' methods is incorrect.
- * [THRIFT-2789] - TNonblockingServer leaks socket FD's under load
- * [THRIFT-2682] - TThreadedServer leaks per-thread memory
- * [THRIFT-2674] - JavaScript: declare Accept: and Content-Type: in request
- * [THRIFT-3078] - TNonblockingServerSocket's logger is not named after TNonblockingServerSocket
- * [THRIFT-3077] - C++ TFileTransport ignores return code from ftruncate
- * [THRIFT-3067] - C++ cppcheck performance related warnings
- * [THRIFT-3066] - C++ TDenseProtocol assert modifies instead of checks
- * [THRIFT-3071] - bootstrap.sh on Ubuntu 12.04 (Precise) automake error
- * [THRIFT-3069] - C++ TServerSocket leaks socket on fcntl get or set flags error
- * [THRIFT-3079] - TNonblockingServerSocket's logger is not named after TNonblockingServerSocket
- * [THRIFT-3080] - C++ TNonblockingServer connection leak while accept huge number connections.
- * [THRIFT-3086] - C++ Valgrind Error Cleanup
- * [THRIFT-3085] - thrift_reconnecting_client never try to reconnect
- * [THRIFT-3123] - Missing include in compiler/cpp/src/main.h breaks build in some environments
- * [THRIFT-3125] - Fix the list of exported headers in automake input
- * [THRIFT-3126] - PHP JSON serializer converts empty or int-indexed maps to lists
- * [THRIFT-3132] - Properly format date in Java @Generated annotations
- * [THRIFT-3137] - Travis build hangs after failure
- * [THRIFT-3138] - "make check" parallel execution is underministic
- * [THRIFT-3139] - JS library test is flaky
- * [THRIFT-3140] - ConcurrentModificationException is thrown by JavaScript test server
- * [THRIFT-3124] - Some signed/unsigned warnings while building compiler
- * [THRIFT-3128] - Go generated code produces name collisions between services
- * [THRIFT-3146] - Graphviz generates function name collisions between services
- * [THRIFT-3147] - Segfault while receiving data
- * [THRIFT-3148] - Markdown links to coding_standards are dead
- * [THRIFT-3090] - cmake build is broken on MacOSX
- * [THRIFT-3097] - cmake targets unconditionally depend on optional libraries
- * [THRIFT-3094] - master as of 2015-APR-13 fails -DBOOST_THREADS cmake build
- * [THRIFT-3099] - cmake build is broken on FreeBSD
- * [THRIFT-3089] - Assigning default ENUM values results in non-compilable java code if java namespace is not defined
- * [THRIFT-3093] - mingw compile fixes for c++ library 0.9.2
- * [THRIFT-3098] - Thrift does not pretty print binary typedefs the way it does binary fields
- * [THRIFT-3091] - c_glib service method should return result from handler method
- * [THRIFT-3088] - TThreadPoolServer with Sasl auth may leak CLOSE_WAIT socket
- * [THRIFT-3109] - Cross test log file cannot be browsed when served in HTTP server
- * [THRIFT-3113] - m4 C++11 macro issue
- * [THRIFT-3105] - C++ libthriftnb library on Windows build failure
- * [THRIFT-3115] - Uncompileable code due to name collision with predefined used types
- * [THRIFT-3117] - Java TSSLTransportFactory can't load certificates within JAR archive
- * [THRIFT-3102] - could not make check for Go Library
- * [THRIFT-3120] - Minor spelling errors and an outdated URL
- * [THRIFT-3121] - Librt does not exist on OS X
- * [THRIFT-3152] - Compiler error on Mac OSX (missing #include )
- * [THRIFT-3162] - make fails for dmd 2.067
- * [THRIFT-3164] - Thrift C++ library SSL socket by default allows for unsecure SSLv3 negotiation
- * [THRIFT-3168] - Fix Maven POM
- * [THRIFT-3170] - Initialism code in the Go compiler causes chaos
- * [THRIFT-3169] - Do not export thrift.TestStruct and thrift.TestEnum in thrift Go library
- * [THRIFT-3191] - Perl compiler does not add support for unexpected exception handling
- * [THRIFT-3178] - glib C does not compile
- * [THRIFT-3189] - Perl ServerSocket should allow a specific interface to be listened to
- * [THRIFT-3252] - Missing TConcurrentClientSyncInfo.h in cpp Makefile, so doesn't install
- * [THRIFT-3255] - Thrift generator doesn't exclude 'package' keyword for thrift property names breaking java builds
- * [THRIFT-3260] - multiple warnings in c_glib tutorial
- * [THRIFT-3256] - Some D test timings are too aggressive for slow machines
- * [THRIFT-3257] - warning: extra tokens at end of #endif directive
- * [THRIFT-3184] - Thrift Go leaves file descriptors open
- * [THRIFT-3203] - DOAP - please fix "Ocaml" => "OCaml"
- * [THRIFT-3210] - (uncompileable) code generated for server events while are events not enabled
- * [THRIFT-3215] - TJSONProtocol '(c++) uses "throw new" to throw exceptions instead of "throw"
- * [THRIFT-3202] - Allow HSHAServer to configure min and max worker threads separately.
- * [THRIFT-3205] - TCompactProtocol return a wrong error when the io.EOF happens
- * [THRIFT-3209] - LGPL mentioned in license file
- * [THRIFT-3197] - keepAliveTime is hard coded as 60 sec in TThreadPoolServer
- * [THRIFT-3196] - Misspelling in lua TBinaryProtocol (stirctWrite => strictWrite)
- * [THRIFT-3198] - Allow construction of TTransportFactory with a specified maxLength
- * [THRIFT-3192] - Go import paths changed in 1.4, and expired June 1
- * [THRIFT-3271] - Could not find or load main class configtest_ax_javac_and_java on some non-english systems
- * [THRIFT-3273] - c_glib: Generated code tries to convert between function and void pointers
- * [THRIFT-3264] - Fix Erlang 16 namespaced types
- * [THRIFT-3270] - reusing TNonblockingServer::TConnection cause dirty TSocket
- * [THRIFT-3267] - c_glib: "Critical" failure during unit tests
- * [THRIFT-3277] - THttpClient leaks connections if it's used for multiple requests
- * [THRIFT-3278] - NodeJS: Fix exception stack traces and names
- * [THRIFT-3279] - Fix a bug in retry_max_delay (NodeJS)
- * [THRIFT-3280] - Initialize retry variables on construction
- * [THRIFT-3283] - c_glib: Tutorial server always exits with warning
- * [THRIFT-3284] - c_glib: Empty service produces unused-variable warning
- * [THRIFT-1925] - c_glib generated code does not compile
- * [THRIFT-1849] - after transport->open() opens isOpen returns true and next open() goes thru when it shall not
- * [THRIFT-1866] - java compiler generates non-compiling code with const's defined in a thrift when name includes non-identifier chars
- * [THRIFT-1938] - FunctionRunner.h -- uses wrong path for Thread.h when installed
- * [THRIFT-1844] - Password string not cleared
- * [THRIFT-2004] - Thrift::Union violates :== method contract and crashes
- * [THRIFT-2073] - Thrift C++ THttpClient error: cannot refill buffer
- * [THRIFT-2127] - Autoconf scripting does not properly account for cross-compile
- * [THRIFT-2180] - Integer types issues in Cocoa lib on ARM64
- * [THRIFT-2189] - Go needs "isset" to fully support "union" type (and optionals)
- * [THRIFT-2192] - autotools on Redhat based systems
- * [THRIFT-2546] - cross language tests fails at 'TestMultiException' when using nodejs server
- * [THRIFT-2547] - nodejs servers and clients fails to connect with cpp using compact protocol
- * [THRIFT-2548] - Nodejs servers and clients does not work properly with -ssl
- * [THRIFT-1471] - toString() does not print ByteBuffer values when nested in a List
- * [THRIFT-1201] - getaddrinfo resource leak
- * [THRIFT-615] - TThreadPoolServer doesn't call task_done after pulling tasks from it's clients queue
- * [THRIFT-162] - Thrift structures are unhashable, preventing them from being used as set elements
- * [THRIFT-810] - Crashed client on TSocket::close under loads
- * [THRIFT-557] - charset problem with file Autogenerated by Thrift
- * [THRIFT-233] - IDL doesn't support negative hex literals
- * [THRIFT-1649] - contrib/zeromq does not build in 0.8.0
- * [THRIFT-1642] - Miscalculation lead to throw unexpected "TTransportException::TIMED_OUT"(or called "EAGAIN (timed out)") exception
- * [THRIFT-1587] - TSocket::setRecvTimeout error
- * [THRIFT-1248] - pointer subtraction in TMemoryBuffer relies on undefined behavior
- * [THRIFT-1774] - Sasl Transport client would hang when trying to connect non-sasl transport server
- * [THRIFT-1754] - RangeError in buffer handling
- * [THRIFT-1618] - static structMap in FieldMetaData is not thread safe and can lead to deadlocks
- * [THRIFT-2335] - thrift incompatibility with py:tornado as server, java as client
- * [THRIFT-2803] - TCP_DEFER_ACCEPT not supported with domain sockets
- * [THRIFT-2799] - Build Problem(s): ld: library not found for -l:libboost_unit_test_framework.a
- * [THRIFT-2801] - C++ test suite compilation warnings
- * [THRIFT-2802] - C++ tutorial compilation warnings
- * [THRIFT-2795] - thrift_binary_protocol.c: 'dereferencing type-punned pointer will break strict-aliasing rules'
- * [THRIFT-2817] - TSimpleJSONProtocol reads beyond end of message
- * [THRIFT-2826] - html:standalone sometimes ignored
- * [THRIFT-2829] - Support haxelib installation via github
- * [THRIFT-2828] - slightly wrong help screen indent
- * [THRIFT-2831] - Removes dead code in web_server.js introduced in THRIFT-2819
- * [THRIFT-2823] - All JS-tests are failing when run with grunt test
- * [THRIFT-2827] - Thrift 0.9.2 fails to compile on Yosemite due to tr1/functional include in ProcessorTest.cpp
- * [THRIFT-2843] - Automake configure.ac has possible typo related to Java
- * [THRIFT-2813] - multiple haxe library fixes/improvements
- * [THRIFT-2825] - Supplying unicode to python Thrift client can cause next request arguments to get overwritten
- * [THRIFT-2840] - Cabal file points to LICENSE file outside the path of the Haskell project.
- * [THRIFT-2818] - Trailing commas in array
- * [THRIFT-2830] - Clean up ant warnings in tutorial dir
- * [THRIFT-2842] - Erlang thrift client has infinite timeout
- * [THRIFT-2810] - Do not leave the underlying ServerSocket open if construction of TServerSocket fails
- * [THRIFT-2812] - Go server adding redundant buffering layer
- * [THRIFT-2839] - TFramedTransport read bug
- * [THRIFT-2844] - Nodejs support broken when running under Browserify
- * [THRIFT-2814] - args/result classes not found when no namespace is set
- * [THRIFT-2847] - function IfValue() is a duplicate of System.StrUtils.IfThen
- * [THRIFT-2848] - certain Delphi tests do not build if TypeRegistry is used
- * [THRIFT-2854] - Go Struct writer and reader looses important error information
- * [THRIFT-2858] - Enable header field case insensitive match in THttpServer
- * [THRIFT-2857] - C# generator creates uncompilable code for struct constants
- * [THRIFT-2860] - Delphi server closes connection on unexpected exceptions
- * [THRIFT-2868] - Enhance error handling in the Go client
- * [THRIFT-2879] - TMemoryBuffer: using lua string in wrong way
- * [THRIFT-2851] - Remove strange public Peek() from Go transports
- * [THRIFT-2852] - Better Open/IsOpen/Close behavior for StreamTransport.
- * [THRIFT-2871] - Missing semicolon in thrift.js
- * [THRIFT-2872] - ThreadManager deadlock for task expiration
- * [THRIFT-2881] - Handle errors from Accept() correctly
- * [THRIFT-2849] - Spell errors reported by codespell tool
- * [THRIFT-2870] - C++ TJSONProtocol using locale dependent formatting
- * [THRIFT-2882] - Lua Generator: using string.len funtion to get struct(map,list,set) size
- * [THRIFT-2864] - JSON generator missing from Visual Studio build project
- * [THRIFT-2878] - Go validation support of required fields
- * [THRIFT-2873] - TPipe and TPipeServer don't compile on Windows with UNICODE enabled
- * [THRIFT-2888] - import of is missing in JSON generator
- * [THRIFT-2900] - Python THttpClient does not reset socket timeout on exception
- * [THRIFT-2907] - 'ntohll' macro redefined
- * [THRIFT-2884] - Map does not serialize correctly for JSON protocol in Go library
- * [THRIFT-2887] - --with-openssl configure flag is ignored
- * [THRIFT-2894] - PHP json serializer skips maps with int/bool keys
- * [THRIFT-2904] - json_protocol_test.go fails
- * [THRIFT-2906] - library not found for -l:libboost_unit_test_framework.a
- * [THRIFT-2890] - binary data may lose bytes with JSON transport under specific circumstances
- * [THRIFT-2891] - binary data may cause a failure with JSON transport under specific circumstances
- * [THRIFT-2901] - Fix for generated TypeScript functions + indentation of JavaScript maps
- * [THRIFT-2916] - make check fails for D language
- * [THRIFT-2918] - Race condition in Python TProcessPoolServer test
- * [THRIFT-2920] - Erlang Thrift test uses wrong IDL file
- * [THRIFT-2922] - $TRIAL is used with Python tests but not tested accordingly
- * [THRIFT-2912] - Autotool build for C++ Qt library is invalid
- * [THRIFT-2914] - explicit dependency to Lua5.2 fails on some systems
- * [THRIFT-2910] - libevent is not really optional
- * [THRIFT-2911] - fix c++ version zeromq transport, the old version cannot work
- * [THRIFT-2915] - Lua generator missing from Visual Studio build project
- * [THRIFT-2917] - "make clean" breaks test/c_glib
- * [THRIFT-2919] - Haxe test server timeout too large
- * [THRIFT-2923] - JavaScript client assumes a message being written
- * [THRIFT-2924] - TNonblockingServer crashes when user-provided event_base is used
- * [THRIFT-2925] - CMake build does not work with OpenSSL nor anything installed in non-system location
- * [THRIFT-2931] - Access to undeclared static property: Thrift\Protocol\TProtocol::$TBINARYPROTOCOLACCELERATED
- * [THRIFT-2893] - CMake build fails with boost thread or std thread
- * [THRIFT-2902] - Generated c_glib code does not compile with clang
- * [THRIFT-2903] - Qt4 library built with CMake does not work
- * [THRIFT-2942] - CSharp generate invalid code for property named read or write
- * [THRIFT-2932] - Node.js Thrift connection libraries throw Exceptions into event emitter
- * [THRIFT-2933] - v0.9.2: doubles encoded in node with compact protocol cannot be decoded by python
- * [THRIFT-2934] - createServer signature mismatch
- * [THRIFT-2981] - IDL with no namespace produces unparsable PHP
- * [THRIFT-2999] - Addition of .gitattributes text auto in THRIFT-2724 causes modified files on checkout
- * [THRIFT-2949] - typo in compiler/cpp/README.md
- * [THRIFT-2957] - warning: source file %s is in a subdirectory, but option 'subdir-objects' is disabled
- * [THRIFT-2953] - TNamedPipeServerTransport is not Stop()able
- * [THRIFT-2962] - Docker Thrift env for development and testing
- * [THRIFT-2971] - C++ test and tutorial parallel build is unstable
- * [THRIFT-2972] - Missing backslash in lib/cpp/test/Makefile.am
- * [THRIFT-2951] - Fix Erlang name conflict test
- * [THRIFT-2955] - Using list of typedefs does not compile on Go
- * [THRIFT-2960] - namespace regression for Ruby
- * [THRIFT-2959] - nodejs: fix binary unit tests
- * [THRIFT-2966] - nodejs: Fix bad references to TProtocolException and TProtocolExceptionType
- * [THRIFT-2970] - grunt-jsdoc fails due to dependency issues
- * [THRIFT-3001] - C# Equals fails for binary fields (byte[])
- * [THRIFT-3003] - Missing LICENSE file prevents package from being installed
- * [THRIFT-3008] - Node.js server does not fully support exception
- * [THRIFT-3007] - Travis build is broken because of directory conflict
- * [THRIFT-3009] - TSSLSocket does not use the correct hostname (breaks certificate checks)
- * [THRIFT-3011] - C# test server testException() not implemented according to specs
- * [THRIFT-3012] - Timing problems in NamedPipe implementation due to unnecessary open/close
- * [THRIFT-3019] - Golang generator missing docstring for structs
- * [THRIFT-3021] - Service remote tool does not import stub package with package prefix
- * [THRIFT-3026] - TMultiplexedProcessor does not have a constructor
- * [THRIFT-3028] - Regression caused by THRIFT-2180
- * [THRIFT-3017] - order of map key/value types incorrect for one CTOR
- * [THRIFT-3020] - Cannot compile thrift as C++03
- * [THRIFT-3024] - User-Agent "BattleNet" used in some Thrift library files
- * [THRIFT-3047] - Uneven calls to indent_up and indent_down in Cocoa generator
- * [THRIFT-3048] - NodeJS decoding of I64 is inconsistent across protocols
- * [THRIFT-3043] - go compiler generator uses non C++98 code
- * [THRIFT-3044] - Docker README.md paths to Dockerfiles are incorrect
- * [THRIFT-3040] - bower.json wrong "main" path
- * [THRIFT-3051] - Go Thrift generator creates bad go code
- * [THRIFT-3057] - Java compiler build is broken
- * [THRIFT-3061] - C++ TSSLSocket shutdown delay/vulnerability
- * [THRIFT-3062] - C++ TServerSocket invalid port number (over 999999) causes stack corruption
- * [THRIFT-3065] - Update libthrift dependencies (slf4j, httpcore, httpclient)
- * [THRIFT-3244] - TypeScript: fix namespace of included types
- * [THRIFT-3246] - Reduce the number of trivial warnings in Windows C++ CMake builds
- * [THRIFT-3224] - Fix TNamedPipeServer unpredictable behavior on accept
- * [THRIFT-3230] - Python compiler generates wrong code if there is function throwing a typedef of exception with another namespace
- * [THRIFT-3236] - MaxSkipDepth never checked
- * [THRIFT-3239] - Limit recursion depth
- * [THRIFT-3241] - fatal error: runtime: cannot map pages in arena address space
- * [THRIFT-3242] - OSGi Import-Package directive is missing the Apache HTTP packages
- * [THRIFT-3234] - Limit recursion depth
- * [THRIFT-3222] - TypeScript: Generated Enums are quoted
- * [THRIFT-3229] - unexpected Timeout exception when desired bytes are only partially available
- * [THRIFT-3231] - CPP: Limit recursion depth to 64
- * [THRIFT-3235] - Limit recursion depth
- * [THRIFT-3175] - fastbinary.c python deserialize can cause huge allocations from garbage
- * [THRIFT-3176] - Union incorrectly implements ==
- * [THRIFT-3177] - Fails to run rake test
- * [THRIFT-3180] - lua plugin: framed transport do not work
- * [THRIFT-3179] - lua plugin cant connect to remote server because function l_socket_create_and_connect always bind socket to localhost
- * [THRIFT-3248] - TypeScript: additional comma in method signature without parameters
- * [THRIFT-3302] - Go JSON protocol should encode Thrift byte type as signed integer string
- * [THRIFT-3297] - c_glib: an abstract base class is not generated
- * [THRIFT-3294] - TZlibTransport for Java does not write data correctly
- * [THRIFT-3296] - Go cross test does not conform to spec
- * [THRIFT-3295] - C# library does not build on Mono 4.0.2.5 or later
- * [THRIFT-3293] - JavaScript: null values turn into empty structs in constructor
- * [THRIFT-3310] - lib/erl/README.md has incorrect formatting
- * [THRIFT-3319] - CSharp tutorial will not build using the *.sln
- * [THRIFT-3335] - Ruby server does not handle processor exception
- * [THRIFT-3338] - Stray underscore in generated go when service name starts with "New"
- * [THRIFT-3324] - Update Go Docs for pulling all packages
- * [THRIFT-3345] - Clients blocked indefinitely when a java.lang.Error is thrown
- * [THRIFT-3332] - make dist fails on clean build
- * [THRIFT-3326] - Tests do not compile under *BSD
- * [THRIFT-3334] - Markdown notation of protocol spec is malformed
- * [THRIFT-3331] - warning: ‘etype’ may be used uninitialized in this function
- * [THRIFT-3349] - Python server does not handle processor exception
- * [THRIFT-3343] - Fix haskell README
- * [THRIFT-3340] - Python: enable json tests again
- * [THRIFT-3311] - Top level README.md has incorrect formmating
- * [THRIFT-2936] - Minor memory leak in SSL
- * [THRIFT-3290] - Using from in variable names causes the generated Python code to have errors
- * [THRIFT-3225] - Fix TPipeServer unpredictable behavior on interrupt()
- * [THRIFT-3354] - Fix word-extraction substr bug in initialism code
- * [THRIFT-2006] - TBinaryProtocol message header call name length is not validated and can be used to core the server
- * [THRIFT-3329] - C++ library unit tests don't compile against the new boost-1.59 unit test framework
- * [THRIFT-2630] - windows7 64bit pc. ipv4 and ipv6 pc.can't use
- * [THRIFT-3336] - Thrift generated streaming operators added in 0.9.2 cannot be overridden
- * [THRIFT-2681] - Core of unwind_cleanup
- * [THRIFT-3317] - cpp namespace org.apache issue appears in 0.9
-
-## Documentation
- * [THRIFT-3286] - Apache Ant is a necessary dependency
-
-## Improvement
- * [THRIFT-227] - Byte[] in collections aren't pretty printed like regular binary fields
- * [THRIFT-2744] - Vagrantfile for Centos 6.5
- * [THRIFT-2644] - Haxe support
- * [THRIFT-2756] - register Media Type @ IANA
- * [THRIFT-3076] - Compatibility with Haxe 3.2.0
- * [THRIFT-3081] - C++ Consolidate client processing loops in TServers
- * [THRIFT-3083] - C++ Consolidate server processing loops in TSimpleServer, TThreadedServer, TThreadPoolServer
- * [THRIFT-3084] - C++ add concurrent client limit to threaded servers
- * [THRIFT-3074] - Add compiler/cpp/lex.yythriftl.cc to gitignore.
- * [THRIFT-3134] - Remove use of deprecated "phantom.args"
- * [THRIFT-3133] - Allow "make cross" and "make precross" to run without building all languages
- * [THRIFT-3142] - Make JavaScript use downloaded libraries
- * [THRIFT-3141] - Improve logging of JavaScript test
- * [THRIFT-3144] - Proposal: make String representation of enums in generated go code less verbose
- * [THRIFT-3130] - Remove the last vestiges of THRIFT_OVERLOAD_IF from THRIFT-1316
- * [THRIFT-3131] - Consolidate suggested import path for go thrift library to git.apache.org in docs and code
- * [THRIFT-3092] - Generated Haskell types should derive Generic
- * [THRIFT-3110] - Print error log after cross test failures on Travis
- * [THRIFT-3114] - Using local temp variables to not pollute the global table
- * [THRIFT-3106] - CMake summary should give more information why a library is set to off
- * [THRIFT-3119] - Java's TThreadedSelectorServer has indistinguishable log messages in run()
- * [THRIFT-3122] - Javascript struct constructor should properly initialize struct and container members from plain js arguments
- * [THRIFT-3151] - Fix links to git-wip* - should be git.apache.org
- * [THRIFT-3167] - Windows build from source instructions need to be revised
- * [THRIFT-3155] - move contrib/mingw32-toolchain.cmake to build/cmake/
- * [THRIFT-3160] - Make generated go enums implement TextMarshaller and TextUnmarshaller interfaces
- * [THRIFT-3150] - Add an option to thrift go generator to make Read and Write methods private
- * [THRIFT-3149] - Make ReadFieldN methods in generated Go code private
- * [THRIFT-3172] - Add tutorial to Thrift web site
- * [THRIFT-3214] - Add Erlang option for using maps instead of dicts
- * [THRIFT-3201] - Capture github test artifacts for failed builds
- * [THRIFT-3266] - c_glib: Multiple compiler warnings building unit tests
- * [THRIFT-3285] - c_glib: Build library with all warnings enabled, no warnings generated
- * [THRIFT-1954] - Allow for a separate connection timeout value
- * [THRIFT-2098] - Add support for Qt5+
- * [THRIFT-2199] - Remove Dense protocol (was: move to Contrib)
- * [THRIFT-406] - C++ Test suite cleanup
- * [THRIFT-902] - socket and connect timeout in TSocket should be distinguished
- * [THRIFT-388] - Use a separate wire format for async calls
- * [THRIFT-727] - support native C++ language specific exception message
- * [THRIFT-1784] - pep-3110 compliance for exception handling
- * [THRIFT-1025] - C++ ServerSocket should inherit from Socket with the necessary Ctor to listen on connections from a specific host
- * [THRIFT-2269] - Can deploy libthrift-source.jar to maven center repository
- * [THRIFT-2804] - Pull an interface out of TBaseAsyncProcessor
- * [THRIFT-2806] - more whitespace fixups
- * [THRIFT-2811] - Make remote socket address accessible
- * [THRIFT-2809] - .gitignore update for compiler's visual project
- * [THRIFT-2846] - Expose ciphers parameter from ssl.wrap_socket()
- * [THRIFT-2859] - JSON generator: output complete descriptors
- * [THRIFT-2861] - add buffered transport
- * [THRIFT-2865] - Test case for Go: SeqId out of sequence
- * [THRIFT-2866] - Go generator source code is hard to read and maintain
- * [THRIFT-2880] - Read the network address from the listener if available.
- * [THRIFT-2875] - Typo in TDenseProtocol.h comment
- * [THRIFT-2874] - TBinaryProtocol member variable "string_buf_" is never used.
- * [THRIFT-2855] - Move contributing.md to the root of the repository
- * [THRIFT-2862] - Enable RTTI and/or build macros for generated code
- * [THRIFT-2876] - Add test for THRIFT-2526 Assignment operators and copy constructors in c++ don't copy the __isset struct
- * [THRIFT-2897] - Generate -isEqual: and -hash methods
- * [THRIFT-2909] - Improve travis build
- * [THRIFT-2921] - Make Erlang impl ready for OTP 18 release (dict/0 and set/0 are deprecated)
- * [THRIFT-2928] - Rename the erlang test_server module
- * [THRIFT-2940] - Allow installing Thrift from git as NPM module by providing package.json in top level directory
- * [THRIFT-2937] - Allow setting a maximum frame size in TFramedTransport
- * [THRIFT-2976] - nodejs: xhr and websocket support for browserify
- * [THRIFT-2996] - Test for Haxe 3.1.3 or better
- * [THRIFT-2969] - nodejs: DRY up library tests
- * [THRIFT-2973] - Update Haxe lib readme regarding Haxe 3.1.3
- * [THRIFT-2952] - Improve handling of Server.Stop()
- * [THRIFT-2964] - nodejs: move protocols and transports into separate files
- * [THRIFT-2963] - nodejs - add test coverage
- * [THRIFT-3006] - Attach 'omitempty' json tag for optional fields in Go
- * [THRIFT-3027] - Go compiler does not ensure common initialisms have consistent case
- * [THRIFT-3030] - TThreadedServer: Property for number of clientThreads
- * [THRIFT-3023] - Go compiler is a little overly conservative with names of attributes
- * [THRIFT-3018] - Compact protocol for Delphi
- * [THRIFT-3025] - Change pure Int constants into @enums (where possible)
- * [THRIFT-3031] - migrate "shouldStop" flag to TServer
- * [THRIFT-3022] - Compact protocol for Haxe
- * [THRIFT-3041] - Generate asynchronous clients for Cocoa
- * [THRIFT-3053] - Perl SSL Socket Support (Encryption)
- * [THRIFT-3247] - Generate a C++ thread-safe client
- * [THRIFT-3217] - Provide a little endian variant of the binary protocol in C++
- * [THRIFT-3223] - TypeScript: Add initial support for Enum Maps
- * [THRIFT-3220] - Option to suppress @Generated Annotation entirely
- * [THRIFT-3300] - Reimplement TZlibTransport in Java using streams
- * [THRIFT-3288] - c_glib: Build unit tests with all warnings enabled, no warnings generated
- * [THRIFT-3347] - Improve cross test servers and clients
- * [THRIFT-3342] - Improve ruby cross test client and server compatibility
- * [THRIFT-2296] - Add C++ Base class for service
- * [THRIFT-3337] - Add testBool method to cross tests
- * [THRIFT-3303] - Disable concurrent cabal jobs on Travis to avoid GHC crash
- * [THRIFT-2623] - Docker container for Thrift
- * [THRIFT-3298] - thrift endian converters may conflict with other libraries
- * [THRIFT-1559] - Provide memory pool for TBinaryProtocol to eliminate memory fragmentation
- * [THRIFT-424] - Steal ProtocolBuffers' VarInt implementation for C++
-
-## New Feature
- * [THRIFT-3070] - Add ability to set the LocalCertificateSelectionCallback
- * [THRIFT-1909] - Java: Add compiler flag to use the "option pattern" for optional fields
- * [THRIFT-2099] - Stop TThreadPoolServer with alive connections.
- * [THRIFT-123] - implement TZlibTransport in Java
- * [THRIFT-2368] - New option: reuse-objects for Java generator
- * [THRIFT-2836] - Optionally generate C++11 MoveConstructible types
- * [THRIFT-2824] - Flag to disable html escaping doctext
- * [THRIFT-2819] - Add WebsSocket client to node.js
- * [THRIFT-3050] - Client certificate authentication for non-http TLS in C#
- * [THRIFT-3292] - Implement TZlibTransport in Go
-
-## Question
- * [THRIFT-2583] - Thrift on xPC target (SpeedGoat)
- * [THRIFT-2592] - thrift server using c_glib
- * [THRIFT-2832] - c_glib: Handle string lists correctly
- * [THRIFT-3136] - thrift installation problem on mac
- * [THRIFT-3346] - c_glib: Tutorials example crashes saying Calculator.ping implementation returned FALSE but did not set an error
-
-## Sub-task
- * [THRIFT-2578] - Moving 'make cross' from test.sh to test.py
- * [THRIFT-2734] - Go coding standards
- * [THRIFT-2748] - Add Vagrantfile for Centos 6.5
- * [THRIFT-2753] - Misc. Haxe improvements
- * [THRIFT-2640] - Compact Protocol in Cocoa
- * [THRIFT-3262] - warning: overflow in implicit constant conversion in DenseProtoTest.cpp
- * [THRIFT-3194] - Can't build with go enabled. gomock SCC path incorrect.
- * [THRIFT-3275] - c_glib tutorial warnings in generated code
- * [THRIFT-1125] - Multiplexing support for the Ruby Library
- * [THRIFT-2807] - PHP Code Style
- * [THRIFT-2841] - Add comprehensive integration tests for the whole Go stack
- * [THRIFT-2815] - Haxe: Support for Multiplexing Services on any Transport, Protocol and Server
- * [THRIFT-2886] - Integrate binary type in standard Thrift cross test
- * [THRIFT-2946] - Enhance usability of cross test framework
- * [THRIFT-2967] - Add .editorconfig to root
- * [THRIFT-3033] - Perl: Support for Multiplexing Services on any Transport, Protocol and Server
- * [THRIFT-3174] - Initialism code in the Go compiler doesn't check first word
- * [THRIFT-3193] - Option to supress date value in @Generated annotation
- * [THRIFT-3305] - Missing dist files for 0.9.3 release candidate
- * [THRIFT-3341] - Add testBool methods
- * [THRIFT-3308] - Fix broken test cases for 0.9.3 release candidate
-
-## Task
- * [THRIFT-2834] - Remove semi-colons from python code generator
- * [THRIFT-2853] - Adjust comments not applying anymore after THRIFT-2852
-
-## Test
- * [THRIFT-3211] - Add make cross support for php TCompactProtocol
-
-## Wish
- * [THRIFT-2838] - TNonblockingServer can bind to port 0 (i.e., get an OS-assigned port) but there is no way to get the port number
-
-
-
-Thrift 0.9.2
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-2793] - Go compiler produces uncompilable code
- * [THRIFT-1481] - Unix domain sockets in C++ do not support the abstract namespace
- * [THRIFT-1455] - TBinaryProtocolT::writeString casts from size_t to uint32_t, which is not safe on 64-bit platforms
- * [THRIFT-1579] - PHP Extention - function thrift_protocol_read_binary not working from TBinarySerializer::deserialize
- * [THRIFT-1584] - Error: could not SetMinThreads in ThreadPool on single-core machines
- * [THRIFT-1614] - Thrift build from svn repo sources fails with automake-1.12
- * [THRIFT-1047] - rb_thrift_memory_buffer_write treats arg as string without check, segfaults if you pass non-string
- * [THRIFT-1639] - Java/Python: Serialization/Deserialization of double type using CompactProtocol
- * [THRIFT-1647] - NodeJS BufferedTransport does not work beyond the hello-world example
- * [THRIFT-2130] - Thrift's D library/test: parts of "make check" code do not compile with recent dmd-2.062 through dmd-2.064alpha
- * [THRIFT-2140] - Error compiling cpp tutorials
- * [THRIFT-2139] - MSVC 2012 Error - Cannot compile due to BoostThreadFactory
- * [THRIFT-2138] - pkgconfig file created with wrong include path
- * [THRIFT-2160] - Warning in thrift.h when compiling with -Wunused and NDEBUG
- * [THRIFT-2158] - Compact, JSON, and SimpleJSON protocols are not working correctly
- * [THRIFT-2167] - nodejs lib throws error if options argument isn't passed
- * [THRIFT-2288] - Go impl of Thrift JSON protocol wrongly writes/expects true/false for bools
- * [THRIFT-2147] - Thrift IDL grammar allows for dotted identifier names
- * [THRIFT-2145] - Rack and Thin are not just development dependencies
- * [THRIFT-2267] - Should be able to choose socket family in Python TSocket
- * [THRIFT-2276] - java path in spec file needs updating
- * [THRIFT-2281] - Generated send/recv code ignores errors returned by the underlying protocol
- * [THRIFT-2280] - TJSONProtocol.Flush() does not really flush the transport
- * [THRIFT-2274] - TNonblockingServer and TThreadedSelectorServer do not close their channel selectors on exit and leak file descriptors
- * [THRIFT-2265] - php library doesn't build
- * [THRIFT-2232] - IsSet* broken in Go
- * [THRIFT-2246] - Unset enum value is printed by ToString()
- * [THRIFT-2240] - thrift.vim (contrib) does not correctly handle 'union'
- * [THRIFT-2243] - TNonblockingServer in thrift crashes when TFramedTransport opens
- * [THRIFT-2230] - Cannot Build on RHEL/Centos/Amazon Linux 6.x
- * [THRIFT-2247] - Go generator doesn't deal well with map keys of type binary
- * [THRIFT-2253] - Python Tornado TTornadoServer base class change
- * [THRIFT-2261] - java: error: unmappable character for encoding ASCII
- * [THRIFT-2259] - C#: unexpected null logDelegate() pointer causes AV in TServer.serve()
- * [THRIFT-2225] - SSLContext destroy before cleanupOpenSSL
- * [THRIFT-2224] - TSSLSocket.h and TSSLServerSocket.h should use the platfromsocket too
- * [THRIFT-2229] - thrift failed to build on OSX 10.9 GM
- * [THRIFT-2227] - Thrift compiler generates spurious warnings with Xlint
- * [THRIFT-2219] - Thrift gem fails to build on OS X Mavericks with 1.9.3 rubies
- * [THRIFT-2226] - TServerSocket - keepAlive wrong initialization order
- * [THRIFT-2285] - TJsonProtocol implementation for Java doesn't allow a slash (/) to be escaped (\/)
- * [THRIFT-2216] - Extraneous semicolon in TProtocolUtil.h makes clang mad
- * [THRIFT-2215] - Generated HTML/Graphviz lists referenced enum identifiers as UNKNOWN.
- * [THRIFT-2211] - Exception constructor does not contain namespace prefix.
- * [THRIFT-2210] - lib/java TSimpleJSONProtocol can emit invalid JSON
- * [THRIFT-2209] - Ruby generator -- please namespace classes
- * [THRIFT-2202] - Delphi TServerImpl.DefaultLogDelegate may stop the server with I/O-Error 105
- * [THRIFT-2201] - Ternary operator returns different types (build error for some compilers)
- * [THRIFT-2200] - nested structs cause generate_fingerprint() to slow down at excessive CPU load
- * [THRIFT-2197] - fix jar output directory in rpm spec file
- * [THRIFT-2196] - Fix invalid dependency in Makefile.am
- * [THRIFT-2194] - Node: Not actually prepending residual data in TFramedTransport.receiver
- * [THRIFT-2193] - Java code generator emits spurious semicolon when deep copying binary data
- * [THRIFT-2191] - Fix charp JSONProtocol.ReadJSONDouble (specify InvariantCulture)
- * [THRIFT-2214] - System header sys/param.h is included inside the Thrift namespace
- * [THRIFT-2178] - Thrift generator returns error exit code on --version
- * [THRIFT-2171] - NodeJS implementation has extremely low test coverage
- * [THRIFT-2183] - gem install fails on zsh
- * [THRIFT-2182] - segfault in regression tests (GC bug in rb_thrift_memory_buffer_write)
- * [THRIFT-2181] - oneway calls don't work in NodeJS
- * [THRIFT-2169] - JavaME Thrift Library causes "java.io.IOException: No Response Entries Available" after using the Thrift client for some time
- * [THRIFT-2168] - Node.js appears broken (at least, examples don't work as intended)
- * [THRIFT-2293] - TSSLTransportFactory.createSSLContext() leaves files open
- * [THRIFT-2279] - TSerializer only returns the first 1024 bytes serialized
- * [THRIFT-2278] - Buffered transport doesn't support writes > buffer size
- * [THRIFT-2275] - Fix memory leak in golang compact_protocol.
- * [THRIFT-2282] - Incorect code generated for some typedefs
- * [THRIFT-2009] - Go redeclaration error
- * [THRIFT-1964] - 'Isset' causes problems with C#/.NET serializers
- * [THRIFT-2026] - Fix TCompactProtocol 64 bit builds
- * [THRIFT-2108] - Fix TAsyncClientManager timeout race
- * [THRIFT-2068] - Multiple calls from same connection are not processed in node
- * [THRIFT-1750] - Make compiler build cleanly under visual studio 10
- * [THRIFT-1755] - Comment parsing bug
- * [THRIFT-1771] - "make check" fails on x64 for libboost_unit_test_framework.a
- * [THRIFT-1841] - NodeJS Thrift incorrectly parses non-UTF8-string types
- * [THRIFT-1908] - Using php thrift_protocol accelerated transfer causes core dump
- * [THRIFT-1892] - Socket timeouts are declared in milli-seconds, but are actually set in micro-seconds
- * [THRIFT-2303] - TBufferredTransport not properly closing underlying transport
- * [THRIFT-2313] - nodejs server crash after processing the first request when using MultiplexedProcessor/FramedBuffer/BinaryProtocol
- * [THRIFT-2311] - Go: invalid code generated when exception name is a go keyword
- * [THRIFT-2308] - node: TJSONProtocol parse error when reading from buffered message
- * [THRIFT-2316] - ccp: TFileTransportTest
- * [THRIFT-2352] - msvc failed to compile thrift tests
- * [THRIFT-2337] - Golang does not report TIMED_OUT exceptions
- * [THRIFT-2340] - Generated server implementation does not send response type EXCEPTION on the Thrift.TApplicationExceptionType.UNKNOWN_METHOD exception
- * [THRIFT-2354] - Connection errors can lead to case_clause exceptions
- * [THRIFT-2339] - Uncaught exception in thrift c# driver
- * [THRIFT-2356] - c++ thrift client not working with ssl (SSL_connect hangs)
- * [THRIFT-2331] - Missing call to ReadStructBegin() in TApplicationException.Read()
- * [THRIFT-2323] - Uncompileable Delphi code generated for typedef'd structs
- * [THRIFT-2322] - Correctly show the number of times ExecutorService (java) has rejected the client.
- * [THRIFT-2389] - namespaces handled wrongly in acrionscript 3.0 implementation
- * [THRIFT-2388] - GoLang - Fix data races in simple_server and server_socket
- * [THRIFT-2386] - Thrift refuses to link yylex
- * [THRIFT-2375] - Excessive 's in generated HTML
- * [THRIFT-2373] - warning CS0414 in THttpClient.cs: private field 'Thrift.Transport.THttpClient.connection' assigned but never used
- * [THRIFT-2372] - thrift/json_protocol.go:160: function ends without a return statement
- * [THRIFT-2371] - ruby bundler version fails on ~1.3.1, remove and take latest avail
- * [THRIFT-2370] - Compiler SEGFAULTs generating HTML documentation for complex strucre
- * [THRIFT-2384] - Binary map keys produce uncompilable code in go
- * [THRIFT-2380] - unreachable code (CID 1174546, CID 1174679)
- * [THRIFT-2378] - service method arguments of binary type lead to uncompileable Go code
- * [THRIFT-2363] - Issue with character encoding of Success returned from Login using Thrift Proxy and NodeJS
- * [THRIFT-2359] - TBufferedTransport doesn't clear it's buffer on a failed flush call
- * [THRIFT-2428] - Python 3 setup.py support
- * [THRIFT-2367] - Build failure: stdlib and boost both define uint64_t
- * [THRIFT-2365] - C# decodes too many binary bytes from JSON
- * [THRIFT-2402] - byte count of FrameBuffer in AWAITING_CLOSE state is not subtracted from readBufferBytesAllocated
- * [THRIFT-2396] - Build Error on MacOSX
- * [THRIFT-2395] - thrift Ruby gem requires development dependency 'thin' regardless of environment
- * [THRIFT-2414] - c_glib fix several bug.
- * [THRIFT-2420] - Go argument parser for methods without arguments does not skip fields
- * [THRIFT-2439] - Bug in TProtocolDecorator Class causes parsing errors
- * [THRIFT-2419] - golang - Fix fmt.Errorf in generated code
- * [THRIFT-2418] - Go handler function panics on internal error
- * [THRIFT-2405] - Node.js Multiplexer tests fail (silently)
- * [THRIFT-2581] - TFDTransport destructor should not throw
- * [THRIFT-2575] - Thrift includes siginfo_t within apache::thrift::protocol namespace
- * [THRIFT-2577] - TFileTransport missuse of closesocket on windows platform
- * [THRIFT-2576] - Implement Thrift.Protocol.prototype.skip method in JavaScript library
- * [THRIFT-2588] - Thrift compiler is not buildable in Visual Studio 2010
- * [THRIFT-2594] - JS Compiler: Single quotes are not being escaped in constants.
- * [THRIFT-2591] - TFramedTransport does not handle payloads split across packets correctly
- * [THRIFT-2599] - Uncompileable Delphi code due to naming conflicts with IDL
- * [THRIFT-2590] - C++ Visual Studio solution doesn't include Multiplexing support
- * [THRIFT-2595] - Node.js: Fix global leaks and copy-paste errors
- * [THRIFT-2565] - autoconf fails to find mingw-g++ cross compiler on travis CI
- * [THRIFT-2555] - excessive "unused field" comments
- * [THRIFT-2554] - double initialization in generated Read() method
- * [THRIFT-2551] - OutOfMemoryError "unable to create new native thread" kills serve thread
- * [THRIFT-2543] - Generated enum type in haskell should be qualified
- * [THRIFT-2560] - Thrift compiler generator tries to concat ints with strings using +
- * [THRIFT-2559] - Centos 6.5 unable to "make" with Thrift 0.9.1
- * [THRIFT-2526] - Assignment operators and copy constructors in c++ don't copy the __isset struct
- * [THRIFT-2454] - c_glib: There is no gethostbyname_r() in some OS.
- * [THRIFT-2451] - Do not use pointers for optional fields with defaults. Do not write such fields if its value set to default. Also, do not use pointers for any optional fields mapped to go map or slice. generate Get accessors
- * [THRIFT-2450] - include HowToContribute in the src repo
- * [THRIFT-2448] - thrift/test/test.sh has incorrect Node.js test path
- * [THRIFT-2460] - unopened socket fd must be less than zero.
- * [THRIFT-2459] - --version should not exit 1
- * [THRIFT-2468] - Timestamp handling
- * [THRIFT-2467] - Unable to build contrib/fb303 on OSX 10.9.2
- * [THRIFT-2466] - Improper error handling for SSL/TLS connections that don't complete a handshake
- * [THRIFT-2463] - test/py/RunClientServer.py fails sometimes
- * [THRIFT-2458] - Generated golang server code for "oneway" methods is incorrect
- * [THRIFT-2456] - THttpClient fails when using async support outside Silverlight
- * [THRIFT-2524] - Visual Studio project is missing TThreadedServer files
- * [THRIFT-2523] - Visual Studio project is missing OverlappedSubmissionThread files
- * [THRIFT-2520] - cpp:cob_style generates incorrect .tcc file
- * [THRIFT-2508] - Uncompileable C# code due to language keywords in IDL
- * [THRIFT-2506] - Update TProtocolException error codes to be used consistently throughout the library
- * [THRIFT-2505] - go: struct should always be a pointer to avoid copying of potentially size-unbounded structs
- * [THRIFT-2515] - TLS Method error during make
- * [THRIFT-2503] - C++: Fix name collision when a struct has a member named "val"
- * [THRIFT-2477] - thrift --help text with misplaced comma
- * [THRIFT-2492] - test/cpp does not compile on mac
- * [THRIFT-2500] - sending random data crashes thrift(golang) service
- * [THRIFT-2475] - c_glib: buffered_transport_write function return always TRUE.
- * [THRIFT-2495] - JavaScript/Node string constants lack proper escaping
- * [THRIFT-2491] - unable to import generated ThriftTest service
- * [THRIFT-2490] - c_glib: if fail to read a exception from server, client may be occurred double free
- * [THRIFT-2470] - THttpHandler swallows exceptions from processor
- * [THRIFT-2533] - Boost version in requirements should be updated
- * [THRIFT-2532] - Java version in installation requirements should be updated
- * [THRIFT-2529] - TBufferedTransport split Tcp data bug in nodeJs
- * [THRIFT-2537] - Path for "go get" does not work (pull request 115)
- * [THRIFT-2443] - Node fails cross lang tests
- * [THRIFT-2437] - Author fields in Python setup.py must be strings not lists.
- * [THRIFT-2435] - Java compiler doesn't like struct member names that are identical to an existing enum or struct type
- * [THRIFT-2434] - Missing namespace import for php TMultiplexedProcessor implementation
- * [THRIFT-2432] - Flaky parallel build
- * [THRIFT-2430] - Crash during TThreadPoolServer shutdown
- * [THRIFT-667] - Period should not be allowed in identifier names
- * [THRIFT-1212] - Members capital case conflict
- * [THRIFT-2584] - Error handler not listened on javascript client
- * [THRIFT-2294] - Incorrect Makefile generation
- * [THRIFT-2601] - Fix vagrant to work again for builds again
- * [THRIFT-2092] - TNonblocking server should release handler as soon as connection closes
- * [THRIFT-2557] - CS0542 member names cannot be the same as their enclosing type
- * [THRIFT-2605] - TSocket warning on gcc 4.8.3
- * [THRIFT-2607] - ThreadManager.cpp warning on clang++ 3.4
- * [THRIFT-1998] - TCompactProtocol.tcc - one more warning on Visual 2010
- * [THRIFT-2610] - MSVC warning in TSocket.cpp
- * [THRIFT-2614] - TNonblockingServer.cpp warnings on MSVC
- * [THRIFT-2608] - TNonblockingServer.cpp warnings on clang 3.4
- * [THRIFT-2606] - ThreadManager.h warning in clang++ 3.4
- * [THRIFT-2609] - TFileTransport.h unused field warning (clang 3.4)
- * [THRIFT-2416] - Cannot use TCompactProtocol with MSVC
- * [THRIFT-1803] - Ruby Thrift 0.9.0 tries to encode UUID to UTF8 and crashes
- * [THRIFT-2385] - Problem with gethostbyname2 during make check
- * [THRIFT-2262] - thrift server 'MutateRow' operation gives no indication of success / failure
- * [THRIFT-2048] - Prefer boolean context to nullptr_t conversion
- * [THRIFT-2528] - Thrift Erlang Library: Multiple thrift applications in one bundle
- * [THRIFT-1999] - warning on gcc 4.7 while compiling BoostMutex.cpp
- * [THRIFT-2104] - Structs lose binary data when transferred from server to client in Java
- * [THRIFT-2184] - undefined method rspec_verify for Thrift::MemoryBufferTransport
- * [THRIFT-2351] - PHP TCompactProtocol has fails to decode messages
- * [THRIFT-2016] - Resource Leak in thrift struct under compiler/cpp/src/parse/t_function.h
- * [THRIFT-2273] - Please delete old releases from mirroring system
- * [THRIFT-2270] - Faulty library version numbering at build or documentation
- * [THRIFT-2203] - Tests keeping failing on Jenkins and Travis CI
- * [THRIFT-2399] - thrift.el: recognize "//"-style comments in emacs thrift-mode
- * [THRIFT-2582] - "FileTransport error" exception is raised when trying to use Java's TFileTransport
- * [THRIFT-1682] - Multiple thread calling a Service function unsafely causes message corruption and terminates with Broken Pipe
- * [THRIFT-2357] - recurse option has no effect when generating php
- * [THRIFT-2248] - Go generator doesn't deal well with map keys of type binary
- * [THRIFT-2426] - clarify IP rights and contributions from fbthrift
- * [THRIFT-2041] - TNonblocking server compilation on windows (ARITHMETIC_RIGHT_SHIFT)
- * [THRIFT-2400] - thrift.el: recognize "//"-style comments in emacs thrift-mode
- * [THRIFT-1717] - Fix deb build in jenkins
- * [THRIFT-2266] - ThreadManager.h:24:10: fatal error: 'tr1/functional' file not found on Mac 10.9 (Mavericks)
- * [THRIFT-1300] - Test failures with parallel builds (make -j)
- * [THRIFT-2487] - Tutorial requires two IDL files but only one is linked from the Thrift web site
- * [THRIFT-2329] - missing release tags within git
- * [THRIFT-2306] - concurent client calls with nodejs
- * [THRIFT-2222] - ruby gem cannot be compiled on OS X mavericks
- * [THRIFT-2381] - code which generated by thrift2/hbase.thrift compile error
- * [THRIFT-2390] - no close event when connection lost
- * [THRIFT-2146] - Unable to pass multiple "--gen" options to the thrift compiler
- * [THRIFT-2438] - Unexpected readFieldEnd call causes JSON Parsing errors
- * [THRIFT-2498] - Error message "Invalid method name" while trying to call HBase Thrift API
- * [THRIFT-841] - Build cruft
- * [THRIFT-2570] - Wrong URL given in http://thrift.apache.org/developers
- * [THRIFT-2604] - Fix debian packaging
- * [THRIFT-2618] - Unignore /aclocal files required for build
- * [THRIFT-2562] - ./configure create MakeFile in lib/d with errors
- * [THRIFT-2593] - Unable to build thrift on ubuntu-12.04 (Precise)
- * [THRIFT-2461] - Can't install thrift-0.8.0 on OS X 10.9.2
- * [THRIFT-2602] - Fix missing dist files
- * [THRIFT-2620] - Fix python packaging
- * [THRIFT-2545] - Test CPP fails to build (possibly typo)
-
-## Documentation
- * [THRIFT-2155] - Adding one liner guide to rename the version.h.in and rename thrifty.cc.h
- * [THRIFT-1991] - Add exceptions to examples
- * [THRIFT-2334] - add a tutorial for node JS
- * [THRIFT-2392] - Actionscript tutorial
- * [THRIFT-2383] - contrib: sample for connecting Thrift with Rebus
- * [THRIFT-2382] - contrib: sample for connecting Thrift with STOMP
-
-## Improvement
- * [THRIFT-1457] - Capacity of TframedTransport write buffer is never reset
- * [THRIFT-1135] - Node.js tutorial
- * [THRIFT-1371] - Socket timeouts (SO_RCVTIMEO and SO_SNDTIMEO) not supported on Solaris
- * [THRIFT-2142] - Minor tweaks to thrift.el for better emacs package compatibility
- * [THRIFT-2268] - Modify TSaslTransport to ignore TCP health checks from loadbalancers
- * [THRIFT-2264] - GitHub page incorrectly states that Thrift is still incubating
- * [THRIFT-2263] - Always generate good hashCode for Java
- * [THRIFT-2233] - Java compiler should defensively copy its binary inputs
- * [THRIFT-2239] - Address FindBugs errors
- * [THRIFT-2249] - Add SMP Build option to thrift.spec (and three config defines)
- * [THRIFT-2254] - Exceptions generated by Go compiler should implement error interface
- * [THRIFT-2260] - Thrift imposes unneeded dependency on commons-lang3
- * [THRIFT-2258] - Add TLS v1.1/1.2 support to TSSLSocket.cpp
- * [THRIFT-2205] - Node.js Test Server to support test.js JavaScript Browser test and sundry fixes
- * [THRIFT-2204] - SSL client for the cocoa client
- * [THRIFT-2172] - Java compiler allocates optionals array for every struct with an optional field
- * [THRIFT-2185] - use cabal instead of runhaskell in haskell library
- * [THRIFT-1926] - PHP Constant Generation Refactoring
- * [THRIFT-2029] - Port C++ tests to Windows
- * [THRIFT-2054] - TSimpleFileTransport - Java Lib has no straight forward TTransport based file transport
- * [THRIFT-2040] - "uninitialized variable" warnings on MSVC/windows
- * [THRIFT-2034] - Give developers' C++ code direct access to socket FDs on server side
- * [THRIFT-2095] - Use print function for Python 3 compatiblity
- * [THRIFT-1868] - Make the TPC backlog configurable in the Java servers
- * [THRIFT-1813] - Add @Generated annotation to generated classes
- * [THRIFT-1815] - Code generators line buffer output
- * [THRIFT-2305] - TFramedTransport empty constructor should probably be private
- * [THRIFT-2304] - Move client assignments from construtor in method
- * [THRIFT-2309] - Ruby (gem) & PHP RPM subpackages
- * [THRIFT-2318] - perl: dependency Class::Accessor not checked
- * [THRIFT-2317] - exclude tutorial from build
- * [THRIFT-2320] - Program level doctext does not get attached by parser
- * [THRIFT-2349] - Golang - improve tutorial
- * [THRIFT-2348] - PHP Generator: add array typehint to functions
- * [THRIFT-2344] - configure.ac: compiler-only option
- * [THRIFT-2343] - Golang - Return a single error for all exceptions instead of multiple return values
- * [THRIFT-2341] - Enable generation of Delphi XMLDoc comments (a.k.a. "Help Insight")
- * [THRIFT-2355] - Add SSL and Web Socket Support to Node and JavaScript
- * [THRIFT-2350] - Add async calls to normal JavaScript
- * [THRIFT-2330] - Generate PHPDoc comments
- * [THRIFT-2332] - RPMBUILD: run bootstrap (if needed)
- * [THRIFT-2391] - simple socket transport for actionscript 3.0
- * [THRIFT-2376] - nodejs: allow Promise style calls for client and server
- * [THRIFT-2369] - Add ssl support for nodejs implementation
- * [THRIFT-2401] - Haskell tutorial compiles
- * [THRIFT-2417] - C# Union classes are not partial
- * [THRIFT-2415] - Named pipes server performance & message mode
- * [THRIFT-2404] - emit warning on (typically inefficient) list
- * [THRIFT-2398] - Improve Node Server Library
- * [THRIFT-2397] - Add CORS and CSP support for JavaScript and Node.js libraries
- * [THRIFT-2407] - use markdown (rename README => README.md)
- * [THRIFT-2300] - D configure info output should follow same format as other languages
- * [THRIFT-2579] - Windows CE support
- * [THRIFT-2574] - Compiler option to generate namespace directories for Ruby
- * [THRIFT-2571] - Simplify cross compilation using CMake
- * [THRIFT-2569] - Introduce file to specify third party library locations on Windows
- * [THRIFT-2568] - Implement own certificate handler
- * [THRIFT-2552] - eliminate warning from configure.ac
- * [THRIFT-2549] - Generate json tag for struct members. use go.tag annotation to override the default generated tag.
- * [THRIFT-2544] - Add support for socket transport for c# library when using Windows Phone projects
- * [THRIFT-2453] - haskell tutorial: fix up division by 0 example
- * [THRIFT-2449] - Enhance typedef structure to distinguish between forwards and real typedefs
- * [THRIFT-2446] - There is no way to handle server stream errors
- * [THRIFT-2455] - Allow client certificates to be used with THttpClient
- * [THRIFT-2511] - Node.js needs the compact protocol
- * [THRIFT-2493] - Node.js lib needs HTTP client
- * [THRIFT-2502] - Optimize go implementations of binary and compact protocols for speed
- * [THRIFT-2494] - Add enum toString helper function in c_glib
- * [THRIFT-2471] - Make cpp.ref annotation language agnostic
- * [THRIFT-2497] - server and client for test/go, also several fixes and improvements
- * [THRIFT-2535] - TJSONProtocol when serialized yields TField ids rather than names
- * [THRIFT-2220] - Add a new struct structv?
- * [THRIFT-1352] - Thrift server
- * [THRIFT-989] - Push boost m4 macros upstream
- * [THRIFT-1349] - Remove unnecessary print outs
- * [THRIFT-2496] - server and client for test/go, also several fixes and improvements
- * [THRIFT-1114] - Maven publish shouldn't require passwords hardcoded in settings.xml
- * [THRIFT-2043] - visual 2010 warnings - unreachable code
- * [THRIFT-1683] - Implement alternatives to Javascript Client side Transport protocol, just as NPAPI and WebSocket.
- * [THRIFT-1746] - provide a SPDX file
- * [THRIFT-1772] - Serialization does not check types of embedded structures.
- * [THRIFT-2387] - nodejs: external imports should be centralized in index.js
- * [THRIFT-2037] - More general macro THRIFT_UNUSED_VARIABLE
-
-## New Feature
- * [THRIFT-1012] - Transport for DataInput DataOutput interface
- * [THRIFT-2256] - Using c++11/c++0x std library replace boost library
- * [THRIFT-2250] - JSON and MemoryBuffer for JavaME
- * [THRIFT-2114] - Python Service Remote SSL Option
- * [THRIFT-1719] - SASL client support for Python
- * [THRIFT-1894] - Thrift multi-threaded async Java Server using Java 7 AsynchronousChannelGroup
- * [THRIFT-1893] - HTTP/JSON server/client for node js
- * [THRIFT-2347] - C# TLS Transport based on THRIFT-181
- * [THRIFT-2377] - Allow addition of custom HTTP Headers to an HTTP Transport
- * [THRIFT-2408] - Named Pipe Transport Option for C#
- * [THRIFT-2572] - Add string/collection length limit checks (from C++) to java protocol readers
- * [THRIFT-2469] - "java:fullcamel" option to automatically camel-case underscored attribute names
- * [THRIFT-795] - Importing service functions (simulation multiple inheritance)
- * [THRIFT-2164] - Add a Get/Post Http Server to Node along with examples
- * [THRIFT-2255] - add Parent Class for generated Struct class
-
-## Question
- * [THRIFT-2539] - Tsocket.cpp addrinfo ai_flags = AI_ADDRCONFIG
- * [THRIFT-2440] - how to connect as3 to java by thrift ,
- * [THRIFT-2379] - Memmory leaking while using multithreading in C++ server.
- * [THRIFT-2277] - Thrift: installing fb303 error
- * [THRIFT-2567] - Csharp slow ?
- * [THRIFT-2573] - thrift 0.9.2 release
-
-## Sub-task
- * [THRIFT-981] - cocoa: add version Info to the library
- * [THRIFT-2132] - Go: Support for Multiplexing Services on any Transport, Protocol and Server
- * [THRIFT-2299] - TJsonProtocol implementation for Ruby does not allow for both possible slash (solidus) encodings
- * [THRIFT-2298] - TJsonProtocol implementation for C# does not allow for both possible slash (solidus) encodings
- * [THRIFT-2297] - TJsonProtocol implementation for Delphi does not allow for both possible slash (solidus) encodings
- * [THRIFT-2271] - JavaScript: Support for Multiplexing Services
- * [THRIFT-2251] - go test for compact protocol is not running
- * [THRIFT-2195] - Delphi: Add event handlers for server and processing events
- * [THRIFT-2176] - TSimpleJSONProtocol.ReadFieldBegin() does not return field type and ID
- * [THRIFT-2175] - Wrong field type set for binary
- * [THRIFT-2174] - Deserializing JSON fails in specific cases
- * [THRIFT-2053] - NodeJS: Support for Multiplexing Services
- * [THRIFT-1914] - Python: Support for Multiplexing Services on any Transport, Protocol and Server
- * [THRIFT-1810] - add ruby to test/test.sh
- * [THRIFT-2310] - PHP: Client-side support for Multiplexing Services
- * [THRIFT-2346] - C#: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
- * [THRIFT-2345] - Delphi: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
- * [THRIFT-2338] - First doctext wrongly interpreted as program doctext in some cases
- * [THRIFT-2325] - SSL test certificates
- * [THRIFT-2358] - C++: add compact protocol to cross language test suite
- * [THRIFT-2425] - PHP: Server-side support for Multiplexing Services
- * [THRIFT-2421] - Tree/Recursive struct support in thrift
- * [THRIFT-2290] - Update Go tutorial to align with THRIFT-2232
- * [THRIFT-2558] - CSharp compiler generator tries to concat ints with strings using +
- * [THRIFT-2507] - Additional LUA TProtocolException error code needed?
- * [THRIFT-2499] - Compiler: allow annotations without "= value"
- * [THRIFT-2534] - Cross language test results should recorded to a status.md or status.html file automatically
- * [THRIFT-66] - Java: Allow multiplexing multiple services over a single TCP connection
- * [THRIFT-1681] - Add Lua Support
- * [THRIFT-1727] - Ruby-1.9: data loss: "binary" fields are re-encoded
- * [THRIFT-1726] - Ruby-1.9: "binary" fields are represented by string whose encoding is "UTF-8"
- * [THRIFT-988] - perl: add version Info to the library via configure
- * [THRIFT-334] - Compact Protocol for PHP
- * [THRIFT-2444] - pull request 88: thrift: clean up enum value assignment
-
-## Task
- * [THRIFT-2223] - Spam links on wiki
- * [THRIFT-2566] - Please create a DOAP file for your TLP
- * [THRIFT-2237] - Update archive to contain all versions
- * [THRIFT-962] - Tutorial page on our website is really unhelpful
-
-## Test
- * [THRIFT-2327] - nodejs: nodejs test suite should be bundled with the library
- * [THRIFT-2445] - THRIFT-2384 (code generation for go maps with binary keys) should be tested
- * [THRIFT-2501] - C# The test parameters from the TestServer and TestClient are different from the http://thrift.apache.org/test/
-
-## Wish
- * [THRIFT-2190] - Add the JavaScript thrift.js lib to the Bower registry
- * [THRIFT-2076] - boost::optional instead of __isset
-
-
-
-Thrift 0.9.1
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-1440] - debian packaging: minor-ish policy problems
- * [THRIFT-1402] - Generated Y_types.js does not require() X_types.js when an include in the IDL file was used
- * [THRIFT-1551] - 2 thrift file define only struct (no service), one include another, the gen nodejs file didn't have "requires" at the top
- * [THRIFT-1264] - TSocketClient is queried by run loop after deallocation in Cocoa
- * [THRIFT-1600] - Thrift Go Compiler and Library out of date with Go 1 Release.
- * [THRIFT-1603] - Thrift IDL allows for multiple exceptions, args or struct member names to be the same
- * [THRIFT-1062] - Problems with python tutorials
- * [THRIFT-864] - default value fails if identifier is a struct
- * [THRIFT-930] - Ruby and Haskell bindings don't properly support DESTDIR (makes packaging painful)
- * [THRIFT-820] - The readLength attribute of TBinaryProtocol is used as an instance variable and is decremented on each call of checkReadLength
- * [THRIFT-1640] - None of the tutorials linked on the website contain content
- * [THRIFT-1637] - NPM registry does not include version 0.8
- * [THRIFT-1648] - NodeJS clients always receive 0 for 'double' values.
- * [THRIFT-1660] - Python Thrift library can be installed with pip but not easy_install
- * [THRIFT-1657] - Chrome browser sending OPTIONS method before POST in xmlHttpRequest
- * [THRIFT-2118] - Certificate error handling still incorrect
- * [THRIFT-2137] - Ruby test lib fails jenkins build #864
- * [THRIFT-2136] - Vagrant build not compiling java, ruby, php, go libs due to missing dependencies
- * [THRIFT-2135] - GO lib leaves behind test files that are auto generated
- * [THRIFT-2134] - mingw-cross-compile script failing with strip errors
- * [THRIFT-2133] - java TestTBinaryProtocol.java test failing
- * [THRIFT-2126] - lib/cpp/src/thrift/concurrency/STD* files missing from DIST
- * [THRIFT-2125] - debian missing from DIST
- * [THRIFT-2124] - .o, .so, .la, .deps, .libs, gen-* files left tutorials, test and lib/cpp when making DIST
- * [THRIFT-2123] - GO lib missing files in DIST build
- * [THRIFT-2121] - Compilation bug for Node.js
- * [THRIFT-2129] - php ext missing from dist
- * [THRIFT-2128] - lib GO tests fail with funct ends without a return statement
- * [THRIFT-2286] - Failed to compile Thrift0.9.1 with boost1.55 by VS2010 if select Debug-mt&x64 mode.
- * [THRIFT-1973] - TCompactProtocol in C# lib does not serialize and deserialize negative int32 and int64 number correctly
- * [THRIFT-1992] - casts in TCompactProtocol.tcc causing "dereferencing type-punned pointer will break strict-aliasing rules" warnings from gcc
- * [THRIFT-1930] - C# generates unsigned byte for Thrift "byte" type
- * [THRIFT-1929] - Update website to use Mirrors for downloads
- * [THRIFT-1928] - Race may still exist in TFileTransport::flush()
- * [THRIFT-1934] - Tabs in Example section on main page are not working
- * [THRIFT-1933] - Delphi generator crashes when a typedef references another typedef from an included file
- * [THRIFT-1942] - Binary accelerated cpp extension does not use Thrift namespaces for Exceptions
- * [THRIFT-1959] - C#: Add Union TMemoryBuffer support
- * [THRIFT-1958] - C#: Use static Object.Equals instead of .Equals() calls in equals
- * [THRIFT-1957] - NodeJS TFramedTransport and TBufferedTransport read bytes as unsigned
- * [THRIFT-1955] - Union Type writer generated in C# does not WriteStructBegin
- * [THRIFT-1952] - Travis CI
- * [THRIFT-1949] - WP7 build broken
- * [THRIFT-1943] - docstrings for enum values are ignored
- * [THRIFT-2070] - Improper `HexChar' and 'HexVal' implementation in TJSONProtocol.cs
- * [THRIFT-2017] - Resource Leak in thrift struct under compiler/cpp/src/parse/t_program.h
- * [THRIFT-2032] - C# client leaks sockets/handles
- * [THRIFT-1996] - JavaME Constants generation is broken / inconsistent with regular Java generation
- * [THRIFT-2002] - Haskell: Test use Data.Maybe instead of Maybe
- * [THRIFT-2051] - Vagrant fails to build erlang
- * [THRIFT-2050] - Vagrant C# lib compile fails with TException missing
- * [THRIFT-1978] - Ruby: Thrift should allow for the SSL verify mode to be set
- * [THRIFT-1984] - namespace collision in python bindings
- * [THRIFT-1988] - When trying to build a debian package it fails as the file NEWS doesn't exist
- * [THRIFT-1975] - TBinaryProtocol CheckLength can't be used for a client
- * [THRIFT-1995] - '.' allowed at end of identifier generates non-compilable code
- * [THRIFT-2112] - Error in Go generator when using typedefs in map keys
- * [THRIFT-2088] - Typos in Thrift compiler help text
- * [THRIFT-2080] - C# multiplex processor does not catch IOException
- * [THRIFT-2082] - Executing "gmake clean" is broken
- * [THRIFT-2102] - constants are not referencing to correct type when included from another thrift file
- * [THRIFT-2100] - typedefs are not correctly referenced when including from other thrift files
- * [THRIFT-2066] - 'make install' does not install two headers required for C++ bindings
- * [THRIFT-2065] - Not valid constants filename in Java
- * [THRIFT-2047] - Thrift.Protocol.TCompactProtocol, intToZigZag data lost (TCompactProtocol.cs)
- * [THRIFT-2036] - Thrift gem warns about class variable access from top level
- * [THRIFT-2057] - Vagrant fails on php tests
- * [THRIFT-2105] - Generated code for default values of collections ignores t_field::T_REQUIRED
- * [THRIFT-2091] - Unnecessary 'friend' declaration causes warning in TWinsockSingleton
- * [THRIFT-2090] - Go generator, fix including of other thrift files
- * [THRIFT-2106] - Fix support for namespaces in GO generator
- * [THRIFT-1783] - C# doesn't handle required fields correctly
- * [THRIFT-1782] - async only defined in silverlight
- * [THRIFT-1779] - Missing process_XXXX method in generated TProcessor implementation for all 'oneway' service functions
- * [THRIFT-1692] - SO_REUSEADDR allows for socket hijacking on Windows
- * [THRIFT-1720] - JRuby times out on successful connection
- * [THRIFT-1713] - Named and Anonymous Pipe transport (Delphi)
- * [THRIFT-1699] - Native Union#read has extra read_field_end call
- * [THRIFT-1749] - Python TSSLSocket error handling obscures actual error
- * [THRIFT-1748] - Guard and RWGuard macros defined in global namespace
- * [THRIFT-1734] - Front webpage is still advertising v0.8 as current release
- * [THRIFT-1729] - C glib refactor left empty folders in svn
- * [THRIFT-1767] - unions can't have required fields (Delphi)
- * [THRIFT-1765] - Incorrect error message printed for null or negative keys
- * [THRIFT-1778] - Configure requires manual intervention due to tar failure
- * [THRIFT-1777] - TPipeServer is UNSTOPPABLE
- * [THRIFT-1753] - Multiple C++ Windows, OSX, and iOS portability issues
- * [THRIFT-1756] - 'make -j 8' fails with "unterminated #ifdef" error
- * [THRIFT-1773] - Python library should run on python 2.4
- * [THRIFT-1769] - unions can't have required fields (C++)
- * [THRIFT-1768] - unions can't have required fields (Compiler)
- * [THRIFT-1666] - htonll usage in TBinaryProtocol.tcc generates warning with MSVC2010
- * [THRIFT-1919] - libthrift depends on httpcore-4.1.3 (directly) and httpcore-4.1.4 (transitively)
- * [THRIFT-1864] - implement event handler for non-blocking server
- * [THRIFT-1859] - Generated error c++ code with -out and include_prefix param
- * [THRIFT-1869] - TThreadPoolServer (java) dies when threadpool is consumed
- * [THRIFT-1842] - Memory leak with Pipes
- * [THRIFT-1838] - Can't build compiler on OS X because of missing thrifty.h
- * [THRIFT-1846] - Restore socket.h header to support builds with Android NDK
- * [THRIFT-1850] - make check hangs on TSocket tests in TransportTest.cpp
- * [THRIFT-1873] - Binary protocol factory ignores struct read/write flags
- * [THRIFT-1872] - issues with TBufferedTransport buffer
- * [THRIFT-1904] - Incorrect code is generated for typedefs which use included types
- * [THRIFT-1903] - PHP namespaces cause binary protocols to not be used
- * [THRIFT-1895] - Delphi: reserved variable name "result" not detected properly
- * [THRIFT-1881] - TNonblockingServer does not release open connections or threads on shutdown
- * [THRIFT-1888] - Java Thrift client can't connect to Python Thrift server on same host
- * [THRIFT-1831] - Bug in list deserializer
- * [THRIFT-1824] - many compile warning, becase Thread.h includes config.h
- * [THRIFT-1823] - Missing parenthesis breaks "IS_..." macro in generated code
- * [THRIFT-1806] - Python generation always truncates __init__.py files
- * [THRIFT-1795] - Race condition in TThreadedServerPool java implementation
- * [THRIFT-1794] - C# asyncctp broken
- * [THRIFT-1804] - Binary+compact protocol single byte error in Ruby library (ARM architecture): caused by different char signedness
- * [THRIFT-1800] - Documentation text not always escaped correctly when rendered to HTML
- * [THRIFT-1788] - C#: Constants static constructor does not compile
- * [THRIFT-1816] - Need "require" included thrift files in "xxx_types.js"
- * [THRIFT-1907] - Compiling namespace and sub-namespace directives for unrecognized generators should only be a warning
- * [THRIFT-1913] - skipping unknown fields in java unions
- * [THRIFT-2553] - C++ linker error - transport/TSocket
- * [THRIFT-274] - Towards a working release/versioning process
-
-## Documentation
- * [THRIFT-1971] - [Graphviz] Adds tutorial/general description documentation
- * [THRIFT-2001] - http://thrift.apache.org/ Example "C++ Server" tab is broken
-
-## Improvement
- * [THRIFT-1574] - Apache project branding requirements: DOAP file [PATCH]
- * [THRIFT-1347] - Unify the exceptions returned in generated Go code
- * [THRIFT-1353] - Switch to performance branch, get rid of BinaryParser
- * [THRIFT-1629] - Ruby 1.9 Compatibility during Thrift configure, make, install
- * [THRIFT-991] - Refactor Haskell code and generator
- * [THRIFT-990] - Sanify gettimeofday usage codebase-wide
- * [THRIFT-791] - Let C++ TSimpleServer be driven by an external main loop
- * [THRIFT-2117] - Cocoa TBinaryProtocol strictWrite should be set to true by default
- * [THRIFT-2014] - Change C++ lib includes to use style throughout
- * [THRIFT-1972] - Add support for async processors
- * [THRIFT-1970] - [Graphviz] Adds option to render exceptions relationships
- * [THRIFT-1966] - Support different files for SSL certificates and keys
- * [THRIFT-1965] - Adds Graphviz (graph description language) generator
- * [THRIFT-1956] - Switch to Apache Commons Lang 3
- * [THRIFT-1962] - Multiplex processor should send any TApplicationException back to client
- * [THRIFT-1960] - main() declares 22 unused gen bools
- * [THRIFT-1951] - libthrift.jar has source files in it
- * [THRIFT-1997] - Add accept backlog configuration method to TServerSocket
- * [THRIFT-2003] - Deprecate senum
- * [THRIFT-2052] - Vagrant machine image defaults to only 384MB of RAM
- * [THRIFT-1980] - Modernize Go tooling, fix go client libary.
- * [THRIFT-1977] - C# compiler should generate constant files prefixed with thrift file name
- * [THRIFT-1985] - add a Vagrantfile to build and test Apache Thrift fully reproducable
- * [THRIFT-1994] - Deprecate slist
- * [THRIFT-1993] - Factory to create instances from known (generated) interface types with Delphi
- * [THRIFT-2081] - Specified timeout should be used in TSocket.Open()
- * [THRIFT-2084] - Delphi: Ability to create entity Thrift-generated instances based on TypeInfo
- * [THRIFT-2083] - Improve the go lib: buffered Transport, save memory allocation, handle concurrent request
- * [THRIFT-2109] - Secure connections should be supported in Go
- * [THRIFT-2107] - minor Go generator fixes
- * [THRIFT-1695] - allow warning-free compilation in VS 2012 and GNU 4.6
- * [THRIFT-1735] - integrate tutorial into regular build
- * [THRIFT-1716] - max allowed connections should be PIPE_UNLIMITED_INSTANCES
- * [THRIFT-1715] - Allow excluding python parts when building contrib/fb303
- * [THRIFT-1733] - Fix RPM build issues on RHEL6/OL6 systems
- * [THRIFT-1728] - Upgradation of httpcomponents
- * [THRIFT-1876] - Use enum names instead of casted integers in assignments
- * [THRIFT-1874] - timeout for the server-side end of a named pipe
- * [THRIFT-1897] - Support validation of required fields
- * [THRIFT-1896] - Add TBase protocol for Cocoa
- * [THRIFT-1880] - Make named pipes server work asynchronously (overlapped) to allow for clean server stops
- * [THRIFT-1878] - Add the possibility to send custom headers
- * [THRIFT-1882] - Use single include
- * [THRIFT-1793] - C#: Use static read instead of instance read
- * [THRIFT-1799] - Option to generate HTML in "standalone mode"
- * [THRIFT-1815] - Code generators line buffer output
- * [THRIFT-1890] - C++: Make named pipes server work asynchronously
- * [THRIFT-474] - Generating Ruby on Rails friendly code
-
-## New Feature
- * [THRIFT-801] - Provide an interactive shell (irb) when generating ruby bindings
- * [THRIFT-2292] - Android Library Project
- * [THRIFT-2012] - Modernizing Go
- * [THRIFT-1969] - C#: Tests not properly linked from the solution
- * [THRIFT-1785] - C#: Add TMemoryBuffer serializer/deserializer
- * [THRIFT-1780] - Add option to generate nullable values
- * [THRIFT-1786] - C# Union Typing
- * [THRIFT-591] - Make the C++ runtime library be compatible with Windows and Visual Studio
- * [THRIFT-514] - Add option to configure compiler output directory
-
-## Question
- * [THRIFT-1764] - how to get the context of client when on a rpc call in server side?
- * [THRIFT-1791] - thrift's namespace directive when generating haskell code
-
-## Sub-task
- * [THRIFT-1594] - Java test clients should have a return codes that reflect whether it succeeds or not.
- * [THRIFT-1595] - Java test server should follow the documented behavior as of THRIFT-1590
- * [THRIFT-986] - st: add version Info to the library
- * [THRIFT-985] - php: add version Info to the library
- * [THRIFT-984] - ocaml: add version Info to the library
- * [THRIFT-1924] - Delphi: Inconsistency in serialization of optional fields
- * [THRIFT-1922] - C#: Inconsistency in serialization of optional fields
- * [THRIFT-1961] - C# tests should be in lib/csharp/test/...
- * [THRIFT-1822] - PHP unit test does not work
- * [THRIFT-1902] - C++: Support for Multiplexing Services on any Transport, Protocol and Server
- * [THRIFT-1901] - C#: Support for Multiplexing Services on any Transport, Protocol and Server
- * [THRIFT-1899] - Delphi: Support for Multiplexing Services on any Transport, Protocol and Server
- * [THRIFT-563] - Support for Multiplexing Services on any Transport, Protocol and Server
-
-
-
-Thrift 0.9
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-1438] - lib/cpp/src/windows/config.h should read version from configure.ac rather than a #define
- * [THRIFT-1446] - Compile error with Delphi 2009 in constant initializer
- * [THRIFT-1450] - Problems building thrift 0.8.0 for Python and Ruby
- * [THRIFT-1449] - Ruby client does not work on solaris (?)
- * [THRIFT-1447] - NullpointerException in ProcessFunction.class :in "oneway" method
- * [THRIFT-1433] - TServerSocket fix for MSVC
- * [THRIFT-1429] - The nonblocking servers is supposed to use TransportFactory to read the data
- * [THRIFT-1427] - PHP library uses non-multibyte safe functions with mbstring function overloading
- * [THRIFT-1421] - Debian Packages can not be built
- * [THRIFT-1394] - Treatment of optional fields is not consistent between C++ and Java
- * [THRIFT-1511] - Server with oneway support ( JAVA )
- * [THRIFT-1496] - PHP compiler not namespacing enums
- * [THRIFT-1495] - PHP TestClient fatals on missing class
- * [THRIFT-1508] - TServerSocket does not allow for the user to specify the IP address to bind to
- * [THRIFT-1504] - Cocoa Generator should use local file imports for base Thrift headers
- * [THRIFT-1512] - Thrift socket support for Windows XP
- * [THRIFT-1502] - TSimpleServer::serve(): Do not print out error message if server was stopped.
- * [THRIFT-1501] - PHP old namespaces not generated for enums
- * [THRIFT-1483] - java compiler does not generate type parameters for services in extended clauses
- * [THRIFT-1479] - Compiled PHP process functions missing writeMessageEnd()
- * [THRIFT-1492] - enabling c_glib render thrift unusable (even for C++ code)
- * [THRIFT-1491] - Uninitialize processorFactory_ member in TServer.h
- * [THRIFT-1475] - Incomplete records generation for Erlang
- * [THRIFT-1486] - Javascript manual testserver not returning content types
- * [THRIFT-1488] - src/concurrency/Thread.h:91:58: error: invalid conversion from 'pthread_t {aka _opaque_pthread_t*}' to 'apache::thrift::concurrency::Thread::id_t {aka long long unsigned int}' [-fpermissive]
- * [THRIFT-1490] - Windows-specific header files - fixes & tweaks
- * [THRIFT-1526] - Union TupleSchemeFactory returns StandardSchemes
- * [THRIFT-1527] - Generated implementation of tupleReadStruct in unions return null when the setfield is unrecognized
- * [THRIFT-1524] - TNonBlockingServer does not compile in Visual Studio 2010
- * [THRIFT-1529] - TupleProtocol can unintentionally include an extra byte in bit vectors when number of optional fields is an integral of 8
- * [THRIFT-1473] - JSON context stack may be left in an incorrect state when an exception is thrown during read or write operations
- * [THRIFT-1456] - System.Net.HttpWebRequest' does not contain a definition for 'Proxy'
- * [THRIFT-1468] - Memory leak in TSaslServerTransport
- * [THRIFT-1461] - Recent TNonblockingServer changes broke --enable-boostthreads=yes, Windows
- * [THRIFT-1460] - why not add unicode strings support to python directly?
- * [THRIFT-1464] - AbstractNonblockingServer.FrameBuffer TNonblockingTransport accessor changed from public to private
- * [THRIFT-1467] - Possible AV with empty strings when using JSON protocol
- * [THRIFT-1523] - clientTimeout not worked as expected in TServerSocket created by TSSLTransportFactory
- * [THRIFT-1537] - TFramedTransport issues
- * [THRIFT-1519] - Thirft Build Failure referencing rb_intern2 symbol
- * [THRIFT-1518] - Generated C++ code only sends the first optional field in the write() function for a struct.
- * [THRIFT-1515] - NameError: global name 'TApplicationException' is not defined
- * [THRIFT-1554] - Inherited service methods are not resolved in derived service implementations
- * [THRIFT-1553] - thrift nodejs service side can't read map structure, key as enum, value as Object
- * [THRIFT-1575] - Typo in server/TThreadPoolServer.h
- * [THRIFT-1327] - Fix Spec Suite under Ruby-1.8.7 (works for MRI Ruby-1.9.2)
- * [THRIFT-1326] - on some platforms, #include is necessary to be included in Thrift.h
- * [THRIFT-1159] - THttpClient->Flush() issue (connection thru proxy)
- * [THRIFT-1277] - Node.js serializes false booleans as null
- * [THRIFT-1224] - Cannot insert UTF-8 text
- * [THRIFT-1267] - Node.js can't throw exceptions.
- * [THRIFT-1338] - Do not use an unpatched autoconf 2.65 to generate release tarball
- * [THRIFT-1128] - MAC OS X: thrift.h incompatibility with Thrift.h
- * [THRIFT-1631] - Fix C++ server constructor typos
- * [THRIFT-1602] - PHP C Extension is not Compatible with PHP 5.4
- * [THRIFT-1610] - IWebProxy not available on WP7 platform
- * [THRIFT-1606] - Race condition in BoostThreadFactory.cpp
- * [THRIFT-1604] - Python exception handeling for changes from PEP 3110
- * [THRIFT-1607] - Incorrect file modes for several source files
- * [THRIFT-1583] - c_glib leaks memory
- * [THRIFT-1582] - Bad includes of nested thrift files in c_glib
- * [THRIFT-1578] - C_GLib generated code does not compile
- * [THRIFT-1597] - TJSONProtocol.php is missing from Makefile.am
- * [THRIFT-1591] - Enable TCP_NODELAY for ruby gem
- * [THRIFT-1624] - Isset Generated differently on different platforms
- * [THRIFT-1622] - Incorrect size returned on read
- * [THRIFT-1621] - Memory leaks
- * [THRIFT-1612] - Base64 encoding is broken
- * [THRIFT-1627] - compiler built using compilers.vcxproj cannot be used to build some test .thrift files
- * [THRIFT-1571] - Update Ruby HTTP transport for recent Ruby versions
- * [THRIFT-1023] - Thrift encoding (UTF-8) issue with Ruby 1.9.2
- * [THRIFT-1090] - Document the generation of a file called "Constants.java"
- * [THRIFT-1082] - Thrift::FramedTransport sometimes calls close() on an undefined value
- * [THRIFT-956] - Python module's version meta-data should be updated
- * [THRIFT-973] - Cocoa library won't compile using clang
- * [THRIFT-1632] - ruby: data corruption in thrift_native implementation of MemoryBufferTransport
- * [THRIFT-1665] - TBinaryProtocol: exceeded message length raises generic TException
- * [THRIFT-1664] - Reference to non-existing variable in build script
- * [THRIFT-1663] - Java Thrift server is not throwing exceptions
- * [THRIFT-1662] - "removeObject:" should be "removeObserver:" in [-TSocketServer dealloc]?
- * [THRIFT-1643] - Denial of Service attack in TBinaryProtocol.readString
- * [THRIFT-1674] - Update Thrift D library to be compatible with 2.060
- * [THRIFT-1673] - Ruby compile flags for extension for multi arch builds (os x)
- * [THRIFT-1655] - Configure still trying to use thrift_generators in output
- * [THRIFT-1654] - c_glib thrift_socket_read() returns corrupted data
- * [THRIFT-1653] - TThreadedSelectorServer leaks CLOSE_WAIT sockets
- * [THRIFT-1658] - Java thrift server is not throwing TApplicationException
- * [THRIFT-1656] - Setting proper headers in THttpServer.cpp so that "Cross-Origin Resource Sharing" on js client can work.
- * [THRIFT-1652] - TSaslTransport does not log the error when kerberos auth fails
- * [THRIFT-2272] - CLONE - Denial of Service attack in TBinaryProtocol.readString
- * [THRIFT-2086] - Invalid generated code for Node.JS when using namespaces
- * [THRIFT-1686] - t_php_generator.cc uses "and" instead of "&&", and causes compiler errors with Visual Studio
- * [THRIFT-1693] - libthrift has dependency on two different versions of httpcore
- * [THRIFT-1689] - don't exit(-1) in TNonblockingServer
- * [THRIFT-1679] - NodeJS: protocol readString() should treat string as utf8, not binary
- * [THRIFT-1721] - Dist broken due to 0.8.0 to 0.9.0 changes
- * [THRIFT-1710] - Minor issues in test case code
- * [THRIFT-1709] - Warning "Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first" in TBinaryProtocol.cs at ReadInt64()
- * [THRIFT-1707] - [ruby] Adjust server_spec.rb for RSpec 2.11.x and Ruby 1.9.3
- * [THRIFT-1671] - Cocoa code generator does not put keywords into generated method calls
- * [THRIFT-1670] - Incompatibilities between different versions of a Thrift interface
- * [THRIFT-1669] - NameError: global name 'TApplicationException' is not defined
- * [THRIFT-1668] - Compile error in contrib/fb303, thrift/TDispatchProcessor.h: No such file or directory
- * [THRIFT-1845] - Fix compiler warning caused by implicit string conversion with Xcode 4.6
- * [THRIFT-304] - Building the Python library requires development headers
- * [THRIFT-369] - sets and maps break equality
- * [THRIFT-556] - Ruby compiler does not correctly referred to top-level modules when a submodule masks the top-level name
- * [THRIFT-481] - indentation of ruby classes is off by a few
-
-## Improvement
- * [THRIFT-1498] - Allow TThreadedPoolServer.Args to pass a ExecutorService
- * [THRIFT-1444] - FunctionRunner - add syntactic sugar to create shared_ptrs
- * [THRIFT-1443] - define a TProcessor helper class to implement process()
- * [THRIFT-1441] - Generate constructor with parameters for exception class to let it update message property automatically.
- * [THRIFT-1520] - Embed version number in erlang .app file
- * [THRIFT-1480] - python: remove tabs, adjust whitespace and address PEP8 warnings
- * [THRIFT-1485] - Performance: pass large and/or refcounted arguments as "const"
- * [THRIFT-1484] - Introduce phpunit test suite
- * [THRIFT-1532] - The type specifications in the generated Erlang code should include "undefined" where it's used as a default value
- * [THRIFT-1534] - Required fields in the Delphi code generator.
- * [THRIFT-1469] - Java isset space optimization
- * [THRIFT-1465] - Visibility of methods in generated java code
- * [THRIFT-1453] - Don't change types of arguments when serializing with thrift php extension
- * [THRIFT-1452] - generate a swap() method for all generated structs
- * [THRIFT-1451] - FramedTransport: Prevent infinite loop when writing
- * [THRIFT-1521] - Two patches for more Performance
- * [THRIFT-1555] - Delphi version of the tutorial code
- * [THRIFT-1535] - Why thrift don't use wrapped class for optional fields ?
- * [THRIFT-1204] - Ruby autogenerated files should require 'thrift' gem
- * [THRIFT-1344] - Using the httpc module directly rather than the deprecated http layer
- * [THRIFT-1343] - no_auto_import min/2 to avoid compile warning
- * [THRIFT-1340] - Add support of ARC to Objective-C
- * [THRIFT-1611] - Improved code generation for typedefs
- * [THRIFT-1593] - Pass on errors like "connection closed" to the handler module
- * [THRIFT-1615] - PHP Namespace
- * [THRIFT-1567] - Thrift/cpp: Allow alternate classes to be used for
- * [THRIFT-1072] - Missing - (id) initWithSharedProcessor in TSharedProcessorFactory.h
- * [THRIFT-1650] - [ruby] Update clean items and svn:ignore entries for OS X artifacts
- * [THRIFT-1661] - [PATCH] Add --with-qt4 configure option
- * [THRIFT-1675] - Do we have any plan to support scala?
- * [THRIFT-1645] - Replace Object#tee with more conventional Object#tap in specs
- * [THRIFT-1644] - Upgrade RSpec to 2.10.x and refactor specs as needed
- * [THRIFT-1672] - MonoTouch (and Mono for Android) compatibility
- * [THRIFT-1702] - a thrift manual
- * [THRIFT-1694] - Re-Enable serialization for WP7 Silverlight
- * [THRIFT-1691] - Serializer/deserializer support for Delphi
- * [THRIFT-1688] - Update IDL page markup
- * [THRIFT-1725] - Tutorial web pages for Delphi and C#
- * [THRIFT-1714] - [ruby] Explicitly add CWD to Ruby test_suites.rb
- * [THRIFT-317] - Issues with Java struct validation
- * [THRIFT-164] - Build web tutorial on Incubator web site
- * [THRIFT-541] - Cocoa code generator doesn't put keywords before all arguments.
- * [THRIFT-681] - The HTML generator does not handle JavaDoc style comments very well
-
-## New Feature
- * [THRIFT-1500] - D programming language support
- * [THRIFT-1510] - There should be an implementation of the JsonProtocol for ruby
- * [THRIFT-1115] - python TBase class for dynamic (de)serialization, and __slots__ option for memory savings
- * [THRIFT-1953] - support for asp.net mvc 3
-
-## Question
- * [THRIFT-1235] - How could I use THttpServerTransportFactory withTNonBlockingServer
- * [THRIFT-1368] - TNonblockingServer usage
- * [THRIFT-1061] - Read an invalid frame size of 0. Are you using TFramedTransport on the client side?
- * [THRIFT-491] - Ripping raw pthreads out of TFileTransport and associated test issues
-
-## Sub-task
- * [THRIFT-1596] - Delphi: Test clients should have a return codes that reflect whether they succeeded or not
- * [THRIFT-982] - javame: add version Info to the library
- * [THRIFT-1722] - C# WP7 Assembly addition beaks mono build
- * [THRIFT-336] - Compact Protocol in C#
-
-## Test
- * [THRIFT-1613] - Add code back into empty source file ToStringTest.java
- * [THRIFT-1718] - Incorrect check in TFileTransportTest
-
-## Wish
- * [THRIFT-1463] - Decouple Thrift IDL from generators
- * [THRIFT-1466] - Proper Documentation for Thrift C Glib
- * [THRIFT-1539] - Build and distribute the fb303 python libraries along with thrift
- * [THRIFT-1685] - Please add "aereo.com" to "Powered by Apache Thrift" list in about page
- * [THRIFT-330] - TProcessor - additional method to called when connection is broken
-
-
-
-Thrift 0.8
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-1436] - pip install thrift fails on Windows with "Unable to find vcvarsall.bat"
- * [THRIFT-1432] - Javascript struct constants declared in the same file as their struct definition will cause an error
- * [THRIFT-1428] - shared.thrft does not include namespace for php, so thrift compiler generate incorrect name
- * [THRIFT-1426] - Dist package missing files for release 0.8
- * [THRIFT-1425] - The Node package is incompatible with latest node (0.6) & npm (1.0.27)
- * [THRIFT-1416] - Python Unit test is broken on ci
- * [THRIFT-1419] - AbstractNonBlockingServer does not catch errors when invoking the processor
- * [THRIFT-1424] - Ruby specs fail when run with rake
- * [THRIFT-1420] - Nonblocking and HsHa server should make sure to close all their socket connections when the selector exits
- * [THRIFT-1413] - Generated code does not read MapEnd / ListEnd / SetEnd
- * [THRIFT-1409] - Name conflict check does not work properly for exception object(Delphi).
- * [THRIFT-1408] - Delphi Test Server: Exception test case fails due to naming conflict with e.message
- * [THRIFT-1407] - Typo in Python socket server causes Thrift to fail when we enable a global socket timout
- * [THRIFT-1397] - CI server fails during build due to unused parameters in delphi generator
- * [THRIFT-1404] - Delphi compiler generates struct reader code with problem.
- * [THRIFT-1400] - Ruby native extension aborts with __stack_chk_fail in OSX
- * [THRIFT-1399] - One of the TServerImpl.Create CTORs lacks implementation
- * [THRIFT-1390] - Debian packages build fix for Squeeze (build from the official 0.7.0 tarball)
- * [THRIFT-1393] - TTransportException's thrown from THttpClient contain superfluous slashes in the Exception message
- * [THRIFT-1392] - Enabling both namespaces and autoloading in generated PHP code won't work.
- * [THRIFT-1406] - Build error after applying THRIFT-1395
- * [THRIFT-1405] - Delphi compiler does not generates container serializer properly.
- * [THRIFT-1411] - java generator does not provide type parameter for TBaseProcessor
- * [THRIFT-1473] - JSON context stack may be left in an incorrect state when an exception is thrown during read or write operations
- * [THRIFT-1331] - Ruby library deserializes an empty map to nil
- * [THRIFT-1330] - PHP Namespaces no longer generated
- * [THRIFT-1328] - TBaseHelper.toString(...) appends ByteBuffer data outside of valid buffer range
- * [THRIFT-1322] - OCaml lib fail to compile: Thrift.ml line 305, int vs int32 mismatch
- * [THRIFT-1143] - Build doesn't detect correct architecture type on 64bit osx
- * [THRIFT-1205] - port server unduly fragile with arbitrary input
- * [THRIFT-1279] - type set is handled incorrectly when writing object
- * [THRIFT-1298] - Standard scheme doesn't read or write metadata along with field values
- * [THRIFT-1265] - C++ container deserialize
- * [THRIFT-1263] - publish ruby client to rubygems
- * [THRIFT-1384] - Java help menu missing newline near javame flag
- * [THRIFT-1382] - Bundle install doesnot work because thrift crashes
- * [THRIFT-1381] - Thrift C++ libs have incorrectly versioned names
- * [THRIFT-1350] - Go library code does not build as of r60 (most recent release)
- * [THRIFT-1365] - TupleProtocol#writeBitSet unintentionally writes a variable length byte array
- * [THRIFT-1359] - --gen-cob cpp:cob_style does not compile anymore
- * [THRIFT-1319] - Mismatch between how a union reads and writes a container
- * [THRIFT-1309] - libfb303-0.7.0.jar missing in maven repository
- * [THRIFT-1238] - Thrift JS client cannot read map of structures
- * [THRIFT-1254] - Code can't be compiled against a regular JRE: Object.clone() override has a different return type
- * [THRIFT-1367] - Mac OSX build fails with "no such file to load -- spec/rake/spectask"
- * [THRIFT-1355] - Running make in lib/rb doesn't build the native extensions
- * [THRIFT-1370] - Debian packaging should Build-Depend on libglib2.0-dev
- * [THRIFT-1342] - Compilation problem on Windows of fastbinary.c
- * [THRIFT-1341] - TProtocol.h endian detection wrong with boost
- * [THRIFT-1583] - c_glib leaks memory
- * [THRIFT-1582] - Bad includes of nested thrift files in c_glib
- * [THRIFT-1578] - C_GLib generated code does not compile
- * [THRIFT-1027] - 'make -j 16' fails with "unterminated #ifdef" error
- * [THRIFT-1121] - Java server performance regression in 0.6
- * [THRIFT-857] - tests run by "make install" fail if generators are disabled
- * [THRIFT-380] - Use setuptools for python build
-
-## Dependency upgrade
- * [THRIFT-1257] - thrift's dependency scope on javax.servlet:servlet-api should be 'provided'
-
-## Improvement
- * [THRIFT-1445] - minor C++ generator variable cleanup
- * [THRIFT-1435] - make TException.Message property conformant to the usual expectations
- * [THRIFT-1431] - Rename 'sys' module to 'util'
- * [THRIFT-1396] - Dephi generator has dependacy on boost 1.42 later.
- * [THRIFT-1395] - Patch to prevent warnings for integer types in some cases
- * [THRIFT-1275] - thrift: always prefix namespaces with " ::"
- * [THRIFT-1274] - thrift: fail compilation if an unexpected token is
- * [THRIFT-1271] - thrift: fix missing namespace in generated local
- * [THRIFT-1270] - thrift: add --allow-neg-keys argument to allow
- * [THRIFT-1345] - Allow building without tests
- * [THRIFT-1286] - Modernize the Thrift Ruby Library Dev Environment
- * [THRIFT-1284] - thrift: fix processor inheritance
- * [THRIFT-1283] - thrift: wrap t_cpp_generator::generate_process_function() to 80
- * [THRIFT-1282] - Upgrade httpclient to 4.1.2 (from 4.0.1)
- * [THRIFT-1281] - add @generated to the docblock
- * [THRIFT-1280] - Thrift: Improve Monitor exception-free interfaces
- * [THRIFT-1278] - javadoc warnings - compilation
- * [THRIFT-1227] - Erlang implementation of thrift JSON protocol
- * [THRIFT-1295] - Duplicate include in TSocket.cpp
- * [THRIFT-1294] - thrift: fix log message typos in TSimpleServer
- * [THRIFT-1293] - thrift: improve handling of exceptions thrown by
- * [THRIFT-1292] - thrift: silence log spew from TThreadedServer
- * [THRIFT-1288] - Allow typedefed exceptions in throws clauses
- * [THRIFT-1290] - thrift: TNonblockingServer: clean up state in the
- * [THRIFT-1287] - thrift: start refactoring some of the C++ processor
- * [THRIFT-1289] - thrift: implement TNonblockingServer::stop()
- * [THRIFT-1305] - thrift: make TConnection a private inner class of
- * [THRIFT-1304] - TNonblockingServer: pass in the connection context to
- * [THRIFT-1302] - thrift: raise an exception if send() times out in
- * [THRIFT-1301] - thrift: consolidate common code in TNonblockingServer
- * [THRIFT-1377] - abort PHP deserialization on unknown field type
- * [THRIFT-1379] - fix uninitialized enum values in thrift C++ objects
- * [THRIFT-1376] - Make port specification option in thrift remote
- * [THRIFT-1375] - fixed a hex char conversion bug in TJSONProtocol
- * [THRIFT-1373] - Fix user-defined exception generation in thrift (python)
- * [THRIFT-1361] - Optional replacement of pthread by boost::thread
- * [THRIFT-1320] - Consistency of configure generated config.h
- * [THRIFT-1317] - Remove copy constructibility from
- * [THRIFT-1316] - thrift: update server classes to accept
- * [THRIFT-1315] - thrift: generate server interface factory classes
- * [THRIFT-1314] - thrift: add TProcessorFactory
- * [THRIFT-1335] - Add accept timeout to TServerSocket
- * [THRIFT-1334] - Add more info to IllegalStateException
- * [THRIFT-1333] - Make RWGuard not copyable
- * [THRIFT-1332] - TSSLTransportParameters class uses hard coded value keyManagerType: SunX509
- * [THRIFT-1251] - Generated java code should indicate which fields are required and which are optional
- * [THRIFT-1387] - Build MSVC libraries with Boost Threads instead of Pthreads
- * [THRIFT-1339] - Extend Tuple Protocol to TUnions
- * [THRIFT-1031] - Patch to compile Thrift for vc++ 9.0 and 10.0
- * [THRIFT-1130] - Add the ability to specify symbolic default value for optional boolean
- * [THRIFT-1123] - Patch to compile Thrift server and client for vc++ 9.0 and 10.0
- * [THRIFT-386] - Make it possible to build the Python library without the extension
-
-## New Feature
- * [THRIFT-1401] - JSON-protocol for Delphi XE Libraries
- * [THRIFT-1167] - Java nonblocking server with more than one thread for select and handling IO
- * [THRIFT-1366] - Delphi generator, lirbrary and unit test.
- * [THRIFT-1354] - Add rake task to build just the gem file
- * [THRIFT-769] - Pluggable Serializers
-
-## Sub-task
- * [THRIFT-1415] - delphi: add version Info to the library
- * [THRIFT-1391] - Improved Delphi XE test cases
-
-
-
-Thrift 0.7
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-1140] - Framed Transport Client using C (Glib) Library hangs when connecting to Ruby Server
- * [THRIFT-1154] - HttpClient does not specify the connection close parameter
- * [THRIFT-1153] - HttpClient does not specify the connection close parameter
- * [THRIFT-1149] - Nonblocking server fails when client connection is reset
- * [THRIFT-1146] - Android Incompatibility : in Android < 2.3 java.io.IOException doesn't support for Throwable parameter in constructor
- * [THRIFT-1133] - Java and JavaScript tutorial is broken since we have Java maven deployment
- * [THRIFT-1132] - Deserialization error in TApplicationException C#
- * [THRIFT-1131] - C# JSON Protocol is unable to decode escaped characters in string
- * [THRIFT-1208] - python TCompactProtocol.py writeBool and readBool not follow the compact-proto-spec-2.txt spec for CONTAINER_WRITE, CONTAINER_READ
- * [THRIFT-1200] - JS compiler generates code that clobbers existing namespaces
- * [THRIFT-1183] - Pure-ruby CompactProtocol raises ArgumentError when deserializing under Ruby 1.9
- * [THRIFT-1182] - Native deserializer segfaults on incorrect list element type
- * [THRIFT-1181] - AS3 compiler generates incorrect code for setting default values in constructor
- * [THRIFT-1234] - thrift --help is missing doc on py:utf8strings
- * [THRIFT-1180] - AS3 compiler generates uncompilable code for binary types.
- * [THRIFT-1194] - Java lib does not install artifacts to local dir correctly
- * [THRIFT-1193] - Potential infinite loop in nonblocking_server
- * [THRIFT-1192] - Typo: TProtocol.h tests for HAVE_SYS_PARAM_H_
- * [THRIFT-1190] - readBufferBytesAllocated in TNonblockingServer.java should be AtomicLong to fix FD leakage and general server malfunction
- * [THRIFT-1187] - nonblocking_server shutdown race under Ruby 1.9
- * [THRIFT-1178] - Java: TBase signature should be T extends TBase,?>
- * [THRIFT-1164] - Segmentation fault on NULL pointer in t_js_generator::generate_const
- * [THRIFT-1171] - Perl write/readDouble assumes little-endian platform
- * [THRIFT-1222] - Unhandled exception for TEvhttpServer request
- * [THRIFT-1220] - TProcessor::process never returns false
- * [THRIFT-1285] - Stable 0.7.0 Windows compiler exe available on the webside is not the good one
- * [THRIFT-1218] - c_glib uses wrong name in pkg-config
- * [THRIFT-1215] - Undefined property Thirft in lib/js/thrift.js
- * [THRIFT-1211] - When using THttpClient, non 200 responses leave the connection open
- * [THRIFT-1228] - The php accelerator module calls flush incorrectly
- * [THRIFT-1308] - libfb303-0.7.0.jar missing in maven repository
- * [THRIFT-1255] - Mismatch of method name between JavaME's lib and generated code (compareTo/compareObjects)
- * [THRIFT-1253] - Code generated for maps is not compiling
- * [THRIFT-1252] - Segfault in Ruby deserializer
- * [THRIFT-1094] - bug in TCompactProto python readMessageEnd method and updated test cases
- * [THRIFT-1093] - several bugs in python TCompactProtocol
- * [THRIFT-1092] - generated validate() method has wrong indentation
- * [THRIFT-1011] - Error generating package imports when using classes from other packages
- * [THRIFT-1050] - Declaring an argument named "manager" to a service method produces code that fails compile due to name conflicts with protected ivars in TAsyncClient
- * [THRIFT-1074] - .keystore and .truststore are missing from the 0.6.0 distribution
- * [THRIFT-1067] - Tons of bugs in php implementation
- * [THRIFT-1065] - Unexpected exceptions not proper handled on JS
- * [THRIFT-1076] - Erlang Thrift socket server has a bug that causes java thrift client of framed binary client to throw "out of sequence" exception
- * [THRIFT-1057] - casts in TBinaryProtocol.tcc causing "dereferencing type-punned pointer will break strict-aliasing rules" warnings from gcc
- * [THRIFT-1055] - csharp TServerSocket and TSocket do not disable Nagle via Socket.NoDelay = true like cpp and java do
- * [THRIFT-1054] - explicit call to PKG_PROG_PKG_CONFIG is missing and first use of PKG_CHECK_MODULES may not happen, causes mono detection to fail
- * [THRIFT-1117] - JavaScript Unit Test does not work anymore because libthrift*.jar where moved by Maven Deployment
- * [THRIFT-1111] - The HTML generator does not distinguish between string and binary types
- * [THRIFT-1032] - "make dist" fails due to c_glib problem
- * [THRIFT-1036] - Auto-generated C++ code fails to compile with "-Werror -Wextra -Wall" g++ compiler flags
- * [THRIFT-1041] - TDeserializer holds onto a reference of the array it reads after it is done deserializing
- * [THRIFT-1106] - C++ code TAsyncProtocolProcessor.h & TAsyncBufferProcessor.h dont have virtual functions but no virtual destructor. Causes warnings on -Wall
- * [THRIFT-1105] - OCaml generator does not prefix methods of included structs with their type
- * [THRIFT-1104] - INSTALLDIRS should be included in configure script
- * [THRIFT-1102] - typo in configure.ac: "==" operator in 'test' (instead of"'=")
- * [THRIFT-1101] - bytebuffer length calculation in TBinaryProtocol writeBinary
- * [THRIFT-1098] - Undefined properties in TBinaryProtocolFactory
- * [THRIFT-1081] - PHP tests broken and somewhat incomplete
- * [THRIFT-1080] - erlang test's 'make' fails on Mac OSX
- * [THRIFT-1078] - ThriftTest.thrift generates invalid PHP library
- * [THRIFT-1120] - proto.WriteListEnd being called in the wrong place
- * [THRIFT-1119] - TJSONProtocol fails to UTF8 decode strings
- * [THRIFT-867] - PHP accelerator module's output transport is incompatible with TFramedTransport
- * [THRIFT-826] - PHP TSocket Write Timeout
- * [THRIFT-835] - Bad AS3 syntax in constructors that set default values
- * [THRIFT-788] - thrift_protocol.so: multiget/multiget_slice does not handle more than 17 keys correctly
- * [THRIFT-125] - OCaml libraries don't compile with 32-bit ocaml
- * [THRIFT-342] - PHP: can't have sets of complex types
- * [THRIFT-731] - configure doesn't check for ant >= 1.7
- * [THRIFT-690] - Update TApplicationException codes
- * [THRIFT-638] - BufferedTransport + C extensions block until recv timeout is reached on last fread call
-
-## Dependency upgrade
- * [THRIFT-1177] - Update thrift to reflect changes in Go's networking libraries
-
-## Improvement
- * [THRIFT-1155] - Remove log4j dependency from java client
- * [THRIFT-1151] - Produce more informative runtime error in case of schema and data mismatch during serialization
- * [THRIFT-1207] - Support DESTDIR on "make install" of ruby libs
- * [THRIFT-1199] - Union structs should have generated methods to test whether a specific field is currently set
- * [THRIFT-1233] - Remove unused include in generated C++ code
- * [THRIFT-1189] - Ruby deserializer speed improvements
- * [THRIFT-1170] - Thrift Generated Code and Java 5
- * [THRIFT-1174] - Publish as3 client implementation via Maven for use by flex-mojos users
- * [THRIFT-1225] - TCompactProtocol for PHP
- * [THRIFT-1221] - Remove SimpleCallback.h
- * [THRIFT-1217] - Use evutil_socketpair instead of pipe (Windows port)
- * [THRIFT-1216] - build Java Library behind a proxy
- * [THRIFT-1231] - Remove bogus include
- * [THRIFT-1213] - Membuffer should provide a way to get back the buffer
- * [THRIFT-1237] - Java fb303 missing some methods
- * [THRIFT-1063] - Fix Erlang Tutorial Files
- * [THRIFT-1053] - Make remote client's IP address available for all socket related transports
- * [THRIFT-1109] - Deploy fb303 along side libthrift to maven repo
- * [THRIFT-1107] - improvement for compiler-generated python for 'None' object comparisons
- * [THRIFT-1069] - Add command line option to prevent thrift from inserting gen-* directories
- * [THRIFT-1049] - Allow for TServerSocket python library to bind to a specific host
- * [THRIFT-1126] - Extending struct_info for erlang bindings
- * [THRIFT-1100] - python TSSLSocket improvements, including certificate validation
- * [THRIFT-994] - Don't try to invoke phpize if we don't have it
- * [THRIFT-993] - Some improvements in C++ stubs for oneway operations
- * [THRIFT-997] - Using valueOf for base types in getFieldValue
- * [THRIFT-418] - Don't do runtime sorting of struct fields
- * [THRIFT-151] - TSSLServerSocket and TSSLSocket implementation
- * [THRIFT-27] - Generated erlang types don't contain default values for records
- * [THRIFT-113] - to-string methods should omit optional null fields from output
- * [THRIFT-363] - Maven Deploy
- * [THRIFT-447] - Make an abstract base Client class so we can generate less code
- * [THRIFT-627] - should c++ have setters for optional fields?
-
-## New Feature
- * [THRIFT-1236] - Erlang Reconnecting Thrift Client
- * [THRIFT-1021] - Framed transport support for OCaml
- * [THRIFT-1068] - Python SSL Socket Support
- * [THRIFT-1103] - TZlibTransport for python, a zlib compressed transport
- * [THRIFT-1083] - Preforking python process pool server
- * [THRIFT-999] - Add TForkingServer
-
-## Sub-task
- * [THRIFT-1152] - Attributes from private to protected
- * [THRIFT-1038] - Generated Java code for structures containing binary fields (or collections thereof) are not serializable (in the Java sense) even though they implement java.io.Serializable
-
-## Task
- * [THRIFT-892] - Refactor erlang build system with rebar
-
-## Wish
- * [THRIFT-625] - Add support for 'Go'
-
-
-
-Thrift 0.6.1
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-1133] - Java and JavaScript tutorial is broken since we have Java maven deployment
- * [THRIFT-1131] - C# JSON Protocol is unable to decode escaped characters in string
- * [THRIFT-1074] - .keystore and .truststore are missing from the 0.6.0 distribution
-
-## Improvement
- * [THRIFT-1109] - Deploy fb303 along side libthrift to maven repo
- * [THRIFT-363] - Maven Deploy
-
-## Question
- * [THRIFT-1206] - did the THRIFT 0.6.1 merge THRIFT-563 ?
-
-## Sub-task
- * [THRIFT-1163] - How can i use multi service in one program?
-
-## Task
- * [THRIFT-1112] - Apply THRIFT-363 to 0.6 branch
- * [THRIFT-1113] - Apply THRIFT-1074 to 0.6 branch
-
-
-
-Thrift 0.6
---------------------------------------------------------------------------------
-## Bug
- * [THRIFT-1020] - OCaml compiler generates invalid OCaml
- * [THRIFT-1015] - TUnion does not handle ByteBuffer in toString
- * [THRIFT-1013] - generated java code may have name clashes with thrift library
- * [THRIFT-1009] - TUnion does not correctly deep copy a ByteBuffer
- * [THRIFT-1032] - "make dist" fails due to c_glib problem
- * [THRIFT-868] - Referencing constant values doesn't work with with typedef types
- * [THRIFT-971] - java module can't be compiled without ivy and network connection
- * [THRIFT-970] - Under heavy load, THttpClient may fail with "too many open files"
- * [THRIFT-969] - Java Tutorial broken, move CalculatorHandler to a separate file
- * [THRIFT-807] - JavaScript: Initialization of Base Types with 0 instead of null
- * [THRIFT-955] - Thrift compiler for Windows uses lowercase names and directories which is inconsistent with compiling on other platforms
- * [THRIFT-992] - Naming convention in C# constructor is not consistent with other fields causes compile errors
- * [THRIFT-1008] - byte[] accessors throw NPE on unset field
- * [THRIFT-1006] - Impossible to correctly qualify an enum constant in an external thrift file
- * [THRIFT-950] - Haskell bindings treat 'byte' as unsigned 8-bit int (Data.Word.Word8), java/cpp as signed (byte/int8_t).
- * [THRIFT-975] - lib/c_glib/README is missing => breaks make dist
- * [THRIFT-944] - Support all version-4s of base
- * [THRIFT-939] - optional binary fields throw NPE on default byte[] getters
- * [THRIFT-935] - PHP Extension aborts the build if php-config is not installed
- * [THRIFT-933] - Haskell's Thrift.cabal has warnings
- * [THRIFT-932] - Haskell tests need to be run through 'make check' (and probably 'cabal check') too
- * [THRIFT-904] - C# TSocket should disable nagle and linger
- * [THRIFT-941] - Make PHP C Extension use the defined Protocol writeMessageBegin function
- * [THRIFT-940] - 'make check' fails if boost is not in the std include and link paths
- * [THRIFT-924] - Fix generated php structure constants
- * [THRIFT-979] - ruby bindings used to work on jruby
- * [THRIFT-977] - Hex Conversion Bug in C++ TJSONProtocol
- * [THRIFT-347] - PHP TSocket Timeout Issues
- * [THRIFT-517] - TExceptions thrown by server result in cryptic error message on client - Tried to read 4 bytes, but only got 0 bytes
-
-## Improvement
- * [THRIFT-1024] - Add Python Twisted example to the Tutorial
- * [THRIFT-958] - Change accessmodifer on trans_ field in the FrameBuffer class to public.
- * [THRIFT-957] - THsHaServer: Change access modifier of the invoker field.
- * [THRIFT-1002] - CodeStyle: t_c_glib_generator.cc
- * [THRIFT-1005] - Give unions byte[] signature methods to go along with their ByteBuffer counterparts
- * [THRIFT-951] - Add a new isServing() method to TServer
- * [THRIFT-943] - Silly readme typo fix.
- * [THRIFT-961] - JavaScript TestSuite using ant/ivy and Java's ServerTestBase Handler
- * [THRIFT-960] - add TestServer, TestNonblockingServer and TestClient again
- * [THRIFT-949] - Modify the TEnum interface so it defines a method similar to findByValue
- * [THRIFT-946] - Augment FieldValueMetaData so it differentiates 'string' and 'binary' fields.
- * [THRIFT-903] - custom ThreadFactory in THsHaServer
- * [THRIFT-913] - Test Case for Url encoded strings + simple enhancement to lib/js/test/RunTestServer.sh
- * [THRIFT-926] - Miscellaneous C++ improvements
- * [THRIFT-929] - Improvements to the C++ test suite
- * [THRIFT-893] - add JavaScript to the tutorial examples
- * [THRIFT-1003] - Polishing c_glib code
- * [THRIFT-71] - Debian packaging for thrift
-
-## New Feature
- * [THRIFT-1033] - Node.js language target
- * [THRIFT-947] - Provide a helper method to determine the TProtocol used to serialize some data.
- * [THRIFT-928] - Make more statistics available in C++ servers
- * [THRIFT-922] - Templatized [de]serialization code for C++
- * [THRIFT-923] - Event-driven client and server support for C++
- * [THRIFT-925] - Provide name<->value map for enums in C++
- * [THRIFT-927] - Add option to modify the PHP include path
- * [THRIFT-377] - TFileTransport port in Java
- * [THRIFT-106] - TSSLServerSocket
- * [THRIFT-582] - C implementation of Thrift
- * [THRIFT-745] - Make it easier to instantiate servers
-
-## Sub-task
- * [THRIFT-1038] - Generated Java code for structures containing binary fields (or collections thereof) are not serializable (in the Java sense) even though they implement java.io.Serializable
-
-## Task
- * [THRIFT-862] - Async client issues / improvements
-
-## Test
- * [THRIFT-581] - Add a testsuite for txThrift (Twisted)
-
-
-
-Thrift 0.5.0 - Incubating
---------------------------------------------------------------------------------
-THRIFT-505 Build Make configure give a summary of the enabled components (David Reiss)
-THRIFT-506 Build Allow Thrift to be built without the C++ library (David Reiss)
-THRIFT-844 Build Build Requirements state autoconf 2.59+ is required, but 2.60+ is needed (Harlan Lieberman-Berg)
-THRIFT-850 Build Perl runtime requires Bit::Vector which may not be installed by default, but configure does not fail (Michael Lum)
-THRIFT-854 Build Provide configure option and make rules to build/install php extension (Anthony Molinaro)
-THRIFT-858 Build Have bootstrap.sh check for a suitable autoconf version before running (David Reiss)
-THRIFT-871 Build Thrift compiler for WIndows (binary distribution) (David Reiss)
-THRIFT-323 C# TJSONProtocol (Roger Meier)
-THRIFT-634 C# C# Compiler Generates Incorrect Code For Fields which begin with an uppercase letter (Jon S Akhtar)
-THRIFT-881 C# add csharp to the tutorial (Roger Meier)
-THRIFT-856 C++ Building cpp library fails on OS X with malloc and free not being declared in scope (James Clarke)
-THRIFT-865 C++ C++ compiler build depends on libfl even when flex/lex not detected (David Reiss)
-THRIFT-900 C++ Unix domain socket (Roger Meier)
-THRIFT-920 C++ C++ Test and Tutorial does not compile anymore due to the change within Enum handling (Roger Meier)
-THRIFT-567 C++ Can't immediately stop a TSimpleServer thread that is idle (Rush Manbert)
-THRIFT-756 C++ Exposing TSocket(int) constructor to public (Rajat Goel)
-THRIFT-798 C++ TNonblockingServer leaks resources when destroyed (David Reiss)
-THRIFT-812 C++, Python Demo of Thrift over ZeroMQ (David Reiss)
-THRIFT-629 Cocoa Unused Field In TSocketServer Appears To Break iPhone Build (Jon S Akhtar)
-THRIFT-838 Cocoa Generated Cocoa classes have useless @dynamic declarations (Kevin Ballard)
-THRIFT-805 Cocoa Don't generate process_XXXX methods for oneway methods (Brad Taylor)
-THRIFT-507 Compiler Remove the compiler's dependency on Boost (David Reiss)
-THRIFT-895 Compiler (General) Thrift compiler does not allow two different enumerations to have the same key name for one of the enum values (David Reiss)
-THRIFT-852 Compiler (General) Missing newline causes many compiler warnings (Anthony Molinaro)
-THRIFT-877 Compiler (General) smalltalk namespace doesn't work (Bruce Lowekamp)
-THRIFT-897 Compiler (General) Don't allow unqualified constant access to enum values (Bryan Duxbury)
-THRIFT-9 Compiler (General) Add a default namespace declaration for all languages (David Reiss)
-THRIFT-599 Erlang Don't use unnecessary processes in the Erlang transports and clients (David Reiss)
-THRIFT-646 Erlang Erlang library is missing install target (David Reiss)
-THRIFT-698 Erlang Generated module list should contain atoms, not strings (Anthony Molinaro)
-THRIFT-866 Erlang term() in spec definitions seems to not work in erlang R12 (Anthony Molinaro)
-THRIFT-886 Erlang Dialyzer warning (Anthony Molinaro)
-THRIFT-785 Erlang Framed transport server problems (Anthony Molinaro)
-THRIFT-884 HTML HTML Generator: add Key attribute to the Data Types Tables (Roger Meier)
-THRIFT-652 Haskell Generated field name for strut is not capitalized correctly (Christian Lavoie)
-THRIFT-743 Haskell compile error with GHC 6.12.1 (Christian Lavoie)
-THRIFT-901 Haskell Allow the bindings to compile without -fglasgow-exts and with -Wall -Werror (Christian Lavoie)
-THRIFT-905 Haskell Make haskell thrift bindings use automake to compile and install (Christian Lavoie)
-THRIFT-906 Haskell Improve type mappings (Christian Lavoie)
-THRIFT-914 Haskell Make haskell bindings 'easily' compilable (Christian Lavoie)
-THRIFT-918 Haskell Make haskell tests run again (Christian Lavoie)
-THRIFT-919 Haskell Update Haskell bindings README (Christian Lavoie)
-THRIFT-787 Haskell Enums are not read correctly (Christian Lavoie)
-THRIFT-250 Java ExecutorService as a constructor parameter for TServer (Ed Ceaser)
-THRIFT-693 Java Thrift compiler generated java code that throws compiler warnings about deprecated methods. (Bryan Duxbury)
-THRIFT-843 Java TNonblockingSocket connects without a timeout (Bryan Duxbury)
-THRIFT-845 Java async client does not respect timeout (Ning Liang)
-THRIFT-870 Java Java constants don't get Javadoc comments (Bryan Duxbury)
-THRIFT-873 Java Java tests fail due to Too many open files (Todd Lipcon)
-THRIFT-876 Java Add SASL support (Aaron T. Myers)
-THRIFT-879 Java Remove @Override from TUnion.clear (Dave Engberg)
-THRIFT-882 Java deep copy of binary fields does not copy ByteBuffer characteristics (arrayOffset, position) (Bryan Duxbury)
-THRIFT-888 Java async client should also have nonblocking connect (Eric Jensen)
-THRIFT-890 Java Java tutorial doesn't work (Todd Lipcon)
-THRIFT-894 Java Make default accessors for binary fields return byte[]; provide new accessors to get ByteBuffer version (Bryan Duxbury)
-THRIFT-896 Java TNonblockingSocket.isOpen() returns true even after close() (Eric Jensen)
-THRIFT-907 Java libfb303 doesn't compile in 0.4.0 (Todd Lipcon)
-THRIFT-912 Java Improvements and bug fixes to SASL implementation (Todd Lipcon)
-THRIFT-917 Java THsHaServer should not accept an ExecutorService without catching RejectedExecutionException (Ed Ceaser)
-THRIFT-931 Java Use log4j for Java tests (Todd Lipcon)
-THRIFT-880 JavaME JavaME code generator and runtime library (Dave Engberg)
-THRIFT-846 JavaScript JavaScript Test Framwork: extended Testcases (Roger Meier)
-THRIFT-885 JavaScript Url encoded strings never get decoded? How do we fix this? (T Jake Luciani)
-THRIFT-911 JavaScript (JavaScript compiler) Const structs, maps, sets, and lists generate a trailing comma (T Jake Luciani)
-THRIFT-860 OCaml copy method and reset method (Lev Walkin)
-THRIFT-682 PHP PHP extension doesn't compile on Mac OS X (Bryan Duxbury)
-THRIFT-851 PHP php extension fails to compile on centos 5.x (Todd Lipcon)
-THRIFT-840 Perl Perl protocol handler could be more robust against unrecognised types (Conrad Hughes)
-THRIFT-758 Perl incorrect deference in exception handling (Yann Kerherve)
-THRIFT-257 Python Support validation of required fields (Esteve Fernandez)
-THRIFT-335 Python Compact Protocol for Python (David Reiss)
-THRIFT-596 Python Make Python's TBufferedTransport use a configurable input buffer (David Reiss)
-THRIFT-597 Python Python THttpServer performance improvements (David Reiss)
-THRIFT-598 Python Allow Python's threading servers to use daemon threads (David Reiss)
-THRIFT-666 Python Allow the handler to override HTTP responses in THttpServer (David Reiss)
-THRIFT-673 Python Generated Python code has whitespace issues (Ian Eure)
-THRIFT-721 Python THttpClient ignores url parameters (Thomas Kho)
-THRIFT-824 Python TApplicationException.__str__() refers to class constants as globals (Peter Schuller)
-THRIFT-855 Python Include optimized compiled python objects in install (Anthony Molinaro)
-THRIFT-859 Python Allow py:twisted to be generated in different namespace than py (Bruce Lowekamp)
-THRIFT-869 Python TSocket.py on Mac (and FreeBSD) doesn't handle ECONNRESET from recv() (Steven Knight)
-THRIFT-875 Python Include python setup.cfg in dist (Anthony Molinaro)
-THRIFT-610 Ruby binary_protocol.rb segfaults [line 86] (Unassigned)
-THRIFT-899 Ruby Ruby read timeouts can sometimes be 2x what they should be (Ryan King)
-THRIFT-909 Ruby allow block argument to struct constructor (Michael Stockton)
-THRIFT-456 Test Suite Bad IP address string in test/cpp/src/main.cpp (Rush Manbert)
-
-
-Thrift 0.4.0 - Incubating
---------------------------------------------------------------------------------
-THRIFT-650 Build Make Check fails on Centos/OSX with 0.2.0 tarball (Anthony Molinaro)
-THRIFT-770 Build Get 'make dist' to work without first compiling source code (Anthony Molinaro)
-THRIFT-160 C# Created THttpTransport for the C# library based on WebHttpRequest (Michael Greene)
-THRIFT-834 C# THttpClient resends contents of message after transport errors (Anatoly Fayngelerin)
-THRIFT-247 C++ THttpServer Transport (Unassigned)
-THRIFT-676 C++ Change C++ code generator so that generated classes can be wrapped with SWIG (Unassigned)
-THRIFT-570 Compiler Thrift compiler does not error when duplicate method names are present (Bruce Simpson)
-THRIFT-808 Compiler Segfault when constant declaration references a struct field that doesn't exist (Bryan Duxbury)
-THRIFT-646 Erlang Erlang library is missing install target (Anthony Molinaro)
-THRIFT-544 General multiple enums with the same key generate invalid code (Ben Taitelbaum)
-THRIFT-434 General ruby compiler should warn when a reserved word is used (Michael Stockton)
-THRIFT-799 General Files missing proper Apache license header (Bryan Duxbury)
-THRIFT-832 HTML HTML generator shows unspecified struct fields as 'required' (Bryan Duxbury)
-THRIFT-226 Java Collections with binary keys or values break equals() (Bryan Duxbury)
-THRIFT-484 Java Ability to use a slice of a buffer instead of a direct byte[] for binary fields (Bryan Duxbury)
-THRIFT-714 Java maxWorkerThreads parameter to THsHaServer has no effect (Bryan Duxbury)
-THRIFT-751 Java Add clear() method to TBase (Bryan Duxbury)
-THRIFT-765 Java Improved string encoding and decoding performance (Bryan Duxbury)
-THRIFT-768 Java Async client for Java (Bryan Duxbury)
-THRIFT-774 Java TDeserializer should provide a partialDeserialize method for primitive types (Piotr Kozikowski)
-THRIFT-783 Java .equals java method is broken on structs containing binary-type fields (Unassigned)
-THRIFT-804 Java CompareTo is broken for unions set to map, set, or list (Bryan Duxbury)
-THRIFT-814 Java Include a TServlet in the standard Thrift distribution (Mathias Herberts)
-THRIFT-818 Java Async client doesn't send method args (Bryan Duxbury)
-THRIFT-830 Java Switch binary field implementation from byte[] to ByteBuffer (Bryan Duxbury)
-THRIFT-831 Java FramedTransport implementation that reuses its buffers (Bryan Duxbury)
-THRIFT-833 Java build.xml in lib/java is missing a classpathref attribute for the javadoc task (Bryan Duxbury)
-THRIFT-836 Java Race condition causes CancelledKeyException in TAsyncClientManager (Bryan Duxbury)
-THRIFT-842 Java Upgrade to current version of commons-lang (2.5 instead of 2.4) and/or change dependency in ivy.xml to not be exact (Bryan Duxbury)
-THRIFT-815 JavaScript Deserialization of lists is critically broken. (T Jake Luciani)
-THRIFT-827 OCaml OCaml generator to take default values into account (Lev Walkin)
-THRIFT-647 PHP PHP library is missing install target (Anthony Molinaro)
-THRIFT-682 PHP PHP extension doesn't compile on Mac OS X (Bryan Duxbury)
-THRIFT-718 PHP Thrift PHP library includes closing tags and extraneous whitespace (Nicholas Telford)
-THRIFT-778 PHP PHP socket listening server (Nick Jones)
-THRIFT-780 PHP PHP extension sometimes causes an abort with two exceptions at the same time (David Reiss)
-THRIFT-837 PHP PHP accelerator bug for writes > 8k (Thomas Kho)
-THRIFT-782 Perl Perl code for writing containers doesn't count length of write*Begin or write*End (Conrad Hughes)
-THRIFT-395 Python Python library + compiler does not support unicode strings (Unassigned)
-THRIFT-133 Ruby 'namespace ruby' should error out, or be an alias to 'namespace rb' (Bryan Duxbury)
-THRIFT-664 Ruby Ruby extension fails to build with Ruby 1.9.1 (Rajesh Malepati)
-THRIFT-699 Ruby Excise unused "native protocol method table" stuff from thrift_native (Bryan Duxbury)
-THRIFT-767 Ruby ruby compiler does not keep comments for enum values (Bryan Duxbury)
-THRIFT-811 Ruby http_client_transport.rb: allow custom http headers (Tony Kamenick)
-THRIFT-459 Ruby Ruby installation always tries to write to /Library/Ruby/site (Matthieu Imbert)
-
-
-Thrift 0.1.0 - Incubating (not released)
---------------------------------------------------------------------------------
-Compatibility Breaking Changes:
- C++:
- * It's quite possible that regenerating code and rebuilding will be
- required. Make sure your headers match your libs!
-
- Java:
-
- Python:
-
- Ruby:
- * Generated files now have underscored names [THRIFT-421]
- * The library has been rearranged to be more Ruby-like [THRIFT-276]
-
- Erlang:
- * Generated code will have to be regenerated, and the new code will
- have to be deployed atomically with the new library code [THRIFT-136]
-
-New Features and Bug Fixes:
- C++:
- * Support for TCompactProtocol [THRIFT-333]
-
- Java:
- * Support for TCompactProtocol [THRIFT-110]
-
- Python:
- * Support for Twisted [THRIFT-148]
-
- Ruby:
- * Support for TCompactProtocol [THRIFT-332]
-
diff --git a/vendor/src/github.com/apache/thrift/CMakeLists.txt b/vendor/src/github.com/apache/thrift/CMakeLists.txt
deleted file mode 100644
index 93ed8d2ac..000000000
--- a/vendor/src/github.com/apache/thrift/CMakeLists.txt
+++ /dev/null
@@ -1,117 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-cmake_minimum_required(VERSION 2.8.12)
-
-project("Apache Thrift")
-
-set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake")
-
-# TODO: add `git rev-parse --short HEAD`
-# Read the version information from the Autoconf file
-file (STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGURE_AC REGEX "AC_INIT\\(.*\\)" )
-
-# The following variable is used in the version.h.in file
-string(REGEX REPLACE "AC_INIT\\(\\[.*\\], \\[([0-9]+\\.[0-9]+\\.[0-9]+(-dev)?)\\]\\)" "\\1" PACKAGE_VERSION ${CONFIGURE_AC})
-message(STATUS "Parsed Thrift package version: ${PACKAGE_VERSION}")
-
-# These are internal to CMake
-string(REGEX REPLACE "([0-9]+\\.[0-9]+\\.[0-9]+)(-dev)?" "\\1" thrift_VERSION ${PACKAGE_VERSION})
-string(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" thrift_VERSION_MAJOR ${thrift_VERSION})
-string(REGEX REPLACE "[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" thrift_VERSION_MINOR ${thrift_VERSION})
-string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" thrift_VERSION_PATCH ${thrift_VERSION})
-message(STATUS "Parsed Thrift version: ${thrift_VERSION} (${thrift_VERSION_MAJOR}.${thrift_VERSION_MINOR}.${thrift_VERSION_PATCH})")
-
-# Some default settings
-include(DefineCMakeDefaults)
-
-# Build time options are defined here
-include(DefineOptions)
-include(DefineInstallationPaths)
-
-# Based on the options set some platform specifics
-include(DefinePlatformSpecifc)
-
-# Generate the config.h file
-include(ConfigureChecks)
-
-# Package it
-include(CPackConfig)
-
-
-find_package(Threads)
-
-include(CTest)
-if(BUILD_TESTING)
- message(STATUS "Building with unittests")
-
- enable_testing()
- # Define "make check" as alias for "make test"
- add_custom_target(check COMMAND ctest)
-else ()
- message(STATUS "Building without tests")
-endif ()
-
-if(BUILD_COMPILER)
- if(NOT EXISTS ${THRIFT_COMPILER})
- set(THRIFT_COMPILER $)
- endif()
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/compiler/cpp)
-elseif(EXISTS ${THRIFT_COMPILER})
- add_executable(thrift-compiler IMPORTED)
- set_property(TARGET thrift-compiler PROPERTY IMPORTED_LOCATION ${THRIFT_COMPILER})
-endif()
-
-if(BUILD_CPP)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/cpp)
- if(BUILD_TUTORIALS)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tutorial/cpp)
- endif()
- if(BUILD_TESTING)
- if(WITH_LIBEVENT AND WITH_ZLIB AND WITH_OPENSSL)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/cpp)
- else()
- message(WARNING "libevent and/or ZLIB and/or OpenSSL not found or disabled; will not build some tests")
- endif()
- endif()
-endif()
-
-if(BUILD_C_GLIB)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/c_glib)
-endif()
-
-if(BUILD_JAVA)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/java)
-endif()
-
-if(BUILD_PYTHON)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/py)
- if(BUILD_TESTING)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/py)
- endif()
-endif()
-
-if(BUILD_HASKELL)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/hs)
- if(BUILD_TESTING)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/hs)
- endif()
-endif()
-
-PRINT_CONFIG_SUMMARY()
diff --git a/vendor/src/github.com/apache/thrift/CONTRIBUTING.md b/vendor/src/github.com/apache/thrift/CONTRIBUTING.md
deleted file mode 100644
index 316da9a00..000000000
--- a/vendor/src/github.com/apache/thrift/CONTRIBUTING.md
+++ /dev/null
@@ -1,49 +0,0 @@
-## How to contribute
- 1. Help to review and verify existing patches
- 1. Make sure your issue is not all ready in the [Jira issue tracker](http://issues.apache.org/jira/browse/THRIFT)
- 1. If not, create a ticket describing the change you're proposing in the [Jira issue tracker](http://issues.apache.org/jira/browse/THRIFT)
- 1. Contribute your patch using one of the two methods below
-
-### Contributing via a patch
-
-1. Check out the latest version of the source code
-
- * git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift
-
-1. Modify the source to include the improvement/bugfix
-
- * Remember to provide *tests* for all submited changes
- * When bugfixing: add test that will isolate bug *before* applying change that fixes it
- * Verify that you follow [Thrift Coding Standards](/docs/coding_standards) (you can run 'make style', which ensures proper format for some languages)
-
-1. Create a patch from project root directory (e.g. you@dev:~/thrift $ ):
-
- * git diff > ../thrift-XXX-my-new-feature.patch
-
-1. Attach the newly generated patch to the issue
-1. Wait for other contributors or committers to review your new addition
-1. Wait for a committer to commit your patch
-
-### Contributing via GitHub pull requests
-
-1. Create a fork for http://github.com/apache/thrift
-1. Create a branch for your changes(best practice is issue as branch name, e.g. THRIFT-9999)
-1. Modify the source to include the improvement/bugfix
-
- * Remember to provide *tests* for all submited changes
- * When bugfixing: add test that will isolate bug *before* applying change that fixes it
- * Verify that you follow [Thrift Coding Standards](/docs/coding_standards) (you can run 'make style', which ensures proper format for some languages)
- * Verify that your change works on other platforms by adding a GitHub service hook to [Travis CI](http://docs.travis-ci.com/user/getting-started/#Step-one%3A-Sign-in) and [AppVeyor](http://www.appveyor.com/docs)
-
-1. Commit and push changes to your branch (please use issue name and description as commit title, e.g. THRIFT-9999 make it perfect)
-1. Issue a pull request with the jira ticket number you are working on in it's name
-1. Wait for other contributors or committers to review your new addition
-1. Wait for a committer to commit your patch
-
-### More info
-
- Plenty of information on why and how to contribute is available on the Apache Software Foundation (ASF) web site. In particular, we recommend the following:
-
- * [Contributors Tech Guide](http://www.apache.org/dev/contributors)
- * [Get involved!](http://www.apache.org/foundation/getinvolved.html)
- * [Legal aspects on Submission of Contributions (Patches)](http://www.apache.org/licenses/LICENSE-2.0.html#contributions)
diff --git a/vendor/src/github.com/apache/thrift/Dockerfile b/vendor/src/github.com/apache/thrift/Dockerfile
deleted file mode 100644
index 0d7ad2175..000000000
--- a/vendor/src/github.com/apache/thrift/Dockerfile
+++ /dev/null
@@ -1,61 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Goal: provide a thrift-compiler Docker image
-#
-# Usage:
-# docker run -v "${PWD}:/data" thrift/thrift-compiler -gen cpp -o /data/ /data/test/ThriftTest.thrift
-#
-# further details on docker for thrift is here build/docker/
-#
-# TODO: push to apache/thrift-compiler instead of thrift/thrift-compiler
-
-FROM debian:jessie
-MAINTAINER Apache Thrift
-
-ENV DEBIAN_FRONTEND noninteractive
-
-ADD . /thrift
-
-RUN buildDeps=" \
- flex \
- bison \
- g++ \
- make \
- cmake \
- curl \
- "; \
- apt-get update && apt-get install -y --no-install-recommends $buildDeps \
- && mkdir /tmp/cmake-build && cd /tmp/cmake-build \
- && cmake \
- -DBUILD_COMPILER=ON \
- -DBUILD_LIBRARIES=OFF \
- -DBUILD_TESTING=OFF \
- -DBUILD_EXAMPLES=OFF \
- /thrift \
- && cmake --build . --config Release \
- && make install \
- && curl -k -sSL "https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz" -o /tmp/go.tar.gz \
- && tar xzf /tmp/go.tar.gz -C /tmp \
- && cp /tmp/go/bin/gofmt /usr/bin/gofmt \
- && apt-get purge -y --auto-remove $buildDeps \
- && apt-get clean \
- && rm -rf /tmp/* \
- && rm -rf /var/lib/apt/lists/*
-
-ENTRYPOINT ["thrift"]
diff --git a/vendor/src/github.com/apache/thrift/LICENSE b/vendor/src/github.com/apache/thrift/LICENSE
deleted file mode 100644
index 3b6d7d74c..000000000
--- a/vendor/src/github.com/apache/thrift/LICENSE
+++ /dev/null
@@ -1,239 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
---------------------------------------------------
-SOFTWARE DISTRIBUTED WITH THRIFT:
-
-The Apache Thrift software includes a number of subcomponents with
-separate copyright notices and license terms. Your use of the source
-code for the these subcomponents is subject to the terms and
-conditions of the following licenses.
-
---------------------------------------------------
-Portions of the following files are licensed under the MIT License:
-
- lib/erl/src/Makefile.am
-
-Please see doc/otp-base-license.txt for the full terms of this license.
-
---------------------------------------------------
-For the aclocal/ax_boost_base.m4 and contrib/fb303/aclocal/ax_boost_base.m4 components:
-
-# Copyright (c) 2007 Thomas Porschberg
-#
-# Copying and distribution of this file, with or without
-# modification, are permitted in any medium without royalty provided
-# the copyright notice and this notice are preserved.
-
---------------------------------------------------
-For the lib/nodejs/lib/thrift/json_parse.js:
-
-/*
- json_parse.js
- 2015-05-02
- Public Domain.
- NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-*/
-(By Douglas Crockford )
---------------------------------------------------
diff --git a/vendor/src/github.com/apache/thrift/Makefile.am b/vendor/src/github.com/apache/thrift/Makefile.am
deleted file mode 100644
index ed58265ac..000000000
--- a/vendor/src/github.com/apache/thrift/Makefile.am
+++ /dev/null
@@ -1,131 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-ACLOCAL_AMFLAGS = -I ./aclocal
-
-if WITH_PLUGIN
-# To enable bootstrap, build order is lib/cpp -> compiler -> others
-SUBDIRS = lib/cpp compiler/cpp lib
-if WITH_TESTS
-SUBDIRS += lib/cpp/test
-endif
-else
-SUBDIRS = compiler/cpp lib
-endif
-
-if WITH_TESTS
-SUBDIRS += test
-endif
-
-if WITH_TUTORIAL
-SUBDIRS += tutorial
-endif
-
-dist-hook:
- find $(distdir) -type f \( -iname ".DS_Store" -or -iname "._*" -or -iname ".gitignore" \) | xargs rm -rf
- find $(distdir) -type d \( -iname ".deps" -or -iname ".libs" \) | xargs rm -rf
- find $(distdir) -type d \( -iname ".svn" -or -iname ".git" \) | xargs rm -rf
-
-print-version:
- @echo $(VERSION)
-
-.PHONY: precross cross
-precross-%: all
- $(MAKE) -C $* precross
-precross: all precross-test precross-lib
-
-empty :=
-space := $(empty) $(empty)
-comma := ,
-
-CROSS_LANGS = @MAYBE_CPP@ @MAYBE_C_GLIB@ @MAYBE_D@ @MAYBE_JAVA@ @MAYBE_CSHARP@ @MAYBE_PYTHON@ @MAYBE_PY3@ @MAYBE_RUBY@ @MAYBE_HASKELL@ @MAYBE_PERL@ @MAYBE_PHP@ @MAYBE_GO@ @MAYBE_NODEJS@ @MAYBE_DART@ @MAYBE_ERLANG@ @MAYBE_LUA@
-CROSS_LANGS_COMMA_SEPARATED = $(subst $(space),$(comma),$(CROSS_LANGS))
-
-if WITH_PY3
-CROSS_PY=$(PYTHON3)
-else
-CROSS_PY=$(PYTHON)
-endif
-
-if WITH_PYTHON
-crossfeature: precross
- $(CROSS_PY) test/test.py --retry-count 3 --features .* --skip-known-failures --server $(CROSS_LANGS_COMMA_SEPARATED)
-else
-# feature test needs python build
-crossfeature:
-endif
-
-cross-%: precross crossfeature
- $(CROSS_PY) test/test.py --retry-count 3 --skip-known-failures --server $(CROSS_LANGS_COMMA_SEPARATED) --client $(CROSS_LANGS_COMMA_SEPARATED) --regex "$*"
-
-cross: cross-.*
-
-TIMES = 1 2 3
-fail: precross
- $(CROSS_PY) test/test.py || true
- $(CROSS_PY) test/test.py --update-expected-failures=overwrite
- $(foreach var,$(TIMES),test/test.py -s || true;test/test.py --update-expected-failures=merge;)
-
-codespell_skip_files = \
- *.jar \
- *.class \
- *.so \
- *.a \
- *.la \
- *.o \
- *.p12 \
- *OCamlMakefile \
- .keystore \
- .truststore \
- CHANGES \
- config.sub \
- configure \
- depcomp \
- libtool.m4 \
- output.* \
- rebar \
- thrift
-
-skipped_files = $(subst $(space),$(comma),$(codespell_skip_files))
-
-style-local:
- codespell --write-changes --skip=$(skipped_files) --disable-colors
-
-EXTRA_DIST = \
- .clang-format \
- .editorconfig \
- .travis.yml \
- appveyor.yml \
- bower.json \
- build \
- CMakeLists.txt \
- composer.json \
- contrib \
- CONTRIBUTING.md \
- debian \
- doc \
- doap.rdf \
- package.json \
- sonar-project.properties \
- Dockerfile \
- LICENSE \
- CHANGES \
- NOTICE \
- README.md \
- Thrift.podspec
diff --git a/vendor/src/github.com/apache/thrift/NOTICE b/vendor/src/github.com/apache/thrift/NOTICE
deleted file mode 100644
index c23995a23..000000000
--- a/vendor/src/github.com/apache/thrift/NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Thrift
-Copyright 2006-2010 The Apache Software Foundation.
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/vendor/src/github.com/apache/thrift/README.md b/vendor/src/github.com/apache/thrift/README.md
deleted file mode 100644
index 07cd32f09..000000000
--- a/vendor/src/github.com/apache/thrift/README.md
+++ /dev/null
@@ -1,166 +0,0 @@
-Apache Thrift
-=============
-
-+[](https://travis-ci.org/apache/thrift)
-- +[](https://ci.appveyor.com/project/apache/thrift)
-
-
-Introduction
-============
-
-Thrift is a lightweight, language-independent software stack with an
-associated code generation mechanism for RPC. Thrift provides clean
-abstractions for data transport, data serialization, and application
-level processing. The code generation system takes a simple definition
-language as its input and generates code across programming languages that
-uses the abstracted stack to build interoperable RPC clients and servers.
-
-Thrift is specifically designed to support non-atomic version changes
-across client and server code.
-
-For more details on Thrift's design and implementation, take a gander at
-the Thrift whitepaper included in this distribution or at the README.md files
-in your particular subdirectory of interest.
-
-Hierarchy
-=========
-
-thrift/
-
- compiler/
-
- Contains the Thrift compiler, implemented in C++.
-
- lib/
-
- Contains the Thrift software library implementation, subdivided by
- language of implementation.
-
- cpp/
- go/
- java/
- php/
- py/
- rb/
-
- test/
-
- Contains sample Thrift files and test code across the target programming
- languages.
-
- tutorial/
-
- Contains a basic tutorial that will teach you how to develop software
- using Thrift.
-
-Requirements
-============
-
-See http://thrift.apache.org/docs/install for an up-to-date list of build requirements.
-
-Resources
-=========
-
-More information about Thrift can be obtained on the Thrift webpage at:
-
- http://thrift.apache.org
-
-Acknowledgments
-===============
-
-Thrift was inspired by pillar, a lightweight RPC tool written by Adam D'Angelo,
-and also by Google's protocol buffers.
-
-Installation
-============
-
-If you are building from the first time out of the source repository, you will
-need to generate the configure scripts. (This is not necessary if you
-downloaded a tarball.) From the top directory, do:
-
- ./bootstrap.sh
-
-Once the configure scripts are generated, thrift can be configured.
-From the top directory, do:
-
- ./configure
-
-You may need to specify the location of the boost files explicitly.
-If you installed boost in /usr/local, you would run configure as follows:
-
- ./configure --with-boost=/usr/local
-
-Note that by default the thrift C++ library is typically built with debugging
-symbols included. If you want to customize these options you should use the
-CXXFLAGS option in configure, as such:
-
- ./configure CXXFLAGS='-g -O2'
- ./configure CFLAGS='-g -O2'
- ./configure CPPFLAGS='-DDEBUG_MY_FEATURE'
-
-To enable gcov required options -fprofile-arcs -ftest-coverage enable them:
-
- ./configure --enable-coverage
-
-Run ./configure --help to see other configuration options
-
-Please be aware that the Python library will ignore the --prefix option
-and just install wherever Python's distutils puts it (usually along
-the lines of /usr/lib/pythonX.Y/site-packages/). If you need to control
-where the Python modules are installed, set the PY_PREFIX variable.
-(DESTDIR is respected for Python and C++.)
-
-Make thrift:
-
- make
-
-From the top directory, become superuser and do:
-
- make install
-
-Note that some language packages must be installed manually using build tools
-better suited to those languages (at the time of this writing, this applies
-to Java, Ruby, PHP).
-
-Look for the README.md file in the lib// folder for more details on the
-installation of each language library package.
-
-Testing
-=======
-
-There are a large number of client library tests that can all be run
-from the top-level directory.
-
- make -k check
-
-This will make all of the libraries (as necessary), and run through
-the unit tests defined in each of the client libraries. If a single
-language fails, the make check will continue on and provide a synopsis
-at the end.
-
-To run the cross-language test suite, please run:
-
- make cross
-
-This will run a set of tests that use different language clients and
-servers.
-
-License
-=======
-
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
diff --git a/vendor/src/github.com/apache/thrift/Thrift.podspec b/vendor/src/github.com/apache/thrift/Thrift.podspec
deleted file mode 100644
index 2ead0e93d..000000000
--- a/vendor/src/github.com/apache/thrift/Thrift.podspec
+++ /dev/null
@@ -1,18 +0,0 @@
-Pod::Spec.new do |s|
- s.name = "Thrift"
- s.version = "0.10.0"
- s.summary = "Apache Thrift is a lightweight, language-independent software stack with an associated code generation mechanism for RPC."
- s.description = <<-DESC
-The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.
- DESC
- s.homepage = "http://thrift.apache.org"
- s.license = { :type => 'Apache License, Version 2.0', :url => 'https://raw.github.com/apache/thrift/thrift-0.9.0/LICENSE' }
- s.author = { "The Apache Software Foundation" => "apache@apache.org" }
- s.requires_arc = true
- s.ios.deployment_target = '7.0'
- s.osx.deployment_target = '10.8'
- s.ios.framework = 'CFNetwork'
- s.osx.framework = 'CoreServices'
- s.source = { :git => "https://github.com/apache/thrift.git", :tag => "thrift-0.10.0" }
- s.source_files = 'lib/cocoa/src/**/*.{h,m,swift}'
-end
\ No newline at end of file
diff --git a/vendor/src/github.com/apache/thrift/aclocal/ac_prog_bison.m4 b/vendor/src/github.com/apache/thrift/aclocal/ac_prog_bison.m4
deleted file mode 100644
index 4d1198b94..000000000
--- a/vendor/src/github.com/apache/thrift/aclocal/ac_prog_bison.m4
+++ /dev/null
@@ -1,54 +0,0 @@
-dnl
-dnl Check Bison version
-dnl AC_PROG_BISON([MIN_VERSION=2.4])
-dnl
-dnl Will define BISON_USE_PARSER_H_EXTENSION if Automake is < 1.11
-dnl for use with .h includes.
-dnl
-
-AC_DEFUN([AC_PROG_BISON], [
-if test "x$1" = "x" ; then
- bison_required_version="2.4"
-else
- bison_required_version="$1"
-fi
-
-AC_CHECK_PROG(have_prog_bison, [bison], [yes],[no])
-
-AC_DEFINE_UNQUOTED([BISON_VERSION], [0.0], [Bison version if bison is not available])
-
-#Do not use *.h extension for parser header files, use newer *.hh
-bison_use_parser_h_extension=false
-
-if test "$have_prog_bison" = "yes" ; then
- AC_MSG_CHECKING([for bison version >= $bison_required_version])
- bison_version=`bison --version | head -n 1 | cut '-d ' -f 4`
- AC_DEFINE_UNQUOTED([BISON_VERSION], [$bison_version], [Defines bison version])
- if test "$bison_version" \< "$bison_required_version" ; then
- BISON=:
- AC_MSG_RESULT([no])
- AC_MSG_ERROR([Bison version $bison_required_version or higher must be installed on the system!])
- else
- AC_MSG_RESULT([yes])
- BISON=bison
- AC_SUBST(BISON)
-
- #Verify automake version 1.11 headers for yy files are .h, > 1.12 uses .hh
- automake_version=`automake --version | head -n 1 | cut '-d ' -f 4`
- AC_DEFINE_UNQUOTED([AUTOMAKE_VERSION], [$automake_version], [Defines automake version])
-
- if test "$automake_version" \< "1.12" ; then
- #Use *.h extension for parser header file
- bison_use_parser_h_extension=true
- echo "Automake version < 1.12"
- AC_DEFINE([BISON_USE_PARSER_H_EXTENSION], [1], [Use *.h extension for parser header file])
- fi
- fi
-else
- BISON=:
- AC_MSG_RESULT([NO])
-fi
-
-AM_CONDITIONAL([BISON_USE_PARSER_H_EXTENSION], [test x$bison_use_parser_h_extension = xtrue])
-AC_SUBST(BISON)
-])
diff --git a/vendor/src/github.com/apache/thrift/aclocal/ax_boost_base.m4 b/vendor/src/github.com/apache/thrift/aclocal/ax_boost_base.m4
deleted file mode 100644
index b496020e4..000000000
--- a/vendor/src/github.com/apache/thrift/aclocal/ax_boost_base.m4
+++ /dev/null
@@ -1,272 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_boost_base.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-#
-# DESCRIPTION
-#
-# Test for the Boost C++ libraries of a particular version (or newer)
-#
-# If no path to the installed boost library is given the macro searchs
-# under /usr, /usr/local, /opt and /opt/local and evaluates the
-# $BOOST_ROOT environment variable. Further documentation is available at
-# .
-#
-# This macro calls:
-#
-# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
-#
-# And sets:
-#
-# HAVE_BOOST
-#
-# LICENSE
-#
-# Copyright (c) 2008 Thomas Porschberg
-# Copyright (c) 2009 Peter Adolphs
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 23
-
-AC_DEFUN([AX_BOOST_BASE],
-[
-AC_ARG_WITH([boost],
- [AS_HELP_STRING([--with-boost@<:@=ARG@:>@],
- [use Boost library from a standard location (ARG=yes),
- from the specified location (ARG=),
- or disable it (ARG=no)
- @<:@ARG=yes@:>@ ])],
- [
- if test "$withval" = "no"; then
- want_boost="no"
- elif test "$withval" = "yes"; then
- want_boost="yes"
- ac_boost_path=""
- else
- want_boost="yes"
- ac_boost_path="$withval"
- fi
- ],
- [want_boost="yes"])
-
-
-AC_ARG_WITH([boost-libdir],
- AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
- [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
- [
- if test -d "$withval"
- then
- ac_boost_lib_path="$withval"
- else
- AC_MSG_ERROR(--with-boost-libdir expected directory name)
- fi
- ],
- [ac_boost_lib_path=""]
-)
-
-if test "x$want_boost" = "xyes"; then
- boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
- boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
- boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
- boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
- boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
- if test "x$boost_lib_version_req_sub_minor" = "x" ; then
- boost_lib_version_req_sub_minor="0"
- fi
- WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
- AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
- succeeded=no
-
- dnl On 64-bit systems check for system libraries in both lib64 and lib.
- dnl The former is specified by FHS, but e.g. Debian does not adhere to
- dnl this (as it rises problems for generic multi-arch support).
- dnl The last entry in the list is chosen by default when no libraries
- dnl are found, e.g. when only header-only libraries are installed!
- libsubdirs="lib"
- ax_arch=`uname -m`
- case $ax_arch in
- x86_64|ppc64|s390x|sparc64|aarch64)
- libsubdirs="lib64 lib lib64"
- ;;
- esac
-
- dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
- dnl them priority over the other paths since, if libs are found there, they
- dnl are almost assuredly the ones desired.
- AC_REQUIRE([AC_CANONICAL_HOST])
- libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
-
- case ${host_cpu} in
- i?86)
- libsubdirs="lib/i386-${host_os} $libsubdirs"
- ;;
- esac
-
- dnl first we check the system location for boost libraries
- dnl this location ist chosen if boost libraries are installed with the --layout=system option
- dnl or if you install boost with RPM
- if test "$ac_boost_path" != ""; then
- BOOST_CPPFLAGS="-I$ac_boost_path/include"
- for ac_boost_path_tmp in $libsubdirs; do
- if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
- BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
- break
- fi
- done
- elif test "$cross_compiling" != yes; then
- for ac_boost_path_tmp in $lt_sysroot/usr $lt_sysroot/usr/local $lt_sysroot/opt $lt_sysroot/opt/local ; do
- if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
- for libsubdir in $libsubdirs ; do
- if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
- done
- BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
- BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
- break;
- fi
- done
- fi
-
- dnl overwrite ld flags if we have required special directory with
- dnl --with-boost-libdir parameter
- if test "$ac_boost_lib_path" != ""; then
- BOOST_LDFLAGS="-L$ac_boost_lib_path"
- fi
-
- CPPFLAGS_SAVED="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
- export CPPFLAGS
-
- LDFLAGS_SAVED="$LDFLAGS"
- LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
- export LDFLAGS
-
- AC_REQUIRE([AC_PROG_CXX])
- AC_LANG_PUSH(C++)
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
- @%:@include
- ]], [[
- #if BOOST_VERSION >= $WANT_BOOST_VERSION
- // Everything is okay
- #else
- # error Boost version is too old
- #endif
- ]])],[
- AC_MSG_RESULT(yes)
- succeeded=yes
- found_system=yes
- ],[
- ])
- AC_LANG_POP([C++])
-
-
-
- dnl if we found no boost with system layout we search for boost libraries
- dnl built and installed without the --layout=system option or for a staged(not installed) version
- if test "x$succeeded" != "xyes"; then
- _version=0
- if test "$ac_boost_path" != ""; then
- if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
- for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
- _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
- V_CHECK=`expr $_version_tmp \> $_version`
- if test "$V_CHECK" = "1" ; then
- _version=$_version_tmp
- fi
- VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
- BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
- done
- fi
- else
- if test "$cross_compiling" != yes; then
- for ac_boost_path in $lt_sysroot/usr $lt_sysroot/usr/local $lt_sysroot/opt $lt_sysroot/opt/local ; do
- if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
- for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
- _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
- V_CHECK=`expr $_version_tmp \> $_version`
- if test "$V_CHECK" = "1" ; then
- _version=$_version_tmp
- best_path=$ac_boost_path
- fi
- done
- fi
- done
-
- VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
- BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
- if test "$ac_boost_lib_path" = ""; then
- for libsubdir in $libsubdirs ; do
- if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
- done
- BOOST_LDFLAGS="-L$best_path/$libsubdir"
- fi
- fi
-
- if test "x$BOOST_ROOT" != "x"; then
- for libsubdir in $libsubdirs ; do
- if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
- done
- if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
- version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
- stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
- stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
- V_CHECK=`expr $stage_version_shorten \>\= $_version`
- if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
- AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
- BOOST_CPPFLAGS="-I$BOOST_ROOT"
- BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
- fi
- fi
- fi
- fi
-
- CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
- export CPPFLAGS
- LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
- export LDFLAGS
-
- AC_LANG_PUSH(C++)
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
- @%:@include
- ]], [[
- #if BOOST_VERSION >= $WANT_BOOST_VERSION
- // Everything is okay
- #else
- # error Boost version is too old
- #endif
- ]])],[
- AC_MSG_RESULT(yes)
- succeeded=yes
- found_system=yes
- ],[
- ])
- AC_LANG_POP([C++])
- fi
-
- if test "$succeeded" != "yes" ; then
- if test "$_version" = "0" ; then
- AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]])
- else
- AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
- fi
- # execute ACTION-IF-NOT-FOUND (if present):
- ifelse([$3], , :, [$3])
- else
- AC_SUBST(BOOST_CPPFLAGS)
- AC_SUBST(BOOST_LDFLAGS)
- AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
- # execute ACTION-IF-FOUND (if present):
- ifelse([$2], , :, [$2])
- fi
-
- CPPFLAGS="$CPPFLAGS_SAVED"
- LDFLAGS="$LDFLAGS_SAVED"
-fi
-
-])
diff --git a/vendor/src/github.com/apache/thrift/aclocal/ax_check_openssl.m4 b/vendor/src/github.com/apache/thrift/aclocal/ax_check_openssl.m4
deleted file mode 100644
index a87c5a6b6..000000000
--- a/vendor/src/github.com/apache/thrift/aclocal/ax_check_openssl.m4
+++ /dev/null
@@ -1,124 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_check_openssl.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_CHECK_OPENSSL([action-if-found[, action-if-not-found]])
-#
-# DESCRIPTION
-#
-# Look for OpenSSL in a number of default spots, or in a user-selected
-# spot (via --with-openssl). Sets
-#
-# OPENSSL_INCLUDES to the include directives required
-# OPENSSL_LIBS to the -l directives required
-# OPENSSL_LDFLAGS to the -L or -R flags required
-#
-# and calls ACTION-IF-FOUND or ACTION-IF-NOT-FOUND appropriately
-#
-# This macro sets OPENSSL_INCLUDES such that source files should use the
-# openssl/ directory in include directives:
-#
-# #include
-#
-# LICENSE
-#
-# Copyright (c) 2009,2010 Zmanda Inc.